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
|
#!/bin/sh
set -eu
tmps="$(mktemp --suffix .s)"
tmpo="$(mktemp --suffix .o)"
tmpb="$(mktemp --suffix .bin)"
trap "rm -f \"$tmps\" \"$tmpo\" \"$tmpb\"" EXIT
t () {
echo "$1" > "$tmps"
clang -Wno-everything -c -s "$tmps" -o "$tmpo"
objcopy -j ".text" -O binary "$tmpo" "$tmpb"
want="$(xxd -ps "$tmpb" | head -n 1 | cut -d ' ' -f 2-)"
if ! ./minias < "$tmps" > "$tmpo"
then
echo "failed to assemble: $1"
exit 1
fi
objcopy -j ".text" -O binary "$tmpo" "$tmpb"
got="$(xxd -ps "$tmpb" | head -n 1 | cut -d ' ' -f 2-)"
if test "$got" != "$want"
then
echo ""
echo "want: $1 -> $want"
echo "got:"
objdump -d "$tmpo"
exit 1
fi
echo -n "."
}
for r in a b
do
t "xchg %${r}l, %${r}l"
t "xchg %${r}x, %${r}x"
t "xchg %${r}x, %bx"
t "xchg %bx, %${r}x"
# t "xchg %e${r}x, %e${r}x" # clang disagrees
t "xchg %e${r}x, %ebx"
t "xchg %ebx, %e${r}x"
t "xchg %r${r}x, %rbx"
t "xchg %rbx, %r${r}x"
t "xchg %r${r}x, (%r${r}x)"
t "xchg %e${r}x, (%r${r}x)"
t "xchg %${r}x, (%r${r}x)"
t "xchg %${r}l, (%r${r}x)"
t "xchg (%r${r}x), %r${r}x"
t "xchg (%r${r}x), %e${r}x"
t "xchg (%r${r}x), %${r}x"
t "xchg (%r${r}x), %${r}l"
done
for r in a b
do
t "leaq (%r${r}x), %r${r}x"
t "leal (%r${r}x), %e${r}x"
t "leaw (%r${r}x), %${r}x"
done
for op in mov add and or sub xor
do
# rip relative
t "${op}b \$127, (%rip)"
t "${op}w \$32767, (%rip)"
t "${op}l \$2147483647, (%rip)"
t "${op}q \$2147483647, (%rip)"
t "${op}q %r9, %r9"
for r in a b
do
# immediate variants.
t "${op}b \$127, (%r${r}x)"
t "${op}w \$32767, (%r${r}x)"
t "${op}l \$2147483647, (%r${r}x)"
t "${op}q \$2147483647, (%r${r}x)"
t "${op}b \$127, %${r}l"
t "${op}w \$32767, %${r}x"
t "${op}l \$2147483647, %e${r}x"
t "${op}q \$2147483647, %r${r}x"
# r rm variants
t "${op}b (%rax), %${r}l"
t "${op}w (%rax), %${r}x"
t "${op}l (%rax), %e${r}x"
t "${op}q (%rax), %r${r}x"
t "${op}q (%rbp), %r${r}x"
t "${op}q (%r8), %r${r}x"
t "${op}q (%r13), %r${r}x"
t "${op}b %${r}l, (%rax)"
t "${op}w %${r}x, (%rax)"
t "${op}l %e${r}x, (%rax)"
t "${op}q %r${r}x, (%rax)"
t "${op}q %r${r}x, (%rbp)"
t "${op}q %r${r}x, (%r8)"
t "${op}q %r${r}x, (%r13)"
t "${op}b %${r}l, %al"
t "${op}w %${r}x, %ax"
t "${op}l %e${r}x, %eax"
t "${op}q %r${r}x, %rax"
done
done
|