| OLD | NEW |
| 1 // Copyright 2010 the V8 project authors. All rights reserved. | 1 // Copyright 2011 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 |
| 11 // with the distribution. | 11 // with the distribution. |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 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 v8::HandleScope scope; |
| 66 | 66 |
| 67 MacroAssembler assm(NULL, 0); | 67 MacroAssembler assm(Isolate::Current(), NULL, 0); |
| 68 | 68 |
| 69 // Addition. | 69 // Addition. |
| 70 __ addu(v0, a0, a1); | 70 __ addu(v0, a0, a1); |
| 71 __ jr(ra); | 71 __ jr(ra); |
| 72 __ nop(); | 72 __ nop(); |
| 73 | 73 |
| 74 CodeDesc desc; | 74 CodeDesc desc; |
| 75 assm.GetCode(&desc); | 75 assm.GetCode(&desc); |
| 76 Object* code = HEAP->CreateCode( | 76 Object* code = HEAP->CreateCode( |
| 77 desc, | 77 desc, |
| 78 Code::ComputeFlags(Code::STUB), | 78 Code::ComputeFlags(Code::STUB), |
| 79 Handle<Object>(HEAP->undefined_value()))->ToObjectChecked(); | 79 Handle<Object>(HEAP->undefined_value()))->ToObjectChecked(); |
| 80 CHECK(code->IsCode()); | 80 CHECK(code->IsCode()); |
| 81 F2 f = FUNCTION_CAST<F2>(Code::cast(code)->entry()); | 81 F2 f = FUNCTION_CAST<F2>(Code::cast(code)->entry()); |
| 82 int res = reinterpret_cast<int>(CALL_GENERATED_CODE(f, 0xab0, 0xc, 0, 0, 0)); | 82 int res = reinterpret_cast<int>(CALL_GENERATED_CODE(f, 0xab0, 0xc, 0, 0, 0)); |
| 83 ::printf("f() = %d\n", res); | 83 ::printf("f() = %d\n", res); |
| 84 CHECK_EQ(0xabc, res); | 84 CHECK_EQ(0xabc, res); |
| 85 } | 85 } |
| 86 | 86 |
| 87 | 87 |
| 88 TEST(MIPS1) { | 88 TEST(MIPS1) { |
| 89 InitializeVM(); | 89 InitializeVM(); |
| 90 v8::HandleScope scope; | 90 v8::HandleScope scope; |
| 91 | 91 |
| 92 MacroAssembler assm(NULL, 0); | 92 MacroAssembler assm(Isolate::Current(), NULL, 0); |
| 93 Label L, C; | 93 Label L, C; |
| 94 | 94 |
| 95 __ mov(a1, a0); | 95 __ mov(a1, a0); |
| 96 __ li(v0, 0); | 96 __ li(v0, 0); |
| 97 __ b(&C); | 97 __ b(&C); |
| 98 __ nop(); | 98 __ nop(); |
| 99 | 99 |
| 100 __ bind(&L); | 100 __ bind(&L); |
| 101 __ addu(v0, v0, a1); | 101 __ addu(v0, v0, a1); |
| 102 __ addiu(a1, a1, -1); | 102 __ addiu(a1, a1, -1); |
| (...skipping 17 matching lines...) Expand all Loading... |
| 120 int res = reinterpret_cast<int>(CALL_GENERATED_CODE(f, 50, 0, 0, 0, 0)); | 120 int res = reinterpret_cast<int>(CALL_GENERATED_CODE(f, 50, 0, 0, 0, 0)); |
| 121 ::printf("f() = %d\n", res); | 121 ::printf("f() = %d\n", res); |
| 122 CHECK_EQ(1275, res); | 122 CHECK_EQ(1275, res); |
| 123 } | 123 } |
| 124 | 124 |
| 125 | 125 |
| 126 TEST(MIPS2) { | 126 TEST(MIPS2) { |
| 127 InitializeVM(); | 127 InitializeVM(); |
| 128 v8::HandleScope scope; | 128 v8::HandleScope scope; |
| 129 | 129 |
| 130 MacroAssembler assm(NULL, 0); | 130 MacroAssembler assm(Isolate::Current(), NULL, 0); |
| 131 | 131 |
| 132 Label exit, error; | 132 Label exit, error; |
| 133 | 133 |
| 134 // ----- Test all instructions. | 134 // ----- Test all instructions. |
| 135 | 135 |
| 136 // Test lui, ori, and addiu, used in the li pseudo-instruction. | 136 // Test lui, ori, and addiu, used in the li pseudo-instruction. |
| 137 // This way we can then safely load registers with chosen values. | 137 // This way we can then safely load registers with chosen values. |
| 138 | 138 |
| 139 __ ori(t0, zero_reg, 0); | 139 __ ori(t0, zero_reg, 0); |
| 140 __ lui(t0, 0x1234); | 140 __ lui(t0, 0x1234); |
| (...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 274 double c; | 274 double c; |
| 275 double d; | 275 double d; |
| 276 double e; | 276 double e; |
| 277 double f; | 277 double f; |
| 278 double g; | 278 double g; |
| 279 } T; | 279 } T; |
| 280 T t; | 280 T t; |
| 281 | 281 |
| 282 // Create a function that accepts &t, and loads, manipulates, and stores | 282 // Create a function that accepts &t, and loads, manipulates, and stores |
| 283 // the doubles t.a ... t.f. | 283 // the doubles t.a ... t.f. |
| 284 MacroAssembler assm(NULL, 0); | 284 MacroAssembler assm(Isolate::Current(), NULL, 0); |
| 285 Label L, C; | 285 Label L, C; |
| 286 | 286 |
| 287 if (Isolate::Current()->cpu_features()->IsSupported(FPU)) { | 287 if (CpuFeatures::IsSupported(FPU)) { |
| 288 CpuFeatures::Scope scope(FPU); | 288 CpuFeatures::Scope scope(FPU); |
| 289 | 289 |
| 290 __ ldc1(f4, MemOperand(a0, OFFSET_OF(T, a)) ); | 290 __ ldc1(f4, MemOperand(a0, OFFSET_OF(T, a)) ); |
| 291 __ ldc1(f6, MemOperand(a0, OFFSET_OF(T, b)) ); | 291 __ ldc1(f6, MemOperand(a0, OFFSET_OF(T, b)) ); |
| 292 __ add_d(f8, f4, f6); | 292 __ add_d(f8, f4, f6); |
| 293 __ sdc1(f8, MemOperand(a0, OFFSET_OF(T, c)) ); // c = a + b. | 293 __ sdc1(f8, MemOperand(a0, OFFSET_OF(T, c)) ); // c = a + b. |
| 294 | 294 |
| 295 __ mov_d(f10, f8); // c | 295 __ mov_d(f10, f8); // c |
| 296 __ neg_d(f12, f6); // -b | 296 __ neg_d(f12, f6); // -b |
| 297 __ sub_d(f10, f10, f12); | 297 __ sub_d(f10, f10, f12); |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 347 InitializeVM(); | 347 InitializeVM(); |
| 348 v8::HandleScope scope; | 348 v8::HandleScope scope; |
| 349 | 349 |
| 350 typedef struct { | 350 typedef struct { |
| 351 double a; | 351 double a; |
| 352 double b; | 352 double b; |
| 353 double c; | 353 double c; |
| 354 } T; | 354 } T; |
| 355 T t; | 355 T t; |
| 356 | 356 |
| 357 Assembler assm(NULL, 0); | 357 Assembler assm(Isolate::Current(), NULL, 0); |
| 358 Label L, C; | 358 Label L, C; |
| 359 | 359 |
| 360 if (Isolate::Current()->cpu_features()->IsSupported(FPU)) { | 360 if (CpuFeatures::IsSupported(FPU)) { |
| 361 CpuFeatures::Scope scope(FPU); | 361 CpuFeatures::Scope scope(FPU); |
| 362 | 362 |
| 363 __ ldc1(f4, MemOperand(a0, OFFSET_OF(T, a)) ); | 363 __ ldc1(f4, MemOperand(a0, OFFSET_OF(T, a)) ); |
| 364 __ ldc1(f6, MemOperand(a0, OFFSET_OF(T, b)) ); | 364 __ ldc1(f6, MemOperand(a0, OFFSET_OF(T, b)) ); |
| 365 | 365 |
| 366 // Swap f4 and f6, by using four integer registers, t0-t3. | 366 // Swap f4 and f6, by using four integer registers, t0-t3. |
| 367 __ mfc1(t0, f4); | 367 __ mfc1(t0, f4); |
| 368 __ mfc1(t1, f5); | 368 __ mfc1(t1, f5); |
| 369 __ mfc1(t2, f6); | 369 __ mfc1(t2, f6); |
| 370 __ mfc1(t3, f7); | 370 __ mfc1(t3, f7); |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 408 v8::HandleScope scope; | 408 v8::HandleScope scope; |
| 409 | 409 |
| 410 typedef struct { | 410 typedef struct { |
| 411 double a; | 411 double a; |
| 412 double b; | 412 double b; |
| 413 int i; | 413 int i; |
| 414 int j; | 414 int j; |
| 415 } T; | 415 } T; |
| 416 T t; | 416 T t; |
| 417 | 417 |
| 418 Assembler assm(NULL, 0); | 418 Assembler assm(Isolate::Current(), NULL, 0); |
| 419 Label L, C; | 419 Label L, C; |
| 420 | 420 |
| 421 if (Isolate::Current()->cpu_features()->IsSupported(FPU)) { | 421 if (CpuFeatures::IsSupported(FPU)) { |
| 422 CpuFeatures::Scope scope(FPU); | 422 CpuFeatures::Scope scope(FPU); |
| 423 | 423 |
| 424 // Load all structure elements to registers. | 424 // Load all structure elements to registers. |
| 425 __ ldc1(f4, MemOperand(a0, OFFSET_OF(T, a)) ); | 425 __ ldc1(f4, MemOperand(a0, OFFSET_OF(T, a)) ); |
| 426 __ ldc1(f6, MemOperand(a0, OFFSET_OF(T, b)) ); | 426 __ ldc1(f6, MemOperand(a0, OFFSET_OF(T, b)) ); |
| 427 __ lw(t0, MemOperand(a0, OFFSET_OF(T, i)) ); | 427 __ lw(t0, MemOperand(a0, OFFSET_OF(T, i)) ); |
| 428 __ lw(t1, MemOperand(a0, OFFSET_OF(T, j)) ); | 428 __ lw(t1, MemOperand(a0, OFFSET_OF(T, j)) ); |
| 429 | 429 |
| 430 // Convert double in f4 to int in element i. | 430 // Convert double in f4 to int in element i. |
| 431 __ cvt_w_d(f8, f4); | 431 __ cvt_w_d(f8, f4); |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 483 int32_t si; | 483 int32_t si; |
| 484 int32_t r1; | 484 int32_t r1; |
| 485 int32_t r2; | 485 int32_t r2; |
| 486 int32_t r3; | 486 int32_t r3; |
| 487 int32_t r4; | 487 int32_t r4; |
| 488 int32_t r5; | 488 int32_t r5; |
| 489 int32_t r6; | 489 int32_t r6; |
| 490 } T; | 490 } T; |
| 491 T t; | 491 T t; |
| 492 | 492 |
| 493 Assembler assm(NULL, 0); | 493 Assembler assm(Isolate::Current(), NULL, 0); |
| 494 Label L, C; | 494 Label L, C; |
| 495 | 495 |
| 496 // Basic word load/store. | 496 // Basic word load/store. |
| 497 __ lw(t0, MemOperand(a0, OFFSET_OF(T, ui)) ); | 497 __ lw(t0, MemOperand(a0, OFFSET_OF(T, ui)) ); |
| 498 __ sw(t0, MemOperand(a0, OFFSET_OF(T, r1)) ); | 498 __ sw(t0, MemOperand(a0, OFFSET_OF(T, r1)) ); |
| 499 | 499 |
| 500 // lh with positive data. | 500 // lh with positive data. |
| 501 __ lh(t1, MemOperand(a0, OFFSET_OF(T, ui)) ); | 501 __ lh(t1, MemOperand(a0, OFFSET_OF(T, ui)) ); |
| 502 __ sw(t1, MemOperand(a0, OFFSET_OF(T, r2)) ); | 502 __ sw(t1, MemOperand(a0, OFFSET_OF(T, r2)) ); |
| 503 | 503 |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 556 double c; | 556 double c; |
| 557 double d; | 557 double d; |
| 558 double e; | 558 double e; |
| 559 double f; | 559 double f; |
| 560 int32_t result; | 560 int32_t result; |
| 561 } T; | 561 } T; |
| 562 T t; | 562 T t; |
| 563 | 563 |
| 564 // Create a function that accepts &t, and loads, manipulates, and stores | 564 // Create a function that accepts &t, and loads, manipulates, and stores |
| 565 // the doubles t.a ... t.f. | 565 // the doubles t.a ... t.f. |
| 566 MacroAssembler assm(NULL, 0); | 566 MacroAssembler assm(Isolate::Current(), NULL, 0); |
| 567 Label neither_is_nan, less_than, outa_here; | 567 Label neither_is_nan, less_than, outa_here; |
| 568 | 568 |
| 569 if (Isolate::Current()->cpu_features()->IsSupported(FPU)) { | 569 if (CpuFeatures::IsSupported(FPU)) { |
| 570 CpuFeatures::Scope scope(FPU); | 570 CpuFeatures::Scope scope(FPU); |
| 571 | 571 |
| 572 __ ldc1(f4, MemOperand(a0, OFFSET_OF(T, a)) ); | 572 __ ldc1(f4, MemOperand(a0, OFFSET_OF(T, a)) ); |
| 573 __ ldc1(f6, MemOperand(a0, OFFSET_OF(T, b)) ); | 573 __ ldc1(f6, MemOperand(a0, OFFSET_OF(T, b)) ); |
| 574 __ c(UN, D, f4, f6); | 574 __ c(UN, D, f4, f6); |
| 575 __ bc1f(&neither_is_nan); | 575 __ bc1f(&neither_is_nan); |
| 576 __ nop(); | 576 __ nop(); |
| 577 __ sw(zero_reg, MemOperand(a0, OFFSET_OF(T, result)) ); | 577 __ sw(zero_reg, MemOperand(a0, OFFSET_OF(T, result)) ); |
| 578 __ Branch(&outa_here); | 578 __ Branch(&outa_here); |
| 579 | 579 |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 638 int32_t result_rotrv_4; | 638 int32_t result_rotrv_4; |
| 639 int32_t result_rotrv_8; | 639 int32_t result_rotrv_8; |
| 640 int32_t result_rotrv_12; | 640 int32_t result_rotrv_12; |
| 641 int32_t result_rotrv_16; | 641 int32_t result_rotrv_16; |
| 642 int32_t result_rotrv_20; | 642 int32_t result_rotrv_20; |
| 643 int32_t result_rotrv_24; | 643 int32_t result_rotrv_24; |
| 644 int32_t result_rotrv_28; | 644 int32_t result_rotrv_28; |
| 645 } T; | 645 } T; |
| 646 T t; | 646 T t; |
| 647 | 647 |
| 648 MacroAssembler assm(NULL, 0); | 648 MacroAssembler assm(Isolate::Current(), NULL, 0); |
| 649 | 649 |
| 650 // Basic word load. | 650 // Basic word load. |
| 651 __ lw(t0, MemOperand(a0, OFFSET_OF(T, input)) ); | 651 __ lw(t0, MemOperand(a0, OFFSET_OF(T, input)) ); |
| 652 | 652 |
| 653 // ROTR instruction (called through the Ror macro). | 653 // ROTR instruction (called through the Ror macro). |
| 654 __ Ror(t1, t0, 0x0004); | 654 __ Ror(t1, t0, 0x0004); |
| 655 __ Ror(t2, t0, 0x0008); | 655 __ Ror(t2, t0, 0x0008); |
| 656 __ Ror(t3, t0, 0x000c); | 656 __ Ror(t3, t0, 0x000c); |
| 657 __ Ror(t4, t0, 0x0010); | 657 __ Ror(t4, t0, 0x0010); |
| 658 __ Ror(t5, t0, 0x0014); | 658 __ Ror(t5, t0, 0x0014); |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 723 CHECK_EQ(0x34567812, t.result_rotrv_24); | 723 CHECK_EQ(0x34567812, t.result_rotrv_24); |
| 724 CHECK_EQ(0x23456781, t.result_rotrv_28); | 724 CHECK_EQ(0x23456781, t.result_rotrv_28); |
| 725 } | 725 } |
| 726 | 726 |
| 727 | 727 |
| 728 TEST(MIPS9) { | 728 TEST(MIPS9) { |
| 729 // Test BRANCH improvements. | 729 // Test BRANCH improvements. |
| 730 InitializeVM(); | 730 InitializeVM(); |
| 731 v8::HandleScope scope; | 731 v8::HandleScope scope; |
| 732 | 732 |
| 733 MacroAssembler assm(NULL, 0); | 733 MacroAssembler assm(Isolate::Current(), NULL, 0); |
| 734 Label exit, exit2, exit3; | 734 Label exit, exit2, exit3; |
| 735 | 735 |
| 736 __ Branch(&exit, ge, a0, Operand(0x00000000)); | 736 __ Branch(&exit, ge, a0, Operand(0x00000000)); |
| 737 __ Branch(&exit2, ge, a0, Operand(0x00001FFF)); | 737 __ Branch(&exit2, ge, a0, Operand(0x00001FFF)); |
| 738 __ Branch(&exit3, ge, a0, Operand(0x0001FFFF)); | 738 __ Branch(&exit3, ge, a0, Operand(0x0001FFFF)); |
| 739 | 739 |
| 740 __ bind(&exit); | 740 __ bind(&exit); |
| 741 __ bind(&exit2); | 741 __ bind(&exit2); |
| 742 __ bind(&exit3); | 742 __ bind(&exit3); |
| 743 __ jr(ra); | 743 __ jr(ra); |
| (...skipping 20 matching lines...) Expand all Loading... |
| 764 double b; | 764 double b; |
| 765 int32_t dbl_mant; | 765 int32_t dbl_mant; |
| 766 int32_t dbl_exp; | 766 int32_t dbl_exp; |
| 767 int32_t long_hi; | 767 int32_t long_hi; |
| 768 int32_t long_lo; | 768 int32_t long_lo; |
| 769 int32_t b_long_hi; | 769 int32_t b_long_hi; |
| 770 int32_t b_long_lo; | 770 int32_t b_long_lo; |
| 771 } T; | 771 } T; |
| 772 T t; | 772 T t; |
| 773 | 773 |
| 774 Assembler assm(NULL, 0); | 774 Assembler assm(Isolate::Current(), NULL, 0); |
| 775 Label L, C; | 775 Label L, C; |
| 776 | 776 |
| 777 if (Isolate::Current()->cpu_features()->IsSupported(FPU)) { | 777 if (CpuFeatures::IsSupported(FPU)) { |
| 778 CpuFeatures::Scope scope(FPU); | 778 CpuFeatures::Scope scope(FPU); |
| 779 | 779 |
| 780 // Load all structure elements to registers. | 780 // Load all structure elements to registers. |
| 781 __ ldc1(f0, MemOperand(a0, OFFSET_OF(T, a))); | 781 __ ldc1(f0, MemOperand(a0, OFFSET_OF(T, a))); |
| 782 | 782 |
| 783 // Save the raw bits of the double. | 783 // Save the raw bits of the double. |
| 784 __ mfc1(t0, f0); | 784 __ mfc1(t0, f0); |
| 785 __ mfc1(t1, f1); | 785 __ mfc1(t1, f1); |
| 786 __ sw(t0, MemOperand(a0, OFFSET_OF(T, dbl_mant))); | 786 __ sw(t0, MemOperand(a0, OFFSET_OF(T, dbl_mant))); |
| 787 __ sw(t1, MemOperand(a0, OFFSET_OF(T, dbl_exp))); | 787 __ sw(t1, MemOperand(a0, OFFSET_OF(T, dbl_exp))); |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 848 int32_t swl_1; | 848 int32_t swl_1; |
| 849 int32_t swl_2; | 849 int32_t swl_2; |
| 850 int32_t swl_3; | 850 int32_t swl_3; |
| 851 int32_t swr_0; | 851 int32_t swr_0; |
| 852 int32_t swr_1; | 852 int32_t swr_1; |
| 853 int32_t swr_2; | 853 int32_t swr_2; |
| 854 int32_t swr_3; | 854 int32_t swr_3; |
| 855 } T; | 855 } T; |
| 856 T t; | 856 T t; |
| 857 | 857 |
| 858 Assembler assm(NULL, 0); | 858 Assembler assm(Isolate::Current(), NULL, 0); |
| 859 | 859 |
| 860 // Test all combinations of LWL and vAddr. | 860 // Test all combinations of LWL and vAddr. |
| 861 __ lw(t0, MemOperand(a0, OFFSET_OF(T, reg_init)) ); | 861 __ lw(t0, MemOperand(a0, OFFSET_OF(T, reg_init)) ); |
| 862 __ lwl(t0, MemOperand(a0, OFFSET_OF(T, mem_init)) ); | 862 __ lwl(t0, MemOperand(a0, OFFSET_OF(T, mem_init)) ); |
| 863 __ sw(t0, MemOperand(a0, OFFSET_OF(T, lwl_0)) ); | 863 __ sw(t0, MemOperand(a0, OFFSET_OF(T, lwl_0)) ); |
| 864 | 864 |
| 865 __ lw(t1, MemOperand(a0, OFFSET_OF(T, reg_init)) ); | 865 __ lw(t1, MemOperand(a0, OFFSET_OF(T, reg_init)) ); |
| 866 __ lwl(t1, MemOperand(a0, OFFSET_OF(T, mem_init) + 1) ); | 866 __ lwl(t1, MemOperand(a0, OFFSET_OF(T, mem_init) + 1) ); |
| 867 __ sw(t1, MemOperand(a0, OFFSET_OF(T, lwl_1)) ); | 867 __ sw(t1, MemOperand(a0, OFFSET_OF(T, lwl_1)) ); |
| 868 | 868 |
| (...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 979 typedef struct { | 979 typedef struct { |
| 980 int32_t x; | 980 int32_t x; |
| 981 int32_t y; | 981 int32_t y; |
| 982 int32_t y1; | 982 int32_t y1; |
| 983 int32_t y2; | 983 int32_t y2; |
| 984 int32_t y3; | 984 int32_t y3; |
| 985 int32_t y4; | 985 int32_t y4; |
| 986 } T; | 986 } T; |
| 987 T t; | 987 T t; |
| 988 | 988 |
| 989 MacroAssembler assm(NULL, 0); | 989 MacroAssembler assm(Isolate::Current(), NULL, 0); |
| 990 | 990 |
| 991 __ mov(t6, fp); // Save frame pointer. | 991 __ mov(t6, fp); // Save frame pointer. |
| 992 __ mov(fp, a0); // Access struct T by fp. | 992 __ mov(fp, a0); // Access struct T by fp. |
| 993 __ lw(t0, MemOperand(a0, OFFSET_OF(T, y)) ); | 993 __ lw(t0, MemOperand(a0, OFFSET_OF(T, y)) ); |
| 994 __ lw(t3, MemOperand(a0, OFFSET_OF(T, y4)) ); | 994 __ lw(t3, MemOperand(a0, OFFSET_OF(T, y4)) ); |
| 995 | 995 |
| 996 __ addu(t1, t0, t3); | 996 __ addu(t1, t0, t3); |
| 997 __ subu(t4, t0, t3); | 997 __ subu(t4, t0, t3); |
| 998 __ nop(); | 998 __ nop(); |
| 999 __ Push(t0); // These instructions disappear after opt. | 999 __ push(t0); // These instructions disappear after opt. |
| 1000 __ Pop(); | 1000 __ Pop(); |
| 1001 __ addu(t0, t0, t0); | 1001 __ addu(t0, t0, t0); |
| 1002 __ nop(); | 1002 __ nop(); |
| 1003 __ Pop(); // These instructions disappear after opt. | 1003 __ Pop(); // These instructions disappear after opt. |
| 1004 __ Push(t3); | 1004 __ push(t3); |
| 1005 __ nop(); | 1005 __ nop(); |
| 1006 __ Push(t3); // These instructions disappear after opt. | 1006 __ push(t3); // These instructions disappear after opt. |
| 1007 __ Pop(t3); | 1007 __ pop(t3); |
| 1008 __ nop(); | 1008 __ nop(); |
| 1009 __ Push(t3); | 1009 __ push(t3); |
| 1010 __ Pop(t4); | 1010 __ pop(t4); |
| 1011 __ nop(); | 1011 __ nop(); |
| 1012 __ sw(t0, MemOperand(fp, OFFSET_OF(T, y)) ); | 1012 __ sw(t0, MemOperand(fp, OFFSET_OF(T, y)) ); |
| 1013 __ lw(t0, MemOperand(fp, OFFSET_OF(T, y)) ); | 1013 __ lw(t0, MemOperand(fp, OFFSET_OF(T, y)) ); |
| 1014 __ nop(); | 1014 __ nop(); |
| 1015 __ sw(t0, MemOperand(fp, OFFSET_OF(T, y)) ); | 1015 __ sw(t0, MemOperand(fp, OFFSET_OF(T, y)) ); |
| 1016 __ lw(t1, MemOperand(fp, OFFSET_OF(T, y)) ); | 1016 __ lw(t1, MemOperand(fp, OFFSET_OF(T, y)) ); |
| 1017 __ nop(); | 1017 __ nop(); |
| 1018 __ Push(t1); | 1018 __ push(t1); |
| 1019 __ lw(t1, MemOperand(fp, OFFSET_OF(T, y)) ); | 1019 __ lw(t1, MemOperand(fp, OFFSET_OF(T, y)) ); |
| 1020 __ Pop(t1); | 1020 __ pop(t1); |
| 1021 __ nop(); | 1021 __ nop(); |
| 1022 __ Push(t1); | 1022 __ push(t1); |
| 1023 __ lw(t2, MemOperand(fp, OFFSET_OF(T, y)) ); | 1023 __ lw(t2, MemOperand(fp, OFFSET_OF(T, y)) ); |
| 1024 __ Pop(t1); | 1024 __ pop(t1); |
| 1025 __ nop(); | 1025 __ nop(); |
| 1026 __ Push(t1); | 1026 __ push(t1); |
| 1027 __ lw(t2, MemOperand(fp, OFFSET_OF(T, y)) ); | 1027 __ lw(t2, MemOperand(fp, OFFSET_OF(T, y)) ); |
| 1028 __ Pop(t2); | 1028 __ pop(t2); |
| 1029 __ nop(); | 1029 __ nop(); |
| 1030 __ Push(t2); | 1030 __ push(t2); |
| 1031 __ lw(t2, MemOperand(fp, OFFSET_OF(T, y)) ); | 1031 __ lw(t2, MemOperand(fp, OFFSET_OF(T, y)) ); |
| 1032 __ Pop(t1); | 1032 __ pop(t1); |
| 1033 __ nop(); | 1033 __ nop(); |
| 1034 __ Push(t1); | 1034 __ push(t1); |
| 1035 __ lw(t2, MemOperand(fp, OFFSET_OF(T, y)) ); | 1035 __ lw(t2, MemOperand(fp, OFFSET_OF(T, y)) ); |
| 1036 __ Pop(t3); | 1036 __ pop(t3); |
| 1037 __ nop(); | 1037 __ nop(); |
| 1038 | 1038 |
| 1039 __ mov(fp, t6); | 1039 __ mov(fp, t6); |
| 1040 __ jr(ra); | 1040 __ jr(ra); |
| 1041 __ nop(); | 1041 __ nop(); |
| 1042 | 1042 |
| 1043 CodeDesc desc; | 1043 CodeDesc desc; |
| 1044 assm.GetCode(&desc); | 1044 assm.GetCode(&desc); |
| 1045 Object* code = HEAP->CreateCode( | 1045 Object* code = HEAP->CreateCode( |
| 1046 desc, | 1046 desc, |
| (...skipping 23 matching lines...) Expand all Loading... |
| 1070 typedef struct { | 1070 typedef struct { |
| 1071 double cvt_big_out; | 1071 double cvt_big_out; |
| 1072 double cvt_small_out; | 1072 double cvt_small_out; |
| 1073 uint32_t trunc_big_out; | 1073 uint32_t trunc_big_out; |
| 1074 uint32_t trunc_small_out; | 1074 uint32_t trunc_small_out; |
| 1075 uint32_t cvt_big_in; | 1075 uint32_t cvt_big_in; |
| 1076 uint32_t cvt_small_in; | 1076 uint32_t cvt_small_in; |
| 1077 } T; | 1077 } T; |
| 1078 T t; | 1078 T t; |
| 1079 | 1079 |
| 1080 MacroAssembler assm(NULL, 0); | 1080 MacroAssembler assm(Isolate::Current(), NULL, 0); |
| 1081 | 1081 |
| 1082 if (Isolate::Current()->cpu_features()->IsSupported(FPU)) { | 1082 if (CpuFeatures::IsSupported(FPU)) { |
| 1083 CpuFeatures::Scope scope(FPU); | 1083 CpuFeatures::Scope scope(FPU); |
| 1084 | 1084 |
| 1085 __ sw(t0, MemOperand(a0, OFFSET_OF(T, cvt_small_in))); | 1085 __ sw(t0, MemOperand(a0, OFFSET_OF(T, cvt_small_in))); |
| 1086 __ Cvt_d_uw(f10, t0); | 1086 __ Cvt_d_uw(f10, t0); |
| 1087 __ sdc1(f10, MemOperand(a0, OFFSET_OF(T, cvt_small_out))); | 1087 __ sdc1(f10, MemOperand(a0, OFFSET_OF(T, cvt_small_out))); |
| 1088 | 1088 |
| 1089 __ Trunc_uw_d(f10, f10); | 1089 __ Trunc_uw_d(f10, f10); |
| 1090 __ swc1(f10, MemOperand(a0, OFFSET_OF(T, trunc_small_out))); | 1090 __ swc1(f10, MemOperand(a0, OFFSET_OF(T, trunc_small_out))); |
| 1091 | 1091 |
| 1092 __ sw(t0, MemOperand(a0, OFFSET_OF(T, cvt_big_in))); | 1092 __ sw(t0, MemOperand(a0, OFFSET_OF(T, cvt_big_in))); |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1127 TEST(MIPS14) { | 1127 TEST(MIPS14) { |
| 1128 // Test round, floor, ceil, trunc, cvt. | 1128 // Test round, floor, ceil, trunc, cvt. |
| 1129 InitializeVM(); | 1129 InitializeVM(); |
| 1130 v8::HandleScope scope; | 1130 v8::HandleScope scope; |
| 1131 | 1131 |
| 1132 #define ROUND_STRUCT_ELEMENT(x) \ | 1132 #define ROUND_STRUCT_ELEMENT(x) \ |
| 1133 int32_t x##_up_out; \ | 1133 int32_t x##_up_out; \ |
| 1134 int32_t x##_down_out; \ | 1134 int32_t x##_down_out; \ |
| 1135 int32_t neg_##x##_up_out; \ | 1135 int32_t neg_##x##_up_out; \ |
| 1136 int32_t neg_##x##_down_out; \ | 1136 int32_t neg_##x##_down_out; \ |
| 1137 int32_t x##_err1_out; \ | 1137 uint32_t x##_err1_out; \ |
| 1138 int32_t x##_err2_out; \ | 1138 uint32_t x##_err2_out; \ |
| 1139 int32_t x##_err3_out; \ | 1139 uint32_t x##_err3_out; \ |
| 1140 int32_t x##_err4_out; \ | 1140 uint32_t x##_err4_out; \ |
| 1141 int32_t x##_invalid_result; | 1141 int32_t x##_invalid_result; |
| 1142 | 1142 |
| 1143 typedef struct { | 1143 typedef struct { |
| 1144 double round_up_in; | 1144 double round_up_in; |
| 1145 double round_down_in; | 1145 double round_down_in; |
| 1146 double neg_round_up_in; | 1146 double neg_round_up_in; |
| 1147 double neg_round_down_in; | 1147 double neg_round_down_in; |
| 1148 double err1_in; | 1148 double err1_in; |
| 1149 double err2_in; | 1149 double err2_in; |
| 1150 double err3_in; | 1150 double err3_in; |
| 1151 double err4_in; | 1151 double err4_in; |
| 1152 | 1152 |
| 1153 ROUND_STRUCT_ELEMENT(round) | 1153 ROUND_STRUCT_ELEMENT(round) |
| 1154 ROUND_STRUCT_ELEMENT(floor) | 1154 ROUND_STRUCT_ELEMENT(floor) |
| 1155 ROUND_STRUCT_ELEMENT(ceil) | 1155 ROUND_STRUCT_ELEMENT(ceil) |
| 1156 ROUND_STRUCT_ELEMENT(trunc) | 1156 ROUND_STRUCT_ELEMENT(trunc) |
| 1157 ROUND_STRUCT_ELEMENT(cvt) | 1157 ROUND_STRUCT_ELEMENT(cvt) |
| 1158 } T; | 1158 } T; |
| 1159 T t; | 1159 T t; |
| 1160 | 1160 |
| 1161 #undef ROUND_STRUCT_ELEMENT | 1161 #undef ROUND_STRUCT_ELEMENT |
| 1162 | 1162 |
| 1163 MacroAssembler assm(NULL, 0); | 1163 MacroAssembler assm(Isolate::Current(), NULL, 0); |
| 1164 | 1164 |
| 1165 if (Isolate::Current()->cpu_features()->IsSupported(FPU)) { | 1165 if (CpuFeatures::IsSupported(FPU)) { |
| 1166 CpuFeatures::Scope scope(FPU); | 1166 CpuFeatures::Scope scope(FPU); |
| 1167 | 1167 |
| 1168 // Save FCSR. | 1168 // Save FCSR. |
| 1169 __ cfc1(a1, FCSR); | 1169 __ cfc1(a1, FCSR); |
| 1170 // Disable FPU exceptions. | 1170 // Disable FPU exceptions. |
| 1171 __ ctc1(zero_reg, FCSR); | 1171 __ ctc1(zero_reg, FCSR); |
| 1172 #define RUN_ROUND_TEST(x) \ | 1172 #define RUN_ROUND_TEST(x) \ |
| 1173 __ ldc1(f0, MemOperand(a0, OFFSET_OF(T, round_up_in))); \ | 1173 __ ldc1(f0, MemOperand(a0, OFFSET_OF(T, round_up_in))); \ |
| 1174 __ x##_w_d(f0, f0); \ | 1174 __ x##_w_d(f0, f0); \ |
| 1175 __ swc1(f0, MemOperand(a0, OFFSET_OF(T, x##_up_out))); \ | 1175 __ swc1(f0, MemOperand(a0, OFFSET_OF(T, x##_up_out))); \ |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1239 t.neg_round_up_in = -123.5; | 1239 t.neg_round_up_in = -123.5; |
| 1240 t.neg_round_down_in = -123.49; | 1240 t.neg_round_down_in = -123.49; |
| 1241 t.err1_in = 123.51; | 1241 t.err1_in = 123.51; |
| 1242 t.err2_in = 1; | 1242 t.err2_in = 1; |
| 1243 t.err3_in = static_cast<double>(1) + 0xFFFFFFFF; | 1243 t.err3_in = static_cast<double>(1) + 0xFFFFFFFF; |
| 1244 t.err4_in = NAN; | 1244 t.err4_in = NAN; |
| 1245 | 1245 |
| 1246 Object* dummy = CALL_GENERATED_CODE(f, &t, 0, 0, 0, 0); | 1246 Object* dummy = CALL_GENERATED_CODE(f, &t, 0, 0, 0, 0); |
| 1247 USE(dummy); | 1247 USE(dummy); |
| 1248 | 1248 |
| 1249 #define GET_FPU_ERR(x) ((x >> 2) & (32 - 1)) | 1249 #define GET_FPU_ERR(x) (static_cast<int>((x >> kFCSRFlagShift) & kFCSRFlagMask)) |
| 1250 | 1250 |
| 1251 CHECK_EQ(124, t.round_up_out); | 1251 CHECK_EQ(124, t.round_up_out); |
| 1252 CHECK_EQ(123, t.round_down_out); | 1252 CHECK_EQ(123, t.round_down_out); |
| 1253 CHECK_EQ(-124, t.neg_round_up_out); | 1253 CHECK_EQ(-124, t.neg_round_up_out); |
| 1254 CHECK_EQ(-123, t.neg_round_down_out); | 1254 CHECK_EQ(-123, t.neg_round_down_out); |
| 1255 | 1255 |
| 1256 // Inaccurate. | 1256 // Inexact. |
| 1257 CHECK_EQ(1, GET_FPU_ERR(t.round_err1_out)); | 1257 CHECK_EQ(kFCSRInexactFlagBit, GET_FPU_ERR(t.round_err1_out)); |
| 1258 // No error. | 1258 // No error. |
| 1259 CHECK_EQ(0, GET_FPU_ERR(t.round_err2_out)); | 1259 CHECK_EQ(0, GET_FPU_ERR(t.round_err2_out)); |
| 1260 // Invalid operation. | 1260 // Invalid operation. |
| 1261 CHECK_EQ(16, GET_FPU_ERR(t.round_err3_out)); | 1261 CHECK_EQ(kFCSRInvalidOpFlagBit, GET_FPU_ERR(t.round_err3_out)); |
| 1262 CHECK_EQ(16, GET_FPU_ERR(t.round_err4_out)); | 1262 CHECK_EQ(kFCSRInvalidOpFlagBit, GET_FPU_ERR(t.round_err4_out)); |
| 1263 CHECK_EQ(kFPUInvalidResult, t.round_invalid_result); | 1263 CHECK_EQ(kFPUInvalidResult, t.round_invalid_result); |
| 1264 | 1264 |
| 1265 CHECK_EQ(123, t.floor_up_out); | 1265 CHECK_EQ(123, t.floor_up_out); |
| 1266 CHECK_EQ(123, t.floor_down_out); | 1266 CHECK_EQ(123, t.floor_down_out); |
| 1267 CHECK_EQ(-124, t.neg_floor_up_out); | 1267 CHECK_EQ(-124, t.neg_floor_up_out); |
| 1268 CHECK_EQ(-124, t.neg_floor_down_out); | 1268 CHECK_EQ(-124, t.neg_floor_down_out); |
| 1269 | 1269 |
| 1270 // Inaccurate. | 1270 // Inexact. |
| 1271 CHECK_EQ(1, GET_FPU_ERR(t.floor_err1_out)); | 1271 CHECK_EQ(kFCSRInexactFlagBit, GET_FPU_ERR(t.floor_err1_out)); |
| 1272 // No error. | 1272 // No error. |
| 1273 CHECK_EQ(0, GET_FPU_ERR(t.floor_err2_out)); | 1273 CHECK_EQ(0, GET_FPU_ERR(t.floor_err2_out)); |
| 1274 // Invalid operation. | 1274 // Invalid operation. |
| 1275 CHECK_EQ(16, GET_FPU_ERR(t.floor_err3_out)); | 1275 CHECK_EQ(kFCSRInvalidOpFlagBit, GET_FPU_ERR(t.floor_err3_out)); |
| 1276 CHECK_EQ(16, GET_FPU_ERR(t.floor_err4_out)); | 1276 CHECK_EQ(kFCSRInvalidOpFlagBit, GET_FPU_ERR(t.floor_err4_out)); |
| 1277 CHECK_EQ(kFPUInvalidResult, t.floor_invalid_result); | 1277 CHECK_EQ(kFPUInvalidResult, t.floor_invalid_result); |
| 1278 | 1278 |
| 1279 CHECK_EQ(124, t.ceil_up_out); | 1279 CHECK_EQ(124, t.ceil_up_out); |
| 1280 CHECK_EQ(124, t.ceil_down_out); | 1280 CHECK_EQ(124, t.ceil_down_out); |
| 1281 CHECK_EQ(-123, t.neg_ceil_up_out); | 1281 CHECK_EQ(-123, t.neg_ceil_up_out); |
| 1282 CHECK_EQ(-123, t.neg_ceil_down_out); | 1282 CHECK_EQ(-123, t.neg_ceil_down_out); |
| 1283 | 1283 |
| 1284 // Inaccurate. | 1284 // Inexact. |
| 1285 CHECK_EQ(1, GET_FPU_ERR(t.ceil_err1_out)); | 1285 CHECK_EQ(kFCSRInexactFlagBit, GET_FPU_ERR(t.ceil_err1_out)); |
| 1286 // No error. | 1286 // No error. |
| 1287 CHECK_EQ(0, GET_FPU_ERR(t.ceil_err2_out)); | 1287 CHECK_EQ(0, GET_FPU_ERR(t.ceil_err2_out)); |
| 1288 // Invalid operation. | 1288 // Invalid operation. |
| 1289 CHECK_EQ(16, GET_FPU_ERR(t.ceil_err3_out)); | 1289 CHECK_EQ(kFCSRInvalidOpFlagBit, GET_FPU_ERR(t.ceil_err3_out)); |
| 1290 CHECK_EQ(16, GET_FPU_ERR(t.ceil_err4_out)); | 1290 CHECK_EQ(kFCSRInvalidOpFlagBit, GET_FPU_ERR(t.ceil_err4_out)); |
| 1291 CHECK_EQ(kFPUInvalidResult, t.ceil_invalid_result); | 1291 CHECK_EQ(kFPUInvalidResult, t.ceil_invalid_result); |
| 1292 | 1292 |
| 1293 // In rounding mode 0 cvt should behave like round. | 1293 // In rounding mode 0 cvt should behave like round. |
| 1294 CHECK_EQ(t.round_up_out, t.cvt_up_out); | 1294 CHECK_EQ(t.round_up_out, t.cvt_up_out); |
| 1295 CHECK_EQ(t.round_down_out, t.cvt_down_out); | 1295 CHECK_EQ(t.round_down_out, t.cvt_down_out); |
| 1296 CHECK_EQ(t.neg_round_up_out, t.neg_cvt_up_out); | 1296 CHECK_EQ(t.neg_round_up_out, t.neg_cvt_up_out); |
| 1297 CHECK_EQ(t.neg_round_down_out, t.neg_cvt_down_out); | 1297 CHECK_EQ(t.neg_round_down_out, t.neg_cvt_down_out); |
| 1298 | 1298 |
| 1299 // Inaccurate. | 1299 // Inexact. |
| 1300 CHECK_EQ(1, GET_FPU_ERR(t.cvt_err1_out)); | 1300 CHECK_EQ(kFCSRInexactFlagBit, GET_FPU_ERR(t.cvt_err1_out)); |
| 1301 // No error. | 1301 // No error. |
| 1302 CHECK_EQ(0, GET_FPU_ERR(t.cvt_err2_out)); | 1302 CHECK_EQ(0, GET_FPU_ERR(t.cvt_err2_out)); |
| 1303 // Invalid operation. | 1303 // Invalid operation. |
| 1304 CHECK_EQ(16, GET_FPU_ERR(t.cvt_err3_out)); | 1304 CHECK_EQ(kFCSRInvalidOpFlagBit, GET_FPU_ERR(t.cvt_err3_out)); |
| 1305 CHECK_EQ(16, GET_FPU_ERR(t.cvt_err4_out)); | 1305 CHECK_EQ(kFCSRInvalidOpFlagBit, GET_FPU_ERR(t.cvt_err4_out)); |
| 1306 CHECK_EQ(kFPUInvalidResult, t.cvt_invalid_result); | 1306 CHECK_EQ(kFPUInvalidResult, t.cvt_invalid_result); |
| 1307 } | 1307 } |
| 1308 } | 1308 } |
| 1309 | 1309 |
| 1310 | 1310 |
| 1311 #undef __ | 1311 #undef __ |
| OLD | NEW |