?? math32x.h
字號:
#pragma library 1
/*
fixed8_24 operator* _xmul8_24( fixed8_24 arg1, fixed8_24 arg2);
fixedU8_24 operator* _xmulU8_24( fixedU8_24 arg1, fixedU8_24 arg2);
fixed8_24 operator/ _xdiv8_24( fixed8_24 arg1, fixed8_24 arg2);
fixedU8_24 operator/ _xdivU8_24( fixedU8_24 arg1, fixedU8_24 arg2);
fixed16_16 operator* _xmul16_16( fixed16_16 arg1, fixed16_16 arg2);
fixedU16_16 operator* _xmulU16_16( fixedU16_16 arg1, fixedU16_16 arg2);
fixed16_16 operator/ _xdiv16_16( fixed16_16 arg1, fixed16_16 arg2);
fixedU16_16 operator/ _xdivU16_16( fixedU16_16 arg1, fixedU16_16 arg2);
fixed24_8 operator* _xmul24_8( fixed24_8 arg1, fixed24_8 arg2);
fixedU24_8 operator* _xmulU24_8( fixedU24_8 arg1, fixedU24_8 arg2);
fixed24_8 operator/ _xdiv24_8( fixed24_8 arg1, fixed24_8 arg2);
fixedU24_8 operator/ _xdivU24_8( fixedU24_8 arg1, fixedU24_8 arg2);
*/
// DEFINABLE SYMBOLS (in the application code):
//#define FX_OPTIM_SPEED // optimize for SPEED: default
//#define FX_OPTIM_SIZE // optimize for SIZE
#if __CoreSet__ < 1200 || __CoreSet__ >= 2100
#error math32x.h does not support the selected device
#endif
#if __CoreSet__ < 1600
#define genAdd(r,a) W=a; btsc(Carry); W=incsz(a); r+=W;
#define genSub(r,a) W=a; btss(Carry); W=incsz(a); r-=W;
#define genAddW(r,a) W=a; btsc(Carry); W=incsz(a); W=r+W;
#define genSubW(r,a) W=a; btss(Carry); W=incsz(a); W=r-W;
#else
#define genAdd(r,a) W=a; r=addWFC(r);
#define genSub(r,a) W=a; r=subWFB(r);
#define genAddW(r,a) W=a; W=addWFC(r);
#define genSubW(r,a) W=a; W=subWFB(r);
#endif
#if defined FX_OPTIM_SIZE
// do not use 8*8 bit HW multiplier
#elif __CoreSet__ == 1700 || __CoreSet__ == 1800
#define hw_mult8x8(a,b) { W = a; multiply(b); }
#define loRES PRODL
#define hiRES PRODH
#elif __CoreSet__ == 2000
#define hw_mult8x8(a,b) { W = a; multiply(b); }
#define loRES W
#define hiRES MULH
#endif
fixed8_24 operator* _xmul8_24( fixed8_24 arg1, fixed8_24 arg2)
{
fixed8_24 rval;
char sign = arg1.high8 ^ arg2.high8;
if (arg1 < 0)
arg1 = -arg1;
if (arg2 < 0)
arg2 = -arg2;
#ifdef hw_mult8x8
uns8 tmpL, tmpH;
hw_mult8x8( arg1.low8, arg2.low8); // p1
tmpL = hiRES;
tmpH = 0;
rval = 0;
hw_mult8x8( arg1.midL8, arg2.low8); // p2
tmpL += loRES;
genAdd( tmpH, hiRES);
genAdd( rval.low8, 0);
hw_mult8x8( arg1.low8, arg2.midL8); // p2
tmpL += loRES;
genAdd( tmpH, hiRES);
genAdd( rval.low8, 0);
hw_mult8x8( arg1.midH8, arg2.low8); // p3
tmpH += loRES;
genAdd( rval.low8, hiRES);
genAdd( rval.midL8, 0);
hw_mult8x8( arg1.midL8, arg2.midL8); // p3
tmpH += loRES;
genAdd( rval.low8, hiRES);
genAdd( rval.midL8, 0);
hw_mult8x8( arg1.low8, arg2.midH8); // p3
tmpH += loRES;
genAdd( rval.low8, hiRES);
genAdd( rval.midL8, 0);
hw_mult8x8( arg1.high8, arg2.low8); // p4
rval.low8 += loRES;
genAdd( rval.midL8, hiRES);
genAdd( rval.midH8, 0);
hw_mult8x8( arg1.midH8, arg2.midL8); // p4
rval.low8 += loRES;
genAdd( rval.midL8, hiRES);
genAdd( rval.midH8, 0);
hw_mult8x8( arg1.midL8, arg2.midH8); // p4
rval.low8 += loRES;
genAdd( rval.midL8, hiRES);
genAdd( rval.midH8, 0);
hw_mult8x8( arg1.low8, arg2.high8); // p4
rval.low8 += loRES;
genAdd( rval.midL8, hiRES);
genAdd( rval.midH8, 0);
hw_mult8x8( arg1.high8, arg2.midL8); // p5
rval.midL8 += loRES;
genAdd( rval.midH8, hiRES);
genAdd( rval.high8, 0);
hw_mult8x8( arg1.midH8, arg2.midH8); // p5
rval.midL8 += loRES;
genAdd( rval.midH8, hiRES);
genAdd( rval.high8, 0);
hw_mult8x8( arg1.midL8, arg2.high8); // p5
rval.midL8 += loRES;
genAdd( rval.midH8, hiRES);
genAdd( rval.high8, 0);
hw_mult8x8( arg1.high8, arg2.midH8); // p6
rval.midH8 += loRES;
genAdd( rval.high8, hiRES);
hw_mult8x8( arg1.midH8, arg2.high8); // p6
rval.midH8 += loRES;
genAdd( rval.high8, hiRES);
hw_mult8x8( arg1.high8, arg2.high8); // p7
rval.high8 += loRES;
#else
char counter = sizeof(arg1)*8;
uns8 rvalH = 0;
rval.high24 = 0;
do {
arg1 = rr( arg1);
if (Carry) {
rval.midL8 += arg2.low8;
genAdd( rval.midH8, arg2.midL8);
genAdd( rval.high8, arg2.midH8);
genAdd( rvalH, arg2.high8);
}
rvalH = rr( rvalH);
rval = rr( rval);
counter = decsz(counter);
} while (1);
#endif
if (sign & 0x80)
rval = -rval;
return rval;
}
fixedU8_24 operator* _xmulU8_24( fixedU8_24 arg1, fixedU8_24 arg2)
{
fixedU8_24 rval;
#ifdef hw_mult8x8
uns8 tmpL, tmpH;
hw_mult8x8( arg1.low8, arg2.low8); // p1
tmpL = hiRES;
tmpH = 0;
rval = 0;
hw_mult8x8( arg1.midL8, arg2.low8); // p2
tmpL += loRES;
genAdd( tmpH, hiRES);
genAdd( rval.low8, 0);
hw_mult8x8( arg1.low8, arg2.midL8); // p2
tmpL += loRES;
genAdd( tmpH, hiRES);
genAdd( rval.low8, 0);
hw_mult8x8( arg1.midH8, arg2.low8); // p3
tmpH += loRES;
genAdd( rval.low8, hiRES);
genAdd( rval.midL8, 0);
hw_mult8x8( arg1.midL8, arg2.midL8); // p3
tmpH += loRES;
genAdd( rval.low8, hiRES);
genAdd( rval.midL8, 0);
hw_mult8x8( arg1.low8, arg2.midH8); // p3
tmpH += loRES;
genAdd( rval.low8, hiRES);
genAdd( rval.midL8, 0);
hw_mult8x8( arg1.high8, arg2.low8); // p4
rval.low8 += loRES;
genAdd( rval.midL8, hiRES);
genAdd( rval.midH8, 0);
hw_mult8x8( arg1.midH8, arg2.midL8); // p4
rval.low8 += loRES;
genAdd( rval.midL8, hiRES);
genAdd( rval.midH8, 0);
hw_mult8x8( arg1.midL8, arg2.midH8); // p4
rval.low8 += loRES;
genAdd( rval.midL8, hiRES);
genAdd( rval.midH8, 0);
hw_mult8x8( arg1.low8, arg2.high8); // p4
rval.low8 += loRES;
genAdd( rval.midL8, hiRES);
genAdd( rval.midH8, 0);
hw_mult8x8( arg1.high8, arg2.midL8); // p5
rval.midL8 += loRES;
genAdd( rval.midH8, hiRES);
genAdd( rval.high8, 0);
hw_mult8x8( arg1.midH8, arg2.midH8); // p5
rval.midL8 += loRES;
genAdd( rval.midH8, hiRES);
genAdd( rval.high8, 0);
hw_mult8x8( arg1.midL8, arg2.high8); // p5
rval.midL8 += loRES;
genAdd( rval.midH8, hiRES);
genAdd( rval.high8, 0);
hw_mult8x8( arg1.high8, arg2.midH8); // p6
rval.midH8 += loRES;
genAdd( rval.high8, hiRES);
hw_mult8x8( arg1.midH8, arg2.high8); // p6
rval.midH8 += loRES;
genAdd( rval.high8, hiRES);
hw_mult8x8( arg1.high8, arg2.high8); // p7
rval.high8 += loRES;
#else
char counter = sizeof(arg1)*8;
uns8 rvalH = 0;
rval.high24 = 0;
do {
arg1 = rr( arg1);
if (Carry) {
rval.midL8 += arg2.low8;
genAdd( rval.midH8, arg2.midL8);
genAdd( rval.high8, arg2.midH8);
genAdd( rvalH, arg2.high8);
}
rvalH = rr( rvalH);
rval = rr( rval);
counter = decsz(counter);
} while (1);
#endif
return rval;
}
fixed8_24 operator/ _xdiv8_24( fixed8_24 arg1, fixed8_24 arg2)
{
fixedU8_24 rm = 0;
char counter = sizeof(arg1)*8+24+1;
char c2 = sizeof(arg1)*8 + 1;
char sign = arg1.high8 ^ arg2.high8;
if (arg1 < 0) {
INVERT:
arg1 = -arg1;
if (c2 & 0x80)
goto EXIT;
}
if (arg2 < 0)
arg2 = -arg2;
goto ENTRY;
do {
c2 = decsz(c2);
btsc(c2.7);
Carry = 0;
rm = rl( rm);
W = rm.low8 - arg2.low8;
genSubW( rm.midL8, arg2.midL8);
genSubW( rm.midH8, arg2.midH8);
genSubW( rm.high8, arg2.high8);
if (!Carry)
goto ENTRY;
rm.high8 = W;
rm.low8 -= arg2.low8;
genSub( rm.midL8, arg2.midL8);
genSub( rm.midH8, arg2.midH8);
Carry = 1;
ENTRY:
arg1 = rl( arg1);
counter = decsz(counter);
} while (1);
if (sign & 0x80)
goto INVERT;
EXIT:
return arg1;
}
fixedU8_24 operator/ _xdivU8_24( fixedU8_24 arg1, fixedU8_24 arg2)
{
fixedU8_24 rm = 0;
char counter = sizeof(arg1)*8+24+1;
char c2 = sizeof(arg1)*8 + 1;
goto ENTRY;
do {
c2 = decsz(c2);
btsc(c2.7);
Carry = 0;
rm = rl( rm);
if (Carry)
goto SUBTRACT;
W = rm.low8 - arg2.low8;
genSubW( rm.midL8, arg2.midL8);
genSubW( rm.midH8, arg2.midH8);
genSubW( rm.high8, arg2.high8);
if (!Carry)
goto ENTRY;
SUBTRACT:
rm.low8 -= arg2.low8;
genSub( rm.midL8, arg2.midL8);
genSub( rm.midH8, arg2.midH8);
genSub( rm.high8, arg2.high8);
Carry = 1;
ENTRY:
arg1 = rl( arg1);
counter = decsz(counter);
} while (1);
return arg1;
}
fixed16_16 operator* _xmul16_16( fixed16_16 arg1, fixed16_16 arg2)
{
fixed16_16 rval;
char sign = arg1.high8 ^ arg2.high8;
if (arg1 < 0)
arg1 = -arg1;
if (arg2 < 0)
arg2 = -arg2;
#ifdef hw_mult8x8
uns8 tmpL;
hw_mult8x8( arg1.low8, arg2.low8); // p1
tmpL = hiRES;
rval = 0;
hw_mult8x8( arg1.midL8, arg2.low8); // p2
tmpL += loRES;
genAdd( rval.low8, hiRES);
genAdd( rval.midL8, 0);
hw_mult8x8( arg1.low8, arg2.midL8); // p2
tmpL += loRES;
genAdd( rval.low8, hiRES);
genAdd( rval.midL8, 0);
hw_mult8x8( arg1.midH8, arg2.low8); // p3
rval.low8 += loRES;
genAdd( rval.midL8, hiRES);
genAdd( rval.midH8, 0);
hw_mult8x8( arg1.midL8, arg2.midL8); // p3
rval.low8 += loRES;
genAdd( rval.midL8, hiRES);
genAdd( rval.midH8, 0);
hw_mult8x8( arg1.low8, arg2.midH8); // p3
rval.low8 += loRES;
genAdd( rval.midL8, hiRES);
genAdd( rval.midH8, 0);
hw_mult8x8( arg1.high8, arg2.low8); // p4
rval.midL8 += loRES;
genAdd( rval.midH8, hiRES);
genAdd( rval.high8, 0);
hw_mult8x8( arg1.midH8, arg2.midL8); // p4
rval.midL8 += loRES;
genAdd( rval.midH8, hiRES);
genAdd( rval.high8, 0);
hw_mult8x8( arg1.midL8, arg2.midH8); // p4
rval.midL8 += loRES;
genAdd( rval.midH8, hiRES);
genAdd( rval.high8, 0);
hw_mult8x8( arg1.low8, arg2.high8); // p4
rval.midL8 += loRES;
genAdd( rval.midH8, hiRES);
genAdd( rval.high8, 0);
hw_mult8x8( arg1.high8, arg2.midL8); // p5
rval.midH8 += loRES;
genAdd( rval.high8, hiRES);
hw_mult8x8( arg1.midH8, arg2.midH8); // p5
rval.midH8 += loRES;
genAdd( rval.high8, hiRES);
hw_mult8x8( arg1.midL8, arg2.high8); // p5
rval.midH8 += loRES;
genAdd( rval.high8, hiRES);
hw_mult8x8( arg1.high8, arg2.midH8); // p6
rval.high8 += loRES;
hw_mult8x8( arg1.midH8, arg2.high8); // p6
rval.high8 += loRES;
#else
char counter = sizeof(arg1)*8;
uns16 rvalH = 0;
rval.high16 = 0;
do {
arg1 = rr( arg1);
if (Carry) {
rval.midH8 += arg2.low8;
genAdd( rval.high8, arg2.midL8);
genAdd( rvalH.low8, arg2.midH8);
genAdd( rvalH.high8, arg2.high8);
}
rvalH = rr( rvalH);
rval = rr( rval);
counter = decsz(counter);
} while (1);
#endif
if (sign & 0x80)
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -