From edeacc1415d3cd9c67463c600fa11d0689bae9e9 Mon Sep 17 00:00:00 2001 From: Uros Bizjak Date: Sat, 4 Sep 2004 09:55:12 +0200 Subject: builtins.c (expand_builtin_mathfn): Handle BUILT_IN_RINT{,F,L} using rint_optab. 2004-09-04 Uros Bizjak * builtins.c (expand_builtin_mathfn): Handle BUILT_IN_RINT{,F,L} using rint_optab. (expand_builtin): Expand BUILT_IN_RINT{,F,L} using expand_builtin_mathfn. * genopinit.c (optabs): Rename trunc_optab to btrunc_optab. Use btrunc?f patterns for btrunc_optab. Implement rint_optab using rint?f patterns. * optabs.c (init_optabs): Initialize rint_optab. * optabs.h (enum optab_index): Rename OTI_trunc to OTI_btrunc. Add new OTI_rint. (btrunc_optab): Rename macro from trunc_optab. (rint_optab): Define corresponding macro. * reg-stack.c (subst_stack_regs_pat): Handle UNSPEC_FRNDINT_FLOOR, UNSPEC_FRNDINT_CEIL, UNSPEC_FRNDINT_TRUNC, UNSPEC_FRNDINT_MASK_PM. * config/i386/i386-protos.h (emit_i387_cw_initialization): Change prototype. Add new int parameter. * config/i386/i386.c (emit_i387_cw_initialization): Handle new rounding modes. * config/i386/i386.h (enum fp_cw_mode): Delete. (MODE_NEEDED): Handle new rounding modes. (EMIT_MODE_SET): Change condition to handle new rounding modes. * config/i386/i386.md (UNSPEC_FRNDINT_FLOOR, UNSPEC_FRNDINT_CEIL, UNSPEC_FRNDINT_TRUNC, UNSPEC_FRNDINT_MASK_PM): New unspecs to represent different rounding modes of frndint insn. (type): Add frndint type. (i387, length, memory): Handle this type. (i387_cw): New attribute definition. (*fix_truncdi_1, fix_truncdi_nomemory, fix_truncdi_memory, *fix_truncsi_1, fix_truncsi_nomemory, fix_truncsi_memory, *fix_trunchi_1, fix_trunchi_nomemory, fix_trunchi_memory): Add "i387_cw" attribute defined to "trunc". (x86_fnstcw_1): Remove comment. (*frndintxf2): Rename insn definition to frndintxf2. Move insn definition near rint?f2 expanders. (rintdf2, rintsf2, rintxf2): New expanders to implement rint, rintf and rintl built-ins as inline x87 intrinsics. (frndintxf2_floor): New pattern to implement floor rounding mode with frndint x87 instruction. (floordf2, floorsf2, floorxf2): New expanders to implement floor, floorf and floorl built-ins as inline x87 intrinsics. (frndintxf2_ceil): New pattern to implement ceil rounding mode with frndint x87 instruction. (ceildf2, ceilsf2, ceilxf2): New expanders to implement ceil, ceilf and ceill built-ins as inline x87 intrinsics. (frndintxf2_trunc): New pattern to implement trunc rounding mode with frndint x87 instruction. (btruncdf2, btruncsf2, btruncxf2): New expanders to implement trunc, truncf and truncl built-ins as inline x87 intrinsics. (frndintxf2_mask_pm): New pattern to implement rounding mode with exceptions with frndint x87 instruction. (nearbyintdf2, nearbyintsf2, nearbyintxf2): New expanders to implement nearbyint, nearbyintf and nearbyintl built-ins as inline x87 intrinsics. * testsuite/gcc.dg/builtins-46.c: New. From-SVN: r87076 --- gcc/testsuite/gcc.dg/builtins-46.c | 105 +++++++++++++++++++++++++++++++++++++ 1 file changed, 105 insertions(+) create mode 100644 gcc/testsuite/gcc.dg/builtins-46.c (limited to 'gcc/testsuite/gcc.dg/builtins-46.c') diff --git a/gcc/testsuite/gcc.dg/builtins-46.c b/gcc/testsuite/gcc.dg/builtins-46.c new file mode 100644 index 0000000..67c979f --- /dev/null +++ b/gcc/testsuite/gcc.dg/builtins-46.c @@ -0,0 +1,105 @@ +/* Copyright (C) 2004 Free Software Foundation. + + Check that rint, rintf, rintl, floor, floorf, floorl, + ceil, ceilf, ceill, trunc, truncf, truncl, + nearbyint, nearbyintf and nearbyintl + built-in functions compile. + + Written by Uros Bizjak, 25th Aug 2004. */ + +/* { dg-do compile } */ +/* { dg-options "-O2 -ffast-math" } */ + +extern double rint(double); +extern double floor(double); +extern double ceil(double); +extern double trunc(double); +extern double nearbyint(double); + +extern float rintf(float); +extern float floorf(float); +extern float ceilf(float); +extern float truncf(float); +extern float nearbyintf(float); + +extern long double rintl(long double); +extern long double floorl(long double); +extern long double ceill(long double); +extern long double truncl(long double); +extern long double nearbyintl(long double); + + +double test1(double x) +{ + return rint(x); +} + +double test2(double x) +{ + return floor(x); +} + +double test3(double x) +{ + return ceil(x); +} + +double test4(double x) +{ + return trunc(x); +} + +double test5(double x) +{ + return nearbyint(x); +} + +float test1f(float x) +{ + return rintf(x); +} + +float test2f(float x) +{ + return floorf(x); +} + +float test3f(float x) +{ + return ceilf(x); +} + +float test4f(float x) +{ + return truncf(x); +} + +float test5f(float x) +{ + return nearbyintf(x); +} + +long double test1l(long double x) +{ + return rintl(x); +} + +long double test2l(long double x) +{ + return floorl(x); +} + +long double test3l(long double x) +{ + return ceill(x); +} + +long double test4l(long double x) +{ + return truncl(x); +} + +long double test5l(long double x) +{ + return nearbyintl(x); +} -- cgit v1.1