[Coco] Found strangeness in C compiler (bug)
Joel Rees
joel.rees at gmail.com
Mon May 27 08:07:50 EDT 2019
hmm. Let's see what this looks like in (idealized) assembly language.
On Sat, May 25, 2019 at 8:05 AM Joel Rees <joel.rees at gmail.com> wrote:
>
> 2019年5月21日(火) 14:32 Walter Zambotti <zambotti at iinet.net.au>:
>>
>> I have a situation where the auto post-increment was occurring first.
>
>> The increment only occurs at the wrong time when the pointer types are
>> double (maybe float). So the following code works for int but not double.
>>
>> int *da, *dN ; or double *da, *dN;
* Guessing these were global, so we can keep some things simple.
da rmb 2 ; for example, this might be allocated from 0x100
dN rmb 2 ; then this would be allocated at 0x102
...
v rmb 2 ; and this would be allocated at someplace similar.
>> *da++ = *dN++ * v - *da; // this is correct as the increment should happen
ldx da ; *da++
tfr x,y ; old value of da
leax 2,x
stx da ; update da
ldx dN ; *dN
ldd ,x++
stx dN ; update dN
pshu d
ldd v ; Not pointer.
jsr multiply ; top item on U stack by d, result in d
* Now the problem -- Which da? old one in Y or new one in da?
* If old one in y
* subd ,y
* If the new one in da,
* subd [da] ; gots ta loves them indirect modes!
std ,y ; post-inc is for the store on the left side of the equals.
****
Now, that's seriously idealized code. Actual code will not be nearly as optimal.
K&R's wording left room to choose either of the above, at least,
according to many compiler writers.
Does that help?
--
Joel Rees
http://reiisi.blogspot.jp/p/novels-i-am-writing.html
More information about the Coco
mailing list