xref: /openbsd/lib/libc/arch/amd64/gen/fpsetround.S (revision 631951aa)
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