Revision b3249f63 target-alpha/translate.c
b/target-alpha/translate.c | ||
---|---|---|
468 | 468 |
gen_store_fir(ctx, rc, 0); |
469 | 469 |
} |
470 | 470 |
|
471 |
/* EXTWH, EXTWH, EXTLH, EXTQH */ |
|
472 |
static always_inline void gen_ext_h(void (*tcg_gen_ext_i64)(TCGv t0, TCGv t1), |
|
473 |
int ra, int rb, int rc, |
|
474 |
int islit, int8_t lit) |
|
475 |
{ |
|
476 |
if (unlikely(rc == 31)) |
|
477 |
return; |
|
478 |
|
|
479 |
if (ra != 31) { |
|
480 |
if (islit) |
|
481 |
tcg_gen_shli_i64(cpu_ir[rc], cpu_ir[ra], 64 - ((lit & 7) * 8)); |
|
482 |
else if (rb != 31) { |
|
483 |
TCGv tmp1, tmp2; |
|
484 |
tmp1 = tcg_temp_new(TCG_TYPE_I64); |
|
485 |
tcg_gen_andi_i64(tmp1, cpu_ir[rb], 7); |
|
486 |
tcg_gen_shli_i64(tmp1, tmp1, 3); |
|
487 |
tmp2 = tcg_const_i64(64); |
|
488 |
tcg_gen_sub_i64(tmp1, tmp2, tmp1); |
|
489 |
tcg_temp_free(tmp2); |
|
490 |
if (tcg_gen_ext_i64) { |
|
491 |
tcg_gen_shl_i64(tmp1, cpu_ir[ra], tmp1); |
|
492 |
tcg_gen_ext_i64(cpu_ir[rc], tmp1); |
|
493 |
} else |
|
494 |
tcg_gen_shl_i64(cpu_ir[rc], cpu_ir[ra], tmp1); |
|
495 |
tcg_temp_free(tmp1); |
|
496 |
} else |
|
497 |
tcg_gen_mov_i64(cpu_ir[rc], cpu_ir[ra]); |
|
498 |
} else |
|
499 |
tcg_gen_movi_i64(cpu_ir[rc], 0); |
|
500 |
} |
|
501 |
|
|
502 |
/* EXTBL, EXTWL, EXTWL, EXTLL, EXTQL */ |
|
503 |
static always_inline void gen_ext_l(void (*tcg_gen_ext_i64)(TCGv t0, TCGv t1), |
|
504 |
int ra, int rb, int rc, |
|
505 |
int islit, int8_t lit) |
|
506 |
{ |
|
507 |
if (unlikely(rc == 31)) |
|
508 |
return; |
|
509 |
|
|
510 |
if (ra != 31) { |
|
511 |
if (islit) |
|
512 |
tcg_gen_shri_i64(cpu_ir[rc], cpu_ir[ra], (lit & 7) * 8); |
|
513 |
else if (rb != 31) { |
|
514 |
TCGv tmp = tcg_temp_new(TCG_TYPE_I64); |
|
515 |
tcg_gen_andi_i64(tmp, cpu_ir[rb], 7); |
|
516 |
tcg_gen_shli_i64(tmp, tmp, 3); |
|
517 |
if (tcg_gen_ext_i64) { |
|
518 |
tcg_gen_shr_i64(tmp, cpu_ir[ra], tmp); |
|
519 |
tcg_gen_ext_i64(cpu_ir[rc], tmp); |
|
520 |
} else |
|
521 |
tcg_gen_shr_i64(cpu_ir[rc], cpu_ir[ra], tmp); |
|
522 |
tcg_temp_free(tmp); |
|
523 |
} else |
|
524 |
tcg_gen_mov_i64(cpu_ir[rc], cpu_ir[ra]); |
|
525 |
} else |
|
526 |
tcg_gen_movi_i64(cpu_ir[rc], 0); |
|
527 |
} |
|
528 |
|
|
529 |
/* Code to call byte manipulation helpers, used by: |
|
530 |
INSWH, INSLH, INSQH, INSBL, INSWL, INSLL, INSQL, |
|
531 |
MSKWH, MSKLH, MSKQH, MSKBL, MSKWL, MSKLL, MSKQL, |
|
532 |
ZAP, ZAPNOT |
|
533 |
|
|
534 |
WARNING: it assumes that when ra31 is used, the result is 0. |
|
535 |
*/ |
|
536 |
static always_inline void gen_byte_manipulation(void *helper, |
|
537 |
int ra, int rb, int rc, |
|
538 |
int islit, uint8_t lit) |
|
539 |
{ |
|
540 |
if (unlikely(rc == 31)) |
|
541 |
return; |
|
542 |
|
|
543 |
if (ra != 31) { |
|
544 |
if (islit || rb == 31) { |
|
545 |
TCGv tmp = tcg_temp_new(TCG_TYPE_I64); |
|
546 |
if (islit) |
|
547 |
tcg_gen_movi_i64(tmp, lit); |
|
548 |
else |
|
549 |
tcg_gen_movi_i64(tmp, 0); |
|
550 |
tcg_gen_helper_1_2(helper, cpu_ir[rc], cpu_ir[ra], tmp); |
|
551 |
tcg_temp_free(tmp); |
|
552 |
} else |
|
553 |
tcg_gen_helper_1_2(helper, cpu_ir[rc], cpu_ir[ra], cpu_ir[rb]); |
|
554 |
} else |
|
555 |
tcg_gen_movi_i64(cpu_ir[rc], 0); |
|
556 |
} |
|
557 |
|
|
471 | 558 |
static always_inline int translate_one (DisasContext *ctx, uint32_t insn) |
472 | 559 |
{ |
473 | 560 |
uint32_t palcode; |
... | ... | |
1101 | 1188 |
switch (fn7) { |
1102 | 1189 |
case 0x02: |
1103 | 1190 |
/* MSKBL */ |
1104 |
gen_arith3(ctx, &gen_op_mskbl, ra, rb, rc, islit, lit);
|
|
1191 |
gen_byte_manipulation(helper_mskbl, ra, rb, rc, islit, lit);
|
|
1105 | 1192 |
break; |
1106 | 1193 |
case 0x06: |
1107 | 1194 |
/* EXTBL */ |
1108 |
gen_arith3(ctx, &gen_op_extbl, ra, rb, rc, islit, lit);
|
|
1195 |
gen_ext_l(&tcg_gen_ext8u_i64, ra, rb, rc, islit, lit);
|
|
1109 | 1196 |
break; |
1110 | 1197 |
case 0x0B: |
1111 | 1198 |
/* INSBL */ |
1112 |
gen_arith3(ctx, &gen_op_insbl, ra, rb, rc, islit, lit);
|
|
1199 |
gen_byte_manipulation(helper_insbl, ra, rb, rc, islit, lit);
|
|
1113 | 1200 |
break; |
1114 | 1201 |
case 0x12: |
1115 | 1202 |
/* MSKWL */ |
1116 |
gen_arith3(ctx, &gen_op_mskwl, ra, rb, rc, islit, lit);
|
|
1203 |
gen_byte_manipulation(helper_mskwl, ra, rb, rc, islit, lit);
|
|
1117 | 1204 |
break; |
1118 | 1205 |
case 0x16: |
1119 | 1206 |
/* EXTWL */ |
1120 |
gen_arith3(ctx, &gen_op_extwl, ra, rb, rc, islit, lit);
|
|
1207 |
gen_ext_l(&tcg_gen_ext16u_i64, ra, rb, rc, islit, lit);
|
|
1121 | 1208 |
break; |
1122 | 1209 |
case 0x1B: |
1123 | 1210 |
/* INSWL */ |
1124 |
gen_arith3(ctx, &gen_op_inswl, ra, rb, rc, islit, lit);
|
|
1211 |
gen_byte_manipulation(helper_inswl, ra, rb, rc, islit, lit);
|
|
1125 | 1212 |
break; |
1126 | 1213 |
case 0x22: |
1127 | 1214 |
/* MSKLL */ |
1128 |
gen_arith3(ctx, &gen_op_mskll, ra, rb, rc, islit, lit);
|
|
1215 |
gen_byte_manipulation(helper_mskll, ra, rb, rc, islit, lit);
|
|
1129 | 1216 |
break; |
1130 | 1217 |
case 0x26: |
1131 | 1218 |
/* EXTLL */ |
1132 |
gen_arith3(ctx, &gen_op_extll, ra, rb, rc, islit, lit);
|
|
1219 |
gen_ext_l(&tcg_gen_ext32u_i64, ra, rb, rc, islit, lit);
|
|
1133 | 1220 |
break; |
1134 | 1221 |
case 0x2B: |
1135 | 1222 |
/* INSLL */ |
1136 |
gen_arith3(ctx, &gen_op_insll, ra, rb, rc, islit, lit);
|
|
1223 |
gen_byte_manipulation(helper_insll, ra, rb, rc, islit, lit);
|
|
1137 | 1224 |
break; |
1138 | 1225 |
case 0x30: |
1139 | 1226 |
/* ZAP */ |
1140 |
gen_arith3(ctx, &gen_op_zap, ra, rb, rc, islit, lit);
|
|
1227 |
gen_byte_manipulation(helper_zap, ra, rb, rc, islit, lit);
|
|
1141 | 1228 |
break; |
1142 | 1229 |
case 0x31: |
1143 | 1230 |
/* ZAPNOT */ |
1144 |
gen_arith3(ctx, &gen_op_zapnot, ra, rb, rc, islit, lit);
|
|
1231 |
gen_byte_manipulation(helper_zapnot, ra, rb, rc, islit, lit);
|
|
1145 | 1232 |
break; |
1146 | 1233 |
case 0x32: |
1147 | 1234 |
/* MSKQL */ |
1148 |
gen_arith3(ctx, &gen_op_mskql, ra, rb, rc, islit, lit);
|
|
1235 |
gen_byte_manipulation(helper_mskql, ra, rb, rc, islit, lit);
|
|
1149 | 1236 |
break; |
1150 | 1237 |
case 0x34: |
1151 | 1238 |
/* SRL */ |
... | ... | |
1166 | 1253 |
break; |
1167 | 1254 |
case 0x36: |
1168 | 1255 |
/* EXTQL */ |
1169 |
gen_arith3(ctx, &gen_op_extql, ra, rb, rc, islit, lit);
|
|
1256 |
gen_ext_l(NULL, ra, rb, rc, islit, lit);
|
|
1170 | 1257 |
break; |
1171 | 1258 |
case 0x39: |
1172 | 1259 |
/* SLL */ |
... | ... | |
1187 | 1274 |
break; |
1188 | 1275 |
case 0x3B: |
1189 | 1276 |
/* INSQL */ |
1190 |
gen_arith3(ctx, &gen_op_insql, ra, rb, rc, islit, lit);
|
|
1277 |
gen_byte_manipulation(helper_insql, ra, rb, rc, islit, lit);
|
|
1191 | 1278 |
break; |
1192 | 1279 |
case 0x3C: |
1193 | 1280 |
/* SRA */ |
... | ... | |
1208 | 1295 |
break; |
1209 | 1296 |
case 0x52: |
1210 | 1297 |
/* MSKWH */ |
1211 |
gen_arith3(ctx, &gen_op_mskwh, ra, rb, rc, islit, lit);
|
|
1298 |
gen_byte_manipulation(helper_mskwh, ra, rb, rc, islit, lit);
|
|
1212 | 1299 |
break; |
1213 | 1300 |
case 0x57: |
1214 | 1301 |
/* INSWH */ |
1215 |
gen_arith3(ctx, &gen_op_inswh, ra, rb, rc, islit, lit);
|
|
1302 |
gen_byte_manipulation(helper_inswh, ra, rb, rc, islit, lit);
|
|
1216 | 1303 |
break; |
1217 | 1304 |
case 0x5A: |
1218 | 1305 |
/* EXTWH */ |
1219 |
gen_arith3(ctx, &gen_op_extwh, ra, rb, rc, islit, lit);
|
|
1306 |
gen_ext_h(&tcg_gen_ext16u_i64, ra, rb, rc, islit, lit);
|
|
1220 | 1307 |
break; |
1221 | 1308 |
case 0x62: |
1222 | 1309 |
/* MSKLH */ |
1223 |
gen_arith3(ctx, &gen_op_msklh, ra, rb, rc, islit, lit);
|
|
1310 |
gen_byte_manipulation(helper_msklh, ra, rb, rc, islit, lit);
|
|
1224 | 1311 |
break; |
1225 | 1312 |
case 0x67: |
1226 | 1313 |
/* INSLH */ |
1227 |
gen_arith3(ctx, &gen_op_inslh, ra, rb, rc, islit, lit);
|
|
1314 |
gen_byte_manipulation(helper_inslh, ra, rb, rc, islit, lit);
|
|
1228 | 1315 |
break; |
1229 | 1316 |
case 0x6A: |
1230 | 1317 |
/* EXTLH */ |
1231 |
gen_arith3(ctx, &gen_op_extlh, ra, rb, rc, islit, lit);
|
|
1318 |
gen_ext_h(&tcg_gen_ext16u_i64, ra, rb, rc, islit, lit);
|
|
1232 | 1319 |
break; |
1233 | 1320 |
case 0x72: |
1234 | 1321 |
/* MSKQH */ |
1235 |
gen_arith3(ctx, &gen_op_mskqh, ra, rb, rc, islit, lit);
|
|
1322 |
gen_byte_manipulation(helper_mskqh, ra, rb, rc, islit, lit);
|
|
1236 | 1323 |
break; |
1237 | 1324 |
case 0x77: |
1238 | 1325 |
/* INSQH */ |
1239 |
gen_arith3(ctx, &gen_op_insqh, ra, rb, rc, islit, lit);
|
|
1326 |
gen_byte_manipulation(helper_insqh, ra, rb, rc, islit, lit);
|
|
1240 | 1327 |
break; |
1241 | 1328 |
case 0x7A: |
1242 | 1329 |
/* EXTQH */ |
1243 |
gen_arith3(ctx, &gen_op_extqh, ra, rb, rc, islit, lit);
|
|
1330 |
gen_ext_h(NULL, ra, rb, rc, islit, lit);
|
|
1244 | 1331 |
break; |
1245 | 1332 |
default: |
1246 | 1333 |
goto invalid_opc; |
Also available in: Unified diff