18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * Copyright (C) 1999-2000 Hewlett-Packard Co 48c2ecf20Sopenharmony_ci * Copyright (C) 1999-2000 David Mosberger-Tang <davidm@hpl.hp.com> 58c2ecf20Sopenharmony_ci * 68c2ecf20Sopenharmony_ci * 64-bit integer division. 78c2ecf20Sopenharmony_ci * 88c2ecf20Sopenharmony_ci * This code is based on the application note entitled "Divide, Square Root 98c2ecf20Sopenharmony_ci * and Remainder Algorithms for the IA-64 Architecture". This document 108c2ecf20Sopenharmony_ci * is available as Intel document number 248725-002 or via the web at 118c2ecf20Sopenharmony_ci * http://developer.intel.com/software/opensource/numerics/ 128c2ecf20Sopenharmony_ci * 138c2ecf20Sopenharmony_ci * For more details on the theory behind these algorithms, see "IA-64 148c2ecf20Sopenharmony_ci * and Elementary Functions" by Peter Markstein; HP Professional Books 158c2ecf20Sopenharmony_ci * (http://www.goodreads.com/book/show/2019887.Ia_64_and_Elementary_Functions) 168c2ecf20Sopenharmony_ci */ 178c2ecf20Sopenharmony_ci 188c2ecf20Sopenharmony_ci#include <asm/asmmacro.h> 198c2ecf20Sopenharmony_ci#include <asm/export.h> 208c2ecf20Sopenharmony_ci 218c2ecf20Sopenharmony_ci#ifdef MODULO 228c2ecf20Sopenharmony_ci# define OP mod 238c2ecf20Sopenharmony_ci#else 248c2ecf20Sopenharmony_ci# define OP div 258c2ecf20Sopenharmony_ci#endif 268c2ecf20Sopenharmony_ci 278c2ecf20Sopenharmony_ci#ifdef UNSIGNED 288c2ecf20Sopenharmony_ci# define SGN u 298c2ecf20Sopenharmony_ci# define INT_TO_FP(a,b) fcvt.xuf.s1 a=b 308c2ecf20Sopenharmony_ci# define FP_TO_INT(a,b) fcvt.fxu.trunc.s1 a=b 318c2ecf20Sopenharmony_ci#else 328c2ecf20Sopenharmony_ci# define SGN 338c2ecf20Sopenharmony_ci# define INT_TO_FP(a,b) fcvt.xf a=b 348c2ecf20Sopenharmony_ci# define FP_TO_INT(a,b) fcvt.fx.trunc.s1 a=b 358c2ecf20Sopenharmony_ci#endif 368c2ecf20Sopenharmony_ci 378c2ecf20Sopenharmony_ci#define PASTE1(a,b) a##b 388c2ecf20Sopenharmony_ci#define PASTE(a,b) PASTE1(a,b) 398c2ecf20Sopenharmony_ci#define NAME PASTE(PASTE(__,SGN),PASTE(OP,di3)) 408c2ecf20Sopenharmony_ci 418c2ecf20Sopenharmony_ciGLOBAL_ENTRY(NAME) 428c2ecf20Sopenharmony_ci .regstk 2,0,0,0 438c2ecf20Sopenharmony_ci // Transfer inputs to FP registers. 448c2ecf20Sopenharmony_ci setf.sig f8 = in0 458c2ecf20Sopenharmony_ci setf.sig f9 = in1 468c2ecf20Sopenharmony_ci ;; 478c2ecf20Sopenharmony_ci // Convert the inputs to FP, to avoid FP software-assist faults. 488c2ecf20Sopenharmony_ci INT_TO_FP(f8, f8) 498c2ecf20Sopenharmony_ci INT_TO_FP(f9, f9) 508c2ecf20Sopenharmony_ci ;; 518c2ecf20Sopenharmony_ci frcpa.s1 f11, p6 = f8, f9 // y0 = frcpa(b) 528c2ecf20Sopenharmony_ci ;; 538c2ecf20Sopenharmony_ci(p6) fmpy.s1 f7 = f8, f11 // q0 = a*y0 548c2ecf20Sopenharmony_ci(p6) fnma.s1 f6 = f9, f11, f1 // e0 = -b*y0 + 1 558c2ecf20Sopenharmony_ci ;; 568c2ecf20Sopenharmony_ci(p6) fma.s1 f10 = f7, f6, f7 // q1 = q0*e0 + q0 578c2ecf20Sopenharmony_ci(p6) fmpy.s1 f7 = f6, f6 // e1 = e0*e0 588c2ecf20Sopenharmony_ci ;; 598c2ecf20Sopenharmony_ci#ifdef MODULO 608c2ecf20Sopenharmony_ci sub in1 = r0, in1 // in1 = -b 618c2ecf20Sopenharmony_ci#endif 628c2ecf20Sopenharmony_ci(p6) fma.s1 f10 = f10, f7, f10 // q2 = q1*e1 + q1 638c2ecf20Sopenharmony_ci(p6) fma.s1 f6 = f11, f6, f11 // y1 = y0*e0 + y0 648c2ecf20Sopenharmony_ci ;; 658c2ecf20Sopenharmony_ci(p6) fma.s1 f6 = f6, f7, f6 // y2 = y1*e1 + y1 668c2ecf20Sopenharmony_ci(p6) fnma.s1 f7 = f9, f10, f8 // r = -b*q2 + a 678c2ecf20Sopenharmony_ci ;; 688c2ecf20Sopenharmony_ci#ifdef MODULO 698c2ecf20Sopenharmony_ci setf.sig f8 = in0 // f8 = a 708c2ecf20Sopenharmony_ci setf.sig f9 = in1 // f9 = -b 718c2ecf20Sopenharmony_ci#endif 728c2ecf20Sopenharmony_ci(p6) fma.s1 f11 = f7, f6, f10 // q3 = r*y2 + q2 738c2ecf20Sopenharmony_ci ;; 748c2ecf20Sopenharmony_ci FP_TO_INT(f11, f11) // q = trunc(q3) 758c2ecf20Sopenharmony_ci ;; 768c2ecf20Sopenharmony_ci#ifdef MODULO 778c2ecf20Sopenharmony_ci xma.l f11 = f11, f9, f8 // r = q*(-b) + a 788c2ecf20Sopenharmony_ci ;; 798c2ecf20Sopenharmony_ci#endif 808c2ecf20Sopenharmony_ci getf.sig r8 = f11 // transfer result to result register 818c2ecf20Sopenharmony_ci br.ret.sptk.many rp 828c2ecf20Sopenharmony_ciEND(NAME) 838c2ecf20Sopenharmony_ciEXPORT_SYMBOL(NAME) 84