1/* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 * or http://www.opensolaris.org/os/licensing. 10 * See the License for the specific language governing permissions 11 * and limitations under the License. 12 * 13 * When distributing Covered Code, include this CDDL HEADER in each 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 * If applicable, add the following below this CDDL HEADER, with the 16 * fields enclosed by brackets "[]" replaced with your own identifying 17 * information: Portions Copyright [yyyy] [name of copyright owner] 18 * 19 * CDDL HEADER END 20 */ 21/* 22 * Copyright 2004 Sun Microsystems, Inc. All rights reserved. 23 * Use is subject to license terms. 24 */ 25 26 .file "_xtoull.s" 27 28#include <SYS.h> 29 30 .set cw,0 31 .set cw_old,2 32 .text 33 .align 16 34two_to_63: .4byte 0x5f000000 35 36 ENTRY(__xtoull) /* 387-stack to unsigned long long */ 37 subq $16,%rsp 38 fstcw cw_old(%rsp) 39 movw cw_old(%rsp),%ax 40 movw %ax,%cx 41 andw $0x0c00,%cx /* save RC */ 42 orw $0x0c00,%ax 43 movw %ax,cw(%rsp) 44 fldcw cw(%rsp) 45 flds two_to_63(%rip) 46 fcomip %st(1),%st /* compare 2**63 to x */ 47 jp .donotsub /* jump if x is NaN */ 48 ja .donotsub /* jump if 2**63 > x */ 49 fsubs two_to_63(%rip) /* subtract 2**63 */ 50.donotsub: 51 fistpll 8(%rsp) 52 fwait /* in case fistpll causes exception */ 53 movq 8(%rsp),%rax 54 jp .donotadd 55 ja .donotadd /* flags did not change */ 56 movq $0x8000000000000000,%rcx 57 addq %rcx,%rax /* add back 2**63 */ 58.donotadd: 59 fstcw cw(%rsp) /* fetch CW in case masks changed */ 60 movw cw(%rsp),%dx 61 andw $0xf3ff,%dx 62 orw %cx,%dx /* restore RC */ 63 movw %dx,cw(%rsp) 64 fldcw cw(%rsp) 65 addq $16,%rsp 66 ret 67 SET_SIZE(__xtoull) 68