@@ -382,8 +382,10 @@ void asm_thumb_mov_reg_local(asm_thumb_t *as, uint rlo_dest, int local_num); //
382
382
void asm_thumb_mov_reg_local_addr (asm_thumb_t * as , uint rlo_dest , int local_num ); // convenience
383
383
void asm_thumb_mov_reg_pcrel (asm_thumb_t * as , uint rlo_dest , uint label );
384
384
385
- void asm_thumb_ldr_reg_reg_i12_optimised (asm_thumb_t * as , uint reg_dest , uint reg_base , uint word_offset ); // convenience
386
- void asm_thumb_ldrh_reg_reg_i12_optimised (asm_thumb_t * as , uint reg_dest , uint reg_base , uint uint16_offset ); // convenience
385
+ // Generate optimised load dest, [src, #offset] sequence
386
+ void asm_thumb_load_reg_reg_offset (asm_thumb_t * as , uint reg_dest , uint reg_base , uint offset , uint shift );
387
+ // Generate optimised store src, [dest, #offset] sequence
388
+ void asm_thumb_store_reg_reg_offset (asm_thumb_t * as , uint reg_src , uint reg_base , uint offset , uint shift );
387
389
388
390
void asm_thumb_b_label (asm_thumb_t * as , uint label ); // convenience: picks narrow or wide branch
389
391
void asm_thumb_bcc_label (asm_thumb_t * as , int cc , uint label ); // convenience: picks narrow or wide branch
@@ -463,17 +465,20 @@ void asm_thumb_b_rel12(asm_thumb_t *as, int rel);
463
465
#define ASM_MUL_REG_REG (as , reg_dest , reg_src ) asm_thumb_format_4((as), ASM_THUMB_FORMAT_4_MUL, (reg_dest), (reg_src))
464
466
465
467
#define ASM_LOAD_REG_REG_OFFSET (as , reg_dest , reg_base , word_offset ) ASM_LOAD32_REG_REG_OFFSET((as), (reg_dest), (reg_base), (word_offset))
466
- #define ASM_LOAD8_REG_REG (as , reg_dest , reg_base ) asm_thumb_ldrb_rlo_rlo_i5((as), (reg_dest), (reg_base), 0)
467
- #define ASM_LOAD16_REG_REG (as , reg_dest , reg_base ) asm_thumb_ldrh_rlo_rlo_i5((as), (reg_dest), (reg_base), 0)
468
- #define ASM_LOAD16_REG_REG_OFFSET (as , reg_dest , reg_base , uint16_offset ) asm_thumb_ldrh_reg_reg_i12_optimised((as), (reg_dest), (reg_base), (uint16_offset))
469
- #define ASM_LOAD32_REG_REG (as , reg_dest , reg_base ) asm_thumb_ldr_rlo_rlo_i5((as), (reg_dest), (reg_base), 0)
470
- #define ASM_LOAD32_REG_REG_OFFSET (as , reg_dest , reg_base , word_offset ) asm_thumb_ldr_reg_reg_i12_optimised((as), (reg_dest), (reg_base), (word_offset))
468
+ #define ASM_LOAD8_REG_REG (as , reg_dest , reg_base ) ASM_LOAD8_REG_REG_OFFSET((as), (reg_dest), (reg_base), 0)
469
+ #define ASM_LOAD8_REG_REG_OFFSET (as , reg_dest , reg_base , byte_offset ) asm_thumb_load_reg_reg_offset((as), (reg_dest), (reg_base), (byte_offset), 0)
470
+ #define ASM_LOAD16_REG_REG (as , reg_dest , reg_base ) ASM_LOAD16_REG_REG_OFFSET((as), (reg_dest), (reg_base), 0)
471
+ #define ASM_LOAD16_REG_REG_OFFSET (as , reg_dest , reg_base , halfword_offset ) asm_thumb_load_reg_reg_offset((as), (reg_dest), (reg_base), (halfword_offset), 1)
472
+ #define ASM_LOAD32_REG_REG (as , reg_dest , reg_base ) ASM_LOAD32_REG_REG_OFFSET((as), (reg_dest), (reg_base), 0)
473
+ #define ASM_LOAD32_REG_REG_OFFSET (as , reg_dest , reg_base , word_offset ) asm_thumb_load_reg_reg_offset((as), (reg_dest), (reg_base), (word_offset), 2)
471
474
472
475
#define ASM_STORE_REG_REG_OFFSET (as , reg_src , reg_base , word_offset ) ASM_STORE32_REG_REG_OFFSET((as), (reg_src), (reg_base), (word_offset))
473
- #define ASM_STORE8_REG_REG (as , reg_src , reg_base ) asm_thumb_strb_rlo_rlo_i5((as), (reg_src), (reg_base), 0)
474
- #define ASM_STORE16_REG_REG (as , reg_src , reg_base ) asm_thumb_strh_rlo_rlo_i5((as), (reg_src), (reg_base), 0)
475
- #define ASM_STORE32_REG_REG (as , reg_src , reg_base ) asm_thumb_str_rlo_rlo_i5((as), (reg_src), (reg_base), 0)
476
- #define ASM_STORE32_REG_REG_OFFSET (as , reg_src , reg_base , word_offset ) asm_thumb_str_rlo_rlo_i5((as), (reg_src), (reg_base), (word_offset))
476
+ #define ASM_STORE8_REG_REG (as , reg_src , reg_base ) ASM_STORE8_REG_REG_OFFSET((as), (reg_src), (reg_base), 0)
477
+ #define ASM_STORE8_REG_REG_OFFSET (as , reg_src , reg_base , byte_offset ) asm_thumb_store_reg_reg_offset((as), (reg_src), (reg_base), (byte_offset), 0)
478
+ #define ASM_STORE16_REG_REG (as , reg_src , reg_base ) ASM_STORE16_REG_REG_OFFSET((as), (reg_src), (reg_base), 0)
479
+ #define ASM_STORE16_REG_REG_OFFSET (as , reg_src , reg_base , halfword_offset ) asm_thumb_store_reg_reg_offset((as), (reg_src), (reg_base), (halfword_offset), 1)
480
+ #define ASM_STORE32_REG_REG (as , reg_src , reg_base ) ASM_STORE32_REG_REG_OFFSET((as), (reg_src), (reg_base), 0)
481
+ #define ASM_STORE32_REG_REG_OFFSET (as , reg_src , reg_base , word_offset ) asm_thumb_store_reg_reg_offset((as), (reg_src), (reg_base), (word_offset), 2)
477
482
478
483
#define ASM_LOAD8_REG_REG_REG (as , reg_dest , reg_base , reg_index ) asm_thumb_ldrb_rlo_rlo_rlo((as), (reg_dest), (reg_base), (reg_index))
479
484
#define ASM_LOAD16_REG_REG_REG (as , reg_dest , reg_base , reg_index ) \
0 commit comments