| /** | 
 |  * This file has no copyright assigned and is placed in the Public Domain. | 
 |  * This file is part of the mingw-w64 runtime package. | 
 |  * No warranty is given; refer to the file DISCLAIMER.PD within this package. | 
 |  */ | 
 | #include <_mingw_mac.h> | 
 |  | 
 | 	.file	"ceil.S" | 
 | 	.text | 
 | 	.align 4 | 
 | 	.globl __MINGW_USYMBOL(ceil) | 
 | 	.def	__MINGW_USYMBOL(ceil);	.scl	2;	.type	32;	.endef | 
 | #ifdef __x86_64__ | 
 | 	.seh_proc	__MINGW_USYMBOL(ceil) | 
 | #endif | 
 |  | 
 | __MINGW_USYMBOL(ceil): | 
 | #if defined(_AMD64_) || defined(__x86_64__) | 
 | 	.seh_endprologue | 
 | 	movd %xmm0, %rax | 
 | 	movq	%rax, %rcx | 
 | 	sarq	$52, %rcx | 
 | 	andl	$2047, %ecx | 
 | 	subl	$1023, %ecx | 
 | 	cmpl	$51, %ecx | 
 | 	jg	.is_intnaninf | 
 | 	/* Is x zero? */ | 
 | 	testq	%rax, %rax | 
 | 	je	.ret_org | 
 | 	/* Is x signed? */ | 
 | 	testl	%ecx, %ecx | 
 | 	js	.signed_val | 
 | 	/* Is x integral? */ | 
 | 	movabsq	$4503599627370495, %rdx | 
 | 	sarq	%cl, %rdx | 
 | 	testq	%rax, %rdx | 
 | 	je	.ret_org | 
 | 	addsd	.huge(%rip), %xmm0 | 
 | 	ucomisd	.zero(%rip), %xmm0 | 
 | 	jbe	.doret | 
 | 	testq	%rax, %rax | 
 | 	jle	.l1 | 
 | 	/* inexact ... */ | 
 | 	movabsq	$4503599627370496, %r8 | 
 | 	shrq	%cl, %r8 | 
 | 	addq	%r8, %rax | 
 | .l1: | 
 | 	notq	%rdx | 
 | 	andq	%rdx, %rax | 
 | .doret: | 
 | 	movd %rax, %xmm0 | 
 | 	ret | 
 | 	.p2align 4,,10 | 
 | .signed_val: | 
 | 	addsd	.huge(%rip), %xmm0 | 
 | 	ucomisd	.zero(%rip), %xmm0 | 
 | 	jbe	.doret2 | 
 | 	testq	%rax, %rax | 
 | 	movabsq	$4607182418800017408, %rdx | 
 | 	movabsq	$-9223372036854775808, %rax | 
 | 	cmovns	%rdx, %rax | 
 | 	.p2align 4,,10 | 
 | .doret2: | 
 | 	movd %rax, %xmm0 | 
 | 	ret | 
 |  | 
 | 	.p2align 4,,10 | 
 | .is_intnaninf: | 
 | 	/* Is Nan or Inf? */ | 
 | 	cmpl	$1024, %ecx | 
 | 	je	.ret_naninf | 
 | 	.p2align 4,,10 | 
 | .ret_org: | 
 | 	/* return x.  */ | 
 | 	rep | 
 | 	ret | 
 | 	.p2align 4,,10 | 
 | .ret_naninf: | 
 | 	/* return x + x; */ | 
 | 	addsd	%xmm0, %xmm0 | 
 | 	ret | 
 | 	.seh_endproc | 
 |  | 
 | /* local data.  */ | 
 | 	.section .rdata,"dr" | 
 | 	.align 8 | 
 | .huge: | 
 | 	.long	-2013235812 | 
 | 	.long	2117592124 | 
 | 	.align 8 | 
 | .zero: | 
 | 	.long	0 | 
 | 	.long	0 | 
 | #elif defined(_X86_) || defined(__i386__) | 
 | 	fldl	4(%esp) | 
 | 	subl	$8,%esp | 
 |  | 
 | 	fstcw	4(%esp)			/* store fpu control word */ | 
 |  | 
 | 	/* We use here %edx although only the low 1 bits are defined. | 
 | 	   But none of the operations should care and they are faster | 
 | 	   than the 16 bit operations.  */ | 
 | 	movl	$0x0800,%edx		/* round towards +oo */ | 
 | 	orl	4(%esp),%edx | 
 | 	andl	$0xfbff,%edx | 
 | 	movl	%edx,(%esp) | 
 | 	fldcw	(%esp)			/* load modified control word */ | 
 |  | 
 | 	frndint				/* round */ | 
 |  | 
 | 	fldcw	4(%esp)			/* restore original control word */ | 
 |  | 
 | 	addl	$8,%esp | 
 | 	ret | 
 | #endif |