Chromium Code Reviews| Index: test/cctest/test-macro-assembler-mips.cc |
| diff --git a/test/cctest/test-macro-assembler-mips.cc b/test/cctest/test-macro-assembler-mips.cc |
| index 45dbadb8f87f13fe2fe1d78fb11f5e7ff3e9a76b..c95c7ac19f6a6931d070ad65db5017621862539e 100644 |
| --- a/test/cctest/test-macro-assembler-mips.cc |
| +++ b/test/cctest/test-macro-assembler-mips.cc |
| @@ -261,6 +261,80 @@ TEST(jump_tables4) { |
| } |
| +TEST(jump_tables5) { |
| + if (IsMipsArchVariant(kMips32r6)) return; |
|
paul.l...
2016/01/12 01:13:40
I suspect this should be ! IsMipsArchVariant(kMips
balazs.kilvady
2016/01/12 16:32:11
Done.
|
| + |
| + // Similar to test-assembler-mips jump_tables1, with extra test for branch |
| + // trampoline required before emission of the dd table (where trampolines are |
| + // blocked), and proper transition to long-branch mode. |
| + // Regression test for v8:4294. |
|
paul.l...
2016/01/12 01:13:40
Is this still a regression for that issue? Or was
balazs.kilvady
2016/01/12 16:32:11
Done.
|
| + CcTest::InitializeVM(); |
| + Isolate* isolate = CcTest::i_isolate(); |
| + HandleScope scope(isolate); |
| + MacroAssembler assembler(isolate, nullptr, 0, |
| + v8::internal::CodeObjectRequired::kYes); |
| + MacroAssembler* masm = &assembler; |
| + |
| + const int kNumCases = 512; |
| + int values[kNumCases]; |
| + isolate->random_number_generator()->NextBytes(values, sizeof(values)); |
| + Label labels[kNumCases]; |
| + Label done; |
| + |
| + __ addiu(sp, sp, -4); |
| + __ sw(ra, MemOperand(sp)); |
| + |
| + __ Align(8); |
| + { |
| + __ BlockTrampolinePoolFor(kNumCases * 2 + 7 + 1); |
| + PredictableCodeSizeScope predictable( |
| + masm, kNumCases * kPointerSize + ((7 + 1) * Assembler::kInstrSize)); |
| + Label here; |
| + |
| + __ bal(&here); |
| + __ sll(at, a0, 3); // In delay slot. |
| + __ bind(&here); |
| + __ addu(at, at, ra); |
| + __ lw(at, MemOperand(at, 6 * Assembler::kInstrSize)); |
| + __ jalr(at); |
| + __ nop(); // Branch delay slot nop. |
| + __ bc(&done); |
| + for (int i = 0; i < kNumCases; ++i) { |
| + __ dd(&labels[i]); |
| + } |
| + } |
| + |
| + for (int i = 0; i < kNumCases; ++i) { |
| + __ bind(&labels[i]); |
| + __ lui(v0, (values[i] >> 16) & 0xffff); |
| + __ ori(v0, v0, values[i] & 0xffff); |
| + __ jr(ra); |
| + __ nop(); |
| + } |
| + |
| + __ bind(&done); |
| + __ lw(ra, MemOperand(sp)); |
| + __ addiu(sp, sp, 4); |
| + __ jr(ra); |
| + __ nop(); |
| + |
| + CodeDesc desc; |
| + masm->GetCode(&desc); |
| + Handle<Code> code = isolate->factory()->NewCode( |
| + desc, Code::ComputeFlags(Code::STUB), Handle<Code>()); |
| +#ifdef OBJECT_PRINT |
| + code->Print(std::cout); |
| +#endif |
| + F1 f = FUNCTION_CAST<F1>(code->entry()); |
| + for (int i = 0; i < kNumCases; ++i) { |
| + int64_t res = reinterpret_cast<int64_t>( |
| + CALL_GENERATED_CODE(isolate, f, i, 0, 0, 0, 0)); |
| + ::printf("f(%d) = %" PRId64 "\n", i, res); |
| + CHECK_EQ(values[i], res); |
| + } |
| +} |
| + |
| + |
| static uint32_t run_lsa(uint32_t rt, uint32_t rs, int8_t sa) { |
| Isolate* isolate = CcTest::i_isolate(); |
| HandleScope scope(isolate); |