Revision 9c29504e target-alpha/translate.c
b/target-alpha/translate.c | ||
---|---|---|
124 | 124 |
NAME ## _table[n](); \ |
125 | 125 |
} |
126 | 126 |
|
127 |
/* IR moves */ |
|
128 |
/* Special hacks for ir31 */ |
|
129 |
#define gen_op_cmov_ir31 gen_op_nop |
|
130 |
GEN32(gen_op_cmov_ir, gen_op_cmov_ir); |
|
131 |
|
|
132 | 127 |
/* FIR moves */ |
133 | 128 |
/* Special hacks for fir31 */ |
134 | 129 |
#define gen_op_load_FT0_fir31 gen_op_reset_FT0 |
... | ... | |
328 | 323 |
} |
329 | 324 |
|
330 | 325 |
static always_inline void gen_bcond (DisasContext *ctx, |
331 |
void (*gen_test_op)(void),
|
|
332 |
int ra, int32_t disp16) |
|
326 |
TCGCond cond,
|
|
327 |
int ra, int32_t disp16, int mask)
|
|
333 | 328 |
{ |
334 |
tcg_gen_movi_i64(cpu_T[1], ctx->pc + (int64_t)(disp16 << 2)); |
|
335 |
if (ra != 31) |
|
336 |
tcg_gen_mov_i64(cpu_T[0], cpu_ir[ra]); |
|
337 |
else |
|
338 |
tcg_gen_movi_i64(cpu_T[0], 0); |
|
339 |
(*gen_test_op)(); |
|
340 |
_gen_op_bcond(ctx); |
|
329 |
int l1, l2; |
|
330 |
|
|
331 |
l1 = gen_new_label(); |
|
332 |
l2 = gen_new_label(); |
|
333 |
if (likely(ra != 31)) { |
|
334 |
if (mask) { |
|
335 |
TCGv tmp = tcg_temp_new(TCG_TYPE_I64); |
|
336 |
tcg_gen_andi_i64(tmp, cpu_ir[ra], 1); |
|
337 |
tcg_gen_brcondi_i64(cond, tmp, 0, l1); |
|
338 |
tcg_temp_free(tmp); |
|
339 |
} else |
|
340 |
tcg_gen_brcondi_i64(cond, cpu_ir[ra], 0, l1); |
|
341 |
} else { |
|
342 |
/* Very uncommon case - Do not bother to optimize. */ |
|
343 |
TCGv tmp = tcg_const_i64(0); |
|
344 |
tcg_gen_brcondi_i64(cond, tmp, 0, l1); |
|
345 |
tcg_temp_free(tmp); |
|
346 |
} |
|
347 |
tcg_gen_movi_i64(cpu_pc, ctx->pc); |
|
348 |
tcg_gen_br(l2); |
|
349 |
gen_set_label(l1); |
|
350 |
tcg_gen_movi_i64(cpu_pc, ctx->pc + (int64_t)(disp16 << 2)); |
|
351 |
gen_set_label(l2); |
|
341 | 352 |
} |
342 | 353 |
|
343 | 354 |
static always_inline void gen_fbcond (DisasContext *ctx, |
... | ... | |
371 | 382 |
} |
372 | 383 |
|
373 | 384 |
static always_inline void gen_cmov (DisasContext *ctx, |
374 |
void (*gen_test_op)(void),
|
|
385 |
TCGCond inv_cond,
|
|
375 | 386 |
int ra, int rb, int rc, |
376 |
int islit, uint8_t lit)
|
|
387 |
int islit, int8_t lit, int mask)
|
|
377 | 388 |
{ |
378 |
if (ra != 31) |
|
379 |
tcg_gen_mov_i64(cpu_T[0], cpu_ir[ra]); |
|
380 |
else |
|
381 |
tcg_gen_movi_i64(cpu_T[0], 0); |
|
389 |
int l1; |
|
390 |
|
|
391 |
if (unlikely(rc == 31)) |
|
392 |
return; |
|
393 |
|
|
394 |
l1 = gen_new_label(); |
|
395 |
|
|
396 |
if (ra != 31) { |
|
397 |
if (mask) { |
|
398 |
TCGv tmp = tcg_temp_new(TCG_TYPE_I64); |
|
399 |
tcg_gen_andi_i64(tmp, cpu_ir[ra], 1); |
|
400 |
tcg_gen_brcondi_i64(inv_cond, tmp, 0, l1); |
|
401 |
tcg_temp_free(tmp); |
|
402 |
} else |
|
403 |
tcg_gen_brcondi_i64(inv_cond, cpu_ir[ra], 0, l1); |
|
404 |
} else { |
|
405 |
/* Very uncommon case - Do not bother to optimize. */ |
|
406 |
TCGv tmp = tcg_const_i64(0); |
|
407 |
tcg_gen_brcondi_i64(inv_cond, tmp, 0, l1); |
|
408 |
tcg_temp_free(tmp); |
|
409 |
} |
|
410 |
|
|
382 | 411 |
if (islit) |
383 |
tcg_gen_movi_i64(cpu_T[1], lit);
|
|
412 |
tcg_gen_movi_i64(cpu_ir[rc], lit);
|
|
384 | 413 |
else if (rb != 31) |
385 |
tcg_gen_mov_i64(cpu_T[1], cpu_ir[rb]);
|
|
414 |
tcg_gen_mov_i64(cpu_ir[rc], cpu_ir[rb]);
|
|
386 | 415 |
else |
387 |
tcg_gen_movi_i64(cpu_T[1], 0); |
|
388 |
(*gen_test_op)(); |
|
389 |
gen_op_cmov_ir(rc); |
|
416 |
tcg_gen_movi_i64(cpu_ir[rc], 0); |
|
417 |
gen_set_label(l1); |
|
390 | 418 |
} |
391 | 419 |
|
392 | 420 |
static always_inline void gen_farith2 (DisasContext *ctx, |
... | ... | |
933 | 961 |
break; |
934 | 962 |
case 0x14: |
935 | 963 |
/* CMOVLBS */ |
936 |
gen_cmov(ctx, &gen_op_cmplbs, ra, rb, rc, islit, lit);
|
|
964 |
gen_cmov(ctx, TCG_COND_EQ, ra, rb, rc, islit, lit, 1);
|
|
937 | 965 |
break; |
938 | 966 |
case 0x16: |
939 | 967 |
/* CMOVLBC */ |
940 |
gen_cmov(ctx, &gen_op_cmplbc, ra, rb, rc, islit, lit);
|
|
968 |
gen_cmov(ctx, TCG_COND_NE, ra, rb, rc, islit, lit, 1);
|
|
941 | 969 |
break; |
942 | 970 |
case 0x20: |
943 | 971 |
/* BIS */ |
... | ... | |
961 | 989 |
break; |
962 | 990 |
case 0x24: |
963 | 991 |
/* CMOVEQ */ |
964 |
gen_cmov(ctx, &gen_op_cmpeqz, ra, rb, rc, islit, lit);
|
|
992 |
gen_cmov(ctx, TCG_COND_NE, ra, rb, rc, islit, lit, 0);
|
|
965 | 993 |
break; |
966 | 994 |
case 0x26: |
967 | 995 |
/* CMOVNE */ |
968 |
gen_cmov(ctx, &gen_op_cmpnez, ra, rb, rc, islit, lit);
|
|
996 |
gen_cmov(ctx, TCG_COND_EQ, ra, rb, rc, islit, lit, 0);
|
|
969 | 997 |
break; |
970 | 998 |
case 0x28: |
971 | 999 |
/* ORNOT */ |
... | ... | |
1011 | 1039 |
break; |
1012 | 1040 |
case 0x44: |
1013 | 1041 |
/* CMOVLT */ |
1014 |
gen_cmov(ctx, &gen_op_cmpltz, ra, rb, rc, islit, lit);
|
|
1042 |
gen_cmov(ctx, TCG_COND_GE, ra, rb, rc, islit, lit, 0);
|
|
1015 | 1043 |
break; |
1016 | 1044 |
case 0x46: |
1017 | 1045 |
/* CMOVGE */ |
1018 |
gen_cmov(ctx, &gen_op_cmpgez, ra, rb, rc, islit, lit);
|
|
1046 |
gen_cmov(ctx, TCG_COND_LT, ra, rb, rc, islit, lit, 0);
|
|
1019 | 1047 |
break; |
1020 | 1048 |
case 0x48: |
1021 | 1049 |
/* EQV */ |
... | ... | |
1053 | 1081 |
break; |
1054 | 1082 |
case 0x64: |
1055 | 1083 |
/* CMOVLE */ |
1056 |
gen_cmov(ctx, &gen_op_cmplez, ra, rb, rc, islit, lit);
|
|
1084 |
gen_cmov(ctx, TCG_COND_GT, ra, rb, rc, islit, lit, 0);
|
|
1057 | 1085 |
break; |
1058 | 1086 |
case 0x66: |
1059 | 1087 |
/* CMOVGT */ |
1060 |
gen_cmov(ctx, &gen_op_cmpgtz, ra, rb, rc, islit, lit);
|
|
1088 |
gen_cmov(ctx, TCG_COND_LE, ra, rb, rc, islit, lit, 0);
|
|
1061 | 1089 |
break; |
1062 | 1090 |
case 0x6C: |
1063 | 1091 |
/* IMPLVER */ |
... | ... | |
2173 | 2201 |
break; |
2174 | 2202 |
case 0x38: |
2175 | 2203 |
/* BLBC */ |
2176 |
gen_bcond(ctx, &gen_op_cmplbc, ra, disp16);
|
|
2204 |
gen_bcond(ctx, TCG_COND_EQ, ra, disp16, 1);
|
|
2177 | 2205 |
ret = 1; |
2178 | 2206 |
break; |
2179 | 2207 |
case 0x39: |
2180 | 2208 |
/* BEQ */ |
2181 |
gen_bcond(ctx, &gen_op_cmpeqz, ra, disp16);
|
|
2209 |
gen_bcond(ctx, TCG_COND_EQ, ra, disp16, 0);
|
|
2182 | 2210 |
ret = 1; |
2183 | 2211 |
break; |
2184 | 2212 |
case 0x3A: |
2185 | 2213 |
/* BLT */ |
2186 |
gen_bcond(ctx, &gen_op_cmpltz, ra, disp16);
|
|
2214 |
gen_bcond(ctx, TCG_COND_LT, ra, disp16, 0);
|
|
2187 | 2215 |
ret = 1; |
2188 | 2216 |
break; |
2189 | 2217 |
case 0x3B: |
2190 | 2218 |
/* BLE */ |
2191 |
gen_bcond(ctx, &gen_op_cmplez, ra, disp16);
|
|
2219 |
gen_bcond(ctx, TCG_COND_LE, ra, disp16, 0);
|
|
2192 | 2220 |
ret = 1; |
2193 | 2221 |
break; |
2194 | 2222 |
case 0x3C: |
2195 | 2223 |
/* BLBS */ |
2196 |
gen_bcond(ctx, &gen_op_cmplbs, ra, disp16);
|
|
2224 |
gen_bcond(ctx, TCG_COND_NE, ra, disp16, 1);
|
|
2197 | 2225 |
ret = 1; |
2198 | 2226 |
break; |
2199 | 2227 |
case 0x3D: |
2200 | 2228 |
/* BNE */ |
2201 |
gen_bcond(ctx, &gen_op_cmpnez, ra, disp16);
|
|
2229 |
gen_bcond(ctx, TCG_COND_NE, ra, disp16, 0);
|
|
2202 | 2230 |
ret = 1; |
2203 | 2231 |
break; |
2204 | 2232 |
case 0x3E: |
2205 | 2233 |
/* BGE */ |
2206 |
gen_bcond(ctx, &gen_op_cmpgez, ra, disp16);
|
|
2234 |
gen_bcond(ctx, TCG_COND_GE, ra, disp16, 0);
|
|
2207 | 2235 |
ret = 1; |
2208 | 2236 |
break; |
2209 | 2237 |
case 0x3F: |
2210 | 2238 |
/* BGT */ |
2211 |
gen_bcond(ctx, &gen_op_cmpgtz, ra, disp16);
|
|
2239 |
gen_bcond(ctx, TCG_COND_GT, ra, disp16, 0);
|
|
2212 | 2240 |
ret = 1; |
2213 | 2241 |
break; |
2214 | 2242 |
invalid_opc: |
Also available in: Unified diff