075295886a3c9c593f368c78b0b5b0b53831604e
[mesa.git] / src / amd / compiler / tests / test_to_hw_instr.cpp
1 /*
2 * Copyright © 2020 Valve Corporation
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
10 *
11 * The above copyright notice and this permission notice (including the next
12 * paragraph) shall be included in all copies or substantial portions of the
13 * Software.
14 *
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
21 * IN THE SOFTWARE.
22 *
23 */
24 #include "helpers.h"
25
26 using namespace aco;
27
28 BEGIN_TEST(to_hw_instr.swap_subdword)
29 for (unsigned i = GFX8; i <= GFX9; i++) {
30 if (!setup_cs(NULL, (chip_class)i))
31 continue;
32
33 PhysReg v0_lo{256};
34 PhysReg v0_hi{256};
35 PhysReg v0_b1{256};
36 PhysReg v0_b3{256};
37 PhysReg v1_lo{257};
38 PhysReg v1_hi{257};
39 PhysReg v1_b1{257};
40 PhysReg v1_b3{257};
41 v0_hi.reg_b += 2;
42 v1_hi.reg_b += 2;
43 v0_b1.reg_b += 1;
44 v1_b1.reg_b += 1;
45 v0_b3.reg_b += 3;
46 v1_b3.reg_b += 3;
47
48 //>> p_unit_test 0
49 //~gfx8! v2b: %0:v[0][16:32] = v_xor_b32 %0:v[0][16:32], %0:v[0][0:16] dst_preserve
50 //~gfx8! v2b: %0:v[0][0:16] = v_xor_b32 %0:v[0][16:32], %0:v[0][0:16] dst_preserve
51 //~gfx8! v2b: %0:v[0][16:32] = v_xor_b32 %0:v[0][16:32], %0:v[0][0:16] dst_preserve
52 //~gfx9! v1: %0:v[0] = v_pk_add_u16 %0:v[0].yx, 0
53 bld.pseudo(aco_opcode::p_unit_test, Operand(0u));
54 bld.pseudo(aco_opcode::p_parallelcopy,
55 Definition(v0_lo, v2b), Definition(v0_hi, v2b),
56 Operand(v0_hi, v2b), Operand(v0_lo, v2b));
57
58 //! p_unit_test 1
59 //~gfx8! v1: %0:v[1] = v_xor_b32 %0:v[1], %0:v[0]
60 //~gfx8! v1: %0:v[0] = v_xor_b32 %0:v[1], %0:v[0]
61 //~gfx8! v1: %0:v[1] = v_xor_b32 %0:v[1], %0:v[0]
62 //~gfx9! v1: %0:v[0], v1: %0:v[1] = v_swap_b32 %0:v[1], %0:v[0]
63 //! v2b: %0:v[1][16:32] = v_mov_b32 %0:v[0][16:32] dst_preserve
64 bld.pseudo(aco_opcode::p_unit_test, Operand(1u));
65 bld.pseudo(aco_opcode::p_parallelcopy,
66 Definition(v0_lo, v1), Definition(v1_lo, v2b),
67 Operand(v1_lo, v1), Operand(v0_lo, v2b));
68
69 //! p_unit_test 2
70 //! v2b: %0:v[0][16:32] = v_mov_b32 %0:v[1][16:32] dst_preserve
71 //! v2b: %0:v[1][16:32] = v_mov_b32 %0:v[0][0:16] dst_preserve
72 //! v2b: %0:v[1][0:16] = v_xor_b32 %0:v[1][0:16], %0:v[0][0:16] dst_preserve
73 //! v2b: %0:v[0][0:16] = v_xor_b32 %0:v[1][0:16], %0:v[0][0:16] dst_preserve
74 //! v2b: %0:v[1][0:16] = v_xor_b32 %0:v[1][0:16], %0:v[0][0:16] dst_preserve
75 bld.pseudo(aco_opcode::p_unit_test, Operand(2u));
76 bld.pseudo(aco_opcode::p_parallelcopy,
77 Definition(v0_lo, v1), Definition(v1_lo, v2b), Definition(v1_hi, v2b),
78 Operand(v1_lo, v1), Operand(v0_lo, v2b), Operand(v0_lo, v2b));
79
80 //! p_unit_test 3
81 //~gfx8! v1: %0:v[1] = v_xor_b32 %0:v[1], %0:v[0]
82 //~gfx8! v1: %0:v[0] = v_xor_b32 %0:v[1], %0:v[0]
83 //~gfx8! v1: %0:v[1] = v_xor_b32 %0:v[1], %0:v[0]
84 //~gfx9! v1: %0:v[0], v1: %0:v[1] = v_swap_b32 %0:v[1], %0:v[0]
85 //! v2b: %0:v[1][0:16] = v_mov_b32 %0:v[0][0:16] dst_preserve
86 //! v1b: %0:v[1][16:24] = v_mov_b32 %0:v[0][16:24] dst_preserve
87 bld.pseudo(aco_opcode::p_unit_test, Operand(3u));
88 bld.pseudo(aco_opcode::p_parallelcopy,
89 Definition(v0_lo, v1), Definition(v1_b3, v1b),
90 Operand(v1_lo, v1), Operand(v0_b3, v1b));
91
92 //! p_unit_test 4
93 //~gfx8! v1: %0:v[1] = v_xor_b32 %0:v[1], %0:v[0]
94 //~gfx8! v1: %0:v[0] = v_xor_b32 %0:v[1], %0:v[0]
95 //~gfx8! v1: %0:v[1] = v_xor_b32 %0:v[1], %0:v[0]
96 //~gfx9! v1: %0:v[0], v1: %0:v[1] = v_swap_b32 %0:v[1], %0:v[0]
97 //! v1b: %0:v[1][8:16] = v_mov_b32 %0:v[0][8:16] dst_preserve
98 //! v2b: %0:v[1][16:32] = v_mov_b32 %0:v[0][16:32] dst_preserve
99 bld.pseudo(aco_opcode::p_unit_test, Operand(4u));
100 bld.pseudo(aco_opcode::p_parallelcopy,
101 Definition(v0_lo, v1), Definition(v1_lo, v1b),
102 Operand(v1_lo, v1), Operand(v0_lo, v1b));
103
104 //! p_unit_test 5
105 //~gfx8! v1: %0:v[0] = v_xor_b32 %0:v[0], %0:v[1]
106 //~gfx8! v1: %0:v[1] = v_xor_b32 %0:v[0], %0:v[1]
107 //~gfx8! v1: %0:v[0] = v_xor_b32 %0:v[0], %0:v[1]
108 //~gfx9! v1: %0:v[1], v1: %0:v[0] = v_swap_b32 %0:v[0], %0:v[1]
109 //! v1b: %0:v[0][8:16] = v_mov_b32 %0:v[1][8:16] dst_preserve
110 //! v1b: %0:v[0][24:32] = v_mov_b32 %0:v[1][24:32] dst_preserve
111 bld.pseudo(aco_opcode::p_unit_test, Operand(5u));
112 bld.pseudo(aco_opcode::p_parallelcopy,
113 Definition(v0_lo, v1b), Definition(v0_hi, v1b), Definition(v1_lo, v1),
114 Operand(v1_lo, v1b), Operand(v1_hi, v1b), Operand(v0_lo, v1));
115
116 //! p_unit_test 6
117 //~gfx8! v1: %0:v[1] = v_xor_b32 %0:v[1], %0:v[0]
118 //~gfx8! v1: %0:v[0] = v_xor_b32 %0:v[1], %0:v[0]
119 //~gfx8! v1: %0:v[1] = v_xor_b32 %0:v[1], %0:v[0]
120 //~gfx9! v1: %0:v[0], v1: %0:v[1] = v_swap_b32 %0:v[1], %0:v[0]
121 bld.pseudo(aco_opcode::p_unit_test, Operand(6u));
122 bld.pseudo(aco_opcode::p_parallelcopy,
123 Definition(v0_lo, v2b), Definition(v0_hi, v2b), Definition(v1_lo, v1),
124 Operand(v1_lo, v2b), Operand(v1_hi, v2b), Operand(v0_lo, v1));
125
126 //! p_unit_test 7
127 //~gfx8! v1: %0:v[0] = v_xor_b32 %0:v[0], %0:v[1]
128 //~gfx8! v1: %0:v[1] = v_xor_b32 %0:v[0], %0:v[1]
129 //~gfx8! v1: %0:v[0] = v_xor_b32 %0:v[0], %0:v[1]
130 //~gfx8! v2b: %0:v[0][16:32] = v_xor_b32 %0:v[0][16:32], %0:v[0][0:16] dst_preserve
131 //~gfx8! v2b: %0:v[0][0:16] = v_xor_b32 %0:v[0][16:32], %0:v[0][0:16] dst_preserve
132 //~gfx8! v2b: %0:v[0][16:32] = v_xor_b32 %0:v[0][16:32], %0:v[0][0:16] dst_preserve
133 //~gfx9! v1: %0:v[1], v1: %0:v[0] = v_swap_b32 %0:v[0], %0:v[1]
134 //~gfx9! v1: %0:v[0] = v_pk_add_u16 %0:v[0].yx, 0
135 bld.pseudo(aco_opcode::p_unit_test, Operand(7u));
136 bld.pseudo(aco_opcode::p_parallelcopy,
137 Definition(v0_lo, v2b), Definition(v0_hi, v2b), Definition(v1_lo, v1),
138 Operand(v1_hi, v2b), Operand(v1_lo, v2b), Operand(v0_lo, v1));
139
140 //! p_unit_test 8
141 //~gfx8! v1: %0:v[1] = v_xor_b32 %0:v[1], %0:v[0]
142 //~gfx8! v1: %0:v[0] = v_xor_b32 %0:v[1], %0:v[0]
143 //~gfx8! v1: %0:v[1] = v_xor_b32 %0:v[1], %0:v[0]
144 //~gfx9! v1: %0:v[0], v1: %0:v[1] = v_swap_b32 %0:v[1], %0:v[0]
145 //! v1b: %0:v[1][24:32] = v_xor_b32 %0:v[1][24:32], %0:v[0][24:32] dst_preserve
146 //! v1b: %0:v[0][24:32] = v_xor_b32 %0:v[1][24:32], %0:v[0][24:32] dst_preserve
147 //! v1b: %0:v[1][24:32] = v_xor_b32 %0:v[1][24:32], %0:v[0][24:32] dst_preserve
148 bld.pseudo(aco_opcode::p_unit_test, Operand(8u));
149 bld.pseudo(aco_opcode::p_parallelcopy,
150 Definition(v0_lo, v3b), Definition(v1_lo, v3b),
151 Operand(v1_lo, v3b), Operand(v0_lo, v3b));
152
153 //! p_unit_test 9
154 //~gfx8! v1: %0:v[1] = v_xor_b32 %0:v[1], %0:v[0]
155 //~gfx8! v1: %0:v[0] = v_xor_b32 %0:v[1], %0:v[0]
156 //~gfx8! v1: %0:v[1] = v_xor_b32 %0:v[1], %0:v[0]
157 //~gfx9! v1: %0:v[0], v1: %0:v[1] = v_swap_b32 %0:v[1], %0:v[0]
158 //! v1b: %0:v[1][24:32] = v_mov_b32 %0:v[0][24:32] dst_preserve
159 bld.pseudo(aco_opcode::p_unit_test, Operand(9u));
160 bld.pseudo(aco_opcode::p_parallelcopy,
161 Definition(v0_lo, v3b), Definition(v1_lo, v3b), Definition(v0_b3, v1b),
162 Operand(v1_lo, v3b), Operand(v0_lo, v3b), Operand(v1_b3, v1b));
163
164 //! p_unit_test 10
165 //! v1b: %0:v[1][8:16] = v_xor_b32 %0:v[1][8:16], %0:v[0][8:16] dst_preserve
166 //! v1b: %0:v[0][8:16] = v_xor_b32 %0:v[1][8:16], %0:v[0][8:16] dst_preserve
167 //! v1b: %0:v[1][8:16] = v_xor_b32 %0:v[1][8:16], %0:v[0][8:16] dst_preserve
168 //! v1b: %0:v[1][16:24] = v_xor_b32 %0:v[1][16:24], %0:v[0][16:24] dst_preserve
169 //! v1b: %0:v[0][16:24] = v_xor_b32 %0:v[1][16:24], %0:v[0][16:24] dst_preserve
170 //! v1b: %0:v[1][16:24] = v_xor_b32 %0:v[1][16:24], %0:v[0][16:24] dst_preserve
171 bld.pseudo(aco_opcode::p_unit_test, Operand(10u));
172 bld.pseudo(aco_opcode::p_parallelcopy,
173 Definition(v0_b1, v2b), Definition(v1_b1, v2b),
174 Operand(v1_b1, v2b), Operand(v0_b1, v2b));
175
176 //! p_unit_test 11
177 //! v2b: %0:v[1][0:16] = v_mov_b32 %0:v[0][16:32] dst_preserve
178 //! v1: %0:v[0] = v_mov_b32 42
179 bld.pseudo(aco_opcode::p_unit_test, Operand(11u));
180 bld.pseudo(aco_opcode::p_parallelcopy,
181 Definition(v0_lo, v1), Definition(v1_lo, v2b),
182 Operand(42u), Operand(v0_hi, v2b));
183
184 //! s_endpgm
185
186 finish_to_hw_instr_test();
187 }
188 END_TEST