247 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 62; RUN: llc --mtriple=loongarch32 --mattr=+32s,+lsx < %s | FileCheck %s --check-prefixes=CHECK,LA323; RUN: llc --mtriple=loongarch64 --mattr=+lsx < %s | FileCheck %s --check-prefixes=CHECK,LA644 5define void @rotl_v16i8(ptr %dst, ptr %src, i8 signext %a0) nounwind {6; CHECK-LABEL: rotl_v16i8:7; CHECK: # %bb.0:8; CHECK-NEXT: vld $vr0, $a1, 09; CHECK-NEXT: vreplgr2vr.b $vr1, $a210; CHECK-NEXT: vneg.b $vr1, $vr111; CHECK-NEXT: vrotr.b $vr0, $vr0, $vr112; CHECK-NEXT: vst $vr0, $a0, 013; CHECK-NEXT: ret14 %v0 = load <16 x i8>, ptr %src15 %v1.ele = insertelement <16 x i8> poison, i8 %a0, i8 016 %v1 = shufflevector <16 x i8> %v1.ele, <16 x i8> poison, <16 x i32> zeroinitializer17 %v1.sub = sub <16 x i8> splat (i8 8), %v118 %b = shl <16 x i8> %v0, %v119 %c = lshr <16 x i8> %v0, %v1.sub20 %d = or <16 x i8> %b, %c21 store <16 x i8> %d, ptr %dst22 ret void23}24 25define void @rotr_v16i8(ptr %dst, ptr %src, i8 signext %a0) nounwind {26; CHECK-LABEL: rotr_v16i8:27; CHECK: # %bb.0:28; CHECK-NEXT: vld $vr0, $a1, 029; CHECK-NEXT: vreplgr2vr.b $vr1, $a230; CHECK-NEXT: vrotr.b $vr0, $vr0, $vr131; CHECK-NEXT: vst $vr0, $a0, 032; CHECK-NEXT: ret33 %v0 = load <16 x i8>, ptr %src34 %v1.ele = insertelement <16 x i8> poison, i8 %a0, i8 035 %v1 = shufflevector <16 x i8> %v1.ele, <16 x i8> poison, <16 x i32> zeroinitializer36 %v1.sub = sub <16 x i8> splat (i8 8), %v137 %b = lshr <16 x i8> %v0, %v138 %c = shl <16 x i8> %v0, %v1.sub39 %d = or <16 x i8> %b, %c40 store <16 x i8> %d, ptr %dst41 ret void42}43 44define void @rotr_v16i8_imm(ptr %dst, ptr %src) nounwind {45; CHECK-LABEL: rotr_v16i8_imm:46; CHECK: # %bb.0:47; CHECK-NEXT: vld $vr0, $a1, 048; CHECK-NEXT: vrotri.b $vr0, $vr0, 249; CHECK-NEXT: vst $vr0, $a0, 050; CHECK-NEXT: ret51 %v0 = load <16 x i8>, ptr %src52 %b = lshr <16 x i8> %v0, splat (i8 2)53 %c = shl <16 x i8> %v0, splat (i8 6)54 %d = or <16 x i8> %b, %c55 store <16 x i8> %d, ptr %dst56 ret void57}58 59define void @rotl_v8i16(ptr %dst, ptr %src, i16 signext %a0) nounwind {60; CHECK-LABEL: rotl_v8i16:61; CHECK: # %bb.0:62; CHECK-NEXT: vld $vr0, $a1, 063; CHECK-NEXT: vreplgr2vr.h $vr1, $a264; CHECK-NEXT: vneg.h $vr1, $vr165; CHECK-NEXT: vrotr.h $vr0, $vr0, $vr166; CHECK-NEXT: vst $vr0, $a0, 067; CHECK-NEXT: ret68 %v0 = load <8 x i16>, ptr %src69 %v1.ele = insertelement <8 x i16> poison, i16 %a0, i16 070 %v1 = shufflevector <8 x i16> %v1.ele, <8 x i16> poison, <8 x i32> zeroinitializer71 %v1.sub = sub <8 x i16> splat (i16 16), %v172 %b = shl <8 x i16> %v0, %v173 %c = lshr <8 x i16> %v0, %v1.sub74 %d = or <8 x i16> %b, %c75 store <8 x i16> %d, ptr %dst76 ret void77}78 79define void @rotr_v8i16(ptr %dst, ptr %src, i16 signext %a0) nounwind {80; CHECK-LABEL: rotr_v8i16:81; CHECK: # %bb.0:82; CHECK-NEXT: vld $vr0, $a1, 083; CHECK-NEXT: vreplgr2vr.h $vr1, $a284; CHECK-NEXT: vrotr.h $vr0, $vr0, $vr185; CHECK-NEXT: vst $vr0, $a0, 086; CHECK-NEXT: ret87 %v0 = load <8 x i16>, ptr %src88 %v1.ele = insertelement <8 x i16> poison, i16 %a0, i16 089 %v1 = shufflevector <8 x i16> %v1.ele, <8 x i16> poison, <8 x i32> zeroinitializer90 %v1.sub = sub <8 x i16> splat (i16 16), %v191 %b = lshr <8 x i16> %v0, %v192 %c = shl <8 x i16> %v0, %v1.sub93 %d = or <8 x i16> %b, %c94 store <8 x i16> %d, ptr %dst95 ret void96}97 98define void @rotr_v8i16_imm(ptr %dst, ptr %src) nounwind {99; CHECK-LABEL: rotr_v8i16_imm:100; CHECK: # %bb.0:101; CHECK-NEXT: vld $vr0, $a1, 0102; CHECK-NEXT: vrotri.h $vr0, $vr0, 2103; CHECK-NEXT: vst $vr0, $a0, 0104; CHECK-NEXT: ret105 %v0 = load <8 x i16>, ptr %src106 %b = lshr <8 x i16> %v0, splat (i16 2)107 %c = shl <8 x i16> %v0, splat (i16 14)108 %d = or <8 x i16> %b, %c109 store <8 x i16> %d, ptr %dst110 ret void111}112 113define void @rotl_v4i32(ptr %dst, ptr %src, i32 signext %a0) nounwind {114; CHECK-LABEL: rotl_v4i32:115; CHECK: # %bb.0:116; CHECK-NEXT: vld $vr0, $a1, 0117; CHECK-NEXT: vreplgr2vr.w $vr1, $a2118; CHECK-NEXT: vneg.w $vr1, $vr1119; CHECK-NEXT: vrotr.w $vr0, $vr0, $vr1120; CHECK-NEXT: vst $vr0, $a0, 0121; CHECK-NEXT: ret122 %v0 = load <4 x i32>, ptr %src123 %v1.ele = insertelement <4 x i32> poison, i32 %a0, i32 0124 %v1 = shufflevector <4 x i32> %v1.ele, <4 x i32> poison, <4 x i32> zeroinitializer125 %v1.sub = sub <4 x i32> splat (i32 32), %v1126 %b = shl <4 x i32> %v0, %v1127 %c = lshr <4 x i32> %v0, %v1.sub128 %d = or <4 x i32> %b, %c129 store <4 x i32> %d, ptr %dst130 ret void131}132 133define void @rotr_v4i32(ptr %dst, ptr %src, i32 signext %a0) nounwind {134; CHECK-LABEL: rotr_v4i32:135; CHECK: # %bb.0:136; CHECK-NEXT: vld $vr0, $a1, 0137; CHECK-NEXT: vreplgr2vr.w $vr1, $a2138; CHECK-NEXT: vrotr.w $vr0, $vr0, $vr1139; CHECK-NEXT: vst $vr0, $a0, 0140; CHECK-NEXT: ret141 %v0 = load <4 x i32>, ptr %src142 %v1.ele = insertelement <4 x i32> poison, i32 %a0, i32 0143 %v1 = shufflevector <4 x i32> %v1.ele, <4 x i32> poison, <4 x i32> zeroinitializer144 %v1.sub = sub <4 x i32> splat (i32 32), %v1145 %b = lshr <4 x i32> %v0, %v1146 %c = shl <4 x i32> %v0, %v1.sub147 %d = or <4 x i32> %b, %c148 store <4 x i32> %d, ptr %dst149 ret void150}151 152define void @rotr_v4i32_imm(ptr %dst, ptr %src) nounwind {153; CHECK-LABEL: rotr_v4i32_imm:154; CHECK: # %bb.0:155; CHECK-NEXT: vld $vr0, $a1, 0156; CHECK-NEXT: vrotri.w $vr0, $vr0, 2157; CHECK-NEXT: vst $vr0, $a0, 0158; CHECK-NEXT: ret159 %v0 = load <4 x i32>, ptr %src160 %b = lshr <4 x i32> %v0, splat (i32 2)161 %c = shl <4 x i32> %v0, splat (i32 30)162 %d = or <4 x i32> %b, %c163 store <4 x i32> %d, ptr %dst164 ret void165}166 167define void @rotl_v2i64(ptr %dst, ptr %src, i64 %a0) nounwind {168; LA32-LABEL: rotl_v2i64:169; LA32: # %bb.0:170; LA32-NEXT: vld $vr0, $a1, 0171; LA32-NEXT: vinsgr2vr.w $vr1, $a2, 0172; LA32-NEXT: vinsgr2vr.w $vr1, $a2, 2173; LA32-NEXT: vneg.d $vr1, $vr1174; LA32-NEXT: vrotr.d $vr0, $vr0, $vr1175; LA32-NEXT: vst $vr0, $a0, 0176; LA32-NEXT: ret177;178; LA64-LABEL: rotl_v2i64:179; LA64: # %bb.0:180; LA64-NEXT: vld $vr0, $a1, 0181; LA64-NEXT: vreplgr2vr.d $vr1, $a2182; LA64-NEXT: vneg.d $vr1, $vr1183; LA64-NEXT: vrotr.d $vr0, $vr0, $vr1184; LA64-NEXT: vst $vr0, $a0, 0185; LA64-NEXT: ret186 %v0 = load <2 x i64>, ptr %src187 %v1.ele = insertelement <2 x i64> poison, i64 %a0, i64 0188 %v1 = shufflevector <2 x i64> %v1.ele, <2 x i64> poison, <2 x i32> zeroinitializer189 %v1.sub = sub <2 x i64> splat (i64 64), %v1190 %b = shl <2 x i64> %v0, %v1191 %c = lshr <2 x i64> %v0, %v1.sub192 %d = or <2 x i64> %b, %c193 store <2 x i64> %d, ptr %dst194 ret void195}196 197define void @rotr_v2i64(ptr %dst, ptr %src, i64 %a0) nounwind {198; LA32-LABEL: rotr_v2i64:199; LA32: # %bb.0:200; LA32-NEXT: vld $vr0, $a1, 0201; LA32-NEXT: vinsgr2vr.w $vr1, $a2, 0202; LA32-NEXT: vinsgr2vr.w $vr1, $a2, 2203; LA32-NEXT: vrotr.d $vr0, $vr0, $vr1204; LA32-NEXT: vst $vr0, $a0, 0205; LA32-NEXT: ret206;207; LA64-LABEL: rotr_v2i64:208; LA64: # %bb.0:209; LA64-NEXT: vld $vr0, $a1, 0210; LA64-NEXT: vreplgr2vr.d $vr1, $a2211; LA64-NEXT: vrotr.d $vr0, $vr0, $vr1212; LA64-NEXT: vst $vr0, $a0, 0213; LA64-NEXT: ret214 %v0 = load <2 x i64>, ptr %src215 %v1.ele = insertelement <2 x i64> poison, i64 %a0, i64 0216 %v1 = shufflevector <2 x i64> %v1.ele, <2 x i64> poison, <2 x i32> zeroinitializer217 %v1.sub = sub <2 x i64> splat (i64 64), %v1218 %b = lshr <2 x i64> %v0, %v1219 %c = shl <2 x i64> %v0, %v1.sub220 %d = or <2 x i64> %b, %c221 store <2 x i64> %d, ptr %dst222 ret void223}224 225define void @rotr_v2i64_imm(ptr %dst, ptr %src) nounwind {226; LA32-LABEL: rotr_v2i64_imm:227; LA32: # %bb.0:228; LA32-NEXT: vld $vr0, $a1, 0229; LA32-NEXT: vrepli.w $vr1, -62230; LA32-NEXT: vrotr.d $vr0, $vr0, $vr1231; LA32-NEXT: vst $vr0, $a0, 0232; LA32-NEXT: ret233;234; LA64-LABEL: rotr_v2i64_imm:235; LA64: # %bb.0:236; LA64-NEXT: vld $vr0, $a1, 0237; LA64-NEXT: vrotri.d $vr0, $vr0, 2238; LA64-NEXT: vst $vr0, $a0, 0239; LA64-NEXT: ret240 %v0 = load <2 x i64>, ptr %src241 %b = lshr <2 x i64> %v0, splat (i64 2)242 %c = shl <2 x i64> %v0, splat (i64 62)243 %d = or <2 x i64> %b, %c244 store <2 x i64> %d, ptr %dst245 ret void246}247