annotate gcc/testsuite/gcc.dg/zero_sign_ext_test.c @ 111:04ced10e8804

gcc 7
author kono
date Fri, 27 Oct 2017 22:46:09 +0900
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 extern void abort (void);
kono
parents:
diff changeset
2
kono
parents:
diff changeset
3 /* { dg-options "-O2" } */
kono
parents:
diff changeset
4 /* { dg-do run } */
kono
parents:
diff changeset
5 /* { dg-require-effective-target int32plus } */
kono
parents:
diff changeset
6
kono
parents:
diff changeset
7 #define TYPE_MAX(type, sign) \
kono
parents:
diff changeset
8 ((!sign) ? ((1 << (sizeof (type) * 8 - 1)) - 1) : \
kono
parents:
diff changeset
9 ((1 << (sizeof (type) * 8)) - 1))
kono
parents:
diff changeset
10 #define TYPE_MIN(type, sign) \
kono
parents:
diff changeset
11 ((!sign) ? -(1 << (sizeof (type) * 8 - 1)) : 0)
kono
parents:
diff changeset
12
kono
parents:
diff changeset
13 #define TEST_FN(NAME, ARG_TYPE, RET_TYPE, CAST_TYPE, VAL, VR_MIN, VR_MAX)\
kono
parents:
diff changeset
14 __attribute__((noinline, noclone)) RET_TYPE \
kono
parents:
diff changeset
15 NAME (ARG_TYPE arg){ \
kono
parents:
diff changeset
16 RET_TYPE ret = VAL; \
kono
parents:
diff changeset
17 if (arg + 1 < VR_MIN || arg + 1 > VR_MAX) return ret; \
kono
parents:
diff changeset
18 /* Value Range of arg at this point will be [VR_min, VR_max]. */\
kono
parents:
diff changeset
19 arg = arg + VAL; \
kono
parents:
diff changeset
20 ret = (CAST_TYPE)arg; \
kono
parents:
diff changeset
21 return arg; \
kono
parents:
diff changeset
22 }
kono
parents:
diff changeset
23
kono
parents:
diff changeset
24 /* Signed to signed conversion with value in-range. */
kono
parents:
diff changeset
25 TEST_FN (foo1, short, short, char, 1, TYPE_MIN (char, 0), TYPE_MAX (char, 0));
kono
parents:
diff changeset
26 TEST_FN (foo2, short, short, char, 1, TYPE_MIN (char, 0) + 1,\
kono
parents:
diff changeset
27 TYPE_MAX (char, 0) - 1);
kono
parents:
diff changeset
28
kono
parents:
diff changeset
29 /* Signed to signed conversion with value not in-range. */
kono
parents:
diff changeset
30 TEST_FN (foo3, short, short, char, -1, TYPE_MIN (short, 0) + 1, 100);
kono
parents:
diff changeset
31 TEST_FN (foo4, short, short, char, 1, 12, TYPE_MAX (short, 0) + 1);
kono
parents:
diff changeset
32
kono
parents:
diff changeset
33 /* Unsigned to unsigned conversion with value in-range. */
kono
parents:
diff changeset
34 TEST_FN (foo5, unsigned short, unsigned short, unsigned char, 1,\
kono
parents:
diff changeset
35 TYPE_MIN (char, 1) + 1, TYPE_MAX (char, 1) - 1);
kono
parents:
diff changeset
36 TEST_FN (foo6, unsigned short, unsigned short, unsigned char, 1,\
kono
parents:
diff changeset
37 TYPE_MIN (char, 1), TYPE_MAX (char, 1));
kono
parents:
diff changeset
38
kono
parents:
diff changeset
39 /* Unsigned to unsigned conversion with value not in-range. */
kono
parents:
diff changeset
40 TEST_FN (foo7, unsigned short, unsigned short, unsigned char, 1,\
kono
parents:
diff changeset
41 TYPE_MIN (short, 1) + 1, TYPE_MAX (short, 1) - 1);
kono
parents:
diff changeset
42 TEST_FN (foo8, unsigned short, unsigned short, unsigned char, 1,\
kono
parents:
diff changeset
43 TYPE_MIN (short, 1), TYPE_MAX (short, 1));
kono
parents:
diff changeset
44
kono
parents:
diff changeset
45 /* Signed to unsigned conversion with value range positive. */
kono
parents:
diff changeset
46 TEST_FN (foo9, short, short, unsigned char, -1, 1,\
kono
parents:
diff changeset
47 TYPE_MAX (char, 1) - 1);
kono
parents:
diff changeset
48 TEST_FN (foo10, short, short, unsigned char, 1, 0,\
kono
parents:
diff changeset
49 TYPE_MAX (char, 1));
kono
parents:
diff changeset
50
kono
parents:
diff changeset
51 /* Signed to unsigned conversion with value range negative. */
kono
parents:
diff changeset
52 TEST_FN (foo11, short, short, unsigned char, 1,\
kono
parents:
diff changeset
53 TYPE_MIN (char, 0) + 1, TYPE_MAX (char, 0) - 1);
kono
parents:
diff changeset
54 TEST_FN (foo12, short, short, unsigned char, 1,\
kono
parents:
diff changeset
55 TYPE_MIN (char, 0), TYPE_MAX (char, 0));
kono
parents:
diff changeset
56
kono
parents:
diff changeset
57 /* Unsigned to Signed conversion with value range in signed equiv range. */
kono
parents:
diff changeset
58 TEST_FN (foo13, unsigned short, unsigned short, char, 1,\
kono
parents:
diff changeset
59 TYPE_MIN (char, 1) + 1, TYPE_MAX (char, 0) - 1);
kono
parents:
diff changeset
60 TEST_FN (foo14, unsigned short, unsigned short, char, 1,\
kono
parents:
diff changeset
61 TYPE_MIN (char, 1), TYPE_MAX (char, 0));
kono
parents:
diff changeset
62
kono
parents:
diff changeset
63 /* Unsigned to Signed conversion with value range not-in signed range. */
kono
parents:
diff changeset
64 TEST_FN (foo15, unsigned short, unsigned short, char, 1,\
kono
parents:
diff changeset
65 TYPE_MIN (char, 1) + 1, TYPE_MAX (char, 1) - 1);
kono
parents:
diff changeset
66 TEST_FN (foo16, unsigned short, unsigned short, char, 1,\
kono
parents:
diff changeset
67 TYPE_MIN (char, 1), TYPE_MAX (char, 1));
kono
parents:
diff changeset
68
kono
parents:
diff changeset
69 int main ()
kono
parents:
diff changeset
70 {
kono
parents:
diff changeset
71 /* Signed to signed conversion with value in-range. */
kono
parents:
diff changeset
72 /* arg + 1. */
kono
parents:
diff changeset
73 if (foo1 (-32) != -31)
kono
parents:
diff changeset
74 abort ();
kono
parents:
diff changeset
75 /* arg + 1. */
kono
parents:
diff changeset
76 if (foo2 (32) != 33)
kono
parents:
diff changeset
77 abort ();
kono
parents:
diff changeset
78
kono
parents:
diff changeset
79 /* Signed to signed conversion with value not in-range. */
kono
parents:
diff changeset
80 /* arg - 1. */
kono
parents:
diff changeset
81 if (foo3 (-512) != -513)
kono
parents:
diff changeset
82 abort ();
kono
parents:
diff changeset
83 /* arg + 1. */
kono
parents:
diff changeset
84 if (foo4 (512) != 513)
kono
parents:
diff changeset
85 abort ();
kono
parents:
diff changeset
86
kono
parents:
diff changeset
87 /* Unsigned to unsigned conversion with value in-range. */
kono
parents:
diff changeset
88 /* arg + 1. */
kono
parents:
diff changeset
89 if (foo5 (64) != 65)
kono
parents:
diff changeset
90 abort ();
kono
parents:
diff changeset
91 /* arg + 1. */
kono
parents:
diff changeset
92 if (foo6 (64) != 65)
kono
parents:
diff changeset
93 abort ();
kono
parents:
diff changeset
94
kono
parents:
diff changeset
95 /* Unsigned to unsigned conversion with value not in-range. */
kono
parents:
diff changeset
96 /* arg + 1. */
kono
parents:
diff changeset
97 if (foo7 (512) != 513)
kono
parents:
diff changeset
98 abort ();
kono
parents:
diff changeset
99 /* arg + 1. */
kono
parents:
diff changeset
100 if (foo8 (512) != 513)
kono
parents:
diff changeset
101 abort ();
kono
parents:
diff changeset
102
kono
parents:
diff changeset
103 /* Signed to unsigned conversion with value range positive. */
kono
parents:
diff changeset
104 /* arg - 1. */
kono
parents:
diff changeset
105 if (foo9 (2) != 1)
kono
parents:
diff changeset
106 abort ();
kono
parents:
diff changeset
107 /* arg + 1. */
kono
parents:
diff changeset
108 if (foo10 (2) != 3)
kono
parents:
diff changeset
109 abort ();
kono
parents:
diff changeset
110
kono
parents:
diff changeset
111 /* Signed to unsigned conversion with value range negative. */
kono
parents:
diff changeset
112 /* arg + 1. */
kono
parents:
diff changeset
113 if (foo11 (-125) != -124)
kono
parents:
diff changeset
114 abort ();
kono
parents:
diff changeset
115 /* arg + 1. */
kono
parents:
diff changeset
116 if (foo12 (-125) != -124)
kono
parents:
diff changeset
117 abort ();
kono
parents:
diff changeset
118
kono
parents:
diff changeset
119 /* Unsigned to Signed conversion with value range in signed equiv range. */
kono
parents:
diff changeset
120 /* arg + 1. */
kono
parents:
diff changeset
121 if (foo13 (125) != 126)
kono
parents:
diff changeset
122 abort ();
kono
parents:
diff changeset
123 /* arg + 1. */
kono
parents:
diff changeset
124 if (foo14 (125) != 126)
kono
parents:
diff changeset
125 abort ();
kono
parents:
diff changeset
126
kono
parents:
diff changeset
127 /* Unsigned to Signed conversion with value range not-in signed range. */
kono
parents:
diff changeset
128 /* arg + 1. */
kono
parents:
diff changeset
129 if (foo15 (250) != 251)
kono
parents:
diff changeset
130 abort ();
kono
parents:
diff changeset
131 /* arg + 1. */
kono
parents:
diff changeset
132 if (foo16 (250) != 251)
kono
parents:
diff changeset
133 abort ();
kono
parents:
diff changeset
134
kono
parents:
diff changeset
135 return 0;
kono
parents:
diff changeset
136 }
kono
parents:
diff changeset
137