brintos

brintos / llvm-project-archived public Read only

0
0
Text · 12.1 KiB · 76c38f9 Raw
290 lines · c
1// RUN: %clang_cc1 -fexperimental-strict-floating-point -ffp-exception-behavior=strict -triple %itanium_abi_triple -emit-llvm %s -o - | FileCheck --check-prefixes=CHECK,STRICT %s2// RUN: %clang_cc1 -fexperimental-strict-floating-point -frounding-math -ffp-exception-behavior=strict -triple %itanium_abi_triple -emit-llvm %s -o - | FileCheck --check-prefixes=CHECK,STRICT-RND %s3// RUN: %clang_cc1 -fexperimental-strict-floating-point -ffp-exception-behavior=strict -triple %itanium_abi_triple -emit-llvm %s -o - -fms-extensions -DMS | FileCheck --check-prefixes=CHECK,STRICT %s4// RUN: %clang_cc1 -fexperimental-strict-floating-point -frounding-math -ffp-exception-behavior=strict -triple %itanium_abi_triple -emit-llvm %s -o - -fms-extensions -DMS | FileCheck --check-prefixes=CHECK,STRICT-RND %s5// RUN: %clang_cc1 -fexperimental-strict-floating-point -triple %itanium_abi_triple -emit-llvm %s -o - | FileCheck --check-prefixes=CHECK,DEFAULT %s6// RUN: %clang_cc1 -fexperimental-strict-floating-point -frounding-math -triple %itanium_abi_triple -emit-llvm %s -o - | FileCheck --check-prefixes=CHECK,DEFAULT-RND %s7 8float func_00(float x, float y) {9  return x + y;10}11// CHECK-LABEL: @func_0012// STRICT: call float @llvm.experimental.constrained.fadd.f32(float {{.*}}, float {{.*}}, metadata !"round.tonearest", metadata !"fpexcept.strict")13// STRICT-RND: call float @llvm.experimental.constrained.fadd.f32(float {{.*}}, float {{.*}}, metadata !"round.dynamic", metadata !"fpexcept.strict")14// DEFAULT-RND: call float @llvm.experimental.constrained.fadd.f32(float {{.*}}, float {{.*}}, metadata !"round.dynamic", metadata !"fpexcept.ignore")15// DEFAULT: fadd float16 17 18#ifdef MS19#pragma fenv_access (on)20#else21#pragma STDC FENV_ACCESS ON22#endif23 24float func_01(float x, float y) {25  return x + y;26}27// CHECK-LABEL: @func_0128// CHECK: call float @llvm.experimental.constrained.fadd.f32(float {{.*}}, float {{.*}}, metadata !"round.dynamic", metadata !"fpexcept.strict")29 30 31float func_02(float x, float y) {32  #pragma float_control(except, off)33  #pragma STDC FENV_ACCESS OFF34  return x + y;35}36// CHECK-LABEL: @func_0237// CHECK: call float @llvm.experimental.constrained.fadd.f32(float {{.*}}, float {{.*}}, metadata !"round.tonearest", metadata !"fpexcept.ignore")38 39 40float func_03(float x, float y) {41  return x + y;42}43// CHECK-LABEL: @func_0344// CHECK: call float @llvm.experimental.constrained.fadd.f32(float {{.*}}, float {{.*}}, metadata !"round.dynamic", metadata !"fpexcept.strict")45 46 47#ifdef MS48#pragma fenv_access (off)49#else50#pragma STDC FENV_ACCESS OFF51#endif52 53float func_04(float x, float y) {54  #pragma float_control(except, off)55  return x + y;56}57// CHECK-LABEL: @func_0458// STRICT: call float @llvm.experimental.constrained.fadd.f32(float {{.*}}, float {{.*}}, metadata !"round.tonearest", metadata !"fpexcept.ignore")59// DEFAULT: fadd float60 61 62float func_04a(float x, float y) {63  #pragma float_control(except, on)64  return x + y;65}66// CHECK-LABEL: @func_04a67// CHECK: call float @llvm.experimental.constrained.fadd.f32(float {{.*}}, float {{.*}}, metadata !"round.tonearest", metadata !"fpexcept.strict")68 69 70float func_05(float x, float y) {71  #pragma STDC FENV_ACCESS ON72  return x + y;73}74// CHECK-LABEL: @func_0575// CHECK: call float @llvm.experimental.constrained.fadd.f32(float {{.*}}, float {{.*}}, metadata !"round.dynamic", metadata !"fpexcept.strict")76 77 78float func_06(float x, float y) {79  #pragma float_control(except, off)80  return x + y;81}82// CHECK-LABEL: @func_0683// STRICT: call float @llvm.experimental.constrained.fadd.f32(float {{.*}}, float {{.*}}, metadata !"round.tonearest", metadata !"fpexcept.ignore")84// DEFAULT: fadd float85 86 87float func_07(float x, float y) {88  x -= y;89  if (x) {90    #pragma STDC FENV_ACCESS ON91    y *= 2.0F;92  }93  return y + 4.0F;94}95// CHECK-LABEL: @func_0796// STRICT: call float @llvm.experimental.constrained.fsub.f32(float {{.*}}, float {{.*}}, metadata !"round.tonearest", metadata !"fpexcept.strict")97// STRICT: call float @llvm.experimental.constrained.fmul.f32(float {{.*}}, float {{.*}}, metadata !"round.dynamic", metadata !"fpexcept.strict")98// STRICT: call float @llvm.experimental.constrained.fadd.f32(float {{.*}}, float {{.*}}, metadata !"round.tonearest", metadata !"fpexcept.strict")99// DEFAULT: call float @llvm.experimental.constrained.fsub.f32(float {{.*}}, float {{.*}}, metadata !"round.tonearest", metadata !"fpexcept.ignore")100// DEFAULT: call float @llvm.experimental.constrained.fmul.f32(float {{.*}}, float {{.*}}, metadata !"round.dynamic", metadata !"fpexcept.strict")101// DEFAULT: call float @llvm.experimental.constrained.fadd.f32(float {{.*}}, float {{.*}}, metadata !"round.tonearest", metadata !"fpexcept.ignore")102 103 104float func_08(float x, float y) {105  #pragma STDC FENV_ROUND FE_UPWARD106  #pragma STDC FENV_ACCESS ON107  return x + y;108}109// CHECK-LABEL: @func_08110// CHECK:  call float @llvm.experimental.constrained.fadd.f32({{.*}}, metadata !"round.upward", metadata !"fpexcept.strict")111 112 113float func_09(float x, float y) {114  #pragma STDC FENV_ROUND FE_TONEAREST115  #pragma STDC FENV_ACCESS ON116  return x + y;117}118// CHECK-LABEL: @func_09119// CHECK: call float @llvm.experimental.constrained.fadd.f32(float {{.*}}, float {{.*}}, metadata !"round.tonearest", metadata !"fpexcept.strict")120 121 122float func_10(float x, float y) {123  #pragma STDC FENV_ROUND FE_TONEAREST124  #pragma clang fp exceptions(ignore)125  #pragma STDC FENV_ACCESS ON126  return x + y;127}128// CHECK-LABEL: @func_10129// CHECK: call float @llvm.experimental.constrained.fadd.f32(float {{.*}}, float {{.*}}, metadata !"round.tonearest", metadata !"fpexcept.ignore")130 131 132float func_11(float x, float y) {133  #pragma STDC FENV_ROUND FE_TONEAREST134  #pragma clang fp exceptions(ignore)135  #pragma STDC FENV_ACCESS OFF136  return x + y;137}138// CHECK-LABEL: @func_11139// STRICT: call float @llvm.experimental.constrained.fadd.f32(float {{.*}}, float {{.*}}, metadata !"round.tonearest", metadata !"fpexcept.ignore")140// DEFAULT: fadd float141 142 143float func_12(float x, float y) {144  #pragma clang fp exceptions(maytrap)145  #pragma STDC FENV_ACCESS ON146  return x + y;147}148// CHECK-LABEL: @func_12149// CHECK:  call float @llvm.experimental.constrained.fadd.f32({{.*}}, metadata !"round.dynamic", metadata !"fpexcept.maytrap")150 151 152float func_13(float x, float y) {153  #pragma clang fp exceptions(maytrap)154  #pragma STDC FENV_ROUND FE_UPWARD155  #pragma STDC FENV_ACCESS ON156  return x + y;157}158// CHECK-LABEL: @func_13159// CHECK:  call float @llvm.experimental.constrained.fadd.f32({{.*}}, metadata !"round.upward", metadata !"fpexcept.maytrap")160 161 162float func_14(float x, float y, float z) {163  #pragma STDC FENV_ACCESS ON164  float res = x * y;165  {166    #pragma STDC FENV_ACCESS OFF167    return res + z;168  }169}170// CHECK-LABEL: @func_14171// STRICT:  call float @llvm.experimental.constrained.fmul.f32({{.*}}, metadata !"round.dynamic", metadata !"fpexcept.strict")172// STRICT:  call float @llvm.experimental.constrained.fadd.f32({{.*}}, metadata !"round.tonearest", metadata !"fpexcept.strict")173// DEFAULT: call float @llvm.experimental.constrained.fmul.f32({{.*}}, metadata !"round.dynamic", metadata !"fpexcept.strict")174// DEFAULT: call float @llvm.experimental.constrained.fadd.f32({{.*}}, metadata !"round.tonearest", metadata !"fpexcept.ignore")175 176 177float func_15(float x, float y, float z) {178  #pragma STDC FENV_ROUND FE_TOWARDZERO179  #pragma STDC FENV_ACCESS ON180  float res = x * y;181  {182    #pragma STDC FENV_ACCESS OFF183    return res + z;184  }185}186// CHECK-LABEL: @func_15187// STRICT:  call float @llvm.experimental.constrained.fmul.f32({{.*}}, metadata !"round.towardzero", metadata !"fpexcept.strict")188// STRICT:  call float @llvm.experimental.constrained.fadd.f32({{.*}}, metadata !"round.towardzero", metadata !"fpexcept.strict")189// DEFAULT: call float @llvm.experimental.constrained.fmul.f32({{.*}}, metadata !"round.towardzero", metadata !"fpexcept.strict")190// DEFAULT: call float @llvm.experimental.constrained.fadd.f32({{.*}}, metadata !"round.towardzero", metadata !"fpexcept.ignore")191 192 193float func_16(float x, float y) {194  x -= y;195  {196    #pragma STDC FENV_ROUND FE_TONEAREST197    #pragma STDC FENV_ACCESS ON198    y *= 2.0F;199  }200  {201    #pragma STDC FENV_ACCESS ON202    return y + 4.0F;203  }204}205// CHECK-LABEL: @func_16206// STRICT: call float @llvm.experimental.constrained.fsub.f32(float {{.*}}, float {{.*}}, metadata !"round.tonearest", metadata !"fpexcept.strict")207// STRICT: call float @llvm.experimental.constrained.fmul.f32(float {{.*}}, float {{.*}}, metadata !"round.tonearest", metadata !"fpexcept.strict")208// STRICT: call float @llvm.experimental.constrained.fadd.f32(float {{.*}}, float {{.*}}, metadata !"round.dynamic", metadata !"fpexcept.strict")209// DEFAULT: call float @llvm.experimental.constrained.fsub.f32(float {{.*}}, float {{.*}}, metadata !"round.tonearest", metadata !"fpexcept.ignore")210// DEFAULT: call float @llvm.experimental.constrained.fmul.f32(float {{.*}}, float {{.*}}, metadata !"round.tonearest", metadata !"fpexcept.strict")211// DEFAULT: call float @llvm.experimental.constrained.fadd.f32(float {{.*}}, float {{.*}}, metadata !"round.dynamic", metadata !"fpexcept.strict")212 213 214float func_17(float x, float y) {215  #pragma STDC FENV_ROUND FE_DYNAMIC216  #pragma STDC FENV_ACCESS ON217  return x + y;218}219// CHECK-LABEL: @func_17220// CHECK: call float @llvm.experimental.constrained.fadd.f32(float {{.*}}, float {{.*}}, metadata !"round.dynamic", metadata !"fpexcept.strict")221 222 223float func_18(float x, float y) {224  #pragma STDC FENV_ROUND FE_DYNAMIC225  return x + y;226}227// CHECK-LABEL: @func_18228// STRICT: call float @llvm.experimental.constrained.fadd.f32(float {{.*}}, float {{.*}}, metadata !"round.tonearest", metadata !"fpexcept.strict")229// DEFAULT: fadd float230 231#pragma STDC FENV_ACCESS ON232float func_19(float x, float y) {233  return x + y;234}235// CHECK-LABEL: @func_19236// STRICT:  call float @llvm.experimental.constrained.fadd.f32(float {{.*}}, float {{.*}}, metadata !"round.dynamic", metadata !"fpexcept.strict")237 238#pragma STDC FENV_ACCESS OFF239float func_20(float x, float y) {240  return x + y;241}242// CHECK-LABEL: @func_20243// STRICT: call float @llvm.experimental.constrained.fadd.f32(float {{.*}}, float {{.*}}, metadata !"round.tonearest", metadata !"fpexcept.strict")244// DEFAULT: fadd float245 246typedef double vector4double __attribute__((__vector_size__(32)));247typedef float  vector4float  __attribute__((__vector_size__(16)));248vector4float func_21(vector4double x) {249  #pragma STDC FENV_ROUND FE_UPWARD250  return __builtin_convertvector(x, vector4float);251}252// CHECK-LABEL: @func_21253// STRICT: call <4 x float> @llvm.experimental.constrained.fptrunc.v4f32.v4f64(<4 x double> {{.*}}, metadata !"round.upward", metadata !"fpexcept.strict")254 255typedef short vector8short __attribute__((__vector_size__(16)));256typedef double vector8double __attribute__((__vector_size__(64)));257vector8double func_24(vector8short x) {258  #pragma STDC FENV_ROUND FE_TOWARDZERO259  return __builtin_convertvector(x, vector8double);260}261// CHECK-LABEL: @func_24262// STRICT: call <8 x double> @llvm.experimental.constrained.sitofp.v8f64.v8i16(<8 x i16> {{.*}}, metadata !"round.towardzero", metadata !"fpexcept.strict")263 264typedef unsigned int vector16uint __attribute__((__vector_size__(64)));265typedef double vector16double __attribute__((__vector_size__(128)));266vector16double func_25(vector16uint x) {267  #pragma STDC FENV_ROUND FE_DOWNWARD268  return __builtin_convertvector(x, vector16double);269}270// CHECK-LABEL: @func_25271// STRICT: call <16 x double> @llvm.experimental.constrained.uitofp.v16f64.v16i32(<16 x i32> {{.*}}, metadata !"round.downward", metadata !"fpexcept.strict")272 273typedef float vector2float __attribute__((__vector_size__(8)));274typedef char vector2char __attribute__((__vector_size__(2)));275vector2char func_22(vector2float x) {276  #pragma float_control(except, off)277  return __builtin_convertvector(x, vector2char);278}279// CHECK-LABEL: @func_22280// STRICT: call <2 x i8> @llvm.experimental.constrained.fptosi.v2i8.v2f32(<2 x float> {{.*}}, metadata !"fpexcept.ignore")281 282typedef float vector3float __attribute__((__vector_size__(12)));283typedef unsigned long long vector3ulong __attribute__((__vector_size__(24)));284vector3ulong func_23(vector3float x) {285  #pragma float_control(except, off)286  return __builtin_convertvector(x, vector3ulong);287}288// CHECK-LABEL: @func_23289// STRICT: call <3 x i64> @llvm.experimental.constrained.fptoui.v3i64.v3f32(<3 x float> {{.*}}, metadata !"fpexcept.ignore")290