From 4f262a24ef237a6c7f5562dce572dcacfeb40245 Mon Sep 17 00:00:00 2001 From: =?utf8?q?G=C3=B6tz=20Lindenmaier?= Date: Thu, 9 Jan 2003 16:59:14 +0000 Subject: [PATCH] Added new mode for unicode character. [r589] --- ir/ir/irmode.h | 39 +++++++++++++++++++++++++++++++++++++++ ir/tv/tv.c | 17 +++++++++++++++-- ir/tv/tv.h | 2 ++ 3 files changed, 56 insertions(+), 2 deletions(-) diff --git a/ir/ir/irmode.h b/ir/ir/irmode.h index 094719106..c192350c9 100644 --- a/ir/ir/irmode.h +++ b/ir/ir/irmode.h @@ -42,6 +42,7 @@ typedef enum { /* irm is short for `ir mode' */ irm_b, // internal boolean irm_M, // memory irm_T, // tuple + irm_U, // unicode character irm_max } modecode; @@ -60,6 +61,7 @@ extern ir_mode *mode_Iu; /* unsigned integer */ extern ir_mode *mode_Ls; /* signed long integer */ extern ir_mode *mode_Lu; /* unsigned long integer */ extern ir_mode *mode_C; /* char */ +extern ir_mode *mode_U; /* unicode char */ extern ir_mode *mode_P; /* pointer */ extern ir_mode *mode_b; /* internal boolean */ extern ir_mode *mode_X; /* execution */ @@ -80,6 +82,7 @@ ir_mode *get_modeIu(); ir_mode *get_modeLs(); ir_mode *get_modeLu(); ir_mode *get_modeC(); +ir_mode *get_modeU(); ir_mode *get_modeP(); ir_mode *get_modeb(); ir_mode *get_modeX(); @@ -126,6 +129,42 @@ unsigned get_mode_fsigned (ir_mode *mode); unsigned get_mode_ffloat (ir_mode *mode); /* void set_mode_ffloat (ir_mode *mode, unsigned ffloat); */ +/* Functions to check, whether a modecode is signed, float, int, num, data, + datab or dataM. For more exact definitions read the corresponding pages + in the firm documentation or the followingenumeration + + The set of "float" is defined as: + --------------------------------- + float = {irm_F, irm_D, irm_E} + + The set of "int" is defined as: + ------------------------------- + int = {irm_Bs, irm_Bu, irm_Hs, irm_Hu, irm_Is, irm_Iu, irm_Ls, irm_Lu} + + The set of "num" is defined as: + ------------------------------- + num = {irm_F, irm_D, irm_E, irm_Bs, irm_Bu, irm_Hs, irm_Hu, + irm_Is, irm_Iu, irm_Ls, irm_Lu} + = {float || int} + + The set of "data" is defined as: + ------------------------------- + data = {irm_F, irm_D, irm_E irm_Bs, irm_Bu, irm_Hs, irm_Hu, + irm_Is, irm_Iu, irm_Ls, irm_Lu, irm_C, irm_U, irm_P} + = {num || irm_C || irm_P} + + The set of "datab" is defined as: + --------------------------------- + datab = {irm_F, irm_D, irm_E, irm_Bs, irm_Bu, irm_Hs, irm_Hu, + irm_Is, irm_Iu, irm_Ls, irm_Lu, irm_C, irm_U, irm_P, irm_b} + = {data || irm_b } + + The set of "dataM" is defined as: + --------------------------------- + dataM = {irm_F, irm_D, irm_E, irm_Bs, irm_Bu, irm_Hs, irm_Hu, + irm_Is, irm_Iu, irm_Ls, irm_Lu, irm_C, irm_U, irm_P, irm_M} + = {data || irm_M} +*/ /* Test for a certain class of modes. */ int mode_is_signed (ir_mode *mode); diff --git a/ir/tv/tv.c b/ir/tv/tv.c index ee9d807cb..01125de31 100644 --- a/ir/tv/tv.c +++ b/ir/tv/tv.c @@ -180,11 +180,14 @@ _tarval_vrfy (const tarval *val) case irm_E: break; /* integral */ - case irm_Bu: case irm_Hu: case irm_Iu: case irm_Lu: - assert (!uInt_overflow (val->u.uInt, val->mode)); break; + case irm_Bu: case irm_Hu: case irm_Iu: case irm_Lu: { + // printf("Tarval is %lu\n", val->u.uInt); + assert (!uInt_overflow (val->u.uInt, val->mode)); + } break; case irm_Bs: case irm_Hs: case irm_Is: case irm_Ls: assert (!sInt_overflow (val->u.sInt, val->mode)); break; case irm_C: + case irm_U: break; case irm_P: if (val->u.P.ent) @@ -266,6 +269,8 @@ tarval_cmp (const void *p, const void *q) return a->u.sInt != b->u.sInt; case irm_C: return a->u.C - b->u.C; + case irm_U: + return a->u.U - b->u.U; case irm_P: if (a->u.P.ent || b->u.P.ent) return (char *)a->u.P.ent - (char *)b->u.P.ent; @@ -317,6 +322,8 @@ tarval_hash (tarval *tv) h ^= tv->u.sInt; break; case irm_C: h ^= tv->u.C; break; + case irm_U: + h ^= tv->u.U; break; case irm_P: if (tv->u.P.ent) { /* @@@ lower bits not random, watch for collisions; perhaps @@ -429,6 +436,7 @@ tarval_init_2 (void) tarval_mode_null [irm_Ls] = tarval_from_long (mode_Ls, 0); tarval_mode_null [irm_Lu] = tarval_from_long (mode_Lu, 0); tarval_mode_null [irm_C] = tarval_from_long (mode_C, 0); + tarval_mode_null [irm_U] = tarval_from_long (mode_U, 0); tarval_mode_null [irm_b] = tarval_b_false; tarval_mode_null [irm_P] = tarval_P_void; } @@ -553,6 +561,8 @@ tarval_from_long (ir_mode *m, long val) return tarval_P_void; case irm_C: tv->u.C = val; break; + case irm_U: + tv->u.U = val; break; case irm_b: tv->u.b = !!val; /* u.b must be 0 or 1 */ break; @@ -1359,6 +1369,9 @@ tarval_print (XP_PAR1, const xprintf_info *info ATTRIBUTE((unused)), XP_PARN) printed = XPF1R ("0x%x", (unsigned long)val->u.C); } break; + case irm_U: /* unicode character */ + printed = XPF1R ("0x%x", (unsigned long)val->u.U); + break; case irm_Bs: case irm_Hs: case irm_Is: case irm_Ls: /* signed num */ printed = XPF1R ("%ld", (long)val->u.sInt); diff --git a/ir/tv/tv.h b/ir/tv/tv.h index 94b0ba091..a8df0ede2 100644 --- a/ir/tv/tv.h +++ b/ir/tv/tv.h @@ -58,6 +58,7 @@ typedef long double tarval_E; typedef long tarval_sInt; typedef unsigned long tarval_uInt; typedef char tarval_C; +typedef unsigned short tarval_U; /* 16 bit ?! wchar could be defined as char... */ typedef struct { /* if ent then xname is missing or mangled from ent, else if xname then xname is a linker symbol that is not mangled @@ -78,6 +79,7 @@ struct tarval { tarval_sInt sInt; /* signed integral */ tarval_uInt uInt; /* unsigned integral */ tarval_C C; /* character */ + tarval_U U; /* unicode character */ tarval_P P; /* pointer */ bool b; /* boolean */ } u; -- 2.20.1