[ rapidlord @ 16.06.2005. 09:56 ] @
Imam funkciju koja je napisana za PalmOS (Motorola 68000) i za Linux (x86) , meni je potrebna ista takva pisana za PocketPC (ARM) , nemam iskustva sa asemblerom na ovu funkciju sam naleteo prebacujuci neki c/c++ kod sa jedne platforme na drugu, u principu ne volim da trazim da neko nesto radi umesto mene ali se nalazim u beznadeznom polozaju, pokusao sam da provalim sam nesto ali uzima mi previse vremena koga nemam, ne znam kolko je ovo tesko ali funkcija nije velika pa ako nekom nije tesko bio bih mu zahvalan ako mi pokazao kako ova funkcija treba da izgleda za ARM ili barem u Microsoft-ovom MASM (x86) (bilo bi mi razumljivije, jer sam u njemu radio nesto malo).

Inace u fixed-u je predstavljen broj sa pokretnim zarezom.

Hvala


Code:


typedef long fixed;

#ifdef LINUX

/* PALM (m68)  */
fixed asm m68_fixed_mul(fixed a : __D0, fixed b : __D1) : __D0
{
    movem.l d2-d4, -(sp)
    move.l  d0, d2
    mulu.w  d1, d0
    add.l   #0x8000, d0
    clr.w   d0
    swap    d0              // d0=alo*blo>>16, d1=b, d2=a
    move.l  d1, d3
    move.l  d2, d4
    swap    d4
    mulu.w  d4, d3
    add.l   d3, d0          // d0=alo*blo>>16 + ahi*blo, d4=alo.ahi
    move.l  d1, d3
    swap    d3
    mulu.w  d2, d3          // d3= alo*bhi
    add.l   d3, d0          // d0=d0 + alo*bhi
    move.l  d1, d3
    swap    d3
    mulu.w  d4, d3          // d3 = ahi*bhi
    swap    d3
    clr.w   d3
    add.l   d3, d0          // d0 is now the unsigned product
                            // d1=b, d2=a, d3=??, d4=alo.ahi
    swap    d1
    move.l  d4, d3
    ext.l   d3
    and.l   d1, d3
    clr.w   d3
    sub.l   d3, d0
    
    ext.l   d1
    and.l   d4, d1
    clr.w   d1
    sub.l   d1, d0
    
    movem.l (sp)+, d2-d4
    rts
}

#else

/*  LINUX (x86)  */
inline fixed intel_fixed_mul(fixed a, fixed b)
{
    fixed __s;

    asm (
    "imull %2          \n\t"
    "add $0x8000,%%eax \n\t"
    "adc $0,%%edx      \n\t"
    "shrd $16,%%edx,%%eax"
    : "=a" (__s)
    : "a" (a), "rm" (b)
    : "%edx");

    return __s;
}

#endif