1*631951aaSmortimer/* $OpenBSD: fpsetround.S,v 1.3 2018/07/03 23:14:05 mortimer Exp $ */ 2118f6189Smickey/* $NetBSD: fpsetround.S,v 1.3 2002/06/12 19:17:22 fvdl Exp $ */ 3118f6189Smickey 4118f6189Smickey/* 5118f6189Smickey * Written by Frank van der Linden at Wasabi Systems for NetBSD. 6118f6189Smickey * Public domain. 7118f6189Smickey */ 8118f6189Smickey 9118f6189Smickey#include <machine/asm.h> 10118f6189Smickey 11118f6189Smickey/* 12118f6189Smickey * XXX set both the x87 control word and the SSE mxcsr register. 13118f6189Smickey * Applications should only set exception and round flags 14118f6189Smickey * via the fp*() interface, otherwise the status words 15118f6189Smickey * will get our of sync. 16118f6189Smickey */ 17118f6189Smickey 18118f6189Smickey 19118f6189Smickey#ifdef WEAK_ALIAS 20118f6189SmickeyWEAK_ALIAS(fpsetround, _fpsetround) 21118f6189SmickeyENTRY(_fpsetround) 22118f6189Smickey#else 23118f6189SmickeyENTRY(fpsetround) 24118f6189Smickey#endif 25*631951aaSmortimer RETGUARD_SETUP(fpsetround, r11) 26118f6189Smickey fnstcw -4(%rsp) 27118f6189Smickey stmxcsr -8(%rsp) 28118f6189Smickey 29118f6189Smickey andl $3,%edi 30118f6189Smickey 31118f6189Smickey movl -4(%rsp),%edx 32118f6189Smickey rorl $10,%edx 33118f6189Smickey movl %edx,%eax 34118f6189Smickey andl $3,%eax 35118f6189Smickey 36118f6189Smickey andl $~3,%edx 37118f6189Smickey orl %edi,%edx 38118f6189Smickey roll $10,%edx 39118f6189Smickey movl %edx,-4(%rsp) 40118f6189Smickey 41118f6189Smickey movl -8(%rsp),%edx 42118f6189Smickey rorl $13,%edx 43118f6189Smickey andl $~3,%edx 44118f6189Smickey orl %edi,%edx 45118f6189Smickey roll $13,%edx 46118f6189Smickey movl %edx,-8(%rsp) 47118f6189Smickey 48118f6189Smickey ldmxcsr -8(%rsp) 49118f6189Smickey fldcw -4(%rsp) 50*631951aaSmortimer RETGUARD_CHECK(fpsetround, r11) 51118f6189Smickey ret 5253e48b83Suebayasi#ifdef WEAK_ALIAS 5353e48b83SuebayasiEND(_fpsetround) 5453e48b83Suebayasi#else 5553e48b83SuebayasiEND(fpsetround) 5653e48b83Suebayasi#endif 57