diff options
author | Christoph Mallon <christoph.mallon@gmx.de> | 2018-05-09 19:45:43 +0200 |
---|---|---|
committer | Christoph Mallon <christoph.mallon@gmx.de> | 2018-05-09 19:45:43 +0200 |
commit | 70a481eeb92b5af6a11bed0e74a849bad3d687fb (patch) | |
tree | baa3b00a9e35200bb809070d98a490704e5e99e1 /ir/be/beasm.c | |
parent | 46210b81e457b068ae83f19ee7d4f1a3a05a9a77 (diff) |
be: Factor out code to prepare information collection for an asm node.
Diffstat (limited to 'ir/be/beasm.c')
-rw-r--r-- | ir/be/beasm.c | 23 |
1 files changed, 20 insertions, 3 deletions
diff --git a/ir/be/beasm.c b/ir/be/beasm.c index 0b210ce..d4efed6 100644 --- a/ir/be/beasm.c +++ b/ir/be/beasm.c @@ -176,6 +176,19 @@ unsigned be_count_asm_operands(ir_node const *const node) return n_operands; } +be_asm_info_t be_asm_prepare_info(void) +{ + arch_register_req_t const **const out_reqs = NEW_ARR_F(arch_register_req_t const*, 0); + ir_node **const ins = NEW_ARR_F(ir_node*, 0); + arch_register_req_t const **const in_reqs = NEW_ARR_F(arch_register_req_t const*, 0); + + return (be_asm_info_t){ + .ins = ins, + .in_reqs = in_reqs, + .out_reqs = out_reqs, + }; +} + static bool can_match(arch_register_req_t const *const in, arch_register_req_t const *const out) { if (in->cls != out->cls) @@ -198,8 +211,12 @@ static bool match_requirement(arch_register_req_t const **reqs, size_t const n_r return false; } -ir_node *be_make_asm(ir_node const *const node, ir_node **in, arch_register_req_t const **in_reqs, arch_register_req_t const **out_reqs, void *const operands) +ir_node *be_make_asm(ir_node const *const node, be_asm_info_t const *const info, void *const operands) { + ir_node **in = info->ins; + arch_register_req_t const **in_reqs = info->in_reqs; + arch_register_req_t const **out_reqs = info->out_reqs; + assert(ARR_LEN(in) == ARR_LEN(in_reqs)); ir_graph *const irg = get_irn_irg(node); @@ -322,9 +339,9 @@ ir_node *be_make_asm(ir_node const *const node, ir_node **in, arch_register_req_ } } - backend_info_t *const info = be_get_info(new_node); + backend_info_t *const be_info = be_get_info(new_node); for (size_t o = 0; o < n_outs; ++o) { - info->out_infos[o].req = out_reqs[o]; + be_info->out_infos[o].req = out_reqs[o]; } DEL_ARR_F(in); |