mirror of
https://github.com/LMMS/lmms.git
synced 2026-02-05 12:13:40 -05:00
57 lines
1.1 KiB
C++
57 lines
1.1 KiB
C++
/* Copyright 2001-4 tim goetze <tim@quitte.de> -- see 'COPYING'. */
|
|
|
|
/* Sets the FP rounding mode to 'truncate' in the constructor
|
|
* and loads the previous FP conrol word in the destructor.
|
|
*
|
|
* By directly using the machine instruction to convert float to int
|
|
* we avoid the performance hit that loading the control word twice for
|
|
* every (int) cast causes on i386.
|
|
*
|
|
* On other architectures this is a no-op.
|
|
*/
|
|
|
|
#ifndef _DSP_FP_TRUNCATE_MODE_H_
|
|
#define _DSP_FP_TRUNCATE_MODE_H_
|
|
|
|
#ifdef __i386__
|
|
#define fstcw(i) \
|
|
__asm__ __volatile__ ("fstcw %0" : "=m" (i))
|
|
|
|
#define fldcw(i) \
|
|
__asm__ __volatile__ ("fldcw %0" : : "m" (i))
|
|
|
|
/* gcc chokes on __volatile__ sometimes. */
|
|
#define fistp(f,i) \
|
|
__asm__ ("fistpl %0" : "=m" (i) : "t" (f) : "st")
|
|
#else /* ! __i386__ */
|
|
#define fstcw(i)
|
|
#define fldcw(i)
|
|
|
|
#define fistp(f,i) \
|
|
i = (int) f
|
|
#endif
|
|
|
|
namespace DSP {
|
|
|
|
class FPTruncateMode
|
|
{
|
|
public:
|
|
int cw0, cw1; /* fp control word */
|
|
|
|
FPTruncateMode()
|
|
{
|
|
fstcw (cw0);
|
|
cw1 = cw0 | 0xC00;
|
|
fldcw (cw1);
|
|
}
|
|
|
|
~FPTruncateMode()
|
|
{
|
|
fldcw (cw0);
|
|
}
|
|
};
|
|
|
|
} /* namespace DSP */
|
|
|
|
#endif /* _DSP_FP_TRUNCATE_MODE_H_ */
|