Statistics
| Branch: | Revision:

root / target-i386 / ops_template.h @ 6191b059

History | View | Annotate | Download (4.5 kB)

1 2c0262af bellard
/*
2 2c0262af bellard
 *  i386 micro operations (included several times to generate
3 2c0262af bellard
 *  different operand sizes)
4 5fafdf24 ths
 *
5 2c0262af bellard
 *  Copyright (c) 2003 Fabrice Bellard
6 2c0262af bellard
 *
7 2c0262af bellard
 * This library is free software; you can redistribute it and/or
8 2c0262af bellard
 * modify it under the terms of the GNU Lesser General Public
9 2c0262af bellard
 * License as published by the Free Software Foundation; either
10 2c0262af bellard
 * version 2 of the License, or (at your option) any later version.
11 2c0262af bellard
 *
12 2c0262af bellard
 * This library is distributed in the hope that it will be useful,
13 2c0262af bellard
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 2c0262af bellard
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15 2c0262af bellard
 * Lesser General Public License for more details.
16 2c0262af bellard
 *
17 2c0262af bellard
 * You should have received a copy of the GNU Lesser General Public
18 2c0262af bellard
 * License along with this library; if not, write to the Free Software
19 2c0262af bellard
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
20 2c0262af bellard
 */
21 2c0262af bellard
#define DATA_BITS (1 << (3 + SHIFT))
22 2c0262af bellard
#define SHIFT_MASK (DATA_BITS - 1)
23 14ce26e7 bellard
#define SIGN_MASK (((target_ulong)1) << (DATA_BITS - 1))
24 14ce26e7 bellard
#if DATA_BITS <= 32
25 14ce26e7 bellard
#define SHIFT1_MASK 0x1f
26 14ce26e7 bellard
#else
27 14ce26e7 bellard
#define SHIFT1_MASK 0x3f
28 14ce26e7 bellard
#endif
29 2c0262af bellard
30 2c0262af bellard
#if DATA_BITS == 8
31 2c0262af bellard
#define SUFFIX b
32 2c0262af bellard
#define DATA_TYPE uint8_t
33 2c0262af bellard
#define DATA_STYPE int8_t
34 2c0262af bellard
#define DATA_MASK 0xff
35 2c0262af bellard
#elif DATA_BITS == 16
36 2c0262af bellard
#define SUFFIX w
37 2c0262af bellard
#define DATA_TYPE uint16_t
38 2c0262af bellard
#define DATA_STYPE int16_t
39 2c0262af bellard
#define DATA_MASK 0xffff
40 2c0262af bellard
#elif DATA_BITS == 32
41 2c0262af bellard
#define SUFFIX l
42 2c0262af bellard
#define DATA_TYPE uint32_t
43 2c0262af bellard
#define DATA_STYPE int32_t
44 2c0262af bellard
#define DATA_MASK 0xffffffff
45 14ce26e7 bellard
#elif DATA_BITS == 64
46 14ce26e7 bellard
#define SUFFIX q
47 14ce26e7 bellard
#define DATA_TYPE uint64_t
48 14ce26e7 bellard
#define DATA_STYPE int64_t
49 977d5710 bellard
#define DATA_MASK 0xffffffffffffffffULL
50 2c0262af bellard
#else
51 2c0262af bellard
#error unhandled operand size
52 2c0262af bellard
#endif
53 2c0262af bellard
54 2c0262af bellard
/* various optimized jumps cases */
55 2c0262af bellard
56 2c0262af bellard
void OPPROTO glue(op_jb_sub, SUFFIX)(void)
57 2c0262af bellard
{
58 14ce26e7 bellard
    target_long src1, src2;
59 2c0262af bellard
    src1 = CC_DST + CC_SRC;
60 2c0262af bellard
    src2 = CC_SRC;
61 2c0262af bellard
62 2c0262af bellard
    if ((DATA_TYPE)src1 < (DATA_TYPE)src2)
63 14ce26e7 bellard
        GOTO_LABEL_PARAM(1);
64 2c0262af bellard
    FORCE_RET();
65 2c0262af bellard
}
66 2c0262af bellard
67 2c0262af bellard
void OPPROTO glue(op_jz_sub, SUFFIX)(void)
68 2c0262af bellard
{
69 2c0262af bellard
    if ((DATA_TYPE)CC_DST == 0)
70 14ce26e7 bellard
        GOTO_LABEL_PARAM(1);
71 14ce26e7 bellard
    FORCE_RET();
72 14ce26e7 bellard
}
73 14ce26e7 bellard
74 14ce26e7 bellard
void OPPROTO glue(op_jnz_sub, SUFFIX)(void)
75 14ce26e7 bellard
{
76 14ce26e7 bellard
    if ((DATA_TYPE)CC_DST != 0)
77 14ce26e7 bellard
        GOTO_LABEL_PARAM(1);
78 2c0262af bellard
    FORCE_RET();
79 2c0262af bellard
}
80 2c0262af bellard
81 2c0262af bellard
void OPPROTO glue(op_jbe_sub, SUFFIX)(void)
82 2c0262af bellard
{
83 14ce26e7 bellard
    target_long src1, src2;
84 2c0262af bellard
    src1 = CC_DST + CC_SRC;
85 2c0262af bellard
    src2 = CC_SRC;
86 2c0262af bellard
87 2c0262af bellard
    if ((DATA_TYPE)src1 <= (DATA_TYPE)src2)
88 14ce26e7 bellard
        GOTO_LABEL_PARAM(1);
89 2c0262af bellard
    FORCE_RET();
90 2c0262af bellard
}
91 2c0262af bellard
92 2c0262af bellard
void OPPROTO glue(op_js_sub, SUFFIX)(void)
93 2c0262af bellard
{
94 2c0262af bellard
    if (CC_DST & SIGN_MASK)
95 14ce26e7 bellard
        GOTO_LABEL_PARAM(1);
96 2c0262af bellard
    FORCE_RET();
97 2c0262af bellard
}
98 2c0262af bellard
99 2c0262af bellard
void OPPROTO glue(op_jl_sub, SUFFIX)(void)
100 2c0262af bellard
{
101 14ce26e7 bellard
    target_long src1, src2;
102 2c0262af bellard
    src1 = CC_DST + CC_SRC;
103 2c0262af bellard
    src2 = CC_SRC;
104 2c0262af bellard
105 2c0262af bellard
    if ((DATA_STYPE)src1 < (DATA_STYPE)src2)
106 14ce26e7 bellard
        GOTO_LABEL_PARAM(1);
107 2c0262af bellard
    FORCE_RET();
108 2c0262af bellard
}
109 2c0262af bellard
110 2c0262af bellard
void OPPROTO glue(op_jle_sub, SUFFIX)(void)
111 2c0262af bellard
{
112 14ce26e7 bellard
    target_long src1, src2;
113 2c0262af bellard
    src1 = CC_DST + CC_SRC;
114 2c0262af bellard
    src2 = CC_SRC;
115 2c0262af bellard
116 2c0262af bellard
    if ((DATA_STYPE)src1 <= (DATA_STYPE)src2)
117 14ce26e7 bellard
        GOTO_LABEL_PARAM(1);
118 2c0262af bellard
    FORCE_RET();
119 2c0262af bellard
}
120 2c0262af bellard
121 2c0262af bellard
/* oldies */
122 2c0262af bellard
123 2c0262af bellard
#if DATA_BITS >= 16
124 2c0262af bellard
125 2c0262af bellard
void OPPROTO glue(op_loopnz, SUFFIX)(void)
126 2c0262af bellard
{
127 0b9dc5e4 bellard
    if ((DATA_TYPE)ECX != 0 && !(T0 & CC_Z))
128 14ce26e7 bellard
        GOTO_LABEL_PARAM(1);
129 2c0262af bellard
    FORCE_RET();
130 2c0262af bellard
}
131 2c0262af bellard
132 2c0262af bellard
void OPPROTO glue(op_loopz, SUFFIX)(void)
133 2c0262af bellard
{
134 0b9dc5e4 bellard
    if ((DATA_TYPE)ECX != 0 && (T0 & CC_Z))
135 14ce26e7 bellard
        GOTO_LABEL_PARAM(1);
136 2c0262af bellard
    FORCE_RET();
137 2c0262af bellard
}
138 2c0262af bellard
139 14ce26e7 bellard
void OPPROTO glue(op_jz_ecx, SUFFIX)(void)
140 2c0262af bellard
{
141 14ce26e7 bellard
    if ((DATA_TYPE)ECX == 0)
142 14ce26e7 bellard
        GOTO_LABEL_PARAM(1);
143 2c0262af bellard
    FORCE_RET();
144 2c0262af bellard
}
145 2c0262af bellard
146 14ce26e7 bellard
void OPPROTO glue(op_jnz_ecx, SUFFIX)(void)
147 2c0262af bellard
{
148 14ce26e7 bellard
    if ((DATA_TYPE)ECX != 0)
149 14ce26e7 bellard
        GOTO_LABEL_PARAM(1);
150 2c0262af bellard
    FORCE_RET();
151 2c0262af bellard
}
152 2c0262af bellard
153 2c0262af bellard
#endif
154 2c0262af bellard
155 2c0262af bellard
/* various optimized set cases */
156 2c0262af bellard
157 2c0262af bellard
void OPPROTO glue(op_setb_T0_sub, SUFFIX)(void)
158 2c0262af bellard
{
159 14ce26e7 bellard
    target_long src1, src2;
160 2c0262af bellard
    src1 = CC_DST + CC_SRC;
161 2c0262af bellard
    src2 = CC_SRC;
162 2c0262af bellard
163 2c0262af bellard
    T0 = ((DATA_TYPE)src1 < (DATA_TYPE)src2);
164 2c0262af bellard
}
165 2c0262af bellard
166 2c0262af bellard
void OPPROTO glue(op_setz_T0_sub, SUFFIX)(void)
167 2c0262af bellard
{
168 2c0262af bellard
    T0 = ((DATA_TYPE)CC_DST == 0);
169 2c0262af bellard
}
170 2c0262af bellard
171 2c0262af bellard
void OPPROTO glue(op_setbe_T0_sub, SUFFIX)(void)
172 2c0262af bellard
{
173 14ce26e7 bellard
    target_long src1, src2;
174 2c0262af bellard
    src1 = CC_DST + CC_SRC;
175 2c0262af bellard
    src2 = CC_SRC;
176 2c0262af bellard
177 2c0262af bellard
    T0 = ((DATA_TYPE)src1 <= (DATA_TYPE)src2);
178 2c0262af bellard
}
179 2c0262af bellard
180 2c0262af bellard
void OPPROTO glue(op_sets_T0_sub, SUFFIX)(void)
181 2c0262af bellard
{
182 2c0262af bellard
    T0 = lshift(CC_DST, -(DATA_BITS - 1)) & 1;
183 2c0262af bellard
}
184 2c0262af bellard
185 2c0262af bellard
void OPPROTO glue(op_setl_T0_sub, SUFFIX)(void)
186 2c0262af bellard
{
187 14ce26e7 bellard
    target_long src1, src2;
188 2c0262af bellard
    src1 = CC_DST + CC_SRC;
189 2c0262af bellard
    src2 = CC_SRC;
190 2c0262af bellard
191 2c0262af bellard
    T0 = ((DATA_STYPE)src1 < (DATA_STYPE)src2);
192 2c0262af bellard
}
193 2c0262af bellard
194 2c0262af bellard
void OPPROTO glue(op_setle_T0_sub, SUFFIX)(void)
195 2c0262af bellard
{
196 14ce26e7 bellard
    target_long src1, src2;
197 2c0262af bellard
    src1 = CC_DST + CC_SRC;
198 2c0262af bellard
    src2 = CC_SRC;
199 2c0262af bellard
200 2c0262af bellard
    T0 = ((DATA_STYPE)src1 <= (DATA_STYPE)src2);
201 2c0262af bellard
}
202 2c0262af bellard
203 2c0262af bellard
/* string operations */
204 2c0262af bellard
205 2c0262af bellard
void OPPROTO glue(op_movl_T0_Dshift, SUFFIX)(void)
206 2c0262af bellard
{
207 2c0262af bellard
    T0 = DF << SHIFT;
208 2c0262af bellard
}
209 2c0262af bellard
210 2c0262af bellard
#undef DATA_BITS
211 2c0262af bellard
#undef SHIFT_MASK
212 14ce26e7 bellard
#undef SHIFT1_MASK
213 2c0262af bellard
#undef SIGN_MASK
214 2c0262af bellard
#undef DATA_TYPE
215 2c0262af bellard
#undef DATA_STYPE
216 2c0262af bellard
#undef DATA_MASK
217 2c0262af bellard
#undef SUFFIX