diff options
Diffstat (limited to 'deps/v8/test/cctest/test-assembler-arm64.cc')
-rw-r--r-- | deps/v8/test/cctest/test-assembler-arm64.cc | 495 |
1 files changed, 369 insertions, 126 deletions
diff --git a/deps/v8/test/cctest/test-assembler-arm64.cc b/deps/v8/test/cctest/test-assembler-arm64.cc index c2c5b782dc..68bef59d86 100644 --- a/deps/v8/test/cctest/test-assembler-arm64.cc +++ b/deps/v8/test/cctest/test-assembler-arm64.cc @@ -3819,6 +3819,375 @@ TEST(neg) { } +template <typename T, typename Op> +static void AdcsSbcsHelper(Op op, T left, T right, int carry, T expected, + StatusFlags expected_flags) { + int reg_size = sizeof(T) * 8; + auto left_reg = Register::Create(0, reg_size); + auto right_reg = Register::Create(1, reg_size); + auto result_reg = Register::Create(2, reg_size); + + SETUP(); + START(); + + __ Mov(left_reg, left); + __ Mov(right_reg, right); + __ Mov(x10, (carry ? CFlag : NoFlag)); + + __ Msr(NZCV, x10); + (masm.*op)(result_reg, left_reg, right_reg); + + END(); + RUN(); + + CHECK_EQUAL_64(left, left_reg.X()); + CHECK_EQUAL_64(right, right_reg.X()); + CHECK_EQUAL_64(expected, result_reg.X()); + CHECK_EQUAL_NZCV(expected_flags); + + TEARDOWN(); +} + + +TEST(adcs_sbcs_x) { + INIT_V8(); + uint64_t inputs[] = { + 0x0000000000000000, 0x0000000000000001, 0x7ffffffffffffffe, + 0x7fffffffffffffff, 0x8000000000000000, 0x8000000000000001, + 0xfffffffffffffffe, 0xffffffffffffffff, + }; + static const size_t input_count = sizeof(inputs) / sizeof(inputs[0]); + + struct Expected { + uint64_t carry0_result; + StatusFlags carry0_flags; + uint64_t carry1_result; + StatusFlags carry1_flags; + }; + + static const Expected expected_adcs_x[input_count][input_count] = { + {{0x0000000000000000, ZFlag, 0x0000000000000001, NoFlag}, + {0x0000000000000001, NoFlag, 0x0000000000000002, NoFlag}, + {0x7ffffffffffffffe, NoFlag, 0x7fffffffffffffff, NoFlag}, + {0x7fffffffffffffff, NoFlag, 0x8000000000000000, NVFlag}, + {0x8000000000000000, NFlag, 0x8000000000000001, NFlag}, + {0x8000000000000001, NFlag, 0x8000000000000002, NFlag}, + {0xfffffffffffffffe, NFlag, 0xffffffffffffffff, NFlag}, + {0xffffffffffffffff, NFlag, 0x0000000000000000, ZCFlag}}, + {{0x0000000000000001, NoFlag, 0x0000000000000002, NoFlag}, + {0x0000000000000002, NoFlag, 0x0000000000000003, NoFlag}, + {0x7fffffffffffffff, NoFlag, 0x8000000000000000, NVFlag}, + {0x8000000000000000, NVFlag, 0x8000000000000001, NVFlag}, + {0x8000000000000001, NFlag, 0x8000000000000002, NFlag}, + {0x8000000000000002, NFlag, 0x8000000000000003, NFlag}, + {0xffffffffffffffff, NFlag, 0x0000000000000000, ZCFlag}, + {0x0000000000000000, ZCFlag, 0x0000000000000001, CFlag}}, + {{0x7ffffffffffffffe, NoFlag, 0x7fffffffffffffff, NoFlag}, + {0x7fffffffffffffff, NoFlag, 0x8000000000000000, NVFlag}, + {0xfffffffffffffffc, NVFlag, 0xfffffffffffffffd, NVFlag}, + {0xfffffffffffffffd, NVFlag, 0xfffffffffffffffe, NVFlag}, + {0xfffffffffffffffe, NFlag, 0xffffffffffffffff, NFlag}, + {0xffffffffffffffff, NFlag, 0x0000000000000000, ZCFlag}, + {0x7ffffffffffffffc, CFlag, 0x7ffffffffffffffd, CFlag}, + {0x7ffffffffffffffd, CFlag, 0x7ffffffffffffffe, CFlag}}, + {{0x7fffffffffffffff, NoFlag, 0x8000000000000000, NVFlag}, + {0x8000000000000000, NVFlag, 0x8000000000000001, NVFlag}, + {0xfffffffffffffffd, NVFlag, 0xfffffffffffffffe, NVFlag}, + {0xfffffffffffffffe, NVFlag, 0xffffffffffffffff, NVFlag}, + {0xffffffffffffffff, NFlag, 0x0000000000000000, ZCFlag}, + {0x0000000000000000, ZCFlag, 0x0000000000000001, CFlag}, + {0x7ffffffffffffffd, CFlag, 0x7ffffffffffffffe, CFlag}, + {0x7ffffffffffffffe, CFlag, 0x7fffffffffffffff, CFlag}}, + {{0x8000000000000000, NFlag, 0x8000000000000001, NFlag}, + {0x8000000000000001, NFlag, 0x8000000000000002, NFlag}, + {0xfffffffffffffffe, NFlag, 0xffffffffffffffff, NFlag}, + {0xffffffffffffffff, NFlag, 0x0000000000000000, ZCFlag}, + {0x0000000000000000, ZCVFlag, 0x0000000000000001, CVFlag}, + {0x0000000000000001, CVFlag, 0x0000000000000002, CVFlag}, + {0x7ffffffffffffffe, CVFlag, 0x7fffffffffffffff, CVFlag}, + {0x7fffffffffffffff, CVFlag, 0x8000000000000000, NCFlag}}, + {{0x8000000000000001, NFlag, 0x8000000000000002, NFlag}, + {0x8000000000000002, NFlag, 0x8000000000000003, NFlag}, + {0xffffffffffffffff, NFlag, 0x0000000000000000, ZCFlag}, + {0x0000000000000000, ZCFlag, 0x0000000000000001, CFlag}, + {0x0000000000000001, CVFlag, 0x0000000000000002, CVFlag}, + {0x0000000000000002, CVFlag, 0x0000000000000003, CVFlag}, + {0x7fffffffffffffff, CVFlag, 0x8000000000000000, NCFlag}, + {0x8000000000000000, NCFlag, 0x8000000000000001, NCFlag}}, + {{0xfffffffffffffffe, NFlag, 0xffffffffffffffff, NFlag}, + {0xffffffffffffffff, NFlag, 0x0000000000000000, ZCFlag}, + {0x7ffffffffffffffc, CFlag, 0x7ffffffffffffffd, CFlag}, + {0x7ffffffffffffffd, CFlag, 0x7ffffffffffffffe, CFlag}, + {0x7ffffffffffffffe, CVFlag, 0x7fffffffffffffff, CVFlag}, + {0x7fffffffffffffff, CVFlag, 0x8000000000000000, NCFlag}, + {0xfffffffffffffffc, NCFlag, 0xfffffffffffffffd, NCFlag}, + {0xfffffffffffffffd, NCFlag, 0xfffffffffffffffe, NCFlag}}, + {{0xffffffffffffffff, NFlag, 0x0000000000000000, ZCFlag}, + {0x0000000000000000, ZCFlag, 0x0000000000000001, CFlag}, + {0x7ffffffffffffffd, CFlag, 0x7ffffffffffffffe, CFlag}, + {0x7ffffffffffffffe, CFlag, 0x7fffffffffffffff, CFlag}, + {0x7fffffffffffffff, CVFlag, 0x8000000000000000, NCFlag}, + {0x8000000000000000, NCFlag, 0x8000000000000001, NCFlag}, + {0xfffffffffffffffd, NCFlag, 0xfffffffffffffffe, NCFlag}, + {0xfffffffffffffffe, NCFlag, 0xffffffffffffffff, NCFlag}}}; + + static const Expected expected_sbcs_x[input_count][input_count] = { + {{0xffffffffffffffff, NFlag, 0x0000000000000000, ZCFlag}, + {0xfffffffffffffffe, NFlag, 0xffffffffffffffff, NFlag}, + {0x8000000000000001, NFlag, 0x8000000000000002, NFlag}, + {0x8000000000000000, NFlag, 0x8000000000000001, NFlag}, + {0x7fffffffffffffff, NoFlag, 0x8000000000000000, NVFlag}, + {0x7ffffffffffffffe, NoFlag, 0x7fffffffffffffff, NoFlag}, + {0x0000000000000001, NoFlag, 0x0000000000000002, NoFlag}, + {0x0000000000000000, ZFlag, 0x0000000000000001, NoFlag}}, + {{0x0000000000000000, ZCFlag, 0x0000000000000001, CFlag}, + {0xffffffffffffffff, NFlag, 0x0000000000000000, ZCFlag}, + {0x8000000000000002, NFlag, 0x8000000000000003, NFlag}, + {0x8000000000000001, NFlag, 0x8000000000000002, NFlag}, + {0x8000000000000000, NVFlag, 0x8000000000000001, NVFlag}, + {0x7fffffffffffffff, NoFlag, 0x8000000000000000, NVFlag}, + {0x0000000000000002, NoFlag, 0x0000000000000003, NoFlag}, + {0x0000000000000001, NoFlag, 0x0000000000000002, NoFlag}}, + {{0x7ffffffffffffffd, CFlag, 0x7ffffffffffffffe, CFlag}, + {0x7ffffffffffffffc, CFlag, 0x7ffffffffffffffd, CFlag}, + {0xffffffffffffffff, NFlag, 0x0000000000000000, ZCFlag}, + {0xfffffffffffffffe, NFlag, 0xffffffffffffffff, NFlag}, + {0xfffffffffffffffd, NVFlag, 0xfffffffffffffffe, NVFlag}, + {0xfffffffffffffffc, NVFlag, 0xfffffffffffffffd, NVFlag}, + {0x7fffffffffffffff, NoFlag, 0x8000000000000000, NVFlag}, + {0x7ffffffffffffffe, NoFlag, 0x7fffffffffffffff, NoFlag}}, + {{0x7ffffffffffffffe, CFlag, 0x7fffffffffffffff, CFlag}, + {0x7ffffffffffffffd, CFlag, 0x7ffffffffffffffe, CFlag}, + {0x0000000000000000, ZCFlag, 0x0000000000000001, CFlag}, + {0xffffffffffffffff, NFlag, 0x0000000000000000, ZCFlag}, + {0xfffffffffffffffe, NVFlag, 0xffffffffffffffff, NVFlag}, + {0xfffffffffffffffd, NVFlag, 0xfffffffffffffffe, NVFlag}, + {0x8000000000000000, NVFlag, 0x8000000000000001, NVFlag}, + {0x7fffffffffffffff, NoFlag, 0x8000000000000000, NVFlag}}, + {{0x7fffffffffffffff, CVFlag, 0x8000000000000000, NCFlag}, + {0x7ffffffffffffffe, CVFlag, 0x7fffffffffffffff, CVFlag}, + {0x0000000000000001, CVFlag, 0x0000000000000002, CVFlag}, + {0x0000000000000000, ZCVFlag, 0x0000000000000001, CVFlag}, + {0xffffffffffffffff, NFlag, 0x0000000000000000, ZCFlag}, + {0xfffffffffffffffe, NFlag, 0xffffffffffffffff, NFlag}, + {0x8000000000000001, NFlag, 0x8000000000000002, NFlag}, + {0x8000000000000000, NFlag, 0x8000000000000001, NFlag}}, + {{0x8000000000000000, NCFlag, 0x8000000000000001, NCFlag}, + {0x7fffffffffffffff, CVFlag, 0x8000000000000000, NCFlag}, + {0x0000000000000002, CVFlag, 0x0000000000000003, CVFlag}, + {0x0000000000000001, CVFlag, 0x0000000000000002, CVFlag}, + {0x0000000000000000, ZCFlag, 0x0000000000000001, CFlag}, + {0xffffffffffffffff, NFlag, 0x0000000000000000, ZCFlag}, + {0x8000000000000002, NFlag, 0x8000000000000003, NFlag}, + {0x8000000000000001, NFlag, 0x8000000000000002, NFlag}}, + {{0xfffffffffffffffd, NCFlag, 0xfffffffffffffffe, NCFlag}, + {0xfffffffffffffffc, NCFlag, 0xfffffffffffffffd, NCFlag}, + {0x7fffffffffffffff, CVFlag, 0x8000000000000000, NCFlag}, + {0x7ffffffffffffffe, CVFlag, 0x7fffffffffffffff, CVFlag}, + {0x7ffffffffffffffd, CFlag, 0x7ffffffffffffffe, CFlag}, + {0x7ffffffffffffffc, CFlag, 0x7ffffffffffffffd, CFlag}, + {0xffffffffffffffff, NFlag, 0x0000000000000000, ZCFlag}, + {0xfffffffffffffffe, NFlag, 0xffffffffffffffff, NFlag}}, + {{0xfffffffffffffffe, NCFlag, 0xffffffffffffffff, NCFlag}, + {0xfffffffffffffffd, NCFlag, 0xfffffffffffffffe, NCFlag}, + {0x8000000000000000, NCFlag, 0x8000000000000001, NCFlag}, + {0x7fffffffffffffff, CVFlag, 0x8000000000000000, NCFlag}, + {0x7ffffffffffffffe, CFlag, 0x7fffffffffffffff, CFlag}, + {0x7ffffffffffffffd, CFlag, 0x7ffffffffffffffe, CFlag}, + {0x0000000000000000, ZCFlag, 0x0000000000000001, CFlag}, + {0xffffffffffffffff, NFlag, 0x0000000000000000, ZCFlag}}}; + + for (size_t left = 0; left < input_count; left++) { + for (size_t right = 0; right < input_count; right++) { + const Expected& expected = expected_adcs_x[left][right]; + AdcsSbcsHelper(&MacroAssembler::Adcs, inputs[left], inputs[right], 0, + expected.carry0_result, expected.carry0_flags); + AdcsSbcsHelper(&MacroAssembler::Adcs, inputs[left], inputs[right], 1, + expected.carry1_result, expected.carry1_flags); + } + } + + for (size_t left = 0; left < input_count; left++) { + for (size_t right = 0; right < input_count; right++) { + const Expected& expected = expected_sbcs_x[left][right]; + AdcsSbcsHelper(&MacroAssembler::Sbcs, inputs[left], inputs[right], 0, + expected.carry0_result, expected.carry0_flags); + AdcsSbcsHelper(&MacroAssembler::Sbcs, inputs[left], inputs[right], 1, + expected.carry1_result, expected.carry1_flags); + } + } +} + + +TEST(adcs_sbcs_w) { + INIT_V8(); + uint32_t inputs[] = { + 0x00000000, 0x00000001, 0x7ffffffe, 0x7fffffff, + 0x80000000, 0x80000001, 0xfffffffe, 0xffffffff, + }; + static const size_t input_count = sizeof(inputs) / sizeof(inputs[0]); + + struct Expected { + uint32_t carry0_result; + StatusFlags carry0_flags; + uint32_t carry1_result; + StatusFlags carry1_flags; + }; + + static const Expected expected_adcs_w[input_count][input_count] = { + {{0x00000000, ZFlag, 0x00000001, NoFlag}, + {0x00000001, NoFlag, 0x00000002, NoFlag}, + {0x7ffffffe, NoFlag, 0x7fffffff, NoFlag}, + {0x7fffffff, NoFlag, 0x80000000, NVFlag}, + {0x80000000, NFlag, 0x80000001, NFlag}, + {0x80000001, NFlag, 0x80000002, NFlag}, + {0xfffffffe, NFlag, 0xffffffff, NFlag}, + {0xffffffff, NFlag, 0x00000000, ZCFlag}}, + {{0x00000001, NoFlag, 0x00000002, NoFlag}, + {0x00000002, NoFlag, 0x00000003, NoFlag}, + {0x7fffffff, NoFlag, 0x80000000, NVFlag}, + {0x80000000, NVFlag, 0x80000001, NVFlag}, + {0x80000001, NFlag, 0x80000002, NFlag}, + {0x80000002, NFlag, 0x80000003, NFlag}, + {0xffffffff, NFlag, 0x00000000, ZCFlag}, + {0x00000000, ZCFlag, 0x00000001, CFlag}}, + {{0x7ffffffe, NoFlag, 0x7fffffff, NoFlag}, + {0x7fffffff, NoFlag, 0x80000000, NVFlag}, + {0xfffffffc, NVFlag, 0xfffffffd, NVFlag}, + {0xfffffffd, NVFlag, 0xfffffffe, NVFlag}, + {0xfffffffe, NFlag, 0xffffffff, NFlag}, + {0xffffffff, NFlag, 0x00000000, ZCFlag}, + {0x7ffffffc, CFlag, 0x7ffffffd, CFlag}, + {0x7ffffffd, CFlag, 0x7ffffffe, CFlag}}, + {{0x7fffffff, NoFlag, 0x80000000, NVFlag}, + {0x80000000, NVFlag, 0x80000001, NVFlag}, + {0xfffffffd, NVFlag, 0xfffffffe, NVFlag}, + {0xfffffffe, NVFlag, 0xffffffff, NVFlag}, + {0xffffffff, NFlag, 0x00000000, ZCFlag}, + {0x00000000, ZCFlag, 0x00000001, CFlag}, + {0x7ffffffd, CFlag, 0x7ffffffe, CFlag}, + {0x7ffffffe, CFlag, 0x7fffffff, CFlag}}, + {{0x80000000, NFlag, 0x80000001, NFlag}, + {0x80000001, NFlag, 0x80000002, NFlag}, + {0xfffffffe, NFlag, 0xffffffff, NFlag}, + {0xffffffff, NFlag, 0x00000000, ZCFlag}, + {0x00000000, ZCVFlag, 0x00000001, CVFlag}, + {0x00000001, CVFlag, 0x00000002, CVFlag}, + {0x7ffffffe, CVFlag, 0x7fffffff, CVFlag}, + {0x7fffffff, CVFlag, 0x80000000, NCFlag}}, + {{0x80000001, NFlag, 0x80000002, NFlag}, + {0x80000002, NFlag, 0x80000003, NFlag}, + {0xffffffff, NFlag, 0x00000000, ZCFlag}, + {0x00000000, ZCFlag, 0x00000001, CFlag}, + {0x00000001, CVFlag, 0x00000002, CVFlag}, + {0x00000002, CVFlag, 0x00000003, CVFlag}, + {0x7fffffff, CVFlag, 0x80000000, NCFlag}, + {0x80000000, NCFlag, 0x80000001, NCFlag}}, + {{0xfffffffe, NFlag, 0xffffffff, NFlag}, + {0xffffffff, NFlag, 0x00000000, ZCFlag}, + {0x7ffffffc, CFlag, 0x7ffffffd, CFlag}, + {0x7ffffffd, CFlag, 0x7ffffffe, CFlag}, + {0x7ffffffe, CVFlag, 0x7fffffff, CVFlag}, + {0x7fffffff, CVFlag, 0x80000000, NCFlag}, + {0xfffffffc, NCFlag, 0xfffffffd, NCFlag}, + {0xfffffffd, NCFlag, 0xfffffffe, NCFlag}}, + {{0xffffffff, NFlag, 0x00000000, ZCFlag}, + {0x00000000, ZCFlag, 0x00000001, CFlag}, + {0x7ffffffd, CFlag, 0x7ffffffe, CFlag}, + {0x7ffffffe, CFlag, 0x7fffffff, CFlag}, + {0x7fffffff, CVFlag, 0x80000000, NCFlag}, + {0x80000000, NCFlag, 0x80000001, NCFlag}, + {0xfffffffd, NCFlag, 0xfffffffe, NCFlag}, + {0xfffffffe, NCFlag, 0xffffffff, NCFlag}}}; + + static const Expected expected_sbcs_w[input_count][input_count] = { + {{0xffffffff, NFlag, 0x00000000, ZCFlag}, + {0xfffffffe, NFlag, 0xffffffff, NFlag}, + {0x80000001, NFlag, 0x80000002, NFlag}, + {0x80000000, NFlag, 0x80000001, NFlag}, + {0x7fffffff, NoFlag, 0x80000000, NVFlag}, + {0x7ffffffe, NoFlag, 0x7fffffff, NoFlag}, + {0x00000001, NoFlag, 0x00000002, NoFlag}, + {0x00000000, ZFlag, 0x00000001, NoFlag}}, + {{0x00000000, ZCFlag, 0x00000001, CFlag}, + {0xffffffff, NFlag, 0x00000000, ZCFlag}, + {0x80000002, NFlag, 0x80000003, NFlag}, + {0x80000001, NFlag, 0x80000002, NFlag}, + {0x80000000, NVFlag, 0x80000001, NVFlag}, + {0x7fffffff, NoFlag, 0x80000000, NVFlag}, + {0x00000002, NoFlag, 0x00000003, NoFlag}, + {0x00000001, NoFlag, 0x00000002, NoFlag}}, + {{0x7ffffffd, CFlag, 0x7ffffffe, CFlag}, + {0x7ffffffc, CFlag, 0x7ffffffd, CFlag}, + {0xffffffff, NFlag, 0x00000000, ZCFlag}, + {0xfffffffe, NFlag, 0xffffffff, NFlag}, + {0xfffffffd, NVFlag, 0xfffffffe, NVFlag}, + {0xfffffffc, NVFlag, 0xfffffffd, NVFlag}, + {0x7fffffff, NoFlag, 0x80000000, NVFlag}, + {0x7ffffffe, NoFlag, 0x7fffffff, NoFlag}}, + {{0x7ffffffe, CFlag, 0x7fffffff, CFlag}, + {0x7ffffffd, CFlag, 0x7ffffffe, CFlag}, + {0x00000000, ZCFlag, 0x00000001, CFlag}, + {0xffffffff, NFlag, 0x00000000, ZCFlag}, + {0xfffffffe, NVFlag, 0xffffffff, NVFlag}, + {0xfffffffd, NVFlag, 0xfffffffe, NVFlag}, + {0x80000000, NVFlag, 0x80000001, NVFlag}, + {0x7fffffff, NoFlag, 0x80000000, NVFlag}}, + {{0x7fffffff, CVFlag, 0x80000000, NCFlag}, + {0x7ffffffe, CVFlag, 0x7fffffff, CVFlag}, + {0x00000001, CVFlag, 0x00000002, CVFlag}, + {0x00000000, ZCVFlag, 0x00000001, CVFlag}, + {0xffffffff, NFlag, 0x00000000, ZCFlag}, + {0xfffffffe, NFlag, 0xffffffff, NFlag}, + {0x80000001, NFlag, 0x80000002, NFlag}, + {0x80000000, NFlag, 0x80000001, NFlag}}, + {{0x80000000, NCFlag, 0x80000001, NCFlag}, + {0x7fffffff, CVFlag, 0x80000000, NCFlag}, + {0x00000002, CVFlag, 0x00000003, CVFlag}, + {0x00000001, CVFlag, 0x00000002, CVFlag}, + {0x00000000, ZCFlag, 0x00000001, CFlag}, + {0xffffffff, NFlag, 0x00000000, ZCFlag}, + {0x80000002, NFlag, 0x80000003, NFlag}, + {0x80000001, NFlag, 0x80000002, NFlag}}, + {{0xfffffffd, NCFlag, 0xfffffffe, NCFlag}, + {0xfffffffc, NCFlag, 0xfffffffd, NCFlag}, + {0x7fffffff, CVFlag, 0x80000000, NCFlag}, + {0x7ffffffe, CVFlag, 0x7fffffff, CVFlag}, + {0x7ffffffd, CFlag, 0x7ffffffe, CFlag}, + {0x7ffffffc, CFlag, 0x7ffffffd, CFlag}, + {0xffffffff, NFlag, 0x00000000, ZCFlag}, + {0xfffffffe, NFlag, 0xffffffff, NFlag}}, + {{0xfffffffe, NCFlag, 0xffffffff, NCFlag}, + {0xfffffffd, NCFlag, 0xfffffffe, NCFlag}, + {0x80000000, NCFlag, 0x80000001, NCFlag}, + {0x7fffffff, CVFlag, 0x80000000, NCFlag}, + {0x7ffffffe, CFlag, 0x7fffffff, CFlag}, + {0x7ffffffd, CFlag, 0x7ffffffe, CFlag}, + {0x00000000, ZCFlag, 0x00000001, CFlag}, + {0xffffffff, NFlag, 0x00000000, ZCFlag}}}; + + for (size_t left = 0; left < input_count; left++) { + for (size_t right = 0; right < input_count; right++) { + const Expected& expected = expected_adcs_w[left][right]; + AdcsSbcsHelper(&MacroAssembler::Adcs, inputs[left], inputs[right], 0, + expected.carry0_result, expected.carry0_flags); + AdcsSbcsHelper(&MacroAssembler::Adcs, inputs[left], inputs[right], 1, + expected.carry1_result, expected.carry1_flags); + } + } + + for (size_t left = 0; left < input_count; left++) { + for (size_t right = 0; right < input_count; right++) { + const Expected& expected = expected_sbcs_w[left][right]; + AdcsSbcsHelper(&MacroAssembler::Sbcs, inputs[left], inputs[right], 0, + expected.carry0_result, expected.carry0_flags); + AdcsSbcsHelper(&MacroAssembler::Sbcs, inputs[left], inputs[right], 1, + expected.carry1_result, expected.carry1_flags); + } + } +} + + TEST(adc_sbc_shift) { INIT_V8(); SETUP(); @@ -3887,132 +4256,6 @@ TEST(adc_sbc_shift) { CHECK_EQUAL_32(0x91111110 + 1, w26); CHECK_EQUAL_32(0x9a222221 + 1, w27); - // Check that adc correctly sets the condition flags. - START(); - __ Mov(x0, 1); - __ Mov(x1, 0xffffffffffffffffL); - // Clear the C flag. - __ Adds(x0, x0, Operand(0)); - __ Adcs(x10, x0, Operand(x1)); - END(); - - RUN(); - - CHECK_EQUAL_NZCV(ZCFlag); - CHECK_EQUAL_64(0, x10); - - START(); - __ Mov(x0, 1); - __ Mov(x1, 0x8000000000000000L); - // Clear the C flag. - __ Adds(x0, x0, Operand(0)); - __ Adcs(x10, x0, Operand(x1, ASR, 63)); - END(); - - RUN(); - - CHECK_EQUAL_NZCV(ZCFlag); - CHECK_EQUAL_64(0, x10); - - START(); - __ Mov(x0, 0x10); - __ Mov(x1, 0x07ffffffffffffffL); - // Clear the C flag. - __ Adds(x0, x0, Operand(0)); - __ Adcs(x10, x0, Operand(x1, LSL, 4)); - END(); - - RUN(); - - CHECK_EQUAL_NZCV(NVFlag); - CHECK_EQUAL_64(0x8000000000000000L, x10); - - // Check that sbc correctly sets the condition flags. - START(); - __ Mov(x0, 0); - __ Mov(x1, 0xffffffffffffffffL); - // Clear the C flag. - __ Adds(x0, x0, Operand(0)); - __ Sbcs(x10, x0, Operand(x1)); - END(); - - RUN(); - - CHECK_EQUAL_NZCV(ZFlag); - CHECK_EQUAL_64(0, x10); - - START(); - __ Mov(x0, 1); - __ Mov(x1, 0xffffffffffffffffL); - // Clear the C flag. - __ Adds(x0, x0, Operand(0)); - __ Sbcs(x10, x0, Operand(x1, LSR, 1)); - END(); - - RUN(); - - CHECK_EQUAL_NZCV(NFlag); - CHECK_EQUAL_64(0x8000000000000001L, x10); - - START(); - __ Mov(x0, 0); - // Clear the C flag. - __ Adds(x0, x0, Operand(0)); - __ Sbcs(x10, x0, Operand(0xffffffffffffffffL)); - END(); - - RUN(); - - CHECK_EQUAL_NZCV(ZFlag); - CHECK_EQUAL_64(0, x10); - - START() - __ Mov(w0, 0x7fffffff); - // Clear the C flag. - __ Adds(x0, x0, Operand(0)); - __ Ngcs(w10, w0); - END(); - - RUN(); - - CHECK_EQUAL_NZCV(NFlag); - CHECK_EQUAL_64(0x80000000, x10); - - START(); - // Clear the C flag. - __ Adds(x0, x0, Operand(0)); - __ Ngcs(x10, 0x7fffffffffffffffL); - END(); - - RUN(); - - CHECK_EQUAL_NZCV(NFlag); - CHECK_EQUAL_64(0x8000000000000000L, x10); - - START() - __ Mov(x0, 0); - // Set the C flag. - __ Cmp(x0, Operand(x0)); - __ Sbcs(x10, x0, Operand(1)); - END(); - - RUN(); - - CHECK_EQUAL_NZCV(NFlag); - CHECK_EQUAL_64(0xffffffffffffffffL, x10); - - START() - __ Mov(x0, 0); - // Set the C flag. - __ Cmp(x0, Operand(x0)); - __ Ngcs(x10, 0x7fffffffffffffffL); - END(); - - RUN(); - - CHECK_EQUAL_NZCV(NFlag); - CHECK_EQUAL_64(0x8000000000000001L, x10); - TEARDOWN(); } |