1/* $OpenBSD: fixunsdfsi.S,v 1.7 2014/11/14 07:31:13 daniel Exp $ */ 2/*- 3 * Copyright (c) 1990 The Regents of the University of California. 4 * All rights reserved. 5 * 6 * This code is derived from software contributed to Berkeley by 7 * William Jolitz. 8 * 9 * Redistribution and use in source and binary forms, with or without 10 * modification, are permitted provided that the following conditions 11 * are met: 12 * 1. Redistributions of source code must retain the above copyright 13 * notice, this list of conditions and the following disclaimer. 14 * 2. Redistributions in binary form must reproduce the above copyright 15 * notice, this list of conditions and the following disclaimer in the 16 * documentation and/or other materials provided with the distribution. 17 * 3. Neither the name of the University nor the names of its contributors 18 * may be used to endorse or promote products derived from this software 19 * without specific prior written permission. 20 * 21 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 22 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 24 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 25 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 31 * SUCH DAMAGE. 32 */ 33 34#include <machine/asm.h> 35 36ENTRY(__fixunsdfsi) 37 fldl 4(%esp) /* argument double to accum stack */ 38 frndint /* create integer */ 39#ifdef __PIC__ 40 PIC_PROLOGUE 41 leal PIC_GOTOFF(fbiggestsigned),%eax 42 PIC_EPILOGUE 43 fcoml (%eax) 44#else 45 fcoml fbiggestsigned /* bigger than biggest signed? */ 46#endif 47 fstsw %ax 48 sahf 49 jnb 1f 50 51 fistpl 4(%esp) 52 movl 4(%esp),%eax 53 ret 54 551: 56#ifdef __PIC__ 57 PIC_PROLOGUE 58 leal PIC_GOTOFF(fbiggestsigned),%eax 59 PIC_EPILOGUE 60 fsubl (%eax) 61#else 62 fsubl fbiggestsigned /* reduce for proper conversion */ 63#endif 64 fistpl 4(%esp) /* convert */ 65 movl 4(%esp),%eax 66 orl $0x80000000,%eax /* restore bias */ 67 ret 68 69fbiggestsigned: .double 2147483648.0 70