blob: b81c22bf83723830a7e38d8da3edc9283ee4d600 [file] [log] [blame]
barraclough@apple.coma36d9992009-02-05 03:40:39 +00001/*
mark.lam@apple.comd27553f2019-09-18 00:36:19 +00002 * Copyright (C) 2008-2019 Apple Inc. All rights reserved.
barraclough@apple.coma36d9992009-02-05 03:40:39 +00003 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
6 * are met:
7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 *
13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24 */
25
ryanhaddad@apple.com22104f52016-09-28 17:08:17 +000026#pragma once
barraclough@apple.coma36d9992009-02-05 03:40:39 +000027
mjs@apple.comcc668212010-01-04 11:38:56 +000028#if ENABLE(ASSEMBLER) && CPU(X86)
barraclough@apple.coma36d9992009-02-05 03:40:39 +000029
30#include "MacroAssemblerX86Common.h"
31
32namespace JSC {
33
34class MacroAssemblerX86 : public MacroAssemblerX86Common {
35public:
mark.lam@apple.comd27553f2019-09-18 00:36:19 +000036 static constexpr unsigned numGPRs = 8;
37 static constexpr unsigned numFPRs = 8;
fpizlo@apple.com1c128472016-07-18 19:51:45 +000038
mark.lam@apple.comd27553f2019-09-18 00:36:19 +000039 static constexpr Scale ScalePtr = TimesFour;
barraclough@apple.coma36d9992009-02-05 03:40:39 +000040
41 using MacroAssemblerX86Common::add32;
barraclough@apple.comc32f32e2009-05-13 09:10:02 +000042 using MacroAssemblerX86Common::and32;
fpizlo@apple.com594887a2011-09-06 09:23:55 +000043 using MacroAssemblerX86Common::branchAdd32;
barraclough@apple.com70558a32011-10-04 01:16:46 +000044 using MacroAssemblerX86Common::branchSub32;
barraclough@apple.coma36d9992009-02-05 03:40:39 +000045 using MacroAssemblerX86Common::sub32;
barraclough@apple.comc32f32e2009-05-13 09:10:02 +000046 using MacroAssemblerX86Common::or32;
barraclough@apple.coma36d9992009-02-05 03:40:39 +000047 using MacroAssemblerX86Common::load32;
fpizlo@apple.com33961712013-11-20 05:49:05 +000048 using MacroAssemblerX86Common::load8;
barraclough@apple.coma36d9992009-02-05 03:40:39 +000049 using MacroAssemblerX86Common::store32;
fpizlo@apple.com69e27842012-09-19 21:43:10 +000050 using MacroAssemblerX86Common::store8;
barraclough@apple.coma36d9992009-02-05 03:40:39 +000051 using MacroAssemblerX86Common::branch32;
barraclough@apple.comd7e13382009-02-19 22:51:40 +000052 using MacroAssemblerX86Common::call;
fpizlo@apple.com46211712011-11-10 01:08:50 +000053 using MacroAssemblerX86Common::jump;
ysuzuki@apple.com49871512019-08-14 20:15:04 +000054 using MacroAssemblerX86Common::farJump;
barraclough@apple.come1227fc2011-09-22 01:10:31 +000055 using MacroAssemblerX86Common::addDouble;
ggaren@apple.com540d71a62009-07-30 20:57:44 +000056 using MacroAssemblerX86Common::loadDouble;
barraclough@apple.comd910c0d2011-09-24 05:04:08 +000057 using MacroAssemblerX86Common::storeDouble;
ggaren@apple.com540d71a62009-07-30 20:57:44 +000058 using MacroAssemblerX86Common::convertInt32ToDouble;
fpizlo@apple.com09a6af02013-11-18 02:10:42 +000059 using MacroAssemblerX86Common::branch8;
fpizlo@apple.comb75911b2012-06-13 20:53:52 +000060 using MacroAssemblerX86Common::branchTest8;
barraclough@apple.coma36d9992009-02-05 03:40:39 +000061
oliver@apple.combe4e0672011-03-28 17:14:57 +000062 void add32(TrustedImm32 imm, RegisterID src, RegisterID dest)
barraclough@apple.coma36d9992009-02-05 03:40:39 +000063 {
nrotem@apple.coma47b30a2013-11-28 20:33:44 +000064 m_assembler.leal_mr(imm.m_value, src, dest);
barraclough@apple.coma36d9992009-02-05 03:40:39 +000065 }
66
oliver@apple.combe4e0672011-03-28 17:14:57 +000067 void add32(TrustedImm32 imm, AbsoluteAddress address)
barraclough@apple.coma36d9992009-02-05 03:40:39 +000068 {
nrotem@apple.coma47b30a2013-11-28 20:33:44 +000069 m_assembler.addl_im(imm.m_value, address.m_ptr);
barraclough@apple.coma36d9992009-02-05 03:40:39 +000070 }
71
fpizlo@apple.com327f2372012-07-15 04:02:16 +000072 void add32(AbsoluteAddress address, RegisterID dest)
73 {
74 m_assembler.addl_mr(address.m_ptr, dest);
75 }
76
barraclough@apple.com6d410b02011-11-10 20:24:06 +000077 void add64(TrustedImm32 imm, AbsoluteAddress address)
barraclough@apple.comc32f32e2009-05-13 09:10:02 +000078 {
barraclough@apple.com6d410b02011-11-10 20:24:06 +000079 m_assembler.addl_im(imm.m_value, address.m_ptr);
80 m_assembler.adcl_im(imm.m_value >> 31, reinterpret_cast<const char*>(address.m_ptr) + sizeof(int32_t));
barraclough@apple.comc32f32e2009-05-13 09:10:02 +000081 }
barraclough@apple.com6d410b02011-11-10 20:24:06 +000082
utatane.tea@gmail.com98d58902017-11-29 17:37:36 +000083 void getEffectiveAddress(BaseIndex address, RegisterID dest)
84 {
85 return x86Lea32(address, dest);
86 }
87
oliver@apple.combe4e0672011-03-28 17:14:57 +000088 void and32(TrustedImm32 imm, AbsoluteAddress address)
barraclough@apple.comc32f32e2009-05-13 09:10:02 +000089 {
90 m_assembler.andl_im(imm.m_value, address.m_ptr);
91 }
92
oliver@apple.combe4e0672011-03-28 17:14:57 +000093 void or32(TrustedImm32 imm, AbsoluteAddress address)
barraclough@apple.comc32f32e2009-05-13 09:10:02 +000094 {
nrotem@apple.coma47b30a2013-11-28 20:33:44 +000095 m_assembler.orl_im(imm.m_value, address.m_ptr);
barraclough@apple.comc32f32e2009-05-13 09:10:02 +000096 }
fpizlo@apple.com327f2372012-07-15 04:02:16 +000097
fpizlo@apple.comc7be5be02012-09-17 19:07:32 +000098 void or32(RegisterID reg, AbsoluteAddress address)
99 {
100 m_assembler.orl_rm(reg, address.m_ptr);
101 }
rmorisset@apple.com694598d2019-11-13 20:07:29 +0000102
103 void or16(TrustedImm32 imm, AbsoluteAddress address)
104 {
105 m_assembler.orw_im(imm.m_value, address.m_ptr);
106 }
fpizlo@apple.comc7be5be02012-09-17 19:07:32 +0000107
oliver@apple.combe4e0672011-03-28 17:14:57 +0000108 void sub32(TrustedImm32 imm, AbsoluteAddress address)
barraclough@apple.coma36d9992009-02-05 03:40:39 +0000109 {
110 m_assembler.subl_im(imm.m_value, address.m_ptr);
111 }
112
barraclough@apple.com8328f632011-09-21 18:33:43 +0000113 void load32(const void* address, RegisterID dest)
eric@webkit.org667fa8a2010-08-08 06:04:59 +0000114 {
eric@webkit.orgb8130982010-08-08 07:22:06 +0000115 m_assembler.movl_mr(address, dest);
eric@webkit.org667fa8a2010-08-08 06:04:59 +0000116 }
fpizlo@apple.com33961712013-11-20 05:49:05 +0000117
118 void load8(const void* address, RegisterID dest)
119 {
120 m_assembler.movzbl_mr(address, dest);
121 }
eric@webkit.org667fa8a2010-08-08 06:04:59 +0000122
fpizlo@apple.comfac5bed2014-05-14 03:57:18 +0000123 void abortWithReason(AbortReason reason)
124 {
125 move(TrustedImm32(reason), X86Registers::eax);
126 breakpoint();
127 }
128
fpizlo@apple.com407afe62014-06-13 18:56:58 +0000129 void abortWithReason(AbortReason reason, intptr_t misc)
130 {
131 move(TrustedImm32(misc), X86Registers::edx);
132 abortWithReason(reason);
133 }
134
fpizlo@apple.comd68b1f82012-07-05 22:55:51 +0000135 ConvertibleLoadLabel convertibleLoadPtr(Address address, RegisterID dest)
136 {
137 ConvertibleLoadLabel result = ConvertibleLoadLabel(this);
138 m_assembler.movl_mr(address.offset, address.base, dest);
139 return result;
140 }
141
barraclough@apple.come1227fc2011-09-22 01:10:31 +0000142 void addDouble(AbsoluteAddress address, FPRegisterID dest)
143 {
144 m_assembler.addsd_mr(address.m_ptr, dest);
145 }
146
commit-queue@webkit.org918d9852014-05-13 20:57:07 +0000147 void storeDouble(FPRegisterID src, TrustedImmPtr address)
barraclough@apple.comd910c0d2011-09-24 05:04:08 +0000148 {
commit-queue@webkit.org918d9852014-05-13 20:57:07 +0000149 ASSERT(address.m_value);
keith_miller@apple.com6c2ac2e2018-03-08 02:26:55 +0000150 m_assembler.movsd_rm(src, address.asPtr());
barraclough@apple.comd910c0d2011-09-24 05:04:08 +0000151 }
152
ggaren@apple.com540d71a62009-07-30 20:57:44 +0000153 void convertInt32ToDouble(AbsoluteAddress src, FPRegisterID dest)
154 {
155 m_assembler.cvtsi2sd_mr(src.m_ptr, dest);
156 }
157
oliver@apple.combe4e0672011-03-28 17:14:57 +0000158 void store32(TrustedImm32 imm, void* address)
barraclough@apple.coma36d9992009-02-05 03:40:39 +0000159 {
160 m_assembler.movl_i32m(imm.m_value, address);
161 }
162
mjs@apple.com93553702009-05-09 08:35:57 +0000163 void store32(RegisterID src, void* address)
164 {
eric@webkit.orgb8130982010-08-08 07:22:06 +0000165 m_assembler.movl_rm(src, address);
mjs@apple.com93553702009-05-09 08:35:57 +0000166 }
fpizlo@apple.com33961712013-11-20 05:49:05 +0000167
168 void store8(RegisterID src, void* address)
169 {
170 m_assembler.movb_rm(src, address);
171 }
mjs@apple.com93553702009-05-09 08:35:57 +0000172
fpizlo@apple.com69e27842012-09-19 21:43:10 +0000173 void store8(TrustedImm32 imm, void* address)
174 {
utatane.tea@gmail.com997ca6b2016-07-17 14:33:26 +0000175 TrustedImm32 imm8(static_cast<int8_t>(imm.m_value));
176 m_assembler.movb_i8m(imm8.m_value, address);
fpizlo@apple.com69e27842012-09-19 21:43:10 +0000177 }
fpizlo@apple.comc14c8d32012-10-10 02:14:42 +0000178
fpizlo@apple.comc14c8d32012-10-10 02:14:42 +0000179 void moveDoubleToInts(FPRegisterID src, RegisterID dest1, RegisterID dest2)
180 {
julien.brianceau@gmail.com22e42702014-09-12 22:00:13 +0000181 m_assembler.pextrw_irr(3, src, dest1);
182 m_assembler.pextrw_irr(2, src, dest2);
183 lshift32(TrustedImm32(16), dest1);
184 or32(dest1, dest2);
commit-queue@webkit.org67812aa2015-12-23 11:52:39 +0000185 moveFloatTo32(src, dest1);
fpizlo@apple.comc14c8d32012-10-10 02:14:42 +0000186 }
187
188 void moveIntsToDouble(RegisterID src1, RegisterID src2, FPRegisterID dest, FPRegisterID scratch)
189 {
commit-queue@webkit.org67812aa2015-12-23 11:52:39 +0000190 move32ToFloat(src1, dest);
191 move32ToFloat(src2, scratch);
fpizlo@apple.comc14c8d32012-10-10 02:14:42 +0000192 lshiftPacked(TrustedImm32(32), scratch);
193 orPacked(scratch, dest);
194 }
fpizlo@apple.com69e27842012-09-19 21:43:10 +0000195
barraclough@apple.com70558a32011-10-04 01:16:46 +0000196 Jump branchAdd32(ResultCondition cond, TrustedImm32 imm, AbsoluteAddress dest)
fpizlo@apple.com594887a2011-09-06 09:23:55 +0000197 {
barraclough@apple.com70558a32011-10-04 01:16:46 +0000198 m_assembler.addl_im(imm.m_value, dest.m_ptr);
199 return Jump(m_assembler.jCC(x86Condition(cond)));
200 }
201
202 Jump branchSub32(ResultCondition cond, TrustedImm32 imm, AbsoluteAddress dest)
203 {
204 m_assembler.subl_im(imm.m_value, dest.m_ptr);
fpizlo@apple.com594887a2011-09-06 09:23:55 +0000205 return Jump(m_assembler.jCC(x86Condition(cond)));
206 }
207
barraclough@apple.com03cd2482011-04-20 18:44:35 +0000208 Jump branch32(RelationalCondition cond, AbsoluteAddress left, RegisterID right)
barraclough@apple.coma36d9992009-02-05 03:40:39 +0000209 {
210 m_assembler.cmpl_rm(right, left.m_ptr);
barraclough@apple.com8f939c22009-05-15 21:11:10 +0000211 return Jump(m_assembler.jCC(x86Condition(cond)));
barraclough@apple.coma36d9992009-02-05 03:40:39 +0000212 }
213
barraclough@apple.com03cd2482011-04-20 18:44:35 +0000214 Jump branch32(RelationalCondition cond, AbsoluteAddress left, TrustedImm32 right)
barraclough@apple.coma36d9992009-02-05 03:40:39 +0000215 {
216 m_assembler.cmpl_im(right.m_value, left.m_ptr);
barraclough@apple.com8f939c22009-05-15 21:11:10 +0000217 return Jump(m_assembler.jCC(x86Condition(cond)));
barraclough@apple.coma36d9992009-02-05 03:40:39 +0000218 }
219
mark.lam@apple.come1fc7a02018-03-14 20:05:37 +0000220 Call call(PtrTag)
barraclough@apple.comd7e13382009-02-19 22:51:40 +0000221 {
222 return Call(m_assembler.call(), Call::Linkable);
223 }
224
mark.lam@apple.com8214f832018-03-22 21:24:15 +0000225 ALWAYS_INLINE Call call(RegisterID callTag) { return UNUSED_PARAM(callTag), call(NoPtrTag); }
226
fpizlo@apple.com46211712011-11-10 01:08:50 +0000227 // Address is a memory location containing the address to jump to
ysuzuki@apple.com49871512019-08-14 20:15:04 +0000228 void farJump(AbsoluteAddress address, PtrTag)
fpizlo@apple.com46211712011-11-10 01:08:50 +0000229 {
230 m_assembler.jmp_m(address.m_ptr);
231 }
232
ysuzuki@apple.com49871512019-08-14 20:15:04 +0000233 ALWAYS_INLINE void farJump(AbsoluteAddress address, RegisterID jumpTag) { UNUSED_PARAM(jumpTag), farJump(address, NoPtrTag); }
barraclough@apple.comd7e13382009-02-19 22:51:40 +0000234
oliver@apple.combe4e0672011-03-28 17:14:57 +0000235 DataLabelPtr moveWithPatch(TrustedImmPtr initialValue, RegisterID dest)
barraclough@apple.com07173242009-05-23 01:48:32 +0000236 {
fpizlo@apple.com0712be82012-08-21 23:30:19 +0000237 padBeforePatch();
barraclough@apple.com07173242009-05-23 01:48:32 +0000238 m_assembler.movl_i32r(initialValue.asIntptr(), dest);
239 return DataLabelPtr(this);
240 }
fpizlo@apple.comb75911b2012-06-13 20:53:52 +0000241
fpizlo@apple.com09a6af02013-11-18 02:10:42 +0000242 Jump branch8(RelationalCondition cond, AbsoluteAddress left, TrustedImm32 right)
243 {
utatane.tea@gmail.com997ca6b2016-07-17 14:33:26 +0000244 TrustedImm32 right8(static_cast<int8_t>(right.m_value));
245 m_assembler.cmpb_im(right8.m_value, left.m_ptr);
fpizlo@apple.com09a6af02013-11-18 02:10:42 +0000246 return Jump(m_assembler.jCC(x86Condition(cond)));
247 }
248
fpizlo@apple.comb75911b2012-06-13 20:53:52 +0000249 Jump branchTest8(ResultCondition cond, AbsoluteAddress address, TrustedImm32 mask = TrustedImm32(-1))
250 {
utatane.tea@gmail.com997ca6b2016-07-17 14:33:26 +0000251 TrustedImm32 mask8(static_cast<int8_t>(mask.m_value));
252 if (mask8.m_value == -1)
fpizlo@apple.comb75911b2012-06-13 20:53:52 +0000253 m_assembler.cmpb_im(0, address.m_ptr);
254 else
utatane.tea@gmail.com997ca6b2016-07-17 14:33:26 +0000255 m_assembler.testb_im(mask8.m_value, address.m_ptr);
fpizlo@apple.comb75911b2012-06-13 20:53:52 +0000256 return Jump(m_assembler.jCC(x86Condition(cond)));
257 }
barraclough@apple.com07173242009-05-23 01:48:32 +0000258
keith_miller@apple.com308f2ba2018-02-28 05:41:18 +0000259 Jump branchPtrWithPatch(RelationalCondition cond, RegisterID left, DataLabelPtr& dataLabel, TrustedImmPtr initialRightValue = TrustedImmPtr(nullptr))
barraclough@apple.coma36d9992009-02-05 03:40:39 +0000260 {
fpizlo@apple.com0712be82012-08-21 23:30:19 +0000261 padBeforePatch();
barraclough@apple.coma36d9992009-02-05 03:40:39 +0000262 m_assembler.cmpl_ir_force32(initialRightValue.asIntptr(), left);
263 dataLabel = DataLabelPtr(this);
barraclough@apple.com8f939c22009-05-15 21:11:10 +0000264 return Jump(m_assembler.jCC(x86Condition(cond)));
barraclough@apple.coma36d9992009-02-05 03:40:39 +0000265 }
266
keith_miller@apple.com308f2ba2018-02-28 05:41:18 +0000267 Jump branchPtrWithPatch(RelationalCondition cond, Address left, DataLabelPtr& dataLabel, TrustedImmPtr initialRightValue = TrustedImmPtr(nullptr))
barraclough@apple.coma36d9992009-02-05 03:40:39 +0000268 {
fpizlo@apple.com0712be82012-08-21 23:30:19 +0000269 padBeforePatch();
barraclough@apple.coma36d9992009-02-05 03:40:39 +0000270 m_assembler.cmpl_im_force32(initialRightValue.asIntptr(), left.offset, left.base);
271 dataLabel = DataLabelPtr(this);
barraclough@apple.com8f939c22009-05-15 21:11:10 +0000272 return Jump(m_assembler.jCC(x86Condition(cond)));
barraclough@apple.coma36d9992009-02-05 03:40:39 +0000273 }
274
mhahnenberg@apple.comb6f85192014-02-27 01:27:18 +0000275 Jump branch32WithPatch(RelationalCondition cond, Address left, DataLabel32& dataLabel, TrustedImm32 initialRightValue = TrustedImm32(0))
276 {
277 padBeforePatch();
278 m_assembler.cmpl_im_force32(initialRightValue.m_value, left.offset, left.base);
279 dataLabel = DataLabel32(this);
280 return Jump(m_assembler.jCC(x86Condition(cond)));
281 }
282
oliver@apple.combe4e0672011-03-28 17:14:57 +0000283 DataLabelPtr storePtrWithPatch(TrustedImmPtr initialValue, ImplicitAddress address)
barraclough@apple.coma36d9992009-02-05 03:40:39 +0000284 {
fpizlo@apple.com0712be82012-08-21 23:30:19 +0000285 padBeforePatch();
barraclough@apple.comfb4e1a72009-06-06 02:39:36 +0000286 m_assembler.movl_i32m(initialValue.asIntptr(), address.offset, address.base);
barraclough@apple.coma36d9992009-02-05 03:40:39 +0000287 return DataLabelPtr(this);
288 }
barraclough@apple.com8f939c22009-05-15 21:11:10 +0000289
commit-queue@webkit.org96d78032019-03-21 16:29:32 +0000290 static bool supportsFloatingPoint() { return true; }
291 static bool supportsFloatingPointTruncate() { return true; }
292 static bool supportsFloatingPointSqrt() { return true; }
293 static bool supportsFloatingPointAbs() { return true; }
mark.lam@apple.comde0dba72018-04-18 03:31:09 +0000294
295 template<PtrTag resultTag, PtrTag locationTag>
296 static FunctionPtr<resultTag> readCallTarget(CodeLocationCall<locationTag> call)
fpizlo@apple.coma147a4d2011-11-21 04:45:17 +0000297 {
yusukesuzuki@slowstart.org68366402018-08-19 22:50:05 +0000298 intptr_t offset = WTF::unalignedLoad<int32_t>(bitwise_cast<int32_t*>(call.dataLocation()) - 1);
mark.lam@apple.comde0dba72018-04-18 03:31:09 +0000299 return FunctionPtr<resultTag>(reinterpret_cast<void*>(reinterpret_cast<uintptr_t>(call.dataLocation()) + offset));
fpizlo@apple.coma147a4d2011-11-21 04:45:17 +0000300 }
barraclough@apple.com8f939c22009-05-15 21:11:10 +0000301
fpizlo@apple.comdb010872012-11-13 01:55:42 +0000302 static bool canJumpReplacePatchableBranchPtrWithPatch() { return true; }
mhahnenberg@apple.comb6f85192014-02-27 01:27:18 +0000303 static bool canJumpReplacePatchableBranch32WithPatch() { return true; }
mark.lam@apple.comde0dba72018-04-18 03:31:09 +0000304
305 template<PtrTag tag>
306 static CodeLocationLabel<tag> startOfBranchPtrWithPatchOnRegister(CodeLocationDataLabelPtr<tag> label)
fpizlo@apple.com32d42ce2012-11-21 00:22:08 +0000307 {
308 const int opcodeBytes = 1;
309 const int modRMBytes = 1;
310 const int immediateBytes = 4;
311 const int totalBytes = opcodeBytes + modRMBytes + immediateBytes;
312 ASSERT(totalBytes >= maxJumpReplacementSize());
313 return label.labelAtOffset(-totalBytes);
314 }
mark.lam@apple.comde0dba72018-04-18 03:31:09 +0000315
316 template<PtrTag tag>
317 static CodeLocationLabel<tag> startOfPatchableBranchPtrWithPatchOnAddress(CodeLocationDataLabelPtr<tag> label)
fpizlo@apple.comdb010872012-11-13 01:55:42 +0000318 {
319 const int opcodeBytes = 1;
320 const int modRMBytes = 1;
321 const int offsetBytes = 0;
322 const int immediateBytes = 4;
323 const int totalBytes = opcodeBytes + modRMBytes + offsetBytes + immediateBytes;
324 ASSERT(totalBytes >= maxJumpReplacementSize());
325 return label.labelAtOffset(-totalBytes);
326 }
mark.lam@apple.comde0dba72018-04-18 03:31:09 +0000327
328 template<PtrTag tag>
329 static CodeLocationLabel<tag> startOfPatchableBranch32WithPatchOnAddress(CodeLocationDataLabel32<tag> label)
mhahnenberg@apple.comb6f85192014-02-27 01:27:18 +0000330 {
331 const int opcodeBytes = 1;
332 const int modRMBytes = 1;
333 const int offsetBytes = 0;
334 const int immediateBytes = 4;
335 const int totalBytes = opcodeBytes + modRMBytes + offsetBytes + immediateBytes;
336 ASSERT(totalBytes >= maxJumpReplacementSize());
337 return label.labelAtOffset(-totalBytes);
338 }
mark.lam@apple.comde0dba72018-04-18 03:31:09 +0000339
340 template<PtrTag tag>
341 static void revertJumpReplacementToBranchPtrWithPatch(CodeLocationLabel<tag> instructionStart, RegisterID reg, void* initialValue)
fpizlo@apple.com32d42ce2012-11-21 00:22:08 +0000342 {
343 X86Assembler::revertJumpTo_cmpl_ir_force32(instructionStart.executableAddress(), reinterpret_cast<intptr_t>(initialValue), reg);
344 }
345
mark.lam@apple.comde0dba72018-04-18 03:31:09 +0000346 template<PtrTag tag>
347 static void revertJumpReplacementToPatchableBranchPtrWithPatch(CodeLocationLabel<tag> instructionStart, Address address, void* initialValue)
fpizlo@apple.comdb010872012-11-13 01:55:42 +0000348 {
349 ASSERT(!address.offset);
350 X86Assembler::revertJumpTo_cmpl_im_force32(instructionStart.executableAddress(), reinterpret_cast<intptr_t>(initialValue), 0, address.base);
351 }
352
mark.lam@apple.comde0dba72018-04-18 03:31:09 +0000353 template<PtrTag tag>
354 static void revertJumpReplacementToPatchableBranch32WithPatch(CodeLocationLabel<tag> instructionStart, Address address, int32_t initialValue)
mhahnenberg@apple.comb6f85192014-02-27 01:27:18 +0000355 {
356 ASSERT(!address.offset);
357 X86Assembler::revertJumpTo_cmpl_im_force32(instructionStart.executableAddress(), initialValue, 0, address.base);
358 }
359
mark.lam@apple.comde0dba72018-04-18 03:31:09 +0000360 template<PtrTag callTag, PtrTag destTag>
361 static void repatchCall(CodeLocationCall<callTag> call, CodeLocationLabel<destTag> destination)
barraclough@apple.com96e73432009-07-22 03:24:34 +0000362 {
363 X86Assembler::relinkCall(call.dataLocation(), destination.executableAddress());
364 }
365
mark.lam@apple.comde0dba72018-04-18 03:31:09 +0000366 template<PtrTag callTag, PtrTag destTag>
367 static void repatchCall(CodeLocationCall<callTag> call, FunctionPtr<destTag> destination)
barraclough@apple.com96e73432009-07-22 03:24:34 +0000368 {
369 X86Assembler::relinkCall(call.dataLocation(), destination.executableAddress());
370 }
fpizlo@apple.com7a797262015-09-03 21:11:59 +0000371
372private:
373 friend class LinkBuffer;
fpizlo@apple.com7a797262015-09-03 21:11:59 +0000374
mark.lam@apple.comde0dba72018-04-18 03:31:09 +0000375 template<PtrTag tag>
376 static void linkCall(void* code, Call call, FunctionPtr<tag> function)
fpizlo@apple.com7a797262015-09-03 21:11:59 +0000377 {
msaboff@apple.comc15ae7e2015-09-16 23:40:35 +0000378 if (call.isFlagSet(Call::Tail))
mark.lam@apple.coma7b34fc2018-03-20 18:10:16 +0000379 X86Assembler::linkJump(code, call.m_label, function.executableAddress());
msaboff@apple.comc15ae7e2015-09-16 23:40:35 +0000380 else
mark.lam@apple.coma7b34fc2018-03-20 18:10:16 +0000381 X86Assembler::linkCall(code, call.m_label, function.executableAddress());
fpizlo@apple.com7a797262015-09-03 21:11:59 +0000382 }
barraclough@apple.coma36d9992009-02-05 03:40:39 +0000383};
384
barraclough@apple.coma36d9992009-02-05 03:40:39 +0000385} // namespace JSC
386
387#endif // ENABLE(ASSEMBLER)