# 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',
},