summaryrefslogtreecommitdiff
path: root/deps/v8/test/cctest/test-assembler-arm.cc
diff options
context:
space:
mode:
Diffstat (limited to 'deps/v8/test/cctest/test-assembler-arm.cc')
-rw-r--r--deps/v8/test/cctest/test-assembler-arm.cc88
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