log.s revision ddc0e0b53c661f6e439e3b7072b3ef353eadb4af
9512fe850e98fdd448c638ca63fdd92a8a510255ahl/*
9512fe850e98fdd448c638ca63fdd92a8a510255ahl * CDDL HEADER START
9512fe850e98fdd448c638ca63fdd92a8a510255ahl *
9512fe850e98fdd448c638ca63fdd92a8a510255ahl * The contents of this file are subject to the terms of the
9512fe850e98fdd448c638ca63fdd92a8a510255ahl * Common Development and Distribution License (the "License").
9512fe850e98fdd448c638ca63fdd92a8a510255ahl * You may not use this file except in compliance with the License.
9512fe850e98fdd448c638ca63fdd92a8a510255ahl *
9512fe850e98fdd448c638ca63fdd92a8a510255ahl * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9512fe850e98fdd448c638ca63fdd92a8a510255ahl * or http://www.opensolaris.org/os/licensing.
9512fe850e98fdd448c638ca63fdd92a8a510255ahl * See the License for the specific language governing permissions
9512fe850e98fdd448c638ca63fdd92a8a510255ahl * and limitations under the License.
9512fe850e98fdd448c638ca63fdd92a8a510255ahl *
9512fe850e98fdd448c638ca63fdd92a8a510255ahl * When distributing Covered Code, include this CDDL HEADER in each
9512fe850e98fdd448c638ca63fdd92a8a510255ahl * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
9512fe850e98fdd448c638ca63fdd92a8a510255ahl * If applicable, add the following below this CDDL HEADER, with the
9512fe850e98fdd448c638ca63fdd92a8a510255ahl * fields enclosed by brackets "[]" replaced with your own identifying
9512fe850e98fdd448c638ca63fdd92a8a510255ahl * information: Portions Copyright [yyyy] [name of copyright owner]
9512fe850e98fdd448c638ca63fdd92a8a510255ahl *
9512fe850e98fdd448c638ca63fdd92a8a510255ahl * CDDL HEADER END
9512fe850e98fdd448c638ca63fdd92a8a510255ahl */
9512fe850e98fdd448c638ca63fdd92a8a510255ahl/*
9512fe850e98fdd448c638ca63fdd92a8a510255ahl * Copyright 2011 Nexenta Systems, Inc. All rights reserved.
9512fe850e98fdd448c638ca63fdd92a8a510255ahl */
9512fe850e98fdd448c638ca63fdd92a8a510255ahl/*
9512fe850e98fdd448c638ca63fdd92a8a510255ahl * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
9512fe850e98fdd448c638ca63fdd92a8a510255ahl * Use is subject to license terms.
9512fe850e98fdd448c638ca63fdd92a8a510255ahl */
9512fe850e98fdd448c638ca63fdd92a8a510255ahl
9512fe850e98fdd448c638ca63fdd92a8a510255ahl .file "log.s"
9512fe850e98fdd448c638ca63fdd92a8a510255ahl
9512fe850e98fdd448c638ca63fdd92a8a510255ahl#include "libm.h"
9512fe850e98fdd448c638ca63fdd92a8a510255ahlLIBM_ANSI_PRAGMA_WEAK(log,function)
9512fe850e98fdd448c638ca63fdd92a8a510255ahl#include "libm_protos.h"
9512fe850e98fdd448c638ca63fdd92a8a510255ahl
9512fe850e98fdd448c638ca63fdd92a8a510255ahl ENTRY(log)
9512fe850e98fdd448c638ca63fdd92a8a510255ahl fldln2 / loge(2)
9512fe850e98fdd448c638ca63fdd92a8a510255ahl movl 8(%esp),%eax / eax <-- hi_32(x)
9512fe850e98fdd448c638ca63fdd92a8a510255ahl testl $0x80000000,%eax
9512fe850e98fdd448c638ca63fdd92a8a510255ahl jnz .maybe_0_or_less
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomee testl $0x7fffffff,%eax
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomee jz .maybe_0
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomee fldl 4(%esp) / arg, loge(2)
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomee fyl2x / loge(2)*log2(arg); ln(arg)
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomee ret
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomee
9512fe850e98fdd448c638ca63fdd92a8a510255ahl.maybe_0:
9512fe850e98fdd448c638ca63fdd92a8a510255ahl movl 4(%esp),%ecx / ecx <-- lo_32(x)
9512fe850e98fdd448c638ca63fdd92a8a510255ahl cmpl $0,%ecx
9512fe850e98fdd448c638ca63fdd92a8a510255ahl je .zero / no branch if x is +denormal
9512fe850e98fdd448c638ca63fdd92a8a510255ahl.neg_nan_reentry:
9512fe850e98fdd448c638ca63fdd92a8a510255ahl fldl 4(%esp) / arg, loge(2)
9512fe850e98fdd448c638ca63fdd92a8a510255ahl fyl2x / loge(2)*log2(arg); ln(arg)
9512fe850e98fdd448c638ca63fdd92a8a510255ahl ret
9512fe850e98fdd448c638ca63fdd92a8a510255ahl
9512fe850e98fdd448c638ca63fdd92a8a510255ahl.zero_or_less:
9512fe850e98fdd448c638ca63fdd92a8a510255ahl / x =< 0
9512fe850e98fdd448c638ca63fdd92a8a510255ahl testl $0x7fffffff,%eax
9512fe850e98fdd448c638ca63fdd92a8a510255ahl jnz .less_than_0
movl 4(%esp),%ecx / ecx <-- lo_32(x)
cmpl $0,%ecx
jne .less_than_0 / branch if x is -denormal
.zero:
/ x = +/-0
pushl %ebp
movl %esp,%ebp
PIC_SETUP(1)
pushl $16
jmp .merge
.maybe_0_or_less:
cmpl $0xfff00000,%eax / -INF below hi_32(x)?
ja .neg_nan_reentry
jb .zero_or_less
movl 4(%esp),%ecx / ecx <-- lo_32(x)
cmpl $0,%ecx / is x NaN or -INF?
jne .neg_nan_reentry / branch if x is NaN with signbit = 1
/ x = -INF
.less_than_0:
pushl %ebp
movl %esp,%ebp
PIC_SETUP(2)
pushl $17
.merge:
fstp %st(0) / stack empty
pushl 12(%ebp)
pushl 8(%ebp)
pushl 12(%ebp)
pushl 8(%ebp)
call PIC_F(_SVID_libm_err)
addl $20,%esp
PIC_WRAPUP
leave
ret
.align 4
SET_SIZE(log)