Commit 8b055230 authored by Christoph Mallon's avatar Christoph Mallon
Browse files

sparc: Implement memory asm constraints 'g', 'm' and 'w'.

parent 90812b9d
......@@ -729,6 +729,12 @@ static void emit_sparc_asm_operand(ir_node const *const node, char const modifie
case ASM_OPERAND_OUTPUT_VALUE:
sparc_emit_register(arch_get_irn_register_out(node, op->pos));
return;
case ASM_OPERAND_MEMORY:
be_emit_char('[');
sparc_emit_register(arch_get_irn_register_in(node, op->pos));
be_emit_char(']');
return;
}
panic("invalid asm operand kind");
}
......
......@@ -94,7 +94,8 @@ struct sparc_switch_jmp_attr_t {
typedef enum operand_kind_t {
ASM_OPERAND_INPUT_VALUE,
ASM_OPERAND_OUTPUT_VALUE,
ASM_OPERAND_IMMEDIATE
ASM_OPERAND_IMMEDIATE,
ASM_OPERAND_MEMORY,
} operand_kind_t;
typedef struct sparc_asm_operand_t {
......
......@@ -204,6 +204,7 @@ static void sparc_parse_constraint_letter(void const *const env, be_asm_constrai
case 'g':
c->all_registers_allowed = true;
c->memory_possible = true;
/* FALLTHROUGH */
case 'A':
case 'I':
......@@ -218,6 +219,11 @@ static void sparc_parse_constraint_letter(void const *const env, be_asm_constrai
c->immediate_type = l;
break;
case 'm':
case 'w':
c->memory_possible = true;
break;
default:
panic("unknown asm constraint '%c'", l);
}
......@@ -242,7 +248,8 @@ void sparc_init_asm_constraints(void)
{
be_set_constraint_support(ASM_CONSTRAINT_FLAG_SUPPORTS_REGISTER, "0123456789efr");
be_set_constraint_support(ASM_CONSTRAINT_FLAG_SUPPORTS_IMMEDIATE, "AIJLMOPin");
be_set_constraint_support(ASM_CONSTRAINT_FLAG_SUPPORTS_IMMEDIATE | ASM_CONSTRAINT_FLAG_SUPPORTS_REGISTER, "g");
be_set_constraint_support(ASM_CONSTRAINT_FLAG_SUPPORTS_ANY, "g");
be_set_constraint_support(ASM_CONSTRAINT_FLAG_SUPPORTS_MEMOP, "mw");
/* Note there are many more flags in gcc which we can't properly support
* at the moment. see gcc/config/sparc/constraints.md */
}
......@@ -390,13 +397,18 @@ static ir_node *gen_ASM(ir_node *node)
if (imm_type != '\0' && sparc_match_immediate(operand, pred, imm_type))
continue;
arch_register_req_t const *const req = be_make_register_req(obst, &parsed_constraint, n_out_constraints, out_reg_reqs, i);
ir_node *const new_pred = be_transform_node(pred);
operand_kind_t kind = ASM_OPERAND_INPUT_VALUE;
arch_register_req_t const *req = be_make_register_req(obst, &parsed_constraint, n_out_constraints, out_reg_reqs, i);
if (req == arch_no_register_req) {
kind = ASM_OPERAND_MEMORY;
req = arch_get_irn_register_req(new_pred)->cls->class_req;
}
in_reg_reqs[i] = req;
int op_pos = n_ins++;
ir_node *new_pred = be_transform_node(pred);
int const op_pos = n_ins++;
in[op_pos] = new_pred;
operand->kind = ASM_OPERAND_INPUT_VALUE;
operand->kind = kind;
operand->pos = op_pos;
}
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment