Related articles |
---|
Modeling the condition code register in register allocation roland.leissa@googlemail.com (=?ISO-8859-1?Q?Roland_Lei=DFa?=) (2009-01-09) |
Re: Modeling the condition code register in register allocation nightmie@gmail.com (nightmie) (2009-01-11) |
Re: Modeling the condition code register in register allocation cdodd@acm.org (Chris Dodd) (2009-01-11) |
Re: Modeling the condition code register in register allocation bartc@freeuk.com (Bartc) (2009-01-13) |
Re: Modeling the condition code register in register allocation roland.leissa@googlemail.com (=?ISO-8859-1?Q?Roland_Lei=DFa?=) (2009-01-13) |
From: | "Bartc" <bartc@freeuk.com> |
Newsgroups: | comp.compilers |
Date: | Tue, 13 Jan 2009 12:28:21 GMT |
Organization: | Compilers Central |
References: | 09-01-012 |
Keywords: | code, optimize |
Posted-Date: | 13 Jan 2009 07:32:48 EST |
"Roland Lei_a" <roland.leissa@googlemail.com> wrote in message
news:09-01-012@comp.compilers...
> Hello everyone,
>
> I am currently writing a small compiler as a hobby project. My
> register allocator is basicly working but I have no idea how I could
> model the condition code register (rflags) properly. AMD64 is my
> current backend. My intermediate representation (SSA based) handles
> comparisons and conditional jumps like this at the moment:
>
> a = b + c
> d = a > 10
> IF d GOTO label1 ELSE GOTO label2
> label2
> ...
> label1
> ...
Not quite sure what this represents; perhaps your original source is
something like:
a=b+c
if a>10 then ... else ...
And your intermediate representation is as above?
I don't know if my suggestion is going to be that useful, but when I did
this, I made an expression such as this:
a>10
/when used in the context of a conditional expression/, yield a new type
that I called 'Cond' rather than an integer or bool. Such a Cond value was
implicity stored in a special machine register, and had a condition code
attached to it (one of the 16 x86 codes). A ">" operator would have the
condition code G or A (depending on signed/unsigned).
In my compiler, when I processed an expression, there was usually some
operation to be applied to the result. In the case of a conditional
expression such as inside If...Then, this was JumpTrue or JumpFalse, which
tested whether the prior condition code was true or not. So the result of
compiling:
if a > 10 then
e:=f
might be:
Load R,(a)
Cmp R,10 ;or Cmp (a),10
JumpF G,L1 ;becomes jle L1 in x86
Load R,(f)
Store (e),R
L1:
(My method didn't work too well on 'If a Then'; I needed to apply a
conversion from 'a' (an int) to type Cond, which might result in Cmp (a),0).
> Some ideas or related papers?
Oh, you want to do it properly? :-)
--
Bartc
Return to the
comp.compilers page.
Search the
comp.compilers archives again.