227,228c227,228
< def buildCppClasses(self, name, Name, suffix, \
< code, flag_code, cond_check, else_code, cond_control_flag_init):
---
> def buildCppClasses(self, name, Name, suffix, code, big_code, \
> flag_code, cond_check, else_code, cond_control_flag_init):
237a238,239
> allBigCode = "|".join((big_code, flag_code, cond_check, else_code,
> cond_control_flag_init))
242c244
< match = matcher.search(allCode)
---
> match = matcher.search(allCode + allBigCode)
249a252
> matcher.sub(src2_name, big_code),
256a260
> matcher.sub(imm_name, big_code),
267c271
< code, "", "true", else_code, "")
---
> code, big_code, "", "true", else_code, "")
272,287c276,296
< matcher = re.compile("(?<!\w)psrc1(?!\w)")
< if matcher.search(allCode):
< code = "uint64_t psrc1 = pick(SrcReg1, 0, dataSize);" + code
< matcher = re.compile("(?<!\w)psrc2(?!\w)")
< if matcher.search(allCode):
< code = "uint64_t psrc2 = pick(SrcReg2, 1, dataSize);" + code
< # Also make available versions which do sign extension
< matcher = re.compile("(?<!\w)spsrc1(?!\w)")
< if matcher.search(allCode):
< code = "int64_t spsrc1 = signedPick(SrcReg1, 0, dataSize);" + code
< matcher = re.compile("(?<!\w)spsrc2(?!\w)")
< if matcher.search(allCode):
< code = "int64_t spsrc2 = signedPick(SrcReg2, 1, dataSize);" + code
< matcher = re.compile("(?<!\w)simm8(?!\w)")
< if matcher.search(allCode):
< code = "int8_t simm8 = imm8;" + code
---
> for (big, all) in ((False, allCode), (True, allBigCode)):
> prefix = ""
> for (rex, decl) in (
> ("(?<!\w)psrc1(?!\w)",
> "uint64_t psrc1 = pick(SrcReg1, 0, dataSize);"),
> ("(?<!\w)psrc2(?!\w)",
> "uint64_t psrc2 = pick(SrcReg2, 1, dataSize);"),
> ("(?<!\w)spsrc1(?!\w)",
> "int64_t spsrc1 = signedPick(SrcReg1, 0, dataSize);"),
> ("(?<!\w)spsrc2(?!\w)",
> "int64_t spsrc2 = signedPick(SrcReg2, 1, dataSize);"),
> ("(?<!\w)simm8(?!\w)",
> "int8_t simm8 = imm8;")):
> matcher = re.compile(rex)
> if matcher.search(all):
> prefix += decl + "\n"
> if big:
> if big_code != "":
> big_code = prefix + big_code
> else:
> code = prefix + code
300c309
< iop = InstObjParams(name, Name + suffix, base,
---
> iops = [InstObjParams(name, Name + suffix, base,
305c314,322
< "cond_control_flag_init": cond_control_flag_init})
---
> "cond_control_flag_init" : cond_control_flag_init})]
> if big_code != "":
> iops += [InstObjParams(name, Name + suffix + "Big", base,
> {"code" : big_code,
> "flag_code" : flag_code,
> "cond_check" : cond_check,
> "else_code" : else_code,
> "cond_control_flag_init" :
> cond_control_flag_init})]
308,310c325,328
< header_output += templates[0].subst(iop)
< decoder_output += templates[1].subst(iop)
< exec_output += templates[2].subst(iop)
---
> for iop in iops:
> header_output += templates[0].subst(iop)
> decoder_output += templates[1].subst(iop)
> exec_output += templates[2].subst(iop)
324a343
> big_code = cls.big_code
331,332c350,352
< mcls.buildCppClasses(cls, name, Name, "", code, flag_code,
< cond_check, else_code, cond_control_flag_init)
---
> mcls.buildCppClasses(cls, name, Name, "", code, big_code,
> flag_code, cond_check, else_code,
> cond_control_flag_init)
354a375
> big_code = ""
375,387c396,430
< className = self.className
< if self.mnemonic == self.base_mnemonic + 'i':
< className += "Imm"
< allocator = '''new %(class_name)s(machInst, macrocodeBlock,
< %(flags)s, %(src1)s, %(op2)s, %(dest)s,
< %(dataSize)s, %(ext)s)''' % {
< "class_name" : className,
< "flags" : self.microFlagsText(microFlags),
< "src1" : self.src1, "op2" : self.op2,
< "dest" : self.dest,
< "dataSize" : self.dataSize,
< "ext" : self.ext}
< return allocator
---
> if self.big_code != "":
> className = self.className
> if self.mnemonic == self.base_mnemonic + 'i':
> className += "Imm"
> allocString = '''
> (%(dataSize)s >= 4) ?
> (StaticInstPtr)(new %(class_name)sBig(machInst,
> macrocodeBlock, %(flags)s, %(src1)s, %(op2)s,
> %(dest)s, %(dataSize)s, %(ext)s)) :
> (StaticInstPtr)(new %(class_name)s(machInst,
> macrocodeBlock, %(flags)s, %(src1)s, %(op2)s,
> %(dest)s, %(dataSize)s, %(ext)s))
> '''
> allocator = allocString % {
> "class_name" : className,
> "flags" : self.microFlagsText(microFlags),
> "src1" : self.src1, "op2" : self.op2,
> "dest" : self.dest,
> "dataSize" : self.dataSize,
> "ext" : self.ext}
> return allocator
> else:
> className = self.className
> if self.mnemonic == self.base_mnemonic + 'i':
> className += "Imm"
> allocator = '''new %(class_name)s(machInst, macrocodeBlock,
> %(flags)s, %(src1)s, %(op2)s, %(dest)s,
> %(dataSize)s, %(ext)s)''' % {
> "class_name" : className,
> "flags" : self.microFlagsText(microFlags),
> "src1" : self.src1, "op2" : self.op2,
> "dest" : self.dest,
> "dataSize" : self.dataSize,
> "ext" : self.ext}
> return allocator
431a475
> big_code = 'DestReg = (psrc1 + op2) & mask(dataSize * 8);'
434a479
> big_code = 'DestReg = (psrc1 | op2) & mask(dataSize * 8);'
440a486,489
> big_code = '''
> CCFlagBits flags = ccFlagBits;
> DestReg = (psrc1 + op2 + flags.cf) & mask(dataSize * 8);
> '''
446a496,499
> big_code = '''
> CCFlagBits flags = ccFlagBits;
> DestReg = (psrc1 - op2 - flags.cf) & mask(dataSize * 8);
> '''
449a503
> big_code = 'DestReg = (psrc1 & op2) & mask(dataSize * 8)'
452a507
> big_code = 'DestReg = (psrc1 - op2) & mask(dataSize * 8)'
455a511
> big_code = 'DestReg = (psrc1 ^ op2) & mask(dataSize * 8)'
507a564
> big_code = 'DestReg = ProdLow & mask(dataSize * 8);'
515a573
> big_code = 'DestReg = ProdHi & mask(dataSize * 8);'
543c601
< code = '''
---
> divCode = '''
590c648
< DestReg = merge(DestReg, remaining, dataSize);
---
> %s
594a653,654
> code = divCode % "DestReg = merge(DestReg, remaining, dataSize);"
> big_code = divCode % "DestReg = remaining & mask(dataSize * 8);"
603a664
> big_code = 'DestReg = Quotient & mask(dataSize * 8);'
606a668
> big_code = 'DestReg = Remainder & mask(dataSize * 8);'
618a681,684
> big_code = '''
> uint8_t shiftAmt = (op2 & ((dataSize == 8) ? mask(6) : mask(5)));
> DestReg = (psrc1 << shiftAmt) & mask(dataSize * 8);
> '''
643a710,712
> # Because what happens to the bits shift -in- on a right shift
> # is not defined in the C/C++ standard, we have to mask them out
> # to be sure they're zero.
646,648d714
< // Because what happens to the bits shift -in- on a right shift
< // is not defined in the C/C++ standard, we have to mask them out
< // to be sure they're zero.
651a718,722
> big_code = '''
> uint8_t shiftAmt = (op2 & ((dataSize == 8) ? mask(6) : mask(5)));
> uint64_t logicalMask = mask(dataSize * 8 - shiftAmt);
> DestReg = (psrc1 >> shiftAmt) & logicalMask;
> '''
673a745,747
> # Because what happens to the bits shift -in- on a right shift
> # is not defined in the C/C++ standard, we have to sign extend
> # them manually to be sure.
676,678d749
< // Because what happens to the bits shift -in- on a right shift
< // is not defined in the C/C++ standard, we have to sign extend
< // them manually to be sure.
682a754,759
> big_code = '''
> uint8_t shiftAmt = (op2 & ((dataSize == 8) ? mask(6) : mask(5)));
> uint64_t arithMask = (shiftAmt == 0) ? 0 :
> -bits(psrc1, dataSize * 8 - 1) << (dataSize * 8 - shiftAmt);
> DestReg = ((psrc1 >> shiftAmt) | arithMask) & mask(dataSize * 8);
> '''
707,708c784
< if(realShiftAmt)
< {
---
> if (realShiftAmt) {
712,713c788
< }
< else
---
> } else
742,743c817
< if(realShiftAmt)
< {
---
> if (realShiftAmt) {
750,751c824
< }
< else
---
> } else
783,784c856
< if(realShiftAmt)
< {
---
> if (realShiftAmt) {
789,790c861
< }
< else
---
> } else
819,820c890
< if(realShiftAmt)
< {
---
> if (realShiftAmt) {
829,830c899
< }
< else
---
> } else
856c925
< code = '''
---
> sldCode = '''
859c928
< uint8_t realShiftAmt = shiftAmt % (2 * dataBits);
---
> uint8_t realShiftAmt = shiftAmt %% (2 * dataBits);
870c939
< DestReg = merge(DestReg, result, dataSize);
---
> %s
871a941,942
> code = sldCode % "DestReg = merge(DestReg, result, dataSize);"
> big_code = sldCode % "DestReg = result & mask(dataSize * 8);"
902c973
< code = '''
---
> srdCode = '''
905c976
< uint8_t realShiftAmt = shiftAmt % (2 * dataBits);
---
> uint8_t realShiftAmt = shiftAmt %% (2 * dataBits);
922c993
< DestReg = merge(DestReg, result, dataSize);
---
> %s
923a995,996
> code = srdCode % "DestReg = merge(DestReg, result, dataSize);"
> big_code = srdCode % "DestReg = result & mask(dataSize * 8);"
988a1062,1067
> big_code = '''
> int flag = bits(ccFlagBits, imm8);
> DestReg = flag & mask(dataSize * 8);
> ccFlagBits = (flag == 0) ? (ccFlagBits | EZFBit) :
> (ccFlagBits & ~EZFBit);
> '''
1002a1082,1089
> big_code = '''
> MiscReg flagMask = 0x3F7FDD5;
> MiscReg flags = (nccFlagBits | ccFlagBits) & flagMask;
> int flag = bits(flags, imm8);
> DestReg = flag & mask(dataSize * 8);
> ccFlagBits = (flag == 0) ? (ccFlagBits | EZFBit) :
> (ccFlagBits & ~EZFBit);
> '''
1017a1105,1113
> big_code = '''
> IntReg val = psrc1;
> // Mask the bit position so that it wraps.
> int bitPos = op2 & (dataSize * 8 - 1);
> int sign_bit = bits(val, bitPos, bitPos);
> uint64_t maskVal = mask(bitPos+1);
> val = sign_bit ? (val | ~maskVal) : (val & maskVal);
> DestReg = val & mask(dataSize * 8);
> '''
1028a1125
> big_code = 'DestReg = bits(psrc1, op2, 0) & mask(dataSize * 8);'
1034c1131
< code = '''
---
> rdrCode = '''
1042c1139
< DestReg = merge(DestReg, DebugSrc1, dataSize);
---
> %s
1044a1142,1143
> code = rdrCode % "DestReg = merge(DestReg, DebugSrc1, dataSize);"
> big_code = rdrCode % "DestReg = DebugSrc1 & mask(dataSize * 8);"
1069c1168
< code = '''
---
> rdcrCode = '''
1073c1172
< DestReg = merge(DestReg, ControlSrc1, dataSize);
---
> %s
1075a1175,1176
> code = rdcrCode % "DestReg = merge(DestReg, ControlSrc1, dataSize);"
> big_code = rdcrCode % "DestReg = ControlSrc1 & mask(dataSize * 8);"
1157,1159c1258,1259
< code = '''
< DestReg = merge(DestReg, SegBaseSrc1, dataSize);
< '''
---
> code = 'DestReg = merge(DestReg, SegBaseSrc1, dataSize);'
> big_code = 'DestReg = SegBaseSrc1 & mask(dataSize * 8);'
1162,1164c1262,1263
< code = '''
< DestReg = merge(DestReg, SegLimitSrc1, dataSize);
< '''
---
> code = 'DestReg = merge(DestReg, SegLimitSrc1, dataSize);'
> big_code = 'DestReg = SegLimitSrc1 & mask(dataSize * 8);'
1167,1169c1266,1267
< code = '''
< DestReg = merge(DestReg, SegAttrSrc1, dataSize);
< '''
---
> code = 'DestReg = merge(DestReg, SegAttrSrc1, dataSize);'
> big_code = 'DestReg = SegAttrSrc1 & mask(dataSize * 8);'
1172,1174c1270,1271
< code = '''
< DestReg = merge(DestReg, SegSelSrc1, dataSize);
< '''
---
> code = 'DestReg = merge(DestReg, SegSelSrc1, dataSize);'
> big_code = 'DestReg = SegSelSrc1 & mask(dataSize * 8);'