PR inline-asm/84742
[official-gcc.git] / gcc / testsuite / gcc.target / alpha / pr39740.c
blob230beb7db5d26730ae8e49e3d15738698322ca31
1 /* { dg-do compile } */
2 /* { dg-options "-O3 -std=c99 -mexplicit-relocs" } */
4 typedef int R_len_t;
5 typedef unsigned int SEXPTYPE;
6 struct sxpinfo_struct
8 SEXPTYPE type:5;
9 };
11 struct vecsxp_struct
13 R_len_t length;
14 R_len_t truelength;
17 struct listsxp_struct
19 struct SEXPREC *carval;
20 struct SEXPREC *cdrval;
21 struct SEXPREC *tagval;
24 typedef struct SEXPREC
26 struct sxpinfo_struct sxpinfo;
27 union
29 struct listsxp_struct listsxp;
30 } u;
31 } SEXPREC, *SEXP;
33 typedef struct VECTOR_SEXPREC
35 struct vecsxp_struct vecsxp;
36 } VECTOR_SEXPREC, *VECSEXP;
38 typedef union
40 VECTOR_SEXPREC s;
41 double align;
42 } SEXPREC_ALIGN;
44 extern SEXP R_NilValue;
45 extern SEXP R_MissingArg;
47 int Rf_envlength (SEXP rho);
48 SEXP Rf_protect (SEXP);
49 const char *Rf_translateChar (SEXP);
51 inline R_len_t
52 Rf_length (SEXP s)
54 int i;
55 switch (((s)->sxpinfo.type))
57 case 0:
58 return 0;
59 case 24:
60 return (((VECSEXP) (s))->vecsxp.length);
61 case 6:
62 case 17:
63 i = 0;
64 while (s != ((void *) 0) && s != R_NilValue)
66 i++;
67 s = ((s)->u.listsxp.cdrval);
69 return i;
70 case 4:
71 return Rf_envlength (s);
72 default:
73 return 1;
77 inline SEXP
78 Rf_lang3 (SEXP s, SEXP t, SEXP u)
80 return s;
83 typedef SEXP (*CCODE) (SEXP, SEXP, SEXP, SEXP);
85 static SEXP PlusSymbol;
86 static SEXP MinusSymbol;
87 static SEXP DivideSymbol;
89 int isZero (SEXP s);
90 SEXP PP (SEXP s);
91 SEXP AddParens (SEXP expr);
92 SEXP Rf_install ();
94 static int
95 isUminus (SEXP s)
97 if (((s)->sxpinfo.type) == 6 && ((s)->u.listsxp.carval) == MinusSymbol)
99 switch (Rf_length (s))
101 case 2:
102 return 1;
103 case 3:
104 if (((((((s)->u.listsxp.cdrval))->u.listsxp.cdrval))->u.listsxp.
105 carval) == R_MissingArg)
106 return 1;
107 else
108 return 0;
111 else
112 return 0;
115 static SEXP
116 simplify (SEXP fun, SEXP arg1, SEXP arg2)
118 SEXP ans;
119 if (fun == PlusSymbol)
121 if (isZero (arg1))
122 ans = arg2;
123 else if (isUminus (arg1))
124 ans =
125 simplify (MinusSymbol, arg2,
126 ((((arg1)->u.listsxp.cdrval))->u.listsxp.carval));
127 else if (isUminus (arg2))
128 ans =
129 simplify (MinusSymbol, arg1,
130 ((((arg2)->u.listsxp.cdrval))->u.listsxp.carval));
132 else if (fun == DivideSymbol)
134 ans = Rf_lang3 (DivideSymbol, arg1, arg2);
137 return ans;
141 static SEXP
142 D (SEXP expr, SEXP var)
144 return simplify (PlusSymbol,
145 PP (D
146 (((((expr)->u.listsxp.cdrval))->u.listsxp.carval),
147 var)),
148 PP (D
149 (((((((expr)->u.listsxp.cdrval))->u.listsxp.cdrval))->
150 u.listsxp.carval), var)));
153 SEXP
154 do_D (SEXP call, SEXP op, SEXP args, SEXP env)
156 SEXP expr, var;
157 var = Rf_install ();
158 expr = ((args)->u.listsxp.carval);
159 Rf_protect (expr = D (expr, var));
160 expr = AddParens (expr);
161 return expr;