Fix x86 long right shifting and int-to-float/double.
Right shifting a long by 32 bits or more now works correctly.
Also, uses a normal register for the src of int-to-float and
int-to-double instead of an fp reg.
Change-Id: Idaf8a398f50314eb4fc302acfbaeddfce25380b1
diff --git a/src/compiler/codegen/x86/FP/X86FP.cc b/src/compiler/codegen/x86/FP/X86FP.cc
index f5a030b..7c27eae 100644
--- a/src/compiler/codegen/x86/FP/X86FP.cc
+++ b/src/compiler/codegen/x86/FP/X86FP.cc
@@ -119,6 +119,7 @@
Instruction::Code opcode = mir->dalvikInsn.opcode;
bool longSrc = false;
bool longDest = false;
+ RegisterClass rcSrc = kFPReg;
RegLocation rlSrc;
RegLocation rlDest;
X86OpCode op = kX86Nop;
@@ -128,21 +129,25 @@
case Instruction::INT_TO_FLOAT:
longSrc = false;
longDest = false;
+ rcSrc = kCoreReg;
op = kX86Cvtsi2ssRR;
break;
case Instruction::DOUBLE_TO_FLOAT:
longSrc = true;
longDest = false;
+ rcSrc = kFPReg;
op = kX86Cvtsd2ssRR;
break;
case Instruction::FLOAT_TO_DOUBLE:
longSrc = false;
longDest = true;
+ rcSrc = kFPReg;
op = kX86Cvtss2sdRR;
break;
case Instruction::INT_TO_DOUBLE:
longSrc = false;
longDest = true;
+ rcSrc = kCoreReg;
op = kX86Cvtsi2sdRR;
break;
case Instruction::FLOAT_TO_INT:
@@ -161,11 +166,11 @@
}
if (longSrc) {
rlSrc = oatGetSrcWide(cUnit, mir, 0, 1);
- rlSrc = loadValueWide(cUnit, rlSrc, kFPReg);
+ rlSrc = loadValueWide(cUnit, rlSrc, rcSrc);
srcReg = S2D(rlSrc.lowReg, rlSrc.highReg);
} else {
rlSrc = oatGetSrc(cUnit, mir, 0);
- rlSrc = loadValue(cUnit, rlSrc, kFPReg);
+ rlSrc = loadValue(cUnit, rlSrc, rcSrc);
srcReg = rlSrc.lowReg;
}
if (longDest) {
diff --git a/src/oat/runtime/x86/runtime_support_x86.S b/src/oat/runtime/x86/runtime_support_x86.S
index e58efd3..9164800 100644
--- a/src/oat/runtime/x86/runtime_support_x86.S
+++ b/src/oat/runtime/x86/runtime_support_x86.S
@@ -457,8 +457,8 @@
sar %cl,%edx
test LITERAL(32),%cl
jz 1f
- mov %eax, %edx
- sar LITERAL(31), %eax
+ mov %edx, %eax
+ sar LITERAL(31), %edx
1:
ret
@@ -469,8 +469,8 @@
shr %cl,%edx
test LITERAL(32),%cl
jz 1f
- mov %eax, %edx
- xor %eax, %eax
+ mov %edx, %eax
+ xor %edx, %edx
1:
ret