Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(264)

Side by Side Diff: runtime/vm/assembler_arm_test.cc

Issue 15822008: Implements intrinsics for ARM. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 7 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « runtime/vm/assembler_arm.cc ('k') | runtime/vm/disassembler_arm.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 #include "vm/globals.h" 5 #include "vm/globals.h"
6 #if defined(TARGET_ARCH_ARM) 6 #if defined(TARGET_ARCH_ARM)
7 7
8 #include "vm/assembler.h" 8 #include "vm/assembler.h"
9 #include "vm/os.h" 9 #include "vm/os.h"
10 #include "vm/unit_test.h" 10 #include "vm/unit_test.h"
11 #include "vm/virtual_memory.h" 11 #include "vm/virtual_memory.h"
12 12
13 namespace dart { 13 namespace dart {
14 14
15 #define __ assembler-> 15 #define __ assembler->
16 16
17 17
18 ASSEMBLER_TEST_GENERATE(Simple, assembler) { 18 ASSEMBLER_TEST_GENERATE(Simple, assembler) {
19 __ mov(R0, ShifterOperand(42)); 19 __ mov(R0, ShifterOperand(42));
20 __ mov(PC, ShifterOperand(LR)); 20 __ bx(LR);
21 } 21 }
22 22
23 23
24 ASSEMBLER_TEST_RUN(Simple, test) { 24 ASSEMBLER_TEST_RUN(Simple, test) {
25 typedef int (*SimpleCode)(); 25 typedef int (*SimpleCode)();
26 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry())); 26 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry()));
27 } 27 }
28 28
29 29
30 ASSEMBLER_TEST_GENERATE(MoveNegated, assembler) { 30 ASSEMBLER_TEST_GENERATE(MoveNegated, assembler) {
31 __ mvn(R0, ShifterOperand(42)); 31 __ mvn(R0, ShifterOperand(42));
32 __ mov(PC, ShifterOperand(LR)); 32 __ bx(LR);
33 } 33 }
34 34
35 35
36 ASSEMBLER_TEST_RUN(MoveNegated, test) { 36 ASSEMBLER_TEST_RUN(MoveNegated, test) {
37 EXPECT(test != NULL); 37 EXPECT(test != NULL);
38 typedef int (*MoveNegated)(); 38 typedef int (*MoveNegated)();
39 EXPECT_EQ(~42, EXECUTE_TEST_CODE_INT32(MoveNegated, test->entry())); 39 EXPECT_EQ(~42, EXECUTE_TEST_CODE_INT32(MoveNegated, test->entry()));
40 } 40 }
41 41
42 42
43 ASSEMBLER_TEST_GENERATE(MoveRotImm, assembler) { 43 ASSEMBLER_TEST_GENERATE(MoveRotImm, assembler) {
44 ShifterOperand shifter_op; 44 ShifterOperand shifter_op;
45 EXPECT(ShifterOperand::CanHold(0x00550000, &shifter_op)); 45 EXPECT(ShifterOperand::CanHold(0x00550000, &shifter_op));
46 __ mov(R0, shifter_op); 46 __ mov(R0, shifter_op);
47 EXPECT(ShifterOperand::CanHold(0x30000003, &shifter_op)); 47 EXPECT(ShifterOperand::CanHold(0x30000003, &shifter_op));
48 __ add(R0, R0, shifter_op); 48 __ add(R0, R0, shifter_op);
49 __ mov(PC, ShifterOperand(LR)); 49 __ bx(LR);
50 } 50 }
51 51
52 52
53 ASSEMBLER_TEST_RUN(MoveRotImm, test) { 53 ASSEMBLER_TEST_RUN(MoveRotImm, test) {
54 EXPECT(test != NULL); 54 EXPECT(test != NULL);
55 typedef int (*MoveRotImm)(); 55 typedef int (*MoveRotImm)();
56 EXPECT_EQ(0x30550003, EXECUTE_TEST_CODE_INT32(MoveRotImm, test->entry())); 56 EXPECT_EQ(0x30550003, EXECUTE_TEST_CODE_INT32(MoveRotImm, test->entry()));
57 } 57 }
58 58
59 59
60 ASSEMBLER_TEST_GENERATE(MovImm16, assembler) { 60 ASSEMBLER_TEST_GENERATE(MovImm16, assembler) {
61 __ movw(R0, 0x5678); 61 __ movw(R0, 0x5678);
62 __ movt(R0, 0x1234); 62 __ movt(R0, 0x1234);
63 __ mov(PC, ShifterOperand(LR)); 63 __ bx(LR);
64 } 64 }
65 65
66 66
67 ASSEMBLER_TEST_RUN(MovImm16, test) { 67 ASSEMBLER_TEST_RUN(MovImm16, test) {
68 EXPECT(test != NULL); 68 EXPECT(test != NULL);
69 typedef int (*MovImm16)(); 69 typedef int (*MovImm16)();
70 EXPECT_EQ(0x12345678, EXECUTE_TEST_CODE_INT32(MovImm16, test->entry())); 70 EXPECT_EQ(0x12345678, EXECUTE_TEST_CODE_INT32(MovImm16, test->entry()));
71 } 71 }
72 72
73 73
74 ASSEMBLER_TEST_GENERATE(LoadImmediate, assembler) { 74 ASSEMBLER_TEST_GENERATE(LoadImmediate, assembler) {
75 __ mov(R0, ShifterOperand(0)); 75 __ mov(R0, ShifterOperand(0));
76 __ cmp(R0, ShifterOperand(0)); 76 __ cmp(R0, ShifterOperand(0));
77 __ LoadImmediate(R0, 0x12345678, EQ); 77 __ LoadImmediate(R0, 0x12345678, EQ);
78 __ LoadImmediate(R0, 0x87654321, NE); 78 __ LoadImmediate(R0, 0x87654321, NE);
79 __ mov(PC, ShifterOperand(LR)); 79 __ bx(LR);
80 } 80 }
81 81
82 82
83 ASSEMBLER_TEST_RUN(LoadImmediate, test) { 83 ASSEMBLER_TEST_RUN(LoadImmediate, test) {
84 EXPECT(test != NULL); 84 EXPECT(test != NULL);
85 typedef int (*LoadImmediate)(); 85 typedef int (*LoadImmediate)();
86 EXPECT_EQ(0x12345678, EXECUTE_TEST_CODE_INT32(LoadImmediate, test->entry())); 86 EXPECT_EQ(0x12345678, EXECUTE_TEST_CODE_INT32(LoadImmediate, test->entry()));
87 } 87 }
88 88
89 89
90 ASSEMBLER_TEST_GENERATE(Vmov, assembler) { 90 ASSEMBLER_TEST_GENERATE(Vmov, assembler) {
91 __ mov(R3, ShifterOperand(43)); 91 __ mov(R3, ShifterOperand(43));
92 __ mov(R1, ShifterOperand(41)); 92 __ mov(R1, ShifterOperand(41));
93 __ vmovsrr(S1, R1, R3); // S1:S2 = 41:43 93 __ vmovsrr(S1, R1, R3); // S1:S2 = 41:43
94 __ vmovs(S0, S2); // S0 = S2, S0:S1 == 43:41 94 __ vmovs(S0, S2); // S0 = S2, S0:S1 == 43:41
95 __ vmovd(D2, D0); // D2 = D0, S4:S5 == 43:41 95 __ vmovd(D2, D0); // D2 = D0, S4:S5 == 43:41
96 __ vmovrs(R3, S5); // R3 = S5, R3 == 41 96 __ vmovrs(R3, S5); // R3 = S5, R3 == 41
97 __ vmovrrs(R1, R2, S4); // R1:R2 = S4:S5, R1:R2 == 43:41 97 __ vmovrrs(R1, R2, S4); // R1:R2 = S4:S5, R1:R2 == 43:41
98 __ vmovdrr(D3, R3, R2); // D3 = R3:R2, S6:S7 == 41:41 98 __ vmovdrr(D3, R3, R2); // D3 = R3:R2, S6:S7 == 41:41
99 __ vmovsr(S7, R1); // S7 = R1, S6:S7 == 41:43 99 __ vmovsr(S7, R1); // S7 = R1, S6:S7 == 41:43
100 __ vmovrrd(R0, R1, D3); // R0:R1 = D3, R0:R1 == 41:43 100 __ vmovrrd(R0, R1, D3); // R0:R1 = D3, R0:R1 == 41:43
101 __ sub(R0, R1, ShifterOperand(R0)); // 43-41 101 __ sub(R0, R1, ShifterOperand(R0)); // 43-41
102 __ mov(PC, ShifterOperand(LR)); 102 __ bx(LR);
103 } 103 }
104 104
105 105
106 ASSEMBLER_TEST_RUN(Vmov, test) { 106 ASSEMBLER_TEST_RUN(Vmov, test) {
107 EXPECT(test != NULL); 107 EXPECT(test != NULL);
108 typedef int (*Vmov)(); 108 typedef int (*Vmov)();
109 EXPECT_EQ(2, EXECUTE_TEST_CODE_INT32(Vmov, test->entry())); 109 EXPECT_EQ(2, EXECUTE_TEST_CODE_INT32(Vmov, test->entry()));
110 } 110 }
111 111
112 112
113 ASSEMBLER_TEST_GENERATE(SingleVLoadStore, assembler) { 113 ASSEMBLER_TEST_GENERATE(SingleVLoadStore, assembler) {
114 __ LoadImmediate(R0, bit_cast<int32_t, float>(12.3f)); 114 __ LoadImmediate(R0, bit_cast<int32_t, float>(12.3f));
115 __ mov(R2, ShifterOperand(SP)); 115 __ mov(R2, ShifterOperand(SP));
116 __ str(R0, Address(SP, (-kWordSize * 30), Address::PreIndex)); 116 __ str(R0, Address(SP, (-kWordSize * 30), Address::PreIndex));
117 __ vldrs(S0, Address(R2, (-kWordSize * 30))); 117 __ vldrs(S0, Address(R2, (-kWordSize * 30)));
118 __ vadds(S0, S0, S0); 118 __ vadds(S0, S0, S0);
119 __ vstrs(S0, Address(R2, (-kWordSize * 30))); 119 __ vstrs(S0, Address(R2, (-kWordSize * 30)));
120 __ ldr(R0, Address(SP, (kWordSize * 30), Address::PostIndex)); 120 __ ldr(R0, Address(SP, (kWordSize * 30), Address::PostIndex));
121 __ mov(PC, ShifterOperand(LR)); 121 __ bx(LR);
122 } 122 }
123 123
124 124
125 ASSEMBLER_TEST_RUN(SingleVLoadStore, test) { 125 ASSEMBLER_TEST_RUN(SingleVLoadStore, test) {
126 EXPECT(test != NULL); 126 EXPECT(test != NULL);
127 typedef float (*SingleVLoadStore)(); 127 typedef float (*SingleVLoadStore)();
128 float res = EXECUTE_TEST_CODE_FLOAT(SingleVLoadStore, test->entry()); 128 float res = EXECUTE_TEST_CODE_FLOAT(SingleVLoadStore, test->entry());
129 EXPECT_FLOAT_EQ(2*12.3f, res, 0.001f); 129 EXPECT_FLOAT_EQ(2*12.3f, res, 0.001f);
130 } 130 }
131 131
132 132
133 ASSEMBLER_TEST_GENERATE(SingleVShiftLoadStore, assembler) { 133 ASSEMBLER_TEST_GENERATE(SingleVShiftLoadStore, assembler) {
134 __ LoadImmediate(R0, bit_cast<int32_t, float>(12.3f)); 134 __ LoadImmediate(R0, bit_cast<int32_t, float>(12.3f));
135 __ mov(R2, ShifterOperand(SP)); 135 __ mov(R2, ShifterOperand(SP));
136 // Expressing __str(R0, Address(SP, (-kWordSize * 32), Address::PreIndex)); 136 // Expressing __str(R0, Address(SP, (-kWordSize * 32), Address::PreIndex));
137 // as: 137 // as:
138 __ mov(R1, ShifterOperand(kWordSize)); 138 __ mov(R1, ShifterOperand(kWordSize));
139 __ str(R0, Address(SP, R1, LSL, 5, Address::NegPreIndex)); 139 __ str(R0, Address(SP, R1, LSL, 5, Address::NegPreIndex));
140 __ vldrs(S0, Address(R2, (-kWordSize * 32))); 140 __ vldrs(S0, Address(R2, (-kWordSize * 32)));
141 __ vadds(S0, S0, S0); 141 __ vadds(S0, S0, S0);
142 __ vstrs(S0, Address(R2, (-kWordSize * 32))); 142 __ vstrs(S0, Address(R2, (-kWordSize * 32)));
143 // Expressing __ldr(R0, Address(SP, (kWordSize * 32), Address::PostIndex)); 143 // Expressing __ldr(R0, Address(SP, (kWordSize * 32), Address::PostIndex));
144 // as: 144 // as:
145 __ ldr(R0, Address(SP, R1, LSL, 5, Address::PostIndex)); 145 __ ldr(R0, Address(SP, R1, LSL, 5, Address::PostIndex));
146 __ mov(PC, ShifterOperand(LR)); 146 __ bx(LR);
147 } 147 }
148 148
149 149
150 ASSEMBLER_TEST_RUN(SingleVShiftLoadStore, test) { 150 ASSEMBLER_TEST_RUN(SingleVShiftLoadStore, test) {
151 EXPECT(test != NULL); 151 EXPECT(test != NULL);
152 typedef float (*SingleVLoadStore)(); 152 typedef float (*SingleVLoadStore)();
153 float res = EXECUTE_TEST_CODE_FLOAT(SingleVLoadStore, test->entry()); 153 float res = EXECUTE_TEST_CODE_FLOAT(SingleVLoadStore, test->entry());
154 EXPECT_FLOAT_EQ(2*12.3f, res, 0.001f); 154 EXPECT_FLOAT_EQ(2*12.3f, res, 0.001f);
155 } 155 }
156 156
157 157
158 ASSEMBLER_TEST_GENERATE(DoubleVLoadStore, assembler) { 158 ASSEMBLER_TEST_GENERATE(DoubleVLoadStore, assembler) {
159 int64_t value = bit_cast<int64_t, double>(12.3); 159 int64_t value = bit_cast<int64_t, double>(12.3);
160 __ LoadImmediate(R0, Utils::Low32Bits(value)); 160 __ LoadImmediate(R0, Utils::Low32Bits(value));
161 __ LoadImmediate(R1, Utils::High32Bits(value)); 161 __ LoadImmediate(R1, Utils::High32Bits(value));
162 __ mov(R2, ShifterOperand(SP)); 162 __ mov(R2, ShifterOperand(SP));
163 __ str(R0, Address(SP, (-kWordSize * 30), Address::PreIndex)); 163 __ str(R0, Address(SP, (-kWordSize * 30), Address::PreIndex));
164 __ str(R1, Address(R2, (-kWordSize * 29))); 164 __ str(R1, Address(R2, (-kWordSize * 29)));
165 __ vldrd(D0, Address(R2, (-kWordSize * 30))); 165 __ vldrd(D0, Address(R2, (-kWordSize * 30)));
166 __ vaddd(D0, D0, D0); 166 __ vaddd(D0, D0, D0);
167 __ vstrd(D0, Address(R2, (-kWordSize * 30))); 167 __ vstrd(D0, Address(R2, (-kWordSize * 30)));
168 __ ldr(R1, Address(R2, (-kWordSize * 29))); 168 __ ldr(R1, Address(R2, (-kWordSize * 29)));
169 __ ldr(R0, Address(SP, (kWordSize * 30), Address::PostIndex)); 169 __ ldr(R0, Address(SP, (kWordSize * 30), Address::PostIndex));
170 __ mov(PC, ShifterOperand(LR)); 170 __ bx(LR);
171 } 171 }
172 172
173 173
174 ASSEMBLER_TEST_RUN(DoubleVLoadStore, test) { 174 ASSEMBLER_TEST_RUN(DoubleVLoadStore, test) {
175 EXPECT(test != NULL); 175 EXPECT(test != NULL);
176 typedef double (*DoubleVLoadStore)(); 176 typedef double (*DoubleVLoadStore)();
177 double res = EXECUTE_TEST_CODE_DOUBLE(DoubleVLoadStore, test->entry()); 177 double res = EXECUTE_TEST_CODE_DOUBLE(DoubleVLoadStore, test->entry());
178 EXPECT_FLOAT_EQ(2*12.3, res, 0.001); 178 EXPECT_FLOAT_EQ(2*12.3, res, 0.001);
179 } 179 }
180 180
181 181
182 ASSEMBLER_TEST_GENERATE(SingleFPOperations, assembler) { 182 ASSEMBLER_TEST_GENERATE(SingleFPOperations, assembler) {
183 __ LoadSImmediate(S0, 12.3f); 183 __ LoadSImmediate(S0, 12.3f);
184 __ LoadSImmediate(S1, 3.4f); 184 __ LoadSImmediate(S1, 3.4f);
185 __ vnegs(S0, S0); // -12.3f 185 __ vnegs(S0, S0); // -12.3f
186 __ vabss(S0, S0); // 12.3f 186 __ vabss(S0, S0); // 12.3f
187 __ vadds(S0, S0, S1); // 15.7f 187 __ vadds(S0, S0, S1); // 15.7f
188 __ vmuls(S0, S0, S1); // 53.38f 188 __ vmuls(S0, S0, S1); // 53.38f
189 __ vsubs(S0, S0, S1); // 49.98f 189 __ vsubs(S0, S0, S1); // 49.98f
190 __ vdivs(S0, S0, S1); // 14.7f 190 __ vdivs(S0, S0, S1); // 14.7f
191 __ vsqrts(S0, S0); // 3.8340579f 191 __ vsqrts(S0, S0); // 3.8340579f
192 __ vmovrs(R0, S0); 192 __ vmovrs(R0, S0);
193 __ mov(PC, ShifterOperand(LR)); 193 __ bx(LR);
194 } 194 }
195 195
196 196
197 ASSEMBLER_TEST_RUN(SingleFPOperations, test) { 197 ASSEMBLER_TEST_RUN(SingleFPOperations, test) {
198 EXPECT(test != NULL); 198 EXPECT(test != NULL);
199 typedef float (*SingleFPOperations)(); 199 typedef float (*SingleFPOperations)();
200 float res = EXECUTE_TEST_CODE_FLOAT(SingleFPOperations, test->entry()); 200 float res = EXECUTE_TEST_CODE_FLOAT(SingleFPOperations, test->entry());
201 EXPECT_FLOAT_EQ(3.8340579f, res, 0.001f); 201 EXPECT_FLOAT_EQ(3.8340579f, res, 0.001f);
202 } 202 }
203 203
204 204
205 ASSEMBLER_TEST_GENERATE(DoubleFPOperations, assembler) { 205 ASSEMBLER_TEST_GENERATE(DoubleFPOperations, assembler) {
206 __ LoadDImmediate(D0, 12.3, R0); 206 __ LoadDImmediate(D0, 12.3, R0);
207 __ LoadDImmediate(D1, 3.4, R0); 207 __ LoadDImmediate(D1, 3.4, R0);
208 __ vnegd(D0, D0); // -12.3 208 __ vnegd(D0, D0); // -12.3
209 __ vabsd(D0, D0); // 12.3 209 __ vabsd(D0, D0); // 12.3
210 __ vaddd(D0, D0, D1); // 15.7 210 __ vaddd(D0, D0, D1); // 15.7
211 __ vmuld(D0, D0, D1); // 53.38 211 __ vmuld(D0, D0, D1); // 53.38
212 __ vsubd(D0, D0, D1); // 49.98 212 __ vsubd(D0, D0, D1); // 49.98
213 __ vdivd(D0, D0, D1); // 14.7 213 __ vdivd(D0, D0, D1); // 14.7
214 __ vsqrtd(D0, D0); // 3.8340579 214 __ vsqrtd(D0, D0); // 3.8340579
215 __ vmovrrd(R0, R1, D0); 215 __ vmovrrd(R0, R1, D0);
216 __ mov(PC, ShifterOperand(LR)); 216 __ bx(LR);
217 } 217 }
218 218
219 219
220 ASSEMBLER_TEST_RUN(DoubleFPOperations, test) { 220 ASSEMBLER_TEST_RUN(DoubleFPOperations, test) {
221 EXPECT(test != NULL); 221 EXPECT(test != NULL);
222 typedef double (*DoubleFPOperations)(); 222 typedef double (*DoubleFPOperations)();
223 double res = EXECUTE_TEST_CODE_DOUBLE(DoubleFPOperations, test->entry()); 223 double res = EXECUTE_TEST_CODE_DOUBLE(DoubleFPOperations, test->entry());
224 EXPECT_FLOAT_EQ(3.8340579, res, 0.001); 224 EXPECT_FLOAT_EQ(3.8340579, res, 0.001);
225 } 225 }
226 226
227 227
228 ASSEMBLER_TEST_GENERATE(DoubleSqrtNeg, assembler) {
229 // Check that sqrt of a negative double gives NaN.
230 __ LoadDImmediate(D1, -1.0, R0);
231 __ vsqrtd(D0, D1);
232 __ vcmpd(D0, D0);
233 __ vmstat();
234 __ mov(R0, ShifterOperand(1), VS);
235 __ mov(R0, ShifterOperand(0), VC);
236 __ Ret();
237 }
238
239
240 ASSEMBLER_TEST_RUN(DoubleSqrtNeg, test) {
241 EXPECT(test != NULL);
242 typedef double (*DoubleFPOperations)();
243 EXPECT_EQ(1, EXECUTE_TEST_CODE_INT32(DoubleFPOperations, test->entry()));
244 }
245
246
228 ASSEMBLER_TEST_GENERATE(IntToDoubleConversion, assembler) { 247 ASSEMBLER_TEST_GENERATE(IntToDoubleConversion, assembler) {
229 __ mov(R3, ShifterOperand(6)); 248 __ mov(R3, ShifterOperand(6));
230 __ vmovsr(S3, R3); 249 __ vmovsr(S3, R3);
231 __ vcvtdi(D1, S3); 250 __ vcvtdi(D1, S3);
232 __ vmovrrd(R0, R1, D1); 251 __ vmovrrd(R0, R1, D1);
233 __ mov(PC, ShifterOperand(LR)); 252 __ bx(LR);
234 } 253 }
235 254
236 255
237 ASSEMBLER_TEST_RUN(IntToDoubleConversion, test) { 256 ASSEMBLER_TEST_RUN(IntToDoubleConversion, test) {
238 typedef double (*IntToDoubleConversionCode)(); 257 typedef double (*IntToDoubleConversionCode)();
239 EXPECT(test != NULL); 258 EXPECT(test != NULL);
240 double res = EXECUTE_TEST_CODE_DOUBLE(IntToDoubleConversionCode, 259 double res = EXECUTE_TEST_CODE_DOUBLE(IntToDoubleConversionCode,
241 test->entry()); 260 test->entry());
242 EXPECT_FLOAT_EQ(6.0, res, 0.001); 261 EXPECT_FLOAT_EQ(6.0, res, 0.001);
243 } 262 }
244 263
245 264
246 ASSEMBLER_TEST_GENERATE(LongToDoubleConversion, assembler) { 265 ASSEMBLER_TEST_GENERATE(LongToDoubleConversion, assembler) {
247 int64_t value = 60000000000LL; 266 int64_t value = 60000000000LL;
248 __ LoadImmediate(R0, Utils::Low32Bits(value)); 267 __ LoadImmediate(R0, Utils::Low32Bits(value));
249 __ LoadImmediate(R1, Utils::High32Bits(value)); 268 __ LoadImmediate(R1, Utils::High32Bits(value));
250 __ vmovsr(S0, R0); 269 __ vmovsr(S0, R0);
251 __ vmovsr(S2, R1); 270 __ vmovsr(S2, R1);
252 __ vcvtdu(D0, S0); 271 __ vcvtdu(D0, S0);
253 __ vcvtdi(D1, S2); 272 __ vcvtdi(D1, S2);
254 __ LoadDImmediate(D2, 1.0 * (1LL << 32), R0); 273 __ LoadDImmediate(D2, 1.0 * (1LL << 32), R0);
255 __ vmlad(D0, D1, D2); 274 __ vmlad(D0, D1, D2);
256 __ vmovrrd(R0, R1, D0); 275 __ vmovrrd(R0, R1, D0);
257 __ mov(PC, ShifterOperand(LR)); 276 __ bx(LR);
258 } 277 }
259 278
260 279
261 ASSEMBLER_TEST_RUN(LongToDoubleConversion, test) { 280 ASSEMBLER_TEST_RUN(LongToDoubleConversion, test) {
262 typedef double (*LongToDoubleConversionCode)(); 281 typedef double (*LongToDoubleConversionCode)();
263 EXPECT(test != NULL); 282 EXPECT(test != NULL);
264 double res = EXECUTE_TEST_CODE_DOUBLE(LongToDoubleConversionCode, 283 double res = EXECUTE_TEST_CODE_DOUBLE(LongToDoubleConversionCode,
265 test->entry()); 284 test->entry());
266 EXPECT_FLOAT_EQ(60000000000.0, res, 0.001); 285 EXPECT_FLOAT_EQ(60000000000.0, res, 0.001);
267 } 286 }
268 287
269 288
270 ASSEMBLER_TEST_GENERATE(IntToFloatConversion, assembler) { 289 ASSEMBLER_TEST_GENERATE(IntToFloatConversion, assembler) {
271 __ mov(R3, ShifterOperand(6)); 290 __ mov(R3, ShifterOperand(6));
272 __ vmovsr(S3, R3); 291 __ vmovsr(S3, R3);
273 __ vcvtsi(S1, S3); 292 __ vcvtsi(S1, S3);
274 __ vmovrs(R0, S1); 293 __ vmovrs(R0, S1);
275 __ mov(PC, ShifterOperand(LR)); 294 __ bx(LR);
276 } 295 }
277 296
278 297
279 ASSEMBLER_TEST_RUN(IntToFloatConversion, test) { 298 ASSEMBLER_TEST_RUN(IntToFloatConversion, test) {
280 typedef float (*IntToFloatConversionCode)(); 299 typedef float (*IntToFloatConversionCode)();
281 EXPECT(test != NULL); 300 EXPECT(test != NULL);
282 float res = EXECUTE_TEST_CODE_FLOAT(IntToFloatConversionCode, test->entry()); 301 float res = EXECUTE_TEST_CODE_FLOAT(IntToFloatConversionCode, test->entry());
283 EXPECT_FLOAT_EQ(6.0, res, 0.001); 302 EXPECT_FLOAT_EQ(6.0, res, 0.001);
284 } 303 }
285 304
286 305
287 ASSEMBLER_TEST_GENERATE(FloatToIntConversion, assembler) { 306 ASSEMBLER_TEST_GENERATE(FloatToIntConversion, assembler) {
288 __ vmovsr(S1, R0); 307 __ vmovsr(S1, R0);
289 __ vcvtis(S0, S1); 308 __ vcvtis(S0, S1);
290 __ vmovrs(R0, S0); 309 __ vmovrs(R0, S0);
291 __ mov(PC, ShifterOperand(LR)); 310 __ bx(LR);
292 } 311 }
293 312
294 313
295 ASSEMBLER_TEST_RUN(FloatToIntConversion, test) { 314 ASSEMBLER_TEST_RUN(FloatToIntConversion, test) {
296 typedef int (*FloatToIntConversion)(float arg); 315 typedef int (*FloatToIntConversion)(float arg);
297 EXPECT(test != NULL); 316 EXPECT(test != NULL);
298 EXPECT_EQ(12, 317 EXPECT_EQ(12,
299 EXECUTE_TEST_CODE_INT32_F(FloatToIntConversion, test->entry(), 318 EXECUTE_TEST_CODE_INT32_F(FloatToIntConversion, test->entry(),
300 12.8f)); 319 12.8f));
301 EXPECT_EQ(INT_MIN, 320 EXPECT_EQ(INT_MIN,
302 EXECUTE_TEST_CODE_INT32_F(FloatToIntConversion, test->entry(), 321 EXECUTE_TEST_CODE_INT32_F(FloatToIntConversion, test->entry(),
303 -FLT_MAX)); 322 -FLT_MAX));
304 EXPECT_EQ(INT_MAX, 323 EXPECT_EQ(INT_MAX,
305 EXECUTE_TEST_CODE_INT32_F(FloatToIntConversion, test->entry(), 324 EXECUTE_TEST_CODE_INT32_F(FloatToIntConversion, test->entry(),
306 FLT_MAX)); 325 FLT_MAX));
307 } 326 }
308 327
309 328
310 ASSEMBLER_TEST_GENERATE(DoubleToIntConversion, assembler) { 329 ASSEMBLER_TEST_GENERATE(DoubleToIntConversion, assembler) {
311 __ vmovdrr(D1, R0, R1); 330 __ vmovdrr(D1, R0, R1);
312 __ vcvtid(S0, D1); 331 __ vcvtid(S0, D1);
313 __ vmovrs(R0, S0); 332 __ vmovrs(R0, S0);
314 __ mov(PC, ShifterOperand(LR)); 333 __ bx(LR);
315 } 334 }
316 335
317 336
318 ASSEMBLER_TEST_RUN(DoubleToIntConversion, test) { 337 ASSEMBLER_TEST_RUN(DoubleToIntConversion, test) {
319 typedef int (*DoubleToIntConversion)(double arg); 338 typedef int (*DoubleToIntConversion)(double arg);
320 EXPECT(test != NULL); 339 EXPECT(test != NULL);
321 EXPECT_EQ(12, 340 EXPECT_EQ(12,
322 EXECUTE_TEST_CODE_INT32_D(DoubleToIntConversion, test->entry(), 341 EXECUTE_TEST_CODE_INT32_D(DoubleToIntConversion, test->entry(),
323 12.8)); 342 12.8));
324 EXPECT_EQ(INT_MIN, 343 EXPECT_EQ(INT_MIN,
325 EXECUTE_TEST_CODE_INT32_D(DoubleToIntConversion, test->entry(), 344 EXECUTE_TEST_CODE_INT32_D(DoubleToIntConversion, test->entry(),
326 -DBL_MAX)); 345 -DBL_MAX));
327 EXPECT_EQ(INT_MAX, 346 EXPECT_EQ(INT_MAX,
328 EXECUTE_TEST_CODE_INT32_D(DoubleToIntConversion, test->entry(), 347 EXECUTE_TEST_CODE_INT32_D(DoubleToIntConversion, test->entry(),
329 DBL_MAX)); 348 DBL_MAX));
330 } 349 }
331 350
332 351
333 ASSEMBLER_TEST_GENERATE(FloatToDoubleConversion, assembler) { 352 ASSEMBLER_TEST_GENERATE(FloatToDoubleConversion, assembler) {
334 __ LoadSImmediate(S1, 12.8f); 353 __ LoadSImmediate(S1, 12.8f);
335 __ vcvtds(D2, S1); 354 __ vcvtds(D2, S1);
336 __ vmovrrd(R0, R1, D2); 355 __ vmovrrd(R0, R1, D2);
337 __ mov(PC, ShifterOperand(LR)); 356 __ bx(LR);
338 } 357 }
339 358
340 359
341 ASSEMBLER_TEST_RUN(FloatToDoubleConversion, test) { 360 ASSEMBLER_TEST_RUN(FloatToDoubleConversion, test) {
342 typedef double (*FloatToDoubleConversionCode)(); 361 typedef double (*FloatToDoubleConversionCode)();
343 EXPECT(test != NULL); 362 EXPECT(test != NULL);
344 double res = EXECUTE_TEST_CODE_DOUBLE(FloatToDoubleConversionCode, 363 double res = EXECUTE_TEST_CODE_DOUBLE(FloatToDoubleConversionCode,
345 test->entry()); 364 test->entry());
346 EXPECT_FLOAT_EQ(12.8, res, 0.001); 365 EXPECT_FLOAT_EQ(12.8, res, 0.001);
347 } 366 }
348 367
349 368
350 ASSEMBLER_TEST_GENERATE(DoubleToFloatConversion, assembler) { 369 ASSEMBLER_TEST_GENERATE(DoubleToFloatConversion, assembler) {
351 __ LoadDImmediate(D1, 12.8, R0); 370 __ LoadDImmediate(D1, 12.8, R0);
352 __ vcvtsd(S3, D1); 371 __ vcvtsd(S3, D1);
353 __ vmovrs(R0, S3); 372 __ vmovrs(R0, S3);
354 __ mov(PC, ShifterOperand(LR)); 373 __ bx(LR);
355 } 374 }
356 375
357 376
358 ASSEMBLER_TEST_RUN(DoubleToFloatConversion, test) { 377 ASSEMBLER_TEST_RUN(DoubleToFloatConversion, test) {
359 typedef float (*DoubleToFloatConversionCode)(); 378 typedef float (*DoubleToFloatConversionCode)();
360 EXPECT(test != NULL); 379 EXPECT(test != NULL);
361 float res = EXECUTE_TEST_CODE_FLOAT(DoubleToFloatConversionCode, 380 float res = EXECUTE_TEST_CODE_FLOAT(DoubleToFloatConversionCode,
362 test->entry()); 381 test->entry());
363 EXPECT_FLOAT_EQ(12.8, res, 0.001); 382 EXPECT_FLOAT_EQ(12.8, res, 0.001);
364 } 383 }
(...skipping 15 matching lines...) Expand all
380 399
381 // Test NaN. 400 // Test NaN.
382 // Create NaN by dividing 0.0f/0.0f. 401 // Create NaN by dividing 0.0f/0.0f.
383 __ LoadSImmediate(S1, 0.0f); 402 __ LoadSImmediate(S1, 0.0f);
384 __ vdivs(S1, S1, S1); 403 __ vdivs(S1, S1, S1);
385 __ vcmps(S1, S1); 404 __ vcmps(S1, S1);
386 __ vmstat(); 405 __ vmstat();
387 __ add(R0, R0, ShifterOperand(16), VC); // Error if not unordered (not Nan). 406 __ add(R0, R0, ShifterOperand(16), VC); // Error if not unordered (not Nan).
388 407
389 // R0 is 0 if all tests passed. 408 // R0 is 0 if all tests passed.
390 __ mov(PC, ShifterOperand(LR)); 409 __ bx(LR);
391 } 410 }
392 411
393 412
394 ASSEMBLER_TEST_RUN(FloatCompare, test) { 413 ASSEMBLER_TEST_RUN(FloatCompare, test) {
395 EXPECT(test != NULL); 414 EXPECT(test != NULL);
396 typedef int (*FloatCompare)(); 415 typedef int (*FloatCompare)();
397 EXPECT_EQ(0, EXECUTE_TEST_CODE_INT32(FloatCompare, test->entry())); 416 EXPECT_EQ(0, EXECUTE_TEST_CODE_INT32(FloatCompare, test->entry()));
398 } 417 }
399 418
400 419
(...skipping 13 matching lines...) Expand all
414 433
415 // Test NaN. 434 // Test NaN.
416 // Create NaN by dividing 0.0/0.0. 435 // Create NaN by dividing 0.0/0.0.
417 __ LoadDImmediate(D1, 0.0, R1); 436 __ LoadDImmediate(D1, 0.0, R1);
418 __ vdivd(D1, D1, D1); 437 __ vdivd(D1, D1, D1);
419 __ vcmpd(D1, D1); 438 __ vcmpd(D1, D1);
420 __ vmstat(); 439 __ vmstat();
421 __ add(R0, R0, ShifterOperand(16), VC); // Error if not unordered (not Nan). 440 __ add(R0, R0, ShifterOperand(16), VC); // Error if not unordered (not Nan).
422 441
423 // R0 is 0 if all tests passed. 442 // R0 is 0 if all tests passed.
424 __ mov(PC, ShifterOperand(LR)); 443 __ bx(LR);
425 } 444 }
426 445
427 446
428 ASSEMBLER_TEST_RUN(DoubleCompare, test) { 447 ASSEMBLER_TEST_RUN(DoubleCompare, test) {
429 EXPECT(test != NULL); 448 EXPECT(test != NULL);
430 typedef int (*DoubleCompare)(); 449 typedef int (*DoubleCompare)();
431 EXPECT_EQ(0, EXECUTE_TEST_CODE_INT32(DoubleCompare, test->entry())); 450 EXPECT_EQ(0, EXECUTE_TEST_CODE_INT32(DoubleCompare, test->entry()));
432 } 451 }
433 452
434 453
435 ASSEMBLER_TEST_GENERATE(Loop, assembler) { 454 ASSEMBLER_TEST_GENERATE(Loop, assembler) {
436 Label loop_entry; 455 Label loop_entry;
437 __ mov(R0, ShifterOperand(1)); 456 __ mov(R0, ShifterOperand(1));
438 __ mov(R1, ShifterOperand(2)); 457 __ mov(R1, ShifterOperand(2));
439 __ Bind(&loop_entry); 458 __ Bind(&loop_entry);
440 __ mov(R0, ShifterOperand(R0, LSL, 1)); 459 __ mov(R0, ShifterOperand(R0, LSL, 1));
441 __ movs(R1, ShifterOperand(R1, LSR, 1)); 460 __ movs(R1, ShifterOperand(R1, LSR, 1));
442 __ b(&loop_entry, NE); 461 __ b(&loop_entry, NE);
443 __ mov(PC, ShifterOperand(LR)); 462 __ bx(LR);
444 } 463 }
445 464
446 465
447 ASSEMBLER_TEST_RUN(Loop, test) { 466 ASSEMBLER_TEST_RUN(Loop, test) {
448 EXPECT(test != NULL); 467 EXPECT(test != NULL);
449 typedef int (*Loop)(); 468 typedef int (*Loop)();
450 EXPECT_EQ(4, EXECUTE_TEST_CODE_INT32(Loop, test->entry())); 469 EXPECT_EQ(4, EXECUTE_TEST_CODE_INT32(Loop, test->entry()));
451 } 470 }
452 471
453 472
454 ASSEMBLER_TEST_GENERATE(ForwardBranch, assembler) { 473 ASSEMBLER_TEST_GENERATE(ForwardBranch, assembler) {
455 Label skip; 474 Label skip;
456 __ mov(R0, ShifterOperand(42)); 475 __ mov(R0, ShifterOperand(42));
457 __ b(&skip); 476 __ b(&skip);
458 __ mov(R0, ShifterOperand(11)); 477 __ mov(R0, ShifterOperand(11));
459 __ Bind(&skip); 478 __ Bind(&skip);
460 __ mov(PC, ShifterOperand(LR)); 479 __ bx(LR);
461 } 480 }
462 481
463 482
464 ASSEMBLER_TEST_RUN(ForwardBranch, test) { 483 ASSEMBLER_TEST_RUN(ForwardBranch, test) {
465 EXPECT(test != NULL); 484 EXPECT(test != NULL);
466 typedef int (*ForwardBranch)(); 485 typedef int (*ForwardBranch)();
467 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT32(ForwardBranch, test->entry())); 486 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT32(ForwardBranch, test->entry()));
468 } 487 }
469 488
470 489
471 ASSEMBLER_TEST_GENERATE(LoadStore, assembler) { 490 ASSEMBLER_TEST_GENERATE(LoadStore, assembler) {
472 __ mov(R1, ShifterOperand(123)); 491 __ mov(R1, ShifterOperand(123));
473 __ Push(R1); 492 __ Push(R1);
474 __ Pop(R0); 493 __ Pop(R0);
475 __ mov(PC, ShifterOperand(LR)); 494 __ bx(LR);
476 } 495 }
477 496
478 497
479 ASSEMBLER_TEST_RUN(LoadStore, test) { 498 ASSEMBLER_TEST_RUN(LoadStore, test) {
480 EXPECT(test != NULL); 499 EXPECT(test != NULL);
481 typedef int (*LoadStore)(); 500 typedef int (*LoadStore)();
482 EXPECT_EQ(123, EXECUTE_TEST_CODE_INT32(LoadStore, test->entry())); 501 EXPECT_EQ(123, EXECUTE_TEST_CODE_INT32(LoadStore, test->entry()));
483 } 502 }
484 503
485 504
486 ASSEMBLER_TEST_GENERATE(AddSub, assembler) { 505 ASSEMBLER_TEST_GENERATE(AddSub, assembler) {
487 __ mov(R1, ShifterOperand(40)); 506 __ mov(R1, ShifterOperand(40));
488 __ sub(R1, R1, ShifterOperand(2)); 507 __ sub(R1, R1, ShifterOperand(2));
489 __ add(R0, R1, ShifterOperand(4)); 508 __ add(R0, R1, ShifterOperand(4));
490 __ rsbs(R0, R0, ShifterOperand(100)); 509 __ rsbs(R0, R0, ShifterOperand(100));
491 __ rsc(R0, R0, ShifterOperand(100)); 510 __ rsc(R0, R0, ShifterOperand(100));
492 __ mov(PC, ShifterOperand(LR)); 511 __ bx(LR);
493 } 512 }
494 513
495 514
496 ASSEMBLER_TEST_RUN(AddSub, test) { 515 ASSEMBLER_TEST_RUN(AddSub, test) {
497 EXPECT(test != NULL); 516 EXPECT(test != NULL);
498 typedef int (*AddSub)(); 517 typedef int (*AddSub)();
499 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT32(AddSub, test->entry())); 518 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT32(AddSub, test->entry()));
500 } 519 }
501 520
502 521
503 ASSEMBLER_TEST_GENERATE(Semaphore, assembler) { 522 ASSEMBLER_TEST_GENERATE(Semaphore, assembler) {
504 __ mov(R0, ShifterOperand(40)); 523 __ mov(R0, ShifterOperand(40));
505 __ mov(R1, ShifterOperand(42)); 524 __ mov(R1, ShifterOperand(42));
506 __ Push(R0); 525 __ Push(R0);
507 Label retry; 526 Label retry;
508 __ Bind(&retry); 527 __ Bind(&retry);
509 __ ldrex(R0, SP); 528 __ ldrex(R0, SP);
510 __ strex(IP, R1, SP); // IP == 0, success 529 __ strex(IP, R1, SP); // IP == 0, success
511 __ tst(IP, ShifterOperand(0)); 530 __ tst(IP, ShifterOperand(0));
512 __ b(&retry, NE); // NE if context switch occurred between ldrex and strex. 531 __ b(&retry, NE); // NE if context switch occurred between ldrex and strex.
513 __ Pop(R0); // 42 532 __ Pop(R0); // 42
514 __ mov(PC, ShifterOperand(LR)); 533 __ bx(LR);
515 } 534 }
516 535
517 536
518 ASSEMBLER_TEST_RUN(Semaphore, test) { 537 ASSEMBLER_TEST_RUN(Semaphore, test) {
519 EXPECT(test != NULL); 538 EXPECT(test != NULL);
520 typedef int (*Semaphore)(); 539 typedef int (*Semaphore)();
521 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT32(Semaphore, test->entry())); 540 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT32(Semaphore, test->entry()));
522 } 541 }
523 542
524 543
525 ASSEMBLER_TEST_GENERATE(FailedSemaphore, assembler) { 544 ASSEMBLER_TEST_GENERATE(FailedSemaphore, assembler) {
526 __ mov(R0, ShifterOperand(40)); 545 __ mov(R0, ShifterOperand(40));
527 __ mov(R1, ShifterOperand(42)); 546 __ mov(R1, ShifterOperand(42));
528 __ Push(R0); 547 __ Push(R0);
529 __ ldrex(R0, SP); 548 __ ldrex(R0, SP);
530 __ clrex(); // Simulate a context switch. 549 __ clrex(); // Simulate a context switch.
531 __ strex(IP, R1, SP); // IP == 1, failure 550 __ strex(IP, R1, SP); // IP == 1, failure
532 __ Pop(R0); // 40 551 __ Pop(R0); // 40
533 __ add(R0, R0, ShifterOperand(IP)); 552 __ add(R0, R0, ShifterOperand(IP));
534 __ mov(PC, ShifterOperand(LR)); 553 __ bx(LR);
535 } 554 }
536 555
537 556
538 ASSEMBLER_TEST_RUN(FailedSemaphore, test) { 557 ASSEMBLER_TEST_RUN(FailedSemaphore, test) {
539 EXPECT(test != NULL); 558 EXPECT(test != NULL);
540 typedef int (*FailedSemaphore)(); 559 typedef int (*FailedSemaphore)();
541 EXPECT_EQ(41, EXECUTE_TEST_CODE_INT32(FailedSemaphore, test->entry())); 560 EXPECT_EQ(41, EXECUTE_TEST_CODE_INT32(FailedSemaphore, test->entry()));
542 } 561 }
543 562
544 563
545 ASSEMBLER_TEST_GENERATE(AndOrr, assembler) { 564 ASSEMBLER_TEST_GENERATE(AndOrr, assembler) {
546 __ mov(R1, ShifterOperand(40)); 565 __ mov(R1, ShifterOperand(40));
547 __ mov(R2, ShifterOperand(0)); 566 __ mov(R2, ShifterOperand(0));
548 __ and_(R1, R2, ShifterOperand(R1)); 567 __ and_(R1, R2, ShifterOperand(R1));
549 __ mov(R3, ShifterOperand(42)); 568 __ mov(R3, ShifterOperand(42));
550 __ orr(R0, R1, ShifterOperand(R3)); 569 __ orr(R0, R1, ShifterOperand(R3));
551 __ mov(PC, ShifterOperand(LR)); 570 __ bx(LR);
552 } 571 }
553 572
554 573
555 ASSEMBLER_TEST_RUN(AndOrr, test) { 574 ASSEMBLER_TEST_RUN(AndOrr, test) {
556 EXPECT(test != NULL); 575 EXPECT(test != NULL);
557 typedef int (*AndOrr)(); 576 typedef int (*AndOrr)();
558 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT32(AndOrr, test->entry())); 577 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT32(AndOrr, test->entry()));
559 } 578 }
560 579
561 580
562 ASSEMBLER_TEST_GENERATE(Orrs, assembler) { 581 ASSEMBLER_TEST_GENERATE(Orrs, assembler) {
563 __ mov(R0, ShifterOperand(0)); 582 __ mov(R0, ShifterOperand(0));
564 __ tst(R0, ShifterOperand(R1)); // Set zero-flag. 583 __ tst(R0, ShifterOperand(R1)); // Set zero-flag.
565 __ orrs(R0, R0, ShifterOperand(1)); // Clear zero-flag. 584 __ orrs(R0, R0, ShifterOperand(1)); // Clear zero-flag.
566 __ mov(PC, ShifterOperand(LR), EQ); 585 __ bx(LR, EQ);
567 __ mov(R0, ShifterOperand(42)); 586 __ mov(R0, ShifterOperand(42));
568 __ mov(PC, ShifterOperand(LR), NE); // Only this return should fire. 587 __ bx(LR, NE); // Only this return should fire.
569 __ mov(R0, ShifterOperand(2)); 588 __ mov(R0, ShifterOperand(2));
570 __ mov(PC, ShifterOperand(LR)); 589 __ bx(LR);
571 } 590 }
572 591
573 592
574 ASSEMBLER_TEST_RUN(Orrs, test) { 593 ASSEMBLER_TEST_RUN(Orrs, test) {
575 EXPECT(test != NULL); 594 EXPECT(test != NULL);
576 typedef int (*Orrs)(); 595 typedef int (*Orrs)();
577 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT32(Orrs, test->entry())); 596 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT32(Orrs, test->entry()));
578 } 597 }
579 598
580 599
581 ASSEMBLER_TEST_GENERATE(Multiply, assembler) { 600 ASSEMBLER_TEST_GENERATE(Multiply, assembler) {
582 __ mov(R1, ShifterOperand(20)); 601 __ mov(R1, ShifterOperand(20));
583 __ mov(R2, ShifterOperand(40)); 602 __ mov(R2, ShifterOperand(40));
584 __ mul(R3, R2, R1); 603 __ mul(R3, R2, R1);
585 __ mov(R0, ShifterOperand(R3)); 604 __ mov(R0, ShifterOperand(R3));
586 __ mov(PC, ShifterOperand(LR)); 605 __ bx(LR);
587 } 606 }
588 607
589 608
590 ASSEMBLER_TEST_RUN(Multiply, test) { 609 ASSEMBLER_TEST_RUN(Multiply, test) {
591 EXPECT(test != NULL); 610 EXPECT(test != NULL);
592 typedef int (*Multiply)(); 611 typedef int (*Multiply)();
593 EXPECT_EQ(800, EXECUTE_TEST_CODE_INT32(Multiply, test->entry())); 612 EXPECT_EQ(800, EXECUTE_TEST_CODE_INT32(Multiply, test->entry()));
594 } 613 }
595 614
596 615
597 ASSEMBLER_TEST_GENERATE(QuotientRemainder, assembler) { 616 ASSEMBLER_TEST_GENERATE(QuotientRemainder, assembler) {
598 __ vmovsr(S2, R0); 617 __ vmovsr(S2, R0);
599 __ vmovsr(S4, R2); 618 __ vmovsr(S4, R2);
600 __ vcvtdi(D1, S2); 619 __ vcvtdi(D1, S2);
601 __ vcvtdi(D2, S4); 620 __ vcvtdi(D2, S4);
602 __ vdivd(D0, D1, D2); 621 __ vdivd(D0, D1, D2);
603 __ vcvtid(S0, D0); 622 __ vcvtid(S0, D0);
604 __ vmovrs(R1, S0); // r1 = r0/r2 623 __ vmovrs(R1, S0); // r1 = r0/r2
605 __ mls(R0, R1, R2, R0); // r0 = r0 - r1*r2 624 __ mls(R0, R1, R2, R0); // r0 = r0 - r1*r2
606 __ mov(PC, ShifterOperand(LR)); 625 __ bx(LR);
607 } 626 }
608 627
609 628
610 ASSEMBLER_TEST_RUN(QuotientRemainder, test) { 629 ASSEMBLER_TEST_RUN(QuotientRemainder, test) {
611 EXPECT(test != NULL); 630 EXPECT(test != NULL);
612 typedef int64_t (*QuotientRemainder)(int64_t dividend, int64_t divisor); 631 typedef int64_t (*QuotientRemainder)(int64_t dividend, int64_t divisor);
613 EXPECT_EQ(0x1000400000da8LL, 632 EXPECT_EQ(0x1000400000da8LL,
614 EXECUTE_TEST_CODE_INT64_LL(QuotientRemainder, test->entry(), 633 EXECUTE_TEST_CODE_INT64_LL(QuotientRemainder, test->entry(),
615 0x12345678, 0x1234)); 634 0x12345678, 0x1234));
616 } 635 }
617 636
618 637
619 ASSEMBLER_TEST_GENERATE(Multiply64To64, assembler) { 638 ASSEMBLER_TEST_GENERATE(Multiply64To64, assembler) {
620 __ Push(R4); 639 __ Push(R4);
621 __ Mov(IP, R0); 640 __ Mov(IP, R0);
622 __ mul(R4, R2, R1); 641 __ mul(R4, R2, R1);
623 __ umull(R0, R1, R2, IP); 642 __ umull(R0, R1, R2, IP);
624 __ mla(R2, IP, R3, R4); 643 __ mla(R2, IP, R3, R4);
625 __ add(R1, R2, ShifterOperand(R1)); 644 __ add(R1, R2, ShifterOperand(R1));
626 __ Pop(R4); 645 __ Pop(R4);
627 __ mov(PC, ShifterOperand(LR)); 646 __ bx(LR);
628 } 647 }
629 648
630 649
631 ASSEMBLER_TEST_RUN(Multiply64To64, test) { 650 ASSEMBLER_TEST_RUN(Multiply64To64, test) {
632 EXPECT(test != NULL); 651 EXPECT(test != NULL);
633 typedef int64_t (*Multiply64To64)(int64_t operand0, int64_t operand1); 652 typedef int64_t (*Multiply64To64)(int64_t operand0, int64_t operand1);
634 EXPECT_EQ(6, 653 EXPECT_EQ(6,
635 EXECUTE_TEST_CODE_INT64_LL(Multiply64To64, test->entry(), -3, -2)); 654 EXECUTE_TEST_CODE_INT64_LL(Multiply64To64, test->entry(), -3, -2));
636 } 655 }
637 656
638 657
639 ASSEMBLER_TEST_GENERATE(Multiply32To64, assembler) { 658 ASSEMBLER_TEST_GENERATE(Multiply32To64, assembler) {
640 __ smull(R0, R1, R0, R2); 659 __ smull(R0, R1, R0, R2);
641 __ mov(PC, ShifterOperand(LR)); 660 __ bx(LR);
642 } 661 }
643 662
644 663
645 ASSEMBLER_TEST_RUN(Multiply32To64, test) { 664 ASSEMBLER_TEST_RUN(Multiply32To64, test) {
646 EXPECT(test != NULL); 665 EXPECT(test != NULL);
647 typedef int64_t (*Multiply32To64)(int64_t operand0, int64_t operand1); 666 typedef int64_t (*Multiply32To64)(int64_t operand0, int64_t operand1);
648 EXPECT_EQ(6, 667 EXPECT_EQ(6,
649 EXECUTE_TEST_CODE_INT64_LL(Multiply32To64, test->entry(), -3, -2)); 668 EXECUTE_TEST_CODE_INT64_LL(Multiply32To64, test->entry(), -3, -2));
650 } 669 }
651 670
652 671
672 ASSEMBLER_TEST_GENERATE(MultiplyAccum32To64, assembler) {
673 __ smlal(R0, R1, R0, R2);
674 __ bx(LR);
675 }
676
677
678 ASSEMBLER_TEST_RUN(MultiplyAccum32To64, test) {
679 EXPECT(test != NULL);
680 typedef int64_t (*Multiply32To64)(int64_t operand0, int64_t operand1);
681 EXPECT_EQ(3,
682 EXECUTE_TEST_CODE_INT64_LL(Multiply32To64, test->entry(), -3, -2));
683 }
684
685
653 ASSEMBLER_TEST_GENERATE(Clz, assembler) { 686 ASSEMBLER_TEST_GENERATE(Clz, assembler) {
654 Label error; 687 Label error;
655 688
656 __ mov(R0, ShifterOperand(0)); 689 __ mov(R0, ShifterOperand(0));
657 __ clz(R1, R0); 690 __ clz(R1, R0);
658 __ cmp(R1, ShifterOperand(32)); 691 __ cmp(R1, ShifterOperand(32));
659 __ b(&error, NE); 692 __ b(&error, NE);
660 __ mov(R2, ShifterOperand(42)); 693 __ mov(R2, ShifterOperand(42));
661 __ clz(R2, R2); 694 __ clz(R2, R2);
662 __ cmp(R2, ShifterOperand(26)); 695 __ cmp(R2, ShifterOperand(26));
663 __ b(&error, NE); 696 __ b(&error, NE);
664 __ mvn(R0, ShifterOperand(0)); 697 __ mvn(R0, ShifterOperand(0));
665 __ clz(R1, R0); 698 __ clz(R1, R0);
666 __ cmp(R1, ShifterOperand(0)); 699 __ cmp(R1, ShifterOperand(0));
667 __ b(&error, NE); 700 __ b(&error, NE);
668 __ Lsr(R0, R0, 3); 701 __ Lsr(R0, R0, 3);
669 __ clz(R1, R0); 702 __ clz(R1, R0);
670 __ cmp(R1, ShifterOperand(3)); 703 __ cmp(R1, ShifterOperand(3));
671 __ b(&error, NE); 704 __ b(&error, NE);
672 __ mov(R0, ShifterOperand(0)); 705 __ mov(R0, ShifterOperand(0));
673 __ mov(PC, ShifterOperand(LR)); 706 __ bx(LR);
674 __ Bind(&error); 707 __ Bind(&error);
675 __ mov(R0, ShifterOperand(1)); 708 __ mov(R0, ShifterOperand(1));
676 __ mov(PC, ShifterOperand(LR)); 709 __ bx(LR);
677 } 710 }
678 711
679 712
680 ASSEMBLER_TEST_RUN(Clz, test) { 713 ASSEMBLER_TEST_RUN(Clz, test) {
681 EXPECT(test != NULL); 714 EXPECT(test != NULL);
682 typedef int (*Clz)(); 715 typedef int (*Clz)();
683 EXPECT_EQ(0, EXECUTE_TEST_CODE_INT32(Clz, test->entry())); 716 EXPECT_EQ(0, EXECUTE_TEST_CODE_INT32(Clz, test->entry()));
684 } 717 }
685 718
686 719
687 ASSEMBLER_TEST_GENERATE(Tst, assembler) { 720 ASSEMBLER_TEST_GENERATE(Tst, assembler) {
688 Label skip; 721 Label skip;
689 722
690 __ mov(R0, ShifterOperand(42)); 723 __ mov(R0, ShifterOperand(42));
691 __ mov(R1, ShifterOperand(40)); 724 __ mov(R1, ShifterOperand(40));
692 __ tst(R1, ShifterOperand(0)); 725 __ tst(R1, ShifterOperand(0));
693 __ b(&skip, NE); 726 __ b(&skip, NE);
694 __ mov(R0, ShifterOperand(0)); 727 __ mov(R0, ShifterOperand(0));
695 __ Bind(&skip); 728 __ Bind(&skip);
696 __ mov(PC, ShifterOperand(LR)); 729 __ bx(LR);
697 } 730 }
698 731
699 732
700 ASSEMBLER_TEST_RUN(Tst, test) { 733 ASSEMBLER_TEST_RUN(Tst, test) {
701 EXPECT(test != NULL); 734 EXPECT(test != NULL);
702 typedef int (*Tst)(); 735 typedef int (*Tst)();
703 EXPECT_EQ(0, EXECUTE_TEST_CODE_INT32(Tst, test->entry())); 736 EXPECT_EQ(0, EXECUTE_TEST_CODE_INT32(Tst, test->entry()));
704 } 737 }
705 738
706 739
707 ASSEMBLER_TEST_GENERATE(Lsl, assembler) { 740 ASSEMBLER_TEST_GENERATE(Lsl, assembler) {
708 Label skip; 741 Label skip;
709 742
710 __ mov(R0, ShifterOperand(1)); 743 __ mov(R0, ShifterOperand(1));
711 __ mov(R0, ShifterOperand(R0, LSL, 1)); 744 __ mov(R0, ShifterOperand(R0, LSL, 1));
712 __ mov(R1, ShifterOperand(1)); 745 __ mov(R1, ShifterOperand(1));
713 __ mov(R0, ShifterOperand(R0, LSL, R1)); 746 __ mov(R0, ShifterOperand(R0, LSL, R1));
714 __ mov(PC, ShifterOperand(LR)); 747 __ bx(LR);
715 } 748 }
716 749
717 750
718 ASSEMBLER_TEST_RUN(Lsl, test) { 751 ASSEMBLER_TEST_RUN(Lsl, test) {
719 EXPECT(test != NULL); 752 EXPECT(test != NULL);
720 typedef int (*Tst)(); 753 typedef int (*Tst)();
721 EXPECT_EQ(4, EXECUTE_TEST_CODE_INT32(Tst, test->entry())); 754 EXPECT_EQ(4, EXECUTE_TEST_CODE_INT32(Tst, test->entry()));
722 } 755 }
723 756
724 757
725 ASSEMBLER_TEST_GENERATE(Lsr, assembler) { 758 ASSEMBLER_TEST_GENERATE(Lsr, assembler) {
726 Label skip; 759 Label skip;
727 760
728 __ mov(R0, ShifterOperand(4)); 761 __ mov(R0, ShifterOperand(4));
729 __ mov(R0, ShifterOperand(R0, LSR, 1)); 762 __ mov(R0, ShifterOperand(R0, LSR, 1));
730 __ mov(R1, ShifterOperand(1)); 763 __ mov(R1, ShifterOperand(1));
731 __ mov(R0, ShifterOperand(R0, LSR, R1)); 764 __ mov(R0, ShifterOperand(R0, LSR, R1));
732 __ mov(PC, ShifterOperand(LR)); 765 __ bx(LR);
733 } 766 }
734 767
735 768
736 ASSEMBLER_TEST_RUN(Lsr, test) { 769 ASSEMBLER_TEST_RUN(Lsr, test) {
737 EXPECT(test != NULL); 770 EXPECT(test != NULL);
738 typedef int (*Tst)(); 771 typedef int (*Tst)();
739 EXPECT_EQ(1, EXECUTE_TEST_CODE_INT32(Tst, test->entry())); 772 EXPECT_EQ(1, EXECUTE_TEST_CODE_INT32(Tst, test->entry()));
740 } 773 }
741 774
742 775
743 ASSEMBLER_TEST_GENERATE(Lsr1, assembler) { 776 ASSEMBLER_TEST_GENERATE(Lsr1, assembler) {
744 Label skip; 777 Label skip;
745 778
746 __ mov(R0, ShifterOperand(1)); 779 __ mov(R0, ShifterOperand(1));
747 __ Lsl(R0, R0, 31); 780 __ Lsl(R0, R0, 31);
748 __ Lsr(R0, R0, 31); 781 __ Lsr(R0, R0, 31);
749 __ mov(PC, ShifterOperand(LR)); 782 __ bx(LR);
750 } 783 }
751 784
752 785
753 ASSEMBLER_TEST_RUN(Lsr1, test) { 786 ASSEMBLER_TEST_RUN(Lsr1, test) {
754 EXPECT(test != NULL); 787 EXPECT(test != NULL);
755 typedef int (*Tst)(); 788 typedef int (*Tst)();
756 EXPECT_EQ(1, EXECUTE_TEST_CODE_INT32(Tst, test->entry())); 789 EXPECT_EQ(1, EXECUTE_TEST_CODE_INT32(Tst, test->entry()));
757 } 790 }
758 791
759 792
760 ASSEMBLER_TEST_GENERATE(Asr1, assembler) { 793 ASSEMBLER_TEST_GENERATE(Asr1, assembler) {
761 Label skip; 794 Label skip;
762 795
763 __ mov(R0, ShifterOperand(1)); 796 __ mov(R0, ShifterOperand(1));
764 __ Lsl(R0, R0, 31); 797 __ Lsl(R0, R0, 31);
765 __ Asr(R0, R0, 31); 798 __ Asr(R0, R0, 31);
766 __ mov(PC, ShifterOperand(LR)); 799 __ bx(LR);
767 } 800 }
768 801
769 802
770 ASSEMBLER_TEST_RUN(Asr1, test) { 803 ASSEMBLER_TEST_RUN(Asr1, test) {
771 EXPECT(test != NULL); 804 EXPECT(test != NULL);
772 typedef int (*Tst)(); 805 typedef int (*Tst)();
773 EXPECT_EQ(-1, EXECUTE_TEST_CODE_INT32(Tst, test->entry())); 806 EXPECT_EQ(-1, EXECUTE_TEST_CODE_INT32(Tst, test->entry()));
774 } 807 }
775 808
776 809
777 ASSEMBLER_TEST_GENERATE(Rsb, assembler) { 810 ASSEMBLER_TEST_GENERATE(Rsb, assembler) {
778 __ mov(R3, ShifterOperand(10)); 811 __ mov(R3, ShifterOperand(10));
779 __ rsb(R0, R3, ShifterOperand(42)); 812 __ rsb(R0, R3, ShifterOperand(42));
780 __ mov(PC, ShifterOperand(LR)); 813 __ bx(LR);
781 } 814 }
782 815
783 816
784 ASSEMBLER_TEST_RUN(Rsb, test) { 817 ASSEMBLER_TEST_RUN(Rsb, test) {
785 EXPECT(test != NULL); 818 EXPECT(test != NULL);
786 typedef int (*Rsb)(); 819 typedef int (*Rsb)();
787 EXPECT_EQ(32, EXECUTE_TEST_CODE_INT32(Rsb, test->entry())); 820 EXPECT_EQ(32, EXECUTE_TEST_CODE_INT32(Rsb, test->entry()));
788 } 821 }
789 822
790 823
(...skipping 25 matching lines...) Expand all
816 __ ldrh(R1, Address(R2)); 849 __ ldrh(R1, Address(R2));
817 __ cmp(R1, ShifterOperand(0)); 850 __ cmp(R1, ShifterOperand(0));
818 __ b(&Test3, EQ); 851 __ b(&Test3, EQ);
819 __ mov(R0, ShifterOperand(1)); 852 __ mov(R0, ShifterOperand(1));
820 __ b(&Done); 853 __ b(&Done);
821 __ Bind(&Test3); 854 __ Bind(&Test3);
822 855
823 __ mov(R0, ShifterOperand(0)); 856 __ mov(R0, ShifterOperand(0));
824 __ Bind(&Done); 857 __ Bind(&Done);
825 __ ldr(R1, Address(SP, (kWordSize * 30), Address::PostIndex)); 858 __ ldr(R1, Address(SP, (kWordSize * 30), Address::PostIndex));
826 __ mov(PC, ShifterOperand(LR)); 859 __ bx(LR);
827 } 860 }
828 861
829 862
830 ASSEMBLER_TEST_RUN(Ldrh, test) { 863 ASSEMBLER_TEST_RUN(Ldrh, test) {
831 EXPECT(test != NULL); 864 EXPECT(test != NULL);
832 typedef int (*Tst)(); 865 typedef int (*Tst)();
833 EXPECT_EQ(0, EXECUTE_TEST_CODE_INT32(Tst, test->entry())); 866 EXPECT_EQ(0, EXECUTE_TEST_CODE_INT32(Tst, test->entry()));
834 } 867 }
835 868
836 869
837 ASSEMBLER_TEST_GENERATE(Ldrsb, assembler) { 870 ASSEMBLER_TEST_GENERATE(Ldrsb, assembler) {
838 __ mov(R1, ShifterOperand(0xFF)); 871 __ mov(R1, ShifterOperand(0xFF));
839 __ mov(R2, ShifterOperand(SP)); 872 __ mov(R2, ShifterOperand(SP));
840 __ str(R1, Address(SP, (-kWordSize * 30), Address::PreIndex)); 873 __ str(R1, Address(SP, (-kWordSize * 30), Address::PreIndex));
841 __ ldrsb(R0, Address(R2, (-kWordSize * 30))); 874 __ ldrsb(R0, Address(R2, (-kWordSize * 30)));
842 __ ldr(R1, Address(SP, (kWordSize * 30), Address::PostIndex)); 875 __ ldr(R1, Address(SP, (kWordSize * 30), Address::PostIndex));
843 __ mov(PC, ShifterOperand(LR)); 876 __ bx(LR);
844 } 877 }
845 878
846 879
847 ASSEMBLER_TEST_RUN(Ldrsb, test) { 880 ASSEMBLER_TEST_RUN(Ldrsb, test) {
848 EXPECT(test != NULL); 881 EXPECT(test != NULL);
849 typedef int (*Tst)(); 882 typedef int (*Tst)();
850 EXPECT_EQ(-1, EXECUTE_TEST_CODE_INT32(Tst, test->entry())); 883 EXPECT_EQ(-1, EXECUTE_TEST_CODE_INT32(Tst, test->entry()));
851 } 884 }
852 885
853 886
854 ASSEMBLER_TEST_GENERATE(Ldrb, assembler) { 887 ASSEMBLER_TEST_GENERATE(Ldrb, assembler) {
855 __ mov(R1, ShifterOperand(0xFF)); 888 __ mov(R1, ShifterOperand(0xFF));
856 __ mov(R2, ShifterOperand(SP)); 889 __ mov(R2, ShifterOperand(SP));
857 __ str(R1, Address(SP, (-kWordSize * 30), Address::PreIndex)); 890 __ str(R1, Address(SP, (-kWordSize * 30), Address::PreIndex));
858 __ ldrb(R0, Address(R2, (-kWordSize * 30))); 891 __ ldrb(R0, Address(R2, (-kWordSize * 30)));
859 __ ldr(R1, Address(SP, (kWordSize * 30), Address::PostIndex)); 892 __ ldr(R1, Address(SP, (kWordSize * 30), Address::PostIndex));
860 __ mov(PC, ShifterOperand(LR)); 893 __ bx(LR);
861 } 894 }
862 895
863 896
864 ASSEMBLER_TEST_RUN(Ldrb, test) { 897 ASSEMBLER_TEST_RUN(Ldrb, test) {
865 EXPECT(test != NULL); 898 EXPECT(test != NULL);
866 typedef int (*Tst)(); 899 typedef int (*Tst)();
867 EXPECT_EQ(0xff, EXECUTE_TEST_CODE_INT32(Tst, test->entry())); 900 EXPECT_EQ(0xff, EXECUTE_TEST_CODE_INT32(Tst, test->entry()));
868 } 901 }
869 902
870 903
871 ASSEMBLER_TEST_GENERATE(Ldrsh, assembler) { 904 ASSEMBLER_TEST_GENERATE(Ldrsh, assembler) {
872 __ mov(R1, ShifterOperand(0xFF)); 905 __ mov(R1, ShifterOperand(0xFF));
873 __ mov(R2, ShifterOperand(SP)); 906 __ mov(R2, ShifterOperand(SP));
874 __ str(R1, Address(SP, (-kWordSize * 30), Address::PreIndex)); 907 __ str(R1, Address(SP, (-kWordSize * 30), Address::PreIndex));
875 __ ldrsh(R0, Address(R2, (-kWordSize * 30))); 908 __ ldrsh(R0, Address(R2, (-kWordSize * 30)));
876 __ ldr(R1, Address(SP, (kWordSize * 30), Address::PostIndex)); 909 __ ldr(R1, Address(SP, (kWordSize * 30), Address::PostIndex));
877 __ mov(PC, ShifterOperand(LR)); 910 __ bx(LR);
878 } 911 }
879 912
880 913
881 ASSEMBLER_TEST_RUN(Ldrsh, test) { 914 ASSEMBLER_TEST_RUN(Ldrsh, test) {
882 EXPECT(test != NULL); 915 EXPECT(test != NULL);
883 typedef int (*Tst)(); 916 typedef int (*Tst)();
884 EXPECT_EQ(0xff, EXECUTE_TEST_CODE_INT32(Tst, test->entry())); 917 EXPECT_EQ(0xff, EXECUTE_TEST_CODE_INT32(Tst, test->entry()));
885 } 918 }
886 919
887 920
888 ASSEMBLER_TEST_GENERATE(Ldrh1, assembler) { 921 ASSEMBLER_TEST_GENERATE(Ldrh1, assembler) {
889 __ mov(R1, ShifterOperand(0xFF)); 922 __ mov(R1, ShifterOperand(0xFF));
890 __ mov(R2, ShifterOperand(SP)); 923 __ mov(R2, ShifterOperand(SP));
891 __ str(R1, Address(SP, (-kWordSize * 30), Address::PreIndex)); 924 __ str(R1, Address(SP, (-kWordSize * 30), Address::PreIndex));
892 __ ldrh(R0, Address(R2, (-kWordSize * 30))); 925 __ ldrh(R0, Address(R2, (-kWordSize * 30)));
893 __ ldr(R1, Address(SP, (kWordSize * 30), Address::PostIndex)); 926 __ ldr(R1, Address(SP, (kWordSize * 30), Address::PostIndex));
894 __ mov(PC, ShifterOperand(LR)); 927 __ bx(LR);
895 } 928 }
896 929
897 930
898 ASSEMBLER_TEST_RUN(Ldrh1, test) { 931 ASSEMBLER_TEST_RUN(Ldrh1, test) {
899 EXPECT(test != NULL); 932 EXPECT(test != NULL);
900 typedef int (*Tst)(); 933 typedef int (*Tst)();
901 EXPECT_EQ(0xff, EXECUTE_TEST_CODE_INT32(Tst, test->entry())); 934 EXPECT_EQ(0xff, EXECUTE_TEST_CODE_INT32(Tst, test->entry()));
902 } 935 }
903 936
904 937
905 ASSEMBLER_TEST_GENERATE(Ldrd, assembler) { 938 ASSEMBLER_TEST_GENERATE(Ldrd, assembler) {
906 __ Mov(IP, SP); 939 __ Mov(IP, SP);
907 __ strd(R2, Address(SP, (-kWordSize * 30), Address::PreIndex)); 940 __ strd(R2, Address(SP, (-kWordSize * 30), Address::PreIndex));
908 __ strd(R0, Address(IP, (-kWordSize * 28))); 941 __ strd(R0, Address(IP, (-kWordSize * 28)));
909 __ ldrd(R2, Address(IP, (-kWordSize * 28))); 942 __ ldrd(R2, Address(IP, (-kWordSize * 28)));
910 __ ldrd(R0, Address(SP, (kWordSize * 30), Address::PostIndex)); 943 __ ldrd(R0, Address(SP, (kWordSize * 30), Address::PostIndex));
911 __ sub(R0, R0, ShifterOperand(R2)); 944 __ sub(R0, R0, ShifterOperand(R2));
912 __ add(R1, R1, ShifterOperand(R3)); 945 __ add(R1, R1, ShifterOperand(R3));
913 __ mov(PC, ShifterOperand(LR)); 946 __ bx(LR);
914 } 947 }
915 948
916 949
917 ASSEMBLER_TEST_RUN(Ldrd, test) { 950 ASSEMBLER_TEST_RUN(Ldrd, test) {
918 EXPECT(test != NULL); 951 EXPECT(test != NULL);
919 typedef int64_t (*Tst)(int64_t r0r1, int64_t r2r3); 952 typedef int64_t (*Tst)(int64_t r0r1, int64_t r2r3);
920 EXPECT_EQ(0x0000444400002222LL, EXECUTE_TEST_CODE_INT64_LL( 953 EXPECT_EQ(0x0000444400002222LL, EXECUTE_TEST_CODE_INT64_LL(
921 Tst, test->entry(), 0x0000111100000000LL, 0x0000333300002222LL)); 954 Tst, test->entry(), 0x0000111100000000LL, 0x0000333300002222LL));
922 } 955 }
923 956
(...skipping 23 matching lines...) Expand all
947 __ add(R5, R5, ShifterOperand(R0)); 980 __ add(R5, R5, ShifterOperand(R0));
948 __ sub(R5, R5, ShifterOperand(R1)); 981 __ sub(R5, R5, ShifterOperand(R1));
949 __ add(R5, R5, ShifterOperand(R2)); 982 __ add(R5, R5, ShifterOperand(R2));
950 __ sub(R0, R5, ShifterOperand(R3)); // R0 = result = -52. 983 __ sub(R0, R5, ShifterOperand(R3)); // R0 = result = -52.
951 __ Pop(R1); // Remove storage slot. 984 __ Pop(R1); // Remove storage slot.
952 __ Pop(R5); // Restore R5. 985 __ Pop(R5); // Restore R5.
953 __ Pop(R5); // Restore R5. 986 __ Pop(R5); // Restore R5.
954 __ Pop(R5); // Restore R5. 987 __ Pop(R5); // Restore R5.
955 __ Pop(R5); // Restore R5. 988 __ Pop(R5); // Restore R5.
956 __ Pop(R5); // Restore R5. 989 __ Pop(R5); // Restore R5.
957 __ mov(PC, ShifterOperand(LR)); 990 __ bx(LR);
958 } 991 }
959 992
960 993
961 ASSEMBLER_TEST_RUN(Ldm_stm_da, test) { 994 ASSEMBLER_TEST_RUN(Ldm_stm_da, test) {
962 EXPECT(test != NULL); 995 EXPECT(test != NULL);
963 typedef int (*Tst)(); 996 typedef int (*Tst)();
964 EXPECT_EQ(-52, EXECUTE_TEST_CODE_INT32(Tst, test->entry())); 997 EXPECT_EQ(-52, EXECUTE_TEST_CODE_INT32(Tst, test->entry()));
965 } 998 }
966 999
967 1000
968 ASSEMBLER_TEST_GENERATE(AddressShiftStrLSL1NegOffset, assembler) { 1001 ASSEMBLER_TEST_GENERATE(AddressShiftStrLSL1NegOffset, assembler) {
969 __ mov(R2, ShifterOperand(42)); 1002 __ mov(R2, ShifterOperand(42));
970 __ mov(R1, ShifterOperand(kWordSize)); 1003 __ mov(R1, ShifterOperand(kWordSize));
971 __ str(R2, Address(SP, R1, LSL, 1, Address::NegOffset)); 1004 __ str(R2, Address(SP, R1, LSL, 1, Address::NegOffset));
972 __ ldr(R0, Address(SP, (-kWordSize * 2), Address::Offset)); 1005 __ ldr(R0, Address(SP, (-kWordSize * 2), Address::Offset));
973 __ mov(PC, ShifterOperand(LR)); 1006 __ bx(LR);
974 } 1007 }
975 1008
976 1009
977 ASSEMBLER_TEST_RUN(AddressShiftStrLSL1NegOffset, test) { 1010 ASSEMBLER_TEST_RUN(AddressShiftStrLSL1NegOffset, test) {
978 EXPECT(test != NULL); 1011 EXPECT(test != NULL);
979 typedef int (*Tst)(); 1012 typedef int (*Tst)();
980 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT32(Tst, test->entry())); 1013 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT32(Tst, test->entry()));
981 } 1014 }
982 1015
983 1016
984 ASSEMBLER_TEST_GENERATE(AddressShiftLdrLSL5NegOffset, assembler) { 1017 ASSEMBLER_TEST_GENERATE(AddressShiftLdrLSL5NegOffset, assembler) {
985 __ mov(R2, ShifterOperand(42)); 1018 __ mov(R2, ShifterOperand(42));
986 __ mov(R1, ShifterOperand(kWordSize)); 1019 __ mov(R1, ShifterOperand(kWordSize));
987 __ str(R2, Address(SP, (-kWordSize * 32), Address::Offset)); 1020 __ str(R2, Address(SP, (-kWordSize * 32), Address::Offset));
988 __ ldr(R0, Address(SP, R1, LSL, 5, Address::NegOffset)); 1021 __ ldr(R0, Address(SP, R1, LSL, 5, Address::NegOffset));
989 __ mov(PC, ShifterOperand(LR)); 1022 __ bx(LR);
990 } 1023 }
991 1024
992 1025
993 ASSEMBLER_TEST_RUN(AddressShiftLdrLSL5NegOffset, test) { 1026 ASSEMBLER_TEST_RUN(AddressShiftLdrLSL5NegOffset, test) {
994 EXPECT(test != NULL); 1027 EXPECT(test != NULL);
995 typedef int (*Tst)(); 1028 typedef int (*Tst)();
996 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT32(Tst, test->entry())); 1029 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT32(Tst, test->entry()));
997 } 1030 }
998 1031
999 1032
1000 ASSEMBLER_TEST_GENERATE(AddressShiftStrLRS1NegOffset, assembler) { 1033 ASSEMBLER_TEST_GENERATE(AddressShiftStrLRS1NegOffset, assembler) {
1001 __ mov(R2, ShifterOperand(42)); 1034 __ mov(R2, ShifterOperand(42));
1002 __ mov(R1, ShifterOperand(kWordSize * 2)); 1035 __ mov(R1, ShifterOperand(kWordSize * 2));
1003 __ str(R2, Address(SP, R1, LSR, 1, Address::NegOffset)); 1036 __ str(R2, Address(SP, R1, LSR, 1, Address::NegOffset));
1004 __ ldr(R0, Address(SP, -kWordSize, Address::Offset)); 1037 __ ldr(R0, Address(SP, -kWordSize, Address::Offset));
1005 __ mov(PC, ShifterOperand(LR)); 1038 __ bx(LR);
1006 } 1039 }
1007 1040
1008 1041
1009 ASSEMBLER_TEST_RUN(AddressShiftStrLRS1NegOffset, test) { 1042 ASSEMBLER_TEST_RUN(AddressShiftStrLRS1NegOffset, test) {
1010 EXPECT(test != NULL); 1043 EXPECT(test != NULL);
1011 typedef int (*Tst)(); 1044 typedef int (*Tst)();
1012 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT32(Tst, test->entry())); 1045 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT32(Tst, test->entry()));
1013 } 1046 }
1014 1047
1015 1048
1016 ASSEMBLER_TEST_GENERATE(AddressShiftLdrLRS1NegOffset, assembler) { 1049 ASSEMBLER_TEST_GENERATE(AddressShiftLdrLRS1NegOffset, assembler) {
1017 __ mov(R2, ShifterOperand(42)); 1050 __ mov(R2, ShifterOperand(42));
1018 __ mov(R1, ShifterOperand(kWordSize * 2)); 1051 __ mov(R1, ShifterOperand(kWordSize * 2));
1019 __ str(R2, Address(SP, -kWordSize, Address::Offset)); 1052 __ str(R2, Address(SP, -kWordSize, Address::Offset));
1020 __ ldr(R0, Address(SP, R1, LSR, 1, Address::NegOffset)); 1053 __ ldr(R0, Address(SP, R1, LSR, 1, Address::NegOffset));
1021 __ mov(PC, ShifterOperand(LR)); 1054 __ bx(LR);
1022 } 1055 }
1023 1056
1024 1057
1025 ASSEMBLER_TEST_RUN(AddressShiftLdrLRS1NegOffset, test) { 1058 ASSEMBLER_TEST_RUN(AddressShiftLdrLRS1NegOffset, test) {
1026 EXPECT(test != NULL); 1059 EXPECT(test != NULL);
1027 typedef int (*Tst)(); 1060 typedef int (*Tst)();
1028 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT32(Tst, test->entry())); 1061 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT32(Tst, test->entry()));
1029 } 1062 }
1030 1063
1031 1064
1032 ASSEMBLER_TEST_GENERATE(AddressShiftStrLSLNegPreIndex, assembler) { 1065 ASSEMBLER_TEST_GENERATE(AddressShiftStrLSLNegPreIndex, assembler) {
1033 __ mov(R2, ShifterOperand(42)); 1066 __ mov(R2, ShifterOperand(42));
1034 __ mov(R1, ShifterOperand(kWordSize)); 1067 __ mov(R1, ShifterOperand(kWordSize));
1035 __ mov(R3, ShifterOperand(SP)); 1068 __ mov(R3, ShifterOperand(SP));
1036 __ str(R2, Address(SP, R1, LSL, 5, Address::NegPreIndex)); 1069 __ str(R2, Address(SP, R1, LSL, 5, Address::NegPreIndex));
1037 __ ldr(R0, Address(R3, (-kWordSize * 32), Address::Offset)); 1070 __ ldr(R0, Address(R3, (-kWordSize * 32), Address::Offset));
1038 __ mov(SP, ShifterOperand(R3)); 1071 __ mov(SP, ShifterOperand(R3));
1039 __ mov(PC, ShifterOperand(LR)); 1072 __ bx(LR);
1040 } 1073 }
1041 1074
1042 1075
1043 ASSEMBLER_TEST_RUN(AddressShiftStrLSLNegPreIndex, test) { 1076 ASSEMBLER_TEST_RUN(AddressShiftStrLSLNegPreIndex, test) {
1044 EXPECT(test != NULL); 1077 EXPECT(test != NULL);
1045 typedef int (*Tst)(); 1078 typedef int (*Tst)();
1046 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT32(Tst, test->entry())); 1079 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT32(Tst, test->entry()));
1047 } 1080 }
1048 1081
1049 1082
1050 ASSEMBLER_TEST_GENERATE(AddressShiftLdrLSLNegPreIndex, assembler) { 1083 ASSEMBLER_TEST_GENERATE(AddressShiftLdrLSLNegPreIndex, assembler) {
1051 __ mov(R2, ShifterOperand(42)); 1084 __ mov(R2, ShifterOperand(42));
1052 __ mov(R1, ShifterOperand(kWordSize)); 1085 __ mov(R1, ShifterOperand(kWordSize));
1053 __ str(R2, Address(SP, (-kWordSize * 32), Address::PreIndex)); 1086 __ str(R2, Address(SP, (-kWordSize * 32), Address::PreIndex));
1054 __ ldr(R0, Address(SP, R1, LSL, 5, Address::PostIndex)); 1087 __ ldr(R0, Address(SP, R1, LSL, 5, Address::PostIndex));
1055 __ mov(PC, ShifterOperand(LR)); 1088 __ bx(LR);
1056 } 1089 }
1057 1090
1058 1091
1059 ASSEMBLER_TEST_RUN(AddressShiftLdrLSLNegPreIndex, test) { 1092 ASSEMBLER_TEST_RUN(AddressShiftLdrLSLNegPreIndex, test) {
1060 EXPECT(test != NULL); 1093 EXPECT(test != NULL);
1061 typedef int (*Tst)(); 1094 typedef int (*Tst)();
1062 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT32(Tst, test->entry())); 1095 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT32(Tst, test->entry()));
1063 } 1096 }
1064 1097
1065 1098
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
1099 __ vcmpd(D2, D5); 1132 __ vcmpd(D2, D5);
1100 __ vmstat(); 1133 __ vmstat();
1101 __ mov(R0, ShifterOperand(0), NE); // Put failure into R0 if NE 1134 __ mov(R0, ShifterOperand(0), NE); // Put failure into R0 if NE
1102 1135
1103 // Check that 1.0 is back in D1 1136 // Check that 1.0 is back in D1
1104 __ LoadDImmediate(D5, 1.0, R1); 1137 __ LoadDImmediate(D5, 1.0, R1);
1105 __ vcmpd(D1, D5); 1138 __ vcmpd(D1, D5);
1106 __ vmstat(); 1139 __ vmstat();
1107 __ mov(R0, ShifterOperand(0), NE); // Put failure into R0 if NE 1140 __ mov(R0, ShifterOperand(0), NE); // Put failure into R0 if NE
1108 1141
1109 __ mov(PC, ShifterOperand(LR)); 1142 __ bx(LR);
1110 } 1143 }
1111 1144
1112 1145
1113 ASSEMBLER_TEST_RUN(VstmdVldmd, test) { 1146 ASSEMBLER_TEST_RUN(VstmdVldmd, test) {
1114 EXPECT(test != NULL); 1147 EXPECT(test != NULL);
1115 typedef int (*Tst)(); 1148 typedef int (*Tst)();
1116 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT32(Tst, test->entry())); 1149 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT32(Tst, test->entry()));
1117 } 1150 }
1118 1151
1119 1152
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
1152 __ vcmps(S2, S5); 1185 __ vcmps(S2, S5);
1153 __ vmstat(); 1186 __ vmstat();
1154 __ mov(R0, ShifterOperand(0), NE); // Put failure value into R0 if NE 1187 __ mov(R0, ShifterOperand(0), NE); // Put failure value into R0 if NE
1155 1188
1156 // Check that 1.0 is back in S1 1189 // Check that 1.0 is back in S1
1157 __ LoadSImmediate(S5, 1.0); 1190 __ LoadSImmediate(S5, 1.0);
1158 __ vcmps(S1, S5); 1191 __ vcmps(S1, S5);
1159 __ vmstat(); 1192 __ vmstat();
1160 __ mov(R0, ShifterOperand(0), NE); // Put failure value into R0 if NE 1193 __ mov(R0, ShifterOperand(0), NE); // Put failure value into R0 if NE
1161 1194
1162 __ mov(PC, ShifterOperand(LR)); 1195 __ bx(LR);
1163 } 1196 }
1164 1197
1165 1198
1166 ASSEMBLER_TEST_RUN(VstmsVldms, test) { 1199 ASSEMBLER_TEST_RUN(VstmsVldms, test) {
1167 EXPECT(test != NULL); 1200 EXPECT(test != NULL);
1168 typedef int (*Tst)(); 1201 typedef int (*Tst)();
1169 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT32(Tst, test->entry())); 1202 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT32(Tst, test->entry()));
1170 } 1203 }
1171 1204
1172 1205
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
1204 __ vcmpd(D2, D5); 1237 __ vcmpd(D2, D5);
1205 __ vmstat(); 1238 __ vmstat();
1206 __ mov(R0, ShifterOperand(0), NE); // Put failure into R0 if NE 1239 __ mov(R0, ShifterOperand(0), NE); // Put failure into R0 if NE
1207 1240
1208 // Check that 1.0 is back in D1 1241 // Check that 1.0 is back in D1
1209 __ LoadDImmediate(D5, 1.0, R1); 1242 __ LoadDImmediate(D5, 1.0, R1);
1210 __ vcmpd(D1, D5); 1243 __ vcmpd(D1, D5);
1211 __ vmstat(); 1244 __ vmstat();
1212 __ mov(R0, ShifterOperand(0), NE); // Put failure into R0 if NE 1245 __ mov(R0, ShifterOperand(0), NE); // Put failure into R0 if NE
1213 1246
1214 __ mov(PC, ShifterOperand(LR)); 1247 __ bx(LR);
1215 } 1248 }
1216 1249
1217 1250
1218 ASSEMBLER_TEST_RUN(VstmdVldmd1, test) { 1251 ASSEMBLER_TEST_RUN(VstmdVldmd1, test) {
1219 EXPECT(test != NULL); 1252 EXPECT(test != NULL);
1220 typedef int (*Tst)(); 1253 typedef int (*Tst)();
1221 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT32(Tst, test->entry())); 1254 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT32(Tst, test->entry()));
1222 } 1255 }
1223 1256
1224 1257
(...skipping 30 matching lines...) Expand all
1255 __ vcmps(S2, S5); 1288 __ vcmps(S2, S5);
1256 __ vmstat(); 1289 __ vmstat();
1257 __ mov(R0, ShifterOperand(0), NE); // Put failure value into R0 if NE 1290 __ mov(R0, ShifterOperand(0), NE); // Put failure value into R0 if NE
1258 1291
1259 // Check that 1.0 is back in S1 1292 // Check that 1.0 is back in S1
1260 __ LoadSImmediate(S5, 1.0); 1293 __ LoadSImmediate(S5, 1.0);
1261 __ vcmps(S1, S5); 1294 __ vcmps(S1, S5);
1262 __ vmstat(); 1295 __ vmstat();
1263 __ mov(R0, ShifterOperand(0), NE); // Put failure value into R0 if NE 1296 __ mov(R0, ShifterOperand(0), NE); // Put failure value into R0 if NE
1264 1297
1265 __ mov(PC, ShifterOperand(LR)); 1298 __ bx(LR);
1266 } 1299 }
1267 1300
1268 1301
1269 ASSEMBLER_TEST_RUN(VstmsVldms1, test) { 1302 ASSEMBLER_TEST_RUN(VstmsVldms1, test) {
1270 EXPECT(test != NULL); 1303 EXPECT(test != NULL);
1271 typedef int (*Tst)(); 1304 typedef int (*Tst)();
1272 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT32(Tst, test->entry())); 1305 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT32(Tst, test->entry()));
1273 } 1306 }
1274 1307
1275 1308
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
1312 __ vcmpd(D6, D10); 1345 __ vcmpd(D6, D10);
1313 __ vmstat(); 1346 __ vmstat();
1314 __ mov(R0, ShifterOperand(0), NE); // Put failure into R0 if NE 1347 __ mov(R0, ShifterOperand(0), NE); // Put failure into R0 if NE
1315 1348
1316 // Check that 0.0 is in D5 1349 // Check that 0.0 is in D5
1317 __ LoadDImmediate(D10, 0.0, R1); 1350 __ LoadDImmediate(D10, 0.0, R1);
1318 __ vcmpd(D5, D10); 1351 __ vcmpd(D5, D10);
1319 __ vmstat(); 1352 __ vmstat();
1320 __ mov(R0, ShifterOperand(0), NE); // Put failure into R0 if NE 1353 __ mov(R0, ShifterOperand(0), NE); // Put failure into R0 if NE
1321 1354
1322 __ mov(PC, ShifterOperand(LR)); 1355 __ bx(LR);
1323 } 1356 }
1324 1357
1325 1358
1326 ASSEMBLER_TEST_RUN(VstmdVldmd_off, test) { 1359 ASSEMBLER_TEST_RUN(VstmdVldmd_off, test) {
1327 EXPECT(test != NULL); 1360 EXPECT(test != NULL);
1328 typedef int (*Tst)(); 1361 typedef int (*Tst)();
1329 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT32(Tst, test->entry())); 1362 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT32(Tst, test->entry()));
1330 } 1363 }
1331 1364
1332 1365
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
1367 __ vcmps(S6, S10); 1400 __ vcmps(S6, S10);
1368 __ vmstat(); 1401 __ vmstat();
1369 __ mov(R0, ShifterOperand(0), NE); // Put failure value into R0 if NE 1402 __ mov(R0, ShifterOperand(0), NE); // Put failure value into R0 if NE
1370 1403
1371 // Check that 0.0 is back in S5 1404 // Check that 0.0 is back in S5
1372 __ LoadSImmediate(S10, 0.0); 1405 __ LoadSImmediate(S10, 0.0);
1373 __ vcmps(S5, S10); 1406 __ vcmps(S5, S10);
1374 __ vmstat(); 1407 __ vmstat();
1375 __ mov(R0, ShifterOperand(0), NE); // Put failure value into R0 if NE 1408 __ mov(R0, ShifterOperand(0), NE); // Put failure value into R0 if NE
1376 1409
1377 __ mov(PC, ShifterOperand(LR)); 1410 __ bx(LR);
1378 } 1411 }
1379 1412
1380 1413
1381 ASSEMBLER_TEST_RUN(VstmsVldms_off, test) { 1414 ASSEMBLER_TEST_RUN(VstmsVldms_off, test) {
1382 EXPECT(test != NULL); 1415 EXPECT(test != NULL);
1383 typedef int (*Tst)(); 1416 typedef int (*Tst)();
1384 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT32(Tst, test->entry())); 1417 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT32(Tst, test->entry()));
1385 } 1418 }
1386 1419
1387 1420
1388 // Check that assembler mrc instruction encoding, and simulator decoding 1421 // Check that assembler mrc instruction encoding, and simulator decoding
1389 // are in agreement. 1422 // are in agreement.
1390 #if defined(USING_SIMULATOR) 1423 #if defined(USING_SIMULATOR)
1391 ASSEMBLER_TEST_GENERATE(MrcHaveDiv, assembler) { 1424 ASSEMBLER_TEST_GENERATE(MrcHaveDiv, assembler) {
1392 __ mrc(R0, 15, 0, 0, 2, 0); // Accesses ID_ISAR0. 1425 __ mrc(R0, 15, 0, 0, 2, 0); // Accesses ID_ISAR0.
1393 // Bits 24 - 27 describe the presence of integer division. Bit 24 is set if 1426 // Bits 24 - 27 describe the presence of integer division. Bit 24 is set if
1394 // it is available in the Thumb instruction set. Bit 25 is set if it is 1427 // it is available in the Thumb instruction set. Bit 25 is set if it is
1395 // available both in Thumb and in the ARM instruction set. 1428 // available both in Thumb and in the ARM instruction set.
1396 __ Lsr(R0, R0, 24); 1429 __ Lsr(R0, R0, 24);
1397 __ and_(R0, R0, ShifterOperand(0xf)); 1430 __ and_(R0, R0, ShifterOperand(0xf));
1398 __ mov(PC, ShifterOperand(LR)); 1431 __ bx(LR);
1399 } 1432 }
1400 1433
1401 1434
1402 ASSEMBLER_TEST_RUN(MrcHaveDiv, test) { 1435 ASSEMBLER_TEST_RUN(MrcHaveDiv, test) {
1403 EXPECT(test != NULL); 1436 EXPECT(test != NULL);
1404 typedef int (*Tst)(); 1437 typedef int (*Tst)();
1405 bool b = CPUFeatures::integer_division_supported(); 1438 bool b = CPUFeatures::integer_division_supported();
1406 CPUFeatures::set_integer_division_supported(true); 1439 CPUFeatures::set_integer_division_supported(true);
1407 EXPECT_EQ(2, EXECUTE_TEST_CODE_INT32(Tst, test->entry())); 1440 EXPECT_EQ(2, EXECUTE_TEST_CODE_INT32(Tst, test->entry()));
1408 CPUFeatures::set_integer_division_supported(b); 1441 CPUFeatures::set_integer_division_supported(b);
1409 } 1442 }
1410 1443
1411 1444
1412 ASSEMBLER_TEST_GENERATE(MrcNoDiv, assembler) { 1445 ASSEMBLER_TEST_GENERATE(MrcNoDiv, assembler) {
1413 __ mrc(R0, 15, 0, 0, 2, 0); 1446 __ mrc(R0, 15, 0, 0, 2, 0);
1414 __ Lsr(R0, R0, 24); 1447 __ Lsr(R0, R0, 24);
1415 __ and_(R0, R0, ShifterOperand(0xf)); 1448 __ and_(R0, R0, ShifterOperand(0xf));
1416 __ mov(PC, ShifterOperand(LR)); 1449 __ bx(LR);
1417 } 1450 }
1418 1451
1419 1452
1420 ASSEMBLER_TEST_RUN(MrcNoDiv, test) { 1453 ASSEMBLER_TEST_RUN(MrcNoDiv, test) {
1421 EXPECT(test != NULL); 1454 EXPECT(test != NULL);
1422 typedef int (*Tst)(); 1455 typedef int (*Tst)();
1423 bool b = CPUFeatures::integer_division_supported(); 1456 bool b = CPUFeatures::integer_division_supported();
1424 CPUFeatures::set_integer_division_supported(false); 1457 CPUFeatures::set_integer_division_supported(false);
1425 EXPECT_EQ(0, EXECUTE_TEST_CODE_INT32(Tst, test->entry())); 1458 EXPECT_EQ(0, EXECUTE_TEST_CODE_INT32(Tst, test->entry()));
1426 CPUFeatures::set_integer_division_supported(b); 1459 CPUFeatures::set_integer_division_supported(b);
1427 } 1460 }
1428 1461
1429 1462
1430 ASSEMBLER_TEST_GENERATE(MrcReal, assembler) { 1463 ASSEMBLER_TEST_GENERATE(MrcReal, assembler) {
1431 __ mrc(R0, 15, 0, 0, 2, 0); 1464 __ mrc(R0, 15, 0, 0, 2, 0);
1432 __ Lsr(R0, R0, 24); 1465 __ Lsr(R0, R0, 24);
1433 __ and_(R0, R0, ShifterOperand(0xf)); 1466 __ and_(R0, R0, ShifterOperand(0xf));
1434 __ mov(PC, ShifterOperand(LR)); 1467 __ bx(LR);
1435 } 1468 }
1436 1469
1437 1470
1438 ASSEMBLER_TEST_RUN(MrcReal, test) { 1471 ASSEMBLER_TEST_RUN(MrcReal, test) {
1439 EXPECT(test != NULL); 1472 EXPECT(test != NULL);
1440 typedef int (*Tst)(); 1473 typedef int (*Tst)();
1441 bool have_div = CPUFeatures::integer_division_supported(); 1474 bool have_div = CPUFeatures::integer_division_supported();
1442 int32_t r = EXECUTE_TEST_CODE_INT32(Tst, test->entry()); 1475 int32_t r = EXECUTE_TEST_CODE_INT32(Tst, test->entry());
1443 if (have_div) { 1476 if (have_div) {
1444 EXPECT_EQ(2, r); 1477 EXPECT_EQ(2, r);
1445 } else { 1478 } else {
1446 EXPECT_EQ(0, r); 1479 EXPECT_EQ(0, r);
1447 } 1480 }
1448 } 1481 }
1449 #endif // defined(USING_SIMULATOR) 1482 #endif // defined(USING_SIMULATOR)
1450 1483
1451 1484
1452 ASSEMBLER_TEST_GENERATE(Udiv, assembler) { 1485 ASSEMBLER_TEST_GENERATE(Udiv, assembler) {
1453 if (CPUFeatures::integer_division_supported()) { 1486 if (CPUFeatures::integer_division_supported()) {
1454 __ mov(R0, ShifterOperand(27)); 1487 __ mov(R0, ShifterOperand(27));
1455 __ mov(R1, ShifterOperand(9)); 1488 __ mov(R1, ShifterOperand(9));
1456 __ udiv(R2, R0, R1); 1489 __ udiv(R2, R0, R1);
1457 __ Mov(R0, R2); 1490 __ Mov(R0, R2);
1458 } else { 1491 } else {
1459 __ mov(R0, ShifterOperand(3)); 1492 __ mov(R0, ShifterOperand(3));
1460 } 1493 }
1461 __ mov(PC, ShifterOperand(LR)); 1494 __ bx(LR);
1462 } 1495 }
1463 1496
1464 1497
1465 ASSEMBLER_TEST_RUN(Udiv, test) { 1498 ASSEMBLER_TEST_RUN(Udiv, test) {
1466 EXPECT(test != NULL); 1499 EXPECT(test != NULL);
1467 typedef int (*Tst)(); 1500 typedef int (*Tst)();
1468 EXPECT_EQ(3, EXECUTE_TEST_CODE_INT32(Tst, test->entry())); 1501 EXPECT_EQ(3, EXECUTE_TEST_CODE_INT32(Tst, test->entry()));
1469 } 1502 }
1470 1503
1471 1504
1472 ASSEMBLER_TEST_GENERATE(Sdiv, assembler) { 1505 ASSEMBLER_TEST_GENERATE(Sdiv, assembler) {
1473 if (CPUFeatures::integer_division_supported()) { 1506 if (CPUFeatures::integer_division_supported()) {
1474 __ mov(R0, ShifterOperand(27)); 1507 __ mov(R0, ShifterOperand(27));
1475 __ LoadImmediate(R1, -9); 1508 __ LoadImmediate(R1, -9);
1476 __ sdiv(R2, R0, R1); 1509 __ sdiv(R2, R0, R1);
1477 __ Mov(R0, R2); 1510 __ Mov(R0, R2);
1478 } else { 1511 } else {
1479 __ LoadImmediate(R0, -3); 1512 __ LoadImmediate(R0, -3);
1480 } 1513 }
1481 __ mov(PC, ShifterOperand(LR)); 1514 __ bx(LR);
1482 } 1515 }
1483 1516
1484 1517
1485 ASSEMBLER_TEST_RUN(Sdiv, test) { 1518 ASSEMBLER_TEST_RUN(Sdiv, test) {
1486 EXPECT(test != NULL); 1519 EXPECT(test != NULL);
1487 typedef int (*Tst)(); 1520 typedef int (*Tst)();
1488 EXPECT_EQ(-3, EXECUTE_TEST_CODE_INT32(Tst, test->entry())); 1521 EXPECT_EQ(-3, EXECUTE_TEST_CODE_INT32(Tst, test->entry()));
1489 } 1522 }
1490 1523
1491 1524
1492 ASSEMBLER_TEST_GENERATE(Udiv_zero, assembler) { 1525 ASSEMBLER_TEST_GENERATE(Udiv_zero, assembler) {
1493 if (CPUFeatures::integer_division_supported()) { 1526 if (CPUFeatures::integer_division_supported()) {
1494 __ mov(R0, ShifterOperand(27)); 1527 __ mov(R0, ShifterOperand(27));
1495 __ mov(R1, ShifterOperand(0)); 1528 __ mov(R1, ShifterOperand(0));
1496 __ udiv(R2, R0, R1); 1529 __ udiv(R2, R0, R1);
1497 __ Mov(R0, R2); 1530 __ Mov(R0, R2);
1498 } else { 1531 } else {
1499 __ LoadImmediate(R0, 0); 1532 __ LoadImmediate(R0, 0);
1500 } 1533 }
1501 __ mov(PC, ShifterOperand(LR)); 1534 __ bx(LR);
1502 } 1535 }
1503 1536
1504 1537
1505 ASSEMBLER_TEST_RUN(Udiv_zero, test) { 1538 ASSEMBLER_TEST_RUN(Udiv_zero, test) {
1506 EXPECT(test != NULL); 1539 EXPECT(test != NULL);
1507 typedef int (*Tst)(); 1540 typedef int (*Tst)();
1508 EXPECT_EQ(0, EXECUTE_TEST_CODE_INT32(Tst, test->entry())); 1541 EXPECT_EQ(0, EXECUTE_TEST_CODE_INT32(Tst, test->entry()));
1509 } 1542 }
1510 1543
1511 1544
1512 ASSEMBLER_TEST_GENERATE(Sdiv_zero, assembler) { 1545 ASSEMBLER_TEST_GENERATE(Sdiv_zero, assembler) {
1513 if (CPUFeatures::integer_division_supported()) { 1546 if (CPUFeatures::integer_division_supported()) {
1514 __ mov(R0, ShifterOperand(27)); 1547 __ mov(R0, ShifterOperand(27));
1515 __ mov(R1, ShifterOperand(0)); 1548 __ mov(R1, ShifterOperand(0));
1516 __ udiv(R2, R0, R1); 1549 __ udiv(R2, R0, R1);
1517 __ Mov(R0, R2); 1550 __ Mov(R0, R2);
1518 } else { 1551 } else {
1519 __ LoadImmediate(R0, 0); 1552 __ LoadImmediate(R0, 0);
1520 } 1553 }
1521 __ mov(PC, ShifterOperand(LR)); 1554 __ bx(LR);
1522 } 1555 }
1523 1556
1524 1557
1525 ASSEMBLER_TEST_RUN(Sdiv_zero, test) { 1558 ASSEMBLER_TEST_RUN(Sdiv_zero, test) {
1526 EXPECT(test != NULL); 1559 EXPECT(test != NULL);
1527 typedef int (*Tst)(); 1560 typedef int (*Tst)();
1528 EXPECT_EQ(0, EXECUTE_TEST_CODE_INT32(Tst, test->entry())); 1561 EXPECT_EQ(0, EXECUTE_TEST_CODE_INT32(Tst, test->entry()));
1529 } 1562 }
1530 1563
1531 1564
1532 ASSEMBLER_TEST_GENERATE(Udiv_corner, assembler) { 1565 ASSEMBLER_TEST_GENERATE(Udiv_corner, assembler) {
1533 if (CPUFeatures::integer_division_supported()) { 1566 if (CPUFeatures::integer_division_supported()) {
1534 __ LoadImmediate(R0, 0x80000000); 1567 __ LoadImmediate(R0, 0x80000000);
1535 __ LoadImmediate(R1, 0xffffffff); 1568 __ LoadImmediate(R1, 0xffffffff);
1536 __ udiv(R2, R0, R1); 1569 __ udiv(R2, R0, R1);
1537 __ Mov(R0, R2); 1570 __ Mov(R0, R2);
1538 } else { 1571 } else {
1539 __ LoadImmediate(R0, 0); 1572 __ LoadImmediate(R0, 0);
1540 } 1573 }
1541 __ mov(PC, ShifterOperand(LR)); 1574 __ bx(LR);
1542 } 1575 }
1543 1576
1544 1577
1545 ASSEMBLER_TEST_RUN(Udiv_corner, test) { 1578 ASSEMBLER_TEST_RUN(Udiv_corner, test) {
1546 EXPECT(test != NULL); 1579 EXPECT(test != NULL);
1547 typedef int (*Tst)(); 1580 typedef int (*Tst)();
1548 EXPECT_EQ(0, EXECUTE_TEST_CODE_INT32(Tst, test->entry())); 1581 EXPECT_EQ(0, EXECUTE_TEST_CODE_INT32(Tst, test->entry()));
1549 } 1582 }
1550 1583
1551 1584
1552 ASSEMBLER_TEST_GENERATE(Sdiv_corner, assembler) { 1585 ASSEMBLER_TEST_GENERATE(Sdiv_corner, assembler) {
1553 if (CPUFeatures::integer_division_supported()) { 1586 if (CPUFeatures::integer_division_supported()) {
1554 __ LoadImmediate(R0, 0x80000000); 1587 __ LoadImmediate(R0, 0x80000000);
1555 __ LoadImmediate(R1, 0xffffffff); 1588 __ LoadImmediate(R1, 0xffffffff);
1556 __ sdiv(R2, R0, R1); 1589 __ sdiv(R2, R0, R1);
1557 __ Mov(R0, R2); 1590 __ Mov(R0, R2);
1558 } else { 1591 } else {
1559 __ LoadImmediate(R0, 0x80000000); 1592 __ LoadImmediate(R0, 0x80000000);
1560 } 1593 }
1561 __ mov(PC, ShifterOperand(LR)); 1594 __ bx(LR);
1562 } 1595 }
1563 1596
1564 1597
1565 ASSEMBLER_TEST_RUN(Sdiv_corner, test) { 1598 ASSEMBLER_TEST_RUN(Sdiv_corner, test) {
1566 EXPECT(test != NULL); 1599 EXPECT(test != NULL);
1567 typedef int (*Tst)(); 1600 typedef int (*Tst)();
1568 EXPECT_EQ(static_cast<int32_t>(0x80000000), 1601 EXPECT_EQ(static_cast<int32_t>(0x80000000),
1569 EXECUTE_TEST_CODE_INT32(Tst, test->entry())); 1602 EXECUTE_TEST_CODE_INT32(Tst, test->entry()));
1570 } 1603 }
1571 1604
1572 1605
1573 ASSEMBLER_TEST_GENERATE(Muls, assembler) { 1606 ASSEMBLER_TEST_GENERATE(Muls, assembler) {
1574 __ mov(R0, ShifterOperand(3)); 1607 __ mov(R0, ShifterOperand(3));
1575 __ LoadImmediate(R1, -9); 1608 __ LoadImmediate(R1, -9);
1576 __ muls(R2, R0, R1); 1609 __ muls(R2, R0, R1);
1577 __ mov(R0, ShifterOperand(42), MI); 1610 __ mov(R0, ShifterOperand(42), MI);
1578 __ mov(PC, ShifterOperand(LR)); 1611 __ bx(LR);
1579 } 1612 }
1580 1613
1581 1614
1582 ASSEMBLER_TEST_RUN(Muls, test) { 1615 ASSEMBLER_TEST_RUN(Muls, test) {
1583 EXPECT(test != NULL); 1616 EXPECT(test != NULL);
1584 typedef int (*Tst)(); 1617 typedef int (*Tst)();
1585 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT32(Tst, test->entry())); 1618 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT32(Tst, test->entry()));
1586 } 1619 }
1587 1620
1588 1621
1589 // Called from assembler_test.cc. 1622 // Called from assembler_test.cc.
1590 // LR: return address. 1623 // LR: return address.
1591 // R0: context. 1624 // R0: context.
1592 // R1: value. 1625 // R1: value.
1593 // R2: growable array. 1626 // R2: growable array.
1594 ASSEMBLER_TEST_GENERATE(StoreIntoObject, assembler) { 1627 ASSEMBLER_TEST_GENERATE(StoreIntoObject, assembler) {
1595 __ PushList((1 << CTX) | (1 << LR)); 1628 __ PushList((1 << CTX) | (1 << LR));
1596 __ mov(CTX, ShifterOperand(R0)); 1629 __ mov(CTX, ShifterOperand(R0));
1597 __ StoreIntoObject(R2, 1630 __ StoreIntoObject(R2,
1598 FieldAddress(R2, GrowableObjectArray::data_offset()), 1631 FieldAddress(R2, GrowableObjectArray::data_offset()),
1599 R1); 1632 R1);
1600 __ PopList((1 << CTX) | (1 << LR)); 1633 __ PopList((1 << CTX) | (1 << LR));
1601 __ Ret(); 1634 __ Ret();
1602 } 1635 }
1603 1636
1604 } // namespace dart 1637 } // namespace dart
1605 1638
1606 #endif // defined TARGET_ARCH_ARM 1639 #endif // defined TARGET_ARCH_ARM
OLDNEW
« no previous file with comments | « runtime/vm/assembler_arm.cc ('k') | runtime/vm/disassembler_arm.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698