File: thumb1-ual-1.c

package info (click to toggle)
gcc-arm-none-eabi 15%3A8-2019-q3-1
  • links: PTS, VCS
  • area: main
  • in suites: bullseye
  • size: 571,828 kB
  • sloc: ansic: 2,937,651; cpp: 881,644; ada: 597,189; makefile: 65,528; asm: 56,499; xml: 46,621; exp: 24,747; sh: 19,684; python: 7,256; pascal: 4,370; awk: 3,497; perl: 2,695; yacc: 316; ml: 285; f90: 234; lex: 198; objc: 194; haskell: 119
file content (87 lines) | stat: -rw-r--r-- 1,583 bytes parent folder | download | duplicates (10)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
/* Test Thumb1 insn pattern addsi3_cbranch_scratch.  */
/* { dg-options "-O2" } */
/* { dg-skip-if "" { ! { arm_thumb1 } } } */

struct real_value {

  unsigned int cl : 2;
  unsigned int decimal : 1;
  unsigned int sign : 1;
  unsigned int signalling : 1;
  unsigned int canonical : 1;
  unsigned int uexp : (32 - 6);
  unsigned long sig[((128 + (8 * 4)) / (8 * 4))];
};

enum real_value_class {
      rvc_zero,
      rvc_normal,
      rvc_inf,
      rvc_nan
};

extern void exit(int);
extern int foo(long long *, int, int);

int
real_to_integer (const struct real_value *r, int *fail, int precision)
{
  long long val[2 * (((64*(8)) + 64) / 64)];
  int exp;
  int words, w;
  int result;

  switch (r->cl)
    {
    case rvc_zero:
    underflow:
      return 100;

    case rvc_inf:
    case rvc_nan:
    overflow:
      *fail = 1;

      if (r->sign)
 return 200;
      else
 return 300;

    case rvc_normal:
      if (r->decimal)
 return 400;

      exp = ((int)((r)->uexp ^ (unsigned int)(1 << ((32 - 6) - 1))) - (1 << ((32 - 6) - 1)));
      if (exp <= 0)
 goto underflow;


      if (exp > precision)
 goto overflow;
      words = (precision + 64 - 1) / 64;
      w = words * 64;
      for (int i = 0; i < words; i++)
 {
   int j = ((128 + (8 * 4)) / (8 * 4)) - (words * 2) + (i * 2);
   if (j < 0)
     val[i] = 0;
   else
     val[i] = r->sig[j];
   j += 1;
   if (j >= 0)
     val[i] |= (unsigned long long) r->sig[j] << (8 * 4);
 }


      result = foo(val, words, w);

      if (r->sign)
 return -result;
      else
 return result;

    default:
      exit(2);
    }
}