| # ARC gas testsuite |
| |
| # Test an insn from a template .s/.d. |
| # The best way to create the .d file is to run the tests without it, let |
| # dejagnu crash, run as.new on the just built .s file, run objdump -dr on |
| # the result of that, copy the result into the .d file, and edit in the |
| # necessary patterns (@OC@, etc.). Sounds complicated but it's easy. The |
| # catch is that we assume a working assembler is used to build it. That's |
| # obviously not entirely kosher, but once the .d file is created one can |
| # verify it's contents over time. |
| # |
| # Template patterns: |
| # @OC@ - placeholder for the opcode |
| # @IC+?@ - place holder for the insn code |
| # @I3+??@ - place holder for the operation code of code 3 insns. |
| |
| proc test_template_insn { cpu tmpl opcode icode } { |
| global srcdir subdir objdir |
| |
| # Change @OC@ in the template file to $opcode |
| |
| set in_fd [open $srcdir/$subdir/$tmpl.s r] |
| set out_fd [open $objdir/$opcode.s w] |
| # FIXME: check return codes |
| |
| puts $out_fd "\t.cpu $cpu\n" |
| while { [gets $in_fd line] >= 0 } { |
| regsub "@OC@" $line $opcode line |
| puts $out_fd $line |
| } |
| |
| close $in_fd |
| close $out_fd |
| |
| # Create output template. |
| |
| set in_fd [open $srcdir/$subdir/$tmpl.d r] |
| set out_fd [open $objdir/$opcode.d w] |
| # FIXME: check return codes |
| |
| while { [gets $in_fd line] >= 0 } { |
| regsub "@OC@" $line $opcode line |
| #send_user "$line\n" |
| if [string match "*@IC+?@*" $line] { |
| # Insert the opcode. It occupies the top 5 bits. |
| regexp "^(.*)@IC\\+(.)@(.*)$" $line junk leftpart n rightpart |
| set n [expr ($icode << 3) + $n] |
| set n [format "%02x" $n] |
| puts $out_fd "$leftpart$n$rightpart" |
| } elseif [string match "*@I3+??@*" $line] { |
| # Insert insn 3 code (register C field) |
| # b15=8/0, b8=1/0 (their respective hex values in the objdump) |
| regexp "^(.*)@I3\\+(.)(.)@(.*)$" $line junk leftpart b15 b8 rightpart |
| set n [expr ($icode << 1) + ($b15 << 4) + ($b8 << 0)] |
| set n [format "%02x" $n] |
| puts $out_fd "$leftpart$n$rightpart" |
| } else { |
| puts $out_fd $line |
| } |
| } |
| |
| close $in_fd |
| close $out_fd |
| |
| # Finally, run the test. |
| |
| run_dump_test $objdir/$opcode |
| |
| # "make clean" won't delete these, so for now we must. |
| catch "exec rm -f $objdir/$opcode.s $objdir/$opcode.d" |
| } |
| |
| # Run the tests. |
| |
| if [istarget arc*-*-*] then { |
| |
| test_template_insn base math adc 9 |
| test_template_insn base math add 8 |
| test_template_insn base math and 12 |
| test_template_insn base math bic 14 |
| test_template_insn base math or 13 |
| test_template_insn base math sbc 11 |
| test_template_insn base math sub 10 |
| test_template_insn base math xor 15 |
| |
| test_template_insn base alias mov 12 |
| test_template_insn base alias rlc 9 |
| test_template_insn base alias asl 8 |
| # `lsl' gets dumped as `asl' so this must be tested elsewhere. |
| # test_template_insn base alias lsl 8 |
| |
| test_template_insn base sshift asr 1 |
| test_template_insn base sshift lsr 2 |
| test_template_insn base sshift ror 3 |
| test_template_insn base sshift rrc 4 |
| |
| test_template_insn base branch b 4 |
| test_template_insn base branch bl 5 |
| test_template_insn base branch lp 6 |
| |
| run_dump_test "j" |
| |
| test_template_insn base insn3 sexb 5 |
| test_template_insn base insn3 sexw 6 |
| test_template_insn base insn3 extb 7 |
| test_template_insn base insn3 extw 8 |
| |
| run_dump_test "flag" |
| # run_dump_test "nop" |
| |
| run_dump_test "ld" |
| run_dump_test "st" |
| |
| } |