| // NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --version 2 |
| // RUN: %clang_cc1 -triple x86_64-linux-gnu -frounding-math -ffp-exception-behavior=strict -O2 -emit-llvm -o - %s | FileCheck %s |
| |
| // FIXME: This demonstrates elementwise builtins are broken for strictfp and |
| // produce unconstrained intrinsics |
| |
| typedef float float4 __attribute__((ext_vector_type(4))); |
| |
| // Sanity check we're getting constrained ops for a non-builtin. |
| // CHECK-LABEL: define dso_local noundef <4 x float> @_Z11strict_faddDv4_fS_ |
| // CHECK-SAME: (<4 x float> noundef [[A:%.*]], <4 x float> noundef [[B:%.*]]) local_unnamed_addr #[[ATTR0:[0-9]+]] { |
| // CHECK-NEXT: entry: |
| // CHECK-NEXT: [[ADD:%.*]] = tail call <4 x float> @llvm.experimental.constrained.fadd.v4f32(<4 x float> [[A]], <4 x float> [[B]], metadata !"round.dynamic", metadata !"fpexcept.strict") #[[ATTR4:[0-9]+]] |
| // CHECK-NEXT: ret <4 x float> [[ADD]] |
| // |
| float4 strict_fadd(float4 a, float4 b) { |
| return a + b; |
| } |
| |
| // CHECK-LABEL: define dso_local noundef <4 x float> @_Z22strict_elementwise_absDv4_f |
| // CHECK-SAME: (<4 x float> noundef [[A:%.*]]) local_unnamed_addr #[[ATTR2:[0-9]+]] { |
| // CHECK-NEXT: entry: |
| // CHECK-NEXT: [[ELT_ABS:%.*]] = tail call <4 x float> @llvm.fabs.v4f32(<4 x float> [[A]]) #[[ATTR4]] |
| // CHECK-NEXT: ret <4 x float> [[ELT_ABS]] |
| // |
| float4 strict_elementwise_abs(float4 a) { |
| return __builtin_elementwise_abs(a); |
| } |
| |
| // CHECK-LABEL: define dso_local noundef <4 x float> @_Z22strict_elementwise_maxDv4_fS_ |
| // CHECK-SAME: (<4 x float> noundef [[A:%.*]], <4 x float> noundef [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { |
| // CHECK-NEXT: entry: |
| // CHECK-NEXT: [[ELT_MAX:%.*]] = tail call <4 x float> @llvm.experimental.constrained.maxnum.v4f32(<4 x float> [[A]], <4 x float> [[B]], metadata !"fpexcept.strict") #[[ATTR4]] |
| // CHECK-NEXT: ret <4 x float> [[ELT_MAX]] |
| // |
| float4 strict_elementwise_max(float4 a, float4 b) { |
| return __builtin_elementwise_max(a, b); |
| } |
| |
| // CHECK-LABEL: define dso_local noundef <4 x float> @_Z22strict_elementwise_minDv4_fS_ |
| // CHECK-SAME: (<4 x float> noundef [[A:%.*]], <4 x float> noundef [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { |
| // CHECK-NEXT: entry: |
| // CHECK-NEXT: [[ELT_MIN:%.*]] = tail call <4 x float> @llvm.experimental.constrained.minnum.v4f32(<4 x float> [[A]], <4 x float> [[B]], metadata !"fpexcept.strict") #[[ATTR4]] |
| // CHECK-NEXT: ret <4 x float> [[ELT_MIN]] |
| // |
| float4 strict_elementwise_min(float4 a, float4 b) { |
| return __builtin_elementwise_min(a, b); |
| } |
| |
| // CHECK-LABEL: define dso_local noundef <4 x float> @_Z26strict_elementwise_maximumDv4_fS_ |
| // CHECK-SAME: (<4 x float> noundef [[A:%.*]], <4 x float> noundef [[B:%.*]]) local_unnamed_addr #[[ATTR2]] { |
| // CHECK-NEXT: entry: |
| // CHECK-NEXT: [[ELT_MAXIMUM:%.*]] = tail call <4 x float> @llvm.maximum.v4f32(<4 x float> [[A]], <4 x float> [[B]]) #[[ATTR4]] |
| // CHECK-NEXT: ret <4 x float> [[ELT_MAXIMUM]] |
| // |
| float4 strict_elementwise_maximum(float4 a, float4 b) { |
| return __builtin_elementwise_maximum(a, b); |
| } |
| |
| // CHECK-LABEL: define dso_local noundef <4 x float> @_Z26strict_elementwise_minimumDv4_fS_ |
| // CHECK-SAME: (<4 x float> noundef [[A:%.*]], <4 x float> noundef [[B:%.*]]) local_unnamed_addr #[[ATTR2]] { |
| // CHECK-NEXT: entry: |
| // CHECK-NEXT: [[ELT_MINIMUM:%.*]] = tail call <4 x float> @llvm.minimum.v4f32(<4 x float> [[A]], <4 x float> [[B]]) #[[ATTR4]] |
| // CHECK-NEXT: ret <4 x float> [[ELT_MINIMUM]] |
| // |
| float4 strict_elementwise_minimum(float4 a, float4 b) { |
| return __builtin_elementwise_minimum(a, b); |
| } |
| |
| // CHECK-LABEL: define dso_local noundef <4 x float> @_Z23strict_elementwise_ceilDv4_f |
| // CHECK-SAME: (<4 x float> noundef [[A:%.*]]) local_unnamed_addr #[[ATTR0]] { |
| // CHECK-NEXT: entry: |
| // CHECK-NEXT: [[TMP0:%.*]] = tail call <4 x float> @llvm.experimental.constrained.ceil.v4f32(<4 x float> [[A]], metadata !"fpexcept.strict") #[[ATTR4]] |
| // CHECK-NEXT: ret <4 x float> [[TMP0]] |
| // |
| float4 strict_elementwise_ceil(float4 a) { |
| return __builtin_elementwise_ceil(a); |
| } |
| |
| // CHECK-LABEL: define dso_local noundef <4 x float> @_Z23strict_elementwise_acosDv4_f |
| // CHECK-SAME: (<4 x float> noundef [[A:%.*]]) local_unnamed_addr #[[ATTR0]] { |
| // CHECK-NEXT: entry: |
| // CHECK-NEXT: [[TMP0:%.*]] = tail call <4 x float> @llvm.experimental.constrained.acos.v4f32(<4 x float> [[A]], metadata !"round.dynamic", metadata !"fpexcept.strict") #[[ATTR4]] |
| // CHECK-NEXT: ret <4 x float> [[TMP0]] |
| // |
| float4 strict_elementwise_acos(float4 a) { |
| return __builtin_elementwise_acos(a); |
| } |
| |
| // CHECK-LABEL: define dso_local noundef <4 x float> @_Z22strict_elementwise_cosDv4_f |
| // CHECK-SAME: (<4 x float> noundef [[A:%.*]]) local_unnamed_addr #[[ATTR0]] { |
| // CHECK-NEXT: entry: |
| // CHECK-NEXT: [[TMP0:%.*]] = tail call <4 x float> @llvm.experimental.constrained.cos.v4f32(<4 x float> [[A]], metadata !"round.dynamic", metadata !"fpexcept.strict") #[[ATTR4]] |
| // CHECK-NEXT: ret <4 x float> [[TMP0]] |
| // |
| float4 strict_elementwise_cos(float4 a) { |
| return __builtin_elementwise_cos(a); |
| } |
| |
| // CHECK-LABEL: define dso_local noundef <4 x float> @_Z23strict_elementwise_coshDv4_f |
| // CHECK-SAME: (<4 x float> noundef [[A:%.*]]) local_unnamed_addr #[[ATTR0]] { |
| // CHECK-NEXT: entry: |
| // CHECK-NEXT: [[TMP0:%.*]] = tail call <4 x float> @llvm.experimental.constrained.cosh.v4f32(<4 x float> [[A]], metadata !"round.dynamic", metadata !"fpexcept.strict") #[[ATTR4]] |
| // CHECK-NEXT: ret <4 x float> [[TMP0]] |
| // |
| float4 strict_elementwise_cosh(float4 a) { |
| return __builtin_elementwise_cosh(a); |
| } |
| |
| // CHECK-LABEL: define dso_local noundef <4 x float> @_Z22strict_elementwise_expDv4_f |
| // CHECK-SAME: (<4 x float> noundef [[A:%.*]]) local_unnamed_addr #[[ATTR0]] { |
| // CHECK-NEXT: entry: |
| // CHECK-NEXT: [[TMP0:%.*]] = tail call <4 x float> @llvm.experimental.constrained.exp.v4f32(<4 x float> [[A]], metadata !"round.dynamic", metadata !"fpexcept.strict") #[[ATTR4]] |
| // CHECK-NEXT: ret <4 x float> [[TMP0]] |
| // |
| float4 strict_elementwise_exp(float4 a) { |
| return __builtin_elementwise_exp(a); |
| } |
| |
| // CHECK-LABEL: define dso_local noundef <4 x float> @_Z23strict_elementwise_exp2Dv4_f |
| // CHECK-SAME: (<4 x float> noundef [[A:%.*]]) local_unnamed_addr #[[ATTR0]] { |
| // CHECK-NEXT: entry: |
| // CHECK-NEXT: [[TMP0:%.*]] = tail call <4 x float> @llvm.experimental.constrained.exp2.v4f32(<4 x float> [[A]], metadata !"round.dynamic", metadata !"fpexcept.strict") #[[ATTR4]] |
| // CHECK-NEXT: ret <4 x float> [[TMP0]] |
| // |
| float4 strict_elementwise_exp2(float4 a) { |
| return __builtin_elementwise_exp2(a); |
| } |
| |
| // CHECK-LABEL: define dso_local noundef <4 x float> @_Z24strict_elementwise_floorDv4_f |
| // CHECK-SAME: (<4 x float> noundef [[A:%.*]]) local_unnamed_addr #[[ATTR0]] { |
| // CHECK-NEXT: entry: |
| // CHECK-NEXT: [[TMP0:%.*]] = tail call <4 x float> @llvm.experimental.constrained.floor.v4f32(<4 x float> [[A]], metadata !"fpexcept.strict") #[[ATTR4]] |
| // CHECK-NEXT: ret <4 x float> [[TMP0]] |
| // |
| float4 strict_elementwise_floor(float4 a) { |
| return __builtin_elementwise_floor(a); |
| } |
| |
| // CHECK-LABEL: define dso_local noundef <4 x float> @_Z22strict_elementwise_logDv4_f |
| // CHECK-SAME: (<4 x float> noundef [[A:%.*]]) local_unnamed_addr #[[ATTR0]] { |
| // CHECK-NEXT: entry: |
| // CHECK-NEXT: [[TMP0:%.*]] = tail call <4 x float> @llvm.experimental.constrained.log.v4f32(<4 x float> [[A]], metadata !"round.dynamic", metadata !"fpexcept.strict") #[[ATTR4]] |
| // CHECK-NEXT: ret <4 x float> [[TMP0]] |
| // |
| float4 strict_elementwise_log(float4 a) { |
| return __builtin_elementwise_log(a); |
| } |
| |
| // CHECK-LABEL: define dso_local noundef <4 x float> @_Z23strict_elementwise_log2Dv4_f |
| // CHECK-SAME: (<4 x float> noundef [[A:%.*]]) local_unnamed_addr #[[ATTR0]] { |
| // CHECK-NEXT: entry: |
| // CHECK-NEXT: [[TMP0:%.*]] = tail call <4 x float> @llvm.experimental.constrained.log2.v4f32(<4 x float> [[A]], metadata !"round.dynamic", metadata !"fpexcept.strict") #[[ATTR4]] |
| // CHECK-NEXT: ret <4 x float> [[TMP0]] |
| // |
| float4 strict_elementwise_log2(float4 a) { |
| return __builtin_elementwise_log2(a); |
| } |
| |
| // CHECK-LABEL: define dso_local noundef <4 x float> @_Z24strict_elementwise_log10Dv4_f |
| // CHECK-SAME: (<4 x float> noundef [[A:%.*]]) local_unnamed_addr #[[ATTR0]] { |
| // CHECK-NEXT: entry: |
| // CHECK-NEXT: [[TMP0:%.*]] = tail call <4 x float> @llvm.experimental.constrained.log2.v4f32(<4 x float> [[A]], metadata !"round.dynamic", metadata !"fpexcept.strict") #[[ATTR4]] |
| // CHECK-NEXT: ret <4 x float> [[TMP0]] |
| // |
| float4 strict_elementwise_log10(float4 a) { |
| return __builtin_elementwise_log2(a); |
| } |
| |
| // CHECK-LABEL: define dso_local noundef <4 x float> @_Z28strict_elementwise_roundevenDv4_f |
| // CHECK-SAME: (<4 x float> noundef [[A:%.*]]) local_unnamed_addr #[[ATTR0]] { |
| // CHECK-NEXT: entry: |
| // CHECK-NEXT: [[TMP0:%.*]] = tail call <4 x float> @llvm.experimental.constrained.roundeven.v4f32(<4 x float> [[A]], metadata !"fpexcept.strict") #[[ATTR4]] |
| // CHECK-NEXT: ret <4 x float> [[TMP0]] |
| // |
| float4 strict_elementwise_roundeven(float4 a) { |
| return __builtin_elementwise_roundeven(a); |
| } |
| |
| // CHECK-LABEL: define dso_local noundef <4 x float> @_Z24strict_elementwise_roundDv4_f |
| // CHECK-SAME: (<4 x float> noundef [[A:%.*]]) local_unnamed_addr #[[ATTR0]] { |
| // CHECK-NEXT: entry: |
| // CHECK-NEXT: [[TMP0:%.*]] = tail call <4 x float> @llvm.experimental.constrained.round.v4f32(<4 x float> [[A]], metadata !"fpexcept.strict") #[[ATTR4]] |
| // CHECK-NEXT: ret <4 x float> [[TMP0]] |
| // |
| float4 strict_elementwise_round(float4 a) { |
| return __builtin_elementwise_round(a); |
| } |
| |
| // CHECK-LABEL: define dso_local noundef <4 x float> @_Z23strict_elementwise_rintDv4_f |
| // CHECK-SAME: (<4 x float> noundef [[A:%.*]]) local_unnamed_addr #[[ATTR0]] { |
| // CHECK-NEXT: entry: |
| // CHECK-NEXT: [[TMP0:%.*]] = tail call <4 x float> @llvm.experimental.constrained.rint.v4f32(<4 x float> [[A]], metadata !"round.dynamic", metadata !"fpexcept.strict") #[[ATTR4]] |
| // CHECK-NEXT: ret <4 x float> [[TMP0]] |
| // |
| float4 strict_elementwise_rint(float4 a) { |
| return __builtin_elementwise_rint(a); |
| } |
| |
| // CHECK-LABEL: define dso_local noundef <4 x float> @_Z28strict_elementwise_nearbyintDv4_f |
| // CHECK-SAME: (<4 x float> noundef [[A:%.*]]) local_unnamed_addr #[[ATTR0]] { |
| // CHECK-NEXT: entry: |
| // CHECK-NEXT: [[TMP0:%.*]] = tail call <4 x float> @llvm.experimental.constrained.nearbyint.v4f32(<4 x float> [[A]], metadata !"round.dynamic", metadata !"fpexcept.strict") #[[ATTR4]] |
| // CHECK-NEXT: ret <4 x float> [[TMP0]] |
| // |
| float4 strict_elementwise_nearbyint(float4 a) { |
| return __builtin_elementwise_nearbyint(a); |
| } |
| |
| // CHECK-LABEL: define dso_local noundef <4 x float> @_Z23strict_elementwise_asinDv4_f |
| // CHECK-SAME: (<4 x float> noundef [[A:%.*]]) local_unnamed_addr #[[ATTR0]] { |
| // CHECK-NEXT: entry: |
| // CHECK-NEXT: [[TMP0:%.*]] = tail call <4 x float> @llvm.experimental.constrained.asin.v4f32(<4 x float> [[A]], metadata !"round.dynamic", metadata !"fpexcept.strict") #[[ATTR4]] |
| // CHECK-NEXT: ret <4 x float> [[TMP0]] |
| // |
| float4 strict_elementwise_asin(float4 a) { |
| return __builtin_elementwise_asin(a); |
| } |
| |
| // CHECK-LABEL: define dso_local noundef <4 x float> @_Z22strict_elementwise_sinDv4_f |
| // CHECK-SAME: (<4 x float> noundef [[A:%.*]]) local_unnamed_addr #[[ATTR0]] { |
| // CHECK-NEXT: entry: |
| // CHECK-NEXT: [[TMP0:%.*]] = tail call <4 x float> @llvm.experimental.constrained.sin.v4f32(<4 x float> [[A]], metadata !"round.dynamic", metadata !"fpexcept.strict") #[[ATTR4]] |
| // CHECK-NEXT: ret <4 x float> [[TMP0]] |
| // |
| float4 strict_elementwise_sin(float4 a) { |
| return __builtin_elementwise_sin(a); |
| } |
| |
| // CHECK-LABEL: define dso_local noundef <4 x float> @_Z23strict_elementwise_sinhDv4_f |
| // CHECK-SAME: (<4 x float> noundef [[A:%.*]]) local_unnamed_addr #[[ATTR0]] { |
| // CHECK-NEXT: entry: |
| // CHECK-NEXT: [[TMP0:%.*]] = tail call <4 x float> @llvm.experimental.constrained.sinh.v4f32(<4 x float> [[A]], metadata !"round.dynamic", metadata !"fpexcept.strict") #[[ATTR4]] |
| // CHECK-NEXT: ret <4 x float> [[TMP0]] |
| // |
| float4 strict_elementwise_sinh(float4 a) { |
| return __builtin_elementwise_sinh(a); |
| } |
| |
| // CHECK-LABEL: define dso_local noundef <4 x float> @_Z23strict_elementwise_sqrtDv4_f |
| // CHECK-SAME: (<4 x float> noundef [[A:%.*]]) local_unnamed_addr #[[ATTR0]] { |
| // CHECK-NEXT: entry: |
| // CHECK-NEXT: [[TMP0:%.*]] = tail call <4 x float> @llvm.experimental.constrained.sqrt.v4f32(<4 x float> [[A]], metadata !"round.dynamic", metadata !"fpexcept.strict") #[[ATTR4]] |
| // CHECK-NEXT: ret <4 x float> [[TMP0]] |
| // |
| float4 strict_elementwise_sqrt(float4 a) { |
| return __builtin_elementwise_sqrt(a); |
| } |
| |
| // CHECK-LABEL: define dso_local noundef <4 x float> @_Z23strict_elementwise_atanDv4_f |
| // CHECK-SAME: (<4 x float> noundef [[A:%.*]]) local_unnamed_addr #[[ATTR0]] { |
| // CHECK-NEXT: entry: |
| // CHECK-NEXT: [[TMP0:%.*]] = tail call <4 x float> @llvm.experimental.constrained.atan.v4f32(<4 x float> [[A]], metadata !"round.dynamic", metadata !"fpexcept.strict") #[[ATTR4]] |
| // CHECK-NEXT: ret <4 x float> [[TMP0]] |
| // |
| float4 strict_elementwise_atan(float4 a) { |
| return __builtin_elementwise_atan(a); |
| } |
| |
| // CHECK-LABEL: define dso_local noundef <4 x float> @_Z22strict_elementwise_tanDv4_f |
| // CHECK-SAME: (<4 x float> noundef [[A:%.*]]) local_unnamed_addr #[[ATTR0]] { |
| // CHECK-NEXT: entry: |
| // CHECK-NEXT: [[TMP0:%.*]] = tail call <4 x float> @llvm.experimental.constrained.tan.v4f32(<4 x float> [[A]], metadata !"round.dynamic", metadata !"fpexcept.strict") #[[ATTR4]] |
| // CHECK-NEXT: ret <4 x float> [[TMP0]] |
| // |
| float4 strict_elementwise_tan(float4 a) { |
| return __builtin_elementwise_tan(a); |
| } |
| |
| // CHECK-LABEL: define dso_local noundef <4 x float> @_Z23strict_elementwise_tanhDv4_f |
| // CHECK-SAME: (<4 x float> noundef [[A:%.*]]) local_unnamed_addr #[[ATTR0]] { |
| // CHECK-NEXT: entry: |
| // CHECK-NEXT: [[TMP0:%.*]] = tail call <4 x float> @llvm.experimental.constrained.tanh.v4f32(<4 x float> [[A]], metadata !"round.dynamic", metadata !"fpexcept.strict") #[[ATTR4]] |
| // CHECK-NEXT: ret <4 x float> [[TMP0]] |
| // |
| float4 strict_elementwise_tanh(float4 a) { |
| return __builtin_elementwise_tanh(a); |
| } |
| |
| // CHECK-LABEL: define dso_local noundef <4 x float> @_Z24strict_elementwise_atan2Dv4_fS_ |
| // CHECK-SAME: (<4 x float> noundef [[A:%.*]], <4 x float> noundef [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { |
| // CHECK-NEXT: entry: |
| // CHECK-NEXT: [[TMP0:%.*]] = tail call <4 x float> @llvm.experimental.constrained.atan2.v4f32(<4 x float> [[A]], <4 x float> [[B]], metadata !"round.dynamic", metadata !"fpexcept.strict") #[[ATTR4]] |
| // CHECK-NEXT: ret <4 x float> [[TMP0]] |
| // |
| float4 strict_elementwise_atan2(float4 a, float4 b) { |
| return __builtin_elementwise_atan2(a, b); |
| } |
| |
| // CHECK-LABEL: define dso_local noundef <4 x float> @_Z24strict_elementwise_truncDv4_f |
| // CHECK-SAME: (<4 x float> noundef [[A:%.*]]) local_unnamed_addr #[[ATTR0]] { |
| // CHECK-NEXT: entry: |
| // CHECK-NEXT: [[TMP0:%.*]] = tail call <4 x float> @llvm.experimental.constrained.trunc.v4f32(<4 x float> [[A]], metadata !"fpexcept.strict") #[[ATTR4]] |
| // CHECK-NEXT: ret <4 x float> [[TMP0]] |
| // |
| float4 strict_elementwise_trunc(float4 a) { |
| return __builtin_elementwise_trunc(a); |
| } |
| |
| // CHECK-LABEL: define dso_local noundef <4 x float> @_Z22strict_elementwise_fmaDv4_fS_S_ |
| // CHECK-SAME: (<4 x float> noundef [[A:%.*]], <4 x float> noundef [[B:%.*]], <4 x float> noundef [[C:%.*]]) local_unnamed_addr #[[ATTR0]] { |
| // CHECK-NEXT: entry: |
| // CHECK-NEXT: [[TMP0:%.*]] = tail call <4 x float> @llvm.experimental.constrained.fma.v4f32(<4 x float> [[A]], <4 x float> [[B]], <4 x float> [[C]], metadata !"round.dynamic", metadata !"fpexcept.strict") #[[ATTR4]] |
| // CHECK-NEXT: ret <4 x float> [[TMP0]] |
| // |
| float4 strict_elementwise_fma(float4 a, float4 b, float4 c) { |
| return __builtin_elementwise_fma(a, b, c); |
| } |
| |
| // CHECK-LABEL: define dso_local noundef <4 x float> @_Z22strict_elementwise_powDv4_fS_ |
| // CHECK-SAME: (<4 x float> noundef [[A:%.*]], <4 x float> noundef [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { |
| // CHECK-NEXT: entry: |
| // CHECK-NEXT: [[TMP0:%.*]] = tail call <4 x float> @llvm.experimental.constrained.pow.v4f32(<4 x float> [[A]], <4 x float> [[B]], metadata !"round.dynamic", metadata !"fpexcept.strict") #[[ATTR4]] |
| // CHECK-NEXT: ret <4 x float> [[TMP0]] |
| // |
| float4 strict_elementwise_pow(float4 a, float4 b) { |
| return __builtin_elementwise_pow(a, b); |
| } |
| |
| // CHECK-LABEL: define dso_local noundef <4 x float> @_Z23strict_elementwise_fmodDv4_fS_ |
| // CHECK-SAME: (<4 x float> noundef [[A:%.*]], <4 x float> noundef [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { |
| // CHECK-NEXT: entry: |
| // CHECK-NEXT: [[TMP0:%.*]] = tail call <4 x float> @llvm.experimental.constrained.frem.v4f32(<4 x float> [[A]], <4 x float> [[B]], metadata !"round.dynamic", metadata !"fpexcept.strict") #[[ATTR4]] |
| // CHECK-NEXT: ret <4 x float> [[TMP0]] |
| // |
| float4 strict_elementwise_fmod(float4 a, float4 b) { |
| return __builtin_elementwise_fmod(a, b); |
| } |