Unified · Split
| @@ -228,10 +228,18 @@ static void asm_binary_opcode(TCCState *s1, int token) · 227 unmodified lines | ||
| 228 | 228 | if (ops[1].type != OP_REG32) { |
| 229 | 229 | switch (ARM_INSTRUCTION_GROUP(token)) { |
| 230 | 230 | case TOK_ASM_movteq: |
| 231 | + case TOK_ASM_movweq: | |
| 231 | 232 | if (ops[1].type == OP_IM8 || ops[1].type == OP_IM8N || ops[1].type == OP_IM32) { |
| 232 | 233 | if (ops[1].e.v >= 0 && ops[1].e.v <= 0xFFFF) { |
| 233 | 234 | 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 | + switch (ARM_INSTRUCTION_GROUP(token)) { | |
| 236 | + case TOK_ASM_movteq: | |
| 237 | + asm_emit_opcode(token, 0x3400000 | (ops[0].reg << 12) | (immediate_value & 0xF000) << 4 | (immediate_value & 0xFFF)); | |
| 238 | + break; | |
| 239 | + case TOK_ASM_movweq: | |
| 240 | + asm_emit_opcode(token, 0x3000000 | (ops[0].reg << 12) | (immediate_value & 0xF000) << 4 | (immediate_value & 0xFFF)); | |
| 241 | + break; | |
| 242 | + } | |
| 235 | 243 | } else |
| 236 | 244 | expect("(source operand) immediate 16 bit value"); |
| 237 | 245 | } else |
| @@ -1134,6 +1142,7 @@ ST_FUNC void asm_opcode(TCCState *s1, int token) · 896 unmodified lines | ||
| 1134 | 1142 | case TOK_ASM_uxtbeq: |
| 1135 | 1143 | case TOK_ASM_uxtheq: |
| 1136 | 1144 | case TOK_ASM_movteq: |
| 1145 | + case TOK_ASM_movweq: | |
| 1137 | 1146 | return asm_binary_opcode(s1, token); |
| 1138 | 1147 | |
| 1139 | 1148 | case TOK_ASM_ldreq: |
| @@ -70,6 +70,7 @@ · 69 unmodified lines | ||
| 70 | 70 | DEF_ASM_CONDED(uxtb) |
| 71 | 71 | DEF_ASM_CONDED(uxth) |
| 72 | 72 | DEF_ASM_CONDED(movt) |
| 73 | + DEF_ASM_CONDED(movw) | |
| 73 | 74 | |
| 74 | 75 | /* multiplication */ |
| 75 | 76 | |