}
break;
}
+ case kX87BitcastFI: {
+ __ fstp(0);
+ __ mov(i.OutputRegister(), MemOperand(esp, 0));
+ __ lea(esp, Operand(esp, kFloatSize));
+ break;
+ }
+ case kX87BitcastIF: {
+ if (instr->InputAt(0)->IsRegister()) {
+ __ lea(esp, Operand(esp, -kFloatSize));
+ __ mov(MemOperand(esp, 0), i.InputRegister(0));
+ __ fstp(0);
+ __ fld_s(MemOperand(esp, 0));
+ __ lea(esp, Operand(esp, kFloatSize));
+ } else {
+ __ lea(esp, Operand(esp, -kDoubleSize));
+ __ mov(MemOperand(esp, 0), i.InputRegister(0));
+ __ fstp(0);
+ __ fld_d(MemOperand(esp, 0));
+ __ lea(esp, Operand(esp, kDoubleSize));
+ }
+ break;
+ }
case kX87Lea: {
AddressingMode mode = AddressingModeField::decode(instr->opcode());
// Shorten "leal" to "addl", "subl" or "shll" if the register allocation
void InstructionSelector::VisitBitcastFloat32ToInt32(Node* node) {
- UNIMPLEMENTED();
+ X87OperandGenerator g(this);
+ Emit(kX87PushFloat32, g.NoOutput(), g.Use(node->InputAt(0)));
+ Emit(kX87BitcastFI, g.DefineAsRegister(node), 0, NULL);
}
void InstructionSelector::VisitBitcastInt32ToFloat32(Node* node) {
- UNIMPLEMENTED();
+ X87OperandGenerator g(this);
+ Emit(kX87BitcastIF, g.DefineAsFixed(node, stX_0), g.Use(node->InputAt(0)));
}