/* | |
* linux/arch/arm/lib/muldi3.S | |
* | |
* Author: Nicolas Pitre | |
* Created: Oct 19, 2005 | |
* Copyright: Monta Vista Software, Inc. | |
* | |
* This program is free software; you can redistribute it and/or modify | |
* it under the terms of the GNU General Public License version 2 as | |
* published by the Free Software Foundation. | |
*/ | |
#include <linux/linkage.h> | |
#include <asm/assembler.h> | |
#ifdef __ARMEB__ | |
#define xh r0 | |
#define xl r1 | |
#define yh r2 | |
#define yl r3 | |
#else | |
#define xl r0 | |
#define xh r1 | |
#define yl r2 | |
#define yh r3 | |
#endif | |
ENTRY(__muldi3) | |
ENTRY(__aeabi_lmul) | |
mul xh, yl, xh | |
mla xh, xl, yh, xh | |
mov ip, xl, lsr #16 | |
mov yh, yl, lsr #16 | |
bic xl, xl, ip, lsl #16 | |
bic yl, yl, yh, lsl #16 | |
mla xh, yh, ip, xh | |
mul yh, xl, yh | |
mul xl, yl, xl | |
mul ip, yl, ip | |
adds xl, xl, yh, lsl #16 | |
adc xh, xh, yh, lsr #16 | |
adds xl, xl, ip, lsl #16 | |
adc xh, xh, ip, lsr #16 | |
ret lr | |
ENDPROC(__muldi3) | |
ENDPROC(__aeabi_lmul) |