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:
parent
a6bc16b6f3
commit
8e51c4c97b
@ -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());
|
||||
|
@ -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);
|
||||
|
@ -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]; }
|
||||
|
Loading…
Reference in New Issue
Block a user