9fans - fans of the OS Plan 9 from Bell Labs
 help / color / mirror / Atom feed
* [9fans] 8c vlong bug
@ 2009-09-01  1:47 erik quanstrom
  2009-09-01  1:51 ` Bruce Ellis
  0 siblings, 1 reply; 4+ messages in thread
From: erik quanstrom @ 2009-09-01  1:47 UTC (permalink / raw)
  To: 9fans

temporarly out of time on this one.  it appears
from the assembly output that 8c multiplies by
0 and not 1 when computing z a second time.
nonetheless, i haven't yet seen the problem.

#include <u.h>
#include <libc.h>

void
main(void)
{
	int three, one;
	uvlong twelve, z;

	one = 1;
	three = 3;
	twelve = 12;

	z = one*(twelve - three);
	print("z = %llud\n", z);

	z = (twelve - three) * one;
	print("z = %llud\n", z);

	exits(0);
}

output:

z = 9
z = 0

- erik



^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [9fans] 8c vlong bug
  2009-09-01  1:47 [9fans] 8c vlong bug erik quanstrom
@ 2009-09-01  1:51 ` Bruce Ellis
  2009-09-01  3:10   ` Russ Cox
  0 siblings, 1 reply; 4+ messages in thread
From: Bruce Ellis @ 2009-09-01  1:51 UTC (permalink / raw)
  To: Fans of the OS Plan 9 from Bell Labs

if it's my fault i'll fix it. it did screw up mod in a subtle way but
that's been fixed.

brucee

On Tue, Sep 1, 2009 at 11:47 AM, erik quanstrom<quanstro@quanstro.net> wrote:
> temporarly out of time on this one.  it appears
> from the assembly output that 8c multiplies by
> 0 and not 1 when computing z a second time.
> nonetheless, i haven't yet seen the problem.
>
> #include <u.h>
> #include <libc.h>
>
> void
> main(void)
> {
>        int three, one;
>        uvlong twelve, z;
>
>        one = 1;
>        three = 3;
>        twelve = 12;
>
>        z = one*(twelve - three);
>        print("z = %llud\n", z);
>
>        z = (twelve - three) * one;
>        print("z = %llud\n", z);
>
>        exits(0);
> }
>
> output:
>
> z = 9
> z = 0
>
> - erik
>
>



^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [9fans] 8c vlong bug
  2009-09-01  1:51 ` Bruce Ellis
@ 2009-09-01  3:10   ` Russ Cox
  2009-09-01  3:24     ` Bruce Ellis
  0 siblings, 1 reply; 4+ messages in thread
From: Russ Cox @ 2009-09-01  3:10 UTC (permalink / raw)
  To: Fans of the OS Plan 9 from Bell Labs

> temporarly out of time on this one.  it appears
> from the assembly output that 8c multiplies by
> 0 and not 1 when computing z a second time.
> nonetheless, i haven't yet seen the problem.

not quite that simple.
it's a register allocation
(really register management) bug.

On Mon, Aug 31, 2009 at 6:51 PM, Bruce Ellis<bruce.ellis@gmail.com> wrote:
> if it's my fault i'll fix it. it did screw up mod in a subtle way but
> that's been fixed.

it looks like the cgen64 multiply case is
not managing the registers correctly
when AX is not where it expects.
more details for you:

int three = 3;
int one = 1;
uvlong twelve = 12;

/* ok */
uvlong
mul1(void)
{
	return one * (twelve - three);
}

TEXT	mul1+0(SB),0,$12
	MOVL	three+0(SB),AX
	MOVL	AX,CX
	SARL	$31,CX
	// three is now in CX:AX

	LEAL	twelve+0(SB),DX
	MOVL	(DX),BX
	SUBL	AX,BX
	MOVL	4(DX),AX
	SBBL	CX,AX
	// twelve - three is now in AX:BX
	MOVL	AX,CX
	// twelve - three is now in CX:BX

	MOVL	one+0(SB),AX
	MOVL	AX,DX
	SARL	$31,DX
	// one is now in DX:AX

	// 64-bit multiply CX:BX * DX:AX -> DX:AX
	MOVL	CX,BP
	ORL	DX,BP
	CMPL	BP,$0
	JNE	,3(PC)
	MULL	BX,
	JMP	,8(PC)
	IMULL	BX,DX
	MOVL	AX,BP
	IMULL	CX,BP
	ADDL	DX,BP
	MOVL	BX,DX
	MULL	DX,
	ADDL	BP,DX

	MOVL	.ret+0(FP),CX	// probably LEAL
	MOVL	AX,(CX)
	MOVL	DX,4(CX)
	RET	,
	RET	,

vs

/* not ok */

uvlong
mul2(void)
{
	return (twelve - three) * one;
}

TEXT	mul2+0(SB),0,$12
	MOVL	one+0(SB),AX
	MOVL	AX,CX
	SARL	$31,CX
	MOVL	AX,BX
	// one is now in CX:BX

	MOVL	three+0(SB),AX
	MOVL	AX,DX
	SARL	$31,DX
	// three is now in DX:AX

	LEAL	twelve+0(SB),BP
	MOVL	(BP),SI
	SUBL	AX,SI
	MOVL	4(BP),AX
	SBBL	DX,AX
	// twelve - three is now in AX:SI

	// 64-bit multiply CX:BX * AX:SI
	// saving AX and DX so they can be reused.
	// DX doesn't even need saving.
	MOVL	AX,.safe+-4(SP)
	MOVL	DX,.safe+-8(SP)
	MOVL	SI,DX

	// 8c is very confused at this point.
	// it is using AX for multiple purposes.
	MOVL	CX,AX
	ORL	SI,AX
	CMPL	AX,$0
	JNE	,4(PC)
	MOVL	BX,AX
	MULL	AX,
	JMP	,7(PC)
	IMULL	BX,DX
	IMULL	CX,AX
	ADDL	DX,AX
	MOVL	BX,DX
	MULL	DX,
	ADDL	AX,DX

	// restore old AX DX now that multiply is over.
	// (forgot that multiply left result in DX:AX)
	MOVL	.safe+-4(SP),AX
	MOVL	.safe+-8(SP),DX

	MOVL	.ret+0(FP),CX	// probably LEAL
	MOVL	AX,(CX)
	MOVL	DX,4(CX)
	RET	,


^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [9fans] 8c vlong bug
  2009-09-01  3:10   ` Russ Cox
@ 2009-09-01  3:24     ` Bruce Ellis
  0 siblings, 0 replies; 4+ messages in thread
From: Bruce Ellis @ 2009-09-01  3:24 UTC (permalink / raw)
  To: Fans of the OS Plan 9 from Bell Labs

will fix.

On Tue, Sep 1, 2009 at 1:10 PM, Russ Cox<rsc@swtch.com> wrote:
>> temporarly out of time on this one.  it appears
>> from the assembly output that 8c multiplies by
>> 0 and not 1 when computing z a second time.
>> nonetheless, i haven't yet seen the problem.
>
> not quite that simple.
> it's a register allocation
> (really register management) bug.
>
> On Mon, Aug 31, 2009 at 6:51 PM, Bruce Ellis<bruce.ellis@gmail.com> wrote:
>> if it's my fault i'll fix it. it did screw up mod in a subtle way but
>> that's been fixed.
>
> it looks like the cgen64 multiply case is
> not managing the registers correctly
> when AX is not where it expects.
> more details for you:
>
> int three = 3;
> int one = 1;
> uvlong twelve = 12;
>
> /* ok */
> uvlong
> mul1(void)
> {
>        return one * (twelve - three);
> }
>
> TEXT    mul1+0(SB),0,$12
>        MOVL    three+0(SB),AX
>        MOVL    AX,CX
>        SARL    $31,CX
>        // three is now in CX:AX
>
>        LEAL    twelve+0(SB),DX
>        MOVL    (DX),BX
>        SUBL    AX,BX
>        MOVL    4(DX),AX
>        SBBL    CX,AX
>        // twelve - three is now in AX:BX
>        MOVL    AX,CX
>        // twelve - three is now in CX:BX
>
>        MOVL    one+0(SB),AX
>        MOVL    AX,DX
>        SARL    $31,DX
>        // one is now in DX:AX
>
>        // 64-bit multiply CX:BX * DX:AX -> DX:AX
>        MOVL    CX,BP
>        ORL     DX,BP
>        CMPL    BP,$0
>        JNE     ,3(PC)
>        MULL    BX,
>        JMP     ,8(PC)
>        IMULL   BX,DX
>        MOVL    AX,BP
>        IMULL   CX,BP
>        ADDL    DX,BP
>        MOVL    BX,DX
>        MULL    DX,
>        ADDL    BP,DX
>
>        MOVL    .ret+0(FP),CX   // probably LEAL
>        MOVL    AX,(CX)
>        MOVL    DX,4(CX)
>        RET     ,
>        RET     ,
>
> vs
>
> /* not ok */
>
> uvlong
> mul2(void)
> {
>        return (twelve - three) * one;
> }
>
> TEXT    mul2+0(SB),0,$12
>        MOVL    one+0(SB),AX
>        MOVL    AX,CX
>        SARL    $31,CX
>        MOVL    AX,BX
>        // one is now in CX:BX
>
>        MOVL    three+0(SB),AX
>        MOVL    AX,DX
>        SARL    $31,DX
>        // three is now in DX:AX
>
>        LEAL    twelve+0(SB),BP
>        MOVL    (BP),SI
>        SUBL    AX,SI
>        MOVL    4(BP),AX
>        SBBL    DX,AX
>        // twelve - three is now in AX:SI
>
>        // 64-bit multiply CX:BX * AX:SI
>        // saving AX and DX so they can be reused.
>        // DX doesn't even need saving.
>        MOVL    AX,.safe+-4(SP)
>        MOVL    DX,.safe+-8(SP)
>        MOVL    SI,DX
>
>        // 8c is very confused at this point.
>        // it is using AX for multiple purposes.
>        MOVL    CX,AX
>        ORL     SI,AX
>        CMPL    AX,$0
>        JNE     ,4(PC)
>        MOVL    BX,AX
>        MULL    AX,
>        JMP     ,7(PC)
>        IMULL   BX,DX
>        IMULL   CX,AX
>        ADDL    DX,AX
>        MOVL    BX,DX
>        MULL    DX,
>        ADDL    AX,DX
>
>        // restore old AX DX now that multiply is over.
>        // (forgot that multiply left result in DX:AX)
>        MOVL    .safe+-4(SP),AX
>        MOVL    .safe+-8(SP),DX
>
>        MOVL    .ret+0(FP),CX   // probably LEAL
>        MOVL    AX,(CX)
>        MOVL    DX,4(CX)
>        RET     ,
>
>



^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2009-09-01  3:24 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2009-09-01  1:47 [9fans] 8c vlong bug erik quanstrom
2009-09-01  1:51 ` Bruce Ellis
2009-09-01  3:10   ` Russ Cox
2009-09-01  3:24     ` Bruce Ellis

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).