xref: /qemu/tests/tcg/xtensa/test_mac16.S (revision 72ac97cd)
1#include "macros.inc"
2
3test_suite mac16
4
5#define ext16(v) (((v) & 0xffff) | (((v) & 0x8000) * 0x1ffffffe))
6#define mul16(a, b) ((ext16(a) * ext16(b)))
7
8.macro assert_acc_value v
9    rsr     a4, ACCLO
10    movi    a5, (\v) & 0xffffffff
11    assert  eq, a4, a5
12    rsr     a4, ACCHI
13    movi    a5, (\v) >> 32
14    sext    a5, a5, 7
15    assert  eq, a4, a5
16.endm
17
18.macro init_reg sr, reg, val
19    .if (\sr)
20    movi    a4, \val
21    wsr     a4, \reg
22    .else
23    movi    \reg, \val
24    .endif
25.endm
26
27.macro test_mulxx mulop, comb, s, t, a, b
28    init_reg \comb & 2, \s, \a
29    init_reg \comb & 1, \t, \b
30
31    \mulop\().ll \s, \t
32    assert_acc_value mul16(\a, \b)
33
34    \mulop\().lh \s, \t
35    assert_acc_value mul16(\a, (\b >> 16))
36
37    \mulop\().hl \s, \t
38    assert_acc_value mul16((\a >> 16), \b)
39
40    \mulop\().hh \s, \t
41    assert_acc_value mul16((\a >> 16), (\b >> 16))
42.endm
43
44test mul_aa
45    test_mulxx mul.aa, 0, a2, a3, 0xf7315a5a, 0xa5a5137f
46test_end
47
48test mul_ad
49    test_mulxx mul.ad, 1, a2, m2, 0xf7315a5a, 0xa5a5137f
50test_end
51
52test mul_da
53    test_mulxx mul.da, 2, m1, a3, 0xf7315a5a, 0xa5a5137f
54test_end
55
56test mul_dd
57    test_mulxx mul.dd, 3, m0, m3, 0xf7315a5a, 0xa5a5137f
58test_end
59
60
61.macro init_acc iv
62    movi    a4, (\iv) & 0xffffffff
63    wsr     a4, ACCLO
64    movi    a4, (\iv) >> 32
65    wsr     a4, ACCHI
66.endm
67
68.macro test_mulxxx mulop, comb, s, t, a, b, iv, op
69    init_reg \comb & 2, \s, \a
70    init_reg \comb & 1, \t, \b
71
72    init_acc \iv
73    \mulop\().ll \s, \t
74    assert_acc_value (\iv \op mul16(\a, \b))
75
76    init_acc \iv
77    \mulop\().lh \s, \t
78    assert_acc_value (\iv \op mul16(\a, (\b >> 16)))
79
80    init_acc \iv
81    \mulop\().hl \s, \t
82    assert_acc_value (\iv \op mul16((\a >> 16), \b))
83
84    init_acc \iv
85    \mulop\().hh \s, \t
86    assert_acc_value (\iv \op mul16((\a >> 16), (\b >> 16)))
87.endm
88
89
90test mula_aa
91    test_mulxxx mula.aa, 0, a2, a3, 0xf7315a5a, 0xa5a5137f, 0xfff73155aa, +
92test_end
93
94test mula_ad
95    test_mulxxx mula.ad, 1, a2, m2, 0xf7315a5a, 0xa5a5137f, 0xfff73155aa, +
96test_end
97
98test mula_da
99    test_mulxxx mula.da, 2, m1, a3, 0xf7315a5a, 0xa5a5137f, 0x0ff73155aa, +
100test_end
101
102test mula_dd
103    test_mulxxx mula.dd, 3, m0, m3, 0xf7315a5a, 0xa5a5137f, 0x0ff73155aa, +
104test_end
105
106
107test muls_aa
108    test_mulxxx muls.aa, 0, a2, a3, 0xf7315a5a, 0xa5a5137f, 0x0ff73155aa, -
109test_end
110
111test muls_ad
112    test_mulxxx muls.ad, 1, a2, m2, 0xf7315a5a, 0xa5a5137f, 0x0ff73155aa, -
113test_end
114
115test muls_da
116    test_mulxxx muls.da, 2, m1, a3, 0xf7315a5a, 0xa5a5137f, 0xfff73155aa, -
117test_end
118
119test muls_dd
120    test_mulxxx muls.dd, 3, m0, m3, 0xf7315a5a, 0xa5a5137f, 0xfff73155aa, -
121test_end
122
123test ldinc
124    movi    a2, 1f - 4
125    ldinc   m0, a2
126    movi    a3, 1f
127    assert  eq, a2, a3
128    rsr     a3, m0
129    movi    a4, 0x55aa137f
130    assert  eq, a3, a4
131    ldinc   m1, a2
132    movi    a3, 1f + 4
133    assert  eq, a2, a3
134    rsr     a3, m1
135    movi    a4, 0x12345678
136    assert  eq, a3, a4
137
138.data
1391:  .word 0x55aa137f, 0x12345678, 0x137fa5a5
140.text
141test_end
142
143test lddec
144    movi    a2, 1f
145    lddec   m2, a2
146    movi    a3, 1f - 4
147    assert  eq, a2, a3
148    rsr     a3, m2
149    movi    a4, 0x12345678
150    assert  eq, a3, a4
151    lddec   m3, a2
152    movi    a3, 1f - 8
153    assert  eq, a2, a3
154    rsr     a3, m3
155    movi    a4, 0x55aa137f
156    assert  eq, a3, a4
157.data
158    .word 0x55aa137f, 0x12345678
1591:
160.text
161test_end
162
163
164.macro test_mulxxx_ld mulop, ldop, comb, w, x, s, t, a, b, iv, op
165    init_reg \comb & 2, \s, \a
166    init_reg \comb & 1, \t, \b
167
168    init_acc \iv
169    \mulop\().ll.\ldop \w, \x, \s, \t
170    assert_acc_value (\iv \op mul16(\a, \b))
171
172    init_acc \iv
173    \mulop\().lh.\ldop \w, \x, \s, \t
174    assert_acc_value (\iv \op mul16(\a, (\b >> 16)))
175
176    init_acc \iv
177    \mulop\().hl.\ldop \w, \x, \s, \t
178    assert_acc_value (\iv \op mul16((\a >> 16), \b))
179
180    init_acc \iv
181    \mulop\().hh.\ldop \w, \x, \s, \t
182    assert_acc_value (\iv \op mul16((\a >> 16), (\b >> 16)))
183.endm
184
185test mula_da_ldinc
186    movi    a2, 1f - 4
187    test_mulxxx_ld mula.da, ldinc, 2, m1, a2, m1, a3, \
188        0xf7315a5a, 0xa5a5137f, 0x0ff73155aa, +
189    movi    a3, 1f + 12
190    assert  eq, a2, a3
191    rsr     a2, m1
192    movi    a3, 0x12345678
193    assert  eq, a2, a3
194.data
1951:  .word 0xf7315a5a, 0xf7315a5a, 0xf7315a5a, 0x12345678
196.text
197test_end
198
199test mula_dd_ldinc
200    movi    a2, 1f - 4
201    test_mulxxx_ld mula.dd, ldinc, 3, m2, a2, m1, m2, \
202        0xf7315a5a, 0xa5a5137f, 0x0ff73155aa, +
203    movi    a3, 1f + 12
204    assert  eq, a2, a3
205    rsr     a2, m2
206    movi    a3, 0x12345678
207    assert  eq, a2, a3
208.data
2091:  .word 0xa5a5137f, 0xa5a5137f, 0xa5a5137f, 0x12345678
210.text
211test_end
212
213test mula_da_lddec
214    movi    a2, 1f
215    test_mulxxx_ld mula.da, lddec, 2, m1, a2, m1, a3, \
216        0xf7315a5a, 0xa5a5137f, 0x0ff73155aa, +
217    movi    a3, 1f - 16
218    assert  eq, a2, a3
219    rsr     a2, m1
220    movi    a3, 0x12345678
221    assert  eq, a2, a3
222.data
223    .word 0x12345678, 0xf7315a5a, 0xf7315a5a, 0xf7315a5a
2241:
225.text
226test_end
227
228test mula_dd_lddec
229    movi    a2, 1f
230    test_mulxxx_ld mula.dd, lddec, 3, m2, a2, m1, m2, \
231        0xf7315a5a, 0xa5a5137f, 0x0ff73155aa, +
232    movi    a3, 1f - 16
233    assert  eq, a2, a3
234    rsr     a2, m2
235    movi    a3, 0x12345678
236    assert  eq, a2, a3
237.data
238    .word 0x12345678, 0xa5a5137f, 0xa5a5137f, 0xa5a5137f
2391:
240.text
241test_end
242
243test_suite_end
244