OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
50 Isolate* isolate = CcTest::i_isolate(); | 50 Isolate* isolate = CcTest::i_isolate(); |
51 HandleScope scope(isolate); | 51 HandleScope scope(isolate); |
52 | 52 |
53 Assembler assm(isolate, NULL, 0); | 53 Assembler assm(isolate, NULL, 0); |
54 | 54 |
55 __ add(r0, r0, Operand(r1)); | 55 __ add(r0, r0, Operand(r1)); |
56 __ mov(pc, Operand(lr)); | 56 __ mov(pc, Operand(lr)); |
57 | 57 |
58 CodeDesc desc; | 58 CodeDesc desc; |
59 assm.GetCode(&desc); | 59 assm.GetCode(&desc); |
60 Object* code = isolate->heap()->CreateCode( | 60 Handle<Code> code = isolate->factory()->NewCode( |
61 desc, | 61 desc, Code::ComputeFlags(Code::STUB), Handle<Code>()); |
62 Code::ComputeFlags(Code::STUB), | |
63 Handle<Code>())->ToObjectChecked(); | |
64 CHECK(code->IsCode()); | |
65 #ifdef DEBUG | 62 #ifdef DEBUG |
66 Code::cast(code)->Print(); | 63 code->Print(); |
67 #endif | 64 #endif |
68 F2 f = FUNCTION_CAST<F2>(Code::cast(code)->entry()); | 65 F2 f = FUNCTION_CAST<F2>(code->entry()); |
69 int res = reinterpret_cast<int>(CALL_GENERATED_CODE(f, 3, 4, 0, 0, 0)); | 66 int res = reinterpret_cast<int>(CALL_GENERATED_CODE(f, 3, 4, 0, 0, 0)); |
70 ::printf("f() = %d\n", res); | 67 ::printf("f() = %d\n", res); |
71 CHECK_EQ(7, res); | 68 CHECK_EQ(7, res); |
72 } | 69 } |
73 | 70 |
74 | 71 |
75 TEST(1) { | 72 TEST(1) { |
76 CcTest::InitializeVM(); | 73 CcTest::InitializeVM(); |
77 Isolate* isolate = CcTest::i_isolate(); | 74 Isolate* isolate = CcTest::i_isolate(); |
78 HandleScope scope(isolate); | 75 HandleScope scope(isolate); |
79 | 76 |
80 Assembler assm(isolate, NULL, 0); | 77 Assembler assm(isolate, NULL, 0); |
81 Label L, C; | 78 Label L, C; |
82 | 79 |
83 __ mov(r1, Operand(r0)); | 80 __ mov(r1, Operand(r0)); |
84 __ mov(r0, Operand::Zero()); | 81 __ mov(r0, Operand::Zero()); |
85 __ b(&C); | 82 __ b(&C); |
86 | 83 |
87 __ bind(&L); | 84 __ bind(&L); |
88 __ add(r0, r0, Operand(r1)); | 85 __ add(r0, r0, Operand(r1)); |
89 __ sub(r1, r1, Operand(1)); | 86 __ sub(r1, r1, Operand(1)); |
90 | 87 |
91 __ bind(&C); | 88 __ bind(&C); |
92 __ teq(r1, Operand::Zero()); | 89 __ teq(r1, Operand::Zero()); |
93 __ b(ne, &L); | 90 __ b(ne, &L); |
94 __ mov(pc, Operand(lr)); | 91 __ mov(pc, Operand(lr)); |
95 | 92 |
96 CodeDesc desc; | 93 CodeDesc desc; |
97 assm.GetCode(&desc); | 94 assm.GetCode(&desc); |
98 Object* code = isolate->heap()->CreateCode( | 95 Handle<Code> code = isolate->factory()->NewCode( |
99 desc, | 96 desc, Code::ComputeFlags(Code::STUB), Handle<Code>()); |
100 Code::ComputeFlags(Code::STUB), | |
101 Handle<Code>())->ToObjectChecked(); | |
102 CHECK(code->IsCode()); | |
103 #ifdef DEBUG | 97 #ifdef DEBUG |
104 Code::cast(code)->Print(); | 98 code->Print(); |
105 #endif | 99 #endif |
106 F1 f = FUNCTION_CAST<F1>(Code::cast(code)->entry()); | 100 F1 f = FUNCTION_CAST<F1>(code->entry()); |
107 int res = reinterpret_cast<int>(CALL_GENERATED_CODE(f, 100, 0, 0, 0, 0)); | 101 int res = reinterpret_cast<int>(CALL_GENERATED_CODE(f, 100, 0, 0, 0, 0)); |
108 ::printf("f() = %d\n", res); | 102 ::printf("f() = %d\n", res); |
109 CHECK_EQ(5050, res); | 103 CHECK_EQ(5050, res); |
110 } | 104 } |
111 | 105 |
112 | 106 |
113 TEST(2) { | 107 TEST(2) { |
114 CcTest::InitializeVM(); | 108 CcTest::InitializeVM(); |
115 Isolate* isolate = CcTest::i_isolate(); | 109 Isolate* isolate = CcTest::i_isolate(); |
116 HandleScope scope(isolate); | 110 HandleScope scope(isolate); |
(...skipping 18 matching lines...) Expand all Loading... |
135 __ RecordComment("dead code, just testing relocations"); | 129 __ RecordComment("dead code, just testing relocations"); |
136 __ mov(r0, Operand(isolate->factory()->true_value())); | 130 __ mov(r0, Operand(isolate->factory()->true_value())); |
137 __ RecordComment("dead code, just testing immediate operands"); | 131 __ RecordComment("dead code, just testing immediate operands"); |
138 __ mov(r0, Operand(-1)); | 132 __ mov(r0, Operand(-1)); |
139 __ mov(r0, Operand(0xFF000000)); | 133 __ mov(r0, Operand(0xFF000000)); |
140 __ mov(r0, Operand(0xF0F0F0F0)); | 134 __ mov(r0, Operand(0xF0F0F0F0)); |
141 __ mov(r0, Operand(0xFFF0FFFF)); | 135 __ mov(r0, Operand(0xFFF0FFFF)); |
142 | 136 |
143 CodeDesc desc; | 137 CodeDesc desc; |
144 assm.GetCode(&desc); | 138 assm.GetCode(&desc); |
145 Object* code = isolate->heap()->CreateCode( | 139 Handle<Code> code = isolate->factory()->NewCode( |
146 desc, | 140 desc, Code::ComputeFlags(Code::STUB), Handle<Code>()); |
147 Code::ComputeFlags(Code::STUB), | |
148 Handle<Code>())->ToObjectChecked(); | |
149 CHECK(code->IsCode()); | |
150 #ifdef DEBUG | 141 #ifdef DEBUG |
151 Code::cast(code)->Print(); | 142 code->Print(); |
152 #endif | 143 #endif |
153 F1 f = FUNCTION_CAST<F1>(Code::cast(code)->entry()); | 144 F1 f = FUNCTION_CAST<F1>(code->entry()); |
154 int res = reinterpret_cast<int>(CALL_GENERATED_CODE(f, 10, 0, 0, 0, 0)); | 145 int res = reinterpret_cast<int>(CALL_GENERATED_CODE(f, 10, 0, 0, 0, 0)); |
155 ::printf("f() = %d\n", res); | 146 ::printf("f() = %d\n", res); |
156 CHECK_EQ(3628800, res); | 147 CHECK_EQ(3628800, res); |
157 } | 148 } |
158 | 149 |
159 | 150 |
160 TEST(3) { | 151 TEST(3) { |
161 CcTest::InitializeVM(); | 152 CcTest::InitializeVM(); |
162 Isolate* isolate = CcTest::i_isolate(); | 153 Isolate* isolate = CcTest::i_isolate(); |
163 HandleScope scope(isolate); | 154 HandleScope scope(isolate); |
(...skipping 20 matching lines...) Expand all Loading... |
184 __ mov(r2, Operand(r2, LSL, 2)); | 175 __ mov(r2, Operand(r2, LSL, 2)); |
185 __ strb(r2, MemOperand(r4, OFFSET_OF(T, c))); | 176 __ strb(r2, MemOperand(r4, OFFSET_OF(T, c))); |
186 __ ldrsh(r2, MemOperand(r4, OFFSET_OF(T, s))); | 177 __ ldrsh(r2, MemOperand(r4, OFFSET_OF(T, s))); |
187 __ add(r0, r2, Operand(r0)); | 178 __ add(r0, r2, Operand(r0)); |
188 __ mov(r2, Operand(r2, ASR, 3)); | 179 __ mov(r2, Operand(r2, ASR, 3)); |
189 __ strh(r2, MemOperand(r4, OFFSET_OF(T, s))); | 180 __ strh(r2, MemOperand(r4, OFFSET_OF(T, s))); |
190 __ ldm(ia_w, sp, r4.bit() | fp.bit() | pc.bit()); | 181 __ ldm(ia_w, sp, r4.bit() | fp.bit() | pc.bit()); |
191 | 182 |
192 CodeDesc desc; | 183 CodeDesc desc; |
193 assm.GetCode(&desc); | 184 assm.GetCode(&desc); |
194 Object* code = isolate->heap()->CreateCode( | 185 Handle<Code> code = isolate->factory()->NewCode( |
195 desc, | 186 desc, Code::ComputeFlags(Code::STUB), Handle<Code>()); |
196 Code::ComputeFlags(Code::STUB), | |
197 Handle<Code>())->ToObjectChecked(); | |
198 CHECK(code->IsCode()); | |
199 #ifdef DEBUG | 187 #ifdef DEBUG |
200 Code::cast(code)->Print(); | 188 code->Print(); |
201 #endif | 189 #endif |
202 F3 f = FUNCTION_CAST<F3>(Code::cast(code)->entry()); | 190 F3 f = FUNCTION_CAST<F3>(code->entry()); |
203 t.i = 100000; | 191 t.i = 100000; |
204 t.c = 10; | 192 t.c = 10; |
205 t.s = 1000; | 193 t.s = 1000; |
206 int res = reinterpret_cast<int>(CALL_GENERATED_CODE(f, &t, 0, 0, 0, 0)); | 194 int res = reinterpret_cast<int>(CALL_GENERATED_CODE(f, &t, 0, 0, 0, 0)); |
207 ::printf("f() = %d\n", res); | 195 ::printf("f() = %d\n", res); |
208 CHECK_EQ(101010, res); | 196 CHECK_EQ(101010, res); |
209 CHECK_EQ(100000/2, t.i); | 197 CHECK_EQ(100000/2, t.i); |
210 CHECK_EQ(10*4, t.c); | 198 CHECK_EQ(10*4, t.c); |
211 CHECK_EQ(1000/8, t.s); | 199 CHECK_EQ(1000/8, t.s); |
212 } | 200 } |
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
310 __ vneg(d0, d1); | 298 __ vneg(d0, d1); |
311 __ vstr(d0, r4, OFFSET_OF(T, m)); | 299 __ vstr(d0, r4, OFFSET_OF(T, m)); |
312 __ vldr(d1, r4, OFFSET_OF(T, n)); | 300 __ vldr(d1, r4, OFFSET_OF(T, n)); |
313 __ vneg(d0, d1); | 301 __ vneg(d0, d1); |
314 __ vstr(d0, r4, OFFSET_OF(T, n)); | 302 __ vstr(d0, r4, OFFSET_OF(T, n)); |
315 | 303 |
316 __ ldm(ia_w, sp, r4.bit() | fp.bit() | pc.bit()); | 304 __ ldm(ia_w, sp, r4.bit() | fp.bit() | pc.bit()); |
317 | 305 |
318 CodeDesc desc; | 306 CodeDesc desc; |
319 assm.GetCode(&desc); | 307 assm.GetCode(&desc); |
320 Object* code = isolate->heap()->CreateCode( | 308 Handle<Code> code = isolate->factory()->NewCode( |
321 desc, | 309 desc, Code::ComputeFlags(Code::STUB), Handle<Code>()); |
322 Code::ComputeFlags(Code::STUB), | |
323 Handle<Code>())->ToObjectChecked(); | |
324 CHECK(code->IsCode()); | |
325 #ifdef DEBUG | 310 #ifdef DEBUG |
326 Code::cast(code)->Print(); | 311 code->Print(); |
327 #endif | 312 #endif |
328 F3 f = FUNCTION_CAST<F3>(Code::cast(code)->entry()); | 313 F3 f = FUNCTION_CAST<F3>(code->entry()); |
329 t.a = 1.5; | 314 t.a = 1.5; |
330 t.b = 2.75; | 315 t.b = 2.75; |
331 t.c = 17.17; | 316 t.c = 17.17; |
332 t.d = 0.0; | 317 t.d = 0.0; |
333 t.e = 0.0; | 318 t.e = 0.0; |
334 t.f = 0.0; | 319 t.f = 0.0; |
335 t.g = -2718.2818; | 320 t.g = -2718.2818; |
336 t.h = 31415926.5; | 321 t.h = 31415926.5; |
337 t.i = 0; | 322 t.i = 0; |
338 t.j = 0; | 323 t.j = 0; |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
373 // On entry, r0 = 0xAAAAAAAA = 0b10..10101010. | 358 // On entry, r0 = 0xAAAAAAAA = 0b10..10101010. |
374 __ ubfx(r0, r0, 1, 12); // 0b00..010101010101 = 0x555 | 359 __ ubfx(r0, r0, 1, 12); // 0b00..010101010101 = 0x555 |
375 __ sbfx(r0, r0, 0, 5); // 0b11..111111110101 = -11 | 360 __ sbfx(r0, r0, 0, 5); // 0b11..111111110101 = -11 |
376 __ bfc(r0, 1, 3); // 0b11..111111110001 = -15 | 361 __ bfc(r0, 1, 3); // 0b11..111111110001 = -15 |
377 __ mov(r1, Operand(7)); | 362 __ mov(r1, Operand(7)); |
378 __ bfi(r0, r1, 3, 3); // 0b11..111111111001 = -7 | 363 __ bfi(r0, r1, 3, 3); // 0b11..111111111001 = -7 |
379 __ mov(pc, Operand(lr)); | 364 __ mov(pc, Operand(lr)); |
380 | 365 |
381 CodeDesc desc; | 366 CodeDesc desc; |
382 assm.GetCode(&desc); | 367 assm.GetCode(&desc); |
383 Object* code = isolate->heap()->CreateCode( | 368 Handle<Code> code = isolate->factory()->NewCode( |
384 desc, | 369 desc, Code::ComputeFlags(Code::STUB), Handle<Code>()); |
385 Code::ComputeFlags(Code::STUB), | |
386 Handle<Code>())->ToObjectChecked(); | |
387 CHECK(code->IsCode()); | |
388 #ifdef DEBUG | 370 #ifdef DEBUG |
389 Code::cast(code)->Print(); | 371 code->Print(); |
390 #endif | 372 #endif |
391 F1 f = FUNCTION_CAST<F1>(Code::cast(code)->entry()); | 373 F1 f = FUNCTION_CAST<F1>(code->entry()); |
392 int res = reinterpret_cast<int>( | 374 int res = reinterpret_cast<int>( |
393 CALL_GENERATED_CODE(f, 0xAAAAAAAA, 0, 0, 0, 0)); | 375 CALL_GENERATED_CODE(f, 0xAAAAAAAA, 0, 0, 0, 0)); |
394 ::printf("f() = %d\n", res); | 376 ::printf("f() = %d\n", res); |
395 CHECK_EQ(-7, res); | 377 CHECK_EQ(-7, res); |
396 } | 378 } |
397 } | 379 } |
398 | 380 |
399 | 381 |
400 TEST(6) { | 382 TEST(6) { |
401 // Test saturating instructions. | 383 // Test saturating instructions. |
402 CcTest::InitializeVM(); | 384 CcTest::InitializeVM(); |
403 Isolate* isolate = CcTest::i_isolate(); | 385 Isolate* isolate = CcTest::i_isolate(); |
404 HandleScope scope(isolate); | 386 HandleScope scope(isolate); |
405 | 387 |
406 Assembler assm(isolate, NULL, 0); | 388 Assembler assm(isolate, NULL, 0); |
407 | 389 |
408 if (CpuFeatures::IsSupported(ARMv7)) { | 390 if (CpuFeatures::IsSupported(ARMv7)) { |
409 CpuFeatureScope scope(&assm, ARMv7); | 391 CpuFeatureScope scope(&assm, ARMv7); |
410 __ usat(r1, 8, Operand(r0)); // Sat 0xFFFF to 0-255 = 0xFF. | 392 __ usat(r1, 8, Operand(r0)); // Sat 0xFFFF to 0-255 = 0xFF. |
411 __ usat(r2, 12, Operand(r0, ASR, 9)); // Sat (0xFFFF>>9) to 0-4095 = 0x7F. | 393 __ usat(r2, 12, Operand(r0, ASR, 9)); // Sat (0xFFFF>>9) to 0-4095 = 0x7F. |
412 __ usat(r3, 1, Operand(r0, LSL, 16)); // Sat (0xFFFF<<16) to 0-1 = 0x0. | 394 __ usat(r3, 1, Operand(r0, LSL, 16)); // Sat (0xFFFF<<16) to 0-1 = 0x0. |
413 __ add(r0, r1, Operand(r2)); | 395 __ add(r0, r1, Operand(r2)); |
414 __ add(r0, r0, Operand(r3)); | 396 __ add(r0, r0, Operand(r3)); |
415 __ mov(pc, Operand(lr)); | 397 __ mov(pc, Operand(lr)); |
416 | 398 |
417 CodeDesc desc; | 399 CodeDesc desc; |
418 assm.GetCode(&desc); | 400 assm.GetCode(&desc); |
419 Object* code = isolate->heap()->CreateCode( | 401 Handle<Code> code = isolate->factory()->NewCode( |
420 desc, | 402 desc, Code::ComputeFlags(Code::STUB), Handle<Code>()); |
421 Code::ComputeFlags(Code::STUB), | |
422 Handle<Code>())->ToObjectChecked(); | |
423 CHECK(code->IsCode()); | |
424 #ifdef DEBUG | 403 #ifdef DEBUG |
425 Code::cast(code)->Print(); | 404 code->Print(); |
426 #endif | 405 #endif |
427 F1 f = FUNCTION_CAST<F1>(Code::cast(code)->entry()); | 406 F1 f = FUNCTION_CAST<F1>(code->entry()); |
428 int res = reinterpret_cast<int>( | 407 int res = reinterpret_cast<int>( |
429 CALL_GENERATED_CODE(f, 0xFFFF, 0, 0, 0, 0)); | 408 CALL_GENERATED_CODE(f, 0xFFFF, 0, 0, 0, 0)); |
430 ::printf("f() = %d\n", res); | 409 ::printf("f() = %d\n", res); |
431 CHECK_EQ(382, res); | 410 CHECK_EQ(382, res); |
432 } | 411 } |
433 } | 412 } |
434 | 413 |
435 | 414 |
436 enum VCVTTypes { | 415 enum VCVTTypes { |
437 s32_f64, | 416 s32_f64, |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
485 __ mov(pc, Operand(lr)); | 464 __ mov(pc, Operand(lr)); |
486 | 465 |
487 // The exception behaviour is not what we expected. | 466 // The exception behaviour is not what we expected. |
488 // Load a special value and return. | 467 // Load a special value and return. |
489 __ bind(&wrong_exception); | 468 __ bind(&wrong_exception); |
490 __ mov(r0, Operand(11223344)); | 469 __ mov(r0, Operand(11223344)); |
491 __ mov(pc, Operand(lr)); | 470 __ mov(pc, Operand(lr)); |
492 | 471 |
493 CodeDesc desc; | 472 CodeDesc desc; |
494 assm.GetCode(&desc); | 473 assm.GetCode(&desc); |
495 Object* code = isolate->heap()->CreateCode( | 474 Handle<Code> code = isolate->factory()->NewCode( |
496 desc, | 475 desc, Code::ComputeFlags(Code::STUB), Handle<Code>()); |
497 Code::ComputeFlags(Code::STUB), | |
498 Handle<Code>())->ToObjectChecked(); | |
499 CHECK(code->IsCode()); | |
500 #ifdef DEBUG | 476 #ifdef DEBUG |
501 Code::cast(code)->Print(); | 477 code->Print(); |
502 #endif | 478 #endif |
503 F1 f = FUNCTION_CAST<F1>(Code::cast(code)->entry()); | 479 F1 f = FUNCTION_CAST<F1>(code->entry()); |
504 int res = reinterpret_cast<int>( | 480 int res = reinterpret_cast<int>( |
505 CALL_GENERATED_CODE(f, 0, 0, 0, 0, 0)); | 481 CALL_GENERATED_CODE(f, 0, 0, 0, 0, 0)); |
506 ::printf("res = %d\n", res); | 482 ::printf("res = %d\n", res); |
507 CHECK_EQ(expected, res); | 483 CHECK_EQ(expected, res); |
508 } | 484 } |
509 } | 485 } |
510 | 486 |
511 | 487 |
512 TEST(7) { | 488 TEST(7) { |
513 CcTest::InitializeVM(); | 489 CcTest::InitializeVM(); |
(...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
671 __ vldm(ia_w, r4, s4, s7); | 647 __ vldm(ia_w, r4, s4, s7); |
672 | 648 |
673 __ add(r4, r1, Operand(OFFSET_OF(F, a))); | 649 __ add(r4, r1, Operand(OFFSET_OF(F, a))); |
674 __ vstm(ia_w, r4, s6, s7); | 650 __ vstm(ia_w, r4, s6, s7); |
675 __ vstm(ia_w, r4, s0, s5); | 651 __ vstm(ia_w, r4, s0, s5); |
676 | 652 |
677 __ ldm(ia_w, sp, r4.bit() | fp.bit() | pc.bit()); | 653 __ ldm(ia_w, sp, r4.bit() | fp.bit() | pc.bit()); |
678 | 654 |
679 CodeDesc desc; | 655 CodeDesc desc; |
680 assm.GetCode(&desc); | 656 assm.GetCode(&desc); |
681 Object* code = isolate->heap()->CreateCode( | 657 Handle<Code> code = isolate->factory()->NewCode( |
682 desc, | 658 desc, Code::ComputeFlags(Code::STUB), Handle<Code>()); |
683 Code::ComputeFlags(Code::STUB), | |
684 Handle<Code>())->ToObjectChecked(); | |
685 CHECK(code->IsCode()); | |
686 #ifdef DEBUG | 659 #ifdef DEBUG |
687 Code::cast(code)->Print(); | 660 code->Print(); |
688 #endif | 661 #endif |
689 F4 fn = FUNCTION_CAST<F4>(Code::cast(code)->entry()); | 662 F4 fn = FUNCTION_CAST<F4>(code->entry()); |
690 d.a = 1.1; | 663 d.a = 1.1; |
691 d.b = 2.2; | 664 d.b = 2.2; |
692 d.c = 3.3; | 665 d.c = 3.3; |
693 d.d = 4.4; | 666 d.d = 4.4; |
694 d.e = 5.5; | 667 d.e = 5.5; |
695 d.f = 6.6; | 668 d.f = 6.6; |
696 d.g = 7.7; | 669 d.g = 7.7; |
697 d.h = 8.8; | 670 d.h = 8.8; |
698 | 671 |
699 f.a = 1.0; | 672 f.a = 1.0; |
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
783 | 756 |
784 __ add(r4, r1, Operand(OFFSET_OF(F, a))); | 757 __ add(r4, r1, Operand(OFFSET_OF(F, a))); |
785 __ vstm(ia, r4, s6, s7); | 758 __ vstm(ia, r4, s6, s7); |
786 __ add(r4, r4, Operand(2 * 4)); | 759 __ add(r4, r4, Operand(2 * 4)); |
787 __ vstm(ia, r4, s0, s5); | 760 __ vstm(ia, r4, s0, s5); |
788 | 761 |
789 __ ldm(ia_w, sp, r4.bit() | fp.bit() | pc.bit()); | 762 __ ldm(ia_w, sp, r4.bit() | fp.bit() | pc.bit()); |
790 | 763 |
791 CodeDesc desc; | 764 CodeDesc desc; |
792 assm.GetCode(&desc); | 765 assm.GetCode(&desc); |
793 Object* code = isolate->heap()->CreateCode( | 766 Handle<Code> code = isolate->factory()->NewCode( |
794 desc, | 767 desc, Code::ComputeFlags(Code::STUB), Handle<Code>()); |
795 Code::ComputeFlags(Code::STUB), | |
796 Handle<Code>())->ToObjectChecked(); | |
797 CHECK(code->IsCode()); | |
798 #ifdef DEBUG | 768 #ifdef DEBUG |
799 Code::cast(code)->Print(); | 769 code->Print(); |
800 #endif | 770 #endif |
801 F4 fn = FUNCTION_CAST<F4>(Code::cast(code)->entry()); | 771 F4 fn = FUNCTION_CAST<F4>(code->entry()); |
802 d.a = 1.1; | 772 d.a = 1.1; |
803 d.b = 2.2; | 773 d.b = 2.2; |
804 d.c = 3.3; | 774 d.c = 3.3; |
805 d.d = 4.4; | 775 d.d = 4.4; |
806 d.e = 5.5; | 776 d.e = 5.5; |
807 d.f = 6.6; | 777 d.f = 6.6; |
808 d.g = 7.7; | 778 d.g = 7.7; |
809 d.h = 8.8; | 779 d.h = 8.8; |
810 | 780 |
811 f.a = 1.0; | 781 f.a = 1.0; |
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
891 __ vldm(db_w, r4, s0, s3); | 861 __ vldm(db_w, r4, s0, s3); |
892 | 862 |
893 __ add(r4, r1, Operand(OFFSET_OF(F, h) + 4)); | 863 __ add(r4, r1, Operand(OFFSET_OF(F, h) + 4)); |
894 __ vstm(db_w, r4, s0, s5); | 864 __ vstm(db_w, r4, s0, s5); |
895 __ vstm(db_w, r4, s6, s7); | 865 __ vstm(db_w, r4, s6, s7); |
896 | 866 |
897 __ ldm(ia_w, sp, r4.bit() | fp.bit() | pc.bit()); | 867 __ ldm(ia_w, sp, r4.bit() | fp.bit() | pc.bit()); |
898 | 868 |
899 CodeDesc desc; | 869 CodeDesc desc; |
900 assm.GetCode(&desc); | 870 assm.GetCode(&desc); |
901 Object* code = isolate->heap()->CreateCode( | 871 Handle<Code> code = isolate->factory()->NewCode( |
902 desc, | 872 desc, Code::ComputeFlags(Code::STUB), Handle<Code>()); |
903 Code::ComputeFlags(Code::STUB), | |
904 Handle<Code>())->ToObjectChecked(); | |
905 CHECK(code->IsCode()); | |
906 #ifdef DEBUG | 873 #ifdef DEBUG |
907 Code::cast(code)->Print(); | 874 code->Print(); |
908 #endif | 875 #endif |
909 F4 fn = FUNCTION_CAST<F4>(Code::cast(code)->entry()); | 876 F4 fn = FUNCTION_CAST<F4>(code->entry()); |
910 d.a = 1.1; | 877 d.a = 1.1; |
911 d.b = 2.2; | 878 d.b = 2.2; |
912 d.c = 3.3; | 879 d.c = 3.3; |
913 d.d = 4.4; | 880 d.d = 4.4; |
914 d.e = 5.5; | 881 d.e = 5.5; |
915 d.f = 6.6; | 882 d.f = 6.6; |
916 d.g = 7.7; | 883 d.g = 7.7; |
917 d.h = 8.8; | 884 d.h = 8.8; |
918 | 885 |
919 f.a = 1.0; | 886 f.a = 1.0; |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
988 __ mov(r1, Operand(0xffffffff)); | 955 __ mov(r1, Operand(0xffffffff)); |
989 __ mov(r2, Operand::Zero()); | 956 __ mov(r2, Operand::Zero()); |
990 __ mov(r3, Operand(r2, ASR, 1), SetCC); // Unset the carry. | 957 __ mov(r3, Operand(r2, ASR, 1), SetCC); // Unset the carry. |
991 __ adc(r3, r1, Operand(r2)); | 958 __ adc(r3, r1, Operand(r2)); |
992 __ str(r3, MemOperand(r0, OFFSET_OF(I, d))); | 959 __ str(r3, MemOperand(r0, OFFSET_OF(I, d))); |
993 | 960 |
994 __ mov(pc, Operand(lr)); | 961 __ mov(pc, Operand(lr)); |
995 | 962 |
996 CodeDesc desc; | 963 CodeDesc desc; |
997 assm.GetCode(&desc); | 964 assm.GetCode(&desc); |
998 Object* code = isolate->heap()->CreateCode( | 965 Handle<Code> code = isolate->factory()->NewCode( |
999 desc, | 966 desc, Code::ComputeFlags(Code::STUB), Handle<Code>()); |
1000 Code::ComputeFlags(Code::STUB), | |
1001 Handle<Code>())->ToObjectChecked(); | |
1002 CHECK(code->IsCode()); | |
1003 #ifdef DEBUG | 967 #ifdef DEBUG |
1004 Code::cast(code)->Print(); | 968 code->Print(); |
1005 #endif | 969 #endif |
1006 F3 f = FUNCTION_CAST<F3>(Code::cast(code)->entry()); | 970 F3 f = FUNCTION_CAST<F3>(code->entry()); |
1007 Object* dummy = CALL_GENERATED_CODE(f, &i, 0, 0, 0, 0); | 971 Object* dummy = CALL_GENERATED_CODE(f, &i, 0, 0, 0, 0); |
1008 USE(dummy); | 972 USE(dummy); |
1009 | 973 |
1010 CHECK_EQ(0xabcd0001, i.a); | 974 CHECK_EQ(0xabcd0001, i.a); |
1011 CHECK_EQ(static_cast<int32_t>(0xabcd0000) >> 1, i.b); | 975 CHECK_EQ(static_cast<int32_t>(0xabcd0000) >> 1, i.b); |
1012 CHECK_EQ(0x00000000, i.c); | 976 CHECK_EQ(0x00000000, i.c); |
1013 CHECK_EQ(0xffffffff, i.d); | 977 CHECK_EQ(0xffffffff, i.d); |
1014 } | 978 } |
1015 | 979 |
1016 | 980 |
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1118 // Move d22 into low and high. | 1082 // Move d22 into low and high. |
1119 __ vmov(r4, VmovIndexLo, d22); | 1083 __ vmov(r4, VmovIndexLo, d22); |
1120 __ str(r4, MemOperand(r0, OFFSET_OF(T, low))); | 1084 __ str(r4, MemOperand(r0, OFFSET_OF(T, low))); |
1121 __ vmov(r4, VmovIndexHi, d22); | 1085 __ vmov(r4, VmovIndexHi, d22); |
1122 __ str(r4, MemOperand(r0, OFFSET_OF(T, high))); | 1086 __ str(r4, MemOperand(r0, OFFSET_OF(T, high))); |
1123 | 1087 |
1124 __ ldm(ia_w, sp, r4.bit() | pc.bit()); | 1088 __ ldm(ia_w, sp, r4.bit() | pc.bit()); |
1125 | 1089 |
1126 CodeDesc desc; | 1090 CodeDesc desc; |
1127 assm.GetCode(&desc); | 1091 assm.GetCode(&desc); |
1128 Object* code = isolate->heap()->CreateCode( | 1092 Handle<Code> code = isolate->factory()->NewCode( |
1129 desc, | 1093 desc, Code::ComputeFlags(Code::STUB), Handle<Code>()); |
1130 Code::ComputeFlags(Code::STUB), | |
1131 Handle<Code>())->ToObjectChecked(); | |
1132 CHECK(code->IsCode()); | |
1133 #ifdef DEBUG | 1094 #ifdef DEBUG |
1134 Code::cast(code)->Print(); | 1095 code->Print(); |
1135 #endif | 1096 #endif |
1136 F3 f = FUNCTION_CAST<F3>(Code::cast(code)->entry()); | 1097 F3 f = FUNCTION_CAST<F3>(code->entry()); |
1137 t.a = 1.5; | 1098 t.a = 1.5; |
1138 t.b = 2.75; | 1099 t.b = 2.75; |
1139 t.c = 17.17; | 1100 t.c = 17.17; |
1140 t.x = 1.5; | 1101 t.x = 1.5; |
1141 t.y = 2.75; | 1102 t.y = 2.75; |
1142 t.z = 17.17; | 1103 t.z = 17.17; |
1143 Object* dummy = CALL_GENERATED_CODE(f, &t, 0, 0, 0, 0); | 1104 Object* dummy = CALL_GENERATED_CODE(f, &t, 0, 0, 0, 0); |
1144 USE(dummy); | 1105 USE(dummy); |
1145 CHECK_EQ(14.7610017472335499, t.a); | 1106 CHECK_EQ(14.7610017472335499, t.a); |
1146 CHECK_EQ(3.84200491244266251, t.b); | 1107 CHECK_EQ(3.84200491244266251, t.b); |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1193 __ vstr(d2, r0, OFFSET_OF(T, sub_result)); | 1154 __ vstr(d2, r0, OFFSET_OF(T, sub_result)); |
1194 __ vmul(d2, d0, d1); | 1155 __ vmul(d2, d0, d1); |
1195 __ vstr(d2, r0, OFFSET_OF(T, mul_result)); | 1156 __ vstr(d2, r0, OFFSET_OF(T, mul_result)); |
1196 __ vdiv(d2, d0, d1); | 1157 __ vdiv(d2, d0, d1); |
1197 __ vstr(d2, r0, OFFSET_OF(T, div_result)); | 1158 __ vstr(d2, r0, OFFSET_OF(T, div_result)); |
1198 | 1159 |
1199 __ mov(pc, Operand(lr)); | 1160 __ mov(pc, Operand(lr)); |
1200 | 1161 |
1201 CodeDesc desc; | 1162 CodeDesc desc; |
1202 assm.GetCode(&desc); | 1163 assm.GetCode(&desc); |
1203 Object* code = isolate->heap()->CreateCode( | 1164 Handle<Code> code = isolate->factory()->NewCode( |
1204 desc, | 1165 desc, Code::ComputeFlags(Code::STUB), Handle<Code>()); |
1205 Code::ComputeFlags(Code::STUB), | |
1206 Handle<Code>())->ToObjectChecked(); | |
1207 CHECK(code->IsCode()); | |
1208 #ifdef DEBUG | 1166 #ifdef DEBUG |
1209 Code::cast(code)->Print(); | 1167 code->Print(); |
1210 #endif | 1168 #endif |
1211 F3 f = FUNCTION_CAST<F3>(Code::cast(code)->entry()); | 1169 F3 f = FUNCTION_CAST<F3>(code->entry()); |
1212 t.left = BitCast<double>(kHoleNanInt64); | 1170 t.left = BitCast<double>(kHoleNanInt64); |
1213 t.right = 1; | 1171 t.right = 1; |
1214 t.add_result = 0; | 1172 t.add_result = 0; |
1215 t.sub_result = 0; | 1173 t.sub_result = 0; |
1216 t.mul_result = 0; | 1174 t.mul_result = 0; |
1217 t.div_result = 0; | 1175 t.div_result = 0; |
1218 Object* dummy = CALL_GENERATED_CODE(f, &t, 0, 0, 0, 0); | 1176 Object* dummy = CALL_GENERATED_CODE(f, &t, 0, 0, 0, 0); |
1219 USE(dummy); | 1177 USE(dummy); |
1220 const uint32_t kArmNanUpper32 = 0x7ff80000; | 1178 const uint32_t kArmNanUpper32 = 0x7ff80000; |
1221 const uint32_t kArmNanLower32 = 0x00000000; | 1179 const uint32_t kArmNanLower32 = 0x00000000; |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1299 __ add(r4, r0, Operand(OFFSET_OF(T, srcA0))); | 1257 __ add(r4, r0, Operand(OFFSET_OF(T, srcA0))); |
1300 __ vld1(Neon8, NeonListOperand(d1), NeonMemOperand(r4)); | 1258 __ vld1(Neon8, NeonListOperand(d1), NeonMemOperand(r4)); |
1301 __ vmovl(NeonU8, q1, d1); | 1259 __ vmovl(NeonU8, q1, d1); |
1302 __ add(r4, r0, Operand(OFFSET_OF(T, dstA4))); | 1260 __ add(r4, r0, Operand(OFFSET_OF(T, dstA4))); |
1303 __ vst1(Neon8, NeonListOperand(d2, 2), NeonMemOperand(r4)); | 1261 __ vst1(Neon8, NeonListOperand(d2, 2), NeonMemOperand(r4)); |
1304 | 1262 |
1305 __ ldm(ia_w, sp, r4.bit() | pc.bit()); | 1263 __ ldm(ia_w, sp, r4.bit() | pc.bit()); |
1306 | 1264 |
1307 CodeDesc desc; | 1265 CodeDesc desc; |
1308 assm.GetCode(&desc); | 1266 assm.GetCode(&desc); |
1309 Object* code = isolate->heap()->CreateCode( | 1267 Handle<Code> code = isolate->factory()->NewCode( |
1310 desc, | 1268 desc, Code::ComputeFlags(Code::STUB), Handle<Code>()); |
1311 Code::ComputeFlags(Code::STUB), | |
1312 Handle<Code>())->ToObjectChecked(); | |
1313 CHECK(code->IsCode()); | |
1314 #ifdef DEBUG | 1269 #ifdef DEBUG |
1315 Code::cast(code)->Print(); | 1270 code->Print(); |
1316 #endif | 1271 #endif |
1317 F3 f = FUNCTION_CAST<F3>(Code::cast(code)->entry()); | 1272 F3 f = FUNCTION_CAST<F3>(code->entry()); |
1318 t.src0 = 0x01020304; | 1273 t.src0 = 0x01020304; |
1319 t.src1 = 0x11121314; | 1274 t.src1 = 0x11121314; |
1320 t.src2 = 0x21222324; | 1275 t.src2 = 0x21222324; |
1321 t.src3 = 0x31323334; | 1276 t.src3 = 0x31323334; |
1322 t.src4 = 0x41424344; | 1277 t.src4 = 0x41424344; |
1323 t.src5 = 0x51525354; | 1278 t.src5 = 0x51525354; |
1324 t.src6 = 0x61626364; | 1279 t.src6 = 0x61626364; |
1325 t.src7 = 0x71727374; | 1280 t.src7 = 0x71727374; |
1326 t.dst0 = 0; | 1281 t.dst0 = 0; |
1327 t.dst1 = 0; | 1282 t.dst1 = 0; |
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1404 __ str(r2, MemOperand(r4, OFFSET_OF(T, dst3))); | 1359 __ str(r2, MemOperand(r4, OFFSET_OF(T, dst3))); |
1405 | 1360 |
1406 __ ldr(r0, MemOperand(r4, OFFSET_OF(T, src2))); | 1361 __ ldr(r0, MemOperand(r4, OFFSET_OF(T, src2))); |
1407 __ uxtab(r2, r0, Operand(r1, ROR, 8)); | 1362 __ uxtab(r2, r0, Operand(r1, ROR, 8)); |
1408 __ str(r2, MemOperand(r4, OFFSET_OF(T, dst4))); | 1363 __ str(r2, MemOperand(r4, OFFSET_OF(T, dst4))); |
1409 | 1364 |
1410 __ ldm(ia_w, sp, r4.bit() | pc.bit()); | 1365 __ ldm(ia_w, sp, r4.bit() | pc.bit()); |
1411 | 1366 |
1412 CodeDesc desc; | 1367 CodeDesc desc; |
1413 assm.GetCode(&desc); | 1368 assm.GetCode(&desc); |
1414 Object* code = isolate->heap()->CreateCode( | 1369 Handle<Code> code = isolate->factory()->NewCode( |
1415 desc, | 1370 desc, Code::ComputeFlags(Code::STUB), Handle<Code>()); |
1416 Code::ComputeFlags(Code::STUB), | |
1417 Handle<Code>())->ToObjectChecked(); | |
1418 CHECK(code->IsCode()); | |
1419 #ifdef DEBUG | 1371 #ifdef DEBUG |
1420 Code::cast(code)->Print(); | 1372 code->Print(); |
1421 #endif | 1373 #endif |
1422 F3 f = FUNCTION_CAST<F3>(Code::cast(code)->entry()); | 1374 F3 f = FUNCTION_CAST<F3>(code->entry()); |
1423 t.src0 = 0x01020304; | 1375 t.src0 = 0x01020304; |
1424 t.src1 = 0x11121314; | 1376 t.src1 = 0x11121314; |
1425 t.src2 = 0x11121300; | 1377 t.src2 = 0x11121300; |
1426 t.dst0 = 0; | 1378 t.dst0 = 0; |
1427 t.dst1 = 0; | 1379 t.dst1 = 0; |
1428 t.dst2 = 0; | 1380 t.dst2 = 0; |
1429 t.dst3 = 0; | 1381 t.dst3 = 0; |
1430 t.dst4 = 0; | 1382 t.dst4 = 0; |
1431 Object* dummy = CALL_GENERATED_CODE(f, &t, 0, 0, 0, 0); | 1383 Object* dummy = CALL_GENERATED_CODE(f, &t, 0, 0, 0, 0); |
1432 USE(dummy); | 1384 USE(dummy); |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1489 __ ldr(r0, MemOperand(r3, OFFSET_OF(T, dividend))); | 1441 __ ldr(r0, MemOperand(r3, OFFSET_OF(T, dividend))); |
1490 __ ldr(r1, MemOperand(r3, OFFSET_OF(T, divisor))); | 1442 __ ldr(r1, MemOperand(r3, OFFSET_OF(T, divisor))); |
1491 | 1443 |
1492 __ sdiv(r2, r0, r1); | 1444 __ sdiv(r2, r0, r1); |
1493 __ str(r2, MemOperand(r3, OFFSET_OF(T, result))); | 1445 __ str(r2, MemOperand(r3, OFFSET_OF(T, result))); |
1494 | 1446 |
1495 __ bx(lr); | 1447 __ bx(lr); |
1496 | 1448 |
1497 CodeDesc desc; | 1449 CodeDesc desc; |
1498 assm.GetCode(&desc); | 1450 assm.GetCode(&desc); |
1499 Object* code = isolate->heap()->CreateCode( | 1451 Handle<Code> code = isolate->factory()->NewCode( |
1500 desc, | 1452 desc, Code::ComputeFlags(Code::STUB), Handle<Code>()); |
1501 Code::ComputeFlags(Code::STUB), | |
1502 Handle<Code>())->ToObjectChecked(); | |
1503 CHECK(code->IsCode()); | |
1504 #ifdef DEBUG | 1453 #ifdef DEBUG |
1505 Code::cast(code)->Print(); | 1454 code->Print(); |
1506 #endif | 1455 #endif |
1507 F3 f = FUNCTION_CAST<F3>(Code::cast(code)->entry()); | 1456 F3 f = FUNCTION_CAST<F3>(code->entry()); |
1508 Object* dummy; | 1457 Object* dummy; |
1509 TEST_SDIV(1073741824, kMinInt, -2); | 1458 TEST_SDIV(1073741824, kMinInt, -2); |
1510 TEST_SDIV(kMinInt, kMinInt, -1); | 1459 TEST_SDIV(kMinInt, kMinInt, -1); |
1511 TEST_SDIV(5, 10, 2); | 1460 TEST_SDIV(5, 10, 2); |
1512 TEST_SDIV(3, 10, 3); | 1461 TEST_SDIV(3, 10, 3); |
1513 TEST_SDIV(-5, 10, -2); | 1462 TEST_SDIV(-5, 10, -2); |
1514 TEST_SDIV(-3, 10, -3); | 1463 TEST_SDIV(-3, 10, -3); |
1515 TEST_SDIV(-5, -10, 2); | 1464 TEST_SDIV(-5, -10, 2); |
1516 TEST_SDIV(-3, -10, 3); | 1465 TEST_SDIV(-3, -10, 3); |
1517 TEST_SDIV(5, -10, -2); | 1466 TEST_SDIV(5, -10, -2); |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1579 __ ldr(r3, MemOperand(r3)); | 1528 __ ldr(r3, MemOperand(r3)); |
1580 } | 1529 } |
1581 __ bind(&target_faraway); | 1530 __ bind(&target_faraway); |
1582 // r0 = r0 + 5 + 5 + 11 | 1531 // r0 = r0 + 5 + 5 + 11 |
1583 __ add(r0, r0, Operand(11)); | 1532 __ add(r0, r0, Operand(11)); |
1584 | 1533 |
1585 __ ldm(ia_w, sp, r4.bit() | r5.bit() | pc.bit()); | 1534 __ ldm(ia_w, sp, r4.bit() | r5.bit() | pc.bit()); |
1586 | 1535 |
1587 CodeDesc desc; | 1536 CodeDesc desc; |
1588 assm.GetCode(&desc); | 1537 assm.GetCode(&desc); |
1589 Handle<Code> code = isolate->factory()->NewCode(desc, | 1538 Handle<Code> code = isolate->factory()->NewCode( |
1590 Code::ComputeFlags(Code::STUB), code_object); | 1539 desc, Code::ComputeFlags(Code::STUB), code_object); |
1591 CHECK(code->IsCode()); | |
1592 F1 f = FUNCTION_CAST<F1>(code->entry()); | 1540 F1 f = FUNCTION_CAST<F1>(code->entry()); |
1593 int res = reinterpret_cast<int>(CALL_GENERATED_CODE(f, 21, 0, 0, 0, 0)); | 1541 int res = reinterpret_cast<int>(CALL_GENERATED_CODE(f, 21, 0, 0, 0, 0)); |
1594 ::printf("f() = %d\n", res); | 1542 ::printf("f() = %d\n", res); |
1595 CHECK_EQ(42, res); | 1543 CHECK_EQ(42, res); |
1596 } | 1544 } |
1597 | 1545 |
1598 #undef __ | 1546 #undef __ |
OLD | NEW |