125c28e83SPiotr Jasiukajtis /*
225c28e83SPiotr Jasiukajtis  * This file and its contents are supplied under the terms of the
325c28e83SPiotr Jasiukajtis  * Common Development and Distribution License ("CDDL"), version 1.0.
425c28e83SPiotr Jasiukajtis  * You may only use this file in accordance with the terms of version
525c28e83SPiotr Jasiukajtis  * 1.0 of the CDDL.
625c28e83SPiotr Jasiukajtis  *
725c28e83SPiotr Jasiukajtis  * A full copy of the text of the CDDL should have accompanied this
825c28e83SPiotr Jasiukajtis  * source.  A copy of the CDDL is also available via the Internet at
925c28e83SPiotr Jasiukajtis  * http://www.illumos.org/license/CDDL.
1025c28e83SPiotr Jasiukajtis  */
1125c28e83SPiotr Jasiukajtis 
1225c28e83SPiotr Jasiukajtis /*
1325c28e83SPiotr Jasiukajtis  * Copyright 2011, Richard Lowe
1425c28e83SPiotr Jasiukajtis  */
1525c28e83SPiotr Jasiukajtis 
1625c28e83SPiotr Jasiukajtis #ifndef _FENV_INLINES_H
1725c28e83SPiotr Jasiukajtis #define	_FENV_INLINES_H
1825c28e83SPiotr Jasiukajtis 
1925c28e83SPiotr Jasiukajtis #ifdef __GNUC__
2025c28e83SPiotr Jasiukajtis 
2125c28e83SPiotr Jasiukajtis #ifdef __cplusplus
2225c28e83SPiotr Jasiukajtis extern "C" {
2325c28e83SPiotr Jasiukajtis #endif
2425c28e83SPiotr Jasiukajtis 
2525c28e83SPiotr Jasiukajtis #include <sys/types.h>
2625c28e83SPiotr Jasiukajtis 
2725c28e83SPiotr Jasiukajtis #if defined(__x86)
2825c28e83SPiotr Jasiukajtis 
2925c28e83SPiotr Jasiukajtis /*
3025c28e83SPiotr Jasiukajtis  * Floating point Control Word and Status Word
3125c28e83SPiotr Jasiukajtis  * Definition should actually be shared with x86
3225c28e83SPiotr Jasiukajtis  * (much of this 'amd64' code can be, in fact.)
3325c28e83SPiotr Jasiukajtis  */
3425c28e83SPiotr Jasiukajtis union fp_cwsw {
3525c28e83SPiotr Jasiukajtis 	uint32_t cwsw;
3625c28e83SPiotr Jasiukajtis 	struct {
3725c28e83SPiotr Jasiukajtis 		uint16_t cw;
3825c28e83SPiotr Jasiukajtis 		uint16_t sw;
3925c28e83SPiotr Jasiukajtis 	} words;
4025c28e83SPiotr Jasiukajtis };
4125c28e83SPiotr Jasiukajtis 
42*7f11fd00SRichard Lowe extern __GNU_INLINE void
__fenv_getcwsw(unsigned int * value)4325c28e83SPiotr Jasiukajtis __fenv_getcwsw(unsigned int *value)
4425c28e83SPiotr Jasiukajtis {
4525c28e83SPiotr Jasiukajtis 	union fp_cwsw *u = (union fp_cwsw *)value;
4625c28e83SPiotr Jasiukajtis 
4725c28e83SPiotr Jasiukajtis 	__asm__ __volatile__(
4825c28e83SPiotr Jasiukajtis 	    "fstsw %0\n\t"
4925c28e83SPiotr Jasiukajtis 	    "fstcw %1\n\t"
5025c28e83SPiotr Jasiukajtis 	    : "=m" (u->words.cw), "=m" (u->words.sw));
5125c28e83SPiotr Jasiukajtis }
5225c28e83SPiotr Jasiukajtis 
53*7f11fd00SRichard Lowe extern __GNU_INLINE void
__fenv_setcwsw(const unsigned int * value)5425c28e83SPiotr Jasiukajtis __fenv_setcwsw(const unsigned int *value)
5525c28e83SPiotr Jasiukajtis {
5625c28e83SPiotr Jasiukajtis 	union fp_cwsw cwsw;
5725c28e83SPiotr Jasiukajtis 	short fenv[16];
5825c28e83SPiotr Jasiukajtis 
5925c28e83SPiotr Jasiukajtis 	cwsw.cwsw = *value;
6025c28e83SPiotr Jasiukajtis 
6125c28e83SPiotr Jasiukajtis 	__asm__ __volatile__(
6225c28e83SPiotr Jasiukajtis 	    "fstenv %0\n\t"
6325c28e83SPiotr Jasiukajtis 	    "movw   %4,%1\n\t"
6425c28e83SPiotr Jasiukajtis 	    "movw   %3,%2\n\t"
6525c28e83SPiotr Jasiukajtis 	    "fldenv %0\n\t"
6625c28e83SPiotr Jasiukajtis 	    "fwait\n\t"
6725c28e83SPiotr Jasiukajtis 	    : "=m" (fenv), "=m" (fenv[0]), "=m" (fenv[2])
6825c28e83SPiotr Jasiukajtis 	    : "r" (cwsw.words.cw), "r" (cwsw.words.sw)
6925c28e83SPiotr Jasiukajtis 	    /* For practical purposes, we clobber the whole FPU */
7025c28e83SPiotr Jasiukajtis 	    : "cc", "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)",
7125c28e83SPiotr Jasiukajtis 	      "st(6)", "st(7)");
7225c28e83SPiotr Jasiukajtis }
7325c28e83SPiotr Jasiukajtis 
74*7f11fd00SRichard Lowe extern __GNU_INLINE void
__fenv_getmxcsr(unsigned int * value)7525c28e83SPiotr Jasiukajtis __fenv_getmxcsr(unsigned int *value)
7625c28e83SPiotr Jasiukajtis {
7725c28e83SPiotr Jasiukajtis 	__asm__ __volatile__("stmxcsr %0" : "=m" (*value));
7825c28e83SPiotr Jasiukajtis }
7925c28e83SPiotr Jasiukajtis 
80*7f11fd00SRichard Lowe extern __GNU_INLINE void
__fenv_setmxcsr(const unsigned int * value)8125c28e83SPiotr Jasiukajtis __fenv_setmxcsr(const unsigned int *value)
8225c28e83SPiotr Jasiukajtis {
8325c28e83SPiotr Jasiukajtis 	__asm__ __volatile__("ldmxcsr %0" : : "m" (*value));
8425c28e83SPiotr Jasiukajtis }
8525c28e83SPiotr Jasiukajtis 
86*7f11fd00SRichard Lowe extern __GNU_INLINE long double
f2xm1(long double x)8725c28e83SPiotr Jasiukajtis f2xm1(long double x)
8825c28e83SPiotr Jasiukajtis {
8925c28e83SPiotr Jasiukajtis 	long double ret;
9025c28e83SPiotr Jasiukajtis 
9125c28e83SPiotr Jasiukajtis 	__asm__ __volatile__("f2xm1" : "=t" (ret) : "0" (x) : "cc");
9225c28e83SPiotr Jasiukajtis 	return (ret);
9325c28e83SPiotr Jasiukajtis }
9425c28e83SPiotr Jasiukajtis 
95*7f11fd00SRichard Lowe extern __GNU_INLINE long double
fyl2x(long double y,long double x)9625c28e83SPiotr Jasiukajtis fyl2x(long double y, long double x)
9725c28e83SPiotr Jasiukajtis {
9825c28e83SPiotr Jasiukajtis 	long double ret;
9925c28e83SPiotr Jasiukajtis 
10025c28e83SPiotr Jasiukajtis 	__asm__ __volatile__("fyl2x"
10125c28e83SPiotr Jasiukajtis 	    : "=t" (ret)
10225c28e83SPiotr Jasiukajtis 	    : "0" (x), "u" (y)
10325c28e83SPiotr Jasiukajtis 	    : "st(1)", "cc");
10425c28e83SPiotr Jasiukajtis 	return (ret);
10525c28e83SPiotr Jasiukajtis }
10625c28e83SPiotr Jasiukajtis 
107*7f11fd00SRichard Lowe extern __GNU_INLINE long double
fptan(long double x)10825c28e83SPiotr Jasiukajtis fptan(long double x)
10925c28e83SPiotr Jasiukajtis {
11025c28e83SPiotr Jasiukajtis 	/*
11125c28e83SPiotr Jasiukajtis 	 * fptan pushes 1.0 then the result on completion, so we want to pop
11225c28e83SPiotr Jasiukajtis 	 * the FP stack twice, so we need a dummy value into which to pop it.
11325c28e83SPiotr Jasiukajtis 	 */
11425c28e83SPiotr Jasiukajtis 	long double ret;
11525c28e83SPiotr Jasiukajtis 	long double dummy;
11625c28e83SPiotr Jasiukajtis 
11725c28e83SPiotr Jasiukajtis 	__asm__ __volatile__("fptan"
11825c28e83SPiotr Jasiukajtis 	    : "=t" (dummy), "=u" (ret)
11925c28e83SPiotr Jasiukajtis 	    : "0" (x)
12025c28e83SPiotr Jasiukajtis 	    : "cc");
12125c28e83SPiotr Jasiukajtis 	return (ret);
12225c28e83SPiotr Jasiukajtis }
12325c28e83SPiotr Jasiukajtis 
124*7f11fd00SRichard Lowe extern __GNU_INLINE long double
fpatan(long double x,long double y)12525c28e83SPiotr Jasiukajtis fpatan(long double x, long double y)
12625c28e83SPiotr Jasiukajtis {
12725c28e83SPiotr Jasiukajtis 	long double ret;
12825c28e83SPiotr Jasiukajtis 
12925c28e83SPiotr Jasiukajtis 	__asm__ __volatile__("fpatan"
13025c28e83SPiotr Jasiukajtis 	    : "=t" (ret)
13125c28e83SPiotr Jasiukajtis 	    : "0" (y), "u" (x)
13225c28e83SPiotr Jasiukajtis 	    : "st(1)", "cc");
13325c28e83SPiotr Jasiukajtis 	return (ret);
13425c28e83SPiotr Jasiukajtis }
13525c28e83SPiotr Jasiukajtis 
136*7f11fd00SRichard Lowe extern __GNU_INLINE long double
fxtract(long double x)13725c28e83SPiotr Jasiukajtis fxtract(long double x)
13825c28e83SPiotr Jasiukajtis {
13925c28e83SPiotr Jasiukajtis 	__asm__ __volatile__("fxtract" : "+t" (x) : : "cc");
14025c28e83SPiotr Jasiukajtis 	return (x);
14125c28e83SPiotr Jasiukajtis }
14225c28e83SPiotr Jasiukajtis 
143*7f11fd00SRichard Lowe extern __GNU_INLINE long double
fprem1(long double idend,long double div)14425c28e83SPiotr Jasiukajtis fprem1(long double idend, long double div)
14525c28e83SPiotr Jasiukajtis {
14625c28e83SPiotr Jasiukajtis 	__asm__ __volatile__("fprem1" : "+t" (div) : "u" (idend) : "cc");
14725c28e83SPiotr Jasiukajtis 	return (div);
14825c28e83SPiotr Jasiukajtis }
14925c28e83SPiotr Jasiukajtis 
150*7f11fd00SRichard Lowe extern __GNU_INLINE long double
fprem(long double idend,long double div)15125c28e83SPiotr Jasiukajtis fprem(long double idend, long double div)
15225c28e83SPiotr Jasiukajtis {
15325c28e83SPiotr Jasiukajtis 	__asm__ __volatile__("fprem" : "+t" (div) : "u" (idend) : "cc");
15425c28e83SPiotr Jasiukajtis 	return (div);
15525c28e83SPiotr Jasiukajtis }
15625c28e83SPiotr Jasiukajtis 
157*7f11fd00SRichard Lowe extern __GNU_INLINE long double
fyl2xp1(long double y,long double x)15825c28e83SPiotr Jasiukajtis fyl2xp1(long double y, long double x)
15925c28e83SPiotr Jasiukajtis {
16025c28e83SPiotr Jasiukajtis 	long double ret;
16125c28e83SPiotr Jasiukajtis 
16225c28e83SPiotr Jasiukajtis 	__asm__ __volatile__("fyl2xp1"
16325c28e83SPiotr Jasiukajtis 	    : "=t" (ret)
16425c28e83SPiotr Jasiukajtis 	    : "0" (x), "u" (y)
16525c28e83SPiotr Jasiukajtis 	    : "st(1)", "cc");
16625c28e83SPiotr Jasiukajtis 	return (ret);
16725c28e83SPiotr Jasiukajtis }
16825c28e83SPiotr Jasiukajtis 
169*7f11fd00SRichard Lowe extern __GNU_INLINE long double
fsqrt(long double x)17025c28e83SPiotr Jasiukajtis fsqrt(long double x)
17125c28e83SPiotr Jasiukajtis {
17225c28e83SPiotr Jasiukajtis 	__asm__ __volatile__("fsqrt" : "+t" (x) : : "cc");
17325c28e83SPiotr Jasiukajtis 	return (x);
17425c28e83SPiotr Jasiukajtis }
17525c28e83SPiotr Jasiukajtis 
176*7f11fd00SRichard Lowe extern __GNU_INLINE long double
fsincos(long double x)17725c28e83SPiotr Jasiukajtis fsincos(long double x)
17825c28e83SPiotr Jasiukajtis {
17925c28e83SPiotr Jasiukajtis 	long double dummy;
18025c28e83SPiotr Jasiukajtis 
18125c28e83SPiotr Jasiukajtis 	__asm__ __volatile__("fsincos" : "+t" (x), "=u" (dummy) : : "cc");
18225c28e83SPiotr Jasiukajtis 	return (x);
18325c28e83SPiotr Jasiukajtis }
18425c28e83SPiotr Jasiukajtis 
185*7f11fd00SRichard Lowe extern __GNU_INLINE long double
frndint(long double x)18625c28e83SPiotr Jasiukajtis frndint(long double x)
18725c28e83SPiotr Jasiukajtis {
18825c28e83SPiotr Jasiukajtis 	__asm__ __volatile__("frndint" : "+t" (x) : : "cc");
18925c28e83SPiotr Jasiukajtis 	return (x);
19025c28e83SPiotr Jasiukajtis }
19125c28e83SPiotr Jasiukajtis 
192*7f11fd00SRichard Lowe extern __GNU_INLINE long double
fscale(long double x,long double y)19325c28e83SPiotr Jasiukajtis fscale(long double x, long double y)
19425c28e83SPiotr Jasiukajtis {
19525c28e83SPiotr Jasiukajtis 	long double ret;
19625c28e83SPiotr Jasiukajtis 
19725c28e83SPiotr Jasiukajtis 	__asm__ __volatile__("fscale" : "=t" (ret) : "0" (y), "u" (x) : "cc");
19825c28e83SPiotr Jasiukajtis 	return (ret);
19925c28e83SPiotr Jasiukajtis }
20025c28e83SPiotr Jasiukajtis 
201*7f11fd00SRichard Lowe extern __GNU_INLINE long double
fsin(long double x)20225c28e83SPiotr Jasiukajtis fsin(long double x)
20325c28e83SPiotr Jasiukajtis {
20425c28e83SPiotr Jasiukajtis 	__asm__ __volatile__("fsin" : "+t" (x) : : "cc");
20525c28e83SPiotr Jasiukajtis 	return (x);
20625c28e83SPiotr Jasiukajtis }
20725c28e83SPiotr Jasiukajtis 
208*7f11fd00SRichard Lowe extern __GNU_INLINE long double
fcos(long double x)20925c28e83SPiotr Jasiukajtis fcos(long double x)
21025c28e83SPiotr Jasiukajtis {
21125c28e83SPiotr Jasiukajtis 	__asm__ __volatile__("fcos" : "+t" (x) : : "cc");
21225c28e83SPiotr Jasiukajtis 	return (x);
21325c28e83SPiotr Jasiukajtis }
21425c28e83SPiotr Jasiukajtis 
215*7f11fd00SRichard Lowe extern __GNU_INLINE void
sse_cmpeqss(float * f1,float * f2,int * i1)21625c28e83SPiotr Jasiukajtis sse_cmpeqss(float *f1, float *f2, int *i1)
21725c28e83SPiotr Jasiukajtis {
21825c28e83SPiotr Jasiukajtis 	__asm__ __volatile__(
21925c28e83SPiotr Jasiukajtis 	    "cmpeqss %2, %1\n\t"
22025c28e83SPiotr Jasiukajtis 	    "movss   %1, %0"
22125c28e83SPiotr Jasiukajtis 	    : "=m" (*i1), "+x" (*f1)
22225c28e83SPiotr Jasiukajtis 	    : "x" (*f2)
22325c28e83SPiotr Jasiukajtis 	    : "cc");
22425c28e83SPiotr Jasiukajtis }
22525c28e83SPiotr Jasiukajtis 
226*7f11fd00SRichard Lowe extern __GNU_INLINE void
sse_cmpltss(float * f1,float * f2,int * i1)22725c28e83SPiotr Jasiukajtis sse_cmpltss(float *f1, float *f2, int *i1)
22825c28e83SPiotr Jasiukajtis {
22925c28e83SPiotr Jasiukajtis 	__asm__ __volatile__(
23025c28e83SPiotr Jasiukajtis 	    "cmpltss %2, %1\n\t"
23125c28e83SPiotr Jasiukajtis 	    "movss   %1, %0"
23225c28e83SPiotr Jasiukajtis 	    : "=m" (*i1), "+x" (*f1)
23325c28e83SPiotr Jasiukajtis 	    : "x" (*f2)
23425c28e83SPiotr Jasiukajtis 	    : "cc");
23525c28e83SPiotr Jasiukajtis }
23625c28e83SPiotr Jasiukajtis 
237*7f11fd00SRichard Lowe extern __GNU_INLINE void
sse_cmpless(float * f1,float * f2,int * i1)23825c28e83SPiotr Jasiukajtis sse_cmpless(float *f1, float *f2, int *i1)
23925c28e83SPiotr Jasiukajtis {
24025c28e83SPiotr Jasiukajtis 	__asm__ __volatile__(
24125c28e83SPiotr Jasiukajtis 	    "cmpless %2, %1\n\t"
24225c28e83SPiotr Jasiukajtis 	    "movss   %1, %0"
24325c28e83SPiotr Jasiukajtis 	    : "=m" (*i1), "+x" (*f1)
24425c28e83SPiotr Jasiukajtis 	    : "x" (*f2)
24525c28e83SPiotr Jasiukajtis 	    : "cc");
24625c28e83SPiotr Jasiukajtis }
24725c28e83SPiotr Jasiukajtis 
248*7f11fd00SRichard Lowe extern __GNU_INLINE void
sse_cmpunordss(float * f1,float * f2,int * i1)24925c28e83SPiotr Jasiukajtis sse_cmpunordss(float *f1, float *f2, int *i1)
25025c28e83SPiotr Jasiukajtis {
25125c28e83SPiotr Jasiukajtis 	__asm__ __volatile__(
25225c28e83SPiotr Jasiukajtis 	    "cmpunordss %2, %1\n\t"
25325c28e83SPiotr Jasiukajtis 	    "movss      %1, %0"
25425c28e83SPiotr Jasiukajtis 	    : "=m" (*i1), "+x" (*f1)
25525c28e83SPiotr Jasiukajtis 	    : "x" (*f2)
25625c28e83SPiotr Jasiukajtis 	    : "cc");
25725c28e83SPiotr Jasiukajtis }
25825c28e83SPiotr Jasiukajtis 
259*7f11fd00SRichard Lowe extern __GNU_INLINE void
sse_minss(float * f1,float * f2,float * f3)26025c28e83SPiotr Jasiukajtis sse_minss(float *f1, float *f2, float *f3)
26125c28e83SPiotr Jasiukajtis {
26225c28e83SPiotr Jasiukajtis 	__asm__ __volatile__(
26325c28e83SPiotr Jasiukajtis 	    "minss %2, %1\n\t"
26425c28e83SPiotr Jasiukajtis 	    "movss %1, %0"
26525c28e83SPiotr Jasiukajtis 	    : "=m" (*f3), "+x" (*f1)
26625c28e83SPiotr Jasiukajtis 	    : "x" (*f2));
26725c28e83SPiotr Jasiukajtis }
26825c28e83SPiotr Jasiukajtis 
269*7f11fd00SRichard Lowe extern __GNU_INLINE void
sse_maxss(float * f1,float * f2,float * f3)27025c28e83SPiotr Jasiukajtis sse_maxss(float *f1, float *f2, float *f3)
27125c28e83SPiotr Jasiukajtis {
27225c28e83SPiotr Jasiukajtis 	__asm__ __volatile__(
27325c28e83SPiotr Jasiukajtis 	    "maxss %2, %1\n\t"
27425c28e83SPiotr Jasiukajtis 	    "movss %1, %0"
27525c28e83SPiotr Jasiukajtis 	    : "=m" (*f3), "+x" (*f1)
27625c28e83SPiotr Jasiukajtis 	    : "x" (*f2));
27725c28e83SPiotr Jasiukajtis }
27825c28e83SPiotr Jasiukajtis 
279*7f11fd00SRichard Lowe extern __GNU_INLINE void
sse_addss(float * f1,float * f2,float * f3)28025c28e83SPiotr Jasiukajtis sse_addss(float *f1, float *f2, float *f3)
28125c28e83SPiotr Jasiukajtis {
28225c28e83SPiotr Jasiukajtis 	__asm__ __volatile__(
28325c28e83SPiotr Jasiukajtis 	    "addss %2, %1\n\t"
28425c28e83SPiotr Jasiukajtis 	    "movss %1, %0"
28525c28e83SPiotr Jasiukajtis 	    : "=m" (*f3), "+x" (*f1)
28625c28e83SPiotr Jasiukajtis 	    : "x" (*f2));
28725c28e83SPiotr Jasiukajtis }
28825c28e83SPiotr Jasiukajtis 
289*7f11fd00SRichard Lowe extern __GNU_INLINE void
sse_subss(float * f1,float * f2,float * f3)29025c28e83SPiotr Jasiukajtis sse_subss(float *f1, float *f2, float *f3)
29125c28e83SPiotr Jasiukajtis {
29225c28e83SPiotr Jasiukajtis 	__asm__ __volatile__(
29325c28e83SPiotr Jasiukajtis 	    "subss %2, %1\n\t"
29425c28e83SPiotr Jasiukajtis 	    "movss %1, %0"
29525c28e83SPiotr Jasiukajtis 	    : "=m" (*f3), "+x" (*f1)
29625c28e83SPiotr Jasiukajtis 	    : "x" (*f2));
29725c28e83SPiotr Jasiukajtis }
29825c28e83SPiotr Jasiukajtis 
299*7f11fd00SRichard Lowe extern __GNU_INLINE void
sse_mulss(float * f1,float * f2,float * f3)30025c28e83SPiotr Jasiukajtis sse_mulss(float *f1, float *f2, float *f3)
30125c28e83SPiotr Jasiukajtis {
30225c28e83SPiotr Jasiukajtis 	__asm__ __volatile__(
30325c28e83SPiotr Jasiukajtis 	    "mulss %2, %1\n\t"
30425c28e83SPiotr Jasiukajtis 	    "movss %1, %0"
30525c28e83SPiotr Jasiukajtis 	    : "=m" (*f3), "+x" (*f1)
30625c28e83SPiotr Jasiukajtis 	    : "x" (*f2));
30725c28e83SPiotr Jasiukajtis }
30825c28e83SPiotr Jasiukajtis 
309*7f11fd00SRichard Lowe extern __GNU_INLINE void
sse_divss(float * f1,float * f2,float * f3)31025c28e83SPiotr Jasiukajtis sse_divss(float *f1, float *f2, float *f3)
31125c28e83SPiotr Jasiukajtis {
31225c28e83SPiotr Jasiukajtis 	__asm__ __volatile__(
31325c28e83SPiotr Jasiukajtis 	    "divss %2, %1\n\t"
31425c28e83SPiotr Jasiukajtis 	    "movss %1, %0"
31525c28e83SPiotr Jasiukajtis 	    : "=m" (*f3), "+x" (*f1)
31625c28e83SPiotr Jasiukajtis 	    : "x" (*f2));
31725c28e83SPiotr Jasiukajtis }
31825c28e83SPiotr Jasiukajtis 
319*7f11fd00SRichard Lowe extern __GNU_INLINE void
sse_sqrtss(float * f1,float * f2)32025c28e83SPiotr Jasiukajtis sse_sqrtss(float *f1, float *f2)
32125c28e83SPiotr Jasiukajtis {
32225c28e83SPiotr Jasiukajtis 	double tmp;
32325c28e83SPiotr Jasiukajtis 
32425c28e83SPiotr Jasiukajtis 	__asm__ __volatile__(
32525c28e83SPiotr Jasiukajtis 	    "sqrtss %2, %1\n\t"
32625c28e83SPiotr Jasiukajtis 	    "movss  %1, %0"
32725c28e83SPiotr Jasiukajtis 	    : "=m" (*f2), "=x" (tmp)
32825c28e83SPiotr Jasiukajtis 	    : "m" (*f1));
32925c28e83SPiotr Jasiukajtis }
33025c28e83SPiotr Jasiukajtis 
331*7f11fd00SRichard Lowe extern __GNU_INLINE void
sse_ucomiss(float * f1,float * f2)33225c28e83SPiotr Jasiukajtis sse_ucomiss(float *f1, float *f2)
33325c28e83SPiotr Jasiukajtis {
33425c28e83SPiotr Jasiukajtis 	__asm__ __volatile__("ucomiss %1, %0" : : "x" (*f1), "x" (*f2));
33525c28e83SPiotr Jasiukajtis 
33625c28e83SPiotr Jasiukajtis }
33725c28e83SPiotr Jasiukajtis 
338*7f11fd00SRichard Lowe extern __GNU_INLINE void
sse_comiss(float * f1,float * f2)33925c28e83SPiotr Jasiukajtis sse_comiss(float *f1, float *f2)
34025c28e83SPiotr Jasiukajtis {
34125c28e83SPiotr Jasiukajtis 	__asm__ __volatile__("comiss %1, %0" : : "x" (*f1), "x" (*f2));
34225c28e83SPiotr Jasiukajtis }
34325c28e83SPiotr Jasiukajtis 
344*7f11fd00SRichard Lowe extern __GNU_INLINE void
sse_cvtss2sd(float * f1,double * d1)34525c28e83SPiotr Jasiukajtis sse_cvtss2sd(float *f1, double *d1)
34625c28e83SPiotr Jasiukajtis {
34725c28e83SPiotr Jasiukajtis 	double tmp;
34825c28e83SPiotr Jasiukajtis 
34925c28e83SPiotr Jasiukajtis 	__asm__ __volatile__(
35025c28e83SPiotr Jasiukajtis 	    "cvtss2sd %2, %1\n\t"
35125c28e83SPiotr Jasiukajtis 	    "movsd    %1, %0"
35225c28e83SPiotr Jasiukajtis 	    : "=m" (*d1), "=x" (tmp)
35325c28e83SPiotr Jasiukajtis 	    : "m" (*f1));
35425c28e83SPiotr Jasiukajtis }
35525c28e83SPiotr Jasiukajtis 
356*7f11fd00SRichard Lowe extern __GNU_INLINE void
sse_cvtsi2ss(int * i1,float * f1)35725c28e83SPiotr Jasiukajtis sse_cvtsi2ss(int *i1, float *f1)
35825c28e83SPiotr Jasiukajtis {
35925c28e83SPiotr Jasiukajtis 	double tmp;
36025c28e83SPiotr Jasiukajtis 
36125c28e83SPiotr Jasiukajtis 	__asm__ __volatile__(
36225c28e83SPiotr Jasiukajtis 	    "cvtsi2ss %2, %1\n\t"
36325c28e83SPiotr Jasiukajtis 	    "movss    %1, %0"
36425c28e83SPiotr Jasiukajtis 	    : "=m" (*f1), "=x" (tmp)
36525c28e83SPiotr Jasiukajtis 	    : "m" (*i1));
36625c28e83SPiotr Jasiukajtis }
36725c28e83SPiotr Jasiukajtis 
368*7f11fd00SRichard Lowe extern __GNU_INLINE void
sse_cvttss2si(float * f1,int * i1)36925c28e83SPiotr Jasiukajtis sse_cvttss2si(float *f1, int *i1)
37025c28e83SPiotr Jasiukajtis {
37125c28e83SPiotr Jasiukajtis 	int tmp;
37225c28e83SPiotr Jasiukajtis 
37325c28e83SPiotr Jasiukajtis 	__asm__ __volatile__(
37425c28e83SPiotr Jasiukajtis 	    "cvttss2si %2, %1\n\t"
37525c28e83SPiotr Jasiukajtis 	    "movl      %1, %0"
37625c28e83SPiotr Jasiukajtis 	    : "=m" (*i1), "=r" (tmp)
37725c28e83SPiotr Jasiukajtis 	    : "m" (*f1));
37825c28e83SPiotr Jasiukajtis }
37925c28e83SPiotr Jasiukajtis 
380*7f11fd00SRichard Lowe extern __GNU_INLINE void
sse_cvtss2si(float * f1,int * i1)38125c28e83SPiotr Jasiukajtis sse_cvtss2si(float *f1, int *i1)
38225c28e83SPiotr Jasiukajtis {
38325c28e83SPiotr Jasiukajtis 	int tmp;
38425c28e83SPiotr Jasiukajtis 
38525c28e83SPiotr Jasiukajtis 	__asm__ __volatile__(
38625c28e83SPiotr Jasiukajtis 	    "cvtss2si %2, %1\n\t"
38725c28e83SPiotr Jasiukajtis 	    "movl     %1, %0"
38825c28e83SPiotr Jasiukajtis 	    : "=m" (*i1), "=r" (tmp)
38925c28e83SPiotr Jasiukajtis 	    : "m" (*f1));
39025c28e83SPiotr Jasiukajtis }
39125c28e83SPiotr Jasiukajtis 
39225c28e83SPiotr Jasiukajtis #if defined(__amd64)
393*7f11fd00SRichard Lowe extern __GNU_INLINE void
sse_cvtsi2ssq(long long * ll1,float * f1)39425c28e83SPiotr Jasiukajtis sse_cvtsi2ssq(long long *ll1, float *f1)
39525c28e83SPiotr Jasiukajtis {
39625c28e83SPiotr Jasiukajtis 	double tmp;
39725c28e83SPiotr Jasiukajtis 
39825c28e83SPiotr Jasiukajtis 	__asm__ __volatile__(
39925c28e83SPiotr Jasiukajtis 	    "cvtsi2ssq %2, %1\n\t"
40025c28e83SPiotr Jasiukajtis 	    "movss     %1, %0"
40125c28e83SPiotr Jasiukajtis 	    : "=m" (*f1), "=x" (tmp)
40225c28e83SPiotr Jasiukajtis 	    : "m" (*ll1));
40325c28e83SPiotr Jasiukajtis }
40425c28e83SPiotr Jasiukajtis 
405*7f11fd00SRichard Lowe extern __GNU_INLINE void
sse_cvttss2siq(float * f1,long long * ll1)40625c28e83SPiotr Jasiukajtis sse_cvttss2siq(float *f1, long long *ll1)
40725c28e83SPiotr Jasiukajtis {
40825c28e83SPiotr Jasiukajtis 	uint64_t tmp;
40925c28e83SPiotr Jasiukajtis 
41025c28e83SPiotr Jasiukajtis 	__asm__ __volatile__(
41125c28e83SPiotr Jasiukajtis 	    "cvttss2siq %2, %1\n\t"
41225c28e83SPiotr Jasiukajtis 	    "movq       %1, %0"
41325c28e83SPiotr Jasiukajtis 	    : "=m" (*ll1), "=r" (tmp)
41425c28e83SPiotr Jasiukajtis 	    : "m" (*f1));
41525c28e83SPiotr Jasiukajtis }
41625c28e83SPiotr Jasiukajtis 
417*7f11fd00SRichard Lowe extern __GNU_INLINE void
sse_cvtss2siq(float * f1,long long * ll1)41825c28e83SPiotr Jasiukajtis sse_cvtss2siq(float *f1, long long *ll1)
41925c28e83SPiotr Jasiukajtis {
42025c28e83SPiotr Jasiukajtis 	uint64_t tmp;
42125c28e83SPiotr Jasiukajtis 
42225c28e83SPiotr Jasiukajtis 	__asm__ __volatile__(
42325c28e83SPiotr Jasiukajtis 	    "cvtss2siq %2, %1\n\t"
42425c28e83SPiotr Jasiukajtis 	    "movq      %1, %0"
42525c28e83SPiotr Jasiukajtis 	    : "=m" (*ll1), "=r" (tmp)
42625c28e83SPiotr Jasiukajtis 	    : "m" (*f1));
42725c28e83SPiotr Jasiukajtis }
42825c28e83SPiotr Jasiukajtis 
42925c28e83SPiotr Jasiukajtis #endif
43025c28e83SPiotr Jasiukajtis 
431*7f11fd00SRichard Lowe extern __GNU_INLINE void
sse_cmpeqsd(double * d1,double * d2,long long * ll1)43225c28e83SPiotr Jasiukajtis sse_cmpeqsd(double *d1, double *d2, long long *ll1)
43325c28e83SPiotr Jasiukajtis {
43425c28e83SPiotr Jasiukajtis 	__asm__ __volatile__(
43525c28e83SPiotr Jasiukajtis 	    "cmpeqsd %2,%1\n\t"
43625c28e83SPiotr Jasiukajtis 	    "movsd   %1,%0"
43725c28e83SPiotr Jasiukajtis 	    : "=m" (*ll1), "+x" (*d1)
43825c28e83SPiotr Jasiukajtis 	    : "x" (*d2));
43925c28e83SPiotr Jasiukajtis }
44025c28e83SPiotr Jasiukajtis 
441*7f11fd00SRichard Lowe extern __GNU_INLINE void
sse_cmpltsd(double * d1,double * d2,long long * ll1)44225c28e83SPiotr Jasiukajtis sse_cmpltsd(double *d1, double *d2, long long *ll1)
44325c28e83SPiotr Jasiukajtis {
44425c28e83SPiotr Jasiukajtis 	__asm__ __volatile__(
44525c28e83SPiotr Jasiukajtis 	    "cmpltsd %2,%1\n\t"
44625c28e83SPiotr Jasiukajtis 	    "movsd   %1,%0"
44725c28e83SPiotr Jasiukajtis 	    : "=m" (*ll1), "+x" (*d1)
44825c28e83SPiotr Jasiukajtis 	    : "x" (*d2));
44925c28e83SPiotr Jasiukajtis }
45025c28e83SPiotr Jasiukajtis 
451*7f11fd00SRichard Lowe extern __GNU_INLINE void
sse_cmplesd(double * d1,double * d2,long long * ll1)45225c28e83SPiotr Jasiukajtis sse_cmplesd(double *d1, double *d2, long long *ll1)
45325c28e83SPiotr Jasiukajtis {
45425c28e83SPiotr Jasiukajtis 	__asm__ __volatile__(
45525c28e83SPiotr Jasiukajtis 	    "cmplesd %2,%1\n\t"
45625c28e83SPiotr Jasiukajtis 	    "movsd   %1,%0"
45725c28e83SPiotr Jasiukajtis 	    : "=m" (*ll1), "+x" (*d1)
45825c28e83SPiotr Jasiukajtis 	    : "x" (*d2));
45925c28e83SPiotr Jasiukajtis }
46025c28e83SPiotr Jasiukajtis 
461*7f11fd00SRichard Lowe extern __GNU_INLINE void
sse_cmpunordsd(double * d1,double * d2,long long * ll1)46225c28e83SPiotr Jasiukajtis sse_cmpunordsd(double *d1, double *d2, long long *ll1)
46325c28e83SPiotr Jasiukajtis {
46425c28e83SPiotr Jasiukajtis 	__asm__ __volatile__(
46525c28e83SPiotr Jasiukajtis 	    "cmpunordsd %2,%1\n\t"
46625c28e83SPiotr Jasiukajtis 	    "movsd      %1,%0"
46725c28e83SPiotr Jasiukajtis 	    : "=m" (*ll1), "+x" (*d1)
46825c28e83SPiotr Jasiukajtis 	    : "x" (*d2));
46925c28e83SPiotr Jasiukajtis }
47025c28e83SPiotr Jasiukajtis 
47125c28e83SPiotr Jasiukajtis 
472*7f11fd00SRichard Lowe extern __GNU_INLINE void
sse_minsd(double * d1,double * d2,double * d3)47325c28e83SPiotr Jasiukajtis sse_minsd(double *d1, double *d2, double *d3)
47425c28e83SPiotr Jasiukajtis {
47525c28e83SPiotr Jasiukajtis 	__asm__ __volatile__(
47625c28e83SPiotr Jasiukajtis 	    "minsd %2,%1\n\t"
47725c28e83SPiotr Jasiukajtis 	    "movsd %1,%0"
47825c28e83SPiotr Jasiukajtis 	    : "=m" (*d3), "+x" (*d1)
47925c28e83SPiotr Jasiukajtis 	    : "x" (*d2));
48025c28e83SPiotr Jasiukajtis }
48125c28e83SPiotr Jasiukajtis 
482*7f11fd00SRichard Lowe extern __GNU_INLINE void
sse_maxsd(double * d1,double * d2,double * d3)48325c28e83SPiotr Jasiukajtis sse_maxsd(double *d1, double *d2, double *d3)
48425c28e83SPiotr Jasiukajtis {
48525c28e83SPiotr Jasiukajtis 	__asm__ __volatile__(
48625c28e83SPiotr Jasiukajtis 	    "maxsd %2,%1\n\t"
48725c28e83SPiotr Jasiukajtis 	    "movsd %1,%0"
48825c28e83SPiotr Jasiukajtis 	    : "=m" (*d3), "+x" (*d1)
48925c28e83SPiotr Jasiukajtis 	    : "x" (*d2));
49025c28e83SPiotr Jasiukajtis }
49125c28e83SPiotr Jasiukajtis 
492*7f11fd00SRichard Lowe extern __GNU_INLINE void
sse_addsd(double * d1,double * d2,double * d3)49325c28e83SPiotr Jasiukajtis sse_addsd(double *d1, double *d2, double *d3)
49425c28e83SPiotr Jasiukajtis {
49525c28e83SPiotr Jasiukajtis 	__asm__ __volatile__(
49625c28e83SPiotr Jasiukajtis 	    "addsd %2,%1\n\t"
49725c28e83SPiotr Jasiukajtis 	    "movsd %1,%0"
49825c28e83SPiotr Jasiukajtis 	    : "=m" (*d3), "+x" (*d1)
49925c28e83SPiotr Jasiukajtis 	    : "x" (*d2));
50025c28e83SPiotr Jasiukajtis }
50125c28e83SPiotr Jasiukajtis 
502*7f11fd00SRichard Lowe extern __GNU_INLINE void
sse_subsd(double * d1,double * d2,double * d3)50325c28e83SPiotr Jasiukajtis sse_subsd(double *d1, double *d2, double *d3)
50425c28e83SPiotr Jasiukajtis {
50525c28e83SPiotr Jasiukajtis 	__asm__ __volatile__(
50625c28e83SPiotr Jasiukajtis 	    "subsd %2,%1\n\t"
50725c28e83SPiotr Jasiukajtis 	    "movsd %1,%0"
50825c28e83SPiotr Jasiukajtis 	    : "=m" (*d3), "+x" (*d1)
50925c28e83SPiotr Jasiukajtis 	    : "x" (*d2));
51025c28e83SPiotr Jasiukajtis }
51125c28e83SPiotr Jasiukajtis 
512*7f11fd00SRichard Lowe extern __GNU_INLINE void
sse_mulsd(double * d1,double * d2,double * d3)51325c28e83SPiotr Jasiukajtis sse_mulsd(double *d1, double *d2, double *d3)
51425c28e83SPiotr Jasiukajtis {
51525c28e83SPiotr Jasiukajtis 	__asm__ __volatile__(
51625c28e83SPiotr Jasiukajtis 	    "mulsd %2,%1\n\t"
51725c28e83SPiotr Jasiukajtis 	    "movsd %1,%0"
51825c28e83SPiotr Jasiukajtis 	    : "=m" (*d3), "+x" (*d1)
51925c28e83SPiotr Jasiukajtis 	    : "x" (*d2));
52025c28e83SPiotr Jasiukajtis }
52125c28e83SPiotr Jasiukajtis 
522*7f11fd00SRichard Lowe extern __GNU_INLINE void
sse_divsd(double * d1,double * d2,double * d3)52325c28e83SPiotr Jasiukajtis sse_divsd(double *d1, double *d2, double *d3)
52425c28e83SPiotr Jasiukajtis {
52525c28e83SPiotr Jasiukajtis 	__asm__ __volatile__(
52625c28e83SPiotr Jasiukajtis 	    "divsd %2,%1\n\t"
52725c28e83SPiotr Jasiukajtis 	    "movsd %1,%0"
52825c28e83SPiotr Jasiukajtis 	    : "=m" (*d3), "+x" (*d1)
52925c28e83SPiotr Jasiukajtis 	    : "x" (*d2));
53025c28e83SPiotr Jasiukajtis }
53125c28e83SPiotr Jasiukajtis 
532*7f11fd00SRichard Lowe extern __GNU_INLINE void
sse_sqrtsd(double * d1,double * d2)53325c28e83SPiotr Jasiukajtis sse_sqrtsd(double *d1, double *d2)
53425c28e83SPiotr Jasiukajtis {
53525c28e83SPiotr Jasiukajtis 	double tmp;
53625c28e83SPiotr Jasiukajtis 
53725c28e83SPiotr Jasiukajtis 	__asm__ __volatile__(
53825c28e83SPiotr Jasiukajtis 	    "sqrtsd %2, %1\n\t"
53925c28e83SPiotr Jasiukajtis 	    "movsd %1, %0"
54025c28e83SPiotr Jasiukajtis 	    : "=m" (*d2), "=x" (tmp)
54125c28e83SPiotr Jasiukajtis 	    : "m" (*d1));
54225c28e83SPiotr Jasiukajtis }
54325c28e83SPiotr Jasiukajtis 
544*7f11fd00SRichard Lowe extern __GNU_INLINE void
sse_ucomisd(double * d1,double * d2)54525c28e83SPiotr Jasiukajtis sse_ucomisd(double *d1, double *d2)
54625c28e83SPiotr Jasiukajtis {
54725c28e83SPiotr Jasiukajtis 	__asm__ __volatile__("ucomisd %1, %0" : : "x" (*d1), "x" (*d2));
54825c28e83SPiotr Jasiukajtis }
54925c28e83SPiotr Jasiukajtis 
550*7f11fd00SRichard Lowe extern __GNU_INLINE void
sse_comisd(double * d1,double * d2)55125c28e83SPiotr Jasiukajtis sse_comisd(double *d1, double *d2)
55225c28e83SPiotr Jasiukajtis {
55325c28e83SPiotr Jasiukajtis 	__asm__ __volatile__("comisd %1, %0" : : "x" (*d1), "x" (*d2));
55425c28e83SPiotr Jasiukajtis }
55525c28e83SPiotr Jasiukajtis 
556*7f11fd00SRichard Lowe extern __GNU_INLINE void
sse_cvtsd2ss(double * d1,float * f1)55725c28e83SPiotr Jasiukajtis sse_cvtsd2ss(double *d1, float *f1)
55825c28e83SPiotr Jasiukajtis {
55925c28e83SPiotr Jasiukajtis 	double tmp;
56025c28e83SPiotr Jasiukajtis 
56125c28e83SPiotr Jasiukajtis 	__asm__ __volatile__(
56225c28e83SPiotr Jasiukajtis 	    "cvtsd2ss %2,%1\n\t"
56325c28e83SPiotr Jasiukajtis 	    "movss    %1,%0"
56425c28e83SPiotr Jasiukajtis 	    : "=m" (*f1), "=x" (tmp)
56525c28e83SPiotr Jasiukajtis 	    : "m" (*d1));
56625c28e83SPiotr Jasiukajtis }
56725c28e83SPiotr Jasiukajtis 
568*7f11fd00SRichard Lowe extern __GNU_INLINE void
sse_cvtsi2sd(int * i1,double * d1)56925c28e83SPiotr Jasiukajtis sse_cvtsi2sd(int *i1, double *d1)
57025c28e83SPiotr Jasiukajtis {
57125c28e83SPiotr Jasiukajtis 	double tmp;
57225c28e83SPiotr Jasiukajtis 	__asm__ __volatile__(
57325c28e83SPiotr Jasiukajtis 	    "cvtsi2sd %2,%1\n\t"
57425c28e83SPiotr Jasiukajtis 	    "movsd    %1,%0"
57525c28e83SPiotr Jasiukajtis 	    : "=m" (*d1), "=x" (tmp)
57625c28e83SPiotr Jasiukajtis 	    : "m" (*i1));
57725c28e83SPiotr Jasiukajtis }
57825c28e83SPiotr Jasiukajtis 
579*7f11fd00SRichard Lowe extern __GNU_INLINE void
sse_cvttsd2si(double * d1,int * i1)58025c28e83SPiotr Jasiukajtis sse_cvttsd2si(double *d1, int *i1)
58125c28e83SPiotr Jasiukajtis {
58225c28e83SPiotr Jasiukajtis 	int tmp;
58325c28e83SPiotr Jasiukajtis 
58425c28e83SPiotr Jasiukajtis 	__asm__ __volatile__(
58525c28e83SPiotr Jasiukajtis 	    "cvttsd2si %2,%1\n\t"
58625c28e83SPiotr Jasiukajtis 	    "movl      %1,%0"
58725c28e83SPiotr Jasiukajtis 	    : "=m" (*i1), "=r" (tmp)
58825c28e83SPiotr Jasiukajtis 	    : "m" (*d1));
58925c28e83SPiotr Jasiukajtis }
59025c28e83SPiotr Jasiukajtis 
591*7f11fd00SRichard Lowe extern __GNU_INLINE void
sse_cvtsd2si(double * d1,int * i1)59225c28e83SPiotr Jasiukajtis sse_cvtsd2si(double *d1, int *i1)
59325c28e83SPiotr Jasiukajtis {
59425c28e83SPiotr Jasiukajtis 	int tmp;
59525c28e83SPiotr Jasiukajtis 
59625c28e83SPiotr Jasiukajtis 	__asm__ __volatile__(
59725c28e83SPiotr Jasiukajtis 	    "cvtsd2si %2,%1\n\t"
59825c28e83SPiotr Jasiukajtis 	    "movl     %1,%0"
59925c28e83SPiotr Jasiukajtis 	    : "=m" (*i1), "=r" (tmp)
60025c28e83SPiotr Jasiukajtis 	    : "m" (*d1));
60125c28e83SPiotr Jasiukajtis }
60225c28e83SPiotr Jasiukajtis 
60325c28e83SPiotr Jasiukajtis #if defined(__amd64)
604*7f11fd00SRichard Lowe extern __GNU_INLINE void
sse_cvtsi2sdq(long long * ll1,double * d1)60525c28e83SPiotr Jasiukajtis sse_cvtsi2sdq(long long *ll1, double *d1)
60625c28e83SPiotr Jasiukajtis {
60725c28e83SPiotr Jasiukajtis 	double tmp;
60825c28e83SPiotr Jasiukajtis 
60925c28e83SPiotr Jasiukajtis 	__asm__ __volatile__(
61025c28e83SPiotr Jasiukajtis 	    "cvtsi2sdq %2,%1\n\t"
61125c28e83SPiotr Jasiukajtis 	    "movsd     %1,%0"
61225c28e83SPiotr Jasiukajtis 	    : "=m" (*d1), "=x" (tmp)
61325c28e83SPiotr Jasiukajtis 	    : "m" (*ll1));
61425c28e83SPiotr Jasiukajtis }
61525c28e83SPiotr Jasiukajtis 
616*7f11fd00SRichard Lowe extern __GNU_INLINE void
sse_cvttsd2siq(double * d1,long long * ll1)61725c28e83SPiotr Jasiukajtis sse_cvttsd2siq(double *d1, long long *ll1)
61825c28e83SPiotr Jasiukajtis {
61925c28e83SPiotr Jasiukajtis 	uint64_t tmp;
62025c28e83SPiotr Jasiukajtis 
62125c28e83SPiotr Jasiukajtis 	__asm__ __volatile__(
62225c28e83SPiotr Jasiukajtis 	    "cvttsd2siq %2,%1\n\t"
62325c28e83SPiotr Jasiukajtis 	    "movq       %1,%0"
62425c28e83SPiotr Jasiukajtis 	    : "=m" (*ll1), "=r" (tmp)
62525c28e83SPiotr Jasiukajtis 	    : "m" (*d1));
62625c28e83SPiotr Jasiukajtis }
62725c28e83SPiotr Jasiukajtis 
628*7f11fd00SRichard Lowe extern __GNU_INLINE void
sse_cvtsd2siq(double * d1,long long * ll1)62925c28e83SPiotr Jasiukajtis sse_cvtsd2siq(double *d1, long long *ll1)
63025c28e83SPiotr Jasiukajtis {
63125c28e83SPiotr Jasiukajtis 	uint64_t tmp;
63225c28e83SPiotr Jasiukajtis 
63325c28e83SPiotr Jasiukajtis 	__asm__ __volatile__(
63425c28e83SPiotr Jasiukajtis 	    "cvtsd2siq %2,%1\n\t"
63525c28e83SPiotr Jasiukajtis 	    "movq      %1,%0"
63625c28e83SPiotr Jasiukajtis 	    : "=m" (*ll1), "=r" (tmp)
63725c28e83SPiotr Jasiukajtis 	    : "m" (*d1));
63825c28e83SPiotr Jasiukajtis }
63925c28e83SPiotr Jasiukajtis #endif
64025c28e83SPiotr Jasiukajtis 
64125c28e83SPiotr Jasiukajtis #elif defined(__sparc)
642*7f11fd00SRichard Lowe extern __GNU_INLINE void
64325c28e83SPiotr Jasiukajtis __fenv_getfsr(unsigned long *l)
64425c28e83SPiotr Jasiukajtis {
64525c28e83SPiotr Jasiukajtis 	__asm__ __volatile__(
64625c28e83SPiotr Jasiukajtis #if defined(__sparcv9)
647*7f11fd00SRichard Lowe 	    "stx %%fsr,%0\n\t"
64825c28e83SPiotr Jasiukajtis #else
649*7f11fd00SRichard Lowe 	    "st  %%fsr,%0\n\t"
65025c28e83SPiotr Jasiukajtis #endif
651*7f11fd00SRichard Lowe 	    : "=m" (*l));
65225c28e83SPiotr Jasiukajtis }
65325c28e83SPiotr Jasiukajtis 
654*7f11fd00SRichard Lowe extern __GNU_INLINE void
65525c28e83SPiotr Jasiukajtis __fenv_setfsr(const unsigned long *l)
65625c28e83SPiotr Jasiukajtis {
65725c28e83SPiotr Jasiukajtis 	__asm__ __volatile__(
65825c28e83SPiotr Jasiukajtis #if defined(__sparcv9)
659*7f11fd00SRichard Lowe 	    "ldx %0,%%fsr\n\t"
66025c28e83SPiotr Jasiukajtis #else
661*7f11fd00SRichard Lowe 	    "ld %0,%%fsr\n\t"
66225c28e83SPiotr Jasiukajtis #endif
663*7f11fd00SRichard Lowe 	    : : "m" (*l) : "cc");
66425c28e83SPiotr Jasiukajtis }
66525c28e83SPiotr Jasiukajtis 
666*7f11fd00SRichard Lowe extern __GNU_INLINE void
66725c28e83SPiotr Jasiukajtis __fenv_getfsr32(unsigned int *l)
66825c28e83SPiotr Jasiukajtis {
66925c28e83SPiotr Jasiukajtis 	__asm__ __volatile__("st %%fsr,%0\n\t" : "=m" (*l));
67025c28e83SPiotr Jasiukajtis }
67125c28e83SPiotr Jasiukajtis 
672*7f11fd00SRichard Lowe extern __GNU_INLINE void
67325c28e83SPiotr Jasiukajtis __fenv_setfsr32(const unsigned int *l)
67425c28e83SPiotr Jasiukajtis {
67525c28e83SPiotr Jasiukajtis 	__asm__ __volatile__("ld %0,%%fsr\n\t" : : "m" (*l));
67625c28e83SPiotr Jasiukajtis }
67725c28e83SPiotr Jasiukajtis #else
67825c28e83SPiotr Jasiukajtis #error "GCC FENV inlines not implemented for this platform"
67925c28e83SPiotr Jasiukajtis #endif
68025c28e83SPiotr Jasiukajtis 
68125c28e83SPiotr Jasiukajtis #ifdef __cplusplus
68225c28e83SPiotr Jasiukajtis }
68325c28e83SPiotr Jasiukajtis #endif
68425c28e83SPiotr Jasiukajtis 
68525c28e83SPiotr Jasiukajtis #endif  /* __GNUC__ */
68625c28e83SPiotr Jasiukajtis 
68725c28e83SPiotr Jasiukajtis #endif /* _FENV_INLINES_H */
688