Home | History | Annotate | Line # | Download | only in gdb.base
dfp-test.c revision 1.11
      1   1.1  christos /* This testcase is part of GDB, the GNU debugger.
      2   1.1  christos 
      3  1.11  christos    Copyright 2007-2024 Free Software Foundation, Inc.
      4   1.1  christos 
      5   1.1  christos    This program is free software; you can redistribute it and/or modify
      6   1.1  christos    it under the terms of the GNU General Public License as published by
      7   1.1  christos    the Free Software Foundation; either version 3 of the License, or
      8   1.1  christos    (at your option) any later version.
      9   1.1  christos 
     10   1.1  christos    This program is distributed in the hope that it will be useful,
     11   1.1  christos    but WITHOUT ANY WARRANTY; without even the implied warranty of
     12   1.1  christos    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     13   1.1  christos    GNU General Public License for more details.
     14   1.1  christos 
     15   1.1  christos    You should have received a copy of the GNU General Public License
     16   1.1  christos    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
     17   1.1  christos 
     18   1.1  christos #include <stdio.h>
     19   1.1  christos #include <stdlib.h>
     20   1.1  christos 
     21   1.1  christos #define DELTA (0.0001df)
     22   1.1  christos #define DELTA_B (0.001)
     23   1.1  christos 
     24   1.1  christos double double_val1 = 45.125;
     25   1.1  christos double double_val2 = -67.75;
     26   1.1  christos double double_val3 = 0.25;
     27   1.1  christos double double_val4 = 1.25;
     28   1.1  christos double double_val5 = 2.25;
     29   1.1  christos double double_val6 = 3.25;
     30   1.1  christos double double_val7 = 4.25;
     31   1.1  christos double double_val8 = 5.25;
     32   1.1  christos double double_val9 = 6.25;
     33   1.1  christos double double_val10 = 7.25;
     34   1.1  christos double double_val11 = 8.25;
     35   1.1  christos double double_val12 = 9.25;
     36   1.1  christos double double_val13 = 10.25;
     37   1.1  christos double double_val14 = 11.25;
     38   1.1  christos 
     39   1.1  christos _Decimal32 dec32_val1 = 3.14159df;
     40   1.1  christos _Decimal32 dec32_val2 = -2.3765df;
     41   1.1  christos _Decimal32 dec32_val3 = 0.2df;
     42   1.1  christos _Decimal32 dec32_val4 = 1.2df;
     43   1.1  christos _Decimal32 dec32_val5 = 2.2df;
     44   1.1  christos _Decimal32 dec32_val6 = 3.2df;
     45   1.1  christos _Decimal32 dec32_val7 = 4.2df;
     46   1.1  christos _Decimal32 dec32_val8 = 5.2df;
     47   1.1  christos _Decimal32 dec32_val9 = 6.2df;
     48   1.1  christos _Decimal32 dec32_val10 = 7.2df;
     49   1.1  christos _Decimal32 dec32_val11 = 8.2df;
     50   1.1  christos _Decimal32 dec32_val12 = 9.2df;
     51   1.1  christos _Decimal32 dec32_val13 = 10.2df;
     52   1.1  christos _Decimal32 dec32_val14 = 11.2df;
     53   1.1  christos _Decimal32 dec32_val15 = 12.2df;
     54   1.1  christos _Decimal32 dec32_val16 = 13.2df;
     55   1.1  christos 
     56   1.1  christos _Decimal64 dec64_val1 = 3.14159dd;
     57   1.1  christos _Decimal64 dec64_val2 = -2.3765dd;
     58   1.1  christos _Decimal64 dec64_val3 = 0.2dd;
     59   1.1  christos _Decimal64 dec64_val4 = 1.2dd;
     60   1.1  christos _Decimal64 dec64_val5 = 2.2dd;
     61   1.1  christos _Decimal64 dec64_val6 = 3.2dd;
     62   1.1  christos _Decimal64 dec64_val7 = 4.2dd;
     63   1.1  christos _Decimal64 dec64_val8 = 5.2dd;
     64   1.1  christos _Decimal64 dec64_val9 = 6.2dd;
     65   1.1  christos _Decimal64 dec64_val10 = 7.2dd;
     66   1.1  christos _Decimal64 dec64_val11 = 8.2dd;
     67   1.1  christos _Decimal64 dec64_val12 = 9.2dd;
     68   1.1  christos _Decimal64 dec64_val13 = 10.2dd;
     69   1.1  christos _Decimal64 dec64_val14 = 11.2dd;
     70   1.1  christos _Decimal64 dec64_val15 = 12.2dd;
     71   1.1  christos _Decimal64 dec64_val16 = 13.2dd;
     72   1.1  christos 
     73   1.1  christos _Decimal128 dec128_val1 = 3.14159dl;
     74   1.1  christos _Decimal128 dec128_val2 = -2.3765dl;
     75   1.1  christos _Decimal128 dec128_val3 = 0.2dl;
     76   1.1  christos _Decimal128 dec128_val4 = 1.2dl;
     77   1.1  christos _Decimal128 dec128_val5 = 2.2dl;
     78   1.1  christos _Decimal128 dec128_val6 = 3.2dl;
     79   1.1  christos _Decimal128 dec128_val7 = 4.2dl;
     80   1.1  christos _Decimal128 dec128_val8 = 5.2dl;
     81   1.1  christos _Decimal128 dec128_val9 = 6.2dl;
     82   1.1  christos _Decimal128 dec128_val10 = 7.2dl;
     83   1.1  christos _Decimal128 dec128_val11 = 8.2dl;
     84   1.1  christos _Decimal128 dec128_val12 = 9.2dl;
     85   1.1  christos _Decimal128 dec128_val13 = 10.2dl;
     86   1.1  christos _Decimal128 dec128_val14 = 11.2dl;
     87   1.1  christos _Decimal128 dec128_val15 = 12.2dl;
     88   1.1  christos _Decimal128 dec128_val16 = 13.2dl;
     89   1.1  christos 
     90   1.1  christos volatile _Decimal32 d32;
     91   1.1  christos volatile _Decimal64 d64;
     92   1.1  christos volatile _Decimal128 d128;
     93   1.1  christos 
     94   1.8  christos /* Typedefs and typedefs of typedefs, for ptype/whatis testing.  */
     95   1.8  christos typedef _Decimal32 d32_t;
     96   1.8  christos typedef _Decimal64 d64_t;
     97   1.8  christos typedef _Decimal128 d128_t;
     98   1.8  christos 
     99   1.8  christos typedef d32_t d32_t2;
    100   1.8  christos typedef d64_t d64_t2;
    101   1.8  christos typedef d128_t d128_t2;
    102   1.8  christos 
    103   1.8  christos d32_t v_d32_t;
    104   1.8  christos d64_t v_d64_t;
    105   1.8  christos d128_t v_d128_t;
    106   1.8  christos 
    107   1.8  christos d32_t2 v_d32_t2;
    108   1.8  christos d64_t2 v_d64_t2;
    109   1.8  christos d128_t2 v_d128_t2;
    110   1.8  christos 
    111   1.1  christos struct decstruct
    112   1.1  christos {
    113   1.1  christos   int int4;
    114   1.1  christos   long long8;
    115   1.1  christos   float float4;
    116   1.1  christos   double double8;
    117   1.1  christos   _Decimal32 dec32;
    118   1.1  christos   _Decimal64 dec64;
    119   1.1  christos   _Decimal128 dec128;
    120   1.1  christos } ds;
    121   1.1  christos 
    122   1.1  christos static _Decimal32
    123   1.1  christos arg0_32 (_Decimal32 arg0, _Decimal32 arg1, _Decimal32 arg2,
    124   1.1  christos          _Decimal32 arg3, _Decimal32 arg4, _Decimal32 arg5)
    125   1.1  christos {
    126   1.1  christos   return arg0;
    127   1.1  christos }
    128   1.1  christos 
    129   1.1  christos static _Decimal64
    130   1.1  christos arg0_64 (_Decimal64 arg0, _Decimal64 arg1, _Decimal64 arg2,
    131   1.1  christos          _Decimal64 arg3, _Decimal64 arg4, _Decimal64 arg5)
    132   1.1  christos {
    133   1.1  christos   return arg0;
    134   1.1  christos }
    135   1.1  christos 
    136   1.1  christos static _Decimal128
    137   1.1  christos arg0_128 (_Decimal128 arg0, _Decimal128 arg1, _Decimal128 arg2,
    138   1.1  christos          _Decimal128 arg3, _Decimal128 arg4, _Decimal128 arg5)
    139   1.1  christos {
    140   1.1  christos   return arg0;
    141   1.1  christos }
    142   1.1  christos 
    143   1.1  christos /* Function to test if _Decimal128 argument interferes with stack slots
    144   1.1  christos    because of alignment.  */
    145   1.1  christos int
    146   1.1  christos decimal_dec128_align (double arg0, _Decimal128 arg1, double arg2, double arg3,
    147   1.1  christos 		      double arg4, double arg5, double arg6, double arg7,
    148   1.1  christos 		      double arg8, double arg9, double arg10, double arg11,
    149   1.1  christos 		      double arg12, double arg13)
    150   1.1  christos {
    151   1.1  christos   return ((arg0 - double_val1) < DELTA_B
    152   1.1  christos 	  && (arg0 - double_val1) > -DELTA_B
    153   1.1  christos 	  && (arg1 - dec128_val2) < DELTA
    154   1.1  christos 	  && (arg1 - dec128_val2) > -DELTA
    155   1.1  christos 	  && (arg2 - double_val3) < DELTA_B
    156   1.1  christos 	  && (arg2 - double_val3) > -DELTA_B
    157   1.1  christos 	  && (arg3 - double_val4) < DELTA_B
    158   1.1  christos 	  && (arg3 - double_val4) > -DELTA_B
    159   1.1  christos 	  && (arg4 - double_val5) < DELTA_B
    160   1.1  christos 	  && (arg4 - double_val5) > -DELTA_B
    161   1.1  christos 	  && (arg5 - double_val6) < DELTA_B
    162   1.1  christos 	  && (arg5 - double_val6) > -DELTA_B
    163   1.1  christos 	  && (arg6 - double_val7) < DELTA_B
    164   1.1  christos 	  && (arg6 - double_val7) > -DELTA_B
    165   1.1  christos 	  && (arg7 - double_val8) < DELTA_B
    166   1.1  christos 	  && (arg7 - double_val8) > -DELTA_B
    167   1.1  christos 	  && (arg8 - double_val9) < DELTA_B
    168   1.1  christos 	  && (arg8 - double_val9) > -DELTA_B
    169   1.1  christos 	  && (arg9 - double_val10) < DELTA_B
    170   1.1  christos 	  && (arg9 - double_val10) > -DELTA_B
    171   1.1  christos 	  && (arg10 - double_val11) < DELTA_B
    172   1.1  christos 	  && (arg10 - double_val11) > -DELTA_B
    173   1.1  christos 	  && (arg11 - double_val12) < DELTA_B
    174   1.1  christos 	  && (arg11 - double_val12) > -DELTA_B
    175   1.1  christos 	  && (arg12 - double_val13) < DELTA_B
    176   1.1  christos 	  && (arg12 - double_val13) > -DELTA_B
    177   1.1  christos 	  && (arg13 - double_val14) < DELTA_B
    178   1.1  christos 	  && (arg13 - double_val14) > -DELTA_B);
    179   1.1  christos }
    180   1.1  christos 
    181   1.1  christos int
    182   1.1  christos decimal_mixed (_Decimal32 arg0, _Decimal64 arg1, _Decimal128 arg2)
    183   1.1  christos {
    184   1.1  christos   return ((arg0 - dec32_val1) < DELTA
    185   1.1  christos 	  && (arg0 - dec32_val1) > -DELTA
    186   1.1  christos 	  && (arg1 - dec64_val1) < DELTA
    187   1.1  christos 	  && (arg1 - dec64_val1) > -DELTA
    188   1.1  christos 	  && (arg2 - dec128_val1) < DELTA
    189   1.1  christos 	  && (arg2 - dec128_val1) > -DELTA);
    190   1.1  christos }
    191   1.1  christos 
    192   1.1  christos /* These functions have many arguments to force some of them to be passed via
    193   1.1  christos    the stack instead of registers, to test that GDB can construct correctly
    194   1.1  christos    the parameter save area. Note that Linux/ppc32 has 8 float registers to use
    195   1.1  christos    for float parameter passing and Linux/ppc64 has 13, so the number of
    196   1.1  christos    arguments has to be at least 14 to contemplate these platforms.  */
    197   1.1  christos 
    198   1.1  christos int
    199   1.1  christos decimal_many_args_dec32 (_Decimal32 f1, _Decimal32 f2, _Decimal32 f3,
    200   1.1  christos 			    _Decimal32 f4, _Decimal32 f5, _Decimal32 f6,
    201   1.1  christos 			    _Decimal32 f7, _Decimal32 f8, _Decimal32 f9,
    202   1.1  christos 			    _Decimal32 f10, _Decimal32 f11, _Decimal32 f12,
    203   1.1  christos 			    _Decimal32 f13, _Decimal32 f14, _Decimal32 f15,
    204   1.1  christos 			    _Decimal32 f16)
    205   1.1  christos {
    206   1.1  christos   _Decimal32 sum_args;
    207   1.1  christos   _Decimal32 sum_values;
    208   1.1  christos 
    209   1.1  christos   sum_args = f1 + f2 + f3 + f4 + f5 + f6 + f7 + f8 + f9 + f10 + f11 + f12
    210   1.1  christos 	     + f13 + f14 + f15 + f16;
    211   1.1  christos   sum_values = dec32_val1 + dec32_val2 + dec32_val3 + dec32_val4 + dec32_val5
    212   1.1  christos 	       + dec32_val6 + dec32_val7 + dec32_val8 + dec32_val9
    213   1.1  christos 	       + dec32_val10 + dec32_val11 + dec32_val12 + dec32_val13
    214   1.1  christos 	       + dec32_val14 + dec32_val15 + dec32_val16;
    215   1.1  christos 
    216   1.1  christos   return ((sum_args - sum_values) < DELTA
    217   1.1  christos 	  && (sum_args - sum_values) > -DELTA);
    218   1.1  christos }
    219   1.1  christos 
    220   1.1  christos int
    221   1.1  christos decimal_many_args_dec64 (_Decimal64 f1, _Decimal64 f2, _Decimal64 f3,
    222   1.1  christos 			    _Decimal64 f4, _Decimal64 f5, _Decimal64 f6,
    223   1.1  christos 			    _Decimal64 f7, _Decimal64 f8, _Decimal64 f9,
    224   1.1  christos 			    _Decimal64 f10, _Decimal64 f11, _Decimal64 f12,
    225   1.1  christos 			    _Decimal64 f13, _Decimal64 f14, _Decimal64 f15,
    226   1.1  christos 			    _Decimal64 f16)
    227   1.1  christos {
    228   1.1  christos   _Decimal64 sum_args;
    229   1.1  christos   _Decimal64 sum_values;
    230   1.1  christos 
    231   1.1  christos   sum_args = f1 + f2 + f3 + f4 + f5 + f6 + f7 + f8 + f9 + f10 + f11 + f12
    232   1.1  christos 	     + f13 + f14 + f15 + f16;
    233   1.1  christos   sum_values = dec64_val1 + dec64_val2 + dec64_val3 + dec64_val4 + dec64_val5
    234   1.1  christos 	       + dec64_val6 + dec64_val7 + dec64_val8 + dec64_val9
    235   1.1  christos 	       + dec64_val10 + dec64_val11 + dec64_val12 + dec64_val13
    236   1.1  christos 	       + dec64_val14 + dec64_val15 + dec64_val16;
    237   1.1  christos 
    238   1.1  christos   return ((sum_args - sum_values) < DELTA
    239   1.1  christos 	  && (sum_args - sum_values) > -DELTA);
    240   1.1  christos }
    241   1.1  christos 
    242   1.1  christos int
    243   1.1  christos decimal_many_args_dec128 (_Decimal128 f1, _Decimal128 f2, _Decimal128 f3,
    244   1.1  christos 			    _Decimal128 f4, _Decimal128 f5, _Decimal128 f6,
    245   1.1  christos 			    _Decimal128 f7, _Decimal128 f8, _Decimal128 f9,
    246   1.1  christos 			    _Decimal128 f10, _Decimal128 f11, _Decimal128 f12,
    247   1.1  christos 			    _Decimal128 f13, _Decimal128 f14, _Decimal128 f15,
    248   1.1  christos 			    _Decimal128 f16)
    249   1.1  christos {
    250   1.1  christos   _Decimal128 sum_args;
    251   1.1  christos   _Decimal128 sum_values;
    252   1.1  christos 
    253   1.1  christos   sum_args = f1 + f2 + f3 + f4 + f5 + f6 + f7 + f8 + f9 + f10 + f11 + f12
    254   1.1  christos 	     + f13 + f14 + f15 + f16;
    255   1.1  christos   sum_values = dec128_val1 + dec128_val2 + dec128_val3 + dec128_val4 + dec128_val5
    256   1.1  christos 	       + dec128_val6 + dec128_val7 + dec128_val8 + dec128_val9
    257   1.1  christos 	       + dec128_val10 + dec128_val11 + dec128_val12 + dec128_val13
    258   1.1  christos 	       + dec128_val14 + dec128_val15 + dec128_val16;
    259   1.1  christos 
    260   1.1  christos   return ((sum_args - sum_values) < DELTA
    261   1.1  christos 	  && (sum_args - sum_values) > -DELTA);
    262   1.1  christos }
    263   1.1  christos 
    264   1.1  christos int
    265   1.1  christos decimal_many_args_mixed (_Decimal32 f1, _Decimal32 f2, _Decimal32 f3,
    266   1.1  christos 			   _Decimal64 f4, _Decimal64 f5, _Decimal64 f6,
    267   1.1  christos 			   _Decimal64 f7, _Decimal128 f8, _Decimal128 f9,
    268   1.1  christos 			   _Decimal128 f10, _Decimal32 f11, _Decimal64 f12,
    269   1.1  christos 			   _Decimal32 f13, _Decimal64 f14, _Decimal128 f15)
    270   1.1  christos {
    271   1.1  christos   _Decimal128 sum_args;
    272   1.1  christos   _Decimal128 sum_values;
    273   1.1  christos 
    274   1.1  christos   sum_args = f1 + f2 + f3 + f4 + f5 + f6 + f7 + f8 + f9 + f10 + f11 + f12
    275   1.1  christos 	     + f13 + f14 + f15;
    276   1.1  christos   sum_values = dec32_val1 + dec32_val2 + dec32_val3 + dec64_val4 + dec64_val5
    277   1.1  christos 	       + dec64_val6 + dec64_val7 + dec128_val8 + dec128_val9
    278   1.1  christos 	       + dec128_val10 + dec32_val11 + dec64_val12 + dec32_val13
    279   1.1  christos 	       + dec64_val14 + dec128_val15;
    280   1.1  christos 
    281   1.1  christos   return ((sum_args - sum_values) < DELTA
    282   1.1  christos 	  && (sum_args - sum_values) > -DELTA);
    283   1.1  christos }
    284   1.1  christos 
    285   1.1  christos int main()
    286   1.1  christos {
    287   1.1  christos   /* An finite 32-bits decimal floating point.  */
    288   1.1  christos   d32 = 1.2345df;		/* Initialize d32.  */
    289   1.1  christos 
    290   1.1  christos   /* Non-finite 32-bits decimal floating point: infinity and NaN.  */
    291   1.1  christos   d32 = __builtin_infd32();	/* Positive infd32.  */
    292   1.1  christos   d32 = -__builtin_infd32();	/* Negative infd32.  */
    293   1.1  christos   d32 = __builtin_nand32("");
    294   1.1  christos 
    295   1.1  christos   /* An finite 64-bits decimal floating point.  */
    296   1.1  christos   d64 = 1.2345dd;		/* Initialize d64.  */
    297   1.1  christos 
    298   1.1  christos   /* Non-finite 64-bits decimal floating point: infinity and NaN.  */
    299   1.1  christos   d64 = __builtin_infd64();	/* Positive infd64.  */
    300   1.1  christos   d64 = -__builtin_infd64();	/* Negative infd64.  */
    301   1.1  christos   d64 = __builtin_nand64("");
    302   1.1  christos 
    303   1.1  christos   /* An finite 128-bits decimal floating point.  */
    304   1.1  christos   d128 = 1.2345dl;		/* Initialize d128.  */
    305   1.1  christos 
    306   1.1  christos   /* Non-finite 128-bits decimal floating point: infinity and NaN.  */
    307   1.1  christos   d128 = __builtin_infd128();	/* Positive infd128.  */
    308   1.1  christos   d128 = -__builtin_infd128();	/* Negative infd128.  */
    309   1.1  christos   d128 = __builtin_nand128("");
    310   1.1  christos 
    311   1.1  christos   /* Functions with decimal floating point as parameter and return value. */
    312   1.1  christos   d32 = arg0_32 (0.1df, 1.0df, 2.0df, 3.0df, 4.0df, 5.0df);
    313   1.1  christos   d64 = arg0_64 (0.1dd, 1.0dd, 2.0dd, 3.0dd, 4.0dd, 5.0dd);
    314   1.1  christos   d128 = arg0_128 (0.1dl, 1.0dl, 2.0dl, 3.0dl, 4.0dl, 5.0dl);
    315   1.1  christos 
    316   1.1  christos   ds.int4 = 1;
    317   1.1  christos   ds.long8 = 2;
    318   1.1  christos   ds.float4 = 3.1;
    319   1.1  christos   ds.double8 = 4.2;
    320   1.1  christos   ds.dec32 = 1.2345df;
    321   1.1  christos   ds.dec64 = 1.2345dd;
    322   1.1  christos   ds.dec128 = 1.2345dl;
    323   1.1  christos 
    324   1.1  christos   return 0;	/* Exit point.  */
    325   1.1  christos }
    326