Front page | perl.perl6.internals |
Postings from August 2002
Re: imcc hack for perl6 regexes
From: Leopold Toetsch
August 21, 2002 14:17
Re: imcc hack for perl6 regexes
Message ID: 3D6402EE.firstname.lastname@example.org
Melvin Smith wrote:
> Sean, I'm replying publicly because I'd like to hear other opinions than
> mine, yours, Angel's and Leopold's.
I'll answer here to Melvin's mail, but I'll try to make a summary of all
point's taken in this thread + some more.
> I still prefer infix notation to prefix notation for an intermediate
The current infix notation is fine. It makes intermediate code, and
perl6 IMCC code generation more readable.
Sean (IMHO) is not trying to give it up.
- infix notation (and imcc internals) are currently limited to
4 registers per instruction, so what about:
$S0 = _AV_a1[$I0;$I1;$I2]
(which - with the key patch - is now working in .pasm)
- imcc.y implements currently a very small (but common) subset of
.pasm instructions. Sean was working on rx-ops, so he needed a
solution to get them through imcc, including register allocation,
so his patch is a nice thing to have _arbitrary_ ops in imcc.
- currently, imcc register allocation is br0ken. I tried hard today
to find _some_ of the bugs, but did not succeed finally - til now ;-)
 some internals, as Steve mentioned, such discussions should be more
o in cfg:spill() the branch flags in ->type are not copied ...
emitb( mk_instruction(tmp->fmt, r0, r1, r2, r3, tmp->flags) );
+ instructions[n_instructions - 1]->type = old_instructions[i]->type;
.... so after spilling there was/is only one basic_block.
o symregs->first and ->last are off by one compared to life_info's.
o memory allocation/freeing is a mess:
e.g. it seems that a symreg->fmt get's corrupted
sprintf(buf, "%c%d", reglist[x]->set, reglist[x]->color);
in cfg:try_allocate() helps. (reglist is from my tries = ..graph[x])
I did not succeed finally:
PC=90; OP=108 (set_i_p_ki); ARGS=(I0=2, P0=0x8059068, [I1=0])
Subscript on something that's not an aggregate!
So please, first, let's consider the status quo, not the future.
Above error is from perl6's test 3_2.p6. Simplifying the test by one
line (and thus using less registers, helps aka let it succeed). So the
problem is definitely imcc's register allocation and spilling.
Angel, Melvin, if there are any patches, check them in _early_^Wnow -
> I don't understand why it is so hard to adopt. imcc is supposed to be
> a step closer to higher level languages, which is why I went that way.
No problem here, it is called _intermediate_ ..., which is a worthful
step in code generation, but - as always - there is a but, it should
supply the infrastructure to generate _all_ possible .pasm code.
_SV_s1 = clone $P1
$S3 = _SV_s1
$I4 = 0
rx_advance $S3, $I4, L_rx_fail6
contains imcc language elements (infix) + pure pasm ops, which get
looked up via core.ops aka libparrot.so, but profit from register
> What I have heard is, "Why make imcc use a different syntax, it requires
> people to learn a Parrot assembler _and_ imcc."
Melvin, Sean's patch is not agaist imcc's syntax, it _extends_ the
syntax with badly needed pasm syntax. There a currently 261 basic ops
variating to a total of 844 different ops, why should imcc all implement
_all_ and still permanently changing ops mow.
I personally like imcc's syntax, it's a lot more readable compared to pasm.
> I'm still for what we talked about, where any imcc directive uses a
> leading '.'
> and the rest of the ops are passed through; with the primary exemption
> being those ops like set, add, etc. that have more common infix version
> a = 1
> b = a + 1
So, finally, we all concede :-)
Let's keep the high level infix instructions for the most common ops and
unknown ops should be looked up dynamically. Of course, register
allocation is still done for these.
Thanks for reading til here,