Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in
Toggle navigation
Menu
Open sidebar
Zwinkau
libfirm
Commits
e1552352
Commit
e1552352
authored
Jul 25, 2015
by
Christoph Mallon
Browse files
bescripts: Merge the attributes 'custominit' and 'init_attr' into the new attribute 'init'.
parent
40cbede7
Changes
5
Hide whitespace changes
Inline
Side-by-side
ir/be/TEMPLATE/TEMPLATE_spec.pl
View file @
e1552352
...
...
@@ -20,7 +20,7 @@ $mode_fp = "mode_F"; # mode used by floatingpoint registers
# mode => "mode_Iu", # optional, predefines the mode
# emit => "emit code with templates", # optional for virtual nodes
# attr => "additional attribute arguments for constructor", # optional
# init
_attr
=> "emit attribute initialization template", # optional
# init
=> "emit attribute initialization template", # optional
# hash_func => "name of the hash function for this operation", # optional, get the default hash function else
# attr_type => "name of the attribute struct", # optional
# },
...
...
@@ -155,10 +155,10 @@ Not => {
},
Const
=>
{
template
=>
$constop
,
attr
=>
"
ir_entity *entity, ir_tarval *value
",
custom
init
=>
"
set_TEMPLATE_value(res, entity, value);
",
emit
=>
'
%D0 = const %I
',
template
=>
$constop
,
attr
=>
"
ir_entity *entity, ir_tarval *value
",
init
=>
"
set_TEMPLATE_value(res, entity, value);
",
emit
=>
'
%D0 = const %I
',
},
# Control Flow
...
...
ir/be/arm/arm_spec.pl
View file @
e1552352
...
...
@@ -78,26 +78,26 @@ my $unop_shifter_operand = {
out_reqs
=>
[
"
gp
"
],
constructors
=>
{
imm
=>
{
attr
=>
"
unsigned char immediate_value, unsigned char immediate_rot
",
custom
init
=>
"
init_arm_shifter_operand(res, 0, immediate_value, ARM_SHF_IMM, immediate_rot);
",
in_reqs
=>
[]
,
attr
=>
"
unsigned char immediate_value, unsigned char immediate_rot
",
init
=>
"
init_arm_shifter_operand(res, 0, immediate_value, ARM_SHF_IMM, immediate_rot);
",
in_reqs
=>
[]
,
},
reg
=>
{
custom
init
=>
"
init_arm_shifter_operand(res, 0, 0, ARM_SHF_REG, 0);
",
in_reqs
=>
[
"
gp
"
],
ins
=>
[
"
Rm
"
],
init
=>
"
init_arm_shifter_operand(res, 0, 0, ARM_SHF_REG, 0);
",
in_reqs
=>
[
"
gp
"
],
ins
=>
[
"
Rm
"
],
},
reg_shift_reg
=>
{
attr
=>
"
arm_shift_modifier_t shift_modifier
",
custom
init
=>
"
init_arm_shifter_operand(res, 0, 0, shift_modifier, 0);
",
in_reqs
=>
[
"
gp
",
"
gp
"
],
ins
=>
[
"
Rm
",
"
Rs
"
],
attr
=>
"
arm_shift_modifier_t shift_modifier
",
init
=>
"
init_arm_shifter_operand(res, 0, 0, shift_modifier, 0);
",
in_reqs
=>
[
"
gp
",
"
gp
"
],
ins
=>
[
"
Rm
",
"
Rs
"
],
},
reg_shift_imm
=>
{
attr
=>
"
arm_shift_modifier_t shift_modifier, unsigned shift_immediate
",
custom
init
=>
"
init_arm_shifter_operand(res, 0, 0, shift_modifier, shift_immediate);
",
in_reqs
=>
[
"
gp
"
],
ins
=>
[
"
Rm
"
],
attr
=>
"
arm_shift_modifier_t shift_modifier, unsigned shift_immediate
",
init
=>
"
init_arm_shifter_operand(res, 0, 0, shift_modifier, shift_immediate);
",
in_reqs
=>
[
"
gp
"
],
ins
=>
[
"
Rm
"
],
},
},
},
...
...
@@ -109,27 +109,27 @@ my $binop_shifter_operand = {
out_reqs
=>
[
"
gp
"
],
constructors
=>
{
imm
=>
{
attr
=>
"
unsigned char immediate_value, unsigned char immediate_rot
",
custom
init
=>
"
init_arm_shifter_operand(res, 1, immediate_value, ARM_SHF_IMM, immediate_rot);
",
in_reqs
=>
[
"
gp
"
],
ins
=>
[
"
left
"
],
attr
=>
"
unsigned char immediate_value, unsigned char immediate_rot
",
init
=>
"
init_arm_shifter_operand(res, 1, immediate_value, ARM_SHF_IMM, immediate_rot);
",
in_reqs
=>
[
"
gp
"
],
ins
=>
[
"
left
"
],
},
reg
=>
{
custom
init
=>
"
init_arm_shifter_operand(res, 1, 0, ARM_SHF_REG, 0);
",
in_reqs
=>
[
"
gp
",
"
gp
"
],
ins
=>
[
"
left
",
"
right
"
],
init
=>
"
init_arm_shifter_operand(res, 1, 0, ARM_SHF_REG, 0);
",
in_reqs
=>
[
"
gp
",
"
gp
"
],
ins
=>
[
"
left
",
"
right
"
],
},
reg_shift_reg
=>
{
attr
=>
"
arm_shift_modifier_t shift_modifier
",
custom
init
=>
"
init_arm_shifter_operand(res, 1, 0, shift_modifier, 0);
",
in_reqs
=>
[
"
gp
",
"
gp
",
"
gp
"
],
ins
=>
[
"
left
",
"
right
",
"
shift
"
],
attr
=>
"
arm_shift_modifier_t shift_modifier
",
init
=>
"
init_arm_shifter_operand(res, 1, 0, shift_modifier, 0);
",
in_reqs
=>
[
"
gp
",
"
gp
",
"
gp
"
],
ins
=>
[
"
left
",
"
right
",
"
shift
"
],
},
reg_shift_imm
=>
{
attr
=>
"
arm_shift_modifier_t shift_modifier, unsigned shift_immediate
",
custom
init
=>
"
init_arm_shifter_operand(res, 1, 0, shift_modifier, shift_immediate);
",
in_reqs
=>
[
"
gp
",
"
gp
"
],
ins
=>
[
"
left
",
"
right
"
],
attr
=>
"
arm_shift_modifier_t shift_modifier, unsigned shift_immediate
",
init
=>
"
init_arm_shifter_operand(res, 1, 0, shift_modifier, shift_immediate);
",
in_reqs
=>
[
"
gp
",
"
gp
"
],
ins
=>
[
"
left
",
"
right
"
],
},
},
};
...
...
@@ -141,27 +141,27 @@ my $binop_shifter_operand_setflags = {
outs
=>
[
"
res
",
"
flags
"
],
constructors
=>
{
imm
=>
{
attr
=>
"
unsigned char immediate_value, unsigned char immediate_rot
",
custom
init
=>
"
init_arm_shifter_operand(res, 1, immediate_value, ARM_SHF_IMM, immediate_rot);
",
in_reqs
=>
[
"
gp
"
],
ins
=>
[
"
left
"
],
attr
=>
"
unsigned char immediate_value, unsigned char immediate_rot
",
init
=>
"
init_arm_shifter_operand(res, 1, immediate_value, ARM_SHF_IMM, immediate_rot);
",
in_reqs
=>
[
"
gp
"
],
ins
=>
[
"
left
"
],
},
reg
=>
{
custom
init
=>
"
init_arm_shifter_operand(res, 1, 0, ARM_SHF_REG, 0);
",
in_reqs
=>
[
"
gp
",
"
gp
"
],
ins
=>
[
"
left
",
"
right
"
],
init
=>
"
init_arm_shifter_operand(res, 1, 0, ARM_SHF_REG, 0);
",
in_reqs
=>
[
"
gp
",
"
gp
"
],
ins
=>
[
"
left
",
"
right
"
],
},
reg_shift_reg
=>
{
attr
=>
"
arm_shift_modifier_t shift_modifier
",
custom
init
=>
"
init_arm_shifter_operand(res, 1, 0, shift_modifier, 0);
",
in_reqs
=>
[
"
gp
",
"
gp
",
"
gp
"
],
ins
=>
[
"
left
",
"
right
",
"
shift
"
],
attr
=>
"
arm_shift_modifier_t shift_modifier
",
init
=>
"
init_arm_shifter_operand(res, 1, 0, shift_modifier, 0);
",
in_reqs
=>
[
"
gp
",
"
gp
",
"
gp
"
],
ins
=>
[
"
left
",
"
right
",
"
shift
"
],
},
reg_shift_imm
=>
{
attr
=>
"
arm_shift_modifier_t shift_modifier, unsigned shift_immediate
",
custom
init
=>
"
init_arm_shifter_operand(res, 1, 0, shift_modifier, shift_immediate);
",
in_reqs
=>
[
"
gp
",
"
gp
"
],
ins
=>
[
"
left
",
"
right
"
],
attr
=>
"
arm_shift_modifier_t shift_modifier, unsigned shift_immediate
",
init
=>
"
init_arm_shifter_operand(res, 1, 0, shift_modifier, shift_immediate);
",
in_reqs
=>
[
"
gp
",
"
gp
"
],
ins
=>
[
"
left
",
"
right
"
],
},
},
};
...
...
@@ -173,27 +173,27 @@ my $binop_shifter_operand_flags = {
out_reqs
=>
[
"
gp
"
],
constructors
=>
{
imm
=>
{
attr
=>
"
unsigned char immediate_value, unsigned char immediate_rot
",
custom
init
=>
"
init_arm_shifter_operand(res, 1, immediate_value, ARM_SHF_IMM, immediate_rot);
",
in_reqs
=>
[
"
gp
",
"
flags
"
],
ins
=>
[
"
left
",
"
flags
"
],
attr
=>
"
unsigned char immediate_value, unsigned char immediate_rot
",
init
=>
"
init_arm_shifter_operand(res, 1, immediate_value, ARM_SHF_IMM, immediate_rot);
",
in_reqs
=>
[
"
gp
",
"
flags
"
],
ins
=>
[
"
left
",
"
flags
"
],
},
reg
=>
{
custom
init
=>
"
init_arm_shifter_operand(res, 1, 0, ARM_SHF_REG, 0);
",
in_reqs
=>
[
"
gp
",
"
gp
",
"
flags
"
],
ins
=>
[
"
left
",
"
right
",
"
flags
"
],
init
=>
"
init_arm_shifter_operand(res, 1, 0, ARM_SHF_REG, 0);
",
in_reqs
=>
[
"
gp
",
"
gp
",
"
flags
"
],
ins
=>
[
"
left
",
"
right
",
"
flags
"
],
},
reg_shift_reg
=>
{
attr
=>
"
arm_shift_modifier_t shift_modifier
",
custom
init
=>
"
init_arm_shifter_operand(res, 1, 0, shift_modifier, 0);
",
in_reqs
=>
[
"
gp
",
"
gp
",
"
gp
",
"
flags
"
],
ins
=>
[
"
left
",
"
right
",
"
shift
",
"
flags
"
],
attr
=>
"
arm_shift_modifier_t shift_modifier
",
init
=>
"
init_arm_shifter_operand(res, 1, 0, shift_modifier, 0);
",
in_reqs
=>
[
"
gp
",
"
gp
",
"
gp
",
"
flags
"
],
ins
=>
[
"
left
",
"
right
",
"
shift
",
"
flags
"
],
},
reg_shift_imm
=>
{
attr
=>
"
arm_shift_modifier_t shift_modifier, unsigned shift_immediate
",
custom
init
=>
"
init_arm_shifter_operand(res, 1, 0, shift_modifier, shift_immediate);
",
in_reqs
=>
[
"
gp
",
"
gp
",
"
flags
"
],
ins
=>
[
"
left
",
"
right
",
"
flags
"
],
attr
=>
"
arm_shift_modifier_t shift_modifier, unsigned shift_immediate
",
init
=>
"
init_arm_shifter_operand(res, 1, 0, shift_modifier, shift_immediate);
",
in_reqs
=>
[
"
gp
",
"
gp
",
"
flags
"
],
ins
=>
[
"
left
",
"
right
",
"
flags
"
],
},
},
};
...
...
@@ -206,36 +206,36 @@ my $cmp_shifter_operand = {
out_reqs
=>
[
"
flags
"
],
constructors
=>
{
imm
=>
{
attr
=>
"
unsigned char immediate_value, unsigned char immediate_rot, bool ins_permuted, bool is_unsigned
",
custom
init
=>
attr
=>
"
unsigned char immediate_value, unsigned char immediate_rot, bool ins_permuted, bool is_unsigned
",
init
=>
"
init_arm_shifter_operand(res, 1, immediate_value, ARM_SHF_IMM, immediate_rot);
\n
"
.
"
\t
init_arm_cmp_attr(res, ins_permuted, is_unsigned);
",
in_reqs
=>
[
"
gp
"
],
ins
=>
[
"
left
"
],
in_reqs
=>
[
"
gp
"
],
ins
=>
[
"
left
"
],
},
reg
=>
{
attr
=>
"
bool ins_permuted, bool is_unsigned
",
custom
init
=>
attr
=>
"
bool ins_permuted, bool is_unsigned
",
init
=>
"
init_arm_shifter_operand(res, 1, 0, ARM_SHF_REG, 0);
\n
"
.
"
\t
init_arm_cmp_attr(res, ins_permuted, is_unsigned);
",
in_reqs
=>
[
"
gp
",
"
gp
"
],
ins
=>
[
"
left
",
"
right
"
],
in_reqs
=>
[
"
gp
",
"
gp
"
],
ins
=>
[
"
left
",
"
right
"
],
},
reg_shift_reg
=>
{
attr
=>
"
arm_shift_modifier_t shift_modifier, bool ins_permuted, bool is_unsigned
",
custom
init
=>
attr
=>
"
arm_shift_modifier_t shift_modifier, bool ins_permuted, bool is_unsigned
",
init
=>
"
init_arm_shifter_operand(res, 1, 0, shift_modifier, 0);
\n
"
.
"
\t
init_arm_cmp_attr(res, ins_permuted, is_unsigned);
",
in_reqs
=>
[
"
gp
",
"
gp
",
"
gp
"
],
ins
=>
[
"
left
",
"
right
",
"
shift
"
],
in_reqs
=>
[
"
gp
",
"
gp
",
"
gp
"
],
ins
=>
[
"
left
",
"
right
",
"
shift
"
],
},
reg_shift_imm
=>
{
attr
=>
"
arm_shift_modifier_t shift_modifier, unsigned shift_immediate, bool ins_permuted, bool is_unsigned
",
custom
init
=>
attr
=>
"
arm_shift_modifier_t shift_modifier, unsigned shift_immediate, bool ins_permuted, bool is_unsigned
",
init
=>
"
init_arm_shifter_operand(res, 1, 0, shift_modifier, shift_immediate);
\n
"
.
"
\t
init_arm_cmp_attr(res, ins_permuted, is_unsigned);
",
in_reqs
=>
[
"
gp
",
"
gp
"
],
ins
=>
[
"
left
",
"
right
"
],
in_reqs
=>
[
"
gp
",
"
gp
"
],
ins
=>
[
"
left
",
"
right
"
],
},
},
};
...
...
@@ -332,13 +332,13 @@ Or => {
OrPl
=>
{
#irn_flags => [ "rematerializable" ],
emit
=>
'
orrpl %D0, %S2, %O
',
mode
=>
$mode_gp
,
attr_type
=>
"
arm_shifter_operand_t
",
in_reqs
=>
[
"
gp
",
"
flags
",
"
gp
",
"
gp
"
],
out_reqs
=>
[
"
in_r3
"
],
ins
=>
[
"
falseval
",
"
flags
",
"
left
",
"
right
"
],
custominit
=>
"
init_arm_shifter_operand(res, 3, 0, ARM_SHF_REG, 0);
",
emit
=>
'
orrpl %D0, %S2, %O
',
mode
=>
$mode_gp
,
attr_type
=>
"
arm_shifter_operand_t
",
in_reqs
=>
[
"
gp
",
"
flags
",
"
gp
",
"
gp
"
],
out_reqs
=>
[
"
in_r3
"
],
ins
=>
[
"
falseval
",
"
flags
",
"
left
",
"
right
"
],
init
=>
"
init_arm_shifter_operand(res, 3, 0, ARM_SHF_REG, 0);
",
},
Eor
=>
{
...
...
@@ -413,15 +413,15 @@ Clz => {
# mov lr, pc\n mov pc, XXX -- This combination is used for calls to function
# pointers
LinkMovPC
=>
{
state
=>
"
exc_pinned
",
irn_flags
=>
[
"
modify_flags
"
],
in_reqs
=>
"
...
",
out_reqs
=>
"
...
",
attr_type
=>
"
arm_shifter_operand_t
",
attr
=>
"
unsigned shiftop_input, arm_shift_modifier_t shift_modifier, unsigned char immediate_value, unsigned char immediate_rot
",
custominit
=>
"
init_arm_shifter_operand(res, shiftop_input, immediate_value, shift_modifier, immediate_rot);
\n
",
emit
=>
"
mov lr, pc
\n
"
.
"
mov pc, %O
",
state
=>
"
exc_pinned
",
irn_flags
=>
[
"
modify_flags
"
],
in_reqs
=>
"
...
",
out_reqs
=>
"
...
",
attr_type
=>
"
arm_shifter_operand_t
",
attr
=>
"
unsigned shiftop_input, arm_shift_modifier_t shift_modifier, unsigned char immediate_value, unsigned char immediate_rot
",
init
=>
"
init_arm_shifter_operand(res, shiftop_input, immediate_value, shift_modifier, immediate_rot);
\n
",
emit
=>
"
mov lr, pc
\n
"
.
"
mov pc, %O
",
},
# mov lr, pc\n ldr pc, XXX -- This combination is used for calls to function
...
...
@@ -492,7 +492,7 @@ B => {
ins
=>
[
"
flags
"
],
attr
=>
"
ir_relation relation
",
attr_type
=>
"
arm_CondJmp_attr_t
",
init
_attr
=>
"
\t
set_arm_CondJmp_relation(res, relation);
",
init
=>
"
\t
set_arm_CondJmp_relation(res, relation);
",
},
Jmp
=>
{
...
...
@@ -508,7 +508,7 @@ SwitchJmp => {
state
=>
"
pinned
",
mode
=>
"
mode_T
",
attr
=>
"
const ir_switch_table *table
",
init
_attr
=>
"
init_arm_SwitchJmp_attributes(res, table);
",
init
=>
"
init_arm_SwitchJmp_attributes(res, table);
",
in_reqs
=>
[
"
gp
"
],
out_reqs
=>
"
...
",
attr_type
=>
"
arm_SwitchJmp_attr_t
",
...
...
@@ -590,7 +590,7 @@ Cmfe => {
mode
=>
$mode_flags
,
attr_type
=>
"
arm_cmp_attr_t
",
attr
=>
"
bool ins_permuted
",
init
_attr
=>
"
init_arm_cmp_attr(res, ins_permuted, false);
",
init
=>
"
init_arm_cmp_attr(res, ins_permuted, false);
",
in_reqs
=>
[
"
fpa
",
"
fpa
"
],
out_reqs
=>
[
"
flags
"
],
emit
=>
'
cmfe %S0, %S1
',
...
...
@@ -626,7 +626,7 @@ fConst => {
op_flags
=>
[
"
constlike
"
],
irn_flags
=>
[
"
rematerializable
"
],
attr
=>
"
ir_tarval *tv
",
init
_attr
=>
"
attr->tv = tv;
",
init
=>
"
attr->tv = tv;
",
mode
=>
$mode_fp
,
out_reqs
=>
[
"
fpa
"
],
attr_type
=>
"
arm_fConst_attr_t
",
...
...
ir/be/ia32/ia32_spec.pl
View file @
e1552352
...
...
@@ -146,7 +146,7 @@ my $binop_flags = {
outs
=>
[
"
eflags
",
"
unused
",
"
M
"
],
am
=>
"
source,binary
",
attr
=>
"
bool ins_permuted
",
init
_attr
=>
"
attr->ins_permuted = ins_permuted;
",
init
=>
"
attr->ins_permuted = ins_permuted;
",
mode
=>
$mode_flags
,
};
...
...
@@ -292,7 +292,7 @@ my $funop = {
in_reqs
=>
[
"
fp
"
],
out_reqs
=>
[
"
fp
"
],
ins
=>
[
"
value
"
],
init
_attr
=>
"
attr->ls_mode = ia32_mode_E;
",
init
=>
"
attr->ls_mode = ia32_mode_E;
",
mode
=>
$mode_fp87
,
};
...
...
@@ -301,7 +301,7 @@ my $fconstop = {
irn_flags
=>
[
"
rematerializable
"
],
out_reqs
=>
[
"
fp
"
],
outs
=>
[
"
res
"
],
init
_attr
=>
"
attr->ls_mode = ia32_mode_E;
",
init
=>
"
attr->ls_mode = ia32_mode_E;
",
fixed
=>
$x87sim
,
mode
=>
$mode_fp87
,
};
...
...
@@ -778,11 +778,11 @@ Setcc => {
attr
=>
"
x86_condition_code_t condition_code
",
# The way we handle Setcc with float nodes (potentially) destroys the flags
# (when we emit the setX; setp; orb and the setX;setnp;andb sequences)
init
_attr
=>
"
set_ia32_ls_mode(res, mode_Bu);
\n
"
.
"
\t
if (condition_code & x86_cc_additional_float_cases) {
\n
"
.
"
\t\t
arch_add_irn_flags(res, arch_irn_flag_modify_flags);
\n
"
.
"
\t\t
/* attr->latency = 3; */
\n
"
.
"
\t
}
\n
",
init
=>
"
set_ia32_ls_mode(res, mode_Bu);
\n
"
.
"
\t
if (condition_code & x86_cc_additional_float_cases) {
\n
"
.
"
\t\t
arch_add_irn_flags(res, arch_irn_flag_modify_flags);
\n
"
.
"
\t\t
/* attr->latency = 3; */
\n
"
.
"
\t
}
\n
",
latency
=>
1
,
mode
=>
$mode_gp
,
},
...
...
@@ -795,7 +795,7 @@ SetccMem => {
ins
=>
[
"
base
",
"
index
",
"
mem
","
eflags
"
],
attr_type
=>
"
ia32_condcode_attr_t
",
attr
=>
"
x86_condition_code_t condition_code
",
init
_attr
=>
"
set_ia32_ls_mode(res, mode_Bu);
\n
",
init
=>
"
set_ia32_ls_mode(res, mode_Bu);
\n
",
emit
=>
"
set%P3 %AM
",
latency
=>
1
,
mode
=>
"
mode_M
",
...
...
@@ -948,13 +948,13 @@ FnstCWNOP => {
Cltd
=>
{
# we should not rematerialize this node. It has very strict constraints.
in_reqs
=>
[
"
eax
"
],
out_reqs
=>
[
"
edx
"
],
ins
=>
[
"
val
"
],
emit
=>
"
cltd
",
latency
=>
1
,
mode
=>
$mode_gp
,
init
_attr
=>
"
arch_set_additional_pressure(res, &ia32_reg_classes[CLASS_ia32_gp], 1);
",
in_reqs
=>
[
"
eax
"
],
out_reqs
=>
[
"
edx
"
],
ins
=>
[
"
val
"
],
emit
=>
"
cltd
",
latency
=>
1
,
mode
=>
$mode_gp
,
init
=>
"
arch_set_additional_pressure(res, &ia32_reg_classes[CLASS_ia32_gp], 1);
",
},
# Load / Store
...
...
@@ -1001,16 +1001,16 @@ Lea => {
},
Push
=>
{
state
=>
"
exc_pinned
",
in_reqs
=>
[
"
gp
",
"
gp
",
"
mem
",
"
gp
",
"
esp
"
],
out_reqs
=>
[
"
mem
",
"
esp:I
"
],
ins
=>
[
"
base
",
"
index
",
"
mem
",
"
val
",
"
stack
"
],
emit
=>
"
push%M %AS3
",
outs
=>
[
"
M
",
"
stack
"
],
am
=>
"
source,unary
",
latency
=>
2
,
attr
=>
"
ir_mode *store_mode
",
init
_attr
=>
"
attr->ls_mode = store_mode;
",
state
=>
"
exc_pinned
",
in_reqs
=>
[
"
gp
",
"
gp
",
"
mem
",
"
gp
",
"
esp
"
],
out_reqs
=>
[
"
mem
",
"
esp:I
"
],
ins
=>
[
"
base
",
"
index
",
"
mem
",
"
val
",
"
stack
"
],
emit
=>
"
push%M %AS3
",
outs
=>
[
"
M
",
"
stack
"
],
am
=>
"
source,unary
",
latency
=>
2
,
attr
=>
"
ir_mode *store_mode
",
init
=>
"
attr->ls_mode = store_mode;
",
},
PushEax
=>
{
...
...
@@ -1025,17 +1025,17 @@ PushEax => {
},
Pop
=>
{
state
=>
"
exc_pinned
",
state
=>
"
exc_pinned
",
constructors
=>
{
""
=>
{
out_reqs
=>
[
"
gp
",
"
none
",
"
mem
",
"
esp:I
"
]
},
ebp
=>
{
out_reqs
=>
[
"
ebp:I
",
"
none
",
"
mem
",
"
esp:I
"
]
}
},
in_reqs
=>
[
"
mem
",
"
esp
"
],
ins
=>
[
"
mem
",
"
stack
"
],
outs
=>
[
"
res
",
"
unused
",
"
M
",
"
stack
"
],
emit
=>
"
pop%M %D0
",
latency
=>
3
,
# Pop is more expensive than Push on Athlon
init
_attr
=>
"
attr->ls_mode = ia32_mode_gp;
",
in_reqs
=>
[
"
mem
",
"
esp
"
],
ins
=>
[
"
mem
",
"
stack
"
],
outs
=>
[
"
res
",
"
unused
",
"
M
",
"
stack
"
],
emit
=>
"
pop%M %D0
",
latency
=>
3
,
# Pop is more expensive than Push on Athlon
init
=>
"
attr->ls_mode = ia32_mode_gp;
",
},
CopyEbpEsp
=>
{
...
...
@@ -1424,23 +1424,23 @@ Ucomi => {
outs
=>
[
"
flags
"
],
am
=>
"
source,binary
",
attr
=>
"
bool ins_permuted
",
init
_attr
=>
"
attr->ins_permuted = ins_permuted;
",
init
=>
"
attr->ins_permuted = ins_permuted;
",
emit
=>
"
ucomis%FX %B
",
latency
=>
3
,
mode
=>
$mode_flags
,
},
xLoad
=>
{
op_flags
=>
[
"
uses_memory
",
"
fragile
"
],
state
=>
"
exc_pinned
",
in_reqs
=>
[
"
gp
",
"
gp
",
"
mem
"
],
out_reqs
=>
[
"
xmm
",
"
none
",
"
mem
",
"
exec
",
"
exec
"
],
ins
=>
[
"
base
",
"
index
",
"
mem
"
],
outs
=>
[
"
res
",
"
unused
",
"
M
",
"
X_regular
",
"
X_except
"
],
emit
=>
"
movs%FX %AM, %D0
",
attr
=>
"
ir_mode *load_mode
",
init
_attr
=>
"
attr->ls_mode = load_mode;
",
latency
=>
0
,
op_flags
=>
[
"
uses_memory
",
"
fragile
"
],
state
=>
"
exc_pinned
",
in_reqs
=>
[
"
gp
",
"
gp
",
"
mem
"
],
out_reqs
=>
[
"
xmm
",
"
none
",
"
mem
",
"
exec
",
"
exec
"
],
ins
=>
[
"
base
",
"
index
",
"
mem
"
],
outs
=>
[
"
res
",
"
unused
",
"
M
",
"
X_regular
",
"
X_except
"
],
emit
=>
"
movs%FX %AM, %D0
",
attr
=>
"
ir_mode *load_mode
",
init
=>
"
attr->ls_mode = load_mode;
",
latency
=>
0
,
},
xStore
=>
{
...
...
@@ -1513,57 +1513,57 @@ Cwtl => {
},
Conv_I2I
=>
{
op_flags
=>
[
"
uses_memory
",
"
fragile
"
],
state
=>
"
exc_pinned
",
op_flags
=>
[
"
uses_memory
",
"
fragile
"
],
state
=>
"
exc_pinned
",
constructors
=>
{
""
=>
{
in_reqs
=>
[
"
gp
",
"
gp
",
"
mem
",
"
gp
"
]
},
"
8bit
"
=>
{
in_reqs
=>
[
"
gp
",
"
gp
",
"
mem
",
"
eax ebx ecx edx
"
]
}
},
out_reqs
=>
[
"
gp
",
"
none
",
"
mem
",
"
exec
",
"
exec
"
],
ins
=>
[
"
base
",
"
index
",
"
mem
",
"
val
"
],
outs
=>
[
"
res
",
"
unused
",
"
M
",
"
X_regular
",
"
X_except
"
],
emit
=>
"
mov%#Ml %#AS3, %D0
",
am
=>
"
source,unary
",
latency
=>
1
,
attr
=>
"
ir_mode *smaller_mode
",
init
_attr
=>
"
attr->ls_mode = smaller_mode;
",
mode
=>
$mode_gp
,
out_reqs
=>
[
"
gp
",
"
none
",
"
mem
",
"
exec
",
"
exec
"
],
ins
=>
[
"
base
",
"
index
",
"
mem
",
"
val
"
],
outs
=>
[
"
res
",
"
unused
",
"
M
",
"
X_regular
",
"
X_except
"
],
emit
=>
"
mov%#Ml %#AS3, %D0
",
am
=>
"
source,unary
",
latency
=>
1
,
attr
=>
"
ir_mode *smaller_mode
",
init
=>
"
attr->ls_mode = smaller_mode;
",
mode
=>
$mode_gp
,
},
Conv_I2FP
=>
{
state
=>
"
exc_pinned
",
in_reqs
=>
[
"
gp
",
"
gp
",
"
mem
",
"
gp
"
],
out_reqs
=>
[
"
xmm
",
"
mem
"
],
ins
=>
[
"
base
",
"
index
",
"
mem
",
"
val
"
],
am
=>
"
source,unary
",
latency
=>
10
,
attr
=>
"
ir_mode *tgt_mode
",
init
_attr
=>
"
attr->ls_mode = tgt_mode;
",
mode
=>
$mode_xmm
,
state
=>
"
exc_pinned
",
in_reqs
=>
[
"
gp
",
"
gp
",
"
mem
",
"
gp
"
],
out_reqs
=>
[
"
xmm
",
"
mem
"
],
ins
=>
[
"
base
",
"
index
",
"
mem
",
"
val
"
],
am
=>
"
source,unary
",
latency
=>
10
,
attr
=>
"
ir_mode *tgt_mode
",
init
=>
"
attr->ls_mode = tgt_mode;
",
mode
=>
$mode_xmm
,
},
Conv_FP2I
=>
{
state
=>
"
exc_pinned
",
in_reqs
=>
[
"
gp
",
"
gp
",
"
mem
",
"
xmm
"
],
out_reqs
=>
[
"
gp
",
"
mem
"
],
ins
=>
[
"
base
",
"
index
",
"
mem
",
"
val
"
],
am
=>
"
source,unary
",
latency
=>
10
,
attr
=>
"
ir_mode *src_mode
",
init
_attr
=>
"
attr->ls_mode = src_mode;
",
mode
=>
$mode_gp
,
state
=>
"
exc_pinned
",
in_reqs
=>
[
"
gp
",
"
gp
",
"
mem
",
"
xmm
"
],
out_reqs
=>
[
"
gp
",
"
mem
"
],
ins
=>
[
"
base
",
"
index
",
"
mem
",
"
val
"
],
am
=>
"
source,unary
",
latency
=>
10
,
attr
=>
"
ir_mode *src_mode
",
init
=>
"
attr->ls_mode = src_mode;
",
mode
=>
$mode_gp
,
},
Conv_FP2FP
=>
{
state
=>
"
exc_pinned
",
in_reqs
=>
[
"
gp
",
"
gp
",
"
mem
",
"
xmm
"
],
out_reqs
=>
[
"
xmm
",
"
mem
"
],
ins
=>
[
"
base
",
"
index
",
"
mem
",
"
val
"
],
am
=>
"
source,unary
",
latency
=>
8
,
attr
=>
"
ir_mode *tgt_mode
",
init
_attr
=>
"
attr->ls_mode = tgt_mode;
",
mode
=>
$mode_xmm
,
state
=>
"
exc_pinned
",
in_reqs
=>
[
"
gp
",
"
gp
",
"
mem
",
"
xmm
"
],
out_reqs
=>
[
"
xmm
",
"
mem
"
],
ins
=>
[
"
base
",
"
index
",
"
mem
",
"
val
"
],
am
=>
"
source,unary
",
latency
=>
8
,
attr
=>
"
ir_mode *tgt_mode
",
init
=>
"
attr->ls_mode = tgt_mode;
",
mode
=>
$mode_xmm
,
},
# rematerialisation disabled for all float nodes for now, because the fpcw
...
...
@@ -1616,7 +1616,7 @@ fld => {
outs
=>
[
"
res
",
"
unused
",
"
M
",
"
X_regular
",
"
X_except
"
],
emit
=>
"
fld%FM %AM
",
attr
=>
"
ir_mode *load_mode
",
init
_attr
=>
"
attr->ls_mode = load_mode;
",
init
=>
"
attr->ls_mode = load_mode;
",
fixed
=>
$x87sim
,
latency
=>
2
,
},
...
...
@@ -1631,7 +1631,7 @@ fst => {
outs
=>
[
"
M
",
"
X_regular
",
"
X_except
"
],
emit
=>
"
fst%FP%FM %AM
",
attr
=>
"
ir_mode *store_mode
",
init
_attr
=>
"
attr->attr.ls_mode = store_mode;
",
init
=>
"
attr->attr.ls_mode = store_mode;
",
latency
=>
2
,
attr_type
=>
"
ia32_x87_attr_t
",
},
...
...
@@ -1725,7 +1725,7 @@ FucomFnstsw => {
emit
=>
"
fucom%FP %F0
\n
"
.
"
fnstsw %%ax
",
attr
=>
"
bool ins_permuted
",
init
_attr
=>
"
attr->attr.ins_permuted = ins_permuted;
",
init
=>