summaryrefslogtreecommitdiffhomepage
path: root/ir/be/beasm.c
diff options
context:
space:
mode:
authorChristoph Mallon <christoph.mallon@gmx.de>2018-05-09 19:45:43 +0200
committerChristoph Mallon <christoph.mallon@gmx.de>2018-05-09 19:45:43 +0200
commit70a481eeb92b5af6a11bed0e74a849bad3d687fb (patch)
treebaa3b00a9e35200bb809070d98a490704e5e99e1 /ir/be/beasm.c
parent46210b81e457b068ae83f19ee7d4f1a3a05a9a77 (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.c23
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);