18f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian/* 28f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * Copyright (C) 2008 Apple Inc. All rights reserved. 38f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * 48f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * Redistribution and use in source and binary forms, with or without 58f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * modification, are permitted provided that the following conditions 68f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * are met: 78f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * 1. Redistributions of source code must retain the above copyright 88f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * notice, this list of conditions and the following disclaimer. 98f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * 2. Redistributions in binary form must reproduce the above copyright 108f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * notice, this list of conditions and the following disclaimer in the 118f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * documentation and/or other materials provided with the distribution. 128f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * 138f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY 148f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 158f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 168f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR 178f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 188f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 198f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 208f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 218f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 228f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 238f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 248f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian */ 258f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 268f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#ifndef MacroAssemblerX86_64_h 278f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#define MacroAssemblerX86_64_h 288f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 29d0825bca7fe65beaee391d30da42e937db621564Steve Block#if ENABLE(ASSEMBLER) && CPU(X86_64) 308f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 318f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#include "MacroAssemblerX86Common.h" 328f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 330bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#define REPTACH_OFFSET_CALL_R11 3 340bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 358f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qiannamespace JSC { 368f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 378f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianclass MacroAssemblerX86_64 : public MacroAssemblerX86Common { 388f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianprotected: 39231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block static const X86Registers::RegisterID scratchRegister = X86Registers::r11; 408f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 418f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianpublic: 428f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian static const Scale ScalePtr = TimesEight; 438f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 448f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian using MacroAssemblerX86Common::add32; 455f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian using MacroAssemblerX86Common::and32; 465f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian using MacroAssemblerX86Common::or32; 478f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian using MacroAssemblerX86Common::sub32; 488f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian using MacroAssemblerX86Common::load32; 498f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian using MacroAssemblerX86Common::store32; 508f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian using MacroAssemblerX86Common::call; 512bde8e466a4451c7319e3a072d118917957d6554Steve Block using MacroAssemblerX86Common::addDouble; 520bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch using MacroAssemblerX86Common::loadDouble; 530bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch using MacroAssemblerX86Common::convertInt32ToDouble; 548f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 552bde8e466a4451c7319e3a072d118917957d6554Steve Block void add32(TrustedImm32 imm, AbsoluteAddress address) 568f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian { 572bde8e466a4451c7319e3a072d118917957d6554Steve Block move(TrustedImmPtr(address.m_ptr), scratchRegister); 588f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian add32(imm, Address(scratchRegister)); 598f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } 608f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 612bde8e466a4451c7319e3a072d118917957d6554Steve Block void and32(TrustedImm32 imm, AbsoluteAddress address) 625f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian { 632bde8e466a4451c7319e3a072d118917957d6554Steve Block move(TrustedImmPtr(address.m_ptr), scratchRegister); 645f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian and32(imm, Address(scratchRegister)); 655f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian } 665f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 672bde8e466a4451c7319e3a072d118917957d6554Steve Block void or32(TrustedImm32 imm, AbsoluteAddress address) 685f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian { 692bde8e466a4451c7319e3a072d118917957d6554Steve Block move(TrustedImmPtr(address.m_ptr), scratchRegister); 705f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian or32(imm, Address(scratchRegister)); 715f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian } 725f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 732bde8e466a4451c7319e3a072d118917957d6554Steve Block void sub32(TrustedImm32 imm, AbsoluteAddress address) 748f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian { 752bde8e466a4451c7319e3a072d118917957d6554Steve Block move(TrustedImmPtr(address.m_ptr), scratchRegister); 768f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian sub32(imm, Address(scratchRegister)); 778f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } 788f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 798f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian void load32(void* address, RegisterID dest) 808f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian { 81231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (dest == X86Registers::eax) 828f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian m_assembler.movl_mEAX(address); 838f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian else { 84231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block move(X86Registers::eax, dest); 858f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian m_assembler.movl_mEAX(address); 86231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block swap(X86Registers::eax, dest); 878f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } 888f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } 898f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 9021939df44de1705786c545cd1bf519d47250322dBen Murdoch void loadDouble(const void* address, FPRegisterID dest) 910bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch { 922bde8e466a4451c7319e3a072d118917957d6554Steve Block move(TrustedImmPtr(address), scratchRegister); 930bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch loadDouble(scratchRegister, dest); 940bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch } 950bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 962bde8e466a4451c7319e3a072d118917957d6554Steve Block void addDouble(AbsoluteAddress address, FPRegisterID dest) 970bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch { 982bde8e466a4451c7319e3a072d118917957d6554Steve Block move(TrustedImmPtr(address.m_ptr), scratchRegister); 992bde8e466a4451c7319e3a072d118917957d6554Steve Block m_assembler.addsd_mr(0, scratchRegister, dest); 1002bde8e466a4451c7319e3a072d118917957d6554Steve Block } 1012bde8e466a4451c7319e3a072d118917957d6554Steve Block 1022bde8e466a4451c7319e3a072d118917957d6554Steve Block void convertInt32ToDouble(TrustedImm32 imm, FPRegisterID dest) 1032bde8e466a4451c7319e3a072d118917957d6554Steve Block { 1042bde8e466a4451c7319e3a072d118917957d6554Steve Block move(imm, scratchRegister); 1050bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch m_assembler.cvtsi2sd_rr(scratchRegister, dest); 1060bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch } 1070bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 1082bde8e466a4451c7319e3a072d118917957d6554Steve Block void store32(TrustedImm32 imm, void* address) 1098f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian { 110231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block move(X86Registers::eax, scratchRegister); 111231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block move(imm, X86Registers::eax); 1128f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian m_assembler.movl_EAXm(address); 113231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block move(scratchRegister, X86Registers::eax); 1148f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } 1158f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 1168f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian Call call() 1178f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian { 1182bde8e466a4451c7319e3a072d118917957d6554Steve Block DataLabelPtr label = moveWithPatch(TrustedImmPtr(0), scratchRegister); 1198f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian Call result = Call(m_assembler.call(scratchRegister), Call::Linkable); 1208f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian ASSERT(differenceBetween(label, result) == REPTACH_OFFSET_CALL_R11); 1218f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return result; 1228f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } 1238f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 1248f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian Call tailRecursiveCall() 1258f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian { 1262bde8e466a4451c7319e3a072d118917957d6554Steve Block DataLabelPtr label = moveWithPatch(TrustedImmPtr(0), scratchRegister); 1278f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian Jump newJump = Jump(m_assembler.jmp_r(scratchRegister)); 1288f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian ASSERT(differenceBetween(label, newJump) == REPTACH_OFFSET_CALL_R11); 1298f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return Call::fromTailJump(newJump); 1308f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } 1318f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 1328f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian Call makeTailRecursiveCall(Jump oldJump) 1338f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian { 1348f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian oldJump.link(this); 1352bde8e466a4451c7319e3a072d118917957d6554Steve Block DataLabelPtr label = moveWithPatch(TrustedImmPtr(0), scratchRegister); 1368f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian Jump newJump = Jump(m_assembler.jmp_r(scratchRegister)); 1378f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian ASSERT(differenceBetween(label, newJump) == REPTACH_OFFSET_CALL_R11); 1388f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return Call::fromTailJump(newJump); 1398f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } 1408f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 1418f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 1428f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian void addPtr(RegisterID src, RegisterID dest) 1438f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian { 1448f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian m_assembler.addq_rr(src, dest); 1458f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } 1468f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 1472bde8e466a4451c7319e3a072d118917957d6554Steve Block void addPtr(TrustedImm32 imm, RegisterID srcDest) 1488f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian { 1498f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian m_assembler.addq_ir(imm.m_value, srcDest); 1508f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } 1518f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 1522bde8e466a4451c7319e3a072d118917957d6554Steve Block void addPtr(TrustedImmPtr imm, RegisterID dest) 1538f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian { 1548f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian move(imm, scratchRegister); 1558f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian m_assembler.addq_rr(scratchRegister, dest); 1568f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } 1578f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 1582bde8e466a4451c7319e3a072d118917957d6554Steve Block void addPtr(TrustedImm32 imm, RegisterID src, RegisterID dest) 1598f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian { 1605f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian m_assembler.leaq_mr(imm.m_value, src, dest); 1618f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } 1628f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 1632bde8e466a4451c7319e3a072d118917957d6554Steve Block void addPtr(TrustedImm32 imm, Address address) 1645f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian { 1655f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian m_assembler.addq_im(imm.m_value, address.offset, address.base); 1665f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian } 1675f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 1682bde8e466a4451c7319e3a072d118917957d6554Steve Block void addPtr(TrustedImm32 imm, AbsoluteAddress address) 1695f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian { 1702bde8e466a4451c7319e3a072d118917957d6554Steve Block move(TrustedImmPtr(address.m_ptr), scratchRegister); 1715f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian addPtr(imm, Address(scratchRegister)); 1725f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian } 1735f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 1748f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian void andPtr(RegisterID src, RegisterID dest) 1758f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian { 1768f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian m_assembler.andq_rr(src, dest); 1778f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } 1788f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 1792bde8e466a4451c7319e3a072d118917957d6554Steve Block void andPtr(TrustedImm32 imm, RegisterID srcDest) 1808f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian { 1818f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian m_assembler.andq_ir(imm.m_value, srcDest); 1828f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } 1838f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 1848f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian void orPtr(RegisterID src, RegisterID dest) 1858f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian { 1868f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian m_assembler.orq_rr(src, dest); 1878f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } 1888f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 1892bde8e466a4451c7319e3a072d118917957d6554Steve Block void orPtr(TrustedImmPtr imm, RegisterID dest) 1908f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian { 1918f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian move(imm, scratchRegister); 1928f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian m_assembler.orq_rr(scratchRegister, dest); 1938f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } 1948f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 1952bde8e466a4451c7319e3a072d118917957d6554Steve Block void orPtr(TrustedImm32 imm, RegisterID dest) 1968f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian { 1978f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian m_assembler.orq_ir(imm.m_value, dest); 1988f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } 1998f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 2002daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch void orPtr(RegisterID op1, RegisterID op2, RegisterID dest) 2012daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch { 2022daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (op1 == op2) 2032daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch move(op1, dest); 2042daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch else if (op1 == dest) 2052daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch orPtr(op2, dest); 2062daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch else { 2072daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch move(op2, dest); 2082daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch orPtr(op1, dest); 2092daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 2102daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 2112daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 2122daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch void orPtr(TrustedImm32 imm, RegisterID src, RegisterID dest) 2132daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch { 2142daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch move(src, dest); 2152daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch orPtr(imm, dest); 2162daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 2172daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 2188f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian void subPtr(RegisterID src, RegisterID dest) 2198f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian { 2208f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian m_assembler.subq_rr(src, dest); 2218f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } 2228f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 2232bde8e466a4451c7319e3a072d118917957d6554Steve Block void subPtr(TrustedImm32 imm, RegisterID dest) 2248f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian { 2258f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian m_assembler.subq_ir(imm.m_value, dest); 2268f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } 2278f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 2282bde8e466a4451c7319e3a072d118917957d6554Steve Block void subPtr(TrustedImmPtr imm, RegisterID dest) 2298f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian { 2308f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian move(imm, scratchRegister); 2318f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian m_assembler.subq_rr(scratchRegister, dest); 2328f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } 2338f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 2348f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian void xorPtr(RegisterID src, RegisterID dest) 2358f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian { 2368f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian m_assembler.xorq_rr(src, dest); 2378f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } 2388f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 2392bde8e466a4451c7319e3a072d118917957d6554Steve Block void xorPtr(TrustedImm32 imm, RegisterID srcDest) 2408f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian { 2418f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian m_assembler.xorq_ir(imm.m_value, srcDest); 2428f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } 2438f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 2448f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 2458f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian void loadPtr(ImplicitAddress address, RegisterID dest) 2468f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian { 2478f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian m_assembler.movq_mr(address.offset, address.base, dest); 2488f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } 2498f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 2508f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian void loadPtr(BaseIndex address, RegisterID dest) 2518f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian { 2528f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian m_assembler.movq_mr(address.offset, address.base, address.index, address.scale, dest); 2538f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } 2548f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 2552bde8e466a4451c7319e3a072d118917957d6554Steve Block void loadPtr(const void* address, RegisterID dest) 2568f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian { 257231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (dest == X86Registers::eax) 2588f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian m_assembler.movq_mEAX(address); 2598f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian else { 260231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block move(X86Registers::eax, dest); 2618f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian m_assembler.movq_mEAX(address); 262231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block swap(X86Registers::eax, dest); 2638f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } 2648f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } 2658f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 2668f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian DataLabel32 loadPtrWithAddressOffsetPatch(Address address, RegisterID dest) 2678f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian { 2688f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian m_assembler.movq_mr_disp32(address.offset, address.base, dest); 2698f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return DataLabel32(this); 2708f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } 2718f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 2728f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian void storePtr(RegisterID src, ImplicitAddress address) 2738f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian { 2748f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian m_assembler.movq_rm(src, address.offset, address.base); 2758f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } 2768f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 2778f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian void storePtr(RegisterID src, BaseIndex address) 2788f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian { 2798f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian m_assembler.movq_rm(src, address.offset, address.base, address.index, address.scale); 2808f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } 2815f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 2825f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian void storePtr(RegisterID src, void* address) 2835f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian { 284231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (src == X86Registers::eax) 2855f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian m_assembler.movq_EAXm(address); 2865f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian else { 287231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block swap(X86Registers::eax, src); 2885f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian m_assembler.movq_EAXm(address); 289231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block swap(X86Registers::eax, src); 2905f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian } 2915f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian } 2928f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 2932bde8e466a4451c7319e3a072d118917957d6554Steve Block void storePtr(TrustedImmPtr imm, ImplicitAddress address) 2948f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian { 295231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block move(imm, scratchRegister); 296231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block storePtr(scratchRegister, address); 2978f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } 2988f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 2998f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian DataLabel32 storePtrWithAddressOffsetPatch(RegisterID src, Address address) 3008f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian { 3018f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian m_assembler.movq_rm_disp32(src, address.offset, address.base); 3028f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return DataLabel32(this); 3038f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } 3048f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 3055f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian void movePtrToDouble(RegisterID src, FPRegisterID dest) 3065f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian { 3075f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian m_assembler.movq_rr(src, dest); 3085f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian } 3095f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 3105f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian void moveDoubleToPtr(FPRegisterID src, RegisterID dest) 3115f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian { 3125f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian m_assembler.movq_rr(src, dest); 3135f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian } 3145f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 3152bde8e466a4451c7319e3a072d118917957d6554Steve Block void setPtr(Condition cond, RegisterID left, TrustedImm32 right, RegisterID dest) 3168f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian { 3178f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (((cond == Equal) || (cond == NotEqual)) && !right.m_value) 3188f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian m_assembler.testq_rr(left, left); 3198f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian else 3208f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian m_assembler.cmpq_ir(right.m_value, left); 3215f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian m_assembler.setCC_r(x86Condition(cond), dest); 3228f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian m_assembler.movzbl_rr(dest, dest); 3238f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } 3248f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 3258f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian Jump branchPtr(Condition cond, RegisterID left, RegisterID right) 3268f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian { 3278f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian m_assembler.cmpq_rr(right, left); 3285f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian return Jump(m_assembler.jCC(x86Condition(cond))); 3298f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } 3308f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 3312bde8e466a4451c7319e3a072d118917957d6554Steve Block Jump branchPtr(Condition cond, RegisterID left, TrustedImmPtr right) 3328f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian { 333231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block move(right, scratchRegister); 334231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block return branchPtr(cond, left, scratchRegister); 3358f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } 3368f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 3378f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian Jump branchPtr(Condition cond, RegisterID left, Address right) 3388f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian { 3398f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian m_assembler.cmpq_mr(right.offset, right.base, left); 3405f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian return Jump(m_assembler.jCC(x86Condition(cond))); 3418f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } 3428f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 3438f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian Jump branchPtr(Condition cond, AbsoluteAddress left, RegisterID right) 3448f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian { 3452bde8e466a4451c7319e3a072d118917957d6554Steve Block move(TrustedImmPtr(left.m_ptr), scratchRegister); 3468f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return branchPtr(cond, Address(scratchRegister), right); 3478f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } 3488f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 3498f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian Jump branchPtr(Condition cond, Address left, RegisterID right) 3508f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian { 3518f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian m_assembler.cmpq_rm(right, left.offset, left.base); 3525f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian return Jump(m_assembler.jCC(x86Condition(cond))); 3538f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } 3548f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 3552bde8e466a4451c7319e3a072d118917957d6554Steve Block Jump branchPtr(Condition cond, Address left, TrustedImmPtr right) 3568f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian { 3578f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian move(right, scratchRegister); 3588f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return branchPtr(cond, left, scratchRegister); 3598f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } 3608f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 3618f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian Jump branchTestPtr(Condition cond, RegisterID reg, RegisterID mask) 3628f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian { 3638f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian m_assembler.testq_rr(reg, mask); 3645f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian return Jump(m_assembler.jCC(x86Condition(cond))); 3658f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } 3668f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 3672bde8e466a4451c7319e3a072d118917957d6554Steve Block Jump branchTestPtr(Condition cond, RegisterID reg, TrustedImm32 mask = TrustedImm32(-1)) 3688f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian { 3698f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // if we are only interested in the low seven bits, this can be tested with a testb 3708f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (mask.m_value == -1) 3718f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian m_assembler.testq_rr(reg, reg); 3728f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian else if ((mask.m_value & ~0x7f) == 0) 3738f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian m_assembler.testb_i8r(mask.m_value, reg); 3748f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian else 3758f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian m_assembler.testq_i32r(mask.m_value, reg); 3765f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian return Jump(m_assembler.jCC(x86Condition(cond))); 3778f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } 3788f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 3792bde8e466a4451c7319e3a072d118917957d6554Steve Block Jump branchTestPtr(Condition cond, AbsoluteAddress address, TrustedImm32 mask = TrustedImm32(-1)) 3802bde8e466a4451c7319e3a072d118917957d6554Steve Block { 3812bde8e466a4451c7319e3a072d118917957d6554Steve Block loadPtr(address.m_ptr, scratchRegister); 3822bde8e466a4451c7319e3a072d118917957d6554Steve Block return branchTestPtr(cond, scratchRegister, mask); 3832bde8e466a4451c7319e3a072d118917957d6554Steve Block } 3842bde8e466a4451c7319e3a072d118917957d6554Steve Block 3852bde8e466a4451c7319e3a072d118917957d6554Steve Block Jump branchTestPtr(Condition cond, Address address, TrustedImm32 mask = TrustedImm32(-1)) 3868f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian { 3878f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (mask.m_value == -1) 3888f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian m_assembler.cmpq_im(0, address.offset, address.base); 3898f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian else 3908f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian m_assembler.testq_i32m(mask.m_value, address.offset, address.base); 3915f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian return Jump(m_assembler.jCC(x86Condition(cond))); 3928f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } 3938f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 3942bde8e466a4451c7319e3a072d118917957d6554Steve Block Jump branchTestPtr(Condition cond, BaseIndex address, TrustedImm32 mask = TrustedImm32(-1)) 3958f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian { 3968f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (mask.m_value == -1) 3978f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian m_assembler.cmpq_im(0, address.offset, address.base, address.index, address.scale); 3988f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian else 3998f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian m_assembler.testq_i32m(mask.m_value, address.offset, address.base, address.index, address.scale); 4005f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian return Jump(m_assembler.jCC(x86Condition(cond))); 4018f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } 4028f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 4038f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 4048f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian Jump branchAddPtr(Condition cond, RegisterID src, RegisterID dest) 4058f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian { 4068f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian ASSERT((cond == Overflow) || (cond == Zero) || (cond == NonZero)); 4078f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian addPtr(src, dest); 4085f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian return Jump(m_assembler.jCC(x86Condition(cond))); 4098f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } 4108f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 4112bde8e466a4451c7319e3a072d118917957d6554Steve Block Jump branchSubPtr(Condition cond, TrustedImm32 imm, RegisterID dest) 4128f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian { 4138f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian ASSERT((cond == Overflow) || (cond == Zero) || (cond == NonZero)); 4148f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian subPtr(imm, dest); 4155f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian return Jump(m_assembler.jCC(x86Condition(cond))); 4168f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } 4178f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 4182bde8e466a4451c7319e3a072d118917957d6554Steve Block DataLabelPtr moveWithPatch(TrustedImmPtr initialValue, RegisterID dest) 4198f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian { 4208f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian m_assembler.movq_i64r(initialValue.asIntptr(), dest); 4218f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return DataLabelPtr(this); 4228f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } 4238f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 4242bde8e466a4451c7319e3a072d118917957d6554Steve Block Jump branchPtrWithPatch(Condition cond, RegisterID left, DataLabelPtr& dataLabel, TrustedImmPtr initialRightValue = TrustedImmPtr(0)) 4258f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian { 4268f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian dataLabel = moveWithPatch(initialRightValue, scratchRegister); 4278f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return branchPtr(cond, left, scratchRegister); 4288f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } 4298f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 4302bde8e466a4451c7319e3a072d118917957d6554Steve Block Jump branchPtrWithPatch(Condition cond, Address left, DataLabelPtr& dataLabel, TrustedImmPtr initialRightValue = TrustedImmPtr(0)) 4318f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian { 4328f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian dataLabel = moveWithPatch(initialRightValue, scratchRegister); 4338f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return branchPtr(cond, left, scratchRegister); 4348f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } 4358f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 4362bde8e466a4451c7319e3a072d118917957d6554Steve Block DataLabelPtr storePtrWithPatch(TrustedImmPtr initialValue, ImplicitAddress address) 4378f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian { 4385f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian DataLabelPtr label = moveWithPatch(initialValue, scratchRegister); 4398f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian storePtr(scratchRegister, address); 4408f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return label; 4418f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } 4425f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 443dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block using MacroAssemblerX86Common::branchTest8; 4442bde8e466a4451c7319e3a072d118917957d6554Steve Block Jump branchTest8(Condition cond, ExtendedAddress address, TrustedImm32 mask = TrustedImm32(-1)) 445dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block { 4462bde8e466a4451c7319e3a072d118917957d6554Steve Block TrustedImmPtr addr(reinterpret_cast<void*>(address.offset)); 447dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block MacroAssemblerX86Common::move(addr, scratchRegister); 448dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return MacroAssemblerX86Common::branchTest8(cond, BaseIndex(scratchRegister, address.base, TimesOne), mask); 449dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } 450dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 4515f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian bool supportsFloatingPoint() const { return true; } 4525f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // See comment on MacroAssemblerARMv7::supportsFloatingPointTruncate() 4535f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian bool supportsFloatingPointTruncate() const { return true; } 45421939df44de1705786c545cd1bf519d47250322dBen Murdoch bool supportsFloatingPointSqrt() const { return true; } 4550bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 4560bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochprivate: 4570bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch friend class LinkBuffer; 4580bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch friend class RepatchBuffer; 4590bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 4600bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch static void linkCall(void* code, Call call, FunctionPtr function) 4610bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch { 4620bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (!call.isFlagSet(Call::Near)) 4630bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch X86Assembler::linkPointer(code, X86Assembler::labelFor(call.m_jmp, -REPTACH_OFFSET_CALL_R11), function.value()); 4640bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch else 4650bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch X86Assembler::linkCall(code, call.m_jmp, function.value()); 4660bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch } 4670bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 4680bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch static void repatchCall(CodeLocationCall call, CodeLocationLabel destination) 4690bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch { 4700bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch X86Assembler::repatchPointer(call.dataLabelPtrAtOffset(-REPTACH_OFFSET_CALL_R11).dataLocation(), destination.executableAddress()); 4710bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch } 4720bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 4730bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch static void repatchCall(CodeLocationCall call, FunctionPtr destination) 4740bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch { 4750bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch X86Assembler::repatchPointer(call.dataLabelPtrAtOffset(-REPTACH_OFFSET_CALL_R11).dataLocation(), destination.executableAddress()); 4760bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch } 4770bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 4788f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian}; 4798f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 4808f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian} // namespace JSC 4818f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 4828f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#endif // ENABLE(ASSEMBLER) 4838f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 4848f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#endif // MacroAssemblerX86_64_h 485