Skip to content

Commit 48cbf1b

Browse files
AntonJohanssonAnton Johanssonayosher
authored
Xqccmp: Left shift spimm in pop instructions (#775)
Shifting `spimm` left by 4 matches the behaviour of cm.push/cm.pop, and moreover since qc.cm.push shifts by 4 the stack address is not calculated correctly upon popping. E.g. qc.cm.push {ra}, -64 qc.cm.pop {ra}, 64 will not recover the stack address in addition to loading incorrect values for all saved registers. Signed-off-by: Anton Johansson <anjo@rev.ng> Co-authored-by: Anton Johansson <anjo@rev.ng> Co-authored-by: ayosher <181945086+ayosher@users.noreply.github.com>
1 parent 481700b commit 48cbf1b

File tree

5 files changed

+9
-5
lines changed

5 files changed

+9
-5
lines changed

arch_overlay/qc_iu/inst/Xqccmp/qc.cm.pop.yaml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ encoding:
2424
not: [0, 1, 2, 3]
2525
- name: spimm
2626
location: 3-2
27+
left_shift: 4
2728
access:
2829
s: always
2930
u: always
@@ -38,7 +39,7 @@ operation(): |
3839
XReg size = xlen() / 8;
3940
XReg nreg = (rlist == 15) ? 13 : (rlist - 3);
4041
XReg stack_aligned_adj = (nreg * size + 15) & ~0xF;
41-
XReg virtual_address_new_sp = virtual_address_sp + stack_aligned_adj + spimm;
42+
XReg virtual_address_new_sp = virtual_address_sp + stack_aligned_adj + (spimm `<< 4);
4243
XReg virtual_address_base = virtual_address_new_sp - size;
4344
4445

arch_overlay/qc_iu/inst/Xqccmp/qc.cm.popret.yaml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ encoding:
2424
not: [0, 1, 2, 3]
2525
- name: spimm
2626
location: 3-2
27+
left_shift: 4
2728
access:
2829
s: always
2930
u: always
@@ -38,7 +39,7 @@ operation(): |
3839
XReg size = xlen() / 8;
3940
XReg nreg = (rlist == 15) ? 13 : (rlist - 3);
4041
XReg stack_aligned_adj = (nreg * size + 15) & ~0xF;
41-
XReg virtual_address_new_sp = virtual_address_sp + stack_aligned_adj + spimm;
42+
XReg virtual_address_new_sp = virtual_address_sp + stack_aligned_adj + (spimm `<< 4);
4243
XReg virtual_address_base = virtual_address_new_sp - size;
4344
4445

arch_overlay/qc_iu/inst/Xqccmp/qc.cm.popretz.yaml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ encoding:
2424
not: [0, 1, 2, 3]
2525
- name: spimm
2626
location: 3-2
27+
left_shift: 4
2728
access:
2829
s: always
2930
u: always
@@ -38,7 +39,7 @@ operation(): |
3839
XReg size = xlen() / 8;
3940
XReg nreg = (rlist == 15) ? 13 : (rlist - 3);
4041
XReg stack_aligned_adj = (nreg * size + 15) & ~0xF;
41-
XReg virtual_address_new_sp = virtual_address_sp + stack_aligned_adj + spimm;
42+
XReg virtual_address_new_sp = virtual_address_sp + stack_aligned_adj + (spimm `<< 4);
4243
XReg virtual_address_base = virtual_address_new_sp - size;
4344
4445
X[ 1] = read_memory_xlen(virtual_address_base - 0*size, $encoding);

arch_overlay/qc_iu/inst/Xqccmp/qc.cm.push.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ operation(): |
4040
XReg size = xlen() / 8;
4141
XReg nreg = (rlist == 15) ? 13 : (rlist - 3);
4242
XReg stack_aligned_adj = (nreg * size + 15) & ~0xF;
43-
XReg virtual_address_new_sp = virtual_address_sp - stack_aligned_adj - spimm;
43+
XReg virtual_address_new_sp = virtual_address_sp - stack_aligned_adj - (spimm `<< 4);
4444
XReg virtual_address_base = virtual_address_sp - size;
4545
4646
write_memory_xlen(virtual_address_base - 0*size, X[ 1], $encoding);

arch_overlay/qc_iu/inst/Xqccmp/qc.cm.pushfp.yaml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ encoding:
2626
not: [0, 1, 2, 3, 4]
2727
- name: spimm
2828
location: 3-2
29+
left_shift: 4
2930
access:
3031
s: always
3132
u: always
@@ -40,7 +41,7 @@ operation(): |
4041
XReg size = xlen() / 8;
4142
XReg nreg = (rlist == 15) ? 13 : (rlist - 3);
4243
XReg stack_aligned_adj = (nreg * size + 15) & ~0xF;
43-
XReg virtual_address_new_sp = virtual_address_sp - stack_aligned_adj - spimm;
44+
XReg virtual_address_new_sp = virtual_address_sp - stack_aligned_adj - (spimm `<< 4);
4445
XReg virtual_address_base = virtual_address_sp - size;
4546
4647
write_memory_xlen(virtual_address_base - 0*size, X[ 1], $encoding);

0 commit comments

Comments
 (0)