X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fbe%2Fbearch_t.h;h=0e7590b0d1d3b343fe97341cfe648e9dd85fb3ea;hb=88423364d3b0dc96480ca5d58e3144d87e01a9c8;hp=80c7f62ad8f5645a41ffa02edac1d1683f7bb9b4;hpb=1ce363f80e6a204d4011f85813362d9bd1d0e7e4;p=libfirm diff --git a/ir/be/bearch_t.h b/ir/be/bearch_t.h index 80c7f62ad..0e7590b0d 100644 --- a/ir/be/bearch_t.h +++ b/ir/be/bearch_t.h @@ -33,6 +33,7 @@ #include "bemachine.h" #include "beirg.h" #include "beabi.h" +#include "raw_bitset.h" /** * A register. @@ -139,6 +140,32 @@ struct arch_register_req_t { (must_be_different) */ }; +static INLINE int reg_reqs_equal(const arch_register_req_t *req1, + const arch_register_req_t *req2) +{ + if (req1 == req2) + return 1; + + if (req1->type != req2->type + || req1->cls != req2->cls + || req1->other_same != req2->other_same + || req1->other_different != req2->other_different) + return 0; + + if (req1->limited != NULL) { + size_t n_regs; + + if (req2->limited == NULL) + return 0; + + n_regs = arch_register_class_n_regs(req1->cls); + if (!rbitset_equal(req1->limited, req2->limited, n_regs)) + return 0; + } + + return 1; +} + /** * An inverse operation returned by the backend */ @@ -317,6 +344,11 @@ struct arch_code_generator_if_t { */ void *(*init)(be_irg_t *birg); + /** + * return node used as base in pic code addresses + */ + ir_node* (*get_pic_base)(void *self); + /** * Called before abi introduce. */ @@ -387,6 +419,8 @@ do { \ #define arch_code_generator_done(cg) _arch_cg_call(cg, done) #define arch_code_generator_spill(cg, birg) _arch_cg_call_env(cg, birg, spill) #define arch_code_generator_has_spiller(cg) ((cg)->impl->spill != NULL) +#define arch_code_generator_get_pic_base(cg) \ + ((cg)->impl->get_pic_base != NULL ? (cg)->impl->get_pic_base(cg) : NULL) /** * Code generator base class. @@ -402,10 +436,11 @@ struct arch_isa_t { const arch_isa_if_t *impl; const arch_register_t *sp; /** The stack pointer register. */ const arch_register_t *bp; /** The base pointer register. */ - const int stack_dir; /** -1 for decreasing, 1 for increasing. */ + int stack_dir; /** -1 for decreasing, 1 for increasing. */ + int stack_alignment; /** stack alignment */ const be_main_env_t *main_env; /** the be main environment */ - const int spill_cost; /** cost for a be_Spill node */ - const int reload_cost; /** cost for a be_Reload node */ + int spill_cost; /** cost for a be_Spill node */ + int reload_cost; /** cost for a be_Reload node */ }; #define arch_isa_stack_dir(isa) ((isa)->stack_dir)