1# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
2# RUN: llc -march=amdgcn -mcpu=fiji -run-pass=instruction-select -verify-machineinstrs -o - %s | FileCheck %s -check-prefixes=GCN
3
4---
5
6name:            fmul_f32
7legalized:       true
8regBankSelected: true
9
10body: |
11  bb.0:
12    liveins: $sgpr0, $vgpr0, $vgpr1, $vgpr3_vgpr4
13    ; GCN-LABEL: name: fmul_f32
14    ; GCN: [[COPY:%[0-9]+]]:sreg_32 = COPY $sgpr0
15    ; GCN: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr0
16    ; GCN: [[COPY2:%[0-9]+]]:vgpr_32 = COPY $vgpr1
17    ; GCN: [[COPY3:%[0-9]+]]:vreg_64 = COPY $vgpr3_vgpr4
18    ; GCN: %4:vgpr_32 = nofpexcept V_MUL_F32_e64 0, [[COPY1]], 0, [[COPY]], 0, 0, implicit $mode, implicit $exec
19    ; GCN: %5:vgpr_32 = nofpexcept V_MUL_F32_e64 0, [[COPY]], 0, [[COPY1]], 0, 0, implicit $mode, implicit $exec
20    ; GCN: %6:vgpr_32 = nofpexcept V_MUL_F32_e64 0, [[COPY1]], 0, [[COPY2]], 0, 0, implicit $mode, implicit $exec
21    ; GCN: FLAT_STORE_DWORD [[COPY3]], %4, 0, 0, implicit $exec, implicit $flat_scr :: (store (s32), addrspace 1)
22    ; GCN: FLAT_STORE_DWORD [[COPY3]], %5, 0, 0, implicit $exec, implicit $flat_scr :: (store (s32), addrspace 1)
23    ; GCN: FLAT_STORE_DWORD [[COPY3]], %6, 0, 0, implicit $exec, implicit $flat_scr :: (store (s32), addrspace 1)
24    %0:sgpr(s32) = COPY $sgpr0
25    %1:vgpr(s32) = COPY $vgpr0
26    %2:vgpr(s32) = COPY $vgpr1
27    %3:vgpr(p1) = COPY $vgpr3_vgpr4
28
29    ; fmul vs
30    %4:vgpr(s32) = G_FMUL %1, %0
31
32    ; fmul sv
33    %5:vgpr(s32) = G_FMUL %0, %1
34
35    ; fmul vv
36    %6:vgpr(s32) = G_FMUL %1, %2
37
38    G_STORE %4, %3 :: (store (s32), addrspace 1)
39    G_STORE %5, %3 :: (store (s32), addrspace 1)
40    G_STORE %6, %3 :: (store (s32), addrspace 1)
41...
42
43---
44
45name:            fmul_f64
46legalized:       true
47regBankSelected: true
48
49body: |
50  bb.0:
51    liveins: $sgpr0_sgpr1, $vgpr0_vgpr1, $vgpr2_vgpr3, $vgpr4_vgpr5
52    ; GCN-LABEL: name: fmul_f64
53    ; GCN: [[COPY:%[0-9]+]]:sreg_64 = COPY $sgpr0_sgpr1
54    ; GCN: [[COPY1:%[0-9]+]]:vreg_64 = COPY $vgpr0_vgpr1
55    ; GCN: [[COPY2:%[0-9]+]]:vreg_64 = COPY $vgpr2_vgpr3
56    ; GCN: %4:vreg_64 = nofpexcept V_MUL_F64_e64 0, [[COPY1]], 0, [[COPY]], 0, 0, implicit $mode, implicit $exec
57    ; GCN: %5:vreg_64 = nofpexcept V_MUL_F64_e64 0, [[COPY]], 0, [[COPY1]], 0, 0, implicit $mode, implicit $exec
58    ; GCN: %6:vreg_64 = nofpexcept V_MUL_F64_e64 0, [[COPY1]], 0, [[COPY2]], 0, 0, implicit $mode, implicit $exec
59    ; GCN: S_ENDPGM 0, implicit %4, implicit %5, implicit %6
60    %0:sgpr(s64) = COPY $sgpr0_sgpr1
61    %1:vgpr(s64) = COPY $vgpr0_vgpr1
62    %2:vgpr(s64) = COPY $vgpr2_vgpr3
63    %3:vgpr(p1) = COPY $vgpr4_vgpr5
64
65    ; fmul vs
66    %4:vgpr(s64) = G_FMUL %1, %0
67
68    ; fmul sv
69    %5:vgpr(s64) = G_FMUL %0, %1
70
71    ; fmul vv
72    %6:vgpr(s64) = G_FMUL %1, %2
73    S_ENDPGM 0, implicit %4, implicit %5, implicit %6
74
75...
76
77---
78
79name:            fmul_f16
80legalized:       true
81regBankSelected: true
82
83body: |
84  bb.0:
85    liveins: $sgpr0, $vgpr0, $vgpr1, $vgpr3_vgpr4
86    ; GCN-LABEL: name: fmul_f16
87    ; GCN: [[COPY:%[0-9]+]]:sreg_32 = COPY $sgpr0
88    ; GCN: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr0
89    ; GCN: %7:vgpr_32 = nofpexcept V_MUL_F16_e64 0, [[COPY]], 0, [[COPY]], 0, 0, implicit $mode, implicit $exec
90    ; GCN: %8:vgpr_32 = nofpexcept V_MUL_F16_e64 0, [[COPY]], 0, [[COPY]], 0, 0, implicit $mode, implicit $exec
91    ; GCN: %9:vgpr_32 = nofpexcept V_MUL_F16_e64 0, [[COPY]], 0, [[COPY1]], 0, 0, implicit $mode, implicit $exec
92    ; GCN: S_ENDPGM 0, implicit %7, implicit %8, implicit %9
93    %0:sgpr(s32) = COPY $sgpr0
94    %1:vgpr(s32) = COPY $vgpr0
95    %2:vgpr(s32) = COPY $vgpr1
96    %3:vgpr(p1) = COPY $vgpr3_vgpr4
97
98    %4:sgpr(s16) = G_TRUNC %0
99    %5:vgpr(s16) = G_TRUNC %1
100    %6:vgpr(s16) = G_TRUNC %2
101
102    ; fmul vs
103    %8:vgpr(s16) = G_FMUL %4, %4
104
105    ; fmul sv
106    %9:vgpr(s16) = G_FMUL %4, %4
107
108    ; fmul vv
109    %10:vgpr(s16) = G_FMUL %4, %5
110
111    S_ENDPGM 0, implicit %8, implicit %9, implicit %10
112...
113
114---
115
116name:            fmul_modifiers_f32
117legalized:       true
118regBankSelected: true
119
120body: |
121  bb.0:
122    liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3
123    ; GCN-LABEL: name: fmul_modifiers_f32
124    ; GCN: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0
125    ; GCN: [[COPY1:%[0-9]+]]:vreg_64 = COPY $vgpr2_vgpr3
126    ; GCN: %6:vgpr_32 = nofpexcept V_MUL_F32_e64 2, [[COPY]], 0, [[COPY]], 0, 0, implicit $mode, implicit $exec
127    ; GCN: %7:vgpr_32 = nofpexcept V_MUL_F32_e64 0, [[COPY]], 2, [[COPY]], 0, 0, implicit $mode, implicit $exec
128    ; GCN: %8:vgpr_32 = nofpexcept V_MUL_F32_e64 2, [[COPY]], 2, [[COPY]], 0, 0, implicit $mode, implicit $exec
129    ; GCN: %9:vgpr_32 = nofpexcept V_MUL_F32_e64 1, [[COPY]], 0, [[COPY]], 0, 0, implicit $mode, implicit $exec
130    ; GCN: %10:vgpr_32 = nofpexcept V_MUL_F32_e64 0, [[COPY]], 1, [[COPY]], 0, 0, implicit $mode, implicit $exec
131    ; GCN: %11:vgpr_32 = nofpexcept V_MUL_F32_e64 1, [[COPY]], 1, [[COPY]], 0, 0, implicit $mode, implicit $exec
132    ; GCN: %12:vgpr_32 = nofpexcept V_MUL_F32_e64 3, [[COPY]], 0, [[COPY]], 0, 0, implicit $mode, implicit $exec
133    ; GCN: %13:vgpr_32 = nofpexcept V_MUL_F32_e64 0, [[COPY]], 3, [[COPY]], 0, 0, implicit $mode, implicit $exec
134    ; GCN: %14:vgpr_32 = nofpexcept V_MUL_F32_e64 3, [[COPY]], 3, [[COPY]], 0, 0, implicit $mode, implicit $exec
135    ; GCN: %15:vgpr_32 = nofpexcept V_MUL_F32_e64 3, [[COPY]], 1, [[COPY]], 0, 0, implicit $mode, implicit $exec
136    ; GCN: FLAT_STORE_DWORD [[COPY1]], %6, 0, 0, implicit $exec, implicit $flat_scr :: (store (s32), addrspace 1)
137    ; GCN: FLAT_STORE_DWORD [[COPY1]], %7, 0, 0, implicit $exec, implicit $flat_scr :: (store (s32), addrspace 1)
138    ; GCN: FLAT_STORE_DWORD [[COPY1]], %8, 0, 0, implicit $exec, implicit $flat_scr :: (store (s32), addrspace 1)
139    ; GCN: FLAT_STORE_DWORD [[COPY1]], %9, 0, 0, implicit $exec, implicit $flat_scr :: (store (s32), addrspace 1)
140    ; GCN: FLAT_STORE_DWORD [[COPY1]], %10, 0, 0, implicit $exec, implicit $flat_scr :: (store (s32), addrspace 1)
141    ; GCN: FLAT_STORE_DWORD [[COPY1]], %11, 0, 0, implicit $exec, implicit $flat_scr :: (store (s32), addrspace 1)
142    ; GCN: FLAT_STORE_DWORD [[COPY1]], %12, 0, 0, implicit $exec, implicit $flat_scr :: (store (s32), addrspace 1)
143    ; GCN: FLAT_STORE_DWORD [[COPY1]], %13, 0, 0, implicit $exec, implicit $flat_scr :: (store (s32), addrspace 1)
144    ; GCN: FLAT_STORE_DWORD [[COPY1]], %14, 0, 0, implicit $exec, implicit $flat_scr :: (store (s32), addrspace 1)
145    ; GCN: FLAT_STORE_DWORD [[COPY1]], %15, 0, 0, implicit $exec, implicit $flat_scr :: (store (s32), addrspace 1)
146    %0:vgpr(s32) = COPY $vgpr0
147    %1:vgpr(s32) = COPY $vgpr1
148    %2:vgpr(p1) = COPY $vgpr2_vgpr3
149
150    %3:vgpr(s32) = G_FABS %0
151    %4:vgpr(s32) = G_FNEG %0
152    %5:vgpr(s32) = G_FNEG %3
153
154    ; fabs lhs
155    %6:vgpr(s32) = G_FMUL %3, %0
156
157    ; fabs rhs
158    %7:vgpr(s32) = G_FMUL %0, %3
159
160    ; fabs lhs, rhs
161    %8:vgpr(s32) = G_FMUL %3, %3
162
163
164    ; fneg lhs
165    %9:vgpr(s32) = G_FMUL %4, %0
166
167    ; fneg rhs
168    %10:vgpr(s32) = G_FMUL %0, %4
169
170    ; fneg  lhs, rhs
171    %11:vgpr(s32) = G_FMUL %4, %4
172
173
174    ; fneg fabs lhs
175    %12:vgpr(s32) = G_FMUL %5, %0
176
177    ; fneg fabs rhs
178    %13:vgpr(s32) = G_FMUL %0, %5
179
180    ; fneg  fabs lhs, rhs
181    %14:vgpr(s32) = G_FMUL %5, %5
182
183
184    ; fneg  fabs lhs, fneg rhs
185    %15:vgpr(s32) = G_FMUL %5, %4
186
187    G_STORE %6, %2 :: (store (s32), addrspace 1)
188    G_STORE %7, %2 :: (store (s32), addrspace 1)
189    G_STORE %8, %2 :: (store (s32), addrspace 1)
190    G_STORE %9, %2 :: (store (s32), addrspace 1)
191    G_STORE %10, %2 :: (store (s32), addrspace 1)
192    G_STORE %11, %2 :: (store (s32), addrspace 1)
193    G_STORE %12, %2 :: (store (s32), addrspace 1)
194    G_STORE %13, %2 :: (store (s32), addrspace 1)
195    G_STORE %14, %2 :: (store (s32), addrspace 1)
196    G_STORE %15, %2 :: (store (s32), addrspace 1)
197
198...
199