Kernel messages infrastructure
[akaros.git] / kern / arch / sparc / sparcfpu.h
1 /* Author: Andrew S. Waterman
2  *         Parallel Computing Laboratory
3  *         Electrical Engineering and Computer Sciences
4  *         University of California, Berkeley
5  *
6  * Copyright (c) 2008, The Regents of the University of California.
7  * All rights reserved.
8  *
9  * Redistribution and use in source and binary forms, with or without
10  * modification, are permitted provided that the following conditions are met:
11  *     * Redistributions of source code must retain the above copyright
12  *       notice, this list of conditions and the following disclaimer.
13  *     * Redistributions in binary form must reproduce the above copyright
14  *       notice, this list of conditions and the following disclaimer in the
15  *       documentation and/or other materials provided with the distribution.
16  *     * Neither the name of the University of California, Berkeley nor the
17  *       names of its contributors may be used to endorse or promote products
18  *       derived from this software without specific prior written permission.
19  *
20  * THIS SOFTWARE IS PROVIDED BY THE REGENTS ''AS IS'' AND ANY EXPRESS OR
21  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
22  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
23  * IN NO EVENT SHALL THE REGENTS BE LIABLE FOR ANY DIRECT, INDIRECT,
24  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
25  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
29  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30  */
31
32
33 #ifndef _SPARCFPU_H
34 #define _SPARCFPU_H
35
36 #ifdef __cplusplus
37   extern "C" {
38 #endif
39
40 #include <arch/arch.h>
41 #include <arch/softfloat.h>
42
43 typedef struct
44 {
45 #ifdef BIG_ENDIAN
46   uint32_t rd : 2;
47   uint32_t unused : 2;
48   uint32_t TEM : 5;
49   uint32_t NS : 1;
50   uint32_t res : 2;
51   uint32_t ver : 3;
52   uint32_t ftt : 3;
53   uint32_t qne : 1;
54   uint32_t unused2 : 1;
55   uint32_t fcc : 2;
56   uint32_t aexc : 5;
57   uint32_t cexc : 5;
58 #else
59   uint32_t cexc : 5;
60   uint32_t aexc : 5;
61   uint32_t fcc : 2;
62   uint32_t unused2 : 1;
63   uint32_t qne : 1;
64   uint32_t ftt : 3;
65   uint32_t ver : 3;
66   uint32_t res : 2;
67   uint32_t NS : 1;
68   uint32_t TEM : 5;
69   uint32_t unused : 2;
70   uint32_t rd : 2;
71 #endif
72 } fsr_t;
73
74 typedef struct
75 {
76 #ifdef BIG_ENDIAN
77   uint32_t op : 2;
78   uint32_t rd : 5;
79   uint32_t op3 : 6;
80   uint32_t rs1 : 5;
81   uint32_t opf : 9;
82   uint32_t rs2 : 5;
83 #else
84   uint32_t rs2 : 5;
85   uint32_t opf : 9;
86   uint32_t rs1 : 5;
87   uint32_t op3 : 6;
88   uint32_t rd : 5;
89   uint32_t op : 2;
90 #endif
91 } fp_insn_t;
92
93 typedef struct
94 {
95   uint64_t dummy; /* force 8-byte alignment*/
96   uint32_t freg[32];
97   fsr_t FSR;
98   softfloat_t softfloat;
99 } sparcfpu_t;
100
101 enum FPop1opcodes
102 {
103   opFMOVs=0x01,
104   opFNEGs=0x05,
105   opFABSs=0x09,
106   opFSQRTs=0x29,
107   opFSQRTd=0x2A,
108   opFSQRTq=0x2B,
109   opFADDs=0x41,
110   opFADDd=0x42,
111   opFADDq=0x43,
112   opFSUBs=0x45,
113   opFSUBd=0x46,
114   opFSUBq=0x47,
115   opFMULs=0x49,
116   opFMULd=0x4A,
117   opFMULq=0x4B,
118   opFDIVs=0x4D,
119   opFDIVd=0x4E,
120   opFDIVq=0x4F,
121   opFsMULd=0x69,
122   opFdMULq=0x6E,
123   opFiTOs=0xC4,
124   opFdTOs=0xC6,
125   opFqTOs=0xC7,
126   opFiTOd=0xC8,
127   opFsTOd=0xC9,
128   opFqTOd=0xCB,
129   opFiTOq=0xCC,
130   opFsTOq=0xCD,
131   opFdTOq=0xCE,
132   opFsTOi=0xD1,
133   opFdTOi=0xD2,
134   opFqTOi=0xD3
135 };
136
137 enum FPop2opcodes
138 {
139   opFCMPs=0x51,
140   opFCMPd=0x52,
141   opFCMPq=0x53,
142   opFCMPEs=0x55,
143   opFCMPEd=0x56,
144   opFCMPEq=0x57
145 };
146
147 enum fp_traps
148 {
149   fp_trap_none,
150   fp_trap_IEEE_754_exception,
151   fp_trap_unfinished_FPop,
152   fp_trap_unimplemented_FPop,
153   fp_trap_sequence_error,
154   fp_trap_hardware_error,
155   fp_trap_invalid_fp_register,
156   fp_trap_reserved
157 };
158
159 enum ieee_754_exceptions
160 {
161   ieee_754_exception_inexact=1,
162   ieee_754_exception_division_by_zero=2,
163   ieee_754_exception_underflow=4,
164   ieee_754_exception_overflow=8,
165   ieee_754_exception_invalid=16,
166 };
167
168 enum fconds
169 {
170   fccN,fccNE,fccLG,fccUL,fccL,fccUG,fccG,fccU,
171   fccA,fccE,fccUE,fccGE,fccUGE,fccLE,fccULE,fccO
172 };
173
174 // check if a branch is taken based upon condition (outer dimension)
175 // and current FP condition code value (inner dimension)
176 static const uint8_t check_fcc[16][4] = {
177   {0,0,0,0},
178   {0,1,1,1},
179   {0,1,1,0},
180   {0,1,0,1},
181   {0,1,0,0},
182   {0,0,1,1},
183   {0,0,1,0},
184   {0,0,0,1},
185   {1,1,1,1},
186   {1,0,0,0},
187   {1,0,0,1},
188   {1,0,1,0},
189   {1,0,1,1},
190   {1,1,0,0},
191   {1,1,0,1},
192   {1,1,1,0}
193 };
194
195 void sparcfpu_init(sparcfpu_t* fpu);
196
197 void sparcfpu_fpop1(sparcfpu_t* fpu, fp_insn_t insn);
198 void sparcfpu_fpop2(sparcfpu_t* fpu, fp_insn_t insn);
199 void sparcfpu_setFSR(sparcfpu_t* fpu, uint32_t newFSR); 
200 uint32_t sparcfpu_getFSR(sparcfpu_t* fpu); 
201
202 void sparcfpu_wrregs(sparcfpu_t* fpu, uint32_t reg, float32 val);
203 void sparcfpu_wrregd(sparcfpu_t* fpu, uint32_t reg, float64 val);
204 void sparcfpu_wrregq(sparcfpu_t* fpu, uint32_t reg, float128 val);
205 float32 sparcfpu_regs(sparcfpu_t* fpu, uint32_t reg);
206 float64 sparcfpu_regd(sparcfpu_t* fpu, uint32_t reg);
207 float128 sparcfpu_regq(sparcfpu_t* fpu, uint32_t reg);
208
209 #ifdef __cplusplus
210   }
211 #endif
212
213 #endif
214