blob: 27684d51fc4d4851567b189a4b37f8b5e990d4d6 [file] [log] [blame]
barraclough@apple.com5ea68952009-07-17 21:56:28 +00001/*
oliver@apple.comc3a5b8c2013-07-25 04:01:38 +00002 * Copyright (C) 2008, 2013 Apple Inc.
eric@webkit.org6a210e72010-04-22 13:24:56 +00003 * Copyright (C) 2009, 2010 University of Szeged
barraclough@apple.com5ea68952009-07-17 21:56:28 +00004 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 * 1. Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 *
15 * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
16 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
18 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
19 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
20 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
21 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
22 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
23 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
25 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28#ifndef MacroAssemblerARM_h
29#define MacroAssemblerARM_h
30
mjs@apple.comcc668212010-01-04 11:38:56 +000031#if ENABLE(ASSEMBLER) && CPU(ARM_TRADITIONAL)
barraclough@apple.com5ea68952009-07-17 21:56:28 +000032
33#include "ARMAssembler.h"
34#include "AbstractMacroAssembler.h"
35
36namespace JSC {
37
38class MacroAssemblerARM : public AbstractMacroAssembler<ARMAssembler> {
ossy@webkit.orgcb981302009-11-06 07:28:56 +000039 static const int DoubleConditionMask = 0x0f;
40 static const int DoubleConditionBitSpecial = 0x10;
41 COMPILE_ASSERT(!(DoubleConditionBitSpecial & DoubleConditionMask), DoubleConditionBitSpecial_should_not_interfere_with_ARMAssembler_Condition_codes);
barraclough@apple.com5ea68952009-07-17 21:56:28 +000042public:
barraclough@apple.comcdab3602010-07-01 22:56:58 +000043 typedef ARMRegisters::FPRegisterID FPRegisterID;
44
commit-queue@webkit.org94073692013-10-22 11:57:32 +000045 static RegisterID firstRegister() { return ARMRegisters::r0; }
46 static RegisterID lastRegister() { return ARMRegisters::r15; }
47
48 static FPRegisterID firstFPRegister() { return ARMRegisters::d0; }
49 static FPRegisterID lastFPRegister() { return ARMRegisters::d31; }
50
barraclough@apple.com03cd2482011-04-20 18:44:35 +000051 enum RelationalCondition {
barraclough@apple.com5ea68952009-07-17 21:56:28 +000052 Equal = ARMAssembler::EQ,
53 NotEqual = ARMAssembler::NE,
54 Above = ARMAssembler::HI,
55 AboveOrEqual = ARMAssembler::CS,
56 Below = ARMAssembler::CC,
57 BelowOrEqual = ARMAssembler::LS,
58 GreaterThan = ARMAssembler::GT,
59 GreaterThanOrEqual = ARMAssembler::GE,
60 LessThan = ARMAssembler::LT,
barraclough@apple.com03cd2482011-04-20 18:44:35 +000061 LessThanOrEqual = ARMAssembler::LE
62 };
63
64 enum ResultCondition {
barraclough@apple.com5ea68952009-07-17 21:56:28 +000065 Overflow = ARMAssembler::VS,
66 Signed = ARMAssembler::MI,
mark.lam@apple.coma61ec352013-04-22 17:37:29 +000067 PositiveOrZero = ARMAssembler::PL,
barraclough@apple.com5ea68952009-07-17 21:56:28 +000068 Zero = ARMAssembler::EQ,
69 NonZero = ARMAssembler::NE
70 };
71
72 enum DoubleCondition {
ossy@webkit.orgcb981302009-11-06 07:28:56 +000073 // These conditions will only evaluate to true if the comparison is ordered - i.e. neither operand is NaN.
74 DoubleEqual = ARMAssembler::EQ,
75 DoubleNotEqual = ARMAssembler::NE | DoubleConditionBitSpecial,
barraclough@apple.com9ef61d52009-08-06 05:33:27 +000076 DoubleGreaterThan = ARMAssembler::GT,
77 DoubleGreaterThanOrEqual = ARMAssembler::GE,
ossy@webkit.orgcb981302009-11-06 07:28:56 +000078 DoubleLessThan = ARMAssembler::CC,
79 DoubleLessThanOrEqual = ARMAssembler::LS,
80 // If either operand is NaN, these conditions always evaluate to true.
81 DoubleEqualOrUnordered = ARMAssembler::EQ | DoubleConditionBitSpecial,
82 DoubleNotEqualOrUnordered = ARMAssembler::NE,
83 DoubleGreaterThanOrUnordered = ARMAssembler::HI,
84 DoubleGreaterThanOrEqualOrUnordered = ARMAssembler::CS,
barraclough@apple.com2ffca6f2009-11-04 23:59:14 +000085 DoubleLessThanOrUnordered = ARMAssembler::LT,
86 DoubleLessThanOrEqualOrUnordered = ARMAssembler::LE,
barraclough@apple.com5ea68952009-07-17 21:56:28 +000087 };
88
eric@webkit.org734dd062009-08-20 00:02:24 +000089 static const RegisterID stackPointerRegister = ARMRegisters::sp;
commit-queue@webkit.org94073692013-10-22 11:57:32 +000090 static const RegisterID framePointerRegister = ARMRegisters::fp;
eric@webkit.org6fe95ae2009-10-26 22:49:23 +000091 static const RegisterID linkRegister = ARMRegisters::lr;
barraclough@apple.com5ea68952009-07-17 21:56:28 +000092
93 static const Scale ScalePtr = TimesFour;
94
95 void add32(RegisterID src, RegisterID dest)
96 {
commit-queue@webkit.orgb1409632012-08-14 11:28:25 +000097 m_assembler.adds(dest, dest, src);
barraclough@apple.com5ea68952009-07-17 21:56:28 +000098 }
99
zherczeg@webkit.orgd6e661f2012-07-05 07:04:16 +0000100 void add32(RegisterID op1, RegisterID op2, RegisterID dest)
101 {
commit-queue@webkit.orgb1409632012-08-14 11:28:25 +0000102 m_assembler.adds(dest, op1, op2);
zherczeg@webkit.orgd6e661f2012-07-05 07:04:16 +0000103 }
104
oliver@apple.combe4e0672011-03-28 17:14:57 +0000105 void add32(TrustedImm32 imm, Address address)
barraclough@apple.com5ea68952009-07-17 21:56:28 +0000106 {
eric@webkit.org734dd062009-08-20 00:02:24 +0000107 load32(address, ARMRegisters::S1);
108 add32(imm, ARMRegisters::S1);
109 store32(ARMRegisters::S1, address);
barraclough@apple.com5ea68952009-07-17 21:56:28 +0000110 }
111
oliver@apple.combe4e0672011-03-28 17:14:57 +0000112 void add32(TrustedImm32 imm, RegisterID dest)
barraclough@apple.com5ea68952009-07-17 21:56:28 +0000113 {
commit-queue@webkit.orgb1409632012-08-14 11:28:25 +0000114 m_assembler.adds(dest, dest, m_assembler.getImm(imm.m_value, ARMRegisters::S0));
barraclough@apple.com5ea68952009-07-17 21:56:28 +0000115 }
116
rgabor@webkit.org58c69f82012-07-16 15:05:57 +0000117 void add32(AbsoluteAddress src, RegisterID dest)
118 {
rgabor@webkit.org43ad3e52012-07-16 16:16:03 +0000119 move(TrustedImmPtr(src.m_ptr), ARMRegisters::S1);
commit-queue@webkit.orgb1409632012-08-14 11:28:25 +0000120 m_assembler.dtrUp(ARMAssembler::LoadUint32, ARMRegisters::S1, ARMRegisters::S1, 0);
rgabor@webkit.org58c69f82012-07-16 15:05:57 +0000121 add32(ARMRegisters::S1, dest);
122 }
123
barraclough@apple.com5ea68952009-07-17 21:56:28 +0000124 void add32(Address src, RegisterID dest)
125 {
eric@webkit.org734dd062009-08-20 00:02:24 +0000126 load32(src, ARMRegisters::S1);
127 add32(ARMRegisters::S1, dest);
barraclough@apple.com5ea68952009-07-17 21:56:28 +0000128 }
129
hausmann@webkit.org552d5cd2012-03-07 11:30:29 +0000130 void add32(RegisterID src, TrustedImm32 imm, RegisterID dest)
131 {
commit-queue@webkit.orgb1409632012-08-14 11:28:25 +0000132 m_assembler.adds(dest, src, m_assembler.getImm(imm.m_value, ARMRegisters::S0));
hausmann@webkit.org552d5cd2012-03-07 11:30:29 +0000133 }
134
barraclough@apple.com5ea68952009-07-17 21:56:28 +0000135 void and32(RegisterID src, RegisterID dest)
136 {
commit-queue@webkit.orgb1409632012-08-14 11:28:25 +0000137 m_assembler.bitAnds(dest, dest, src);
barraclough@apple.com5ea68952009-07-17 21:56:28 +0000138 }
139
zherczeg@webkit.orgd6e661f2012-07-05 07:04:16 +0000140 void and32(RegisterID op1, RegisterID op2, RegisterID dest)
141 {
commit-queue@webkit.orgb1409632012-08-14 11:28:25 +0000142 m_assembler.bitAnds(dest, op1, op2);
zherczeg@webkit.orgd6e661f2012-07-05 07:04:16 +0000143 }
144
oliver@apple.combe4e0672011-03-28 17:14:57 +0000145 void and32(TrustedImm32 imm, RegisterID dest)
barraclough@apple.com5ea68952009-07-17 21:56:28 +0000146 {
eric@webkit.org734dd062009-08-20 00:02:24 +0000147 ARMWord w = m_assembler.getImm(imm.m_value, ARMRegisters::S0, true);
commit-queue@webkit.org3dfe8ce2012-08-07 22:55:04 +0000148 if (w & ARMAssembler::Op2InvertedImmediate)
commit-queue@webkit.orgb1409632012-08-14 11:28:25 +0000149 m_assembler.bics(dest, dest, w & ~ARMAssembler::Op2InvertedImmediate);
barraclough@apple.com5ea68952009-07-17 21:56:28 +0000150 else
commit-queue@webkit.orgb1409632012-08-14 11:28:25 +0000151 m_assembler.bitAnds(dest, dest, w);
barraclough@apple.com5ea68952009-07-17 21:56:28 +0000152 }
153
ossy@webkit.orgdac63a02012-03-06 09:36:30 +0000154 void and32(TrustedImm32 imm, RegisterID src, RegisterID dest)
155 {
156 ARMWord w = m_assembler.getImm(imm.m_value, ARMRegisters::S0, true);
commit-queue@webkit.org3dfe8ce2012-08-07 22:55:04 +0000157 if (w & ARMAssembler::Op2InvertedImmediate)
commit-queue@webkit.orgb1409632012-08-14 11:28:25 +0000158 m_assembler.bics(dest, src, w & ~ARMAssembler::Op2InvertedImmediate);
ossy@webkit.orgdac63a02012-03-06 09:36:30 +0000159 else
commit-queue@webkit.orgb1409632012-08-14 11:28:25 +0000160 m_assembler.bitAnds(dest, src, w);
ossy@webkit.orgdac63a02012-03-06 09:36:30 +0000161 }
162
rgabor@webkit.orgd37989e2013-03-19 09:32:54 +0000163 void and32(Address src, RegisterID dest)
164 {
165 load32(src, ARMRegisters::S1);
166 and32(ARMRegisters::S1, dest);
167 }
168
zherczeg@webkit.orgd6e661f2012-07-05 07:04:16 +0000169 void lshift32(RegisterID shiftAmount, RegisterID dest)
barraclough@apple.comc4a3fa82009-11-06 09:35:03 +0000170 {
zherczeg@webkit.orgd6e661f2012-07-05 07:04:16 +0000171 lshift32(dest, shiftAmount, dest);
172 }
barraclough@apple.comc4a3fa82009-11-06 09:35:03 +0000173
zherczeg@webkit.orgd6e661f2012-07-05 07:04:16 +0000174 void lshift32(RegisterID src, RegisterID shiftAmount, RegisterID dest)
175 {
176 ARMWord w = ARMAssembler::getOp2Byte(0x1f);
commit-queue@webkit.orgb1409632012-08-14 11:28:25 +0000177 m_assembler.bitAnd(ARMRegisters::S0, shiftAmount, w);
zherczeg@webkit.orgd6e661f2012-07-05 07:04:16 +0000178
commit-queue@webkit.orgb1409632012-08-14 11:28:25 +0000179 m_assembler.movs(dest, m_assembler.lslRegister(src, ARMRegisters::S0));
barraclough@apple.comc4a3fa82009-11-06 09:35:03 +0000180 }
181
oliver@apple.combe4e0672011-03-28 17:14:57 +0000182 void lshift32(TrustedImm32 imm, RegisterID dest)
barraclough@apple.com5ea68952009-07-17 21:56:28 +0000183 {
commit-queue@webkit.orgb1409632012-08-14 11:28:25 +0000184 m_assembler.movs(dest, m_assembler.lsl(dest, imm.m_value & 0x1f));
barraclough@apple.com5ea68952009-07-17 21:56:28 +0000185 }
186
commit-queue@webkit.org1e0469c2012-05-03 02:15:49 +0000187 void lshift32(RegisterID src, TrustedImm32 imm, RegisterID dest)
188 {
commit-queue@webkit.orgb1409632012-08-14 11:28:25 +0000189 m_assembler.movs(dest, m_assembler.lsl(src, imm.m_value & 0x1f));
commit-queue@webkit.org1e0469c2012-05-03 02:15:49 +0000190 }
191
zherczeg@webkit.orgd6e661f2012-07-05 07:04:16 +0000192 void mul32(RegisterID op1, RegisterID op2, RegisterID dest)
193 {
194 if (op2 == dest) {
195 if (op1 == dest) {
196 move(op2, ARMRegisters::S0);
197 op2 = ARMRegisters::S0;
198 } else {
199 // Swap the operands.
200 RegisterID tmp = op1;
201 op1 = op2;
202 op2 = tmp;
203 }
204 }
commit-queue@webkit.orgb1409632012-08-14 11:28:25 +0000205 m_assembler.muls(dest, op1, op2);
zherczeg@webkit.orgd6e661f2012-07-05 07:04:16 +0000206 }
207
barraclough@apple.com5ea68952009-07-17 21:56:28 +0000208 void mul32(RegisterID src, RegisterID dest)
209 {
zherczeg@webkit.orgd6e661f2012-07-05 07:04:16 +0000210 mul32(src, dest, dest);
barraclough@apple.com5ea68952009-07-17 21:56:28 +0000211 }
212
oliver@apple.combe4e0672011-03-28 17:14:57 +0000213 void mul32(TrustedImm32 imm, RegisterID src, RegisterID dest)
barraclough@apple.com5ea68952009-07-17 21:56:28 +0000214 {
eric@webkit.org734dd062009-08-20 00:02:24 +0000215 move(imm, ARMRegisters::S0);
commit-queue@webkit.orgb1409632012-08-14 11:28:25 +0000216 m_assembler.muls(dest, src, ARMRegisters::S0);
barraclough@apple.com5ea68952009-07-17 21:56:28 +0000217 }
218
zoltan@webkit.org1916f842009-11-14 00:44:42 +0000219 void neg32(RegisterID srcDest)
220 {
commit-queue@webkit.orgb6cc1852012-08-15 21:09:00 +0000221 m_assembler.rsbs(srcDest, srcDest, ARMAssembler::getOp2Byte(0));
zoltan@webkit.org1916f842009-11-14 00:44:42 +0000222 }
223
barraclough@apple.com5ea68952009-07-17 21:56:28 +0000224 void or32(RegisterID src, RegisterID dest)
225 {
commit-queue@webkit.orgb1409632012-08-14 11:28:25 +0000226 m_assembler.orrs(dest, dest, src);
barraclough@apple.com5ea68952009-07-17 21:56:28 +0000227 }
228
kadam@inf.u-szeged.hu3af1cf12012-09-18 09:11:05 +0000229 void or32(RegisterID src, AbsoluteAddress dest)
230 {
231 move(TrustedImmPtr(dest.m_ptr), ARMRegisters::S0);
232 load32(Address(ARMRegisters::S0), ARMRegisters::S1);
233 or32(src, ARMRegisters::S1);
234 store32(ARMRegisters::S1, ARMRegisters::S0);
235 }
236
oliver@apple.combe4e0672011-03-28 17:14:57 +0000237 void or32(TrustedImm32 imm, RegisterID dest)
barraclough@apple.com5ea68952009-07-17 21:56:28 +0000238 {
commit-queue@webkit.orgb1409632012-08-14 11:28:25 +0000239 m_assembler.orrs(dest, dest, m_assembler.getImm(imm.m_value, ARMRegisters::S0));
barraclough@apple.com5ea68952009-07-17 21:56:28 +0000240 }
241
commit-queue@webkit.org1e0469c2012-05-03 02:15:49 +0000242 void or32(TrustedImm32 imm, RegisterID src, RegisterID dest)
243 {
commit-queue@webkit.orgb1409632012-08-14 11:28:25 +0000244 m_assembler.orrs(dest, src, m_assembler.getImm(imm.m_value, ARMRegisters::S0));
commit-queue@webkit.org1e0469c2012-05-03 02:15:49 +0000245 }
246
barraclough@apple.com8328f632011-09-21 18:33:43 +0000247 void or32(RegisterID op1, RegisterID op2, RegisterID dest)
248 {
commit-queue@webkit.orgb1409632012-08-14 11:28:25 +0000249 m_assembler.orrs(dest, op1, op2);
barraclough@apple.com8328f632011-09-21 18:33:43 +0000250 }
251
zherczeg@webkit.orgd6e661f2012-07-05 07:04:16 +0000252 void rshift32(RegisterID shiftAmount, RegisterID dest)
barraclough@apple.com5ea68952009-07-17 21:56:28 +0000253 {
zherczeg@webkit.orgd6e661f2012-07-05 07:04:16 +0000254 rshift32(dest, shiftAmount, dest);
barraclough@apple.com5ea68952009-07-17 21:56:28 +0000255 }
zherczeg@webkit.orgd6e661f2012-07-05 07:04:16 +0000256
257 void rshift32(RegisterID src, RegisterID shiftAmount, RegisterID dest)
258 {
259 ARMWord w = ARMAssembler::getOp2Byte(0x1f);
commit-queue@webkit.orgb1409632012-08-14 11:28:25 +0000260 m_assembler.bitAnd(ARMRegisters::S0, shiftAmount, w);
zherczeg@webkit.orgd6e661f2012-07-05 07:04:16 +0000261
commit-queue@webkit.orgb1409632012-08-14 11:28:25 +0000262 m_assembler.movs(dest, m_assembler.asrRegister(src, ARMRegisters::S0));
zherczeg@webkit.orgd6e661f2012-07-05 07:04:16 +0000263 }
264
oliver@apple.combe4e0672011-03-28 17:14:57 +0000265 void rshift32(TrustedImm32 imm, RegisterID dest)
barraclough@apple.com5ea68952009-07-17 21:56:28 +0000266 {
oliver@apple.com5b6a0d32011-07-01 16:33:46 +0000267 rshift32(dest, imm, dest);
268 }
269
270 void rshift32(RegisterID src, TrustedImm32 imm, RegisterID dest)
271 {
commit-queue@webkit.orgb1409632012-08-14 11:28:25 +0000272 m_assembler.movs(dest, m_assembler.asr(src, imm.m_value & 0x1f));
barraclough@apple.com5ea68952009-07-17 21:56:28 +0000273 }
zherczeg@webkit.orgd6e661f2012-07-05 07:04:16 +0000274
275 void urshift32(RegisterID shiftAmount, RegisterID dest)
oliver@apple.com429ede02010-04-30 07:56:38 +0000276 {
zherczeg@webkit.orgd6e661f2012-07-05 07:04:16 +0000277 urshift32(dest, shiftAmount, dest);
oliver@apple.com429ede02010-04-30 07:56:38 +0000278 }
zherczeg@webkit.orgd6e661f2012-07-05 07:04:16 +0000279
280 void urshift32(RegisterID src, RegisterID shiftAmount, RegisterID dest)
281 {
282 ARMWord w = ARMAssembler::getOp2Byte(0x1f);
commit-queue@webkit.orgb1409632012-08-14 11:28:25 +0000283 m_assembler.bitAnd(ARMRegisters::S0, shiftAmount, w);
zherczeg@webkit.orgd6e661f2012-07-05 07:04:16 +0000284
commit-queue@webkit.orgb1409632012-08-14 11:28:25 +0000285 m_assembler.movs(dest, m_assembler.lsrRegister(src, ARMRegisters::S0));
zherczeg@webkit.orgd6e661f2012-07-05 07:04:16 +0000286 }
287
oliver@apple.combe4e0672011-03-28 17:14:57 +0000288 void urshift32(TrustedImm32 imm, RegisterID dest)
oliver@apple.com429ede02010-04-30 07:56:38 +0000289 {
commit-queue@webkit.orgb1409632012-08-14 11:28:25 +0000290 m_assembler.movs(dest, m_assembler.lsr(dest, imm.m_value & 0x1f));
oliver@apple.com429ede02010-04-30 07:56:38 +0000291 }
commit-queue@webkit.org1e0469c2012-05-03 02:15:49 +0000292
293 void urshift32(RegisterID src, TrustedImm32 imm, RegisterID dest)
294 {
commit-queue@webkit.orgb1409632012-08-14 11:28:25 +0000295 m_assembler.movs(dest, m_assembler.lsr(src, imm.m_value & 0x1f));
commit-queue@webkit.org1e0469c2012-05-03 02:15:49 +0000296 }
barraclough@apple.com5ea68952009-07-17 21:56:28 +0000297
298 void sub32(RegisterID src, RegisterID dest)
299 {
commit-queue@webkit.orgb1409632012-08-14 11:28:25 +0000300 m_assembler.subs(dest, dest, src);
barraclough@apple.com5ea68952009-07-17 21:56:28 +0000301 }
302
oliver@apple.combe4e0672011-03-28 17:14:57 +0000303 void sub32(TrustedImm32 imm, RegisterID dest)
barraclough@apple.com5ea68952009-07-17 21:56:28 +0000304 {
commit-queue@webkit.orgb1409632012-08-14 11:28:25 +0000305 m_assembler.subs(dest, dest, m_assembler.getImm(imm.m_value, ARMRegisters::S0));
barraclough@apple.com5ea68952009-07-17 21:56:28 +0000306 }
307
oliver@apple.combe4e0672011-03-28 17:14:57 +0000308 void sub32(TrustedImm32 imm, Address address)
barraclough@apple.com5ea68952009-07-17 21:56:28 +0000309 {
eric@webkit.org734dd062009-08-20 00:02:24 +0000310 load32(address, ARMRegisters::S1);
311 sub32(imm, ARMRegisters::S1);
312 store32(ARMRegisters::S1, address);
barraclough@apple.com5ea68952009-07-17 21:56:28 +0000313 }
314
315 void sub32(Address src, RegisterID dest)
316 {
eric@webkit.org734dd062009-08-20 00:02:24 +0000317 load32(src, ARMRegisters::S1);
318 sub32(ARMRegisters::S1, dest);
barraclough@apple.com5ea68952009-07-17 21:56:28 +0000319 }
320
hausmann@webkit.org552d5cd2012-03-07 11:30:29 +0000321 void sub32(RegisterID src, TrustedImm32 imm, RegisterID dest)
322 {
commit-queue@webkit.orgb1409632012-08-14 11:28:25 +0000323 m_assembler.subs(dest, src, m_assembler.getImm(imm.m_value, ARMRegisters::S0));
hausmann@webkit.org552d5cd2012-03-07 11:30:29 +0000324 }
325
barraclough@apple.com5ea68952009-07-17 21:56:28 +0000326 void xor32(RegisterID src, RegisterID dest)
327 {
commit-queue@webkit.orgb6cc1852012-08-15 21:09:00 +0000328 m_assembler.eors(dest, dest, src);
barraclough@apple.com5ea68952009-07-17 21:56:28 +0000329 }
330
zherczeg@webkit.orgd6e661f2012-07-05 07:04:16 +0000331 void xor32(RegisterID op1, RegisterID op2, RegisterID dest)
332 {
commit-queue@webkit.orgb6cc1852012-08-15 21:09:00 +0000333 m_assembler.eors(dest, op1, op2);
zherczeg@webkit.orgd6e661f2012-07-05 07:04:16 +0000334 }
335
oliver@apple.combe4e0672011-03-28 17:14:57 +0000336 void xor32(TrustedImm32 imm, RegisterID dest)
barraclough@apple.com5ea68952009-07-17 21:56:28 +0000337 {
barraclough@apple.coma6bdfc82012-02-27 18:26:23 +0000338 if (imm.m_value == -1)
commit-queue@webkit.orgb1409632012-08-14 11:28:25 +0000339 m_assembler.mvns(dest, dest);
barraclough@apple.coma6bdfc82012-02-27 18:26:23 +0000340 else
commit-queue@webkit.orgb6cc1852012-08-15 21:09:00 +0000341 m_assembler.eors(dest, dest, m_assembler.getImm(imm.m_value, ARMRegisters::S0));
barraclough@apple.com5ea68952009-07-17 21:56:28 +0000342 }
343
commit-queue@webkit.org1e0469c2012-05-03 02:15:49 +0000344 void xor32(TrustedImm32 imm, RegisterID src, RegisterID dest)
345 {
346 if (imm.m_value == -1)
commit-queue@webkit.orgb1409632012-08-14 11:28:25 +0000347 m_assembler.mvns(dest, src);
commit-queue@webkit.org1e0469c2012-05-03 02:15:49 +0000348 else
commit-queue@webkit.orgb6cc1852012-08-15 21:09:00 +0000349 m_assembler.eors(dest, src, m_assembler.getImm(imm.m_value, ARMRegisters::S0));
commit-queue@webkit.org1e0469c2012-05-03 02:15:49 +0000350 }
351
loki@webkit.org0f28f9b2010-11-20 22:02:36 +0000352 void countLeadingZeros32(RegisterID src, RegisterID dest)
353 {
354#if WTF_ARM_ARCH_AT_LEAST(5)
commit-queue@webkit.orgb1409632012-08-14 11:28:25 +0000355 m_assembler.clz(dest, src);
loki@webkit.org0f28f9b2010-11-20 22:02:36 +0000356#else
357 UNUSED_PARAM(src);
358 UNUSED_PARAM(dest);
oliver@apple.com5598c182013-01-23 22:25:07 +0000359 RELEASE_ASSERT_NOT_REACHED();
loki@webkit.org0f28f9b2010-11-20 22:02:36 +0000360#endif
361 }
362
loki@webkit.org2acccd02010-03-09 09:36:06 +0000363 void load8(ImplicitAddress address, RegisterID dest)
364 {
zherczeg@webkit.orgd6e661f2012-07-05 07:04:16 +0000365 m_assembler.dataTransfer32(ARMAssembler::LoadUint8, dest, address.base, address.offset);
loki@webkit.org2acccd02010-03-09 09:36:06 +0000366 }
367
msaboff@apple.com2cc41502011-09-12 22:17:53 +0000368 void load8(BaseIndex address, RegisterID dest)
369 {
zherczeg@webkit.orgd6e661f2012-07-05 07:04:16 +0000370 m_assembler.baseIndexTransfer32(ARMAssembler::LoadUint8, dest, address.base, address.index, static_cast<int>(address.scale), address.offset);
371 }
372
373 void load8Signed(BaseIndex address, RegisterID dest)
374 {
375 m_assembler.baseIndexTransfer16(ARMAssembler::LoadInt8, dest, address.base, address.index, static_cast<int>(address.scale), address.offset);
376 }
377
378 void load16(ImplicitAddress address, RegisterID dest)
379 {
380 m_assembler.dataTransfer16(ARMAssembler::LoadUint16, dest, address.base, address.offset);
381 }
382
383 void load16(BaseIndex address, RegisterID dest)
384 {
385 m_assembler.baseIndexTransfer16(ARMAssembler::LoadUint16, dest, address.base, address.index, static_cast<int>(address.scale), address.offset);
386 }
387
388 void load16Signed(BaseIndex address, RegisterID dest)
389 {
390 m_assembler.baseIndexTransfer16(ARMAssembler::LoadInt16, dest, address.base, address.index, static_cast<int>(address.scale), address.offset);
msaboff@apple.com2cc41502011-09-12 22:17:53 +0000391 }
392
barraclough@apple.com5ea68952009-07-17 21:56:28 +0000393 void load32(ImplicitAddress address, RegisterID dest)
394 {
zherczeg@webkit.orgd6e661f2012-07-05 07:04:16 +0000395 m_assembler.dataTransfer32(ARMAssembler::LoadUint32, dest, address.base, address.offset);
barraclough@apple.com5ea68952009-07-17 21:56:28 +0000396 }
397
398 void load32(BaseIndex address, RegisterID dest)
399 {
zherczeg@webkit.orgd6e661f2012-07-05 07:04:16 +0000400 m_assembler.baseIndexTransfer32(ARMAssembler::LoadUint32, dest, address.base, address.index, static_cast<int>(address.scale), address.offset);
barraclough@apple.com5ea68952009-07-17 21:56:28 +0000401 }
402
mjs@apple.comcc668212010-01-04 11:38:56 +0000403#if CPU(ARMV5_OR_LOWER)
eric@webkit.org16d65d12009-09-26 02:27:02 +0000404 void load32WithUnalignedHalfWords(BaseIndex address, RegisterID dest);
405#else
406 void load32WithUnalignedHalfWords(BaseIndex address, RegisterID dest)
407 {
408 load32(address, dest);
409 }
410#endif
411
commit-queue@webkit.orga7d13c82011-12-08 23:16:54 +0000412 void load16Unaligned(BaseIndex address, RegisterID dest)
413 {
414 load16(address, dest);
415 }
416
zherczeg@webkit.orgadfdb1f2012-07-08 10:00:04 +0000417 ConvertibleLoadLabel convertibleLoadPtr(Address address, RegisterID dest)
418 {
419 ConvertibleLoadLabel result(this);
420 ASSERT(address.offset >= 0 && address.offset <= 255);
commit-queue@webkit.orgb1409632012-08-14 11:28:25 +0000421 m_assembler.dtrUp(ARMAssembler::LoadUint32, dest, address.base, address.offset);
zherczeg@webkit.orgadfdb1f2012-07-08 10:00:04 +0000422 return result;
423 }
424
barraclough@apple.com5ea68952009-07-17 21:56:28 +0000425 DataLabel32 load32WithAddressOffsetPatch(Address address, RegisterID dest)
426 {
427 DataLabel32 dataLabel(this);
commit-queue@webkit.orgb1409632012-08-14 11:28:25 +0000428 m_assembler.ldrUniqueImmediate(ARMRegisters::S0, 0);
429 m_assembler.dtrUpRegister(ARMAssembler::LoadUint32, dest, address.base, ARMRegisters::S0);
barraclough@apple.com5ea68952009-07-17 21:56:28 +0000430 return dataLabel;
431 }
zherczeg@webkit.org4a637582012-07-26 12:29:10 +0000432
433 static bool isCompactPtrAlignedAddressOffset(ptrdiff_t value)
434 {
435 return value >= -4095 && value <= 4095;
436 }
437
oliver@apple.com2c012fa2011-05-17 20:02:41 +0000438 DataLabelCompact load32WithCompactAddressOffsetPatch(Address address, RegisterID dest)
439 {
440 DataLabelCompact dataLabel(this);
zherczeg@webkit.org4a637582012-07-26 12:29:10 +0000441 ASSERT(isCompactPtrAlignedAddressOffset(address.offset));
442 if (address.offset >= 0)
commit-queue@webkit.orgb1409632012-08-14 11:28:25 +0000443 m_assembler.dtrUp(ARMAssembler::LoadUint32, dest, address.base, address.offset);
zherczeg@webkit.org4a637582012-07-26 12:29:10 +0000444 else
commit-queue@webkit.orgb1409632012-08-14 11:28:25 +0000445 m_assembler.dtrDown(ARMAssembler::LoadUint32, dest, address.base, address.offset);
oliver@apple.com2c012fa2011-05-17 20:02:41 +0000446 return dataLabel;
447 }
barraclough@apple.com5ea68952009-07-17 21:56:28 +0000448
barraclough@apple.com5ea68952009-07-17 21:56:28 +0000449 DataLabel32 store32WithAddressOffsetPatch(RegisterID src, Address address)
450 {
451 DataLabel32 dataLabel(this);
commit-queue@webkit.orgb1409632012-08-14 11:28:25 +0000452 m_assembler.ldrUniqueImmediate(ARMRegisters::S0, 0);
453 m_assembler.dtrUpRegister(ARMAssembler::StoreUint32, src, address.base, ARMRegisters::S0);
barraclough@apple.com5ea68952009-07-17 21:56:28 +0000454 return dataLabel;
455 }
456
zherczeg@webkit.orgd6e661f2012-07-05 07:04:16 +0000457 void store8(RegisterID src, BaseIndex address)
458 {
459 m_assembler.baseIndexTransfer32(ARMAssembler::StoreUint8, src, address.base, address.index, static_cast<int>(address.scale), address.offset);
460 }
461
paroga@webkit.org34f68fd2013-04-10 20:30:19 +0000462 void store8(TrustedImm32 imm, const void* address)
rgabor@webkit.org5e7efa32012-09-20 13:25:12 +0000463 {
464 move(TrustedImm32(reinterpret_cast<ARMWord>(address)), ARMRegisters::S0);
paroga@webkit.org34f68fd2013-04-10 20:30:19 +0000465 move(imm, ARMRegisters::S1);
rgabor@webkit.org5e7efa32012-09-20 13:25:12 +0000466 m_assembler.dtrUp(ARMAssembler::StoreUint8, ARMRegisters::S1, ARMRegisters::S0, 0);
467 }
468
zherczeg@webkit.orgd6e661f2012-07-05 07:04:16 +0000469 void store16(RegisterID src, BaseIndex address)
470 {
471 m_assembler.baseIndexTransfer16(ARMAssembler::StoreUint16, src, address.base, address.index, static_cast<int>(address.scale), address.offset);
472 }
473
barraclough@apple.com5ea68952009-07-17 21:56:28 +0000474 void store32(RegisterID src, ImplicitAddress address)
475 {
zherczeg@webkit.orgd6e661f2012-07-05 07:04:16 +0000476 m_assembler.dataTransfer32(ARMAssembler::StoreUint32, src, address.base, address.offset);
barraclough@apple.com5ea68952009-07-17 21:56:28 +0000477 }
478
479 void store32(RegisterID src, BaseIndex address)
480 {
zherczeg@webkit.orgd6e661f2012-07-05 07:04:16 +0000481 m_assembler.baseIndexTransfer32(ARMAssembler::StoreUint32, src, address.base, address.index, static_cast<int>(address.scale), address.offset);
barraclough@apple.com5ea68952009-07-17 21:56:28 +0000482 }
483
oliver@apple.combe4e0672011-03-28 17:14:57 +0000484 void store32(TrustedImm32 imm, ImplicitAddress address)
barraclough@apple.com5ea68952009-07-17 21:56:28 +0000485 {
barraclough@apple.comaa82d502012-05-06 05:27:29 +0000486 move(imm, ARMRegisters::S1);
eric@webkit.org734dd062009-08-20 00:02:24 +0000487 store32(ARMRegisters::S1, address);
barraclough@apple.com5ea68952009-07-17 21:56:28 +0000488 }
489
zherczeg@webkit.orgd6e661f2012-07-05 07:04:16 +0000490 void store32(TrustedImm32 imm, BaseIndex address)
491 {
492 move(imm, ARMRegisters::S1);
493 m_assembler.baseIndexTransfer32(ARMAssembler::StoreUint32, ARMRegisters::S1, address.base, address.index, static_cast<int>(address.scale), address.offset);
494 }
495
paroga@webkit.org34f68fd2013-04-10 20:30:19 +0000496 void store32(RegisterID src, const void* address)
barraclough@apple.com5ea68952009-07-17 21:56:28 +0000497 {
commit-queue@webkit.orgb1409632012-08-14 11:28:25 +0000498 m_assembler.ldrUniqueImmediate(ARMRegisters::S0, reinterpret_cast<ARMWord>(address));
499 m_assembler.dtrUp(ARMAssembler::StoreUint32, src, ARMRegisters::S0, 0);
barraclough@apple.com5ea68952009-07-17 21:56:28 +0000500 }
501
paroga@webkit.org34f68fd2013-04-10 20:30:19 +0000502 void store32(TrustedImm32 imm, const void* address)
barraclough@apple.com5ea68952009-07-17 21:56:28 +0000503 {
commit-queue@webkit.orgb1409632012-08-14 11:28:25 +0000504 m_assembler.ldrUniqueImmediate(ARMRegisters::S0, reinterpret_cast<ARMWord>(address));
barraclough@apple.comaa82d502012-05-06 05:27:29 +0000505 m_assembler.moveImm(imm.m_value, ARMRegisters::S1);
commit-queue@webkit.orgb1409632012-08-14 11:28:25 +0000506 m_assembler.dtrUp(ARMAssembler::StoreUint32, ARMRegisters::S1, ARMRegisters::S0, 0);
barraclough@apple.com5ea68952009-07-17 21:56:28 +0000507 }
508
509 void pop(RegisterID dest)
510 {
commit-queue@webkit.orgb1409632012-08-14 11:28:25 +0000511 m_assembler.pop(dest);
barraclough@apple.com5ea68952009-07-17 21:56:28 +0000512 }
513
514 void push(RegisterID src)
515 {
commit-queue@webkit.orgb1409632012-08-14 11:28:25 +0000516 m_assembler.push(src);
barraclough@apple.com5ea68952009-07-17 21:56:28 +0000517 }
518
519 void push(Address address)
520 {
eric@webkit.org734dd062009-08-20 00:02:24 +0000521 load32(address, ARMRegisters::S1);
522 push(ARMRegisters::S1);
barraclough@apple.com5ea68952009-07-17 21:56:28 +0000523 }
524
oliver@apple.combe4e0672011-03-28 17:14:57 +0000525 void push(TrustedImm32 imm)
barraclough@apple.com5ea68952009-07-17 21:56:28 +0000526 {
eric@webkit.org734dd062009-08-20 00:02:24 +0000527 move(imm, ARMRegisters::S0);
528 push(ARMRegisters::S0);
barraclough@apple.com5ea68952009-07-17 21:56:28 +0000529 }
530
oliver@apple.combe4e0672011-03-28 17:14:57 +0000531 void move(TrustedImm32 imm, RegisterID dest)
barraclough@apple.com5ea68952009-07-17 21:56:28 +0000532 {
barraclough@apple.comaa82d502012-05-06 05:27:29 +0000533 m_assembler.moveImm(imm.m_value, dest);
barraclough@apple.com5ea68952009-07-17 21:56:28 +0000534 }
535
536 void move(RegisterID src, RegisterID dest)
537 {
zherczeg@webkit.orgd6e661f2012-07-05 07:04:16 +0000538 if (src != dest)
commit-queue@webkit.orgb1409632012-08-14 11:28:25 +0000539 m_assembler.mov(dest, src);
barraclough@apple.com5ea68952009-07-17 21:56:28 +0000540 }
541
oliver@apple.combe4e0672011-03-28 17:14:57 +0000542 void move(TrustedImmPtr imm, RegisterID dest)
barraclough@apple.com5ea68952009-07-17 21:56:28 +0000543 {
oliver@apple.combe4e0672011-03-28 17:14:57 +0000544 move(TrustedImm32(imm), dest);
barraclough@apple.com5ea68952009-07-17 21:56:28 +0000545 }
546
547 void swap(RegisterID reg1, RegisterID reg2)
548 {
rgabor@webkit.org61e0f582013-05-27 12:23:13 +0000549 xor32(reg1, reg2);
550 xor32(reg2, reg1);
551 xor32(reg1, reg2);
barraclough@apple.com5ea68952009-07-17 21:56:28 +0000552 }
553
554 void signExtend32ToPtr(RegisterID src, RegisterID dest)
555 {
556 if (src != dest)
557 move(src, dest);
558 }
559
560 void zeroExtend32ToPtr(RegisterID src, RegisterID dest)
561 {
562 if (src != dest)
563 move(src, dest);
564 }
565
barraclough@apple.com03cd2482011-04-20 18:44:35 +0000566 Jump branch8(RelationalCondition cond, Address left, TrustedImm32 right)
loki@webkit.org2acccd02010-03-09 09:36:06 +0000567 {
568 load8(left, ARMRegisters::S1);
569 return branch32(cond, ARMRegisters::S1, right);
570 }
571
msaboff@apple.com2cc41502011-09-12 22:17:53 +0000572 Jump branch8(RelationalCondition cond, BaseIndex left, TrustedImm32 right)
573 {
574 ASSERT(!(right.m_value & 0xFFFFFF00));
575 load8(left, ARMRegisters::S1);
576 return branch32(cond, ARMRegisters::S1, right);
577 }
578
barraclough@apple.com03cd2482011-04-20 18:44:35 +0000579 Jump branch32(RelationalCondition cond, RegisterID left, RegisterID right, int useConstantPool = 0)
barraclough@apple.com5ea68952009-07-17 21:56:28 +0000580 {
commit-queue@webkit.orgb1409632012-08-14 11:28:25 +0000581 m_assembler.cmp(left, right);
barraclough@apple.com970af2c2009-08-13 05:58:36 +0000582 return Jump(m_assembler.jmp(ARMCondition(cond), useConstantPool));
barraclough@apple.com5ea68952009-07-17 21:56:28 +0000583 }
584
barraclough@apple.com03cd2482011-04-20 18:44:35 +0000585 Jump branch32(RelationalCondition cond, RegisterID left, TrustedImm32 right, int useConstantPool = 0)
barraclough@apple.com5ea68952009-07-17 21:56:28 +0000586 {
ossy@webkit.orga32a5272012-11-26 14:47:40 +0000587 internalCompare32(left, right);
barraclough@apple.com970af2c2009-08-13 05:58:36 +0000588 return Jump(m_assembler.jmp(ARMCondition(cond), useConstantPool));
barraclough@apple.com5ea68952009-07-17 21:56:28 +0000589 }
590
barraclough@apple.com03cd2482011-04-20 18:44:35 +0000591 Jump branch32(RelationalCondition cond, RegisterID left, Address right)
barraclough@apple.com5ea68952009-07-17 21:56:28 +0000592 {
eric@webkit.org734dd062009-08-20 00:02:24 +0000593 load32(right, ARMRegisters::S1);
594 return branch32(cond, left, ARMRegisters::S1);
barraclough@apple.com5ea68952009-07-17 21:56:28 +0000595 }
596
barraclough@apple.com03cd2482011-04-20 18:44:35 +0000597 Jump branch32(RelationalCondition cond, Address left, RegisterID right)
barraclough@apple.com5ea68952009-07-17 21:56:28 +0000598 {
eric@webkit.org734dd062009-08-20 00:02:24 +0000599 load32(left, ARMRegisters::S1);
600 return branch32(cond, ARMRegisters::S1, right);
barraclough@apple.com5ea68952009-07-17 21:56:28 +0000601 }
602
barraclough@apple.com03cd2482011-04-20 18:44:35 +0000603 Jump branch32(RelationalCondition cond, Address left, TrustedImm32 right)
barraclough@apple.com5ea68952009-07-17 21:56:28 +0000604 {
eric@webkit.org734dd062009-08-20 00:02:24 +0000605 load32(left, ARMRegisters::S1);
606 return branch32(cond, ARMRegisters::S1, right);
barraclough@apple.com5ea68952009-07-17 21:56:28 +0000607 }
608
barraclough@apple.com03cd2482011-04-20 18:44:35 +0000609 Jump branch32(RelationalCondition cond, BaseIndex left, TrustedImm32 right)
barraclough@apple.com5ea68952009-07-17 21:56:28 +0000610 {
eric@webkit.org734dd062009-08-20 00:02:24 +0000611 load32(left, ARMRegisters::S1);
612 return branch32(cond, ARMRegisters::S1, right);
barraclough@apple.com5ea68952009-07-17 21:56:28 +0000613 }
614
barraclough@apple.com03cd2482011-04-20 18:44:35 +0000615 Jump branch32WithUnalignedHalfWords(RelationalCondition cond, BaseIndex left, TrustedImm32 right)
eric@webkit.org16d65d12009-09-26 02:27:02 +0000616 {
617 load32WithUnalignedHalfWords(left, ARMRegisters::S1);
618 return branch32(cond, ARMRegisters::S1, right);
619 }
620
barraclough@apple.com03cd2482011-04-20 18:44:35 +0000621 Jump branchTest8(ResultCondition cond, Address address, TrustedImm32 mask = TrustedImm32(-1))
loki@webkit.org2acccd02010-03-09 09:36:06 +0000622 {
623 load8(address, ARMRegisters::S1);
624 return branchTest32(cond, ARMRegisters::S1, mask);
625 }
626
fpizlo@apple.comb75911b2012-06-13 20:53:52 +0000627 Jump branchTest8(ResultCondition cond, AbsoluteAddress address, TrustedImm32 mask = TrustedImm32(-1))
628 {
629 move(TrustedImmPtr(address.m_ptr), ARMRegisters::S1);
630 load8(Address(ARMRegisters::S1), ARMRegisters::S1);
631 return branchTest32(cond, ARMRegisters::S1, mask);
632 }
633
barraclough@apple.com03cd2482011-04-20 18:44:35 +0000634 Jump branchTest32(ResultCondition cond, RegisterID reg, RegisterID mask)
barraclough@apple.com5ea68952009-07-17 21:56:28 +0000635 {
636 ASSERT((cond == Zero) || (cond == NonZero));
commit-queue@webkit.orgb1409632012-08-14 11:28:25 +0000637 m_assembler.tst(reg, mask);
barraclough@apple.com5ea68952009-07-17 21:56:28 +0000638 return Jump(m_assembler.jmp(ARMCondition(cond)));
639 }
640
barraclough@apple.com03cd2482011-04-20 18:44:35 +0000641 Jump branchTest32(ResultCondition cond, RegisterID reg, TrustedImm32 mask = TrustedImm32(-1))
barraclough@apple.com5ea68952009-07-17 21:56:28 +0000642 {
643 ASSERT((cond == Zero) || (cond == NonZero));
eric@webkit.org734dd062009-08-20 00:02:24 +0000644 ARMWord w = m_assembler.getImm(mask.m_value, ARMRegisters::S0, true);
commit-queue@webkit.org3dfe8ce2012-08-07 22:55:04 +0000645 if (w & ARMAssembler::Op2InvertedImmediate)
commit-queue@webkit.orgb1409632012-08-14 11:28:25 +0000646 m_assembler.bics(ARMRegisters::S0, reg, w & ~ARMAssembler::Op2InvertedImmediate);
barraclough@apple.com5ea68952009-07-17 21:56:28 +0000647 else
commit-queue@webkit.orgb1409632012-08-14 11:28:25 +0000648 m_assembler.tst(reg, w);
barraclough@apple.com5ea68952009-07-17 21:56:28 +0000649 return Jump(m_assembler.jmp(ARMCondition(cond)));
650 }
651
barraclough@apple.com03cd2482011-04-20 18:44:35 +0000652 Jump branchTest32(ResultCondition cond, Address address, TrustedImm32 mask = TrustedImm32(-1))
barraclough@apple.com5ea68952009-07-17 21:56:28 +0000653 {
eric@webkit.org734dd062009-08-20 00:02:24 +0000654 load32(address, ARMRegisters::S1);
655 return branchTest32(cond, ARMRegisters::S1, mask);
barraclough@apple.com5ea68952009-07-17 21:56:28 +0000656 }
657
barraclough@apple.com03cd2482011-04-20 18:44:35 +0000658 Jump branchTest32(ResultCondition cond, BaseIndex address, TrustedImm32 mask = TrustedImm32(-1))
barraclough@apple.com5ea68952009-07-17 21:56:28 +0000659 {
eric@webkit.org734dd062009-08-20 00:02:24 +0000660 load32(address, ARMRegisters::S1);
661 return branchTest32(cond, ARMRegisters::S1, mask);
barraclough@apple.com5ea68952009-07-17 21:56:28 +0000662 }
663
664 Jump jump()
665 {
666 return Jump(m_assembler.jmp());
667 }
668
669 void jump(RegisterID target)
670 {
eric@webkit.org6a210e72010-04-22 13:24:56 +0000671 m_assembler.bx(target);
barraclough@apple.com5ea68952009-07-17 21:56:28 +0000672 }
673
674 void jump(Address address)
675 {
eric@webkit.org734dd062009-08-20 00:02:24 +0000676 load32(address, ARMRegisters::pc);
barraclough@apple.com5ea68952009-07-17 21:56:28 +0000677 }
678
zherczeg@webkit.orgd6e661f2012-07-05 07:04:16 +0000679 void jump(AbsoluteAddress address)
680 {
681 move(TrustedImmPtr(address.m_ptr), ARMRegisters::S0);
682 load32(Address(ARMRegisters::S0, 0), ARMRegisters::pc);
683 }
684
commit-queue@webkit.org7fb15112012-10-10 08:31:40 +0000685 void moveDoubleToInts(FPRegisterID src, RegisterID dest1, RegisterID dest2)
686 {
687 m_assembler.vmov(dest1, dest2, src);
688 }
689
ossy@webkit.org0d44f412013-03-06 17:39:37 +0000690 void moveIntsToDouble(RegisterID src1, RegisterID src2, FPRegisterID dest, FPRegisterID)
commit-queue@webkit.org7fb15112012-10-10 08:31:40 +0000691 {
commit-queue@webkit.org7fb15112012-10-10 08:31:40 +0000692 m_assembler.vmov(dest, src1, src2);
693 }
694
barraclough@apple.com03cd2482011-04-20 18:44:35 +0000695 Jump branchAdd32(ResultCondition cond, RegisterID src, RegisterID dest)
barraclough@apple.com5ea68952009-07-17 21:56:28 +0000696 {
mark.lam@apple.com3089c6b2013-05-21 16:44:01 +0000697 ASSERT((cond == Overflow) || (cond == Signed) || (cond == Zero)
698 || (cond == NonZero) || (cond == PositiveOrZero));
barraclough@apple.com5ea68952009-07-17 21:56:28 +0000699 add32(src, dest);
700 return Jump(m_assembler.jmp(ARMCondition(cond)));
701 }
702
zherczeg@webkit.orgd6e661f2012-07-05 07:04:16 +0000703 Jump branchAdd32(ResultCondition cond, RegisterID op1, RegisterID op2, RegisterID dest)
704 {
mark.lam@apple.com3089c6b2013-05-21 16:44:01 +0000705 ASSERT((cond == Overflow) || (cond == Signed) || (cond == Zero)
706 || (cond == NonZero) || (cond == PositiveOrZero));
zherczeg@webkit.orgd6e661f2012-07-05 07:04:16 +0000707 add32(op1, op2, dest);
708 return Jump(m_assembler.jmp(ARMCondition(cond)));
709 }
710
barraclough@apple.com03cd2482011-04-20 18:44:35 +0000711 Jump branchAdd32(ResultCondition cond, TrustedImm32 imm, RegisterID dest)
barraclough@apple.com5ea68952009-07-17 21:56:28 +0000712 {
mark.lam@apple.com3089c6b2013-05-21 16:44:01 +0000713 ASSERT((cond == Overflow) || (cond == Signed) || (cond == Zero)
714 || (cond == NonZero) || (cond == PositiveOrZero));
barraclough@apple.com5ea68952009-07-17 21:56:28 +0000715 add32(imm, dest);
716 return Jump(m_assembler.jmp(ARMCondition(cond)));
717 }
718
hausmann@webkit.org552d5cd2012-03-07 11:30:29 +0000719 Jump branchAdd32(ResultCondition cond, RegisterID src, TrustedImm32 imm, RegisterID dest)
720 {
mark.lam@apple.com3089c6b2013-05-21 16:44:01 +0000721 ASSERT((cond == Overflow) || (cond == Signed) || (cond == Zero)
722 || (cond == NonZero) || (cond == PositiveOrZero));
hausmann@webkit.org552d5cd2012-03-07 11:30:29 +0000723 add32(src, imm, dest);
724 return Jump(m_assembler.jmp(ARMCondition(cond)));
725 }
726
zherczeg@webkit.orgd6e661f2012-07-05 07:04:16 +0000727 Jump branchAdd32(ResultCondition cond, TrustedImm32 imm, AbsoluteAddress dest)
barraclough@apple.com5ea68952009-07-17 21:56:28 +0000728 {
mark.lam@apple.com3089c6b2013-05-21 16:44:01 +0000729 ASSERT((cond == Overflow) || (cond == Signed) || (cond == Zero)
730 || (cond == NonZero) || (cond == PositiveOrZero));
zherczeg@webkit.orgd6e661f2012-07-05 07:04:16 +0000731 add32(imm, dest);
732 return Jump(m_assembler.jmp(ARMCondition(cond)));
733 }
734
735 void mull32(RegisterID op1, RegisterID op2, RegisterID dest)
736 {
737 if (op2 == dest) {
738 if (op1 == dest) {
739 move(op2, ARMRegisters::S0);
740 op2 = ARMRegisters::S0;
741 } else {
742 // Swap the operands.
743 RegisterID tmp = op1;
744 op1 = op2;
745 op2 = tmp;
746 }
barraclough@apple.com5ea68952009-07-17 21:56:28 +0000747 }
commit-queue@webkit.orgb1409632012-08-14 11:28:25 +0000748 m_assembler.mull(ARMRegisters::S1, dest, op1, op2);
749 m_assembler.cmp(ARMRegisters::S1, m_assembler.asr(dest, 31));
barraclough@apple.com5ea68952009-07-17 21:56:28 +0000750 }
751
zherczeg@webkit.orgd6e661f2012-07-05 07:04:16 +0000752 Jump branchMul32(ResultCondition cond, RegisterID src1, RegisterID src2, RegisterID dest)
753 {
754 ASSERT((cond == Overflow) || (cond == Signed) || (cond == Zero) || (cond == NonZero));
755 if (cond == Overflow) {
756 mull32(src1, src2, dest);
757 cond = NonZero;
758 }
759 else
760 mul32(src1, src2, dest);
761 return Jump(m_assembler.jmp(ARMCondition(cond)));
762 }
763
barraclough@apple.com03cd2482011-04-20 18:44:35 +0000764 Jump branchMul32(ResultCondition cond, RegisterID src, RegisterID dest)
barraclough@apple.com5ea68952009-07-17 21:56:28 +0000765 {
zherczeg@webkit.orgd6e661f2012-07-05 07:04:16 +0000766 return branchMul32(cond, src, dest, dest);
barraclough@apple.com5ea68952009-07-17 21:56:28 +0000767 }
768
barraclough@apple.com03cd2482011-04-20 18:44:35 +0000769 Jump branchMul32(ResultCondition cond, TrustedImm32 imm, RegisterID src, RegisterID dest)
barraclough@apple.com5ea68952009-07-17 21:56:28 +0000770 {
771 ASSERT((cond == Overflow) || (cond == Signed) || (cond == Zero) || (cond == NonZero));
772 if (cond == Overflow) {
eric@webkit.org734dd062009-08-20 00:02:24 +0000773 move(imm, ARMRegisters::S0);
774 mull32(ARMRegisters::S0, src, dest);
barraclough@apple.com5ea68952009-07-17 21:56:28 +0000775 cond = NonZero;
776 }
777 else
778 mul32(imm, src, dest);
779 return Jump(m_assembler.jmp(ARMCondition(cond)));
780 }
781
barraclough@apple.com03cd2482011-04-20 18:44:35 +0000782 Jump branchSub32(ResultCondition cond, RegisterID src, RegisterID dest)
barraclough@apple.com5ea68952009-07-17 21:56:28 +0000783 {
784 ASSERT((cond == Overflow) || (cond == Signed) || (cond == Zero) || (cond == NonZero));
785 sub32(src, dest);
786 return Jump(m_assembler.jmp(ARMCondition(cond)));
787 }
788
barraclough@apple.com03cd2482011-04-20 18:44:35 +0000789 Jump branchSub32(ResultCondition cond, TrustedImm32 imm, RegisterID dest)
barraclough@apple.com5ea68952009-07-17 21:56:28 +0000790 {
791 ASSERT((cond == Overflow) || (cond == Signed) || (cond == Zero) || (cond == NonZero));
792 sub32(imm, dest);
793 return Jump(m_assembler.jmp(ARMCondition(cond)));
794 }
795
hausmann@webkit.org552d5cd2012-03-07 11:30:29 +0000796 Jump branchSub32(ResultCondition cond, RegisterID src, TrustedImm32 imm, RegisterID dest)
797 {
798 ASSERT((cond == Overflow) || (cond == Signed) || (cond == Zero) || (cond == NonZero));
799 sub32(src, imm, dest);
800 return Jump(m_assembler.jmp(ARMCondition(cond)));
801 }
802
commit-queue@webkit.org1e0469c2012-05-03 02:15:49 +0000803 Jump branchSub32(ResultCondition cond, RegisterID op1, RegisterID op2, RegisterID dest)
804 {
805 ASSERT((cond == Overflow) || (cond == Signed) || (cond == Zero) || (cond == NonZero));
commit-queue@webkit.orgb1409632012-08-14 11:28:25 +0000806 m_assembler.subs(dest, op1, op2);
commit-queue@webkit.org1e0469c2012-05-03 02:15:49 +0000807 return Jump(m_assembler.jmp(ARMCondition(cond)));
808 }
809
barraclough@apple.com03cd2482011-04-20 18:44:35 +0000810 Jump branchNeg32(ResultCondition cond, RegisterID srcDest)
ggaren@apple.com5a0ed292010-03-22 18:33:23 +0000811 {
812 ASSERT((cond == Overflow) || (cond == Signed) || (cond == Zero) || (cond == NonZero));
813 neg32(srcDest);
814 return Jump(m_assembler.jmp(ARMCondition(cond)));
815 }
816
barraclough@apple.com03cd2482011-04-20 18:44:35 +0000817 Jump branchOr32(ResultCondition cond, RegisterID src, RegisterID dest)
zoltan@webkit.org1916f842009-11-14 00:44:42 +0000818 {
819 ASSERT((cond == Signed) || (cond == Zero) || (cond == NonZero));
820 or32(src, dest);
821 return Jump(m_assembler.jmp(ARMCondition(cond)));
822 }
823
ossy@webkit.orga32a5272012-11-26 14:47:40 +0000824 PatchableJump patchableBranch32(RelationalCondition cond, RegisterID reg, TrustedImm32 imm)
825 {
826 internalCompare32(reg, imm);
827 Jump jump(m_assembler.loadBranchTarget(ARMRegisters::S1, ARMCondition(cond), true));
828 m_assembler.bx(ARMRegisters::S1, ARMCondition(cond));
829 return PatchableJump(jump);
830 }
831
barraclough@apple.com5ea68952009-07-17 21:56:28 +0000832 void breakpoint()
833 {
834 m_assembler.bkpt(0);
835 }
836
837 Call nearCall()
838 {
eric@webkit.org6a210e72010-04-22 13:24:56 +0000839 m_assembler.loadBranchTarget(ARMRegisters::S1, ARMAssembler::AL, true);
840 return Call(m_assembler.blx(ARMRegisters::S1), Call::LinkableNear);
barraclough@apple.com5ea68952009-07-17 21:56:28 +0000841 }
842
843 Call call(RegisterID target)
844 {
loki@webkit.orgea6cf182010-11-24 13:04:35 +0000845 return Call(m_assembler.blx(target), Call::None);
barraclough@apple.com5ea68952009-07-17 21:56:28 +0000846 }
847
848 void call(Address address)
849 {
850 call32(address.base, address.offset);
851 }
852
853 void ret()
854 {
eric@webkit.org6a210e72010-04-22 13:24:56 +0000855 m_assembler.bx(linkRegister);
barraclough@apple.com5ea68952009-07-17 21:56:28 +0000856 }
857
barraclough@apple.com03cd2482011-04-20 18:44:35 +0000858 void compare32(RelationalCondition cond, RegisterID left, RegisterID right, RegisterID dest)
barraclough@apple.com5ea68952009-07-17 21:56:28 +0000859 {
commit-queue@webkit.orgb1409632012-08-14 11:28:25 +0000860 m_assembler.cmp(left, right);
861 m_assembler.mov(dest, ARMAssembler::getOp2Byte(0));
862 m_assembler.mov(dest, ARMAssembler::getOp2Byte(1), ARMCondition(cond));
barraclough@apple.com5ea68952009-07-17 21:56:28 +0000863 }
864
barraclough@apple.com03cd2482011-04-20 18:44:35 +0000865 void compare32(RelationalCondition cond, RegisterID left, TrustedImm32 right, RegisterID dest)
barraclough@apple.com5ea68952009-07-17 21:56:28 +0000866 {
commit-queue@webkit.orgb1409632012-08-14 11:28:25 +0000867 m_assembler.cmp(left, m_assembler.getImm(right.m_value, ARMRegisters::S0));
868 m_assembler.mov(dest, ARMAssembler::getOp2Byte(0));
869 m_assembler.mov(dest, ARMAssembler::getOp2Byte(1), ARMCondition(cond));
barraclough@apple.com5ea68952009-07-17 21:56:28 +0000870 }
871
ossy@webkit.orgd2b2b7f2012-04-12 09:51:00 +0000872 void compare8(RelationalCondition cond, Address left, TrustedImm32 right, RegisterID dest)
fpizlo@apple.com9c149ea2012-04-12 01:13:07 +0000873 {
ossy@webkit.orgd2b2b7f2012-04-12 09:51:00 +0000874 load8(left, ARMRegisters::S1);
fpizlo@apple.com9c149ea2012-04-12 01:13:07 +0000875 compare32(cond, ARMRegisters::S1, right, dest);
876 }
877
barraclough@apple.com03cd2482011-04-20 18:44:35 +0000878 void test32(ResultCondition cond, RegisterID reg, TrustedImm32 mask, RegisterID dest)
barraclough@apple.com5ea68952009-07-17 21:56:28 +0000879 {
barraclough@apple.com5ea68952009-07-17 21:56:28 +0000880 if (mask.m_value == -1)
commit-queue@webkit.orgb1409632012-08-14 11:28:25 +0000881 m_assembler.cmp(0, reg);
barraclough@apple.com5ea68952009-07-17 21:56:28 +0000882 else
commit-queue@webkit.orgb1409632012-08-14 11:28:25 +0000883 m_assembler.tst(reg, m_assembler.getImm(mask.m_value, ARMRegisters::S0));
884 m_assembler.mov(dest, ARMAssembler::getOp2Byte(0));
885 m_assembler.mov(dest, ARMAssembler::getOp2Byte(1), ARMCondition(cond));
barraclough@apple.com5ea68952009-07-17 21:56:28 +0000886 }
887
barraclough@apple.com03cd2482011-04-20 18:44:35 +0000888 void test32(ResultCondition cond, Address address, TrustedImm32 mask, RegisterID dest)
commit-queue@webkit.org4fa9acd2011-02-01 14:40:03 +0000889 {
890 load32(address, ARMRegisters::S1);
barraclough@apple.com03cd2482011-04-20 18:44:35 +0000891 test32(cond, ARMRegisters::S1, mask, dest);
commit-queue@webkit.org4fa9acd2011-02-01 14:40:03 +0000892 }
893
barraclough@apple.com03cd2482011-04-20 18:44:35 +0000894 void test8(ResultCondition cond, Address address, TrustedImm32 mask, RegisterID dest)
zoltan@webkit.org1916f842009-11-14 00:44:42 +0000895 {
commit-queue@webkit.org4fa9acd2011-02-01 14:40:03 +0000896 load8(address, ARMRegisters::S1);
barraclough@apple.comcc5c3512011-04-20 19:02:01 +0000897 test32(cond, ARMRegisters::S1, mask, dest);
zoltan@webkit.org1916f842009-11-14 00:44:42 +0000898 }
899
oliver@apple.combe4e0672011-03-28 17:14:57 +0000900 void add32(TrustedImm32 imm, RegisterID src, RegisterID dest)
barraclough@apple.com5ea68952009-07-17 21:56:28 +0000901 {
commit-queue@webkit.orgb1409632012-08-14 11:28:25 +0000902 m_assembler.add(dest, src, m_assembler.getImm(imm.m_value, ARMRegisters::S0));
barraclough@apple.com5ea68952009-07-17 21:56:28 +0000903 }
904
oliver@apple.combe4e0672011-03-28 17:14:57 +0000905 void add32(TrustedImm32 imm, AbsoluteAddress address)
barraclough@apple.com5ea68952009-07-17 21:56:28 +0000906 {
paroga@webkit.org34f68fd2013-04-10 20:30:19 +0000907 load32(address.m_ptr, ARMRegisters::S1);
eric@webkit.org734dd062009-08-20 00:02:24 +0000908 add32(imm, ARMRegisters::S1);
paroga@webkit.org34f68fd2013-04-10 20:30:19 +0000909 store32(ARMRegisters::S1, address.m_ptr);
barraclough@apple.com5ea68952009-07-17 21:56:28 +0000910 }
911
commit-queue@webkit.orgdf4b9272012-12-12 08:00:33 +0000912 void add64(TrustedImm32 imm, AbsoluteAddress address)
913 {
914 ARMWord tmp;
915
916 move(TrustedImmPtr(address.m_ptr), ARMRegisters::S1);
917 m_assembler.dtrUp(ARMAssembler::LoadUint32, ARMRegisters::S0, ARMRegisters::S1, 0);
918
919 if ((tmp = ARMAssembler::getOp2(imm.m_value)) != ARMAssembler::InvalidImmediate)
920 m_assembler.adds(ARMRegisters::S0, ARMRegisters::S0, tmp);
921 else if ((tmp = ARMAssembler::getOp2(-imm.m_value)) != ARMAssembler::InvalidImmediate)
922 m_assembler.subs(ARMRegisters::S0, ARMRegisters::S0, tmp);
923 else {
924 m_assembler.adds(ARMRegisters::S0, ARMRegisters::S0, m_assembler.getImm(imm.m_value, ARMRegisters::S1));
925 move(TrustedImmPtr(address.m_ptr), ARMRegisters::S1);
926 }
927 m_assembler.dtrUp(ARMAssembler::StoreUint32, ARMRegisters::S0, ARMRegisters::S1, 0);
928
929 m_assembler.dtrUp(ARMAssembler::LoadUint32, ARMRegisters::S0, ARMRegisters::S1, sizeof(ARMWord));
930 if (imm.m_value >= 0)
931 m_assembler.adc(ARMRegisters::S0, ARMRegisters::S0, ARMAssembler::getOp2Byte(0));
932 else
933 m_assembler.sbc(ARMRegisters::S0, ARMRegisters::S0, ARMAssembler::getOp2Byte(0));
934 m_assembler.dtrUp(ARMAssembler::StoreUint32, ARMRegisters::S0, ARMRegisters::S1, sizeof(ARMWord));
935 }
936
oliver@apple.combe4e0672011-03-28 17:14:57 +0000937 void sub32(TrustedImm32 imm, AbsoluteAddress address)
barraclough@apple.com5ea68952009-07-17 21:56:28 +0000938 {
paroga@webkit.org34f68fd2013-04-10 20:30:19 +0000939 load32(address.m_ptr, ARMRegisters::S1);
eric@webkit.org734dd062009-08-20 00:02:24 +0000940 sub32(imm, ARMRegisters::S1);
paroga@webkit.org34f68fd2013-04-10 20:30:19 +0000941 store32(ARMRegisters::S1, address.m_ptr);
barraclough@apple.com5ea68952009-07-17 21:56:28 +0000942 }
943
barraclough@apple.com94e12c12011-03-13 21:26:16 +0000944 void load32(const void* address, RegisterID dest)
barraclough@apple.com5ea68952009-07-17 21:56:28 +0000945 {
commit-queue@webkit.orgb1409632012-08-14 11:28:25 +0000946 m_assembler.ldrUniqueImmediate(ARMRegisters::S0, reinterpret_cast<ARMWord>(address));
947 m_assembler.dtrUp(ARMAssembler::LoadUint32, dest, ARMRegisters::S0, 0);
barraclough@apple.com5ea68952009-07-17 21:56:28 +0000948 }
949
barraclough@apple.com03cd2482011-04-20 18:44:35 +0000950 Jump branch32(RelationalCondition cond, AbsoluteAddress left, RegisterID right)
barraclough@apple.com5ea68952009-07-17 21:56:28 +0000951 {
eric@webkit.org734dd062009-08-20 00:02:24 +0000952 load32(left.m_ptr, ARMRegisters::S1);
953 return branch32(cond, ARMRegisters::S1, right);
barraclough@apple.com5ea68952009-07-17 21:56:28 +0000954 }
ossy@webkit.orgd2b2b7f2012-04-12 09:51:00 +0000955
barraclough@apple.com03cd2482011-04-20 18:44:35 +0000956 Jump branch32(RelationalCondition cond, AbsoluteAddress left, TrustedImm32 right)
barraclough@apple.com5ea68952009-07-17 21:56:28 +0000957 {
eric@webkit.org734dd062009-08-20 00:02:24 +0000958 load32(left.m_ptr, ARMRegisters::S1);
959 return branch32(cond, ARMRegisters::S1, right);
barraclough@apple.com5ea68952009-07-17 21:56:28 +0000960 }
961
loki@webkit.org0f28f9b2010-11-20 22:02:36 +0000962 void relativeTableJump(RegisterID index, int scale)
963 {
964 ASSERT(scale >= 0 && scale <= 31);
commit-queue@webkit.orgb1409632012-08-14 11:28:25 +0000965 m_assembler.add(ARMRegisters::pc, ARMRegisters::pc, m_assembler.lsl(index, scale));
loki@webkit.org0f28f9b2010-11-20 22:02:36 +0000966
967 // NOP the default prefetching
commit-queue@webkit.orgb1409632012-08-14 11:28:25 +0000968 m_assembler.mov(ARMRegisters::r0, ARMRegisters::r0);
loki@webkit.org0f28f9b2010-11-20 22:02:36 +0000969 }
970
barraclough@apple.com5ea68952009-07-17 21:56:28 +0000971 Call call()
972 {
eric@webkit.org6a210e72010-04-22 13:24:56 +0000973 ensureSpace(2 * sizeof(ARMWord), sizeof(ARMWord));
974 m_assembler.loadBranchTarget(ARMRegisters::S1, ARMAssembler::AL, true);
975 return Call(m_assembler.blx(ARMRegisters::S1), Call::Linkable);
barraclough@apple.com5ea68952009-07-17 21:56:28 +0000976 }
977
978 Call tailRecursiveCall()
979 {
980 return Call::fromTailJump(jump());
981 }
982
983 Call makeTailRecursiveCall(Jump oldJump)
984 {
985 return Call::fromTailJump(oldJump);
986 }
987
oliver@apple.combe4e0672011-03-28 17:14:57 +0000988 DataLabelPtr moveWithPatch(TrustedImmPtr initialValue, RegisterID dest)
barraclough@apple.com5ea68952009-07-17 21:56:28 +0000989 {
990 DataLabelPtr dataLabel(this);
commit-queue@webkit.orgb1409632012-08-14 11:28:25 +0000991 m_assembler.ldrUniqueImmediate(dest, reinterpret_cast<ARMWord>(initialValue.m_value));
barraclough@apple.com5ea68952009-07-17 21:56:28 +0000992 return dataLabel;
993 }
994
barraclough@apple.com03cd2482011-04-20 18:44:35 +0000995 Jump branchPtrWithPatch(RelationalCondition cond, RegisterID left, DataLabelPtr& dataLabel, TrustedImmPtr initialRightValue = TrustedImmPtr(0))
barraclough@apple.com5ea68952009-07-17 21:56:28 +0000996 {
zherczeg@webkit.org5b49d582013-02-19 17:12:41 +0000997 ensureSpace(3 * sizeof(ARMWord), 2 * sizeof(ARMWord));
eric@webkit.org734dd062009-08-20 00:02:24 +0000998 dataLabel = moveWithPatch(initialRightValue, ARMRegisters::S1);
999 Jump jump = branch32(cond, left, ARMRegisters::S1, true);
barraclough@apple.com5ea68952009-07-17 21:56:28 +00001000 return jump;
1001 }
1002
barraclough@apple.com03cd2482011-04-20 18:44:35 +00001003 Jump branchPtrWithPatch(RelationalCondition cond, Address left, DataLabelPtr& dataLabel, TrustedImmPtr initialRightValue = TrustedImmPtr(0))
barraclough@apple.com5ea68952009-07-17 21:56:28 +00001004 {
eric@webkit.org734dd062009-08-20 00:02:24 +00001005 load32(left, ARMRegisters::S1);
zherczeg@webkit.org5b49d582013-02-19 17:12:41 +00001006 ensureSpace(3 * sizeof(ARMWord), 2 * sizeof(ARMWord));
eric@webkit.org734dd062009-08-20 00:02:24 +00001007 dataLabel = moveWithPatch(initialRightValue, ARMRegisters::S0);
1008 Jump jump = branch32(cond, ARMRegisters::S0, ARMRegisters::S1, true);
barraclough@apple.com5ea68952009-07-17 21:56:28 +00001009 return jump;
1010 }
1011
oliver@apple.combe4e0672011-03-28 17:14:57 +00001012 DataLabelPtr storePtrWithPatch(TrustedImmPtr initialValue, ImplicitAddress address)
barraclough@apple.com5ea68952009-07-17 21:56:28 +00001013 {
eric@webkit.org734dd062009-08-20 00:02:24 +00001014 DataLabelPtr dataLabel = moveWithPatch(initialValue, ARMRegisters::S1);
1015 store32(ARMRegisters::S1, address);
barraclough@apple.com5ea68952009-07-17 21:56:28 +00001016 return dataLabel;
1017 }
1018
1019 DataLabelPtr storePtrWithPatch(ImplicitAddress address)
1020 {
oliver@apple.combe4e0672011-03-28 17:14:57 +00001021 return storePtrWithPatch(TrustedImmPtr(0), address);
barraclough@apple.com5ea68952009-07-17 21:56:28 +00001022 }
1023
1024 // Floating point operators
barraclough@apple.com2326f422011-11-09 20:01:24 +00001025 static bool supportsFloatingPoint()
barraclough@apple.com5ea68952009-07-17 21:56:28 +00001026 {
zoltan@webkit.org212e83e2009-09-15 11:29:33 +00001027 return s_isVFPPresent;
barraclough@apple.com5ea68952009-07-17 21:56:28 +00001028 }
1029
barraclough@apple.com2326f422011-11-09 20:01:24 +00001030 static bool supportsFloatingPointTruncate()
barraclough@apple.com5ea68952009-07-17 21:56:28 +00001031 {
commit-queue@webkit.org4f9cceb2011-09-07 02:00:16 +00001032 return false;
barraclough@apple.com5ea68952009-07-17 21:56:28 +00001033 }
1034
barraclough@apple.com2326f422011-11-09 20:01:24 +00001035 static bool supportsFloatingPointSqrt()
oliver@apple.com2bd947e2010-04-29 03:57:16 +00001036 {
zherczeg@webkit.orgfa3e9212010-04-29 14:08:44 +00001037 return s_isVFPPresent;
oliver@apple.com2bd947e2010-04-29 03:57:16 +00001038 }
barraclough@apple.com2326f422011-11-09 20:01:24 +00001039 static bool supportsFloatingPointAbs() { return false; }
oliver@apple.com2bd947e2010-04-29 03:57:16 +00001040
zherczeg@webkit.orgd6e661f2012-07-05 07:04:16 +00001041 void loadFloat(BaseIndex address, FPRegisterID dest)
1042 {
1043 m_assembler.baseIndexTransferFloat(ARMAssembler::LoadFloat, dest, address.base, address.index, static_cast<int>(address.scale), address.offset);
1044 }
1045
barraclough@apple.com5ea68952009-07-17 21:56:28 +00001046 void loadDouble(ImplicitAddress address, FPRegisterID dest)
1047 {
zherczeg@webkit.orgd6e661f2012-07-05 07:04:16 +00001048 m_assembler.dataTransferFloat(ARMAssembler::LoadDouble, dest, address.base, address.offset);
1049 }
1050
1051 void loadDouble(BaseIndex address, FPRegisterID dest)
1052 {
1053 m_assembler.baseIndexTransferFloat(ARMAssembler::LoadDouble, dest, address.base, address.index, static_cast<int>(address.scale), address.offset);
barraclough@apple.com5ea68952009-07-17 21:56:28 +00001054 }
1055
oliver@apple.com2bd947e2010-04-29 03:57:16 +00001056 void loadDouble(const void* address, FPRegisterID dest)
zoltan@webkit.org1916f842009-11-14 00:44:42 +00001057 {
zherczeg@webkit.orgd6e661f2012-07-05 07:04:16 +00001058 move(TrustedImm32(reinterpret_cast<ARMWord>(address)), ARMRegisters::S0);
commit-queue@webkit.orgb1409632012-08-14 11:28:25 +00001059 m_assembler.doubleDtrUp(ARMAssembler::LoadDouble, dest, ARMRegisters::S0, 0);
zherczeg@webkit.orgd6e661f2012-07-05 07:04:16 +00001060 }
1061
1062 void storeFloat(FPRegisterID src, BaseIndex address)
1063 {
1064 m_assembler.baseIndexTransferFloat(ARMAssembler::StoreFloat, src, address.base, address.index, static_cast<int>(address.scale), address.offset);
zoltan@webkit.org1916f842009-11-14 00:44:42 +00001065 }
1066
barraclough@apple.com5ea68952009-07-17 21:56:28 +00001067 void storeDouble(FPRegisterID src, ImplicitAddress address)
1068 {
zherczeg@webkit.orgd6e661f2012-07-05 07:04:16 +00001069 m_assembler.dataTransferFloat(ARMAssembler::StoreDouble, src, address.base, address.offset);
1070 }
1071
1072 void storeDouble(FPRegisterID src, BaseIndex address)
1073 {
1074 m_assembler.baseIndexTransferFloat(ARMAssembler::StoreDouble, src, address.base, address.index, static_cast<int>(address.scale), address.offset);
1075 }
1076
1077 void storeDouble(FPRegisterID src, const void* address)
1078 {
1079 move(TrustedImm32(reinterpret_cast<ARMWord>(address)), ARMRegisters::S0);
1080 m_assembler.dataTransferFloat(ARMAssembler::StoreDouble, src, ARMRegisters::S0, 0);
1081 }
1082
1083 void moveDouble(FPRegisterID src, FPRegisterID dest)
1084 {
1085 if (src != dest)
commit-queue@webkit.orgb1409632012-08-14 11:28:25 +00001086 m_assembler.vmov_f64(dest, src);
barraclough@apple.com5ea68952009-07-17 21:56:28 +00001087 }
1088
1089 void addDouble(FPRegisterID src, FPRegisterID dest)
1090 {
commit-queue@webkit.orgb1409632012-08-14 11:28:25 +00001091 m_assembler.vadd_f64(dest, dest, src);
barraclough@apple.com5ea68952009-07-17 21:56:28 +00001092 }
1093
zherczeg@webkit.orgd6e661f2012-07-05 07:04:16 +00001094 void addDouble(FPRegisterID op1, FPRegisterID op2, FPRegisterID dest)
1095 {
commit-queue@webkit.orgb1409632012-08-14 11:28:25 +00001096 m_assembler.vadd_f64(dest, op1, op2);
zherczeg@webkit.orgd6e661f2012-07-05 07:04:16 +00001097 }
1098
barraclough@apple.com5ea68952009-07-17 21:56:28 +00001099 void addDouble(Address src, FPRegisterID dest)
1100 {
eric@webkit.org734dd062009-08-20 00:02:24 +00001101 loadDouble(src, ARMRegisters::SD0);
1102 addDouble(ARMRegisters::SD0, dest);
barraclough@apple.com5ea68952009-07-17 21:56:28 +00001103 }
1104
zherczeg@webkit.orgd6e661f2012-07-05 07:04:16 +00001105 void addDouble(AbsoluteAddress address, FPRegisterID dest)
1106 {
1107 loadDouble(address.m_ptr, ARMRegisters::SD0);
1108 addDouble(ARMRegisters::SD0, dest);
1109 }
1110
zoltan@webkit.org1916f842009-11-14 00:44:42 +00001111 void divDouble(FPRegisterID src, FPRegisterID dest)
1112 {
commit-queue@webkit.orgb1409632012-08-14 11:28:25 +00001113 m_assembler.vdiv_f64(dest, dest, src);
zoltan@webkit.org1916f842009-11-14 00:44:42 +00001114 }
1115
zherczeg@webkit.orgd6e661f2012-07-05 07:04:16 +00001116 void divDouble(FPRegisterID op1, FPRegisterID op2, FPRegisterID dest)
1117 {
commit-queue@webkit.orgb1409632012-08-14 11:28:25 +00001118 m_assembler.vdiv_f64(dest, op1, op2);
zherczeg@webkit.orgd6e661f2012-07-05 07:04:16 +00001119 }
1120
zoltan@webkit.org1916f842009-11-14 00:44:42 +00001121 void divDouble(Address src, FPRegisterID dest)
1122 {
oliver@apple.com5598c182013-01-23 22:25:07 +00001123 RELEASE_ASSERT_NOT_REACHED(); // Untested
zoltan@webkit.org1916f842009-11-14 00:44:42 +00001124 loadDouble(src, ARMRegisters::SD0);
1125 divDouble(ARMRegisters::SD0, dest);
1126 }
1127
barraclough@apple.com5ea68952009-07-17 21:56:28 +00001128 void subDouble(FPRegisterID src, FPRegisterID dest)
1129 {
commit-queue@webkit.orgb1409632012-08-14 11:28:25 +00001130 m_assembler.vsub_f64(dest, dest, src);
barraclough@apple.com5ea68952009-07-17 21:56:28 +00001131 }
1132
zherczeg@webkit.orgd6e661f2012-07-05 07:04:16 +00001133 void subDouble(FPRegisterID op1, FPRegisterID op2, FPRegisterID dest)
1134 {
commit-queue@webkit.orgb1409632012-08-14 11:28:25 +00001135 m_assembler.vsub_f64(dest, op1, op2);
zherczeg@webkit.orgd6e661f2012-07-05 07:04:16 +00001136 }
1137
barraclough@apple.com5ea68952009-07-17 21:56:28 +00001138 void subDouble(Address src, FPRegisterID dest)
1139 {
eric@webkit.org734dd062009-08-20 00:02:24 +00001140 loadDouble(src, ARMRegisters::SD0);
1141 subDouble(ARMRegisters::SD0, dest);
barraclough@apple.com5ea68952009-07-17 21:56:28 +00001142 }
1143
1144 void mulDouble(FPRegisterID src, FPRegisterID dest)
1145 {
commit-queue@webkit.orgb1409632012-08-14 11:28:25 +00001146 m_assembler.vmul_f64(dest, dest, src);
barraclough@apple.com5ea68952009-07-17 21:56:28 +00001147 }
1148
1149 void mulDouble(Address src, FPRegisterID dest)
1150 {
eric@webkit.org734dd062009-08-20 00:02:24 +00001151 loadDouble(src, ARMRegisters::SD0);
1152 mulDouble(ARMRegisters::SD0, dest);
barraclough@apple.com5ea68952009-07-17 21:56:28 +00001153 }
1154
zherczeg@webkit.orgd6e661f2012-07-05 07:04:16 +00001155 void mulDouble(FPRegisterID op1, FPRegisterID op2, FPRegisterID dest)
1156 {
commit-queue@webkit.orgb1409632012-08-14 11:28:25 +00001157 m_assembler.vmul_f64(dest, op1, op2);
zherczeg@webkit.orgd6e661f2012-07-05 07:04:16 +00001158 }
1159
zherczeg@webkit.orgfa3e9212010-04-29 14:08:44 +00001160 void sqrtDouble(FPRegisterID src, FPRegisterID dest)
oliver@apple.com2bd947e2010-04-29 03:57:16 +00001161 {
commit-queue@webkit.orgb1409632012-08-14 11:28:25 +00001162 m_assembler.vsqrt_f64(dest, src);
oliver@apple.com2bd947e2010-04-29 03:57:16 +00001163 }
oliver@apple.com5b6a0d32011-07-01 16:33:46 +00001164
zherczeg@webkit.orgd6e661f2012-07-05 07:04:16 +00001165 void absDouble(FPRegisterID src, FPRegisterID dest)
oliver@apple.com5b6a0d32011-07-01 16:33:46 +00001166 {
commit-queue@webkit.orgb1409632012-08-14 11:28:25 +00001167 m_assembler.vabs_f64(dest, src);
zherczeg@webkit.orgd6e661f2012-07-05 07:04:16 +00001168 }
1169
1170 void negateDouble(FPRegisterID src, FPRegisterID dest)
1171 {
commit-queue@webkit.orgb1409632012-08-14 11:28:25 +00001172 m_assembler.vneg_f64(dest, src);
oliver@apple.com5b6a0d32011-07-01 16:33:46 +00001173 }
oliver@apple.com2bd947e2010-04-29 03:57:16 +00001174
barraclough@apple.com5ea68952009-07-17 21:56:28 +00001175 void convertInt32ToDouble(RegisterID src, FPRegisterID dest)
1176 {
commit-queue@webkit.orgb1409632012-08-14 11:28:25 +00001177 m_assembler.vmov_vfp32(dest << 1, src);
1178 m_assembler.vcvt_f64_s32(dest, dest << 1);
barraclough@apple.com5ea68952009-07-17 21:56:28 +00001179 }
1180
zoltan@webkit.org1916f842009-11-14 00:44:42 +00001181 void convertInt32ToDouble(Address src, FPRegisterID dest)
1182 {
zoltan@webkit.org1916f842009-11-14 00:44:42 +00001183 load32(src, ARMRegisters::S1);
1184 convertInt32ToDouble(ARMRegisters::S1, dest);
1185 }
1186
1187 void convertInt32ToDouble(AbsoluteAddress src, FPRegisterID dest)
1188 {
zherczeg@webkit.orgd6e661f2012-07-05 07:04:16 +00001189 move(TrustedImmPtr(src.m_ptr), ARMRegisters::S1);
1190 load32(Address(ARMRegisters::S1), ARMRegisters::S1);
zoltan@webkit.org1916f842009-11-14 00:44:42 +00001191 convertInt32ToDouble(ARMRegisters::S1, dest);
1192 }
1193
zherczeg@webkit.orgd6e661f2012-07-05 07:04:16 +00001194 void convertFloatToDouble(FPRegisterID src, FPRegisterID dst)
1195 {
commit-queue@webkit.orgb1409632012-08-14 11:28:25 +00001196 m_assembler.vcvt_f64_f32(dst, src);
zherczeg@webkit.orgd6e661f2012-07-05 07:04:16 +00001197 }
1198
1199 void convertDoubleToFloat(FPRegisterID src, FPRegisterID dst)
1200 {
commit-queue@webkit.orgb1409632012-08-14 11:28:25 +00001201 m_assembler.vcvt_f32_f64(dst, src);
zherczeg@webkit.orgd6e661f2012-07-05 07:04:16 +00001202 }
1203
barraclough@apple.com5ea68952009-07-17 21:56:28 +00001204 Jump branchDouble(DoubleCondition cond, FPRegisterID left, FPRegisterID right)
1205 {
commit-queue@webkit.orgb1409632012-08-14 11:28:25 +00001206 m_assembler.vcmp_f64(left, right);
zherczeg@webkit.orgb6994142010-08-13 06:49:16 +00001207 m_assembler.vmrs_apsr();
ossy@webkit.orgcb981302009-11-06 07:28:56 +00001208 if (cond & DoubleConditionBitSpecial)
commit-queue@webkit.orgb1409632012-08-14 11:28:25 +00001209 m_assembler.cmp(ARMRegisters::S0, ARMRegisters::S0, ARMAssembler::VS);
ossy@webkit.orgcb981302009-11-06 07:28:56 +00001210 return Jump(m_assembler.jmp(static_cast<ARMAssembler::Condition>(cond & ~DoubleConditionMask)));
barraclough@apple.com5ea68952009-07-17 21:56:28 +00001211 }
1212
1213 // Truncates 'src' to an integer, and places the resulting 'dest'.
1214 // If the result is not representable as a 32 bit value, branch.
1215 // May also branch for some values that are representable in 32 bits
commit-queue@webkit.org4f9cceb2011-09-07 02:00:16 +00001216 // (specifically, in this case, INT_MIN).
zherczeg@webkit.orgd6e661f2012-07-05 07:04:16 +00001217 enum BranchTruncateType { BranchIfTruncateFailed, BranchIfTruncateSuccessful };
1218 Jump branchTruncateDoubleToInt32(FPRegisterID src, RegisterID dest, BranchTruncateType branchType = BranchIfTruncateFailed)
barraclough@apple.com5ea68952009-07-17 21:56:28 +00001219 {
zherczeg@webkit.orgd6e661f2012-07-05 07:04:16 +00001220 truncateDoubleToInt32(src, dest);
1221
commit-queue@webkit.orgb1409632012-08-14 11:28:25 +00001222 m_assembler.add(ARMRegisters::S0, dest, ARMAssembler::getOp2Byte(1));
1223 m_assembler.bic(ARMRegisters::S0, ARMRegisters::S0, ARMAssembler::getOp2Byte(1));
zherczeg@webkit.orgd6e661f2012-07-05 07:04:16 +00001224
1225 ARMWord w = ARMAssembler::getOp2(0x80000000);
commit-queue@webkit.org3dfe8ce2012-08-07 22:55:04 +00001226 ASSERT(w != ARMAssembler::InvalidImmediate);
commit-queue@webkit.orgb1409632012-08-14 11:28:25 +00001227 m_assembler.cmp(ARMRegisters::S0, w);
zherczeg@webkit.orgd6e661f2012-07-05 07:04:16 +00001228 return Jump(m_assembler.jmp(branchType == BranchIfTruncateFailed ? ARMAssembler::EQ : ARMAssembler::NE));
1229 }
1230
1231 Jump branchTruncateDoubleToUint32(FPRegisterID src, RegisterID dest, BranchTruncateType branchType = BranchIfTruncateFailed)
1232 {
1233 truncateDoubleToUint32(src, dest);
1234
commit-queue@webkit.orgb1409632012-08-14 11:28:25 +00001235 m_assembler.add(ARMRegisters::S0, dest, ARMAssembler::getOp2Byte(1));
1236 m_assembler.bic(ARMRegisters::S0, ARMRegisters::S0, ARMAssembler::getOp2Byte(1));
zherczeg@webkit.orgd6e661f2012-07-05 07:04:16 +00001237
commit-queue@webkit.orgb1409632012-08-14 11:28:25 +00001238 m_assembler.cmp(ARMRegisters::S0, ARMAssembler::getOp2Byte(0));
zherczeg@webkit.orgd6e661f2012-07-05 07:04:16 +00001239 return Jump(m_assembler.jmp(branchType == BranchIfTruncateFailed ? ARMAssembler::EQ : ARMAssembler::NE));
1240 }
1241
1242 // Result is undefined if the value is outside of the integer range.
1243 void truncateDoubleToInt32(FPRegisterID src, RegisterID dest)
1244 {
commit-queue@webkit.orgb1409632012-08-14 11:28:25 +00001245 m_assembler.vcvt_s32_f64(ARMRegisters::SD0 << 1, src);
1246 m_assembler.vmov_arm32(dest, ARMRegisters::SD0 << 1);
zherczeg@webkit.orgd6e661f2012-07-05 07:04:16 +00001247 }
1248
1249 void truncateDoubleToUint32(FPRegisterID src, RegisterID dest)
1250 {
commit-queue@webkit.orgb1409632012-08-14 11:28:25 +00001251 m_assembler.vcvt_u32_f64(ARMRegisters::SD0 << 1, src);
1252 m_assembler.vmov_arm32(dest, ARMRegisters::SD0 << 1);
barraclough@apple.com5ea68952009-07-17 21:56:28 +00001253 }
1254
ossy@webkit.orgcb981302009-11-06 07:28:56 +00001255 // Convert 'src' to an integer, and places the resulting 'dest'.
1256 // If the result is not representable as a 32 bit value, branch.
1257 // May also branch for some values that are representable in 32 bits
1258 // (specifically, in this case, 0).
commit-queue@webkit.org9f56bcd2013-04-25 22:52:34 +00001259 void branchConvertDoubleToInt32(FPRegisterID src, RegisterID dest, JumpList& failureCases, FPRegisterID, bool negZeroCheck = true)
ossy@webkit.orgcb981302009-11-06 07:28:56 +00001260 {
commit-queue@webkit.orgb1409632012-08-14 11:28:25 +00001261 m_assembler.vcvt_s32_f64(ARMRegisters::SD0 << 1, src);
1262 m_assembler.vmov_arm32(dest, ARMRegisters::SD0 << 1);
ossy@webkit.orgcb981302009-11-06 07:28:56 +00001263
1264 // Convert the integer result back to float & compare to the original value - if not equal or unordered (NaN) then jump.
commit-queue@webkit.orgb1409632012-08-14 11:28:25 +00001265 m_assembler.vcvt_f64_s32(ARMRegisters::SD0, ARMRegisters::SD0 << 1);
zoltan@webkit.org086fa8f2009-11-17 07:16:22 +00001266 failureCases.append(branchDouble(DoubleNotEqualOrUnordered, src, ARMRegisters::SD0));
ossy@webkit.orgcb981302009-11-06 07:28:56 +00001267
1268 // If the result is zero, it might have been -0.0, and 0.0 equals to -0.0
commit-queue@webkit.org9f56bcd2013-04-25 22:52:34 +00001269 if (negZeroCheck)
1270 failureCases.append(branchTest32(Zero, dest));
ossy@webkit.orgcb981302009-11-06 07:28:56 +00001271 }
1272
barraclough@apple.com07d783c2011-01-07 00:38:37 +00001273 Jump branchDoubleNonZero(FPRegisterID reg, FPRegisterID scratch)
zoltan@webkit.org1916f842009-11-14 00:44:42 +00001274 {
commit-queue@webkit.orgb1409632012-08-14 11:28:25 +00001275 m_assembler.mov(ARMRegisters::S0, ARMAssembler::getOp2Byte(0));
barraclough@apple.com07d783c2011-01-07 00:38:37 +00001276 convertInt32ToDouble(ARMRegisters::S0, scratch);
1277 return branchDouble(DoubleNotEqual, reg, scratch);
1278 }
1279
1280 Jump branchDoubleZeroOrNaN(FPRegisterID reg, FPRegisterID scratch)
1281 {
commit-queue@webkit.orgb1409632012-08-14 11:28:25 +00001282 m_assembler.mov(ARMRegisters::S0, ARMAssembler::getOp2Byte(0));
barraclough@apple.com07d783c2011-01-07 00:38:37 +00001283 convertInt32ToDouble(ARMRegisters::S0, scratch);
1284 return branchDouble(DoubleEqualOrUnordered, reg, scratch);
zoltan@webkit.org1916f842009-11-14 00:44:42 +00001285 }
1286
zherczeg@webkit.orgd6e661f2012-07-05 07:04:16 +00001287 // Invert a relational condition, e.g. == becomes !=, < becomes >=, etc.
1288 static RelationalCondition invert(RelationalCondition cond)
1289 {
1290 ASSERT((static_cast<uint32_t>(cond & 0x0fffffff)) == 0 && static_cast<uint32_t>(cond) < static_cast<uint32_t>(ARMAssembler::AL));
1291 return static_cast<RelationalCondition>(cond ^ 0x10000000);
1292 }
1293
oliver@apple.com31df1c82011-05-20 01:33:46 +00001294 void nop()
1295 {
1296 m_assembler.nop();
1297 }
1298
ossy@webkit.org699a8772011-11-30 11:06:29 +00001299 static FunctionPtr readCallTarget(CodeLocationCall call)
1300 {
1301 return FunctionPtr(reinterpret_cast<void(*)()>(ARMAssembler::readCallTarget(call.dataLocation())));
1302 }
1303
fpizlo@apple.comb75911b2012-06-13 20:53:52 +00001304 static void replaceWithJump(CodeLocationLabel instructionStart, CodeLocationLabel destination)
1305 {
zherczeg@webkit.orgd6e661f2012-07-05 07:04:16 +00001306 ARMAssembler::replaceWithJump(instructionStart.dataLocation(), destination.dataLocation());
fpizlo@apple.comb75911b2012-06-13 20:53:52 +00001307 }
1308
1309 static ptrdiff_t maxJumpReplacementSize()
1310 {
zherczeg@webkit.orgd6e661f2012-07-05 07:04:16 +00001311 ARMAssembler::maxJumpReplacementSize();
fpizlo@apple.comb75911b2012-06-13 20:53:52 +00001312 return 0;
1313 }
1314
ossy@webkit.org180434a2012-11-13 08:53:09 +00001315 static bool canJumpReplacePatchableBranchPtrWithPatch() { return false; }
1316
ossy@webkit.org556988512012-11-23 15:32:46 +00001317 static CodeLocationLabel startOfPatchableBranchPtrWithPatchOnAddress(CodeLocationDataLabelPtr)
ossy@webkit.org180434a2012-11-13 08:53:09 +00001318 {
1319 UNREACHABLE_FOR_PLATFORM();
ossy@webkit.orgce467042012-11-14 14:51:59 +00001320 return CodeLocationLabel();
ossy@webkit.org180434a2012-11-13 08:53:09 +00001321 }
1322
ossy@webkit.org556988512012-11-23 15:32:46 +00001323 static CodeLocationLabel startOfBranchPtrWithPatchOnRegister(CodeLocationDataLabelPtr label)
1324 {
1325 return label.labelAtOffset(0);
1326 }
1327
1328 static void revertJumpReplacementToBranchPtrWithPatch(CodeLocationLabel instructionStart, RegisterID reg, void* initialValue)
1329 {
zherczeg@webkit.org5b49d582013-02-19 17:12:41 +00001330 ARMAssembler::revertBranchPtrWithPatch(instructionStart.dataLocation(), reg, reinterpret_cast<uintptr_t>(initialValue) & 0xffff);
ossy@webkit.org556988512012-11-23 15:32:46 +00001331 }
1332
ossy@webkit.org0d44f412013-03-06 17:39:37 +00001333 static void revertJumpReplacementToPatchableBranchPtrWithPatch(CodeLocationLabel, Address, void*)
ossy@webkit.org180434a2012-11-13 08:53:09 +00001334 {
1335 UNREACHABLE_FOR_PLATFORM();
1336 }
1337
oliver@apple.comc3a5b8c2013-07-25 04:01:38 +00001338#if USE(MASM_PROBE)
1339 struct CPUState {
1340 #define DECLARE_REGISTER(_type, _regName) \
1341 _type _regName;
1342 FOR_EACH_CPU_REGISTER(DECLARE_REGISTER)
1343 #undef DECLARE_REGISTER
1344 };
1345
1346 struct ProbeContext;
1347 typedef void (*ProbeFunction)(struct ProbeContext*);
1348
1349 struct ProbeContext {
1350 ProbeFunction probeFunction;
1351 void* arg1;
1352 void* arg2;
oliver@apple.comc3a5b8c2013-07-25 04:01:38 +00001353 CPUState cpu;
1354
1355 void dump(const char* indentation = 0);
1356 private:
1357 void dumpCPURegisters(const char* indentation);
1358 };
1359
1360 // For details about probe(), see comment in MacroAssemblerX86_64.h.
1361 void probe(ProbeFunction, void* arg1 = 0, void* arg2 = 0);
1362#endif // USE(MASM_PROBE)
1363
barraclough@apple.com5ea68952009-07-17 21:56:28 +00001364protected:
barraclough@apple.com03cd2482011-04-20 18:44:35 +00001365 ARMAssembler::Condition ARMCondition(RelationalCondition cond)
1366 {
1367 return static_cast<ARMAssembler::Condition>(cond);
1368 }
1369
1370 ARMAssembler::Condition ARMCondition(ResultCondition cond)
barraclough@apple.com5ea68952009-07-17 21:56:28 +00001371 {
1372 return static_cast<ARMAssembler::Condition>(cond);
1373 }
1374
barraclough@apple.com970af2c2009-08-13 05:58:36 +00001375 void ensureSpace(int insnSpace, int constSpace)
1376 {
1377 m_assembler.ensureSpace(insnSpace, constSpace);
1378 }
1379
1380 int sizeOfConstantPool()
1381 {
1382 return m_assembler.sizeOfConstantPool();
1383 }
1384
barraclough@apple.com5ea68952009-07-17 21:56:28 +00001385 void call32(RegisterID base, int32_t offset)
1386 {
zherczeg@webkit.orgd6e661f2012-07-05 07:04:16 +00001387 load32(Address(base, offset), ARMRegisters::S1);
1388 m_assembler.blx(ARMRegisters::S1);
barraclough@apple.com5ea68952009-07-17 21:56:28 +00001389 }
1390
barraclough@apple.com96e73432009-07-22 03:24:34 +00001391private:
1392 friend class LinkBuffer;
1393 friend class RepatchBuffer;
1394
ossy@webkit.orga32a5272012-11-26 14:47:40 +00001395 void internalCompare32(RegisterID left, TrustedImm32 right)
1396 {
1397 ARMWord tmp = (static_cast<unsigned>(right.m_value) == 0x80000000) ? ARMAssembler::InvalidImmediate : m_assembler.getOp2(-right.m_value);
1398 if (tmp != ARMAssembler::InvalidImmediate)
1399 m_assembler.cmn(left, tmp);
1400 else
1401 m_assembler.cmp(left, m_assembler.getImm(right.m_value, ARMRegisters::S0));
1402 }
1403
barraclough@apple.com96e73432009-07-22 03:24:34 +00001404 static void linkCall(void* code, Call call, FunctionPtr function)
1405 {
barraclough@apple.com0d15b9e2011-05-26 04:12:41 +00001406 ARMAssembler::linkCall(code, call.m_label, function.value());
barraclough@apple.com96e73432009-07-22 03:24:34 +00001407 }
1408
1409 static void repatchCall(CodeLocationCall call, CodeLocationLabel destination)
1410 {
1411 ARMAssembler::relinkCall(call.dataLocation(), destination.executableAddress());
1412 }
1413
1414 static void repatchCall(CodeLocationCall call, FunctionPtr destination)
1415 {
1416 ARMAssembler::relinkCall(call.dataLocation(), destination.executableAddress());
1417 }
1418
oliver@apple.comc3a5b8c2013-07-25 04:01:38 +00001419#if USE(MASM_PROBE)
1420 inline TrustedImm32 trustedImm32FromPtr(void* ptr)
1421 {
1422 return TrustedImm32(TrustedImmPtr(ptr));
1423 }
1424
1425 inline TrustedImm32 trustedImm32FromPtr(ProbeFunction function)
1426 {
1427 return TrustedImm32(TrustedImmPtr(reinterpret_cast<void*>(function)));
1428 }
1429
1430 inline TrustedImm32 trustedImm32FromPtr(void (*function)())
1431 {
1432 return TrustedImm32(TrustedImmPtr(reinterpret_cast<void*>(function)));
1433 }
1434#endif
1435
zoltan@webkit.org212e83e2009-09-15 11:29:33 +00001436 static const bool s_isVFPPresent;
barraclough@apple.com5ea68952009-07-17 21:56:28 +00001437};
1438
1439}
1440
mjs@apple.comcc668212010-01-04 11:38:56 +00001441#endif // ENABLE(ASSEMBLER) && CPU(ARM_TRADITIONAL)
barraclough@apple.com5ea68952009-07-17 21:56:28 +00001442
1443#endif // MacroAssemblerARM_h