[MLton] power pc "port"

Filip Pizlo pizlo@purdue.edu
Sun, 5 Sep 2004 18:50:17 -0500 (EST)


  This message is in MIME format.  The first part should be readable text,
  while the remaining parts are likely unreadable without MIME-aware tools.
  Send mail to mime@docserver.cac.washington.edu for more info.

--8323328-2047860492-1094428204=:6316
Content-Type: TEXT/PLAIN; CHARSET=US-ASCII
Content-ID: <Pine.LNX.4.21.0409051850121.6316@Bocks.psych.purdue.edu>

Sorry; forgot about the output.  I've included it here.

--
Filip Pizlo
http://bocks.psych.purdue.edu/
pizlo@purdue.edu


On Sun, 5 Sep 2004, Filip Pizlo wrote:

> > Your explanation of what the C standard says makes sense.  What I
> > don't understand is why it would lead to an unexpected result.
> > Suppose that w1 is of type Word8, i.e. unsigned char.  Your
> > explanation says that Word8_neg (w) returns
> > 
> > 	(Word8)(0xFF & (- ((int)w)))
> > 
> > That seems correct to me.
> 
> It leads to an unexpected result when you try to perform a signed
> operation.  For example, consider that an ML program takes the value 1
> with type Int8, negates it, and then divides it by 10 using the quot
> function (this is more-or-less where the fmt function was failing).  
> Let's look at the steps that take place in the C code when run on a
> PowerPC:
> 
> 1) The value 1 gets loaded into a register.  The register contains, in
> binary, the bits 00000000000000000000000000000001.
> 
> 2) The value 1 gets negated.  The register contains, in binary, the bits
> 11111111111111111111111111111111.  This is -1, which is what you
> wanted.
> 
> 3) Then the signed->unsigned conversion happens, and the upper 24 bits get
> zeroed.  Now the register contains 00000000000000000000000011111111.  Note
> that when you look at this as a 32-bit register (which is how the PowerPC
> chip looks at it), you will see the value 255, regardless of whether you
> interpret it as a signed or unsigned value.  This is not what you want.
> 
> 4) Now the quot function gets called, and we do a divw (32-bit division)
> with the denominator being 10.  Divw sees 255/10, and generates 25 as the
> answer.  This is of course wrong, because what you wanted was -1/10, which
> is 0.
> 
> Hence my fix was to make functions that rely on sign (like quot) to first
> perform a sign extension.  This makes the above example work because divw
> all of a sudden sees -1/10, which is what you wanted.
> 
> > Consider the following C program.
> > 
> > ----------------------------------------------------------------------
> > #include <stdio.h>
> > 
> > typedef unsigned char Word8;
> > 
> > Word8 Word8_neg (Word8 w) {
> > 	return -w;
> > }
> > 
> > int main () {
> > 	int i;
> > 	Word8 w1, w2, w3;
> > 
> > 	for (i = 0; i <= 255; ++i) {
> > 		w1 = i;
> > 		w2 = (Word8)(0xFF & (- ((int)w1)));
> >  		w3 = Word8_neg (w1);
> > 		fprintf (stderr, "%d  %d  %d\n", (int)w1, (int)w2, (int)w3);
> > 	}
> > ---------------------------------------------------------------------- 
> >
> > This program produces identical output on my x86, Sparc, and G5
> > machines.  And the output is exactly what I would expect.  What do you
> > see on your G4 machine?
> 
> I've attached the output.
> 
> There are two problems with the test:
> 
> 1) In this test, the compiler has accurate type information.  In this
> sense it is not consistent with what is happening in the MLton backend,
> where a variable of type Word8 may be passed to WordS8_neg, the
> implementation of which (see Word.c) takes a signed char, while its
> declaration as generated by MLton takes an unsigned char.
> 
> 2) This test performs no operations where the sign would actually matter.
> Let's assume that w1 is 1, and the following line of code from your test 
> gets executed:
> 
> >               w2 = (Word8)(0xFF & (- ((int)w1)));
> 
> w2 will now contain 255.  But now imagine that the value in w2 is
> reinterpreted (by way of a function prototype that does not match its
> definition) as a signed char, AFTER being passed as an argument through a
> 32-bit register.  Then imagine that this function performs division.  The
> division will see 255 instead of -1, and you're stuck with an incorrect
> result.
> 
> --
> Filip Pizlo
> http://bocks.psych.purdue.edu/
> pizlo@purdue.edu
> 
> 
> 
> 
> 

--8323328-2047860492-1094428204=:6316
Content-Type: TEXT/PLAIN; CHARSET=US-ASCII; NAME="stephens_test.out"
Content-Transfer-Encoding: BASE64
Content-ID: <Pine.LNX.4.21.0409051850040.6316@Bocks.psych.purdue.edu>
Content-Description: output of Stephen's test program
Content-Disposition: ATTACHMENT; FILENAME="stephens_test.out"

MCAgMCAgMA0KMSAgMjU1ICAyNTUNCjIgIDI1NCAgMjU0DQozICAyNTMgIDI1
Mw0KNCAgMjUyICAyNTINCjUgIDI1MSAgMjUxDQo2ICAyNTAgIDI1MA0KNyAg
MjQ5ICAyNDkNCjggIDI0OCAgMjQ4DQo5ICAyNDcgIDI0Nw0KMTAgIDI0NiAg
MjQ2DQoxMSAgMjQ1ICAyNDUNCjEyICAyNDQgIDI0NA0KMTMgIDI0MyAgMjQz
DQoxNCAgMjQyICAyNDINCjE1ICAyNDEgIDI0MQ0KMTYgIDI0MCAgMjQwDQox
NyAgMjM5ICAyMzkNCjE4ICAyMzggIDIzOA0KMTkgIDIzNyAgMjM3DQoyMCAg
MjM2ICAyMzYNCjIxICAyMzUgIDIzNQ0KMjIgIDIzNCAgMjM0DQoyMyAgMjMz
ICAyMzMNCjI0ICAyMzIgIDIzMg0KMjUgIDIzMSAgMjMxDQoyNiAgMjMwICAy
MzANCjI3ICAyMjkgIDIyOQ0KMjggIDIyOCAgMjI4DQoyOSAgMjI3ICAyMjcN
CjMwICAyMjYgIDIyNg0KMzEgIDIyNSAgMjI1DQozMiAgMjI0ICAyMjQNCjMz
ICAyMjMgIDIyMw0KMzQgIDIyMiAgMjIyDQozNSAgMjIxICAyMjENCjM2ICAy
MjAgIDIyMA0KMzcgIDIxOSAgMjE5DQozOCAgMjE4ICAyMTgNCjM5ICAyMTcg
IDIxNw0KNDAgIDIxNiAgMjE2DQo0MSAgMjE1ICAyMTUNCjQyICAyMTQgIDIx
NA0KNDMgIDIxMyAgMjEzDQo0NCAgMjEyICAyMTINCjQ1ICAyMTEgIDIxMQ0K
NDYgIDIxMCAgMjEwDQo0NyAgMjA5ICAyMDkNCjQ4ICAyMDggIDIwOA0KNDkg
IDIwNyAgMjA3DQo1MCAgMjA2ICAyMDYNCjUxICAyMDUgIDIwNQ0KNTIgIDIw
NCAgMjA0DQo1MyAgMjAzICAyMDMNCjU0ICAyMDIgIDIwMg0KNTUgIDIwMSAg
MjAxDQo1NiAgMjAwICAyMDANCjU3ICAxOTkgIDE5OQ0KNTggIDE5OCAgMTk4
DQo1OSAgMTk3ICAxOTcNCjYwICAxOTYgIDE5Ng0KNjEgIDE5NSAgMTk1DQo2
MiAgMTk0ICAxOTQNCjYzICAxOTMgIDE5Mw0KNjQgIDE5MiAgMTkyDQo2NSAg
MTkxICAxOTENCjY2ICAxOTAgIDE5MA0KNjcgIDE4OSAgMTg5DQo2OCAgMTg4
ICAxODgNCjY5ICAxODcgIDE4Nw0KNzAgIDE4NiAgMTg2DQo3MSAgMTg1ICAx
ODUNCjcyICAxODQgIDE4NA0KNzMgIDE4MyAgMTgzDQo3NCAgMTgyICAxODIN
Cjc1ICAxODEgIDE4MQ0KNzYgIDE4MCAgMTgwDQo3NyAgMTc5ICAxNzkNCjc4
ICAxNzggIDE3OA0KNzkgIDE3NyAgMTc3DQo4MCAgMTc2ICAxNzYNCjgxICAx
NzUgIDE3NQ0KODIgIDE3NCAgMTc0DQo4MyAgMTczICAxNzMNCjg0ICAxNzIg
IDE3Mg0KODUgIDE3MSAgMTcxDQo4NiAgMTcwICAxNzANCjg3ICAxNjkgIDE2
OQ0KODggIDE2OCAgMTY4DQo4OSAgMTY3ICAxNjcNCjkwICAxNjYgIDE2Ng0K
OTEgIDE2NSAgMTY1DQo5MiAgMTY0ICAxNjQNCjkzICAxNjMgIDE2Mw0KOTQg
IDE2MiAgMTYyDQo5NSAgMTYxICAxNjENCjk2ICAxNjAgIDE2MA0KOTcgIDE1
OSAgMTU5DQo5OCAgMTU4ICAxNTgNCjk5ICAxNTcgIDE1Nw0KMTAwICAxNTYg
IDE1Ng0KMTAxICAxNTUgIDE1NQ0KMTAyICAxNTQgIDE1NA0KMTAzICAxNTMg
IDE1Mw0KMTA0ICAxNTIgIDE1Mg0KMTA1ICAxNTEgIDE1MQ0KMTA2ICAxNTAg
IDE1MA0KMTA3ICAxNDkgIDE0OQ0KMTA4ICAxNDggIDE0OA0KMTA5ICAxNDcg
IDE0Nw0KMTEwICAxNDYgIDE0Ng0KMTExICAxNDUgIDE0NQ0KMTEyICAxNDQg
IDE0NA0KMTEzICAxNDMgIDE0Mw0KMTE0ICAxNDIgIDE0Mg0KMTE1ICAxNDEg
IDE0MQ0KMTE2ICAxNDAgIDE0MA0KMTE3ICAxMzkgIDEzOQ0KMTE4ICAxMzgg
IDEzOA0KMTE5ICAxMzcgIDEzNw0KMTIwICAxMzYgIDEzNg0KMTIxICAxMzUg
IDEzNQ0KMTIyICAxMzQgIDEzNA0KMTIzICAxMzMgIDEzMw0KMTI0ICAxMzIg
IDEzMg0KMTI1ICAxMzEgIDEzMQ0KMTI2ICAxMzAgIDEzMA0KMTI3ICAxMjkg
IDEyOQ0KMTI4ICAxMjggIDEyOA0KMTI5ICAxMjcgIDEyNw0KMTMwICAxMjYg
IDEyNg0KMTMxICAxMjUgIDEyNQ0KMTMyICAxMjQgIDEyNA0KMTMzICAxMjMg
IDEyMw0KMTM0ICAxMjIgIDEyMg0KMTM1ICAxMjEgIDEyMQ0KMTM2ICAxMjAg
IDEyMA0KMTM3ICAxMTkgIDExOQ0KMTM4ICAxMTggIDExOA0KMTM5ICAxMTcg
IDExNw0KMTQwICAxMTYgIDExNg0KMTQxICAxMTUgIDExNQ0KMTQyICAxMTQg
IDExNA0KMTQzICAxMTMgIDExMw0KMTQ0ICAxMTIgIDExMg0KMTQ1ICAxMTEg
IDExMQ0KMTQ2ICAxMTAgIDExMA0KMTQ3ICAxMDkgIDEwOQ0KMTQ4ICAxMDgg
IDEwOA0KMTQ5ICAxMDcgIDEwNw0KMTUwICAxMDYgIDEwNg0KMTUxICAxMDUg
IDEwNQ0KMTUyICAxMDQgIDEwNA0KMTUzICAxMDMgIDEwMw0KMTU0ICAxMDIg
IDEwMg0KMTU1ICAxMDEgIDEwMQ0KMTU2ICAxMDAgIDEwMA0KMTU3ICA5OSAg
OTkNCjE1OCAgOTggIDk4DQoxNTkgIDk3ICA5Nw0KMTYwICA5NiAgOTYNCjE2
MSAgOTUgIDk1DQoxNjIgIDk0ICA5NA0KMTYzICA5MyAgOTMNCjE2NCAgOTIg
IDkyDQoxNjUgIDkxICA5MQ0KMTY2ICA5MCAgOTANCjE2NyAgODkgIDg5DQox
NjggIDg4ICA4OA0KMTY5ICA4NyAgODcNCjE3MCAgODYgIDg2DQoxNzEgIDg1
ICA4NQ0KMTcyICA4NCAgODQNCjE3MyAgODMgIDgzDQoxNzQgIDgyICA4Mg0K
MTc1ICA4MSAgODENCjE3NiAgODAgIDgwDQoxNzcgIDc5ICA3OQ0KMTc4ICA3
OCAgNzgNCjE3OSAgNzcgIDc3DQoxODAgIDc2ICA3Ng0KMTgxICA3NSAgNzUN
CjE4MiAgNzQgIDc0DQoxODMgIDczICA3Mw0KMTg0ICA3MiAgNzINCjE4NSAg
NzEgIDcxDQoxODYgIDcwICA3MA0KMTg3ICA2OSAgNjkNCjE4OCAgNjggIDY4
DQoxODkgIDY3ICA2Nw0KMTkwICA2NiAgNjYNCjE5MSAgNjUgIDY1DQoxOTIg
IDY0ICA2NA0KMTkzICA2MyAgNjMNCjE5NCAgNjIgIDYyDQoxOTUgIDYxICA2
MQ0KMTk2ICA2MCAgNjANCjE5NyAgNTkgIDU5DQoxOTggIDU4ICA1OA0KMTk5
ICA1NyAgNTcNCjIwMCAgNTYgIDU2DQoyMDEgIDU1ICA1NQ0KMjAyICA1NCAg
NTQNCjIwMyAgNTMgIDUzDQoyMDQgIDUyICA1Mg0KMjA1ICA1MSAgNTENCjIw
NiAgNTAgIDUwDQoyMDcgIDQ5ICA0OQ0KMjA4ICA0OCAgNDgNCjIwOSAgNDcg
IDQ3DQoyMTAgIDQ2ICA0Ng0KMjExICA0NSAgNDUNCjIxMiAgNDQgIDQ0DQoy
MTMgIDQzICA0Mw0KMjE0ICA0MiAgNDINCjIxNSAgNDEgIDQxDQoyMTYgIDQw
ICA0MA0KMjE3ICAzOSAgMzkNCjIxOCAgMzggIDM4DQoyMTkgIDM3ICAzNw0K
MjIwICAzNiAgMzYNCjIyMSAgMzUgIDM1DQoyMjIgIDM0ICAzNA0KMjIzICAz
MyAgMzMNCjIyNCAgMzIgIDMyDQoyMjUgIDMxICAzMQ0KMjI2ICAzMCAgMzAN
CjIyNyAgMjkgIDI5DQoyMjggIDI4ICAyOA0KMjI5ICAyNyAgMjcNCjIzMCAg
MjYgIDI2DQoyMzEgIDI1ICAyNQ0KMjMyICAyNCAgMjQNCjIzMyAgMjMgIDIz
DQoyMzQgIDIyICAyMg0KMjM1ICAyMSAgMjENCjIzNiAgMjAgIDIwDQoyMzcg
IDE5ICAxOQ0KMjM4ICAxOCAgMTgNCjIzOSAgMTcgIDE3DQoyNDAgIDE2ICAx
Ng0KMjQxICAxNSAgMTUNCjI0MiAgMTQgIDE0DQoyNDMgIDEzICAxMw0KMjQ0
ICAxMiAgMTINCjI0NSAgMTEgIDExDQoyNDYgIDEwICAxMA0KMjQ3ICA5ICA5
DQoyNDggIDggIDgNCjI0OSAgNyAgNw0KMjUwICA2ICA2DQoyNTEgIDUgIDUN
CjI1MiAgNCAgNA0KMjUzICAzICAzDQoyNTQgIDIgIDINCjI1NSAgMSAgMQ0K

--8323328-2047860492-1094428204=:6316--