default:
return new Unknown(machInst);
}
- return new Vmrs(machInst, rt, (IntRegIndex)specReg);
+ if (rt == 0xf) {
+ CPSR cpsrMask = 0;
+ cpsrMask.n = 1;
+ cpsrMask.z = 1;
+ cpsrMask.c = 1;
+ cpsrMask.v = 1;
+ return new VmrsApsr(machInst, INTREG_CONDCODES,
+ (IntRegIndex)specReg, (uint32_t)cpsrMask);
+ } else {
+ return new Vmrs(machInst, rt, (IntRegIndex)specReg);
+ }
}
} else {
uint32_t vd = (bits(machInst, 7) << 5) |
output decoder {{
#include "arch/arm/faults.hh"
+#include "arch/arm/intregs.hh"
#include "arch/arm/isa_traits.hh"
#include "arch/arm/utility.hh"
#include "base/cprintf.hh"
decoder_output += VfpRegRegOpConstructor.subst(vmrsIop);
exec_output += PredOpExecute.subst(vmrsIop);
+ vmrsApsrCode = "Dest = (MiscOp1 & imm) | (Dest & ~imm);"
+ vmrsApsrIop = InstObjParams("vmrs", "VmrsApsr", "VfpRegRegImmOp",
+ { "code": vmrsApsrCode,
+ "predicate_test": predicateTest }, [])
+ header_output += VfpRegRegImmOpDeclare.subst(vmrsApsrIop);
+ decoder_output += VfpRegRegImmOpConstructor.subst(vmrsApsrIop);
+ exec_output += PredOpExecute.subst(vmrsApsrIop);
+
vmovImmSCode = '''
FpDest.uw = bits(imm, 31, 0);
'''