17d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org// Copyright 2014 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/arm/macro-assembler-arm.h" 87d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#include "src/compiler/code-generator-impl.h" 97d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#include "src/compiler/gap-resolver.h" 107d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#include "src/compiler/node-matchers.h" 117d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#include "src/compiler/node-properties-inl.h" 127d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#include "src/scopes.h" 137d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 147d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgnamespace v8 { 157d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgnamespace internal { 167d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgnamespace compiler { 177d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 187d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#define __ masm()-> 197d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 207d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 217d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#define kScratchReg r9 227d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 237d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 247d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org// Adds Arm-specific methods to convert InstructionOperands. 257d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgclass ArmOperandConverter : public InstructionOperandConverter { 267d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org public: 277d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org ArmOperandConverter(CodeGenerator* gen, Instruction* instr) 287d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org : InstructionOperandConverter(gen, instr) {} 297d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 307d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org SBit OutputSBit() const { 317d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org switch (instr_->flags_mode()) { 327d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kFlags_branch: 337d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kFlags_set: 347d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org return SetCC; 357d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kFlags_none: 367d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org return LeaveCC; 377d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 387d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org UNREACHABLE(); 397d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org return LeaveCC; 407d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 417d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 427d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Operand InputImmediate(int index) { 437d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Constant constant = ToConstant(instr_->InputAt(index)); 447d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org switch (constant.type()) { 457d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case Constant::kInt32: 467d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org return Operand(constant.ToInt32()); 477d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case Constant::kFloat64: 487d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org return Operand( 497d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org isolate()->factory()->NewNumber(constant.ToFloat64(), TENURED)); 507d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case Constant::kInt64: 517d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case Constant::kExternalReference: 527d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case Constant::kHeapObject: 537d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 547d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 557d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org UNREACHABLE(); 567d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org return Operand::Zero(); 577d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 587d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 597d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Operand InputOperand2(int first_index) { 607d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org const int index = first_index; 617d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org switch (AddressingModeField::decode(instr_->opcode())) { 627d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kMode_None: 637d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kMode_Offset_RI: 647d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kMode_Offset_RR: 657d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 667d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kMode_Operand2_I: 677d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org return InputImmediate(index + 0); 687d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kMode_Operand2_R: 697d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org return Operand(InputRegister(index + 0)); 707d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kMode_Operand2_R_ASR_I: 717d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org return Operand(InputRegister(index + 0), ASR, InputInt5(index + 1)); 727d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kMode_Operand2_R_ASR_R: 737d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org return Operand(InputRegister(index + 0), ASR, InputRegister(index + 1)); 747d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kMode_Operand2_R_LSL_I: 757d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org return Operand(InputRegister(index + 0), LSL, InputInt5(index + 1)); 767d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kMode_Operand2_R_LSL_R: 777d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org return Operand(InputRegister(index + 0), LSL, InputRegister(index + 1)); 787d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kMode_Operand2_R_LSR_I: 797d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org return Operand(InputRegister(index + 0), LSR, InputInt5(index + 1)); 807d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kMode_Operand2_R_LSR_R: 817d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org return Operand(InputRegister(index + 0), LSR, InputRegister(index + 1)); 827d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kMode_Operand2_R_ROR_I: 837d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org return Operand(InputRegister(index + 0), ROR, InputInt5(index + 1)); 847d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kMode_Operand2_R_ROR_R: 857d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org return Operand(InputRegister(index + 0), ROR, InputRegister(index + 1)); 867d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 877d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org UNREACHABLE(); 887d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org return Operand::Zero(); 897d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 907d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 917d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org MemOperand InputOffset(int* first_index) { 927d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org const int index = *first_index; 937d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org switch (AddressingModeField::decode(instr_->opcode())) { 947d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kMode_None: 957d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kMode_Operand2_I: 967d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kMode_Operand2_R: 977d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kMode_Operand2_R_ASR_I: 987d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kMode_Operand2_R_ASR_R: 997d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kMode_Operand2_R_LSL_I: 1007d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kMode_Operand2_R_LSL_R: 1017d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kMode_Operand2_R_LSR_I: 1027d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kMode_Operand2_R_LSR_R: 1037d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kMode_Operand2_R_ROR_I: 1047d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kMode_Operand2_R_ROR_R: 1057d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 1067d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kMode_Offset_RI: 1077d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org *first_index += 2; 1087d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org return MemOperand(InputRegister(index + 0), InputInt32(index + 1)); 1097d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kMode_Offset_RR: 1107d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org *first_index += 2; 1117d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org return MemOperand(InputRegister(index + 0), InputRegister(index + 1)); 1127d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 1137d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org UNREACHABLE(); 1147d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org return MemOperand(r0); 1157d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 1167d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 1177d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org MemOperand InputOffset() { 1187d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org int index = 0; 1197d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org return InputOffset(&index); 1207d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 1217d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 1227d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org MemOperand ToMemOperand(InstructionOperand* op) const { 123e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(op != NULL); 124e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(!op->IsRegister()); 125e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(!op->IsDoubleRegister()); 126e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(op->IsStackSlot() || op->IsDoubleStackSlot()); 1277d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // The linkage computes where all spill slots are located. 1287d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org FrameOffset offset = linkage()->GetFrameOffset(op->index(), frame(), 0); 1297d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org return MemOperand(offset.from_stack_pointer() ? sp : fp, offset.offset()); 1307d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 1317d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}; 1327d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 1337d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 1347d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org// Assembles an instruction after register allocation, producing machine code. 1357d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgvoid CodeGenerator::AssembleArchInstruction(Instruction* instr) { 1367d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org ArmOperandConverter i(this, instr); 1377d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 1387d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org switch (ArchOpcodeField::decode(instr->opcode())) { 1397b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org case kArchCallCodeObject: { 14006b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org EnsureSpaceForLazyDeopt(); 1417b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org if (instr->InputAt(0)->IsImmediate()) { 1427b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org __ Call(Handle<Code>::cast(i.InputHeapObject(0)), 1437b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org RelocInfo::CODE_TARGET); 1447b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org } else { 1457b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org __ add(ip, i.InputRegister(0), 1467b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org Operand(Code::kHeaderSize - kHeapObjectTag)); 1477b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org __ Call(ip); 1487b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org } 1497b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org AddSafepointAndDeopt(instr); 150e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK_EQ(LeaveCC, i.OutputSBit()); 1517d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 1527b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org } 1537b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org case kArchCallJSFunction: { 15406b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org EnsureSpaceForLazyDeopt(); 1557b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org Register func = i.InputRegister(0); 1569aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org if (FLAG_debug_code) { 1579aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org // Check the function's context matches the context argument. 1589aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org __ ldr(kScratchReg, FieldMemOperand(func, JSFunction::kContextOffset)); 1599aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org __ cmp(cp, kScratchReg); 1609aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org __ Assert(eq, kWrongFunctionContext); 1619aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org } 1627b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org __ ldr(ip, FieldMemOperand(func, JSFunction::kCodeEntryOffset)); 1637b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org __ Call(ip); 1647b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org AddSafepointAndDeopt(instr); 165e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK_EQ(LeaveCC, i.OutputSBit()); 1667d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 1677b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org } 1687b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org case kArchJmp: 1697b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org __ b(code_->GetLabel(i.InputBlock(0))); 1707b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org DCHECK_EQ(LeaveCC, i.OutputSBit()); 1717b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org break; 1727b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org case kArchNop: 1737b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org // don't emit code for nops. 1747b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org DCHECK_EQ(LeaveCC, i.OutputSBit()); 1757b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org break; 1767b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org case kArchRet: 1777b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org AssembleReturn(); 1787b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org DCHECK_EQ(LeaveCC, i.OutputSBit()); 1797b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org break; 1807dae5b9f8500ada1f217a27db8a1f5c62becd404machenbach@chromium.org case kArchTruncateDoubleToI: 1817dae5b9f8500ada1f217a27db8a1f5c62becd404machenbach@chromium.org __ TruncateDoubleToI(i.OutputRegister(), i.InputDoubleRegister(0)); 1827dae5b9f8500ada1f217a27db8a1f5c62becd404machenbach@chromium.org DCHECK_EQ(LeaveCC, i.OutputSBit()); 1837dae5b9f8500ada1f217a27db8a1f5c62becd404machenbach@chromium.org break; 1847d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kArmAdd: 1857d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ add(i.OutputRegister(), i.InputRegister(0), i.InputOperand2(1), 1867d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org i.OutputSBit()); 1877d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 1887d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kArmAnd: 1897d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ and_(i.OutputRegister(), i.InputRegister(0), i.InputOperand2(1), 1907d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org i.OutputSBit()); 1917d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 1927d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kArmBic: 1937d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ bic(i.OutputRegister(), i.InputRegister(0), i.InputOperand2(1), 1947d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org i.OutputSBit()); 1957d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 1967d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kArmMul: 1977d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ mul(i.OutputRegister(), i.InputRegister(0), i.InputRegister(1), 1987d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org i.OutputSBit()); 1997d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 2007d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kArmMla: 2017d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ mla(i.OutputRegister(), i.InputRegister(0), i.InputRegister(1), 2027d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org i.InputRegister(2), i.OutputSBit()); 2037d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 2047d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kArmMls: { 2057d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org CpuFeatureScope scope(masm(), MLS); 2067d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ mls(i.OutputRegister(), i.InputRegister(0), i.InputRegister(1), 2077d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org i.InputRegister(2)); 208e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK_EQ(LeaveCC, i.OutputSBit()); 2097d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 2107d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 2117d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kArmSdiv: { 2127d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org CpuFeatureScope scope(masm(), SUDIV); 2137d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ sdiv(i.OutputRegister(), i.InputRegister(0), i.InputRegister(1)); 214e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK_EQ(LeaveCC, i.OutputSBit()); 2157d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 2167d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 2177d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kArmUdiv: { 2187d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org CpuFeatureScope scope(masm(), SUDIV); 2197d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ udiv(i.OutputRegister(), i.InputRegister(0), i.InputRegister(1)); 220e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK_EQ(LeaveCC, i.OutputSBit()); 2217d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 2227d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 2237d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kArmMov: 2245e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org __ Move(i.OutputRegister(), i.InputOperand2(0), i.OutputSBit()); 2257d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 2267d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kArmMvn: 2277d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ mvn(i.OutputRegister(), i.InputOperand2(0), i.OutputSBit()); 2287d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 2297d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kArmOrr: 2307d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ orr(i.OutputRegister(), i.InputRegister(0), i.InputOperand2(1), 2317d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org i.OutputSBit()); 2327d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 2337d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kArmEor: 2347d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ eor(i.OutputRegister(), i.InputRegister(0), i.InputOperand2(1), 2357d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org i.OutputSBit()); 2367d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 2377d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kArmSub: 2387d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ sub(i.OutputRegister(), i.InputRegister(0), i.InputOperand2(1), 2397d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org i.OutputSBit()); 2407d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 2417d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kArmRsb: 2427d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ rsb(i.OutputRegister(), i.InputRegister(0), i.InputOperand2(1), 2437d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org i.OutputSBit()); 2447d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 2457d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kArmBfc: { 2467d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org CpuFeatureScope scope(masm(), ARMv7); 2477d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ bfc(i.OutputRegister(), i.InputInt8(1), i.InputInt8(2)); 248e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK_EQ(LeaveCC, i.OutputSBit()); 2497d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 2507d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 2517d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kArmUbfx: { 2527d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org CpuFeatureScope scope(masm(), ARMv7); 2537d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ ubfx(i.OutputRegister(), i.InputRegister(0), i.InputInt8(1), 2547d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org i.InputInt8(2)); 255e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK_EQ(LeaveCC, i.OutputSBit()); 2567d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 2577d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 2587d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kArmCmp: 2597d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ cmp(i.InputRegister(0), i.InputOperand2(1)); 260e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK_EQ(SetCC, i.OutputSBit()); 2617d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 2627d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kArmCmn: 2637d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ cmn(i.InputRegister(0), i.InputOperand2(1)); 264e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK_EQ(SetCC, i.OutputSBit()); 2657d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 2667d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kArmTst: 2677d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ tst(i.InputRegister(0), i.InputOperand2(1)); 268e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK_EQ(SetCC, i.OutputSBit()); 2697d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 2707d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kArmTeq: 2717d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ teq(i.InputRegister(0), i.InputOperand2(1)); 272e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK_EQ(SetCC, i.OutputSBit()); 2737d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 2747d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kArmVcmpF64: 2757d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ VFPCompareAndSetFlags(i.InputDoubleRegister(0), 2767d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org i.InputDoubleRegister(1)); 277e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK_EQ(SetCC, i.OutputSBit()); 2787d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 2797d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kArmVaddF64: 2807d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ vadd(i.OutputDoubleRegister(), i.InputDoubleRegister(0), 2817d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org i.InputDoubleRegister(1)); 282e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK_EQ(LeaveCC, i.OutputSBit()); 2837d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 2847d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kArmVsubF64: 2857d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ vsub(i.OutputDoubleRegister(), i.InputDoubleRegister(0), 2867d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org i.InputDoubleRegister(1)); 287e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK_EQ(LeaveCC, i.OutputSBit()); 2887d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 2897d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kArmVmulF64: 2907d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ vmul(i.OutputDoubleRegister(), i.InputDoubleRegister(0), 2917d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org i.InputDoubleRegister(1)); 292e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK_EQ(LeaveCC, i.OutputSBit()); 2937d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 2947d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kArmVmlaF64: 2957d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ vmla(i.OutputDoubleRegister(), i.InputDoubleRegister(1), 2967d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org i.InputDoubleRegister(2)); 297e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK_EQ(LeaveCC, i.OutputSBit()); 2987d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 2997d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kArmVmlsF64: 3007d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ vmls(i.OutputDoubleRegister(), i.InputDoubleRegister(1), 3017d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org i.InputDoubleRegister(2)); 302e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK_EQ(LeaveCC, i.OutputSBit()); 3037d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 3047d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kArmVdivF64: 3057d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ vdiv(i.OutputDoubleRegister(), i.InputDoubleRegister(0), 3067d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org i.InputDoubleRegister(1)); 307e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK_EQ(LeaveCC, i.OutputSBit()); 3087d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 3097d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kArmVmodF64: { 3107d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // TODO(bmeurer): We should really get rid of this special instruction, 3117d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // and generate a CallAddress instruction instead. 3127d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org FrameScope scope(masm(), StackFrame::MANUAL); 3137d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ PrepareCallCFunction(0, 2, kScratchReg); 3147d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ MovToFloatParameters(i.InputDoubleRegister(0), 3157d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org i.InputDoubleRegister(1)); 3167d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ CallCFunction(ExternalReference::mod_two_doubles_operation(isolate()), 3177d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 0, 2); 3187d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // Move the result in the double result register. 3197d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ MovFromFloatResult(i.OutputDoubleRegister()); 320e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK_EQ(LeaveCC, i.OutputSBit()); 3217d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 3227d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 3237d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kArmVnegF64: 3247d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ vneg(i.OutputDoubleRegister(), i.InputDoubleRegister(0)); 3257d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 326b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org case kArmVsqrtF64: 327b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org __ vsqrt(i.OutputDoubleRegister(), i.InputDoubleRegister(0)); 328b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org break; 3297d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kArmVcvtF64S32: { 3307d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org SwVfpRegister scratch = kScratchDoubleReg.low(); 3317d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ vmov(scratch, i.InputRegister(0)); 3327d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ vcvt_f64_s32(i.OutputDoubleRegister(), scratch); 333e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK_EQ(LeaveCC, i.OutputSBit()); 3347d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 3357d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 3367d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kArmVcvtF64U32: { 3377d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org SwVfpRegister scratch = kScratchDoubleReg.low(); 3387d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ vmov(scratch, i.InputRegister(0)); 3397d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ vcvt_f64_u32(i.OutputDoubleRegister(), scratch); 340e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK_EQ(LeaveCC, i.OutputSBit()); 3417d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 3427d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 3437d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kArmVcvtS32F64: { 3447d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org SwVfpRegister scratch = kScratchDoubleReg.low(); 3457d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ vcvt_s32_f64(scratch, i.InputDoubleRegister(0)); 3467d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ vmov(i.OutputRegister(), scratch); 347e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK_EQ(LeaveCC, i.OutputSBit()); 3487d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 3497d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 3507d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kArmVcvtU32F64: { 3517d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org SwVfpRegister scratch = kScratchDoubleReg.low(); 3527d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ vcvt_u32_f64(scratch, i.InputDoubleRegister(0)); 3537d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ vmov(i.OutputRegister(), scratch); 354e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK_EQ(LeaveCC, i.OutputSBit()); 3557d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 3567d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 3576474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org case kArmLdrb: 3587d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ ldrb(i.OutputRegister(), i.InputOffset()); 359e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK_EQ(LeaveCC, i.OutputSBit()); 3607d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 3616474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org case kArmLdrsb: 3626474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org __ ldrsb(i.OutputRegister(), i.InputOffset()); 3636474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org DCHECK_EQ(LeaveCC, i.OutputSBit()); 3646474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org break; 3656474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org case kArmStrb: { 3667d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org int index = 0; 3677d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org MemOperand operand = i.InputOffset(&index); 3687d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ strb(i.InputRegister(index), operand); 369e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK_EQ(LeaveCC, i.OutputSBit()); 3707d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 3717d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 3726474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org case kArmLdrh: 3737d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ ldrh(i.OutputRegister(), i.InputOffset()); 3747d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 3756474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org case kArmLdrsh: 3766474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org __ ldrsh(i.OutputRegister(), i.InputOffset()); 3776474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org break; 3786474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org case kArmStrh: { 3797d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org int index = 0; 3807d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org MemOperand operand = i.InputOffset(&index); 3817d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ strh(i.InputRegister(index), operand); 382e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK_EQ(LeaveCC, i.OutputSBit()); 3837d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 3847d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 3856474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org case kArmLdr: 3867d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ ldr(i.OutputRegister(), i.InputOffset()); 3877d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 3886474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org case kArmStr: { 3897d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org int index = 0; 3907d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org MemOperand operand = i.InputOffset(&index); 3917d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ str(i.InputRegister(index), operand); 392e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK_EQ(LeaveCC, i.OutputSBit()); 3937d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 3947d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 395fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org case kArmVldr32: { 396fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org SwVfpRegister scratch = kScratchDoubleReg.low(); 397fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org __ vldr(scratch, i.InputOffset()); 398fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org __ vcvt_f64_f32(i.OutputDoubleRegister(), scratch); 399fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org DCHECK_EQ(LeaveCC, i.OutputSBit()); 400fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org break; 401fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org } 402fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org case kArmVstr32: { 403fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org int index = 0; 404fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org SwVfpRegister scratch = kScratchDoubleReg.low(); 405fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org MemOperand operand = i.InputOffset(&index); 406fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org __ vcvt_f32_f64(scratch, i.InputDoubleRegister(index)); 407fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org __ vstr(scratch, operand); 408fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org DCHECK_EQ(LeaveCC, i.OutputSBit()); 409fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org break; 410fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org } 4116474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org case kArmVldr64: 4127d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ vldr(i.OutputDoubleRegister(), i.InputOffset()); 413e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK_EQ(LeaveCC, i.OutputSBit()); 4147d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 4156474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org case kArmVstr64: { 4167d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org int index = 0; 4177d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org MemOperand operand = i.InputOffset(&index); 4187d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ vstr(i.InputDoubleRegister(index), operand); 419e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK_EQ(LeaveCC, i.OutputSBit()); 4207d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 4217d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 4227b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org case kArmPush: 4237b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org __ Push(i.InputRegister(0)); 4247b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org DCHECK_EQ(LeaveCC, i.OutputSBit()); 4257b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org break; 4267d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kArmStoreWriteBarrier: { 4277d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Register object = i.InputRegister(0); 4287d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Register index = i.InputRegister(1); 4297d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Register value = i.InputRegister(2); 4307d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ add(index, object, index); 4317d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ str(value, MemOperand(index)); 4327d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org SaveFPRegsMode mode = 4337d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org frame()->DidAllocateDoubleRegisters() ? kSaveFPRegs : kDontSaveFPRegs; 4347d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org LinkRegisterStatus lr_status = kLRHasNotBeenSaved; 4357d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ RecordWrite(object, index, value, lr_status, mode); 436e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK_EQ(LeaveCC, i.OutputSBit()); 4377d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 4387d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 4397d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 4407d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org} 4417d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 4427d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 4437d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org// Assembles branches after an instruction. 4447d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgvoid CodeGenerator::AssembleArchBranch(Instruction* instr, 4457d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org FlagsCondition condition) { 4467d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org ArmOperandConverter i(this, instr); 4477d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Label done; 4487d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 4497d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // Emit a branch. The true and false targets are always the last two inputs 4507d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // to the instruction. 4517d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org BasicBlock* tblock = i.InputBlock(instr->InputCount() - 2); 4527d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org BasicBlock* fblock = i.InputBlock(instr->InputCount() - 1); 4537d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org bool fallthru = IsNextInAssemblyOrder(fblock); 4547d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Label* tlabel = code()->GetLabel(tblock); 4557d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Label* flabel = fallthru ? &done : code()->GetLabel(fblock); 4567d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org switch (condition) { 4577d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kUnorderedEqual: 4587d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ b(vs, flabel); 4597d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // Fall through. 4607d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kEqual: 4617d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ b(eq, tlabel); 4627d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 4637d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kUnorderedNotEqual: 4647d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ b(vs, tlabel); 4657d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // Fall through. 4667d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kNotEqual: 4677d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ b(ne, tlabel); 4687d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 4697d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kSignedLessThan: 4707d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ b(lt, tlabel); 4717d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 4727d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kSignedGreaterThanOrEqual: 4737d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ b(ge, tlabel); 4747d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 4757d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kSignedLessThanOrEqual: 4767d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ b(le, tlabel); 4777d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 4787d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kSignedGreaterThan: 4797d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ b(gt, tlabel); 4807d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 4817d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kUnorderedLessThan: 4827d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ b(vs, flabel); 4837d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // Fall through. 4847d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kUnsignedLessThan: 4857d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ b(lo, tlabel); 4867d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 4877d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kUnorderedGreaterThanOrEqual: 4887d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ b(vs, tlabel); 4897d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // Fall through. 4907d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kUnsignedGreaterThanOrEqual: 4917d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ b(hs, tlabel); 4927d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 4937d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kUnorderedLessThanOrEqual: 4947d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ b(vs, flabel); 4957d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // Fall through. 4967d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kUnsignedLessThanOrEqual: 4977d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ b(ls, tlabel); 4987d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 4997d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kUnorderedGreaterThan: 5007d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ b(vs, tlabel); 5017d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // Fall through. 5027d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kUnsignedGreaterThan: 5037d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ b(hi, tlabel); 5047d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 505aca8beeda619beb0f9758b04d1eaebdea5538a44machenbach@chromium.org case kOverflow: 506aca8beeda619beb0f9758b04d1eaebdea5538a44machenbach@chromium.org __ b(vs, tlabel); 507aca8beeda619beb0f9758b04d1eaebdea5538a44machenbach@chromium.org break; 508aca8beeda619beb0f9758b04d1eaebdea5538a44machenbach@chromium.org case kNotOverflow: 509aca8beeda619beb0f9758b04d1eaebdea5538a44machenbach@chromium.org __ b(vc, tlabel); 510aca8beeda619beb0f9758b04d1eaebdea5538a44machenbach@chromium.org break; 5117d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 5127d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org if (!fallthru) __ b(flabel); // no fallthru to flabel. 5137d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ bind(&done); 5147d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org} 5157d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 5167d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 5177d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org// Assembles boolean materializations after an instruction. 5187d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgvoid CodeGenerator::AssembleArchBoolean(Instruction* instr, 5197d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org FlagsCondition condition) { 5207d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org ArmOperandConverter i(this, instr); 5217d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Label done; 5227d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 523aca8beeda619beb0f9758b04d1eaebdea5538a44machenbach@chromium.org // Materialize a full 32-bit 1 or 0 value. The result register is always the 524aca8beeda619beb0f9758b04d1eaebdea5538a44machenbach@chromium.org // last output of the instruction. 5257d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Label check; 526e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK_NE(0, instr->OutputCount()); 527aca8beeda619beb0f9758b04d1eaebdea5538a44machenbach@chromium.org Register reg = i.OutputRegister(instr->OutputCount() - 1); 5287d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Condition cc = kNoCondition; 5297d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org switch (condition) { 5307d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kUnorderedEqual: 5317d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ b(vc, &check); 5327d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ mov(reg, Operand(0)); 5337d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ b(&done); 5347d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // Fall through. 5357d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kEqual: 5367d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org cc = eq; 5377d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 5387d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kUnorderedNotEqual: 5397d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ b(vc, &check); 5407d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ mov(reg, Operand(1)); 5417d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ b(&done); 5427d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // Fall through. 5437d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kNotEqual: 5447d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org cc = ne; 5457d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 5467d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kSignedLessThan: 5477d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org cc = lt; 5487d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 5497d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kSignedGreaterThanOrEqual: 5507d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org cc = ge; 5517d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 5527d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kSignedLessThanOrEqual: 5537d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org cc = le; 5547d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 5557d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kSignedGreaterThan: 5567d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org cc = gt; 5577d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 5587d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kUnorderedLessThan: 5597d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ b(vc, &check); 5607d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ mov(reg, Operand(0)); 5617d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ b(&done); 5627d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // Fall through. 5637d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kUnsignedLessThan: 5647d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org cc = lo; 5657d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 5667d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kUnorderedGreaterThanOrEqual: 5677d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ b(vc, &check); 5687d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ mov(reg, Operand(1)); 5697d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ b(&done); 5707d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // Fall through. 5717d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kUnsignedGreaterThanOrEqual: 5727d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org cc = hs; 5737d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 5747d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kUnorderedLessThanOrEqual: 5757d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ b(vc, &check); 5767d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ mov(reg, Operand(0)); 5777d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ b(&done); 5787d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // Fall through. 5797d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kUnsignedLessThanOrEqual: 5807d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org cc = ls; 5817d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 5827d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kUnorderedGreaterThan: 5837d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ b(vc, &check); 5847d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ mov(reg, Operand(1)); 5857d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ b(&done); 5867d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // Fall through. 5877d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case kUnsignedGreaterThan: 5887d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org cc = hi; 5897d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 590aca8beeda619beb0f9758b04d1eaebdea5538a44machenbach@chromium.org case kOverflow: 591aca8beeda619beb0f9758b04d1eaebdea5538a44machenbach@chromium.org cc = vs; 592aca8beeda619beb0f9758b04d1eaebdea5538a44machenbach@chromium.org break; 593aca8beeda619beb0f9758b04d1eaebdea5538a44machenbach@chromium.org case kNotOverflow: 594aca8beeda619beb0f9758b04d1eaebdea5538a44machenbach@chromium.org cc = vc; 595aca8beeda619beb0f9758b04d1eaebdea5538a44machenbach@chromium.org break; 5967d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 5977d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ bind(&check); 5987d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ mov(reg, Operand(0)); 5997d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ mov(reg, Operand(1), LeaveCC, cc); 6007d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ bind(&done); 6017d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org} 6027d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 6037d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 604ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgvoid CodeGenerator::AssembleDeoptimizerCall(int deoptimization_id) { 605ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org Address deopt_entry = Deoptimizer::GetDeoptimizationEntry( 606ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org isolate(), deoptimization_id, Deoptimizer::LAZY); 607ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org __ Call(deopt_entry, RelocInfo::RUNTIME_ENTRY); 608ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org} 609ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org 610ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org 6117d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgvoid CodeGenerator::AssemblePrologue() { 6127d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org CallDescriptor* descriptor = linkage()->GetIncomingDescriptor(); 6137d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org if (descriptor->kind() == CallDescriptor::kCallAddress) { 614b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org bool saved_pp; 6152c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org if (FLAG_enable_ool_constant_pool) { 6162c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org __ Push(lr, fp, pp); 6172c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org // Adjust FP to point to saved FP. 6182c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org __ sub(fp, sp, Operand(StandardFrameConstants::kConstantPoolOffset)); 619b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org saved_pp = true; 6202c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org } else { 6212c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org __ Push(lr, fp); 6222c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org __ mov(fp, sp); 623b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org saved_pp = false; 6242c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org } 6257d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org const RegList saves = descriptor->CalleeSavedRegisters(); 626b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org if (saves != 0 || saved_pp) { 627b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org // Save callee-saved registers. 628b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org int register_save_area_size = saved_pp ? kPointerSize : 0; 6297d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org for (int i = Register::kNumRegisters - 1; i >= 0; i--) { 6307d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org if (!((1 << i) & saves)) continue; 6317d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org register_save_area_size += kPointerSize; 6327d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 6337d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org frame()->SetRegisterSaveAreaSize(register_save_area_size); 6347d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ stm(db_w, sp, saves); 6357d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 6367d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } else if (descriptor->IsJSFunctionCall()) { 6377d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org CompilationInfo* info = linkage()->info(); 6387d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ Prologue(info->IsCodePreAgingActive()); 6397d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org frame()->SetRegisterSaveAreaSize( 6407d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org StandardFrameConstants::kFixedFrameSizeFromFp); 6417d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 6427d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // Sloppy mode functions and builtins need to replace the receiver with the 6437d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // global proxy when called as functions (without an explicit receiver 6447d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // object). 6457d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // TODO(mstarzinger/verwaest): Should this be moved back into the CallIC? 6467d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org if (info->strict_mode() == SLOPPY && !info->is_native()) { 6477d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Label ok; 6487d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // +2 for return address and saved frame pointer. 6497d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org int receiver_slot = info->scope()->num_parameters() + 2; 6507d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ ldr(r2, MemOperand(fp, receiver_slot * kPointerSize)); 6517d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ CompareRoot(r2, Heap::kUndefinedValueRootIndex); 6527d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ b(ne, &ok); 6537d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ ldr(r2, GlobalObjectOperand()); 6547d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ ldr(r2, FieldMemOperand(r2, GlobalObject::kGlobalProxyOffset)); 6557d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ str(r2, MemOperand(fp, receiver_slot * kPointerSize)); 6567d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ bind(&ok); 6577d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 6587d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 6597d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } else { 6607d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ StubPrologue(); 6617d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org frame()->SetRegisterSaveAreaSize( 6627d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org StandardFrameConstants::kFixedFrameSizeFromFp); 6637d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 6647d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org int stack_slots = frame()->GetSpillSlotCount(); 6657d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org if (stack_slots > 0) { 6667d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ sub(sp, sp, Operand(stack_slots * kPointerSize)); 6677d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 6687d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org} 6697d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 6707d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 6717d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgvoid CodeGenerator::AssembleReturn() { 6727d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org CallDescriptor* descriptor = linkage()->GetIncomingDescriptor(); 6737d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org if (descriptor->kind() == CallDescriptor::kCallAddress) { 6747d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org if (frame()->GetRegisterSaveAreaSize() > 0) { 6757d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // Remove this frame's spill slots first. 6767d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org int stack_slots = frame()->GetSpillSlotCount(); 6777d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org if (stack_slots > 0) { 6787d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ add(sp, sp, Operand(stack_slots * kPointerSize)); 6797d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 6807d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // Restore registers. 6817d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org const RegList saves = descriptor->CalleeSavedRegisters(); 6827d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org if (saves != 0) { 6837d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ ldm(ia_w, sp, saves); 6847d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 6857d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 6865e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org __ LeaveFrame(StackFrame::MANUAL); 6877d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ Ret(); 6887d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } else { 6895e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org __ LeaveFrame(StackFrame::MANUAL); 6909aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org int pop_count = descriptor->IsJSFunctionCall() 6919aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org ? static_cast<int>(descriptor->JSParameterCount()) 6929aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org : 0; 6937d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ Drop(pop_count); 6947d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ Ret(); 6957d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 6967d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org} 6977d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 6987d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 6997d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgvoid CodeGenerator::AssembleMove(InstructionOperand* source, 7007d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org InstructionOperand* destination) { 7017d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org ArmOperandConverter g(this, NULL); 7027d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // Dispatch on the source and destination operand kinds. Not all 7037d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // combinations are possible. 7047d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org if (source->IsRegister()) { 705e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(destination->IsRegister() || destination->IsStackSlot()); 7067d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Register src = g.ToRegister(source); 7077d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org if (destination->IsRegister()) { 7087d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ mov(g.ToRegister(destination), src); 7097d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } else { 7107d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ str(src, g.ToMemOperand(destination)); 7117d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 7127d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } else if (source->IsStackSlot()) { 713e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(destination->IsRegister() || destination->IsStackSlot()); 7147d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org MemOperand src = g.ToMemOperand(source); 7157d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org if (destination->IsRegister()) { 7167d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ ldr(g.ToRegister(destination), src); 7177d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } else { 7187d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Register temp = kScratchReg; 7197d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ ldr(temp, src); 7207d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ str(temp, g.ToMemOperand(destination)); 7217d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 7227d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } else if (source->IsConstant()) { 7237d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org if (destination->IsRegister() || destination->IsStackSlot()) { 7247d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Register dst = 7257d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org destination->IsRegister() ? g.ToRegister(destination) : kScratchReg; 7267d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Constant src = g.ToConstant(source); 7277d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org switch (src.type()) { 7287d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case Constant::kInt32: 7297d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ mov(dst, Operand(src.ToInt32())); 7307d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 7317d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case Constant::kInt64: 7327d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org UNREACHABLE(); 7337d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 7347d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case Constant::kFloat64: 7357d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ Move(dst, 7367d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org isolate()->factory()->NewNumber(src.ToFloat64(), TENURED)); 7377d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 7387d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case Constant::kExternalReference: 7397d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ mov(dst, Operand(src.ToExternalReference())); 7407d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 7417d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case Constant::kHeapObject: 7427d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ Move(dst, src.ToHeapObject()); 7437d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 7447d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 7457d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org if (destination->IsStackSlot()) __ str(dst, g.ToMemOperand(destination)); 7467d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } else if (destination->IsDoubleRegister()) { 7477d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org DwVfpRegister result = g.ToDoubleRegister(destination); 7487d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ vmov(result, g.ToDouble(source)); 7497d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } else { 750e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(destination->IsDoubleStackSlot()); 7517d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org DwVfpRegister temp = kScratchDoubleReg; 7527d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ vmov(temp, g.ToDouble(source)); 7537d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ vstr(temp, g.ToMemOperand(destination)); 7547d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 7557d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } else if (source->IsDoubleRegister()) { 7567d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org DwVfpRegister src = g.ToDoubleRegister(source); 7577d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org if (destination->IsDoubleRegister()) { 7587d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org DwVfpRegister dst = g.ToDoubleRegister(destination); 7597d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ Move(dst, src); 7607d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } else { 761e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(destination->IsDoubleStackSlot()); 7627d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ vstr(src, g.ToMemOperand(destination)); 7637d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 7647d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } else if (source->IsDoubleStackSlot()) { 765e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(destination->IsDoubleRegister() || destination->IsDoubleStackSlot()); 7667d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org MemOperand src = g.ToMemOperand(source); 7677d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org if (destination->IsDoubleRegister()) { 7687d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ vldr(g.ToDoubleRegister(destination), src); 7697d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } else { 7707d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org DwVfpRegister temp = kScratchDoubleReg; 7717d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ vldr(temp, src); 7727d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ vstr(temp, g.ToMemOperand(destination)); 7737d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 7747d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } else { 7757d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org UNREACHABLE(); 7767d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 7777d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org} 7787d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 7797d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 7807d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgvoid CodeGenerator::AssembleSwap(InstructionOperand* source, 7817d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org InstructionOperand* destination) { 7827d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org ArmOperandConverter g(this, NULL); 7837d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // Dispatch on the source and destination operand kinds. Not all 7847d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // combinations are possible. 7857d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org if (source->IsRegister()) { 7867d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // Register-register. 7877d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Register temp = kScratchReg; 7887d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Register src = g.ToRegister(source); 7897d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org if (destination->IsRegister()) { 7907d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Register dst = g.ToRegister(destination); 7917d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ Move(temp, src); 7927d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ Move(src, dst); 7937d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ Move(dst, temp); 7947d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } else { 795e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(destination->IsStackSlot()); 7967d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org MemOperand dst = g.ToMemOperand(destination); 7977d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ mov(temp, src); 7987d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ ldr(src, dst); 7997d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ str(temp, dst); 8007d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 8017d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } else if (source->IsStackSlot()) { 802e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(destination->IsStackSlot()); 8037d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Register temp_0 = kScratchReg; 8047d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org SwVfpRegister temp_1 = kScratchDoubleReg.low(); 8057d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org MemOperand src = g.ToMemOperand(source); 8067d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org MemOperand dst = g.ToMemOperand(destination); 8077d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ ldr(temp_0, src); 8087d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ vldr(temp_1, dst); 8097d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ str(temp_0, dst); 8107d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ vstr(temp_1, src); 8117d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } else if (source->IsDoubleRegister()) { 8127d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org DwVfpRegister temp = kScratchDoubleReg; 8137d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org DwVfpRegister src = g.ToDoubleRegister(source); 8147d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org if (destination->IsDoubleRegister()) { 8157d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org DwVfpRegister dst = g.ToDoubleRegister(destination); 8167d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ Move(temp, src); 8177d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ Move(src, dst); 818b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org __ Move(dst, temp); 8197d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } else { 820e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(destination->IsDoubleStackSlot()); 8217d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org MemOperand dst = g.ToMemOperand(destination); 8227d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ Move(temp, src); 8237d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ vldr(src, dst); 8247d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ vstr(temp, dst); 8257d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 8267d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } else if (source->IsDoubleStackSlot()) { 827e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(destination->IsDoubleStackSlot()); 8287d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Register temp_0 = kScratchReg; 8297d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org DwVfpRegister temp_1 = kScratchDoubleReg; 8307d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org MemOperand src0 = g.ToMemOperand(source); 8317d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org MemOperand src1(src0.rn(), src0.offset() + kPointerSize); 8327d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org MemOperand dst0 = g.ToMemOperand(destination); 8337d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org MemOperand dst1(dst0.rn(), dst0.offset() + kPointerSize); 8347d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ vldr(temp_1, dst0); // Save destination in temp_1. 8357d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ ldr(temp_0, src0); // Then use temp_0 to copy source to destination. 8367d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ str(temp_0, dst0); 8377d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ ldr(temp_0, src1); 8387d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ str(temp_0, dst1); 8397d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org __ vstr(temp_1, src0); 8407d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } else { 8417d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // No other combinations are possible. 8427d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org UNREACHABLE(); 8437d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 8447d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org} 8457d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 8467d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 8477d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgvoid CodeGenerator::AddNopForSmiCodeInlining() { 8487d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // On 32-bit ARM we do not insert nops for inlined Smi code. 8497d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org} 8507d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 85106b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org 85206b2696801712948b665372a38f96b1f10be6997machenbach@chromium.orgvoid CodeGenerator::EnsureSpaceForLazyDeopt() { 85306b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org int space_needed = Deoptimizer::patch_size(); 85406b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org if (!linkage()->info()->IsStub()) { 85506b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org // Ensure that we have enough space after the previous lazy-bailout 85606b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org // instruction for patching the code here. 85706b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org int current_pc = masm()->pc_offset(); 85806b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org if (current_pc < last_lazy_deopt_pc_ + space_needed) { 85906b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org // Block literal pool emission for duration of padding. 86006b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org v8::internal::Assembler::BlockConstPoolScope block_const_pool(masm()); 86106b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org int padding_size = last_lazy_deopt_pc_ + space_needed - current_pc; 86206b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org DCHECK_EQ(0, padding_size % v8::internal::Assembler::kInstrSize); 86306b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org while (padding_size > 0) { 86406b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org __ nop(); 86506b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org padding_size -= v8::internal::Assembler::kInstrSize; 86606b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org } 86706b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org } 86806b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org } 86906b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org MarkLazyDeoptSite(); 87006b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org} 87106b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org 8727d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#undef __ 873d4f11c0cf476dd854eaebec1cbacb1afc7bea18emachenbach@chromium.org 874d4f11c0cf476dd854eaebec1cbacb1afc7bea18emachenbach@chromium.org} // namespace compiler 875d4f11c0cf476dd854eaebec1cbacb1afc7bea18emachenbach@chromium.org} // namespace internal 876d4f11c0cf476dd854eaebec1cbacb1afc7bea18emachenbach@chromium.org} // namespace v8 877