X86: Extend mov2int and mov2fp so they can support insert and extract instructions.

This commit is contained in:
Gabe Black 2009-08-17 20:22:56 -07:00
parent 2beab367d7
commit 965e546df3

View file

@ -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):