Revision 04acd307 target-alpha/op_helper.c
b/target-alpha/op_helper.c | ||
---|---|---|
163 | 163 |
return tmp; |
164 | 164 |
} |
165 | 165 |
|
166 |
void helper_addqv (void)
|
|
166 |
uint64_t helper_addqv (uint64_t op1, uint64_t op2)
|
|
167 | 167 |
{ |
168 |
T2 = T0;
|
|
169 |
T0 += T1;
|
|
170 |
if (unlikely((T2 ^ T1 ^ (-1ULL)) & (T2 ^ T0) & (1ULL << 63))) {
|
|
168 |
uint64_t tmp = op1;
|
|
169 |
op1 += op2;
|
|
170 |
if (unlikely((tmp ^ op2 ^ (-1ULL)) & (tmp ^ op1) & (1ULL << 63))) {
|
|
171 | 171 |
helper_excp(EXCP_ARITH, EXCP_ARITH_OVERFLOW); |
172 | 172 |
} |
173 |
return op1; |
|
173 | 174 |
} |
174 | 175 |
|
175 |
void helper_addlv (void)
|
|
176 |
uint64_t helper_addlv (uint64_t op1, uint64_t op2)
|
|
176 | 177 |
{ |
177 |
T2 = T0;
|
|
178 |
T0 = (uint32_t)(T0 + T1);
|
|
179 |
if (unlikely((T2 ^ T1 ^ (-1UL)) & (T2 ^ T0) & (1UL << 31))) {
|
|
178 |
uint64_t tmp = op1;
|
|
179 |
op1 = (uint32_t)(op1 + op2);
|
|
180 |
if (unlikely((tmp ^ op2 ^ (-1UL)) & (tmp ^ op1) & (1UL << 31))) {
|
|
180 | 181 |
helper_excp(EXCP_ARITH, EXCP_ARITH_OVERFLOW); |
181 | 182 |
} |
183 |
return op1; |
|
182 | 184 |
} |
183 | 185 |
|
184 |
void helper_subqv (void)
|
|
186 |
uint64_t helper_subqv (uint64_t op1, uint64_t op2)
|
|
185 | 187 |
{ |
186 |
T2 = T0;
|
|
187 |
T0 -= T1;
|
|
188 |
if (unlikely(((~T2) ^ T0 ^ (-1ULL)) & ((~T2) ^ T1) & (1ULL << 63))) {
|
|
188 |
uint64_t tmp = op1;
|
|
189 |
op1 -= op2;
|
|
190 |
if (unlikely(((~tmp) ^ op1 ^ (-1ULL)) & ((~tmp) ^ op2) & (1ULL << 63))) {
|
|
189 | 191 |
helper_excp(EXCP_ARITH, EXCP_ARITH_OVERFLOW); |
190 | 192 |
} |
193 |
return op1; |
|
191 | 194 |
} |
192 | 195 |
|
193 |
void helper_sublv (void)
|
|
196 |
uint64_t helper_sublv (uint64_t op1, uint64_t op2)
|
|
194 | 197 |
{ |
195 |
T2 = T0;
|
|
196 |
T0 = (uint32_t)(T0 - T1);
|
|
197 |
if (unlikely(((~T2) ^ T0 ^ (-1UL)) & ((~T2) ^ T1) & (1UL << 31))) {
|
|
198 |
uint64_t tmp = op1;
|
|
199 |
op1 = (uint32_t)(op1 - op2);
|
|
200 |
if (unlikely(((~tmp) ^ op1 ^ (-1UL)) & ((~tmp) ^ op2) & (1UL << 31))) {
|
|
198 | 201 |
helper_excp(EXCP_ARITH, EXCP_ARITH_OVERFLOW); |
199 | 202 |
} |
203 |
return op1; |
|
200 | 204 |
} |
201 | 205 |
|
202 |
void helper_mullv (void)
|
|
206 |
uint64_t helper_mullv (uint64_t op1, uint64_t op2)
|
|
203 | 207 |
{ |
204 |
int64_t res = (int64_t)T0 * (int64_t)T1;
|
|
208 |
int64_t res = (int64_t)op1 * (int64_t)op2;
|
|
205 | 209 |
|
206 | 210 |
if (unlikely((int32_t)res != res)) { |
207 | 211 |
helper_excp(EXCP_ARITH, EXCP_ARITH_OVERFLOW); |
208 | 212 |
} |
209 |
T0 = (int64_t)((int32_t)res);
|
|
213 |
return (int64_t)((int32_t)res);
|
|
210 | 214 |
} |
211 | 215 |
|
212 |
void helper_mulqv ()
|
|
216 |
uint64_t helper_mulqv (uint64_t op1, uint64_t op2)
|
|
213 | 217 |
{ |
214 | 218 |
uint64_t tl, th; |
215 | 219 |
|
216 |
muls64(&tl, &th, T0, T1);
|
|
220 |
muls64(&tl, &th, op1, op2);
|
|
217 | 221 |
/* If th != 0 && th != -1, then we had an overflow */ |
218 | 222 |
if (unlikely((th + 1) > 1)) { |
219 | 223 |
helper_excp(EXCP_ARITH, EXCP_ARITH_OVERFLOW); |
220 | 224 |
} |
221 |
T0 = tl; |
|
225 |
return tl; |
|
226 |
} |
|
227 |
|
|
228 |
uint64_t helper_umulh (uint64_t op1, uint64_t op2) |
|
229 |
{ |
|
230 |
uint64_t tl, th; |
|
231 |
|
|
232 |
mulu64(&tl, &th, op1, op2); |
|
233 |
return th; |
|
222 | 234 |
} |
223 | 235 |
|
224 | 236 |
uint64_t helper_ctpop (uint64_t arg) |
... | ... | |
340 | 352 |
return byte_zap(val, ~((0xFF << (mask & 7)) >> 8)); |
341 | 353 |
} |
342 | 354 |
|
343 |
void helper_cmpbge (void)
|
|
355 |
uint64_t helper_cmpbge (uint64_t op1, uint64_t op2)
|
|
344 | 356 |
{ |
345 | 357 |
uint8_t opa, opb, res; |
346 | 358 |
int i; |
347 | 359 |
|
348 | 360 |
res = 0; |
349 | 361 |
for (i = 0; i < 7; i++) { |
350 |
opa = T0 >> (i * 8);
|
|
351 |
opb = T1 >> (i * 8);
|
|
362 |
opa = op1 >> (i * 8);
|
|
363 |
opb = op2 >> (i * 8);
|
|
352 | 364 |
if (opa >= opb) |
353 | 365 |
res |= 1 << i; |
354 | 366 |
} |
355 |
T0 = res;
|
|
367 |
return res;
|
|
356 | 368 |
} |
357 | 369 |
|
358 | 370 |
void helper_cmov_fir (int freg) |
Also available in: Unified diff