Statistics
| Branch: | Revision:

root / target-i386 / ops_template.h @ 6e0d8677

History | View | Annotate | Download (3.9 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
/* various optimized set cases */
122 2c0262af bellard
123 2c0262af bellard
void OPPROTO glue(op_setb_T0_sub, SUFFIX)(void)
124 2c0262af bellard
{
125 14ce26e7 bellard
    target_long src1, src2;
126 2c0262af bellard
    src1 = CC_DST + CC_SRC;
127 2c0262af bellard
    src2 = CC_SRC;
128 2c0262af bellard
129 2c0262af bellard
    T0 = ((DATA_TYPE)src1 < (DATA_TYPE)src2);
130 2c0262af bellard
}
131 2c0262af bellard
132 2c0262af bellard
void OPPROTO glue(op_setz_T0_sub, SUFFIX)(void)
133 2c0262af bellard
{
134 2c0262af bellard
    T0 = ((DATA_TYPE)CC_DST == 0);
135 2c0262af bellard
}
136 2c0262af bellard
137 2c0262af bellard
void OPPROTO glue(op_setbe_T0_sub, SUFFIX)(void)
138 2c0262af bellard
{
139 14ce26e7 bellard
    target_long src1, src2;
140 2c0262af bellard
    src1 = CC_DST + CC_SRC;
141 2c0262af bellard
    src2 = CC_SRC;
142 2c0262af bellard
143 2c0262af bellard
    T0 = ((DATA_TYPE)src1 <= (DATA_TYPE)src2);
144 2c0262af bellard
}
145 2c0262af bellard
146 2c0262af bellard
void OPPROTO glue(op_sets_T0_sub, SUFFIX)(void)
147 2c0262af bellard
{
148 2c0262af bellard
    T0 = lshift(CC_DST, -(DATA_BITS - 1)) & 1;
149 2c0262af bellard
}
150 2c0262af bellard
151 2c0262af bellard
void OPPROTO glue(op_setl_T0_sub, SUFFIX)(void)
152 2c0262af bellard
{
153 14ce26e7 bellard
    target_long src1, src2;
154 2c0262af bellard
    src1 = CC_DST + CC_SRC;
155 2c0262af bellard
    src2 = CC_SRC;
156 2c0262af bellard
157 2c0262af bellard
    T0 = ((DATA_STYPE)src1 < (DATA_STYPE)src2);
158 2c0262af bellard
}
159 2c0262af bellard
160 2c0262af bellard
void OPPROTO glue(op_setle_T0_sub, SUFFIX)(void)
161 2c0262af bellard
{
162 14ce26e7 bellard
    target_long src1, src2;
163 2c0262af bellard
    src1 = CC_DST + CC_SRC;
164 2c0262af bellard
    src2 = CC_SRC;
165 2c0262af bellard
166 2c0262af bellard
    T0 = ((DATA_STYPE)src1 <= (DATA_STYPE)src2);
167 2c0262af bellard
}
168 2c0262af bellard
169 2c0262af bellard
#undef DATA_BITS
170 2c0262af bellard
#undef SHIFT_MASK
171 14ce26e7 bellard
#undef SHIFT1_MASK
172 2c0262af bellard
#undef SIGN_MASK
173 2c0262af bellard
#undef DATA_TYPE
174 2c0262af bellard
#undef DATA_STYPE
175 2c0262af bellard
#undef DATA_MASK
176 2c0262af bellard
#undef SUFFIX