; RUN: llc -mtriple=aarch64-linux-gnu -mattr=+sve < %s | FileCheck %s ;; Splats of legal integer vector types define @sve_splat_16xi8(i8 %val) { ; CHECK-LABEL: @sve_splat_16xi8 ; CHECK: mov z0.b, w0 ; CHECK-NEXT: ret %ins = insertelement undef, i8 %val, i32 0 %splat = shufflevector %ins, undef, zeroinitializer ret %splat } define @sve_splat_8xi16(i16 %val) { ; CHECK-LABEL: @sve_splat_8xi16 ; CHECK: mov z0.h, w0 ; CHECK-NEXT: ret %ins = insertelement undef, i16 %val, i32 0 %splat = shufflevector %ins, undef, zeroinitializer ret %splat } define @sve_splat_4xi32(i32 %val) { ; CHECK-LABEL: @sve_splat_4xi32 ; CHECK: mov z0.s, w0 ; CHECK-NEXT: ret %ins = insertelement undef, i32 %val, i32 0 %splat = shufflevector %ins, undef, zeroinitializer ret %splat } define @sve_splat_2xi64(i64 %val) { ; CHECK-LABEL: @sve_splat_2xi64 ; CHECK: mov z0.d, x0 ; CHECK-NEXT: ret %ins = insertelement undef, i64 %val, i32 0 %splat = shufflevector %ins, undef, zeroinitializer ret %splat } ;; Promote splats of smaller illegal integer vector types define @sve_splat_2xi8(i8 %val) { ; CHECK-LABEL: @sve_splat_2xi8 ; CHECK: mov z0.d, x0 ; CHECK-NEXT: ret %ins = insertelement undef, i8 %val, i32 0 %splat = shufflevector %ins, undef, zeroinitializer ret %splat } define @sve_splat_4xi8(i8 %val) { ; CHECK-LABEL: @sve_splat_4xi8 ; CHECK: mov z0.s, w0 ; CHECK-NEXT: ret %ins = insertelement undef, i8 %val, i32 0 %splat = shufflevector %ins, undef, zeroinitializer ret %splat } define @sve_splat_8xi8(i8 %val) { ; CHECK-LABEL: @sve_splat_8xi8 ; CHECK: mov z0.h, w0 ; CHECK-NEXT: ret %ins = insertelement undef, i8 %val, i32 0 %splat = shufflevector %ins, undef, zeroinitializer ret %splat } define @sve_splat_2xi16(i16 %val) { ; CHECK-LABEL: @sve_splat_2xi16 ; CHECK: mov z0.d, x0 ; CHECK-NEXT: ret %ins = insertelement undef, i16 %val, i32 0 %splat = shufflevector %ins, undef, zeroinitializer ret %splat } define @sve_splat_4xi16(i16 %val) { ; CHECK-LABEL: @sve_splat_4xi16 ; CHECK: mov z0.s, w0 ; CHECK-NEXT: ret %ins = insertelement undef, i16 %val, i32 0 %splat = shufflevector %ins, undef, zeroinitializer ret %splat } define @sve_splat_2xi32(i32 %val) { ; CHECK-LABEL: @sve_splat_2xi32 ; CHECK: mov z0.d, x0 ; CHECK-NEXT: ret %ins = insertelement undef, i32 %val, i32 0 %splat = shufflevector %ins, undef, zeroinitializer ret %splat } define @sve_splat_2xi1(i1 %val) { ; CHECK-LABEL: @sve_splat_2xi1 ; CHECK: sbfx x8, x0, #0, #1 ; CHECK-NEXT: whilelo p0.d, xzr, x8 ; CHECK-NEXT: ret %ins = insertelement undef, i1 %val, i32 0 %splat = shufflevector %ins, undef, zeroinitializer ret %splat } define @sve_splat_4xi1(i1 %val) { ; CHECK-LABEL: @sve_splat_4xi1 ; CHECK: sbfx x8, x0, #0, #1 ; CHECK-NEXT: whilelo p0.s, xzr, x8 ; CHECK-NEXT: ret %ins = insertelement undef, i1 %val, i32 0 %splat = shufflevector %ins, undef, zeroinitializer ret %splat } define @sve_splat_8xi1(i1 %val) { ; CHECK-LABEL: @sve_splat_8xi1 ; CHECK: sbfx x8, x0, #0, #1 ; CHECK-NEXT: whilelo p0.h, xzr, x8 ; CHECK-NEXT: ret %ins = insertelement undef, i1 %val, i32 0 %splat = shufflevector %ins, undef, zeroinitializer ret %splat } define @sve_splat_16xi1(i1 %val) { ; CHECK-LABEL: @sve_splat_16xi1 ; CHECK: sbfx x8, x0, #0, #1 ; CHECK-NEXT: whilelo p0.b, xzr, x8 ; CHECK-NEXT: ret %ins = insertelement undef, i1 %val, i32 0 %splat = shufflevector %ins, undef, zeroinitializer ret %splat }