Skip to content

Commit 0698dd7

Browse files
committed
py/emitnative: Ensure load_subscr does not clobber existing REG_ARG_2.
Follow up from a similar fix in 426785a Fixes issue adafruit#6314. Signed-off-by: Damien George <[email protected]>
1 parent 451ded8 commit 0698dd7

File tree

3 files changed

+17
-4
lines changed

3 files changed

+17
-4
lines changed

py/emitnative.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1527,6 +1527,7 @@ STATIC void emit_native_load_subscr(emit_t *emit) {
15271527
break;
15281528
}
15291529
#endif
1530+
need_reg_single(emit, reg_index, 0);
15301531
ASM_MOV_REG_IMM(emit->as, reg_index, index_value);
15311532
ASM_ADD_REG_REG(emit->as, reg_index, reg_base); // add index to base
15321533
reg_base = reg_index;
@@ -1544,6 +1545,7 @@ STATIC void emit_native_load_subscr(emit_t *emit) {
15441545
break;
15451546
}
15461547
#endif
1548+
need_reg_single(emit, reg_index, 0);
15471549
ASM_MOV_REG_IMM(emit->as, reg_index, index_value << 1);
15481550
ASM_ADD_REG_REG(emit->as, reg_index, reg_base); // add 2*index to base
15491551
reg_base = reg_index;
@@ -1561,6 +1563,7 @@ STATIC void emit_native_load_subscr(emit_t *emit) {
15611563
break;
15621564
}
15631565
#endif
1566+
need_reg_single(emit, reg_index, 0);
15641567
ASM_MOV_REG_IMM(emit->as, reg_index, index_value << 2);
15651568
ASM_ADD_REG_REG(emit->as, reg_index, reg_base); // add 4*index to base
15661569
reg_base = reg_index;

tests/micropython/viper_subscr_multi.py

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,24 @@ def f1(b: ptr8):
66
b[0] += b[1]
77

88

9+
b = bytearray(b"\x01\x02")
10+
f1(b)
11+
print(b)
12+
13+
914
@micropython.viper
1015
def f2(b: ptr8, i: int):
1116
b[0] += b[i]
1217

1318

14-
b = bytearray(b"\x01\x02")
15-
f1(b)
16-
print(b)
17-
1819
b = bytearray(b"\x01\x02")
1920
f2(b, 1)
2021
print(b)
22+
23+
24+
@micropython.viper
25+
def f3(b: ptr8) -> int:
26+
return b[0] << 24 | b[1] << 16 | b[2] << 8 | b[3]
27+
28+
29+
print(hex(f3(b"\x01\x02\x03\x04")))
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
bytearray(b'\x03\x02')
22
bytearray(b'\x03\x02')
3+
0x1020304

0 commit comments

Comments
 (0)