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
2923be43
Commit
2923be43
authored
Jan 12, 2006
by
Christian Würdig
Browse files
changed emit format description, so firm-libcore-ir_printf-environment can be used
parent
f5a1564c
Changes
2
Hide whitespace changes
Inline
Side-by-side
ir/be/ia32/ia32_emitter.c
View file @
2923be43
...
...
@@ -187,10 +187,10 @@ static int ia32_get_reg_name(lc_appendable_t *app,
if
(
!
X
)
return
lc_arg_append
(
app
,
occ
,
"(null)"
,
6
);
if
(
occ
->
conversion
==
'
s
'
)
{
if
(
occ
->
conversion
==
'
S
'
)
{
buf
=
get_ia32_reg_name
(
X
,
nr
,
1
);
}
else
{
/* '
d
' */
else
{
/* '
D
' */
buf
=
get_ia32_reg_name
(
X
,
nr
,
0
);
}
...
...
@@ -210,10 +210,10 @@ static int ia32_const_to_str(lc_appendable_t *app,
if
(
!
X
)
return
lc_arg_append
(
app
,
occ
,
"(null)"
,
6
);
if
(
occ
->
conversion
==
'
c
'
)
{
if
(
occ
->
conversion
==
'
C
'
)
{
buf
=
node_const_to_str
(
X
);
}
else
{
/* '
o
' */
else
{
/* '
O
' */
buf
=
node_offset_to_str
(
X
);
}
...
...
@@ -251,12 +251,13 @@ const lc_arg_env_t *ia32_get_arg_env(void) {
if
(
env
==
NULL
)
{
/* extend the firm printer */
env
=
firm_get_arg_env
();
//lc_arg_new_env();
lc_arg_register
(
env
,
"ia32:sreg"
,
'
s
'
,
&
ia32_reg_handler
);
lc_arg_register
(
env
,
"ia32:dreg"
,
'
d
'
,
&
ia32_reg_handler
);
lc_arg_register
(
env
,
"ia32:cnst"
,
'
c
'
,
&
ia32_const_handler
);
lc_arg_register
(
env
,
"ia32:offs"
,
'
o
'
,
&
ia32_const_handler
);
lc_arg_register
(
env
,
"ia32:mode"
,
'
m
'
,
&
ia32_mode_handler
);
lc_arg_register
(
env
,
"ia32:sreg"
,
'
S
'
,
&
ia32_reg_handler
);
lc_arg_register
(
env
,
"ia32:dreg"
,
'
D
'
,
&
ia32_reg_handler
);
lc_arg_register
(
env
,
"ia32:cnst"
,
'
C
'
,
&
ia32_const_handler
);
lc_arg_register
(
env
,
"ia32:offs"
,
'
O
'
,
&
ia32_const_handler
);
lc_arg_register
(
env
,
"ia32:mode"
,
'
M
'
,
&
ia32_mode_handler
);
}
return
env
;
...
...
@@ -270,11 +271,11 @@ void equalize_dest_src(FILE *F, ir_node *n) {
if
(
get_irn_arity
(
n
)
>
1
&&
get_ia32_reg_nr
(
n
,
1
,
1
)
==
get_ia32_reg_nr
(
n
,
0
,
0
))
{
if
(
!
is_op_commutative
(
get_irn_op
(
n
)))
{
/* we only need to exchange for non-commutative ops */
lc_efprintf
(
ia32_get_arg_env
(),
F
,
"
\t
xchg %1
s
, %2
s
\t\t\t
/* xchg src1 <-> src2 for 2 address code */
\n
"
,
n
,
n
);
lc_efprintf
(
ia32_get_arg_env
(),
F
,
"
\t
xchg %1
S
, %2
S
\t\t\t
/* xchg src1 <-> src2 for 2 address code */
\n
"
,
n
,
n
);
}
}
else
{
lc_efprintf
(
ia32_get_arg_env
(),
F
,
"
\t
movl %1
s
, %1
d
\t\t\t
/* src -> dest for 2 address code */
\n
"
,
n
,
n
);
lc_efprintf
(
ia32_get_arg_env
(),
F
,
"
\t
movl %1
S
, %1
D
\t\t\t
/* src -> dest for 2 address code */
\n
"
,
n
,
n
);
}
}
}
...
...
@@ -409,7 +410,7 @@ static void finish_CondJmp(FILE *F, ir_node *irn) {
static
void
emit_ia32_CondJmp
(
ir_node
*
irn
,
emit_env_t
*
env
)
{
FILE
*
F
=
env
->
out
;
lc_efprintf
(
ia32_get_arg_env
(),
F
,
"
\t
cmp %2
s
, %1
s
\t\t\t
/* CondJmp(%+F, %+F) */
\n
"
,
irn
,
irn
,
lc_efprintf
(
ia32_get_arg_env
(),
F
,
"
\t
cmp %2
S
, %1
S
\t\t\t
/* CondJmp(%+F, %+F) */
\n
"
,
irn
,
irn
,
get_irn_n
(
irn
,
0
),
get_irn_n
(
irn
,
1
));
finish_CondJmp
(
F
,
irn
);
}
...
...
@@ -420,7 +421,7 @@ static void emit_ia32_CondJmp(ir_node *irn, emit_env_t *env) {
void
emit_ia32_CondJmp_i
(
ir_node
*
irn
,
emit_env_t
*
env
)
{
FILE
*
F
=
env
->
out
;
lc_efprintf
(
ia32_get_arg_env
(),
F
,
"
\t
cmp %
c
, %1
s
\t\t\t
/* CondJmp_i(%+F) */
\n
"
,
irn
,
irn
,
get_irn_n
(
irn
,
0
));
lc_efprintf
(
ia32_get_arg_env
(),
F
,
"
\t
cmp %
C
, %1
S
\t\t\t
/* CondJmp_i(%+F) */
\n
"
,
irn
,
irn
,
get_irn_n
(
irn
,
0
));
finish_CondJmp
(
F
,
irn
);
}
...
...
@@ -534,11 +535,11 @@ void emit_ia32_SwitchJmp(const ir_node *irn, emit_env_t *emit_env) {
/* emit the table */
if
(
tbl
.
min_value
!=
0
)
{
fprintf
(
F
,
"
\t
cmpl %lu, -%d"
,
interval
,
tbl
.
min_value
);
lc_efprintf
(
env
,
F
,
"(%1
s
)
\t\t
/* first switch value is not 0 */
\n
"
,
irn
);
lc_efprintf
(
env
,
F
,
"(%1
S
)
\t\t
/* first switch value is not 0 */
\n
"
,
irn
);
}
else
{
fprintf
(
F
,
"
\t
cmpl %lu, "
,
interval
);
lc_efprintf
(
env
,
F
,
"%1
s
\t\t\t
/* compare for switch */
\n
"
,
irn
);
lc_efprintf
(
env
,
F
,
"%1
S
\t\t\t
/* compare for switch */
\n
"
,
irn
);
}
fprintf
(
F
,
"
\t
ja %s
\t\t\t
/* default jump if out of range */
\n
"
,
get_cfop_target
(
tbl
.
defProj
,
buf
));
...
...
@@ -546,8 +547,8 @@ void emit_ia32_SwitchJmp(const ir_node *irn, emit_env_t *emit_env) {
if
(
tbl
.
num_branches
>
1
)
{
/* create table */
fprintf
(
F
,
"
\t
jmp *%s"
,
tbl
.
label
);
lc_efprintf
(
env
,
F
,
"(,%1
s
,4)
\t\t
/* get jump table entry as target */
\n
"
,
irn
);
//
fprintf(F, "\tjmp *%s", tbl.label);
lc_efprintf
(
env
,
F
,
"
\t
jmp *%s
(,%1
S
,4)
\t\t
/* get jump table entry as target */
\n
"
,
tbl
.
label
,
irn
);
fprintf
(
F
,
"
\t
.section
\t
.rodata
\t\t
/* start jump table */
\n
"
);
fprintf
(
F
,
"
\t
.align 4
\n
"
);
...
...
@@ -573,7 +574,7 @@ void emit_ia32_SwitchJmp(const ir_node *irn, emit_env_t *emit_env) {
else
{
// no jump table
for
(
i
=
0
;
i
<
tbl
.
num_branches
;
++
i
)
{
fprintf
(
F
,
"
\t
cmpl %d, "
,
tbl
.
branches
[
i
].
value
);
lc_efprintf
(
env
,
F
,
"%1
s
"
,
irn
);
lc_efprintf
(
env
,
F
,
"%1
S
"
,
irn
);
fprintf
(
F
,
"
\t\t\t
/* case %d */
\n
"
,
tbl
.
branches
[
i
].
value
);
fprintf
(
F
,
"
\t
je %s
\n
"
,
get_cfop_target
(
tbl
.
branches
[
i
].
target
,
buf
));
}
...
...
ir/be/ia32/ia32_spec.pl
View file @
2923be43
...
...
@@ -125,7 +125,7 @@ $arch = "ia32";
"
comment
"
=>
"
construct Add: Add(a, b) = Add(b, a) = a + b
",
"
check_inout
"
=>
1
,
"
reg_req
"
=>
{
"
in
"
=>
[
"
general_purpose
",
"
general_purpose
"
],
"
out
"
=>
[
"
in_s1
"
]
},
"
emit
"
=>
'
. addl %
s
2, %
d
1\t\t\t/* Add(%
s
1, %
s
2) -> %
d
1, (%
a
1, %
a
2) */
'
"
emit
"
=>
'
. addl %
S
2, %
D
1\t\t\t/* Add(%
S
1, %
S
2) -> %
D
1, (%
A
1, %
A
2) */
'
},
"
Add_i
"
=>
{
...
...
@@ -134,7 +134,7 @@ $arch = "ia32";
"
comment
"
=>
"
construct Add: Add(a, const) = Add(const, a) = a + const
",
"
check_inout
"
=>
1
,
"
reg_req
"
=>
{
"
in
"
=>
[
"
general_purpose
"
],
"
out
"
=>
[
"
in_s1
"
]
},
"
emit
"
=>
'
. addl %
c
, %
d
1\t\t\t/* Add(%
c
, %
s
1) -> %
d
1, (%
a
1, const) */
'
"
emit
"
=>
'
. addl %
C
, %
D
1\t\t\t/* Add(%
C
, %
S
1) -> %
D
1, (%
A
1, const) */
'
},
"
Mul
"
=>
{
...
...
@@ -144,10 +144,10 @@ $arch = "ia32";
"
reg_req
"
=>
{
"
in
"
=>
[
"
eax
",
"
general_purpose
"
],
"
out
"
=>
[
"
eax
"
]
},
"
emit
"
=>
'
if (mode_is_signed(get_irn_mode(n))) {
4. imull %
s
2\t\t\t/* signed Mul(%
s
1, %
s
2) -> %
d
1, (%
a
1, %
a
2) */
4. imull %
S
2\t\t\t/* signed Mul(%
S
1, %
S
2) -> %
D
1, (%
A
1, %
A
2) */
}
else {
4. mull %
s
2\t\t\t/* unsigned Mul(%
s
1, %
s
2) -> %
d
1, (%
a
1, %
a
2) */
4. mull %
S
2\t\t\t/* unsigned Mul(%
S
1, %
S
2) -> %
D
1, (%
A
1, %
A
2) */
}
'
},
...
...
@@ -159,10 +159,10 @@ $arch = "ia32";
"
reg_req
"
=>
{
"
in
"
=>
[
"
eax
"
],
"
out
"
=>
[
"
eax
"
]
},
"
emit
"
=>
'
if (mode_is_signed(get_irn_mode(n))) {
4. imull %
c
\t\t\t/* signed Mul(%
c
, %
s
1) -> %
d
1, (%
a
1, const) */
4. imull %
C
\t\t\t/* signed Mul(%
C
, %
S
1) -> %
D
1, (%
A
1, const) */
}
else {
4. mull %
c
\t\t\t/* unsigned Mul(%
c
, %
s
1) -> %
d
1, (%
a
1, const) */
4. mull %
C
\t\t\t/* unsigned Mul(%
C
, %
S
1) -> %
D
1, (%
A
1, const) */
}
'
},
...
...
@@ -174,10 +174,10 @@ $arch = "ia32";
"
reg_req
"
=>
{
"
in
"
=>
[
"
eax
",
"
general_purpose
"
],
"
out
"
=>
[
"
edx
"
]
},
"
emit
"
=>
'
if (mode_is_signed(get_irn_mode(n))) {
4. imull %
s
2\t\t\t/* signed Mulh(%
s
1, %
s
2) -> %
d
1, (%
a
1, %
a
2) */
4. imull %
S
2\t\t\t/* signed Mulh(%
S
1, %
S
2) -> %
D
1, (%
A
1, %
A
2) */
}
else {
4. mull %
s
2\t\t\t/* unsigned Mulh(%
s
1, %
s
2) -> %
d
1, (%
a
1, %
a
2) */
4. mull %
S
2\t\t\t/* unsigned Mulh(%
S
1, %
S
2) -> %
D
1, (%
A
1, %
A
2) */
}
'
},
...
...
@@ -189,10 +189,10 @@ $arch = "ia32";
"
reg_req
"
=>
{
"
in
"
=>
[
"
eax
"
],
"
out
"
=>
[
"
edx
"
]
},
"
emit
"
=>
'
if (mode_is_signed(get_irn_mode(n))) {
4. imull %
c
\t\t\t/* signed Mulh(%
c
, %
s
1) -> %
d
1, (%
a
1, const) */
4. imull %
C
\t\t\t/* signed Mulh(%
C
, %
S
1) -> %
D
1, (%
A
1, const) */
}
else {
4. mull %
c
\t\t\t/* unsigned Mulh(%
c
, %
s
1) -> %
d
1, (%
a
1, const) */
4. mull %
C
\t\t\t/* unsigned Mulh(%
C
, %
S
1) -> %
D
1, (%
A
1, const) */
}
'
},
...
...
@@ -204,7 +204,7 @@ $arch = "ia32";
"
comment
"
=>
"
construct And: And(a, b) = And(b, a) = a AND b
",
"
check_inout
"
=>
1
,
"
reg_req
"
=>
{
"
in
"
=>
[
"
general_purpose
",
"
general_purpose
"
],
"
out
"
=>
[
"
in_s1
"
]
},
"
emit
"
=>
'
. andl %
s
2, %
d
1\t\t\t/* And(%
s
1, %
s
2) -> %
d
1, (%
a
1, %
a
2) */
'
"
emit
"
=>
'
. andl %
S
2, %
D
1\t\t\t/* And(%
S
1, %
S
2) -> %
D
1, (%
A
1, %
A
2) */
'
},
"
And_i
"
=>
{
...
...
@@ -213,7 +213,7 @@ $arch = "ia32";
"
comment
"
=>
"
construct And: And(a, const) = And(const, a) = a AND const
",
"
check_inout
"
=>
1
,
"
reg_req
"
=>
{
"
in
"
=>
[
"
general_purpose
"
],
"
out
"
=>
[
"
in_s1
"
]
},
"
emit
"
=>
'
. andl %
c
, %
d
1\t\t\t/* And(%
c
, %
s
1) -> %
d
1, (%
a
1, const) */
'
"
emit
"
=>
'
. andl %
C
, %
D
1\t\t\t/* And(%
C
, %
S
1) -> %
D
1, (%
A
1, const) */
'
},
"
Or
"
=>
{
...
...
@@ -223,7 +223,7 @@ $arch = "ia32";
"
comment
"
=>
"
construct Or: Or(a, b) = Or(b, a) = a OR b
",
"
check_inout
"
=>
1
,
"
reg_req
"
=>
{
"
in
"
=>
[
"
general_purpose
",
"
general_purpose
"
],
"
out
"
=>
[
"
in_s1
"
]
},
"
emit
"
=>
'
. orl %
s
2, %
d
1\t\t\t/* Or(%
s
1, %
s
2) -> %
d
1, (%
a
1, %
a
2) */
'
"
emit
"
=>
'
. orl %
S
2, %
D
1\t\t\t/* Or(%
S
1, %
S
2) -> %
D
1, (%
A
1, %
A
2) */
'
},
"
Or_i
"
=>
{
...
...
@@ -232,7 +232,7 @@ $arch = "ia32";
"
comment
"
=>
"
construct Or: Or(a, const) = Or(const, a) = a OR const
",
"
check_inout
"
=>
1
,
"
reg_req
"
=>
{
"
in
"
=>
[
"
general_purpose
"
],
"
out
"
=>
[
"
in_s1
"
]
},
"
emit
"
=>
'
. orl %
c
, %
d
1\t\t\t/* Or(%
c
, %
s
1) -> %
d
1, (%
a
1, const) */
'
"
emit
"
=>
'
. orl %
C
, %
D
1\t\t\t/* Or(%
C
, %
S
1) -> %
D
1, (%
A
1, const) */
'
},
"
Eor
"
=>
{
...
...
@@ -242,7 +242,7 @@ $arch = "ia32";
"
comment
"
=>
"
construct Eor: Eor(a, b) = Eor(b, a) = a EOR b
",
"
check_inout
"
=>
1
,
"
reg_req
"
=>
{
"
in
"
=>
[
"
general_purpose
",
"
general_purpose
"
],
"
out
"
=>
[
"
in_s1
"
]
},
"
emit
"
=>
'
. xorl %
s
2, %
d
1\t\t\t/* Xor(%
s
1, %
s
2) -> %
d
1, (%
a
1, %
a
2) */
'
"
emit
"
=>
'
. xorl %
S
2, %
D
1\t\t\t/* Xor(%
S
1, %
S
2) -> %
D
1, (%
A
1, %
A
2) */
'
},
"
Eor_i
"
=>
{
...
...
@@ -251,7 +251,7 @@ $arch = "ia32";
"
comment
"
=>
"
construct Eor: Eor(a, const) = Eor(const, a) = a EOR const
",
"
check_inout
"
=>
1
,
"
reg_req
"
=>
{
"
in
"
=>
[
"
general_purpose
"
],
"
out
"
=>
[
"
in_s1
"
]
},
"
emit
"
=>
'
. xorl %
c
, %
d
1\t\t\t/* Xor(%
c
, %
s
1) -> %
d
1, (%
a
1, const) */
'
"
emit
"
=>
'
. xorl %
C
, %
D
1\t\t\t/* Xor(%
C
, %
S
1) -> %
D
1, (%
A
1, const) */
'
},
"
Max
"
=>
{
...
...
@@ -262,12 +262,12 @@ $arch = "ia32";
"
check_inout
"
=>
1
,
"
reg_req
"
=>
{
"
in
"
=>
[
"
general_purpose
",
"
general_purpose
"
],
"
out
"
=>
[
"
in_s1
"
]
},
"
emit
"
=>
'
2. cmpl %
s
2, %
s
1\t\t\t/* prepare Max (%
s
1 should be %
d
1), (%
a
1, %
a
2) */
'
2. cmpl %
S
2, %
S
1\t\t\t/* prepare Max (%
S
1 should be %
D
1), (%
A
1, %
A
2) */
if (mode_is_signed(get_irn_mode(n))) {
4. cmovl %
s
2, %
d
1\t\t\t/* %
s
1 is less %
s
2 */
4. cmovl %
S
2, %
D
1\t\t\t/* %
S
1 is less %
S
2 */
}
else {
4. cmovb %
s
2, %
d
1\t\t\t/* %
s
1 is below %
s
2 */
4. cmovb %
S
2, %
D
1\t\t\t/* %
S
1 is below %
S
2 */
}
'
},
...
...
@@ -280,12 +280,12 @@ $arch = "ia32";
"
check_inout
"
=>
1
,
"
reg_req
"
=>
{
"
in
"
=>
[
"
general_purpose
",
"
general_purpose
"
],
"
out
"
=>
[
"
in_s1
"
]
},
"
emit
"
=>
'
2. cmpl %
s
2, %
s
1\t\t\t/* prepare Min (%
s
1 should be %
d
1), (%
a
1, %
a
2) */
'
2. cmpl %
S
2, %
S
1\t\t\t/* prepare Min (%
S
1 should be %
D
1), (%
A
1, %
A
2) */
if (mode_is_signed(get_irn_mode(n))) {
2. cmovg %
s
2, %
d
1\t\t\t/* %
s
1 is greater %
s
2 */
2. cmovg %
S
2, %
D
1\t\t\t/* %
S
1 is greater %
S
2 */
}
else {
2. cmova %
s
2, %
d
1\t\t\t/* %
s
1 is above %
s
2 */
2. cmova %
S
2, %
D
1\t\t\t/* %
S
1 is above %
S
2 */
}
'
},
...
...
@@ -298,7 +298,7 @@ $arch = "ia32";
"
comment
"
=>
"
construct Sub: Sub(a, b) = a - b
",
"
check_inout
"
=>
1
,
"
reg_req
"
=>
{
"
in
"
=>
[
"
general_purpose
",
"
general_purpose
"
],
"
out
"
=>
[
"
in_s1
"
]
},
"
emit
"
=>
'
. subl %
s
2, %
d
1\t\t\t/* Sub(%
s
1, %
s
2) -> %
d
1, (%
a
1, %
a
2) */
'
"
emit
"
=>
'
. subl %
S
2, %
D
1\t\t\t/* Sub(%
S
1, %
S
2) -> %
D
1, (%
A
1, %
A
2) */
'
},
"
Sub_i
"
=>
{
...
...
@@ -307,7 +307,7 @@ $arch = "ia32";
"
comment
"
=>
"
construct Sub: Sub(a, const) = a - const
",
"
check_inout
"
=>
1
,
"
reg_req
"
=>
{
"
in
"
=>
[
"
general_purpose
"
],
"
out
"
=>
[
"
in_s1
"
]
},
"
emit
"
=>
'
. subl %
c
, %
d
1\t\t\t/* Sub(%
s
1, %
c
) -> %
d
1, (%
a
1, const) */
'
"
emit
"
=>
'
. subl %
C
, %
D
1\t\t\t/* Sub(%
S
1, %
C
) -> %
D
1, (%
A
1, const) */
'
},
"
DivMod
"
=>
{
...
...
@@ -317,10 +317,10 @@ $arch = "ia32";
"
comment
"
=>
"
construct DivMod: DivMod(a,b) = (a / b, a % b)
",
"
emit
"
=>
'
if (mode_is_signed(get_irn_mode(n))) {
4. idivl %
s
2\t\t\t/* signed Mod(%
s
1, %
s
2) -> %
d
1, (%
a
2, %
a
3, %4) */
4. idivl %
S
2\t\t\t/* signed Mod(%
S
1, %
S
2) -> %
D
1, (%
A
2, %
A
3, %4) */
}
else {
4. divl %
s
2\t\t\t/* unsigned Mod(%
s
1, %
s
2) -> %
d
1, (%
a
2, %
a
3, %
a
4) */
4. divl %
S
2\t\t\t/* unsigned Mod(%
S
1, %
S
2) -> %
D
1, (%
A
2, %
A
3, %
A
4) */
}
',
"
args
"
=>
[
...
...
@@ -383,7 +383,7 @@ $arch = "ia32";
"
comment
"
=>
"
construct Shl: Shl(a, b) = a << b
",
"
check_inout
"
=>
1
,
"
reg_req
"
=>
{
"
in
"
=>
[
"
general_purpose
",
"
general_purpose
"
],
"
out
"
=>
[
"
in_s1
"
]
},
"
emit
"
=>
'
. shll %
s
2, %
d
1\t\t\t/* Shl(%
s
1, %
s
2) -> %
d
1, (%
a
1, %
a
2) */
'
"
emit
"
=>
'
. shll %
S
2, %
D
1\t\t\t/* Shl(%
S
1, %
S
2) -> %
D
1, (%
A
1, %
A
2) */
'
},
"
Shl_i
"
=>
{
...
...
@@ -392,7 +392,7 @@ $arch = "ia32";
"
comment
"
=>
"
construct Shl: Shl(a, const) = a << const
",
"
check_inout
"
=>
1
,
"
reg_req
"
=>
{
"
in
"
=>
[
"
general_purpose
"
],
"
out
"
=>
[
"
in_s1
"
]
},
"
emit
"
=>
'
. shll %
c
, %
d
1\t\t\t/* Shl(%
s
1, %
c
) -> %
d
1, (%
a
1, const) */
'
"
emit
"
=>
'
. shll %
C
, %
D
1\t\t\t/* Shl(%
S
1, %
C
) -> %
D
1, (%
A
1, const) */
'
},
"
Shr
"
=>
{
...
...
@@ -401,7 +401,7 @@ $arch = "ia32";
"
comment
"
=>
"
construct Shr: Shr(a, b) = a >> b
",
"
check_inout
"
=>
1
,
"
reg_req
"
=>
{
"
in
"
=>
[
"
general_purpose
",
"
general_purpose
"
],
"
out
"
=>
[
"
in_s1
"
]
},
"
emit
"
=>
'
. shrl %
s
2, %
d
1\t\t\t/* Shr(%
s
1, %
s
2) -> %
d
1, (%
a
1, %
a
2) */
'
"
emit
"
=>
'
. shrl %
S
2, %
D
1\t\t\t/* Shr(%
S
1, %
S
2) -> %
D
1, (%
A
1, %
A
2) */
'
},
"
Shr_i
"
=>
{
...
...
@@ -410,7 +410,7 @@ $arch = "ia32";
"
comment
"
=>
"
construct Shr: Shr(a, const) = a >> const
",
"
check_inout
"
=>
1
,
"
reg_req
"
=>
{
"
in
"
=>
[
"
general_purpose
"
],
"
out
"
=>
[
"
in_s1
"
]
},
"
emit
"
=>
'
. shrl %
c
, %
d
1\t\t\t/* Shr(%
s
1, %
c
) -> %
d
1, (%
a
1, const) */
'
"
emit
"
=>
'
. shrl %
C
, %
D
1\t\t\t/* Shr(%
S
1, %
C
) -> %
D
1, (%
A
1, const) */
'
},
"
Shrs
"
=>
{
...
...
@@ -419,7 +419,7 @@ $arch = "ia32";
"
comment
"
=>
"
construct Shrs: Shrs(a, b) = a >> b
",
"
check_inout
"
=>
1
,
"
reg_req
"
=>
{
"
in
"
=>
[
"
general_purpose
",
"
general_purpose
"
],
"
out
"
=>
[
"
in_s1
"
]
},
"
emit
"
=>
'
. sarl %
s
2, %
d
1\t\t\t/* Shrs(%
s
1, %
s
2) -> %
d
1, (%
a
1, %
a
2) */
'
"
emit
"
=>
'
. sarl %
S
2, %
D
1\t\t\t/* Shrs(%
S
1, %
S
2) -> %
D
1, (%
A
1, %
A
2) */
'
},
"
Shrs_i
"
=>
{
...
...
@@ -428,7 +428,7 @@ $arch = "ia32";
"
comment
"
=>
"
construct Shrs: Shrs(a, const) = a >> const
",
"
check_inout
"
=>
1
,
"
reg_req
"
=>
{
"
in
"
=>
[
"
general_purpose
"
],
"
out
"
=>
[
"
in_s1
"
]
},
"
emit
"
=>
'
. sarl %
c
, %
d
1\t\t\t/* Shrs(%
s
1, %
c
) -> %
d
1, (%
a
1, const) */
'
"
emit
"
=>
'
. sarl %
C
, %
D
1\t\t\t/* Shrs(%
S
1, %
C
) -> %
D
1, (%
A
1, const) */
'
},
"
RotR
"
=>
{
...
...
@@ -437,7 +437,7 @@ $arch = "ia32";
"
comment
"
=>
"
construct RotR: RotR(a, b) = a ROTR b
",
"
check_inout
"
=>
1
,
"
reg_req
"
=>
{
"
in
"
=>
[
"
general_purpose
",
"
general_purpose
"
],
"
out
"
=>
[
"
in_s1
"
]
},
"
emit
"
=>
'
. rorl %
s
2, %
d
1\t\t\t/* RotR(%
s
1, %
s
2) -> %
d
1, (%
a
1, %
a
2) */
'
"
emit
"
=>
'
. rorl %
S
2, %
D
1\t\t\t/* RotR(%
S
1, %
S
2) -> %
D
1, (%
A
1, %
A
2) */
'
},
"
RotL
"
=>
{
...
...
@@ -446,7 +446,7 @@ $arch = "ia32";
"
comment
"
=>
"
construct RotL: RotL(a, b) = a ROTL b
",
"
check_inout
"
=>
1
,
"
reg_req
"
=>
{
"
in
"
=>
[
"
general_purpose
",
"
general_purpose
"
],
"
out
"
=>
[
"
in_s1
"
]
},
"
emit
"
=>
'
. roll %
s
2, %
d
1\t\t\t/* RotL(%
s
1, %
s
2) -> %
d
1, (%
a
1, %
a
2) */
'
"
emit
"
=>
'
. roll %
S
2, %
D
1\t\t\t/* RotL(%
S
1, %
S
2) -> %
D
1, (%
A
1, %
A
2) */
'
},
"
RotL_i
"
=>
{
...
...
@@ -455,7 +455,7 @@ $arch = "ia32";
"
comment
"
=>
"
construct RotL: RotL(a, const) = a ROTL const
",
"
check_inout
"
=>
1
,
"
reg_req
"
=>
{
"
in
"
=>
[
"
general_purpose
"
],
"
out
"
=>
[
"
in_s1
"
]
},
"
emit
"
=>
'
. roll %
c
, %
d
1\t\t\t/* RotL(%
s
1, %
c
) -> %
d
1, (%
a
1, const) */
'
"
emit
"
=>
'
. roll %
C
, %
D
1\t\t\t/* RotL(%
S
1, %
C
) -> %
D
1, (%
A
1, const) */
'
},
"
Minus
"
=>
{
...
...
@@ -464,7 +464,7 @@ $arch = "ia32";
"
comment
"
=>
"
construct Minus: Minus(a) = -a
",
"
check_inout
"
=>
1
,
"
reg_req
"
=>
{
"
in
"
=>
[
"
general_purpose
"
],
"
out
"
=>
[
"
in_s1
"
]
},
"
emit
"
=>
'
. negl %
d
1\t\t\t/* Neg(%
s
1) -> %
d
1, (%
a
1) */
'
"
emit
"
=>
'
. negl %
D
1\t\t\t/* Neg(%
S
1) -> %
D
1, (%
A
1) */
'
},
"
Inc
"
=>
{
...
...
@@ -473,7 +473,7 @@ $arch = "ia32";
"
comment
"
=>
"
construct Increment: Inc(a) = a++
",
"
check_inout
"
=>
1
,
"
reg_req
"
=>
{
"
in
"
=>
[
"
general_purpose
"
],
"
out
"
=>
[
"
in_s1
"
]
},
"
emit
"
=>
'
. incl %
d
1\t\t\t/* Inc(%
s
1) -> %
d
1, (%
a
1) */
'
"
emit
"
=>
'
. incl %
D
1\t\t\t/* Inc(%
S
1) -> %
D
1, (%
A
1) */
'
},
"
Dec
"
=>
{
...
...
@@ -482,7 +482,7 @@ $arch = "ia32";
"
comment
"
=>
"
construct Decrement: Dec(a) = a--
",
"
check_inout
"
=>
1
,
"
reg_req
"
=>
{
"
in
"
=>
[
"
general_purpose
"
],
"
out
"
=>
[
"
in_s1
"
]
},
"
emit
"
=>
'
. decl %
d
1\t\t\t/* Dec(%
s
1) -> %
d
1, (%
a
1) */
'
"
emit
"
=>
'
. decl %
D
1\t\t\t/* Dec(%
S
1) -> %
D
1, (%
A
1) */
'
},
"
Not
"
=>
{
...
...
@@ -491,7 +491,7 @@ $arch = "ia32";
"
comment
"
=>
"
construct Not: Not(a) = !a
",
"
check_inout
"
=>
1
,
"
reg_req
"
=>
{
"
in
"
=>
[
"
general_purpose
"
],
"
out
"
=>
[
"
in_s1
"
]
},
"
emit
"
=>
'
. notl %
d
1\t\t\t/* Not(%
s
1) -> %
d
1, (%
a
1) */
'
"
emit
"
=>
'
. notl %
D
1\t\t\t/* Not(%
S
1) -> %
D
1, (%
A
1) */
'
},
# other operations
...
...
@@ -529,7 +529,7 @@ $arch = "ia32";
"
remat
"
=>
1
,
"
comment
"
=>
"
represents an integer constant
",
"
reg_req
"
=>
{
"
out
"
=>
[
"
general_purpose
"
]
},
"
emit
"
=>
'
. movl %
c
, %
d
1\t\t\t/* Mov Const into register */
',
"
emit
"
=>
'
. movl %
C
, %
D
1\t\t\t/* Mov Const into register */
',
"
cmp_attr
"
=>
'
if (attr_a->tp == attr_b->tp) {
...
...
@@ -559,7 +559,7 @@ $arch = "ia32";
"
remat
"
=>
1
,
"
comment
"
=>
"
construct Cltd: sign extend EAX -> EDX:EAX
",
"
reg_req
"
=>
{
"
in
"
=>
[
"
eax
"
],
"
out
"
=>
[
"
eax
",
"
edx
"
]
},
"
emit
"
=>
'
. cltd\t\t\t/* sign extend EAX -> EDX:EAX, (%
a
1) */
'
"
emit
"
=>
'
. cltd\t\t\t/* sign extend EAX -> EDX:EAX, (%
A
1) */
'
},
# Load / Store
...
...
@@ -571,7 +571,7 @@ $arch = "ia32";
"
remat
"
=>
1
,
"
comment
"
=>
"
construct Load: Load(ptr, mem) = LD ptr -> reg
",
"
reg_req
"
=>
{
"
in
"
=>
[
"
general_purpose
",
"
none
"
],
"
out
"
=>
[
"
general_purpose
"
]
},
"
emit
"
=>
'
. movl (%
s
1), %
d
1\t\t\t/* Load((%
s
1)) -> %
d
1, (%
a
1) */
'
"
emit
"
=>
'
. movl (%
S
1), %
D
1\t\t\t/* Load((%
S
1)) -> %
D
1, (%
A
1) */
'
},
"
Store
"
=>
{
...
...
@@ -581,21 +581,21 @@ $arch = "ia32";
"
remat
"
=>
1
,
"
comment
"
=>
"
construct Store: Store(ptr, val, mem) = ST ptr,val
",
"
reg_req
"
=>
{
"
in
"
=>
[
"
general_purpose
",
"
general_purpose
",
"
none
"
]
},
"
emit
"
=>
'
. movl %
s
2, (%
s
1)\t\t\t/* Store(%
s
2) -> (%
s
1), (%
a
1, %
a
2) */
'
"
emit
"
=>
'
. movl %
S
2, (%
S
1)\t\t\t/* Store(%
S
2) -> (%
S
1), (%
A
1, %
A
2) */
'
},
"
Lea
"
=>
{
"
arity
"
=>
2
,
"
comment
"
=>
"
construct Lea: Lea(a,b) = lea offs(a,b,const) | res = a + b * const + offs with const = 0,1,2,4,8
",
"
reg_req
"
=>
{
"
in
"
=>
[
"
general_purpose
",
"
general_purpose
"
],
"
out
"
=>
[
"
general_purpose
"
]
},
"
emit
"
=>
'
. leal %
o
(%
s
1, %
s
2, %
c
), %
d
1\t\t/* %
d
1 = %
s
1 + %
s
2 << %
c
+ %
o
, (%
a
1, %
a
2) */
'
"
emit
"
=>
'
. leal %
O
(%
S
1, %
S
2, %
C
), %
D
1\t\t/* %
D
1 = %
S
1 + %
S
2 << %
C
+ %
O
, (%
A
1, %
A
2) */
'
},
"
Lea_i
"
=>
{
"
arity
"
=>
1
,
"
comment
"
=>
"
construct Lea: Lea(a) = lea offs(a) | res = a + offs
",
"
reg_req
"
=>
{
"
in
"
=>
[
"
general_purpose
"
],
"
out
"
=>
[
"
general_purpose
"
]
},
"
emit
"
=>
'
. leal %
c
(%
s
1), %
d
1\t\t\t/* %
d
1 = %
s
1 + %
c
, (%
a
1)*/
'
"
emit
"
=>
'
. leal %
C
(%
S
1), %
D
1\t\t\t/* %
D
1 = %
S
1 + %
C
, (%
A
1)*/
'
},
"
RegParam
"
=>
{
...
...
@@ -646,7 +646,7 @@ $arch = "ia32";
"
check_inout
"
=>
1
,
"
comment
"
=>
"
construct SSE Add: Add(a, b) = Add(b, a) = a + b
",
"
reg_req
"
=>
{
"
in
"
=>
[
"
floating_point
",
"
floating_point
"
],
"
out
"
=>
[
"
in_s1
"
]
},
"
emit
"
=>
'
. add%
m
%
s
2, %
d
1\t\t\t/* SSE Add(%
s
1, %
s
2) -> %
d
1 */
'
"
emit
"
=>
'
. add%
M
%
S
2, %
D
1\t\t\t/* SSE Add(%
S
1, %
S
2) -> %
D
1 */
'
},
"
fMul
"
=>
{
...
...
@@ -655,7 +655,7 @@ $arch = "ia32";
"
check_inout
"
=>
1
,
"
comment
"
=>
"
construct SSE Mul: Mul(a, b) = Mul(b, a) = a * b
",
"
reg_req
"
=>
{
"
in
"
=>
[
"
floating_point
",
"
floating_point
"
],
"
out
"
=>
[
"
in_s1
"
]
},
"
emit
"
=>
'
. muls%
m
%
s
2, %
d
1\t\t\t/* SSE Mul(%
s
1, %
s
2) -> %
d
1 */
'
"
emit
"
=>
'
. muls%
M
%
S
2, %
D
1\t\t\t/* SSE Mul(%
S
1, %
S
2) -> %
D
1 */
'
},
"
fMax
"
=>
{
...
...
@@ -665,7 +665,7 @@ $arch = "ia32";
"
check_inout
"
=>
1
,
"
comment
"
=>
"
construct SSE Max: Max(a, b) = Max(b, a) = a > b ? a : b
",
"
reg_req
"
=>
{
"
in
"
=>
[
"
floating_point
",
"
floating_point
"
],
"
out
"
=>
[
"
in_s1
"
]
},
"
emit
"
=>
'
. maxs%
m
%
s
2, %
d
1\t\t\t/* SSE Max(%
s
1, %
s
2) -> %
d
1 */
'
"
emit
"
=>
'
. maxs%
M
%
S
2, %
D
1\t\t\t/* SSE Max(%
S
1, %
S
2) -> %
D
1 */
'
},
"
fMin
"
=>
{
...
...
@@ -675,7 +675,7 @@ $arch = "ia32";
"
check_inout
"
=>
1
,
"
comment
"
=>
"
construct SSE Min: Min(a, b) = Min(b, a) = a < b ? a : b
",
"
reg_req
"
=>
{
"
in
"
=>
[
"
floating_point
",
"
floating_point
"
],
"
out
"
=>
[
"
in_s1
"
]
},
"
emit
"
=>
'
. mins%
m
%
s
2, %
d
1\t\t\t/* SSE Min(%
s
1, %
s
2) -> %
d
1 */
'
"
emit
"
=>
'
. mins%
M
%
S
2, %
D
1\t\t\t/* SSE Min(%
S
1, %
S
2) -> %
D
1 */
'
},
# not commutative operations
...
...
@@ -686,7 +686,7 @@ $arch = "ia32";
"
check_inout
"
=>
1
,
"
comment
"
=>
"
construct SSE Sub: Sub(a, b) = a - b
",
"
reg_req
"
=>
{
"
in
"
=>
[
"
floating_point
",
"
floating_point
"
],
"
out
"
=>
[
"
in_s1
"
]
},
"
emit
"
=>
'
. subs%
m
%
s
2, %
d
1\t\t\t/* SSE Sub(%
s
1, %
s
2) -> %
d
1 */
'
"
emit
"
=>
'
. subs%
M
%
S
2, %
D
1\t\t\t/* SSE Sub(%
S
1, %
S
2) -> %
D
1 */
'
},
"
fDiv
"
=>
{
...
...
@@ -695,7 +695,7 @@ $arch = "ia32";
"
check_inout
"
=>
1
,
"
comment
"
=>
"
construct SSE Div: Div(a, b) = a / b
",
"
reg_req
"
=>
{
"
in
"
=>
[
"
floating_point
",
"
floating_point
"
],
"
out
"
=>
[
"
in_s1
"
]
},
"
emit
"
=>
'
. divs%
m
%
s
2, %
d
1\t\t\t/* SSE Div(%
s
1, %
s
2) -> %
d
1 */
'
"
emit
"
=>
'
. divs%
M
%
S
2, %
D
1\t\t\t/* SSE Div(%
S
1, %
S
2) -> %
D
1 */
'
},
"
fMinus
"
=>
{
...
...
@@ -704,7 +704,7 @@ $arch = "ia32";
"
check_inout
"
=>
1
,
"
comment
"
=>
"
construct SSE Minus: Minus(a) = -a
",
"
reg_req
"
=>
{
"
in
"
=>
[
"
floating_point
"
],
"
out
"
=>
[
"
in_s1
"
]
},
"
emit
"
=>
'
. xorp%
m
c %
d
1\t\t\t/* SSE Minus(%
s
1) -> %
d
1 */
'
"
emit
"
=>
'
. xorp%
M
c %
D
1\t\t\t/* SSE Minus(%
S
1) -> %
D
1 */
'
},
# other operations
...
...
@@ -728,7 +728,7 @@ $arch = "ia32";
"
remat
"
=>
1
,
"
comment
"
=>
"
represents a SSE constant
",
"
reg_req
"
=>
{
"
out
"
=>
[
"
floating_point
"
]
},
"
emit
"
=>
'
. mov%
m
%
c
, %
d
1\t\t\t/* Mov fConst into register */
',
"
emit
"
=>
'
. mov%
M
%
C
, %
D
1\t\t\t/* Mov fConst into register */
',
"
cmp_attr
"
=>
'
if (attr_a->tp == attr_b->tp) {
...
...
@@ -762,7 +762,7 @@ $arch = "ia32";
"
remat
"
=>
1
,
"
comment
"
=>
"
construct SSE Load: Load(ptr, mem) = LD ptr
",
"
reg_req
"
=>
{
"
in
"
=>
[
"
general_purpose
",
"
none
"
],
"
out
"
=>
[
"
floating_point
"
]
},
"
emit
"
=>
'
. movl (%
s
1), %
d
1\t\t\t/* Load((%
s
1)) -> %
d
1 */
'
"
emit
"
=>
'
. movl (%
S
1), %
D
1\t\t\t/* Load((%
S
1)) -> %
D
1 */
'
},
"
fStore
"
=>
{
...
...
@@ -772,7 +772,7 @@ $arch = "ia32";
"
remat
"
=>
1
,
"
comment
"
=>
"
construct Store: Store(ptr, val, mem) = ST ptr,val
",
"
reg_req
"
=>
{
"
in
"
=>
[
"
general_purpose
",
"
floating_point
",
"
none
"
]
},
"
emit
"
=>
'
. movl %
s
2, (%
s
1)\t\t\t/* Store(%
s
2) -> (%
s
1), (%
a
1, %
a
2) */
'
"
emit
"
=>
'
. movl %
S
2, (%
S
1)\t\t\t/* Store(%
S
2) -> (%
S
1), (%
A
1, %
A
2) */
'
},
"
fStackParam
"
=>
{
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment