[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
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Tinycc-devel] [PATCH] arm-asm: Support immediate values without "#" (Unified Assembly Language),
Danny Milosavljevic <=