}
}
case 0xc:
- if (single) {
- return new VcvtFpUIntS(machInst, vd, vm);
+ if (bits(machInst, 7) == 0) {
+ if (single) {
+ return new VcvtFpUIntSR(machInst, vd, vm);
+ } else {
+ vd = (IntRegIndex)(bits(machInst, 22) |
+ (bits(machInst, 15, 12) << 1));
+ return new VcvtFpUIntDR(machInst, vd, vm);
+ }
} else {
- vd = (IntRegIndex)(bits(machInst, 22) |
- (bits(machInst, 15, 12) << 1));
- return new VcvtFpUIntD(machInst, vd, vm);
+ if (single) {
+ return new VcvtFpUIntS(machInst, vd, vm);
+ } else {
+ vd = (IntRegIndex)(bits(machInst, 22) |
+ (bits(machInst, 15, 12) << 1));
+ return new VcvtFpUIntD(machInst, vd, vm);
+ }
}
case 0xd:
- if (single) {
- return new VcvtFpSIntS(machInst, vd, vm);
+ if (bits(machInst, 7) == 0) {
+ if (single) {
+ return new VcvtFpSIntSR(machInst, vd, vm);
+ } else {
+ vd = (IntRegIndex)(bits(machInst, 22) |
+ (bits(machInst, 15, 12) << 1));
+ return new VcvtFpSIntDR(machInst, vd, vm);
+ }
} else {
- vd = (IntRegIndex)(bits(machInst, 22) |
- (bits(machInst, 15, 12) << 1));
- return new VcvtFpSIntD(machInst, vd, vm);
+ if (single) {
+ return new VcvtFpSIntS(machInst, vd, vm);
+ } else {
+ vd = (IntRegIndex)(bits(machInst, 22) |
+ (bits(machInst, 15, 12) << 1));
+ return new VcvtFpSIntD(machInst, vd, vm);
+ }
}
case 0xe:
{
decoder_output += VfpRegRegOpConstructor.subst(vcvtSIntFpDIop);
exec_output += PredOpExecute.subst(vcvtSIntFpDIop);
+ vcvtFpUIntSRCode = '''
+ VfpSavedState state = prepVfpFpscr(Fpscr);
+ FpDest.uw = FpOp1;
+ Fpscr = setVfpFpscr(Fpscr, state);
+ '''
+ vcvtFpUIntSRIop = InstObjParams("vcvt", "VcvtFpUIntSR", "VfpRegRegOp",
+ { "code": vcvtFpUIntSRCode,
+ "predicate_test": predicateTest }, [])
+ header_output += VfpRegRegOpDeclare.subst(vcvtFpUIntSRIop);
+ decoder_output += VfpRegRegOpConstructor.subst(vcvtFpUIntSRIop);
+ exec_output += PredOpExecute.subst(vcvtFpUIntSRIop);
+
+ vcvtFpUIntDRCode = '''
+ IntDoubleUnion cOp1;
+ cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
+ VfpSavedState state = prepVfpFpscr(Fpscr);
+ uint64_t result = cOp1.fp;
+ Fpscr = setVfpFpscr(Fpscr, state);
+ FpDestP0.uw = result;
+ '''
+ vcvtFpUIntDRIop = InstObjParams("vcvtr", "VcvtFpUIntDR", "VfpRegRegOp",
+ { "code": vcvtFpUIntDRCode,
+ "predicate_test": predicateTest }, [])
+ header_output += VfpRegRegOpDeclare.subst(vcvtFpUIntDRIop);
+ decoder_output += VfpRegRegOpConstructor.subst(vcvtFpUIntDRIop);
+ exec_output += PredOpExecute.subst(vcvtFpUIntDRIop);
+
+ vcvtFpSIntSRCode = '''
+ VfpSavedState state = prepVfpFpscr(Fpscr);
+ FpDest.sw = FpOp1;
+ Fpscr = setVfpFpscr(Fpscr, state);
+ '''
+ vcvtFpSIntSRIop = InstObjParams("vcvtr", "VcvtFpSIntSR", "VfpRegRegOp",
+ { "code": vcvtFpSIntSRCode,
+ "predicate_test": predicateTest }, [])
+ header_output += VfpRegRegOpDeclare.subst(vcvtFpSIntSRIop);
+ decoder_output += VfpRegRegOpConstructor.subst(vcvtFpSIntSRIop);
+ exec_output += PredOpExecute.subst(vcvtFpSIntSRIop);
+
+ vcvtFpSIntDRCode = '''
+ IntDoubleUnion cOp1;
+ cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
+ VfpSavedState state = prepVfpFpscr(Fpscr);
+ int64_t result = cOp1.fp;
+ Fpscr = setVfpFpscr(Fpscr, state);
+ FpDestP0.uw = result;
+ '''
+ vcvtFpSIntDRIop = InstObjParams("vcvtr", "VcvtFpSIntDR", "VfpRegRegOp",
+ { "code": vcvtFpSIntDRCode,
+ "predicate_test": predicateTest }, [])
+ header_output += VfpRegRegOpDeclare.subst(vcvtFpSIntDRIop);
+ decoder_output += VfpRegRegOpConstructor.subst(vcvtFpSIntDRIop);
+ exec_output += PredOpExecute.subst(vcvtFpSIntDRIop);
+
vcvtFpUIntSCode = '''
VfpSavedState state = prepVfpFpscr(Fpscr);
+ fesetround(FeRoundZero);
FpDest.uw = FpOp1;
Fpscr = setVfpFpscr(Fpscr, state);
'''
IntDoubleUnion cOp1;
cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
VfpSavedState state = prepVfpFpscr(Fpscr);
+ fesetround(FeRoundZero);
uint64_t result = cOp1.fp;
Fpscr = setVfpFpscr(Fpscr, state);
FpDestP0.uw = result;
vcvtFpSIntSCode = '''
VfpSavedState state = prepVfpFpscr(Fpscr);
+ fesetround(FeRoundZero);
FpDest.sw = FpOp1;
Fpscr = setVfpFpscr(Fpscr, state);
'''
IntDoubleUnion cOp1;
cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
VfpSavedState state = prepVfpFpscr(Fpscr);
+ fesetround(FeRoundZero);
int64_t result = cOp1.fp;
Fpscr = setVfpFpscr(Fpscr, state);
FpDestP0.uw = result;
vcvtSFixedFpSCode = '''
VfpSavedState state = prepVfpFpscr(Fpscr);
- FpDest = vfpSFixedToFpS(FpOp1.sw, true, imm);
+ FpDest = vfpSFixedToFpS(FpOp1.sw, false, imm);
Fpscr = setVfpFpscr(Fpscr, state);
'''
vcvtSFixedFpSIop = InstObjParams("vcvt", "VcvtSFixedFpS", "VfpRegRegImmOp",
IntDoubleUnion cDest;
uint64_t mid = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
VfpSavedState state = prepVfpFpscr(Fpscr);
- cDest.fp = vfpSFixedToFpD(mid, true, imm);
+ cDest.fp = vfpSFixedToFpD(mid, false, imm);
Fpscr = setVfpFpscr(Fpscr, state);
FpDestP0.uw = cDest.bits;
FpDestP1.uw = cDest.bits >> 32;