| 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 366 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 377 CHECK_EQ(1.5e6, t.fb); | 377 CHECK_EQ(1.5e6, t.fb); |
| 378 CHECK_EQ(1.5275e06, t.fc); | 378 CHECK_EQ(1.5275e06, t.fc); |
| 379 CHECK_EQ(1.5550e06, t.fd); | 379 CHECK_EQ(1.5550e06, t.fd); |
| 380 CHECK_EQ(1.866e08, t.fe); | 380 CHECK_EQ(1.866e08, t.fe); |
| 381 CHECK_EQ(124.40000152587890625, t.ff); | 381 CHECK_EQ(124.40000152587890625, t.ff); |
| 382 CHECK_EQ(11.1534748077392578125, t.fg); | 382 CHECK_EQ(11.1534748077392578125, t.fg); |
| 383 } | 383 } |
| 384 | 384 |
| 385 | 385 |
| 386 TEST(MIPS4) { | 386 TEST(MIPS4) { |
| 387 // Exchange between GP anf FP registers is done through memory | |
| 388 // on FPXX compiled binaries and architectures that do not support | |
| 389 // MTHC1 and MTFC1. If this is the case, skipping this test. | |
| 390 if (IsFpxxMode() && | |
| 391 (IsMipsArchVariant(kMips32r1) || IsMipsArchVariant(kLoongson))) { | |
| 392 return; | |
| 393 } | |
| 394 | |
| 395 // Test moves between floating point and integer registers. | 387 // Test moves between floating point and integer registers. |
| 396 CcTest::InitializeVM(); | 388 CcTest::InitializeVM(); |
| 397 Isolate* isolate = CcTest::i_isolate(); | 389 Isolate* isolate = CcTest::i_isolate(); |
| 398 HandleScope scope(isolate); | 390 HandleScope scope(isolate); |
| 399 | 391 |
| 400 typedef struct { | 392 typedef struct { |
| 401 double a; | 393 double a; |
| 402 double b; | 394 double b; |
| 403 double c; | 395 double c; |
| 404 } T; | 396 } T; |
| 405 T t; | 397 T t; |
| 406 | 398 |
| 407 Assembler assm(isolate, NULL, 0); | 399 Assembler assm(isolate, NULL, 0); |
| 408 Label L, C; | 400 Label L, C; |
| 409 | 401 |
| 410 __ ldc1(f4, MemOperand(a0, offsetof(T, a)) ); | 402 __ ldc1(f4, MemOperand(a0, offsetof(T, a)) ); |
| 411 __ ldc1(f6, MemOperand(a0, offsetof(T, b)) ); | 403 __ ldc1(f6, MemOperand(a0, offsetof(T, b)) ); |
| 412 | 404 |
| 413 // Swap f4 and f6, by using four integer registers, t0-t3. | 405 // Swap f4 and f6, by using four integer registers, t0-t3. |
| 414 if (IsFp32Mode()) { | 406 if (!IsFp64Mode()) { |
| 415 __ mfc1(t0, f4); | 407 __ mfc1(t0, f4); |
| 416 __ mfc1(t1, f5); | 408 __ mfc1(t1, f5); |
| 417 __ mfc1(t2, f6); | 409 __ mfc1(t2, f6); |
| 418 __ mfc1(t3, f7); | 410 __ mfc1(t3, f7); |
| 419 | 411 |
| 420 __ mtc1(t0, f6); | 412 __ mtc1(t0, f6); |
| 421 __ mtc1(t1, f7); | 413 __ mtc1(t1, f7); |
| 422 __ mtc1(t2, f4); | 414 __ mtc1(t2, f4); |
| 423 __ mtc1(t3, f5); | 415 __ mtc1(t3, f5); |
| 424 } else { | 416 } else { |
| 425 CHECK(!IsMipsArchVariant(kMips32r1) && !IsMipsArchVariant(kLoongson)); | 417 CHECK(!IsMipsArchVariant(kMips32r1) && !IsMipsArchVariant(kLoongson)); |
| 426 DCHECK(IsFp64Mode() || IsFpxxMode()); | |
| 427 __ mfc1(t0, f4); | 418 __ mfc1(t0, f4); |
| 428 __ mfhc1(t1, f4); | 419 __ mfhc1(t1, f4); |
| 429 __ mfc1(t2, f6); | 420 __ mfc1(t2, f6); |
| 430 __ mfhc1(t3, f6); | 421 __ mfhc1(t3, f6); |
| 431 | 422 |
| 432 __ mtc1(t0, f6); | 423 __ mtc1(t0, f6); |
| 433 __ mthc1(t1, f6); | 424 __ mthc1(t1, f6); |
| 434 __ mtc1(t2, f4); | 425 __ mtc1(t2, f4); |
| 435 __ mthc1(t3, f4); | 426 __ mthc1(t3, f4); |
| 436 } | 427 } |
| 437 | |
| 438 // Store the swapped f4 and f5 back to memory. | 428 // Store the swapped f4 and f5 back to memory. |
| 439 __ sdc1(f4, MemOperand(a0, offsetof(T, a)) ); | 429 __ sdc1(f4, MemOperand(a0, offsetof(T, a)) ); |
| 440 __ sdc1(f6, MemOperand(a0, offsetof(T, c)) ); | 430 __ sdc1(f6, MemOperand(a0, offsetof(T, c)) ); |
| 441 | 431 |
| 442 __ jr(ra); | 432 __ jr(ra); |
| 443 __ nop(); | 433 __ nop(); |
| 444 | 434 |
| 445 CodeDesc desc; | 435 CodeDesc desc; |
| 446 assm.GetCode(&desc); | 436 assm.GetCode(&desc); |
| 447 Handle<Code> code = isolate->factory()->NewCode( | 437 Handle<Code> code = isolate->factory()->NewCode( |
| (...skipping 366 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 814 | 804 |
| 815 CodeDesc desc; | 805 CodeDesc desc; |
| 816 assm.GetCode(&desc); | 806 assm.GetCode(&desc); |
| 817 isolate->factory()->NewCode( | 807 isolate->factory()->NewCode( |
| 818 desc, Code::ComputeFlags(Code::STUB), Handle<Code>()); | 808 desc, Code::ComputeFlags(Code::STUB), Handle<Code>()); |
| 819 } | 809 } |
| 820 | 810 |
| 821 | 811 |
| 822 TEST(MIPS10) { | 812 TEST(MIPS10) { |
| 823 // Test conversions between doubles and words. | 813 // Test conversions between doubles and words. |
| 814 // Test maps double to FP reg pairs in fp32 mode |
| 815 // and into FP reg in fp64 mode. |
| 824 CcTest::InitializeVM(); | 816 CcTest::InitializeVM(); |
| 825 Isolate* isolate = CcTest::i_isolate(); | 817 Isolate* isolate = CcTest::i_isolate(); |
| 826 HandleScope scope(isolate); | 818 HandleScope scope(isolate); |
| 827 | 819 |
| 828 typedef struct { | 820 typedef struct { |
| 829 double a; | 821 double a; |
| 830 double b; | 822 double b; |
| 831 int32_t dbl_mant; | 823 int32_t dbl_mant; |
| 832 int32_t dbl_exp; | 824 int32_t dbl_exp; |
| 833 int32_t word; | 825 int32_t word; |
| 834 int32_t b_word; | 826 int32_t b_word; |
| 835 } T; | 827 } T; |
| 836 T t; | 828 T t; |
| 837 | 829 |
| 838 Assembler assm(isolate, NULL, 0); | 830 Assembler assm(isolate, NULL, 0); |
| 839 Label L, C; | 831 Label L, C; |
| 840 | 832 |
| 841 if (IsMipsArchVariant(kMips32r1) || IsMipsArchVariant(kLoongson)) return; | 833 if (!IsMipsArchVariant(kMips32r2)) return; |
| 842 | 834 |
| 843 // Load all structure elements to registers. | 835 // Load all structure elements to registers. |
| 844 // (f0, f1) = a (fp32), f0 = a (fp64) | 836 // (f0, f1) = a (fp32), f0 = a (fp64) |
| 845 __ ldc1(f0, MemOperand(a0, offsetof(T, a))); | 837 __ ldc1(f0, MemOperand(a0, offsetof(T, a))); |
| 846 | 838 |
| 847 __ mfc1(t0, f0); // t0 = f0(31..0) | 839 if (IsFp64Mode()) { |
| 848 __ mfhc1(t1, f0); // t1 = sign_extend(f0(63..32)) | 840 __ mfc1(t0, f0); // t0 = f0(31..0) |
| 849 __ sw(t0, MemOperand(a0, offsetof(T, dbl_mant))); // dbl_mant = t0 | 841 __ mfhc1(t1, f0); // t1 = sign_extend(f0(63..32)) |
| 850 __ sw(t1, MemOperand(a0, offsetof(T, dbl_exp))); // dbl_exp = t1 | 842 __ sw(t0, MemOperand(a0, offsetof(T, dbl_mant))); // dbl_mant = t0 |
| 843 __ sw(t1, MemOperand(a0, offsetof(T, dbl_exp))); // dbl_exp = t1 |
| 844 } else { |
| 845 // Save the raw bits of the double. |
| 846 __ mfc1(t0, f0); // t0 = a1 |
| 847 __ mfc1(t1, f1); // t1 = a2 |
| 848 __ sw(t0, MemOperand(a0, offsetof(T, dbl_mant))); // dbl_mant = t0 |
| 849 __ sw(t1, MemOperand(a0, offsetof(T, dbl_exp))); // dbl_exp = t1 |
| 850 } |
| 851 | 851 |
| 852 // Convert double in f0 to word, save hi/lo parts. | 852 // Convert double in f0 to word, save hi/lo parts. |
| 853 __ cvt_w_d(f0, f0); // a_word = (word)a | 853 __ cvt_w_d(f0, f0); // a_word = (word)a |
| 854 __ mfc1(t0, f0); // f0 has a 32-bits word. t0 = a_word | 854 __ mfc1(t0, f0); // f0 has a 32-bits word. t0 = a_word |
| 855 __ sw(t0, MemOperand(a0, offsetof(T, word))); // word = a_word | 855 __ sw(t0, MemOperand(a0, offsetof(T, word))); // word = a_word |
| 856 | 856 |
| 857 // Convert the b word to double b. | 857 // Convert the b word to double b. |
| 858 __ lw(t0, MemOperand(a0, offsetof(T, b_word))); | 858 __ lw(t0, MemOperand(a0, offsetof(T, b_word))); |
| 859 __ mtc1(t0, f8); // f8 has a 32-bits word. | 859 __ mtc1(t0, f8); // f8 has a 32-bits word. |
| 860 __ cvt_d_w(f10, f8); | 860 __ cvt_d_w(f10, f8); |
| (...skipping 4586 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5447 Handle<Code> code = isolate->factory()->NewCode( | 5447 Handle<Code> code = isolate->factory()->NewCode( |
| 5448 desc, Code::ComputeFlags(Code::STUB), Handle<Code>()); | 5448 desc, Code::ComputeFlags(Code::STUB), Handle<Code>()); |
| 5449 F2 f = FUNCTION_CAST<F2>(code->entry()); | 5449 F2 f = FUNCTION_CAST<F2>(code->entry()); |
| 5450 | 5450 |
| 5451 int32_t res = reinterpret_cast<int32_t>( | 5451 int32_t res = reinterpret_cast<int32_t>( |
| 5452 CALL_GENERATED_CODE(isolate, f, 42, 42, 0, 0, 0)); | 5452 CALL_GENERATED_CODE(isolate, f, 42, 42, 0, 0, 0)); |
| 5453 CHECK_EQ(res, 0); | 5453 CHECK_EQ(res, 0); |
| 5454 } | 5454 } |
| 5455 | 5455 |
| 5456 #undef __ | 5456 #undef __ |
| OLD | NEW |