@@ -376,8 +376,8 @@ static void asm_coprocessor_opcode(TCCState *s1, int token) {
376
376
for (i = 0 ; i < 3 ; ++ i ) {
377
377
skip (',' );
378
378
if (i == 0 && token != TOK_ASM_cdp2 && (ARM_INSTRUCTION_GROUP (token ) == TOK_ASM_mrceq || ARM_INSTRUCTION_GROUP (token ) == TOK_ASM_mcreq )) {
379
- if (tok >= TOK_ASM_r0 && tok <= TOK_ASM_r15 ) {
380
- registers [i ] = tok - TOK_ASM_r0 ;
379
+ if (tok >= TOK_ASM_r0 && tok <= TOK_ASM_pc ) {
380
+ registers [i ] = asm_parse_regvar ( tok ) ;
381
381
next ();
382
382
} else {
383
383
expect ("'r<number>'" );
@@ -3072,23 +3072,20 @@ ST_FUNC void asm_clobber(uint8_t *clobber_regs, const char *str)
3072
3072
Otherwise return -1. */
3073
3073
ST_FUNC int asm_parse_regvar (int t )
3074
3074
{
3075
- if (t >= TOK_ASM_r0 && t <= TOK_ASM_pc ) { /* register name */
3076
- switch (t ) {
3077
- case TOK_ASM_fp :
3078
- return TOK_ASM_r11 - TOK_ASM_r0 ;
3079
- case TOK_ASM_ip :
3080
- return TOK_ASM_r12 - TOK_ASM_r0 ;
3081
- case TOK_ASM_sp :
3082
- return TOK_ASM_r13 - TOK_ASM_r0 ;
3083
- case TOK_ASM_lr :
3084
- return TOK_ASM_r14 - TOK_ASM_r0 ;
3085
- case TOK_ASM_pc :
3086
- return TOK_ASM_r15 - TOK_ASM_r0 ;
3087
- default :
3088
- return t - TOK_ASM_r0 ;
3089
- }
3090
- } else
3075
+ /* coprocessors (p0-p15) and coprocessor registers (c0-c15) are handled elsewere */
3076
+ /* single fp (s0-s31) and double fp registers (d0-d15) are handled elsewere */
3077
+
3078
+ if (t < TOK_ASM_r0 || t > TOK_ASM_pc ) /* filter unrelated registers */
3091
3079
return -1 ;
3080
+
3081
+ if (t <= TOK_ASM_r15 ) /* default register names r0-r15 */
3082
+ return t - TOK_ASM_r0 ;
3083
+
3084
+ if (t <= TOK_ASM_v8 ) /* synonym register names a1-a4,v1-v8 (alias: r0-r11) */
3085
+ return t - TOK_ASM_a1 ;
3086
+
3087
+ /* special register names sb/sl/fp/ip/sp/lr/pc (alias: r9-r15) */
3088
+ return t - TOK_ASM_sb + (TOK_ASM_r9 - TOK_ASM_r0 );
3092
3089
}
3093
3090
3094
3091
/*************************************************************/
0 commit comments