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 |