Index: src/arm/macro-assembler-arm.cc |
=================================================================== |
--- src/arm/macro-assembler-arm.cc (revision 6244) |
+++ src/arm/macro-assembler-arm.cc (working copy) |
@@ -519,13 +519,71 @@ |
} |
-void MacroAssembler::ClearFPSCRBits(uint32_t bits_to_clear, Register scratch) { |
- vmrs(scratch); |
- bic(scratch, scratch, Operand(bits_to_clear)); |
- vmsr(scratch); |
+void MacroAssembler::ClearFPSCRBits(const uint32_t bits_to_clear, |
+ const Register scratch, |
+ const Condition cond) { |
+ vmrs(scratch, cond); |
+ bic(scratch, scratch, Operand(bits_to_clear), LeaveCC, cond); |
+ vmsr(scratch, cond); |
} |
+void MacroAssembler::VFPCompareAndSetFlags(const DwVfpRegister src1, |
Rodolph Perfetta
2011/01/10 14:59:36
If the flags are cleared the intent is to read the
Søren Thygesen Gjesse
2011/01/11 12:41:52
Done.
|
+ const DwVfpRegister src2, |
+ const Register scratch, |
+ const Condition cond) { |
+ // Clear the Invalid cumulative exception flags if a scratch register is |
+ // supplied. |
+ if (!scratch.is(no_reg)) { |
+ ClearFPSCRBits(kVFPInvalidExceptionBit, scratch, cond); |
+ } |
+ |
+ // Compare and move FPSCR flags to the normal condition flags. |
+ vcmp(src1, src2, cond); |
+ vmrs(pc, cond); |
+} |
+ |
+void MacroAssembler::VFPCompareAndSetFlags(const DwVfpRegister src1, |
Rodolph Perfetta
2011/01/10 14:59:36
Ditto.
Søren Thygesen Gjesse
2011/01/11 12:41:52
Done.
|
+ const double src2, |
+ const Register scratch, |
+ const Condition cond) { |
+ // Clear the Invalid cumulative exception flags if a scratch register is |
+ // supplied. |
+ if (!scratch.is(no_reg)) { |
+ ClearFPSCRBits(kVFPInvalidExceptionBit, scratch, cond); |
+ } |
+ |
+ // Compare and move FPSCR flags to the normal condition flags. |
+ vcmp(src1, src2, cond); |
+ vmrs(pc, cond); |
+} |
+ |
+ |
+void MacroAssembler::VFPCompareAndLoadFlags(const DwVfpRegister src1, |
+ const DwVfpRegister src2, |
+ const Register fpscr_flags, |
+ const Condition cond) { |
+ // Clear the Invalid cumulative exception flags (use fpscr_flags as scratch). |
+ ClearFPSCRBits(kVFPInvalidExceptionBit, fpscr_flags); |
+ |
+ // Compare and load FPSCR. |
+ vcmp(src1, src2, cond); |
+ vmrs(fpscr_flags); |
+} |
+ |
+void MacroAssembler::VFPCompareAndLoadFlags(const DwVfpRegister src1, |
+ const double src2, |
+ const Register fpscr_flags, |
+ const Condition cond) { |
+ // Clear the Invalid cumulative exception flags (use fpscr_flags as scratch). |
+ ClearFPSCRBits(kVFPInvalidExceptionBit, fpscr_flags); |
+ |
+ // Compare and load FPSCR. |
+ vcmp(src1, src2, cond); |
+ vmrs(fpscr_flags); |
+} |
+ |
+ |
void MacroAssembler::EnterFrame(StackFrame::Type type) { |
// r0-r3: preserved |
stm(db_w, sp, cp.bit() | fp.bit() | lr.bit()); |