# include <stddef.h>
+# include "irprog_t.h"
# include "irmode_t.h"
# include "ident.h"
# include "tv_t.h"
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;
}
/**
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;
}
case irms_character:
mode = register_mode(&mode_tmpl);
}
- hook_new_mode(&mode_tmpl, mode);
return mode;
}
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 */
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)
{
/* 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);
newmode.code = irm_U;
newmode.sign = 0;
newmode.size = 16;
- newmode.modulo_shift = 32;
mode_U = register_mode(&newmode);
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 */
mode_b = NULL;
mode_P = NULL;
- mode_P_mach = NULL;
+ mode_P_code = NULL;
+ mode_P_data = NULL;
}