; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py ; RUN: llc -mtriple=aarch64-linux-gnu -mattr=+sve < %s | FileCheck %s ; ; CLASTA (Vectors) ; define @clasta_i8( %pg, %a, %b) { ; CHECK-LABEL: clasta_i8: ; CHECK: // %bb.0: ; CHECK-NEXT: clasta z0.b, p0, z0.b, z1.b ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.clasta.nxv16i8( %pg, %a, %b) ret %out } define @clasta_i16( %pg, %a, %b) { ; CHECK-LABEL: clasta_i16: ; CHECK: // %bb.0: ; CHECK-NEXT: clasta z0.h, p0, z0.h, z1.h ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.clasta.nxv8i16( %pg, %a, %b) ret %out } define @clasta_i32( %pg, %a, %b) { ; CHECK-LABEL: clasta_i32: ; CHECK: // %bb.0: ; CHECK-NEXT: clasta z0.s, p0, z0.s, z1.s ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.clasta.nxv4i32( %pg, %a, %b) ret %out } define @clasta_i64( %pg, %a, %b) { ; CHECK-LABEL: clasta_i64: ; CHECK: // %bb.0: ; CHECK-NEXT: clasta z0.d, p0, z0.d, z1.d ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.clasta.nxv2i64( %pg, %a, %b) ret %out } define @clasta_f16( %pg, %a, %b) { ; CHECK-LABEL: clasta_f16: ; CHECK: // %bb.0: ; CHECK-NEXT: clasta z0.h, p0, z0.h, z1.h ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.clasta.nxv8f16( %pg, %a, %b) ret %out } define @clasta_bf16( %pg, %a, %b) #0 { ; CHECK-LABEL: clasta_bf16: ; CHECK: // %bb.0: ; CHECK-NEXT: clasta z0.h, p0, z0.h, z1.h ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.clasta.nxv8bf16( %pg, %a, %b) ret %out } define @clasta_f32( %pg, %a, %b) { ; CHECK-LABEL: clasta_f32: ; CHECK: // %bb.0: ; CHECK-NEXT: clasta z0.s, p0, z0.s, z1.s ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.clasta.nxv4f32( %pg, %a, %b) ret %out } define @clasta_f64( %pg, %a, %b) { ; CHECK-LABEL: clasta_f64: ; CHECK: // %bb.0: ; CHECK-NEXT: clasta z0.d, p0, z0.d, z1.d ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.clasta.nxv2f64( %pg, %a, %b) ret %out } ; ; CLASTA (Scalar) ; define i8 @clasta_n_i8( %pg, i8 %a, %b) { ; CHECK-LABEL: clasta_n_i8: ; CHECK: // %bb.0: ; CHECK-NEXT: clasta w0, p0, w0, z0.b ; CHECK-NEXT: ret %out = call i8 @llvm.aarch64.sve.clasta.n.nxv16i8( %pg, i8 %a, %b) ret i8 %out } define i16 @clasta_n_i16( %pg, i16 %a, %b) { ; CHECK-LABEL: clasta_n_i16: ; CHECK: // %bb.0: ; CHECK-NEXT: clasta w0, p0, w0, z0.h ; CHECK-NEXT: ret %out = call i16 @llvm.aarch64.sve.clasta.n.nxv8i16( %pg, i16 %a, %b) ret i16 %out } define i32 @clasta_n_i32( %pg, i32 %a, %b) { ; CHECK-LABEL: clasta_n_i32: ; CHECK: // %bb.0: ; CHECK-NEXT: clasta w0, p0, w0, z0.s ; CHECK-NEXT: ret %out = call i32 @llvm.aarch64.sve.clasta.n.nxv4i32( %pg, i32 %a, %b) ret i32 %out } define i64 @clasta_n_i64( %pg, i64 %a, %b) { ; CHECK-LABEL: clasta_n_i64: ; CHECK: // %bb.0: ; CHECK-NEXT: clasta x0, p0, x0, z0.d ; CHECK-NEXT: ret %out = call i64 @llvm.aarch64.sve.clasta.n.nxv2i64( %pg, i64 %a, %b) ret i64 %out } define half @clasta_n_f16( %pg, half %a, %b) { ; CHECK-LABEL: clasta_n_f16: ; CHECK: // %bb.0: ; CHECK-NEXT: clasta h0, p0, h0, z1.h ; CHECK-NEXT: ret %out = call half @llvm.aarch64.sve.clasta.n.nxv8f16( %pg, half %a, %b) ret half %out } define bfloat @clasta_n_bf16( %pg, bfloat %a, %b) #0 { ; CHECK-LABEL: clasta_n_bf16: ; CHECK: // %bb.0: ; CHECK-NEXT: clasta h0, p0, h0, z1.h ; CHECK-NEXT: ret %out = call bfloat @llvm.aarch64.sve.clasta.n.nxv8bf16( %pg, bfloat %a, %b) ret bfloat %out } define float @clasta_n_f32( %pg, float %a, %b) { ; CHECK-LABEL: clasta_n_f32: ; CHECK: // %bb.0: ; CHECK-NEXT: clasta s0, p0, s0, z1.s ; CHECK-NEXT: ret %out = call float @llvm.aarch64.sve.clasta.n.nxv4f32( %pg, float %a, %b) ret float %out } define double @clasta_n_f64( %pg, double %a, %b) { ; CHECK-LABEL: clasta_n_f64: ; CHECK: // %bb.0: ; CHECK-NEXT: clasta d0, p0, d0, z1.d ; CHECK-NEXT: ret %out = call double @llvm.aarch64.sve.clasta.n.nxv2f64( %pg, double %a, %b) ret double %out } ; ; CLASTB (Vectors) ; define @clastb_i8( %pg, %a, %b) { ; CHECK-LABEL: clastb_i8: ; CHECK: // %bb.0: ; CHECK-NEXT: clastb z0.b, p0, z0.b, z1.b ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.clastb.nxv16i8( %pg, %a, %b) ret %out } define @clastb_i16( %pg, %a, %b) { ; CHECK-LABEL: clastb_i16: ; CHECK: // %bb.0: ; CHECK-NEXT: clastb z0.h, p0, z0.h, z1.h ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.clastb.nxv8i16( %pg, %a, %b) ret %out } define @clastb_i32( %pg, %a, %b) { ; CHECK-LABEL: clastb_i32: ; CHECK: // %bb.0: ; CHECK-NEXT: clastb z0.s, p0, z0.s, z1.s ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.clastb.nxv4i32( %pg, %a, %b) ret %out } define @clastb_i64( %pg, %a, %b) { ; CHECK-LABEL: clastb_i64: ; CHECK: // %bb.0: ; CHECK-NEXT: clastb z0.d, p0, z0.d, z1.d ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.clastb.nxv2i64( %pg, %a, %b) ret %out } define @clastb_f16( %pg, %a, %b) { ; CHECK-LABEL: clastb_f16: ; CHECK: // %bb.0: ; CHECK-NEXT: clastb z0.h, p0, z0.h, z1.h ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.clastb.nxv8f16( %pg, %a, %b) ret %out } define @clastb_bf16( %pg, %a, %b) #0 { ; CHECK-LABEL: clastb_bf16: ; CHECK: // %bb.0: ; CHECK-NEXT: clastb z0.h, p0, z0.h, z1.h ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.clastb.nxv8bf16( %pg, %a, %b) ret %out } define @clastb_f32( %pg, %a, %b) { ; CHECK-LABEL: clastb_f32: ; CHECK: // %bb.0: ; CHECK-NEXT: clastb z0.s, p0, z0.s, z1.s ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.clastb.nxv4f32( %pg, %a, %b) ret %out } define @clastb_f64( %pg, %a, %b) { ; CHECK-LABEL: clastb_f64: ; CHECK: // %bb.0: ; CHECK-NEXT: clastb z0.d, p0, z0.d, z1.d ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.clastb.nxv2f64( %pg, %a, %b) ret %out } ; ; CLASTB (Scalar) ; define i8 @clastb_n_i8( %pg, i8 %a, %b) { ; CHECK-LABEL: clastb_n_i8: ; CHECK: // %bb.0: ; CHECK-NEXT: clastb w0, p0, w0, z0.b ; CHECK-NEXT: ret %out = call i8 @llvm.aarch64.sve.clastb.n.nxv16i8( %pg, i8 %a, %b) ret i8 %out } define i16 @clastb_n_i16( %pg, i16 %a, %b) { ; CHECK-LABEL: clastb_n_i16: ; CHECK: // %bb.0: ; CHECK-NEXT: clastb w0, p0, w0, z0.h ; CHECK-NEXT: ret %out = call i16 @llvm.aarch64.sve.clastb.n.nxv8i16( %pg, i16 %a, %b) ret i16 %out } define i32 @clastb_n_i32( %pg, i32 %a, %b) { ; CHECK-LABEL: clastb_n_i32: ; CHECK: // %bb.0: ; CHECK-NEXT: clastb w0, p0, w0, z0.s ; CHECK-NEXT: ret %out = call i32 @llvm.aarch64.sve.clastb.n.nxv4i32( %pg, i32 %a, %b) ret i32 %out } define i64 @clastb_n_i64( %pg, i64 %a, %b) { ; CHECK-LABEL: clastb_n_i64: ; CHECK: // %bb.0: ; CHECK-NEXT: clastb x0, p0, x0, z0.d ; CHECK-NEXT: ret %out = call i64 @llvm.aarch64.sve.clastb.n.nxv2i64( %pg, i64 %a, %b) ret i64 %out } define half @clastb_n_f16( %pg, half %a, %b) { ; CHECK-LABEL: clastb_n_f16: ; CHECK: // %bb.0: ; CHECK-NEXT: clastb h0, p0, h0, z1.h ; CHECK-NEXT: ret %out = call half @llvm.aarch64.sve.clastb.n.nxv8f16( %pg, half %a, %b) ret half %out } define bfloat @clastb_n_bf16( %pg, bfloat %a, %b) #0 { ; CHECK-LABEL: clastb_n_bf16: ; CHECK: // %bb.0: ; CHECK-NEXT: clastb h0, p0, h0, z1.h ; CHECK-NEXT: ret %out = call bfloat @llvm.aarch64.sve.clastb.n.nxv8bf16( %pg, bfloat %a, %b) ret bfloat %out } define float @clastb_n_f32( %pg, float %a, %b) { ; CHECK-LABEL: clastb_n_f32: ; CHECK: // %bb.0: ; CHECK-NEXT: clastb s0, p0, s0, z1.s ; CHECK-NEXT: ret %out = call float @llvm.aarch64.sve.clastb.n.nxv4f32( %pg, float %a, %b) ret float %out } define double @clastb_n_f64( %pg, double %a, %b) { ; CHECK-LABEL: clastb_n_f64: ; CHECK: // %bb.0: ; CHECK-NEXT: clastb d0, p0, d0, z1.d ; CHECK-NEXT: ret %out = call double @llvm.aarch64.sve.clastb.n.nxv2f64( %pg, double %a, %b) ret double %out } ; ; DUPQ ; define @dupq_i8( %a) { ; CHECK-LABEL: dupq_i8: ; CHECK: // %bb.0: ; CHECK-NEXT: mov z0.q, q0 ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.dupq.lane.nxv16i8( %a, i64 0) ret %out } define @dupq_i16( %a) { ; CHECK-LABEL: dupq_i16: ; CHECK: // %bb.0: ; CHECK-NEXT: mov z0.q, z0.q[1] ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.dupq.lane.nxv8i16( %a, i64 1) ret %out } define @dupq_i32( %a) { ; CHECK-LABEL: dupq_i32: ; CHECK: // %bb.0: ; CHECK-NEXT: mov z0.q, z0.q[2] ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.dupq.lane.nxv4i32( %a, i64 2) ret %out } define @dupq_i64( %a) { ; CHECK-LABEL: dupq_i64: ; CHECK: // %bb.0: ; CHECK-NEXT: mov z0.q, z0.q[3] ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.dupq.lane.nxv2i64( %a, i64 3) ret %out } define @dupq_f16( %a) { ; CHECK-LABEL: dupq_f16: ; CHECK: // %bb.0: ; CHECK-NEXT: mov z0.q, q0 ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.dupq.lane.nxv8f16( %a, i64 0) ret %out } define @dupq_bf16( %a) #0 { ; CHECK-LABEL: dupq_bf16: ; CHECK: // %bb.0: ; CHECK-NEXT: mov z0.q, q0 ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.dupq.lane.nxv8bf16( %a, i64 0) ret %out } define @dupq_f32( %a) { ; CHECK-LABEL: dupq_f32: ; CHECK: // %bb.0: ; CHECK-NEXT: mov z0.q, z0.q[1] ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.dupq.lane.nxv4f32( %a, i64 1) ret %out } define @dupq_f64( %a) { ; CHECK-LABEL: dupq_f64: ; CHECK: // %bb.0: ; CHECK-NEXT: mov z0.q, z0.q[2] ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.dupq.lane.nxv2f64( %a, i64 2) ret %out } ; ; DUPQ_LANE ; define @dupq_lane_i8( %a, i64 %idx) { ; CHECK-LABEL: dupq_lane_i8: ; CHECK: // %bb.0: ; CHECK-NEXT: index z1.d, #0, #1 ; CHECK-NEXT: add x8, x0, x0 ; CHECK-NEXT: mov z2.d, x8 ; CHECK-NEXT: and z1.d, z1.d, #0x1 ; CHECK-NEXT: add z1.d, z1.d, z2.d ; CHECK-NEXT: tbl z0.d, { z0.d }, z1.d ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.dupq.lane.nxv16i8( %a, i64 %idx) ret %out } ; NOTE: Identical operation to dupq_lane_i8 (i.e. element type is irrelevant). define @dupq_lane_i16( %a, i64 %idx) { ; CHECK-LABEL: dupq_lane_i16: ; CHECK: // %bb.0: ; CHECK-NEXT: index z1.d, #0, #1 ; CHECK-NEXT: add x8, x0, x0 ; CHECK-NEXT: mov z2.d, x8 ; CHECK-NEXT: and z1.d, z1.d, #0x1 ; CHECK-NEXT: add z1.d, z1.d, z2.d ; CHECK-NEXT: tbl z0.d, { z0.d }, z1.d ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.dupq.lane.nxv8i16( %a, i64 %idx) ret %out } ; NOTE: Identical operation to dupq_lane_i8 (i.e. element type is irrelevant). define @dupq_lane_i32( %a, i64 %idx) { ; CHECK-LABEL: dupq_lane_i32: ; CHECK: // %bb.0: ; CHECK-NEXT: index z1.d, #0, #1 ; CHECK-NEXT: add x8, x0, x0 ; CHECK-NEXT: mov z2.d, x8 ; CHECK-NEXT: and z1.d, z1.d, #0x1 ; CHECK-NEXT: add z1.d, z1.d, z2.d ; CHECK-NEXT: tbl z0.d, { z0.d }, z1.d ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.dupq.lane.nxv4i32( %a, i64 %idx) ret %out } ; NOTE: Identical operation to dupq_lane_i8 (i.e. element type is irrelevant). define @dupq_lane_i64( %a, i64 %idx) { ; CHECK-LABEL: dupq_lane_i64: ; CHECK: // %bb.0: ; CHECK-NEXT: index z1.d, #0, #1 ; CHECK-NEXT: add x8, x0, x0 ; CHECK-NEXT: mov z2.d, x8 ; CHECK-NEXT: and z1.d, z1.d, #0x1 ; CHECK-NEXT: add z1.d, z1.d, z2.d ; CHECK-NEXT: tbl z0.d, { z0.d }, z1.d ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.dupq.lane.nxv2i64( %a, i64 %idx) ret %out } ; NOTE: Identical operation to dupq_lane_i8 (i.e. element type is irrelevant). define @dupq_lane_f16( %a, i64 %idx) { ; CHECK-LABEL: dupq_lane_f16: ; CHECK: // %bb.0: ; CHECK-NEXT: index z1.d, #0, #1 ; CHECK-NEXT: add x8, x0, x0 ; CHECK-NEXT: mov z2.d, x8 ; CHECK-NEXT: and z1.d, z1.d, #0x1 ; CHECK-NEXT: add z1.d, z1.d, z2.d ; CHECK-NEXT: tbl z0.d, { z0.d }, z1.d ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.dupq.lane.nxv8f16( %a, i64 %idx) ret %out } ; NOTE: Identical operation to dupq_lane_i8 (i.e. element type is irrelevant). define @dupq_lane_bf16( %a, i64 %idx) #0 { ; CHECK-LABEL: dupq_lane_bf16: ; CHECK: // %bb.0: ; CHECK-NEXT: index z1.d, #0, #1 ; CHECK-NEXT: add x8, x0, x0 ; CHECK-NEXT: mov z2.d, x8 ; CHECK-NEXT: and z1.d, z1.d, #0x1 ; CHECK-NEXT: add z1.d, z1.d, z2.d ; CHECK-NEXT: tbl z0.d, { z0.d }, z1.d ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.dupq.lane.nxv8bf16( %a, i64 %idx) ret %out } ; NOTE: Identical operation to dupq_lane_i8 (i.e. element type is irrelevant). define @dupq_lane_f32( %a, i64 %idx) { ; CHECK-LABEL: dupq_lane_f32: ; CHECK: // %bb.0: ; CHECK-NEXT: index z1.d, #0, #1 ; CHECK-NEXT: add x8, x0, x0 ; CHECK-NEXT: mov z2.d, x8 ; CHECK-NEXT: and z1.d, z1.d, #0x1 ; CHECK-NEXT: add z1.d, z1.d, z2.d ; CHECK-NEXT: tbl z0.d, { z0.d }, z1.d ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.dupq.lane.nxv4f32( %a, i64 %idx) ret %out } ; NOTE: Identical operation to dupq_lane_i8 (i.e. element type is irrelevant). define @dupq_lane_f64( %a, i64 %idx) { ; CHECK-LABEL: dupq_lane_f64: ; CHECK: // %bb.0: ; CHECK-NEXT: index z1.d, #0, #1 ; CHECK-NEXT: add x8, x0, x0 ; CHECK-NEXT: mov z2.d, x8 ; CHECK-NEXT: and z1.d, z1.d, #0x1 ; CHECK-NEXT: add z1.d, z1.d, z2.d ; CHECK-NEXT: tbl z0.d, { z0.d }, z1.d ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.dupq.lane.nxv2f64( %a, i64 %idx) ret %out } ; NOTE: Index out of range (0-3) define @dupq_i64_range( %a) { ; CHECK-LABEL: dupq_i64_range: ; CHECK: // %bb.0: ; CHECK-NEXT: index z1.d, #0, #1 ; CHECK-NEXT: and z1.d, z1.d, #0x1 ; CHECK-NEXT: orr z1.d, z1.d, #0x8 ; CHECK-NEXT: tbl z0.d, { z0.d }, z1.d ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.dupq.lane.nxv2i64( %a, i64 4) ret %out } ; ; EXT ; define dso_local @dupq_f32_repeat_complex(float %x, float %y) { ; CHECK-LABEL: dupq_f32_repeat_complex: ; CHECK: // %bb.0: ; CHECK-NEXT: // kill: def $s0 killed $s0 def $z0 ; CHECK-NEXT: // kill: def $s1 killed $s1 def $q1 ; CHECK-NEXT: mov v0.s[1], v1.s[0] ; CHECK-NEXT: mov z0.d, d0 ; CHECK-NEXT: ret %1 = insertelement <4 x float> undef, float %x, i64 0 %2 = insertelement <4 x float> %1, float %y, i64 1 %3 = call @llvm.vector.insert.nxv4f32.v4f32( undef, <4 x float> %2, i64 0) %4 = bitcast %3 to %5 = shufflevector %4, poison, zeroinitializer %6 = bitcast %5 to ret %6 } define dso_local @dupq_f16_repeat_complex(half %x, half %y) { ; CHECK-LABEL: dupq_f16_repeat_complex: ; CHECK: // %bb.0: ; CHECK-NEXT: // kill: def $h0 killed $h0 def $z0 ; CHECK-NEXT: // kill: def $h1 killed $h1 def $q1 ; CHECK-NEXT: mov v0.h[1], v1.h[0] ; CHECK-NEXT: mov z0.s, s0 ; CHECK-NEXT: ret %1 = insertelement <8 x half> undef, half %x, i64 0 %2 = insertelement <8 x half> %1, half %y, i64 1 %3 = call @llvm.vector.insert.nxv8f16.v8f16( undef, <8 x half> %2, i64 0) %4 = bitcast %3 to %5 = shufflevector %4, poison, zeroinitializer %6 = bitcast %5 to ret %6 } define @ext_i8( %a, %b) { ; CHECK-LABEL: ext_i8: ; CHECK: // %bb.0: ; CHECK-NEXT: ext z0.b, z0.b, z1.b, #255 ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.ext.nxv16i8( %a, %b, i32 255) ret %out } define @ext_i16( %a, %b) { ; CHECK-LABEL: ext_i16: ; CHECK: // %bb.0: ; CHECK-NEXT: ext z0.b, z0.b, z1.b, #0 ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.ext.nxv8i16( %a, %b, i32 0) ret %out } define @ext_i32( %a, %b) { ; CHECK-LABEL: ext_i32: ; CHECK: // %bb.0: ; CHECK-NEXT: ext z0.b, z0.b, z1.b, #4 ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.ext.nxv4i32( %a, %b, i32 1) ret %out } define @ext_i64( %a, %b) { ; CHECK-LABEL: ext_i64: ; CHECK: // %bb.0: ; CHECK-NEXT: ext z0.b, z0.b, z1.b, #16 ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.ext.nxv2i64( %a, %b, i32 2) ret %out } define @ext_bf16( %a, %b) #0 { ; CHECK-LABEL: ext_bf16: ; CHECK: // %bb.0: ; CHECK-NEXT: ext z0.b, z0.b, z1.b, #6 ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.ext.nxv8bf16( %a, %b, i32 3) ret %out } define @ext_f16( %a, %b) { ; CHECK-LABEL: ext_f16: ; CHECK: // %bb.0: ; CHECK-NEXT: ext z0.b, z0.b, z1.b, #6 ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.ext.nxv8f16( %a, %b, i32 3) ret %out } define @ext_f32( %a, %b) { ; CHECK-LABEL: ext_f32: ; CHECK: // %bb.0: ; CHECK-NEXT: ext z0.b, z0.b, z1.b, #16 ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.ext.nxv4f32( %a, %b, i32 4) ret %out } define @ext_f64( %a, %b) { ; CHECK-LABEL: ext_f64: ; CHECK: // %bb.0: ; CHECK-NEXT: ext z0.b, z0.b, z1.b, #40 ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.ext.nxv2f64( %a, %b, i32 5) ret %out } ; ; LASTA ; define i8 @lasta_i8( %pg, %a) { ; CHECK-LABEL: lasta_i8: ; CHECK: // %bb.0: ; CHECK-NEXT: lasta w0, p0, z0.b ; CHECK-NEXT: ret %res = call i8 @llvm.aarch64.sve.lasta.nxv16i8( %pg, %a) ret i8 %res } define i16 @lasta_i16( %pg, %a) { ; CHECK-LABEL: lasta_i16: ; CHECK: // %bb.0: ; CHECK-NEXT: lasta w0, p0, z0.h ; CHECK-NEXT: ret %res = call i16 @llvm.aarch64.sve.lasta.nxv8i16( %pg, %a) ret i16 %res } define i32 @lasta_i32( %pg, %a) { ; CHECK-LABEL: lasta_i32: ; CHECK: // %bb.0: ; CHECK-NEXT: lasta w0, p0, z0.s ; CHECK-NEXT: ret %res = call i32 @llvm.aarch64.sve.lasta.nxv4i32( %pg, %a) ret i32 %res } define i64 @lasta_i64( %pg, %a) { ; CHECK-LABEL: lasta_i64: ; CHECK: // %bb.0: ; CHECK-NEXT: lasta x0, p0, z0.d ; CHECK-NEXT: ret %res = call i64 @llvm.aarch64.sve.lasta.nxv2i64( %pg, %a) ret i64 %res } define half @lasta_f16( %pg, %a) { ; CHECK-LABEL: lasta_f16: ; CHECK: // %bb.0: ; CHECK-NEXT: lasta h0, p0, z0.h ; CHECK-NEXT: ret %res = call half @llvm.aarch64.sve.lasta.nxv8f16( %pg, %a) ret half %res } define bfloat @lasta_bf16( %pg, %a) #0 { ; CHECK-LABEL: lasta_bf16: ; CHECK: // %bb.0: ; CHECK-NEXT: lasta h0, p0, z0.h ; CHECK-NEXT: ret %res = call bfloat @llvm.aarch64.sve.lasta.nxv8bf16( %pg, %a) ret bfloat %res } define float @lasta_f32( %pg, %a) { ; CHECK-LABEL: lasta_f32: ; CHECK: // %bb.0: ; CHECK-NEXT: lasta s0, p0, z0.s ; CHECK-NEXT: ret %res = call float @llvm.aarch64.sve.lasta.nxv4f32( %pg, %a) ret float %res } define float @lasta_f32_v2( %pg, %a) { ; CHECK-LABEL: lasta_f32_v2: ; CHECK: // %bb.0: ; CHECK-NEXT: lasta s0, p0, z0.s ; CHECK-NEXT: ret %res = call float @llvm.aarch64.sve.lasta.nxv2f32( %pg, %a) ret float %res } define double @lasta_f64( %pg, %a) { ; CHECK-LABEL: lasta_f64: ; CHECK: // %bb.0: ; CHECK-NEXT: lasta d0, p0, z0.d ; CHECK-NEXT: ret %res = call double @llvm.aarch64.sve.lasta.nxv2f64( %pg, %a) ret double %res } ; ; LASTB ; define i8 @lastb_i8( %pg, %a) { ; CHECK-LABEL: lastb_i8: ; CHECK: // %bb.0: ; CHECK-NEXT: lastb w0, p0, z0.b ; CHECK-NEXT: ret %res = call i8 @llvm.aarch64.sve.lastb.nxv16i8( %pg, %a) ret i8 %res } define i16 @lastb_i16( %pg, %a) { ; CHECK-LABEL: lastb_i16: ; CHECK: // %bb.0: ; CHECK-NEXT: lastb w0, p0, z0.h ; CHECK-NEXT: ret %res = call i16 @llvm.aarch64.sve.lastb.nxv8i16( %pg, %a) ret i16 %res } define i32 @lastb_i32( %pg, %a) { ; CHECK-LABEL: lastb_i32: ; CHECK: // %bb.0: ; CHECK-NEXT: lastb w0, p0, z0.s ; CHECK-NEXT: ret %res = call i32 @llvm.aarch64.sve.lastb.nxv4i32( %pg, %a) ret i32 %res } define i64 @lastb_i64( %pg, %a) { ; CHECK-LABEL: lastb_i64: ; CHECK: // %bb.0: ; CHECK-NEXT: lastb x0, p0, z0.d ; CHECK-NEXT: ret %res = call i64 @llvm.aarch64.sve.lastb.nxv2i64( %pg, %a) ret i64 %res } define half @lastb_f16( %pg, %a) { ; CHECK-LABEL: lastb_f16: ; CHECK: // %bb.0: ; CHECK-NEXT: lastb h0, p0, z0.h ; CHECK-NEXT: ret %res = call half @llvm.aarch64.sve.lastb.nxv8f16( %pg, %a) ret half %res } define bfloat @lastb_bf16( %pg, %a) #0 { ; CHECK-LABEL: lastb_bf16: ; CHECK: // %bb.0: ; CHECK-NEXT: lastb h0, p0, z0.h ; CHECK-NEXT: ret %res = call bfloat @llvm.aarch64.sve.lastb.nxv8bf16( %pg, %a) ret bfloat %res } define float @lastb_f32( %pg, %a) { ; CHECK-LABEL: lastb_f32: ; CHECK: // %bb.0: ; CHECK-NEXT: lastb s0, p0, z0.s ; CHECK-NEXT: ret %res = call float @llvm.aarch64.sve.lastb.nxv4f32( %pg, %a) ret float %res } define float @lastb_f32_v2( %pg, %a) { ; CHECK-LABEL: lastb_f32_v2: ; CHECK: // %bb.0: ; CHECK-NEXT: lastb s0, p0, z0.s ; CHECK-NEXT: ret %res = call float @llvm.aarch64.sve.lastb.nxv2f32( %pg, %a) ret float %res } define double @lastb_f64( %pg, %a) { ; CHECK-LABEL: lastb_f64: ; CHECK: // %bb.0: ; CHECK-NEXT: lastb d0, p0, z0.d ; CHECK-NEXT: ret %res = call double @llvm.aarch64.sve.lastb.nxv2f64( %pg, %a) ret double %res } ; ; COMPACT ; define @compact_i32( %pg, %a) { ; CHECK-LABEL: compact_i32: ; CHECK: // %bb.0: ; CHECK-NEXT: compact z0.s, p0, z0.s ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.compact.nxv4i32( %pg, %a) ret %out } define @compact_i64( %pg, %a) { ; CHECK-LABEL: compact_i64: ; CHECK: // %bb.0: ; CHECK-NEXT: compact z0.d, p0, z0.d ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.compact.nxv2i64( %pg, %a) ret %out } define @compact_f32( %pg, %a) { ; CHECK-LABEL: compact_f32: ; CHECK: // %bb.0: ; CHECK-NEXT: compact z0.s, p0, z0.s ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.compact.nxv4f32( %pg, %a) ret %out } define @compact_f64( %pg, %a) { ; CHECK-LABEL: compact_f64: ; CHECK: // %bb.0: ; CHECK-NEXT: compact z0.d, p0, z0.d ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.compact.nxv2f64( %pg, %a) ret %out } ; ; REV ; define @rev_nxv16i1( %a) { ; CHECK-LABEL: rev_nxv16i1: ; CHECK: // %bb.0: ; CHECK-NEXT: rev p0.b, p0.b ; CHECK-NEXT: ret %res = call @llvm.aarch64.sve.rev.nxv16i1( %a) ret %res } define @rev_nxv8i1( %a) { ; CHECK-LABEL: rev_nxv8i1: ; CHECK: // %bb.0: ; CHECK-NEXT: rev p0.h, p0.h ; CHECK-NEXT: ret %res = call @llvm.aarch64.sve.rev.nxv8i1( %a) ret %res } define @rev_nxv4i1( %a) { ; CHECK-LABEL: rev_nxv4i1: ; CHECK: // %bb.0: ; CHECK-NEXT: rev p0.s, p0.s ; CHECK-NEXT: ret %res = call @llvm.aarch64.sve.rev.nxv4i1( %a) ret %res } define @rev_nxv2i1( %a) { ; CHECK-LABEL: rev_nxv2i1: ; CHECK: // %bb.0: ; CHECK-NEXT: rev p0.d, p0.d ; CHECK-NEXT: ret %res = call @llvm.aarch64.sve.rev.nxv2i1( %a) ret %res } define @rev_b16( %a) { ; CHECK-LABEL: rev_b16: ; CHECK: // %bb.0: ; CHECK-NEXT: rev p0.h, p0.h ; CHECK-NEXT: ret %res = call @llvm.aarch64.sve.rev.b16( %a) ret %res } define @rev_b32( %a) { ; CHECK-LABEL: rev_b32: ; CHECK: // %bb.0: ; CHECK-NEXT: rev p0.s, p0.s ; CHECK-NEXT: ret %res = call @llvm.aarch64.sve.rev.b32( %a) ret %res } define @rev_b64( %a) { ; CHECK-LABEL: rev_b64: ; CHECK: // %bb.0: ; CHECK-NEXT: rev p0.d, p0.d ; CHECK-NEXT: ret %res = call @llvm.aarch64.sve.rev.b64( %a) ret %res } define @rev_i8( %a) { ; CHECK-LABEL: rev_i8: ; CHECK: // %bb.0: ; CHECK-NEXT: rev z0.b, z0.b ; CHECK-NEXT: ret %res = call @llvm.aarch64.sve.rev.nxv16i8( %a) ret %res } define @rev_i16( %a) { ; CHECK-LABEL: rev_i16: ; CHECK: // %bb.0: ; CHECK-NEXT: rev z0.h, z0.h ; CHECK-NEXT: ret %res = call @llvm.aarch64.sve.rev.nxv8i16( %a) ret %res } define @rev_i32( %a) { ; CHECK-LABEL: rev_i32: ; CHECK: // %bb.0: ; CHECK-NEXT: rev z0.s, z0.s ; CHECK-NEXT: ret %res = call @llvm.aarch64.sve.rev.nxv4i32( %a) ret %res } define @rev_i64( %a) { ; CHECK-LABEL: rev_i64: ; CHECK: // %bb.0: ; CHECK-NEXT: rev z0.d, z0.d ; CHECK-NEXT: ret %res = call @llvm.aarch64.sve.rev.nxv2i64( %a) ret %res } define @rev_bf16( %a) #0 { ; CHECK-LABEL: rev_bf16: ; CHECK: // %bb.0: ; CHECK-NEXT: rev z0.h, z0.h ; CHECK-NEXT: ret %res = call @llvm.aarch64.sve.rev.nxv8bf16( %a) ret %res } define @rev_f16( %a) { ; CHECK-LABEL: rev_f16: ; CHECK: // %bb.0: ; CHECK-NEXT: rev z0.h, z0.h ; CHECK-NEXT: ret %res = call @llvm.aarch64.sve.rev.nxv8f16( %a) ret %res } define @rev_f32( %a) { ; CHECK-LABEL: rev_f32: ; CHECK: // %bb.0: ; CHECK-NEXT: rev z0.s, z0.s ; CHECK-NEXT: ret %res = call @llvm.aarch64.sve.rev.nxv4f32( %a) ret %res } define @rev_f64( %a) { ; CHECK-LABEL: rev_f64: ; CHECK: // %bb.0: ; CHECK-NEXT: rev z0.d, z0.d ; CHECK-NEXT: ret %res = call @llvm.aarch64.sve.rev.nxv2f64( %a) ret %res } ; ; SPLICE ; define @splice_i8( %pg, %a, %b) { ; CHECK-LABEL: splice_i8: ; CHECK: // %bb.0: ; CHECK-NEXT: splice z0.b, p0, z0.b, z1.b ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.splice.nxv16i8( %pg, %a, %b) ret %out } define @splice_i16( %pg, %a, %b) { ; CHECK-LABEL: splice_i16: ; CHECK: // %bb.0: ; CHECK-NEXT: splice z0.h, p0, z0.h, z1.h ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.splice.nxv8i16( %pg, %a, %b) ret %out } define @splice_i32( %pg, %a, %b) { ; CHECK-LABEL: splice_i32: ; CHECK: // %bb.0: ; CHECK-NEXT: splice z0.s, p0, z0.s, z1.s ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.splice.nxv4i32( %pg, %a, %b) ret %out } define @splice_i64( %pg, %a, %b) { ; CHECK-LABEL: splice_i64: ; CHECK: // %bb.0: ; CHECK-NEXT: splice z0.d, p0, z0.d, z1.d ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.splice.nxv2i64( %pg, %a, %b) ret %out } define @splice_bf16( %pg, %a, %b) #0 { ; CHECK-LABEL: splice_bf16: ; CHECK: // %bb.0: ; CHECK-NEXT: splice z0.h, p0, z0.h, z1.h ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.splice.nxv8bf16( %pg, %a, %b) ret %out } define @splice_f16( %pg, %a, %b) { ; CHECK-LABEL: splice_f16: ; CHECK: // %bb.0: ; CHECK-NEXT: splice z0.h, p0, z0.h, z1.h ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.splice.nxv8f16( %pg, %a, %b) ret %out } define @splice_f32( %pg, %a, %b) { ; CHECK-LABEL: splice_f32: ; CHECK: // %bb.0: ; CHECK-NEXT: splice z0.s, p0, z0.s, z1.s ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.splice.nxv4f32( %pg, %a, %b) ret %out } define @splice_f64( %pg, %a, %b) { ; CHECK-LABEL: splice_f64: ; CHECK: // %bb.0: ; CHECK-NEXT: splice z0.d, p0, z0.d, z1.d ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.splice.nxv2f64( %pg, %a, %b) ret %out } ; ; SUNPKHI ; define @sunpkhi_i16( %a) { ; CHECK-LABEL: sunpkhi_i16: ; CHECK: // %bb.0: ; CHECK-NEXT: sunpkhi z0.h, z0.b ; CHECK-NEXT: ret %res = call @llvm.aarch64.sve.sunpkhi.nxv8i16( %a) ret %res } define @sunpkhi_i32( %a) { ; CHECK-LABEL: sunpkhi_i32: ; CHECK: // %bb.0: ; CHECK-NEXT: sunpkhi z0.s, z0.h ; CHECK-NEXT: ret %res = call @llvm.aarch64.sve.sunpkhi.nxv4i32( %a) ret %res } define @sunpkhi_i64( %a) { ; CHECK-LABEL: sunpkhi_i64: ; CHECK: // %bb.0: ; CHECK-NEXT: sunpkhi z0.d, z0.s ; CHECK-NEXT: ret %res = call @llvm.aarch64.sve.sunpkhi.nxv2i64( %a) ret %res } ; ; SUNPKLO ; define @sunpklo_i16( %a) { ; CHECK-LABEL: sunpklo_i16: ; CHECK: // %bb.0: ; CHECK-NEXT: sunpklo z0.h, z0.b ; CHECK-NEXT: ret %res = call @llvm.aarch64.sve.sunpklo.nxv8i16( %a) ret %res } define @sunpklo_i32( %a) { ; CHECK-LABEL: sunpklo_i32: ; CHECK: // %bb.0: ; CHECK-NEXT: sunpklo z0.s, z0.h ; CHECK-NEXT: ret %res = call @llvm.aarch64.sve.sunpklo.nxv4i32( %a) ret %res } define @sunpklo_i64( %a) { ; CHECK-LABEL: sunpklo_i64: ; CHECK: // %bb.0: ; CHECK-NEXT: sunpklo z0.d, z0.s ; CHECK-NEXT: ret %res = call @llvm.aarch64.sve.sunpklo.nxv2i64( %a) ret %res } ; ; TBL ; define @tbl_i8( %a, %b) { ; CHECK-LABEL: tbl_i8: ; CHECK: // %bb.0: ; CHECK-NEXT: tbl z0.b, { z0.b }, z1.b ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.tbl.nxv16i8( %a, %b) ret %out } define @tbl_i16( %a, %b) { ; CHECK-LABEL: tbl_i16: ; CHECK: // %bb.0: ; CHECK-NEXT: tbl z0.h, { z0.h }, z1.h ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.tbl.nxv8i16( %a, %b) ret %out } define @tbl_i32( %a, %b) { ; CHECK-LABEL: tbl_i32: ; CHECK: // %bb.0: ; CHECK-NEXT: tbl z0.s, { z0.s }, z1.s ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.tbl.nxv4i32( %a, %b) ret %out } define @tbl_i64( %a, %b) { ; CHECK-LABEL: tbl_i64: ; CHECK: // %bb.0: ; CHECK-NEXT: tbl z0.d, { z0.d }, z1.d ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.tbl.nxv2i64( %a, %b) ret %out } define @tbl_f16( %a, %b) { ; CHECK-LABEL: tbl_f16: ; CHECK: // %bb.0: ; CHECK-NEXT: tbl z0.h, { z0.h }, z1.h ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.tbl.nxv8f16( %a, %b) ret %out } define @tbl_bf16( %a, %b) #0 { ; CHECK-LABEL: tbl_bf16: ; CHECK: // %bb.0: ; CHECK-NEXT: tbl z0.h, { z0.h }, z1.h ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.tbl.nxv8bf16( %a, %b) ret %out } define @tbl_f32( %a, %b) { ; CHECK-LABEL: tbl_f32: ; CHECK: // %bb.0: ; CHECK-NEXT: tbl z0.s, { z0.s }, z1.s ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.tbl.nxv4f32( %a, %b) ret %out } define @tbl_f64( %a, %b) { ; CHECK-LABEL: tbl_f64: ; CHECK: // %bb.0: ; CHECK-NEXT: tbl z0.d, { z0.d }, z1.d ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.tbl.nxv2f64( %a, %b) ret %out } ; ; UUNPKHI ; define @uunpkhi_i16( %a) { ; CHECK-LABEL: uunpkhi_i16: ; CHECK: // %bb.0: ; CHECK-NEXT: uunpkhi z0.h, z0.b ; CHECK-NEXT: ret %res = call @llvm.aarch64.sve.uunpkhi.nxv8i16( %a) ret %res } define @uunpkhi_i32( %a) { ; CHECK-LABEL: uunpkhi_i32: ; CHECK: // %bb.0: ; CHECK-NEXT: uunpkhi z0.s, z0.h ; CHECK-NEXT: ret %res = call @llvm.aarch64.sve.uunpkhi.nxv4i32( %a) ret %res } define @uunpkhi_i64( %a) { ; CHECK-LABEL: uunpkhi_i64: ; CHECK: // %bb.0: ; CHECK-NEXT: uunpkhi z0.d, z0.s ; CHECK-NEXT: ret %res = call @llvm.aarch64.sve.uunpkhi.nxv2i64( %a) ret %res } ; ; UUNPKLO ; define @uunpklo_i16( %a) { ; CHECK-LABEL: uunpklo_i16: ; CHECK: // %bb.0: ; CHECK-NEXT: uunpklo z0.h, z0.b ; CHECK-NEXT: ret %res = call @llvm.aarch64.sve.uunpklo.nxv8i16( %a) ret %res } define @uunpklo_i32( %a) { ; CHECK-LABEL: uunpklo_i32: ; CHECK: // %bb.0: ; CHECK-NEXT: uunpklo z0.s, z0.h ; CHECK-NEXT: ret %res = call @llvm.aarch64.sve.uunpklo.nxv4i32( %a) ret %res } define @uunpklo_i64( %a) { ; CHECK-LABEL: uunpklo_i64: ; CHECK: // %bb.0: ; CHECK-NEXT: uunpklo z0.d, z0.s ; CHECK-NEXT: ret %res = call @llvm.aarch64.sve.uunpklo.nxv2i64( %a) ret %res } ; ; TRN1 ; define @trn1_nxv16i1( %a, %b) { ; CHECK-LABEL: trn1_nxv16i1: ; CHECK: // %bb.0: ; CHECK-NEXT: trn1 p0.b, p0.b, p1.b ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.trn1.nxv16i1( %a, %b) ret %out } define @trn1_nxv8i1( %a, %b) { ; CHECK-LABEL: trn1_nxv8i1: ; CHECK: // %bb.0: ; CHECK-NEXT: trn1 p0.h, p0.h, p1.h ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.trn1.nxv8i1( %a, %b) ret %out } define @trn1_nxv4i1( %a, %b) { ; CHECK-LABEL: trn1_nxv4i1: ; CHECK: // %bb.0: ; CHECK-NEXT: trn1 p0.s, p0.s, p1.s ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.trn1.nxv4i1( %a, %b) ret %out } define @trn1_nxv2i1( %a, %b) { ; CHECK-LABEL: trn1_nxv2i1: ; CHECK: // %bb.0: ; CHECK-NEXT: trn1 p0.d, p0.d, p1.d ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.trn1.nxv2i1( %a, %b) ret %out } define @trn1_b16( %a, %b) { ; CHECK-LABEL: trn1_b16: ; CHECK: // %bb.0: ; CHECK-NEXT: trn1 p0.h, p0.h, p1.h ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.trn1.b16( %a, %b) ret %out } define @trn1_b32( %a, %b) { ; CHECK-LABEL: trn1_b32: ; CHECK: // %bb.0: ; CHECK-NEXT: trn1 p0.s, p0.s, p1.s ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.trn1.b32( %a, %b) ret %out } define @trn1_b64( %a, %b) { ; CHECK-LABEL: trn1_b64: ; CHECK: // %bb.0: ; CHECK-NEXT: trn1 p0.d, p0.d, p1.d ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.trn1.b64( %a, %b) ret %out } define @trn1_i8( %a, %b) { ; CHECK-LABEL: trn1_i8: ; CHECK: // %bb.0: ; CHECK-NEXT: trn1 z0.b, z0.b, z1.b ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.trn1.nxv16i8( %a, %b) ret %out } define @trn1_i16( %a, %b) { ; CHECK-LABEL: trn1_i16: ; CHECK: // %bb.0: ; CHECK-NEXT: trn1 z0.h, z0.h, z1.h ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.trn1.nxv8i16( %a, %b) ret %out } define @trn1_i32( %a, %b) { ; CHECK-LABEL: trn1_i32: ; CHECK: // %bb.0: ; CHECK-NEXT: trn1 z0.s, z0.s, z1.s ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.trn1.nxv4i32( %a, %b) ret %out } define @trn1_i64( %a, %b) { ; CHECK-LABEL: trn1_i64: ; CHECK: // %bb.0: ; CHECK-NEXT: trn1 z0.d, z0.d, z1.d ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.trn1.nxv2i64( %a, %b) ret %out } define @trn1_f16_v2( %a, %b) { ; CHECK-LABEL: trn1_f16_v2: ; CHECK: // %bb.0: ; CHECK-NEXT: trn1 z0.d, z0.d, z1.d ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.trn1.nxv2f16( %a, %b) ret %out } define @trn1_f16_v4( %a, %b) { ; CHECK-LABEL: trn1_f16_v4: ; CHECK: // %bb.0: ; CHECK-NEXT: trn1 z0.s, z0.s, z1.s ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.trn1.nxv4f16( %a, %b) ret %out } define @trn1_bf16( %a, %b) #0 { ; CHECK-LABEL: trn1_bf16: ; CHECK: // %bb.0: ; CHECK-NEXT: trn1 z0.h, z0.h, z1.h ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.trn1.nxv8bf16( %a, %b) ret %out } define @trn1_f16( %a, %b) { ; CHECK-LABEL: trn1_f16: ; CHECK: // %bb.0: ; CHECK-NEXT: trn1 z0.h, z0.h, z1.h ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.trn1.nxv8f16( %a, %b) ret %out } define @trn1_f32_v2( %a, %b) { ; CHECK-LABEL: trn1_f32_v2: ; CHECK: // %bb.0: ; CHECK-NEXT: trn1 z0.d, z0.d, z1.d ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.trn1.nxv2f32( %a, %b) ret %out } define @trn1_f32( %a, %b) { ; CHECK-LABEL: trn1_f32: ; CHECK: // %bb.0: ; CHECK-NEXT: trn1 z0.s, z0.s, z1.s ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.trn1.nxv4f32( %a, %b) ret %out } define @trn1_f64( %a, %b) { ; CHECK-LABEL: trn1_f64: ; CHECK: // %bb.0: ; CHECK-NEXT: trn1 z0.d, z0.d, z1.d ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.trn1.nxv2f64( %a, %b) ret %out } ; ; TRN2 ; define @trn2_nxv16i1( %a, %b) { ; CHECK-LABEL: trn2_nxv16i1: ; CHECK: // %bb.0: ; CHECK-NEXT: trn2 p0.b, p0.b, p1.b ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.trn2.nxv16i1( %a, %b) ret %out } define @trn2_nxv8i1( %a, %b) { ; CHECK-LABEL: trn2_nxv8i1: ; CHECK: // %bb.0: ; CHECK-NEXT: trn2 p0.h, p0.h, p1.h ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.trn2.nxv8i1( %a, %b) ret %out } define @trn2_nxv4i1( %a, %b) { ; CHECK-LABEL: trn2_nxv4i1: ; CHECK: // %bb.0: ; CHECK-NEXT: trn2 p0.s, p0.s, p1.s ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.trn2.nxv4i1( %a, %b) ret %out } define @trn2_nxv2i1( %a, %b) { ; CHECK-LABEL: trn2_nxv2i1: ; CHECK: // %bb.0: ; CHECK-NEXT: trn2 p0.d, p0.d, p1.d ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.trn2.nxv2i1( %a, %b) ret %out } define @trn2_b16( %a, %b) { ; CHECK-LABEL: trn2_b16: ; CHECK: // %bb.0: ; CHECK-NEXT: trn2 p0.h, p0.h, p1.h ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.trn2.b16( %a, %b) ret %out } define @trn2_b32( %a, %b) { ; CHECK-LABEL: trn2_b32: ; CHECK: // %bb.0: ; CHECK-NEXT: trn2 p0.s, p0.s, p1.s ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.trn2.b32( %a, %b) ret %out } define @trn2_b64( %a, %b) { ; CHECK-LABEL: trn2_b64: ; CHECK: // %bb.0: ; CHECK-NEXT: trn2 p0.d, p0.d, p1.d ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.trn2.b64( %a, %b) ret %out } define @trn2_i8( %a, %b) { ; CHECK-LABEL: trn2_i8: ; CHECK: // %bb.0: ; CHECK-NEXT: trn2 z0.b, z0.b, z1.b ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.trn2.nxv16i8( %a, %b) ret %out } define @trn2_i16( %a, %b) { ; CHECK-LABEL: trn2_i16: ; CHECK: // %bb.0: ; CHECK-NEXT: trn2 z0.h, z0.h, z1.h ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.trn2.nxv8i16( %a, %b) ret %out } define @trn2_i32( %a, %b) { ; CHECK-LABEL: trn2_i32: ; CHECK: // %bb.0: ; CHECK-NEXT: trn2 z0.s, z0.s, z1.s ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.trn2.nxv4i32( %a, %b) ret %out } define @trn2_i64( %a, %b) { ; CHECK-LABEL: trn2_i64: ; CHECK: // %bb.0: ; CHECK-NEXT: trn2 z0.d, z0.d, z1.d ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.trn2.nxv2i64( %a, %b) ret %out } define @trn2_f16_v2( %a, %b) { ; CHECK-LABEL: trn2_f16_v2: ; CHECK: // %bb.0: ; CHECK-NEXT: trn2 z0.d, z0.d, z1.d ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.trn2.nxv2f16( %a, %b) ret %out } define @trn2_f16_v4( %a, %b) { ; CHECK-LABEL: trn2_f16_v4: ; CHECK: // %bb.0: ; CHECK-NEXT: trn2 z0.s, z0.s, z1.s ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.trn2.nxv4f16( %a, %b) ret %out } define @trn2_bf16( %a, %b) #0 { ; CHECK-LABEL: trn2_bf16: ; CHECK: // %bb.0: ; CHECK-NEXT: trn2 z0.h, z0.h, z1.h ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.trn2.nxv8bf16( %a, %b) ret %out } define @trn2_f16( %a, %b) { ; CHECK-LABEL: trn2_f16: ; CHECK: // %bb.0: ; CHECK-NEXT: trn2 z0.h, z0.h, z1.h ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.trn2.nxv8f16( %a, %b) ret %out } define @trn2_f32_v2( %a, %b) { ; CHECK-LABEL: trn2_f32_v2: ; CHECK: // %bb.0: ; CHECK-NEXT: trn2 z0.d, z0.d, z1.d ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.trn2.nxv2f32( %a, %b) ret %out } define @trn2_f32( %a, %b) { ; CHECK-LABEL: trn2_f32: ; CHECK: // %bb.0: ; CHECK-NEXT: trn2 z0.s, z0.s, z1.s ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.trn2.nxv4f32( %a, %b) ret %out } define @trn2_f64( %a, %b) { ; CHECK-LABEL: trn2_f64: ; CHECK: // %bb.0: ; CHECK-NEXT: trn2 z0.d, z0.d, z1.d ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.trn2.nxv2f64( %a, %b) ret %out } ; ; UZP1 ; define @uzp1_nxv16i1( %a, %b) { ; CHECK-LABEL: uzp1_nxv16i1: ; CHECK: // %bb.0: ; CHECK-NEXT: uzp1 p0.b, p0.b, p1.b ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.uzp1.nxv16i1( %a, %b) ret %out } define @uzp1_nxv8i1( %a, %b) { ; CHECK-LABEL: uzp1_nxv8i1: ; CHECK: // %bb.0: ; CHECK-NEXT: uzp1 p0.h, p0.h, p1.h ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.uzp1.nxv8i1( %a, %b) ret %out } define @uzp1_nxv4i1( %a, %b) { ; CHECK-LABEL: uzp1_nxv4i1: ; CHECK: // %bb.0: ; CHECK-NEXT: uzp1 p0.s, p0.s, p1.s ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.uzp1.nxv4i1( %a, %b) ret %out } define @uzp1_nxv2i1( %a, %b) { ; CHECK-LABEL: uzp1_nxv2i1: ; CHECK: // %bb.0: ; CHECK-NEXT: uzp1 p0.d, p0.d, p1.d ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.uzp1.nxv2i1( %a, %b) ret %out } define @uzp1_b16( %a, %b) { ; CHECK-LABEL: uzp1_b16: ; CHECK: // %bb.0: ; CHECK-NEXT: uzp1 p0.h, p0.h, p1.h ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.uzp1.b16( %a, %b) ret %out } define @uzp1_b32( %a, %b) { ; CHECK-LABEL: uzp1_b32: ; CHECK: // %bb.0: ; CHECK-NEXT: uzp1 p0.s, p0.s, p1.s ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.uzp1.b32( %a, %b) ret %out } define @uzp1_b64( %a, %b) { ; CHECK-LABEL: uzp1_b64: ; CHECK: // %bb.0: ; CHECK-NEXT: uzp1 p0.d, p0.d, p1.d ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.uzp1.b64( %a, %b) ret %out } define @uzp1_i8( %a, %b) { ; CHECK-LABEL: uzp1_i8: ; CHECK: // %bb.0: ; CHECK-NEXT: uzp1 z0.b, z0.b, z1.b ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.uzp1.nxv16i8( %a, %b) ret %out } define @uzp1_i16( %a, %b) { ; CHECK-LABEL: uzp1_i16: ; CHECK: // %bb.0: ; CHECK-NEXT: uzp1 z0.h, z0.h, z1.h ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.uzp1.nxv8i16( %a, %b) ret %out } define @uzp1_i32( %a, %b) { ; CHECK-LABEL: uzp1_i32: ; CHECK: // %bb.0: ; CHECK-NEXT: uzp1 z0.s, z0.s, z1.s ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.uzp1.nxv4i32( %a, %b) ret %out } define @uzp1_i64( %a, %b) { ; CHECK-LABEL: uzp1_i64: ; CHECK: // %bb.0: ; CHECK-NEXT: uzp1 z0.d, z0.d, z1.d ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.uzp1.nxv2i64( %a, %b) ret %out } define @uzp1_f16_v2( %a, %b) { ; CHECK-LABEL: uzp1_f16_v2: ; CHECK: // %bb.0: ; CHECK-NEXT: uzp1 z0.d, z0.d, z1.d ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.uzp1.nxv2f16( %a, %b) ret %out } define @uzp1_f16_v4( %a, %b) { ; CHECK-LABEL: uzp1_f16_v4: ; CHECK: // %bb.0: ; CHECK-NEXT: uzp1 z0.s, z0.s, z1.s ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.uzp1.nxv4f16( %a, %b) ret %out } define @uzp1_bf16( %a, %b) #0 { ; CHECK-LABEL: uzp1_bf16: ; CHECK: // %bb.0: ; CHECK-NEXT: uzp1 z0.h, z0.h, z1.h ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.uzp1.nxv8bf16( %a, %b) ret %out } define @uzp1_f16( %a, %b) { ; CHECK-LABEL: uzp1_f16: ; CHECK: // %bb.0: ; CHECK-NEXT: uzp1 z0.h, z0.h, z1.h ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.uzp1.nxv8f16( %a, %b) ret %out } define @uzp1_f32_v2( %a, %b) { ; CHECK-LABEL: uzp1_f32_v2: ; CHECK: // %bb.0: ; CHECK-NEXT: uzp1 z0.d, z0.d, z1.d ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.uzp1.nxv2f32( %a, %b) ret %out } define @uzp1_f32( %a, %b) { ; CHECK-LABEL: uzp1_f32: ; CHECK: // %bb.0: ; CHECK-NEXT: uzp1 z0.s, z0.s, z1.s ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.uzp1.nxv4f32( %a, %b) ret %out } define @uzp1_f64( %a, %b) { ; CHECK-LABEL: uzp1_f64: ; CHECK: // %bb.0: ; CHECK-NEXT: uzp1 z0.d, z0.d, z1.d ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.uzp1.nxv2f64( %a, %b) ret %out } ; ; UZP2 ; define @uzp2_nxv16i1( %a, %b) { ; CHECK-LABEL: uzp2_nxv16i1: ; CHECK: // %bb.0: ; CHECK-NEXT: uzp2 p0.b, p0.b, p1.b ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.uzp2.nxv16i1( %a, %b) ret %out } define @uzp2_nxv8i1( %a, %b) { ; CHECK-LABEL: uzp2_nxv8i1: ; CHECK: // %bb.0: ; CHECK-NEXT: uzp2 p0.h, p0.h, p1.h ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.uzp2.nxv8i1( %a, %b) ret %out } define @uzp2_nxv4i1( %a, %b) { ; CHECK-LABEL: uzp2_nxv4i1: ; CHECK: // %bb.0: ; CHECK-NEXT: uzp2 p0.s, p0.s, p1.s ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.uzp2.nxv4i1( %a, %b) ret %out } define @uzp2_nxv2i1( %a, %b) { ; CHECK-LABEL: uzp2_nxv2i1: ; CHECK: // %bb.0: ; CHECK-NEXT: uzp2 p0.d, p0.d, p1.d ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.uzp2.nxv2i1( %a, %b) ret %out } define @uzp2_b16( %a, %b) { ; CHECK-LABEL: uzp2_b16: ; CHECK: // %bb.0: ; CHECK-NEXT: uzp2 p0.h, p0.h, p1.h ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.uzp2.b16( %a, %b) ret %out } define @uzp2_b32( %a, %b) { ; CHECK-LABEL: uzp2_b32: ; CHECK: // %bb.0: ; CHECK-NEXT: uzp2 p0.s, p0.s, p1.s ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.uzp2.b32( %a, %b) ret %out } define @uzp2_b64( %a, %b) { ; CHECK-LABEL: uzp2_b64: ; CHECK: // %bb.0: ; CHECK-NEXT: uzp2 p0.d, p0.d, p1.d ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.uzp2.b64( %a, %b) ret %out } define @uzp2_i8( %a, %b) { ; CHECK-LABEL: uzp2_i8: ; CHECK: // %bb.0: ; CHECK-NEXT: uzp2 z0.b, z0.b, z1.b ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.uzp2.nxv16i8( %a, %b) ret %out } define @uzp2_i16( %a, %b) { ; CHECK-LABEL: uzp2_i16: ; CHECK: // %bb.0: ; CHECK-NEXT: uzp2 z0.h, z0.h, z1.h ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.uzp2.nxv8i16( %a, %b) ret %out } define @uzp2_i32( %a, %b) { ; CHECK-LABEL: uzp2_i32: ; CHECK: // %bb.0: ; CHECK-NEXT: uzp2 z0.s, z0.s, z1.s ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.uzp2.nxv4i32( %a, %b) ret %out } define @uzp2_i64( %a, %b) { ; CHECK-LABEL: uzp2_i64: ; CHECK: // %bb.0: ; CHECK-NEXT: uzp2 z0.d, z0.d, z1.d ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.uzp2.nxv2i64( %a, %b) ret %out } define @uzp2_f16_v2( %a, %b) { ; CHECK-LABEL: uzp2_f16_v2: ; CHECK: // %bb.0: ; CHECK-NEXT: uzp2 z0.d, z0.d, z1.d ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.uzp2.nxv2f16( %a, %b) ret %out } define @uzp2_f16_v4( %a, %b) { ; CHECK-LABEL: uzp2_f16_v4: ; CHECK: // %bb.0: ; CHECK-NEXT: uzp2 z0.s, z0.s, z1.s ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.uzp2.nxv4f16( %a, %b) ret %out } define @uzp2_bf16( %a, %b) #0 { ; CHECK-LABEL: uzp2_bf16: ; CHECK: // %bb.0: ; CHECK-NEXT: uzp2 z0.h, z0.h, z1.h ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.uzp2.nxv8bf16( %a, %b) ret %out } define @uzp2_f16( %a, %b) { ; CHECK-LABEL: uzp2_f16: ; CHECK: // %bb.0: ; CHECK-NEXT: uzp2 z0.h, z0.h, z1.h ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.uzp2.nxv8f16( %a, %b) ret %out } define @uzp2_f32_v2( %a, %b) { ; CHECK-LABEL: uzp2_f32_v2: ; CHECK: // %bb.0: ; CHECK-NEXT: uzp2 z0.d, z0.d, z1.d ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.uzp2.nxv2f32( %a, %b) ret %out } define @uzp2_f32( %a, %b) { ; CHECK-LABEL: uzp2_f32: ; CHECK: // %bb.0: ; CHECK-NEXT: uzp2 z0.s, z0.s, z1.s ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.uzp2.nxv4f32( %a, %b) ret %out } define @uzp2_f64( %a, %b) { ; CHECK-LABEL: uzp2_f64: ; CHECK: // %bb.0: ; CHECK-NEXT: uzp2 z0.d, z0.d, z1.d ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.uzp2.nxv2f64( %a, %b) ret %out } ; ; ZIP1 ; define @zip1_nxv16i1( %a, %b) { ; CHECK-LABEL: zip1_nxv16i1: ; CHECK: // %bb.0: ; CHECK-NEXT: zip1 p0.b, p0.b, p1.b ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.zip1.nxv16i1( %a, %b) ret %out } define @zip1_nxv8i1( %a, %b) { ; CHECK-LABEL: zip1_nxv8i1: ; CHECK: // %bb.0: ; CHECK-NEXT: zip1 p0.h, p0.h, p1.h ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.zip1.nxv8i1( %a, %b) ret %out } define @zip1_nxv4i1( %a, %b) { ; CHECK-LABEL: zip1_nxv4i1: ; CHECK: // %bb.0: ; CHECK-NEXT: zip1 p0.s, p0.s, p1.s ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.zip1.nxv4i1( %a, %b) ret %out } define @zip1_nxv2i1( %a, %b) { ; CHECK-LABEL: zip1_nxv2i1: ; CHECK: // %bb.0: ; CHECK-NEXT: zip1 p0.d, p0.d, p1.d ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.zip1.nxv2i1( %a, %b) ret %out } define @zip1_b16( %a, %b) { ; CHECK-LABEL: zip1_b16: ; CHECK: // %bb.0: ; CHECK-NEXT: zip1 p0.h, p0.h, p1.h ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.zip1.b16( %a, %b) ret %out } define @zip1_b32( %a, %b) { ; CHECK-LABEL: zip1_b32: ; CHECK: // %bb.0: ; CHECK-NEXT: zip1 p0.s, p0.s, p1.s ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.zip1.b32( %a, %b) ret %out } define @zip1_b64( %a, %b) { ; CHECK-LABEL: zip1_b64: ; CHECK: // %bb.0: ; CHECK-NEXT: zip1 p0.d, p0.d, p1.d ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.zip1.b64( %a, %b) ret %out } define @zip1_i8( %a, %b) { ; CHECK-LABEL: zip1_i8: ; CHECK: // %bb.0: ; CHECK-NEXT: zip1 z0.b, z0.b, z1.b ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.zip1.nxv16i8( %a, %b) ret %out } define @zip1_i16( %a, %b) { ; CHECK-LABEL: zip1_i16: ; CHECK: // %bb.0: ; CHECK-NEXT: zip1 z0.h, z0.h, z1.h ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.zip1.nxv8i16( %a, %b) ret %out } define @zip1_i32( %a, %b) { ; CHECK-LABEL: zip1_i32: ; CHECK: // %bb.0: ; CHECK-NEXT: zip1 z0.s, z0.s, z1.s ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.zip1.nxv4i32( %a, %b) ret %out } define @zip1_i64( %a, %b) { ; CHECK-LABEL: zip1_i64: ; CHECK: // %bb.0: ; CHECK-NEXT: zip1 z0.d, z0.d, z1.d ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.zip1.nxv2i64( %a, %b) ret %out } define @zip1_f16_v2( %a, %b) { ; CHECK-LABEL: zip1_f16_v2: ; CHECK: // %bb.0: ; CHECK-NEXT: zip1 z0.d, z0.d, z1.d ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.zip1.nxv2f16( %a, %b) ret %out } define @zip1_f16_v4( %a, %b) { ; CHECK-LABEL: zip1_f16_v4: ; CHECK: // %bb.0: ; CHECK-NEXT: zip1 z0.s, z0.s, z1.s ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.zip1.nxv4f16( %a, %b) ret %out } define @zip1_bf16( %a, %b) #0 { ; CHECK-LABEL: zip1_bf16: ; CHECK: // %bb.0: ; CHECK-NEXT: zip1 z0.h, z0.h, z1.h ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.zip1.nxv8bf16( %a, %b) ret %out } define @zip1_f16( %a, %b) { ; CHECK-LABEL: zip1_f16: ; CHECK: // %bb.0: ; CHECK-NEXT: zip1 z0.h, z0.h, z1.h ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.zip1.nxv8f16( %a, %b) ret %out } define @zip1_f32_v2( %a, %b) { ; CHECK-LABEL: zip1_f32_v2: ; CHECK: // %bb.0: ; CHECK-NEXT: zip1 z0.d, z0.d, z1.d ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.zip1.nxv2f32( %a, %b) ret %out } define @zip1_f32( %a, %b) { ; CHECK-LABEL: zip1_f32: ; CHECK: // %bb.0: ; CHECK-NEXT: zip1 z0.s, z0.s, z1.s ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.zip1.nxv4f32( %a, %b) ret %out } define @zip1_f64( %a, %b) { ; CHECK-LABEL: zip1_f64: ; CHECK: // %bb.0: ; CHECK-NEXT: zip1 z0.d, z0.d, z1.d ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.zip1.nxv2f64( %a, %b) ret %out } ; ; ZIP2 ; define @zip2_nxv16i1( %a, %b) { ; CHECK-LABEL: zip2_nxv16i1: ; CHECK: // %bb.0: ; CHECK-NEXT: zip2 p0.b, p0.b, p1.b ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.zip2.nxv16i1( %a, %b) ret %out } define @zip2_nxv8i1( %a, %b) { ; CHECK-LABEL: zip2_nxv8i1: ; CHECK: // %bb.0: ; CHECK-NEXT: zip2 p0.h, p0.h, p1.h ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.zip2.nxv8i1( %a, %b) ret %out } define @zip2_nxv4i1( %a, %b) { ; CHECK-LABEL: zip2_nxv4i1: ; CHECK: // %bb.0: ; CHECK-NEXT: zip2 p0.s, p0.s, p1.s ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.zip2.nxv4i1( %a, %b) ret %out } define @zip2_nxv2i1( %a, %b) { ; CHECK-LABEL: zip2_nxv2i1: ; CHECK: // %bb.0: ; CHECK-NEXT: zip2 p0.d, p0.d, p1.d ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.zip2.nxv2i1( %a, %b) ret %out } define @zip2_b16( %a, %b) { ; CHECK-LABEL: zip2_b16: ; CHECK: // %bb.0: ; CHECK-NEXT: zip2 p0.h, p0.h, p1.h ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.zip2.b16( %a, %b) ret %out } define @zip2_b32( %a, %b) { ; CHECK-LABEL: zip2_b32: ; CHECK: // %bb.0: ; CHECK-NEXT: zip2 p0.s, p0.s, p1.s ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.zip2.b32( %a, %b) ret %out } define @zip2_b64( %a, %b) { ; CHECK-LABEL: zip2_b64: ; CHECK: // %bb.0: ; CHECK-NEXT: zip2 p0.d, p0.d, p1.d ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.zip2.b64( %a, %b) ret %out } define @zip2_i8( %a, %b) { ; CHECK-LABEL: zip2_i8: ; CHECK: // %bb.0: ; CHECK-NEXT: zip2 z0.b, z0.b, z1.b ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.zip2.nxv16i8( %a, %b) ret %out } define @zip2_i16( %a, %b) { ; CHECK-LABEL: zip2_i16: ; CHECK: // %bb.0: ; CHECK-NEXT: zip2 z0.h, z0.h, z1.h ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.zip2.nxv8i16( %a, %b) ret %out } define @zip2_i32( %a, %b) { ; CHECK-LABEL: zip2_i32: ; CHECK: // %bb.0: ; CHECK-NEXT: zip2 z0.s, z0.s, z1.s ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.zip2.nxv4i32( %a, %b) ret %out } define @zip2_i64( %a, %b) { ; CHECK-LABEL: zip2_i64: ; CHECK: // %bb.0: ; CHECK-NEXT: zip2 z0.d, z0.d, z1.d ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.zip2.nxv2i64( %a, %b) ret %out } define @zip2_f16_v2( %a, %b) { ; CHECK-LABEL: zip2_f16_v2: ; CHECK: // %bb.0: ; CHECK-NEXT: zip2 z0.d, z0.d, z1.d ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.zip2.nxv2f16( %a, %b) ret %out } define @zip2_f16_v4( %a, %b) { ; CHECK-LABEL: zip2_f16_v4: ; CHECK: // %bb.0: ; CHECK-NEXT: zip2 z0.s, z0.s, z1.s ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.zip2.nxv4f16( %a, %b) ret %out } define @zip2_bf16( %a, %b) #0 { ; CHECK-LABEL: zip2_bf16: ; CHECK: // %bb.0: ; CHECK-NEXT: zip2 z0.h, z0.h, z1.h ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.zip2.nxv8bf16( %a, %b) ret %out } define @zip2_f16( %a, %b) { ; CHECK-LABEL: zip2_f16: ; CHECK: // %bb.0: ; CHECK-NEXT: zip2 z0.h, z0.h, z1.h ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.zip2.nxv8f16( %a, %b) ret %out } define @zip2_f32_v2( %a, %b) { ; CHECK-LABEL: zip2_f32_v2: ; CHECK: // %bb.0: ; CHECK-NEXT: zip2 z0.d, z0.d, z1.d ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.zip2.nxv2f32( %a, %b) ret %out } define @zip2_f32( %a, %b) { ; CHECK-LABEL: zip2_f32: ; CHECK: // %bb.0: ; CHECK-NEXT: zip2 z0.s, z0.s, z1.s ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.zip2.nxv4f32( %a, %b) ret %out } define @zip2_f64( %a, %b) { ; CHECK-LABEL: zip2_f64: ; CHECK: // %bb.0: ; CHECK-NEXT: zip2 z0.d, z0.d, z1.d ; CHECK-NEXT: ret %out = call @llvm.aarch64.sve.zip2.nxv2f64( %a, %b) ret %out } declare @llvm.aarch64.sve.clasta.nxv16i8(, , ) declare @llvm.aarch64.sve.clasta.nxv8i16(, , ) declare @llvm.aarch64.sve.clasta.nxv4i32(, , ) declare @llvm.aarch64.sve.clasta.nxv2i64(, , ) declare @llvm.aarch64.sve.clasta.nxv8f16(, , ) declare @llvm.aarch64.sve.clasta.nxv8bf16(, , ) declare @llvm.aarch64.sve.clasta.nxv4f32(, , ) declare @llvm.aarch64.sve.clasta.nxv2f64(, , ) declare i8 @llvm.aarch64.sve.clasta.n.nxv16i8(, i8, ) declare i16 @llvm.aarch64.sve.clasta.n.nxv8i16(, i16, ) declare i32 @llvm.aarch64.sve.clasta.n.nxv4i32(, i32, ) declare i64 @llvm.aarch64.sve.clasta.n.nxv2i64(, i64, ) declare half @llvm.aarch64.sve.clasta.n.nxv8f16(, half, ) declare bfloat @llvm.aarch64.sve.clasta.n.nxv8bf16(, bfloat, ) declare float @llvm.aarch64.sve.clasta.n.nxv4f32(, float, ) declare double @llvm.aarch64.sve.clasta.n.nxv2f64(, double, ) declare @llvm.aarch64.sve.clastb.nxv16i8(, , ) declare @llvm.aarch64.sve.clastb.nxv8i16(, , ) declare @llvm.aarch64.sve.clastb.nxv4i32(, , ) declare @llvm.aarch64.sve.clastb.nxv2i64(, , ) declare @llvm.aarch64.sve.clastb.nxv8f16(, , ) declare @llvm.aarch64.sve.clastb.nxv8bf16(, , ) declare @llvm.aarch64.sve.clastb.nxv4f32(, , ) declare @llvm.aarch64.sve.clastb.nxv2f64(, , ) declare i8 @llvm.aarch64.sve.clastb.n.nxv16i8(, i8, ) declare i16 @llvm.aarch64.sve.clastb.n.nxv8i16(, i16, ) declare i32 @llvm.aarch64.sve.clastb.n.nxv4i32(, i32, ) declare i64 @llvm.aarch64.sve.clastb.n.nxv2i64(, i64, ) declare half @llvm.aarch64.sve.clastb.n.nxv8f16(, half, ) declare bfloat @llvm.aarch64.sve.clastb.n.nxv8bf16(, bfloat, ) declare float @llvm.aarch64.sve.clastb.n.nxv4f32(, float, ) declare double @llvm.aarch64.sve.clastb.n.nxv2f64(, double, ) declare @llvm.aarch64.sve.compact.nxv4i32(, ) declare @llvm.aarch64.sve.compact.nxv2i64(, ) declare @llvm.aarch64.sve.compact.nxv4f32(, ) declare @llvm.aarch64.sve.compact.nxv2f64(, ) declare @llvm.aarch64.sve.dupq.lane.nxv16i8(, i64) declare @llvm.aarch64.sve.dupq.lane.nxv8i16(, i64) declare @llvm.aarch64.sve.dupq.lane.nxv4i32(, i64) declare @llvm.aarch64.sve.dupq.lane.nxv2i64(, i64) declare @llvm.aarch64.sve.dupq.lane.nxv8f16(, i64) declare @llvm.aarch64.sve.dupq.lane.nxv8bf16(, i64) declare @llvm.aarch64.sve.dupq.lane.nxv4f32(, i64) declare @llvm.aarch64.sve.dupq.lane.nxv2f64(, i64) declare @llvm.aarch64.sve.ext.nxv16i8(, , i32) declare @llvm.aarch64.sve.ext.nxv8i16(, , i32) declare @llvm.aarch64.sve.ext.nxv4i32(, , i32) declare @llvm.aarch64.sve.ext.nxv2i64(, , i32) declare @llvm.aarch64.sve.ext.nxv8bf16(, , i32) declare @llvm.aarch64.sve.ext.nxv8f16(, , i32) declare @llvm.aarch64.sve.ext.nxv4f32(, , i32) declare @llvm.aarch64.sve.ext.nxv2f64(, , i32) declare i8 @llvm.aarch64.sve.lasta.nxv16i8(, ) declare i16 @llvm.aarch64.sve.lasta.nxv8i16(, ) declare i32 @llvm.aarch64.sve.lasta.nxv4i32(, ) declare i64 @llvm.aarch64.sve.lasta.nxv2i64(, ) declare half @llvm.aarch64.sve.lasta.nxv8f16(, ) declare bfloat @llvm.aarch64.sve.lasta.nxv8bf16(, ) declare float @llvm.aarch64.sve.lasta.nxv2f32(, ) declare float @llvm.aarch64.sve.lasta.nxv4f32(, ) declare double @llvm.aarch64.sve.lasta.nxv2f64(, ) declare i8 @llvm.aarch64.sve.lastb.nxv16i8(, ) declare i16 @llvm.aarch64.sve.lastb.nxv8i16(, ) declare i32 @llvm.aarch64.sve.lastb.nxv4i32(, ) declare i64 @llvm.aarch64.sve.lastb.nxv2i64(, ) declare half @llvm.aarch64.sve.lastb.nxv8f16(, ) declare bfloat @llvm.aarch64.sve.lastb.nxv8bf16(, ) declare float @llvm.aarch64.sve.lastb.nxv2f32(, ) declare float @llvm.aarch64.sve.lastb.nxv4f32(, ) declare double @llvm.aarch64.sve.lastb.nxv2f64(, ) declare @llvm.aarch64.sve.rev.nxv16i1() declare @llvm.aarch64.sve.rev.nxv8i1() declare @llvm.aarch64.sve.rev.nxv4i1() declare @llvm.aarch64.sve.rev.nxv2i1() declare @llvm.aarch64.sve.rev.nxv16i8() declare @llvm.aarch64.sve.rev.nxv8i16() declare @llvm.aarch64.sve.rev.nxv4i32() declare @llvm.aarch64.sve.rev.nxv2i64() declare @llvm.aarch64.sve.rev.nxv8bf16() declare @llvm.aarch64.sve.rev.nxv8f16() declare @llvm.aarch64.sve.rev.nxv4f32() declare @llvm.aarch64.sve.rev.nxv2f64() declare @llvm.aarch64.sve.rev.b16() declare @llvm.aarch64.sve.rev.b32() declare @llvm.aarch64.sve.rev.b64() declare @llvm.aarch64.sve.splice.nxv16i8(, , ) declare @llvm.aarch64.sve.splice.nxv8i16(, , ) declare @llvm.aarch64.sve.splice.nxv4i32(, , ) declare @llvm.aarch64.sve.splice.nxv2i64(, , ) declare @llvm.aarch64.sve.splice.nxv8bf16(, , ) declare @llvm.aarch64.sve.splice.nxv8f16(, , ) declare @llvm.aarch64.sve.splice.nxv4f32(, , ) declare @llvm.aarch64.sve.splice.nxv2f64(, , ) declare @llvm.aarch64.sve.sunpkhi.nxv8i16() declare @llvm.aarch64.sve.sunpkhi.nxv4i32() declare @llvm.aarch64.sve.sunpkhi.nxv2i64() declare @llvm.aarch64.sve.sunpklo.nxv8i16() declare @llvm.aarch64.sve.sunpklo.nxv4i32() declare @llvm.aarch64.sve.sunpklo.nxv2i64() declare @llvm.aarch64.sve.tbl.nxv16i8(, ) declare @llvm.aarch64.sve.tbl.nxv8i16(, ) declare @llvm.aarch64.sve.tbl.nxv4i32(, ) declare @llvm.aarch64.sve.tbl.nxv2i64(, ) declare @llvm.aarch64.sve.tbl.nxv8f16(, ) declare @llvm.aarch64.sve.tbl.nxv8bf16(, ) declare @llvm.aarch64.sve.tbl.nxv4f32(, ) declare @llvm.aarch64.sve.tbl.nxv2f64(, ) declare @llvm.aarch64.sve.uunpkhi.nxv8i16() declare @llvm.aarch64.sve.uunpkhi.nxv4i32() declare @llvm.aarch64.sve.uunpkhi.nxv2i64() declare @llvm.aarch64.sve.uunpklo.nxv8i16() declare @llvm.aarch64.sve.uunpklo.nxv4i32() declare @llvm.aarch64.sve.uunpklo.nxv2i64() declare @llvm.aarch64.sve.trn1.nxv16i1(, ) declare @llvm.aarch64.sve.trn1.nxv8i1(, ) declare @llvm.aarch64.sve.trn1.nxv4i1(, ) declare @llvm.aarch64.sve.trn1.nxv2i1(, ) declare @llvm.aarch64.sve.trn1.nxv16i8(, ) declare @llvm.aarch64.sve.trn1.nxv8i16(, ) declare @llvm.aarch64.sve.trn1.nxv4i32(, ) declare @llvm.aarch64.sve.trn1.nxv2i64(, ) declare @llvm.aarch64.sve.trn1.nxv2f16(, ) declare @llvm.aarch64.sve.trn1.nxv4f16(, ) declare @llvm.aarch64.sve.trn1.nxv8bf16(, ) declare @llvm.aarch64.sve.trn1.nxv8f16(, ) declare @llvm.aarch64.sve.trn1.nxv2f32(, ) declare @llvm.aarch64.sve.trn1.nxv4f32(, ) declare @llvm.aarch64.sve.trn1.nxv2f64(, ) declare @llvm.aarch64.sve.trn1.b16(, ) declare @llvm.aarch64.sve.trn1.b32(, ) declare @llvm.aarch64.sve.trn1.b64(, ) declare @llvm.aarch64.sve.trn2.nxv16i1(, ) declare @llvm.aarch64.sve.trn2.nxv8i1(, ) declare @llvm.aarch64.sve.trn2.nxv4i1(, ) declare @llvm.aarch64.sve.trn2.nxv2i1(, ) declare @llvm.aarch64.sve.trn2.nxv16i8(, ) declare @llvm.aarch64.sve.trn2.nxv8i16(, ) declare @llvm.aarch64.sve.trn2.nxv4i32(, ) declare @llvm.aarch64.sve.trn2.nxv2i64(, ) declare @llvm.aarch64.sve.trn2.nxv2f16(, ) declare @llvm.aarch64.sve.trn2.nxv4f16(, ) declare @llvm.aarch64.sve.trn2.nxv8bf16(, ) declare @llvm.aarch64.sve.trn2.nxv8f16(, ) declare @llvm.aarch64.sve.trn2.nxv2f32(, ) declare @llvm.aarch64.sve.trn2.nxv4f32(, ) declare @llvm.aarch64.sve.trn2.nxv2f64(, ) declare @llvm.aarch64.sve.trn2.b16(, ) declare @llvm.aarch64.sve.trn2.b32(, ) declare @llvm.aarch64.sve.trn2.b64(, ) declare @llvm.aarch64.sve.uzp1.nxv16i1(, ) declare @llvm.aarch64.sve.uzp1.nxv8i1(, ) declare @llvm.aarch64.sve.uzp1.nxv4i1(, ) declare @llvm.aarch64.sve.uzp1.nxv2i1(, ) declare @llvm.aarch64.sve.uzp1.nxv16i8(, ) declare @llvm.aarch64.sve.uzp1.nxv8i16(, ) declare @llvm.aarch64.sve.uzp1.nxv4i32(, ) declare @llvm.aarch64.sve.uzp1.nxv2i64(, ) declare @llvm.aarch64.sve.uzp1.nxv2f16(, ) declare @llvm.aarch64.sve.uzp1.nxv4f16(, ) declare @llvm.aarch64.sve.uzp1.nxv8bf16(, ) declare @llvm.aarch64.sve.uzp1.nxv8f16(, ) declare @llvm.aarch64.sve.uzp1.nxv2f32(, ) declare @llvm.aarch64.sve.uzp1.nxv4f32(, ) declare @llvm.aarch64.sve.uzp1.nxv2f64(, ) declare @llvm.aarch64.sve.uzp1.b16(, ) declare @llvm.aarch64.sve.uzp1.b32(, ) declare @llvm.aarch64.sve.uzp1.b64(, ) declare @llvm.aarch64.sve.uzp2.nxv16i1(, ) declare @llvm.aarch64.sve.uzp2.nxv8i1(, ) declare @llvm.aarch64.sve.uzp2.nxv4i1(, ) declare @llvm.aarch64.sve.uzp2.nxv2i1(, ) declare @llvm.aarch64.sve.uzp2.nxv16i8(, ) declare @llvm.aarch64.sve.uzp2.nxv8i16(, ) declare @llvm.aarch64.sve.uzp2.nxv4i32(, ) declare @llvm.aarch64.sve.uzp2.nxv2i64(, ) declare @llvm.aarch64.sve.uzp2.nxv2f16(, ) declare @llvm.aarch64.sve.uzp2.nxv4f16(, ) declare @llvm.aarch64.sve.uzp2.nxv8bf16(, ) declare @llvm.aarch64.sve.uzp2.nxv8f16(, ) declare @llvm.aarch64.sve.uzp2.nxv2f32(, ) declare @llvm.aarch64.sve.uzp2.nxv4f32(, ) declare @llvm.aarch64.sve.uzp2.nxv2f64(, ) declare @llvm.aarch64.sve.uzp2.b16(, ) declare @llvm.aarch64.sve.uzp2.b32(, ) declare @llvm.aarch64.sve.uzp2.b64(, ) declare @llvm.aarch64.sve.zip1.nxv16i1(, ) declare @llvm.aarch64.sve.zip1.nxv8i1(, ) declare @llvm.aarch64.sve.zip1.nxv4i1(, ) declare @llvm.aarch64.sve.zip1.nxv2i1(, ) declare @llvm.aarch64.sve.zip1.nxv16i8(, ) declare @llvm.aarch64.sve.zip1.nxv8i16(, ) declare @llvm.aarch64.sve.zip1.nxv4i32(, ) declare @llvm.aarch64.sve.zip1.nxv2i64(, ) declare @llvm.aarch64.sve.zip1.nxv2f16(, ) declare @llvm.aarch64.sve.zip1.nxv4f16(, ) declare @llvm.aarch64.sve.zip1.nxv8bf16(, ) declare @llvm.aarch64.sve.zip1.nxv8f16(, ) declare @llvm.aarch64.sve.zip1.nxv2f32(, ) declare @llvm.aarch64.sve.zip1.nxv4f32(, ) declare @llvm.aarch64.sve.zip1.nxv2f64(, ) declare @llvm.aarch64.sve.zip1.b16(, ) declare @llvm.aarch64.sve.zip1.b32(, ) declare @llvm.aarch64.sve.zip1.b64(, ) declare @llvm.aarch64.sve.zip2.nxv16i1(, ) declare @llvm.aarch64.sve.zip2.nxv8i1(, ) declare @llvm.aarch64.sve.zip2.nxv4i1(, ) declare @llvm.aarch64.sve.zip2.nxv2i1(, ) declare @llvm.aarch64.sve.zip2.nxv16i8(, ) declare @llvm.aarch64.sve.zip2.nxv8i16(, ) declare @llvm.aarch64.sve.zip2.nxv4i32(, ) declare @llvm.aarch64.sve.zip2.nxv2i64(, ) declare @llvm.aarch64.sve.zip2.nxv2f16(, ) declare @llvm.aarch64.sve.zip2.nxv4f16(, ) declare @llvm.aarch64.sve.zip2.nxv8bf16(, ) declare @llvm.aarch64.sve.zip2.nxv8f16(, ) declare @llvm.aarch64.sve.zip2.nxv2f32(, ) declare @llvm.aarch64.sve.zip2.nxv4f32(, ) declare @llvm.aarch64.sve.zip2.nxv2f64(, ) declare @llvm.aarch64.sve.zip2.b16(, ) declare @llvm.aarch64.sve.zip2.b32(, ) declare @llvm.aarch64.sve.zip2.b64(, ) declare @llvm.vector.insert.nxv2f64.v2f64(, <2 x double>, i64) declare @llvm.vector.insert.nxv4f32.v4f32(, <4 x float>, i64) declare @llvm.vector.insert.nxv8f16.v8f16(, <8 x half>, i64) declare @llvm.vector.insert.nxv2i64.v2i64(, <2 x i64>, i64) declare @llvm.vector.insert.nxv4i32.v4i32(, <4 x i32>, i64) declare @llvm.vector.insert.nxv8i16.v8i16(, <8 x i16>, i64) declare @llvm.vector.insert.nxv16i8.v16i8(, <16 x i8>, i64) declare @llvm.vector.insert.nxv8bf16.v8bf16(, <8 x bfloat>, i64) ; +bf16 is required for the bfloat version. attributes #0 = { "target-features"="+sve,+bf16" }