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
cbadd351
Commit
cbadd351
authored
Mar 11, 2006
by
Christian Würdig
Browse files
fixed register requirements
parent
d9c77a99
Changes
1
Hide whitespace changes
Inline
Side-by-side
ir/be/ia32/ia32_spec.pl
View file @
cbadd351
...
...
@@ -151,7 +151,7 @@ $arch = "ia32";
"
irn_flags
"
=>
"
R
",
"
comment
"
=>
"
construct Add: Add(a, b) = Add(b, a) = a + b
",
"
cmp_attr
"
=>
"
return ia32_compare_immop_attr(attr_a, attr_b);
\n
",
"
reg_req
"
=>
{
"
in
"
=>
[
"
gp
",
"
gp
",
"
gp
",
"
gp
",
"
none
"
],
"
out
"
=>
[
"
in_r3
"
]
},
"
reg_req
"
=>
{
"
in
"
=>
[
"
gp
",
"
gp
",
"
gp
",
"
gp
",
"
none
"
],
"
out
"
=>
[
"
in_r3
!in_r4
"
]
},
"
emit
"
=>
'
. add %ia32_emit_binop\t\t\t/* Add(%A1, %A2) -> %D1 */
'
},
...
...
@@ -159,7 +159,7 @@ $arch = "ia32";
"
irn_flags
"
=>
"
A
",
"
comment
"
=>
"
construct Mul: Mul(a, b) = Mul(b, a) = a * b
",
"
cmp_attr
"
=>
"
return ia32_compare_immop_attr(attr_a, attr_b);
\n
",
"
reg_req
"
=>
{
"
in
"
=>
[
"
gp
",
"
gp
",
"
gp
",
"
gp
",
"
none
"
],
"
out
"
=>
[
"
in_r3
"
]
},
"
reg_req
"
=>
{
"
in
"
=>
[
"
gp
",
"
gp
",
"
gp
",
"
gp
",
"
none
"
],
"
out
"
=>
[
"
in_r3
!in_r4
"
]
},
"
emit
"
=>
'
. imul %ia32_emit_binop\t\t\t/* Mul(%A1, %A2) -> %D1 */
'
},
...
...
@@ -175,7 +175,7 @@ $arch = "ia32";
"
irn_flags
"
=>
"
R
",
"
comment
"
=>
"
construct And: And(a, b) = And(b, a) = a AND b
",
"
cmp_attr
"
=>
"
return ia32_compare_immop_attr(attr_a, attr_b);
\n
",
"
reg_req
"
=>
{
"
in
"
=>
[
"
gp
",
"
gp
",
"
gp
",
"
gp
",
"
none
"
],
"
out
"
=>
[
"
in_r3
"
]
},
"
reg_req
"
=>
{
"
in
"
=>
[
"
gp
",
"
gp
",
"
gp
",
"
gp
",
"
none
"
],
"
out
"
=>
[
"
in_r3
!in_r4
"
]
},
"
emit
"
=>
'
. and %ia32_emit_binop\t\t\t/* And(%A1, %A2) -> %D1 */
'
},
...
...
@@ -183,7 +183,7 @@ $arch = "ia32";
"
irn_flags
"
=>
"
R
",
"
comment
"
=>
"
construct Or: Or(a, b) = Or(b, a) = a OR b
",
"
cmp_attr
"
=>
"
return ia32_compare_immop_attr(attr_a, attr_b);
\n
",
"
reg_req
"
=>
{
"
in
"
=>
[
"
gp
",
"
gp
",
"
gp
",
"
gp
",
"
none
"
],
"
out
"
=>
[
"
in_r3
"
]
},
"
reg_req
"
=>
{
"
in
"
=>
[
"
gp
",
"
gp
",
"
gp
",
"
gp
",
"
none
"
],
"
out
"
=>
[
"
in_r3
!in_r4
"
]
},
"
emit
"
=>
'
. or %ia32_emit_binop\t\t\t/* Or(%A1, %A2) -> %D1 */
'
},
...
...
@@ -191,7 +191,7 @@ $arch = "ia32";
"
irn_flags
"
=>
"
R
",
"
comment
"
=>
"
construct Eor: Eor(a, b) = Eor(b, a) = a EOR b
",
"
cmp_attr
"
=>
"
return ia32_compare_immop_attr(attr_a, attr_b);
\n
",
"
reg_req
"
=>
{
"
in
"
=>
[
"
gp
",
"
gp
",
"
gp
",
"
gp
",
"
none
"
],
"
out
"
=>
[
"
in_r3
"
]
},
"
reg_req
"
=>
{
"
in
"
=>
[
"
gp
",
"
gp
",
"
gp
",
"
gp
",
"
none
"
],
"
out
"
=>
[
"
in_r3
!in_r4
"
]
},
"
emit
"
=>
'
. xor %ia32_emit_binop\t\t\t/* Xor(%A1, %A2) -> %D1 */
'
},
...
...
@@ -228,7 +228,7 @@ $arch = "ia32";
"
CMov
"
=>
{
"
irn_flags
"
=>
"
R
",
"
comment
"
=>
"
construct Mux: Mux(sel, a, b) == sel ? a : b
",
"
reg_req
"
=>
{
"
in
"
=>
[
"
gp
",
"
gp
",
"
gp
"
],
"
out
"
=>
[
"
in_r2
"
]
},
"
reg_req
"
=>
{
"
in
"
=>
[
"
gp
",
"
gp
",
"
gp
"
],
"
out
"
=>
[
"
in_r2
!in_r3
"
]
},
"
emit
"
=>
'
. cmp %S1, 0\t\t\t/* compare Sel for CMov (%A2, %A3) */
. cmovne %D1, %S3\t\t\t/* sel == true -> return %S3 */
...
...
@@ -241,7 +241,7 @@ $arch = "ia32";
"
irn_flags
"
=>
"
R
",
"
comment
"
=>
"
construct Sub: Sub(a, b) = a - b
",
"
cmp_attr
"
=>
"
return ia32_compare_immop_attr(attr_a, attr_b);
\n
",
"
reg_req
"
=>
{
"
in
"
=>
[
"
gp
",
"
gp
",
"
gp
",
"
gp
",
"
none
"
],
"
out
"
=>
[
"
in_r3
"
]
},
"
reg_req
"
=>
{
"
in
"
=>
[
"
gp
",
"
gp
",
"
gp
",
"
gp
",
"
none
"
],
"
out
"
=>
[
"
in_r3
!in_r4
"
]
},
"
emit
"
=>
'
. sub %ia32_emit_binop\t\t\t/* Sub(%A1, %A2) -> %D1 */
'
},
...
...
@@ -263,7 +263,7 @@ $arch = "ia32";
"
irn_flags
"
=>
"
R
",
"
comment
"
=>
"
construct Shl: Shl(a, b) = a << b
",
"
cmp_attr
"
=>
"
return ia32_compare_immop_attr(attr_a, attr_b);
\n
",
"
reg_req
"
=>
{
"
in
"
=>
[
"
gp
",
"
gp
",
"
gp
",
"
ecx
",
"
none
"
],
"
out
"
=>
[
"
in_r3
"
]
},
"
reg_req
"
=>
{
"
in
"
=>
[
"
gp
",
"
gp
",
"
gp
",
"
ecx
",
"
none
"
],
"
out
"
=>
[
"
in_r3
!in_r4
"
]
},
"
emit
"
=>
'
. shl %ia32_emit_binop\t\t\t/* Shl(%A1, %A2) -> %D1 */
'
},
...
...
@@ -271,7 +271,7 @@ $arch = "ia32";
"
irn_flags
"
=>
"
R
",
"
comment
"
=>
"
construct Shr: Shr(a, b) = a >> b
",
"
cmp_attr
"
=>
"
return ia32_compare_immop_attr(attr_a, attr_b);
\n
",
"
reg_req
"
=>
{
"
in
"
=>
[
"
gp
",
"
gp
",
"
gp
",
"
ecx
",
"
none
"
],
"
out
"
=>
[
"
in_r3
"
]
},
"
reg_req
"
=>
{
"
in
"
=>
[
"
gp
",
"
gp
",
"
gp
",
"
ecx
",
"
none
"
],
"
out
"
=>
[
"
in_r3
!in_r4
"
]
},
"
emit
"
=>
'
. shr %ia32_emit_binop\t\t\t/* Shr(%A1, %A2) -> %D1 */
'
},
...
...
@@ -279,7 +279,7 @@ $arch = "ia32";
"
irn_flags
"
=>
"
R
",
"
comment
"
=>
"
construct Shrs: Shrs(a, b) = a >> b
",
"
cmp_attr
"
=>
"
return ia32_compare_immop_attr(attr_a, attr_b);
\n
",
"
reg_req
"
=>
{
"
in
"
=>
[
"
gp
",
"
gp
",
"
gp
",
"
ecx
",
"
none
"
],
"
out
"
=>
[
"
in_r3
"
]
},
"
reg_req
"
=>
{
"
in
"
=>
[
"
gp
",
"
gp
",
"
gp
",
"
ecx
",
"
none
"
],
"
out
"
=>
[
"
in_r3
!in_r4
"
]
},
"
emit
"
=>
'
. sar %ia32_emit_binop\t\t\t/* Shrs(%A1, %A2) -> %D1 */
'
},
...
...
@@ -287,7 +287,7 @@ $arch = "ia32";
"
irn_flags
"
=>
"
R
",
"
comment
"
=>
"
construct RotR: RotR(a, b) = a ROTR b
",
"
cmp_attr
"
=>
"
return ia32_compare_immop_attr(attr_a, attr_b);
\n
",
"
reg_req
"
=>
{
"
in
"
=>
[
"
gp
",
"
gp
",
"
gp
",
"
ecx
",
"
none
"
],
"
out
"
=>
[
"
in_r3
"
]
},
"
reg_req
"
=>
{
"
in
"
=>
[
"
gp
",
"
gp
",
"
gp
",
"
ecx
",
"
none
"
],
"
out
"
=>
[
"
in_r3
!in_r4
"
]
},
"
emit
"
=>
'
. ror %ia32_emit_binop\t\t\t/* RotR(%A1, %A2) -> %D1 */
'
},
...
...
@@ -295,7 +295,7 @@ $arch = "ia32";
"
irn_flags
"
=>
"
R
",
"
comment
"
=>
"
construct RotL: RotL(a, b) = a ROTL b
",
"
cmp_attr
"
=>
"
return ia32_compare_immop_attr(attr_a, attr_b);
\n
",
"
reg_req
"
=>
{
"
in
"
=>
[
"
gp
",
"
gp
",
"
gp
",
"
ecx
",
"
none
"
],
"
out
"
=>
[
"
in_r3
"
]
},
"
reg_req
"
=>
{
"
in
"
=>
[
"
gp
",
"
gp
",
"
gp
",
"
ecx
",
"
none
"
],
"
out
"
=>
[
"
in_r3
!in_r4
"
]
},
"
emit
"
=>
'
. rol %ia32_emit_binop\t\t\t/* RotL(%A1, %A2) -> %D1 */
'
},
...
...
@@ -421,7 +421,7 @@ $arch = "ia32";
"
irn_flags
"
=>
"
R
",
"
comment
"
=>
"
construct SSE Add: Add(a, b) = Add(b, a) = a + b
",
"
cmp_attr
"
=>
"
return ia32_compare_immop_attr(attr_a, attr_b);
\n
",
"
reg_req
"
=>
{
"
in
"
=>
[
"
gp
",
"
gp
",
"
fp
",
"
fp
",
"
none
"
],
"
out
"
=>
[
"
in_r3
"
]
},
"
reg_req
"
=>
{
"
in
"
=>
[
"
gp
",
"
gp
",
"
fp
",
"
fp
",
"
none
"
],
"
out
"
=>
[
"
in_r3
!in_r4
"
]
},
"
emit
"
=>
'
. adds%M %ia32_emit_binop\t\t\t/* SSE Add(%A1, %A2) -> %D1 */
'
},
...
...
@@ -429,7 +429,7 @@ $arch = "ia32";
"
irn_flags
"
=>
"
R
",
"
comment
"
=>
"
construct SSE Mul: Mul(a, b) = Mul(b, a) = a * b
",
"
cmp_attr
"
=>
"
return ia32_compare_immop_attr(attr_a, attr_b);
\n
",
"
reg_req
"
=>
{
"
in
"
=>
[
"
gp
",
"
gp
",
"
fp
",
"
fp
",
"
none
"
],
"
out
"
=>
[
"
in_r3
"
]
},
"
reg_req
"
=>
{
"
in
"
=>
[
"
gp
",
"
gp
",
"
fp
",
"
fp
",
"
none
"
],
"
out
"
=>
[
"
in_r3
!in_r4
"
]
},
"
emit
"
=>
'
. muls%M %ia32_emit_binop\t\t\t/* SSE Mul(%A1, %A2) -> %D1 */
'
},
...
...
@@ -437,7 +437,7 @@ $arch = "ia32";
"
irn_flags
"
=>
"
R
",
"
comment
"
=>
"
construct SSE Max: Max(a, b) = Max(b, a) = a > b ? a : b
",
"
cmp_attr
"
=>
"
return ia32_compare_immop_attr(attr_a, attr_b);
\n
",
"
reg_req
"
=>
{
"
in
"
=>
[
"
gp
",
"
gp
",
"
fp
",
"
fp
",
"
none
"
],
"
out
"
=>
[
"
in_r3
"
]
},
"
reg_req
"
=>
{
"
in
"
=>
[
"
gp
",
"
gp
",
"
fp
",
"
fp
",
"
none
"
],
"
out
"
=>
[
"
in_r3
!in_r4
"
]
},
"
emit
"
=>
'
. maxs%M %ia32_emit_binop\t\t\t/* SSE Max(%A1, %A2) -> %D1 */
'
},
...
...
@@ -445,7 +445,7 @@ $arch = "ia32";
"
irn_flags
"
=>
"
R
",
"
comment
"
=>
"
construct SSE Min: Min(a, b) = Min(b, a) = a < b ? a : b
",
"
cmp_attr
"
=>
"
return ia32_compare_immop_attr(attr_a, attr_b);
\n
",
"
reg_req
"
=>
{
"
in
"
=>
[
"
gp
",
"
gp
",
"
fp
",
"
fp
",
"
none
"
],
"
out
"
=>
[
"
in_r3
"
]
},
"
reg_req
"
=>
{
"
in
"
=>
[
"
gp
",
"
gp
",
"
fp
",
"
fp
",
"
none
"
],
"
out
"
=>
[
"
in_r3
!in_r4
"
]
},
"
emit
"
=>
'
. mins%M %ia32_emit_binop\t\t\t/* SSE Min(%A1, %A2) -> %D1 */
'
},
...
...
@@ -453,7 +453,7 @@ $arch = "ia32";
"
irn_flags
"
=>
"
R
",
"
comment
"
=>
"
construct SSE And: And(a, b) = a AND b
",
"
cmp_attr
"
=>
"
return ia32_compare_immop_attr(attr_a, attr_b);
\n
",
"
reg_req
"
=>
{
"
in
"
=>
[
"
gp
",
"
gp
",
"
fp
",
"
fp
",
"
none
"
],
"
out
"
=>
[
"
in_r3
"
]
},
"
reg_req
"
=>
{
"
in
"
=>
[
"
gp
",
"
gp
",
"
fp
",
"
fp
",
"
none
"
],
"
out
"
=>
[
"
in_r3
!in_r4
"
]
},
"
emit
"
=>
'
. andp%M %ia32_emit_binop\t\t\t/* SSE And(%A3, %A4) -> %D1 */
'
},
...
...
@@ -461,7 +461,7 @@ $arch = "ia32";
"
irn_flags
"
=>
"
R
",
"
comment
"
=>
"
construct SSE Or: Or(a, b) = a OR b
",
"
cmp_attr
"
=>
"
return ia32_compare_immop_attr(attr_a, attr_b);
\n
",
"
reg_req
"
=>
{
"
in
"
=>
[
"
gp
",
"
gp
",
"
fp
",
"
fp
",
"
none
"
],
"
out
"
=>
[
"
in_r3
"
]
},
"
reg_req
"
=>
{
"
in
"
=>
[
"
gp
",
"
gp
",
"
fp
",
"
fp
",
"
none
"
],
"
out
"
=>
[
"
in_r3
!in_r4
"
]
},
"
emit
"
=>
'
. orp%M %ia32_emit_binop\t\t\t/* SSE Or(%A3, %A4) -> %D1 */
'
},
...
...
@@ -469,7 +469,7 @@ $arch = "ia32";
"
irn_flags
"
=>
"
R
",
"
comment
"
=>
"
construct SSE Eor: Eor(a, b) = a XOR b
",
"
cmp_attr
"
=>
"
return ia32_compare_immop_attr(attr_a, attr_b);
\n
",
"
reg_req
"
=>
{
"
in
"
=>
[
"
gp
",
"
gp
",
"
fp
",
"
fp
",
"
none
"
],
"
out
"
=>
[
"
in_r3
"
]
},
"
reg_req
"
=>
{
"
in
"
=>
[
"
gp
",
"
gp
",
"
fp
",
"
fp
",
"
none
"
],
"
out
"
=>
[
"
in_r3
!in_r4
"
]
},
"
emit
"
=>
'
. xorp%M %ia32_emit_binop\t\t\t/* SSE Xor(%A3, %A4) -> %D1 */
'
},
...
...
@@ -479,7 +479,7 @@ $arch = "ia32";
"
irn_flags
"
=>
"
R
",
"
comment
"
=>
"
construct SSE Sub: Sub(a, b) = a - b
",
"
cmp_attr
"
=>
"
return ia32_compare_immop_attr(attr_a, attr_b);
\n
",
"
reg_req
"
=>
{
"
in
"
=>
[
"
gp
",
"
gp
",
"
fp
",
"
fp
",
"
none
"
],
"
out
"
=>
[
"
in_r3
"
]
},
"
reg_req
"
=>
{
"
in
"
=>
[
"
gp
",
"
gp
",
"
fp
",
"
fp
",
"
none
"
],
"
out
"
=>
[
"
in_r3
!in_r4
"
]
},
"
emit
"
=>
'
. subs%M %ia32_emit_binop\t\t\t/* SSE Sub(%A1, %A2) -> %D1 */
'
},
...
...
@@ -487,7 +487,7 @@ $arch = "ia32";
"
irn_flags
"
=>
"
R
",
"
comment
"
=>
"
construct SSE Div: Div(a, b) = a / b
",
"
cmp_attr
"
=>
"
return ia32_compare_immop_attr(attr_a, attr_b);
\n
",
"
reg_req
"
=>
{
"
in
"
=>
[
"
gp
",
"
gp
",
"
fp
",
"
fp
",
"
none
"
],
"
out
"
=>
[
"
in_r3
"
]
},
"
reg_req
"
=>
{
"
in
"
=>
[
"
gp
",
"
gp
",
"
fp
",
"
fp
",
"
none
"
],
"
out
"
=>
[
"
in_r3
!in_r4
"
]
},
"
emit
"
=>
'
. divs%M %ia32_emit_binop\t\t\t/* SSE Div(%A1, %A2) -> %D1 */
'
},
...
...
Write
Preview
Supports
Markdown
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