tinycc-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Tinycc-devel] [PATCH] arm-asm: Support immediate values without "#" (Un


From: Danny Milosavljevic
Subject: [Tinycc-devel] [PATCH] arm-asm: Support immediate values without "#" (Unified Assembly Language)
Date: Thu, 28 Jan 2021 15:09:42 +0100

---
 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




reply via email to

[Prev in Thread] Current Thread [Next in Thread]