py/asm: Add funcs/macros to emit machine code for logical-shift-right. · csamuelson/circuitpython@aa26fe6 · GitHub
Skip to content

Commit aa26fe6

Browse files
committed
py/asm: Add funcs/macros to emit machine code for logical-shift-right.
Signed-off-by: Damien George <damien@micropython.org>
1 parent 137df81 commit aa26fe6

8 files changed

Lines changed: 31 additions & 0 deletions

File tree

py/asmarm.c

Lines changed: 5 additions & 0 deletions

py/asmarm.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,7 @@ void asm_arm_orr_reg_reg_reg(asm_arm_t *as, uint rd, uint rn, uint rm);
101101
void asm_arm_mov_reg_local_addr(asm_arm_t *as, uint rd, int local_num);
102102
void asm_arm_mov_reg_pcrel(asm_arm_t *as, uint reg_dest, uint label);
103103
void asm_arm_lsl_reg_reg(asm_arm_t *as, uint rd, uint rs);
104+
void asm_arm_lsr_reg_reg(asm_arm_t *as, uint rd, uint rs);
104105
void asm_arm_asr_reg_reg(asm_arm_t *as, uint rd, uint rs);
105106

106107
// memory
@@ -187,6 +188,7 @@ void asm_arm_bx_reg(asm_arm_t *as, uint reg_src);
187188
#define ASM_MOV_REG_PCREL(as, reg_dest, label) asm_arm_mov_reg_pcrel((as), (reg_dest), (label))
188189

189190
#define ASM_LSL_REG_REG(as, reg_dest, reg_shift) asm_arm_lsl_reg_reg((as), (reg_dest), (reg_shift))
191+
#define ASM_LSR_REG_REG(as, reg_dest, reg_shift) asm_arm_lsr_reg_reg((as), (reg_dest), (reg_shift))
190192
#define ASM_ASR_REG_REG(as, reg_dest, reg_shift) asm_arm_asr_reg_reg((as), (reg_dest), (reg_shift))
191193
#define ASM_OR_REG_REG(as, reg_dest, reg_src) asm_arm_orr_reg_reg_reg((as), (reg_dest), (reg_dest), (reg_src))
192194
#define ASM_XOR_REG_REG(as, reg_dest, reg_src) asm_arm_eor_reg_reg_reg((as), (reg_dest), (reg_dest), (reg_src))

py/asmthumb.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -345,6 +345,7 @@ void asm_thumb_bl_ind(asm_thumb_t *as, uint fun_id, uint reg_temp); // convenien
345345
#define ASM_MOV_REG_PCREL(as, rlo_dest, label) asm_thumb_mov_reg_pcrel((as), (rlo_dest), (label))
346346

347347
#define ASM_LSL_REG_REG(as, reg_dest, reg_shift) asm_thumb_format_4((as), ASM_THUMB_FORMAT_4_LSL, (reg_dest), (reg_shift))
348+
#define ASM_LSR_REG_REG(as, reg_dest, reg_shift) asm_thumb_format_4((as), ASM_THUMB_FORMAT_4_LSR, (reg_dest), (reg_shift))
348349
#define ASM_ASR_REG_REG(as, reg_dest, reg_shift) asm_thumb_format_4((as), ASM_THUMB_FORMAT_4_ASR, (reg_dest), (reg_shift))
349350
#define ASM_OR_REG_REG(as, reg_dest, reg_src) asm_thumb_format_4((as), ASM_THUMB_FORMAT_4_ORR, (reg_dest), (reg_src))
350351
#define ASM_XOR_REG_REG(as, reg_dest, reg_src) asm_thumb_format_4((as), ASM_THUMB_FORMAT_4_EOR, (reg_dest), (reg_src))

py/asmx64.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@
6767
// #define OPCODE_SHR_RM32_BY_I8 (0xc1) /* /5 */
6868
// #define OPCODE_SAR_RM32_BY_I8 (0xc1) /* /7 */
6969
#define OPCODE_SHL_RM64_CL (0xd3) /* /4 */
70+
#define OPCODE_SHR_RM64_CL (0xd3) /* /5 */
7071
#define OPCODE_SAR_RM64_CL (0xd3) /* /7 */
7172
// #define OPCODE_CMP_I32_WITH_RM32 (0x81) /* /7 */
7273
// #define OPCODE_CMP_I8_WITH_RM32 (0x83) /* /7 */
@@ -382,6 +383,10 @@ void asm_x64_shl_r64_cl(asm_x64_t *as, int dest_r64) {
382383
asm_x64_generic_r64_r64(as, dest_r64, 4, OPCODE_SHL_RM64_CL);
383384
}
384385

386+
void asm_x64_shr_r64_cl(asm_x64_t *as, int dest_r64) {
387+
asm_x64_generic_r64_r64(as, dest_r64, 5, OPCODE_SHR_RM64_CL);
388+
}
389+
385390
void asm_x64_sar_r64_cl(asm_x64_t *as, int dest_r64) {
386391
asm_x64_generic_r64_r64(as, dest_r64, 7, OPCODE_SAR_RM64_CL);
387392
}

py/asmx64.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,7 @@ void asm_x64_and_r64_r64(asm_x64_t *as, int dest_r64, int src_r64);
9898
void asm_x64_or_r64_r64(asm_x64_t *as, int dest_r64, int src_r64);
9999
void asm_x64_xor_r64_r64(asm_x64_t *as, int dest_r64, int src_r64);
100100
void asm_x64_shl_r64_cl(asm_x64_t *as, int dest_r64);
101+
void asm_x64_shr_r64_cl(asm_x64_t *as, int dest_r64);
101102
void asm_x64_sar_r64_cl(asm_x64_t *as, int dest_r64);
102103
void asm_x64_add_r64_r64(asm_x64_t *as, int dest_r64, int src_r64);
103104
void asm_x64_sub_r64_r64(asm_x64_t *as, int dest_r64, int src_r64);
@@ -190,6 +191,7 @@ void asm_x64_call_ind(asm_x64_t *as, size_t fun_id, int temp_r32);
190191
#define ASM_MOV_REG_PCREL(as, reg_dest, label) asm_x64_mov_reg_pcrel((as), (reg_dest), (label))
191192

192193
#define ASM_LSL_REG(as, reg) asm_x64_shl_r64_cl((as), (reg))
194+
#define ASM_LSR_REG(as, reg) asm_x64_shr_r64_cl((as), (reg))
193195
#define ASM_ASR_REG(as, reg) asm_x64_sar_r64_cl((as), (reg))
194196
#define ASM_OR_REG_REG(as, reg_dest, reg_src) asm_x64_or_r64_r64((as), (reg_dest), (reg_src))
195197
#define ASM_XOR_REG_REG(as, reg_dest, reg_src) asm_x64_xor_r64_r64((as), (reg_dest), (reg_src))

py/asmx86.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@
6767
// #define OPCODE_SHR_RM32_BY_I8 (0xc1) /* /5 */
6868
// #define OPCODE_SAR_RM32_BY_I8 (0xc1) /* /7 */
6969
#define OPCODE_SHL_RM32_CL (0xd3) /* /4 */
70+
#define OPCODE_SHR_RM32_CL (0xd3) /* /5 */
7071
#define OPCODE_SAR_RM32_CL (0xd3) /* /7 */
7172
// #define OPCODE_CMP_I32_WITH_RM32 (0x81) /* /7 */
7273
// #define OPCODE_CMP_I8_WITH_RM32 (0x83) /* /7 */
@@ -259,6 +260,10 @@ void asm_x86_shl_r32_cl(asm_x86_t *as, int dest_r32) {
259260
asm_x86_generic_r32_r32(as, dest_r32, 4, OPCODE_SHL_RM32_CL);
260261
}
261262

263+
void asm_x86_shr_r32_cl(asm_x86_t *as, int dest_r32) {
264+
asm_x86_generic_r32_r32(as, dest_r32, 5, OPCODE_SHR_RM32_CL);
265+
}
266+
262267
void asm_x86_sar_r32_cl(asm_x86_t *as, int dest_r32) {
263268
asm_x86_generic_r32_r32(as, dest_r32, 7, OPCODE_SAR_RM32_CL);
264269
}

py/asmx86.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,7 @@ void asm_x86_and_r32_r32(asm_x86_t *as, int dest_r32, int src_r32);
9393
void asm_x86_or_r32_r32(asm_x86_t *as, int dest_r32, int src_r32);
9494
void asm_x86_xor_r32_r32(asm_x86_t *as, int dest_r32, int src_r32);
9595
void asm_x86_shl_r32_cl(asm_x86_t *as, int dest_r32);
96+
void asm_x86_shr_r32_cl(asm_x86_t *as, int dest_r32);
9697
void asm_x86_sar_r32_cl(asm_x86_t *as, int dest_r32);
9798
void asm_x86_add_r32_r32(asm_x86_t *as, int dest_r32, int src_r32);
9899
void asm_x86_sub_r32_r32(asm_x86_t *as, int dest_r32, int src_r32);
@@ -185,6 +186,7 @@ void asm_x86_call_ind(asm_x86_t *as, size_t fun_id, mp_uint_t n_args, int temp_r
185186
#define ASM_MOV_REG_PCREL(as, reg_dest, label) asm_x86_mov_reg_pcrel((as), (reg_dest), (label))
186187

187188
#define ASM_LSL_REG(as, reg) asm_x86_shl_r32_cl((as), (reg))
189+
#define ASM_LSR_REG(as, reg) asm_x86_shr_r32_cl((as), (reg))
188190
#define ASM_ASR_REG(as, reg) asm_x86_sar_r32_cl((as), (reg))
189191
#define ASM_OR_REG_REG(as, reg_dest, reg_src) asm_x86_or_r32_r32((as), (reg_dest), (reg_src))
190192
#define ASM_XOR_REG_REG(as, reg_dest, reg_src) asm_x86_xor_r32_r32((as), (reg_dest), (reg_src))

py/asmxtensa.h

Lines changed: 9 additions & 0 deletions

0 commit comments

Comments
 (0)