1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
#include "libgcc.h" union DWunion { struct { s32 high; s32 low; } s; s64 ll; }; s64 __muldi3(s64 u, s64 v) { const union DWunion uu = { .ll = u }; const union DWunion vv = { .ll = v }; union DWunion w = { .ll = __umulsidi3(uu.s.low, vv.s.low) }; w.s.high += ((u32)uu.s.low * (u32)vv.s.high + (u32)uu.s.high * (u32)vv.s.low); return w.ll; } EXPORT_SYMBOL(__muldi3);