Statistics
| Branch: | Revision:

root / linux-user / arm / nwfpe / fpopcode.c @ b53d44e5

History | View | Annotate | Download (3.3 kB)

1 00406dff bellard
/*
2 00406dff bellard
    NetWinder Floating Point Emulator
3 00406dff bellard
    (c) Rebel.COM, 1998,1999
4 00406dff bellard

5 00406dff bellard
    Direct questions, comments to Scott Bambrough <scottb@netwinder.org>
6 00406dff bellard

7 00406dff bellard
    This program is free software; you can redistribute it and/or modify
8 00406dff bellard
    it under the terms of the GNU General Public License as published by
9 00406dff bellard
    the Free Software Foundation; either version 2 of the License, or
10 00406dff bellard
    (at your option) any later version.
11 00406dff bellard

12 00406dff bellard
    This program is distributed in the hope that it will be useful,
13 00406dff bellard
    but WITHOUT ANY WARRANTY; without even the implied warranty of
14 00406dff bellard
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 00406dff bellard
    GNU General Public License for more details.
16 00406dff bellard

17 00406dff bellard
    You should have received a copy of the GNU General Public License
18 00406dff bellard
    along with this program; if not, write to the Free Software
19 00406dff bellard
    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20 00406dff bellard
*/
21 00406dff bellard
22 00406dff bellard
#include "fpa11.h"
23 00406dff bellard
#include "softfloat.h"
24 00406dff bellard
#include "fpopcode.h"
25 00406dff bellard
#include "fpsr.h"
26 00406dff bellard
//#include "fpmodule.h"
27 00406dff bellard
//#include "fpmodule.inl"
28 00406dff bellard
29 00406dff bellard
const floatx80 floatx80Constant[] = {
30 20495218 bellard
  { 0x0000000000000000ULL, 0x0000},        /* extended 0.0 */
31 20495218 bellard
  { 0x8000000000000000ULL, 0x3fff},        /* extended 1.0 */
32 20495218 bellard
  { 0x8000000000000000ULL, 0x4000},        /* extended 2.0 */
33 20495218 bellard
  { 0xc000000000000000ULL, 0x4000},        /* extended 3.0 */
34 20495218 bellard
  { 0x8000000000000000ULL, 0x4001},        /* extended 4.0 */
35 20495218 bellard
  { 0xa000000000000000ULL, 0x4001},        /* extended 5.0 */
36 20495218 bellard
  { 0x8000000000000000ULL, 0x3ffe},        /* extended 0.5 */
37 20495218 bellard
  { 0xa000000000000000ULL, 0x4002}        /* extended 10.0 */
38 3b46e624 ths
};
39 00406dff bellard
40 00406dff bellard
const float64 float64Constant[] = {
41 00406dff bellard
  0x0000000000000000ULL,                /* double 0.0 */
42 00406dff bellard
  0x3ff0000000000000ULL,                /* double 1.0 */
43 00406dff bellard
  0x4000000000000000ULL,                /* double 2.0 */
44 00406dff bellard
  0x4008000000000000ULL,                /* double 3.0 */
45 00406dff bellard
  0x4010000000000000ULL,                /* double 4.0 */
46 00406dff bellard
  0x4014000000000000ULL,                /* double 5.0 */
47 00406dff bellard
  0x3fe0000000000000ULL,                /* double 0.5 */
48 00406dff bellard
  0x4024000000000000ULL                        /* double 10.0 */
49 3b46e624 ths
};
50 00406dff bellard
51 00406dff bellard
const float32 float32Constant[] = {
52 00406dff bellard
  0x00000000,                                /* single 0.0 */
53 00406dff bellard
  0x3f800000,                                /* single 1.0 */
54 00406dff bellard
  0x40000000,                                /* single 2.0 */
55 00406dff bellard
  0x40400000,                                /* single 3.0 */
56 00406dff bellard
  0x40800000,                                /* single 4.0 */
57 00406dff bellard
  0x40a00000,                                /* single 5.0 */
58 00406dff bellard
  0x3f000000,                                /* single 0.5 */
59 00406dff bellard
  0x41200000                                /* single 10.0 */
60 3b46e624 ths
};
61 00406dff bellard
62 00406dff bellard
unsigned int getRegisterCount(const unsigned int opcode)
63 00406dff bellard
{
64 00406dff bellard
  unsigned int nRc;
65 3b46e624 ths
66 00406dff bellard
  switch (opcode & MASK_REGISTER_COUNT)
67 00406dff bellard
  {
68 00406dff bellard
    case 0x00000000: nRc = 4; break;
69 00406dff bellard
    case 0x00008000: nRc = 1; break;
70 00406dff bellard
    case 0x00400000: nRc = 2; break;
71 00406dff bellard
    case 0x00408000: nRc = 3; break;
72 00406dff bellard
    default: nRc = 0;
73 00406dff bellard
  }
74 3b46e624 ths
75 00406dff bellard
  return(nRc);
76 00406dff bellard
}
77 00406dff bellard
78 00406dff bellard
unsigned int getDestinationSize(const unsigned int opcode)
79 00406dff bellard
{
80 00406dff bellard
  unsigned int nRc;
81 3b46e624 ths
82 00406dff bellard
  switch (opcode & MASK_DESTINATION_SIZE)
83 00406dff bellard
  {
84 00406dff bellard
    case 0x00000000: nRc = typeSingle; break;
85 00406dff bellard
    case 0x00000080: nRc = typeDouble; break;
86 00406dff bellard
    case 0x00080000: nRc = typeExtended; break;
87 00406dff bellard
    default: nRc = typeNone;
88 00406dff bellard
  }
89 3b46e624 ths
90 00406dff bellard
  return(nRc);
91 00406dff bellard
}
92 00406dff bellard
93 00406dff bellard
/* condition code lookup table
94 00406dff bellard
 index into the table is test code: EQ, NE, ... LT, GT, AL, NV
95 00406dff bellard
 bit position in short is condition code: NZCV */
96 00406dff bellard
static const unsigned short aCC[16] = {
97 00406dff bellard
    0xF0F0, // EQ == Z set
98 00406dff bellard
    0x0F0F, // NE
99 00406dff bellard
    0xCCCC, // CS == C set
100 00406dff bellard
    0x3333, // CC
101 00406dff bellard
    0xFF00, // MI == N set
102 00406dff bellard
    0x00FF, // PL
103 00406dff bellard
    0xAAAA, // VS == V set
104 00406dff bellard
    0x5555, // VC
105 00406dff bellard
    0x0C0C, // HI == C set && Z clear
106 00406dff bellard
    0xF3F3, // LS == C clear || Z set
107 00406dff bellard
    0xAA55, // GE == (N==V)
108 00406dff bellard
    0x55AA, // LT == (N!=V)
109 00406dff bellard
    0x0A05, // GT == (!Z && (N==V))
110 00406dff bellard
    0xF5FA, // LE == (Z || (N!=V))
111 00406dff bellard
    0xFFFF, // AL always
112 00406dff bellard
    0 // NV
113 00406dff bellard
};