1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -mtriple=aarch64--linux-gnu -mattr=+sve < %s | FileCheck %s 3 4; 5; FADDA 6; 7 8define half @fadda_f16(<vscale x 8 x i1> %pg, half %init, <vscale x 8 x half> %a) { 9; CHECK-LABEL: fadda_f16: 10; CHECK: // %bb.0: 11; CHECK-NEXT: // kill: def $h0 killed $h0 def $z0 12; CHECK-NEXT: fadda h0, p0, h0, z1.h 13; CHECK-NEXT: // kill: def $h0 killed $h0 killed $z0 14; CHECK-NEXT: ret 15 %res = call half @llvm.aarch64.sve.fadda.nxv8f16(<vscale x 8 x i1> %pg, 16 half %init, 17 <vscale x 8 x half> %a) 18 ret half %res 19} 20 21define float @fadda_f32(<vscale x 4 x i1> %pg, float %init, <vscale x 4 x float> %a) { 22; CHECK-LABEL: fadda_f32: 23; CHECK: // %bb.0: 24; CHECK-NEXT: // kill: def $s0 killed $s0 def $z0 25; CHECK-NEXT: fadda s0, p0, s0, z1.s 26; CHECK-NEXT: // kill: def $s0 killed $s0 killed $z0 27; CHECK-NEXT: ret 28 %res = call float @llvm.aarch64.sve.fadda.nxv4f32(<vscale x 4 x i1> %pg, 29 float %init, 30 <vscale x 4 x float> %a) 31 ret float %res 32} 33 34define double @fadda_f64(<vscale x 2 x i1> %pg, double %init, <vscale x 2 x double> %a) { 35; CHECK-LABEL: fadda_f64: 36; CHECK: // %bb.0: 37; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 38; CHECK-NEXT: fadda d0, p0, d0, z1.d 39; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 40; CHECK-NEXT: ret 41 %res = call double @llvm.aarch64.sve.fadda.nxv2f64(<vscale x 2 x i1> %pg, 42 double %init, 43 <vscale x 2 x double> %a) 44 ret double %res 45} 46 47; 48; FADDV 49; 50 51define half @faddv_f16(<vscale x 8 x i1> %pg, <vscale x 8 x half> %a) { 52; CHECK-LABEL: faddv_f16: 53; CHECK: // %bb.0: 54; CHECK-NEXT: faddv h0, p0, z0.h 55; CHECK-NEXT: // kill: def $h0 killed $h0 killed $z0 56; CHECK-NEXT: ret 57 %res = call half @llvm.aarch64.sve.faddv.nxv8f16(<vscale x 8 x i1> %pg, 58 <vscale x 8 x half> %a) 59 ret half %res 60} 61 62define float @faddv_f32(<vscale x 4 x i1> %pg, <vscale x 4 x float> %a) { 63; CHECK-LABEL: faddv_f32: 64; CHECK: // %bb.0: 65; CHECK-NEXT: faddv s0, p0, z0.s 66; CHECK-NEXT: // kill: def $s0 killed $s0 killed $z0 67; CHECK-NEXT: ret 68 %res = call float @llvm.aarch64.sve.faddv.nxv4f32(<vscale x 4 x i1> %pg, 69 <vscale x 4 x float> %a) 70 ret float %res 71} 72 73define double @faddv_f64(<vscale x 2 x i1> %pg, <vscale x 2 x double> %a) { 74; CHECK-LABEL: faddv_f64: 75; CHECK: // %bb.0: 76; CHECK-NEXT: faddv d0, p0, z0.d 77; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 78; CHECK-NEXT: ret 79 %res = call double @llvm.aarch64.sve.faddv.nxv2f64(<vscale x 2 x i1> %pg, 80 <vscale x 2 x double> %a) 81 ret double %res 82} 83 84; 85; FMAXNMV 86; 87 88define half @fmaxnmv_f16(<vscale x 8 x i1> %pg, <vscale x 8 x half> %a) { 89; CHECK-LABEL: fmaxnmv_f16: 90; CHECK: // %bb.0: 91; CHECK-NEXT: fmaxnmv h0, p0, z0.h 92; CHECK-NEXT: // kill: def $h0 killed $h0 killed $z0 93; CHECK-NEXT: ret 94 %res = call half @llvm.aarch64.sve.fmaxnmv.nxv8f16(<vscale x 8 x i1> %pg, 95 <vscale x 8 x half> %a) 96 ret half %res 97} 98 99define float @fmaxnmv_f32(<vscale x 4 x i1> %pg, <vscale x 4 x float> %a) { 100; CHECK-LABEL: fmaxnmv_f32: 101; CHECK: // %bb.0: 102; CHECK-NEXT: fmaxnmv s0, p0, z0.s 103; CHECK-NEXT: // kill: def $s0 killed $s0 killed $z0 104; CHECK-NEXT: ret 105 %res = call float @llvm.aarch64.sve.fmaxnmv.nxv4f32(<vscale x 4 x i1> %pg, 106 <vscale x 4 x float> %a) 107 ret float %res 108} 109 110define double @fmaxnmv_f64(<vscale x 2 x i1> %pg, <vscale x 2 x double> %a) { 111; CHECK-LABEL: fmaxnmv_f64: 112; CHECK: // %bb.0: 113; CHECK-NEXT: fmaxnmv d0, p0, z0.d 114; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 115; CHECK-NEXT: ret 116 %res = call double @llvm.aarch64.sve.fmaxnmv.nxv2f64(<vscale x 2 x i1> %pg, 117 <vscale x 2 x double> %a) 118 ret double %res 119} 120 121; 122; FMAXV 123; 124 125define half @fmaxv_f16(<vscale x 8 x i1> %pg, <vscale x 8 x half> %a) { 126; CHECK-LABEL: fmaxv_f16: 127; CHECK: // %bb.0: 128; CHECK-NEXT: fmaxv h0, p0, z0.h 129; CHECK-NEXT: // kill: def $h0 killed $h0 killed $z0 130; CHECK-NEXT: ret 131 %res = call half @llvm.aarch64.sve.fmaxv.nxv8f16(<vscale x 8 x i1> %pg, 132 <vscale x 8 x half> %a) 133 ret half %res 134} 135 136define float @fmaxv_f32(<vscale x 4 x i1> %pg, <vscale x 4 x float> %a) { 137; CHECK-LABEL: fmaxv_f32: 138; CHECK: // %bb.0: 139; CHECK-NEXT: fmaxv s0, p0, z0.s 140; CHECK-NEXT: // kill: def $s0 killed $s0 killed $z0 141; CHECK-NEXT: ret 142 %res = call float @llvm.aarch64.sve.fmaxv.nxv4f32(<vscale x 4 x i1> %pg, 143 <vscale x 4 x float> %a) 144 ret float %res 145} 146 147define double @fmaxv_f64(<vscale x 2 x i1> %pg, <vscale x 2 x double> %a) { 148; CHECK-LABEL: fmaxv_f64: 149; CHECK: // %bb.0: 150; CHECK-NEXT: fmaxv d0, p0, z0.d 151; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 152; CHECK-NEXT: ret 153 %res = call double @llvm.aarch64.sve.fmaxv.nxv2f64(<vscale x 2 x i1> %pg, 154 <vscale x 2 x double> %a) 155 ret double %res 156} 157 158; 159; FMINNMV 160; 161 162define half @fminnmv_f16(<vscale x 8 x i1> %pg, <vscale x 8 x half> %a) { 163; CHECK-LABEL: fminnmv_f16: 164; CHECK: // %bb.0: 165; CHECK-NEXT: fminnmv h0, p0, z0.h 166; CHECK-NEXT: // kill: def $h0 killed $h0 killed $z0 167; CHECK-NEXT: ret 168 %res = call half @llvm.aarch64.sve.fminnmv.nxv8f16(<vscale x 8 x i1> %pg, 169 <vscale x 8 x half> %a) 170 ret half %res 171} 172 173define float @fminnmv_f32(<vscale x 4 x i1> %pg, <vscale x 4 x float> %a) { 174; CHECK-LABEL: fminnmv_f32: 175; CHECK: // %bb.0: 176; CHECK-NEXT: fminnmv s0, p0, z0.s 177; CHECK-NEXT: // kill: def $s0 killed $s0 killed $z0 178; CHECK-NEXT: ret 179 %res = call float @llvm.aarch64.sve.fminnmv.nxv4f32(<vscale x 4 x i1> %pg, 180 <vscale x 4 x float> %a) 181 ret float %res 182} 183 184define double @fminnmv_f64(<vscale x 2 x i1> %pg, <vscale x 2 x double> %a) { 185; CHECK-LABEL: fminnmv_f64: 186; CHECK: // %bb.0: 187; CHECK-NEXT: fminnmv d0, p0, z0.d 188; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 189; CHECK-NEXT: ret 190 %res = call double @llvm.aarch64.sve.fminnmv.nxv2f64(<vscale x 2 x i1> %pg, 191 <vscale x 2 x double> %a) 192 ret double %res 193} 194 195; 196; FMINV 197; 198 199define half @fminv_f16(<vscale x 8 x i1> %pg, <vscale x 8 x half> %a) { 200; CHECK-LABEL: fminv_f16: 201; CHECK: // %bb.0: 202; CHECK-NEXT: fminv h0, p0, z0.h 203; CHECK-NEXT: // kill: def $h0 killed $h0 killed $z0 204; CHECK-NEXT: ret 205 %res = call half @llvm.aarch64.sve.fminv.nxv8f16(<vscale x 8 x i1> %pg, 206 <vscale x 8 x half> %a) 207 ret half %res 208} 209 210define float @fminv_f32(<vscale x 4 x i1> %pg, <vscale x 4 x float> %a) { 211; CHECK-LABEL: fminv_f32: 212; CHECK: // %bb.0: 213; CHECK-NEXT: fminv s0, p0, z0.s 214; CHECK-NEXT: // kill: def $s0 killed $s0 killed $z0 215; CHECK-NEXT: ret 216 %res = call float @llvm.aarch64.sve.fminv.nxv4f32(<vscale x 4 x i1> %pg, 217 <vscale x 4 x float> %a) 218 ret float %res 219} 220 221define double @fminv_f64(<vscale x 2 x i1> %pg, <vscale x 2 x double> %a) { 222; CHECK-LABEL: fminv_f64: 223; CHECK: // %bb.0: 224; CHECK-NEXT: fminv d0, p0, z0.d 225; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 226; CHECK-NEXT: ret 227 %res = call double @llvm.aarch64.sve.fminv.nxv2f64(<vscale x 2 x i1> %pg, 228 <vscale x 2 x double> %a) 229 ret double %res 230} 231 232declare half @llvm.aarch64.sve.fadda.nxv8f16(<vscale x 8 x i1>, half, <vscale x 8 x half>) 233declare float @llvm.aarch64.sve.fadda.nxv4f32(<vscale x 4 x i1>, float, <vscale x 4 x float>) 234declare double @llvm.aarch64.sve.fadda.nxv2f64(<vscale x 2 x i1>, double, <vscale x 2 x double>) 235 236declare half @llvm.aarch64.sve.faddv.nxv8f16(<vscale x 8 x i1>, <vscale x 8 x half>) 237declare float @llvm.aarch64.sve.faddv.nxv4f32(<vscale x 4 x i1>, <vscale x 4 x float>) 238declare double @llvm.aarch64.sve.faddv.nxv2f64(<vscale x 2 x i1>, <vscale x 2 x double>) 239 240declare half @llvm.aarch64.sve.fmaxnmv.nxv8f16(<vscale x 8 x i1>, <vscale x 8 x half>) 241declare float @llvm.aarch64.sve.fmaxnmv.nxv4f32(<vscale x 4 x i1>, <vscale x 4 x float>) 242declare double @llvm.aarch64.sve.fmaxnmv.nxv2f64(<vscale x 2 x i1>, <vscale x 2 x double>) 243 244declare half @llvm.aarch64.sve.fmaxv.nxv8f16(<vscale x 8 x i1>, <vscale x 8 x half>) 245declare float @llvm.aarch64.sve.fmaxv.nxv4f32(<vscale x 4 x i1>, <vscale x 4 x float>) 246declare double @llvm.aarch64.sve.fmaxv.nxv2f64(<vscale x 2 x i1>, <vscale x 2 x double>) 247 248declare half @llvm.aarch64.sve.fminnmv.nxv8f16(<vscale x 8 x i1>, <vscale x 8 x half>) 249declare float @llvm.aarch64.sve.fminnmv.nxv4f32(<vscale x 4 x i1>, <vscale x 4 x float>) 250declare double @llvm.aarch64.sve.fminnmv.nxv2f64(<vscale x 2 x i1>, <vscale x 2 x double>) 251 252declare half @llvm.aarch64.sve.fminv.nxv8f16(<vscale x 8 x i1>, <vscale x 8 x half>) 253declare float @llvm.aarch64.sve.fminv.nxv4f32(<vscale x 4 x i1>, <vscale x 4 x float>) 254declare double @llvm.aarch64.sve.fminv.nxv2f64(<vscale x 2 x i1>, <vscale x 2 x double>) 255