1e9cd197dSwanglei; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2e9cd197dSwanglei; RUN: llc --mtriple=loongarch64 --mattr=+lsx < %s | FileCheck %s 3e9cd197dSwanglei 4e9cd197dSwangleidefine void @mulhs_v16i8(ptr %res, ptr %a0, ptr %a1) nounwind { 5e9cd197dSwanglei; CHECK-LABEL: mulhs_v16i8: 6e9cd197dSwanglei; CHECK: # %bb.0: # %entry 7*a5c90e48Swanglei; CHECK-NEXT: vld $vr0, $a1, 0 8*a5c90e48Swanglei; CHECK-NEXT: vld $vr1, $a2, 0 9*a5c90e48Swanglei; CHECK-NEXT: vmuh.b $vr0, $vr0, $vr1 10e9cd197dSwanglei; CHECK-NEXT: vst $vr0, $a0, 0 11e9cd197dSwanglei; CHECK-NEXT: ret 12e9cd197dSwangleientry: 13e9cd197dSwanglei %v0 = load <16 x i8>, ptr %a0 14e9cd197dSwanglei %v1 = load <16 x i8>, ptr %a1 15e9cd197dSwanglei %v0s = sext <16 x i8> %v0 to <16 x i16> 16e9cd197dSwanglei %v1s = sext <16 x i8> %v1 to <16 x i16> 17e9cd197dSwanglei %m = mul <16 x i16> %v0s, %v1s 18e9cd197dSwanglei %s = ashr <16 x i16> %m, <i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8> 19e9cd197dSwanglei %v2 = trunc <16 x i16> %s to <16 x i8> 20e9cd197dSwanglei store <16 x i8> %v2, ptr %res 21e9cd197dSwanglei ret void 22e9cd197dSwanglei} 23e9cd197dSwanglei 24e9cd197dSwangleidefine void @mulhu_v16i8(ptr %res, ptr %a0, ptr %a1) nounwind { 25e9cd197dSwanglei; CHECK-LABEL: mulhu_v16i8: 26e9cd197dSwanglei; CHECK: # %bb.0: # %entry 27*a5c90e48Swanglei; CHECK-NEXT: vld $vr0, $a1, 0 28*a5c90e48Swanglei; CHECK-NEXT: vld $vr1, $a2, 0 29*a5c90e48Swanglei; CHECK-NEXT: vmuh.bu $vr0, $vr0, $vr1 30e9cd197dSwanglei; CHECK-NEXT: vst $vr0, $a0, 0 31e9cd197dSwanglei; CHECK-NEXT: ret 32e9cd197dSwangleientry: 33e9cd197dSwanglei %v0 = load <16 x i8>, ptr %a0 34e9cd197dSwanglei %v1 = load <16 x i8>, ptr %a1 35e9cd197dSwanglei %v0z = zext <16 x i8> %v0 to <16 x i16> 36e9cd197dSwanglei %v1z = zext <16 x i8> %v1 to <16 x i16> 37e9cd197dSwanglei %m = mul <16 x i16> %v0z, %v1z 38e9cd197dSwanglei %s = lshr <16 x i16> %m, <i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8> 39e9cd197dSwanglei %v2 = trunc <16 x i16> %s to <16 x i8> 40e9cd197dSwanglei store <16 x i8> %v2, ptr %res 41e9cd197dSwanglei ret void 42e9cd197dSwanglei} 43e9cd197dSwanglei 44e9cd197dSwangleidefine void @mulhs_v8i16(ptr %res, ptr %a0, ptr %a1) nounwind { 45e9cd197dSwanglei; CHECK-LABEL: mulhs_v8i16: 46e9cd197dSwanglei; CHECK: # %bb.0: # %entry 47*a5c90e48Swanglei; CHECK-NEXT: vld $vr0, $a1, 0 48*a5c90e48Swanglei; CHECK-NEXT: vld $vr1, $a2, 0 49*a5c90e48Swanglei; CHECK-NEXT: vmuh.h $vr0, $vr0, $vr1 50e9cd197dSwanglei; CHECK-NEXT: vst $vr0, $a0, 0 51e9cd197dSwanglei; CHECK-NEXT: ret 52e9cd197dSwangleientry: 53e9cd197dSwanglei %v0 = load <8 x i16>, ptr %a0 54e9cd197dSwanglei %v1 = load <8 x i16>, ptr %a1 55e9cd197dSwanglei %v0s = sext <8 x i16> %v0 to <8 x i32> 56e9cd197dSwanglei %v1s = sext <8 x i16> %v1 to <8 x i32> 57e9cd197dSwanglei %m = mul <8 x i32> %v0s, %v1s 58e9cd197dSwanglei %s = ashr <8 x i32> %m, <i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16> 59e9cd197dSwanglei %v2 = trunc <8 x i32> %s to <8 x i16> 60e9cd197dSwanglei store <8 x i16> %v2, ptr %res 61e9cd197dSwanglei ret void 62e9cd197dSwanglei} 63e9cd197dSwanglei 64e9cd197dSwangleidefine void @mulhu_v8i16(ptr %res, ptr %a0, ptr %a1) nounwind { 65e9cd197dSwanglei; CHECK-LABEL: mulhu_v8i16: 66e9cd197dSwanglei; CHECK: # %bb.0: # %entry 67*a5c90e48Swanglei; CHECK-NEXT: vld $vr0, $a1, 0 68*a5c90e48Swanglei; CHECK-NEXT: vld $vr1, $a2, 0 69*a5c90e48Swanglei; CHECK-NEXT: vmuh.hu $vr0, $vr0, $vr1 70e9cd197dSwanglei; CHECK-NEXT: vst $vr0, $a0, 0 71e9cd197dSwanglei; CHECK-NEXT: ret 72e9cd197dSwangleientry: 73e9cd197dSwanglei %v0 = load <8 x i16>, ptr %a0 74e9cd197dSwanglei %v1 = load <8 x i16>, ptr %a1 75e9cd197dSwanglei %v0z = zext <8 x i16> %v0 to <8 x i32> 76e9cd197dSwanglei %v1z = zext <8 x i16> %v1 to <8 x i32> 77e9cd197dSwanglei %m = mul <8 x i32> %v0z, %v1z 78e9cd197dSwanglei %s = lshr <8 x i32> %m, <i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16> 79e9cd197dSwanglei %v2 = trunc <8 x i32> %s to <8 x i16> 80e9cd197dSwanglei store <8 x i16> %v2, ptr %res 81e9cd197dSwanglei ret void 82e9cd197dSwanglei} 83e9cd197dSwanglei 84e9cd197dSwangleidefine void @mulhs_v4i32(ptr %res, ptr %a0, ptr %a1) nounwind { 85e9cd197dSwanglei; CHECK-LABEL: mulhs_v4i32: 86e9cd197dSwanglei; CHECK: # %bb.0: # %entry 87*a5c90e48Swanglei; CHECK-NEXT: vld $vr0, $a1, 0 88*a5c90e48Swanglei; CHECK-NEXT: vld $vr1, $a2, 0 89*a5c90e48Swanglei; CHECK-NEXT: vmuh.w $vr0, $vr0, $vr1 90e9cd197dSwanglei; CHECK-NEXT: vst $vr0, $a0, 0 91e9cd197dSwanglei; CHECK-NEXT: ret 92e9cd197dSwangleientry: 93e9cd197dSwanglei %v0 = load <4 x i32>, ptr %a0 94e9cd197dSwanglei %v1 = load <4 x i32>, ptr %a1 95e9cd197dSwanglei %v0s = sext <4 x i32> %v0 to <4 x i64> 96e9cd197dSwanglei %v1s = sext <4 x i32> %v1 to <4 x i64> 97e9cd197dSwanglei %m = mul <4 x i64> %v0s, %v1s 98e9cd197dSwanglei %s = ashr <4 x i64> %m, <i64 32, i64 32, i64 32, i64 32> 99e9cd197dSwanglei %v2 = trunc <4 x i64> %s to <4 x i32> 100e9cd197dSwanglei store <4 x i32> %v2, ptr %res 101e9cd197dSwanglei ret void 102e9cd197dSwanglei} 103e9cd197dSwanglei 104e9cd197dSwangleidefine void @mulhu_v4i32(ptr %res, ptr %a0, ptr %a1) nounwind { 105e9cd197dSwanglei; CHECK-LABEL: mulhu_v4i32: 106e9cd197dSwanglei; CHECK: # %bb.0: # %entry 107*a5c90e48Swanglei; CHECK-NEXT: vld $vr0, $a1, 0 108*a5c90e48Swanglei; CHECK-NEXT: vld $vr1, $a2, 0 109*a5c90e48Swanglei; CHECK-NEXT: vmuh.wu $vr0, $vr0, $vr1 110e9cd197dSwanglei; CHECK-NEXT: vst $vr0, $a0, 0 111e9cd197dSwanglei; CHECK-NEXT: ret 112e9cd197dSwangleientry: 113e9cd197dSwanglei %v0 = load <4 x i32>, ptr %a0 114e9cd197dSwanglei %v1 = load <4 x i32>, ptr %a1 115e9cd197dSwanglei %v0z = zext <4 x i32> %v0 to <4 x i64> 116e9cd197dSwanglei %v1z = zext <4 x i32> %v1 to <4 x i64> 117e9cd197dSwanglei %m = mul <4 x i64> %v0z, %v1z 118e9cd197dSwanglei %s = lshr <4 x i64> %m, <i64 32, i64 32, i64 32, i64 32> 119e9cd197dSwanglei %v2 = trunc <4 x i64> %s to <4 x i32> 120e9cd197dSwanglei store <4 x i32> %v2, ptr %res 121e9cd197dSwanglei ret void 122e9cd197dSwanglei} 123e9cd197dSwanglei 124e9cd197dSwangleidefine void @mulhs_v2i64(ptr %res, ptr %a0, ptr %a1) nounwind { 125e9cd197dSwanglei; CHECK-LABEL: mulhs_v2i64: 126e9cd197dSwanglei; CHECK: # %bb.0: # %entry 127*a5c90e48Swanglei; CHECK-NEXT: vld $vr0, $a1, 0 128*a5c90e48Swanglei; CHECK-NEXT: vld $vr1, $a2, 0 129*a5c90e48Swanglei; CHECK-NEXT: vmuh.d $vr0, $vr0, $vr1 130e9cd197dSwanglei; CHECK-NEXT: vst $vr0, $a0, 0 131e9cd197dSwanglei; CHECK-NEXT: ret 132e9cd197dSwangleientry: 133e9cd197dSwanglei %v0 = load <2 x i64>, ptr %a0 134e9cd197dSwanglei %v1 = load <2 x i64>, ptr %a1 135e9cd197dSwanglei %v0s = sext <2 x i64> %v0 to <2 x i128> 136e9cd197dSwanglei %v1s = sext <2 x i64> %v1 to <2 x i128> 137e9cd197dSwanglei %m = mul <2 x i128> %v0s, %v1s 138e9cd197dSwanglei %s = ashr <2 x i128> %m, <i128 64, i128 64> 139e9cd197dSwanglei %v2 = trunc <2 x i128> %s to <2 x i64> 140e9cd197dSwanglei store <2 x i64> %v2, ptr %res 141e9cd197dSwanglei ret void 142e9cd197dSwanglei} 143e9cd197dSwanglei 144e9cd197dSwangleidefine void @mulhu_v2i64(ptr %res, ptr %a0, ptr %a1) nounwind { 145e9cd197dSwanglei; CHECK-LABEL: mulhu_v2i64: 146e9cd197dSwanglei; CHECK: # %bb.0: # %entry 147*a5c90e48Swanglei; CHECK-NEXT: vld $vr0, $a1, 0 148*a5c90e48Swanglei; CHECK-NEXT: vld $vr1, $a2, 0 149*a5c90e48Swanglei; CHECK-NEXT: vmuh.du $vr0, $vr0, $vr1 150e9cd197dSwanglei; CHECK-NEXT: vst $vr0, $a0, 0 151e9cd197dSwanglei; CHECK-NEXT: ret 152e9cd197dSwangleientry: 153e9cd197dSwanglei %v0 = load <2 x i64>, ptr %a0 154e9cd197dSwanglei %v1 = load <2 x i64>, ptr %a1 155e9cd197dSwanglei %v0z = zext <2 x i64> %v0 to <2 x i128> 156e9cd197dSwanglei %v1z = zext <2 x i64> %v1 to <2 x i128> 157e9cd197dSwanglei %m = mul <2 x i128> %v0z, %v1z 158e9cd197dSwanglei %s = lshr <2 x i128> %m, <i128 64, i128 64> 159e9cd197dSwanglei %v2 = trunc <2 x i128> %s to <2 x i64> 160e9cd197dSwanglei store <2 x i64> %v2, ptr %res 161e9cd197dSwanglei ret void 162e9cd197dSwanglei} 163