Unified · Split
| @@ -226,7 +226,20 @@ static void asm_binary_opcode(TCCState *s1, int token) · 225 unmodified lines | ||
| 226 | 226 | tcc_warning("Using 'sp' as operand with '%s' is deprecated by ARM", get_tok_str(token, NULL)); |
| 227 | 227 | |
| 228 | 228 | if (ops[1].type != OP_REG32) { |
| 229 | − expect("(source operand) register"); | |
| 229 | + switch (ARM_INSTRUCTION_GROUP(token)) { | |
| 230 | + case TOK_ASM_movteq: | |
| 231 | + if (ops[1].type == OP_IM8 || ops[1].type == OP_IM8N || ops[1].type == OP_IM32) { | |
| 232 | + if (ops[1].e.v >= 0 && ops[1].e.v <= 0xFFFF) { | |
| 233 | + uint16_t immediate_value = ops[1].e.v; | |
| 234 | + asm_emit_opcode(token, 0x3400000 | (ops[0].reg << 12) | (immediate_value & 0xF000) << 4 | (immediate_value & 0xFFF)); | |
| 235 | + } else | |
| 236 | + expect("(source operand) immediate 16 bit value"); | |
| 237 | + } else | |
| 238 | + expect("(source operand) immediate"); | |
| 239 | + break; | |
| 240 | + default: | |
| 241 | + expect("(source operand) register"); | |
| 242 | + } | |
| 230 | 243 | return; |
| 231 | 244 | } |
| 232 | 245 | |
| @@ -1120,6 +1133,7 @@ ST_FUNC void asm_opcode(TCCState *s1, int token) · 887 unmodified lines | ||
| 1120 | 1133 | case TOK_ASM_sxtheq: |
| 1121 | 1134 | case TOK_ASM_uxtbeq: |
| 1122 | 1135 | case TOK_ASM_uxtheq: |
| 1136 | + case TOK_ASM_movteq: | |
| 1123 | 1137 | return asm_binary_opcode(s1, token); |
| 1124 | 1138 | |
| 1125 | 1139 | case TOK_ASM_ldreq: |
| @@ -69,6 +69,7 @@ · 68 unmodified lines | ||
| 69 | 69 | DEF_ASM_CONDED(sxth) |
| 70 | 70 | DEF_ASM_CONDED(uxtb) |
| 71 | 71 | DEF_ASM_CONDED(uxth) |
| 72 | + DEF_ASM_CONDED(movt) | |
| 72 | 73 | |
| 73 | 74 | /* multiplication */ |
| 74 | 75 | |