You've done it very well.
It's optimal from both math and asm point of view (well pared).
Now try to do it in FPU.
Assume that
.data?
x real8
y real8
subOfXYsq real8
BTW I hope you use debugger.
Actually nothing talks as clear as learning instructions and
testing pieces of code in favour of using a debugger.
And consequently of need to manage fast and easy loading written code into a debugger (I do it by one key stroke in my shell).
It's optimal from both math and asm point of view (well pared).
Now try to do it in FPU.
Assume that
.data?
x real8
y real8
subOfXYsq real8
BTW I hope you use debugger.
Actually nothing talks as clear as learning instructions and
testing pieces of code in favour of using a debugger.
And consequently of need to manage fast and easy loading written code into a debugger (I do it by one key stroke in my shell).
here is my try in fpu (like i said before i'm not good in this )
bye
eko
fld x ;st(0)=x
fadd y ;fst(0)=x+y
fld x ; st(1)=x+y , st(0)=y
fsub y ; st(1)=x-y
fmul
fstp subOfXYsq
bye
eko
eko:
Here is one simple task more. (5th grade)
eax = side of square1
ecx = side of squre2
We don't know which one is bigger.
Task:
Find positive (abs) difference of perimeters of these two squares
without branching.
Give solutions both for fpu and integer.
----------------------------------------------------------------------------------
Another task:
Find sum of sign-changing HEX figures in dword.
Sign-changing means if you have value in hex 1234AFBCh
you need to find
1-2+3-4+A-F+B-C
It can be represented by difference of sum of odd figures and even figures
(1+3+A+B)-(2+4+F+C)
Get Anger.hlp with instruction set, and using it try to optimize for optimal paring.
Good Luck!
We don't know tricks - we just invent them ;)
Here is one simple task more. (5th grade)
eax = side of square1
ecx = side of squre2
We don't know which one is bigger.
Task:
Find positive (abs) difference of perimeters of these two squares
without branching.
Give solutions both for fpu and integer.
----------------------------------------------------------------------------------
Another task:
Find sum of sign-changing HEX figures in dword.
Sign-changing means if you have value in hex 1234AFBCh
you need to find
1-2+3-4+A-F+B-C
It can be represented by difference of sum of odd figures and even figures
(1+3+A+B)-(2+4+F+C)
Get Anger.hlp with instruction set, and using it try to optimize for optimal paring.
Good Luck!
We don't know tricks - we just invent them ;)
I thought about the task above and have posted my first tries.
Please don't look if you wish to solve yourself. ;)
Please don't look if you wish to solve yourself. ;)
I couldn't help myself :)
Good code.
1st is the same logic but one clock faster than mine.
I missed an obvious thing that - - 1 is the same as +1 :)
Problem of second code, dispite of good ideas, is dependences
it is 11 clocks timing:
mov edx,eax ;1
and eax,0F0F0F0Fh ;0
shr edx,4 ;1
and edx,0F0F0F0Fh ;1
or edx,10101010h ;1
sub edx,eax ;1
mov eax,edx ;1
shr edx,16 ;1
add eax,edx ;1
add al,ah ;1
and eax,0FFh ;1
sub eax,64 ;1
here is one (I have 5 different versions) possible solution
to make it independence ( 7 clocks):
mov ebx,eax
shr eax,4
and ebx,0f0f0f0fh
and eax,0f0f0f0fh
mov edx,ebx
mov ecx,eax
rol edx,16
rol ecx,16
add ebx,edx
add eax,ecx
add bl,bh
add al,ah
sub al,bl
Good code.
1st is the same logic but one clock faster than mine.
I missed an obvious thing that - - 1 is the same as +1 :)
Problem of second code, dispite of good ideas, is dependences
it is 11 clocks timing:
mov edx,eax ;1
and eax,0F0F0F0Fh ;0
shr edx,4 ;1
and edx,0F0F0F0Fh ;1
or edx,10101010h ;1
sub edx,eax ;1
mov eax,edx ;1
shr edx,16 ;1
add eax,edx ;1
add al,ah ;1
and eax,0FFh ;1
sub eax,64 ;1
here is one (I have 5 different versions) possible solution
to make it independence ( 7 clocks):
mov ebx,eax
shr eax,4
and ebx,0f0f0f0fh
and eax,0f0f0f0fh
mov edx,ebx
mov ecx,eax
rol edx,16
rol ecx,16
add ebx,edx
add eax,ecx
add bl,bh
add al,ah
sub al,bl