Unbreak non-SSE2 ia32 platforms.
authorsvenpanne@chromium.org <svenpanne@chromium.org@ce2b1a6d-e550-0410-aec6-3dcde31c8c00>
Tue, 29 Jan 2013 10:18:15 +0000 (10:18 +0000)
committersvenpanne@chromium.org <svenpanne@chromium.org@ce2b1a6d-e550-0410-aec6-3dcde31c8c00>
Tue, 29 Jan 2013 10:18:15 +0000 (10:18 +0000)
Improved register usage a bit on the way.

Review URL: https://codereview.chromium.org/12082043

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@13534 ce2b1a6d-e550-0410-aec6-3dcde31c8c00

src/ia32/lithium-codegen-ia32.cc
src/ia32/lithium-ia32.cc
src/ia32/lithium-ia32.h

index 4b9a62d..2e5fa56 100644 (file)
@@ -4586,7 +4586,13 @@ void LCodeGen::DoDeferredNumberTagI(LInstruction* instr,
       CpuFeatures::Scope feature_scope(SSE2);
       __ LoadUint32(xmm0, reg, xmm1);
     } else {
-      UNREACHABLE();
+      // There's no fild variant for unsigned values, so zero-extend to a 64-bit
+      // int manually.
+      __ push(Immediate(0));
+      __ push(reg);
+      __ fild_d(Operand(esp, 0));
+      __ pop(reg);
+      __ pop(reg);
     }
   }
 
@@ -4638,10 +4644,10 @@ void LCodeGen::DoNumberTagD(LNumberTagD* instr) {
   };
 
   Register reg = ToRegister(instr->result());
-  Register tmp = ToRegister(instr->temp());
 
   DeferredNumberTagD* deferred = new(zone()) DeferredNumberTagD(this, instr);
   if (FLAG_inline_new) {
+    Register tmp = ToRegister(instr->temp());
     __ AllocateHeapNumber(reg, tmp, no_reg, deferred->entry());
   } else {
     __ jmp(deferred->entry());
index 118aa1c..3a615d7 100644 (file)
@@ -1783,7 +1783,7 @@ LInstruction* LChunkBuilder::DoChange(HChange* instr) {
       LOperand* value = CpuFeatures::IsSupported(SSE2)
           ? UseRegisterAtStart(instr->value())
           : UseAtStart(instr->value());
-      LOperand* temp = TempRegister();
+      LOperand* temp = FLAG_inline_new ? TempRegister() : NULL;
 
       // Make sure that temp and result_temp are different registers.
       LUnallocated* result_temp = TempRegister();
@@ -1807,8 +1807,7 @@ LInstruction* LChunkBuilder::DoChange(HChange* instr) {
       if (val->HasRange() && val->range()->IsInSmiRange()) {
         return DefineSameAsFirst(new(zone()) LSmiTag(value));
       } else if (val->CheckFlag(HInstruction::kUint32)) {
-        LOperand* temp = FixedTemp(xmm1);
-        LNumberTagU* result = new(zone()) LNumberTagU(value, temp);
+        LNumberTagU* result = new(zone()) LNumberTagU(value);
         return AssignEnvironment(AssignPointerMap(DefineSameAsFirst(result)));
       } else {
         LNumberTagI* result = new(zone()) LNumberTagI(value);
index 7ef71d7..1bf402b 100644 (file)
@@ -1883,11 +1883,10 @@ class LNumberTagI: public LTemplateInstruction<1, 1, 0> {
 };
 
 
-class LNumberTagU: public LTemplateInstruction<1, 1, 1> {
+class LNumberTagU: public LTemplateInstruction<1, 1, 0> {
  public:
-  explicit LNumberTagU(LOperand* value, LOperand* temp) {
+  explicit LNumberTagU(LOperand* value) {
     inputs_[0] = value;
-    temps_[0] = temp;
   }
 
   LOperand* value() { return inputs_[0]; }