weird code generation

BlitzMax Forums/BlitzMax Programming/weird code generation

Defoc8(Posted 2006) [#1]
Ok heres the deal,
bmax allows you make assignments like this..

matrix[0]=matrix[1]=matrix[2]=matrix[3]= ..
matrix[4]=matrix[5]=0

i expected this to be equivalent to the following..

matrix[0]=0
matrix[1]=0
matrix[2]=0 .......

i use both approaches to create a unit matrix - but having
looked at the assembly code generated for the first
version..its ugly as hell - and im not convinced its even
behaving correctly...i dont know my 8086..but it jst
doesnt look ok...
The second version produces very clean, simple assembly
output...

i would have expected the first version to help the compiler optimise the code..setting the float const once +
writing to the memory addresses..this is not the case

perhaps someone can tell me why the first
version is such an distaster? - perhaps its cuz it doesnt
work like it does in c/c++ ... anyway, jst thought it was
interesting..


Mark Tiffany(Posted 2006) [#2]
The following:

a=b=c

will set a to the result of the comparison between b and c. Presumably that is why the assembly output is so horrible, as the first version is a series of comparisons, not just assignments.


Defoc8(Posted 2006) [#3]
hmmm...that seems counter intuitive - im going to have
another look at the assmebly ouput later + see if can
figure out exactly whats happening..

thanks for that ;)


Dreamora(Posted 2006) [#4]
Its not counter intuitive. Just not the way many might be used from C where such assignement chains work like assignements, not like "comparision assignement"
Due to the (thankfully) missing = == === stuff, it can be misinterpreted.

What happens is:

a=b=c=d -> a=(b=(c=d))


Defoc8(Posted 2006) [#5]
well if thats how it..i guess ill jst have to get used to it,
as for the (thankfully) part of your post - i actually prefer
explicit operators for this...but thats personal opinion...

if nothing else, this post has highlighted a potential problem,
that silly people like me might encounter..


*(Posted 2006) [#6]
maybe we should have a 'your code is illegible' error message ;)

As for the code it would be easier to do a for..next loop for that.


Defoc8(Posted 2006) [#7]
Im well aware that for/next is simpler - but was looking
at code generation for this particular method. I imagine that
optimised unrolled assignment would result in slightly
quicker intialisation of an array - thats why i was trying this
out - whether or not this is true..im not sure, i dont know
enough about 8086 assembly language coding..i am reading
up on it though..its interesting..

anyway i dont want to start some kind pointless argument
about optimisation and programming methods...
it would seem that this post was of no interest to anyone,
and should perhaps be removed..sorry


H&K(Posted 2006) [#8]
Dont dry. I found it interesting.


*(Posted 2006) [#9]
dont get me wrong, I didnt mean the post isnt interesting. If there is a way to make Max faster im all for it :)