diff options
Diffstat (limited to 'tinycc/tests/arm-asm-testsuite.sh')
| -rw-r--r-- | tinycc/tests/arm-asm-testsuite.sh | 243 |
1 files changed, 243 insertions, 0 deletions
diff --git a/tinycc/tests/arm-asm-testsuite.sh b/tinycc/tests/arm-asm-testsuite.sh new file mode 100644 index 0000000..61c5dad --- /dev/null +++ b/tinycc/tests/arm-asm-testsuite.sh @@ -0,0 +1,243 @@ +#!/bin/sh + +set -e + +# Note: "{r3}" is definitely different--but would complicate the assembler. + +state="`mktemp -d`" +cat ../arm-tok.h | \ + grep DEF_ASM | \ + grep -v 'not useful' | \ + grep -v '#define' | \ + grep -v '/[*]' | \ + grep -v 'DEF_ASM_CONDED_WITH_SUFFIX(x' | \ + sed -e 's;^[ ]*DEF_ASM_CONDED_VFP_F32_F64[^(]*(\(.*\)).*$; DEF_ASM_CONDED(\1.f32)\ + DEF_ASM_CONDED(\1.f64);g' | \ + sed -e 's;^[ ]*DEF_ASM[^(]*(\(.*\)).*$;\1;g' -e 's;, ;.;g' | \ + egrep -v '^((r|c|p|s|d)[0-9]+|fp|ip|sp|lr|pc|asl|apsr_nzcv|fpsid|fpscr|fpexc)$' | while read s +do + as_opts="" + if [ "${s#v}" != "${s}" ] + then + if grep -q "CONFIG_arm_vfp=yes" ../config.mak + then + as_opts="${as_opts} -mfpu=vfp" + else + echo "note: skipping VFP instruction: $s (because VFP is disabled)">&2 + continue + fi + fi + ok=0 + for args in "r3, r4, r5, r6" \ + "r3, r4, r5" \ + "r3, r4, r5, asl #7" \ + "r3, r4, r5, lsl #7" \ + "r3, r4, r5, asr #7" \ + "r3, r4, r5, lsr #7" \ + "r3, r4, r5, ror #7" \ + "r3, r4, r5, rrx" \ + "r3, r4, r5, asl r6" \ + "r3, r4, r5, lsl r6" \ + "r3, r4, r5, asr r6" \ + "r3, r4, r5, lsr r6" \ + "r3, r4, r5, ror r6" \ + "r3, r4, #5, asl #7" \ + "r3, r4, #5, lsl #7" \ + "r3, r4, #5, asr #7" \ + "r3, r4, #5, lsr #7" \ + "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" \ + "r3, r4, lsr #5" \ + "r3, r4, ror #5" \ + "r3, r4, ror #8" \ + "r3, r4, asl r5" \ + "r3, r4, lsl r5" \ + "r3, r4, asr r5" \ + "r3, r4, lsr r5" \ + "r3, r4, ror r5" \ + "r3, r4, ror #8" \ + "r3, r4, ror #16" \ + "r3, r4, ror #24" \ + "r3, r4, rrx" \ + "r3, #4, asl #5" \ + "r3, #4, lsl #5" \ + "r3, #4, asr #5" \ + "r3, #4, lsr #5" \ + "r3, #4, ror #5" \ + "r3, r4, rrx" \ + "r3, r4" \ + "r3" \ + "{r3,r4,r5}" \ + "{r3,r5,r4}" \ + "r2!, {r3,r4,r5}" \ + "r2!, {r3,r5,r4}" \ + "r2, {r3,r4,r5}" \ + "r2, {r3,r5,r4}" \ + "r2, [r3, r4]" \ + "r2, [r3, r4]!" \ + "r2, [r3, -r4]" \ + "r2, [r3, -r4]!" \ + "r2, [r3], r4" \ + "r2, [r3], -r4" \ + "r2, [r3]" \ + "r2, r3, [r4, lsl# 2]" \ + "r2, [r3, r4, lsr# 1]" \ + "r2, [r3, r4, lsr# 2]!" \ + "r2, [r3, -r4, ror# 3]" \ + "r2, [r3, -r4, lsl# 1]!" \ + "r2, [r3], r4, lsl# 3" \ + "r2, [r3], -r4, asr# 31" \ + "r2, [r3], -r4, asl# 1" \ + "r2, [r3], -r4, rrx" \ + "r2, [r3]" \ + "r2, r3, [r4]" \ + "r2, [r3, #4]" \ + "r2, [r3, #-4]" \ + "r2, [r3, #0x45]" \ + "r2, [r3, #-0x45]" \ + "r2, r3, #4" \ + "r2, r3, #-4" \ + "p10, #7, c2, c0, c1, #4" \ + "p10, #7, r2, c0, c1, #4" \ + "p10, #0, c2, c0, c1, #4" \ + "p10, #0, r2, c0, c1, #4" \ + "r2, #4" \ + "r2, #-4" \ + "r2, #0xEFFF" \ + "r3, #0x0000" \ + "r4, #0x0201" \ + "r4, #0xFFFFFF00" \ + "r2, #-4" \ + "p10, #7, c2, c0, c1, #4" \ + "p10, #7, r2, c0, c1, #4" \ + "#4" \ + "#-4" \ + "p5, c2, [r3]" \ + "p5, c3, [r4]" \ + "p5, c2, [r3, #4]" \ + "p5, c2, [r3, #-4]" \ + "p5, c2, [r3, #0x45]" \ + "p5, c2, [r3, #-0x45]" \ + "s2, [r3]" \ + "s3, [r4]" \ + "s2, [r3, #4]" \ + "s2, [r3, #-4]" \ + "s2, [r3, #0x45]" \ + "s2, [r3, #-0x45]" \ + "r1, {d3-d4}" \ + "r1!, {d3-d4}" \ + "r2, {d4-d15}" \ + "r3!, {d4-d15}" \ + "r3!, {d4}" \ + "r2, {s4-s31}" \ + "r3!, {s4}" \ + "{d3-d4}" \ + "{d4-d15}" \ + "{d4}" \ + "{s4-s31}" \ + "{s4}" \ + "s2, s3, s4" \ + "s2, s3" \ + "d2, d3, d4" \ + "d2, d3" \ + "s2, #0" \ + "d2, #0" \ + "s3, #0.0" \ + "d3, #0.0" \ + "s4, #-0.1796875" \ + "d4, #0.1796875" \ + "r2, r3, d1" \ + "d1, r2, r3" \ + "s1, r2" \ + "r2, s1" \ + "r2, fpexc" \ + "r2, fpscr" \ + "r2, fpsid" \ + "apsr_nzcv, fpscr" \ + "fpexc, r2" \ + "fpscr, r2" \ + "fpsid, r2" \ + "s3, d4" \ + "d4, s3" \ + "" + do + #echo ".syntax unified" > a.s + err="`mktemp --suffix=-stderr.log`" + as_object="${state}/as-$s $args.o" + 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}" + then + cat "${err}" + rm -f "${err}" + total_count=`expr $total_count + 1` + "${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}" + if diff -u "${got}" "${expected}" + then + touch "${state}/ok-$s $args" + else + echo "warning: '$s $args' did not work in tcc (see above)">&2 + fi + else + rm -f "${tcc_object}" + echo "warning: '$s $args' did not work in tcc">&2 + fi + ok=1 + else # GNU as can't do it either--so we don't care + rm -f "${as_object}" + fi + rm -f "${err}" + done + if [ "${ok}" -eq "0" ] + then + echo "warning: $s could not be used.">&2 + continue + fi +done + +successful_count="$(ls -1 "${state}/ok-"* |wc -l)" +total_count="$(ls -1 "${state}/as-"*.o |wc -l)" +echo "${successful_count} of ${total_count} tests succeeded.">&2 +if [ "${successful_count}" -eq "${total_count}" ] +then + rm -rf "${state}" + exit 0 +else + status=0 + for s in "${state}/as-"*.o + do + test="$(basename "$s")" + test="${test%.o}" + test="${test#as-}" + t="${state}/ok-${test}" + if [ ! -f "$t" ] + then + case "${test}" in + "bl r3"|"b r3"|"mov r2, #0xEFFF"|"mov r4, #0x0201") + known_failure=" (known failure)" + ;; + "vmov.f32 r2, r3, d1"|"vmov.f32 d1, r2, r3") # GNU as bug + known_failure=" (known failure)" + ;; + *) + known_failure="" + status=1 + ;; + esac + echo "Failed test: ${test}${known_failure}">&2 + fi + done + rm -rf "${state}" + exit "${status}" +fi |
