X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=device%2Flib%2F_mullong.c;h=6a0669ff4a2b0576b984e6d9a4abdc2bae3066f7;hb=d2da99feec099aa224e1db53bc5a1ed42ed51ec9;hp=1a37ce255c5e68d83237cb5185c9b09f59299714;hpb=7c10ac7e90bbe4388df1271052c3b01cb1a230b1;p=fw%2Fsdcc diff --git a/device/lib/_mullong.c b/device/lib/_mullong.c index 1a37ce25..6a0669ff 100644 --- a/device/lib/_mullong.c +++ b/device/lib/_mullong.c @@ -542,6 +542,34 @@ union bil { |3.0| G |-------> only this side 32 x 32 -> 32 */ +#if defined(SDCC_USE_XSTACK) +// currently the original code without u fails with --xstack +// it runs out of pointer registers +long +_mullong (long a, long b) +{ + union bil t, u; + + t.i.hi = bcast(a)->b.b0 * bcast(b)->b.b2; // A + t.i.lo = bcast(a)->b.b0 * bcast(b)->b.b0; // A + u.bi.b3 = bcast(a)->b.b0 * bcast(b)->b.b3; // B + u.bi.i12 = bcast(a)->b.b0 * bcast(b)->b.b1; // B + u.bi.b0 = 0; // B + t.l += u.l; + + t.b.b3 += bcast(a)->b.b3 * bcast(b)->b.b0; // G + t.b.b3 += bcast(a)->b.b2 * bcast(b)->b.b1; // F + t.i.hi += bcast(a)->b.b2 * bcast(b)->b.b0; // E + t.i.hi += bcast(a)->b.b1 * bcast(b)->b.b1; // D + + u.bi.b3 = bcast(a)->b.b1 * bcast(b)->b.b2; // C + u.bi.i12 = bcast(a)->b.b1 * bcast(b)->b.b0; // C + u.bi.b0 = 0; // C + t.l += u.l; + + return t.l; +} +#else long _mullong (long a, long b) { @@ -572,5 +600,6 @@ _mullong (long a, long b) return t.l + b; } +#endif #endif // _MULLONG_ASM