diff options
Diffstat (limited to 'deps/v8/test/cctest/test-assembler-arm.cc')
-rw-r--r-- | deps/v8/test/cctest/test-assembler-arm.cc | 88 |
1 files changed, 79 insertions, 9 deletions
diff --git a/deps/v8/test/cctest/test-assembler-arm.cc b/deps/v8/test/cctest/test-assembler-arm.cc index d66027b5fd..f93163c985 100644 --- a/deps/v8/test/cctest/test-assembler-arm.cc +++ b/deps/v8/test/cctest/test-assembler-arm.cc @@ -167,7 +167,6 @@ TEST(3) { T t; Assembler assm(AssemblerOptions{}); - Label L, C; __ mov(ip, Operand(sp)); __ stm(db_w, sp, r4.bit() | fp.bit() | lr.bit()); @@ -236,7 +235,6 @@ TEST(4) { // Create a function that accepts &t, and loads, manipulates, and stores // the doubles and floats. Assembler assm(AssemblerOptions{}); - Label L, C; if (CpuFeatures::IsSupported(VFPv3)) { CpuFeatureScope scope(&assm, VFPv3); @@ -1029,7 +1027,6 @@ TEST(13) { // Create a function that accepts &t, and loads, manipulates, and stores // the doubles and floats. Assembler assm(AssemblerOptions{}); - Label L, C; if (CpuFeatures::IsSupported(VFPv3)) { CpuFeatureScope scope(&assm, VFPv3); @@ -2935,7 +2932,6 @@ TEST(ARMv8_float32_vrintX) { // Create a function that accepts &t, and loads, manipulates, and stores // the floats. Assembler assm(AssemblerOptions{}); - Label L, C; if (CpuFeatures::IsSupported(ARMv8)) { @@ -3037,7 +3033,6 @@ TEST(ARMv8_vrintX) { // Create a function that accepts &t, and loads, manipulates, and stores // the doubles and floats. Assembler assm(AssemblerOptions{}); - Label L, C; if (CpuFeatures::IsSupported(ARMv8)) { @@ -4094,18 +4089,18 @@ namespace { std::vector<Float32> Float32Inputs() { std::vector<Float32> inputs; FOR_FLOAT32_INPUTS(f) { - inputs.push_back(Float32::FromBits(bit_cast<uint32_t>(*f))); + inputs.push_back(Float32::FromBits(bit_cast<uint32_t>(f))); } - FOR_UINT32_INPUTS(bits) { inputs.push_back(Float32::FromBits(*bits)); } + FOR_UINT32_INPUTS(bits) { inputs.push_back(Float32::FromBits(bits)); } return inputs; } std::vector<Float64> Float64Inputs() { std::vector<Float64> inputs; FOR_FLOAT64_INPUTS(f) { - inputs.push_back(Float64::FromBits(bit_cast<uint64_t>(*f))); + inputs.push_back(Float64::FromBits(bit_cast<uint64_t>(f))); } - FOR_UINT64_INPUTS(bits) { inputs.push_back(Float64::FromBits(*bits)); } + FOR_UINT64_INPUTS(bits) { inputs.push_back(Float64::FromBits(bits)); } return inputs; } @@ -4187,6 +4182,81 @@ TEST(vneg_64) { } } +TEST(move_pair) { + Isolate* isolate = CcTest::i_isolate(); + HandleScope scope(isolate); + + auto f = AssembleCode<F_piiii>([](MacroAssembler& assm) { + RegList used_callee_saved = + r4.bit() | r5.bit() | r6.bit() | r7.bit() | r8.bit(); + __ stm(db_w, sp, used_callee_saved); + + // Save output register bank pointer to r8. + __ mov(r8, r0); + + __ mov(r0, Operand(0xabababab)); + __ mov(r1, Operand(0xbabababa)); + __ mov(r2, Operand(0x12341234)); + __ mov(r3, Operand(0x43214321)); + + // No overlap: + // r4 <- r0 + // r5 <- r1 + __ MovePair(r4, r0, r5, r1); + + // Overlap but we can swap moves: + // r2 <- r0 + // r6 <- r2 + __ MovePair(r2, r0, r6, r2); + + // Overlap but can be done: + // r7 <- r3 + // r3 <- r0 + __ MovePair(r7, r3, r3, r0); + + // Swap. + // r0 <- r1 + // r1 <- r0 + __ MovePair(r0, r1, r1, r0); + + // Fill the fake register bank. + __ str(r0, MemOperand(r8, 0 * kPointerSize)); + __ str(r1, MemOperand(r8, 1 * kPointerSize)); + __ str(r2, MemOperand(r8, 2 * kPointerSize)); + __ str(r3, MemOperand(r8, 3 * kPointerSize)); + __ str(r4, MemOperand(r8, 4 * kPointerSize)); + __ str(r5, MemOperand(r8, 5 * kPointerSize)); + __ str(r6, MemOperand(r8, 6 * kPointerSize)); + __ str(r7, MemOperand(r8, 7 * kPointerSize)); + + __ ldm(ia_w, sp, used_callee_saved); + }); + + // Create a fake register bank. + uint32_t r[] = {0, 0, 0, 0, 0, 0, 0, 0}; + f.Call(r, 0, 0, 0, 0); + + // r4 <- r0 + // r5 <- r1 + CHECK_EQ(0xabababab, r[4]); + CHECK_EQ(0xbabababa, r[5]); + + // r2 <- r0 + // r6 <- r2 + CHECK_EQ(0xabababab, r[2]); + CHECK_EQ(0x12341234, r[6]); + + // r7 <- r3 + // r3 <- r0 + CHECK_EQ(0x43214321, r[7]); + CHECK_EQ(0xabababab, r[3]); + + // r0 and r1 should be swapped. + CHECK_EQ(0xbabababa, r[0]); + CHECK_EQ(0xabababab, r[1]); +} + + #undef __ } // namespace test_assembler_arm |