__moddi3.S revision 110725
166633Sdfr.file "__moddi3.s" 266633Sdfr 366633Sdfr// $FreeBSD: head/sys/libkern/ia64/__moddi3.S 110725 2003-02-11 20:15:11Z schweikh $ 466633Sdfr// 566633Sdfr// Copyright (c) 2000, Intel Corporation 666633Sdfr// All rights reserved. 766633Sdfr// 866633Sdfr// Contributed 2/15/2000 by Marius Cornea, John Harrison, Cristina Iordache, 966633Sdfr// Ted Kubaska, Bob Norin, and Shane Story of the Computational Software Lab, 1066633Sdfr// Intel Corporation. 1166633Sdfr// 1266633Sdfr// WARRANTY DISCLAIMER 1366633Sdfr// 1466633Sdfr// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1566633Sdfr// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 1666633Sdfr// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 1766633Sdfr// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR ITS 1866633Sdfr// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 1966633Sdfr// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 2066633Sdfr// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 2166633Sdfr// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 2266633Sdfr// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY OR TORT (INCLUDING 2366633Sdfr// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 2466633Sdfr// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2566633Sdfr// 2666633Sdfr// Intel Corporation is the author of this code, and requests that all 2766633Sdfr// problem reports or change requests be submitted to it directly at 2866633Sdfr// http://developer.intel.com/opensource. 2966633Sdfr// 3066633Sdfr 3166633Sdfr.section .text 3266633Sdfr 3366633Sdfr// 64-bit signed integer remainder 3466633Sdfr 3566633Sdfr.proc __moddi3# 3666633Sdfr.align 32 3766633Sdfr.global __moddi3# 3866633Sdfr.align 32 3966633Sdfr 4066633Sdfr__moddi3: 4166633Sdfr 4266633Sdfr{ .mii 4366633Sdfr alloc r31=ar.pfs,3,0,0,0 4466633Sdfr nop.i 0 4566633Sdfr nop.i 0 4666633Sdfr} { .mmb 4766633Sdfr 4866633Sdfr // 64-BIT SIGNED INTEGER REMAINDER BEGINS HERE 4966633Sdfr 5066633Sdfr // general register used: 51110725Sschweikh // r32 - 64-bit signed integer dividend, called a below 52110725Sschweikh // r33 - 64-bit signed integer divisor, called b below 5366633Sdfr // r8 - 64-bit signed integer result 5466633Sdfr // r2 - scratch register 5566633Sdfr // floating-point registers used: f6, f7, f8, f9, f10, f11, f12 5666633Sdfr // predicate registers used: p6 5766633Sdfr 58110725Sschweikh setf.sig f12=r32 // holds a in integer form 5966633Sdfr setf.sig f7=r33 6066633Sdfr nop.b 0 6166633Sdfr} { .mlx 6266633Sdfr nop.m 0 6366633Sdfr //movl r2=0x8000000000000000;; 6466633Sdfr movl r2=0xffffffffffffffff;; 6566633Sdfr} { .mfi 6666633Sdfr // get the 2's complement of b 6766633Sdfr sub r33=r0,r33 6866633Sdfr fcvt.xf f6=f12 6966633Sdfr nop.i 0 7066633Sdfr} { .mfi 7166633Sdfr nop.m 0 7266633Sdfr fcvt.xf f7=f7 7366633Sdfr nop.i 0;; 7466633Sdfr} { .mfi 7566633Sdfr nop.m 0 7666633Sdfr // Step (1) 7766633Sdfr // y0 = 1 / b in f8 7866633Sdfr frcpa.s1 f8,p6=f6,f7 7966633Sdfr nop.i 0;; 8066633Sdfr} { .mfi 8166633Sdfr nop.m 0 8266633Sdfr // Step (2) 8366633Sdfr // q0 = a * y0 in f10 8466633Sdfr (p6) fma.s1 f10=f6,f8,f0 8566633Sdfr nop.i 0 8666633Sdfr} { .mfi 8766633Sdfr nop.m 0 8866633Sdfr // Step (3) 8966633Sdfr // e0 = 1 - b * y0 in f9 9066633Sdfr (p6) fnma.s1 f9=f7,f8,f1 9166633Sdfr nop.i 0;; 9266633Sdfr} { .mfi 9366633Sdfr nop.m 0 9466633Sdfr // Step (4) 9566633Sdfr // q1 = q0 + e0 * q0 in f10 9666633Sdfr (p6) fma.s1 f10=f9,f10,f10 9766633Sdfr nop.i 0 9866633Sdfr} { .mfi 9966633Sdfr nop.m 0 10066633Sdfr // Step (5) 10166633Sdfr // e1 = e0 * e0 in f11 10266633Sdfr (p6) fma.s1 f11=f9,f9,f0 10366633Sdfr nop.i 0;; 10466633Sdfr} { .mfi 10566633Sdfr nop.m 0 10666633Sdfr // Step (6) 10766633Sdfr // y1 = y0 + e0 * y0 in f8 10866633Sdfr (p6) fma.s1 f8=f9,f8,f8 10966633Sdfr nop.i 0;; 11066633Sdfr} { .mfi 11166633Sdfr nop.m 0 11266633Sdfr // Step (7) 11366633Sdfr // q2 = q1 + e1 * q1 in f9 11466633Sdfr (p6) fma.s1 f9=f11,f10,f10 11566633Sdfr nop.i 0;; 11666633Sdfr} { .mfi 11766633Sdfr nop.m 0 11866633Sdfr // Step (8) 11966633Sdfr // y2 = y1 + e1 * y1 in f8 12066633Sdfr (p6) fma.s1 f8=f11,f8,f8 12166633Sdfr nop.i 0;; 12266633Sdfr} { .mfi 12366633Sdfr nop.m 0 12466633Sdfr // Step (9) 12566633Sdfr // r2 = a - b * q2 in f10 12666633Sdfr (p6) fnma.s1 f10=f7,f9,f6 12766633Sdfr nop.i 0;; 12866633Sdfr} { .mfi 12966633Sdfr setf.sig f7=r33 13066633Sdfr // Step (10) 13166633Sdfr // q3 = q2 + r2 * y2 in f8 13266633Sdfr (p6) fma.s1 f8=f10,f8,f9 13366633Sdfr nop.i 0;; 13466633Sdfr} { .mfi 13566633Sdfr nop.m 0 13666633Sdfr // (11) q = trunc(q3) 13766633Sdfr fcvt.fx.trunc.s1 f8=f8 13866633Sdfr nop.i 0;; 13966633Sdfr} { .mfi 14066633Sdfr nop.m 0 14166633Sdfr // (12) r = a + (-b) * q 14266633Sdfr xma.l f8=f8,f7,f12 14366633Sdfr nop.i 0;; 14466633Sdfr} { .mib 14566633Sdfr getf.sig r8=f8 14666633Sdfr nop.i 0 14766633Sdfr nop.b 0 14866633Sdfr} 14966633Sdfr 15066633Sdfr // 64-BIT SIGNED INTEGER REMAINDER ENDS HERE 15166633Sdfr 15266633Sdfr{ .mib 15366633Sdfr nop.m 0 15466633Sdfr nop.i 0 15566633Sdfr br.ret.sptk b0;; 15666633Sdfr} 15766633Sdfr 15866633Sdfr.endp __moddi3 159