X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fir%2Firmode.c;h=8e2752bcbcd0179620504ac085d4958f75c2db6a;hb=23ea16875f38dc0c067cce24f64b5c70f3acc496;hp=61635c348518aa1ec73e5440cd5da2138fd99ba9;hpb=68615f2eeddd3275b68cb46fb040c45de628d9a7;p=libfirm diff --git a/ir/ir/irmode.c b/ir/ir/irmode.c index 61635c348..8e2752bcb 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,6 +273,9 @@ 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); @@ -364,7 +381,7 @@ ir_mode *new_ir_vector_mode(const char *name, mode_sort sort, int bit_size, unsi 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) { @@ -867,14 +884,14 @@ init_mode (void) /* Character Modes */ newmode.sort = irms_character; - newmode.arithmetic = irma_none; + newmode.arithmetic = irma_twos_complement; + newmode.modulo_shift = 0; /* Character */ newmode.name = new_id_from_chars("C", 1); newmode.code = irm_C; newmode.sign = 0; newmode.size = 8; - newmode.modulo_shift = 32; mode_C = register_mode(&newmode); @@ -883,7 +900,6 @@ init_mode (void) newmode.code = irm_U; newmode.sign = 0; newmode.size = 16; - newmode.modulo_shift = 32; mode_U = register_mode(&newmode); @@ -901,7 +917,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 */ @@ -998,5 +1015,6 @@ void finish_mode(void) { mode_b = NULL; mode_P = NULL; - mode_P_mach = NULL; + mode_P_code = NULL; + mode_P_data = NULL; }