]> git.proxmox.com Git - mirror_ubuntu-zesty-kernel.git/blame - arch/x86/math-emu/fpu_tags.c
x86: lindent arch/i386/math-emu
[mirror_ubuntu-zesty-kernel.git] / arch / x86 / math-emu / fpu_tags.c
CommitLineData
1da177e4
LT
1/*---------------------------------------------------------------------------+
2 | fpu_tags.c |
3 | |
4 | Set FPU register tags. |
5 | |
6 | Copyright (C) 1997 |
7 | W. Metzenthen, 22 Parker St, Ormond, Vic 3163, Australia |
8 | E-mail billm@jacobi.maths.monash.edu.au |
9 | |
10 | |
11 +---------------------------------------------------------------------------*/
12
13#include "fpu_emu.h"
14#include "fpu_system.h"
15#include "exception.h"
16
1da177e4
LT
17void FPU_pop(void)
18{
3d0d14f9
IM
19 fpu_tag_word |= 3 << ((top & 7) * 2);
20 top++;
1da177e4
LT
21}
22
1da177e4
LT
23int FPU_gettag0(void)
24{
3d0d14f9 25 return (fpu_tag_word >> ((top & 7) * 2)) & 3;
1da177e4
LT
26}
27
1da177e4
LT
28int FPU_gettagi(int stnr)
29{
3d0d14f9 30 return (fpu_tag_word >> (((top + stnr) & 7) * 2)) & 3;
1da177e4
LT
31}
32
1da177e4
LT
33int FPU_gettag(int regnr)
34{
3d0d14f9 35 return (fpu_tag_word >> ((regnr & 7) * 2)) & 3;
1da177e4
LT
36}
37
1da177e4
LT
38void FPU_settag0(int tag)
39{
3d0d14f9
IM
40 int regnr = top;
41 regnr &= 7;
42 fpu_tag_word &= ~(3 << (regnr * 2));
43 fpu_tag_word |= (tag & 3) << (regnr * 2);
1da177e4
LT
44}
45
1da177e4
LT
46void FPU_settagi(int stnr, int tag)
47{
3d0d14f9
IM
48 int regnr = stnr + top;
49 regnr &= 7;
50 fpu_tag_word &= ~(3 << (regnr * 2));
51 fpu_tag_word |= (tag & 3) << (regnr * 2);
1da177e4
LT
52}
53
1da177e4
LT
54void FPU_settag(int regnr, int tag)
55{
3d0d14f9
IM
56 regnr &= 7;
57 fpu_tag_word &= ~(3 << (regnr * 2));
58 fpu_tag_word |= (tag & 3) << (regnr * 2);
1da177e4
LT
59}
60
1da177e4
LT
61int FPU_Special(FPU_REG const *ptr)
62{
3d0d14f9
IM
63 int exp = exponent(ptr);
64
65 if (exp == EXP_BIAS + EXP_UNDER)
66 return TW_Denormal;
67 else if (exp != EXP_BIAS + EXP_OVER)
68 return TW_NaN;
69 else if ((ptr->sigh == 0x80000000) && (ptr->sigl == 0))
70 return TW_Infinity;
71 return TW_NaN;
1da177e4
LT
72}
73
1da177e4
LT
74int isNaN(FPU_REG const *ptr)
75{
3d0d14f9
IM
76 return ((exponent(ptr) == EXP_BIAS + EXP_OVER)
77 && !((ptr->sigh == 0x80000000) && (ptr->sigl == 0)));
1da177e4
LT
78}
79
1da177e4
LT
80int FPU_empty_i(int stnr)
81{
3d0d14f9 82 int regnr = (top + stnr) & 7;
1da177e4 83
3d0d14f9 84 return ((fpu_tag_word >> (regnr * 2)) & 3) == TAG_Empty;
1da177e4
LT
85}
86
3d0d14f9 87int FPU_stackoverflow(FPU_REG ** st_new_ptr)
1da177e4 88{
3d0d14f9 89 *st_new_ptr = &st(-1);
1da177e4 90
3d0d14f9 91 return ((fpu_tag_word >> (((top - 1) & 7) * 2)) & 3) != TAG_Empty;
1da177e4
LT
92}
93
1da177e4
LT
94void FPU_copy_to_regi(FPU_REG const *r, u_char tag, int stnr)
95{
3d0d14f9
IM
96 reg_copy(r, &st(stnr));
97 FPU_settagi(stnr, tag);
1da177e4
LT
98}
99
100void FPU_copy_to_reg1(FPU_REG const *r, u_char tag)
101{
3d0d14f9
IM
102 reg_copy(r, &st(1));
103 FPU_settagi(1, tag);
1da177e4
LT
104}
105
106void FPU_copy_to_reg0(FPU_REG const *r, u_char tag)
107{
3d0d14f9
IM
108 int regnr = top;
109 regnr &= 7;
1da177e4 110
3d0d14f9 111 reg_copy(r, &st(0));
1da177e4 112
3d0d14f9
IM
113 fpu_tag_word &= ~(3 << (regnr * 2));
114 fpu_tag_word |= (tag & 3) << (regnr * 2);
1da177e4 115}