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 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
55 env = v8::Context::New(); | 55 env = v8::Context::New(); |
56 } | 56 } |
57 } | 57 } |
58 | 58 |
59 | 59 |
60 #define __ assm. | 60 #define __ assm. |
61 | 61 |
62 | 62 |
63 TEST(MIPS0) { | 63 TEST(MIPS0) { |
64 InitializeVM(); | 64 InitializeVM(); |
65 v8::HandleScope scope; | 65 Isolate* isolate = Isolate::Current(); |
| 66 HandleScope scope(isolate); |
66 | 67 |
67 MacroAssembler assm(Isolate::Current(), NULL, 0); | 68 MacroAssembler assm(isolate, NULL, 0); |
68 | 69 |
69 // Addition. | 70 // Addition. |
70 __ addu(v0, a0, a1); | 71 __ addu(v0, a0, a1); |
71 __ jr(ra); | 72 __ jr(ra); |
72 __ nop(); | 73 __ nop(); |
73 | 74 |
74 CodeDesc desc; | 75 CodeDesc desc; |
75 assm.GetCode(&desc); | 76 assm.GetCode(&desc); |
76 Object* code = HEAP->CreateCode( | 77 Object* code = HEAP->CreateCode( |
77 desc, | 78 desc, |
78 Code::ComputeFlags(Code::STUB), | 79 Code::ComputeFlags(Code::STUB), |
79 Handle<Code>())->ToObjectChecked(); | 80 Handle<Code>())->ToObjectChecked(); |
80 CHECK(code->IsCode()); | 81 CHECK(code->IsCode()); |
81 F2 f = FUNCTION_CAST<F2>(Code::cast(code)->entry()); | 82 F2 f = FUNCTION_CAST<F2>(Code::cast(code)->entry()); |
82 int res = reinterpret_cast<int>(CALL_GENERATED_CODE(f, 0xab0, 0xc, 0, 0, 0)); | 83 int res = reinterpret_cast<int>(CALL_GENERATED_CODE(f, 0xab0, 0xc, 0, 0, 0)); |
83 ::printf("f() = %d\n", res); | 84 ::printf("f() = %d\n", res); |
84 CHECK_EQ(0xabc, res); | 85 CHECK_EQ(0xabc, res); |
85 } | 86 } |
86 | 87 |
87 | 88 |
88 TEST(MIPS1) { | 89 TEST(MIPS1) { |
89 InitializeVM(); | 90 InitializeVM(); |
90 v8::HandleScope scope; | 91 Isolate* isolate = Isolate::Current(); |
| 92 HandleScope scope(isolate); |
91 | 93 |
92 MacroAssembler assm(Isolate::Current(), NULL, 0); | 94 MacroAssembler assm(isolate, NULL, 0); |
93 Label L, C; | 95 Label L, C; |
94 | 96 |
95 __ mov(a1, a0); | 97 __ mov(a1, a0); |
96 __ li(v0, 0); | 98 __ li(v0, 0); |
97 __ b(&C); | 99 __ b(&C); |
98 __ nop(); | 100 __ nop(); |
99 | 101 |
100 __ bind(&L); | 102 __ bind(&L); |
101 __ addu(v0, v0, a1); | 103 __ addu(v0, v0, a1); |
102 __ addiu(a1, a1, -1); | 104 __ addiu(a1, a1, -1); |
(...skipping 15 matching lines...) Expand all Loading... |
118 CHECK(code->IsCode()); | 120 CHECK(code->IsCode()); |
119 F1 f = FUNCTION_CAST<F1>(Code::cast(code)->entry()); | 121 F1 f = FUNCTION_CAST<F1>(Code::cast(code)->entry()); |
120 int res = reinterpret_cast<int>(CALL_GENERATED_CODE(f, 50, 0, 0, 0, 0)); | 122 int res = reinterpret_cast<int>(CALL_GENERATED_CODE(f, 50, 0, 0, 0, 0)); |
121 ::printf("f() = %d\n", res); | 123 ::printf("f() = %d\n", res); |
122 CHECK_EQ(1275, res); | 124 CHECK_EQ(1275, res); |
123 } | 125 } |
124 | 126 |
125 | 127 |
126 TEST(MIPS2) { | 128 TEST(MIPS2) { |
127 InitializeVM(); | 129 InitializeVM(); |
128 v8::HandleScope scope; | 130 Isolate* isolate = Isolate::Current(); |
| 131 HandleScope scope(isolate); |
129 | 132 |
130 MacroAssembler assm(Isolate::Current(), NULL, 0); | 133 MacroAssembler assm(isolate, NULL, 0); |
131 | 134 |
132 Label exit, error; | 135 Label exit, error; |
133 | 136 |
134 // ----- Test all instructions. | 137 // ----- Test all instructions. |
135 | 138 |
136 // Test lui, ori, and addiu, used in the li pseudo-instruction. | 139 // Test lui, ori, and addiu, used in the li pseudo-instruction. |
137 // This way we can then safely load registers with chosen values. | 140 // This way we can then safely load registers with chosen values. |
138 | 141 |
139 __ ori(t0, zero_reg, 0); | 142 __ ori(t0, zero_reg, 0); |
140 __ lui(t0, 0x1234); | 143 __ lui(t0, 0x1234); |
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
259 F2 f = FUNCTION_CAST<F2>(Code::cast(code)->entry()); | 262 F2 f = FUNCTION_CAST<F2>(Code::cast(code)->entry()); |
260 int res = reinterpret_cast<int>(CALL_GENERATED_CODE(f, 0xab0, 0xc, 0, 0, 0)); | 263 int res = reinterpret_cast<int>(CALL_GENERATED_CODE(f, 0xab0, 0xc, 0, 0, 0)); |
261 ::printf("f() = %d\n", res); | 264 ::printf("f() = %d\n", res); |
262 CHECK_EQ(0x31415926, res); | 265 CHECK_EQ(0x31415926, res); |
263 } | 266 } |
264 | 267 |
265 | 268 |
266 TEST(MIPS3) { | 269 TEST(MIPS3) { |
267 // Test floating point instructions. | 270 // Test floating point instructions. |
268 InitializeVM(); | 271 InitializeVM(); |
269 v8::HandleScope scope; | 272 Isolate* isolate = Isolate::Current(); |
| 273 HandleScope scope(isolate); |
270 | 274 |
271 typedef struct { | 275 typedef struct { |
272 double a; | 276 double a; |
273 double b; | 277 double b; |
274 double c; | 278 double c; |
275 double d; | 279 double d; |
276 double e; | 280 double e; |
277 double f; | 281 double f; |
278 double g; | 282 double g; |
279 double h; | 283 double h; |
280 double i; | 284 double i; |
281 } T; | 285 } T; |
282 T t; | 286 T t; |
283 | 287 |
284 // Create a function that accepts &t, and loads, manipulates, and stores | 288 // Create a function that accepts &t, and loads, manipulates, and stores |
285 // the doubles t.a ... t.f. | 289 // the doubles t.a ... t.f. |
286 MacroAssembler assm(Isolate::Current(), NULL, 0); | 290 MacroAssembler assm(isolate, NULL, 0); |
287 Label L, C; | 291 Label L, C; |
288 | 292 |
289 if (CpuFeatures::IsSupported(FPU)) { | 293 if (CpuFeatures::IsSupported(FPU)) { |
290 CpuFeatureScope scope(&assm, FPU); | 294 CpuFeatureScope scope(&assm, FPU); |
291 | 295 |
292 __ ldc1(f4, MemOperand(a0, OFFSET_OF(T, a)) ); | 296 __ ldc1(f4, MemOperand(a0, OFFSET_OF(T, a)) ); |
293 __ ldc1(f6, MemOperand(a0, OFFSET_OF(T, b)) ); | 297 __ ldc1(f6, MemOperand(a0, OFFSET_OF(T, b)) ); |
294 __ add_d(f8, f4, f6); | 298 __ add_d(f8, f4, f6); |
295 __ sdc1(f8, MemOperand(a0, OFFSET_OF(T, c)) ); // c = a + b. | 299 __ sdc1(f8, MemOperand(a0, OFFSET_OF(T, c)) ); // c = a + b. |
296 | 300 |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
350 CHECK_EQ(120.44, t.f); | 354 CHECK_EQ(120.44, t.f); |
351 CHECK_EQ(10.97451593465515908537, t.g); | 355 CHECK_EQ(10.97451593465515908537, t.g); |
352 CHECK_EQ(6.875, t.h); | 356 CHECK_EQ(6.875, t.h); |
353 } | 357 } |
354 } | 358 } |
355 | 359 |
356 | 360 |
357 TEST(MIPS4) { | 361 TEST(MIPS4) { |
358 // Test moves between floating point and integer registers. | 362 // Test moves between floating point and integer registers. |
359 InitializeVM(); | 363 InitializeVM(); |
360 v8::HandleScope scope; | 364 Isolate* isolate = Isolate::Current(); |
| 365 HandleScope scope(isolate); |
361 | 366 |
362 typedef struct { | 367 typedef struct { |
363 double a; | 368 double a; |
364 double b; | 369 double b; |
365 double c; | 370 double c; |
366 } T; | 371 } T; |
367 T t; | 372 T t; |
368 | 373 |
369 Assembler assm(Isolate::Current(), NULL, 0); | 374 Assembler assm(isolate, NULL, 0); |
370 Label L, C; | 375 Label L, C; |
371 | 376 |
372 if (CpuFeatures::IsSupported(FPU)) { | 377 if (CpuFeatures::IsSupported(FPU)) { |
373 CpuFeatureScope scope(&assm, FPU); | 378 CpuFeatureScope scope(&assm, FPU); |
374 | 379 |
375 __ ldc1(f4, MemOperand(a0, OFFSET_OF(T, a)) ); | 380 __ ldc1(f4, MemOperand(a0, OFFSET_OF(T, a)) ); |
376 __ ldc1(f6, MemOperand(a0, OFFSET_OF(T, b)) ); | 381 __ ldc1(f6, MemOperand(a0, OFFSET_OF(T, b)) ); |
377 | 382 |
378 // Swap f4 and f6, by using four integer registers, t0-t3. | 383 // Swap f4 and f6, by using four integer registers, t0-t3. |
379 __ mfc1(t0, f4); | 384 __ mfc1(t0, f4); |
(...skipping 30 matching lines...) Expand all Loading... |
410 CHECK_EQ(2.75e11, t.a); | 415 CHECK_EQ(2.75e11, t.a); |
411 CHECK_EQ(2.75e11, t.b); | 416 CHECK_EQ(2.75e11, t.b); |
412 CHECK_EQ(1.5e22, t.c); | 417 CHECK_EQ(1.5e22, t.c); |
413 } | 418 } |
414 } | 419 } |
415 | 420 |
416 | 421 |
417 TEST(MIPS5) { | 422 TEST(MIPS5) { |
418 // Test conversions between doubles and integers. | 423 // Test conversions between doubles and integers. |
419 InitializeVM(); | 424 InitializeVM(); |
420 v8::HandleScope scope; | 425 Isolate* isolate = Isolate::Current(); |
| 426 HandleScope scope(isolate); |
421 | 427 |
422 typedef struct { | 428 typedef struct { |
423 double a; | 429 double a; |
424 double b; | 430 double b; |
425 int i; | 431 int i; |
426 int j; | 432 int j; |
427 } T; | 433 } T; |
428 T t; | 434 T t; |
429 | 435 |
430 Assembler assm(Isolate::Current(), NULL, 0); | 436 Assembler assm(isolate, NULL, 0); |
431 Label L, C; | 437 Label L, C; |
432 | 438 |
433 if (CpuFeatures::IsSupported(FPU)) { | 439 if (CpuFeatures::IsSupported(FPU)) { |
434 CpuFeatureScope scope(&assm, FPU); | 440 CpuFeatureScope scope(&assm, FPU); |
435 | 441 |
436 // Load all structure elements to registers. | 442 // Load all structure elements to registers. |
437 __ ldc1(f4, MemOperand(a0, OFFSET_OF(T, a)) ); | 443 __ ldc1(f4, MemOperand(a0, OFFSET_OF(T, a)) ); |
438 __ ldc1(f6, MemOperand(a0, OFFSET_OF(T, b)) ); | 444 __ ldc1(f6, MemOperand(a0, OFFSET_OF(T, b)) ); |
439 __ lw(t0, MemOperand(a0, OFFSET_OF(T, i)) ); | 445 __ lw(t0, MemOperand(a0, OFFSET_OF(T, i)) ); |
440 __ lw(t1, MemOperand(a0, OFFSET_OF(T, j)) ); | 446 __ lw(t1, MemOperand(a0, OFFSET_OF(T, j)) ); |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
481 CHECK_EQ(-100000.0, t.b); | 487 CHECK_EQ(-100000.0, t.b); |
482 CHECK_EQ(15000, t.i); | 488 CHECK_EQ(15000, t.i); |
483 CHECK_EQ(275000000, t.j); | 489 CHECK_EQ(275000000, t.j); |
484 } | 490 } |
485 } | 491 } |
486 | 492 |
487 | 493 |
488 TEST(MIPS6) { | 494 TEST(MIPS6) { |
489 // Test simple memory loads and stores. | 495 // Test simple memory loads and stores. |
490 InitializeVM(); | 496 InitializeVM(); |
491 v8::HandleScope scope; | 497 Isolate* isolate = Isolate::Current(); |
| 498 HandleScope scope(isolate); |
492 | 499 |
493 typedef struct { | 500 typedef struct { |
494 uint32_t ui; | 501 uint32_t ui; |
495 int32_t si; | 502 int32_t si; |
496 int32_t r1; | 503 int32_t r1; |
497 int32_t r2; | 504 int32_t r2; |
498 int32_t r3; | 505 int32_t r3; |
499 int32_t r4; | 506 int32_t r4; |
500 int32_t r5; | 507 int32_t r5; |
501 int32_t r6; | 508 int32_t r6; |
502 } T; | 509 } T; |
503 T t; | 510 T t; |
504 | 511 |
505 Assembler assm(Isolate::Current(), NULL, 0); | 512 Assembler assm(isolate, NULL, 0); |
506 Label L, C; | 513 Label L, C; |
507 | 514 |
508 // Basic word load/store. | 515 // Basic word load/store. |
509 __ lw(t0, MemOperand(a0, OFFSET_OF(T, ui)) ); | 516 __ lw(t0, MemOperand(a0, OFFSET_OF(T, ui)) ); |
510 __ sw(t0, MemOperand(a0, OFFSET_OF(T, r1)) ); | 517 __ sw(t0, MemOperand(a0, OFFSET_OF(T, r1)) ); |
511 | 518 |
512 // lh with positive data. | 519 // lh with positive data. |
513 __ lh(t1, MemOperand(a0, OFFSET_OF(T, ui)) ); | 520 __ lh(t1, MemOperand(a0, OFFSET_OF(T, ui)) ); |
514 __ sw(t1, MemOperand(a0, OFFSET_OF(T, r2)) ); | 521 __ sw(t1, MemOperand(a0, OFFSET_OF(T, r2)) ); |
515 | 522 |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
553 CHECK_EQ(0xffffbbcc, t.r3); | 560 CHECK_EQ(0xffffbbcc, t.r3); |
554 CHECK_EQ(0x0000bbcc, t.r4); | 561 CHECK_EQ(0x0000bbcc, t.r4); |
555 CHECK_EQ(0xffffffcc, t.r5); | 562 CHECK_EQ(0xffffffcc, t.r5); |
556 CHECK_EQ(0x3333bbcc, t.r6); | 563 CHECK_EQ(0x3333bbcc, t.r6); |
557 } | 564 } |
558 | 565 |
559 | 566 |
560 TEST(MIPS7) { | 567 TEST(MIPS7) { |
561 // Test floating point compare and branch instructions. | 568 // Test floating point compare and branch instructions. |
562 InitializeVM(); | 569 InitializeVM(); |
563 v8::HandleScope scope; | 570 Isolate* isolate = Isolate::Current(); |
| 571 HandleScope scope(isolate); |
564 | 572 |
565 typedef struct { | 573 typedef struct { |
566 double a; | 574 double a; |
567 double b; | 575 double b; |
568 double c; | 576 double c; |
569 double d; | 577 double d; |
570 double e; | 578 double e; |
571 double f; | 579 double f; |
572 int32_t result; | 580 int32_t result; |
573 } T; | 581 } T; |
574 T t; | 582 T t; |
575 | 583 |
576 // Create a function that accepts &t, and loads, manipulates, and stores | 584 // Create a function that accepts &t, and loads, manipulates, and stores |
577 // the doubles t.a ... t.f. | 585 // the doubles t.a ... t.f. |
578 MacroAssembler assm(Isolate::Current(), NULL, 0); | 586 MacroAssembler assm(isolate, NULL, 0); |
579 Label neither_is_nan, less_than, outa_here; | 587 Label neither_is_nan, less_than, outa_here; |
580 | 588 |
581 if (CpuFeatures::IsSupported(FPU)) { | 589 if (CpuFeatures::IsSupported(FPU)) { |
582 CpuFeatureScope scope(&assm, FPU); | 590 CpuFeatureScope scope(&assm, FPU); |
583 | 591 |
584 __ ldc1(f4, MemOperand(a0, OFFSET_OF(T, a)) ); | 592 __ ldc1(f4, MemOperand(a0, OFFSET_OF(T, a)) ); |
585 __ ldc1(f6, MemOperand(a0, OFFSET_OF(T, b)) ); | 593 __ ldc1(f6, MemOperand(a0, OFFSET_OF(T, b)) ); |
586 __ c(UN, D, f4, f6); | 594 __ c(UN, D, f4, f6); |
587 __ bc1f(&neither_is_nan); | 595 __ bc1f(&neither_is_nan); |
588 __ nop(); | 596 __ nop(); |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
634 CHECK_EQ(1.5e14, t.a); | 642 CHECK_EQ(1.5e14, t.a); |
635 CHECK_EQ(2.75e11, t.b); | 643 CHECK_EQ(2.75e11, t.b); |
636 CHECK_EQ(1, t.result); | 644 CHECK_EQ(1, t.result); |
637 } | 645 } |
638 } | 646 } |
639 | 647 |
640 | 648 |
641 TEST(MIPS8) { | 649 TEST(MIPS8) { |
642 // Test ROTR and ROTRV instructions. | 650 // Test ROTR and ROTRV instructions. |
643 InitializeVM(); | 651 InitializeVM(); |
644 v8::HandleScope scope; | 652 Isolate* isolate = Isolate::Current(); |
| 653 HandleScope scope(isolate); |
645 | 654 |
646 typedef struct { | 655 typedef struct { |
647 int32_t input; | 656 int32_t input; |
648 int32_t result_rotr_4; | 657 int32_t result_rotr_4; |
649 int32_t result_rotr_8; | 658 int32_t result_rotr_8; |
650 int32_t result_rotr_12; | 659 int32_t result_rotr_12; |
651 int32_t result_rotr_16; | 660 int32_t result_rotr_16; |
652 int32_t result_rotr_20; | 661 int32_t result_rotr_20; |
653 int32_t result_rotr_24; | 662 int32_t result_rotr_24; |
654 int32_t result_rotr_28; | 663 int32_t result_rotr_28; |
655 int32_t result_rotrv_4; | 664 int32_t result_rotrv_4; |
656 int32_t result_rotrv_8; | 665 int32_t result_rotrv_8; |
657 int32_t result_rotrv_12; | 666 int32_t result_rotrv_12; |
658 int32_t result_rotrv_16; | 667 int32_t result_rotrv_16; |
659 int32_t result_rotrv_20; | 668 int32_t result_rotrv_20; |
660 int32_t result_rotrv_24; | 669 int32_t result_rotrv_24; |
661 int32_t result_rotrv_28; | 670 int32_t result_rotrv_28; |
662 } T; | 671 } T; |
663 T t; | 672 T t; |
664 | 673 |
665 MacroAssembler assm(Isolate::Current(), NULL, 0); | 674 MacroAssembler assm(isolate, NULL, 0); |
666 | 675 |
667 // Basic word load. | 676 // Basic word load. |
668 __ lw(t0, MemOperand(a0, OFFSET_OF(T, input)) ); | 677 __ lw(t0, MemOperand(a0, OFFSET_OF(T, input)) ); |
669 | 678 |
670 // ROTR instruction (called through the Ror macro). | 679 // ROTR instruction (called through the Ror macro). |
671 __ Ror(t1, t0, 0x0004); | 680 __ Ror(t1, t0, 0x0004); |
672 __ Ror(t2, t0, 0x0008); | 681 __ Ror(t2, t0, 0x0008); |
673 __ Ror(t3, t0, 0x000c); | 682 __ Ror(t3, t0, 0x000c); |
674 __ Ror(t4, t0, 0x0010); | 683 __ Ror(t4, t0, 0x0010); |
675 __ Ror(t5, t0, 0x0014); | 684 __ Ror(t5, t0, 0x0014); |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
738 CHECK_EQ(0x56781234, t.result_rotrv_16); | 747 CHECK_EQ(0x56781234, t.result_rotrv_16); |
739 CHECK_EQ(0x45678123, t.result_rotrv_20); | 748 CHECK_EQ(0x45678123, t.result_rotrv_20); |
740 CHECK_EQ(0x34567812, t.result_rotrv_24); | 749 CHECK_EQ(0x34567812, t.result_rotrv_24); |
741 CHECK_EQ(0x23456781, t.result_rotrv_28); | 750 CHECK_EQ(0x23456781, t.result_rotrv_28); |
742 } | 751 } |
743 | 752 |
744 | 753 |
745 TEST(MIPS9) { | 754 TEST(MIPS9) { |
746 // Test BRANCH improvements. | 755 // Test BRANCH improvements. |
747 InitializeVM(); | 756 InitializeVM(); |
748 v8::HandleScope scope; | 757 Isolate* isolate = Isolate::Current(); |
| 758 HandleScope scope(isolate); |
749 | 759 |
750 MacroAssembler assm(Isolate::Current(), NULL, 0); | 760 MacroAssembler assm(isolate, NULL, 0); |
751 Label exit, exit2, exit3; | 761 Label exit, exit2, exit3; |
752 | 762 |
753 __ Branch(&exit, ge, a0, Operand(0x00000000)); | 763 __ Branch(&exit, ge, a0, Operand(0x00000000)); |
754 __ Branch(&exit2, ge, a0, Operand(0x00001FFF)); | 764 __ Branch(&exit2, ge, a0, Operand(0x00001FFF)); |
755 __ Branch(&exit3, ge, a0, Operand(0x0001FFFF)); | 765 __ Branch(&exit3, ge, a0, Operand(0x0001FFFF)); |
756 | 766 |
757 __ bind(&exit); | 767 __ bind(&exit); |
758 __ bind(&exit2); | 768 __ bind(&exit2); |
759 __ bind(&exit3); | 769 __ bind(&exit3); |
760 __ jr(ra); | 770 __ jr(ra); |
761 __ nop(); | 771 __ nop(); |
762 | 772 |
763 CodeDesc desc; | 773 CodeDesc desc; |
764 assm.GetCode(&desc); | 774 assm.GetCode(&desc); |
765 Object* code = HEAP->CreateCode( | 775 Object* code = HEAP->CreateCode( |
766 desc, | 776 desc, |
767 Code::ComputeFlags(Code::STUB), | 777 Code::ComputeFlags(Code::STUB), |
768 Handle<Code>())->ToObjectChecked(); | 778 Handle<Code>())->ToObjectChecked(); |
769 CHECK(code->IsCode()); | 779 CHECK(code->IsCode()); |
770 } | 780 } |
771 | 781 |
772 | 782 |
773 TEST(MIPS10) { | 783 TEST(MIPS10) { |
774 // Test conversions between doubles and long integers. | 784 // Test conversions between doubles and long integers. |
775 // Test hos the long ints map to FP regs pairs. | 785 // Test hos the long ints map to FP regs pairs. |
776 InitializeVM(); | 786 InitializeVM(); |
777 v8::HandleScope scope; | 787 Isolate* isolate = Isolate::Current(); |
| 788 HandleScope scope(isolate); |
778 | 789 |
779 typedef struct { | 790 typedef struct { |
780 double a; | 791 double a; |
781 double b; | 792 double b; |
782 int32_t dbl_mant; | 793 int32_t dbl_mant; |
783 int32_t dbl_exp; | 794 int32_t dbl_exp; |
784 int32_t long_hi; | 795 int32_t long_hi; |
785 int32_t long_lo; | 796 int32_t long_lo; |
786 int32_t b_long_hi; | 797 int32_t b_long_hi; |
787 int32_t b_long_lo; | 798 int32_t b_long_lo; |
788 } T; | 799 } T; |
789 T t; | 800 T t; |
790 | 801 |
791 Assembler assm(Isolate::Current(), NULL, 0); | 802 Assembler assm(isolate, NULL, 0); |
792 Label L, C; | 803 Label L, C; |
793 | 804 |
794 if (CpuFeatures::IsSupported(FPU) && kArchVariant == kMips32r2) { | 805 if (CpuFeatures::IsSupported(FPU) && kArchVariant == kMips32r2) { |
795 CpuFeatureScope scope(&assm, FPU); | 806 CpuFeatureScope scope(&assm, FPU); |
796 | 807 |
797 // Load all structure elements to registers. | 808 // Load all structure elements to registers. |
798 __ ldc1(f0, MemOperand(a0, OFFSET_OF(T, a))); | 809 __ ldc1(f0, MemOperand(a0, OFFSET_OF(T, a))); |
799 | 810 |
800 // Save the raw bits of the double. | 811 // Save the raw bits of the double. |
801 __ mfc1(t0, f0); | 812 __ mfc1(t0, f0); |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
841 CHECK_EQ(0x7fffffff, t.long_lo); | 852 CHECK_EQ(0x7fffffff, t.long_lo); |
842 // 0xFF00FF00FF -> 1.095233372415e12. | 853 // 0xFF00FF00FF -> 1.095233372415e12. |
843 CHECK_EQ(1.095233372415e12, t.b); | 854 CHECK_EQ(1.095233372415e12, t.b); |
844 } | 855 } |
845 } | 856 } |
846 | 857 |
847 | 858 |
848 TEST(MIPS11) { | 859 TEST(MIPS11) { |
849 // Test LWL, LWR, SWL and SWR instructions. | 860 // Test LWL, LWR, SWL and SWR instructions. |
850 InitializeVM(); | 861 InitializeVM(); |
851 v8::HandleScope scope; | 862 Isolate* isolate = Isolate::Current(); |
| 863 HandleScope scope(isolate); |
852 | 864 |
853 typedef struct { | 865 typedef struct { |
854 int32_t reg_init; | 866 int32_t reg_init; |
855 int32_t mem_init; | 867 int32_t mem_init; |
856 int32_t lwl_0; | 868 int32_t lwl_0; |
857 int32_t lwl_1; | 869 int32_t lwl_1; |
858 int32_t lwl_2; | 870 int32_t lwl_2; |
859 int32_t lwl_3; | 871 int32_t lwl_3; |
860 int32_t lwr_0; | 872 int32_t lwr_0; |
861 int32_t lwr_1; | 873 int32_t lwr_1; |
862 int32_t lwr_2; | 874 int32_t lwr_2; |
863 int32_t lwr_3; | 875 int32_t lwr_3; |
864 int32_t swl_0; | 876 int32_t swl_0; |
865 int32_t swl_1; | 877 int32_t swl_1; |
866 int32_t swl_2; | 878 int32_t swl_2; |
867 int32_t swl_3; | 879 int32_t swl_3; |
868 int32_t swr_0; | 880 int32_t swr_0; |
869 int32_t swr_1; | 881 int32_t swr_1; |
870 int32_t swr_2; | 882 int32_t swr_2; |
871 int32_t swr_3; | 883 int32_t swr_3; |
872 } T; | 884 } T; |
873 T t; | 885 T t; |
874 | 886 |
875 Assembler assm(Isolate::Current(), NULL, 0); | 887 Assembler assm(isolate, NULL, 0); |
876 | 888 |
877 // Test all combinations of LWL and vAddr. | 889 // Test all combinations of LWL and vAddr. |
878 __ lw(t0, MemOperand(a0, OFFSET_OF(T, reg_init)) ); | 890 __ lw(t0, MemOperand(a0, OFFSET_OF(T, reg_init)) ); |
879 __ lwl(t0, MemOperand(a0, OFFSET_OF(T, mem_init)) ); | 891 __ lwl(t0, MemOperand(a0, OFFSET_OF(T, mem_init)) ); |
880 __ sw(t0, MemOperand(a0, OFFSET_OF(T, lwl_0)) ); | 892 __ sw(t0, MemOperand(a0, OFFSET_OF(T, lwl_0)) ); |
881 | 893 |
882 __ lw(t1, MemOperand(a0, OFFSET_OF(T, reg_init)) ); | 894 __ lw(t1, MemOperand(a0, OFFSET_OF(T, reg_init)) ); |
883 __ lwl(t1, MemOperand(a0, OFFSET_OF(T, mem_init) + 1) ); | 895 __ lwl(t1, MemOperand(a0, OFFSET_OF(T, mem_init) + 1) ); |
884 __ sw(t1, MemOperand(a0, OFFSET_OF(T, lwl_1)) ); | 896 __ sw(t1, MemOperand(a0, OFFSET_OF(T, lwl_1)) ); |
885 | 897 |
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
984 | 996 |
985 CHECK_EQ(0xaabbccdd, t.swr_0); | 997 CHECK_EQ(0xaabbccdd, t.swr_0); |
986 CHECK_EQ(0xbbccdd44, t.swr_1); | 998 CHECK_EQ(0xbbccdd44, t.swr_1); |
987 CHECK_EQ(0xccdd3344, t.swr_2); | 999 CHECK_EQ(0xccdd3344, t.swr_2); |
988 CHECK_EQ(0xdd223344, t.swr_3); | 1000 CHECK_EQ(0xdd223344, t.swr_3); |
989 } | 1001 } |
990 | 1002 |
991 | 1003 |
992 TEST(MIPS12) { | 1004 TEST(MIPS12) { |
993 InitializeVM(); | 1005 InitializeVM(); |
994 v8::HandleScope scope; | 1006 Isolate* isolate = Isolate::Current(); |
| 1007 HandleScope scope(isolate); |
995 | 1008 |
996 typedef struct { | 1009 typedef struct { |
997 int32_t x; | 1010 int32_t x; |
998 int32_t y; | 1011 int32_t y; |
999 int32_t y1; | 1012 int32_t y1; |
1000 int32_t y2; | 1013 int32_t y2; |
1001 int32_t y3; | 1014 int32_t y3; |
1002 int32_t y4; | 1015 int32_t y4; |
1003 } T; | 1016 } T; |
1004 T t; | 1017 T t; |
1005 | 1018 |
1006 MacroAssembler assm(Isolate::Current(), NULL, 0); | 1019 MacroAssembler assm(isolate, NULL, 0); |
1007 | 1020 |
1008 __ mov(t6, fp); // Save frame pointer. | 1021 __ mov(t6, fp); // Save frame pointer. |
1009 __ mov(fp, a0); // Access struct T by fp. | 1022 __ mov(fp, a0); // Access struct T by fp. |
1010 __ lw(t0, MemOperand(a0, OFFSET_OF(T, y)) ); | 1023 __ lw(t0, MemOperand(a0, OFFSET_OF(T, y)) ); |
1011 __ lw(t3, MemOperand(a0, OFFSET_OF(T, y4)) ); | 1024 __ lw(t3, MemOperand(a0, OFFSET_OF(T, y4)) ); |
1012 | 1025 |
1013 __ addu(t1, t0, t3); | 1026 __ addu(t1, t0, t3); |
1014 __ subu(t4, t0, t3); | 1027 __ subu(t4, t0, t3); |
1015 __ nop(); | 1028 __ nop(); |
1016 __ push(t0); // These instructions disappear after opt. | 1029 __ push(t0); // These instructions disappear after opt. |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1075 Object* dummy = CALL_GENERATED_CODE(f, &t, 0, 0, 0, 0); | 1088 Object* dummy = CALL_GENERATED_CODE(f, &t, 0, 0, 0, 0); |
1076 USE(dummy); | 1089 USE(dummy); |
1077 | 1090 |
1078 CHECK_EQ(3, t.y1); | 1091 CHECK_EQ(3, t.y1); |
1079 } | 1092 } |
1080 | 1093 |
1081 | 1094 |
1082 TEST(MIPS13) { | 1095 TEST(MIPS13) { |
1083 // Test Cvt_d_uw and Trunc_uw_d macros. | 1096 // Test Cvt_d_uw and Trunc_uw_d macros. |
1084 InitializeVM(); | 1097 InitializeVM(); |
1085 v8::HandleScope scope; | 1098 Isolate* isolate = Isolate::Current(); |
| 1099 HandleScope scope(isolate); |
1086 | 1100 |
1087 typedef struct { | 1101 typedef struct { |
1088 double cvt_big_out; | 1102 double cvt_big_out; |
1089 double cvt_small_out; | 1103 double cvt_small_out; |
1090 uint32_t trunc_big_out; | 1104 uint32_t trunc_big_out; |
1091 uint32_t trunc_small_out; | 1105 uint32_t trunc_small_out; |
1092 uint32_t cvt_big_in; | 1106 uint32_t cvt_big_in; |
1093 uint32_t cvt_small_in; | 1107 uint32_t cvt_small_in; |
1094 } T; | 1108 } T; |
1095 T t; | 1109 T t; |
1096 | 1110 |
1097 MacroAssembler assm(Isolate::Current(), NULL, 0); | 1111 MacroAssembler assm(isolate, NULL, 0); |
1098 | 1112 |
1099 if (CpuFeatures::IsSupported(FPU)) { | 1113 if (CpuFeatures::IsSupported(FPU)) { |
1100 CpuFeatureScope scope(&assm, FPU); | 1114 CpuFeatureScope scope(&assm, FPU); |
1101 | 1115 |
1102 __ sw(t0, MemOperand(a0, OFFSET_OF(T, cvt_small_in))); | 1116 __ sw(t0, MemOperand(a0, OFFSET_OF(T, cvt_small_in))); |
1103 __ Cvt_d_uw(f10, t0, f22); | 1117 __ Cvt_d_uw(f10, t0, f22); |
1104 __ sdc1(f10, MemOperand(a0, OFFSET_OF(T, cvt_small_out))); | 1118 __ sdc1(f10, MemOperand(a0, OFFSET_OF(T, cvt_small_out))); |
1105 | 1119 |
1106 __ Trunc_uw_d(f10, f10, f22); | 1120 __ Trunc_uw_d(f10, f10, f22); |
1107 __ swc1(f10, MemOperand(a0, OFFSET_OF(T, trunc_small_out))); | 1121 __ swc1(f10, MemOperand(a0, OFFSET_OF(T, trunc_small_out))); |
(...skipping 29 matching lines...) Expand all Loading... |
1137 CHECK_EQ(static_cast<int>(t.trunc_big_out), static_cast<int>(t.cvt_big_in)); | 1151 CHECK_EQ(static_cast<int>(t.trunc_big_out), static_cast<int>(t.cvt_big_in)); |
1138 CHECK_EQ(static_cast<int>(t.trunc_small_out), | 1152 CHECK_EQ(static_cast<int>(t.trunc_small_out), |
1139 static_cast<int>(t.cvt_small_in)); | 1153 static_cast<int>(t.cvt_small_in)); |
1140 } | 1154 } |
1141 } | 1155 } |
1142 | 1156 |
1143 | 1157 |
1144 TEST(MIPS14) { | 1158 TEST(MIPS14) { |
1145 // Test round, floor, ceil, trunc, cvt. | 1159 // Test round, floor, ceil, trunc, cvt. |
1146 InitializeVM(); | 1160 InitializeVM(); |
1147 v8::HandleScope scope; | 1161 Isolate* isolate = Isolate::Current(); |
| 1162 HandleScope scope(isolate); |
1148 | 1163 |
1149 #define ROUND_STRUCT_ELEMENT(x) \ | 1164 #define ROUND_STRUCT_ELEMENT(x) \ |
1150 int32_t x##_up_out; \ | 1165 int32_t x##_up_out; \ |
1151 int32_t x##_down_out; \ | 1166 int32_t x##_down_out; \ |
1152 int32_t neg_##x##_up_out; \ | 1167 int32_t neg_##x##_up_out; \ |
1153 int32_t neg_##x##_down_out; \ | 1168 int32_t neg_##x##_down_out; \ |
1154 uint32_t x##_err1_out; \ | 1169 uint32_t x##_err1_out; \ |
1155 uint32_t x##_err2_out; \ | 1170 uint32_t x##_err2_out; \ |
1156 uint32_t x##_err3_out; \ | 1171 uint32_t x##_err3_out; \ |
1157 uint32_t x##_err4_out; \ | 1172 uint32_t x##_err4_out; \ |
(...skipping 12 matching lines...) Expand all Loading... |
1170 ROUND_STRUCT_ELEMENT(round) | 1185 ROUND_STRUCT_ELEMENT(round) |
1171 ROUND_STRUCT_ELEMENT(floor) | 1186 ROUND_STRUCT_ELEMENT(floor) |
1172 ROUND_STRUCT_ELEMENT(ceil) | 1187 ROUND_STRUCT_ELEMENT(ceil) |
1173 ROUND_STRUCT_ELEMENT(trunc) | 1188 ROUND_STRUCT_ELEMENT(trunc) |
1174 ROUND_STRUCT_ELEMENT(cvt) | 1189 ROUND_STRUCT_ELEMENT(cvt) |
1175 } T; | 1190 } T; |
1176 T t; | 1191 T t; |
1177 | 1192 |
1178 #undef ROUND_STRUCT_ELEMENT | 1193 #undef ROUND_STRUCT_ELEMENT |
1179 | 1194 |
1180 MacroAssembler assm(Isolate::Current(), NULL, 0); | 1195 MacroAssembler assm(isolate, NULL, 0); |
1181 | 1196 |
1182 if (CpuFeatures::IsSupported(FPU)) { | 1197 if (CpuFeatures::IsSupported(FPU)) { |
1183 CpuFeatureScope scope(&assm, FPU); | 1198 CpuFeatureScope scope(&assm, FPU); |
1184 | 1199 |
1185 // Save FCSR. | 1200 // Save FCSR. |
1186 __ cfc1(a1, FCSR); | 1201 __ cfc1(a1, FCSR); |
1187 // Disable FPU exceptions. | 1202 // Disable FPU exceptions. |
1188 __ ctc1(zero_reg, FCSR); | 1203 __ ctc1(zero_reg, FCSR); |
1189 #define RUN_ROUND_TEST(x) \ | 1204 #define RUN_ROUND_TEST(x) \ |
1190 __ ldc1(f0, MemOperand(a0, OFFSET_OF(T, round_up_in))); \ | 1205 __ ldc1(f0, MemOperand(a0, OFFSET_OF(T, round_up_in))); \ |
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1273 CHECK_ROUND_RESULT(floor); | 1288 CHECK_ROUND_RESULT(floor); |
1274 CHECK_ROUND_RESULT(ceil); | 1289 CHECK_ROUND_RESULT(ceil); |
1275 CHECK_ROUND_RESULT(cvt); | 1290 CHECK_ROUND_RESULT(cvt); |
1276 } | 1291 } |
1277 } | 1292 } |
1278 | 1293 |
1279 | 1294 |
1280 TEST(MIPS15) { | 1295 TEST(MIPS15) { |
1281 // Test chaining of label usages within instructions (issue 1644). | 1296 // Test chaining of label usages within instructions (issue 1644). |
1282 InitializeVM(); | 1297 InitializeVM(); |
1283 v8::HandleScope scope; | 1298 Isolate* isolate = Isolate::Current(); |
1284 Assembler assm(Isolate::Current(), NULL, 0); | 1299 HandleScope scope(isolate); |
| 1300 Assembler assm(isolate, NULL, 0); |
1285 | 1301 |
1286 Label target; | 1302 Label target; |
1287 __ beq(v0, v1, &target); | 1303 __ beq(v0, v1, &target); |
1288 __ nop(); | 1304 __ nop(); |
1289 __ bne(v0, v1, &target); | 1305 __ bne(v0, v1, &target); |
1290 __ nop(); | 1306 __ nop(); |
1291 __ bind(&target); | 1307 __ bind(&target); |
1292 __ nop(); | 1308 __ nop(); |
1293 } | 1309 } |
1294 | 1310 |
1295 #undef __ | 1311 #undef __ |
OLD | NEW |