17d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org// Copyright 2013 the V8 project authors. All rights reserved. 27d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org// Use of this source code is governed by a BSD-style license that can be 37d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org// found in the LICENSE file. 47d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 57d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#include "src/compiler/code-generator.h" 67d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 77d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#include "src/compiler/code-generator-impl.h" 87d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#include "src/compiler/gap-resolver.h" 97d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#include "src/compiler/node-matchers.h" 107d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#include "src/compiler/node-properties-inl.h" 117d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#include "src/scopes.h" 127d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#include "src/x64/assembler-x64.h" 137d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#include "src/x64/macro-assembler-x64.h" 147d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 157d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgnamespace v8 { 167d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgnamespace internal { 177d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgnamespace compiler { 187d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 197d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#define __ masm()-> 207d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 217d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 227d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org// TODO(turbofan): Cleanup these hacks. 237d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgenum Immediate64Type { kImm64Value, kImm64Handle, kImm64Reference }; 247d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 257d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 267d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgstruct Immediate64 { 277d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org uint64_t value; 287d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Handle<Object> handle; 297d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org ExternalReference reference; 307d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Immediate64Type type; 317d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}; 327d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 337d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 347d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgenum RegisterOrOperandType { kRegister, kDoubleRegister, kOperand }; 357d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 367d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 377d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgstruct RegisterOrOperand { 387d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org RegisterOrOperand() : operand(no_reg, 0) {} 397d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Register reg; 407d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org DoubleRegister double_reg; 417d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Operand operand; 427d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org RegisterOrOperandType type; 437d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}; 447d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 457d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 467d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org// Adds X64 specific methods for decoding operands. 477d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgclass X64OperandConverter : public InstructionOperandConverter { 487d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org public: 497d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org X64OperandConverter(CodeGenerator* gen, Instruction* instr) 507d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org : InstructionOperandConverter(gen, instr) {} 517d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 527d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org RegisterOrOperand InputRegisterOrOperand(int index) { 537d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org return ToRegisterOrOperand(instr_->InputAt(index)); 547d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 557d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 567d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Immediate InputImmediate(int index) { 577d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org return ToImmediate(instr_->InputAt(index)); 587d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 597d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 607d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org RegisterOrOperand OutputRegisterOrOperand() { 617d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org return ToRegisterOrOperand(instr_->Output()); 627d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 637d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 647d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Immediate64 InputImmediate64(int index) { 657d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org return ToImmediate64(instr_->InputAt(index)); 667d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 677d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 687d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Immediate64 ToImmediate64(InstructionOperand* operand) { 697d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Constant constant = ToConstant(operand); 707d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Immediate64 immediate; 717d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org immediate.value = 0xbeefdeaddeefbeed; 727d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org immediate.type = kImm64Value; 737d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org switch (constant.type()) { 747d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case Constant::kInt32: 757d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case Constant::kInt64: 767d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org immediate.value = constant.ToInt64(); 777d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org return immediate; 787d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case Constant::kFloat64: 797d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org immediate.type = kImm64Handle; 807d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org immediate.handle = 817d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org isolate()->factory()->NewNumber(constant.ToFloat64(), TENURED); 827d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org return immediate; 837d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case Constant::kExternalReference: 847d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org immediate.type = kImm64Reference; 857d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org immediate.reference = constant.ToExternalReference(); 867d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org return immediate; 877d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case Constant::kHeapObject: 887d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org immediate.type = kImm64Handle; 897d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org immediate.handle = constant.ToHeapObject(); 907d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org return immediate; 917d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 927d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org UNREACHABLE(); 937d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org return immediate; 947d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 957d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 967d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Immediate ToImmediate(InstructionOperand* operand) { 977d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Constant constant = ToConstant(operand); 987d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org switch (constant.type()) { 997d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case Constant::kInt32: 1007d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org return Immediate(constant.ToInt32()); 1017d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case Constant::kInt64: 1027d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case Constant::kFloat64: 1037d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case Constant::kExternalReference: 1047d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case Constant::kHeapObject: 1057d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 1067d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 1077d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org UNREACHABLE(); 1087d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org return Immediate(-1); 1097d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 1107d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 1117d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Operand ToOperand(InstructionOperand* op, int extra = 0) { 1127d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org RegisterOrOperand result = ToRegisterOrOperand(op, extra); 113e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK_EQ(kOperand, result.type); 1147d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org return result.operand; 1157d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 1167d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 1177d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org RegisterOrOperand ToRegisterOrOperand(InstructionOperand* op, int extra = 0) { 1187d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org RegisterOrOperand result; 1197d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org if (op->IsRegister()) { 120e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(extra == 0); 1217d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org result.type = kRegister; 1227d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org result.reg = ToRegister(op); 1237d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org return result; 1247d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } else if (op->IsDoubleRegister()) { 125e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(extra == 0); 126e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(extra == 0); 1277d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org result.type = kDoubleRegister; 1287d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org result.double_reg = ToDoubleRegister(op); 1297d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org return result; 1307d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 1317d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 132e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(op->IsStackSlot() || op->IsDoubleStackSlot()); 1337d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 1347d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org result.type = kOperand; 1357d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // The linkage computes where all spill slots are located. 1367d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org FrameOffset offset = linkage()->GetFrameOffset(op->index(), frame(), extra); 1377d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org result.operand = 1387d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Operand(offset.from_stack_pointer() ? rsp : rbp, offset.offset()); 1397d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org return result; 1407d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 1417d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 1427d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Operand MemoryOperand(int* first_input) { 1437d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org const int offset = *first_input; 1447d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org switch (AddressingModeField::decode(instr_->opcode())) { 1457d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kMode_MR1I: { 1467d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org *first_input += 2; 1477d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Register index = InputRegister(offset + 1); 1487d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org return Operand(InputRegister(offset + 0), index, times_1, 1497d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 0); // TODO(dcarney): K != 0 1507d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 1517d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kMode_MRI: 1527d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org *first_input += 2; 1537d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org return Operand(InputRegister(offset + 0), InputInt32(offset + 1)); 1547d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org default: 1557d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org UNREACHABLE(); 1567d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org return Operand(no_reg, 0); 1577d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 1587d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 1597d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 1607d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Operand MemoryOperand() { 1617d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org int first_input = 0; 1627d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org return MemoryOperand(&first_input); 1637d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 1647d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}; 1657d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 1667d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 1677d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgstatic bool HasImmediateInput(Instruction* instr, int index) { 1687d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org return instr->InputAt(index)->IsImmediate(); 1697d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org} 1707d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 1717d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 1727d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#define ASSEMBLE_BINOP(asm_instr) \ 1737d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org do { \ 1747d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org if (HasImmediateInput(instr, 1)) { \ 1757d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org RegisterOrOperand input = i.InputRegisterOrOperand(0); \ 1767d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org if (input.type == kRegister) { \ 1777d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ asm_instr(input.reg, i.InputImmediate(1)); \ 1787d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } else { \ 1797d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ asm_instr(input.operand, i.InputImmediate(1)); \ 1807d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } \ 1817d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } else { \ 1827d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org RegisterOrOperand input = i.InputRegisterOrOperand(1); \ 1837d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org if (input.type == kRegister) { \ 1847d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ asm_instr(i.InputRegister(0), input.reg); \ 1857d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } else { \ 1867d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ asm_instr(i.InputRegister(0), input.operand); \ 1877d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } \ 1887d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } \ 1897d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } while (0) 1907d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 1917d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 1927d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#define ASSEMBLE_SHIFT(asm_instr, width) \ 1937d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org do { \ 1947d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org if (HasImmediateInput(instr, 1)) { \ 1957d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ asm_instr(i.OutputRegister(), Immediate(i.InputInt##width(1))); \ 1967d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } else { \ 1977d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ asm_instr##_cl(i.OutputRegister()); \ 1987d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } \ 1997d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } while (0) 2007d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 2017d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 2027d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org// Assembles an instruction after register allocation, producing machine code. 2037d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgvoid CodeGenerator::AssembleArchInstruction(Instruction* instr) { 2047d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org X64OperandConverter i(this, instr); 2057d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 2067d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org switch (ArchOpcodeField::decode(instr->opcode())) { 2077b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org case kArchCallCodeObject: { 20806b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org EnsureSpaceForLazyDeopt(); 2097b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org if (HasImmediateInput(instr, 0)) { 2107b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org Handle<Code> code = Handle<Code>::cast(i.InputHeapObject(0)); 2117b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org __ Call(code, RelocInfo::CODE_TARGET); 2127b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org } else { 2137b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org Register reg = i.InputRegister(0); 2147b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org int entry = Code::kHeaderSize - kHeapObjectTag; 2157b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org __ Call(Operand(reg, entry)); 2167b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org } 2177b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org AddSafepointAndDeopt(instr); 2187d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 2197b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org } 2207b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org case kArchCallJSFunction: { 22106b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org EnsureSpaceForLazyDeopt(); 2227b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org Register func = i.InputRegister(0); 2239aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org if (FLAG_debug_code) { 2249aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org // Check the function's context matches the context argument. 2259aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org __ cmpp(rsi, FieldOperand(func, JSFunction::kContextOffset)); 2269aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org __ Assert(equal, kWrongFunctionContext); 2279aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org } 2287b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org __ Call(FieldOperand(func, JSFunction::kCodeEntryOffset)); 2297b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org AddSafepointAndDeopt(instr); 2307d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 2317b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org } 2327b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org case kArchJmp: 2337b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org __ jmp(code_->GetLabel(i.InputBlock(0))); 2347b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org break; 2357b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org case kArchNop: 2367b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org // don't emit code for nops. 2377b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org break; 2387b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org case kArchRet: 2397b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org AssembleReturn(); 2407b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org break; 2417dae5b9f8500ada1f217a27db8a1f5c62becd404machenbach@chromium.org case kArchTruncateDoubleToI: 2427dae5b9f8500ada1f217a27db8a1f5c62becd404machenbach@chromium.org __ TruncateDoubleToI(i.OutputRegister(), i.InputDoubleRegister(0)); 2437dae5b9f8500ada1f217a27db8a1f5c62becd404machenbach@chromium.org break; 2447d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kX64Add32: 2457d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org ASSEMBLE_BINOP(addl); 2467d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 2477d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kX64Add: 2487d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org ASSEMBLE_BINOP(addq); 2497d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 2507d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kX64Sub32: 2517d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org ASSEMBLE_BINOP(subl); 2527d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 2537d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kX64Sub: 2547d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org ASSEMBLE_BINOP(subq); 2557d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 2567d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kX64And32: 2577d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org ASSEMBLE_BINOP(andl); 2587d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 2597d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kX64And: 2607d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org ASSEMBLE_BINOP(andq); 2617d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 2627d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kX64Cmp32: 2637d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org ASSEMBLE_BINOP(cmpl); 2647d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 2657d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kX64Cmp: 2667d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org ASSEMBLE_BINOP(cmpq); 2677d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 2687d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kX64Test32: 2697d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org ASSEMBLE_BINOP(testl); 2707d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 2717d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kX64Test: 2727d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org ASSEMBLE_BINOP(testq); 2737d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 2747d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kX64Imul32: 2757d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org if (HasImmediateInput(instr, 1)) { 2767d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org RegisterOrOperand input = i.InputRegisterOrOperand(0); 2777d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org if (input.type == kRegister) { 2787d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ imull(i.OutputRegister(), input.reg, i.InputImmediate(1)); 2797d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } else { 2807d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ movq(kScratchRegister, input.operand); 2817d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ imull(i.OutputRegister(), kScratchRegister, i.InputImmediate(1)); 2827d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 2837d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } else { 2847d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org RegisterOrOperand input = i.InputRegisterOrOperand(1); 2857d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org if (input.type == kRegister) { 2867d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ imull(i.OutputRegister(), input.reg); 2877d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } else { 2887d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ imull(i.OutputRegister(), input.operand); 2897d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 2907d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 2917d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 2927d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kX64Imul: 2937d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org if (HasImmediateInput(instr, 1)) { 2947d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org RegisterOrOperand input = i.InputRegisterOrOperand(0); 2957d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org if (input.type == kRegister) { 2967d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ imulq(i.OutputRegister(), input.reg, i.InputImmediate(1)); 2977d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } else { 2987d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ movq(kScratchRegister, input.operand); 2997d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ imulq(i.OutputRegister(), kScratchRegister, i.InputImmediate(1)); 3007d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 3017d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } else { 3027d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org RegisterOrOperand input = i.InputRegisterOrOperand(1); 3037d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org if (input.type == kRegister) { 3047d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ imulq(i.OutputRegister(), input.reg); 3057d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } else { 3067d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ imulq(i.OutputRegister(), input.operand); 3077d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 3087d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 3097d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 3107d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kX64Idiv32: 3117d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ cdq(); 3127d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ idivl(i.InputRegister(1)); 3137d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 3147d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kX64Idiv: 3157d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ cqo(); 3167d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ idivq(i.InputRegister(1)); 3177d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 3187d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kX64Udiv32: 3197d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ xorl(rdx, rdx); 3207d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ divl(i.InputRegister(1)); 3217d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 3227d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kX64Udiv: 3237d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ xorq(rdx, rdx); 3247d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ divq(i.InputRegister(1)); 3257d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 3267d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kX64Not: { 3277d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org RegisterOrOperand output = i.OutputRegisterOrOperand(); 3287d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org if (output.type == kRegister) { 3297d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ notq(output.reg); 3307d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } else { 3317d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ notq(output.operand); 3327d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 3337d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 3347d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 3357d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kX64Not32: { 3367d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org RegisterOrOperand output = i.OutputRegisterOrOperand(); 3377d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org if (output.type == kRegister) { 3387d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ notl(output.reg); 3397d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } else { 3407d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ notl(output.operand); 3417d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 3427d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 3437d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 3447d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kX64Neg: { 3457d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org RegisterOrOperand output = i.OutputRegisterOrOperand(); 3467d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org if (output.type == kRegister) { 3477d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ negq(output.reg); 3487d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } else { 3497d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ negq(output.operand); 3507d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 3517d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 3527d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 3537d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kX64Neg32: { 3547d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org RegisterOrOperand output = i.OutputRegisterOrOperand(); 3557d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org if (output.type == kRegister) { 3567d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ negl(output.reg); 3577d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } else { 3587d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ negl(output.operand); 3597d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 3607d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 3617d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 3627d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kX64Or32: 3637d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org ASSEMBLE_BINOP(orl); 3647d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 3657d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kX64Or: 3667d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org ASSEMBLE_BINOP(orq); 3677d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 3687d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kX64Xor32: 3697d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org ASSEMBLE_BINOP(xorl); 3707d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 3717d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kX64Xor: 3727d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org ASSEMBLE_BINOP(xorq); 3737d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 3747d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kX64Shl32: 3757d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org ASSEMBLE_SHIFT(shll, 5); 3767d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 3777d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kX64Shl: 3787d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org ASSEMBLE_SHIFT(shlq, 6); 3797d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 3807d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kX64Shr32: 3817d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org ASSEMBLE_SHIFT(shrl, 5); 3827d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 3837d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kX64Shr: 3847d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org ASSEMBLE_SHIFT(shrq, 6); 3857d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 3867d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kX64Sar32: 3877d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org ASSEMBLE_SHIFT(sarl, 5); 3887d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 3897d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kX64Sar: 3907d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org ASSEMBLE_SHIFT(sarq, 6); 3917d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 3925e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org case kX64Ror32: 3935e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org ASSEMBLE_SHIFT(rorl, 5); 3945e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org break; 3955e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org case kX64Ror: 3965e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org ASSEMBLE_SHIFT(rorq, 6); 3975e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org break; 3987d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kSSEFloat64Cmp: { 3997d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org RegisterOrOperand input = i.InputRegisterOrOperand(1); 4007d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org if (input.type == kDoubleRegister) { 4017d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ ucomisd(i.InputDoubleRegister(0), input.double_reg); 4027d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } else { 4037d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ ucomisd(i.InputDoubleRegister(0), input.operand); 4047d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 4057d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 4067d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 4077d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kSSEFloat64Add: 4087d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ addsd(i.InputDoubleRegister(0), i.InputDoubleRegister(1)); 4097d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 4107d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kSSEFloat64Sub: 4117d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ subsd(i.InputDoubleRegister(0), i.InputDoubleRegister(1)); 4127d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 4137d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kSSEFloat64Mul: 4147d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ mulsd(i.InputDoubleRegister(0), i.InputDoubleRegister(1)); 4157d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 4167d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kSSEFloat64Div: 4177d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ divsd(i.InputDoubleRegister(0), i.InputDoubleRegister(1)); 4187d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 4197d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kSSEFloat64Mod: { 4207d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ subq(rsp, Immediate(kDoubleSize)); 4217d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // Move values to st(0) and st(1). 4227d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ movsd(Operand(rsp, 0), i.InputDoubleRegister(1)); 4237d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ fld_d(Operand(rsp, 0)); 4247d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ movsd(Operand(rsp, 0), i.InputDoubleRegister(0)); 4257d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ fld_d(Operand(rsp, 0)); 4267d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // Loop while fprem isn't done. 4277d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Label mod_loop; 4287d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ bind(&mod_loop); 4297d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // This instructions traps on all kinds inputs, but we are assuming the 4307d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // floating point control word is set to ignore them all. 4317d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ fprem(); 4327d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // The following 2 instruction implicitly use rax. 4337d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ fnstsw_ax(); 4347d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org if (CpuFeatures::IsSupported(SAHF) && masm()->IsEnabled(SAHF)) { 4357d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ sahf(); 4367d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } else { 4377d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ shrl(rax, Immediate(8)); 4387d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ andl(rax, Immediate(0xFF)); 4397d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ pushq(rax); 4407d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ popfq(); 4417d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 4427d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ j(parity_even, &mod_loop); 4437d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // Move output to stack and clean up. 4447d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ fstp(1); 4457d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ fstp_d(Operand(rsp, 0)); 4467d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ movsd(i.OutputDoubleRegister(), Operand(rsp, 0)); 4477d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ addq(rsp, Immediate(kDoubleSize)); 4487d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 4497d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 450b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org case kSSEFloat64Sqrt: { 451b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org RegisterOrOperand input = i.InputRegisterOrOperand(0); 452b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org if (input.type == kDoubleRegister) { 453b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org __ sqrtsd(i.OutputDoubleRegister(), input.double_reg); 454b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org } else { 455b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org __ sqrtsd(i.OutputDoubleRegister(), input.operand); 456b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org } 457b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org break; 458b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org } 4597d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kSSEFloat64ToInt32: { 4607d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org RegisterOrOperand input = i.InputRegisterOrOperand(0); 4617d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org if (input.type == kDoubleRegister) { 4627d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ cvttsd2si(i.OutputRegister(), input.double_reg); 4637d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } else { 4647d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ cvttsd2si(i.OutputRegister(), input.operand); 4657d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 4667d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 4677d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 4687d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kSSEFloat64ToUint32: { 469a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org RegisterOrOperand input = i.InputRegisterOrOperand(0); 470a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org if (input.type == kDoubleRegister) { 471a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org __ cvttsd2siq(i.OutputRegister(), input.double_reg); 472a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org } else { 473a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org __ cvttsd2siq(i.OutputRegister(), input.operand); 474a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org } 4757d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ andl(i.OutputRegister(), i.OutputRegister()); // clear upper bits. 4767d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // TODO(turbofan): generated code should not look at the upper 32 bits 4777d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // of the result, but those bits could escape to the outside world. 4787d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 4797d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 4807d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kSSEInt32ToFloat64: { 4817d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org RegisterOrOperand input = i.InputRegisterOrOperand(0); 4827d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org if (input.type == kRegister) { 4837d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ cvtlsi2sd(i.OutputDoubleRegister(), input.reg); 4847d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } else { 4857d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ cvtlsi2sd(i.OutputDoubleRegister(), input.operand); 4867d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 4877d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 4887d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 4897d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kSSEUint32ToFloat64: { 4907d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // TODO(turbofan): X64 SSE cvtqsi2sd should support operands. 4917d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ cvtqsi2sd(i.OutputDoubleRegister(), i.InputRegister(0)); 4927d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 4937d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 4946474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org case kX64Movsxbl: 4956474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org __ movsxbl(i.OutputRegister(), i.MemoryOperand()); 4967d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 4976474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org case kX64Movzxbl: 4987d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ movzxbl(i.OutputRegister(), i.MemoryOperand()); 4997d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 5006474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org case kX64Movb: { 5017d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org int index = 0; 5027d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Operand operand = i.MemoryOperand(&index); 5036474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org if (HasImmediateInput(instr, index)) { 5046474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org __ movb(operand, Immediate(i.InputInt8(index))); 5056474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org } else { 5066474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org __ movb(operand, i.InputRegister(index)); 5076474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org } 5087d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 5097d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 5106474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org case kX64Movsxwl: 5116474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org __ movsxwl(i.OutputRegister(), i.MemoryOperand()); 5127d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 5136474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org case kX64Movzxwl: 5147d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ movzxwl(i.OutputRegister(), i.MemoryOperand()); 5157d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 5166474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org case kX64Movw: { 5177d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org int index = 0; 5187d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Operand operand = i.MemoryOperand(&index); 5196474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org if (HasImmediateInput(instr, index)) { 5206474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org __ movw(operand, Immediate(i.InputInt16(index))); 5216474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org } else { 5226474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org __ movw(operand, i.InputRegister(index)); 5236474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org } 5247d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 5257d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 5266474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org case kX64Movl: 5276474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org if (instr->HasOutput()) { 5286474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org if (instr->addressing_mode() == kMode_None) { 5296474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org RegisterOrOperand input = i.InputRegisterOrOperand(0); 5306474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org if (input.type == kRegister) { 5316474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org __ movl(i.OutputRegister(), input.reg); 5326474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org } else { 5336474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org __ movl(i.OutputRegister(), input.operand); 5346474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org } 5356474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org } else { 5366474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org __ movl(i.OutputRegister(), i.MemoryOperand()); 5376474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org } 5386474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org } else { 5396474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org int index = 0; 5406474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org Operand operand = i.MemoryOperand(&index); 5416474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org if (HasImmediateInput(instr, index)) { 5426474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org __ movl(operand, i.InputImmediate(index)); 5436474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org } else { 5446474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org __ movl(operand, i.InputRegister(index)); 5456474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org } 5466474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org } 5477d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 5486474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org case kX64Movsxlq: { 5496474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org RegisterOrOperand input = i.InputRegisterOrOperand(0); 5506474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org if (input.type == kRegister) { 5516474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org __ movsxlq(i.OutputRegister(), input.reg); 5526474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org } else { 5536474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org __ movsxlq(i.OutputRegister(), input.operand); 5546474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org } 5557d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 5567d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 5576474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org case kX64Movq: 5586474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org if (instr->HasOutput()) { 5596474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org __ movq(i.OutputRegister(), i.MemoryOperand()); 5606474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org } else { 5616474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org int index = 0; 5626474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org Operand operand = i.MemoryOperand(&index); 5636474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org if (HasImmediateInput(instr, index)) { 5646474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org __ movq(operand, i.InputImmediate(index)); 5656474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org } else { 5666474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org __ movq(operand, i.InputRegister(index)); 5676474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org } 5686474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org } 5697d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 570fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org case kX64Movss: 571fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org if (instr->HasOutput()) { 572fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org __ movss(i.OutputDoubleRegister(), i.MemoryOperand()); 573fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org __ cvtss2sd(i.OutputDoubleRegister(), i.OutputDoubleRegister()); 574fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org } else { 575fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org int index = 0; 576fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org Operand operand = i.MemoryOperand(&index); 577fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org __ cvtsd2ss(xmm0, i.InputDoubleRegister(index)); 578fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org __ movss(operand, xmm0); 579fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org } 580fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org break; 581fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org case kX64Movsd: 582fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org if (instr->HasOutput()) { 583fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org __ movsd(i.OutputDoubleRegister(), i.MemoryOperand()); 584fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org } else { 585fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org int index = 0; 586fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org Operand operand = i.MemoryOperand(&index); 587fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org __ movsd(operand, i.InputDoubleRegister(index)); 588fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org } 589fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org break; 5907b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org case kX64Push: 5917b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org if (HasImmediateInput(instr, 0)) { 5927b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org __ pushq(i.InputImmediate(0)); 5937b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org } else { 5947b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org RegisterOrOperand input = i.InputRegisterOrOperand(0); 5957b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org if (input.type == kRegister) { 5967b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org __ pushq(input.reg); 5977b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org } else { 5987b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org __ pushq(input.operand); 5997b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org } 6007b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org } 6017b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org break; 6027d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kX64StoreWriteBarrier: { 6037d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Register object = i.InputRegister(0); 6047d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Register index = i.InputRegister(1); 6057d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Register value = i.InputRegister(2); 6067d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ movsxlq(index, index); 6077d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ movq(Operand(object, index, times_1, 0), value); 6087d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ leaq(index, Operand(object, index, times_1, 0)); 6097d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org SaveFPRegsMode mode = code_->frame()->DidAllocateDoubleRegisters() 6107d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org ? kSaveFPRegs 6117d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org : kDontSaveFPRegs; 6127d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ RecordWrite(object, index, value, mode); 6137d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 6147d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 6157d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 6167d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org} 6177d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 6187d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 6197d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org// Assembles branches after this instruction. 6207d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgvoid CodeGenerator::AssembleArchBranch(Instruction* instr, 6217d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org FlagsCondition condition) { 6227d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org X64OperandConverter i(this, instr); 6237d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Label done; 6247d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 6257d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // Emit a branch. The true and false targets are always the last two inputs 6267d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // to the instruction. 6277d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org BasicBlock* tblock = i.InputBlock(static_cast<int>(instr->InputCount()) - 2); 6287d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org BasicBlock* fblock = i.InputBlock(static_cast<int>(instr->InputCount()) - 1); 6297d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org bool fallthru = IsNextInAssemblyOrder(fblock); 6307d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Label* tlabel = code()->GetLabel(tblock); 6317d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Label* flabel = fallthru ? &done : code()->GetLabel(fblock); 6327d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Label::Distance flabel_distance = fallthru ? Label::kNear : Label::kFar; 6337d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org switch (condition) { 6347d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kUnorderedEqual: 6357d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ j(parity_even, flabel, flabel_distance); 6367d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // Fall through. 6377d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kEqual: 6387d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ j(equal, tlabel); 6397d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 6407d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kUnorderedNotEqual: 6417d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ j(parity_even, tlabel); 6427d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // Fall through. 6437d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kNotEqual: 6447d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ j(not_equal, tlabel); 6457d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 6467d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kSignedLessThan: 6477d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ j(less, tlabel); 6487d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 6497d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kSignedGreaterThanOrEqual: 6507d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ j(greater_equal, tlabel); 6517d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 6527d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kSignedLessThanOrEqual: 6537d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ j(less_equal, tlabel); 6547d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 6557d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kSignedGreaterThan: 6567d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ j(greater, tlabel); 6577d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 6587d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kUnorderedLessThan: 6597d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ j(parity_even, flabel, flabel_distance); 6607d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // Fall through. 6617d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kUnsignedLessThan: 6627d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ j(below, tlabel); 6637d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 6647d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kUnorderedGreaterThanOrEqual: 6657d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ j(parity_even, tlabel); 6667d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // Fall through. 6677d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kUnsignedGreaterThanOrEqual: 6687d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ j(above_equal, tlabel); 6697d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 6707d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kUnorderedLessThanOrEqual: 6717d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ j(parity_even, flabel, flabel_distance); 6727d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // Fall through. 6737d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kUnsignedLessThanOrEqual: 6747d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ j(below_equal, tlabel); 6757d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 6767d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kUnorderedGreaterThan: 6777d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ j(parity_even, tlabel); 6787d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // Fall through. 6797d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kUnsignedGreaterThan: 6807d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ j(above, tlabel); 6817d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 682aca8beeda619beb0f9758b04d1eaebdea5538a44machenbach@chromium.org case kOverflow: 683aca8beeda619beb0f9758b04d1eaebdea5538a44machenbach@chromium.org __ j(overflow, tlabel); 684aca8beeda619beb0f9758b04d1eaebdea5538a44machenbach@chromium.org break; 685aca8beeda619beb0f9758b04d1eaebdea5538a44machenbach@chromium.org case kNotOverflow: 686aca8beeda619beb0f9758b04d1eaebdea5538a44machenbach@chromium.org __ j(no_overflow, tlabel); 687aca8beeda619beb0f9758b04d1eaebdea5538a44machenbach@chromium.org break; 6887d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 6897d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org if (!fallthru) __ jmp(flabel, flabel_distance); // no fallthru to flabel. 6907d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ bind(&done); 6917d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org} 6927d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 6937d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 6947d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org// Assembles boolean materializations after this instruction. 6957d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgvoid CodeGenerator::AssembleArchBoolean(Instruction* instr, 6967d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org FlagsCondition condition) { 6977d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org X64OperandConverter i(this, instr); 6987d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Label done; 6997d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 700aca8beeda619beb0f9758b04d1eaebdea5538a44machenbach@chromium.org // Materialize a full 64-bit 1 or 0 value. The result register is always the 701aca8beeda619beb0f9758b04d1eaebdea5538a44machenbach@chromium.org // last output of the instruction. 7027d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Label check; 703e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK_NE(0, instr->OutputCount()); 7043e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org Register reg = i.OutputRegister(static_cast<int>(instr->OutputCount() - 1)); 7057d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Condition cc = no_condition; 7067d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org switch (condition) { 7077d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kUnorderedEqual: 7087d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ j(parity_odd, &check, Label::kNear); 7097d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ movl(reg, Immediate(0)); 7107d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ jmp(&done, Label::kNear); 7117d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // Fall through. 7127d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kEqual: 7137d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org cc = equal; 7147d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 7157d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kUnorderedNotEqual: 7167d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ j(parity_odd, &check, Label::kNear); 7177d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ movl(reg, Immediate(1)); 7187d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ jmp(&done, Label::kNear); 7197d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // Fall through. 7207d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kNotEqual: 7217d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org cc = not_equal; 7227d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 7237d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kSignedLessThan: 7247d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org cc = less; 7257d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 7267d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kSignedGreaterThanOrEqual: 7277d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org cc = greater_equal; 7287d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 7297d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kSignedLessThanOrEqual: 7307d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org cc = less_equal; 7317d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 7327d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kSignedGreaterThan: 7337d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org cc = greater; 7347d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 7357d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kUnorderedLessThan: 7367d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ j(parity_odd, &check, Label::kNear); 7377d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ movl(reg, Immediate(0)); 7387d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ jmp(&done, Label::kNear); 7397d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // Fall through. 7407d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kUnsignedLessThan: 7417d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org cc = below; 7427d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 7437d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kUnorderedGreaterThanOrEqual: 7447d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ j(parity_odd, &check, Label::kNear); 7457d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ movl(reg, Immediate(1)); 7467d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ jmp(&done, Label::kNear); 7477d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // Fall through. 7487d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kUnsignedGreaterThanOrEqual: 7497d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org cc = above_equal; 7507d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 7517d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kUnorderedLessThanOrEqual: 7527d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ j(parity_odd, &check, Label::kNear); 7537d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ movl(reg, Immediate(0)); 7547d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ jmp(&done, Label::kNear); 7557d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // Fall through. 7567d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kUnsignedLessThanOrEqual: 7577d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org cc = below_equal; 7587d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 7597d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kUnorderedGreaterThan: 7607d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ j(parity_odd, &check, Label::kNear); 7617d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ movl(reg, Immediate(1)); 7627d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ jmp(&done, Label::kNear); 7637d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // Fall through. 7647d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kUnsignedGreaterThan: 7657d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org cc = above; 7667d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 767aca8beeda619beb0f9758b04d1eaebdea5538a44machenbach@chromium.org case kOverflow: 768aca8beeda619beb0f9758b04d1eaebdea5538a44machenbach@chromium.org cc = overflow; 769aca8beeda619beb0f9758b04d1eaebdea5538a44machenbach@chromium.org break; 770aca8beeda619beb0f9758b04d1eaebdea5538a44machenbach@chromium.org case kNotOverflow: 771aca8beeda619beb0f9758b04d1eaebdea5538a44machenbach@chromium.org cc = no_overflow; 772aca8beeda619beb0f9758b04d1eaebdea5538a44machenbach@chromium.org break; 7737d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 7747d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ bind(&check); 7757d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ setcc(cc, reg); 7767d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ movzxbl(reg, reg); 7777d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ bind(&done); 7787d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org} 7797d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 7807d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 781ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgvoid CodeGenerator::AssembleDeoptimizerCall(int deoptimization_id) { 782ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org Address deopt_entry = Deoptimizer::GetDeoptimizationEntry( 783ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org isolate(), deoptimization_id, Deoptimizer::LAZY); 784ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org __ call(deopt_entry, RelocInfo::RUNTIME_ENTRY); 785ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org} 786ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org 787ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org 7887d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgvoid CodeGenerator::AssemblePrologue() { 7897d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org CallDescriptor* descriptor = linkage()->GetIncomingDescriptor(); 7907d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org int stack_slots = frame()->GetSpillSlotCount(); 7917d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org if (descriptor->kind() == CallDescriptor::kCallAddress) { 7927d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ pushq(rbp); 7937d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ movq(rbp, rsp); 7947d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org const RegList saves = descriptor->CalleeSavedRegisters(); 7957d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org if (saves != 0) { // Save callee-saved registers. 7967d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org int register_save_area_size = 0; 7977d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org for (int i = Register::kNumRegisters - 1; i >= 0; i--) { 7987d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org if (!((1 << i) & saves)) continue; 7997d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ pushq(Register::from_code(i)); 8007d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org register_save_area_size += kPointerSize; 8017d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 8027d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org frame()->SetRegisterSaveAreaSize(register_save_area_size); 8037d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 8047d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } else if (descriptor->IsJSFunctionCall()) { 8057d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org CompilationInfo* info = linkage()->info(); 8067d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ Prologue(info->IsCodePreAgingActive()); 8077d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org frame()->SetRegisterSaveAreaSize( 8087d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org StandardFrameConstants::kFixedFrameSizeFromFp); 8097d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 8107d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // Sloppy mode functions and builtins need to replace the receiver with the 8117d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // global proxy when called as functions (without an explicit receiver 8127d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // object). 8137d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // TODO(mstarzinger/verwaest): Should this be moved back into the CallIC? 8147d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org if (info->strict_mode() == SLOPPY && !info->is_native()) { 8157d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Label ok; 8167d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org StackArgumentsAccessor args(rbp, info->scope()->num_parameters()); 8177d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ movp(rcx, args.GetReceiverOperand()); 8187d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ CompareRoot(rcx, Heap::kUndefinedValueRootIndex); 8197d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ j(not_equal, &ok, Label::kNear); 8207d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ movp(rcx, GlobalObjectOperand()); 8217d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ movp(rcx, FieldOperand(rcx, GlobalObject::kGlobalProxyOffset)); 8227d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ movp(args.GetReceiverOperand(), rcx); 8237d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ bind(&ok); 8247d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 8257d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 8267d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } else { 8277d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ StubPrologue(); 8287d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org frame()->SetRegisterSaveAreaSize( 8297d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org StandardFrameConstants::kFixedFrameSizeFromFp); 8307d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 8317d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org if (stack_slots > 0) { 8327d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ subq(rsp, Immediate(stack_slots * kPointerSize)); 8337d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 8347d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org} 8357d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 8367d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 8377d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgvoid CodeGenerator::AssembleReturn() { 8387d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org CallDescriptor* descriptor = linkage()->GetIncomingDescriptor(); 8397d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org if (descriptor->kind() == CallDescriptor::kCallAddress) { 8407d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org if (frame()->GetRegisterSaveAreaSize() > 0) { 8417d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // Remove this frame's spill slots first. 8427d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org int stack_slots = frame()->GetSpillSlotCount(); 8437d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org if (stack_slots > 0) { 8447d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ addq(rsp, Immediate(stack_slots * kPointerSize)); 8457d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 8467d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org const RegList saves = descriptor->CalleeSavedRegisters(); 8477d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // Restore registers. 8487d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org if (saves != 0) { 8497d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org for (int i = 0; i < Register::kNumRegisters; i++) { 8507d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org if (!((1 << i) & saves)) continue; 8517d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ popq(Register::from_code(i)); 8527d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 8537d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 8547d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ popq(rbp); // Pop caller's frame pointer. 8557d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ ret(0); 8567d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } else { 8577d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // No saved registers. 8587d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ movq(rsp, rbp); // Move stack pointer back to frame pointer. 8597d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ popq(rbp); // Pop caller's frame pointer. 8607d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ ret(0); 8617d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 8627d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } else { 8637d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ movq(rsp, rbp); // Move stack pointer back to frame pointer. 8647d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ popq(rbp); // Pop caller's frame pointer. 8659aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org int pop_count = descriptor->IsJSFunctionCall() 8669aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org ? static_cast<int>(descriptor->JSParameterCount()) 8679aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org : 0; 8687d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ ret(pop_count * kPointerSize); 8697d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 8707d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org} 8717d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 8727d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 8737d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgvoid CodeGenerator::AssembleMove(InstructionOperand* source, 8747d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org InstructionOperand* destination) { 8757d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org X64OperandConverter g(this, NULL); 8767d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // Dispatch on the source and destination operand kinds. Not all 8777d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // combinations are possible. 8787d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org if (source->IsRegister()) { 879e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(destination->IsRegister() || destination->IsStackSlot()); 8807d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Register src = g.ToRegister(source); 8817d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org if (destination->IsRegister()) { 8827d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ movq(g.ToRegister(destination), src); 8837d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } else { 8847d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ movq(g.ToOperand(destination), src); 8857d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 8867d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } else if (source->IsStackSlot()) { 887e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(destination->IsRegister() || destination->IsStackSlot()); 8887d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Operand src = g.ToOperand(source); 8897d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org if (destination->IsRegister()) { 8907d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Register dst = g.ToRegister(destination); 8917d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ movq(dst, src); 8927d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } else { 8937d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // Spill on demand to use a temporary register for memory-to-memory 8947d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // moves. 8957d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Register tmp = kScratchRegister; 8967d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Operand dst = g.ToOperand(destination); 8977d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ movq(tmp, src); 8987d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ movq(dst, tmp); 8997d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 9007d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } else if (source->IsConstant()) { 9017d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org ConstantOperand* constant_source = ConstantOperand::cast(source); 9027d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org if (destination->IsRegister() || destination->IsStackSlot()) { 9037d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Register dst = destination->IsRegister() ? g.ToRegister(destination) 9047d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org : kScratchRegister; 9057d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Immediate64 imm = g.ToImmediate64(constant_source); 9067d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org switch (imm.type) { 9077d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kImm64Value: 9087d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ Set(dst, imm.value); 9097d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 9107d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kImm64Reference: 9117d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ Move(dst, imm.reference); 9127d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 9137d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kImm64Handle: 9147d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ Move(dst, imm.handle); 9157d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 9167d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 9177d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org if (destination->IsStackSlot()) { 9187d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ movq(g.ToOperand(destination), kScratchRegister); 9197d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 9207d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } else { 9217d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ movq(kScratchRegister, 922e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org bit_cast<uint64_t, double>(g.ToDouble(constant_source))); 9237d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org if (destination->IsDoubleRegister()) { 9247d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ movq(g.ToDoubleRegister(destination), kScratchRegister); 9257d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } else { 926e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(destination->IsDoubleStackSlot()); 9277d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ movq(g.ToOperand(destination), kScratchRegister); 9287d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 9297d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 9307d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } else if (source->IsDoubleRegister()) { 9317d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org XMMRegister src = g.ToDoubleRegister(source); 9327d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org if (destination->IsDoubleRegister()) { 9337d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org XMMRegister dst = g.ToDoubleRegister(destination); 9347d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ movsd(dst, src); 9357d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } else { 936e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(destination->IsDoubleStackSlot()); 9377d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Operand dst = g.ToOperand(destination); 9387d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ movsd(dst, src); 9397d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 9407d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } else if (source->IsDoubleStackSlot()) { 941e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(destination->IsDoubleRegister() || destination->IsDoubleStackSlot()); 9427d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Operand src = g.ToOperand(source); 9437d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org if (destination->IsDoubleRegister()) { 9447d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org XMMRegister dst = g.ToDoubleRegister(destination); 9457d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ movsd(dst, src); 9467d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } else { 9477d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // We rely on having xmm0 available as a fixed scratch register. 9487d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Operand dst = g.ToOperand(destination); 9497d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ movsd(xmm0, src); 9507d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ movsd(dst, xmm0); 9517d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 9527d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } else { 9537d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org UNREACHABLE(); 9547d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 9557d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org} 9567d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 9577d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 9587d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgvoid CodeGenerator::AssembleSwap(InstructionOperand* source, 9597d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org InstructionOperand* destination) { 9607d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org X64OperandConverter g(this, NULL); 9617d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // Dispatch on the source and destination operand kinds. Not all 9627d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // combinations are possible. 9637d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org if (source->IsRegister() && destination->IsRegister()) { 9647d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // Register-register. 9657d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ xchgq(g.ToRegister(source), g.ToRegister(destination)); 9667d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } else if (source->IsRegister() && destination->IsStackSlot()) { 9677d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Register src = g.ToRegister(source); 9687d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Operand dst = g.ToOperand(destination); 9697d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ xchgq(src, dst); 9707d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } else if ((source->IsStackSlot() && destination->IsStackSlot()) || 9717d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org (source->IsDoubleStackSlot() && 9727d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org destination->IsDoubleStackSlot())) { 9737d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // Memory-memory. 9747d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Register tmp = kScratchRegister; 9757d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Operand src = g.ToOperand(source); 9767d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Operand dst = g.ToOperand(destination); 9777d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ movq(tmp, dst); 9787d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ xchgq(tmp, src); 9797d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ movq(dst, tmp); 9807d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } else if (source->IsDoubleRegister() && destination->IsDoubleRegister()) { 9817d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // XMM register-register swap. We rely on having xmm0 9827d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // available as a fixed scratch register. 9837d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org XMMRegister src = g.ToDoubleRegister(source); 9847d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org XMMRegister dst = g.ToDoubleRegister(destination); 9857d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ movsd(xmm0, src); 9867d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ movsd(src, dst); 9877d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ movsd(dst, xmm0); 9887d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } else if (source->IsDoubleRegister() && destination->IsDoubleRegister()) { 9897d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // XMM register-memory swap. We rely on having xmm0 9907d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // available as a fixed scratch register. 9917d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org XMMRegister src = g.ToDoubleRegister(source); 9927d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Operand dst = g.ToOperand(destination); 9937d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ movsd(xmm0, src); 9947d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ movsd(src, dst); 9957d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ movsd(dst, xmm0); 9967d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } else { 9977d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // No other combinations are possible. 9987d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org UNREACHABLE(); 9997d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 10007d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org} 10017d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 10027d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 10037d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgvoid CodeGenerator::AddNopForSmiCodeInlining() { __ nop(); } 10047d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 100506b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org 100606b2696801712948b665372a38f96b1f10be6997machenbach@chromium.orgvoid CodeGenerator::EnsureSpaceForLazyDeopt() { 100706b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org int space_needed = Deoptimizer::patch_size(); 100806b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org if (!linkage()->info()->IsStub()) { 100906b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org // Ensure that we have enough space after the previous lazy-bailout 101006b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org // instruction for patching the code here. 101106b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org int current_pc = masm()->pc_offset(); 101206b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org if (current_pc < last_lazy_deopt_pc_ + space_needed) { 101306b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org int padding_size = last_lazy_deopt_pc_ + space_needed - current_pc; 101406b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org __ Nop(padding_size); 101506b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org } 101606b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org } 101706b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org MarkLazyDeoptSite(); 101806b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org} 101906b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org 10207d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#undef __ 10217d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 10223e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org} // namespace internal 10233e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org} // namespace compiler 10243e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org} // namespace v8 1025