[arm] Implement movw/movt for ARMv7

This should speed it up a bit on platforms like Vita.
This commit is contained in:
David Guillen Fandos 2022-01-05 17:12:35 +01:00
parent b6ddec8fa0
commit dbbefdf021
2 changed files with 29 additions and 13 deletions

View File

@ -1425,6 +1425,12 @@ typedef union {
#define ARM_UDIV(p, rd, rm, rn) \
ARM_UDIV_COND(p, rd, rm, rn, ARMCOND_AL)
#define ARM_MOVW(p, rd, imm) \
ARM_EMIT(p, ((ARMCOND_AL << 28) | (0x30 << 20) | (((imm >> 12) & 0xF) << 16) | (imm & 0xFFF) | (rd << 12)))
#define ARM_MOVT(p, rd, imm) \
ARM_EMIT(p, ((ARMCOND_AL << 28) | (0x34 << 20) | (((imm >> 12) & 0xF) << 16) | (imm & 0xFFF) | (rd << 12)))
#endif /* ARM_CG_H */

View File

@ -314,20 +314,30 @@ u32 arm_disect_imm_32bit(u32 imm, u32 *stores, u32 *rotations)
}
}
#define arm_load_imm_32bit(ireg, imm) \
{ \
u32 stores[4]; \
u32 rotations[4]; \
u32 store_count = arm_disect_imm_32bit(imm, stores, rotations); \
u32 i; \
\
ARM_MOV_REG_IMM(0, ireg, stores[0], rotations[0]); \
\
for(i = 1; i < store_count; i++) \
#if __ARM_ARCH >= 7
#define arm_load_imm_32bit(ireg, imm) \
{ \
ARM_ORR_REG_IMM(0, ireg, ireg, stores[i], rotations[i]); \
} \
} \
ARM_MOVW(0, ireg, (imm)); \
if ((imm) >> 16) { \
ARM_MOVT(0, ireg, ((imm) >> 16)); \
} \
}
#else
#define arm_load_imm_32bit(ireg, imm) \
{ \
u32 stores[4]; \
u32 rotations[4]; \
u32 store_count = arm_disect_imm_32bit(imm, stores, rotations); \
u32 i; \
\
ARM_MOV_REG_IMM(0, ireg, stores[0], rotations[0]); \
\
for(i = 1; i < store_count; i++) \
{ \
ARM_ORR_REG_IMM(0, ireg, ireg, stores[i], rotations[i]); \
} \
}
#endif
#define generate_load_pc(ireg, new_pc) \