Unbreak non-SSE2 ia32 platforms.

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
This commit is contained in:
svenpanne@chromium.org 2013-01-29 10:18:15 +00:00
parent a6bc16b6f3
commit 8e51c4c97b
3 changed files with 12 additions and 8 deletions

View 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());

View 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);

View 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]; }