blob: 952c1808b5680272e589e221d9b55880df2fd3bd [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001/*
2 * MIPS floating point support
3 * Copyright (C) 1994-2000 Algorithmics Ltd.
Linus Torvalds1da177e2005-04-16 15:20:36 -07004 *
Linus Torvalds1da177e2005-04-16 15:20:36 -07005 * This program is free software; you can distribute it and/or modify it
6 * under the terms of the GNU General Public License (Version 2) as
7 * published by the Free Software Foundation.
8 *
9 * This program is distributed in the hope it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12 * for more details.
13 *
14 * You should have received a copy of the GNU General Public License along
15 * with this program; if not, write to the Free Software Foundation, Inc.,
16 * 59 Temple Place - Suite 330, Boston MA 02111-1307, USA.
17 *
Linus Torvalds1da177e2005-04-16 15:20:36 -070018 * Nov 7, 2000
19 * Modification to allow integration with Linux kernel
20 *
21 * Kevin D. Kissell, kevink@mips.com and Carsten Langgard, carstenl@mips.com
22 * Copyright (C) 2000 MIPS Technologies, Inc. All rights reserved.
Ralf Baechlecd21dfc2005-04-28 13:39:10 +000023 */
Ralf Baechlea663bf92005-10-23 13:44:31 +010024#ifndef __ARCH_MIPS_MATH_EMU_IEEE754_H
25#define __ARCH_MIPS_MATH_EMU_IEEE754_H
Linus Torvalds1da177e2005-04-16 15:20:36 -070026
Ralf Baechlecae55062014-04-16 00:47:59 +020027#include <linux/compiler.h>
Ralf Baechlecd21dfc2005-04-28 13:39:10 +000028#include <asm/byteorder.h>
Ralf Baechlee812a732014-04-19 14:20:54 +020029#include <linux/kernel.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070030#include <linux/types.h>
Ralf Baechlecd21dfc2005-04-28 13:39:10 +000031#include <linux/sched.h>
Ralf Baechlef80cc082014-04-16 00:40:02 +020032#include <asm/bitfield.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070033
34/*
35 * Not very pretty, but the Linux kernel's normal va_list definition
36 * does not allow it to be used as a structure element, as it is here.
37 */
38#ifndef _STDARG_H
39#include <stdarg.h>
40#endif
41
Ralf Baechle23708812014-04-16 01:16:02 +020042struct ieee754dp_const {
Ralf Baechlef80cc082014-04-16 00:40:02 +020043 __BITFIELD_FIELD(unsigned sign:1,
44 __BITFIELD_FIELD(unsigned bexp:11,
45 __BITFIELD_FIELD(unsigned manthi:20,
46 __BITFIELD_FIELD(unsigned mantlo:32,
47 ;))))
Linus Torvalds1da177e2005-04-16 15:20:36 -070048};
49
Ralf Baechle2209bcb2014-04-16 01:31:11 +020050union ieee754dp {
Ralf Baechle23708812014-04-16 01:16:02 +020051 struct ieee754dp_const oparts;
Linus Torvalds1da177e2005-04-16 15:20:36 -070052 struct {
Ralf Baechlef80cc082014-04-16 00:40:02 +020053 __BITFIELD_FIELD(unsigned int sign:1,
54 __BITFIELD_FIELD(unsigned int bexp:11,
55 __BITFIELD_FIELD(u64 mant:52,
56 ;)))
Linus Torvalds1da177e2005-04-16 15:20:36 -070057 } parts;
58 double d;
59 u64 bits;
Ralf Baechle2209bcb2014-04-16 01:31:11 +020060};
Linus Torvalds1da177e2005-04-16 15:20:36 -070061
Ralf Baechle23708812014-04-16 01:16:02 +020062struct ieee754sp_const {
Ralf Baechlef80cc082014-04-16 00:40:02 +020063 __BITFIELD_FIELD(unsigned sign:1,
64 __BITFIELD_FIELD(unsigned bexp:8,
65 __BITFIELD_FIELD(unsigned mant:23,
66 ;)))
Linus Torvalds1da177e2005-04-16 15:20:36 -070067};
68
Ralf Baechle2209bcb2014-04-16 01:31:11 +020069union ieee754sp {
Ralf Baechle23708812014-04-16 01:16:02 +020070 struct ieee754sp_const parts;
Linus Torvalds1da177e2005-04-16 15:20:36 -070071 float f;
72 u32 bits;
Ralf Baechle2209bcb2014-04-16 01:31:11 +020073};
Linus Torvalds1da177e2005-04-16 15:20:36 -070074
75/*
76 * single precision (often aka float)
77*/
Ralf Baechle2209bcb2014-04-16 01:31:11 +020078int ieee754sp_finite(union ieee754sp x);
79int ieee754sp_class(union ieee754sp x);
Linus Torvalds1da177e2005-04-16 15:20:36 -070080
Ralf Baechle2209bcb2014-04-16 01:31:11 +020081union ieee754sp ieee754sp_abs(union ieee754sp x);
82union ieee754sp ieee754sp_neg(union ieee754sp x);
83union ieee754sp ieee754sp_scalb(union ieee754sp x, int);
84union ieee754sp ieee754sp_logb(union ieee754sp x);
Linus Torvalds1da177e2005-04-16 15:20:36 -070085
86/* x with sign of y */
Ralf Baechle2209bcb2014-04-16 01:31:11 +020087union ieee754sp ieee754sp_copysign(union ieee754sp x, union ieee754sp y);
Linus Torvalds1da177e2005-04-16 15:20:36 -070088
Ralf Baechle2209bcb2014-04-16 01:31:11 +020089union ieee754sp ieee754sp_add(union ieee754sp x, union ieee754sp y);
90union ieee754sp ieee754sp_sub(union ieee754sp x, union ieee754sp y);
91union ieee754sp ieee754sp_mul(union ieee754sp x, union ieee754sp y);
92union ieee754sp ieee754sp_div(union ieee754sp x, union ieee754sp y);
Linus Torvalds1da177e2005-04-16 15:20:36 -070093
Ralf Baechle2209bcb2014-04-16 01:31:11 +020094union ieee754sp ieee754sp_fint(int x);
95union ieee754sp ieee754sp_funs(unsigned x);
96union ieee754sp ieee754sp_flong(s64 x);
97union ieee754sp ieee754sp_fulong(u64 x);
98union ieee754sp ieee754sp_fdp(union ieee754dp x);
Linus Torvalds1da177e2005-04-16 15:20:36 -070099
Ralf Baechle2209bcb2014-04-16 01:31:11 +0200100int ieee754sp_tint(union ieee754sp x);
101unsigned int ieee754sp_tuns(union ieee754sp x);
102s64 ieee754sp_tlong(union ieee754sp x);
103u64 ieee754sp_tulong(union ieee754sp x);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700104
Ralf Baechle2209bcb2014-04-16 01:31:11 +0200105int ieee754sp_cmp(union ieee754sp x, union ieee754sp y, int cop, int sig);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700106/*
107 * basic sp math
108 */
Ralf Baechle2209bcb2014-04-16 01:31:11 +0200109union ieee754sp ieee754sp_modf(union ieee754sp x, union ieee754sp * ip);
110union ieee754sp ieee754sp_frexp(union ieee754sp x, int *exp);
111union ieee754sp ieee754sp_ldexp(union ieee754sp x, int exp);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700112
Ralf Baechle2209bcb2014-04-16 01:31:11 +0200113union ieee754sp ieee754sp_ceil(union ieee754sp x);
114union ieee754sp ieee754sp_floor(union ieee754sp x);
115union ieee754sp ieee754sp_trunc(union ieee754sp x);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700116
Ralf Baechle2209bcb2014-04-16 01:31:11 +0200117union ieee754sp ieee754sp_sqrt(union ieee754sp x);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700118
119/*
120 * double precision (often aka double)
121*/
Ralf Baechle2209bcb2014-04-16 01:31:11 +0200122int ieee754dp_finite(union ieee754dp x);
123int ieee754dp_class(union ieee754dp x);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700124
125/* x with sign of y */
Ralf Baechle2209bcb2014-04-16 01:31:11 +0200126union ieee754dp ieee754dp_copysign(union ieee754dp x, union ieee754dp y);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700127
Ralf Baechle2209bcb2014-04-16 01:31:11 +0200128union ieee754dp ieee754dp_add(union ieee754dp x, union ieee754dp y);
129union ieee754dp ieee754dp_sub(union ieee754dp x, union ieee754dp y);
130union ieee754dp ieee754dp_mul(union ieee754dp x, union ieee754dp y);
131union ieee754dp ieee754dp_div(union ieee754dp x, union ieee754dp y);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700132
Ralf Baechle2209bcb2014-04-16 01:31:11 +0200133union ieee754dp ieee754dp_abs(union ieee754dp x);
134union ieee754dp ieee754dp_neg(union ieee754dp x);
135union ieee754dp ieee754dp_scalb(union ieee754dp x, int);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700136
137/* return exponent as integer in floating point format
138 */
Ralf Baechle2209bcb2014-04-16 01:31:11 +0200139union ieee754dp ieee754dp_logb(union ieee754dp x);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700140
Ralf Baechle2209bcb2014-04-16 01:31:11 +0200141union ieee754dp ieee754dp_fint(int x);
142union ieee754dp ieee754dp_funs(unsigned x);
143union ieee754dp ieee754dp_flong(s64 x);
144union ieee754dp ieee754dp_fulong(u64 x);
145union ieee754dp ieee754dp_fsp(union ieee754sp x);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700146
Ralf Baechle2209bcb2014-04-16 01:31:11 +0200147union ieee754dp ieee754dp_ceil(union ieee754dp x);
148union ieee754dp ieee754dp_floor(union ieee754dp x);
149union ieee754dp ieee754dp_trunc(union ieee754dp x);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700150
Ralf Baechle2209bcb2014-04-16 01:31:11 +0200151int ieee754dp_tint(union ieee754dp x);
152unsigned int ieee754dp_tuns(union ieee754dp x);
153s64 ieee754dp_tlong(union ieee754dp x);
154u64 ieee754dp_tulong(union ieee754dp x);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700155
Ralf Baechle2209bcb2014-04-16 01:31:11 +0200156int ieee754dp_cmp(union ieee754dp x, union ieee754dp y, int cop, int sig);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700157/*
158 * basic sp math
159 */
Ralf Baechle2209bcb2014-04-16 01:31:11 +0200160union ieee754dp ieee754dp_modf(union ieee754dp x, union ieee754dp * ip);
161union ieee754dp ieee754dp_frexp(union ieee754dp x, int *exp);
162union ieee754dp ieee754dp_ldexp(union ieee754dp x, int exp);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700163
Ralf Baechle2209bcb2014-04-16 01:31:11 +0200164union ieee754dp ieee754dp_ceil(union ieee754dp x);
165union ieee754dp ieee754dp_floor(union ieee754dp x);
166union ieee754dp ieee754dp_trunc(union ieee754dp x);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700167
Ralf Baechle2209bcb2014-04-16 01:31:11 +0200168union ieee754dp ieee754dp_sqrt(union ieee754dp x);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700169
170
171
172/* 5 types of floating point number
173*/
Ralf Baechle9e8bad12014-04-19 00:36:32 +0200174enum {
175 IEEE754_CLASS_NORM = 0x00,
176 IEEE754_CLASS_ZERO = 0x01,
177 IEEE754_CLASS_DNORM = 0x02,
178 IEEE754_CLASS_INF = 0x03,
179 IEEE754_CLASS_SNAN = 0x04,
180 IEEE754_CLASS_QNAN = 0x05,
181};
Linus Torvalds1da177e2005-04-16 15:20:36 -0700182
183/* exception numbers */
184#define IEEE754_INEXACT 0x01
185#define IEEE754_UNDERFLOW 0x02
186#define IEEE754_OVERFLOW 0x04
187#define IEEE754_ZERO_DIVIDE 0x08
188#define IEEE754_INVALID_OPERATION 0x10
189
190/* cmp operators
191*/
192#define IEEE754_CLT 0x01
193#define IEEE754_CEQ 0x02
194#define IEEE754_CGT 0x04
195#define IEEE754_CUN 0x08
196
197/* rounding mode
198*/
199#define IEEE754_RN 0 /* round to nearest */
200#define IEEE754_RZ 1 /* round toward zero */
201#define IEEE754_RD 2 /* round toward -Infinity */
202#define IEEE754_RU 3 /* round toward +Infinity */
203
204/* other naming */
205#define IEEE754_RM IEEE754_RD
206#define IEEE754_RP IEEE754_RU
207
208/* "normal" comparisons
209*/
Ralf Baechle2209bcb2014-04-16 01:31:11 +0200210static inline int ieee754sp_eq(union ieee754sp x, union ieee754sp y)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700211{
212 return ieee754sp_cmp(x, y, IEEE754_CEQ, 0);
213}
214
Ralf Baechle2209bcb2014-04-16 01:31:11 +0200215static inline int ieee754sp_ne(union ieee754sp x, union ieee754sp y)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700216{
217 return ieee754sp_cmp(x, y,
218 IEEE754_CLT | IEEE754_CGT | IEEE754_CUN, 0);
219}
220
Ralf Baechle2209bcb2014-04-16 01:31:11 +0200221static inline int ieee754sp_lt(union ieee754sp x, union ieee754sp y)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700222{
223 return ieee754sp_cmp(x, y, IEEE754_CLT, 0);
224}
225
Ralf Baechle2209bcb2014-04-16 01:31:11 +0200226static inline int ieee754sp_le(union ieee754sp x, union ieee754sp y)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700227{
228 return ieee754sp_cmp(x, y, IEEE754_CLT | IEEE754_CEQ, 0);
229}
230
Ralf Baechle2209bcb2014-04-16 01:31:11 +0200231static inline int ieee754sp_gt(union ieee754sp x, union ieee754sp y)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700232{
233 return ieee754sp_cmp(x, y, IEEE754_CGT, 0);
234}
235
236
Ralf Baechle2209bcb2014-04-16 01:31:11 +0200237static inline int ieee754sp_ge(union ieee754sp x, union ieee754sp y)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700238{
239 return ieee754sp_cmp(x, y, IEEE754_CGT | IEEE754_CEQ, 0);
240}
241
Ralf Baechle2209bcb2014-04-16 01:31:11 +0200242static inline int ieee754dp_eq(union ieee754dp x, union ieee754dp y)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700243{
244 return ieee754dp_cmp(x, y, IEEE754_CEQ, 0);
245}
246
Ralf Baechle2209bcb2014-04-16 01:31:11 +0200247static inline int ieee754dp_ne(union ieee754dp x, union ieee754dp y)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700248{
249 return ieee754dp_cmp(x, y,
250 IEEE754_CLT | IEEE754_CGT | IEEE754_CUN, 0);
251}
252
Ralf Baechle2209bcb2014-04-16 01:31:11 +0200253static inline int ieee754dp_lt(union ieee754dp x, union ieee754dp y)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700254{
255 return ieee754dp_cmp(x, y, IEEE754_CLT, 0);
256}
257
Ralf Baechle2209bcb2014-04-16 01:31:11 +0200258static inline int ieee754dp_le(union ieee754dp x, union ieee754dp y)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700259{
260 return ieee754dp_cmp(x, y, IEEE754_CLT | IEEE754_CEQ, 0);
261}
262
Ralf Baechle2209bcb2014-04-16 01:31:11 +0200263static inline int ieee754dp_gt(union ieee754dp x, union ieee754dp y)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700264{
265 return ieee754dp_cmp(x, y, IEEE754_CGT, 0);
266}
267
Ralf Baechle2209bcb2014-04-16 01:31:11 +0200268static inline int ieee754dp_ge(union ieee754dp x, union ieee754dp y)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700269{
270 return ieee754dp_cmp(x, y, IEEE754_CGT | IEEE754_CEQ, 0);
271}
272
273
Ralf Baechlecd21dfc2005-04-28 13:39:10 +0000274/*
275 * Like strtod
276 */
Ralf Baechle2209bcb2014-04-16 01:31:11 +0200277union ieee754dp ieee754dp_fstr(const char *s, char **endp);
278char *ieee754dp_tstr(union ieee754dp x, int prec, int fmt, int af);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700279
280
Ralf Baechlecd21dfc2005-04-28 13:39:10 +0000281/*
282 * The control status register
283 */
284struct _ieee754_csr {
Ralf Baechlef80cc082014-04-16 00:40:02 +0200285 __BITFIELD_FIELD(unsigned pad0:7,
286 __BITFIELD_FIELD(unsigned nod:1, /* set 1 for no denormalised numbers */
287 __BITFIELD_FIELD(unsigned c:1, /* condition */
288 __BITFIELD_FIELD(unsigned pad1:5,
289 __BITFIELD_FIELD(unsigned cx:6, /* exceptions this operation */
290 __BITFIELD_FIELD(unsigned mx:5, /* exception enable mask */
291 __BITFIELD_FIELD(unsigned sx:5, /* exceptions total */
292 __BITFIELD_FIELD(unsigned rm:2, /* current rounding mode */
293 ;))))))))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700294};
Atsushi Nemotoeae89072006-05-16 01:26:03 +0900295#define ieee754_csr (*(struct _ieee754_csr *)(&current->thread.fpu.fcr31))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700296
Ralf Baechlecd21dfc2005-04-28 13:39:10 +0000297static inline unsigned ieee754_getrm(void)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700298{
299 return (ieee754_csr.rm);
300}
Ralf Baechlecd21dfc2005-04-28 13:39:10 +0000301static inline unsigned ieee754_setrm(unsigned rm)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700302{
303 return (ieee754_csr.rm = rm);
304}
305
306/*
307 * get current exceptions
308 */
Ralf Baechlecd21dfc2005-04-28 13:39:10 +0000309static inline unsigned ieee754_getcx(void)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700310{
311 return (ieee754_csr.cx);
312}
313
314/* test for current exception condition
315 */
Ralf Baechlecd21dfc2005-04-28 13:39:10 +0000316static inline int ieee754_cxtest(unsigned n)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700317{
318 return (ieee754_csr.cx & n);
319}
320
321/*
322 * get sticky exceptions
323 */
Ralf Baechlecd21dfc2005-04-28 13:39:10 +0000324static inline unsigned ieee754_getsx(void)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700325{
326 return (ieee754_csr.sx);
327}
328
329/* clear sticky conditions
330*/
Ralf Baechlecd21dfc2005-04-28 13:39:10 +0000331static inline unsigned ieee754_clrsx(void)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700332{
333 return (ieee754_csr.sx = 0);
334}
335
336/* test for sticky exception condition
337 */
Ralf Baechlecd21dfc2005-04-28 13:39:10 +0000338static inline int ieee754_sxtest(unsigned n)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700339{
340 return (ieee754_csr.sx & n);
341}
342
343/* debugging */
Ralf Baechle2209bcb2014-04-16 01:31:11 +0200344union ieee754sp ieee754sp_dump(char *s, union ieee754sp x);
345union ieee754dp ieee754dp_dump(char *s, union ieee754dp x);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700346
347#define IEEE754_SPCVAL_PZERO 0
348#define IEEE754_SPCVAL_NZERO 1
349#define IEEE754_SPCVAL_PONE 2
350#define IEEE754_SPCVAL_NONE 3
351#define IEEE754_SPCVAL_PTEN 4
352#define IEEE754_SPCVAL_NTEN 5
353#define IEEE754_SPCVAL_PINFINITY 6
354#define IEEE754_SPCVAL_NINFINITY 7
355#define IEEE754_SPCVAL_INDEF 8
356#define IEEE754_SPCVAL_PMAX 9 /* +max norm */
357#define IEEE754_SPCVAL_NMAX 10 /* -max norm */
358#define IEEE754_SPCVAL_PMIN 11 /* +min norm */
359#define IEEE754_SPCVAL_NMIN 12 /* +min norm */
360#define IEEE754_SPCVAL_PMIND 13 /* +min denorm */
361#define IEEE754_SPCVAL_NMIND 14 /* +min denorm */
362#define IEEE754_SPCVAL_P1E31 15 /* + 1.0e31 */
363#define IEEE754_SPCVAL_P1E63 16 /* + 1.0e63 */
364
Ralf Baechle23708812014-04-16 01:16:02 +0200365extern const struct ieee754dp_const __ieee754dp_spcvals[];
366extern const struct ieee754sp_const __ieee754sp_spcvals[];
Ralf Baechle2209bcb2014-04-16 01:31:11 +0200367#define ieee754dp_spcvals ((const union ieee754dp *)__ieee754dp_spcvals)
368#define ieee754sp_spcvals ((const union ieee754sp *)__ieee754sp_spcvals)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700369
Ralf Baechlecd21dfc2005-04-28 13:39:10 +0000370/*
371 * Return infinity with given sign
372 */
373#define ieee754dp_inf(sn) (ieee754dp_spcvals[IEEE754_SPCVAL_PINFINITY+(sn)])
374#define ieee754dp_zero(sn) (ieee754dp_spcvals[IEEE754_SPCVAL_PZERO+(sn)])
375#define ieee754dp_one(sn) (ieee754dp_spcvals[IEEE754_SPCVAL_PONE+(sn)])
376#define ieee754dp_ten(sn) (ieee754dp_spcvals[IEEE754_SPCVAL_PTEN+(sn)])
377#define ieee754dp_indef() (ieee754dp_spcvals[IEEE754_SPCVAL_INDEF])
378#define ieee754dp_max(sn) (ieee754dp_spcvals[IEEE754_SPCVAL_PMAX+(sn)])
379#define ieee754dp_min(sn) (ieee754dp_spcvals[IEEE754_SPCVAL_PMIN+(sn)])
380#define ieee754dp_mind(sn) (ieee754dp_spcvals[IEEE754_SPCVAL_PMIND+(sn)])
381#define ieee754dp_1e31() (ieee754dp_spcvals[IEEE754_SPCVAL_P1E31])
382#define ieee754dp_1e63() (ieee754dp_spcvals[IEEE754_SPCVAL_P1E63])
Linus Torvalds1da177e2005-04-16 15:20:36 -0700383
Ralf Baechlecd21dfc2005-04-28 13:39:10 +0000384#define ieee754sp_inf(sn) (ieee754sp_spcvals[IEEE754_SPCVAL_PINFINITY+(sn)])
385#define ieee754sp_zero(sn) (ieee754sp_spcvals[IEEE754_SPCVAL_PZERO+(sn)])
386#define ieee754sp_one(sn) (ieee754sp_spcvals[IEEE754_SPCVAL_PONE+(sn)])
387#define ieee754sp_ten(sn) (ieee754sp_spcvals[IEEE754_SPCVAL_PTEN+(sn)])
388#define ieee754sp_indef() (ieee754sp_spcvals[IEEE754_SPCVAL_INDEF])
389#define ieee754sp_max(sn) (ieee754sp_spcvals[IEEE754_SPCVAL_PMAX+(sn)])
390#define ieee754sp_min(sn) (ieee754sp_spcvals[IEEE754_SPCVAL_PMIN+(sn)])
391#define ieee754sp_mind(sn) (ieee754sp_spcvals[IEEE754_SPCVAL_PMIND+(sn)])
392#define ieee754sp_1e31() (ieee754sp_spcvals[IEEE754_SPCVAL_P1E31])
393#define ieee754sp_1e63() (ieee754sp_spcvals[IEEE754_SPCVAL_P1E63])
Linus Torvalds1da177e2005-04-16 15:20:36 -0700394
Ralf Baechlecd21dfc2005-04-28 13:39:10 +0000395/*
396 * Indefinite integer value
397 */
Ralf Baechlee812a732014-04-19 14:20:54 +0200398static inline int ieee754si_indef(void)
399{
400 return INT_MAX;
401}
402
403static inline s64 ieee754di_indef(void)
404{
405 return S64_MAX;
406}
Linus Torvalds1da177e2005-04-16 15:20:36 -0700407
408/* IEEE exception context, passed to handler */
409struct ieee754xctx {
410 const char *op; /* operation name */
411 int rt; /* result type */
412 union {
Ralf Baechle2209bcb2014-04-16 01:31:11 +0200413 union ieee754sp sp; /* single precision */
414 union ieee754dp dp; /* double precision */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700415 int si; /* standard signed integer (32bits) */
416 s64 di; /* extended signed integer (64bits) */
417 } rv; /* default result format implied by op */
418 va_list ap;
419};
420
421/* result types for xctx.rt */
422#define IEEE754_RT_SP 0
423#define IEEE754_RT_DP 1
424#define IEEE754_RT_XP 2
425#define IEEE754_RT_SI 3
426#define IEEE754_RT_DI 4
427
Ralf Baechlecae55062014-04-16 00:47:59 +0200428extern void __cold ieee754_xcpt(struct ieee754xctx *xcp);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700429
430/* compat */
431#define ieee754dp_fix(x) ieee754dp_tint(x)
432#define ieee754sp_fix(x) ieee754sp_tint(x)
Ralf Baechlea663bf92005-10-23 13:44:31 +0100433
434#endif /* __ARCH_MIPS_MATH_EMU_IEEE754_H */