--- arm-asm.c | 44 +++++++++++++++++++------------------- tests/arm-asm-testsuite.sh | 33 +++++++++++++++++++++------- 2 files changed, 47 insertions(+), 30 deletions(-)
diff --git a/arm-asm.c b/arm-asm.c index 8cbcd51..5cc212d 100644 --- a/arm-asm.c +++ b/arm-asm.c @@ -127,31 +127,34 @@ static void parse_operand(TCCState *s1, Operand *op) op->type = OP_REGSET32; op->regset = regset; } - } else if (tok == '#' || tok == '$') { - /* constant value */ - next(); // skip '#' or '$' - asm_expr(s1, &e); - op->type = OP_IM32; - op->e = e; - if (!op->e.sym) { - if ((int) op->e.v < 0 && (int) op->e.v >= -255) - op->type = OP_IM8N; - else if (op->e.v == (uint8_t)op->e.v) - op->type = OP_IM8; - } else - expect("constant"); + return; } else if ((reg = asm_parse_regvar(tok)) != -1) { next(); // skip register name op->type = OP_REG32; op->reg = (uint8_t) reg; + return; } else if ((reg = asm_parse_vfp_regvar(tok, 0)) != -1) { next(); // skip register name op->type = OP_VREG32; op->reg = (uint8_t) reg; + return; } else if ((reg = asm_parse_vfp_regvar(tok, 1)) != -1) { next(); // skip register name op->type = OP_VREG64; op->reg = (uint8_t) reg; + return; + } else if (tok == '#' || tok == '$') { + /* constant value */ + next(); // skip '#' or '$' + } + asm_expr(s1, &e); + op->type = OP_IM32; + op->e = e; + if (!op->e.sym) { + if ((int) op->e.v < 0 && (int) op->e.v >= -255) + op->type = OP_IM8N; + else if (op->e.v == (uint8_t)op->e.v) + op->type = OP_IM8; } else expect("operand"); } @@ -1784,15 +1787,12 @@ static void asm_floating_point_immediate_data_processing_opcode_tail(TCCState *s if (tok == '#' || tok == '$') { next(); - if (tok == '-') { - op_minus = 1; - next(); - } - immediate_value = vmov_parse_immediate_value(); - } else { - expect("'#'"); - return; } + if (tok == '-') { + op_minus = 1; + next(); + } + immediate_value = vmov_parse_immediate_value(); opcode1 = 11; // "Other" instruction switch (ARM_INSTRUCTION_GROUP(token)) { @@ -1959,7 +1959,7 @@ static void asm_floating_point_data_processing_opcode(TCCState *s1, int token) { for (nb_ops = 0; nb_ops < 3; ) { // Note: Necessary because parse_operand can't parse decimal numerals. - if (nb_ops == 1 && (tok == '#' || tok == '$')) { + if (nb_ops == 1 && (tok == '#' || tok == '$' || tok == TOK_PPNUM || tok == '-')) { asm_floating_point_immediate_data_processing_opcode_tail(s1, token, coprocessor, ops[0].reg); return; } diff --git a/tests/arm-asm-testsuite.sh b/tests/arm-asm-testsuite.sh index bfa1e10..995fa04 100755 --- a/tests/arm-asm-testsuite.sh +++ b/tests/arm-asm-testsuite.sh @@ -4,6 +4,8 @@ set -e # Note: "{r3}" is definitely different--but would complicate the assembler. +#echo > all.s + state="`mktemp -d`" cat ../arm-tok.h | \ grep DEF_ASM | \ @@ -48,7 +50,6 @@ do "r3, r4, #5, ror #7" \ "r3, r4, #5, rrx" \ "r3, #5, r4" \ - "r3, #4, #8" \ "r3, r4, asl #5" \ "r3, r4, lsl #5" \ "r3, r4, asr #5" \ @@ -170,17 +171,18 @@ do tcc_object="${state}/tcc-$s $args.o" expected="${state}/expected-$s $args" got="${state}/got-$s $args" - if echo "$s $args" | "${CROSS_COMPILE}as" -mlittle-endian ${as_opts} -o "${as_object}" - 2>"${err}" + if (echo ".syntax unified" && echo "$s $args") | "${CROSS_COMPILE}as" -mlittle-endian ${as_opts} -o "${as_object}" - 2>"${err}" then + #echo "$s $args" >> all.s cat "${err}" rm -f "${err}" total_count=`expr $total_count + 1` - "${CROSS_COMPILE}objdump" -S "${as_object}" |grep "^[ ]*0:" >"${expected}" + LC_ALL=C "${CROSS_COMPILE}objdump" -S -- "${as_object}" |grep "^[ ]*0:" >"${expected}" #echo '__asm__("'"$s ${args}"'");' > "${csource}" if echo '__asm__("'"$s ${args}"'");'| ${TCC} -o "${tcc_object}" -c - then - "${CROSS_COMPILE}objdump" -S "${tcc_object}" |grep "^[ ]*0:" >"${got}" + LC_ALL=C "${CROSS_COMPILE}objdump" -S -- "${tcc_object}" |grep "^[ ]*0:" >"${got}" if diff -u "${got}" "${expected}" then touch "${state}/ok-$s $args" @@ -222,11 +224,26 @@ else if [ ! -f "$t" ] then case "${test}" in - "bl r3"|"b r3"|"mov r2, #0xEFFF"|"mov r4, #0x0201") - known_failure=" (known failure)" + "b #4"|"b #-4"|"bl #4"|"bl #-4"|"blx #4"|"blx #-4"|"bl r3"|"b r3") + if LC_ALL=C "${CROSS_COMPILE}objdump" -r -- "$s" |grep -q "RELOCATION" + then + known_failure=" (known failure--GNU as puts a relocation instead)" + else + known_failure="" + status=1 + fi + ;; + "mov r2, #0xEFFF"|"mov r4, #0x0201") + known_failure=" (known failure--too magical)" + ;; + "vmov.f32 r2, r3, d1"|"vmov.f32 d1, r2, r3") + known_failure=" (known failure--GNU as bug)" + ;; + "push #4"|"stmda r2, #0xEFFF"|"stmda r2, #4"|"stmda r3, #0x0000"|"stmda r4, #0x0201"|"stmdb r2, #0xEFFF"|"stmdb r2, #4"|"stmdb r3, #0x0000"|"stmdb r4, #0x0201"|"stmia r2, #0xEFFF"|"stmia r2, #4"|"stmia r3, #0x0000"|"stmia r4, #0x0201"|"stmib r2, #0xEFFF"|"stmib r2, #4"|"stmib r3, #0x0000"|"stmib r4, #0x0201"|"stm r2, #0xEFFF"|"stm r2, #4"|"stm r3, #0x0000"|"stm r4, #0x0201") + known_failure=" (known failure--too magical)" ;; - "vmov.f32 r2, r3, d1"|"vmov.f32 d1, r2, r3") # GNU as bug - known_failure=" (known failure)" + "pop #4"|"ldmda r2, #0xEFFF"|"ldmda r2, #4"|"ldmda r3, #0x0000"|"ldmda r4, #0x0201"|"ldmdb r2, #0xEFFF"|"ldmdb r2, #4"|"ldmdb r3, #0x0000"|"ldmdb r4, #0x0201"|"ldmia r2, #0xEFFF"|"ldmia r2, #4"|"ldmia r3, #0x0000"|"ldmia r4, #0x0201"|"ldmib r2, #0xEFFF"|"ldmib r2, #4"|"ldmib r3, #0x0000"|"ldmib r4, #0x0201"|"ldm r2, #0xEFFF"|"ldm r2, #4"|"ldm r3, #0x0000"|"ldm r4, #0x0201") + known_failure=" (known failure--too magical)" ;; *) known_failure="" -- 2.29.2 _______________________________________________ Tinycc-devel mailing list Tinycc-devel@nongnu.org https://lists.nongnu.org/mailman/listinfo/tinycc-devel