aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sim/pru/pru.isa12
-rw-r--r--sim/testsuite/pru/carry.s416
2 files changed, 424 insertions, 4 deletions
diff --git a/sim/pru/pru.isa b/sim/pru/pru.isa
index fb2d049..e88522b 100644
--- a/sim/pru/pru.isa
+++ b/sim/pru/pru.isa
@@ -40,26 +40,30 @@ INSTRUCTION (sub,
OP2 = (IO ? IMM8 : RS2);
RD = RS1 - OP2;
CARRY = (((uint64_t) RS1 - (uint64_t) OP2) >> RD_WIDTH) & 1;
+ CARRY = !CARRY;
PC++)
INSTRUCTION (suc,
OP2 = (IO ? IMM8 : RS2);
- RD = RS1 - OP2 - CARRY;
- CARRY = (((uint64_t) RS1 - (uint64_t) OP2 - (uint64_t) CARRY)
+ RD = RS1 - OP2 - !CARRY;
+ CARRY = (((uint64_t) RS1 - (uint64_t) OP2 - (uint64_t) !CARRY)
>> RD_WIDTH) & 1;
+ CARRY = !CARRY;
PC++)
INSTRUCTION (rsb,
OP2 = (IO ? IMM8 : RS2);
RD = OP2 - RS1;
CARRY = (((uint64_t) OP2 - (uint64_t) RS1) >> RD_WIDTH) & 1;
+ CARRY = !CARRY;
PC++)
INSTRUCTION (rsc,
OP2 = (IO ? IMM8 : RS2);
- RD = OP2 - RS1 - CARRY;
- CARRY = (((uint64_t) OP2 - (uint64_t) RS1 - (uint64_t) CARRY)
+ RD = OP2 - RS1 - !CARRY;
+ CARRY = (((uint64_t) OP2 - (uint64_t) RS1 - (uint64_t) !CARRY)
>> RD_WIDTH) & 1;
+ CARRY = !CARRY;
PC++)
INSTRUCTION (lsl,
diff --git a/sim/testsuite/pru/carry.s b/sim/testsuite/pru/carry.s
new file mode 100644
index 0000000..cff75d2
--- /dev/null
+++ b/sim/testsuite/pru/carry.s
@@ -0,0 +1,416 @@
+# Check that carry for addition and subtraction works.
+# mach: pru
+
+# Copyright (C) 2023 Free Software Foundation, Inc.
+# Contributed by Dimitar Dimitrov <dimitar@dinux.eu>
+#
+# This file is part of the GNU simulators.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+.include "testutils.inc"
+
+ # Helper macro to exercise three consecutive
+ # instructions using the carry bit.
+ .macro test_seq srcmode, dstmode, init0, init1, init2, init3, alu0, alu1, alu2, expected
+ # In case srcmode>dstmode, "garbage" in the r20 MSB
+ # bits could falsely be interpreted as carry.
+ # So start with initialized destination to make tests consistent.
+ ldi r20, 0
+ ldi32 r15, \init0
+ ldi32 r16, \init1
+ ldi32 r17, \init2
+ ldi32 r18, \init3
+ ldi32 r0, \expected
+ \alu0 r20\dstmode, r15\srcmode, r16\srcmode
+ \alu1 r20\dstmode, r20\srcmode, r17\srcmode
+ \alu2 r20\dstmode, r20\srcmode, r18\srcmode
+ qbeq 1f, r0, r20\dstmode
+ jmp EXIT_FAIL
+1:
+ .endm
+
+ # Helper macro to verify one ALU instruction
+ # using the carry bit.
+ .macro test1 alu, dstmode, src0mode, src0init, src1mode, src1init, expected
+ ldi32 r15, \src0init
+ ldi32 r16, \src1init
+ ldi32 r0, \expected
+ \alu r20\dstmode, r15\src0mode, r16\src1mode
+ qbeq 1f, r0, r20\dstmode
+ jmp EXIT_FAIL
+1:
+ .endm
+
+ start
+
+ # ***** ADD 32-bit dst, 32-bit src *****
+ # {add, clear carry}
+ test1 add, " ", " ", 0x00000000, " ", 0x00000000, 0x00000000
+ # {add with carry=0, clear carry}
+ test1 adc, " ", " ", 0x00000000, " ", 0x00000000, 0x00000000
+ # {add with carry=0, set carry}
+ test1 adc, " ", " ", 0x00000001, " ", 0xffffffff, 0x00000000
+ # {add with carry=1, set carry}
+ test1 adc, " ", " ", 0x00000010, " ", 0xfffffffe, 0x0000000f
+ # {add with carry=1, clear carry}
+ test1 adc, " ", " ", 0x00000010, " ", 0x0ffffffe, 0x1000000f
+ # {add with carry=0, set carry}
+ test1 adc, " ", " ", 0x00000001, " ", 0xffffffff, 0x00000000
+ # {add, set carry}
+ test1 add, " ", " ", 0x00000001, " ", 0xffffffff, 0x00000000
+ # {add with carry=1, set carry}
+ test1 adc, " ", " ", 0x00000010, " ", 0xfffffffe, 0x0000000f
+
+ # ***** ADD 32-bit dst, 16-bit src *****
+ test1 add, " ", ".w0", 0x00000000, ".w0", 0x00000000, 0x00000000
+ test1 adc, " ", ".w0", 0x00000000, ".w0", 0x00000000, 0x00000000
+ test1 adc, " ", ".w0", 0x00000003, ".w0", 0xffffffff, 0x00010002
+ test1 adc, " ", ".w0", 0x00000010, ".w0", 0x0000fffe, 0x0001000e
+
+ # ***** ADD 32-bit dst, 8-bit src *****
+ test1 add, " ", ".b0", 0x00000000, ".b0", 0x00000000, 0x00000000
+ test1 adc, " ", ".b0", 0x00000000, ".b0", 0x00000000, 0x00000000
+ test1 adc, " ", ".b0", 0x00000003, ".b0", 0xffffffff, 0x00000102
+ test1 adc, " ", ".b0", 0x00000010, ".b0", 0x0000f0fe, 0x0000010e
+
+ # ***** ADD 16-bit dst, 32-bit src *****
+ test1 add, ".w0", " ", 0x00000000, " ", 0x00000000, 0x00000000
+ test1 adc, ".w0", " ", 0x00000000, " ", 0x00000000, 0x00000000
+ test1 adc, ".w0", " ", 0x00000001, " ", 0xfff0ffff, 0x00000000
+ test1 adc, ".w0", " ", 0x00000010, " ", 0x0000fffe, 0x0000000f
+ test1 adc, ".w0", " ", 0x00000010, " ", 0x00000ffe, 0x0000100f
+ test1 adc, ".w0", " ", 0x00000001, " ", 0x0000ffff, 0x00000000
+ test1 add, ".w0", " ", 0x00000001, " ", 0x0000ffff, 0x00000000
+ test1 adc, ".w0", " ", 0x00000010, " ", 0x0000fffe, 0x0000000f
+ # Test when intermediate sum sets the carry.
+ test1 add, ".w0", " ", 0x00010000, " ", 0x00000000, 0x00000000
+ test1 adc, ".w0", " ", 0x00000000, " ", 0x00000000, 0x00000001
+ test1 add, ".w0", " ", 0x00020000, " ", 0x00000000, 0x00000000
+ test1 adc, ".w0", " ", 0x00000000, " ", 0x00000000, 0x00000000
+
+ # ***** ADD 16-bit dst, 16-bit src *****
+ test1 add, ".w0", ".w0", 0x00000210, ".w0", 0x00000130, 0x00000340
+ test1 adc, ".w0", ".w0", 0x00000000, ".w0", 0x00000000, 0x00000000
+ test1 adc, ".w0", ".w0", 0x00000001, ".w0", 0xffffffff, 0x00000000
+ test1 adc, ".w0", ".w0", 0x00000010, ".w0", 0xfffffffe, 0x0000000f
+ test1 adc, ".w0", ".w0", 0x00000010, ".w0", 0x00000ffe, 0x0000100f
+ test1 adc, ".w0", ".w0", 0x00000001, ".w0", 0xfff0ffff, 0x00000000
+ test1 add, ".w0", ".w0", 0x00000001, ".w0", 0xfff0ffff, 0x00000000
+ test1 adc, ".w0", ".w0", 0x00000010, ".w0", 0xfff1fffe, 0x0000000f
+
+ # ***** ADD 16-bit dst, 8-bit src *****
+ test1 add, ".w0", ".b0", 0x00000000, ".b0", 0x00000000, 0x00000000
+ test1 adc, ".w0", ".b0", 0x00000000, ".b0", 0x00000000, 0x00000000
+ test1 adc, ".w0", ".b0", 0x00000003, ".b0", 0xffffffff, 0x00000102
+ test1 adc, ".w0", ".b0", 0x00000010, ".b0", 0x0000f0fe, 0x0000010e
+
+ # ***** ADD 8-bit dst, 32-bit src *****
+ test1 add, ".b0", " ", 0x00000000, " ", 0x00000000, 0x00000000
+ test1 adc, ".b0", " ", 0x00000000, " ", 0x00000000, 0x00000000
+ test1 adc, ".b0", " ", 0x00000001, " ", 0x000000ff, 0x00000000
+ test1 adc, ".b0", " ", 0x00000010, " ", 0x000000fe, 0x0000000f
+ test1 adc, ".b0", " ", 0x00000021, " ", 0x0000001e, 0x00000040
+ test1 adc, ".b0", " ", 0x00000001, " ", 0x000000ff, 0x00000000
+ test1 add, ".b0", " ", 0x00000001, " ", 0x000000ff, 0x00000000
+ test1 adc, ".b0", " ", 0x00000010, " ", 0x000000fe, 0x0000000f
+ # Test when intermediate sum sets the carry.
+ test1 add, ".b0", " ", 0x10000100, " ", 0x00000000, 0x00000000
+ test1 adc, ".b0", " ", 0x00000000, " ", 0x00000000, 0x00000001
+
+ # ***** ADD 8-bit dst, 16-bit src *****
+ test1 add, ".b0", ".w0", 0x10000000, ".w0", 0x00000000, 0x00000000
+ test1 adc, ".b0", ".w0", 0x02000000, ".w0", 0x00000000, 0x00000000
+ test1 adc, ".b0", ".w0", 0x00030001, ".w0", 0x000000ff, 0x00000000
+ test1 adc, ".b0", ".w0", 0x00004010, ".w0", 0x000000fe, 0x0000000f
+ test1 adc, ".b0", ".w0", 0x00000021, ".w0", 0x0000001e, 0x00000040
+ test1 adc, ".b0", ".w0", 0x00000001, ".w0", 0x000000ff, 0x00000000
+ test1 add, ".b0", ".w0", 0x00000001, ".w0", 0x000000ff, 0x00000000
+ test1 adc, ".b0", ".w0", 0x00000010, ".w0", 0x000000fe, 0x0000000f
+ # Test when intermediate sum sets the carry.
+ test1 add, ".b0", ".w0", 0x10003100, ".w0", 0x00000000, 0x00000000
+ test1 adc, ".b0", ".w0", 0x00000000, ".w0", 0x00000000, 0x00000001
+
+ # ***** ADD 8-bit dst, 8-bit src *****
+ test1 add, ".b0", ".b0", 0x00000210, ".b0", 0x00000130, 0x00000040
+ test1 adc, ".b0", ".b0", 0x00000000, ".b0", 0x00000000, 0x00000000
+ test1 adc, ".b0", ".b0", 0x00000001, ".b0", 0xffffffff, 0x00000000
+ test1 adc, ".b0", ".b0", 0x00000010, ".b0", 0xfffffffe, 0x0000000f
+ test1 adc, ".b0", ".b0", 0x00000010, ".b0", 0x0000000e, 0x0000001f
+ test1 adc, ".b0", ".b0", 0x00000001, ".b0", 0xfff0ffff, 0x00000000
+ test1 add, ".b0", ".b0", 0x00000001, ".b0", 0xfff0ffff, 0x00000000
+ test1 adc, ".b0", ".b0", 0x00000010, ".b0", 0xfff1fffe, 0x0000000f
+
+ # ***** SUB 32-bit dst, 32-bit src *****
+ # {sub, clear borrow}
+ test1 sub, " ", " ", 0x00000000, " ", 0x00000000, 0x00000000
+ # {sub with borrow=0, clear borrow}
+ test1 suc, " ", " ", 0x00000010, " ", 0x00000001, 0x0000000f
+ # {sub with borrow=0, set borrow}
+ test1 suc, " ", " ", 0x00000008, " ", 0x00000009, 0xffffffff
+ # {sub with borrow=1, set borrow}
+ test1 suc, " ", " ", 0x00000008, " ", 0x00000009, 0xfffffffe
+ # {sub with borrow=1, clear borrow}
+ test1 suc, " ", " ", 0x00000008, " ", 0x00000001, 0x00000006
+ # {sub with borrow=0, set borrow}
+ test1 suc, " ", " ", 0x80000000, " ", 0x90000000, 0xf0000000
+ # {sub, set borrow}
+ test1 sub, " ", " ", 0x00000000, " ", 0x00000001, 0xffffffff
+ # {sub with borrow=1, set borrow}
+ test1 suc, " ", " ", 0x80000000, " ", 0x90000000, 0xefffffff
+
+ # ***** SUB 32-bit dst, 16-bit src *****
+ test1 sub, " ", ".w0", 0x00000000, ".w0", 0x00000000, 0x00000000
+ test1 suc, " ", ".w0", 0x00000010, ".w0", 0x00000001, 0x0000000f
+ test1 suc, " ", ".w0", 0x00000008, ".w0", 0x00000009, 0xffffffff
+ test1 suc, " ", ".w0", 0x00000008, ".w0", 0x00000009, 0xfffffffe
+ test1 suc, " ", ".w0", 0x00000008, ".w0", 0x00000001, 0x00000006
+ test1 suc, " ", ".w0", 0x00108000, ".w0", 0x00009000, 0xfffff000
+ test1 sub, " ", ".w0", 0x00000000, ".w0", 0x00000001, 0xffffffff
+ test1 suc, " ", ".w0", 0x00008000, ".w0", 0x00009000, 0xffffefff
+
+ # ***** SUB 32-bit dst, 8-bit src *****
+ test1 sub, " ", ".b0", 0x00000000, ".b0", 0x00000000, 0x00000000
+ test1 suc, " ", ".b0", 0x00000010, ".b0", 0x00000001, 0x0000000f
+ test1 suc, " ", ".b0", 0x00000008, ".b0", 0x00000009, 0xffffffff
+ test1 suc, " ", ".b0", 0x00000008, ".b0", 0x00000009, 0xfffffffe
+ test1 suc, " ", ".b0", 0x00000008, ".b0", 0x00000001, 0x00000006
+ test1 suc, " ", ".b0", 0x00108080, ".b0", 0x00009090, 0xfffffff0
+ test1 sub, " ", ".b0", 0x00000000, ".b0", 0x00000001, 0xffffffff
+ test1 suc, " ", ".b0", 0x00008080, ".b0", 0x00009090, 0xffffffef
+
+ # ***** SUB 16-bit dst, 32-bit src *****
+ test1 sub, ".w0", " ", 0x00000000, " ", 0x00000000, 0x00000000
+ test1 suc, ".w0", " ", 0x00000010, " ", 0x00000001, 0x0000000f
+ test1 suc, ".w0", " ", 0x00000008, " ", 0x00000009, 0x0000ffff
+ test1 suc, ".w0", " ", 0x00000008, " ", 0x00000009, 0x0000fffe
+ test1 suc, ".w0", " ", 0x00000008, " ", 0x00000001, 0x00000006
+ test1 suc, ".w0", " ", 0x00108000, " ", 0x00009000, 0x0000f000
+ test1 sub, ".w0", " ", 0x00000000, " ", 0x00000001, 0x0000ffff
+ test1 suc, ".w0", " ", 0x00008000, " ", 0x00009000, 0x0000efff
+ # Test when intermediate value sets the borrow.
+ test1 sub, ".w0", " ", 0x00010000, " ", 0x00000000, 0x00000000
+ test1 suc, ".w0", " ", 0x00000002, " ", 0x00000000, 0x00000001
+
+ # ***** SUB 16-bit dst, 16-bit src *****
+ test1 sub, ".w0", ".w0", 0x00000000, ".w0", 0x00000000, 0x00000000
+ test1 suc, ".w0", ".w0", 0x00000010, ".w0", 0x00000001, 0x0000000f
+ test1 suc, ".w0", ".w0", 0x00000008, ".w0", 0x00000009, 0x0000ffff
+ test1 suc, ".w0", ".w0", 0x00000008, ".w0", 0x00000009, 0x0000fffe
+ test1 suc, ".w0", ".w0", 0x00000008, ".w0", 0x00000001, 0x00000006
+ test1 suc, ".w0", ".w0", 0x00108000, ".w0", 0x00009000, 0x0000f000
+ test1 sub, ".w0", ".w0", 0x00000000, ".w0", 0x00000001, 0x0000ffff
+ test1 suc, ".w0", ".w0", 0x00008000, ".w0", 0x00009000, 0x0000efff
+
+ # ***** SUB 16-bit dst, 8-bit src *****
+ test1 sub, ".w0", ".b0", 0x00000000, ".b0", 0x00000000, 0x00000000
+ test1 suc, ".w0", ".b0", 0x00000010, ".b0", 0x00000001, 0x0000000f
+ test1 suc, ".w0", ".b0", 0x00000008, ".b0", 0x00000009, 0x0000ffff
+ test1 suc, ".w0", ".b0", 0x00000008, ".b0", 0x00000009, 0x0000fffe
+ test1 suc, ".w0", ".b0", 0x00000008, ".b0", 0x00000001, 0x00000006
+ test1 suc, ".w0", ".b0", 0x00108080, ".b0", 0x00009090, 0x0000fff0
+ test1 sub, ".w0", ".b0", 0x00000000, ".b0", 0x00000001, 0x0000ffff
+ test1 suc, ".w0", ".b0", 0x0000a080, ".b0", 0x0000c090, 0x0000ffef
+
+ # ***** SUB 8-bit dst, 32-bit src *****
+ test1 sub, ".b0", " ", 0x00000000, " ", 0x00000000, 0x00000000
+ test1 suc, ".b0", " ", 0x00000010, " ", 0x00000001, 0x0000000f
+ test1 suc, ".b0", " ", 0x00000008, " ", 0x00000009, 0x000000ff
+ test1 suc, ".b0", " ", 0x00000008, " ", 0x00000009, 0x000000fe
+ test1 suc, ".b0", " ", 0x00000008, " ", 0x00000001, 0x00000006
+ test1 suc, ".b0", " ", 0x00000080, " ", 0x00000090, 0x000000f0
+ test1 sub, ".b0", " ", 0x00000000, " ", 0x00000001, 0x000000ff
+ test1 suc, ".b0", " ", 0x00000080, " ", 0x00000090, 0x000000ef
+ # Test when intermediate value sets the borrow.
+ test1 sub, ".b0", " ", 0x00000100, " ", 0x00000000, 0x00000000
+ test1 suc, ".b0", " ", 0x00000002, " ", 0x00000000, 0x00000001
+ test1 sub, ".b0", " ", 0x00000100, " ", 0x00000000, 0x00000000
+ test1 rsc, ".b0", " ", 0x00000000, " ", 0x00000002, 0x00000001
+
+ # ***** SUB 8-bit dst, 16-bit src *****
+ test1 sub, ".b0", ".w0", 0x00000000, ".w0", 0x00000000, 0x00000000
+ test1 suc, ".b0", ".w0", 0x00000010, ".w0", 0x00000001, 0x0000000f
+ test1 suc, ".b0", ".w0", 0x00000008, ".w0", 0x00000009, 0x000000ff
+ test1 suc, ".b0", ".w0", 0x00000008, ".w0", 0x00000009, 0x000000fe
+ test1 suc, ".b0", ".w0", 0x00000008, ".w0", 0x00000001, 0x00000006
+ test1 suc, ".b0", ".w0", 0x00000080, ".w0", 0x00000090, 0x000000f0
+ test1 sub, ".b0", ".w0", 0x00000000, ".w0", 0x00000001, 0x000000ff
+ test1 suc, ".b0", ".w0", 0x00000080, ".w0", 0x00000090, 0x000000ef
+ # Test when intermediate value sets the borrow.
+ test1 sub, ".b0", ".w0", 0x00000100, ".w0", 0x00000000, 0x00000000
+ test1 suc, ".b0", ".w0", 0x00000002, ".w0", 0x00000000, 0x00000001
+ test1 sub, ".b0", ".w0", 0x00000100, ".w0", 0x00000000, 0x00000000
+ test1 rsc, ".b0", ".w0", 0x00000000, ".w0", 0x00000002, 0x00000001
+
+ # ***** SUB 8-bit dst, 8-bit src *****
+ test1 sub, ".b0", ".w0", 0x00000000, ".w0", 0x00000000, 0x00000000
+ test1 suc, ".b0", ".w0", 0x00000010, ".w0", 0x00000001, 0x0000000f
+ test1 suc, ".b0", ".w0", 0x00000008, ".w0", 0x00000009, 0x000000ff
+ test1 suc, ".b0", ".w0", 0x00000008, ".w0", 0x00000009, 0x000000fe
+ test1 suc, ".b0", ".w0", 0x00000008, ".w0", 0x00000001, 0x00000006
+ test1 suc, ".b0", ".w0", 0x00000080, ".w0", 0x00000090, 0x000000f0
+ test1 sub, ".b0", ".w0", 0x00000000, ".w0", 0x00000001, 0x000000ff
+ test1 suc, ".b0", ".w0", 0x00000080, ".w0", 0x00000090, 0x000000ef
+
+ # ***** Reverse SUB 32-bit dst, 32-bit src *****
+ # {rsb, clear borrow}
+ test1 rsb, " ", " ", 0x00000000, " ", 0x00000000, 0x00000000
+ # {rsb with borrow=0, clear borrow}
+ test1 rsc, " ", " ", 0x00000001, " ", 0x00000010, 0x0000000f
+ # {rsb with borrow=0, set borrow}
+ test1 rsc, " ", " ", 0x00000009, " ", 0x00000008, 0xffffffff
+ # {rsb with borrow=1, set borrow}
+ test1 rsc, " ", " ", 0x00000009, " ", 0x00000008, 0xfffffffe
+ # {rsb with borrow=1, clear borrow}
+ test1 rsc, " ", " ", 0x00000001, " ", 0x00000008, 0x00000006
+ # {rsb with borrow=0, set borrow}
+ test1 rsc, " ", " ", 0x90000000, " ", 0x80000000, 0xf0000000
+ # {rsb, set borrow}
+ test1 rsb, " ", " ", 0x00000001, " ", 0x00000000, 0xffffffff
+ # {rsb with borrow=1, set borrow}
+ test1 rsc, " ", " ", 0x90000000, " ", 0x80000000, 0xefffffff
+
+ # ***** Reverse SUB 32-bit dst, 16-bit src *****
+ test1 rsb, " ", ".w0", 0x00000000, ".w0", 0x00000000, 0x00000000
+ test1 rsc, " ", ".w0", 0x00000001, ".w0", 0x00000010, 0x0000000f
+ test1 rsc, " ", ".w0", 0x00000009, ".w0", 0x00000008, 0xffffffff
+ test1 rsc, " ", ".w0", 0x00000009, ".w0", 0x00000008, 0xfffffffe
+ test1 rsc, " ", ".w0", 0x00000001, ".w0", 0x00000008, 0x00000006
+ test1 rsc, " ", ".w0", 0x00109000, ".w0", 0x00008000, 0xfffff000
+ test1 rsb, " ", ".w0", 0x00000001, ".w0", 0x00000000, 0xffffffff
+ test1 rsc, " ", ".w0", 0x00009000, ".w0", 0x00008000, 0xffffefff
+
+ # ***** Reverse SUB 32-bit dst, 8-bit src *****
+ test1 rsb, " ", ".b0", 0x00000000, ".b0", 0x00000000, 0x00000000
+ test1 rsc, " ", ".b0", 0x00000001, ".b0", 0x00000010, 0x0000000f
+ test1 rsc, " ", ".b0", 0x00000009, ".b0", 0x00000008, 0xffffffff
+ test1 rsc, " ", ".b0", 0x00000009, ".b0", 0x00000008, 0xfffffffe
+ test1 rsc, " ", ".b0", 0x00000001, ".b0", 0x00000008, 0x00000006
+ test1 rsc, " ", ".b0", 0x00108090, ".b0", 0x00009080, 0xfffffff0
+ test1 rsb, " ", ".b0", 0x00000001, ".b0", 0x00000000, 0xffffffff
+ test1 rsc, " ", ".b0", 0x00008090, ".b0", 0x00009080, 0xffffffef
+
+ # ***** Reverse SUB 16-bit dst, 32-bit src *****
+ test1 rsb, ".w0", " ", 0x00000000, " ", 0x00000000, 0x00000000
+ test1 rsc, ".w0", " ", 0x00000001, " ", 0x00000010, 0x0000000f
+ test1 rsc, ".w0", " ", 0x00000009, " ", 0x00000008, 0x0000ffff
+ test1 rsc, ".w0", " ", 0x00000009, " ", 0x00000008, 0x0000fffe
+ test1 rsc, ".w0", " ", 0x00000001, " ", 0x00000008, 0x00000006
+ test1 rsc, ".w0", " ", 0x00109000, " ", 0x00008000, 0x0000f000
+ test1 rsb, ".w0", " ", 0x00000001, " ", 0x00000000, 0x0000ffff
+ test1 rsc, ".w0", " ", 0x00009000, " ", 0x00008000, 0x0000efff
+ # Test when intermediate value sets the borrow.
+ test1 rsb, ".w0", " ", 0x00000000, " ", 0x00010000, 0x00000000
+ test1 rsc, ".w0", " ", 0x00000000, " ", 0x00000002, 0x00000001
+
+ # ***** Reverse SUB 16-bit dst, 16-bit src *****
+ test1 rsb, ".w0", ".w0", 0x00000000, ".w0", 0x00000000, 0x00000000
+ test1 rsc, ".w0", ".w0", 0x00000001, ".w0", 0x00000010, 0x0000000f
+ test1 rsc, ".w0", ".w0", 0x00000009, ".w0", 0x00000008, 0x0000ffff
+ test1 rsc, ".w0", ".w0", 0x00000009, ".w0", 0x00000008, 0x0000fffe
+ test1 rsc, ".w0", ".w0", 0x00000001, ".w0", 0x00000008, 0x00000006
+ test1 rsc, ".w0", ".w0", 0x00109000, ".w0", 0x00008000, 0x0000f000
+ test1 rsb, ".w0", ".w0", 0x00000001, ".w0", 0x00000000, 0x0000ffff
+ test1 rsc, ".w0", ".w0", 0x00009000, ".w0", 0x00008000, 0x0000efff
+
+ # ***** Reverse SUB 16-bit dst, 8-bit src *****
+ test1 rsb, ".w0", ".b0", 0x00000000, ".b0", 0x00000000, 0x00000000
+ test1 rsc, ".w0", ".b0", 0x00000001, ".b0", 0x00000010, 0x0000000f
+ test1 rsc, ".w0", ".b0", 0x00000009, ".b0", 0x00000008, 0x0000ffff
+ test1 rsc, ".w0", ".b0", 0x00000009, ".b0", 0x00000008, 0x0000fffe
+ test1 rsc, ".w0", ".b0", 0x00000001, ".b0", 0x00000008, 0x00000006
+ test1 rsc, ".w0", ".b0", 0x00108090, ".b0", 0x00009080, 0x0000fff0
+ test1 rsb, ".w0", ".b0", 0x00000001, ".b0", 0x00000000, 0x0000ffff
+ test1 rsc, ".w0", ".b0", 0x0000a090, ".b0", 0x0000c080, 0x0000ffef
+
+ # ***** Reverse SUB 8-bit dst, 32-bit src *****
+ test1 rsb, ".b0", " ", 0x00000000, " ", 0x00000000, 0x00000000
+ test1 rsc, ".b0", " ", 0x00000001, " ", 0x00000010, 0x0000000f
+ test1 rsc, ".b0", " ", 0x00000009, " ", 0x00000008, 0x000000ff
+ test1 rsc, ".b0", " ", 0x00000009, " ", 0x00000008, 0x000000fe
+ test1 rsc, ".b0", " ", 0x00000001, " ", 0x00000008, 0x00000006
+ test1 rsc, ".b0", " ", 0x00000090, " ", 0x00000080, 0x000000f0
+ test1 rsb, ".b0", " ", 0x00000001, " ", 0x00000000, 0x000000ff
+ test1 rsc, ".b0", " ", 0x00000090, " ", 0x00000080, 0x000000ef
+ # Test when intermediate value sets the borrow.
+ test1 rsb, ".b0", " ", 0x00000000, " ", 0x00000100, 0x00000000
+ test1 rsc, ".b0", " ", 0x00000000, " ", 0x00000002, 0x00000001
+ test1 rsb, ".b0", " ", 0x00000000, " ", 0x00000100, 0x00000000
+ test1 suc, ".b0", " ", 0x00000002, " ", 0x00000000, 0x00000001
+
+ # ***** Reverse SUB 8-bit dst, 16-bit src *****
+ test1 rsb, ".b0", ".w0", 0x00000000, ".w0", 0x00000000, 0x00000000
+ test1 rsc, ".b0", ".w0", 0x00000001, ".w0", 0x00000010, 0x0000000f
+ test1 rsc, ".b0", ".w0", 0x00000009, ".w0", 0x00000008, 0x000000ff
+ test1 rsc, ".b0", ".w0", 0x00000009, ".w0", 0x00000008, 0x000000fe
+ test1 rsc, ".b0", ".w0", 0x00000001, ".w0", 0x00000008, 0x00000006
+ test1 rsc, ".b0", ".w0", 0x00000090, ".w0", 0x00000080, 0x000000f0
+ test1 rsb, ".b0", ".w0", 0x00000001, ".w0", 0x00000000, 0x000000ff
+ test1 rsc, ".b0", ".w0", 0x00000090, ".w0", 0x00000080, 0x000000ef
+ # Test when intermediate value sets the borrow.
+ test1 rsb, ".b0", ".w0", 0x00000000, ".w0", 0x00000100, 0x00000000
+ test1 rsc, ".b0", ".w0", 0x00000000, ".w0", 0x00000002, 0x00000001
+ test1 rsb, ".b0", ".w0", 0x00000000, ".w0", 0x00000100, 0x00000000
+ test1 suc, ".b0", ".w0", 0x00000002, ".w0", 0x00000000, 0x00000001
+
+ # ***** Reverse SUB 8-bit dst, 8-bit src *****
+ test1 rsb, ".b0", ".w0", 0x00000000, ".w0", 0x00000000, 0x00000000
+ test1 rsc, ".b0", ".w0", 0x00000001, ".w0", 0x00000010, 0x0000000f
+ test1 rsc, ".b0", ".w0", 0x00000009, ".w0", 0x00000008, 0x000000ff
+ test1 rsc, ".b0", ".w0", 0x00000009, ".w0", 0x00000008, 0x000000fe
+ test1 rsc, ".b0", ".w0", 0x00000001, ".w0", 0x00000008, 0x00000006
+ test1 rsc, ".b0", ".w0", 0x00000090, ".w0", 0x00000080, 0x000000f0
+ test1 rsb, ".b0", ".w0", 0x00000001, ".w0", 0x00000000, 0x000000ff
+ test1 rsc, ".b0", ".w0", 0x00000090, ".w0", 0x00000080, 0x000000ef
+
+ # ***** Mixed 32-bit *****
+ test1 sub, " ", " ", 0x00000000, " ", 0x00000000, 0x00000000
+ test1 adc, " ", " ", 0x00000000, " ", 0x00000000, 0x00000001
+ test1 suc, " ", " ", 0x00000001, " ", 0x00000001, 0xffffffff
+ test1 adc, " ", " ", 0x00000001, " ", 0x00000000, 0x00000001
+
+ test_seq "", "", 0xffffffff, 0x00000001, 0x00000000, 0x00000000 add, suc, add, 0x00000000
+ test_seq "", "", 0xffffffff, 0x00000001, 0x00000000, 0x00000000 add, rsc, add, 0x00000000
+ test_seq "", "", 0xfffffffe, 0x00000001, 0x00000000, 0x00000000 add, suc, add, 0xfffffffe
+ test_seq "", "", 0xffffffff, 0x00000001, 0x00000000, 0x00000000 add, suc, adc, 0x00000001
+ test_seq "", "", 0xfffffffe, 0x00000001, 0x00000000, 0x00000000 add, suc, adc, 0xffffffff
+
+ test_seq "", "", 0xffffffff, 0x00000010, 0x00000000, 0x00000000 sub, adc, add, 0xfffffff0
+ test_seq "", "", 0x0fffffff, 0x00000010, 0x00000000, 0x00000000 sub, adc, add, 0x0ffffff0
+ test_seq "", "", 0x00000000, 0x00000010, 0x00000000, 0x00000000 sub, adc, add, 0xfffffff0
+ test_seq "", "", 0x00000000, 0x00000010, 0x00000000, 0x00000000 sub, adc, adc, 0xfffffff0
+ test_seq "", "", 0x00000000, 0x00000010, 0x00000000, 0x00000000 sub, adc, suc, 0xffffffef
+
+
+ # For coverage, also test sequences of ALU instructions
+ # (i.e. no other instructions in between).
+ test_seq "", "", 0x00000000, 0x00000000, 0x00000000, 0x00000000 add, adc, adc, 0x00000000
+ test_seq "", "", 0x80000000, 0xfffffff0, 0xc0000000, 0x0000001a add, adc, adc, 0x4000000c
+ test_seq "", ".b0", 0x00000000, 0x00000001, 0x000000ff, 0x00000000 add, adc, adc, 0x00000001
+ test_seq "", ".b0", 0x00000000, 0x00000001, 0x000000ff, 0x00000000 add, adc, adc, 0x00000001
+ test_seq ".b0", ".b0", 0x00000000, 0x00000001, 0x00000000, 0x0000ffff add, adc, adc, 0x00000000
+ test_seq ".b0", ".w0", 0x00000001, 0x00000020, 0x00000400, 0x00008000 add, adc, adc, 0x00000021
+ test_seq "", "", 0x00000010, 0x0000000f, 0x00000002, 0x00000020 sub, suc, suc, 0xffffffde
+ test_seq "", ".b0", 0x00000202, 0x00000000, 0x00000000, 0x00000000 sub, suc, suc, 0x00000002
+ test_seq ".w0", ".b0", 0x00000008, 0x00000000, 0x00000000, 0x00000000, sub, suc, suc, 0x00000008
+ test_seq ".w0", ".b0", 0x00000008, 0x000000ff, 0x000000ff, 0x000000ff, sub, suc, suc, 0x00000009
+ test_seq ".w0", ".b0", 0x00000008, 0x00000fff, 0x00000fff, 0x00000fff, sub, suc, suc, 0x0000000b
+ test_seq "", "", 0x0000000f, 0x00000010, 0x00000002, 0x00000020 rsb, suc, suc, 0xffffffde
+ test_seq "", "", 0xffffffff, 0x00000001, 0x00000000, 0x00000000 add, suc, adc, 0x00000001
+ test_seq "", "", 0x00000000, 0x00000010, 0x00000000, 0x00000000 sub, adc, adc, 0xfffffff0
+ test_seq "", "", 0x00000000, 0x00000010, 0x00000000, 0x00000000 sub, adc, suc, 0xffffffef
+
+ pass
+EXIT_FAIL:
+ fail