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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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) 64725c28e83SPiotr Jasiukajtis "stx %%fsr,%0\n\t" 64825c28e83SPiotr Jasiukajtis #else 64925c28e83SPiotr Jasiukajtis "st %%fsr,%0\n\t" 65025c28e83SPiotr Jasiukajtis #endif 65125c28e83SPiotr Jasiukajtis : "=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) 65925c28e83SPiotr Jasiukajtis "ldx %0,%%fsr\n\t" 66025c28e83SPiotr Jasiukajtis #else 66125c28e83SPiotr Jasiukajtis "ld %0,%%fsr\n\t" 66225c28e83SPiotr Jasiukajtis #endif 66325c28e83SPiotr Jasiukajtis : : "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