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