1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 4 2; RUN: llc --mtriple=loongarch64 --mattr=+lasx < %s | FileCheck %s 3 4define void @mul_v32i8(ptr %res, ptr %a0, ptr %a1) nounwind { 5; CHECK-LABEL: mul_v32i8: 6; CHECK: # %bb.0: # %entry 7; CHECK-NEXT: xvld $xr0, $a1, 0 8; CHECK-NEXT: xvld $xr1, $a2, 0 9; CHECK-NEXT: xvmul.b $xr0, $xr0, $xr1 10; CHECK-NEXT: xvst $xr0, $a0, 0 11; CHECK-NEXT: ret 12entry: 13 %v0 = load <32 x i8>, ptr %a0 14 %v1 = load <32 x i8>, ptr %a1 15 %v2 = mul <32 x i8> %v0, %v1 16 store <32 x i8> %v2, ptr %res 17 ret void 18} 19 20define void @mul_v16i16(ptr %res, ptr %a0, ptr %a1) nounwind { 21; CHECK-LABEL: mul_v16i16: 22; CHECK: # %bb.0: # %entry 23; CHECK-NEXT: xvld $xr0, $a1, 0 24; CHECK-NEXT: xvld $xr1, $a2, 0 25; CHECK-NEXT: xvmul.h $xr0, $xr0, $xr1 26; CHECK-NEXT: xvst $xr0, $a0, 0 27; CHECK-NEXT: ret 28entry: 29 %v0 = load <16 x i16>, ptr %a0 30 %v1 = load <16 x i16>, ptr %a1 31 %v2 = mul <16 x i16> %v0, %v1 32 store <16 x i16> %v2, ptr %res 33 ret void 34} 35 36define void @mul_v8i32(ptr %res, ptr %a0, ptr %a1) nounwind { 37; CHECK-LABEL: mul_v8i32: 38; CHECK: # %bb.0: # %entry 39; CHECK-NEXT: xvld $xr0, $a1, 0 40; CHECK-NEXT: xvld $xr1, $a2, 0 41; CHECK-NEXT: xvmul.w $xr0, $xr0, $xr1 42; CHECK-NEXT: xvst $xr0, $a0, 0 43; CHECK-NEXT: ret 44entry: 45 %v0 = load <8 x i32>, ptr %a0 46 %v1 = load <8 x i32>, ptr %a1 47 %v2 = mul <8 x i32> %v0, %v1 48 store <8 x i32> %v2, ptr %res 49 ret void 50} 51 52define void @mul_v4i64(ptr %res, ptr %a0, ptr %a1) nounwind { 53; CHECK-LABEL: mul_v4i64: 54; CHECK: # %bb.0: # %entry 55; CHECK-NEXT: xvld $xr0, $a1, 0 56; CHECK-NEXT: xvld $xr1, $a2, 0 57; CHECK-NEXT: xvmul.d $xr0, $xr0, $xr1 58; CHECK-NEXT: xvst $xr0, $a0, 0 59; CHECK-NEXT: ret 60entry: 61 %v0 = load <4 x i64>, ptr %a0 62 %v1 = load <4 x i64>, ptr %a1 63 %v2 = mul <4 x i64> %v0, %v1 64 store <4 x i64> %v2, ptr %res 65 ret void 66} 67 68define void @mul_square_v32i8(ptr %res, ptr %a0) nounwind { 69; CHECK-LABEL: mul_square_v32i8: 70; CHECK: # %bb.0: # %entry 71; CHECK-NEXT: xvld $xr0, $a1, 0 72; CHECK-NEXT: xvmul.b $xr0, $xr0, $xr0 73; CHECK-NEXT: xvst $xr0, $a0, 0 74; CHECK-NEXT: ret 75entry: 76 %v0 = load <32 x i8>, ptr %a0 77 %v1 = mul <32 x i8> %v0, %v0 78 store <32 x i8> %v1, ptr %res 79 ret void 80} 81 82define void @mul_square_v16i16(ptr %res, ptr %a0) nounwind { 83; CHECK-LABEL: mul_square_v16i16: 84; CHECK: # %bb.0: # %entry 85; CHECK-NEXT: xvld $xr0, $a1, 0 86; CHECK-NEXT: xvmul.h $xr0, $xr0, $xr0 87; CHECK-NEXT: xvst $xr0, $a0, 0 88; CHECK-NEXT: ret 89entry: 90 %v0 = load <16 x i16>, ptr %a0 91 %v1 = mul <16 x i16> %v0, %v0 92 store <16 x i16> %v1, ptr %res 93 ret void 94} 95 96define void @mul_square_v8i32(ptr %res, ptr %a0) nounwind { 97; CHECK-LABEL: mul_square_v8i32: 98; CHECK: # %bb.0: # %entry 99; CHECK-NEXT: xvld $xr0, $a1, 0 100; CHECK-NEXT: xvmul.w $xr0, $xr0, $xr0 101; CHECK-NEXT: xvst $xr0, $a0, 0 102; CHECK-NEXT: ret 103entry: 104 %v0 = load <8 x i32>, ptr %a0 105 %v1 = mul <8 x i32> %v0, %v0 106 store <8 x i32> %v1, ptr %res 107 ret void 108} 109 110define void @mul_square_v4i64(ptr %res, ptr %a0) nounwind { 111; CHECK-LABEL: mul_square_v4i64: 112; CHECK: # %bb.0: # %entry 113; CHECK-NEXT: xvld $xr0, $a1, 0 114; CHECK-NEXT: xvmul.d $xr0, $xr0, $xr0 115; CHECK-NEXT: xvst $xr0, $a0, 0 116; CHECK-NEXT: ret 117entry: 118 %v0 = load <4 x i64>, ptr %a0 119 %v1 = mul <4 x i64> %v0, %v0 120 store <4 x i64> %v1, ptr %res 121 ret void 122} 123 124define void @mul_v32i8_8(ptr %res, ptr %a0) nounwind { 125; CHECK-LABEL: mul_v32i8_8: 126; CHECK: # %bb.0: # %entry 127; CHECK-NEXT: xvld $xr0, $a1, 0 128; CHECK-NEXT: xvslli.b $xr0, $xr0, 3 129; CHECK-NEXT: xvst $xr0, $a0, 0 130; CHECK-NEXT: ret 131entry: 132 %v0 = load <32 x i8>, ptr %a0 133 %v1 = mul <32 x i8> %v0, <i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8, i8 8> 134 store <32 x i8> %v1, ptr %res 135 ret void 136} 137 138define void @mul_v16i16_8(ptr %res, ptr %a0) nounwind { 139; CHECK-LABEL: mul_v16i16_8: 140; CHECK: # %bb.0: # %entry 141; CHECK-NEXT: xvld $xr0, $a1, 0 142; CHECK-NEXT: xvslli.h $xr0, $xr0, 3 143; CHECK-NEXT: xvst $xr0, $a0, 0 144; CHECK-NEXT: ret 145entry: 146 %v0 = load <16 x i16>, ptr %a0 147 %v1 = mul <16 x i16> %v0, <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> 148 store <16 x i16> %v1, ptr %res 149 ret void 150} 151 152define void @mul_v8i32_8(ptr %res, ptr %a0) nounwind { 153; CHECK-LABEL: mul_v8i32_8: 154; CHECK: # %bb.0: # %entry 155; CHECK-NEXT: xvld $xr0, $a1, 0 156; CHECK-NEXT: xvslli.w $xr0, $xr0, 3 157; CHECK-NEXT: xvst $xr0, $a0, 0 158; CHECK-NEXT: ret 159entry: 160 %v0 = load <8 x i32>, ptr %a0 161 %v1 = mul <8 x i32> %v0, <i32 8, i32 8, i32 8, i32 8, i32 8, i32 8, i32 8, i32 8> 162 store <8 x i32> %v1, ptr %res 163 ret void 164} 165 166define void @mul_v4i64_8(ptr %res, ptr %a0) nounwind { 167; CHECK-LABEL: mul_v4i64_8: 168; CHECK: # %bb.0: # %entry 169; CHECK-NEXT: xvld $xr0, $a1, 0 170; CHECK-NEXT: xvslli.d $xr0, $xr0, 3 171; CHECK-NEXT: xvst $xr0, $a0, 0 172; CHECK-NEXT: ret 173entry: 174 %v0 = load <4 x i64>, ptr %a0 175 %v1 = mul <4 x i64> %v0, <i64 8, i64 8, i64 8, i64 8> 176 store <4 x i64> %v1, ptr %res 177 ret void 178} 179 180define void @mul_v32i8_17(ptr %res, ptr %a0) nounwind { 181; CHECK-LABEL: mul_v32i8_17: 182; CHECK: # %bb.0: # %entry 183; CHECK-NEXT: xvld $xr0, $a1, 0 184; CHECK-NEXT: xvrepli.b $xr1, 17 185; CHECK-NEXT: xvmul.b $xr0, $xr0, $xr1 186; CHECK-NEXT: xvst $xr0, $a0, 0 187; CHECK-NEXT: ret 188entry: 189 %v0 = load <32 x i8>, ptr %a0 190 %v1 = mul <32 x i8> %v0, <i8 17, i8 17, i8 17, i8 17, i8 17, i8 17, i8 17, i8 17, i8 17, i8 17, i8 17, i8 17, i8 17, i8 17, i8 17, i8 17, i8 17, i8 17, i8 17, i8 17, i8 17, i8 17, i8 17, i8 17, i8 17, i8 17, i8 17, i8 17, i8 17, i8 17, i8 17, i8 17> 191 store <32 x i8> %v1, ptr %res 192 ret void 193} 194 195define void @mul_v16i16_17(ptr %res, ptr %a0) nounwind { 196; CHECK-LABEL: mul_v16i16_17: 197; CHECK: # %bb.0: # %entry 198; CHECK-NEXT: xvld $xr0, $a1, 0 199; CHECK-NEXT: xvrepli.h $xr1, 17 200; CHECK-NEXT: xvmul.h $xr0, $xr0, $xr1 201; CHECK-NEXT: xvst $xr0, $a0, 0 202; CHECK-NEXT: ret 203entry: 204 %v0 = load <16 x i16>, ptr %a0 205 %v1 = mul <16 x i16> %v0, <i16 17, i16 17, i16 17, i16 17, i16 17, i16 17, i16 17, i16 17, i16 17, i16 17, i16 17, i16 17, i16 17, i16 17, i16 17, i16 17> 206 store <16 x i16> %v1, ptr %res 207 ret void 208} 209 210define void @mul_v8i32_17(ptr %res, ptr %a0) nounwind { 211; CHECK-LABEL: mul_v8i32_17: 212; CHECK: # %bb.0: # %entry 213; CHECK-NEXT: xvld $xr0, $a1, 0 214; CHECK-NEXT: xvrepli.w $xr1, 17 215; CHECK-NEXT: xvmul.w $xr0, $xr0, $xr1 216; CHECK-NEXT: xvst $xr0, $a0, 0 217; CHECK-NEXT: ret 218entry: 219 %v0 = load <8 x i32>, ptr %a0 220 %v1 = mul <8 x i32> %v0, <i32 17, i32 17, i32 17, i32 17, i32 17, i32 17, i32 17, i32 17> 221 store <8 x i32> %v1, ptr %res 222 ret void 223} 224 225define void @mul_v4i64_17(ptr %res, ptr %a0) nounwind { 226; CHECK-LABEL: mul_v4i64_17: 227; CHECK: # %bb.0: # %entry 228; CHECK-NEXT: xvld $xr0, $a1, 0 229; CHECK-NEXT: xvrepli.d $xr1, 17 230; CHECK-NEXT: xvmul.d $xr0, $xr0, $xr1 231; CHECK-NEXT: xvst $xr0, $a0, 0 232; CHECK-NEXT: ret 233entry: 234 %v0 = load <4 x i64>, ptr %a0 235 %v1 = mul <4 x i64> %v0, <i64 17, i64 17, i64 17, i64 17> 236 store <4 x i64> %v1, ptr %res 237 ret void 238} 239