
This reverts commit 9c319d5bb40785c969d2af76535ca62448dfafa7. Some issues were discovered with the bootstrap builds, which seem like they were caused by this commit. I'm reverting to investigate.
400 lines
14 KiB
LLVM
400 lines
14 KiB
LLVM
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
|
|
; RUN: llc -mtriple=aarch64-linux-gnu -mattr=+sve < %s | FileCheck %s
|
|
|
|
; FADDV
|
|
|
|
define half @faddv_nxv2f16(half %init, <vscale x 2 x half> %a) {
|
|
; CHECK-LABEL: faddv_nxv2f16:
|
|
; CHECK: // %bb.0:
|
|
; CHECK-NEXT: ptrue p0.d
|
|
; CHECK-NEXT: faddv h1, p0, z1.h
|
|
; CHECK-NEXT: fadd h0, h0, h1
|
|
; CHECK-NEXT: ret
|
|
%res = call fast half @llvm.vector.reduce.fadd.nxv2f16(half %init, <vscale x 2 x half> %a)
|
|
ret half %res
|
|
}
|
|
|
|
define half @faddv_nxv4f16(half %init, <vscale x 4 x half> %a) {
|
|
; CHECK-LABEL: faddv_nxv4f16:
|
|
; CHECK: // %bb.0:
|
|
; CHECK-NEXT: ptrue p0.s
|
|
; CHECK-NEXT: faddv h1, p0, z1.h
|
|
; CHECK-NEXT: fadd h0, h0, h1
|
|
; CHECK-NEXT: ret
|
|
%res = call fast half @llvm.vector.reduce.fadd.nxv4f16(half %init, <vscale x 4 x half> %a)
|
|
ret half %res
|
|
}
|
|
|
|
define half @faddv_nxv8f16(half %init, <vscale x 8 x half> %a) {
|
|
; CHECK-LABEL: faddv_nxv8f16:
|
|
; CHECK: // %bb.0:
|
|
; CHECK-NEXT: ptrue p0.h
|
|
; CHECK-NEXT: faddv h1, p0, z1.h
|
|
; CHECK-NEXT: fadd h0, h0, h1
|
|
; CHECK-NEXT: ret
|
|
%res = call fast half @llvm.vector.reduce.fadd.nxv8f16(half %init, <vscale x 8 x half> %a)
|
|
ret half %res
|
|
}
|
|
|
|
define float @faddv_nxv2f32(float %init, <vscale x 2 x float> %a) {
|
|
; CHECK-LABEL: faddv_nxv2f32:
|
|
; CHECK: // %bb.0:
|
|
; CHECK-NEXT: ptrue p0.d
|
|
; CHECK-NEXT: faddv s1, p0, z1.s
|
|
; CHECK-NEXT: fadd s0, s0, s1
|
|
; CHECK-NEXT: ret
|
|
%res = call fast float @llvm.vector.reduce.fadd.nxv2f32(float %init, <vscale x 2 x float> %a)
|
|
ret float %res
|
|
}
|
|
|
|
define float @faddv_nxv4f32(float %init, <vscale x 4 x float> %a) {
|
|
; CHECK-LABEL: faddv_nxv4f32:
|
|
; CHECK: // %bb.0:
|
|
; CHECK-NEXT: ptrue p0.s
|
|
; CHECK-NEXT: faddv s1, p0, z1.s
|
|
; CHECK-NEXT: fadd s0, s0, s1
|
|
; CHECK-NEXT: ret
|
|
%res = call fast float @llvm.vector.reduce.fadd.nxv4f32(float %init, <vscale x 4 x float> %a)
|
|
ret float %res
|
|
}
|
|
|
|
define double @faddv_nxv2f64(double %init, <vscale x 2 x double> %a) {
|
|
; CHECK-LABEL: faddv_nxv2f64:
|
|
; CHECK: // %bb.0:
|
|
; CHECK-NEXT: ptrue p0.d
|
|
; CHECK-NEXT: faddv d1, p0, z1.d
|
|
; CHECK-NEXT: fadd d0, d0, d1
|
|
; CHECK-NEXT: ret
|
|
%res = call fast double @llvm.vector.reduce.fadd.nxv2f64(double %init, <vscale x 2 x double> %a)
|
|
ret double %res
|
|
}
|
|
|
|
; FMAXNMV
|
|
|
|
define half @fmaxv_nxv2f16(<vscale x 2 x half> %a) {
|
|
; CHECK-LABEL: fmaxv_nxv2f16:
|
|
; CHECK: // %bb.0:
|
|
; CHECK-NEXT: ptrue p0.d
|
|
; CHECK-NEXT: fmaxnmv h0, p0, z0.h
|
|
; CHECK-NEXT: // kill: def $h0 killed $h0 killed $z0
|
|
; CHECK-NEXT: ret
|
|
%res = call half @llvm.vector.reduce.fmax.nxv2f16(<vscale x 2 x half> %a)
|
|
ret half %res
|
|
}
|
|
|
|
define half @fmaxv_nxv4f16(<vscale x 4 x half> %a) {
|
|
; CHECK-LABEL: fmaxv_nxv4f16:
|
|
; CHECK: // %bb.0:
|
|
; CHECK-NEXT: ptrue p0.s
|
|
; CHECK-NEXT: fmaxnmv h0, p0, z0.h
|
|
; CHECK-NEXT: // kill: def $h0 killed $h0 killed $z0
|
|
; CHECK-NEXT: ret
|
|
%res = call half @llvm.vector.reduce.fmax.nxv4f16(<vscale x 4 x half> %a)
|
|
ret half %res
|
|
}
|
|
|
|
define half @fmaxv_nxv8f16(<vscale x 8 x half> %a) {
|
|
; CHECK-LABEL: fmaxv_nxv8f16:
|
|
; CHECK: // %bb.0:
|
|
; CHECK-NEXT: ptrue p0.h
|
|
; CHECK-NEXT: fmaxnmv h0, p0, z0.h
|
|
; CHECK-NEXT: // kill: def $h0 killed $h0 killed $z0
|
|
; CHECK-NEXT: ret
|
|
%res = call half @llvm.vector.reduce.fmax.nxv8f16(<vscale x 8 x half> %a)
|
|
ret half %res
|
|
}
|
|
|
|
define float @fmaxv_nxv2f32(<vscale x 2 x float> %a) {
|
|
; CHECK-LABEL: fmaxv_nxv2f32:
|
|
; CHECK: // %bb.0:
|
|
; CHECK-NEXT: ptrue p0.d
|
|
; CHECK-NEXT: fmaxnmv s0, p0, z0.s
|
|
; CHECK-NEXT: // kill: def $s0 killed $s0 killed $z0
|
|
; CHECK-NEXT: ret
|
|
%res = call float @llvm.vector.reduce.fmax.nxv2f32(<vscale x 2 x float> %a)
|
|
ret float %res
|
|
}
|
|
|
|
define float @fmaxv_nxv4f32(<vscale x 4 x float> %a) {
|
|
; CHECK-LABEL: fmaxv_nxv4f32:
|
|
; CHECK: // %bb.0:
|
|
; CHECK-NEXT: ptrue p0.s
|
|
; CHECK-NEXT: fmaxnmv s0, p0, z0.s
|
|
; CHECK-NEXT: // kill: def $s0 killed $s0 killed $z0
|
|
; CHECK-NEXT: ret
|
|
%res = call float @llvm.vector.reduce.fmax.nxv4f32(<vscale x 4 x float> %a)
|
|
ret float %res
|
|
}
|
|
|
|
define double @fmaxv_nxv2f64(<vscale x 2 x double> %a) {
|
|
; CHECK-LABEL: fmaxv_nxv2f64:
|
|
; CHECK: // %bb.0:
|
|
; CHECK-NEXT: ptrue p0.d
|
|
; CHECK-NEXT: fmaxnmv d0, p0, z0.d
|
|
; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0
|
|
; CHECK-NEXT: ret
|
|
%res = call double @llvm.vector.reduce.fmax.nxv2f64(<vscale x 2 x double> %a)
|
|
ret double %res
|
|
}
|
|
|
|
; FMINNMV
|
|
|
|
define half @fminv_nxv2f16(<vscale x 2 x half> %a) {
|
|
; CHECK-LABEL: fminv_nxv2f16:
|
|
; CHECK: // %bb.0:
|
|
; CHECK-NEXT: ptrue p0.d
|
|
; CHECK-NEXT: fminnmv h0, p0, z0.h
|
|
; CHECK-NEXT: // kill: def $h0 killed $h0 killed $z0
|
|
; CHECK-NEXT: ret
|
|
%res = call half @llvm.vector.reduce.fmin.nxv2f16(<vscale x 2 x half> %a)
|
|
ret half %res
|
|
}
|
|
|
|
define half @fminv_nxv4f16(<vscale x 4 x half> %a) {
|
|
; CHECK-LABEL: fminv_nxv4f16:
|
|
; CHECK: // %bb.0:
|
|
; CHECK-NEXT: ptrue p0.s
|
|
; CHECK-NEXT: fminnmv h0, p0, z0.h
|
|
; CHECK-NEXT: // kill: def $h0 killed $h0 killed $z0
|
|
; CHECK-NEXT: ret
|
|
%res = call half @llvm.vector.reduce.fmin.nxv4f16(<vscale x 4 x half> %a)
|
|
ret half %res
|
|
}
|
|
|
|
define half @fminv_nxv8f16(<vscale x 8 x half> %a) {
|
|
; CHECK-LABEL: fminv_nxv8f16:
|
|
; CHECK: // %bb.0:
|
|
; CHECK-NEXT: ptrue p0.h
|
|
; CHECK-NEXT: fminnmv h0, p0, z0.h
|
|
; CHECK-NEXT: // kill: def $h0 killed $h0 killed $z0
|
|
; CHECK-NEXT: ret
|
|
%res = call half @llvm.vector.reduce.fmin.nxv8f16(<vscale x 8 x half> %a)
|
|
ret half %res
|
|
}
|
|
|
|
define float @fminv_nxv2f32(<vscale x 2 x float> %a) {
|
|
; CHECK-LABEL: fminv_nxv2f32:
|
|
; CHECK: // %bb.0:
|
|
; CHECK-NEXT: ptrue p0.d
|
|
; CHECK-NEXT: fminnmv s0, p0, z0.s
|
|
; CHECK-NEXT: // kill: def $s0 killed $s0 killed $z0
|
|
; CHECK-NEXT: ret
|
|
%res = call float @llvm.vector.reduce.fmin.nxv2f32(<vscale x 2 x float> %a)
|
|
ret float %res
|
|
}
|
|
|
|
define float @fminv_nxv4f32(<vscale x 4 x float> %a) {
|
|
; CHECK-LABEL: fminv_nxv4f32:
|
|
; CHECK: // %bb.0:
|
|
; CHECK-NEXT: ptrue p0.s
|
|
; CHECK-NEXT: fminnmv s0, p0, z0.s
|
|
; CHECK-NEXT: // kill: def $s0 killed $s0 killed $z0
|
|
; CHECK-NEXT: ret
|
|
%res = call float @llvm.vector.reduce.fmin.nxv4f32(<vscale x 4 x float> %a)
|
|
ret float %res
|
|
}
|
|
|
|
define double @fminv_nxv2f64(<vscale x 2 x double> %a) {
|
|
; CHECK-LABEL: fminv_nxv2f64:
|
|
; CHECK: // %bb.0:
|
|
; CHECK-NEXT: ptrue p0.d
|
|
; CHECK-NEXT: fminnmv d0, p0, z0.d
|
|
; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0
|
|
; CHECK-NEXT: ret
|
|
%res = call double @llvm.vector.reduce.fmin.nxv2f64(<vscale x 2 x double> %a)
|
|
ret double %res
|
|
}
|
|
|
|
|
|
|
|
|
|
; FMAXV
|
|
|
|
define half @fmaximumv_nxv2f16(<vscale x 2 x half> %a) {
|
|
; CHECK-LABEL: fmaximumv_nxv2f16:
|
|
; CHECK: // %bb.0:
|
|
; CHECK-NEXT: ptrue p0.d
|
|
; CHECK-NEXT: fmaxv h0, p0, z0.h
|
|
; CHECK-NEXT: // kill: def $h0 killed $h0 killed $z0
|
|
; CHECK-NEXT: ret
|
|
%res = call half @llvm.vector.reduce.fmaximum.nxv2f16(<vscale x 2 x half> %a)
|
|
ret half %res
|
|
}
|
|
|
|
define half @fmaximumv_nxv4f16(<vscale x 4 x half> %a) {
|
|
; CHECK-LABEL: fmaximumv_nxv4f16:
|
|
; CHECK: // %bb.0:
|
|
; CHECK-NEXT: ptrue p0.s
|
|
; CHECK-NEXT: fmaxv h0, p0, z0.h
|
|
; CHECK-NEXT: // kill: def $h0 killed $h0 killed $z0
|
|
; CHECK-NEXT: ret
|
|
%res = call half @llvm.vector.reduce.fmaximum.nxv4f16(<vscale x 4 x half> %a)
|
|
ret half %res
|
|
}
|
|
|
|
define half @fmaximumv_nxv8f16(<vscale x 8 x half> %a) {
|
|
; CHECK-LABEL: fmaximumv_nxv8f16:
|
|
; CHECK: // %bb.0:
|
|
; CHECK-NEXT: ptrue p0.h
|
|
; CHECK-NEXT: fmaxv h0, p0, z0.h
|
|
; CHECK-NEXT: // kill: def $h0 killed $h0 killed $z0
|
|
; CHECK-NEXT: ret
|
|
%res = call half @llvm.vector.reduce.fmaximum.nxv8f16(<vscale x 8 x half> %a)
|
|
ret half %res
|
|
}
|
|
|
|
define float @fmaximumv_nxv2f32(<vscale x 2 x float> %a) {
|
|
; CHECK-LABEL: fmaximumv_nxv2f32:
|
|
; CHECK: // %bb.0:
|
|
; CHECK-NEXT: ptrue p0.d
|
|
; CHECK-NEXT: fmaxv s0, p0, z0.s
|
|
; CHECK-NEXT: // kill: def $s0 killed $s0 killed $z0
|
|
; CHECK-NEXT: ret
|
|
%res = call float @llvm.vector.reduce.fmaximum.nxv2f32(<vscale x 2 x float> %a)
|
|
ret float %res
|
|
}
|
|
|
|
define float @fmaximumv_nxv4f32(<vscale x 4 x float> %a) {
|
|
; CHECK-LABEL: fmaximumv_nxv4f32:
|
|
; CHECK: // %bb.0:
|
|
; CHECK-NEXT: ptrue p0.s
|
|
; CHECK-NEXT: fmaxv s0, p0, z0.s
|
|
; CHECK-NEXT: // kill: def $s0 killed $s0 killed $z0
|
|
; CHECK-NEXT: ret
|
|
%res = call float @llvm.vector.reduce.fmaximum.nxv4f32(<vscale x 4 x float> %a)
|
|
ret float %res
|
|
}
|
|
|
|
define double @fmaximumv_nxv2f64(<vscale x 2 x double> %a) {
|
|
; CHECK-LABEL: fmaximumv_nxv2f64:
|
|
; CHECK: // %bb.0:
|
|
; CHECK-NEXT: ptrue p0.d
|
|
; CHECK-NEXT: fmaxv d0, p0, z0.d
|
|
; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0
|
|
; CHECK-NEXT: ret
|
|
%res = call double @llvm.vector.reduce.fmaximum.nxv2f64(<vscale x 2 x double> %a)
|
|
ret double %res
|
|
}
|
|
|
|
; FMINV
|
|
|
|
define half @fminimumv_nxv2f16(<vscale x 2 x half> %a) {
|
|
; CHECK-LABEL: fminimumv_nxv2f16:
|
|
; CHECK: // %bb.0:
|
|
; CHECK-NEXT: ptrue p0.d
|
|
; CHECK-NEXT: fminv h0, p0, z0.h
|
|
; CHECK-NEXT: // kill: def $h0 killed $h0 killed $z0
|
|
; CHECK-NEXT: ret
|
|
%res = call half @llvm.vector.reduce.fminimum.nxv2f16(<vscale x 2 x half> %a)
|
|
ret half %res
|
|
}
|
|
|
|
define half @fminimumv_nxv4f16(<vscale x 4 x half> %a) {
|
|
; CHECK-LABEL: fminimumv_nxv4f16:
|
|
; CHECK: // %bb.0:
|
|
; CHECK-NEXT: ptrue p0.s
|
|
; CHECK-NEXT: fminv h0, p0, z0.h
|
|
; CHECK-NEXT: // kill: def $h0 killed $h0 killed $z0
|
|
; CHECK-NEXT: ret
|
|
%res = call half @llvm.vector.reduce.fminimum.nxv4f16(<vscale x 4 x half> %a)
|
|
ret half %res
|
|
}
|
|
|
|
define half @fminimumv_nxv8f16(<vscale x 8 x half> %a) {
|
|
; CHECK-LABEL: fminimumv_nxv8f16:
|
|
; CHECK: // %bb.0:
|
|
; CHECK-NEXT: ptrue p0.h
|
|
; CHECK-NEXT: fminv h0, p0, z0.h
|
|
; CHECK-NEXT: // kill: def $h0 killed $h0 killed $z0
|
|
; CHECK-NEXT: ret
|
|
%res = call half @llvm.vector.reduce.fminimum.nxv8f16(<vscale x 8 x half> %a)
|
|
ret half %res
|
|
}
|
|
|
|
define float @fminimumv_nxv2f32(<vscale x 2 x float> %a) {
|
|
; CHECK-LABEL: fminimumv_nxv2f32:
|
|
; CHECK: // %bb.0:
|
|
; CHECK-NEXT: ptrue p0.d
|
|
; CHECK-NEXT: fminv s0, p0, z0.s
|
|
; CHECK-NEXT: // kill: def $s0 killed $s0 killed $z0
|
|
; CHECK-NEXT: ret
|
|
%res = call float @llvm.vector.reduce.fminimum.nxv2f32(<vscale x 2 x float> %a)
|
|
ret float %res
|
|
}
|
|
|
|
define float @fminimumv_nxv4f32(<vscale x 4 x float> %a) {
|
|
; CHECK-LABEL: fminimumv_nxv4f32:
|
|
; CHECK: // %bb.0:
|
|
; CHECK-NEXT: ptrue p0.s
|
|
; CHECK-NEXT: fminv s0, p0, z0.s
|
|
; CHECK-NEXT: // kill: def $s0 killed $s0 killed $z0
|
|
; CHECK-NEXT: ret
|
|
%res = call float @llvm.vector.reduce.fminimum.nxv4f32(<vscale x 4 x float> %a)
|
|
ret float %res
|
|
}
|
|
|
|
define double @fminimumv_nxv2f64(<vscale x 2 x double> %a) {
|
|
; CHECK-LABEL: fminimumv_nxv2f64:
|
|
; CHECK: // %bb.0:
|
|
; CHECK-NEXT: ptrue p0.d
|
|
; CHECK-NEXT: fminv d0, p0, z0.d
|
|
; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0
|
|
; CHECK-NEXT: ret
|
|
%res = call double @llvm.vector.reduce.fminimum.nxv2f64(<vscale x 2 x double> %a)
|
|
ret double %res
|
|
}
|
|
|
|
define float @fadd_reduct_reassoc_v4v8f32(<vscale x 4 x float> %a, <vscale x 8 x float> %b) {
|
|
; CHECK-LABEL: fadd_reduct_reassoc_v4v8f32:
|
|
; CHECK: // %bb.0:
|
|
; CHECK-NEXT: fadd z1.s, z1.s, z2.s
|
|
; CHECK-NEXT: ptrue p0.s
|
|
; CHECK-NEXT: fadd z0.s, z0.s, z1.s
|
|
; CHECK-NEXT: faddv s0, p0, z0.s
|
|
; CHECK-NEXT: // kill: def $s0 killed $s0 killed $z0
|
|
; CHECK-NEXT: ret
|
|
%r1 = call fast float @llvm.vector.reduce.fadd.nxv4f32(float -0.0, <vscale x 4 x float> %a)
|
|
%r2 = call fast float @llvm.vector.reduce.fadd.nxv8f32(float -0.0, <vscale x 8 x float> %b)
|
|
%r = fadd fast float %r1, %r2
|
|
ret float %r
|
|
}
|
|
|
|
declare half @llvm.vector.reduce.fadd.nxv2f16(half, <vscale x 2 x half>)
|
|
declare half @llvm.vector.reduce.fadd.nxv4f16(half, <vscale x 4 x half>)
|
|
declare half @llvm.vector.reduce.fadd.nxv8f16(half, <vscale x 8 x half>)
|
|
declare half @llvm.vector.reduce.fadd.nxv6f16(half, <vscale x 6 x half>)
|
|
declare half @llvm.vector.reduce.fadd.nxv10f16(half, <vscale x 10 x half>)
|
|
declare half @llvm.vector.reduce.fadd.nxv12f16(half, <vscale x 12 x half>)
|
|
declare float @llvm.vector.reduce.fadd.nxv2f32(float, <vscale x 2 x float>)
|
|
declare float @llvm.vector.reduce.fadd.nxv4f32(float, <vscale x 4 x float>)
|
|
declare float @llvm.vector.reduce.fadd.nxv8f32(float, <vscale x 8 x float>)
|
|
declare double @llvm.vector.reduce.fadd.nxv2f64(double, <vscale x 2 x double>)
|
|
|
|
declare half @llvm.vector.reduce.fmax.nxv2f16(<vscale x 2 x half>)
|
|
declare half @llvm.vector.reduce.fmax.nxv4f16(<vscale x 4 x half>)
|
|
declare half @llvm.vector.reduce.fmax.nxv8f16(<vscale x 8 x half>)
|
|
declare float @llvm.vector.reduce.fmax.nxv2f32(<vscale x 2 x float>)
|
|
declare float @llvm.vector.reduce.fmax.nxv4f32(<vscale x 4 x float>)
|
|
declare double @llvm.vector.reduce.fmax.nxv2f64(<vscale x 2 x double>)
|
|
|
|
declare half @llvm.vector.reduce.fmin.nxv2f16(<vscale x 2 x half>)
|
|
declare half @llvm.vector.reduce.fmin.nxv4f16(<vscale x 4 x half>)
|
|
declare half @llvm.vector.reduce.fmin.nxv8f16(<vscale x 8 x half>)
|
|
declare float @llvm.vector.reduce.fmin.nxv2f32(<vscale x 2 x float>)
|
|
declare float @llvm.vector.reduce.fmin.nxv4f32(<vscale x 4 x float>)
|
|
declare double @llvm.vector.reduce.fmin.nxv2f64(<vscale x 2 x double>)
|
|
|
|
declare half @llvm.vector.reduce.fmaximum.nxv2f16(<vscale x 2 x half>)
|
|
declare half @llvm.vector.reduce.fmaximum.nxv4f16(<vscale x 4 x half>)
|
|
declare half @llvm.vector.reduce.fmaximum.nxv8f16(<vscale x 8 x half>)
|
|
declare float @llvm.vector.reduce.fmaximum.nxv2f32(<vscale x 2 x float>)
|
|
declare float @llvm.vector.reduce.fmaximum.nxv4f32(<vscale x 4 x float>)
|
|
declare double @llvm.vector.reduce.fmaximum.nxv2f64(<vscale x 2 x double>)
|
|
|
|
declare half @llvm.vector.reduce.fminimum.nxv2f16(<vscale x 2 x half>)
|
|
declare half @llvm.vector.reduce.fminimum.nxv4f16(<vscale x 4 x half>)
|
|
declare half @llvm.vector.reduce.fminimum.nxv8f16(<vscale x 8 x half>)
|
|
declare float @llvm.vector.reduce.fminimum.nxv2f32(<vscale x 2 x float>)
|
|
declare float @llvm.vector.reduce.fminimum.nxv4f32(<vscale x 4 x float>)
|
|
declare double @llvm.vector.reduce.fminimum.nxv2f64(<vscale x 2 x double>)
|