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