s_floor.s   [plain text]


/*
 * Written by Ian Ollmann
 * Copyright © 2005, Apple Computer Inc. All rights reserved.
 */

#include <machine/asm.h>
#include "abi.h"


ENTRY( floorl )
	XMM_ONE_ARG_LONG_DOUBLE_PROLOGUE
	fldt		ARG_LONG_DOUBLE_ONE			//{ f }
	frndint									//{ rounded }
	fldt		ARG_LONG_DOUBLE_ONE			//{ f, rounded }
	fucomi		%ST(1), %ST					//  test for f > rounded
	fldz									//{ 0, f, rounded } 
	fld1									//{ 1, 0, f, rounded }
	fcmovnb		%ST(1), %ST(0)				//{ 0 or 1, 0, f, rounded }
	fsubrp		%ST(0), %ST(3)				//{ 0, f, rounded - (0 or 1) }
	fucomip		%ST(1), %ST					//{ f, rounded - (0 or 1) }
	fcmovne		%ST(1), %ST(0)				//{ correct, rounded - (0 or 1)}
	fstp		%ST(1)

	XMM_LONG_DOUBLE_EPILOGUE
	ret