assert(0 && "floating point not supported (yet)");
}
else if (mode_is_int(mode) || mode_is_reference(mode)) {
- memcpy(req, &(mips_default_req_mips_general_purpose.req), sizeof(*req));
+ memcpy(req, &(mips_default_req_mips_gp.req), sizeof(*req));
}
else if (mode == mode_T || mode == mode_M) {
DBG((mod, LEVEL_1, "ignoring Phi node %+F\n", irn));
static mips_isa_t mips_isa_template = {
&mips_isa_if,
- &mips_general_purpose_regs[REG_SP],
- &mips_general_purpose_regs[REG_FP],
+ &mips_gp_regs[REG_SP],
+ &mips_gp_regs[REG_FP],
-1, // stack direction
0, // num codegens?!? TODO what is this?
NULL
*/
const arch_register_class_t *mips_get_reg_class_for_mode(const void *self, const ir_mode *mode) {
ASSERT_NO_FLOAT(mode);
- return &mips_reg_classes[CLASS_mips_general_purpose];
+ return &mips_reg_classes[CLASS_mips_gp];
}
typedef struct {
dbg_info *dbg = NULL; // TODO where can I get this from?
ir_node *block = get_irg_start_block(env->irg);
mips_attr_t *attr;
- ir_node *sp = be_abi_reg_map_get(reg_map, &mips_general_purpose_regs[REG_SP]);
- ir_node *fp = be_abi_reg_map_get(reg_map, &mips_general_purpose_regs[REG_FP]);
+ ir_node *sp = be_abi_reg_map_get(reg_map, &mips_gp_regs[REG_SP]);
+ ir_node *fp = be_abi_reg_map_get(reg_map, &mips_gp_regs[REG_FP]);
int initialstackframesize;
if(env->debug) {
sp = new_rd_mips_addi(dbg, irg, block, sp, mode_Is);
attr = get_mips_attr(sp);
attr->tv = new_tarval_from_long(-initialstackframesize, mode_Is);
- mips_set_irn_reg(NULL, sp, &mips_general_purpose_regs[REG_SP]);
- //arch_set_irn_register(mips_get_arg_env(), sp, &mips_general_purpose_regs[REG_SP]);
+ mips_set_irn_reg(NULL, sp, &mips_gp_regs[REG_SP]);
+ //arch_set_irn_register(mips_get_arg_env(), sp, &mips_gp_regs[REG_SP]);
/* TODO: where to get an edge with a0-a3
int i;
for(i = 0; i < 4; ++i) {
- ir_node *reg = be_abi_reg_map_get(reg_map, &mips_general_purpose_regs[REG_A0 + i]);
+ ir_node *reg = be_abi_reg_map_get(reg_map, &mips_gp_regs[REG_A0 + i]);
ir_node *store = new_rd_mips_store_r(dbg, irg, block, *mem, sp, reg, mode_T);
attr = get_mips_attr(store);
attr->load_store_mode = mode_Iu;
}
*/
- reg = be_abi_reg_map_get(reg_map, &mips_general_purpose_regs[REG_FP]);
+ reg = be_abi_reg_map_get(reg_map, &mips_gp_regs[REG_FP]);
store = new_rd_mips_store_r(dbg, irg, block, *mem, sp, reg, mode_T);
attr = get_mips_attr(store);
attr->modes.load_store_mode = mode_Iu;
mm[4] = new_r_Proj(irg, block, store, mode_M, pn_Store_M);
- reg = be_abi_reg_map_get(reg_map, &mips_general_purpose_regs[REG_RA]);
+ reg = be_abi_reg_map_get(reg_map, &mips_gp_regs[REG_RA]);
store = new_rd_mips_store_r(dbg, irg, block, *mem, sp, reg, mode_T);
attr = get_mips_attr(store);
attr->modes.load_store_mode = mode_Iu;
sp = new_rd_mips_addi(dbg, irg, block, sp, mode_Is);
attr = get_mips_attr(sp);
attr->tv = new_tarval_from_long(-initialstackframesize, mode_Is);
- mips_set_irn_reg(NULL, sp, &mips_general_purpose_regs[REG_SP]);
- //arch_set_irn_register(mips_get_arg_env(), sp, &mips_general_purpose_regs[REG_SP]);
+ mips_set_irn_reg(NULL, sp, &mips_gp_regs[REG_SP]);
+ //arch_set_irn_register(mips_get_arg_env(), sp, &mips_gp_regs[REG_SP]);
- reg = be_abi_reg_map_get(reg_map, &mips_general_purpose_regs[REG_FP]);
+ reg = be_abi_reg_map_get(reg_map, &mips_gp_regs[REG_FP]);
store = new_rd_mips_store_r(dbg, irg, block, *mem, sp, reg, mode_T);
attr = get_mips_attr(store);
attr->modes.load_store_mode = mode_Iu;
fp = new_rd_mips_addi(dbg, irg, block, sp, mode_Is);
attr = get_mips_attr(fp);
attr->tv = new_tarval_from_long(initialstackframesize, mode_Is);
- mips_set_irn_reg(NULL, fp, &mips_general_purpose_regs[REG_FP]);
- //arch_set_irn_register(mips_get_arg_env(), fp, &mips_general_purpose_regs[REG_FP]);
+ mips_set_irn_reg(NULL, fp, &mips_gp_regs[REG_FP]);
+ //arch_set_irn_register(mips_get_arg_env(), fp, &mips_gp_regs[REG_FP]);
- be_abi_reg_map_set(reg_map, &mips_general_purpose_regs[REG_FP], fp);
- be_abi_reg_map_set(reg_map, &mips_general_purpose_regs[REG_SP], sp);
+ be_abi_reg_map_set(reg_map, &mips_gp_regs[REG_FP], fp);
+ be_abi_reg_map_set(reg_map, &mips_gp_regs[REG_SP], sp);
- return &mips_general_purpose_regs[REG_SP];
+ return &mips_gp_regs[REG_SP];
}
static void mips_abi_epilogue(void *self, ir_node *block, ir_node **mem, pmap *reg_map)
ir_graph *irg = env->irg;
dbg_info *dbg = NULL; // TODO where can I get this from?
mips_attr_t *attr;
- ir_node *sp = be_abi_reg_map_get(reg_map, &mips_general_purpose_regs[REG_SP]);
- ir_node *fp = be_abi_reg_map_get(reg_map, &mips_general_purpose_regs[REG_FP]);
+ ir_node *sp = be_abi_reg_map_get(reg_map, &mips_gp_regs[REG_SP]);
+ ir_node *fp = be_abi_reg_map_get(reg_map, &mips_gp_regs[REG_FP]);
ir_node *load;
int initial_frame_size = env->debug ? 24 : 4;
int fp_save_offset = env->debug ? 16 : 0;
// restore sp
- //sp = be_new_IncSP(&mips_general_purpose_regs[REG_SP], irg, block, sp, *mem, BE_STACK_FRAME_SIZE, be_stack_dir_against);
+ //sp = be_new_IncSP(&mips_gp_regs[REG_SP], irg, block, sp, *mem, BE_STACK_FRAME_SIZE, be_stack_dir_against);
// copy fp to sp
sp = new_rd_mips_move(dbg, irg, block, fp, mode_Iu);
- mips_set_irn_reg(NULL, sp, &mips_general_purpose_regs[REG_SP]);
- //arch_set_irn_register(mips_get_arg_env(), fp, &mips_general_purpose_regs[REG_SP]);
+ mips_set_irn_reg(NULL, sp, &mips_gp_regs[REG_SP]);
+ //arch_set_irn_register(mips_get_arg_env(), fp, &mips_gp_regs[REG_SP]);
// 1. restore fp
load = new_rd_mips_load_r(dbg, irg, block, *mem, sp, mode_T);
attr->tv = new_tarval_from_long(fp_save_offset - initial_frame_size, mode_Is);
fp = new_r_Proj(irg, block, load, mode_Iu, pn_Load_res);
- mips_set_irn_reg(NULL, fp, &mips_general_purpose_regs[REG_FP]);
- //arch_set_irn_register(mips_get_arg_env(), fp, &mips_general_purpose_regs[REG_FP]);
+ mips_set_irn_reg(NULL, fp, &mips_gp_regs[REG_FP]);
+ //arch_set_irn_register(mips_get_arg_env(), fp, &mips_gp_regs[REG_FP]);
- be_abi_reg_map_set(reg_map, &mips_general_purpose_regs[REG_FP], fp);
- be_abi_reg_map_set(reg_map, &mips_general_purpose_regs[REG_SP], sp);
+ be_abi_reg_map_set(reg_map, &mips_gp_regs[REG_FP], fp);
+ be_abi_reg_map_set(reg_map, &mips_gp_regs[REG_SP], sp);
}
/**
for (i = 0; i < n; i++) {
// first 4 params in $a0-$a3, the others on the stack
if(i < 4) {
- reg = &mips_general_purpose_regs[REG_A0 + i];
+ reg = &mips_gp_regs[REG_A0 + i];
be_abi_call_param_reg(abi, i, reg);
} else {
/* default: all parameters on stack */
mode = get_type_mode(tp);
ASSERT_NO_FLOAT(mode);
- reg = &mips_general_purpose_regs[REG_V0 + i];
+ reg = &mips_gp_regs[REG_V0 + i];
be_abi_call_res_reg(abi, i, reg);
}
}
# for i = 1 .. arity: ir_node *op_i
# ir_mode *mode
#
+# outs: if a node defines more than one output, the names of the projections
+# nodes having outs having automatically the mode mode_T
+#
# comment: OPTIONAL comment for the node constructor
#
# rd_constructor: for every operation there will be a
# 4 - ignore (do not assign this register)
# NOTE: Last entry of each class is the largest Firm-Mode a register can hold\
%reg_classes = (
- "general_purpose" => [
+ "gp" => [
{ name => "zero", type => 4+2 }, # always zero
{ name => "at", type => 4 }, # reserved for assembler
{ name => "v0", type => 1 }, # first return value
add => {
op_flags => "C",
- reg_req => { in => [ "general_purpose", "general_purpose" ], out => [ "general_purpose" ] },
+ reg_req => { in => [ "gp", "gp" ], out => [ "gp" ] },
emit => '. addu %D1, %S1, %S2'
},
addi => {
- reg_req => { in => [ "general_purpose" ], out => [ "general_purpose" ] },
+ reg_req => { in => [ "gp" ], out => [ "gp" ] },
emit => '. addiu %D1, %S1, %C',
cmp_attr => 'return attr_a->tv != attr_b->tv;',
},
and => {
op_flags => "C",
- reg_req => { in => [ "general_purpose", "general_purpose" ], out => [ "general_purpose" ] },
+ reg_req => { in => [ "gp", "gp" ], out => [ "gp" ] },
emit => '. and %D1, %S1, %S2',
},
andi => {
- reg_req => { in => [ "general_purpose" ], out => [ "general_purpose" ] },
+ reg_req => { in => [ "gp" ], out => [ "gp" ] },
emit => '. andi %D1, %S1, %C',
cmp_attr => 'return attr_a->tv != attr_b->tv;',
},
div => {
- reg_req => { in => [ "general_purpose", "general_purpose" ], out => [ "none", "none", "none", "none" ] },
+ reg_req => { in => [ "gp", "gp" ], out => [ "none", "none", "none", "none" ] },
emit => '
mips_attr_t *attr = get_mips_attr(n);
if (attr->modes.original_mode->sign) {
mult => {
op_flags => "C",
- reg_req => { in => [ "general_purpose", "general_purpose" ], out => [ "none" ] },
+ reg_req => { in => [ "gp", "gp" ], out => [ "none" ] },
emit => '
- if (mode_is_signed(get_irn_mode(n)))
+ if (mode_is_signed(get_irn_mode(n))) {
2. mult %S1, %S2
- else
+ }
+ else {
2. multu %S1, %S2
-'
+ }
+',
},
nor => {
op_flags => "C",
- reg_req => { in => [ "general_purpose", "general_purpose" ], out => [ "general_purpose" ] },
+ reg_req => { in => [ "gp", "gp" ], out => [ "gp" ] },
emit => '. nor %D1, %S1, %S2'
},
not => {
- reg_req => { in => [ "general_purpose" ], out => [ "general_purpose" ] },
+ reg_req => { in => [ "gp" ], out => [ "gp" ] },
emit => '. nor %D1, %S1, $zero'
},
or => {
op_flags => "C",
- reg_req => { in => [ "general_purpose", "general_purpose" ], out => [ "general_purpose" ] },
+ reg_req => { in => [ "gp", "gp" ], out => [ "gp" ] },
emit => '. or %D1, %S1, %S2'
},
ori => {
- reg_req => { in => [ "general_purpose" ], out => [ "general_purpose" ] },
+ reg_req => { in => [ "gp" ], out => [ "gp" ] },
emit => '. ori %D1, %S1, %C',
cmp_attr => 'return attr_a->tv != attr_b->tv;',
},
sl => {
- reg_req => { in => [ "general_purpose", "general_purpose" ], out => [ "general_purpose" ] },
+ reg_req => { in => [ "gp", "gp" ], out => [ "gp" ] },
emit => '
- if (mode_is_signed(get_irn_mode(n)))
+ if (mode_is_signed(get_irn_mode(n))) {
2. sal %D1, %S1, %S2
- else
-2. sll %D1, %S1, %S2',
+ }
+ else {
+2. sll %D1, %S1, %S2
+ }
+',
},
sli => {
- reg_req => { in => [ "general_purpose" ], out => [ "general_purpose" ] },
+ reg_req => { in => [ "gp" ], out => [ "gp" ] },
emit => '
- if (mode_is_signed(get_irn_mode(n)))
+ if (mode_is_signed(get_irn_mode(n))) {
2. sal %D1, %S1, %C
- else
-2. sll %D1, %S1, %C',
+ }
+ else {
+2. sll %D1, %S1, %C
+ }
+',
},
sra => {
- reg_req => { in => [ "general_purpose", "general_purpose" ], out => [ "general_purpose" ] },
+ reg_req => { in => [ "gp", "gp" ], out => [ "gp" ] },
emit => '. sra %D1, %S1, %S2',
},
srai => {
- reg_req => { in => [ "general_purpose" ], out => [ "general_purpose" ] },
+ reg_req => { in => [ "gp" ], out => [ "gp" ] },
emit => '. sra %D1, %S1, %C',
cmp_attr => 'return attr_a->tv != attr_b->tv;',
},
sr => {
- reg_req => { in => [ "general_purpose", "general_purpose" ], out => [ "general_purpose" ] },
+ reg_req => { in => [ "gp", "gp" ], out => [ "gp" ] },
emit => '
- if (mode_is_signed(get_irn_mode(n)))
+ if (mode_is_signed(get_irn_mode(n))) {
2. sra %D1, %S1, %S2
- else
+ }
+ else {
2. srl %D1, %S1, %S2
+ }
',
},
sri => {
- reg_req => { in => [ "general_purpose" ], out => [ "general_purpose" ] },
+ reg_req => { in => [ "gp" ], out => [ "gp" ] },
emit => '
- if (mode_is_signed(get_irn_mode(n)))
+ if (mode_is_signed(get_irn_mode(n))) {
2. sra %D1, %S1, %C
- else
+ }
+ else {
2. srl %D1, %S1, %C
+ }
',
},
srlv => {
- reg_req => { in => [ "general_purpose", "general_purpose" ], out => [ "general_purpose" ] },
+ reg_req => { in => [ "gp", "gp" ], out => [ "gp" ] },
emit => '. srlv %D1, %S1, %S2',
},
sllv => {
- reg_req => { in => [ "general_purpose", "general_purpose" ], out => [ "general_purpose" ] },
+ reg_req => { in => [ "gp", "gp" ], out => [ "gp" ] },
emit => '. sllv %D1, %S1, %S2',
},
sub => {
- reg_req => { in => [ "general_purpose", "general_purpose" ], out => [ "general_purpose" ] },
+ reg_req => { in => [ "gp", "gp" ], out => [ "gp" ] },
emit => '. subu %D1, %S1, %S2',
},
subuzero => {
- reg_req => { in => [ "general_purpose" ], out => [ "general_purpose" ] },
+ reg_req => { in => [ "gp" ], out => [ "gp" ] },
emit => '. subu %D1, $zero, %S1',
},
xor => {
- reg_req => { in => [ "general_purpose", "general_purpose" ], out => [ "general_purpose" ] },
+ reg_req => { in => [ "gp", "gp" ], out => [ "gp" ] },
emit => '. xor %D1, %S1, %S2'
},
xori => {
- reg_req => { in => [ "general_purpose" ], out => [ "general_purpose" ] },
+ reg_req => { in => [ "gp" ], out => [ "gp" ] },
emit => '. xori %D1, %S1, %C',
cmp_attr => 'return attr_a->tv != attr_b->tv;',
},
# load upper imediate
lui => {
op_flags => "c",
- reg_req => { out => [ "general_purpose" ] },
+ reg_req => { out => [ "gp" ] },
emit => '. lui %D1, %C',
cmp_attr => 'return attr_a->tv != attr_b->tv;',
},
# load lower immediate
lli => {
op_flags => "c",
- reg_req => { in => [ "general_purpose" ], out => [ "general_purpose" ] },
+ reg_req => { in => [ "gp" ], out => [ "gp" ] },
emit => '. ori %D1, %S1, %C',
cmp_attr => 'return attr_a->tv != attr_b->tv;',
},
la => {
op_flags => "c",
- reg_req => { out => [ "general_purpose" ] },
+ reg_req => { out => [ "gp" ] },
emit => '. la %D1, %C',
cmp_attr => 'return attr_a->symconst_id != attr_b->symconst_id;',
},
mflo => {
- reg_req => { in => [ "none" ], out => [ "general_purpose" ] },
+ reg_req => { in => [ "none" ], out => [ "gp" ] },
emit => '. mflo %D1'
},
mfhi => {
- reg_req => { in => [ "none" ], out => [ "general_purpose" ] },
+ reg_req => { in => [ "none" ], out => [ "gp" ] },
emit => '. mfhi %D1'
},
#
slt => {
- reg_req => { in => [ "general_purpose", "general_purpose" ], out => [ "general_purpose" ] },
+ reg_req => { in => [ "gp", "gp" ], out => [ "gp" ] },
emit => '
- if (mode_is_signed(get_irn_mode(n)))
+ if (mode_is_signed(get_irn_mode(n))) {
2. slt %D1, %S1, %S2
- else
+ }
+ else {
2. sltu %D1, %S1, %S2
+ }
',
},
slti => {
- reg_req => { in => [ "general_purpose" ], out => [ "general_purpose" ] },
+ reg_req => { in => [ "gp" ], out => [ "gp" ] },
emit => '
- if (mode_is_signed(get_irn_mode(n)))
+ if (mode_is_signed(get_irn_mode(n))) {
2. slti %D1, %S1, %C
- else
+ }
+ else {
2. sltiu %D1, %S1, %C
+ }
',
cmp_attr => 'return attr_a->tv != attr_b->tv;',
},
beq => {
op_flags => "X|Y",
# TxT -> TxX
- reg_req => { in => [ "general_purpose", "general_purpose" ], out => [ "in_r0", "none" ] },
+ reg_req => { in => [ "gp", "gp" ], out => [ "in_r0", "none" ] },
emit => '
ir_node *jumpblock = mips_get_jump_block(n, 1);
assert(jumpblock != NULL);
bne => {
op_flags => "X|Y",
# TxT -> TxX
- reg_req => { in => [ "general_purpose", "general_purpose" ], out => [ "in_r0", "none" ] },
+ reg_req => { in => [ "gp", "gp" ], out => [ "in_r0", "none" ] },
emit => '
ir_node *jumpblock = mips_get_jump_block(n, 1);
assert(jumpblock != NULL);
bgtz => {
op_flags => "X|Y",
# TxT -> TxX
- reg_req => { in => [ "general_purpose" ], out => [ "in_r0", "none" ] },
+ reg_req => { in => [ "gp" ], out => [ "in_r0", "none" ] },
emit => '
ir_node *jumpblock = mips_get_jump_block(n, 1);
assert(jumpblock != NULL);
blez => {
op_flags => "X|Y",
# TxT -> TxX
- reg_req => { in => [ "general_purpose" ], out => [ "in_r0", "none" ] },
+ reg_req => { in => [ "gp" ], out => [ "in_r0", "none" ] },
emit => '
ir_node *jumpblock = mips_get_jump_block(n, 1);
assert(jumpblock != NULL);
j => {
op_flags => "X",
- reg_req => { in => [ "general_purpose" ] },
+ reg_req => { in => [ "gp" ] },
emit => '. j %S1',
},
SwitchJump => {
op_flags => "X",
# -> X,X,...
- reg_req => { in => [ "general_purpose" ], out => [ "none" ] },
+ reg_req => { in => [ "gp" ], out => [ "none" ] },
emit => '. j %S1'
},
#
load_r => {
- reg_req => { in => [ "none", "general_purpose" ], out => [ "none", "none", "general_purpose" ] },
+ reg_req => { in => [ "none", "gp" ], out => [ "none", "none", "gp" ] },
emit => '
mips_attr_t* attr = get_mips_attr(n);
ir_mode *mode;
switch (get_mode_size_bits(mode)) {
case 8:
- if (mode_is_signed(mode))
+ if (mode_is_signed(mode)) {
3. lb %D3, %C(%S2)
- else
+ }
+ else {
3. lbu %D3, %C(%S2)
+ }
break;
case 16:
- if (mode_is_signed(mode))
+ if (mode_is_signed(mode)) {
3. lh %D3, %C(%S2)
- else
+ }
+ else {
3. lhu %D3, %C(%S2)
+ }
break;
case 32:
2. lw %D3, %C(%S2)
#
store_r => {
- reg_req => { in => [ "none", "general_purpose", "general_purpose" ], out => [ "none", "none" ] },
+ reg_req => { in => [ "none", "gp", "gp" ], out => [ "none", "none" ] },
emit => '
mips_attr_t* attr = get_mips_attr(n);
ir_mode* mode;
},
store_i => {
- reg_req => { in => [ "none", "none", "general_purpose" ], out => [ "none", "none" ] },
+ reg_req => { in => [ "none", "none", "gp" ], out => [ "none", "none" ] },
emit => '
mips_attr_t* attr = get_mips_attr(n);
ir_mode *mode;
},
move => {
- reg_req => { in => [ "general_purpose" ], out => [ "general_purpose" ] },
+ reg_req => { in => [ "gp" ], out => [ "gp" ] },
emit => '. or %D1, $zero, %S1'
},
#
reinterpret_conv => {
- reg_req => { in => [ "general_purpose" ], out => [ "in_r1" ] },
+ reg_req => { in => [ "gp" ], out => [ "in_r1" ] },
emit => '. # reinterpret %S1 -> %D1',
},