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