1;; Copyright (C) 2010 Texas Instruments Incorporated 2;; Contributed by Mark Salter <msalter@redhat.com>. 3;; 4;; This program is free software; you can redistribute it and/or modify 5;; it under the terms of the GNU General Public License as published by 6;; the Free Software Foundation; either version 2 of the License, or 7;; (at your option) any later version. 8;; 9;; This program is distributed in the hope that it will be useful, 10;; but WITHOUT ANY WARRANTY; without even the implied warranty of 11;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12;; GNU General Public License for more details. 13;; 14;; You should have received a copy of the GNU General Public License 15;; along with this program; if not, write to the Free Software 16;; Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 17 18#include <linux/linkage.h> 19 20 ;; uint64_t __c6xabi_mpyll(uint64_t x, uint64_t y) 21 ;; 22 ;; 64x64 multiply 23 ;; First compute partial results using 32-bit parts of x and y: 24 ;; 25 ;; b63 b32 b31 b0 26 ;; ----------------------------- 27 ;; | 1 | 0 | 28 ;; ----------------------------- 29 ;; 30 ;; P0 = X0*Y0 31 ;; P1 = X0*Y1 + X1*Y0 32 ;; P2 = X1*Y1 33 ;; 34 ;; result = (P2 << 64) + (P1 << 32) + P0 35 ;; 36 ;; Since the result is also 64-bit, we can skip the P2 term. 37 38 .text 39ENTRY(__c6xabi_mpyll) 40 mpy32u .m1x A4,B4,A1:A0 ; X0*Y0 41 b .s2 B3 42 || mpy32u .m2x B5,A4,B1:B0 ; X0*Y1 (don't need upper 32-bits) 43 || mpy32u .m1x A5,B4,A3:A2 ; X1*Y0 (don't need upper 32-bits) 44 nop 45 nop 46 mv .s1 A0,A4 47 add .l1x A2,B0,A5 48 add .s1 A1,A5,A5 49ENDPROC(__c6xabi_mpyll) 50