/** * 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 "floor.S" .text .p2align 4,,15 .globl __MINGW_USYMBOL(floor) .def __MINGW_USYMBOL(floor); .scl 2; .type 32; .endef #ifdef __x86_64__ .seh_proc __MINGW_USYMBOL(floor) #endif __MINGW_USYMBOL(floor): #if defined(_AMD64_) || defined(__x86_64__) pushq %rbx .seh_pushreg %rbx subq $16, %rsp .seh_stackalloc 16 .seh_endprologue movsd %xmm0, 8(%rsp) movq 8(%rsp), %r9 movq %r9, %rdx movl %r9d, %r10d shrq $32, %rdx movl %edx, %eax movl %edx, %r11d sarl $20, %eax andl $2047, %eax leal -1023(%rax), %r8d cmpl $51, %r8d jle .L2 cmpl $1024, %r8d je .L27 .L3: addq $16, %rsp popq %rbx ret .p2align 4,,10 .L2: cmpl $19, %r8d jg .L4 testl %r8d, %r8d js .L28 movl $1048575, %eax movl %r8d, %ecx shrl %cl, %eax testl %r9d, %r9d jne .L8 testl %edx, %eax je .L3 .L8: movsd .hugeval(%rip), %xmm1 xorpd %xmm2, %xmm2 addsd %xmm0, %xmm1 ucomisd %xmm1, %xmm2 jae .L3 xorl %r9d, %r9d testl %edx, %edx jns .L9 movl $1048576, %r9d movl %r8d, %ecx sarl %cl, %r9d .L9: addl %r9d, %edx notl %eax andl %edx, %eax salq $32, %rax movq %rax, 8(%rsp) movsd 8(%rsp), %xmm0 addq $16, %rsp popq %rbx ret .p2align 4,,10 .L4: leal -1043(%rax), %ecx movl $-1, %ebx shrl %cl, %ebx testl %r9d, %ebx je .L3 movsd .hugeval(%rip), %xmm1 xorpd %xmm2, %xmm2 addsd %xmm0, %xmm1 ucomisd %xmm1, %xmm2 jae .L3 testl %edx, %edx js .L29 .L11: notl %ebx salq $32, %r11 andl %ebx, %r10d orq %r10, %r11 movq %r11, 8(%rsp) movsd 8(%rsp), %xmm0 addq $16, %rsp popq %rbx ret .p2align 4,,10 .L27: addsd %xmm0, %xmm0 addq $16, %rsp popq %rbx ret .p2align 4,,10 .L28: movsd .hugeval(%rip), %xmm2 xorpd %xmm1, %xmm1 addsd %xmm0, %xmm2 ucomisd %xmm1, %xmm2 jbe .L3 testl %edx, %edx js .L7 movapd %xmm1, %xmm0 jmp .L3 .p2align 4,,10 .L7: andl $2147483647, %edx orl %r9d, %edx je .L3 movabsq $-4616189618054758400, %rax movq %rax, 8(%rsp) movsd 8(%rsp), %xmm0 jmp .L3 .p2align 4,,10 .L29: cmpl $20, %r8d je .L25 movl $1075, %ecx movl $1, %r10d subl %eax, %ecx sall %cl, %r10d addl %r9d, %r10d jae .L11 .L25: leal 1(%rdx), %r11d jmp .L11 .seh_endproc .section .rdata,"dr" .align 8 .hugeval: .long -2013235812 .long 2117592124 #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 $0x400,%edx /* round towards -oo */ orl 4(%esp),%edx andl $0xf7ff,%edx movl %edx,(%esp) fldcw (%esp) /* load modified control word */ frndint /* round */ fldcw 4(%esp) /* restore original control word */ addl $8,%esp ret #endif