159 lines · c
1// REQUIRES: powerpc-registered-target2// RUN: %clang_cc1 -triple powerpc64le-gnu-linux -target-feature +vsx \3// RUN: -emit-llvm %s -o - | FileCheck --check-prefix=CHECK-UNCONSTRAINED %s4// RUN: %clang_cc1 -triple powerpc64le-gnu-linux -target-feature +vsx \5// RUN: -ffp-exception-behavior=strict -emit-llvm %s -o - | FileCheck \6// RUN: --check-prefix=CHECK-CONSTRAINED -vv %s7// RUN: %clang_cc1 -triple powerpc64le-gnu-linux -target-feature +vsx \8// RUN: -S -o - %s | \9// RUN: FileCheck --check-prefix=CHECK-ASM --check-prefix=NOT-FIXME-CHECK %s10// RUN: %clang_cc1 -triple powerpc64le-gnu-linux -target-feature +vsx \11// RUN: -S -ffp-exception-behavior=strict \12// RUN: -o - %s | FileCheck --check-prefix=CHECK-ASM \13// RUN: --check-prefix=FIXME-CHECK %s14// RUN: %clang_cc1 -triple powerpc -ffp-exception-behavior=strict \15// RUN: -target-feature +vsx -fexperimental-strict-floating-point -emit-llvm \16// RUN: %s -o - | FileCheck --check-prefix=CHECK-CONSTRAINED %s17 18typedef __attribute__((vector_size(4 * sizeof(float)))) float vec_float;19typedef __attribute__((vector_size(2 * sizeof(double)))) double vec_double;20 21volatile vec_double vd;22volatile vec_float vf;23 24void test_float(void) {25 vf = __builtin_vsx_xvsqrtsp(vf);26 // CHECK-LABEL: try-xvsqrtsp27 // CHECK-UNCONSTRAINED: @llvm.sqrt.v4f32(<4 x float> %{{.*}})28 // CHECK-CONSTRAINED: @llvm.experimental.constrained.sqrt.v4f32(<4 x float> %{{.*}}, metadata !"round.tonearest", metadata !"fpexcept.strict")29 // CHECK-ASM: xvsqrtsp30 31 vd = __builtin_vsx_xvsqrtdp(vd);32 // CHECK-LABEL: try-xvsqrtdp33 // CHECK-UNCONSTRAINED: @llvm.sqrt.v2f64(<2 x double> %{{.*}})34 // CHECK-CONSTRAINED: @llvm.experimental.constrained.sqrt.v2f64(<2 x double> %{{.*}}, metadata !"round.tonearest", metadata !"fpexcept.strict")35 // CHECK-ASM: xvsqrtdp36 37 vf = __builtin_vsx_xvrspim(vf);38 // CHECK-LABEL: try-xvrspim39 // CHECK-UNCONSTRAINED: @llvm.floor.v4f32(<4 x float> %{{.*}})40 // CHECK-CONSTRAINED: @llvm.experimental.constrained.floor.v4f32(<4 x float> %{{.*}}, metadata !"fpexcept.strict")41 // CHECK-ASM: xvrspim42 43 vd = __builtin_vsx_xvrdpim(vd);44 // CHECK-LABEL: try-xvrdpim45 // CHECK-UNCONSTRAINED: @llvm.floor.v2f64(<2 x double> %{{.*}})46 // CHECK-CONSTRAINED: @llvm.experimental.constrained.floor.v2f64(<2 x double> %{{.*}}, metadata !"fpexcept.strict")47 // CHECK-ASM: xvrdpim48 49 vf = __builtin_vsx_xvrspi(vf);50 // CHECK-LABEL: try-xvrspi51 // CHECK-UNCONSTRAINED: @llvm.round.v4f32(<4 x float> %{{.*}})52 // CHECK-CONSTRAINED: @llvm.experimental.constrained.round.v4f32(<4 x float> %{{.*}}, metadata !"fpexcept.strict")53 // CHECK-ASM: xvrspi54 55 vd = __builtin_vsx_xvrdpi(vd);56 // CHECK-LABEL: try-xvrdpi57 // CHECK-UNCONSTRAINED: @llvm.round.v2f64(<2 x double> %{{.*}})58 // CHECK-CONSTRAINED: @llvm.experimental.constrained.round.v2f64(<2 x double> %{{.*}}, metadata !"fpexcept.strict")59 // CHECK-ASM: xvrdpi60 61 vf = __builtin_vsx_xvrspic(vf);62 // CHECK-LABEL: try-xvrspic63 // CHECK-UNCONSTRAINED: @llvm.rint.v4f32(<4 x float> %{{.*}})64 // CHECK-CONSTRAINED: @llvm.experimental.constrained.rint.v4f32(<4 x float> %{{.*}}, metadata !"round.tonearest", metadata !"fpexcept.strict")65 // CHECK-ASM: xvrspic66 67 vd = __builtin_vsx_xvrdpic(vd);68 // CHECK-LABEL: try-xvrdpic69 // CHECK-UNCONSTRAINED: @llvm.rint.v2f64(<2 x double> %{{.*}})70 // CHECK-CONSTRAINED: @llvm.experimental.constrained.rint.v2f64(<2 x double> %{{.*}}, metadata !"round.tonearest", metadata !"fpexcept.strict")71 // CHECK-ASM: xvrdpic72 73 vf = __builtin_vsx_xvrspip(vf);74 // CHECK-LABEL: try-xvrspip75 // CHECK-UNCONSTRAINED: @llvm.ceil.v4f32(<4 x float> %{{.*}})76 // CHECK-CONSTRAINED: @llvm.experimental.constrained.ceil.v4f32(<4 x float> %{{.*}}, metadata !"fpexcept.strict")77 // CHECK-ASM: xvrspip78 79 vd = __builtin_vsx_xvrdpip(vd);80 // CHECK-LABEL: try-xvrdpip81 // CHECK-UNCONSTRAINED: @llvm.ceil.v2f64(<2 x double> %{{.*}})82 // CHECK-CONSTRAINED: @llvm.experimental.constrained.ceil.v2f64(<2 x double> %{{.*}}, metadata !"fpexcept.strict")83 // CHECK-ASM: xvrdpip84 85 vf = __builtin_vsx_xvrspiz(vf);86 // CHECK-LABEL: try-xvrspiz87 // CHECK-UNCONSTRAINED: @llvm.trunc.v4f32(<4 x float> %{{.*}})88 // CHECK-CONSTRAINED: @llvm.experimental.constrained.trunc.v4f32(<4 x float> %{{.*}}, metadata !"fpexcept.strict")89 // CHECK-ASM: xvrspiz90 91 vd = __builtin_vsx_xvrdpiz(vd);92 // CHECK-LABEL: try-xvrdpiz93 // CHECK-UNCONSTRAINED: @llvm.trunc.v2f64(<2 x double> %{{.*}})94 // CHECK-CONSTRAINED: @llvm.experimental.constrained.trunc.v2f64(<2 x double> %{{.*}}, metadata !"fpexcept.strict")95 // CHECK-ASM: xvrdpiz96 97 vf = __builtin_vsx_xvmaddasp(vf, vf, vf);98 // CHECK-LABEL: try-xvmaddasp99 // CHECK-UNCONSTRAINED: @llvm.fma.v4f32(<4 x float> %{{.*}}, <4 x float> %{{.*}}, <4 x float> %{{.*}})100 // CHECK-CONSTRAINED: @llvm.experimental.constrained.fma.v4f32(<4 x float> %{{.*}}, <4 x float> %{{.*}}, <4 x float> %{{.*}}, metadata !"round.tonearest", metadata !"fpexcept.strict")101 // CHECK-ASM: xvmaddasp102 103 vd = __builtin_vsx_xvmaddadp(vd, vd, vd);104 // CHECK-LABEL: try-xvmaddadp105 // CHECK-UNCONSTRAINED: @llvm.fma.v2f64(<2 x double> %{{.*}}, <2 x double> %{{.*}}, <2 x double> %{{.*}})106 // CHECK-CONSTRAINED: @llvm.experimental.constrained.fma.v2f64(<2 x double> %{{.*}}, <2 x double> %{{.*}}, <2 x double> %{{.*}}, metadata !"round.tonearest", metadata !"fpexcept.strict")107 // CHECK-ASM: xvmaddadp108 109 vf = __builtin_vsx_xvnmaddasp(vf, vf, vf);110 // CHECK-LABEL: try-xvnmaddasp111 // CHECK-UNCONSTRAINED: [[RESULT:%[^ ]+]] = call <4 x float> @llvm.fma.v4f32(<4 x float> %{{.*}}, <4 x float> %{{.*}}, <4 x float> %{{.*}})112 // CHECK-UNCONSTRAINED: fneg <4 x float> [[RESULT]]113 // CHECK-CONSTRAINED: [[RESULT:%[^ ]+]] = call <4 x float> @llvm.experimental.constrained.fma.v4f32(<4 x float> %{{.*}}, <4 x float> %{{.*}}, <4 x float> %{{.*}}, metadata !"round.tonearest", metadata !"fpexcept.strict")114 // CHECK-CONSTRAINED: fneg <4 x float> [[RESULT]]115 // NOT-FIXME-CHECK: xvnmaddasp116 // FIXME-CHECK: xvmaddasp117 // FIXME-CHECK: xvnegsp118 119 vd = __builtin_vsx_xvnmaddadp(vd, vd, vd);120 // CHECK-LABEL: try-xvnmaddadp121 // CHECK-UNCONSTRAINED: [[RESULT:%[^ ]+]] = call <2 x double> @llvm.fma.v2f64(<2 x double> %{{.*}}, <2 x double> %{{.*}}, <2 x double> %{{.*}})122 // CHECK-UNCONSTRAINED: fneg <2 x double> [[RESULT]]123 // CHECK-CONSTRAINED: [[RESULT:%[^ ]+]] = call <2 x double> @llvm.experimental.constrained.fma.v2f64(<2 x double> %{{.*}}, <2 x double> %{{.*}}, <2 x double> %{{.*}}, metadata !"round.tonearest", metadata !"fpexcept.strict")124 // CHECK-CONSTRAINED: fneg <2 x double> [[RESULT]]125 // CHECK-ASM: xvnmaddadp126 127 vf = __builtin_vsx_xvmsubasp(vf, vf, vf);128 // CHECK-LABEL: try-xvmsubasp129 // CHECK-UNCONSTRAINED: [[RESULT:%[^ ]+]] = fneg <4 x float> %{{.*}}130 // CHECK-UNCONSTRAINED: @llvm.fma.v4f32(<4 x float> %{{.*}}, <4 x float> %{{.*}}, <4 x float> [[RESULT]])131 // CHECK-CONSTRAINED: [[RESULT:%[^ ]+]] = fneg <4 x float> %{{.*}}132 // CHECK-CONSTRAINED: @llvm.experimental.constrained.fma.v4f32(<4 x float> %{{.*}}, <4 x float> %{{.*}}, <4 x float> [[RESULT]], metadata !"round.tonearest", metadata !"fpexcept.strict")133 // CHECK-ASM: xvmsubasp134 135 vd = __builtin_vsx_xvmsubadp(vd, vd, vd);136 // CHECK-LABEL: try-xvmsubadp137 // CHECK-UNCONSTRAINED: [[RESULT:%[^ ]+]] = fneg <2 x double> %{{.*}}138 // CHECK-UNCONSTRAINED: @llvm.fma.v2f64(<2 x double> %{{.*}}, <2 x double> %{{.*}}, <2 x double> [[RESULT]])139 // CHECK-CONSTRAINED: [[RESULT:%[^ ]+]] = fneg <2 x double> %{{.*}}140 // CHECK-CONSTRAINED: @llvm.experimental.constrained.fma.v2f64(<2 x double> %{{.*}}, <2 x double> %{{.*}}, <2 x double> [[RESULT]], metadata !"round.tonearest", metadata !"fpexcept.strict")141 // CHECK-ASM: xvmsubadp142 143 vf = __builtin_vsx_xvnmsubasp(vf, vf, vf);144 // CHECK-LABEL: try-xvnmsubasp145 // CHECK-UNCONSTRAINED: call <4 x float> @llvm.ppc.fnmsub.v4f32(<4 x float> %{{.*}}, <4 x float> %{{.*}}, <4 x float> %{{.*}})146 // CHECK-CONSTRAINED: [[RESULT0:%[^ ]+]] = fneg <4 x float> %{{.*}}147 // CHECK-CONSTRAINED: [[RESULT1:%[^ ]+]] = call <4 x float> @llvm.experimental.constrained.fma.v4f32(<4 x float> %{{.*}}, <4 x float> %{{.*}}, <4 x float> [[RESULT0]], metadata !"round.tonearest", metadata !"fpexcept.strict")148 // CHECK-CONSTRAINED: fneg <4 x float> [[RESULT1]]149 // CHECK-ASM: xvnmsubasp150 151 vd = __builtin_vsx_xvnmsubadp(vd, vd, vd);152 // CHECK-LABEL: try-xvnmsubadp153 // CHECK-UNCONSTRAINED: call <2 x double> @llvm.ppc.fnmsub.v2f64(<2 x double> %{{.*}}, <2 x double> %{{.*}}, <2 x double> %{{.*}})154 // CHECK-CONSTRAINED: [[RESULT0:%[^ ]+]] = fneg <2 x double> %{{.*}}155 // CHECK-CONSTRAINED: [[RESULT1:%[^ ]+]] = call <2 x double> @llvm.experimental.constrained.fma.v2f64(<2 x double> %{{.*}}, <2 x double> %{{.*}}, <2 x double> [[RESULT0]], metadata !"round.tonearest", metadata !"fpexcept.strict")156 // CHECK-CONSTRAINED: fneg <2 x double> [[RESULT1]]157 // CHECK-ASM: xvnmsubadp158}159