OLD | NEW |
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" |
(...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
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); | |
193 __ bx(LR); | 192 __ bx(LR); |
194 } | 193 } |
195 | 194 |
196 | 195 |
197 ASSEMBLER_TEST_RUN(SingleFPOperations, test) { | 196 ASSEMBLER_TEST_RUN(SingleFPOperations, test) { |
198 EXPECT(test != NULL); | 197 EXPECT(test != NULL); |
199 typedef float (*SingleFPOperations)(); | 198 typedef float (*SingleFPOperations)(); |
200 float res = EXECUTE_TEST_CODE_FLOAT(SingleFPOperations, test->entry()); | 199 float res = EXECUTE_TEST_CODE_FLOAT(SingleFPOperations, test->entry()); |
201 EXPECT_FLOAT_EQ(3.8340579f, res, 0.001f); | 200 EXPECT_FLOAT_EQ(3.8340579f, res, 0.001f); |
202 } | 201 } |
203 | 202 |
204 | 203 |
205 ASSEMBLER_TEST_GENERATE(DoubleFPOperations, assembler) { | 204 ASSEMBLER_TEST_GENERATE(DoubleFPOperations, assembler) { |
206 __ LoadDImmediate(D0, 12.3, R0); | 205 __ LoadDImmediate(D0, 12.3, R0); |
207 __ LoadDImmediate(D1, 3.4, R0); | 206 __ LoadDImmediate(D1, 3.4, R0); |
208 __ vnegd(D0, D0); // -12.3 | 207 __ vnegd(D0, D0); // -12.3 |
209 __ vabsd(D0, D0); // 12.3 | 208 __ vabsd(D0, D0); // 12.3 |
210 __ vaddd(D0, D0, D1); // 15.7 | 209 __ vaddd(D0, D0, D1); // 15.7 |
211 __ vmuld(D0, D0, D1); // 53.38 | 210 __ vmuld(D0, D0, D1); // 53.38 |
212 __ vsubd(D0, D0, D1); // 49.98 | 211 __ vsubd(D0, D0, D1); // 49.98 |
213 __ vdivd(D0, D0, D1); // 14.7 | 212 __ vdivd(D0, D0, D1); // 14.7 |
214 __ vsqrtd(D0, D0); // 3.8340579 | 213 __ vsqrtd(D0, D0); // 3.8340579 |
215 __ vmovrrd(R0, R1, D0); | |
216 __ bx(LR); | 214 __ bx(LR); |
217 } | 215 } |
218 | 216 |
219 | 217 |
220 ASSEMBLER_TEST_RUN(DoubleFPOperations, test) { | 218 ASSEMBLER_TEST_RUN(DoubleFPOperations, test) { |
221 EXPECT(test != NULL); | 219 EXPECT(test != NULL); |
222 typedef double (*DoubleFPOperations)(); | 220 typedef double (*DoubleFPOperations)(); |
223 double res = EXECUTE_TEST_CODE_DOUBLE(DoubleFPOperations, test->entry()); | 221 double res = EXECUTE_TEST_CODE_DOUBLE(DoubleFPOperations, test->entry()); |
224 EXPECT_FLOAT_EQ(3.8340579, res, 0.001); | 222 EXPECT_FLOAT_EQ(3.8340579, res, 0.001); |
225 } | 223 } |
(...skipping 14 matching lines...) Expand all Loading... |
240 ASSEMBLER_TEST_RUN(DoubleSqrtNeg, test) { | 238 ASSEMBLER_TEST_RUN(DoubleSqrtNeg, test) { |
241 EXPECT(test != NULL); | 239 EXPECT(test != NULL); |
242 typedef int (*DoubleSqrtNeg)(); | 240 typedef int (*DoubleSqrtNeg)(); |
243 EXPECT_EQ(1, EXECUTE_TEST_CODE_INT32(DoubleSqrtNeg, test->entry())); | 241 EXPECT_EQ(1, EXECUTE_TEST_CODE_INT32(DoubleSqrtNeg, test->entry())); |
244 } | 242 } |
245 | 243 |
246 | 244 |
247 ASSEMBLER_TEST_GENERATE(IntToDoubleConversion, assembler) { | 245 ASSEMBLER_TEST_GENERATE(IntToDoubleConversion, assembler) { |
248 __ mov(R3, ShifterOperand(6)); | 246 __ mov(R3, ShifterOperand(6)); |
249 __ vmovsr(S3, R3); | 247 __ vmovsr(S3, R3); |
250 __ vcvtdi(D1, S3); | 248 __ vcvtdi(D0, S3); |
251 __ vmovrrd(R0, R1, D1); | |
252 __ bx(LR); | 249 __ bx(LR); |
253 } | 250 } |
254 | 251 |
255 | 252 |
256 ASSEMBLER_TEST_RUN(IntToDoubleConversion, test) { | 253 ASSEMBLER_TEST_RUN(IntToDoubleConversion, test) { |
257 typedef double (*IntToDoubleConversionCode)(); | 254 typedef double (*IntToDoubleConversionCode)(); |
258 EXPECT(test != NULL); | 255 EXPECT(test != NULL); |
259 double res = EXECUTE_TEST_CODE_DOUBLE(IntToDoubleConversionCode, | 256 double res = EXECUTE_TEST_CODE_DOUBLE(IntToDoubleConversionCode, |
260 test->entry()); | 257 test->entry()); |
261 EXPECT_FLOAT_EQ(6.0, res, 0.001); | 258 EXPECT_FLOAT_EQ(6.0, res, 0.001); |
262 } | 259 } |
263 | 260 |
264 | 261 |
265 ASSEMBLER_TEST_GENERATE(LongToDoubleConversion, assembler) { | 262 ASSEMBLER_TEST_GENERATE(LongToDoubleConversion, assembler) { |
266 int64_t value = 60000000000LL; | 263 int64_t value = 60000000000LL; |
267 __ LoadImmediate(R0, Utils::Low32Bits(value)); | 264 __ LoadImmediate(R0, Utils::Low32Bits(value)); |
268 __ LoadImmediate(R1, Utils::High32Bits(value)); | 265 __ LoadImmediate(R1, Utils::High32Bits(value)); |
269 __ vmovsr(S0, R0); | 266 __ vmovsr(S0, R0); |
270 __ vmovsr(S2, R1); | 267 __ vmovsr(S2, R1); |
271 __ vcvtdu(D0, S0); | 268 __ vcvtdu(D0, S0); |
272 __ vcvtdi(D1, S2); | 269 __ vcvtdi(D1, S2); |
273 __ LoadDImmediate(D2, 1.0 * (1LL << 32), R0); | 270 __ LoadDImmediate(D2, 1.0 * (1LL << 32), R0); |
274 __ vmlad(D0, D1, D2); | 271 __ vmlad(D0, D1, D2); |
275 __ vmovrrd(R0, R1, D0); | |
276 __ bx(LR); | 272 __ bx(LR); |
277 } | 273 } |
278 | 274 |
279 | 275 |
280 ASSEMBLER_TEST_RUN(LongToDoubleConversion, test) { | 276 ASSEMBLER_TEST_RUN(LongToDoubleConversion, test) { |
281 typedef double (*LongToDoubleConversionCode)(); | 277 typedef double (*LongToDoubleConversionCode)(); |
282 EXPECT(test != NULL); | 278 EXPECT(test != NULL); |
283 double res = EXECUTE_TEST_CODE_DOUBLE(LongToDoubleConversionCode, | 279 double res = EXECUTE_TEST_CODE_DOUBLE(LongToDoubleConversionCode, |
284 test->entry()); | 280 test->entry()); |
285 EXPECT_FLOAT_EQ(60000000000.0, res, 0.001); | 281 EXPECT_FLOAT_EQ(60000000000.0, res, 0.001); |
286 } | 282 } |
287 | 283 |
288 | 284 |
289 ASSEMBLER_TEST_GENERATE(IntToFloatConversion, assembler) { | 285 ASSEMBLER_TEST_GENERATE(IntToFloatConversion, assembler) { |
290 __ mov(R3, ShifterOperand(6)); | 286 __ mov(R3, ShifterOperand(6)); |
291 __ vmovsr(S3, R3); | 287 __ vmovsr(S3, R3); |
292 __ vcvtsi(S1, S3); | 288 __ vcvtsi(S0, S3); |
293 __ vmovrs(R0, S1); | |
294 __ bx(LR); | 289 __ bx(LR); |
295 } | 290 } |
296 | 291 |
297 | 292 |
298 ASSEMBLER_TEST_RUN(IntToFloatConversion, test) { | 293 ASSEMBLER_TEST_RUN(IntToFloatConversion, test) { |
299 typedef float (*IntToFloatConversionCode)(); | 294 typedef float (*IntToFloatConversionCode)(); |
300 EXPECT(test != NULL); | 295 EXPECT(test != NULL); |
301 float res = EXECUTE_TEST_CODE_FLOAT(IntToFloatConversionCode, test->entry()); | 296 float res = EXECUTE_TEST_CODE_FLOAT(IntToFloatConversionCode, test->entry()); |
302 EXPECT_FLOAT_EQ(6.0, res, 0.001); | 297 EXPECT_FLOAT_EQ(6.0, res, 0.001); |
303 } | 298 } |
304 | 299 |
305 | 300 |
306 ASSEMBLER_TEST_GENERATE(FloatToIntConversion, assembler) { | 301 ASSEMBLER_TEST_GENERATE(FloatToIntConversion, assembler) { |
307 __ vmovsr(S1, R0); | 302 __ vcvtis(S1, S0); |
308 __ vcvtis(S0, S1); | 303 __ vmovrs(R0, S1); |
309 __ vmovrs(R0, S0); | |
310 __ bx(LR); | 304 __ bx(LR); |
311 } | 305 } |
312 | 306 |
313 | 307 |
314 ASSEMBLER_TEST_RUN(FloatToIntConversion, test) { | 308 ASSEMBLER_TEST_RUN(FloatToIntConversion, test) { |
315 typedef int (*FloatToIntConversion)(float arg); | 309 typedef int (*FloatToIntConversion)(float arg); |
316 EXPECT(test != NULL); | 310 EXPECT(test != NULL); |
317 EXPECT_EQ(12, | 311 EXPECT_EQ(12, |
318 EXECUTE_TEST_CODE_INT32_F(FloatToIntConversion, test->entry(), | 312 EXECUTE_TEST_CODE_INT32_F(FloatToIntConversion, test->entry(), |
319 12.8f)); | 313 12.8f)); |
320 EXPECT_EQ(INT_MIN, | 314 EXPECT_EQ(INT_MIN, |
321 EXECUTE_TEST_CODE_INT32_F(FloatToIntConversion, test->entry(), | 315 EXECUTE_TEST_CODE_INT32_F(FloatToIntConversion, test->entry(), |
322 -FLT_MAX)); | 316 -FLT_MAX)); |
323 EXPECT_EQ(INT_MAX, | 317 EXPECT_EQ(INT_MAX, |
324 EXECUTE_TEST_CODE_INT32_F(FloatToIntConversion, test->entry(), | 318 EXECUTE_TEST_CODE_INT32_F(FloatToIntConversion, test->entry(), |
325 FLT_MAX)); | 319 FLT_MAX)); |
326 } | 320 } |
327 | 321 |
328 | 322 |
329 ASSEMBLER_TEST_GENERATE(DoubleToIntConversion, assembler) { | 323 ASSEMBLER_TEST_GENERATE(DoubleToIntConversion, assembler) { |
330 __ vmovdrr(D1, R0, R1); | 324 __ vcvtid(S0, D0); |
331 __ vcvtid(S0, D1); | |
332 __ vmovrs(R0, S0); | 325 __ vmovrs(R0, S0); |
333 __ bx(LR); | 326 __ bx(LR); |
334 } | 327 } |
335 | 328 |
336 | 329 |
337 ASSEMBLER_TEST_RUN(DoubleToIntConversion, test) { | 330 ASSEMBLER_TEST_RUN(DoubleToIntConversion, test) { |
338 typedef int (*DoubleToIntConversion)(double arg); | 331 typedef int (*DoubleToIntConversion)(double arg); |
339 EXPECT(test != NULL); | 332 EXPECT(test != NULL); |
340 EXPECT_EQ(12, | 333 EXPECT_EQ(12, |
341 EXECUTE_TEST_CODE_INT32_D(DoubleToIntConversion, test->entry(), | 334 EXECUTE_TEST_CODE_INT32_D(DoubleToIntConversion, test->entry(), |
342 12.8)); | 335 12.8)); |
343 EXPECT_EQ(INT_MIN, | 336 EXPECT_EQ(INT_MIN, |
344 EXECUTE_TEST_CODE_INT32_D(DoubleToIntConversion, test->entry(), | 337 EXECUTE_TEST_CODE_INT32_D(DoubleToIntConversion, test->entry(), |
345 -DBL_MAX)); | 338 -DBL_MAX)); |
346 EXPECT_EQ(INT_MAX, | 339 EXPECT_EQ(INT_MAX, |
347 EXECUTE_TEST_CODE_INT32_D(DoubleToIntConversion, test->entry(), | 340 EXECUTE_TEST_CODE_INT32_D(DoubleToIntConversion, test->entry(), |
348 DBL_MAX)); | 341 DBL_MAX)); |
349 } | 342 } |
350 | 343 |
351 | 344 |
352 ASSEMBLER_TEST_GENERATE(FloatToDoubleConversion, assembler) { | 345 ASSEMBLER_TEST_GENERATE(FloatToDoubleConversion, assembler) { |
353 __ LoadSImmediate(S1, 12.8f); | 346 __ LoadSImmediate(S2, 12.8f); |
354 __ vcvtds(D2, S1); | 347 __ vcvtds(D0, S2); |
355 __ vmovrrd(R0, R1, D2); | |
356 __ bx(LR); | 348 __ bx(LR); |
357 } | 349 } |
358 | 350 |
359 | 351 |
360 ASSEMBLER_TEST_RUN(FloatToDoubleConversion, test) { | 352 ASSEMBLER_TEST_RUN(FloatToDoubleConversion, test) { |
361 typedef double (*FloatToDoubleConversionCode)(); | 353 typedef double (*FloatToDoubleConversionCode)(); |
362 EXPECT(test != NULL); | 354 EXPECT(test != NULL); |
363 double res = EXECUTE_TEST_CODE_DOUBLE(FloatToDoubleConversionCode, | 355 double res = EXECUTE_TEST_CODE_DOUBLE(FloatToDoubleConversionCode, |
364 test->entry()); | 356 test->entry()); |
365 EXPECT_FLOAT_EQ(12.8, res, 0.001); | 357 EXPECT_FLOAT_EQ(12.8, res, 0.001); |
366 } | 358 } |
367 | 359 |
368 | 360 |
369 ASSEMBLER_TEST_GENERATE(DoubleToFloatConversion, assembler) { | 361 ASSEMBLER_TEST_GENERATE(DoubleToFloatConversion, assembler) { |
370 __ LoadDImmediate(D1, 12.8, R0); | 362 __ LoadDImmediate(D1, 12.8, R0); |
371 __ vcvtsd(S3, D1); | 363 __ vcvtsd(S0, D1); |
372 __ vmovrs(R0, S3); | |
373 __ bx(LR); | 364 __ bx(LR); |
374 } | 365 } |
375 | 366 |
376 | 367 |
377 ASSEMBLER_TEST_RUN(DoubleToFloatConversion, test) { | 368 ASSEMBLER_TEST_RUN(DoubleToFloatConversion, test) { |
378 typedef float (*DoubleToFloatConversionCode)(); | 369 typedef float (*DoubleToFloatConversionCode)(); |
379 EXPECT(test != NULL); | 370 EXPECT(test != NULL); |
380 float res = EXECUTE_TEST_CODE_FLOAT(DoubleToFloatConversionCode, | 371 float res = EXECUTE_TEST_CODE_FLOAT(DoubleToFloatConversionCode, |
381 test->entry()); | 372 test->entry()); |
382 EXPECT_FLOAT_EQ(12.8, res, 0.001); | 373 EXPECT_FLOAT_EQ(12.8, res, 0.001); |
(...skipping 1183 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1566 __ StoreIntoObject(R2, | 1557 __ StoreIntoObject(R2, |
1567 FieldAddress(R2, GrowableObjectArray::data_offset()), | 1558 FieldAddress(R2, GrowableObjectArray::data_offset()), |
1568 R1); | 1559 R1); |
1569 __ PopList((1 << CTX) | (1 << LR)); | 1560 __ PopList((1 << CTX) | (1 << LR)); |
1570 __ Ret(); | 1561 __ Ret(); |
1571 } | 1562 } |
1572 | 1563 |
1573 } // namespace dart | 1564 } // namespace dart |
1574 | 1565 |
1575 #endif // defined TARGET_ARCH_ARM | 1566 #endif // defined TARGET_ARCH_ARM |
OLD | NEW |