131ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh// PR 20670: f29 corrupted when unwind stack.  This tries to test that FP
231ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh// registers are properly saved and restored by defining 20 different FP
331ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh// local variables.
431ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh// { dg-do run }
531ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh// { dg-options "-O" }
631ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh#include <stdlib.h>
731ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh
831ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsiehdouble zero = 0.0;
931ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsiehdouble another_zero = 0.0;
1031ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh
1131ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsiehint
1231ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsiehsub (void)
1331ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh{
1431ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh  throw (0);
1531ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh}
1631ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh
1731ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsiehint
1831ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsiehmain (void)
1931ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh{
2031ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh  double a, b, c, d, e, f, g, h, i, j;
2131ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh  double a1, b1, c1, d1, e1, f1, g1, h1, i1, j1;
2231ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh
2331ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh  a = zero;
2431ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh  b = a + 1;
2531ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh  c = b + 1;
2631ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh  d = c + 1;
2731ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh  e = d + 1;
2831ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh  f = e + 1;
2931ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh  g = f + 1;
3031ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh  h = g + 1;
3131ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh  i = h + 1;
3231ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh  j = i + 1;
3331ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh
3431ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh  a1 = another_zero;
3531ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh  b1 = a1 + 1;
3631ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh  c1 = b1 + 1;
3731ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh  d1 = c1 + 1;
3831ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh  e1 = d1 + 1;
3931ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh  f1 = e1 + 1;
4031ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh  g1 = f1 + 1;
4131ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh  h1 = g1 + 1;
4231ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh  i1 = h1 + 1;
4331ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh  j1 = i1 + 1;
4431ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh
4531ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh  try
4631ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh    {
4731ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh      sub ();
4831ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh    }
4931ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh  catch (...)
5031ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh    {
5131ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh      if (a != 0.0)
5231ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh        abort ();
5331ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh      if (b != 1.0)
5431ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh        abort ();
5531ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh      if (c != 2.0)
5631ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh        abort ();
5731ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh      if (d != 3.0)
5831ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh        abort ();
5931ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh      if (e != 4.0)
6031ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh        abort ();
6131ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh      if (f != 5.0)
6231ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh        abort ();
6331ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh      if (g != 6.0)
6431ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh        abort ();
6531ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh      if (h != 7.0)
6631ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh        abort ();
6731ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh      if (i != 8.0)
6831ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh        abort ();
6931ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh      if (j != 9.0)
7031ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh        abort ();
7131ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh
7231ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh      if (a1 != 0.0)
7331ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh        abort ();
7431ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh      if (b1 != 1.0)
7531ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh        abort ();
7631ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh      if (c1 != 2.0)
7731ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh        abort ();
7831ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh      if (d1 != 3.0)
7931ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh        abort ();
8031ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh      if (e1 != 4.0)
8131ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh        abort ();
8231ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh      if (f1 != 5.0)
8331ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh        abort ();
8431ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh      if (g1 != 6.0)
8531ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh        abort ();
8631ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh      if (h1 != 7.0)
8731ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh        abort ();
8831ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh      if (i1 != 8.0)
8931ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh        abort ();
9031ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh      if (j1 != 9.0)
9131ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh        abort ();
9231ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh    }
9331ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh  return 0;
9431ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh}
95