X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fir%2Firmode.c;h=45c7c1efe246ce747c4409eef40e910578749e6f;hb=f9d25133f86594ca2b1f33fb0b41a591ecc9b914;hp=96c00291d0755a7efbda075aff60733185305c40;hpb=09e0ebc7275793be6e3adaa85bd9a53ff06c43b4;p=libfirm diff --git a/ir/ir/irmode.c b/ir/ir/irmode.c index 96c00291d..45c7c1efe 100644 --- a/ir/ir/irmode.c +++ b/ir/ir/irmode.c @@ -22,6 +22,7 @@ # include +# include "irprog_t.h" # include "irmode_t.h" # include "ident.h" # include "tv_t.h" @@ -200,44 +201,57 @@ ir_mode *mode_b; ir_mode *mode_P; /* machine specific modes */ -ir_mode *mode_P_mach; /* machine specific pointer mode */ +ir_mode *mode_P_code; /**< machine specific pointer mode for code addresses */ +ir_mode *mode_P_data; /**< machine specific pointer mode for data addresses */ /* * * * functions defined in irmode.h * * */ /* JNI access functions */ -INLINE ir_mode *get_modeT(void) { ANNOUNCE(); return mode_T; } -INLINE ir_mode *get_modeF(void) { ANNOUNCE(); return mode_F; } -INLINE ir_mode *get_modeD(void) { ANNOUNCE(); return mode_D; } -INLINE ir_mode *get_modeE(void) { ANNOUNCE(); return mode_E; } -INLINE ir_mode *get_modeBs(void) { ANNOUNCE(); return mode_Bs; } -INLINE ir_mode *get_modeBu(void) { ANNOUNCE(); return mode_Bu; } -INLINE ir_mode *get_modeHs(void) { ANNOUNCE(); return mode_Hs; } -INLINE ir_mode *get_modeHu(void) { ANNOUNCE(); return mode_Hu; } -INLINE ir_mode *get_modeIs(void) { ANNOUNCE(); return mode_Is; } -INLINE ir_mode *get_modeIu(void) { ANNOUNCE(); return mode_Iu; } -INLINE ir_mode *get_modeLs(void) { ANNOUNCE(); return mode_Ls; } -INLINE ir_mode *get_modeLu(void) { ANNOUNCE(); return mode_Lu; } -INLINE ir_mode *get_modeC(void) { ANNOUNCE(); return mode_C; } -INLINE ir_mode *get_modeU(void) { ANNOUNCE(); return mode_U; } -INLINE ir_mode *get_modeb(void) { ANNOUNCE(); return mode_b; } -INLINE ir_mode *get_modeP(void) { ANNOUNCE(); return mode_P; } -INLINE ir_mode *get_modeX(void) { ANNOUNCE(); return mode_X; } -INLINE ir_mode *get_modeM(void) { ANNOUNCE(); return mode_M; } -INLINE ir_mode *get_modeBB(void) { ANNOUNCE(); return mode_BB; } -INLINE ir_mode *get_modeANY(void) { ANNOUNCE(); return mode_ANY; } -INLINE ir_mode *get_modeBAD(void) { ANNOUNCE(); return mode_BAD; } +ir_mode *get_modeT(void) { ANNOUNCE(); return mode_T; } +ir_mode *get_modeF(void) { ANNOUNCE(); return mode_F; } +ir_mode *get_modeD(void) { ANNOUNCE(); return mode_D; } +ir_mode *get_modeE(void) { ANNOUNCE(); return mode_E; } +ir_mode *get_modeBs(void) { ANNOUNCE(); return mode_Bs; } +ir_mode *get_modeBu(void) { ANNOUNCE(); return mode_Bu; } +ir_mode *get_modeHs(void) { ANNOUNCE(); return mode_Hs; } +ir_mode *get_modeHu(void) { ANNOUNCE(); return mode_Hu; } +ir_mode *get_modeIs(void) { ANNOUNCE(); return mode_Is; } +ir_mode *get_modeIu(void) { ANNOUNCE(); return mode_Iu; } +ir_mode *get_modeLs(void) { ANNOUNCE(); return mode_Ls; } +ir_mode *get_modeLu(void) { ANNOUNCE(); return mode_Lu; } +ir_mode *get_modeC(void) { ANNOUNCE(); return mode_C; } +ir_mode *get_modeU(void) { ANNOUNCE(); return mode_U; } +ir_mode *get_modeb(void) { ANNOUNCE(); return mode_b; } +ir_mode *get_modeP(void) { ANNOUNCE(); return mode_P; } +ir_mode *get_modeX(void) { ANNOUNCE(); return mode_X; } +ir_mode *get_modeM(void) { ANNOUNCE(); return mode_M; } +ir_mode *get_modeBB(void) { ANNOUNCE(); return mode_BB; } +ir_mode *get_modeANY(void) { ANNOUNCE(); return mode_ANY; } +ir_mode *get_modeBAD(void) { ANNOUNCE(); return mode_BAD; } -ir_mode *(get_modeP_mach)(void) { +ir_mode *(get_modeP_code)(void) { ANNOUNCE(); - return _get_modeP_mach(); + return _get_modeP_code(); } -void (set_modeP_mach)(ir_mode *p) { +ir_mode *(get_modeP_data)(void) { ANNOUNCE(); - _set_modeP_mach(p); + return _get_modeP_data(); +} + +void set_modeP_code(ir_mode *p) { + assert(mode_is_reference(p)); + + mode_P_code = p; +} + +void set_modeP_data(ir_mode *p) { + assert(mode_is_reference(p)); + + mode_P_data = p; } /** @@ -259,8 +273,12 @@ static ir_mode *register_mode(const ir_mode *new_mode) if (num_modes >= irm_max) mode->code = num_modes; num_modes++; + /* add the new mode to the irp list of modes */ + add_irp_mode(mode); + set_mode_values(mode); + hook_new_mode(new_mode, mode); return mode; } @@ -305,7 +323,6 @@ ir_mode *new_ir_mode(const char *name, mode_sort sort, int bit_size, int sign, case irms_character: mode = register_mode(&mode_tmpl); } - hook_new_mode(&mode_tmpl, mode); return mode; } @@ -336,8 +353,7 @@ ir_mode *new_ir_vector_mode(const char *name, mode_sort sort, int bit_size, unsi if (num_of_elem <= 1) { assert(0 && "vector modes should have at least 2 elements"); - hook_new_mode(&mode_tmpl, mode); - return mode; + return NULL; } /* sanity checks */ @@ -362,11 +378,10 @@ ir_mode *new_ir_vector_mode(const char *name, mode_sort sort, int bit_size, unsi case irms_int_number: mode = register_mode(&mode_tmpl); } - hook_new_mode(&mode_tmpl, mode); return mode; } -/* Functions for the direct access to all attributes od a ir_mode */ +/* Functions for the direct access to all attributes of an ir_mode */ modecode (get_mode_modecode)(const ir_mode *mode) { @@ -869,7 +884,7 @@ init_mode (void) /* Character Modes */ newmode.sort = irms_character; - newmode.arithmetic = irma_none; + newmode.arithmetic = irma_twos_complement; /* Character */ newmode.name = new_id_from_chars("C", 1); @@ -903,7 +918,8 @@ init_mode (void) mode_P = register_mode(&newmode); /* set the machine specific modes to the predefined ones */ - mode_P_mach = mode_P; + mode_P_code = mode_P; + mode_P_data = mode_P; } /* find a signed mode for an unsigned integer mode */ @@ -1000,5 +1016,6 @@ void finish_mode(void) { mode_b = NULL; mode_P = NULL; - mode_P_mach = NULL; + mode_P_code = NULL; + mode_P_data = NULL; }