X86: Extend mov2int and mov2fp so they can support insert and extract instructions.
This commit is contained in:
parent
2beab367d7
commit
965e546df3
|
@ -289,24 +289,45 @@ let {{
|
||||||
return allocator
|
return allocator
|
||||||
|
|
||||||
class Mov2int(MediaOp):
|
class Mov2int(MediaOp):
|
||||||
def __init__(self, dest, src, \
|
def __init__(self, dest, src1, src2 = 0, \
|
||||||
size = None, destSize = None, srcSize = None, ext = None):
|
size = None, destSize = None, srcSize = None, ext = None):
|
||||||
super(Mov2int, self).__init__(dest, src,\
|
super(Mov2int, self).__init__(dest, src1,\
|
||||||
"InstRegIndex(0)", size, destSize, srcSize, ext)
|
src2, size, destSize, srcSize, ext)
|
||||||
code = '''
|
code = '''
|
||||||
uint64_t fpSrcReg1 = bits(FpSrcReg1.uqw, srcSize * 8 - 1, 0);
|
int items = sizeof(FloatRegBits) / srcSize;
|
||||||
DestReg = merge(DestReg, fpSrcReg1, destSize);
|
int offset = imm8;
|
||||||
|
if (bits(src1, 0) && (ext & 0x1))
|
||||||
|
offset -= items;
|
||||||
|
if (offset >= 0 && offset < items) {
|
||||||
|
uint64_t fpSrcReg1 =
|
||||||
|
bits(FpSrcReg1.uqw,
|
||||||
|
(offset + 1) * srcSize * 8 - 1,
|
||||||
|
(offset + 0) * srcSize * 8);
|
||||||
|
DestReg = merge(0, fpSrcReg1, destSize);
|
||||||
|
} else {
|
||||||
|
DestReg = DestReg;
|
||||||
|
}
|
||||||
'''
|
'''
|
||||||
|
|
||||||
class Mov2fp(MediaOp):
|
class Mov2fp(MediaOp):
|
||||||
def __init__(self, dest, src, \
|
def __init__(self, dest, src1, src2 = 0, \
|
||||||
size = None, destSize = None, srcSize = None, ext = None):
|
size = None, destSize = None, srcSize = None, ext = None):
|
||||||
super(Mov2fp, self).__init__(dest, src,\
|
super(Mov2fp, self).__init__(dest, src1,\
|
||||||
"InstRegIndex(0)", size, destSize, srcSize, ext)
|
src2, size, destSize, srcSize, ext)
|
||||||
code = '''
|
code = '''
|
||||||
uint64_t srcReg1 = pick(SrcReg1, 0, srcSize);
|
int items = sizeof(FloatRegBits) / destSize;
|
||||||
FpDestReg.uqw =
|
int offset = imm8;
|
||||||
insertBits(FpDestReg.uqw, destSize * 8 - 1, 0, srcReg1);
|
if (bits(dest, 0) && (ext & 0x1))
|
||||||
|
offset -= items;
|
||||||
|
if (offset >= 0 && offset < items) {
|
||||||
|
uint64_t srcReg1 = pick(SrcReg1, 0, srcSize);
|
||||||
|
FpDestReg.uqw =
|
||||||
|
insertBits(FpDestReg.uqw,
|
||||||
|
(offset + 1) * destSize * 8 - 1,
|
||||||
|
(offset + 0) * destSize * 8, srcReg1);
|
||||||
|
} else {
|
||||||
|
FpDestReg.uqw = FpDestReg.uqw;
|
||||||
|
}
|
||||||
'''
|
'''
|
||||||
|
|
||||||
class Unpack(MediaOp):
|
class Unpack(MediaOp):
|
||||||
|
|
Loading…
Reference in a new issue