| 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 |