328 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple aarch64-none-linux-gnu -mattr=+sve | FileCheck %s3 4define <vscale x 2 x i16> @dupsext_v2i8_v2i16(i8 %src, <vscale x 2 x i16> %b) {5; CHECK-LABEL: dupsext_v2i8_v2i16:6; CHECK: // %bb.0: // %entry7; CHECK-NEXT: sxtb w8, w08; CHECK-NEXT: ptrue p0.d9; CHECK-NEXT: mov z1.d, x810; CHECK-NEXT: mul z0.d, p0/m, z0.d, z1.d11; CHECK-NEXT: ret12entry:13 %in = sext i8 %src to i1614 %broadcast.splatinsert = insertelement <vscale x 2 x i16> poison, i16 %in, i16 015 %broadcast.splat = shufflevector <vscale x 2 x i16> %broadcast.splatinsert, <vscale x 2 x i16> poison, <vscale x 2 x i32> zeroinitializer16 %out = mul nsw <vscale x 2 x i16> %broadcast.splat, %b17 ret <vscale x 2 x i16> %out18}19 20define <vscale x 4 x i16> @dupsext_v4i8_v4i16(i8 %src, <vscale x 4 x i16> %b) {21; CHECK-LABEL: dupsext_v4i8_v4i16:22; CHECK: // %bb.0: // %entry23; CHECK-NEXT: sxtb w8, w024; CHECK-NEXT: ptrue p0.s25; CHECK-NEXT: mov z1.s, w826; CHECK-NEXT: mul z0.s, p0/m, z0.s, z1.s27; CHECK-NEXT: ret28entry:29 %in = sext i8 %src to i1630 %broadcast.splatinsert = insertelement <vscale x 4 x i16> poison, i16 %in, i16 031 %broadcast.splat = shufflevector <vscale x 4 x i16> %broadcast.splatinsert, <vscale x 4 x i16> poison, <vscale x 4 x i32> zeroinitializer32 %out = mul nsw <vscale x 4 x i16> %broadcast.splat, %b33 ret <vscale x 4 x i16> %out34}35 36define <vscale x 8 x i16> @dupsext_v8i8_v8i16(i8 %src, <vscale x 8 x i16> %b) {37; CHECK-LABEL: dupsext_v8i8_v8i16:38; CHECK: // %bb.0: // %entry39; CHECK-NEXT: sxtb w8, w040; CHECK-NEXT: ptrue p0.h41; CHECK-NEXT: mov z1.h, w842; CHECK-NEXT: mul z0.h, p0/m, z0.h, z1.h43; CHECK-NEXT: ret44entry:45 %in = sext i8 %src to i1646 %broadcast.splatinsert = insertelement <vscale x 8 x i16> poison, i16 %in, i16 047 %broadcast.splat = shufflevector <vscale x 8 x i16> %broadcast.splatinsert, <vscale x 8 x i16> poison, <vscale x 8 x i32> zeroinitializer48 %out = mul nsw <vscale x 8 x i16> %broadcast.splat, %b49 ret <vscale x 8 x i16> %out50}51 52define <vscale x 2 x i32> @dupsext_v2i8_v2i32(i8 %src, <vscale x 2 x i32> %b) {53; CHECK-LABEL: dupsext_v2i8_v2i32:54; CHECK: // %bb.0: // %entry55; CHECK-NEXT: sxtb w8, w056; CHECK-NEXT: ptrue p0.d57; CHECK-NEXT: mov z1.d, x858; CHECK-NEXT: mul z0.d, p0/m, z0.d, z1.d59; CHECK-NEXT: ret60entry:61 %in = sext i8 %src to i3262 %broadcast.splatinsert = insertelement <vscale x 2 x i32> poison, i32 %in, i32 063 %broadcast.splat = shufflevector <vscale x 2 x i32> %broadcast.splatinsert, <vscale x 2 x i32> poison, <vscale x 2 x i32> zeroinitializer64 %out = mul nsw <vscale x 2 x i32> %broadcast.splat, %b65 ret <vscale x 2 x i32> %out66}67 68define <vscale x 4 x i32> @dupsext_v4i8_v4i32(i8 %src, <vscale x 4 x i32> %b) {69; CHECK-LABEL: dupsext_v4i8_v4i32:70; CHECK: // %bb.0: // %entry71; CHECK-NEXT: sxtb w8, w072; CHECK-NEXT: ptrue p0.s73; CHECK-NEXT: mov z1.s, w874; CHECK-NEXT: mul z0.s, p0/m, z0.s, z1.s75; CHECK-NEXT: ret76entry:77 %in = sext i8 %src to i3278 %broadcast.splatinsert = insertelement <vscale x 4 x i32> poison, i32 %in, i32 079 %broadcast.splat = shufflevector <vscale x 4 x i32> %broadcast.splatinsert, <vscale x 4 x i32> poison, <vscale x 4 x i32> zeroinitializer80 %out = mul nsw <vscale x 4 x i32> %broadcast.splat, %b81 ret <vscale x 4 x i32> %out82}83 84define <vscale x 2 x i64> @dupsext_v2i8_v2i64(i8 %src, <vscale x 2 x i64> %b) {85; CHECK-LABEL: dupsext_v2i8_v2i64:86; CHECK: // %bb.0: // %entry87; CHECK-NEXT: // kill: def $w0 killed $w0 def $x088; CHECK-NEXT: sxtb x8, w089; CHECK-NEXT: ptrue p0.d90; CHECK-NEXT: mov z1.d, x891; CHECK-NEXT: mul z0.d, p0/m, z0.d, z1.d92; CHECK-NEXT: ret93entry:94 %in = sext i8 %src to i6495 %broadcast.splatinsert = insertelement <vscale x 2 x i64> poison, i64 %in, i64 096 %broadcast.splat = shufflevector <vscale x 2 x i64> %broadcast.splatinsert, <vscale x 2 x i64> poison, <vscale x 2 x i32> zeroinitializer97 %out = mul nsw <vscale x 2 x i64> %broadcast.splat, %b98 ret <vscale x 2 x i64> %out99}100 101define <vscale x 2 x i32> @dupsext_v2i16_v2i32(i16 %src, <vscale x 2 x i32> %b) {102; CHECK-LABEL: dupsext_v2i16_v2i32:103; CHECK: // %bb.0: // %entry104; CHECK-NEXT: sxth w8, w0105; CHECK-NEXT: ptrue p0.d106; CHECK-NEXT: mov z1.d, x8107; CHECK-NEXT: mul z0.d, p0/m, z0.d, z1.d108; CHECK-NEXT: ret109entry:110 %in = sext i16 %src to i32111 %broadcast.splatinsert = insertelement <vscale x 2 x i32> poison, i32 %in, i32 0112 %broadcast.splat = shufflevector <vscale x 2 x i32> %broadcast.splatinsert, <vscale x 2 x i32> poison, <vscale x 2 x i32> zeroinitializer113 %out = mul nsw <vscale x 2 x i32> %broadcast.splat, %b114 ret <vscale x 2 x i32> %out115}116 117define <vscale x 4 x i32> @dupsext_v4i16_v4i32(i16 %src, <vscale x 4 x i32> %b) {118; CHECK-LABEL: dupsext_v4i16_v4i32:119; CHECK: // %bb.0: // %entry120; CHECK-NEXT: sxth w8, w0121; CHECK-NEXT: ptrue p0.s122; CHECK-NEXT: mov z1.s, w8123; CHECK-NEXT: mul z0.s, p0/m, z0.s, z1.s124; CHECK-NEXT: ret125entry:126 %in = sext i16 %src to i32127 %broadcast.splatinsert = insertelement <vscale x 4 x i32> poison, i32 %in, i32 0128 %broadcast.splat = shufflevector <vscale x 4 x i32> %broadcast.splatinsert, <vscale x 4 x i32> poison, <vscale x 4 x i32> zeroinitializer129 %out = mul nsw <vscale x 4 x i32> %broadcast.splat, %b130 ret <vscale x 4 x i32> %out131}132 133define <vscale x 2 x i64> @dupsext_v2i16_v2i64(i16 %src, <vscale x 2 x i64> %b) {134; CHECK-LABEL: dupsext_v2i16_v2i64:135; CHECK: // %bb.0: // %entry136; CHECK-NEXT: // kill: def $w0 killed $w0 def $x0137; CHECK-NEXT: sxth x8, w0138; CHECK-NEXT: ptrue p0.d139; CHECK-NEXT: mov z1.d, x8140; CHECK-NEXT: mul z0.d, p0/m, z0.d, z1.d141; CHECK-NEXT: ret142entry:143 %in = sext i16 %src to i64144 %broadcast.splatinsert = insertelement <vscale x 2 x i64> poison, i64 %in, i64 0145 %broadcast.splat = shufflevector <vscale x 2 x i64> %broadcast.splatinsert, <vscale x 2 x i64> poison, <vscale x 2 x i32> zeroinitializer146 %out = mul nsw <vscale x 2 x i64> %broadcast.splat, %b147 ret <vscale x 2 x i64> %out148}149 150define <vscale x 2 x i64> @dupsext_v2i32_v2i64(i32 %src, <vscale x 2 x i64> %b) {151; CHECK-LABEL: dupsext_v2i32_v2i64:152; CHECK: // %bb.0: // %entry153; CHECK-NEXT: // kill: def $w0 killed $w0 def $x0154; CHECK-NEXT: sxtw x8, w0155; CHECK-NEXT: ptrue p0.d156; CHECK-NEXT: mov z1.d, x8157; CHECK-NEXT: mul z0.d, p0/m, z0.d, z1.d158; CHECK-NEXT: ret159entry:160 %in = sext i32 %src to i64161 %broadcast.splatinsert = insertelement <vscale x 2 x i64> poison, i64 %in, i64 0162 %broadcast.splat = shufflevector <vscale x 2 x i64> %broadcast.splatinsert, <vscale x 2 x i64> poison, <vscale x 2 x i32> zeroinitializer163 %out = mul nsw <vscale x 2 x i64> %broadcast.splat, %b164 ret <vscale x 2 x i64> %out165}166 167define <vscale x 2 x i16> @dupzext_v2i8_v2i16(i8 %src, <vscale x 2 x i16> %b) {168; CHECK-LABEL: dupzext_v2i8_v2i16:169; CHECK: // %bb.0: // %entry170; CHECK-NEXT: and w8, w0, #0xff171; CHECK-NEXT: ptrue p0.d172; CHECK-NEXT: mov z1.d, x8173; CHECK-NEXT: mul z0.d, p0/m, z0.d, z1.d174; CHECK-NEXT: ret175entry:176 %in = zext i8 %src to i16177 %broadcast.splatinsert = insertelement <vscale x 2 x i16> poison, i16 %in, i16 0178 %broadcast.splat = shufflevector <vscale x 2 x i16> %broadcast.splatinsert, <vscale x 2 x i16> poison, <vscale x 2 x i32> zeroinitializer179 %out = mul nuw <vscale x 2 x i16> %broadcast.splat, %b180 ret <vscale x 2 x i16> %out181}182 183define <vscale x 4 x i16> @dupzext_v4i8_v4i16(i8 %src, <vscale x 4 x i16> %b) {184; CHECK-LABEL: dupzext_v4i8_v4i16:185; CHECK: // %bb.0: // %entry186; CHECK-NEXT: and w8, w0, #0xff187; CHECK-NEXT: ptrue p0.s188; CHECK-NEXT: mov z1.s, w8189; CHECK-NEXT: mul z0.s, p0/m, z0.s, z1.s190; CHECK-NEXT: ret191entry:192 %in = zext i8 %src to i16193 %broadcast.splatinsert = insertelement <vscale x 4 x i16> poison, i16 %in, i16 0194 %broadcast.splat = shufflevector <vscale x 4 x i16> %broadcast.splatinsert, <vscale x 4 x i16> poison, <vscale x 4 x i32> zeroinitializer195 %out = mul nuw <vscale x 4 x i16> %broadcast.splat, %b196 ret <vscale x 4 x i16> %out197}198 199define <vscale x 8 x i16> @dupzext_v8i8_v8i16(i8 %src, <vscale x 8 x i16> %b) {200; CHECK-LABEL: dupzext_v8i8_v8i16:201; CHECK: // %bb.0: // %entry202; CHECK-NEXT: and w8, w0, #0xff203; CHECK-NEXT: ptrue p0.h204; CHECK-NEXT: mov z1.h, w8205; CHECK-NEXT: mul z0.h, p0/m, z0.h, z1.h206; CHECK-NEXT: ret207entry:208 %in = zext i8 %src to i16209 %broadcast.splatinsert = insertelement <vscale x 8 x i16> poison, i16 %in, i16 0210 %broadcast.splat = shufflevector <vscale x 8 x i16> %broadcast.splatinsert, <vscale x 8 x i16> poison, <vscale x 8 x i32> zeroinitializer211 %out = mul nuw <vscale x 8 x i16> %broadcast.splat, %b212 ret <vscale x 8 x i16> %out213}214 215define <vscale x 2 x i32> @dupzext_v2i8_v2i32(i8 %src, <vscale x 2 x i32> %b) {216; CHECK-LABEL: dupzext_v2i8_v2i32:217; CHECK: // %bb.0: // %entry218; CHECK-NEXT: and w8, w0, #0xff219; CHECK-NEXT: ptrue p0.d220; CHECK-NEXT: mov z1.d, x8221; CHECK-NEXT: mul z0.d, p0/m, z0.d, z1.d222; CHECK-NEXT: ret223entry:224 %in = zext i8 %src to i32225 %broadcast.splatinsert = insertelement <vscale x 2 x i32> poison, i32 %in, i32 0226 %broadcast.splat = shufflevector <vscale x 2 x i32> %broadcast.splatinsert, <vscale x 2 x i32> poison, <vscale x 2 x i32> zeroinitializer227 %out = mul nuw <vscale x 2 x i32> %broadcast.splat, %b228 ret <vscale x 2 x i32> %out229}230 231define <vscale x 4 x i32> @dupzext_v4i8_v4i32(i8 %src, <vscale x 4 x i32> %b) {232; CHECK-LABEL: dupzext_v4i8_v4i32:233; CHECK: // %bb.0: // %entry234; CHECK-NEXT: and w8, w0, #0xff235; CHECK-NEXT: ptrue p0.s236; CHECK-NEXT: mov z1.s, w8237; CHECK-NEXT: mul z0.s, p0/m, z0.s, z1.s238; CHECK-NEXT: ret239entry:240 %in = zext i8 %src to i32241 %broadcast.splatinsert = insertelement <vscale x 4 x i32> poison, i32 %in, i32 0242 %broadcast.splat = shufflevector <vscale x 4 x i32> %broadcast.splatinsert, <vscale x 4 x i32> poison, <vscale x 4 x i32> zeroinitializer243 %out = mul nuw <vscale x 4 x i32> %broadcast.splat, %b244 ret <vscale x 4 x i32> %out245}246 247define <vscale x 2 x i64> @dupzext_v2i8_v2i64(i8 %src, <vscale x 2 x i64> %b) {248; CHECK-LABEL: dupzext_v2i8_v2i64:249; CHECK: // %bb.0: // %entry250; CHECK-NEXT: // kill: def $w0 killed $w0 def $x0251; CHECK-NEXT: and x8, x0, #0xff252; CHECK-NEXT: ptrue p0.d253; CHECK-NEXT: mov z1.d, x8254; CHECK-NEXT: mul z0.d, p0/m, z0.d, z1.d255; CHECK-NEXT: ret256entry:257 %in = zext i8 %src to i64258 %broadcast.splatinsert = insertelement <vscale x 2 x i64> poison, i64 %in, i64 0259 %broadcast.splat = shufflevector <vscale x 2 x i64> %broadcast.splatinsert, <vscale x 2 x i64> poison, <vscale x 2 x i32> zeroinitializer260 %out = mul nuw <vscale x 2 x i64> %broadcast.splat, %b261 ret <vscale x 2 x i64> %out262}263 264define <vscale x 2 x i32> @dupzext_v2i16_v2i32(i16 %src, <vscale x 2 x i32> %b) {265; CHECK-LABEL: dupzext_v2i16_v2i32:266; CHECK: // %bb.0: // %entry267; CHECK-NEXT: and w8, w0, #0xffff268; CHECK-NEXT: ptrue p0.d269; CHECK-NEXT: mov z1.d, x8270; CHECK-NEXT: mul z0.d, p0/m, z0.d, z1.d271; CHECK-NEXT: ret272entry:273 %in = zext i16 %src to i32274 %broadcast.splatinsert = insertelement <vscale x 2 x i32> poison, i32 %in, i32 0275 %broadcast.splat = shufflevector <vscale x 2 x i32> %broadcast.splatinsert, <vscale x 2 x i32> poison, <vscale x 2 x i32> zeroinitializer276 %out = mul nuw <vscale x 2 x i32> %broadcast.splat, %b277 ret <vscale x 2 x i32> %out278}279 280define <vscale x 4 x i32> @dupzext_v4i16_v4i32(i16 %src, <vscale x 4 x i32> %b) {281; CHECK-LABEL: dupzext_v4i16_v4i32:282; CHECK: // %bb.0: // %entry283; CHECK-NEXT: and w8, w0, #0xffff284; CHECK-NEXT: ptrue p0.s285; CHECK-NEXT: mov z1.s, w8286; CHECK-NEXT: mul z0.s, p0/m, z0.s, z1.s287; CHECK-NEXT: ret288entry:289 %in = zext i16 %src to i32290 %broadcast.splatinsert = insertelement <vscale x 4 x i32> poison, i32 %in, i32 0291 %broadcast.splat = shufflevector <vscale x 4 x i32> %broadcast.splatinsert, <vscale x 4 x i32> poison, <vscale x 4 x i32> zeroinitializer292 %out = mul nuw <vscale x 4 x i32> %broadcast.splat, %b293 ret <vscale x 4 x i32> %out294}295 296define <vscale x 2 x i64> @dupzext_v2i16_v2i64(i16 %src, <vscale x 2 x i64> %b) {297; CHECK-LABEL: dupzext_v2i16_v2i64:298; CHECK: // %bb.0: // %entry299; CHECK-NEXT: // kill: def $w0 killed $w0 def $x0300; CHECK-NEXT: and x8, x0, #0xffff301; CHECK-NEXT: ptrue p0.d302; CHECK-NEXT: mov z1.d, x8303; CHECK-NEXT: mul z0.d, p0/m, z0.d, z1.d304; CHECK-NEXT: ret305entry:306 %in = zext i16 %src to i64307 %broadcast.splatinsert = insertelement <vscale x 2 x i64> poison, i64 %in, i64 0308 %broadcast.splat = shufflevector <vscale x 2 x i64> %broadcast.splatinsert, <vscale x 2 x i64> poison, <vscale x 2 x i32> zeroinitializer309 %out = mul nuw <vscale x 2 x i64> %broadcast.splat, %b310 ret <vscale x 2 x i64> %out311}312 313define <vscale x 2 x i64> @dupzext_v2i32_v2i64(i32 %src, <vscale x 2 x i64> %b) {314; CHECK-LABEL: dupzext_v2i32_v2i64:315; CHECK: // %bb.0: // %entry316; CHECK-NEXT: mov w8, w0317; CHECK-NEXT: ptrue p0.d318; CHECK-NEXT: mov z1.d, x8319; CHECK-NEXT: mul z0.d, p0/m, z0.d, z1.d320; CHECK-NEXT: ret321entry:322 %in = zext i32 %src to i64323 %broadcast.splatinsert = insertelement <vscale x 2 x i64> poison, i64 %in, i64 0324 %broadcast.splat = shufflevector <vscale x 2 x i64> %broadcast.splatinsert, <vscale x 2 x i64> poison, <vscale x 2 x i32> zeroinitializer325 %out = mul nuw <vscale x 2 x i64> %broadcast.splat, %b326 ret <vscale x 2 x i64> %out327}328