33 lines
		
	
	
		
			1.0 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			33 lines
		
	
	
		
			1.0 KiB
		
	
	
	
		
			C
		
	
	
	
/**
 | 
						|
 * 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 <math.h>
 | 
						|
 | 
						|
#if defined(__arm__) || defined(_ARM_)
 | 
						|
/* This works around a compiler bug */
 | 
						|
long __lrintf_internal( float x );
 | 
						|
asm(".def __lrintf_internal; .scl 2; .type 32; .endef\n"
 | 
						|
    "\t.text\n"
 | 
						|
    "\t.align 4\n"
 | 
						|
    "\t.globl __lrintf_internal\n"
 | 
						|
    "__lrintf_internal:\n"
 | 
						|
    "\tvcvtr.s32.f32    s0, s0\n"
 | 
						|
    "\tfmrs             r0, s0\n"
 | 
						|
    "\tbx lr");
 | 
						|
#endif /* defined(__arm__) || defined(_ARM_) */
 | 
						|
 | 
						|
long lrintf (float x) 
 | 
						|
{
 | 
						|
  long retval = 0l;
 | 
						|
#if defined (__x86_64__) && defined (__CYGWIN__)
 | 
						|
  __asm__ __volatile__ ("fistpll %0"  : "=m" (retval) : "t" (x) : "st");
 | 
						|
#elif defined(_AMD64_) || defined(__x86_64__) || defined(_X86_) || defined(__i386__)
 | 
						|
  __asm__ __volatile__ ("fistpl %0"  : "=m" (retval) : "t" (x) : "st");
 | 
						|
#elif defined(__arm__) || defined(_ARM_)
 | 
						|
    retval = __lrintf_internal(x);
 | 
						|
#endif
 | 
						|
  return retval;
 | 
						|
}
 |