1 /* Copyright (C) 1998 - 2000 by Universitaet Karlsruhe
2 ** All rights reserved.
4 ** Authors: Martin Trapp, Christian Schaefer
14 # include "irmode_t.h"
39 INLINE ir_mode *get_modeT() { return mode_T; }
40 INLINE ir_mode *get_modeF() { return mode_F; }
41 INLINE ir_mode *get_modeD() { return mode_D; }
42 INLINE ir_mode *get_modeE() { return mode_E; }
43 INLINE ir_mode *get_modeBs() { return mode_Bs; }
44 INLINE ir_mode *get_modeBu() { return mode_Bu; }
45 INLINE ir_mode *get_modeHs() { return mode_Hs; }
46 INLINE ir_mode *get_modeHu() { return mode_Hu; }
47 INLINE ir_mode *get_modeIs() { return mode_Is; }
48 INLINE ir_mode *get_modeIu() { return mode_Iu; }
49 INLINE ir_mode *get_modeLs() { return mode_Ls; }
50 INLINE ir_mode *get_modeLu() { return mode_Lu; }
51 INLINE ir_mode *get_modeC() { return mode_C; }
52 INLINE ir_mode *get_modeb() { return mode_b; }
53 INLINE ir_mode *get_modeP() { return mode_P; }
54 INLINE ir_mode *get_modeX() { return mode_X; }
55 INLINE ir_mode *get_modeM() { return mode_M; }
56 INLINE ir_mode *get_modeBB() { return mode_BB; }
61 /* allocate all modes. We need to memset them as tarval_vrfy
62 reads fields before they are initialized: It compares to
63 min/max when tarvals for min/max are allocated! */
64 mode_T = (ir_mode *) malloc (sizeof (ir_mode)); memset(mode_T, 0, sizeof(ir_mode));
65 mode_F = (ir_mode *) malloc (sizeof (ir_mode)); memset(mode_F, 0, sizeof(ir_mode));
66 mode_D = (ir_mode *) malloc (sizeof (ir_mode)); memset(mode_D, 0, sizeof(ir_mode));
67 mode_E = (ir_mode *) malloc (sizeof (ir_mode)); memset(mode_E, 0, sizeof(ir_mode));
68 mode_Bs = (ir_mode *) malloc (sizeof (ir_mode)); memset(mode_Bs, 0, sizeof(ir_mode));
69 mode_Bu = (ir_mode *) malloc (sizeof (ir_mode)); memset(mode_Bu, 0, sizeof(ir_mode));
70 mode_Hs = (ir_mode *) malloc (sizeof (ir_mode)); memset(mode_Hs, 0, sizeof(ir_mode));
71 mode_Hu = (ir_mode *) malloc (sizeof (ir_mode)); memset(mode_Hu, 0, sizeof(ir_mode));
72 mode_Is = (ir_mode *) malloc (sizeof (ir_mode)); memset(mode_Is, 0, sizeof(ir_mode));
73 mode_Iu = (ir_mode *) malloc (sizeof (ir_mode)); memset(mode_Iu, 0, sizeof(ir_mode));
74 mode_Ls = (ir_mode *) malloc (sizeof (ir_mode)); memset(mode_Ls, 0, sizeof(ir_mode));
75 mode_Lu = (ir_mode *) malloc (sizeof (ir_mode)); memset(mode_Lu, 0, sizeof(ir_mode));
76 mode_C = (ir_mode *) malloc (sizeof (ir_mode)); memset(mode_C, 0, sizeof(ir_mode));
77 mode_b = (ir_mode *) malloc (sizeof (ir_mode)); memset(mode_b, 0, sizeof(ir_mode));
78 mode_P = (ir_mode *) malloc (sizeof (ir_mode)); memset(mode_P, 0, sizeof(ir_mode));
79 mode_X = (ir_mode *) malloc (sizeof (ir_mode)); memset(mode_X, 0, sizeof(ir_mode));
80 mode_M = (ir_mode *) malloc (sizeof (ir_mode)); memset(mode_M, 0, sizeof(ir_mode));
81 mode_BB = (ir_mode *) malloc (sizeof (ir_mode)); memset(mode_BB, 0, sizeof(ir_mode));
87 mode_Bs->code = irm_Bs;
88 mode_Bu->code = irm_Bu;
89 mode_Hs->code = irm_Hs;
90 mode_Hu->code = irm_Hu;
91 mode_Is->code = irm_Is;
92 mode_Iu->code = irm_Iu;
93 mode_Ls->code = irm_Ls;
94 mode_Lu->code = irm_Lu;
100 mode_BB->code = irm_BB;
102 /* initialize all modes */
104 mode_T->name = id_from_str ("T", 1);
109 mode_F->name = id_from_str ("F", 1);
112 mode_F->ld_align = 4;
116 mode_D->name = id_from_str ("D", 1);
119 mode_D->ld_align = 4;
123 mode_E->name = id_from_str ("E", 1);
126 mode_E->ld_align = 4;
130 mode_Bs->name = id_from_str ("Bs", 1);
131 mode_Bs->fsigned = 1;
133 mode_Bs->ld_align = 1;
135 mode_Bs->min = tarval_from_long (mode_Ls, 0xffffff80);
136 mode_Bs->max = tarval_from_long (mode_Ls, 0x0000007f);
137 mode_Bs->null = tarval_from_long (mode_Bs, 0);
140 mode_Bu->name = id_from_str ("Bu", 1);
141 mode_Bu->fsigned = 0;
143 mode_Bu->ld_align = 1;
145 mode_Bu->min = tarval_from_long (mode_Lu, 0x00000000);
146 mode_Bu->max = tarval_from_long (mode_Lu, 0x000000ff);
147 mode_Bu->null = tarval_from_long (mode_Bu, 0);
149 /* signed short integer */
150 mode_Hs->name = id_from_str ("Hs", 1);
151 mode_Hs->fsigned = 1;
153 mode_Hs->ld_align = 2;
155 mode_Hs->min = tarval_from_long (mode_Ls, 0xffff8000);
156 mode_Hs->max = tarval_from_long (mode_Ls, 0x00007fff);
157 mode_Hs->null = tarval_from_long (mode_Hs, 0);
159 /* unsigned short integer */
160 mode_Hu->name = id_from_str ("Hu", 1);
161 mode_Hu->fsigned = 0;
163 mode_Hu->ld_align = 2;
165 mode_Hu->min = tarval_from_long (mode_Lu, 0x00000000);
166 mode_Hu->max = tarval_from_long (mode_Lu, 0x0000ffff);
167 mode_Hu->null = tarval_from_long (mode_Hu, 0);
170 mode_Is->name = id_from_str ("Is", 1);
171 mode_Is->fsigned = 1;
173 mode_Is->ld_align = 4;
175 mode_Is->min = tarval_from_long (mode_Ls, 0x80000000);
176 mode_Is->max = tarval_from_long (mode_Ls, 0x7fffffff);
177 mode_Is->null = tarval_from_long (mode_Is, 0);
179 /* unsigned integer */
180 mode_Iu->name = id_from_str ("Iu", 1);
181 mode_Iu->fsigned = 0;
183 mode_Iu->ld_align = 4;
185 mode_Iu->min = tarval_from_long (mode_Lu, 0x00000000);
186 mode_Iu->max = tarval_from_long (mode_Lu, 0xffffffff);
187 mode_Iu->null = tarval_from_long (mode_Iu, 0);
189 /* signed long integer */
190 mode_Ls->name = id_from_str ("Ls", 1);
191 mode_Ls->fsigned = 1;
193 mode_Ls->ld_align = 8;
195 mode_Ls->min = tarval_from_long (mode_Ls, 0x80000000);
196 mode_Ls->max = tarval_from_long (mode_Ls, 0x7fffffff);
197 mode_Ls->null = tarval_from_long (mode_Ls, 0);
199 /* unsigned long integer */
200 mode_Lu->name = id_from_str ("Lu", 1);
201 mode_Lu->fsigned = 0;
203 mode_Lu->ld_align = 8;
205 mode_Lu->min = tarval_from_long (mode_Lu, 0x00000000);
206 mode_Lu->max = tarval_from_long (mode_Lu, 0xffffffff);
207 mode_Lu->null = tarval_from_long (mode_Lu, 0);
210 mode_C->name = id_from_str ("C", 1);
213 mode_C->ld_align = 1;
215 mode_C->min = tarval_from_long (mode_Ls, 0xffffff80);
216 mode_C->max = tarval_from_long (mode_Ls, 0x0000007f);
217 mode_C->null = tarval_from_long (mode_C, 0);
220 mode_b->name = id_from_str ("b", 1);
225 mode_P->name = id_from_str ("P", 1);
228 mode_P->ld_align = 4;
230 mode_P->min = tarval_from_long (mode_Lu, 0x00000000);
231 mode_P->max = tarval_from_long (mode_Lu, 0xffffffff);
232 mode_P->null = tarval_from_long (mode_P, 0);
235 mode_X->name = id_from_str ("X", 1);
240 mode_M->name = id_from_str ("M", 1);
244 mode_BB->name = id_from_str ("BB", 1);
245 mode_BB->fsigned = 0;
249 /* Functions for the direct access to all attributes od a ir_mode */
252 get_mode_modecode (ir_mode *mode)
259 set_mode_modecode (ir_mode *mode, modecode code)
266 get_mode_ident (ir_mode *mode)
273 set_mode_ident (ir_mode *mode, ident *name)
280 get_mode_name (ir_mode *mode) {
282 return id_to_str(mode->name);
284 /* void set_mode_name (ir_mode *mode, char *name); */
287 get_mode_size (ir_mode *mode)
293 set_mode_size (ir_mode *mode, int size)
300 get_mode_ld_align (ir_mode *mode)
302 return mode->ld_align;
307 set_mode_ld_align (ir_mode *mode, int ld_align)
309 mode->ld_align = ld_align;
314 get_mode_min (ir_mode *mode)
321 set_mode_min (ir_mode *mode, tarval *min)
328 get_mode_max (ir_mode *mode)
335 set_mode_max (ir_mode *mode, tarval *max)
342 get_mode_null (ir_mode *mode)
349 set_mode_null (ir_mode *mode, tarval *null)
356 get_mode_fsigned (ir_mode *mode)
358 return mode->fsigned;
363 set_mode_fsigned (ir_mode *mode, unsigned fsigned)
365 mode->fsigned = fsigned;
370 get_mode_ffloat (ir_mode *mode)
377 set_mode_ffloat (ir_mode *mode, unsigned ffloat)
379 mode->ffloat = ffloat;
383 /* Functions to check, whether a modecode is signed, float, int, num, data,
384 datab or dataM. For more exact definitions read the corresponding pages
385 in the firm documentation or the followingenumeration
387 The set of "float" is defined as:
388 ---------------------------------
389 float = {irm_F, irm_D, irm_E}
391 The set of "int" is defined as:
392 -------------------------------
393 int = {irm_Bs, irm_Bu, irm_Hs, irm_Hu, irm_Is, irm_Iu, irm_Ls, irm_Lu}
395 The set of "num" is defined as:
396 -------------------------------
397 num = {irm_F, irm_D, irm_E, irm_Bs, irm_Bu, irm_Hs, irm_Hu,
398 irm_Is, irm_Iu, irm_Ls, irm_Lu}
401 The set of "data" is defined as:
402 -------------------------------
403 data = {irm_F, irm_D, irm_E irm_Bs, irm_Bu, irm_Hs, irm_Hu,
404 irm_Is, irm_Iu, irm_Ls, irm_Lu, irm_C, irm_p}
405 = {num || irm_C || irm_P}
407 The set of "datab" is defined as:
408 ---------------------------------
409 datab = {irm_F, irm_D, irm_E, irm_Bs, irm_Bu, irm_Hs, irm_Hu,
410 irm_Is, irm_Iu, irm_Ls, irm_Lu, irm_C, irm_P, irm_b}
413 The set of "dataM" is defined as:
414 ---------------------------------
415 dataM = {irm_F, irm_D, irm_E, irm_Bs, irm_Bu, irm_Hs, irm_Hu,
416 irm_Is, irm_Iu, irm_Ls, irm_Lu, irm_P, irm_M}
421 mode_is_signed (ir_mode *mode)
425 fsigned = get_mode_fsigned (mode);
436 mode_is_float (ir_mode *mode)
440 ffloat = get_mode_ffloat (mode);
452 mode_is_int (ir_mode *mode)
456 code = get_mode_modecode (mode);
457 if ((code >= irm_Bs) && (code <= irm_Lu)) {
468 mode_is_num (ir_mode *mode)
471 if (mode_is_int (mode) || mode_is_float (mode)) {
481 mode_is_data (ir_mode *mode)
485 code = get_mode_modecode (mode);
486 if (mode_is_num (mode) || code == irm_C || code == irm_P) {
496 mode_is_datab (ir_mode *mode)
500 code = get_mode_modecode (mode);
501 if (mode_is_data (mode) || code == irm_b ) {
511 mode_is_dataM (ir_mode *mode)
515 code = get_mode_modecode (mode);
516 if (mode_is_data (mode) || code == irm_M) {
525 /* Returns true if sm can be converted to lm without loss. */
527 smaller_mode(ir_mode *sm, ir_mode *lm) {
528 if ((mode_is_int(sm) && mode_is_int(lm)) &&
529 get_mode_modecode(sm) <= get_mode_modecode(lm))
531 if ((mode_is_float(sm) && mode_is_float(lm)) &&
532 get_mode_modecode(sm) <= get_mode_modecode(lm))