544 lines · c
1// REQUIRES: systemz-registered-target2// RUN: %clang_cc1 -target-cpu z14 -triple s390x-linux-gnu \3// RUN: -O2 -fzvector -flax-vector-conversions=none \4// RUN: -ffp-exception-behavior=strict \5// RUN: -Wall -Wno-unused -Werror -emit-llvm %s -o - | FileCheck %s6// RUN: %clang_cc1 -target-cpu z14 -triple s390x-linux-gnu \7// RUN: -O2 -fzvector -flax-vector-conversions=none \8// RUN: -ffp-exception-behavior=strict \9// RUN: -Wall -Wno-unused -Werror -S %s -o - | FileCheck %s --check-prefix=CHECK-ASM10 11#include <vecintrin.h>12 13volatile vector signed long long vsl;14volatile vector unsigned int vui;15volatile vector unsigned long long vul;16volatile vector bool int vbi;17volatile vector bool long long vbl;18volatile vector float vf;19volatile vector double vd;20 21volatile float f;22volatile double d;23 24const float * volatile cptrf;25const double * volatile cptrd;26 27float * volatile ptrf;28double * volatile ptrd;29 30volatile int idx;31int cc;32 33void test_core(void) {34 // CHECK-ASM-LABEL: test_core35 vector float vf2;36 vector double vd2;37 38 f = vec_extract(vf, 0);39 // CHECK: extractelement <4 x float> %{{.*}}, i64 040 // CHECK-ASM: vstef41 f = vec_extract(vf, idx);42 // CHECK: extractelement <4 x float> %{{.*}}, i32 %{{.*}}43 // CHECK-ASM: vlgvf44 d = vec_extract(vd, 0);45 // CHECK: extractelement <2 x double> %{{.*}}, i64 046 // CHECK-ASM: vsteg47 d = vec_extract(vd, idx);48 // CHECK: extractelement <2 x double> %{{.*}}, i32 %{{.*}}49 // CHECK-ASM: vlgvg50 51 vf2 = vf;52 vf = vec_insert(f, vf2, 0);53 // CHECK: insertelement <4 x float> %{{.*}}, float %{{.*}}, i64 054 // CHECK-ASM: vlef55 vf = vec_insert(0.0f, vf, 1);56 // CHECK: insertelement <4 x float> %{{.*}}, float 0.000000e+00, i64 157 // CHECK-ASM: vleif %{{.*}}, 0, 158 vf = vec_insert(f, vf, idx);59 // CHECK: insertelement <4 x float> %{{.*}}, float %{{.*}}, i32 %{{.*}}60 // CHECK-ASM: vlvgf61 vd2 = vd;62 vd = vec_insert(d, vd2, 0);63 // CHECK: insertelement <2 x double> %{{.*}}, double %{{.*}}, i64 064 // CHECK-ASM: vleg65 vd = vec_insert(0.0, vd, 1);66 // CHECK: insertelement <2 x double> %{{.*}}, double 0.000000e+00, i64 167 // CHECK-ASM: vleig %{{.*}}, 0, 168 vd = vec_insert(d, vd, idx);69 // CHECK: insertelement <2 x double> %{{.*}}, double %{{.*}}, i32 %{{.*}}70 // CHECK-ASM: vlvgg71 72 vf = vec_promote(f, idx);73 // CHECK: insertelement <4 x float> poison, float %{{.*}}, i32 %{{.*}}74 // CHECK-ASM: vlvgf75 vd = vec_promote(d, idx);76 // CHECK: insertelement <2 x double> poison, double %{{.*}}, i32 %{{.*}}77 // CHECK-ASM: vlvgg78 79 vf = vec_insert_and_zero(cptrf);80 // CHECK: insertelement <4 x float> <float 0.000000e+00, float poison, float 0.000000e+00, float 0.000000e+00>, float {{.*}}, i64 181 // CHECK-ASM: vllezf82 vd = vec_insert_and_zero(cptrd);83 // CHECK: insertelement <2 x double> <double poison, double 0.000000e+00>, double %{{.*}}, i64 084 // CHECK-ASM: vllezg85 86 vf = vec_revb(vf);87 // CHECK-ASM: vperm88 vd = vec_revb(vd);89 // CHECK-ASM: vperm90 91 vf = vec_reve(vf);92 // CHECK-ASM: vperm93 vd = vec_reve(vd);94 // CHECK-ASM: {{vperm|vpdi}}95 96 vf = vec_gather_element(vf, vui, cptrf, 0);97 // CHECK-ASM: vgef %{{.*}}, 0(%{{.*}},%{{.*}}), 098 vf = vec_gather_element(vf, vui, cptrf, 1);99 // CHECK-ASM: vgef %{{.*}}, 0(%{{.*}},%{{.*}}), 1100 vf = vec_gather_element(vf, vui, cptrf, 2);101 // CHECK-ASM: vgef %{{.*}}, 0(%{{.*}},%{{.*}}), 2102 vf = vec_gather_element(vf, vui, cptrf, 3);103 // CHECK-ASM: vgef %{{.*}}, 0(%{{.*}},%{{.*}}), 3104 vd = vec_gather_element(vd, vul, cptrd, 0);105 // CHECK-ASM: vgeg %{{.*}}, 0(%{{.*}},%{{.*}}), 0106 vd = vec_gather_element(vd, vul, cptrd, 1);107 // CHECK-ASM: vgeg %{{.*}}, 0(%{{.*}},%{{.*}}), 1108 109 vec_scatter_element(vf, vui, ptrf, 0);110 // CHECK-ASM: vscef %{{.*}}, 0(%{{.*}},%{{.*}}), 0111 vec_scatter_element(vf, vui, ptrf, 1);112 // CHECK-ASM: vscef %{{.*}}, 0(%{{.*}},%{{.*}}), 1113 vec_scatter_element(vf, vui, ptrf, 2);114 // CHECK-ASM: vscef %{{.*}}, 0(%{{.*}},%{{.*}}), 2115 vec_scatter_element(vf, vui, ptrf, 3);116 // CHECK-ASM: vscef %{{.*}}, 0(%{{.*}},%{{.*}}), 3117 vec_scatter_element(vd, vul, ptrd, 0);118 // CHECK-ASM: vsceg %{{.*}}, 0(%{{.*}},%{{.*}}), 0119 vec_scatter_element(vd, vul, ptrd, 1);120 // CHECK-ASM: vsceg %{{.*}}, 0(%{{.*}},%{{.*}}), 1121 122 vf = vec_xl(idx, cptrf);123 // CHECK-ASM: vl124 vd = vec_xl(idx, cptrd);125 // CHECK-ASM: vl126 127 vec_xst(vf, idx, ptrf);128 // CHECK-ASM: vst129 vec_xst(vd, idx, ptrd);130 // CHECK-ASM: vst131 132 vf = vec_splat(vf, 0);133 // CHECK: shufflevector <4 x float> %{{.*}}, <4 x float> poison, <4 x i32> zeroinitializer134 // CHECK-ASM: vrepf135 vf = vec_splat(vf, 1);136 // CHECK: shufflevector <4 x float> %{{.*}}, <4 x float> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>137 // CHECK-ASM: vrepf138 vd = vec_splat(vd, 0);139 // CHECK: shufflevector <2 x double> %{{.*}}, <2 x double> poison, <2 x i32> zeroinitializer140 // CHECK-ASM: vrepg141 vd = vec_splat(vd, 1);142 // CHECK: shufflevector <2 x double> %{{.*}}, <2 x double> poison, <2 x i32> <i32 1, i32 1>143 // CHECK-ASM: vrepg144 145 vf = vec_splats(f);146 // CHECK: shufflevector <4 x float> %{{.*}}, <4 x float> poison, <4 x i32> zeroinitializer147 // CHECK-ASM: vlrepf148 vd = vec_splats(d);149 // CHECK: shufflevector <2 x double> %{{.*}}, <2 x double> poison, <2 x i32> zeroinitializer150 // CHECK-ASM: vlrepg151 152 vf = vec_mergeh(vf, vf);153 // shufflevector <4 x float> %{{.*}}, <4 x float> %{{.*}}, <4 x i32> <i32 0, i32 4, i32 1, i32 5>154 // CHECK-ASM: vmrhf155 vd = vec_mergeh(vd, vd);156 // shufflevector <2 x double> %{{.*}}, <2 x double> %{{.*}}, <2 x i32> <i32 0, i32 2>157 // CHECK-ASM: vmrhg158 159 vf = vec_mergel(vf, vf);160 // shufflevector <4 x float> %{{.*}}, <4 x float> %{{.*}}, <i32 2, i32 6, i32 3, i32 7>161 // CHECK-ASM: vmrlf162 vd = vec_mergel(vd, vd);163 // shufflevector <2 x double> %{{.*}}, <2 x double> %{{.*}}, <i32 1, i32 3>164 // CHECK-ASM: vmrlg165}166 167void test_compare(void) {168 // CHECK-ASM-LABEL: test_compare169 170 vbi = vec_cmpeq(vf, vf);171 // CHECK: call <4 x i1> @llvm.experimental.constrained.fcmp.v4f32(<4 x float> %{{.*}}, <4 x float> %{{.*}}, metadata !"oeq", metadata !{{.*}})172 // CHECK-ASM: vfcesb173 vbl = vec_cmpeq(vd, vd);174 // CHECK: call <2 x i1> @llvm.experimental.constrained.fcmp.v2f64(<2 x double> %{{.*}}, <2 x double> %{{.*}}, metadata !"oeq", metadata !{{.*}})175 // CHECK-ASM: vfcedb176 177 vbi = vec_cmpge(vf, vf);178 // CHECK: call <4 x i1> @llvm.experimental.constrained.fcmps.v4f32(<4 x float> %{{.*}}, <4 x float> %{{.*}}, metadata !"oge", metadata !{{.*}})179 // CHECK-ASM: vfkhesb180 vbl = vec_cmpge(vd, vd);181 // CHECK: call <2 x i1> @llvm.experimental.constrained.fcmps.v2f64(<2 x double> %{{.*}}, <2 x double> %{{.*}}, metadata !"oge", metadata !{{.*}})182 // CHECK-ASM: vfkhedb183 184 vbi = vec_cmpgt(vf, vf);185 // CHECK: call <4 x i1> @llvm.experimental.constrained.fcmps.v4f32(<4 x float> %{{.*}}, <4 x float> %{{.*}}, metadata !"ogt", metadata !{{.*}})186 // CHECK-ASM: vfkhsb187 vbl = vec_cmpgt(vd, vd);188 // CHECK: call <2 x i1> @llvm.experimental.constrained.fcmps.v2f64(<2 x double> %{{.*}}, <2 x double> %{{.*}}, metadata !"ogt", metadata !{{.*}})189 // CHECK-ASM: vfkhdb190 191 vbi = vec_cmple(vf, vf);192 // CHECK: call <4 x i1> @llvm.experimental.constrained.fcmps.v4f32(<4 x float> %{{.*}}, <4 x float> %{{.*}}, metadata !"ole", metadata !{{.*}})193 // CHECK-ASM: vfkhesb194 vbl = vec_cmple(vd, vd);195 // CHECK: call <2 x i1> @llvm.experimental.constrained.fcmps.v2f64(<2 x double> %{{.*}}, <2 x double> %{{.*}}, metadata !"ole", metadata !{{.*}})196 // CHECK-ASM: vfkhedb197 198 vbi = vec_cmplt(vf, vf);199 // CHECK: call <4 x i1> @llvm.experimental.constrained.fcmps.v4f32(<4 x float> %{{.*}}, <4 x float> %{{.*}}, metadata !"olt", metadata !{{.*}})200 // CHECK-ASM: vfkhsb201 vbl = vec_cmplt(vd, vd);202 // CHECK: call <2 x i1> @llvm.experimental.constrained.fcmps.v2f64(<2 x double> %{{.*}}, <2 x double> %{{.*}}, metadata !"olt", metadata !{{.*}})203 // CHECK-ASM: vfkhdb204 205 idx = vec_all_eq(vf, vf);206 // CHECK: call { <4 x i32>, i32 } @llvm.s390.vfcesbs(<4 x float> %{{.*}}, <4 x float> %{{.*}})207 // CHECK-ASM: vfcesbs208 idx = vec_all_eq(vd, vd);209 // CHECK: call { <2 x i64>, i32 } @llvm.s390.vfcedbs(<2 x double> %{{.*}}, <2 x double> %{{.*}})210 // CHECK-ASM: vfcedbs211 212 idx = vec_all_ne(vf, vf);213 // CHECK: call { <4 x i32>, i32 } @llvm.s390.vfcesbs(<4 x float> %{{.*}}, <4 x float> %{{.*}})214 // CHECK-ASM: vfcesbs215 idx = vec_all_ne(vd, vd);216 // CHECK: call { <2 x i64>, i32 } @llvm.s390.vfcedbs(<2 x double> %{{.*}}, <2 x double> %{{.*}})217 // CHECK-ASM: vfcedbs218 219 idx = vec_all_ge(vf, vf);220 // CHECK: call { <4 x i32>, i32 } @llvm.s390.vfchesbs(<4 x float> %{{.*}}, <4 x float> %{{.*}})221 // CHECK-ASM: vfchesbs222 idx = vec_all_ge(vd, vd);223 // CHECK: call { <2 x i64>, i32 } @llvm.s390.vfchedbs(<2 x double> %{{.*}}, <2 x double> %{{.*}})224 // CHECK-ASM: vfchedbs225 226 idx = vec_all_gt(vf, vf);227 // CHECK: call { <4 x i32>, i32 } @llvm.s390.vfchsbs(<4 x float> %{{.*}}, <4 x float> %{{.*}})228 // CHECK-ASM: vfchsbs229 idx = vec_all_gt(vd, vd);230 // CHECK: call { <2 x i64>, i32 } @llvm.s390.vfchdbs(<2 x double> %{{.*}}, <2 x double> %{{.*}})231 // CHECK-ASM: vfchdbs232 233 idx = vec_all_le(vf, vf);234 // CHECK: call { <4 x i32>, i32 } @llvm.s390.vfchesbs(<4 x float> %{{.*}}, <4 x float> %{{.*}})235 // CHECK-ASM: vfchesbs236 idx = vec_all_le(vd, vd);237 // CHECK: call { <2 x i64>, i32 } @llvm.s390.vfchedbs(<2 x double> %{{.*}}, <2 x double> %{{.*}})238 // CHECK-ASM: vfchedbs239 240 idx = vec_all_lt(vf, vf);241 // CHECK: call { <4 x i32>, i32 } @llvm.s390.vfchsbs(<4 x float> %{{.*}}, <4 x float> %{{.*}})242 // CHECK-ASM: vfchsbs243 idx = vec_all_lt(vd, vd);244 // CHECK: call { <2 x i64>, i32 } @llvm.s390.vfchdbs(<2 x double> %{{.*}}, <2 x double> %{{.*}})245 // CHECK-ASM: vfchdbs246 247 idx = vec_all_nge(vf, vf);248 // CHECK: call { <4 x i32>, i32 } @llvm.s390.vfchesbs(<4 x float> %{{.*}}, <4 x float> %{{.*}})249 // CHECK-ASM: vfchesbs250 idx = vec_all_nge(vd, vd);251 // CHECK: call { <2 x i64>, i32 } @llvm.s390.vfchedbs(<2 x double> %{{.*}}, <2 x double> %{{.*}})252 // CHECK-ASM: vfchedbs253 254 idx = vec_all_ngt(vf, vf);255 // CHECK: call { <4 x i32>, i32 } @llvm.s390.vfchsbs(<4 x float> %{{.*}}, <4 x float> %{{.*}})256 // CHECK-ASM: vfchsbs257 idx = vec_all_ngt(vd, vd);258 // CHECK: call { <2 x i64>, i32 } @llvm.s390.vfchdbs(<2 x double> %{{.*}}, <2 x double> %{{.*}})259 // CHECK-ASM: vfchdbs260 261 idx = vec_all_nle(vf, vf);262 // CHECK: call { <4 x i32>, i32 } @llvm.s390.vfchesbs(<4 x float> %{{.*}}, <4 x float> %{{.*}})263 // CHECK-ASM: vfchesbs264 idx = vec_all_nle(vd, vd);265 // CHECK: call { <2 x i64>, i32 } @llvm.s390.vfchedbs(<2 x double> %{{.*}}, <2 x double> %{{.*}})266 // CHECK-ASM: vfchedbs267 268 idx = vec_all_nlt(vf, vf);269 // CHECK: call { <4 x i32>, i32 } @llvm.s390.vfchsbs(<4 x float> %{{.*}}, <4 x float> %{{.*}})270 // CHECK-ASM: vfchsbs271 idx = vec_all_nlt(vd, vd);272 // CHECK: call { <2 x i64>, i32 } @llvm.s390.vfchdbs(<2 x double> %{{.*}}, <2 x double> %{{.*}})273 // CHECK-ASM: vfchdbs274 275 idx = vec_all_nan(vf);276 // CHECK: call { <4 x i32>, i32 } @llvm.s390.vftcisb(<4 x float> %{{.*}}, i32 15)277 // CHECK-ASM: vftcisb278 idx = vec_all_nan(vd);279 // CHECK: call { <2 x i64>, i32 } @llvm.s390.vftcidb(<2 x double> %{{.*}}, i32 15)280 // CHECK-ASM: vftcidb281 282 idx = vec_all_numeric(vf);283 // CHECK: call { <4 x i32>, i32 } @llvm.s390.vftcisb(<4 x float> %{{.*}}, i32 15)284 // CHECK-ASM: vftcisb285 idx = vec_all_numeric(vd);286 // CHECK: call { <2 x i64>, i32 } @llvm.s390.vftcidb(<2 x double> %{{.*}}, i32 15)287 // CHECK-ASM: vftcidb288 289 idx = vec_any_eq(vf, vf);290 // CHECK: call { <4 x i32>, i32 } @llvm.s390.vfcesbs(<4 x float> %{{.*}}, <4 x float> %{{.*}})291 // CHECK-ASM: vfcesbs292 idx = vec_any_eq(vd, vd);293 // CHECK: call { <2 x i64>, i32 } @llvm.s390.vfcedbs(<2 x double> %{{.*}}, <2 x double> %{{.*}})294 // CHECK-ASM: vfcedbs295 296 idx = vec_any_ne(vf, vf);297 // CHECK: call { <4 x i32>, i32 } @llvm.s390.vfcesbs(<4 x float> %{{.*}}, <4 x float> %{{.*}})298 // CHECK-ASM: vfcesbs299 idx = vec_any_ne(vd, vd);300 // CHECK: call { <2 x i64>, i32 } @llvm.s390.vfcedbs(<2 x double> %{{.*}}, <2 x double> %{{.*}})301 // CHECK-ASM: vfcedbs302 303 idx = vec_any_ge(vf, vf);304 // CHECK: call { <4 x i32>, i32 } @llvm.s390.vfchesbs(<4 x float> %{{.*}}, <4 x float> %{{.*}})305 // CHECK-ASM: vfchesbs306 idx = vec_any_ge(vd, vd);307 // CHECK: call { <2 x i64>, i32 } @llvm.s390.vfchedbs(<2 x double> %{{.*}}, <2 x double> %{{.*}})308 // CHECK-ASM: vfchedbs309 310 idx = vec_any_gt(vf, vf);311 // CHECK: call { <4 x i32>, i32 } @llvm.s390.vfchsbs(<4 x float> %{{.*}}, <4 x float> %{{.*}})312 // CHECK-ASM: vfchsbs313 idx = vec_any_gt(vd, vd);314 // CHECK: call { <2 x i64>, i32 } @llvm.s390.vfchdbs(<2 x double> %{{.*}}, <2 x double> %{{.*}})315 // CHECK-ASM: vfchdbs316 317 idx = vec_any_le(vf, vf);318 // CHECK: call { <4 x i32>, i32 } @llvm.s390.vfchesbs(<4 x float> %{{.*}}, <4 x float> %{{.*}})319 // CHECK-ASM: vfchesbs320 idx = vec_any_le(vd, vd);321 // CHECK: call { <2 x i64>, i32 } @llvm.s390.vfchedbs(<2 x double> %{{.*}}, <2 x double> %{{.*}})322 // CHECK-ASM: vfchedbs323 324 idx = vec_any_lt(vf, vf);325 // CHECK: call { <4 x i32>, i32 } @llvm.s390.vfchsbs(<4 x float> %{{.*}}, <4 x float> %{{.*}})326 // CHECK-ASM: vfchsbs327 idx = vec_any_lt(vd, vd);328 // CHECK: call { <2 x i64>, i32 } @llvm.s390.vfchdbs(<2 x double> %{{.*}}, <2 x double> %{{.*}})329 // CHECK-ASM: vfchdbs330 331 idx = vec_any_nge(vf, vf);332 // CHECK: call { <4 x i32>, i32 } @llvm.s390.vfchesbs(<4 x float> %{{.*}}, <4 x float> %{{.*}})333 // CHECK-ASM: vfchesbs334 idx = vec_any_nge(vd, vd);335 // CHECK: call { <2 x i64>, i32 } @llvm.s390.vfchedbs(<2 x double> %{{.*}}, <2 x double> %{{.*}})336 // CHECK-ASM: vfchedbs337 338 idx = vec_any_ngt(vf, vf);339 // CHECK: call { <4 x i32>, i32 } @llvm.s390.vfchsbs(<4 x float> %{{.*}}, <4 x float> %{{.*}})340 // CHECK-ASM: vfchsbs341 idx = vec_any_ngt(vd, vd);342 // CHECK: call { <2 x i64>, i32 } @llvm.s390.vfchdbs(<2 x double> %{{.*}}, <2 x double> %{{.*}})343 // CHECK-ASM: vfchdbs344 345 idx = vec_any_nle(vf, vf);346 // CHECK: call { <4 x i32>, i32 } @llvm.s390.vfchesbs(<4 x float> %{{.*}}, <4 x float> %{{.*}})347 // CHECK-ASM: vfchesbs348 idx = vec_any_nle(vd, vd);349 // CHECK: call { <2 x i64>, i32 } @llvm.s390.vfchedbs(<2 x double> %{{.*}}, <2 x double> %{{.*}})350 // CHECK-ASM: vfchedbs351 352 idx = vec_any_nlt(vf, vf);353 // CHECK: call { <4 x i32>, i32 } @llvm.s390.vfchsbs(<4 x float> %{{.*}}, <4 x float> %{{.*}})354 // CHECK-ASM: vfchsbs355 idx = vec_any_nlt(vd, vd);356 // CHECK: call { <2 x i64>, i32 } @llvm.s390.vfchdbs(<2 x double> %{{.*}}, <2 x double> %{{.*}})357 // CHECK-ASM: vfchdbs358 359 idx = vec_any_nan(vf);360 // CHECK: call { <4 x i32>, i32 } @llvm.s390.vftcisb(<4 x float> %{{.*}}, i32 15)361 // CHECK-ASM: vftcisb362 idx = vec_any_nan(vd);363 // CHECK: call { <2 x i64>, i32 } @llvm.s390.vftcidb(<2 x double> %{{.*}}, i32 15)364 // CHECK-ASM: vftcidb365 366 idx = vec_any_numeric(vf);367 // CHECK: call { <4 x i32>, i32 } @llvm.s390.vftcisb(<4 x float> %{{.*}}, i32 15)368 // CHECK-ASM: vftcisb369 idx = vec_any_numeric(vd);370 // CHECK: call { <2 x i64>, i32 } @llvm.s390.vftcidb(<2 x double> %{{.*}}, i32 15)371 // CHECK-ASM: vftcidb372}373 374void test_float(void) {375 // CHECK-ASM-LABEL: test_float376 377 vf = vec_abs(vf);378 // CHECK: call <4 x float> @llvm.fabs.v4f32(<4 x float> %{{.*}})379 // CHECK-ASM: vflpsb380 vd = vec_abs(vd);381 // CHECK: call <2 x double> @llvm.fabs.v2f64(<2 x double> %{{.*}})382 // CHECK-ASM: vflpdb383 384 vf = vec_nabs(vf);385 // CHECK: [[ABS:%[^ ]+]] = tail call <4 x float> @llvm.fabs.v4f32(<4 x float> %{{.*}})386 // CHECK-NEXT: fneg <4 x float> [[ABS]]387 // CHECK-ASM: vflnsb388 vd = vec_nabs(vd);389 // CHECK: [[ABS:%[^ ]+]] = tail call <2 x double> @llvm.fabs.v2f64(<2 x double> %{{.*}})390 // CHECK-NEXT: fneg <2 x double> [[ABS]]391 // CHECK-ASM: vflndb392 393 vf = vec_max(vf, vf);394 // CHECK: call <4 x float> @llvm.s390.vfmaxsb(<4 x float> %{{.*}}, <4 x float> %{{.*}}, i32 0)395 // CHECK-ASM: vfmaxsb396 vd = vec_max(vd, vd);397 // CHECK: call <2 x double> @llvm.s390.vfmaxdb(<2 x double> %{{.*}}, <2 x double> %{{.*}}, i32 0)398 // CHECK-ASM: vfmaxdb399 400 vf = vec_min(vf, vf);401 // CHECK: call <4 x float> @llvm.s390.vfminsb(<4 x float> %{{.*}}, <4 x float> %{{.*}}, i32 0)402 // CHECK-ASM: vfminsb403 vd = vec_min(vd, vd);404 // CHECK: call <2 x double> @llvm.s390.vfmindb(<2 x double> %{{.*}}, <2 x double> %{{.*}}, i32 0)405 // CHECK-ASM: vfmindb406 407 vf = vec_madd(vf, vf, vf);408 // CHECK: call <4 x float> @llvm.experimental.constrained.fma.v4f32(<4 x float> %{{.*}}, <4 x float> %{{.*}}, <4 x float> %{{.*}}, metadata !{{.*}})409 // CHECK-ASM: vfmasb410 vd = vec_madd(vd, vd, vd);411 // CHECK: call <2 x double> @llvm.experimental.constrained.fma.v2f64(<2 x double> %{{.*}}, <2 x double> %{{.*}}, <2 x double> %{{.*}}, metadata !{{.*}})412 // CHECK-ASM: vfmadb413 414 vf = vec_msub(vf, vf, vf);415 // CHECK: [[NEG:%[^ ]+]] = fneg <4 x float> %{{.*}}416 // CHECK: call <4 x float> @llvm.experimental.constrained.fma.v4f32(<4 x float> %{{.*}}, <4 x float> %{{.*}}, <4 x float> [[NEG]], metadata !{{.*}})417 // CHECK-ASM: vfmssb418 vd = vec_msub(vd, vd, vd);419 // CHECK: [[NEG:%[^ ]+]] = fneg <2 x double> %{{.*}}420 // CHECK: call <2 x double> @llvm.experimental.constrained.fma.v2f64(<2 x double> %{{.*}}, <2 x double> %{{.*}}, <2 x double> [[NEG]], metadata !{{.*}})421 // CHECK-ASM: vfmsdb422 423 vf = vec_nmadd(vf, vf, vf);424 // CHECK: [[RES:%[^ ]+]] = tail call <4 x float> @llvm.experimental.constrained.fma.v4f32(<4 x float> %{{.*}}, <4 x float> %{{.*}}, <4 x float> %{{.*}}, metadata !{{.*}})425 // CHECK: fneg <4 x float> [[RES]]426 // CHECK-ASM: vfnmasb427 vd = vec_nmadd(vd, vd, vd);428 // CHECK: [[RES:%[^ ]+]] = tail call <2 x double> @llvm.experimental.constrained.fma.v2f64(<2 x double> %{{.*}}, <2 x double> %{{.*}}, <2 x double> %{{.*}}, metadata !{{.*}})429 // CHECK: fneg <2 x double> [[RES]]430 // CHECK-ASM: vfnmadb431 432 vf = vec_nmsub(vf, vf, vf);433 // CHECK: [[NEG:%[^ ]+]] = fneg <4 x float> %{{.*}}434 // CHECK: [[RES:%[^ ]+]] = tail call <4 x float> @llvm.experimental.constrained.fma.v4f32(<4 x float> %{{.*}}, <4 x float> %{{.*}}, <4 x float> [[NEG]], metadata !{{.*}})435 // CHECK: fneg <4 x float> [[RES]]436 // CHECK-ASM: vfnmssb437 vd = vec_nmsub(vd, vd, vd);438 // CHECK: [[NEG:%[^ ]+]] = fneg <2 x double> %{{.*}}439 // CHECK: [[RES:%[^ ]+]] = tail call <2 x double> @llvm.experimental.constrained.fma.v2f64(<2 x double> %{{.*}}, <2 x double> %{{.*}}, <2 x double> [[NEG]], metadata !{{.*}})440 // CHECK: fneg <2 x double> [[RES]]441 // CHECK-ASM: vfnmsdb442 443 vf = vec_sqrt(vf);444 // CHECK: call <4 x float> @llvm.experimental.constrained.sqrt.v4f32(<4 x float> %{{.*}}, metadata !{{.*}})445 // CHECK-ASM: vfsqsb446 vd = vec_sqrt(vd);447 // CHECK: call <2 x double> @llvm.experimental.constrained.sqrt.v2f64(<2 x double> %{{.*}}, metadata !{{.*}})448 // CHECK-ASM: vfsqdb449 450 vd = vec_doublee(vf);451 // CHECK: call <2 x double> @llvm.experimental.constrained.fpext.v2f64.v2f32(<2 x float> %{{.*}}, metadata !{{.*}})452 // CHECK-ASM: vldeb453 vf = vec_floate(vd);454 // CHECK: call <2 x float> @llvm.experimental.constrained.fptrunc.v2f32.v2f64(<2 x double> %{{.*}}, metadata !{{.*}})455 // CHECK-ASM: vledb456 457 vd = vec_double(vsl);458 // CHECK: call <2 x double> @llvm.experimental.constrained.sitofp.v2f64.v2i64(<2 x i64> %{{.*}}, metadata !{{.*}})459 // CHECK-ASM: vcdgb460 vd = vec_double(vul);461 // CHECK: call <2 x double> @llvm.experimental.constrained.uitofp.v2f64.v2i64(<2 x i64> %{{.*}}, metadata !{{.*}})462 // CHECK-ASM: vcdlgb463 464 vsl = vec_signed(vd);465 // CHECK: call <2 x i64> @llvm.experimental.constrained.fptosi.v2i64.v2f64(<2 x double> %{{.*}}, metadata !{{.*}})466 // CHECK-ASM: vcgdb467 vul = vec_unsigned(vd);468 // CHECK: call <2 x i64> @llvm.experimental.constrained.fptoui.v2i64.v2f64(<2 x double> %{{.*}}, metadata !{{.*}})469 // CHECK-ASM: vclgdb470 471 vf = vec_roundp(vf);472 // CHECK: call <4 x float> @llvm.experimental.constrained.ceil.v4f32(<4 x float> %{{.*}}, metadata !{{.*}})473 // CHECK-ASM: vfisb %{{.*}}, %{{.*}}, 4, 6474 vf = vec_ceil(vf);475 // CHECK: call <4 x float> @llvm.experimental.constrained.ceil.v4f32(<4 x float> %{{.*}}, metadata !{{.*}})476 // CHECK-ASM: vfisb %{{.*}}, %{{.*}}, 4, 6477 vd = vec_roundp(vd);478 // CHECK: call <2 x double> @llvm.experimental.constrained.ceil.v2f64(<2 x double> %{{.*}}, metadata !{{.*}})479 // CHECK-ASM: vfidb %{{.*}}, %{{.*}}, 4, 6480 vd = vec_ceil(vd);481 // CHECK: call <2 x double> @llvm.experimental.constrained.ceil.v2f64(<2 x double> %{{.*}}, metadata !{{.*}})482 // CHECK-ASM: vfidb %{{.*}}, %{{.*}}, 4, 6483 484 vf = vec_roundm(vf);485 // CHECK: call <4 x float> @llvm.experimental.constrained.floor.v4f32(<4 x float> %{{.*}}, metadata !{{.*}})486 // CHECK-ASM: vfisb %{{.*}}, %{{.*}}, 4, 7487 vf = vec_floor(vf);488 // CHECK: call <4 x float> @llvm.experimental.constrained.floor.v4f32(<4 x float> %{{.*}}, metadata !{{.*}})489 // CHECK-ASM: vfisb %{{.*}}, %{{.*}}, 4, 7490 vd = vec_roundm(vd);491 // CHECK: call <2 x double> @llvm.experimental.constrained.floor.v2f64(<2 x double> %{{.*}}, metadata !{{.*}})492 // CHECK-ASM: vfidb %{{.*}}, %{{.*}}, 4, 7493 vd = vec_floor(vd);494 // CHECK: call <2 x double> @llvm.experimental.constrained.floor.v2f64(<2 x double> %{{.*}}, metadata !{{.*}})495 // CHECK-ASM: vfidb %{{.*}}, %{{.*}}, 4, 7496 497 vf = vec_roundz(vf);498 // CHECK: call <4 x float> @llvm.experimental.constrained.trunc.v4f32(<4 x float> %{{.*}}, metadata !{{.*}})499 // CHECK-ASM: vfisb %{{.*}}, %{{.*}}, 4, 5500 vf = vec_trunc(vf);501 // CHECK: call <4 x float> @llvm.experimental.constrained.trunc.v4f32(<4 x float> %{{.*}}, metadata !{{.*}})502 // CHECK-ASM: vfisb %{{.*}}, %{{.*}}, 4, 5503 vd = vec_roundz(vd);504 // CHECK: call <2 x double> @llvm.experimental.constrained.trunc.v2f64(<2 x double> %{{.*}}, metadata !{{.*}})505 // CHECK-ASM: vfidb %{{.*}}, %{{.*}}, 4, 5506 vd = vec_trunc(vd);507 // CHECK: call <2 x double> @llvm.experimental.constrained.trunc.v2f64(<2 x double> %{{.*}}, metadata !{{.*}})508 // CHECK-ASM: vfidb %{{.*}}, %{{.*}}, 4, 5509 510 vf = vec_roundc(vf);511 // CHECK: call <4 x float> @llvm.experimental.constrained.nearbyint.v4f32(<4 x float> %{{.*}}, metadata !{{.*}})512 // CHECK-ASM: vfisb %{{.*}}, %{{.*}}, 4, 0513 vd = vec_roundc(vd);514 // CHECK: call <2 x double> @llvm.experimental.constrained.nearbyint.v2f64(<2 x double> %{{.*}}, metadata !{{.*}})515 // CHECK-ASM: vfidb %{{.*}}, %{{.*}}, 4, 0516 517 vf = vec_rint(vf);518 // CHECK: call <4 x float> @llvm.experimental.constrained.rint.v4f32(<4 x float> %{{.*}}, metadata !{{.*}})519 // CHECK-ASM: vfisb %{{.*}}, %{{.*}}, 0, 0520 vd = vec_rint(vd);521 // CHECK: call <2 x double> @llvm.experimental.constrained.rint.v2f64(<2 x double> %{{.*}}, metadata !{{.*}})522 // CHECK-ASM: vfidb %{{.*}}, %{{.*}}, 0, 0523 524 vf = vec_round(vf);525 // CHECK: call <4 x float> @llvm.experimental.constrained.roundeven.v4f32(<4 x float> %{{.*}}, metadata !{{.*}})526 // CHECK-ASM: vfisb %{{.*}}, %{{.*}}, 4, 4527 vd = vec_round(vd);528 // CHECK: call <2 x double> @llvm.experimental.constrained.roundeven.v2f64(<2 x double> %{{.*}}, metadata !{{.*}})529 // CHECK-ASM: vfidb %{{.*}}, %{{.*}}, 4, 4530 531 vbi = vec_fp_test_data_class(vf, 0, &cc);532 // CHECK: call { <4 x i32>, i32 } @llvm.s390.vftcisb(<4 x float> %{{.*}}, i32 0)533 // CHECK-ASM: vftcisb534 vbi = vec_fp_test_data_class(vf, 4095, &cc);535 // CHECK: call { <4 x i32>, i32 } @llvm.s390.vftcisb(<4 x float> %{{.*}}, i32 4095)536 // CHECK-ASM: vftcisb537 vbl = vec_fp_test_data_class(vd, 0, &cc);538 // CHECK: call { <2 x i64>, i32 } @llvm.s390.vftcidb(<2 x double> %{{.*}}, i32 0)539 // CHECK-ASM: vftcidb540 vbl = vec_fp_test_data_class(vd, 4095, &cc);541 // CHECK: call { <2 x i64>, i32 } @llvm.s390.vftcidb(<2 x double> %{{.*}}, i32 4095)542 // CHECK-ASM: vftcidb543}544