} else {
die("Invalid address mode '$am' specified on op $name");
}
+ if($am ne "none") {
+ if($node->{state} ne "exc_pinned"
+ and $node->{state} ne "pinned") {
+ die("AM nodes must have pinned or AM pinned state ($name)");
+ }
+ }
}
return $res;
}
Add => {
irn_flags => "R",
+ state => "exc_pinned",
reg_req => { in => [ "gp", "gp", "none", "gp", "gp" ], out => [ "in_r4 in_r5", "none", "flags" ] },
ins => [ "base", "index", "mem", "left", "right" ],
emit => '. add%M %binop',
AddMem => {
irn_flags => "R",
+ state => "exc_pinned",
reg_req => { in => [ "gp", "gp", "none", "gp" ], out => [ "none" ] },
ins => [ "base", "index", "mem", "val" ],
emit => ". add%M %SI3, %AM",
AddMem8Bit => {
irn_flags => "R",
+ state => "exc_pinned",
reg_req => { in => [ "gp", "gp", "none", "eax ebx ecx edx" ], out => [ "none" ] },
ins => [ "base", "index", "mem", "val" ],
emit => ". add%M %SB3, %AM",
},
Adc => {
+ state => "exc_pinned",
reg_req => { in => [ "gp", "gp", "none", "gp", "gp", "flags" ], out => [ "in_r4 in_r5" ] },
ins => [ "base", "index", "mem", "left", "right", "eflags" ],
emit => '. adc%M %binop',
Mul => {
# we should not rematrialize this node. It produces 2 results and has
# very strict constrains
+ state => "exc_pinned",
reg_req => { in => [ "gp", "gp", "none", "eax", "gp" ], out => [ "eax", "edx", "none" ] },
ins => [ "base", "index", "mem", "val_high", "val_low" ],
emit => '. mul%M %unop4',
IMul => {
irn_flags => "R",
+ state => "exc_pinned",
reg_req => { in => [ "gp", "gp", "none", "gp", "gp" ], out => [ "in_r4 in_r5" ] },
ins => [ "base", "index", "mem", "left", "right" ],
emit => '. imul%M %binop',
IMul1OP => {
irn_flags => "R",
+ state => "exc_pinned",
reg_req => { in => [ "gp", "gp", "none", "eax", "gp" ], out => [ "eax", "edx", "none" ] },
ins => [ "base", "index", "mem", "val_high", "val_low" ],
emit => '. imul%M %unop4',
And => {
irn_flags => "R",
+ state => "exc_pinned",
reg_req => { in => [ "gp", "gp", "none", "gp", "gp" ], out => [ "in_r4 in_r5" ] },
ins => [ "base", "index", "mem", "left", "right" ],
am => "full,binary",
AndMem => {
irn_flags => "R",
+ state => "exc_pinned",
reg_req => { in => [ "gp", "gp", "none", "gp" ], out => [ "none" ] },
ins => [ "base", "index", "mem", "val" ],
emit => '. and%M %SI3, %AM',
AndMem8Bit => {
irn_flags => "R",
+ state => "exc_pinned",
reg_req => { in => [ "gp", "gp", "none", "eax ebx ecx edx" ], out => [ "none" ] },
ins => [ "base", "index", "mem", "val" ],
emit => '. and%M %SB3, %AM',
Or => {
irn_flags => "R",
+ state => "exc_pinned",
reg_req => { in => [ "gp", "gp", "none", "gp", "gp" ], out => [ "in_r4 in_r5" ] },
ins => [ "base", "index", "mem", "left", "right" ],
am => "full,binary",
OrMem => {
irn_flags => "R",
+ state => "exc_pinned",
reg_req => { in => [ "gp", "gp", "none", "gp" ], out => [ "none" ] },
ins => [ "base", "index", "mem", "val" ],
emit => '. or%M %SI3, %AM',
OrMem8Bit => {
irn_flags => "R",
+ state => "exc_pinned",
reg_req => { in => [ "gp", "gp", "none", "eax ebx ecx edx" ], out => [ "none" ] },
ins => [ "base", "index", "mem", "val" ],
emit => '. or%M %SB3, %AM',
Xor => {
irn_flags => "R",
+ state => "exc_pinned",
reg_req => { in => [ "gp", "gp", "none", "gp", "gp" ], out => [ "in_r4 in_r5" ] },
ins => [ "base", "index", "mem", "left", "right" ],
am => "full,binary",
XorMem => {
irn_flags => "R",
+ state => "exc_pinned",
reg_req => { in => [ "gp", "gp", "none", "gp" ], out => [ "none" ] },
ins => [ "base", "index", "mem", "val" ],
emit => '. xor%M %SI3, %AM',
XorMem8Bit => {
irn_flags => "R",
+ state => "exc_pinned",
reg_req => { in => [ "gp", "gp", "none", "eax ebx ecx edx" ], out => [ "none" ] },
ins => [ "base", "index", "mem", "val" ],
emit => '. xor%M %SB3, %AM',
Sub => {
irn_flags => "R",
+ state => "exc_pinned",
reg_req => { in => [ "gp", "gp", "none", "gp", "gp" ], out => [ "in_r4", "none", "flags" ] },
ins => [ "base", "index", "mem", "left", "right" ],
am => "full,binary",
SubMem => {
irn_flags => "R",
+ state => "exc_pinned",
reg_req => { in => [ "gp", "gp", "none", "gp" ], out => [ "none" ] },
ins => [ "base", "index", "mem", "val" ],
emit => '. sub%M %SI3, %AM',
SubMem8Bit => {
irn_flags => "R",
+ state => "exc_pinned",
reg_req => { in => [ "gp", "gp", "none", "eax ebx ecx edx" ], out => [ "none" ] },
ins => [ "base", "index", "mem", "val" ],
emit => '. sub%M %SB3, %AM',
},
Sbb => {
+ state => "exc_pinned",
reg_req => { in => [ "gp", "gp", "none", "gp", "gp", "flags" ], out => [ "in_r4 !in_r5" ] },
ins => [ "base", "index", "mem", "left", "right", "eflags" ],
am => "full,binary",
ShlMem => {
irn_flags => "R",
+ state => "exc_pinned",
reg_req => { in => [ "gp", "gp", "none", "ecx" ], out => [ "none" ] },
ins => [ "base", "index", "mem", "count" ],
emit => '. shl%M %SB3, %AM',
ShrMem => {
irn_flags => "R",
+ state => "exc_pinned",
reg_req => { in => [ "gp", "gp", "none", "ecx" ], out => [ "none" ] },
ins => [ "base", "index", "mem", "count" ],
emit => '. shr%M %SB3, %AM',
SarMem => {
irn_flags => "R",
+ state => "exc_pinned",
reg_req => { in => [ "gp", "gp", "none", "ecx" ], out => [ "none" ] },
ins => [ "base", "index", "mem", "count" ],
emit => '. sar%M %SB3, %AM',
RorMem => {
irn_flags => "R",
+ state => "exc_pinned",
reg_req => { in => [ "gp", "gp", "none", "ecx" ], out => [ "none" ] },
ins => [ "base", "index", "mem", "count" ],
emit => '. ror%M %SB3, %AM',
RolMem => {
irn_flags => "R",
+ state => "exc_pinned",
reg_req => { in => [ "gp", "gp", "none", "ecx" ], out => [ "none" ] },
ins => [ "base", "index", "mem", "count" ],
emit => '. rol%M %SB3, %AM',
NegMem => {
irn_flags => "R",
+ state => "exc_pinned",
reg_req => { in => [ "gp", "gp", "none" ], out => [ "none" ] },
ins => [ "base", "index", "mem" ],
emit => '. neg%M %AM',
IncMem => {
irn_flags => "R",
+ state => "exc_pinned",
reg_req => { in => [ "gp", "gp", "none" ], out => [ "none" ] },
ins => [ "base", "index", "mem" ],
emit => '. inc%M %AM',
DecMem => {
irn_flags => "R",
+ state => "exc_pinned",
reg_req => { in => [ "gp", "gp", "none" ], out => [ "none" ] },
ins => [ "base", "index", "mem" ],
emit => '. dec%M %AM',
NotMem => {
irn_flags => "R",
+ state => "exc_pinned",
reg_req => { in => [ "gp", "gp", "none" ], out => [ "none" ] },
ins => [ "base", "index", "mem" ],
emit => '. not%M %AM',
Cmp => {
irn_flags => "R",
+ state => "exc_pinned",
reg_req => { in => [ "gp", "gp", "none", "gp", "gp" ] , out => [ "flags" ] },
ins => [ "base", "index", "mem", "left", "right" ],
outs => [ "eflags" ],
Cmp8Bit => {
irn_flags => "R",
+ state => "exc_pinned",
reg_req => { in => [ "gp", "gp", "none", "eax ebx ecx edx", "eax ebx ecx edx" ] , out => [ "flags" ] },
ins => [ "base", "index", "mem", "left", "right" ],
outs => [ "eflags" ],
Test => {
irn_flags => "R",
+ state => "exc_pinned",
reg_req => { in => [ "gp", "gp", "none", "gp", "gp" ] , out => [ "flags" ] },
ins => [ "base", "index", "mem", "left", "right" ],
outs => [ "eflags" ],
Test8Bit => {
irn_flags => "R",
+ state => "exc_pinned",
reg_req => { in => [ "gp", "gp", "none", "eax ebx ecx edx", "eax ebx ecx edx" ] , out => [ "flags" ] },
ins => [ "base", "index", "mem", "left", "right" ],
outs => [ "eflags" ],
#irn_flags => "R",
# (note: leave the false,true order intact to make it compatible with other
# ia32_binary ops)
+ state => "exc_pinned",
reg_req => { in => [ "gp", "gp", "none", "gp", "gp", "eflags" ], out => [ "in_r4 in_r5" ] },
ins => [ "base", "index", "mem", "val_false", "val_true", "eflags" ],
am => "source,binary",
},
Push => {
+ state => "exc_pinned",
reg_req => { in => [ "gp", "gp", "none", "esp", "gp" ], out => [ "esp", "none" ] },
ins => [ "base", "index", "mem", "val", "stack" ],
emit => '. push%M %unop4',
},
Pop => {
+ state => "exc_pinned",
reg_req => { in => [ "gp", "gp", "none", "esp" ], out => [ "esp", "gp", "none" ] },
emit => '. pop%M %DAM1',
outs => [ "stack:I|S", "res", "M" ],
xAdd => {
irn_flags => "R",
+ state => "exc_pinned",
reg_req => { in => [ "gp", "gp", "none", "xmm", "xmm" ], out => [ "in_r4 in_r5" ] },
ins => [ "base", "index", "mem", "left", "right" ],
am => "source,binary",
xMul => {
irn_flags => "R",
+ state => "exc_pinned",
reg_req => { in => [ "gp", "gp", "none", "xmm", "xmm" ], out => [ "in_r4 in_r5" ] },
ins => [ "base", "index", "mem", "left", "right" ],
am => "source,binary",
xMax => {
irn_flags => "R",
+ state => "exc_pinned",
reg_req => { in => [ "gp", "gp", "none", "xmm", "xmm" ], out => [ "in_r4 in_r5" ] },
ins => [ "base", "index", "mem", "left", "right" ],
am => "source,binary",
xMin => {
irn_flags => "R",
+ state => "exc_pinned",
reg_req => { in => [ "gp", "gp", "none", "xmm", "xmm" ], out => [ "in_r4 in_r5" ] },
ins => [ "base", "index", "mem", "left", "right" ],
am => "source,binary",
xAnd => {
irn_flags => "R",
+ state => "exc_pinned",
reg_req => { in => [ "gp", "gp", "none", "xmm", "xmm" ], out => [ "in_r4 in_r5" ] },
ins => [ "base", "index", "mem", "left", "right" ],
am => "source,binary",
xOr => {
irn_flags => "R",
+ state => "exc_pinned",
reg_req => { in => [ "gp", "gp", "none", "xmm", "xmm" ], out => [ "in_r4 in_r5" ] },
ins => [ "base", "index", "mem", "left", "right" ],
am => "source,binary",
xXor => {
irn_flags => "R",
+ state => "exc_pinned",
reg_req => { in => [ "gp", "gp", "none", "xmm", "xmm" ], out => [ "in_r4 in_r5" ] },
ins => [ "base", "index", "mem", "left", "right" ],
am => "source,binary",
xAndNot => {
irn_flags => "R",
+ state => "exc_pinned",
reg_req => { in => [ "gp", "gp", "none", "xmm", "xmm" ], out => [ "in_r4 !in_r5" ] },
ins => [ "base", "index", "mem", "left", "right" ],
am => "source,binary",
xSub => {
irn_flags => "R",
+ state => "exc_pinned",
reg_req => { in => [ "gp", "gp", "none", "xmm", "xmm" ], out => [ "in_r4" ] },
ins => [ "base", "index", "mem", "left", "right" ],
am => "source,binary",
xDiv => {
irn_flags => "R",
+ state => "exc_pinned",
reg_req => { in => [ "gp", "gp", "none", "xmm", "xmm" ], out => [ "in_r4 !in_r5", "none" ] },
ins => [ "base", "index", "mem", "left", "right" ],
am => "source,binary",
Ucomi => {
irn_flags => "R",
+ state => "exc_pinned",
reg_req => { in => [ "gp", "gp", "none", "xmm", "xmm" ], out => [ "eflags" ] },
ins => [ "base", "index", "mem", "left", "right" ],
outs => [ "flags" ],
CvtSI2SS => {
op_flags => "L|F",
+ state => "exc_pinned",
reg_req => { in => [ "gp", "gp", "none", "gp" ], out => [ "xmm" ] },
ins => [ "base", "index", "mem", "val" ],
am => "source,unary",
CvtSI2SD => {
op_flags => "L|F",
+ state => "exc_pinned",
reg_req => { in => [ "gp", "gp", "none", "gp" ], out => [ "xmm" ] },
ins => [ "base", "index", "mem", "val" ],
am => "source,unary",
},
Conv_I2FP => {
- reg_req => { in => [ "gp", "gp", "none", "gp" ], out => [ "xmm", "none" ] },
- ins => [ "base", "index", "mem", "val" ],
- am => "source,unary",
- latency => 10,
- units => [ "SSE" ],
- mode => "mode_E",
+ state => "exc_pinned",
+ reg_req => { in => [ "gp", "gp", "none", "gp" ], out => [ "xmm", "none" ] },
+ ins => [ "base", "index", "mem", "val" ],
+ am => "source,unary",
+ latency => 10,
+ units => [ "SSE" ],
+ mode => "mode_E",
},
Conv_FP2I => {
- reg_req => { in => [ "gp", "gp", "none", "xmm" ], out => [ "gp", "none" ] },
- ins => [ "base", "index", "mem", "val" ],
- am => "source,unary",
- latency => 10,
- units => [ "SSE" ],
- mode => $mode_gp,
+ state => "exc_pinned",
+ reg_req => { in => [ "gp", "gp", "none", "xmm" ], out => [ "gp", "none" ] },
+ ins => [ "base", "index", "mem", "val" ],
+ am => "source,unary",
+ latency => 10,
+ units => [ "SSE" ],
+ mode => $mode_gp,
},
Conv_FP2FP => {
- reg_req => { in => [ "gp", "gp", "none", "xmm" ], out => [ "xmm", "none" ] },
- ins => [ "base", "index", "mem", "val" ],
- am => "source,unary",
- latency => 8,
- units => [ "SSE" ],
- mode => "mode_E",
+ state => "exc_pinned",
+ reg_req => { in => [ "gp", "gp", "none", "xmm" ], out => [ "xmm", "none" ] },
+ ins => [ "base", "index", "mem", "val" ],
+ am => "source,unary",
+ latency => 8,
+ units => [ "SSE" ],
+ mode => "mode_E",
},
#----------------------------------------------------------#
vfadd => {
# irn_flags => "R",
+ state => "exc_pinned",
reg_req => { in => [ "gp", "gp", "none", "vfp", "vfp", "fpcw" ], out => [ "vfp" ] },
ins => [ "base", "index", "mem", "left", "right", "fpcw" ],
am => "source,binary",
vfmul => {
# irn_flags => "R",
+ state => "exc_pinned",
reg_req => { in => [ "gp", "gp", "none", "vfp", "vfp", "fpcw" ], out => [ "vfp" ] },
ins => [ "base", "index", "mem", "left", "right", "fpcw" ],
am => "source,binary",
vfsub => {
# irn_flags => "R",
+ state => "exc_pinned",
reg_req => { in => [ "gp", "gp", "none", "vfp", "vfp", "fpcw" ], out => [ "vfp" ] },
ins => [ "base", "index", "mem", "left", "right", "fpcw" ],
am => "source,binary",
},
vfdiv => {
+ state => "exc_pinned",
reg_req => { in => [ "gp", "gp", "none", "vfp", "vfp", "fpcw" ], out => [ "vfp", "none" ] },
ins => [ "base", "index", "mem", "left", "right", "fpcw" ],
am => "source,binary",
fadd => {
op_flags => "R",
+ state => "exc_pinned",
rd_constructor => "NONE",
reg_req => { },
emit => '. fadd%XM %x87_binop',
faddp => {
op_flags => "R",
+ state => "exc_pinned",
rd_constructor => "NONE",
reg_req => { },
emit => '. faddp%XM %x87_binop',
fmul => {
op_flags => "R",
+ state => "exc_pinned",
rd_constructor => "NONE",
reg_req => { },
emit => '. fmul%XM %x87_binop',
fmulp => {
op_flags => "R",
+ state => "exc_pinned",
rd_constructor => "NONE",
reg_req => { },
emit => '. fmulp%XM %x87_binop',,
fsub => {
op_flags => "R",
+ state => "exc_pinned",
rd_constructor => "NONE",
reg_req => { },
emit => '. fsub%XM %x87_binop',
fsubp => {
op_flags => "R",
+ state => "exc_pinned",
rd_constructor => "NONE",
reg_req => { },
# see note about gas bugs
fsubr => {
op_flags => "R",
+ state => "exc_pinned",
rd_constructor => "NONE",
irn_flags => "R",
reg_req => { },
fsubrp => {
op_flags => "R",
+ state => "exc_pinned",
rd_constructor => "NONE",
irn_flags => "R",
reg_req => { },
fdiv => {
op_flags => "R",
+ state => "exc_pinned",
rd_constructor => "NONE",
reg_req => { },
emit => '. fdiv%XM %x87_binop',
fdivp => {
op_flags => "R",
+ state => "exc_pinned",
rd_constructor => "NONE",
reg_req => { },
# see note about gas bugs
fdivr => {
op_flags => "R",
+ state => "exc_pinned",
rd_constructor => "NONE",
reg_req => { },
emit => '. fdivr%XM %x87_binop',
fdivrp => {
op_flags => "R",
+ state => "exc_pinned",
rd_constructor => "NONE",
reg_req => { },
# see note about gas bugs
fild => {
op_flags => "R",
+ state => "exc_pinned",
rd_constructor => "NONE",
reg_req => { },
emit => '. fild%M %AM',