48,124d47
< def template FPAExecute {{
< Fault %(class_name)s::execute(%(CPU_exec_context)s *xc, Trace::InstRecord *traceData) const
< {
< Fault fault = NoFault;
<
< %(fp_enable_check)s;
<
< %(op_decl)s;
< %(op_rd)s;
<
< if (%(predicate_test)s) {
< %(code)s;
< if (fault == NoFault) {
< %(op_wb)s;
< }
< }
<
< return fault;
< }
< }};
<
< def template FloatDoubleDecode {{
< {
< ArmStaticInst *i = NULL;
< switch (OPCODE_19 << 1 | OPCODE_7)
< {
< case 0:
< i = (ArmStaticInst *)new %(class_name)sS(machInst);
< break;
< case 1:
< i = (ArmStaticInst *)new %(class_name)sD(machInst);
< break;
< case 2:
< case 3:
< default:
< panic("Cannot decode float/double nature of the instruction");
< }
< return i;
< }
< }};
<
< // Primary format for float point operate instructions:
< def format FloatOp(code, *flags) {{
< orig_code = code
<
< cblk = code
< iop = InstObjParams(name, Name, 'PredOp',
< {"code": cblk,
< "predicate_test": predicateTest},
< flags)
< header_output = BasicDeclare.subst(iop)
< decoder_output = BasicConstructor.subst(iop)
< exec_output = FPAExecute.subst(iop)
<
< sng_cblk = code
< sng_iop = InstObjParams(name, Name+'S', 'PredOp',
< {"code": sng_cblk,
< "predicate_test": predicateTest},
< flags)
< header_output += BasicDeclare.subst(sng_iop)
< decoder_output += BasicConstructor.subst(sng_iop)
< exec_output += FPAExecute.subst(sng_iop)
<
< dbl_code = re.sub(r'\.sf', '.df', orig_code)
<
< dbl_cblk = dbl_code
< dbl_iop = InstObjParams(name, Name+'D', 'PredOp',
< {"code": dbl_cblk,
< "predicate_test": predicateTest},
< flags)
< header_output += BasicDeclare.subst(dbl_iop)
< decoder_output += BasicConstructor.subst(dbl_iop)
< exec_output += FPAExecute.subst(dbl_iop)
<
< decode_block = FloatDoubleDecode.subst(iop)
< }};
<
126,151d48
< calcFPCcCode = '''
< uint16_t _in, _iz, _ic, _iv;
<
< _in = %(fReg1)s < %(fReg2)s;
< _iz = %(fReg1)s == %(fReg2)s;
< _ic = %(fReg1)s >= %(fReg2)s;
< _iv = (isnan(%(fReg1)s) || isnan(%(fReg2)s)) & 1;
<
< CondCodes = _in << 31 | _iz << 30 | _ic << 29 | _iv << 28 |
< (CondCodes & 0x0FFFFFFF);
< '''
< }};
<
< def format FloatCmp(fReg1, fReg2, *flags) {{
< code = calcFPCcCode % vars()
< iop = InstObjParams(name, Name, 'PredOp',
< {"code": code,
< "predicate_test": predicateTest},
< flags)
< header_output = BasicDeclare.subst(iop)
< decoder_output = BasicConstructor.subst(iop)
< decode_block = BasicDecode.subst(iop)
< exec_output = FPAExecute.subst(iop)
< }};
<
< let {{