summaryrefslogtreecommitdiff
path: root/gas/testsuite/gas/arc/arc.exp
blob: b0984535e2e70723f80645da30f9eb44aff0b047 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
# 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"

}