1# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py 2# RUN: llc -O0 -mtriple=mipsel-linux-gnu -run-pass=legalizer -verify-machineinstrs %s -o - | FileCheck %s -check-prefixes=MIPS32 3--- | 4 5 define void @mul_i32() {entry: ret void} 6 define void @mul_i8_sext() {entry: ret void} 7 define void @mul_i8_zext() {entry: ret void} 8 define void @mul_i8_aext() {entry: ret void} 9 define void @mul_i16_sext() {entry: ret void} 10 define void @mul_i16_zext() {entry: ret void} 11 define void @mul_i16_aext() {entry: ret void} 12 define void @mul_i64() {entry: ret void} 13 define void @mul_i128() {entry: ret void} 14 define void @umulh_i64() {entry: ret void} 15 define void @umul_with_overflow(i32 %lhs, i32 %rhs, ptr %pmul, ptr %pcarry_flag) { ret void } 16 17... 18--- 19name: mul_i32 20alignment: 4 21tracksRegLiveness: true 22body: | 23 bb.0.entry: 24 liveins: $a0, $a1 25 26 ; MIPS32-LABEL: name: mul_i32 27 ; MIPS32: liveins: $a0, $a1 28 ; MIPS32-NEXT: {{ $}} 29 ; MIPS32-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $a0 30 ; MIPS32-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $a1 31 ; MIPS32-NEXT: [[MUL:%[0-9]+]]:_(s32) = G_MUL [[COPY]], [[COPY1]] 32 ; MIPS32-NEXT: $v0 = COPY [[MUL]](s32) 33 ; MIPS32-NEXT: RetRA implicit $v0 34 %0:_(s32) = COPY $a0 35 %1:_(s32) = COPY $a1 36 %2:_(s32) = G_MUL %0, %1 37 $v0 = COPY %2(s32) 38 RetRA implicit $v0 39 40... 41--- 42name: mul_i8_sext 43alignment: 4 44tracksRegLiveness: true 45body: | 46 bb.1.entry: 47 liveins: $a0, $a1 48 49 ; MIPS32-LABEL: name: mul_i8_sext 50 ; MIPS32: liveins: $a0, $a1 51 ; MIPS32-NEXT: {{ $}} 52 ; MIPS32-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $a0 53 ; MIPS32-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $a1 54 ; MIPS32-NEXT: [[MUL:%[0-9]+]]:_(s32) = G_MUL [[COPY1]], [[COPY]] 55 ; MIPS32-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 24 56 ; MIPS32-NEXT: [[SHL:%[0-9]+]]:_(s32) = G_SHL [[MUL]], [[C]](s32) 57 ; MIPS32-NEXT: [[ASHR:%[0-9]+]]:_(s32) = G_ASHR [[SHL]], [[C]](s32) 58 ; MIPS32-NEXT: $v0 = COPY [[ASHR]](s32) 59 ; MIPS32-NEXT: RetRA implicit $v0 60 %2:_(s32) = COPY $a0 61 %0:_(s8) = G_TRUNC %2(s32) 62 %3:_(s32) = COPY $a1 63 %1:_(s8) = G_TRUNC %3(s32) 64 %4:_(s8) = G_MUL %1, %0 65 %5:_(s32) = G_SEXT %4(s8) 66 $v0 = COPY %5(s32) 67 RetRA implicit $v0 68 69... 70--- 71name: mul_i8_zext 72alignment: 4 73tracksRegLiveness: true 74body: | 75 bb.1.entry: 76 liveins: $a0, $a1 77 78 ; MIPS32-LABEL: name: mul_i8_zext 79 ; MIPS32: liveins: $a0, $a1 80 ; MIPS32-NEXT: {{ $}} 81 ; MIPS32-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $a0 82 ; MIPS32-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $a1 83 ; MIPS32-NEXT: [[MUL:%[0-9]+]]:_(s32) = G_MUL [[COPY1]], [[COPY]] 84 ; MIPS32-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 255 85 ; MIPS32-NEXT: [[AND:%[0-9]+]]:_(s32) = G_AND [[MUL]], [[C]] 86 ; MIPS32-NEXT: $v0 = COPY [[AND]](s32) 87 ; MIPS32-NEXT: RetRA implicit $v0 88 %2:_(s32) = COPY $a0 89 %0:_(s8) = G_TRUNC %2(s32) 90 %3:_(s32) = COPY $a1 91 %1:_(s8) = G_TRUNC %3(s32) 92 %4:_(s8) = G_MUL %1, %0 93 %5:_(s32) = G_ZEXT %4(s8) 94 $v0 = COPY %5(s32) 95 RetRA implicit $v0 96 97... 98--- 99name: mul_i8_aext 100alignment: 4 101tracksRegLiveness: true 102body: | 103 bb.1.entry: 104 liveins: $a0, $a1 105 106 ; MIPS32-LABEL: name: mul_i8_aext 107 ; MIPS32: liveins: $a0, $a1 108 ; MIPS32-NEXT: {{ $}} 109 ; MIPS32-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $a0 110 ; MIPS32-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $a1 111 ; MIPS32-NEXT: [[MUL:%[0-9]+]]:_(s32) = G_MUL [[COPY1]], [[COPY]] 112 ; MIPS32-NEXT: $v0 = COPY [[MUL]](s32) 113 ; MIPS32-NEXT: RetRA implicit $v0 114 %2:_(s32) = COPY $a0 115 %0:_(s8) = G_TRUNC %2(s32) 116 %3:_(s32) = COPY $a1 117 %1:_(s8) = G_TRUNC %3(s32) 118 %4:_(s8) = G_MUL %1, %0 119 %5:_(s32) = G_ANYEXT %4(s8) 120 $v0 = COPY %5(s32) 121 RetRA implicit $v0 122 123... 124--- 125name: mul_i16_sext 126alignment: 4 127tracksRegLiveness: true 128body: | 129 bb.1.entry: 130 liveins: $a0, $a1 131 132 ; MIPS32-LABEL: name: mul_i16_sext 133 ; MIPS32: liveins: $a0, $a1 134 ; MIPS32-NEXT: {{ $}} 135 ; MIPS32-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $a0 136 ; MIPS32-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $a1 137 ; MIPS32-NEXT: [[MUL:%[0-9]+]]:_(s32) = G_MUL [[COPY1]], [[COPY]] 138 ; MIPS32-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 16 139 ; MIPS32-NEXT: [[SHL:%[0-9]+]]:_(s32) = G_SHL [[MUL]], [[C]](s32) 140 ; MIPS32-NEXT: [[ASHR:%[0-9]+]]:_(s32) = G_ASHR [[SHL]], [[C]](s32) 141 ; MIPS32-NEXT: $v0 = COPY [[ASHR]](s32) 142 ; MIPS32-NEXT: RetRA implicit $v0 143 %2:_(s32) = COPY $a0 144 %0:_(s16) = G_TRUNC %2(s32) 145 %3:_(s32) = COPY $a1 146 %1:_(s16) = G_TRUNC %3(s32) 147 %4:_(s16) = G_MUL %1, %0 148 %5:_(s32) = G_SEXT %4(s16) 149 $v0 = COPY %5(s32) 150 RetRA implicit $v0 151 152... 153--- 154name: mul_i16_zext 155alignment: 4 156tracksRegLiveness: true 157body: | 158 bb.1.entry: 159 liveins: $a0, $a1 160 161 ; MIPS32-LABEL: name: mul_i16_zext 162 ; MIPS32: liveins: $a0, $a1 163 ; MIPS32-NEXT: {{ $}} 164 ; MIPS32-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $a0 165 ; MIPS32-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $a1 166 ; MIPS32-NEXT: [[MUL:%[0-9]+]]:_(s32) = G_MUL [[COPY1]], [[COPY]] 167 ; MIPS32-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 65535 168 ; MIPS32-NEXT: [[AND:%[0-9]+]]:_(s32) = G_AND [[MUL]], [[C]] 169 ; MIPS32-NEXT: $v0 = COPY [[AND]](s32) 170 ; MIPS32-NEXT: RetRA implicit $v0 171 %2:_(s32) = COPY $a0 172 %0:_(s16) = G_TRUNC %2(s32) 173 %3:_(s32) = COPY $a1 174 %1:_(s16) = G_TRUNC %3(s32) 175 %4:_(s16) = G_MUL %1, %0 176 %5:_(s32) = G_ZEXT %4(s16) 177 $v0 = COPY %5(s32) 178 RetRA implicit $v0 179 180... 181--- 182name: mul_i16_aext 183alignment: 4 184tracksRegLiveness: true 185body: | 186 bb.1.entry: 187 liveins: $a0, $a1 188 189 ; MIPS32-LABEL: name: mul_i16_aext 190 ; MIPS32: liveins: $a0, $a1 191 ; MIPS32-NEXT: {{ $}} 192 ; MIPS32-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $a0 193 ; MIPS32-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $a1 194 ; MIPS32-NEXT: [[MUL:%[0-9]+]]:_(s32) = G_MUL [[COPY1]], [[COPY]] 195 ; MIPS32-NEXT: $v0 = COPY [[MUL]](s32) 196 ; MIPS32-NEXT: RetRA implicit $v0 197 %2:_(s32) = COPY $a0 198 %0:_(s16) = G_TRUNC %2(s32) 199 %3:_(s32) = COPY $a1 200 %1:_(s16) = G_TRUNC %3(s32) 201 %4:_(s16) = G_MUL %1, %0 202 %5:_(s32) = G_ANYEXT %4(s16) 203 $v0 = COPY %5(s32) 204 RetRA implicit $v0 205 206... 207--- 208name: mul_i64 209alignment: 4 210tracksRegLiveness: true 211body: | 212 bb.1.entry: 213 liveins: $a0, $a1, $a2, $a3 214 215 ; MIPS32-LABEL: name: mul_i64 216 ; MIPS32: liveins: $a0, $a1, $a2, $a3 217 ; MIPS32-NEXT: {{ $}} 218 ; MIPS32-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $a0 219 ; MIPS32-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $a1 220 ; MIPS32-NEXT: [[COPY2:%[0-9]+]]:_(s32) = COPY $a2 221 ; MIPS32-NEXT: [[COPY3:%[0-9]+]]:_(s32) = COPY $a3 222 ; MIPS32-NEXT: [[MUL:%[0-9]+]]:_(s32) = G_MUL [[COPY2]], [[COPY]] 223 ; MIPS32-NEXT: [[MUL1:%[0-9]+]]:_(s32) = G_MUL [[COPY3]], [[COPY]] 224 ; MIPS32-NEXT: [[MUL2:%[0-9]+]]:_(s32) = G_MUL [[COPY2]], [[COPY1]] 225 ; MIPS32-NEXT: [[UMULH:%[0-9]+]]:_(s32) = G_UMULH [[COPY2]], [[COPY]] 226 ; MIPS32-NEXT: [[ADD:%[0-9]+]]:_(s32) = G_ADD [[MUL1]], [[MUL2]] 227 ; MIPS32-NEXT: [[ADD1:%[0-9]+]]:_(s32) = G_ADD [[ADD]], [[UMULH]] 228 ; MIPS32-NEXT: $v0 = COPY [[MUL]](s32) 229 ; MIPS32-NEXT: $v1 = COPY [[ADD1]](s32) 230 ; MIPS32-NEXT: RetRA implicit $v0, implicit $v1 231 %2:_(s32) = COPY $a0 232 %3:_(s32) = COPY $a1 233 %0:_(s64) = G_MERGE_VALUES %2(s32), %3(s32) 234 %4:_(s32) = COPY $a2 235 %5:_(s32) = COPY $a3 236 %1:_(s64) = G_MERGE_VALUES %4(s32), %5(s32) 237 %6:_(s64) = G_MUL %1, %0 238 %7:_(s32), %8:_(s32) = G_UNMERGE_VALUES %6(s64) 239 $v0 = COPY %7(s32) 240 $v1 = COPY %8(s32) 241 RetRA implicit $v0, implicit $v1 242 243... 244--- 245name: mul_i128 246alignment: 4 247tracksRegLiveness: true 248fixedStack: 249 - { id: 0, offset: 28, size: 4, alignment: 4, stack-id: default, isImmutable: true } 250 - { id: 1, offset: 24, size: 4, alignment: 8, stack-id: default, isImmutable: true } 251 - { id: 2, offset: 20, size: 4, alignment: 4, stack-id: default, isImmutable: true } 252 - { id: 3, offset: 16, size: 4, alignment: 8, stack-id: default, isImmutable: true } 253body: | 254 bb.1.entry: 255 liveins: $a0, $a1, $a2, $a3 256 257 ; MIPS32-LABEL: name: mul_i128 258 ; MIPS32: liveins: $a0, $a1, $a2, $a3 259 ; MIPS32-NEXT: {{ $}} 260 ; MIPS32-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $a0 261 ; MIPS32-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $a1 262 ; MIPS32-NEXT: [[COPY2:%[0-9]+]]:_(s32) = COPY $a2 263 ; MIPS32-NEXT: [[COPY3:%[0-9]+]]:_(s32) = COPY $a3 264 ; MIPS32-NEXT: [[FRAME_INDEX:%[0-9]+]]:_(p0) = G_FRAME_INDEX %fixed-stack.0 265 ; MIPS32-NEXT: [[LOAD:%[0-9]+]]:_(s32) = G_LOAD [[FRAME_INDEX]](p0) :: (load (s32) from %fixed-stack.0, align 8) 266 ; MIPS32-NEXT: [[FRAME_INDEX1:%[0-9]+]]:_(p0) = G_FRAME_INDEX %fixed-stack.1 267 ; MIPS32-NEXT: [[LOAD1:%[0-9]+]]:_(s32) = G_LOAD [[FRAME_INDEX1]](p0) :: (load (s32) from %fixed-stack.1) 268 ; MIPS32-NEXT: [[FRAME_INDEX2:%[0-9]+]]:_(p0) = G_FRAME_INDEX %fixed-stack.2 269 ; MIPS32-NEXT: [[LOAD2:%[0-9]+]]:_(s32) = G_LOAD [[FRAME_INDEX2]](p0) :: (load (s32) from %fixed-stack.2, align 8) 270 ; MIPS32-NEXT: [[FRAME_INDEX3:%[0-9]+]]:_(p0) = G_FRAME_INDEX %fixed-stack.3 271 ; MIPS32-NEXT: [[LOAD3:%[0-9]+]]:_(s32) = G_LOAD [[FRAME_INDEX3]](p0) :: (load (s32) from %fixed-stack.3) 272 ; MIPS32-NEXT: [[MUL:%[0-9]+]]:_(s32) = G_MUL [[LOAD]], [[COPY]] 273 ; MIPS32-NEXT: [[MUL1:%[0-9]+]]:_(s32) = G_MUL [[LOAD1]], [[COPY]] 274 ; MIPS32-NEXT: [[MUL2:%[0-9]+]]:_(s32) = G_MUL [[LOAD]], [[COPY1]] 275 ; MIPS32-NEXT: [[UMULH:%[0-9]+]]:_(s32) = G_UMULH [[LOAD]], [[COPY]] 276 ; MIPS32-NEXT: [[ADD:%[0-9]+]]:_(s32) = G_ADD [[MUL1]], [[MUL2]] 277 ; MIPS32-NEXT: [[ICMP:%[0-9]+]]:_(s32) = G_ICMP intpred(ult), [[ADD]](s32), [[MUL2]] 278 ; MIPS32-NEXT: [[COPY4:%[0-9]+]]:_(s32) = COPY [[ADD]](s32) 279 ; MIPS32-NEXT: [[ADD1:%[0-9]+]]:_(s32) = G_ADD [[COPY4]], [[UMULH]] 280 ; MIPS32-NEXT: [[ICMP1:%[0-9]+]]:_(s32) = G_ICMP intpred(ult), [[ADD1]](s32), [[UMULH]] 281 ; MIPS32-NEXT: [[COPY5:%[0-9]+]]:_(s32) = COPY [[ADD1]](s32) 282 ; MIPS32-NEXT: [[ADD2:%[0-9]+]]:_(s32) = G_ADD [[ICMP]], [[ICMP1]] 283 ; MIPS32-NEXT: [[MUL3:%[0-9]+]]:_(s32) = G_MUL [[LOAD2]], [[COPY]] 284 ; MIPS32-NEXT: [[MUL4:%[0-9]+]]:_(s32) = G_MUL [[LOAD1]], [[COPY1]] 285 ; MIPS32-NEXT: [[MUL5:%[0-9]+]]:_(s32) = G_MUL [[LOAD]], [[COPY2]] 286 ; MIPS32-NEXT: [[UMULH1:%[0-9]+]]:_(s32) = G_UMULH [[LOAD1]], [[COPY]] 287 ; MIPS32-NEXT: [[UMULH2:%[0-9]+]]:_(s32) = G_UMULH [[LOAD]], [[COPY1]] 288 ; MIPS32-NEXT: [[ADD3:%[0-9]+]]:_(s32) = G_ADD [[MUL3]], [[MUL4]] 289 ; MIPS32-NEXT: [[ICMP2:%[0-9]+]]:_(s32) = G_ICMP intpred(ult), [[ADD3]](s32), [[MUL4]] 290 ; MIPS32-NEXT: [[COPY6:%[0-9]+]]:_(s32) = COPY [[ADD3]](s32) 291 ; MIPS32-NEXT: [[ADD4:%[0-9]+]]:_(s32) = G_ADD [[COPY6]], [[MUL5]] 292 ; MIPS32-NEXT: [[ICMP3:%[0-9]+]]:_(s32) = G_ICMP intpred(ult), [[ADD4]](s32), [[MUL5]] 293 ; MIPS32-NEXT: [[COPY7:%[0-9]+]]:_(s32) = COPY [[ADD4]](s32) 294 ; MIPS32-NEXT: [[ADD5:%[0-9]+]]:_(s32) = G_ADD [[ICMP2]], [[ICMP3]] 295 ; MIPS32-NEXT: [[ADD6:%[0-9]+]]:_(s32) = G_ADD [[COPY7]], [[UMULH1]] 296 ; MIPS32-NEXT: [[ICMP4:%[0-9]+]]:_(s32) = G_ICMP intpred(ult), [[ADD6]](s32), [[UMULH1]] 297 ; MIPS32-NEXT: [[COPY8:%[0-9]+]]:_(s32) = COPY [[ADD6]](s32) 298 ; MIPS32-NEXT: [[ADD7:%[0-9]+]]:_(s32) = G_ADD [[ADD5]], [[ICMP4]] 299 ; MIPS32-NEXT: [[ADD8:%[0-9]+]]:_(s32) = G_ADD [[COPY8]], [[UMULH2]] 300 ; MIPS32-NEXT: [[ICMP5:%[0-9]+]]:_(s32) = G_ICMP intpred(ult), [[ADD8]](s32), [[UMULH2]] 301 ; MIPS32-NEXT: [[COPY9:%[0-9]+]]:_(s32) = COPY [[ADD8]](s32) 302 ; MIPS32-NEXT: [[ADD9:%[0-9]+]]:_(s32) = G_ADD [[ADD7]], [[ICMP5]] 303 ; MIPS32-NEXT: [[ADD10:%[0-9]+]]:_(s32) = G_ADD [[COPY9]], [[ADD2]] 304 ; MIPS32-NEXT: [[ICMP6:%[0-9]+]]:_(s32) = G_ICMP intpred(ult), [[ADD10]](s32), [[ADD2]] 305 ; MIPS32-NEXT: [[COPY10:%[0-9]+]]:_(s32) = COPY [[ADD10]](s32) 306 ; MIPS32-NEXT: [[ADD11:%[0-9]+]]:_(s32) = G_ADD [[ADD9]], [[ICMP6]] 307 ; MIPS32-NEXT: [[MUL6:%[0-9]+]]:_(s32) = G_MUL [[LOAD3]], [[COPY]] 308 ; MIPS32-NEXT: [[MUL7:%[0-9]+]]:_(s32) = G_MUL [[LOAD2]], [[COPY1]] 309 ; MIPS32-NEXT: [[MUL8:%[0-9]+]]:_(s32) = G_MUL [[LOAD1]], [[COPY2]] 310 ; MIPS32-NEXT: [[MUL9:%[0-9]+]]:_(s32) = G_MUL [[LOAD]], [[COPY3]] 311 ; MIPS32-NEXT: [[UMULH3:%[0-9]+]]:_(s32) = G_UMULH [[LOAD2]], [[COPY]] 312 ; MIPS32-NEXT: [[UMULH4:%[0-9]+]]:_(s32) = G_UMULH [[LOAD1]], [[COPY1]] 313 ; MIPS32-NEXT: [[UMULH5:%[0-9]+]]:_(s32) = G_UMULH [[LOAD]], [[COPY2]] 314 ; MIPS32-NEXT: [[ADD12:%[0-9]+]]:_(s32) = G_ADD [[MUL6]], [[MUL7]] 315 ; MIPS32-NEXT: [[ADD13:%[0-9]+]]:_(s32) = G_ADD [[ADD12]], [[MUL8]] 316 ; MIPS32-NEXT: [[ADD14:%[0-9]+]]:_(s32) = G_ADD [[ADD13]], [[MUL9]] 317 ; MIPS32-NEXT: [[ADD15:%[0-9]+]]:_(s32) = G_ADD [[ADD14]], [[UMULH3]] 318 ; MIPS32-NEXT: [[ADD16:%[0-9]+]]:_(s32) = G_ADD [[ADD15]], [[UMULH4]] 319 ; MIPS32-NEXT: [[ADD17:%[0-9]+]]:_(s32) = G_ADD [[ADD16]], [[UMULH5]] 320 ; MIPS32-NEXT: [[ADD18:%[0-9]+]]:_(s32) = G_ADD [[ADD17]], [[ADD11]] 321 ; MIPS32-NEXT: $v0 = COPY [[MUL]](s32) 322 ; MIPS32-NEXT: $v1 = COPY [[COPY5]](s32) 323 ; MIPS32-NEXT: $a0 = COPY [[COPY10]](s32) 324 ; MIPS32-NEXT: $a1 = COPY [[ADD18]](s32) 325 ; MIPS32-NEXT: RetRA implicit $v0, implicit $v1, implicit $a0, implicit $a1 326 %2:_(s32) = COPY $a0 327 %3:_(s32) = COPY $a1 328 %4:_(s32) = COPY $a2 329 %5:_(s32) = COPY $a3 330 %0:_(s128) = G_MERGE_VALUES %2(s32), %3(s32), %4(s32), %5(s32) 331 %10:_(p0) = G_FRAME_INDEX %fixed-stack.3 332 %6:_(s32) = G_LOAD %10(p0) :: (load (s32) from %fixed-stack.3, align 8) 333 %11:_(p0) = G_FRAME_INDEX %fixed-stack.2 334 %7:_(s32) = G_LOAD %11(p0) :: (load (s32) from %fixed-stack.2) 335 %12:_(p0) = G_FRAME_INDEX %fixed-stack.1 336 %8:_(s32) = G_LOAD %12(p0) :: (load (s32) from %fixed-stack.1, align 8) 337 %13:_(p0) = G_FRAME_INDEX %fixed-stack.0 338 %9:_(s32) = G_LOAD %13(p0) :: (load (s32) from %fixed-stack.0) 339 %1:_(s128) = G_MERGE_VALUES %6(s32), %7(s32), %8(s32), %9(s32) 340 %14:_(s128) = G_MUL %1, %0 341 %15:_(s32), %16:_(s32), %17:_(s32), %18:_(s32) = G_UNMERGE_VALUES %14(s128) 342 $v0 = COPY %15(s32) 343 $v1 = COPY %16(s32) 344 $a0 = COPY %17(s32) 345 $a1 = COPY %18(s32) 346 RetRA implicit $v0, implicit $v1, implicit $a0, implicit $a1 347 348... 349--- 350name: umulh_i64 351alignment: 4 352tracksRegLiveness: true 353body: | 354 bb.1.entry: 355 liveins: $a0, $a1, $a2, $a3 356 357 ; MIPS32-LABEL: name: umulh_i64 358 ; MIPS32: liveins: $a0, $a1, $a2, $a3 359 ; MIPS32-NEXT: {{ $}} 360 ; MIPS32-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $a0 361 ; MIPS32-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $a1 362 ; MIPS32-NEXT: [[COPY2:%[0-9]+]]:_(s32) = COPY $a2 363 ; MIPS32-NEXT: [[COPY3:%[0-9]+]]:_(s32) = COPY $a3 364 ; MIPS32-NEXT: [[MUL:%[0-9]+]]:_(s32) = G_MUL [[COPY3]], [[COPY]] 365 ; MIPS32-NEXT: [[MUL1:%[0-9]+]]:_(s32) = G_MUL [[COPY2]], [[COPY1]] 366 ; MIPS32-NEXT: [[UMULH:%[0-9]+]]:_(s32) = G_UMULH [[COPY2]], [[COPY]] 367 ; MIPS32-NEXT: [[ADD:%[0-9]+]]:_(s32) = G_ADD [[MUL]], [[MUL1]] 368 ; MIPS32-NEXT: [[ICMP:%[0-9]+]]:_(s32) = G_ICMP intpred(ult), [[ADD]](s32), [[MUL1]] 369 ; MIPS32-NEXT: [[COPY4:%[0-9]+]]:_(s32) = COPY [[ADD]](s32) 370 ; MIPS32-NEXT: [[ADD1:%[0-9]+]]:_(s32) = G_ADD [[COPY4]], [[UMULH]] 371 ; MIPS32-NEXT: [[ICMP1:%[0-9]+]]:_(s32) = G_ICMP intpred(ult), [[ADD1]](s32), [[UMULH]] 372 ; MIPS32-NEXT: [[COPY5:%[0-9]+]]:_(s32) = COPY [[ADD1]](s32) 373 ; MIPS32-NEXT: [[ADD2:%[0-9]+]]:_(s32) = G_ADD [[ICMP]], [[ICMP1]] 374 ; MIPS32-NEXT: [[MUL2:%[0-9]+]]:_(s32) = G_MUL [[COPY3]], [[COPY1]] 375 ; MIPS32-NEXT: [[UMULH1:%[0-9]+]]:_(s32) = G_UMULH [[COPY3]], [[COPY]] 376 ; MIPS32-NEXT: [[UMULH2:%[0-9]+]]:_(s32) = G_UMULH [[COPY2]], [[COPY1]] 377 ; MIPS32-NEXT: [[ADD3:%[0-9]+]]:_(s32) = G_ADD [[MUL2]], [[UMULH1]] 378 ; MIPS32-NEXT: [[ICMP2:%[0-9]+]]:_(s32) = G_ICMP intpred(ult), [[ADD3]](s32), [[UMULH1]] 379 ; MIPS32-NEXT: [[COPY6:%[0-9]+]]:_(s32) = COPY [[ADD3]](s32) 380 ; MIPS32-NEXT: [[ADD4:%[0-9]+]]:_(s32) = G_ADD [[COPY6]], [[UMULH2]] 381 ; MIPS32-NEXT: [[ICMP3:%[0-9]+]]:_(s32) = G_ICMP intpred(ult), [[ADD4]](s32), [[UMULH2]] 382 ; MIPS32-NEXT: [[COPY7:%[0-9]+]]:_(s32) = COPY [[ADD4]](s32) 383 ; MIPS32-NEXT: [[ADD5:%[0-9]+]]:_(s32) = G_ADD [[ICMP2]], [[ICMP3]] 384 ; MIPS32-NEXT: [[ADD6:%[0-9]+]]:_(s32) = G_ADD [[COPY7]], [[ADD2]] 385 ; MIPS32-NEXT: [[ICMP4:%[0-9]+]]:_(s32) = G_ICMP intpred(ult), [[ADD6]](s32), [[ADD2]] 386 ; MIPS32-NEXT: [[COPY8:%[0-9]+]]:_(s32) = COPY [[ADD6]](s32) 387 ; MIPS32-NEXT: [[ADD7:%[0-9]+]]:_(s32) = G_ADD [[ADD5]], [[ICMP4]] 388 ; MIPS32-NEXT: [[UMULH3:%[0-9]+]]:_(s32) = G_UMULH [[COPY3]], [[COPY1]] 389 ; MIPS32-NEXT: [[ADD8:%[0-9]+]]:_(s32) = G_ADD [[UMULH3]], [[ADD7]] 390 ; MIPS32-NEXT: $v0 = COPY [[COPY8]](s32) 391 ; MIPS32-NEXT: $v1 = COPY [[ADD8]](s32) 392 ; MIPS32-NEXT: RetRA implicit $v0, implicit $v1 393 %2:_(s32) = COPY $a0 394 %3:_(s32) = COPY $a1 395 %0:_(s64) = G_MERGE_VALUES %2(s32), %3(s32) 396 %4:_(s32) = COPY $a2 397 %5:_(s32) = COPY $a3 398 %1:_(s64) = G_MERGE_VALUES %4(s32), %5(s32) 399 %6:_(s64) = G_UMULH %1, %0 400 %7:_(s32), %8:_(s32) = G_UNMERGE_VALUES %6(s64) 401 $v0 = COPY %7(s32) 402 $v1 = COPY %8(s32) 403 RetRA implicit $v0, implicit $v1 404 405... 406--- 407name: umul_with_overflow 408alignment: 4 409tracksRegLiveness: true 410body: | 411 bb.1 (%ir-block.0): 412 liveins: $a0, $a1, $a2, $a3 413 414 ; MIPS32-LABEL: name: umul_with_overflow 415 ; MIPS32: liveins: $a0, $a1, $a2, $a3 416 ; MIPS32-NEXT: {{ $}} 417 ; MIPS32-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $a0 418 ; MIPS32-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $a1 419 ; MIPS32-NEXT: [[COPY2:%[0-9]+]]:_(p0) = COPY $a2 420 ; MIPS32-NEXT: [[COPY3:%[0-9]+]]:_(p0) = COPY $a3 421 ; MIPS32-NEXT: [[UMULH:%[0-9]+]]:_(s32) = G_UMULH [[COPY]], [[COPY1]] 422 ; MIPS32-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 0 423 ; MIPS32-NEXT: [[MUL:%[0-9]+]]:_(s32) = G_MUL [[COPY]], [[COPY1]] 424 ; MIPS32-NEXT: [[ICMP:%[0-9]+]]:_(s32) = G_ICMP intpred(ne), [[UMULH]](s32), [[C]] 425 ; MIPS32-NEXT: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 1 426 ; MIPS32-NEXT: [[AND:%[0-9]+]]:_(s32) = G_AND [[ICMP]], [[C1]] 427 ; MIPS32-NEXT: G_STORE [[AND]](s32), [[COPY3]](p0) :: (store (s8) into %ir.pcarry_flag) 428 ; MIPS32-NEXT: G_STORE [[MUL]](s32), [[COPY2]](p0) :: (store (s32) into %ir.pmul) 429 ; MIPS32-NEXT: RetRA 430 %0:_(s32) = COPY $a0 431 %1:_(s32) = COPY $a1 432 %2:_(p0) = COPY $a2 433 %3:_(p0) = COPY $a3 434 %4:_(s32), %5:_(s1) = G_UMULO %0, %1 435 G_STORE %5(s1), %3(p0) :: (store (s1) into %ir.pcarry_flag) 436 G_STORE %4(s32), %2(p0) :: (store (s32) into %ir.pmul) 437 RetRA 438 439... 440