GP32 How To Use Sin, Cos (basically Math.h)


pea

developer
Joined
Oct 3, 2004
Messages
1,089
Age
45
Location
New Zealand
Website
www.projectitis.com
Hi all, I thought I would start a new topic with this in case someone searches for it later.

How do I use the math.h functions (sin, cos, tan, atan and atan2 amongst others) using Mr.Mirkos SDK?

When I try, I get pages of errors about hardware vs software floats. Forcing compilation of my program and the SDK using the -msoft-float flag has no affect. These errors only appear if I include a math function in my code.

EDIT: example:
Code:
: ERROR: ../lib/libmirkoSDK.a(gp_buttons.o) uses hardware FP, whereas monogp.elf
 uses software FP
/cygdrive/c/gp32_MrMirko/bin/../lib/gcc/arm-elf/3.4.0/../../../../arm-elf/bin/ld
: failed to merge target specific data of file ../lib/libmirkoSDK.a(gp_buttons.o
)
/cygdrive/c/gp32_MrMirko/bin/../lib/gcc/arm-elf/3.4.0/../../../../arm-elf/bin/ld
: ERROR: ../lib/libmirkoSDK.a(gp_cpuspeed.o) uses hardware FP, whereas monogp.el
f uses software FP
/cygdrive/c/gp32_MrMirko/bin/../lib/gcc/arm-elf/3.4.0/../../../../arm-elf/bin/ld
: failed to merge target specific data of file ../lib/libmirkoSDK.a(gp_cpuspeed.
o)
/cygdrive/c/gp32_MrMirko/bin/../lib/gcc/arm-elf/3.4.0/../../../../arm-elf/bin/ld
: ERROR: ../lib/libmirkoSDK.a(gp_graphics.o) uses hardware FP, whereas monogp.el
f uses software FP
/cygdrive/c/gp32_MrMirko/bin/../lib/gcc/arm-elf/3.4.0/../../../../arm-elf/bin/ld
: failed to merge target specific data of file ../lib/libmirkoSDK.a(gp_graphics.
o)
/cygdrive/c/gp32_MrMirko/bin/../lib/gcc/arm-elf/3.4.0/../../../../arm-elf/bin/ld
: ERROR: ../lib/libmirkoSDK.a(gp_timer.o) uses hardware FP, whereas monogp.elf u
ses software FP
/cygdrive/c/gp32_MrMirko/bin/../lib/gcc/arm-elf/3.4.0/../../../../arm-elf/bin/ld
: failed to merge target specific data of file ../lib/libmirkoSDK.a(gp_timer.o)
/cygdrive/c/gp32_MrMirko/bin/../lib/gcc/arm-elf/3.4.0/../../../../arm-elf/bin/ld
: ERROR: ../lib/libmirkoSDK.a(memcpy.o) uses hardware FP, whereas monogp.elf use
s software FP
...
etc etc etc
...
 
I've managed to fix something like this once by moving a library from one end of the list to the other in the makefile. Can't remember which way round I had to move it, and I have no idea why it worked, but it could be worth a try. But don't start messing about with -msoft-float otherwise you will just end up in even more trouble.
 
Thanks woogal. Come to think of it, I fixed another problem by moving a library just like that trying to build libMikMod!

No worries, I have now integrated a fully featured fixed point library into the SDK, so I now have cos, sin, floor, ceil, acos, asin, atan, atan2, all in fixed point goodness. I ... erm... *borrowed* them from the allegro game programming libraries from source forge.

If someone is willing to give me a hand - there is one function (multiplication 'fixmul') that at the moment converts the arguments to float, performs a floating point multiplication, and then converts it back, I would like to convert this as much as possible away from floats.

This function (fixmul) and two others - 'fixsqrt' and its inverse (forget the name) - currently have ASM implementations that I don't understand and don't know if they will compile. I would like someone to look at these (they are quite short) and (1) make sure they compile under gcc (2) remove the dependencies on the allegro_error numbers.

If anyone is interested, I will post the code...
 
Post it anyway! You may get lucky ;) :D

I'm 'interested', but I have no ARM asm experience :unsure:

fixmul should be trivial in C using shifts, muls and adds
sqrt is much more involved and I've forgotten all those Newtonian methods for solving them.

Isn't the opposite of fixsqrt(x) fixmul(x,x)? :lol:
 
I use this one... I think c&p'ed it from someone else but I can't remember...
this has only 8 bit precision and uses no float type casting. sin and cos are made with a LUT, this maybe helps you out
Code:
// fix point
typedef short fixed16;
typedef int  fixed32;

#define FIXONE  0x100
#define FIXHALF 0x80
#define FIXCEIL 0xFF

#define f2i(A) ((A)>>8)
#define i2f(A) ((A)<<8)
#define r2i(A) ((A)>>16)
#define i2fdiv2(A) ((A)<<7)
#define f2fl(A) ((A)/256.0)
#define fl2f(A) ((A)*256.0)
#define fixtrunc(A) i2f(f2i(A))
#define fixlerp(A,B,C) ((A)+fixmul((B)-(A),©))
#define fixup(A) f2i((A)+FIXCEIL)
#define fixinv(A) fixdiv(FIXUNIT,(A))

#define intdiv(A,B) ((A)/(B))
#define muldiv(A,B,C) intdiv((A)*(B),©)
#define fixmul(A,B) f2i((A)*(B))
#define fixdiv(A,B) intdiv(i2f(A),(B))
#define fixsin(A) sintable[(A)&2047]
#define fixcos(A) fixsin((A)+512)

const int sintable[2048] = {0,1,2,2,3,4,5,5,6,7,8,9,9,10,11,12,
13,13,14,15,16,16,17,18,19,20,20,21,22,23,24,24,25,26,27,27,28,29,30,31,31,32,
33,34,34,35,36,37,38,38,39,40,41,41,42,43,44,45,45,46,47,48,48,49,50,51,51,52,
53,54,55,55,56,57,58,58,59,60,61,61,62,63,64,64,65,66,67,68,68,69,70,71,71,72,
73,74,74,75,76,77,77,78,79,80,80,81,82,83,83,84,85,86,86,87,88,88,89,90,91,91,
92,93,94,94,95,96,97,97,98,99,99,100,101,102,102,103,104,104,105,106,107,107,
108,109,109,110,111,112,112,113,114,114,115,116,117,117,118,119,119,120,121,121,
122,123,123,124,125,125,126,127,128,128,129,130,130,131,132,132,133,134,134,135,
136,136,137,138,138,139,140,140,141,142,142,143,144,144,145,145,146,147,147,148,
149,149,150,151,151,152,152,153,154,154,155,156,156,157,157,158,159,159,160,161,
161,162,162,163,164,164,165,165,166,167,167,168,168,169,170,170,171,171,172,173,
173,174,174,175,175,176,177,177,178,178,179,179,180,180,181,182,182,183,183,184,
184,185,185,186,186,187,188,188,189,189,190,190,191,191,192,192,193,193,194,194,
195,195,196,196,197,197,198,198,199,199,200,200,201,201,202,202,203,203,204,204,
205,205,206,206,207,207,207,208,208,209,209,210,210,211,211,212,212,212,213,213,
214,214,215,215,215,216,216,217,217,218,218,218,219,219,220,220,220,221,221,222,
222,222,223,223,224,224,224,225,225,225,226,226,227,227,227,228,228,228,229,229,
229,230,230,230,231,231,231,232,232,232,233,233,233,234,234,234,235,235,235,236,
236,236,237,237,237,237,238,238,238,239,239,239,239,240,240,240,241,241,241,241,
242,242,242,242,243,243,243,243,244,244,244,244,245,245,245,245,245,246,246,246,
246,247,247,247,247,247,248,248,248,248,248,249,249,249,249,249,249,250,250,250,
250,250,250,251,251,251,251,251,251,252,252,252,252,252,252,252,252,253,253,253,
253,253,253,253,253,254,254,254,254,254,254,254,254,254,254,255,255,255,255,255,
255,255,255,255,255,255,255,255,255,255,256,256,256,256,256,256,256,256,256,256,
256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,
256,256,256,256,256,256,256,256,256,256,256,255,255,255,255,255,255,255,255,255,
255,255,255,255,255,255,254,254,254,254,254,254,254,254,254,254,253,253,253,253,
253,253,253,253,252,252,252,252,252,252,252,252,251,251,251,251,251,251,250,250,
250,250,250,250,249,249,249,249,249,249,248,248,248,248,248,247,247,247,247,247,
246,246,246,246,245,245,245,245,245,244,244,244,244,243,243,243,243,242,242,242,
242,241,241,241,241,240,240,240,239,239,239,239,238,238,238,237,237,237,237,236,
236,236,235,235,235,234,234,234,233,233,233,232,232,232,231,231,231,230,230,230,
229,229,229,228,228,228,227,227,227,226,226,225,225,225,224,224,224,223,223,222,
222,222,221,221,220,220,220,219,219,218,218,218,217,217,216,216,215,215,215,214,
214,213,213,212,212,212,211,211,210,210,209,209,208,208,207,207,207,206,206,205,
205,204,204,203,203,202,202,201,201,200,200,199,199,198,198,197,197,196,196,195,
195,194,194,193,193,192,192,191,191,190,190,189,189,188,188,187,186,186,185,185,
184,184,183,183,182,182,181,180,180,179,179,178,178,177,177,176,175,175,174,174,
173,173,172,171,171,170,170,169,168,168,167,167,166,165,165,164,164,163,162,162,
161,161,160,159,159,158,157,157,156,156,155,154,154,153,152,152,151,151,150,149,
149,148,147,147,146,145,145,144,144,143,142,142,141,140,140,139,138,138,137,136,
136,135,134,134,133,132,132,131,130,130,129,128,128,127,126,125,125,124,123,123,
122,121,121,120,119,119,118,117,117,116,115,114,114,113,112,112,111,110,109,109,
108,107,107,106,105,104,104,103,102,102,101,100,99,99,98,97,97,96,95,94,94,93,
92,91,91,90,89,88,88,87,86,86,85,84,83,83,82,81,80,80,79,78,77,77,76,75,74,74,
73,72,71,71,70,69,68,68,67,66,65,64,64,63,62,61,61,60,59,58,58,57,56,55,55,54,
53,52,51,51,50,49,48,48,47,46,45,45,44,43,42,41,41,40,39,38,38,37,36,35,34,34,
33,32,31,31,30,29,28,27,27,26,25,24,24,23,22,21,20,20,19,18,17,16,16,15,14,13,
13,12,11,10,9,9,8,7,6,5,5,4,3,2,2,1,0,-1,-2,-2,-3,-4,-5,-5,-6,-7,-8,-9,-9,-10,
-11,-12,-13,-13,-14,-15,-16,-16,-17,-18,-19,-20,-20,-21,-22,-23,-24,-24,-25,-26,
-27,-27,-28,-29,-30,-31,-31,-32,-33,-34,-34,-35,-36,-37,-38,-38,-39,-40,-41,-41,
-42,-43,-44,-45,-45,-46,-47,-48,-48,-49,-50,-51,-51,-52,-53,-54,-55,-55,-56,-57,
-58,-58,-59,-60,-61,-61,-62,-63,-64,-64,-65,-66,-67,-68,-68,-69,-70,-71,-71,-72,
-73,-74,-74,-75,-76,-77,-77,-78,-79,-80,-80,-81,-82,-83,-83,-84,-85,-86,-86,-87,
-88,-88,-89,-90,-91,-91,-92,-93,-94,-94,-95,-96,-97,-97,-98,-99,-99,-100,-101,
-102,-102,-103,-104,-104,-105,-106,-107,-107,-108,-109,-109,-110,-111,-112,-112,
-113,-114,-114,-115,-116,-117,-117,-118,-119,-119,-120,-121,-121,-122,-123,-123,
-124,-125,-125,-126,-127,-128,-128,-129,-130,-130,-131,-132,-132,-133,-134,-134,
-135,-136,-136,-137,-138,-138,-139,-140,-140,-141,-142,-142,-143,-144,-144,-145,
-145,-146,-147,-147,-148,-149,-149,-150,-151,-151,-152,-152,-153,-154,-154,-155,
-156,-156,-157,-157,-158,-159,-159,-160,-161,-161,-162,-162,-163,-164,-164,-165,
-165,-166,-167,-167,-168,-168,-169,-170,-170,-171,-171,-172,-173,-173,-174,-174,
-175,-175,-176,-177,-177,-178,-178,-179,-179,-180,-180,-181,-182,-182,-183,-183,
-184,-184,-185,-185,-186,-186,-187,-188,-188,-189,-189,-190,-190,-191,-191,-192,
-192,-193,-193,-194,-194,-195,-195,-196,-196,-197,-197,-198,-198,-199,-199,-200,
-200,-201,-201,-202,-202,-203,-203,-204,-204,-205,-205,-206,-206,-207,-207,-207,
-208,-208,-209,-209,-210,-210,-211,-211,-212,-212,-212,-213,-213,-214,-214,-215,
-215,-215,-216,-216,-217,-217,-218,-218,-218,-219,-219,-220,-220,-220,-221,-221,
-222,-222,-222,-223,-223,-224,-224,-224,-225,-225,-225,-226,-226,-227,-227,-227,
-228,-228,-228,-229,-229,-229,-230,-230,-230,-231,-231,-231,-232,-232,-232,-233,
-233,-233,-234,-234,-234,-235,-235,-235,-236,-236,-236,-237,-237,-237,-237,-238,
-238,-238,-239,-239,-239,-239,-240,-240,-240,-241,-241,-241,-241,-242,-242,-242,
-242,-243,-243,-243,-243,-244,-244,-244,-244,-245,-245,-245,-245,-245,-246,-246,
-246,-246,-247,-247,-247,-247,-247,-248,-248,-248,-248,-248,-249,-249,-249,-249,
-249,-249,-250,-250,-250,-250,-250,-250,-251,-251,-251,-251,-251,-251,-252,-252,
-252,-252,-252,-252,-252,-252,-253,-253,-253,-253,-253,-253,-253,-253,-254,-254,
-254,-254,-254,-254,-254,-254,-254,-254,-255,-255,-255,-255,-255,-255,-255,-255,
-255,-255,-255,-255,-255,-255,-255,-256,-256,-256,-256,-256,-256,-256,-256,-256,
-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,
-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,-256,
-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-254,
-254,-254,-254,-254,-254,-254,-254,-254,-254,-253,-253,-253,-253,-253,-253,-253,
-253,-252,-252,-252,-252,-252,-252,-252,-252,-251,-251,-251,-251,-251,-251,-250,
-250,-250,-250,-250,-250,-249,-249,-249,-249,-249,-249,-248,-248,-248,-248,-248,
-247,-247,-247,-247,-247,-246,-246,-246,-246,-245,-245,-245,-245,-245,-244,-244,
-244,-244,-243,-243,-243,-243,-242,-242,-242,-242,-241,-241,-241,-241,-240,-240,
-240,-239,-239,-239,-239,-238,-238,-238,-237,-237,-237,-237,-236,-236,-236,-235,
-235,-235,-234,-234,-234,-233,-233,-233,-232,-232,-232,-231,-231,-231,-230,-230,
-230,-229,-229,-229,-228,-228,-228,-227,-227,-227,-226,-226,-225,-225,-225,-224,
-224,-224,-223,-223,-222,-222,-222,-221,-221,-220,-220,-220,-219,-219,-218,-218,
-218,-217,-217,-216,-216,-215,-215,-215,-214,-214,-213,-213,-212,-212,-212,-211,
-211,-210,-210,-209,-209,-208,-208,-207,-207,-207,-206,-206,-205,-205,-204,-204,
-203,-203,-202,-202,-201,-201,-200,-200,-199,-199,-198,-198,-197,-197,-196,-196,
-195,-195,-194,-194,-193,-193,-192,-192,-191,-191,-190,-190,-189,-189,-188,-188,
-187,-186,-186,-185,-185,-184,-184,-183,-183,-182,-182,-181,-180,-180,-179,-179,
-178,-178,-177,-177,-176,-175,-175,-174,-174,-173,-173,-172,-171,-171,-170,-170,
-169,-168,-168,-167,-167,-166,-165,-165,-164,-164,-163,-162,-162,-161,-161,-160,
-159,-159,-158,-157,-157,-156,-156,-155,-154,-154,-153,-152,-152,-151,-151,-150,
-149,-149,-148,-147,-147,-146,-145,-145,-144,-144,-143,-142,-142,-141,-140,-140,
-139,-138,-138,-137,-136,-136,-135,-134,-134,-133,-132,-132,-131,-130,-130,-129,
-128,-128,-127,-126,-125,-125,-124,-123,-123,-122,-121,-121,-120,-119,-119,-118,
-117,-117,-116,-115,-114,-114,-113,-112,-112,-111,-110,-109,-109,-108,-107,-107,
-106,-105,-104,-104,-103,-102,-102,-101,-100,-99,-99,-98,-97,-97,-96,-95,-94,
-94,-93,-92,-91,-91,-90,-89,-88,-88,-87,-86,-86,-85,-84,-83,-83,-82,-81,-80,-80,
-79,-78,-77,-77,-76,-75,-74,-74,-73,-72,-71,-71,-70,-69,-68,-68,-67,-66,-65,-64,
-64,-63,-62,-61,-61,-60,-59,-58,-58,-57,-56,-55,-55,-54,-53,-52,-51,-51,-50,-49,
-48,-48,-47,-46,-45,-45,-44,-43,-42,-41,-41,-40,-39,-38,-38,-37,-36,-35,-34,-34,
-33,-32,-31,-31,-30,-29,-28,-27,-27,-26,-25,-24,-24,-23,-22,-21,-20,-20,-19,-18,
-17,-16,-16,-15,-14,-13,-13,-12,-11,-10,-9,-9,-8,-7,-6,-5,-5,-4,-3,-2,-2,-1};
 
Synkro beat me to it. :) A look-up table is not only fast, but intelligent in this situation. You can do similar things for pretty much any math function, and write an app to generate them easily on the PC.
 
Hi guys,

The sin, cos, tan, atan, atan2 and sqrt functions ALREADY use lookup tables! That wasn't my question :)

The other function that uses the sqrt tables is hypot. Sorry about the mixup gp32rich :)

The functions that are currently in ASM access the LUTs. They are as follows below. If anyone can help, that would be great, otherwise I'll look for a c impl.
1) They are in i386 ASM, need to be in gcc ARM ASM
2) They currently set 'allegro_errno'. I want to remove this code altogether (still return the values, but not set the error numbers)
Code:
/* fixed fixsqrt(fixed x);
 *  Fixed point square root routine. This code is based on the fixfloat
 *  library by Arne Steinarson.
 */
FUNC(fixsqrt)
   pushl %ebp
   movl %esp, %ebp

   /* This routine is based upon the following idea:
    *    sqrt (x) = sqrt (x/d) * sqrt(d)
    *    d = 2^(2n)
    *    sqrt (x) = sqrt (x / 2^(2n)) * 2^n
    * `x/2^(2n)' has to fall into the range 0..255 so that we can use the
    * square root lookup table. So `2n' is the number of bits `x' has to be
    * shifted to the left to become smaller than 256. The best way to find `2n'
    * is to do a reverse bit scan on `x'. This is achieved by the i386 ASM
    * instruction `bsr'.
    */

   movl ARG1, %eax               /* eax = `x' */
   orl %eax, %eax                /* check whether `x' is negative... */
   jle  sqrt_error_check         /* jump to error-checking if x <= 0 */

   movl %eax, %edx               /* bit-scan is done on edx */
   shrl $6, %edx
   xorl %ecx, %ecx               /* if no bit set: default %cl = 2n = 0 */
   bsrl %edx, %ecx 
   andb $0xFE, %cl               /* make result even -->  %cl = 2n */
   shrl %cl, %eax                /* shift x to fall into range 0..255 */

     /* table lookup... */
   movzwl GLOBL(_sqrt_table)(,%eax,2), %eax

   shrb $1, %cl                  /* %cl = n */
   shll %cl, %eax                /* multiply `sqrt(x/2^(2n))' by `2^n' */
   shrl $4, %eax                 /* adjust the result */
   jmp sqrt_done

   _align_
sqrt_error_check:                /* here we go if x<=0 */
   jz sqrt_done                  /* if zero, return eax=0 */

   movl GLOBL(allegro_errno), %edx
   movl $ERANGE, (%edx)          /* on overflow, set errno */
   xorl %eax, %eax               /* return zero */

   _align_
sqrt_done:
   movl %ebp, %esp
   popl %ebp
   ret                           /* end of fixsqrt() */




/* fixed fixhypot(fixed x, fixed y);
 *  Return fixed point sqrt (x*x+y*y), which is the length of the 
 *  hypotenuse of a right triangle with sides of length x and y, or the 
 *  distance of point (x|y) from the origin. This routine is faster and more 
 *  accurate than using the direct formula fixsqrt (fixmul (x,x), fixmul(y,y)). 
 *  It will also return correct results for x>=256 or y>=256 where fixmul(x) 
 *  or fixmul(y) would overflow.
 */
FUNC(fixhypot)
   pushl %ebp
   movl %esp, %ebp

   /* The idea of this routine is:
    *    sqrt (x^2+y^2) = sqrt ((x/d)^2+(y/d)^2) * d
    *    d = 2^n
    * Since `x' and `y' are fixed point numbers, they are multiplied in the 
    * following way:
    *    x^2 = (x*x)/2^16
    * so we come to the formula:
    *    sqrt(x^2+y^2) = sqrt((x*x + y*y)/2^(16+2n)) * 2^n
    * and this is almost the same problem as calculating the square root in
    * `fixsqrt': find `2n' so that `(x*x+y*y)/2^(16+2n)' is in the range 0..255
    * so that we can use the square root lookup table.
    */

   movl ARG1, %eax               /* edx:eax = x*x */
   imull %eax
   movl %eax, %ecx               /* save edx:eax */
   pushl %edx
   movl ARG2, %eax               /* edx:eax = y*y */
   imull %eax
   addl %ecx, %eax               /* edx:eax = x*x + y*y */
   popl %ecx
   adcl %ecx, %edx
   cmpl $0x3FFFFFFF, %edx        /* check for overflow */
   ja hypot_overflow

   /* And now we're doing a bit-scan on `x*x+y*y' to find out by how 
    * many bits it needs to be shifted to fall into the range 0..255. 
    * Since the intermediate result is 64 bit we may need two bitscans 
    * in case that no bit is set in the upper 32 bit.
    */ 
   bsrl %edx, %ecx
   jz hypot_part2

   /* we got the bit with the first step */
   incb %cl                      /* make cl even */
   incb %cl
   andb $0xFE, %cl 
   shrdl %cl, %edx, %eax         /* make eax fall into range 0..255 */
   shrl $24, %eax
     /* eax = table lookup square root */
   movzwl GLOBL(_sqrt_table)(,%eax,2), %eax
   shrb $1, %cl                  /* adjust result... */
   shll %cl, %eax 
   jmp hypot_done

   /* we didn't get the bit with the first step -- so we make another
    * scan on the remaining bits in `eax' to get `2n'.
    */
   _align_
hypot_part2:
   shrl $16, %eax                /* eax = (x*x+y*y)/2^16 */
   movl %eax, %edx               /* edx is used for scanning */
   shrl $6, %edx 
   xorl %ecx, %ecx               /* default `2n' if no bit is set */
   bsrl %edx, %ecx
   andb $0xFE, %cl               /* make cl=2n even */
   shrl %cl, %eax                /* make eax fall into range 0..255 */
     /* eax = table lookup square root */
   movzwl GLOBL(_sqrt_table)(,%eax,2), %eax
   shrb $1, %cl                  /* cl = n */
   shll %cl, %eax                /* adjust result... */
   shrl $4, %eax 
   jmp hypot_done

   _align_
hypot_overflow:                  /* overflow */
   movl GLOBL(allegro_errno), %eax
   movl $ERANGE, (%eax)          /* set errno */
   movl $0x7FFFFFFF, %eax        /* and return MAXINT */

   _align_
hypot_done:
   movl %ebp, %esp
   popl %ebp
   ret                           /* end of fixhypot() */



p.s. If you are making your own fixed math library never mistakenly typecast your 'fixed' value as 'unsigned' :) I did this and BOY did it take me ages to figure out where my errors were coming from.
 
An explanation of fixed floating point with focus on 3D arithmetic

And ways to optimize your maths...
Using different sizes of FFP, ie. 16.16, 4.28
Doing mults instead of divs ie not 15/3, but 15*0.3333 ie (in 16.16 FFP), 0xF0000*0x05555
Where to watch out for over/under flowing values


There are no hard examples ... it is a presentation ;)

It's an Intel document, maybe they have some info on their website?
 
can ARM do the 'long' (64 bit) data type in any way? I know its a 32bit system, but perhaps it can emulate it by storing the result in 2 registers, and combining later?

This is needed for all sorts of stuff, especially mul, div and sqrt. You loose all sorts of precision on those.
 
Back
Top