Patches to x86 compilation to fix vm tests on emulator.
not-int and not-long were unimplemented previously.
cmp-long would return the wrong value with Long.MIN_VALUE.
rem-double and rem-float now use a c helper. This is because fprem may
not fully compute the result on the first invocation and would need to
be looped to completion.
Change-Id: Idf5f6349a63b19d395a3d89434b5b35c430ae3d3
diff --git a/src/compiler/codegen/x86/X86/Factory.cc b/src/compiler/codegen/x86/X86/Factory.cc
index c5186c6..8b02aed 100644
--- a/src/compiler/codegen/x86/X86/Factory.cc
+++ b/src/compiler/codegen/x86/X86/Factory.cc
@@ -138,6 +138,7 @@
X86OpCode opcode = kX86Bkpt;
switch (op) {
case kOpNeg: opcode = kX86Neg32R; break;
+ case kOpNot: opcode = kX86Not32R; break;
case kOpBlx: opcode = kX86CallR; break;
default:
LOG(FATAL) << "Bad case in opReg " << op;
diff --git a/src/compiler/codegen/x86/X86/Gen.cc b/src/compiler/codegen/x86/X86/Gen.cc
index 597eda1..f5466ee 100644
--- a/src/compiler/codegen/x86/X86/Gen.cc
+++ b/src/compiler/codegen/x86/X86/Gen.cc
@@ -262,11 +262,13 @@
// Compute (r1:r0) = (r1:r0) - (r3:r2)
opRegReg(cUnit, kOpSub, r0, r2); // r0 = r0 - r2
opRegReg(cUnit, kOpSbc, r1, r3); // r1 = r1 - r3 - CF
+ newLIR2(cUnit, kX86Set8R, r2, kX86CondL); // r2 = (r1:r0) < (r3:r2) ? 1 : 0
+ newLIR2(cUnit, kX86Movzx8RR, r2, r2);
+ opReg(cUnit, kOpNeg, r2); // r2 = -r2
opRegReg(cUnit, kOpOr, r0, r1); // r0 = high | low - sets ZF
newLIR2(cUnit, kX86Set8R, r0, kX86CondNz); // r0 = (r1:r0) != (r3:r2) ? 1 : 0
newLIR2(cUnit, kX86Movzx8RR, r0, r0);
- opRegImm(cUnit, kOpAsr, r1, 31); // r1 = high >> 31
- opRegReg(cUnit, kOpOr, r0, r1); // r0 holds result
+ opRegReg(cUnit, kOpOr, r0, r2); // r0 = r0 | r2
RegLocation rlResult = LOC_C_RETURN;
storeValue(cUnit, rlDest, rlResult);
}