On Sun, Sep 10, 2000 at 10:38:53PM +0100, Philip Blundell wrote:
> >/tmp/ccqBnxST.s: Assembler messages:
> >/tmp/ccqBnxST.s:8196: Warning: destination register same as write-back base
> >
> >This would be a bad thing. This would appear to be the bad thing I had
> >before with the previous (debian supplied) compiler. How (where) do I go
> >about working out if it's a known compiler bug?
> 
> What's the offending line of the file?  I just sent Scott a patch this 
> morning 
> for some missing constraints on post-inc `str' peepholes; it sounds like you 
> might have run into an analogous situation with `ldr', though I thought they 
> were all covered already.

        ldr     r3, [r3], #-4

in

Perl_pp_entersub:
        @ args = 0, pretend = 0, frame = 40
        @ frame_needed = 1, current_function_anonymous_args = 0
        mov     ip, sp
        stmfd   sp!, {r4, r5, r6, r7, r8, r9, sl, fp, ip, lr, pc}
        sub     fp, ip, #4
        sub     sp, sp, #40
        ldr     r3, .L1502
        ldr     r3, [r3, #0]
        ldr     r3, [r3], #-4
        str     r3, [fp, #-60]
        str     r3, [fp, #-56]
        ldr     r3, .L1502+4
        ldr     r3, [r3, #0]
        ldrb    r3, [r3, #20]   @ zero_extendqisi2
        mov     r3, r3, lsr #6
        and     r3, r3, #1
        str     r3, [fp, #-68]
        ldr     r3, [fp, #-56]
        cmp     r3, #0
        beq     .L1497
        ldr     r3, [fp, #-56]
        ldrb    r3, [r3, #8]    @ zero_extendqisi2

[snip]

.L1502:
        .word   PL_stack_sp
        .word   PL_op
        .word   PL_sv_yes
        .word   PL_stack_base
        .word   PL_markstack_ptr
        .word   PL_no_usym
        .word   .LC41
        .word   PL_no_symref
        .word   PL_amagic_generation
        .word   PL_sv_undef
        .word   .LC4
        .word   PL_tmps_floor
        .word   PL_tmps_ix
        .word   .LC42
        .word   .LC43
        .word   .LC40



OP * Perl_pp_entersub (void ) 
{
    register SV **sp = PL_stack_sp ; SV *sv = (*sp--)  ;
    GV *gv;
    HV *stash;
    register CV *cv;
    register PERL_CONTEXT *cx;
    I32 gimme;
    char  hasargs = (PL_op->op_flags & 64 ) != 0;

    if (!sv)
        return Perl_die (  "Not a CODE reference");



it looks like it's that *sp--;


-O2 assembler looks like this:

Perl_pp_entersub:
        @ args = 0, pretend = 0, frame = 44
        @ frame_needed = 1, current_function_anonymous_args = 0
        mov     ip, sp
        stmfd   sp!, {r4, r5, r6, r7, r8, r9, sl, fp, ip, lr, pc}
        ldr     r0, .L1488
        sub     sp, sp, #44
        ldr     r1, [r0, #0]
        sub     fp, ip, #4
        ldr     ip, [r1], #-4
        str     r1, [fp, #-60]
        str     ip, [fp, #-56]
        ldr     r1, .L1488+4
        ldr     r2, [r1, #0]
        ldrb    r3, [r2, #20]   @ zero_extendqisi2
        cmp     ip, #0
        mov     r3, r3, lsr #6
        and     r3, r3, #1
        str     r3, [fp, #-68]
        beq     .L1483
        ldrb    r3, [ip, #8]    @ zero_extendqisi2

.L1488:
        .word   PL_stack_sp
        .word   PL_op
        .word   PL_sv_yes
        .word   PL_markstack_ptr
        .word   PL_stack_base
        .word   PL_no_usym


which I think is correct (r1 is sp, ip is sv)
and all my SEGVs seem to be caused by PL_stack_sp[1] containing something
bogus (ie odd number < 2048) rather than a deferenceable pointer.


Having spent a long time staring at the output of the optimiser I'm generally
very impressed - a job well done, thanks.

That was going to be unconditional, but I've just spotted this. Can't:

        str     ip, [fp, #-56]
        ldr     r1, .L1488+4
        ldr     r2, [r1, #0]
        ldrb    r3, [r2, #20]   @ zero_extendqisi2
        cmp     ip, #0

be re-ordered to:

        ldr     r1, .L1488+4
        str     ip, [fp, #-56]
        ldr     r2, [r1, #0]
        cmp     ip, #0
        ldrb    r3, [r2, #20]   @ zero_extendqisi2

?

Nicholas Clark


-- 
To UNSUBSCRIBE, email to [EMAIL PROTECTED]
with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]


Reply via email to