Fix register trace involving sp and xzr (#59)
Tracing register updates for ldp instructions that use both xzr and sp would
not print the updated stack address. This was visible when popping from the
stack into xzr, to discard an entry. Fix this and update the trace tests.
diff --git a/src/aarch64/decoder-visitor-map-aarch64.h b/src/aarch64/decoder-visitor-map-aarch64.h
index 58ab316..8ae438c 100644
--- a/src/aarch64/decoder-visitor-map-aarch64.h
+++ b/src/aarch64/decoder-visitor-map-aarch64.h
@@ -2643,7 +2643,7 @@
{"bfdot_asimdelem_e"_h, &VISITORCLASS::VisitUnimplemented}, \
{"bfdot_asimdsame2_d"_h, &VISITORCLASS::VisitUnimplemented}, \
{"bfmlal_asimdelem_f"_h, &VISITORCLASS::VisitUnimplemented}, \
- {"bfmlal_asimdsame2_f"_h, &VISITORCLASS::VisitUnimplemented}, \
+ {"bfmlal_asimdsame2_f"_h, &VISITORCLASS::VisitUnimplemented}, \
{"bfmmla_asimdsame2_e"_h, &VISITORCLASS::VisitUnimplemented}, \
{"dsb_bon_barriers"_h, &VISITORCLASS::VisitUnimplemented}, \
{"eor3_vvv16_crypto4"_h, &VISITORCLASS::VisitUnimplemented}, \
@@ -2689,13 +2689,13 @@
{"xar_vvv2_crypto3_imm6"_h, &VISITORCLASS::VisitUnimplemented}, \
{"bfcvt_z_p_z_s2bf"_h, &VISITORCLASS::VisitUnimplemented}, \
{"bfcvtnt_z_p_z_s2bf"_h, &VISITORCLASS::VisitUnimplemented}, \
- {"bfdot_z_zzz"_h, &VISITORCLASS::VisitUnimplemented}, \
- {"bfdot_z_zzzi"_h, &VISITORCLASS::VisitUnimplemented}, \
- {"bfmlalb_z_zzz"_h, &VISITORCLASS::VisitUnimplemented}, \
- {"bfmlalb_z_zzzi"_h, &VISITORCLASS::VisitUnimplemented}, \
- {"bfmlalt_z_zzz"_h, &VISITORCLASS::VisitUnimplemented}, \
- {"bfmlalt_z_zzzi"_h, &VISITORCLASS::VisitUnimplemented}, \
- {"bfmmla_z_zzz"_h, &VISITORCLASS::VisitUnimplemented}, { \
+ {"bfdot_z_zzz"_h, &VISITORCLASS::VisitUnimplemented}, \
+ {"bfdot_z_zzzi"_h, &VISITORCLASS::VisitUnimplemented}, \
+ {"bfmlalb_z_zzz"_h, &VISITORCLASS::VisitUnimplemented}, \
+ {"bfmlalb_z_zzzi"_h, &VISITORCLASS::VisitUnimplemented}, \
+ {"bfmlalt_z_zzz"_h, &VISITORCLASS::VisitUnimplemented}, \
+ {"bfmlalt_z_zzzi"_h, &VISITORCLASS::VisitUnimplemented}, \
+ {"bfmmla_z_zzz"_h, &VISITORCLASS::VisitUnimplemented}, { \
"unallocated"_h, &VISITORCLASS::VisitUnallocated \
}
diff --git a/src/aarch64/simulator-aarch64.cc b/src/aarch64/simulator-aarch64.cc
index 0a7f008..1830eb4 100644
--- a/src/aarch64/simulator-aarch64.cc
+++ b/src/aarch64/simulator-aarch64.cc
@@ -1753,7 +1753,9 @@
VIXL_ASSERT(GetPrintRegLaneCount(format) == 1);
VIXL_ASSERT((strcmp(op, "->") == 0) || (strcmp(op, "<-") == 0));
if ((format & kPrintRegPartial) == 0) {
- registers_[code].NotifyRegisterLogged();
+ if (code != kZeroRegCode) {
+ registers_[code].NotifyRegisterLogged();
+ }
}
// Scalar-format accesses use a simple format:
// "# {reg}: 0x{value} -> {address}"
@@ -1985,7 +1987,9 @@
PrintRegisterFormat format,
uintptr_t address) {
VIXL_ASSERT(GetPrintRegLaneCount(format) == 1);
- registers_[rt_code].NotifyRegisterLogged();
+ if (rt_code != kZeroRegCode) {
+ registers_[rt_code].NotifyRegisterLogged();
+ }
PrintAccess(rt_code, format, "<-", address);
}
@@ -2004,7 +2008,9 @@
// For sign- and zero-extension, make it clear that the resulting register
// value is different from what is loaded from memory.
VIXL_ASSERT(GetPrintRegLaneCount(format) == 1);
- registers_[rt_code].NotifyRegisterLogged();
+ if (rt_code != kZeroRegCode) {
+ registers_[rt_code].NotifyRegisterLogged();
+ }
PrintRegister(rt_code, format);
PrintPartialAccess(1,
0,
@@ -2030,7 +2036,9 @@
// value, only print the relevant part of the value.
format = GetPrintRegPartial(format);
VIXL_ASSERT(GetPrintRegLaneCount(format) == 1);
- registers_[rt_code].NotifyRegisterLogged();
+ if (rt_code != kZeroRegCode) {
+ registers_[rt_code].NotifyRegisterLogged();
+ }
PrintAccess(rt_code, format, "->", address);
}
diff --git a/test/aarch64/test-trace-aarch64.cc b/test/aarch64/test-trace-aarch64.cc
index 27e71d5..1eb7010 100644
--- a/test/aarch64/test-trace-aarch64.cc
+++ b/test/aarch64/test-trace-aarch64.cc
@@ -371,6 +371,16 @@
__ uxtw(w8, w9);
__ uxtw(x10, x11);
+ // Regression tests.
+ __ stp(x10, xzr, MemOperand(sp, -16, PreIndex));
+ __ ldp(x10, xzr, MemOperand(sp, 16, PostIndex));
+ __ str(xzr, MemOperand(sp, -16, PreIndex));
+ __ ldrsb(xzr, MemOperand(sp, 16, PostIndex));
+ __ str(xzr, MemOperand(sp, -16, PreIndex));
+ __ ldrsh(xzr, MemOperand(sp, 16, PostIndex));
+ __ str(xzr, MemOperand(sp, -16, PreIndex));
+ __ ldrsw(xzr, MemOperand(sp, 16, PostIndex));
+
// Branch tests.
{
Label end;
diff --git a/test/test-trace-reference/log-all b/test/test-trace-reference/log-all
index 9e9904a..948a13f 100644
--- a/test/test-trace-reference/log-all
+++ b/test/test-trace-reference/log-all
@@ -1034,6 +1034,35 @@
# w8: 0x00000001
0x~~~~~~~~~~~~~~~~ d3407d6a ubfx x10, x11, #0, #32
# x10: 0x0000000000000000
+0x~~~~~~~~~~~~~~~~ a9bf7fea stp x10, xzr, [sp, #-16]!
+# sp: 0x~~~~~~~~~~~~~~~~
+# x10<63:0>: 0x0000000000000000 -> 0x~~~~~~~~~~~~~~~~
+# xzr<63:0>: 0x0000000000000000 -> 0x~~~~~~~~~~~~~~~~
+0x~~~~~~~~~~~~~~~~ a8c17fea ldp x10, xzr, [sp], #16
+# x10: 0x0000000000000000 <- 0x~~~~~~~~~~~~~~~~
+# xzr: 0x0000000000000000 <- 0x~~~~~~~~~~~~~~~~
+# sp: 0x~~~~~~~~~~~~~~~~
+0x~~~~~~~~~~~~~~~~ f81f0fff str xzr, [sp, #-16]!
+# sp: 0x~~~~~~~~~~~~~~~~
+# xzr<63:0>: 0x0000000000000000 -> 0x~~~~~~~~~~~~~~~~
+0x~~~~~~~~~~~~~~~~ 388107ff ldrsb xzr, [sp], #16
+# xzr: 0x0000000000000000
+# ╙─ 0x00 <- 0x~~~~~~~~~~~~~~~~
+# sp: 0x~~~~~~~~~~~~~~~~
+0x~~~~~~~~~~~~~~~~ f81f0fff str xzr, [sp, #-16]!
+# sp: 0x~~~~~~~~~~~~~~~~
+# xzr<63:0>: 0x0000000000000000 -> 0x~~~~~~~~~~~~~~~~
+0x~~~~~~~~~~~~~~~~ 788107ff ldrsh xzr, [sp], #16
+# xzr: 0x0000000000000000
+# ╙─ 0x0000 <- 0x~~~~~~~~~~~~~~~~
+# sp: 0x~~~~~~~~~~~~~~~~
+0x~~~~~~~~~~~~~~~~ f81f0fff str xzr, [sp, #-16]!
+# sp: 0x~~~~~~~~~~~~~~~~
+# xzr<63:0>: 0x0000000000000000 -> 0x~~~~~~~~~~~~~~~~
+0x~~~~~~~~~~~~~~~~ b88107ff ldrsw xzr, [sp], #16
+# xzr: 0x0000000000000000
+# ╙─ 0x00000000 <- 0x~~~~~~~~~~~~~~~~
+# sp: 0x~~~~~~~~~~~~~~~~
0x~~~~~~~~~~~~~~~~ 14000001 b #+0x4 (addr 0x~~~~~~~~~~~~~~~~)
# Branch to 0x~~~~~~~~~~~~~~~~.
0x~~~~~~~~~~~~~~~~ eb030063 subs x3, x3, x3
diff --git a/test/test-trace-reference/log-all-colour b/test/test-trace-reference/log-all-colour
index bf5ec20..31a0790 100644
--- a/test/test-trace-reference/log-all-colour
+++ b/test/test-trace-reference/log-all-colour
@@ -1034,6 +1034,35 @@
# [1;36m w8: [0;36m 0x00000001[0;m
0x~~~~~~~~~~~~~~~~ d3407d6a ubfx x10, x11, #0, #32
# [1;36m x10: [0;36m0x0000000000000000[0;m
+0x~~~~~~~~~~~~~~~~ a9bf7fea stp x10, xzr, [sp, #-16]!
+# [1;36m sp: [0;36m0x~~~~~~~~~~~~~~~~[0;m
+# [1;36m x10<63:0>: [0;36m0x0000000000000000[0;m -> [1;34m0x~~~~~~~~~~~~~~~~[0;m
+# [1;36m xzr<63:0>: [0;36m0x0000000000000000[0;m -> [1;34m0x~~~~~~~~~~~~~~~~[0;m
+0x~~~~~~~~~~~~~~~~ a8c17fea ldp x10, xzr, [sp], #16
+# [1;36m x10: [0;36m0x0000000000000000[0;m <- [1;34m0x~~~~~~~~~~~~~~~~[0;m
+# [1;36m xzr: [0;36m0x0000000000000000[0;m <- [1;34m0x~~~~~~~~~~~~~~~~[0;m
+# [1;36m sp: [0;36m0x~~~~~~~~~~~~~~~~[0;m
+0x~~~~~~~~~~~~~~~~ f81f0fff str xzr, [sp, #-16]!
+# [1;36m sp: [0;36m0x~~~~~~~~~~~~~~~~[0;m
+# [1;36m xzr<63:0>: [0;36m0x0000000000000000[0;m -> [1;34m0x~~~~~~~~~~~~~~~~[0;m
+0x~~~~~~~~~~~~~~~~ 388107ff ldrsb xzr, [sp], #16
+# [1;36m xzr: [0;36m0x0000000000000000[0;m
+# ╙─ 0x00 <- [1;34m0x~~~~~~~~~~~~~~~~[0;m
+# [1;36m sp: [0;36m0x~~~~~~~~~~~~~~~~[0;m
+0x~~~~~~~~~~~~~~~~ f81f0fff str xzr, [sp, #-16]!
+# [1;36m sp: [0;36m0x~~~~~~~~~~~~~~~~[0;m
+# [1;36m xzr<63:0>: [0;36m0x0000000000000000[0;m -> [1;34m0x~~~~~~~~~~~~~~~~[0;m
+0x~~~~~~~~~~~~~~~~ 788107ff ldrsh xzr, [sp], #16
+# [1;36m xzr: [0;36m0x0000000000000000[0;m
+# ╙─ 0x0000 <- [1;34m0x~~~~~~~~~~~~~~~~[0;m
+# [1;36m sp: [0;36m0x~~~~~~~~~~~~~~~~[0;m
+0x~~~~~~~~~~~~~~~~ f81f0fff str xzr, [sp, #-16]!
+# [1;36m sp: [0;36m0x~~~~~~~~~~~~~~~~[0;m
+# [1;36m xzr<63:0>: [0;36m0x0000000000000000[0;m -> [1;34m0x~~~~~~~~~~~~~~~~[0;m
+0x~~~~~~~~~~~~~~~~ b88107ff ldrsw xzr, [sp], #16
+# [1;36m xzr: [0;36m0x0000000000000000[0;m
+# ╙─ 0x00000000 <- [1;34m0x~~~~~~~~~~~~~~~~[0;m
+# [1;36m sp: [0;36m0x~~~~~~~~~~~~~~~~[0;m
0x~~~~~~~~~~~~~~~~ 14000001 b #+0x4 (addr 0x~~~~~~~~~~~~~~~~)
# [0;30m[43mBranch[0;m to 0x~~~~~~~~~~~~~~~~.
0x~~~~~~~~~~~~~~~~ eb030063 subs x3, x3, x3
diff --git a/test/test-trace-reference/log-branch b/test/test-trace-reference/log-branch
index 0491d50..f1096e6 100644
--- a/test/test-trace-reference/log-branch
+++ b/test/test-trace-reference/log-branch
@@ -44,6 +44,11 @@
# x3<7:0>: 0xff -> 0x~~~~~~~~~~~~~~~~
# x4<15:0>: 0x0001 -> 0x~~~~~~~~~~~~~~~~
# x5<15:0>: 0x8500 -> 0x~~~~~~~~~~~~~~~~
+# x10<63:0>: 0x0000000000000000 -> 0x~~~~~~~~~~~~~~~~
+# xzr<63:0>: 0x0000000000000000 -> 0x~~~~~~~~~~~~~~~~
+# xzr<63:0>: 0x0000000000000000 -> 0x~~~~~~~~~~~~~~~~
+# xzr<63:0>: 0x0000000000000000 -> 0x~~~~~~~~~~~~~~~~
+# xzr<63:0>: 0x0000000000000000 -> 0x~~~~~~~~~~~~~~~~
# v21<127:0>: 0x000000000000000000000000ffff8007
# ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ╙─ 0x07 -> 0x~~~~~~~~~~~~~~~~
# ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ╙─── 0x80 -> 0x~~~~~~~~~~~~~~~~
diff --git a/test/test-trace-reference/log-branch-colour b/test/test-trace-reference/log-branch-colour
index 7caf1a4..8a43844 100644
--- a/test/test-trace-reference/log-branch-colour
+++ b/test/test-trace-reference/log-branch-colour
@@ -44,6 +44,11 @@
# [1;36m x3<7:0>: [0;36m 0xff[0;m -> [1;34m0x~~~~~~~~~~~~~~~~[0;m
# [1;36m x4<15:0>: [0;36m 0x0001[0;m -> [1;34m0x~~~~~~~~~~~~~~~~[0;m
# [1;36m x5<15:0>: [0;36m 0x8500[0;m -> [1;34m0x~~~~~~~~~~~~~~~~[0;m
+# [1;36m x10<63:0>: [0;36m0x0000000000000000[0;m -> [1;34m0x~~~~~~~~~~~~~~~~[0;m
+# [1;36m xzr<63:0>: [0;36m0x0000000000000000[0;m -> [1;34m0x~~~~~~~~~~~~~~~~[0;m
+# [1;36m xzr<63:0>: [0;36m0x0000000000000000[0;m -> [1;34m0x~~~~~~~~~~~~~~~~[0;m
+# [1;36m xzr<63:0>: [0;36m0x0000000000000000[0;m -> [1;34m0x~~~~~~~~~~~~~~~~[0;m
+# [1;36m xzr<63:0>: [0;36m0x0000000000000000[0;m -> [1;34m0x~~~~~~~~~~~~~~~~[0;m
# [1;35m v21<127:0>: [0;35m0x000000000000000000000000ffff8007[0;m
# ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ╙─ 0x07 -> [1;34m0x~~~~~~~~~~~~~~~~[0;m
# ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ╙─── 0x80 -> [1;34m0x~~~~~~~~~~~~~~~~[0;m
diff --git a/test/test-trace-reference/log-cpufeatures b/test/test-trace-reference/log-cpufeatures
index 795d358..0b24590 100644
--- a/test/test-trace-reference/log-cpufeatures
+++ b/test/test-trace-reference/log-cpufeatures
@@ -314,6 +314,14 @@
0x~~~~~~~~~~~~~~~~ d3403ce6 uxth x6, w7
0x~~~~~~~~~~~~~~~~ 53007d28 lsr w8, w9, #0
0x~~~~~~~~~~~~~~~~ d3407d6a ubfx x10, x11, #0, #32
+0x~~~~~~~~~~~~~~~~ a9bf7fea stp x10, xzr, [sp, #-16]!
+0x~~~~~~~~~~~~~~~~ a8c17fea ldp x10, xzr, [sp], #16
+0x~~~~~~~~~~~~~~~~ f81f0fff str xzr, [sp, #-16]!
+0x~~~~~~~~~~~~~~~~ 388107ff ldrsb xzr, [sp], #16
+0x~~~~~~~~~~~~~~~~ f81f0fff str xzr, [sp, #-16]!
+0x~~~~~~~~~~~~~~~~ 788107ff ldrsh xzr, [sp], #16
+0x~~~~~~~~~~~~~~~~ f81f0fff str xzr, [sp, #-16]!
+0x~~~~~~~~~~~~~~~~ b88107ff ldrsw xzr, [sp], #16
0x~~~~~~~~~~~~~~~~ 14000001 b #+0x4 (addr 0x~~~~~~~~~~~~~~~~)
0x~~~~~~~~~~~~~~~~ eb030063 subs x3, x3, x3
0x~~~~~~~~~~~~~~~~ 54000061 b.ne #+0xc (addr 0x~~~~~~~~~~~~~~~~)
diff --git a/test/test-trace-reference/log-cpufeatures-colour b/test/test-trace-reference/log-cpufeatures-colour
index 170f34d..dcbe4d8 100644
--- a/test/test-trace-reference/log-cpufeatures-colour
+++ b/test/test-trace-reference/log-cpufeatures-colour
@@ -314,6 +314,14 @@
0x~~~~~~~~~~~~~~~~ d3403ce6 uxth x6, w7
0x~~~~~~~~~~~~~~~~ 53007d28 lsr w8, w9, #0
0x~~~~~~~~~~~~~~~~ d3407d6a ubfx x10, x11, #0, #32
+0x~~~~~~~~~~~~~~~~ a9bf7fea stp x10, xzr, [sp, #-16]!
+0x~~~~~~~~~~~~~~~~ a8c17fea ldp x10, xzr, [sp], #16
+0x~~~~~~~~~~~~~~~~ f81f0fff str xzr, [sp, #-16]!
+0x~~~~~~~~~~~~~~~~ 388107ff ldrsb xzr, [sp], #16
+0x~~~~~~~~~~~~~~~~ f81f0fff str xzr, [sp, #-16]!
+0x~~~~~~~~~~~~~~~~ 788107ff ldrsh xzr, [sp], #16
+0x~~~~~~~~~~~~~~~~ f81f0fff str xzr, [sp, #-16]!
+0x~~~~~~~~~~~~~~~~ b88107ff ldrsw xzr, [sp], #16
0x~~~~~~~~~~~~~~~~ 14000001 b #+0x4 (addr 0x~~~~~~~~~~~~~~~~)
0x~~~~~~~~~~~~~~~~ eb030063 subs x3, x3, x3
0x~~~~~~~~~~~~~~~~ 54000061 b.ne #+0xc (addr 0x~~~~~~~~~~~~~~~~)
diff --git a/test/test-trace-reference/log-cpufeatures-custom b/test/test-trace-reference/log-cpufeatures-custom
index 3975ec9..e64e6f7 100644
--- a/test/test-trace-reference/log-cpufeatures-custom
+++ b/test/test-trace-reference/log-cpufeatures-custom
@@ -314,6 +314,14 @@
0x~~~~~~~~~~~~~~~~ d3403ce6 uxth x6, w7
0x~~~~~~~~~~~~~~~~ 53007d28 lsr w8, w9, #0
0x~~~~~~~~~~~~~~~~ d3407d6a ubfx x10, x11, #0, #32
+0x~~~~~~~~~~~~~~~~ a9bf7fea stp x10, xzr, [sp, #-16]!
+0x~~~~~~~~~~~~~~~~ a8c17fea ldp x10, xzr, [sp], #16
+0x~~~~~~~~~~~~~~~~ f81f0fff str xzr, [sp, #-16]!
+0x~~~~~~~~~~~~~~~~ 388107ff ldrsb xzr, [sp], #16
+0x~~~~~~~~~~~~~~~~ f81f0fff str xzr, [sp, #-16]!
+0x~~~~~~~~~~~~~~~~ 788107ff ldrsh xzr, [sp], #16
+0x~~~~~~~~~~~~~~~~ f81f0fff str xzr, [sp, #-16]!
+0x~~~~~~~~~~~~~~~~ b88107ff ldrsw xzr, [sp], #16
0x~~~~~~~~~~~~~~~~ 14000001 b #+0x4 (addr 0x~~~~~~~~~~~~~~~~)
0x~~~~~~~~~~~~~~~~ eb030063 subs x3, x3, x3
0x~~~~~~~~~~~~~~~~ 54000061 b.ne #+0xc (addr 0x~~~~~~~~~~~~~~~~)
diff --git a/test/test-trace-reference/log-disasm b/test/test-trace-reference/log-disasm
index 53f8f01..7705af1 100644
--- a/test/test-trace-reference/log-disasm
+++ b/test/test-trace-reference/log-disasm
@@ -314,6 +314,14 @@
0x~~~~~~~~~~~~~~~~ d3403ce6 uxth x6, w7
0x~~~~~~~~~~~~~~~~ 53007d28 lsr w8, w9, #0
0x~~~~~~~~~~~~~~~~ d3407d6a ubfx x10, x11, #0, #32
+0x~~~~~~~~~~~~~~~~ a9bf7fea stp x10, xzr, [sp, #-16]!
+0x~~~~~~~~~~~~~~~~ a8c17fea ldp x10, xzr, [sp], #16
+0x~~~~~~~~~~~~~~~~ f81f0fff str xzr, [sp, #-16]!
+0x~~~~~~~~~~~~~~~~ 388107ff ldrsb xzr, [sp], #16
+0x~~~~~~~~~~~~~~~~ f81f0fff str xzr, [sp, #-16]!
+0x~~~~~~~~~~~~~~~~ 788107ff ldrsh xzr, [sp], #16
+0x~~~~~~~~~~~~~~~~ f81f0fff str xzr, [sp, #-16]!
+0x~~~~~~~~~~~~~~~~ b88107ff ldrsw xzr, [sp], #16
0x~~~~~~~~~~~~~~~~ 14000001 b #+0x4 (addr 0x~~~~~~~~~~~~~~~~)
0x~~~~~~~~~~~~~~~~ eb030063 subs x3, x3, x3
0x~~~~~~~~~~~~~~~~ 54000061 b.ne #+0xc (addr 0x~~~~~~~~~~~~~~~~)
diff --git a/test/test-trace-reference/log-disasm-colour b/test/test-trace-reference/log-disasm-colour
index 53f8f01..7705af1 100644
--- a/test/test-trace-reference/log-disasm-colour
+++ b/test/test-trace-reference/log-disasm-colour
@@ -314,6 +314,14 @@
0x~~~~~~~~~~~~~~~~ d3403ce6 uxth x6, w7
0x~~~~~~~~~~~~~~~~ 53007d28 lsr w8, w9, #0
0x~~~~~~~~~~~~~~~~ d3407d6a ubfx x10, x11, #0, #32
+0x~~~~~~~~~~~~~~~~ a9bf7fea stp x10, xzr, [sp, #-16]!
+0x~~~~~~~~~~~~~~~~ a8c17fea ldp x10, xzr, [sp], #16
+0x~~~~~~~~~~~~~~~~ f81f0fff str xzr, [sp, #-16]!
+0x~~~~~~~~~~~~~~~~ 388107ff ldrsb xzr, [sp], #16
+0x~~~~~~~~~~~~~~~~ f81f0fff str xzr, [sp, #-16]!
+0x~~~~~~~~~~~~~~~~ 788107ff ldrsh xzr, [sp], #16
+0x~~~~~~~~~~~~~~~~ f81f0fff str xzr, [sp, #-16]!
+0x~~~~~~~~~~~~~~~~ b88107ff ldrsw xzr, [sp], #16
0x~~~~~~~~~~~~~~~~ 14000001 b #+0x4 (addr 0x~~~~~~~~~~~~~~~~)
0x~~~~~~~~~~~~~~~~ eb030063 subs x3, x3, x3
0x~~~~~~~~~~~~~~~~ 54000061 b.ne #+0xc (addr 0x~~~~~~~~~~~~~~~~)
diff --git a/test/test-trace-reference/log-regs b/test/test-trace-reference/log-regs
index c350f52..10c4402 100644
--- a/test/test-trace-reference/log-regs
+++ b/test/test-trace-reference/log-regs
@@ -393,6 +393,22 @@
# x6: 0x000000000000ffff
# w8: 0x00000001
# x10: 0x0000000000000000
+# sp: 0x~~~~~~~~~~~~~~~~
+# x10: 0x0000000000000000 <- 0x~~~~~~~~~~~~~~~~
+# xzr: 0x0000000000000000 <- 0x~~~~~~~~~~~~~~~~
+# sp: 0x~~~~~~~~~~~~~~~~
+# sp: 0x~~~~~~~~~~~~~~~~
+# xzr: 0x0000000000000000
+# ╙─ 0x00 <- 0x~~~~~~~~~~~~~~~~
+# sp: 0x~~~~~~~~~~~~~~~~
+# sp: 0x~~~~~~~~~~~~~~~~
+# xzr: 0x0000000000000000
+# ╙─ 0x0000 <- 0x~~~~~~~~~~~~~~~~
+# sp: 0x~~~~~~~~~~~~~~~~
+# sp: 0x~~~~~~~~~~~~~~~~
+# xzr: 0x0000000000000000
+# ╙─ 0x00000000 <- 0x~~~~~~~~~~~~~~~~
+# sp: 0x~~~~~~~~~~~~~~~~
# x3: 0x0000000000000000
# w18: 0x00000000
# w29: 0x00000000
diff --git a/test/test-trace-reference/log-regs-colour b/test/test-trace-reference/log-regs-colour
index 5583998..4e877d7 100644
--- a/test/test-trace-reference/log-regs-colour
+++ b/test/test-trace-reference/log-regs-colour
@@ -393,6 +393,22 @@
# [1;36m x6: [0;36m0x000000000000ffff[0;m
# [1;36m w8: [0;36m 0x00000001[0;m
# [1;36m x10: [0;36m0x0000000000000000[0;m
+# [1;36m sp: [0;36m0x~~~~~~~~~~~~~~~~[0;m
+# [1;36m x10: [0;36m0x0000000000000000[0;m <- [1;34m0x~~~~~~~~~~~~~~~~[0;m
+# [1;36m xzr: [0;36m0x0000000000000000[0;m <- [1;34m0x~~~~~~~~~~~~~~~~[0;m
+# [1;36m sp: [0;36m0x~~~~~~~~~~~~~~~~[0;m
+# [1;36m sp: [0;36m0x~~~~~~~~~~~~~~~~[0;m
+# [1;36m xzr: [0;36m0x0000000000000000[0;m
+# ╙─ 0x00 <- [1;34m0x~~~~~~~~~~~~~~~~[0;m
+# [1;36m sp: [0;36m0x~~~~~~~~~~~~~~~~[0;m
+# [1;36m sp: [0;36m0x~~~~~~~~~~~~~~~~[0;m
+# [1;36m xzr: [0;36m0x0000000000000000[0;m
+# ╙─ 0x0000 <- [1;34m0x~~~~~~~~~~~~~~~~[0;m
+# [1;36m sp: [0;36m0x~~~~~~~~~~~~~~~~[0;m
+# [1;36m sp: [0;36m0x~~~~~~~~~~~~~~~~[0;m
+# [1;36m xzr: [0;36m0x0000000000000000[0;m
+# ╙─ 0x00000000 <- [1;34m0x~~~~~~~~~~~~~~~~[0;m
+# [1;36m sp: [0;36m0x~~~~~~~~~~~~~~~~[0;m
# [1;36m x3: [0;36m0x0000000000000000[0;m
# [1;36m w18: [0;36m 0x00000000[0;m
# [1;36m w29: [0;36m 0x00000000[0;m
diff --git a/test/test-trace-reference/log-state b/test/test-trace-reference/log-state
index 0b5069d..419e479 100644
--- a/test/test-trace-reference/log-state
+++ b/test/test-trace-reference/log-state
@@ -672,6 +672,22 @@
# x6: 0x000000000000ffff
# w8: 0x00000001
# x10: 0x0000000000000000
+# sp: 0x~~~~~~~~~~~~~~~~
+# x10: 0x0000000000000000 <- 0x~~~~~~~~~~~~~~~~
+# xzr: 0x0000000000000000 <- 0x~~~~~~~~~~~~~~~~
+# sp: 0x~~~~~~~~~~~~~~~~
+# sp: 0x~~~~~~~~~~~~~~~~
+# xzr: 0x0000000000000000
+# ╙─ 0x00 <- 0x~~~~~~~~~~~~~~~~
+# sp: 0x~~~~~~~~~~~~~~~~
+# sp: 0x~~~~~~~~~~~~~~~~
+# xzr: 0x0000000000000000
+# ╙─ 0x0000 <- 0x~~~~~~~~~~~~~~~~
+# sp: 0x~~~~~~~~~~~~~~~~
+# sp: 0x~~~~~~~~~~~~~~~~
+# xzr: 0x0000000000000000
+# ╙─ 0x00000000 <- 0x~~~~~~~~~~~~~~~~
+# sp: 0x~~~~~~~~~~~~~~~~
# NZCV: N:0 Z:1 C:1 V:0
# x3: 0x0000000000000000
# NZCV: N:1 Z:0 C:0 V:0
diff --git a/test/test-trace-reference/log-state-colour b/test/test-trace-reference/log-state-colour
index 3234c7a..85acd79 100644
--- a/test/test-trace-reference/log-state-colour
+++ b/test/test-trace-reference/log-state-colour
@@ -672,6 +672,22 @@
# [1;36m x6: [0;36m0x000000000000ffff[0;m
# [1;36m w8: [0;36m 0x00000001[0;m
# [1;36m x10: [0;36m0x0000000000000000[0;m
+# [1;36m sp: [0;36m0x~~~~~~~~~~~~~~~~[0;m
+# [1;36m x10: [0;36m0x0000000000000000[0;m <- [1;34m0x~~~~~~~~~~~~~~~~[0;m
+# [1;36m xzr: [0;36m0x0000000000000000[0;m <- [1;34m0x~~~~~~~~~~~~~~~~[0;m
+# [1;36m sp: [0;36m0x~~~~~~~~~~~~~~~~[0;m
+# [1;36m sp: [0;36m0x~~~~~~~~~~~~~~~~[0;m
+# [1;36m xzr: [0;36m0x0000000000000000[0;m
+# ╙─ 0x00 <- [1;34m0x~~~~~~~~~~~~~~~~[0;m
+# [1;36m sp: [0;36m0x~~~~~~~~~~~~~~~~[0;m
+# [1;36m sp: [0;36m0x~~~~~~~~~~~~~~~~[0;m
+# [1;36m xzr: [0;36m0x0000000000000000[0;m
+# ╙─ 0x0000 <- [1;34m0x~~~~~~~~~~~~~~~~[0;m
+# [1;36m sp: [0;36m0x~~~~~~~~~~~~~~~~[0;m
+# [1;36m sp: [0;36m0x~~~~~~~~~~~~~~~~[0;m
+# [1;36m xzr: [0;36m0x0000000000000000[0;m
+# ╙─ 0x00000000 <- [1;34m0x~~~~~~~~~~~~~~~~[0;m
+# [1;36m sp: [0;36m0x~~~~~~~~~~~~~~~~[0;m
# [1;37mNZCV: [0;mN:0 Z:1 C:1 V:0[0;m
# [1;36m x3: [0;36m0x0000000000000000[0;m
# [1;37mNZCV: [0;mN:1 Z:0 C:0 V:0[0;m
diff --git a/test/test-trace-reference/log-write b/test/test-trace-reference/log-write
index 0491d50..f1096e6 100644
--- a/test/test-trace-reference/log-write
+++ b/test/test-trace-reference/log-write
@@ -44,6 +44,11 @@
# x3<7:0>: 0xff -> 0x~~~~~~~~~~~~~~~~
# x4<15:0>: 0x0001 -> 0x~~~~~~~~~~~~~~~~
# x5<15:0>: 0x8500 -> 0x~~~~~~~~~~~~~~~~
+# x10<63:0>: 0x0000000000000000 -> 0x~~~~~~~~~~~~~~~~
+# xzr<63:0>: 0x0000000000000000 -> 0x~~~~~~~~~~~~~~~~
+# xzr<63:0>: 0x0000000000000000 -> 0x~~~~~~~~~~~~~~~~
+# xzr<63:0>: 0x0000000000000000 -> 0x~~~~~~~~~~~~~~~~
+# xzr<63:0>: 0x0000000000000000 -> 0x~~~~~~~~~~~~~~~~
# v21<127:0>: 0x000000000000000000000000ffff8007
# ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ╙─ 0x07 -> 0x~~~~~~~~~~~~~~~~
# ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ╙─── 0x80 -> 0x~~~~~~~~~~~~~~~~
diff --git a/test/test-trace-reference/log-write-colour b/test/test-trace-reference/log-write-colour
index 7caf1a4..8a43844 100644
--- a/test/test-trace-reference/log-write-colour
+++ b/test/test-trace-reference/log-write-colour
@@ -44,6 +44,11 @@
# [1;36m x3<7:0>: [0;36m 0xff[0;m -> [1;34m0x~~~~~~~~~~~~~~~~[0;m
# [1;36m x4<15:0>: [0;36m 0x0001[0;m -> [1;34m0x~~~~~~~~~~~~~~~~[0;m
# [1;36m x5<15:0>: [0;36m 0x8500[0;m -> [1;34m0x~~~~~~~~~~~~~~~~[0;m
+# [1;36m x10<63:0>: [0;36m0x0000000000000000[0;m -> [1;34m0x~~~~~~~~~~~~~~~~[0;m
+# [1;36m xzr<63:0>: [0;36m0x0000000000000000[0;m -> [1;34m0x~~~~~~~~~~~~~~~~[0;m
+# [1;36m xzr<63:0>: [0;36m0x0000000000000000[0;m -> [1;34m0x~~~~~~~~~~~~~~~~[0;m
+# [1;36m xzr<63:0>: [0;36m0x0000000000000000[0;m -> [1;34m0x~~~~~~~~~~~~~~~~[0;m
+# [1;36m xzr<63:0>: [0;36m0x0000000000000000[0;m -> [1;34m0x~~~~~~~~~~~~~~~~[0;m
# [1;35m v21<127:0>: [0;35m0x000000000000000000000000ffff8007[0;m
# ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ╙─ 0x07 -> [1;34m0x~~~~~~~~~~~~~~~~[0;m
# ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ║ ╙─── 0x80 -> [1;34m0x~~~~~~~~~~~~~~~~[0;m
diff --git a/tools/code_coverage.log b/tools/code_coverage.log
index e76eb8d..d7c551d 100644
--- a/tools/code_coverage.log
+++ b/tools/code_coverage.log
@@ -14,3 +14,4 @@
1660224011 82.79% 97.51% 95.50%
1663161852 82.79% 97.51% 95.50%
1666104118 82.79% 97.51% 95.50%
+1673432155 82.79% 97.51% 95.51%