mirror of
https://github.com/micropython/micropython.git
synced 2025-12-16 09:50:15 +01:00
py/asmthumb: Fix T3 encoding of conditional branches.
This commit fixes the encoding of conditional branch opcodes emitted for ARMv7-M targets, when the emitter decides to use the T3 encoding for said operation. Fields J1 and J2 are now present in the generated opcode word, along with correcting some minor issues in bitmasks and shifts computation. This fixes #17940. Signed-off-by: Alessandro Gatti <a.gatti@frob.it>
This commit is contained in:
committed by
Damien George
parent
22deeeb8db
commit
bd413d3d85
@@ -267,9 +267,8 @@ bool asm_thumb_b_n_label(asm_thumb_t *as, uint label) {
|
||||
|
||||
#define OP_BCC_N(cond, byte_offset) (0xd000 | ((cond) << 8) | (((byte_offset) >> 1) & 0x00ff))
|
||||
|
||||
// all these bit-arithmetic operations need coverage testing!
|
||||
#define OP_BCC_W_HI(cond, byte_offset) (0xf000 | ((cond) << 6) | (((byte_offset) >> 10) & 0x0400) | (((byte_offset) >> 14) & 0x003f))
|
||||
#define OP_BCC_W_LO(byte_offset) (0x8000 | ((byte_offset) & 0x2000) | (((byte_offset) >> 1) & 0x0fff))
|
||||
#define OP_BCC_W_HI(cond, byte_offset) (0xf000 | ((cond) << 6) | (((byte_offset) >> 10) & 0x0400) | (((byte_offset) >> 12) & 0x003f))
|
||||
#define OP_BCC_W_LO(byte_offset) (0x8000 | (((byte_offset) >> 5) & 0x2000) | (((byte_offset) >> 8) & 0x0800) | (((byte_offset) >> 1) & 0x07ff))
|
||||
|
||||
bool asm_thumb_bcc_nw_label(asm_thumb_t *as, int cond, uint label, bool wide) {
|
||||
mp_uint_t dest = get_label_dest(as, label);
|
||||
|
||||
20
tests/micropython/viper_large_jump.py
Normal file
20
tests/micropython/viper_large_jump.py
Normal file
@@ -0,0 +1,20 @@
|
||||
COUNT = 600
|
||||
|
||||
|
||||
try:
|
||||
code = """
|
||||
@micropython.viper
|
||||
def f() -> int:
|
||||
x = 0
|
||||
while x < 10:
|
||||
"""
|
||||
for i in range(COUNT):
|
||||
code += " x += 1\n"
|
||||
code += " return x"
|
||||
exec(code)
|
||||
except MemoryError:
|
||||
print("SKIP-TOO-LARGE")
|
||||
raise SystemExit
|
||||
|
||||
|
||||
print(f())
|
||||
1
tests/micropython/viper_large_jump.py.exp
Normal file
1
tests/micropython/viper_large_jump.py.exp
Normal file
@@ -0,0 +1 @@
|
||||
600
|
||||
Reference in New Issue
Block a user