# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py # RUN: llc -mtriple=aarch64 -run-pass=legalizer %s -o - | FileCheck %s --- name: smulfix_i32_scale_0 body: | bb.1: liveins: $w0, $w1 ; CHECK-LABEL: name: smulfix_i32_scale_0 ; CHECK: liveins: $w0, $w1 ; CHECK-NEXT: {{ $}} ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(i32) = COPY $w0 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(i32) = COPY $w1 ; CHECK-NEXT: [[MUL:%[0-9]+]]:_(i32) = G_MUL [[COPY]], [[COPY1]] ; CHECK-NEXT: $w0 = COPY [[MUL]](i32) ; CHECK-NEXT: RET_ReallyLR implicit $w0 %0:_(i32) = COPY $w0 %1:_(i32) = COPY $w1 %2:_(i32) = G_UMULFIX %0, %1, 0 $w0 = COPY %2(i32) RET_ReallyLR implicit $w0 ... --- name: smulfix_i32 body: | bb.1: liveins: $w0, $w1 ; CHECK-LABEL: name: smulfix_i32 ; CHECK: liveins: $w0, $w1 ; CHECK-NEXT: {{ $}} ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(i32) = COPY $w0 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(i32) = COPY $w1 ; CHECK-NEXT: [[C:%[0-9]+]]:_(i64) = G_CONSTANT i64 15 ; CHECK-NEXT: [[ZEXT:%[0-9]+]]:_(i64) = G_ZEXT [[COPY]](i32) ; CHECK-NEXT: [[ZEXT1:%[0-9]+]]:_(i64) = G_ZEXT [[COPY1]](i32) ; CHECK-NEXT: [[MUL:%[0-9]+]]:_(i64) = G_MUL [[ZEXT]], [[ZEXT1]] ; CHECK-NEXT: [[LSHR:%[0-9]+]]:_(i64) = G_LSHR [[MUL]], [[C]](i64) ; CHECK-NEXT: [[TRUNC:%[0-9]+]]:_(i32) = G_TRUNC [[LSHR]](i64) ; CHECK-NEXT: $w0 = COPY [[TRUNC]](i32) ; CHECK-NEXT: RET_ReallyLR implicit $w0 %0:_(i32) = COPY $w0 %1:_(i32) = COPY $w1 %2:_(i32) = G_UMULFIX %0, %1, 15 $w0 = COPY %2(i32) RET_ReallyLR implicit $w0 ... --- name: smulfix_i64 body: | bb.1: liveins: $x0, $x1 ; CHECK-LABEL: name: smulfix_i64 ; CHECK: liveins: $x0, $x1 ; CHECK-NEXT: {{ $}} ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(i64) = COPY $x0 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(i64) = COPY $x1 ; CHECK-NEXT: [[C:%[0-9]+]]:_(i64) = G_CONSTANT i64 15 ; CHECK-NEXT: [[C1:%[0-9]+]]:_(i64) = G_CONSTANT i64 0 ; CHECK-NEXT: [[MUL:%[0-9]+]]:_(i64) = G_MUL [[COPY]], [[COPY1]] ; CHECK-NEXT: [[UMULH:%[0-9]+]]:_(i64) = G_UMULH [[COPY]], [[COPY1]] ; CHECK-NEXT: [[MUL1:%[0-9]+]]:_(i64) = G_MUL [[COPY]], [[C1]] ; CHECK-NEXT: [[MUL2:%[0-9]+]]:_(i64) = G_MUL [[C1]], [[COPY1]] ; CHECK-NEXT: [[ADD:%[0-9]+]]:_(i64) = G_ADD [[UMULH]], [[MUL1]] ; CHECK-NEXT: [[ADD1:%[0-9]+]]:_(i64) = G_ADD [[ADD]], [[MUL2]] ; CHECK-NEXT: [[LSHR:%[0-9]+]]:_(i64) = G_LSHR [[MUL]], [[C]](i64) ; CHECK-NEXT: [[C2:%[0-9]+]]:_(i64) = G_CONSTANT i64 49 ; CHECK-NEXT: [[SHL:%[0-9]+]]:_(i64) = G_SHL [[ADD1]], [[C2]](i64) ; CHECK-NEXT: [[OR:%[0-9]+]]:_(i64) = G_OR [[LSHR]], [[SHL]] ; CHECK-NEXT: $x0 = COPY [[OR]](i64) ; CHECK-NEXT: RET_ReallyLR implicit $x0 %0:_(i64) = COPY $x0 %1:_(i64) = COPY $x1 %2:_(i64) = G_UMULFIX %0, %1, 15 $x0 = COPY %2(i64) RET_ReallyLR implicit $x0 ... --- name: smulfix_4xi32 body: | bb.1: liveins: $q0, $q1 ; CHECK-LABEL: name: smulfix_4xi32 ; CHECK: liveins: $q0, $q1 ; CHECK-NEXT: {{ $}} ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<4 x i32>) = COPY $q0 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(<4 x i32>) = COPY $q1 ; CHECK-NEXT: [[C:%[0-9]+]]:_(i64) = G_CONSTANT i64 2 ; CHECK-NEXT: [[BUILD_VECTOR:%[0-9]+]]:_(<2 x i64>) = G_BUILD_VECTOR [[C]](i64), [[C]](i64) ; CHECK-NEXT: [[UV:%[0-9]+]]:_(<2 x i32>), [[UV1:%[0-9]+]]:_(<2 x i32>) = G_UNMERGE_VALUES [[COPY]](<4 x i32>) ; CHECK-NEXT: [[ZEXT:%[0-9]+]]:_(<2 x i64>) = G_ZEXT [[UV]](<2 x i32>) ; CHECK-NEXT: [[ZEXT1:%[0-9]+]]:_(<2 x i64>) = G_ZEXT [[UV1]](<2 x i32>) ; CHECK-NEXT: [[UV2:%[0-9]+]]:_(<2 x i32>), [[UV3:%[0-9]+]]:_(<2 x i32>) = G_UNMERGE_VALUES [[COPY1]](<4 x i32>) ; CHECK-NEXT: [[ZEXT2:%[0-9]+]]:_(<2 x i64>) = G_ZEXT [[UV2]](<2 x i32>) ; CHECK-NEXT: [[ZEXT3:%[0-9]+]]:_(<2 x i64>) = G_ZEXT [[UV3]](<2 x i32>) ; CHECK-NEXT: [[MUL:%[0-9]+]]:_(<2 x i64>) = G_MUL [[ZEXT]], [[ZEXT2]] ; CHECK-NEXT: [[MUL1:%[0-9]+]]:_(<2 x i64>) = G_MUL [[ZEXT1]], [[ZEXT3]] ; CHECK-NEXT: [[LSHR:%[0-9]+]]:_(<2 x i64>) = G_LSHR [[MUL]], [[BUILD_VECTOR]](<2 x i64>) ; CHECK-NEXT: [[LSHR1:%[0-9]+]]:_(<2 x i64>) = G_LSHR [[MUL1]], [[BUILD_VECTOR]](<2 x i64>) ; CHECK-NEXT: [[TRUNC:%[0-9]+]]:_(<2 x i32>) = G_TRUNC [[LSHR]](<2 x i64>) ; CHECK-NEXT: [[TRUNC1:%[0-9]+]]:_(<2 x i32>) = G_TRUNC [[LSHR1]](<2 x i64>) ; CHECK-NEXT: [[CONCAT_VECTORS:%[0-9]+]]:_(<4 x i32>) = G_CONCAT_VECTORS [[TRUNC]](<2 x i32>), [[TRUNC1]](<2 x i32>) ; CHECK-NEXT: $q0 = COPY [[CONCAT_VECTORS]](<4 x i32>) ; CHECK-NEXT: RET_ReallyLR implicit $q0 %0:_(<4 x i32>) = COPY $q0 %1:_(<4 x i32>) = COPY $q1 %2:_(<4 x i32>) = G_UMULFIX %0, %1, 2 $q0 = COPY %2(<4 x i32>) RET_ReallyLR implicit $q0 ... --- name: smulfix_4xi32_15 body: | bb.1: liveins: $q0, $q1 ; CHECK-LABEL: name: smulfix_4xi32_15 ; CHECK: liveins: $q0, $q1 ; CHECK-NEXT: {{ $}} ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<4 x i32>) = COPY $q0 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(<4 x i32>) = COPY $q1 ; CHECK-NEXT: [[C:%[0-9]+]]:_(i64) = G_CONSTANT i64 15 ; CHECK-NEXT: [[BUILD_VECTOR:%[0-9]+]]:_(<2 x i64>) = G_BUILD_VECTOR [[C]](i64), [[C]](i64) ; CHECK-NEXT: [[UV:%[0-9]+]]:_(<2 x i32>), [[UV1:%[0-9]+]]:_(<2 x i32>) = G_UNMERGE_VALUES [[COPY]](<4 x i32>) ; CHECK-NEXT: [[ZEXT:%[0-9]+]]:_(<2 x i64>) = G_ZEXT [[UV]](<2 x i32>) ; CHECK-NEXT: [[ZEXT1:%[0-9]+]]:_(<2 x i64>) = G_ZEXT [[UV1]](<2 x i32>) ; CHECK-NEXT: [[UV2:%[0-9]+]]:_(<2 x i32>), [[UV3:%[0-9]+]]:_(<2 x i32>) = G_UNMERGE_VALUES [[COPY1]](<4 x i32>) ; CHECK-NEXT: [[ZEXT2:%[0-9]+]]:_(<2 x i64>) = G_ZEXT [[UV2]](<2 x i32>) ; CHECK-NEXT: [[ZEXT3:%[0-9]+]]:_(<2 x i64>) = G_ZEXT [[UV3]](<2 x i32>) ; CHECK-NEXT: [[MUL:%[0-9]+]]:_(<2 x i64>) = G_MUL [[ZEXT]], [[ZEXT2]] ; CHECK-NEXT: [[MUL1:%[0-9]+]]:_(<2 x i64>) = G_MUL [[ZEXT1]], [[ZEXT3]] ; CHECK-NEXT: [[LSHR:%[0-9]+]]:_(<2 x i64>) = G_LSHR [[MUL]], [[BUILD_VECTOR]](<2 x i64>) ; CHECK-NEXT: [[LSHR1:%[0-9]+]]:_(<2 x i64>) = G_LSHR [[MUL1]], [[BUILD_VECTOR]](<2 x i64>) ; CHECK-NEXT: [[TRUNC:%[0-9]+]]:_(<2 x i32>) = G_TRUNC [[LSHR]](<2 x i64>) ; CHECK-NEXT: [[TRUNC1:%[0-9]+]]:_(<2 x i32>) = G_TRUNC [[LSHR1]](<2 x i64>) ; CHECK-NEXT: [[CONCAT_VECTORS:%[0-9]+]]:_(<4 x i32>) = G_CONCAT_VECTORS [[TRUNC]](<2 x i32>), [[TRUNC1]](<2 x i32>) ; CHECK-NEXT: $q0 = COPY [[CONCAT_VECTORS]](<4 x i32>) ; CHECK-NEXT: RET_ReallyLR implicit $q0 %0:_(<4 x i32>) = COPY $q0 %1:_(<4 x i32>) = COPY $q1 %2:_(<4 x i32>) = G_UMULFIX %0, %1, 15 $q0 = COPY %2(<4 x i32>) RET_ReallyLR implicit $q0 ... --- name: smulfix_4xi32_31 body: | bb.1: liveins: $q0, $q1 ; CHECK-LABEL: name: smulfix_4xi32_31 ; CHECK: liveins: $q0, $q1 ; CHECK-NEXT: {{ $}} ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<4 x i32>) = COPY $q0 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(<4 x i32>) = COPY $q1 ; CHECK-NEXT: [[C:%[0-9]+]]:_(i64) = G_CONSTANT i64 31 ; CHECK-NEXT: [[BUILD_VECTOR:%[0-9]+]]:_(<2 x i64>) = G_BUILD_VECTOR [[C]](i64), [[C]](i64) ; CHECK-NEXT: [[UV:%[0-9]+]]:_(<2 x i32>), [[UV1:%[0-9]+]]:_(<2 x i32>) = G_UNMERGE_VALUES [[COPY]](<4 x i32>) ; CHECK-NEXT: [[ZEXT:%[0-9]+]]:_(<2 x i64>) = G_ZEXT [[UV]](<2 x i32>) ; CHECK-NEXT: [[ZEXT1:%[0-9]+]]:_(<2 x i64>) = G_ZEXT [[UV1]](<2 x i32>) ; CHECK-NEXT: [[UV2:%[0-9]+]]:_(<2 x i32>), [[UV3:%[0-9]+]]:_(<2 x i32>) = G_UNMERGE_VALUES [[COPY1]](<4 x i32>) ; CHECK-NEXT: [[ZEXT2:%[0-9]+]]:_(<2 x i64>) = G_ZEXT [[UV2]](<2 x i32>) ; CHECK-NEXT: [[ZEXT3:%[0-9]+]]:_(<2 x i64>) = G_ZEXT [[UV3]](<2 x i32>) ; CHECK-NEXT: [[MUL:%[0-9]+]]:_(<2 x i64>) = G_MUL [[ZEXT]], [[ZEXT2]] ; CHECK-NEXT: [[MUL1:%[0-9]+]]:_(<2 x i64>) = G_MUL [[ZEXT1]], [[ZEXT3]] ; CHECK-NEXT: [[LSHR:%[0-9]+]]:_(<2 x i64>) = G_LSHR [[MUL]], [[BUILD_VECTOR]](<2 x i64>) ; CHECK-NEXT: [[LSHR1:%[0-9]+]]:_(<2 x i64>) = G_LSHR [[MUL1]], [[BUILD_VECTOR]](<2 x i64>) ; CHECK-NEXT: [[TRUNC:%[0-9]+]]:_(<2 x i32>) = G_TRUNC [[LSHR]](<2 x i64>) ; CHECK-NEXT: [[TRUNC1:%[0-9]+]]:_(<2 x i32>) = G_TRUNC [[LSHR1]](<2 x i64>) ; CHECK-NEXT: [[CONCAT_VECTORS:%[0-9]+]]:_(<4 x i32>) = G_CONCAT_VECTORS [[TRUNC]](<2 x i32>), [[TRUNC1]](<2 x i32>) ; CHECK-NEXT: $q0 = COPY [[CONCAT_VECTORS]](<4 x i32>) ; CHECK-NEXT: RET_ReallyLR implicit $q0 %0:_(<4 x i32>) = COPY $q0 %1:_(<4 x i32>) = COPY $q1 %2:_(<4 x i32>) = G_UMULFIX %0, %1, 31 $q0 = COPY %2(<4 x i32>) RET_ReallyLR implicit $q0 ...