Index: test/cctest/test-assembler-mips.cc |
diff --git a/test/cctest/test-assembler-mips.cc b/test/cctest/test-assembler-mips.cc |
index 9671ca143eda3068e299cdb73fdf5ac498068456..1dc3e4ef441d399eacf3ec046cc1c7447e3394f9 100644 |
--- a/test/cctest/test-assembler-mips.cc |
+++ b/test/cctest/test-assembler-mips.cc |
@@ -679,103 +679,105 @@ TEST(MIPS7) { |
TEST(MIPS8) { |
// Test ROTR and ROTRV instructions. |
- CcTest::InitializeVM(); |
- Isolate* isolate = CcTest::i_isolate(); |
- HandleScope scope(isolate); |
+ if (IsMipsArchVariant(kMips32r2)) { |
+ CcTest::InitializeVM(); |
+ Isolate* isolate = CcTest::i_isolate(); |
+ HandleScope scope(isolate); |
- typedef struct { |
- int32_t input; |
- int32_t result_rotr_4; |
- int32_t result_rotr_8; |
- int32_t result_rotr_12; |
- int32_t result_rotr_16; |
- int32_t result_rotr_20; |
- int32_t result_rotr_24; |
- int32_t result_rotr_28; |
- int32_t result_rotrv_4; |
- int32_t result_rotrv_8; |
- int32_t result_rotrv_12; |
- int32_t result_rotrv_16; |
- int32_t result_rotrv_20; |
- int32_t result_rotrv_24; |
- int32_t result_rotrv_28; |
- } T; |
- T t; |
+ typedef struct { |
+ int32_t input; |
+ int32_t result_rotr_4; |
+ int32_t result_rotr_8; |
+ int32_t result_rotr_12; |
+ int32_t result_rotr_16; |
+ int32_t result_rotr_20; |
+ int32_t result_rotr_24; |
+ int32_t result_rotr_28; |
+ int32_t result_rotrv_4; |
+ int32_t result_rotrv_8; |
+ int32_t result_rotrv_12; |
+ int32_t result_rotrv_16; |
+ int32_t result_rotrv_20; |
+ int32_t result_rotrv_24; |
+ int32_t result_rotrv_28; |
+ } T; |
+ T t; |
- MacroAssembler assm(isolate, NULL, 0); |
+ MacroAssembler assm(isolate, NULL, 0); |
- // Basic word load. |
- __ lw(t0, MemOperand(a0, OFFSET_OF(T, input)) ); |
- |
- // ROTR instruction (called through the Ror macro). |
- __ Ror(t1, t0, 0x0004); |
- __ Ror(t2, t0, 0x0008); |
- __ Ror(t3, t0, 0x000c); |
- __ Ror(t4, t0, 0x0010); |
- __ Ror(t5, t0, 0x0014); |
- __ Ror(t6, t0, 0x0018); |
- __ Ror(t7, t0, 0x001c); |
- |
- // Basic word store. |
- __ sw(t1, MemOperand(a0, OFFSET_OF(T, result_rotr_4)) ); |
- __ sw(t2, MemOperand(a0, OFFSET_OF(T, result_rotr_8)) ); |
- __ sw(t3, MemOperand(a0, OFFSET_OF(T, result_rotr_12)) ); |
- __ sw(t4, MemOperand(a0, OFFSET_OF(T, result_rotr_16)) ); |
- __ sw(t5, MemOperand(a0, OFFSET_OF(T, result_rotr_20)) ); |
- __ sw(t6, MemOperand(a0, OFFSET_OF(T, result_rotr_24)) ); |
- __ sw(t7, MemOperand(a0, OFFSET_OF(T, result_rotr_28)) ); |
- |
- // ROTRV instruction (called through the Ror macro). |
- __ li(t7, 0x0004); |
- __ Ror(t1, t0, t7); |
- __ li(t7, 0x0008); |
- __ Ror(t2, t0, t7); |
- __ li(t7, 0x000C); |
- __ Ror(t3, t0, t7); |
- __ li(t7, 0x0010); |
- __ Ror(t4, t0, t7); |
- __ li(t7, 0x0014); |
- __ Ror(t5, t0, t7); |
- __ li(t7, 0x0018); |
- __ Ror(t6, t0, t7); |
- __ li(t7, 0x001C); |
- __ Ror(t7, t0, t7); |
- |
- // Basic word store. |
- __ sw(t1, MemOperand(a0, OFFSET_OF(T, result_rotrv_4)) ); |
- __ sw(t2, MemOperand(a0, OFFSET_OF(T, result_rotrv_8)) ); |
- __ sw(t3, MemOperand(a0, OFFSET_OF(T, result_rotrv_12)) ); |
- __ sw(t4, MemOperand(a0, OFFSET_OF(T, result_rotrv_16)) ); |
- __ sw(t5, MemOperand(a0, OFFSET_OF(T, result_rotrv_20)) ); |
- __ sw(t6, MemOperand(a0, OFFSET_OF(T, result_rotrv_24)) ); |
- __ sw(t7, MemOperand(a0, OFFSET_OF(T, result_rotrv_28)) ); |
+ // Basic word load. |
+ __ lw(t0, MemOperand(a0, OFFSET_OF(T, input)) ); |
+ |
+ // ROTR instruction (called through the Ror macro). |
+ __ Ror(t1, t0, 0x0004); |
+ __ Ror(t2, t0, 0x0008); |
+ __ Ror(t3, t0, 0x000c); |
+ __ Ror(t4, t0, 0x0010); |
+ __ Ror(t5, t0, 0x0014); |
+ __ Ror(t6, t0, 0x0018); |
+ __ Ror(t7, t0, 0x001c); |
+ |
+ // Basic word store. |
+ __ sw(t1, MemOperand(a0, OFFSET_OF(T, result_rotr_4)) ); |
+ __ sw(t2, MemOperand(a0, OFFSET_OF(T, result_rotr_8)) ); |
+ __ sw(t3, MemOperand(a0, OFFSET_OF(T, result_rotr_12)) ); |
+ __ sw(t4, MemOperand(a0, OFFSET_OF(T, result_rotr_16)) ); |
+ __ sw(t5, MemOperand(a0, OFFSET_OF(T, result_rotr_20)) ); |
+ __ sw(t6, MemOperand(a0, OFFSET_OF(T, result_rotr_24)) ); |
+ __ sw(t7, MemOperand(a0, OFFSET_OF(T, result_rotr_28)) ); |
+ |
+ // ROTRV instruction (called through the Ror macro). |
+ __ li(t7, 0x0004); |
+ __ Ror(t1, t0, t7); |
+ __ li(t7, 0x0008); |
+ __ Ror(t2, t0, t7); |
+ __ li(t7, 0x000C); |
+ __ Ror(t3, t0, t7); |
+ __ li(t7, 0x0010); |
+ __ Ror(t4, t0, t7); |
+ __ li(t7, 0x0014); |
+ __ Ror(t5, t0, t7); |
+ __ li(t7, 0x0018); |
+ __ Ror(t6, t0, t7); |
+ __ li(t7, 0x001C); |
+ __ Ror(t7, t0, t7); |
+ |
+ // Basic word store. |
+ __ sw(t1, MemOperand(a0, OFFSET_OF(T, result_rotrv_4)) ); |
+ __ sw(t2, MemOperand(a0, OFFSET_OF(T, result_rotrv_8)) ); |
+ __ sw(t3, MemOperand(a0, OFFSET_OF(T, result_rotrv_12)) ); |
+ __ sw(t4, MemOperand(a0, OFFSET_OF(T, result_rotrv_16)) ); |
+ __ sw(t5, MemOperand(a0, OFFSET_OF(T, result_rotrv_20)) ); |
+ __ sw(t6, MemOperand(a0, OFFSET_OF(T, result_rotrv_24)) ); |
+ __ sw(t7, MemOperand(a0, OFFSET_OF(T, result_rotrv_28)) ); |
- __ jr(ra); |
- __ nop(); |
+ __ jr(ra); |
+ __ nop(); |
- CodeDesc desc; |
- assm.GetCode(&desc); |
- Handle<Code> code = isolate->factory()->NewCode( |
- desc, Code::ComputeFlags(Code::STUB), Handle<Code>()); |
- F3 f = FUNCTION_CAST<F3>(code->entry()); |
- t.input = 0x12345678; |
- Object* dummy = CALL_GENERATED_CODE(f, &t, 0x0, 0, 0, 0); |
- USE(dummy); |
- CHECK_EQ(static_cast<int32_t>(0x81234567), t.result_rotr_4); |
- CHECK_EQ(static_cast<int32_t>(0x78123456), t.result_rotr_8); |
- CHECK_EQ(static_cast<int32_t>(0x67812345), t.result_rotr_12); |
- CHECK_EQ(static_cast<int32_t>(0x56781234), t.result_rotr_16); |
- CHECK_EQ(static_cast<int32_t>(0x45678123), t.result_rotr_20); |
- CHECK_EQ(static_cast<int32_t>(0x34567812), t.result_rotr_24); |
- CHECK_EQ(static_cast<int32_t>(0x23456781), t.result_rotr_28); |
- |
- CHECK_EQ(static_cast<int32_t>(0x81234567), t.result_rotrv_4); |
- CHECK_EQ(static_cast<int32_t>(0x78123456), t.result_rotrv_8); |
- CHECK_EQ(static_cast<int32_t>(0x67812345), t.result_rotrv_12); |
- CHECK_EQ(static_cast<int32_t>(0x56781234), t.result_rotrv_16); |
- CHECK_EQ(static_cast<int32_t>(0x45678123), t.result_rotrv_20); |
- CHECK_EQ(static_cast<int32_t>(0x34567812), t.result_rotrv_24); |
- CHECK_EQ(static_cast<int32_t>(0x23456781), t.result_rotrv_28); |
+ CodeDesc desc; |
+ assm.GetCode(&desc); |
+ Handle<Code> code = isolate->factory()->NewCode( |
+ desc, Code::ComputeFlags(Code::STUB), Handle<Code>()); |
+ F3 f = FUNCTION_CAST<F3>(code->entry()); |
+ t.input = 0x12345678; |
+ Object* dummy = CALL_GENERATED_CODE(f, &t, 0x0, 0, 0, 0); |
+ USE(dummy); |
+ CHECK_EQ(static_cast<int32_t>(0x81234567), t.result_rotr_4); |
+ CHECK_EQ(static_cast<int32_t>(0x78123456), t.result_rotr_8); |
+ CHECK_EQ(static_cast<int32_t>(0x67812345), t.result_rotr_12); |
+ CHECK_EQ(static_cast<int32_t>(0x56781234), t.result_rotr_16); |
+ CHECK_EQ(static_cast<int32_t>(0x45678123), t.result_rotr_20); |
+ CHECK_EQ(static_cast<int32_t>(0x34567812), t.result_rotr_24); |
+ CHECK_EQ(static_cast<int32_t>(0x23456781), t.result_rotr_28); |
+ |
+ CHECK_EQ(static_cast<int32_t>(0x81234567), t.result_rotrv_4); |
+ CHECK_EQ(static_cast<int32_t>(0x78123456), t.result_rotrv_8); |
+ CHECK_EQ(static_cast<int32_t>(0x67812345), t.result_rotrv_12); |
+ CHECK_EQ(static_cast<int32_t>(0x56781234), t.result_rotrv_16); |
+ CHECK_EQ(static_cast<int32_t>(0x45678123), t.result_rotrv_20); |
+ CHECK_EQ(static_cast<int32_t>(0x34567812), t.result_rotrv_24); |
+ CHECK_EQ(static_cast<int32_t>(0x23456781), t.result_rotrv_28); |
+ } |
} |
@@ -1387,8 +1389,8 @@ TEST(MIPS16) { |
18446744073709551621.0, -18446744073709551621.0}; |
double tests[test_size*2] = {2.8, 2.9, -2.8, -2.9, |
18446744073709551616.0, 18446744073709555712.0}; |
- for (int j=0;j < test_size;j+=2) { |
- for (int i=0;i < input_size;i++) { |
+ for (int j=0; j < test_size; j+=2) { |
+ for (int i=0; i < input_size; i++) { |
test.e = inputs[i]; |
test.f = tests[j]; |
(CALL_GENERATED_CODE(f, &test, 0, 0, 0, 0)); |
@@ -1423,8 +1425,8 @@ TEST(MIPS17) { |
__ ldc1(f4, MemOperand(a0, OFFSET_OF(TestFloat, a))); |
__ ldc1(f8, MemOperand(a0, OFFSET_OF(TestFloat, b))); |
- __ min(D, f10, f8, f4); |
- __ max(D, f12, f8, f4); |
+ __ min(D, f10, f4, f8); |
+ __ max(D, f12, f4, f8); |
__ sdc1(f10, MemOperand(a0, OFFSET_OF(TestFloat, c))); |
__ sdc1(f12, MemOperand(a0, OFFSET_OF(TestFloat, d))); |
__ jr(ra); |
@@ -1468,6 +1470,191 @@ TEST(MIPS17) { |
} |
+TEST(MIPS18) { |
+ if (IsMipsArchVariant(kMips32r6)) { |
+ const int tableLength = 30; |
+ CcTest::InitializeVM(); |
+ Isolate* isolate = CcTest::i_isolate(); |
+ HandleScope scope(isolate); |
+ MacroAssembler assm(isolate, NULL, 0); |
+ |
+ typedef struct test_float { |
+ double a; |
+ double b; |
+ int fcsr; |
+ }TestFloat; |
+ |
+ TestFloat test; |
+ double inputs[tableLength] = {18446744073709551617.0, |
+ 4503599627370496.0, -4503599627370496.0, |
+ 1.26782468584154733584017312973E30, 1.44860108245951772690707170478E147, |
+ 1.7976931348623157E+308, 6.27463370218383111104242366943E-307, |
+ 309485009821345068724781056.89, |
+ 2.1, 2.6, 2.5, 3.1, 3.6, 3.5, |
+ -2.1, -2.6, -2.5, -3.1, -3.6, -3.5, |
+ 37778931862957161709568.0, 37778931862957161709569.0, |
+ 37778931862957161709580.0, 37778931862957161709581.0, |
+ 37778931862957161709582.0, 37778931862957161709583.0, |
+ 37778931862957161709584.0, 37778931862957161709585.0, |
+ 37778931862957161709586.0, 37778931862957161709587.0}; |
+ double outputs_RN[tableLength] = {18446744073709551617.0, |
+ 4503599627370496.0, -4503599627370496.0, |
+ 1.26782468584154733584017312973E30, 1.44860108245951772690707170478E147, |
+ 1.7976931348623157E308, 0, |
+ 309485009821345068724781057.0, |
+ 2.0, 3.0, 2.0, 3.0, 4.0, 4.0, |
+ -2.0, -3.0, -2.0, -3.0, -4.0, -4.0, |
+ 37778931862957161709568.0, 37778931862957161709569.0, |
+ 37778931862957161709580.0, 37778931862957161709581.0, |
+ 37778931862957161709582.0, 37778931862957161709583.0, |
+ 37778931862957161709584.0, 37778931862957161709585.0, |
+ 37778931862957161709586.0, 37778931862957161709587.0}; |
+ double outputs_RZ[tableLength] = {18446744073709551617.0, |
+ 4503599627370496.0, -4503599627370496.0, |
+ 1.26782468584154733584017312973E30, 1.44860108245951772690707170478E147, |
+ 1.7976931348623157E308, 0, |
+ 309485009821345068724781057.0, |
+ 2.0, 2.0, 2.0, 3.0, 3.0, 3.0, |
+ -2.0, -2.0, -2.0, -3.0, -3.0, -3.0, |
+ 37778931862957161709568.0, 37778931862957161709569.0, |
+ 37778931862957161709580.0, 37778931862957161709581.0, |
+ 37778931862957161709582.0, 37778931862957161709583.0, |
+ 37778931862957161709584.0, 37778931862957161709585.0, |
+ 37778931862957161709586.0, 37778931862957161709587.0}; |
+ double outputs_RP[tableLength] = {18446744073709551617.0, |
+ 4503599627370496.0, -4503599627370496.0, |
+ 1.26782468584154733584017312973E30, 1.44860108245951772690707170478E147, |
+ 1.7976931348623157E308, 1, |
+ 309485009821345068724781057.0, |
+ 3.0, 3.0, 3.0, 4.0, 4.0, 4.0, |
+ -2.0, -2.0, -2.0, -3.0, -3.0, -3.0, |
+ 37778931862957161709568.0, 37778931862957161709569.0, |
+ 37778931862957161709580.0, 37778931862957161709581.0, |
+ 37778931862957161709582.0, 37778931862957161709583.0, |
+ 37778931862957161709584.0, 37778931862957161709585.0, |
+ 37778931862957161709586.0, 37778931862957161709587.0}; |
+ double outputs_RM[tableLength] = {18446744073709551617.0, |
+ 4503599627370496.0, -4503599627370496.0, |
+ 1.26782468584154733584017312973E30, 1.44860108245951772690707170478E147, |
+ 1.7976931348623157E308, 0, |
+ 309485009821345068724781057.0, |
+ 2.0, 2.0, 2.0, 3.0, 3.0, 3.0, |
+ -3.0, -3.0, -3.0, -4.0, -4.0, -4.0, |
+ 37778931862957161709568.0, 37778931862957161709569.0, |
+ 37778931862957161709580.0, 37778931862957161709581.0, |
+ 37778931862957161709582.0, 37778931862957161709583.0, |
+ 37778931862957161709584.0, 37778931862957161709585.0, |
+ 37778931862957161709586.0, 37778931862957161709587.0}; |
+ int fcsr_inputs[4] = |
+ {kRoundToNearest, kRoundToZero, kRoundToPlusInf, kRoundToMinusInf}; |
+ double* outputs[4] = {outputs_RN, outputs_RZ, outputs_RP, outputs_RM}; |
+ __ ldc1(f4, MemOperand(a0, OFFSET_OF(TestFloat, a)) ); |
+ __ lw(t0, MemOperand(a0, OFFSET_OF(TestFloat, fcsr)) ); |
+ __ cfc1(t1, FCSR); |
+ __ ctc1(t0, FCSR); |
+ __ rint_d(f8, f4); |
+ __ sdc1(f8, MemOperand(a0, OFFSET_OF(TestFloat, b)) ); |
+ __ ctc1(t1, FCSR); |
+ __ jr(ra); |
+ __ nop(); |
+ |
+ CodeDesc desc; |
+ assm.GetCode(&desc); |
+ Handle<Code> code = isolate->factory()->NewCode( |
+ desc, Code::ComputeFlags(Code::STUB), Handle<Code>()); |
+ F3 f = FUNCTION_CAST<F3>(code->entry()); |
+ |
+ for (int j = 0; j < 4; j++) { |
+ test.fcsr = fcsr_inputs[j]; |
+ for (int i = 0; i < tableLength; i++) { |
+ test.a = inputs[i]; |
+ std::cout << j << " " << i << "\n"; |
+ (CALL_GENERATED_CODE(f, &test, 0, 0, 0, 0)); |
+ CHECK_EQ(test.b, outputs[j][i]); |
+ } |
+ } |
+ } |
+} |
+ |
+ |
+TEST(MIPS19) { |
+ CcTest::InitializeVM(); |
+ Isolate* isolate = CcTest::i_isolate(); |
+ HandleScope scope(isolate); |
+ MacroAssembler assm(isolate, NULL, 0); |
+ |
+ typedef struct test_float { |
+ double a; |
+ int32_t b; |
+ int32_t fcsr; |
+ }Test; |
+ const int tableLength = 24; |
+ double inputs[tableLength] = { |
+ 2.1, 2.6, 2.5, 3.1, 3.6, 3.5, |
+ -2.1, -2.6, -2.5, -3.1, -3.6, -3.5, |
+ 2147483637.0, 2147483638.0, 2147483639.0, |
+ 2147483640.0, 2147483641.0, 2147483642.0, |
+ 2147483643.0, 2147483644.0, 2147483645.0, |
+ 2147483646.0, 2147483647.0, 2147483653.0 |
+ }; |
+ double outputs_RN[tableLength] = { |
+ 2.0, 3.0, 2.0, 3.0, 4.0, 4.0, |
+ -2.0, -3.0, -2.0, -3.0, -4.0, -4.0, |
+ 2147483637.0, 2147483638.0, 2147483639.0, |
+ 2147483640.0, 2147483641.0, 2147483642.0, |
+ 2147483643.0, 2147483644.0, 2147483645.0, |
+ 2147483646.0, 2147483647.0, kFPUInvalidResult}; |
+ double outputs_RZ[tableLength] = { |
+ 2.0, 2.0, 2.0, 3.0, 3.0, 3.0, |
+ -2.0, -2.0, -2.0, -3.0, -3.0, -3.0, |
+ 2147483637.0, 2147483638.0, 2147483639.0, |
+ 2147483640.0, 2147483641.0, 2147483642.0, |
+ 2147483643.0, 2147483644.0, 2147483645.0, |
+ 2147483646.0, 2147483647.0, kFPUInvalidResult}; |
+ double outputs_RP[tableLength] = { |
+ 3.0, 3.0, 3.0, 4.0, 4.0, 4.0, |
+ -2.0, -2.0, -2.0, -3.0, -3.0, -3.0, |
+ 2147483637.0, 2147483638.0, 2147483639.0, |
+ 2147483640.0, 2147483641.0, 2147483642.0, |
+ 2147483643.0, 2147483644.0, 2147483645.0, |
+ 2147483646.0, 2147483647.0, kFPUInvalidResult}; |
+ double outputs_RM[tableLength] = { |
+ 2.0, 2.0, 2.0, 3.0, 3.0, 3.0, |
+ -3.0, -3.0, -3.0, -4.0, -4.0, -4.0, |
+ 2147483637.0, 2147483638.0, 2147483639.0, |
+ 2147483640.0, 2147483641.0, 2147483642.0, |
+ 2147483643.0, 2147483644.0, 2147483645.0, |
+ 2147483646.0, 2147483647.0, kFPUInvalidResult}; |
+ int fcsr_inputs[4] = |
+ {kRoundToNearest, kRoundToZero, kRoundToPlusInf, kRoundToMinusInf}; |
+ double* outputs[4] = {outputs_RN, outputs_RZ, outputs_RP, outputs_RM}; |
+ __ ldc1(f4, MemOperand(a0, OFFSET_OF(Test, a)) ); |
+ __ lw(t0, MemOperand(a0, OFFSET_OF(Test, fcsr)) ); |
+ __ cfc1(t1, FCSR); |
+ __ ctc1(t0, FCSR); |
+ __ cvt_w_d(f8, f4); |
+ __ swc1(f8, MemOperand(a0, OFFSET_OF(Test, b)) ); |
+ __ ctc1(t1, FCSR); |
+ __ jr(ra); |
+ __ nop(); |
+ Test test; |
+ CodeDesc desc; |
+ assm.GetCode(&desc); |
+ Handle<Code> code = isolate->factory()->NewCode( |
+ desc, Code::ComputeFlags(Code::STUB), Handle<Code>()); |
+ F3 f = FUNCTION_CAST<F3>(code->entry()); |
+ for (int j = 0; j < 4; j++) { |
+ test.fcsr = fcsr_inputs[j]; |
+ for (int i = 0; i < tableLength; i++) { |
+ test.a = inputs[i]; |
+ std::cout << i << " " << j << "\n"; |
+ (CALL_GENERATED_CODE(f, &test, 0, 0, 0, 0)); |
+ CHECK_EQ(test.b, outputs[j][i]); |
+ } |
+ } |
+} |
+ |
+ |
TEST(jump_tables1) { |
// Test jump tables with forward jumps. |
CcTest::InitializeVM(); |