1# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py 2# RUN: llc -mtriple=amdgcn -mcpu=gfx1010 -verify-machineinstrs -global-isel=1 -run-pass=legalizer -o - %s | FileCheck -check-prefix=GFX10 %s 3 4--- 5name: v_mul_i64_no_zext 6body: | 7 bb.0: 8 liveins: $vgpr0_vgpr1, $vgpr2_vgpr3 9 10 ; GFX10-LABEL: name: v_mul_i64_no_zext 11 ; GFX10: liveins: $vgpr0_vgpr1, $vgpr2_vgpr3 12 ; GFX10-NEXT: {{ $}} 13 ; GFX10-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY $vgpr0_vgpr1 14 ; GFX10-NEXT: [[COPY1:%[0-9]+]]:_(s64) = COPY $vgpr2_vgpr3 15 ; GFX10-NEXT: [[UV:%[0-9]+]]:_(s32), [[UV1:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[COPY]](s64) 16 ; GFX10-NEXT: [[UV2:%[0-9]+]]:_(s32), [[UV3:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[COPY1]](s64) 17 ; GFX10-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 0 18 ; GFX10-NEXT: [[AMDGPU_MAD_U64_U32_:%[0-9]+]]:_(s64), [[AMDGPU_MAD_U64_U32_1:%[0-9]+]]:_(s1) = G_AMDGPU_MAD_U64_U32 [[UV]](s32), [[UV2]], [[C]] 19 ; GFX10-NEXT: [[UV4:%[0-9]+]]:_(s32), [[UV5:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[AMDGPU_MAD_U64_U32_]](s64) 20 ; GFX10-NEXT: [[MUL:%[0-9]+]]:_(s32) = G_MUL [[UV]], [[UV3]] 21 ; GFX10-NEXT: [[ADD:%[0-9]+]]:_(s32) = G_ADD [[UV5]], [[MUL]] 22 ; GFX10-NEXT: [[MUL1:%[0-9]+]]:_(s32) = G_MUL [[UV1]], [[UV2]] 23 ; GFX10-NEXT: [[ADD1:%[0-9]+]]:_(s32) = G_ADD [[ADD]], [[MUL1]] 24 ; GFX10-NEXT: [[MV:%[0-9]+]]:_(s64) = G_MERGE_VALUES [[UV4]](s32), [[ADD1]](s32) 25 ; GFX10-NEXT: $vgpr0_vgpr1 = COPY [[MV]](s64) 26 %0:_(s64) = COPY $vgpr0_vgpr1 27 %1:_(s64) = COPY $vgpr2_vgpr3 28 %2:_(s64) = G_MUL %0, %1 29 $vgpr0_vgpr1 = COPY %2 30 31... 32--- 33name: v_mul_i64_zext_src1 34body: | 35 bb.0: 36 liveins: $vgpr0_vgpr1, $vgpr2 37 38 ; GFX10-LABEL: name: v_mul_i64_zext_src1 39 ; GFX10: liveins: $vgpr0_vgpr1, $vgpr2 40 ; GFX10-NEXT: {{ $}} 41 ; GFX10-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY $vgpr0_vgpr1 42 ; GFX10-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr2 43 ; GFX10-NEXT: [[UV:%[0-9]+]]:_(s32), [[UV1:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[COPY]](s64) 44 ; GFX10-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 0 45 ; GFX10-NEXT: [[AMDGPU_MAD_U64_U32_:%[0-9]+]]:_(s64), [[AMDGPU_MAD_U64_U32_1:%[0-9]+]]:_(s1) = G_AMDGPU_MAD_U64_U32 [[UV]](s32), [[COPY1]], [[C]] 46 ; GFX10-NEXT: [[UV4:%[0-9]+]]:_(s32), [[UV5:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[AMDGPU_MAD_U64_U32_]](s64) 47 ; GFX10-NEXT: [[MUL:%[0-9]+]]:_(s32) = G_MUL [[UV1]], [[COPY1]] 48 ; GFX10-NEXT: [[ADD:%[0-9]+]]:_(s32) = G_ADD [[UV5]], [[MUL]] 49 ; GFX10-NEXT: [[MV:%[0-9]+]]:_(s64) = G_MERGE_VALUES [[UV4]](s32), [[ADD]](s32) 50 ; GFX10-NEXT: $vgpr0_vgpr1 = COPY [[MV]](s64) 51 %0:_(s64) = COPY $vgpr0_vgpr1 52 %1:_(s32) = COPY $vgpr2 53 %2:_(s64) = G_ZEXT %1(s32) 54 %3:_(s64) = G_MUL %0, %2 55 $vgpr0_vgpr1 = COPY %3 56 57... 58--- 59name: v_mul_i64_zext_src0 60body: | 61 bb.0: 62 liveins: $vgpr0, $vgpr2_vgpr3 63 64 ; GFX10-LABEL: name: v_mul_i64_zext_src0 65 ; GFX10: liveins: $vgpr0, $vgpr2_vgpr3 66 ; GFX10-NEXT: {{ $}} 67 ; GFX10-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0 68 ; GFX10-NEXT: [[COPY1:%[0-9]+]]:_(s64) = COPY $vgpr2_vgpr3 69 ; GFX10-NEXT: [[UV2:%[0-9]+]]:_(s32), [[UV3:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[COPY1]](s64) 70 ; GFX10-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 0 71 ; GFX10-NEXT: [[AMDGPU_MAD_U64_U32_:%[0-9]+]]:_(s64), [[AMDGPU_MAD_U64_U32_1:%[0-9]+]]:_(s1) = G_AMDGPU_MAD_U64_U32 [[COPY]](s32), [[UV2]], [[C]] 72 ; GFX10-NEXT: [[UV4:%[0-9]+]]:_(s32), [[UV5:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[AMDGPU_MAD_U64_U32_]](s64) 73 ; GFX10-NEXT: [[MUL:%[0-9]+]]:_(s32) = G_MUL [[COPY]], [[UV3]] 74 ; GFX10-NEXT: [[ADD:%[0-9]+]]:_(s32) = G_ADD [[UV5]], [[MUL]] 75 ; GFX10-NEXT: [[MV:%[0-9]+]]:_(s64) = G_MERGE_VALUES [[UV4]](s32), [[ADD]](s32) 76 ; GFX10-NEXT: $vgpr0_vgpr1 = COPY [[MV]](s64) 77 %0:_(s32) = COPY $vgpr0 78 %1:_(s64) = COPY $vgpr2_vgpr3 79 %2:_(s64) = G_ZEXT %0(s32) 80 %3:_(s64) = G_MUL %2, %1 81 $vgpr0_vgpr1 = COPY %3 82 83... 84--- 85name: v_mul_i64_zext_src0_src1 86body: | 87 bb.0: 88 liveins: $vgpr0, $vgpr1 89 90 ; GFX10-LABEL: name: v_mul_i64_zext_src0_src1 91 ; GFX10: liveins: $vgpr0, $vgpr1 92 ; GFX10-NEXT: {{ $}} 93 ; GFX10-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr1 94 ; GFX10-NEXT: [[ZEXT:%[0-9]+]]:_(s64) = G_ZEXT [[COPY]](s32) 95 ; GFX10-NEXT: $vgpr0_vgpr1 = COPY [[ZEXT]](s64) 96 %0:_(s32) = COPY $vgpr0 97 %1:_(s32) = COPY $vgpr1 98 %2:_(s64) = G_ZEXT %0(s32) 99 %3:_(s64) = G_ZEXT %1(s32) 100 %4:_(s64) = G_MUL %2, %3 101 $vgpr0_vgpr1 = COPY %3 102 103... 104--- 105name: v_mul_i64_masked_src0_hi 106body: | 107 bb.0: 108 liveins: $vgpr0_vgpr1, $vgpr2_vgpr3 109 110 ; GFX10-LABEL: name: v_mul_i64_masked_src0_hi 111 ; GFX10: liveins: $vgpr0_vgpr1, $vgpr2_vgpr3 112 ; GFX10-NEXT: {{ $}} 113 ; GFX10-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY $vgpr0_vgpr1 114 ; GFX10-NEXT: [[COPY1:%[0-9]+]]:_(s64) = COPY $vgpr2_vgpr3 115 ; GFX10-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 4294967295 116 ; GFX10-NEXT: [[AND:%[0-9]+]]:_(s64) = G_AND [[COPY]], [[C]] 117 ; GFX10-NEXT: [[UV:%[0-9]+]]:_(s32), [[UV1:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[AND]](s64) 118 ; GFX10-NEXT: [[UV2:%[0-9]+]]:_(s32), [[UV3:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[COPY1]](s64) 119 ; GFX10-NEXT: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 0 120 ; GFX10-NEXT: [[AMDGPU_MAD_U64_U32_:%[0-9]+]]:_(s64), [[AMDGPU_MAD_U64_U32_1:%[0-9]+]]:_(s1) = G_AMDGPU_MAD_U64_U32 [[UV]](s32), [[UV2]], [[C1]] 121 ; GFX10-NEXT: [[UV4:%[0-9]+]]:_(s32), [[UV5:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[AMDGPU_MAD_U64_U32_]](s64) 122 ; GFX10-NEXT: [[MUL:%[0-9]+]]:_(s32) = G_MUL [[UV]], [[UV3]] 123 ; GFX10-NEXT: [[ADD:%[0-9]+]]:_(s32) = G_ADD [[UV5]], [[MUL]] 124 ; GFX10-NEXT: [[MV:%[0-9]+]]:_(s64) = G_MERGE_VALUES [[UV4]](s32), [[ADD]](s32) 125 ; GFX10-NEXT: $vgpr0_vgpr1 = COPY [[MV]](s64) 126 %0:_(s64) = COPY $vgpr0_vgpr1 127 %1:_(s64) = COPY $vgpr2_vgpr3 128 %2:_(s64) = G_CONSTANT i64 4294967295 129 %3:_(s64) = G_AND %0, %2 130 %4:_(s64) = G_MUL %3, %1 131 $vgpr0_vgpr1 = COPY %4 132... 133--- 134name: v_mul_i64_masked_src0_lo 135body: | 136 bb.0: 137 liveins: $vgpr0_vgpr1, $vgpr2_vgpr3 138 139 ; GFX10-LABEL: name: v_mul_i64_masked_src0_lo 140 ; GFX10: liveins: $vgpr0_vgpr1, $vgpr2_vgpr3 141 ; GFX10-NEXT: {{ $}} 142 ; GFX10-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY $vgpr0_vgpr1 143 ; GFX10-NEXT: [[COPY1:%[0-9]+]]:_(s64) = COPY $vgpr2_vgpr3 144 ; GFX10-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 -4294967296 145 ; GFX10-NEXT: [[AND:%[0-9]+]]:_(s64) = G_AND [[COPY]], [[C]] 146 ; GFX10-NEXT: [[UV:%[0-9]+]]:_(s32), [[UV1:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[AND]](s64) 147 ; GFX10-NEXT: [[UV2:%[0-9]+]]:_(s32), [[UV3:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[COPY1]](s64) 148 ; GFX10-NEXT: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 0 149 ; GFX10-NEXT: [[UV4:%[0-9]+]]:_(s32), [[UV5:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[C1]](s64) 150 ; GFX10-NEXT: [[MUL:%[0-9]+]]:_(s32) = G_MUL [[UV1]], [[UV2]] 151 ; GFX10-NEXT: [[MV:%[0-9]+]]:_(s64) = G_MERGE_VALUES [[UV4]](s32), [[MUL]](s32) 152 ; GFX10-NEXT: $vgpr0_vgpr1 = COPY [[MV]](s64) 153 %0:_(s64) = COPY $vgpr0_vgpr1 154 %1:_(s64) = COPY $vgpr2_vgpr3 155 %2:_(s64) = G_CONSTANT i64 -4294967296 156 %3:_(s64) = G_AND %0, %2 157 %4:_(s64) = G_MUL %3, %1 158 $vgpr0_vgpr1 = COPY %4 159 160... 161--- 162name: v_mul_i64_masked_src1_lo 163body: | 164 bb.0: 165 liveins: $vgpr0_vgpr1, $vgpr2_vgpr3 166 167 ; GFX10-LABEL: name: v_mul_i64_masked_src1_lo 168 ; GFX10: liveins: $vgpr0_vgpr1, $vgpr2_vgpr3 169 ; GFX10-NEXT: {{ $}} 170 ; GFX10-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY $vgpr0_vgpr1 171 ; GFX10-NEXT: [[COPY1:%[0-9]+]]:_(s64) = COPY $vgpr2_vgpr3 172 ; GFX10-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 -4294967296 173 ; GFX10-NEXT: [[AND:%[0-9]+]]:_(s64) = G_AND [[COPY1]], [[C]] 174 ; GFX10-NEXT: [[UV:%[0-9]+]]:_(s32), [[UV1:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[COPY]](s64) 175 ; GFX10-NEXT: [[UV2:%[0-9]+]]:_(s32), [[UV3:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[AND]](s64) 176 ; GFX10-NEXT: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 0 177 ; GFX10-NEXT: [[UV4:%[0-9]+]]:_(s32), [[UV5:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[C1]](s64) 178 ; GFX10-NEXT: [[MUL:%[0-9]+]]:_(s32) = G_MUL [[UV]], [[UV3]] 179 ; GFX10-NEXT: [[MV:%[0-9]+]]:_(s64) = G_MERGE_VALUES [[UV4]](s32), [[MUL]](s32) 180 ; GFX10-NEXT: $vgpr0_vgpr1 = COPY [[MV]](s64) 181 %0:_(s64) = COPY $vgpr0_vgpr1 182 %1:_(s64) = COPY $vgpr2_vgpr3 183 %2:_(s64) = G_CONSTANT i64 -4294967296 184 %3:_(s64) = G_AND %1, %2 185 %4:_(s64) = G_MUL %0, %3 186 $vgpr0_vgpr1 = COPY %4 187 188... 189--- 190name: v_mul_i64_masked_src0 191body: | 192 bb.0: 193 liveins: $vgpr0_vgpr1, $vgpr2_vgpr3 194 195 ; GFX10-LABEL: name: v_mul_i64_masked_src0 196 ; GFX10: liveins: $vgpr0_vgpr1, $vgpr2_vgpr3 197 ; GFX10-NEXT: {{ $}} 198 ; GFX10-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 0 199 ; GFX10-NEXT: $vgpr0_vgpr1 = COPY [[C]](s64) 200 %0:_(s64) = COPY $vgpr0_vgpr1 201 %1:_(s64) = COPY $vgpr2_vgpr3 202 %2:_(s64) = G_CONSTANT i64 0 203 %3:_(s64) = G_AND %0, %2 204 %4:_(s64) = G_MUL %3, %1 205 $vgpr0_vgpr1 = COPY %4 206... 207--- 208name: v_mul_i64_partially_masked_src0 209body: | 210 bb.0: 211 liveins: $vgpr0_vgpr1, $vgpr2_vgpr3 212 213 ; GFX10-LABEL: name: v_mul_i64_partially_masked_src0 214 ; GFX10: liveins: $vgpr0_vgpr1, $vgpr2_vgpr3 215 ; GFX10-NEXT: {{ $}} 216 ; GFX10-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY $vgpr0_vgpr1 217 ; GFX10-NEXT: [[COPY1:%[0-9]+]]:_(s64) = COPY $vgpr2_vgpr3 218 ; GFX10-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 263951509094400 219 ; GFX10-NEXT: [[AND:%[0-9]+]]:_(s64) = G_AND [[COPY]], [[C]] 220 ; GFX10-NEXT: [[UV:%[0-9]+]]:_(s32), [[UV1:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[AND]](s64) 221 ; GFX10-NEXT: [[UV2:%[0-9]+]]:_(s32), [[UV3:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[COPY1]](s64) 222 ; GFX10-NEXT: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 0 223 ; GFX10-NEXT: [[AMDGPU_MAD_U64_U32_:%[0-9]+]]:_(s64), [[AMDGPU_MAD_U64_U32_1:%[0-9]+]]:_(s1) = G_AMDGPU_MAD_U64_U32 [[UV]](s32), [[UV2]], [[C1]] 224 ; GFX10-NEXT: [[UV4:%[0-9]+]]:_(s32), [[UV5:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[AMDGPU_MAD_U64_U32_]](s64) 225 ; GFX10-NEXT: [[MUL:%[0-9]+]]:_(s32) = G_MUL [[UV]], [[UV3]] 226 ; GFX10-NEXT: [[ADD:%[0-9]+]]:_(s32) = G_ADD [[UV5]], [[MUL]] 227 ; GFX10-NEXT: [[MUL1:%[0-9]+]]:_(s32) = G_MUL [[UV1]], [[UV2]] 228 ; GFX10-NEXT: [[ADD1:%[0-9]+]]:_(s32) = G_ADD [[ADD]], [[MUL1]] 229 ; GFX10-NEXT: [[MV:%[0-9]+]]:_(s64) = G_MERGE_VALUES [[UV4]](s32), [[ADD1]](s32) 230 ; GFX10-NEXT: $vgpr0_vgpr1 = COPY [[MV]](s64) 231 %0:_(s64) = COPY $vgpr0_vgpr1 232 %1:_(s64) = COPY $vgpr2_vgpr3 233 %2:_(s64) = G_CONSTANT i64 263951509094400 234 %3:_(s64) = G_AND %0, %2 235 %4:_(s64) = G_MUL %3, %1 236 $vgpr0_vgpr1 = COPY %4 237... 238--- 239name: v_mul_i64_constant_hi 240body: | 241 bb.0: 242 liveins: $vgpr0_vgpr1 243 244 ; GFX10-LABEL: name: v_mul_i64_constant_hi 245 ; GFX10: liveins: $vgpr0_vgpr1 246 ; GFX10-NEXT: {{ $}} 247 ; GFX10-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY $vgpr0_vgpr1 248 ; GFX10-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 -4294967296 249 ; GFX10-NEXT: [[UV:%[0-9]+]]:_(s32), [[UV1:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[COPY]](s64) 250 ; GFX10-NEXT: [[UV2:%[0-9]+]]:_(s32), [[UV3:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[C]](s64) 251 ; GFX10-NEXT: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 0 252 ; GFX10-NEXT: [[UV4:%[0-9]+]]:_(s32), [[UV5:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[C1]](s64) 253 ; GFX10-NEXT: [[MUL:%[0-9]+]]:_(s32) = G_MUL [[UV]], [[UV3]] 254 ; GFX10-NEXT: [[MV:%[0-9]+]]:_(s64) = G_MERGE_VALUES [[UV4]](s32), [[MUL]](s32) 255 ; GFX10-NEXT: $vgpr0_vgpr1 = COPY [[MV]](s64) 256 %0:_(s64) = COPY $vgpr0_vgpr1 257 %1:_(s64) = G_CONSTANT i64 -4294967296 258 %2:_(s64) = G_MUL %0, %1 259 $vgpr0_vgpr1 = COPY %2 260... 261--- 262name: v_mul_i64_constant_lo 263body: | 264 bb.0: 265 liveins: $vgpr0_vgpr1 266 267 ; GFX10-LABEL: name: v_mul_i64_constant_lo 268 ; GFX10: liveins: $vgpr0_vgpr1 269 ; GFX10-NEXT: {{ $}} 270 ; GFX10-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY $vgpr0_vgpr1 271 ; GFX10-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 4294967295 272 ; GFX10-NEXT: [[UV:%[0-9]+]]:_(s32), [[UV1:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[COPY]](s64) 273 ; GFX10-NEXT: [[UV2:%[0-9]+]]:_(s32), [[UV3:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[C]](s64) 274 ; GFX10-NEXT: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 0 275 ; GFX10-NEXT: [[AMDGPU_MAD_U64_U32_:%[0-9]+]]:_(s64), [[AMDGPU_MAD_U64_U32_1:%[0-9]+]]:_(s1) = G_AMDGPU_MAD_U64_U32 [[UV]](s32), [[UV2]], [[C1]] 276 ; GFX10-NEXT: [[UV4:%[0-9]+]]:_(s32), [[UV5:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[AMDGPU_MAD_U64_U32_]](s64) 277 ; GFX10-NEXT: [[MUL:%[0-9]+]]:_(s32) = G_MUL [[UV1]], [[UV2]] 278 ; GFX10-NEXT: [[ADD:%[0-9]+]]:_(s32) = G_ADD [[UV5]], [[MUL]] 279 ; GFX10-NEXT: [[MV:%[0-9]+]]:_(s64) = G_MERGE_VALUES [[UV4]](s32), [[ADD]](s32) 280 ; GFX10-NEXT: $vgpr0_vgpr1 = COPY [[MV]](s64) 281 %0:_(s64) = COPY $vgpr0_vgpr1 282 %1:_(s64) = G_CONSTANT i64 4294967295 283 %2:_(s64) = G_MUL %0, %1 284 $vgpr0_vgpr1 = COPY %2 285... 286