1/* Tests the l.ext{b,h}{s,z} instructions.
2
3   Copyright (C) 2017-2024 Free Software Foundation, Inc.
4
5   This program is free software; you can redistribute it and/or modify
6   it under the terms of the GNU General Public License as published by
7   the Free Software Foundation; either version 3 of the License, or
8   (at your option) any later version.
9
10   This program is distributed in the hope that it will be useful,
11   but WITHOUT ANY WARRANTY; without even the implied warranty of
12   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13   GNU General Public License for more details.
14
15   You should have received a copy of the GNU General Public License
16   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
17
18# mach: or1k
19# output: report(0x0000007f);\n
20# output: report(0x0000007f);\n
21# output: report(0x00000053);\n
22# output: report(0x00000053);\n
23# output: report(0x0000ff53);\n
24# output: report(0x00000053);\n
25# output: report(0x00001234);\n
26# output: report(0x00000034);\n
27# output: report(0x000000ff);\n
28# output: report(0xffffffff);\n
29# output: report(0x00000080);\n
30# output: report(0xffffff80);\n
31# output: report(0x0000ff80);\n
32# output: report(0xffffff80);\n
33# output: report(0x00007f80);\n
34# output: report(0xffffff80);\n
35# output: report(0x00007fff);\n
36# output: report(0xffffffff);\n
37# output: report(0x0000007f);\n
38# output: report(0x0000007f);\n
39# output: report(0x00000053);\n
40# output: report(0x00000053);\n
41# output: report(0x0000ff53);\n
42# output: report(0x00000053);\n
43# output: report(0x00001234);\n
44# output: report(0x00000034);\n
45# output: report(0x000000ff);\n
46# output: report(0x000000ff);\n
47# output: report(0x00000080);\n
48# output: report(0x00000080);\n
49# output: report(0x0000ff80);\n
50# output: report(0x00000080);\n
51# output: report(0x00007f80);\n
52# output: report(0x00000080);\n
53# output: report(0x00007fff);\n
54# output: report(0x000000ff);\n
55# output: report(0x00007fff);\n
56# output: report(0x00007fff);\n
57# output: report(0x00005233);\n
58# output: report(0x00005233);\n
59# output: report(0xffff2f53);\n
60# output: report(0x00002f53);\n
61# output: report(0x12345678);\n
62# output: report(0x00005678);\n
63# output: report(0x0000ffff);\n
64# output: report(0xffffffff);\n
65# output: report(0x00008000);\n
66# output: report(0xffff8000);\n
67# output: report(0x0000ff80);\n
68# output: report(0xffffff80);\n
69# output: report(0x80008000);\n
70# output: report(0xffff8000);\n
71# output: report(0x7fffffff);\n
72# output: report(0xffffffff);\n
73# output: report(0x00007fff);\n
74# output: report(0x00007fff);\n
75# output: report(0x00005233);\n
76# output: report(0x00005233);\n
77# output: report(0xffff2f53);\n
78# output: report(0x00002f53);\n
79# output: report(0x12345678);\n
80# output: report(0x00005678);\n
81# output: report(0x0000ffff);\n
82# output: report(0x0000ffff);\n
83# output: report(0x00008000);\n
84# output: report(0x00008000);\n
85# output: report(0x0000ff80);\n
86# output: report(0x0000ff80);\n
87# output: report(0x80008000);\n
88# output: report(0x00008000);\n
89# output: report(0x7fffffff);\n
90# output: report(0x0000ffff);\n
91# output: report(0xffffffff);\n
92# output: report(0xffffffff);\n
93# output: report(0x7fffffff);\n
94# output: report(0x7fffffff);\n
95# output: report(0x7fff7fff);\n
96# output: report(0x7fff7fff);\n
97# output: report(0xffff7f7f);\n
98# output: report(0xffff7f7f);\n
99# output: report(0xffffff7f);\n
100# output: report(0xffffff7f);\n
101# output: report(0xffff7fff);\n
102# output: report(0xffff7fff);\n
103# output: report(0x7fff7f7f);\n
104# output: report(0x7fff7f7f);\n
105# output: report(0x12345678);\n
106# output: report(0x12345678);\n
107# output: report(0xffffffff);\n
108# output: report(0xffffffff);\n
109# output: report(0x7fffffff);\n
110# output: report(0x7fffffff);\n
111# output: report(0x7fff7fff);\n
112# output: report(0x7fff7fff);\n
113# output: report(0xffff7f7f);\n
114# output: report(0xffff7f7f);\n
115# output: report(0xffffff7f);\n
116# output: report(0xffffff7f);\n
117# output: report(0xffff7fff);\n
118# output: report(0xffff7fff);\n
119# output: report(0x7fff7f7f);\n
120# output: report(0x7fff7f7f);\n
121# output: report(0x12345678);\n
122# output: report(0x12345678);\n
123# output: exit(0)\n
124
125#include "or1k-asm-test-env.h"
126
127	.macro CHECK_EXT insn, val, mask, high_mask
128	LOAD_IMMEDIATE r4, \val
129	REPORT_REG_TO_CONSOLE r4
130	\insn   r5, r4
131	REPORT_REG_TO_CONSOLE r5
132	LOAD_IMMEDIATE r6, \mask
133	l.xori  r7, r6, -1
134	l.and   r8, r4, r6
135	l.and   r9, r5, r6
136	l.sfne  r8, r9
137	OR1K_DELAYED_NOP (l.bf    ext_fail)
138	l.and   r8, r5, r7
139	LOAD_IMMEDIATE r7, \high_mask
140	l.sfne  r8, r7
141	OR1K_DELAYED_NOP (l.bf    ext_fail)
142	.endm
143
144#define CHECK_HIGH3_CLEAR(insn, val) CHECK_EXT insn, val, 0x000000ff, 0
145#define CHECK_HIGH3_SET(val) CHECK_EXT l.extbs, val, 0x000000ff, 0xffffff00
146#define CHECK_HIGH2_CLEAR(insn, val) CHECK_EXT insn, val, 0x0000ffff, 0
147#define CHECK_HIGH2_SET(val) CHECK_EXT l.exths, val, 0x0000ffff, 0xffff0000
148
149	.macro CHECK_MOVE insn, val
150	LOAD_IMMEDIATE r4, \val
151	REPORT_REG_TO_CONSOLE r4
152	\insn   r5, r4
153	REPORT_REG_TO_CONSOLE r5
154	l.sfne  r5, r4
155	OR1K_DELAYED_NOP (l.bf    ext_fail)
156	.endm
157
158	STANDARD_TEST_ENVIRONMENT
159
160	.section .text
161start_tests:
162	PUSH LINK_REGISTER_R9
163
164	/* Test l.extbs  */
165	CHECK_HIGH3_CLEAR ( l.extbs, 0x7f   )
166	CHECK_HIGH3_CLEAR ( l.extbs, 0x53   )
167	CHECK_HIGH3_CLEAR ( l.extbs, 0xff53 )
168	CHECK_HIGH3_CLEAR ( l.extbs, 0x1234 )
169
170	CHECK_HIGH3_SET (0xff)
171	CHECK_HIGH3_SET (0x80)
172	CHECK_HIGH3_SET (0xff80)
173	CHECK_HIGH3_SET (0x7f80)
174	CHECK_HIGH3_SET (0x7fff)
175
176	/* Test l.extbz  */
177	CHECK_HIGH3_CLEAR (l.extbz, 0x7f)
178	CHECK_HIGH3_CLEAR (l.extbz, 0x53)
179	CHECK_HIGH3_CLEAR (l.extbz, 0xff53)
180	CHECK_HIGH3_CLEAR (l.extbz, 0x1234)
181
182	CHECK_HIGH3_CLEAR (l.extbz, 0xff)
183	CHECK_HIGH3_CLEAR (l.extbz, 0x80)
184	CHECK_HIGH3_CLEAR (l.extbz, 0xff80)
185	CHECK_HIGH3_CLEAR (l.extbz, 0x7f80)
186	CHECK_HIGH3_CLEAR (l.extbz, 0x7fff)
187
188	/* Test l.exths  */
189	CHECK_HIGH2_CLEAR (l.exths, 0x7fff)
190	CHECK_HIGH2_CLEAR (l.exths, 0x5233)
191	CHECK_HIGH2_CLEAR (l.exths, 0xffff2f53)
192	CHECK_HIGH2_CLEAR (l.exths, 0x12345678)
193
194	CHECK_HIGH2_SET (0xffff)
195	CHECK_HIGH2_SET (0x8000)
196	CHECK_HIGH2_SET (0xff80)
197	CHECK_HIGH2_SET (0x80008000)
198	CHECK_HIGH2_SET (0x7fffffff)
199
200	/* Test l.exthz  */
201	CHECK_HIGH2_CLEAR (l.exthz, 0x7fff)
202	CHECK_HIGH2_CLEAR (l.exthz, 0x5233)
203	CHECK_HIGH2_CLEAR (l.exthz, 0xffff2f53)
204	CHECK_HIGH2_CLEAR (l.exthz, 0x12345678)
205
206	CHECK_HIGH2_CLEAR (l.exthz, 0xffff)
207	CHECK_HIGH2_CLEAR (l.exthz, 0x8000)
208	CHECK_HIGH2_CLEAR (l.exthz, 0xff80)
209	CHECK_HIGH2_CLEAR (l.exthz, 0x80008000)
210	CHECK_HIGH2_CLEAR (l.exthz, 0x7fffffff)
211
212	/* Test l.extws  */
213	CHECK_MOVE l.extws, 0xffffffff
214	CHECK_MOVE l.extws, 0x7fffffff
215	CHECK_MOVE l.extws, 0x7fff7fff
216	CHECK_MOVE l.extws, 0xffff7f7f
217	CHECK_MOVE l.extws, 0xffffff7f
218	CHECK_MOVE l.extws, 0xffff7fff
219	CHECK_MOVE l.extws, 0x7fff7f7f
220	CHECK_MOVE l.extws, 0x12345678
221
222	/* Test l.extwz  */
223	CHECK_MOVE l.extwz, 0xffffffff
224	CHECK_MOVE l.extwz, 0x7fffffff
225	CHECK_MOVE l.extwz, 0x7fff7fff
226	CHECK_MOVE l.extwz, 0xffff7f7f
227	CHECK_MOVE l.extwz, 0xffffff7f
228	CHECK_MOVE l.extwz, 0xffff7fff
229	CHECK_MOVE l.extwz, 0x7fff7f7f
230	CHECK_MOVE l.extwz, 0x12345678
231
232	POP LINK_REGISTER_R9
233	RETURN_TO_LINK_REGISTER_R9
234
235ext_fail:
236	EXIT_SIMULATION_WITH_IMMEDIATE_EXIT_CODE SEC_GENERIC_ERROR
237