view mc-code.h @ 856:d9dd3e6e7c5f

macro compatibility
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Tue, 22 Nov 2011 05:44:49 +0900
parents 032dc03be02e
children 5313ed059cee
line wrap: on
line source

/* function required by mc-codegen.c 
     mc-code-*.c have to provied these
 */

/************************************************************************
** Copyright (C) 2006 Shinji Kono
** 連絡先: 琉球大学情報工学科 河野 真治  
** (E-Mail Address: kono@ie.u-ryukyu.ac.jp)
**
**    このソースのいかなる複写,改変,修正も許諾します。ただし、
**    その際には、誰が貢献したを示すこの部分を残すこと。
**    再配布や雑誌の付録などの問い合わせも必要ありません。
**    営利利用も上記に反しない範囲で許可します。
**    バイナリの配布の際にはversion messageを保存することを条件とします。
**    このプログラムについては特に何の保証もしない、悪しからず。
**
**    Everyone is permitted to do anything on this program 
**    including copying, modifying, improving,
**    as long as you don't try to pretend that you wrote it.
**    i.e., the above copyright notice has to appear in all copies.  
**    Binary distribution requires original version messages.
**    You don't have to ask before copying, redistribution or publishing.
**    THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE.
***********************************************************************/

#define MAX_MAX 50          /* architecture independent max registers */

/* 
    flag value for regs[]
 */

#define USING_REG 1         /* unreusable register usage */
#define INPUT_REG 2         /* input register ( can be reused ) */
#define REG_VAR 3           /* used as register variable */
#define PTRC_REG 4          /* used as global variable pointer cache */

extern char *l_include_path[];   /* library including path */

extern int disp_offset;     /* displacement offset in code and function */

/*
    function arugment evaluation order
	define compatiblity in inline function generation
 */
#define NORMAL 0
#define REVERSE 1
extern int eval_order;    

extern int MAX_REGISTER; 
extern int MAX_REGISTGER_VAR;
extern int MAX_FREGISTER;

extern int MAX_INPUT_REGISTER_VAR;
extern int MAX_CODE_INPUT_REGISTER_VAR;
extern int MAX_INPUT_DREGISTER_VAR;
extern int MAX_CODE_INPUT_FREGISTER_VAR;
extern int MAX_CODE_INPUT_DREGISTER_VAR;

#define REG_LVAR_OFFSET 2

extern int data_alignment;

extern int code_lassop_p;  /* architecture has code_lassop */

/* used by mc-codegen */

extern void data_mode(char *name);
extern void text_mode(int align);
extern void cstring_mode();

extern void gexpr_init(void);  /* code generator initialize for each statement */
extern void emit_init(void);   /* called before delcalartion */
extern void gen_gdecl(char *n, int gpc);   /* global definition */

extern void code_init();   /* called only once */
extern void emit_reinit(); /* called for each file */

extern void gexpr_code_init(void);

extern void code_enter(char *name);
extern void code_enter1(int args);
extern void code_leave(char *name);
extern void code_label_call(int i);
extern void code_ret();
extern void enter(char *name);
extern void enter1();
extern void leave(int control, char *name);
extern void jmp(int l);
extern int not_simple_p(int l);
extern void code_save_stacks();
extern int code_arg_alignment(int disp0,NMTBL *n,int type0,int sz, int is_code);
extern int code_lvar_alignment(int disp0,NMTBL *n,int type0,int sz);

extern int get_register_var(NMTBL *n);
extern int get_dregister_var(NMTBL *n,int d);
extern int get_lregister_var(NMTBL *n);
extern int get_input_register_var(int,NMTBL *,int);
extern int get_input_dregister_var(int,NMTBL *,int,int);
extern int get_input_lregister_var(int,NMTBL *,int);
extern void code_ptr_cache_def(int r,NMTBL *nptr);
extern void use_ptr_cache(int r);
extern int code_register_overlap(int s,int t);

extern int emit_push();
extern int emit_pop(int type);
extern void gexpr_code_init();
extern int  code_csvalue();
extern void code_gexpr(int e);
extern void code_cmpdimm(int e, int csreg,int label,int cond);
extern void code_gvar(int e1,int reg);
extern void code_rgvar(int e1,int reg);
extern void code_crgvar(int e1,int reg,int sign,int sz);
extern void code_lvar(int e2,int reg);
extern void code_register(int e2,int reg);
extern void code_rlvar(int e2,int reg);
extern void code_crlvar(int e2,int reg,int sign,int sz);
extern void code_fname(NMTBL *n,int reg);
extern void code_const(int e2,int reg);
extern void code_neg(int reg);
extern void code_not(int reg);
extern void code_lnot(int reg);
extern void code_preinc(int e1,int e2,int dir,int sign,int sz,int reg);
extern void code_postinc(int e1,int e2,int dir,int sign,int sz,int reg);
extern void code_return(int reg);
extern void code_environment(int reg);
extern void code_bool(int e1,int reg);
extern void code_cmp_crgvar(int e1,int reg,int sz,int label,int cond);
extern void code_cmp_crlvar(int e1,int reg,int sz,int label,int cond);
extern void code_cmp_rgvar(int e1,int reg,int label,int cond);
extern void code_cmp_rlvar(int e1,int reg,int label,int cond);
extern void code_cmp_register(int e2,int label,int cond);
extern void code_string(int e1,int reg);
extern void emit_copy(int from,int  to,int length,int offset,int value,int det);
extern int function(int e1);
extern void code_frame_pointer(int e3);
extern int code_frame_pointer_register();
extern void code_fix_frame_pointer(int disp_offset);
extern void code_jmp(char *s);
extern void code_indirect_jmp(int e2);

extern void code_rindirect(int e1, int reg,int offset, int us,int sz);
#if FLOAT_CODE
extern int code_drindirect(int e1, int reg,int offset, int d);
#endif
#if LONGLONG_CODE
extern int code_lrindirect(int e1, int reg,int offset, int us);
#endif

extern void code_assign_gvar(int e2,int reg,int byte);
extern void code_assign_lvar(int e2,int reg,int byte);
extern void code_assign_register(int e2,int byte,int reg);
extern void code_assign(int e2,int byte,int reg);
extern void code_register_assop(int e2,int reg,int op,int byte);
extern void code_assop(int op,int reg,int byte,int sign);
extern void tosop(int op,int reg,int oreg);
extern int tosop_operand_safe_p(int);
extern void code_opening(char *filename);
extern void code_closing();
extern int rexpr(int e1, int l1, int cond,int t);
extern void jmp(int l);
extern int code_get_fixed_creg(int reg,int type);
extern void code_set_fixed_creg(int reg,int mode,int type);
extern int code_set_return_register(int mode);
extern void global_table(void);
extern void code_label(int labelno);
extern void code_label_value(int labelno,int reg);

extern int code_const_op_p(int op,int v); 
extern void oprtc(int op,int reg,int v);

extern void code_align(int t);
extern void emit_global(NMTBL *n,int t,int e);
extern void emit_space(int sp);
extern void emit_char(int d);
extern void emit_short(int d);
extern void emit_int(int d);
extern void emit_longlong(int e);
extern void emit_double(int e);
extern void emit_float(int e);
extern void emit_address(char *s,int offset);
extern void emit_label(int labelno);
extern int emit_string_label();
extern void emit_string(char *,int type);
void emit_strings(NMTBL *n);
void code_strings(int e2,int reg);

extern void code_i2c(int reg);
extern void code_i2s(int reg);
extern void code_u2uc(int reg);
extern void code_u2us(int reg);

#if FLOAT_CODE
/* floating point part */

extern int drexpr(int e1, int e2,int l1, int op,int cond);
extern int dpop_register();
extern int emit_dpop(int);
extern void code_dregister(int e2,int reg,int d);
extern void code_cmp_dregister(int,int,int,int);
extern void code_cmp_drgvar(int,int,int,int,int);
extern void code_cmp_drlvar(int,int,int,int,int);
extern void code_dassign(int,int,int);
extern void code_dassign_gvar(int,int,int);
extern void code_dassign_lvar(int,int,int);
extern void code_dassign_dregister(int e2,int d,int reg);
extern void code_dconst(int,int,int);
extern void code_dneg(int,int);
extern void code_drgvar(int,int,int);
extern void code_drlvar(int,int,int);
extern void dtosop(int,int,int);
extern void emit_dpop_free(int,int);
extern void emit_dpush(int);
extern void code_i2d();
extern void code_d2i();
extern void code_u2d();
extern void code_d2u();
extern void code_d2f();
extern void code_f2d();
extern void code_f2i();
extern void code_f2u();
extern void code_i2f();
extern void code_u2f();


extern void code_dpreinc(int e1,int e2,int d,int reg);
extern void code_dpostinc(int e1,int e2,int d,int reg);
extern void code_dassop(int op,int reg,int d);
extern void code_register_dassop(int reg,int op,int d);

#endif

#if LONGLONG_CODE
/* 64bit int part */

extern int lrexpr(int e1, int e2,int l1, int op,int cond);
extern int lpop_register();
extern int emit_lpop();
extern void code_lregister(int e2,int reg);
extern void code_cmp_lregister(int,int,int);
extern void code_cmp_lrgvar(int,int,int,int);
extern void code_cmp_lrlvar(int,int,int,int);
extern void code_lassign(int,int);
extern void code_lassign_gvar(int,int);
extern void code_lassign_lvar(int,int);
extern void code_lassign_lregister(int e2,int reg);
extern void code_lconst(int,int);
extern void code_lneg(int);
extern void code_lrgvar(int,int);
extern void code_lrlvar(int,int);
extern void ltosop(int,int,int);
extern void emit_lpop_free(int);
extern void emit_lpush();
extern int code_lconst_op_p(int op,int e); 
extern void loprtc(int op,int reg, int e);
extern void code_i2ll(int reg);
extern void code_i2ull(int reg);
extern void code_u2ll(int reg);
extern void code_u2ull(int reg);
extern void code_ll2i(int reg);
extern void code_ll2u(int reg);
extern void code_ull2i(int reg);
extern void code_ull2u(int reg);
#if FLOAT_CODE
extern void code_d2ll(int reg);
extern void code_d2ull(int reg);
extern void code_f2ll(int reg);
extern void code_f2ull(int reg);
extern void code_ll2d(int reg);
extern void code_ll2f(int reg);
extern void code_ull2d(int reg);
extern void code_ull2f(int reg);
#endif




extern void code_lpreinc(int e1,int e2,int reg);
extern void code_lpostinc(int e1,int e2,int reg);
extern void code_lassop(int op,int reg);
extern void code_register_lassop(int reg,int op);

#endif

extern void code_alloca(int e,int reg);
extern void code_builtin_fabsf(int e);
extern void code_builtin_fabs(int e);
extern void code_builtin_inff();
extern void code_builtin_inf();
extern void code_arg_register(NMTBL *fnptr, int in);

extern int get_register();
extern int get_dregister();
extern int get_lregister();
extern void free_register(int i) ;
extern int pop_register(void);
extern void emit_pop_free(int xreg);
extern void emit_data_closing(NMTBL *n);


// extern int use_int(int);
// extern int use_float(int);
// extern int use_double(int);
// extern int use_longlong(int);

#if CASE_CODE
extern int code_table_jump_p(int delta);
extern void code_table_jump(int table,int csvalue,int delta,int max,int min,int dlabel);
extern void code_table_open(int table);
extern void code_table_value(int label,int table);
extern void code_table_close();
#endif

#if ASM_CODE

extern void code_asm(char *asm_str,int repl);
extern int code_asm_operand(char *p,int e1,int mode,int repl,int n,int repl0);
extern void code_free_asm_operand(int repl);

#endif

extern void code_comment(char *s);

#if BIT_FIELD_CODE

/* bit field alignment calcuration */

extern int code_bit_field_disp(int type,int *offset,int *bfd,int *sz);

/* bit field value */

/* reg contains address of bit_field, result should goto reg */
extern void code_bit_field(int type,int adr,int reg);

/* bit field replacement */

extern void code_bit_replace(int value,int lvalue,int type);
                          /*  register,   register */
extern void code_bit_replace_const(int value,int lvalue,int type);
                          /*  exp,   register */

#endif

/* end */