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