__vlog.S revision 25c28e83beb90e7c80452a7c818c5e6f73a07dc8
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * CDDL HEADER START
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * The contents of this file are subject to the terms of the
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * Common Development and Distribution License (the "License").
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * You may not use this file except in compliance with the License.
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * or http://www.opensolaris.org/os/licensing.
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * See the License for the specific language governing permissions
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * and limitations under the License.
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * When distributing Covered Code, include this CDDL HEADER in each
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * If applicable, add the following below this CDDL HEADER, with the
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * fields enclosed by brackets "[]" replaced with your own identifying
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * information: Portions Copyright [yyyy] [name of copyright owner]
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * CDDL HEADER END
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * Copyright 2011 Nexenta Systems, Inc. All rights reserved.
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * Use is subject to license terms.
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis .word 0x3ea62e42,0xfee00000 ! scaled by 2**-20
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis .word 0x3caa39ef,0x35793c76 ! scaled by 2**-20
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis! sizeof temp storage - must be a multiple of 16 for V9
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis wr %g0,0x82,%asi ! set %asi for non-faulting loads
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis fpadd32s %f0,%f31,%f4 ! n = (ix + 0xc0194000) & 0xfff00000
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis bge,pn %icc,.range0 ! ix <= 0x000fffff or >= 0x7ff00000
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis fpadd32s %f0,%f30,%f2 ! v.l[0] = u.l[0] + 0x4000
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis fmuld %f32,%f60,%f34 ! h = n * ln2hi + TBL[j]
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis fmuld %f32,%f62,%f32 ! t = n * ln2lo + TBL[j+1]
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis fpadd32s %f10,%f31,%f14 ! n = (ix + 0xc0194000) & 0xfff00000
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis fmuld %f16,%f12,%f8 ! (previous iteration)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis bge,pn %icc,.range1 ! ix <= 0x000fffff or >= 0x7ff00000
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis fpadd32s %f10,%f30,%f12 ! v.l[0] = u.l[0] + 0x4000
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis fand %f12,%f50,%f12 ! v.l &= 0xffff8000...
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis faddd %f10,%f12,%f16 ! s = f / (u.d + v.d)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis fmuld %f42,%f60,%f44 ! h = n * ln2hi + TBL[j]
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis fmuld %f42,%f62,%f42 ! t = n * ln2lo + TBL[j+1]
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis fpadd32s %f20,%f31,%f24 ! n = (ix + 0xc0194000) & 0xfff00000
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis fmuld %f26,%f22,%f8 ! (previous iteration)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis bge,pn %icc,.range2 ! ix <= 0x000fffff or >= 0x7ff00000
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis fpadd32s %f20,%f30,%f22 ! v.l[0] = u.l[0] + 0x4000
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis fand %f22,%f50,%f22 ! v.l &= 0xffff8000...
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis faddd %f20,%f22,%f26 ! s = f / (u.d + v.d)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis fmuld %f52,%f60,%f54 ! h = n * ln2hi + TBL[j]
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis fmuld %f52,%f62,%f52 ! t = n * ln2lo + TBL[j+1]
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis! Once we get to the last element, we loop three more times to finish
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis! the computations in progress. This means we will load past the end
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis! of the argument vector, but since we use non-faulting loads and never
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis! use the data, the only potential problem is cache miss. (Note that
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis! when the argument is 2, the only exception that occurs in the compu-
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis! tation is an inexact result in the final addition, and we break out
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis sethi %hi(0x40000000),%l0 ! "next argument" = two
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis sethi %hi(0x40000000),%l1 ! "next argument" = two
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis sethi %hi(0x40000000),%l2 ! "next argument" = two
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis bgeu,pn %icc,2f ! if (unsigned) ix >= 0x7ff00000
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis fxtod %f0,%f0 ! scale by 2**1074 w/o trapping
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis fpadd32s %f0,%f31,%f4 ! n = (ix + 0xc0194000) & 0xfff00000
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis bgeu,pn %icc,2f ! if (unsigned) ix >= 0x7ff00000
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis fxtod %f10,%f10 ! scale by 2**1074 w/o trapping
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis fpadd32s %f10,%f31,%f14 ! n = (ix + 0xc0194000) & 0xfff00000
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis bgeu,pn %icc,2f ! if (unsigned) ix >= 0x7ff00000
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis fxtod %f20,%f20 ! scale by 2**1074 w/o trapping
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis fpadd32s %f20,%f31,%f24 ! n = (ix + 0xc0194000) & 0xfff00000