tcg_gen_movi_i64(cpu_T[0], 0);
if (islit)
tcg_gen_movi_i64(cpu_T[1], lit);
- else if (rb != 31)
- tcg_gen_mov_i64(cpu_T[1], cpu_ir[rb]);
else
- tcg_gen_movi_i64(cpu_T[1], 0);
+ tcg_gen_mov_i64(cpu_T[1], cpu_ir[rb]);
(*gen_arith_op)();
if (rc != 31)
tcg_gen_mov_i64(cpu_ir[rc], cpu_T[0]);
if (islit)
tcg_gen_movi_i64(cpu_ir[rc], lit);
- else if (rb != 31)
- tcg_gen_mov_i64(cpu_ir[rc], cpu_ir[rb]);
else
- tcg_gen_movi_i64(cpu_ir[rc], 0);
+ tcg_gen_mov_i64(cpu_ir[rc], cpu_ir[rb]);
gen_set_label(l1);
}
return;
if (ra != 31) {
- if (islit)
- tcg_gen_shli_i64(cpu_ir[rc], cpu_ir[ra], 64 - ((lit & 7) * 8));
- else if (rb != 31) {
+ if (islit) {
+ if (lit != 0)
+ tcg_gen_shli_i64(cpu_ir[rc], cpu_ir[ra], 64 - ((lit & 7) * 8));
+ else
+ tcg_gen_mov_i64(cpu_ir[rc], cpu_ir[ra]);
+ } else {
TCGv tmp1, tmp2;
tmp1 = tcg_temp_new(TCG_TYPE_I64);
tcg_gen_andi_i64(tmp1, cpu_ir[rb], 7);
tmp2 = tcg_const_i64(64);
tcg_gen_sub_i64(tmp1, tmp2, tmp1);
tcg_temp_free(tmp2);
- if (tcg_gen_ext_i64) {
- tcg_gen_shl_i64(tmp1, cpu_ir[ra], tmp1);
- tcg_gen_ext_i64(cpu_ir[rc], tmp1);
- } else
- tcg_gen_shl_i64(cpu_ir[rc], cpu_ir[ra], tmp1);
+ tcg_gen_shl_i64(cpu_ir[rc], cpu_ir[ra], tmp1);
tcg_temp_free(tmp1);
- } else
- tcg_gen_mov_i64(cpu_ir[rc], cpu_ir[ra]);
+ }
+ if (tcg_gen_ext_i64)
+ tcg_gen_ext_i64(cpu_ir[rc], cpu_ir[rc]);
} else
tcg_gen_movi_i64(cpu_ir[rc], 0);
}
return;
if (ra != 31) {
- if (islit)
- tcg_gen_shri_i64(cpu_ir[rc], cpu_ir[ra], (lit & 7) * 8);
- else if (rb != 31) {
+ if (islit) {
+ tcg_gen_shri_i64(cpu_ir[rc], cpu_ir[ra], (lit & 7) * 8);
+ } else {
TCGv tmp = tcg_temp_new(TCG_TYPE_I64);
tcg_gen_andi_i64(tmp, cpu_ir[rb], 7);
tcg_gen_shli_i64(tmp, tmp, 3);
- if (tcg_gen_ext_i64) {
- tcg_gen_shr_i64(tmp, cpu_ir[ra], tmp);
- tcg_gen_ext_i64(cpu_ir[rc], tmp);
- } else
- tcg_gen_shr_i64(cpu_ir[rc], cpu_ir[ra], tmp);
+ tcg_gen_shr_i64(cpu_ir[rc], cpu_ir[ra], tmp);
tcg_temp_free(tmp);
- } else
- tcg_gen_mov_i64(cpu_ir[rc], cpu_ir[ra]);
+ }
+ if (tcg_gen_ext_i64)
+ tcg_gen_ext_i64(cpu_ir[rc], cpu_ir[rc]);
} else
tcg_gen_movi_i64(cpu_ir[rc], 0);
}
return;
if (ra != 31) {
- if (islit || rb == 31) {
- TCGv tmp = tcg_temp_new(TCG_TYPE_I64);
- if (islit)
- tcg_gen_movi_i64(tmp, lit);
- else
- tcg_gen_movi_i64(tmp, 0);
+ if (islit) {
+ TCGv tmp = tcg_const_i64(lit);
tcg_gen_helper_1_2(helper, cpu_ir[rc], cpu_ir[ra], tmp);
tcg_temp_free(tmp);
} else
tmp = tcg_const_i64(0);
if (islit)
tcg_gen_brcondi_i64(cond, tmp, lit, l1);
- else if (rb != 31)
- tcg_gen_brcond_i64(cond, tmp, cpu_ir[rb], l1);
else
- tcg_gen_brcondi_i64(cond, tmp, 0, l1);
+ tcg_gen_brcond_i64(cond, tmp, cpu_ir[rb], l1);
tcg_gen_movi_i64(cpu_ir[rc], 0);
tcg_gen_br(l2);
rc = insn & 0x1F;
sbz = (insn >> 13) & 0x07;
islit = (insn >> 12) & 1;
- lit = (insn >> 13) & 0xFF;
+ if (rb == 31 && !islit) {
+ islit = 1;
+ lit = 0;
+ } else
+ lit = (insn >> 13) & 0xFF;
palcode = insn & 0x03FFFFFF;
disp21 = ((int32_t)((insn & 0x001FFFFF) << 11)) >> 11;
disp16 = (int16_t)(insn & 0x0000FFFF);
if (islit) {
tcg_gen_addi_i64(cpu_ir[rc], cpu_ir[ra], lit);
tcg_gen_ext32s_i64(cpu_ir[rc], cpu_ir[rc]);
- } else if (rb != 31) {
+ } else {
tcg_gen_add_i64(cpu_ir[rc], cpu_ir[ra], cpu_ir[rb]);
tcg_gen_ext32s_i64(cpu_ir[rc], cpu_ir[rc]);
- } else
- tcg_gen_ext32s_i64(cpu_ir[rc], cpu_ir[ra]);
+ }
} else {
if (islit)
- tcg_gen_movi_i64(cpu_ir[rc], (int32_t)lit);
- else if (rb != 31)
- tcg_gen_ext32s_i64(cpu_ir[rc], cpu_ir[rb]);
+ tcg_gen_movi_i64(cpu_ir[rc], lit);
else
- tcg_gen_movi_i64(cpu_ir[rc], 0);
+ tcg_gen_ext32s_i64(cpu_ir[rc], cpu_ir[rb]);
}
}
break;
/* S4ADDL */
if (likely(rc != 31)) {
if (ra != 31) {
- if (islit || rb != 31) {
- TCGv tmp = tcg_temp_new(TCG_TYPE_I64);
- tcg_gen_shli_i64(tmp, cpu_ir[ra], 2);
- if (islit)
- tcg_gen_addi_i64(tmp, tmp, lit);
- else
- tcg_gen_add_i64(tmp, tmp, cpu_ir[rb]);
- tcg_gen_ext32s_i64(cpu_ir[rc], tmp);
- tcg_temp_free(tmp);
- } else {
- tcg_gen_shli_i64(cpu_ir[rc], cpu_ir[ra], 2);
- tcg_gen_ext32s_i64(cpu_ir[rc], cpu_ir[rc]);
- }
+ TCGv tmp = tcg_temp_new(TCG_TYPE_I64);
+ tcg_gen_shli_i64(tmp, cpu_ir[ra], 2);
+ if (islit)
+ tcg_gen_addi_i64(tmp, tmp, lit);
+ else
+ tcg_gen_add_i64(tmp, tmp, cpu_ir[rb]);
+ tcg_gen_ext32s_i64(cpu_ir[rc], tmp);
+ tcg_temp_free(tmp);
} else {
if (islit)
tcg_gen_movi_i64(cpu_ir[rc], lit);
- else if (rb != 31)
- tcg_gen_ext32s_i64(cpu_ir[rc], cpu_ir[rb]);
else
- tcg_gen_movi_i64(cpu_ir[rc], 0);
+ tcg_gen_ext32s_i64(cpu_ir[rc], cpu_ir[rb]);
}
}
break;
/* SUBL */
if (likely(rc != 31)) {
if (ra != 31) {
- if (islit) {
+ if (islit)
tcg_gen_subi_i64(cpu_ir[rc], cpu_ir[ra], lit);
- tcg_gen_ext32s_i64(cpu_ir[rc], cpu_ir[rc]);
- } else if (rb != 31) {
+ else
tcg_gen_sub_i64(cpu_ir[rc], cpu_ir[ra], cpu_ir[rb]);
- tcg_gen_ext32s_i64(cpu_ir[rc], cpu_ir[rc]);
- } else
- tcg_gen_ext32s_i64(cpu_ir[rc], cpu_ir[ra]);
+ tcg_gen_ext32s_i64(cpu_ir[rc], cpu_ir[rc]);
} else {
if (islit)
tcg_gen_movi_i64(cpu_ir[rc], -lit);
- else if (rb != 31) {
+ else {
tcg_gen_neg_i64(cpu_ir[rc], cpu_ir[rb]);
tcg_gen_ext32s_i64(cpu_ir[rc], cpu_ir[rc]);
- } else
- tcg_gen_movi_i64(cpu_ir[rc], 0);
}
}
break;
/* S4SUBL */
if (likely(rc != 31)) {
if (ra != 31) {
- if (islit || rb != 31) {
- TCGv tmp = tcg_temp_new(TCG_TYPE_I64);
- tcg_gen_shli_i64(tmp, cpu_ir[ra], 2);
- if (islit)
- tcg_gen_subi_i64(tmp, tmp, lit);
- else
- tcg_gen_sub_i64(tmp, tmp, cpu_ir[rb]);
- tcg_gen_ext32s_i64(cpu_ir[rc], tmp);
- tcg_temp_free(tmp);
- } else {
- tcg_gen_shli_i64(cpu_ir[rc], cpu_ir[ra], 2);
- tcg_gen_ext32s_i64(cpu_ir[rc], cpu_ir[rc]);
- }
+ TCGv tmp = tcg_temp_new(TCG_TYPE_I64);
+ tcg_gen_shli_i64(tmp, cpu_ir[ra], 2);
+ if (islit)
+ tcg_gen_subi_i64(tmp, tmp, lit);
+ else
+ tcg_gen_sub_i64(tmp, tmp, cpu_ir[rb]);
+ tcg_gen_ext32s_i64(cpu_ir[rc], tmp);
+ tcg_temp_free(tmp);
} else {
if (islit)
tcg_gen_movi_i64(cpu_ir[rc], -lit);
- else if (rb != 31) {
+ else {
tcg_gen_neg_i64(cpu_ir[rc], cpu_ir[rb]);
tcg_gen_ext32s_i64(cpu_ir[rc], cpu_ir[rc]);
- } else
- tcg_gen_movi_i64(cpu_ir[rc], 0);
+ }
}
}
break;
/* S8ADDL */
if (likely(rc != 31)) {
if (ra != 31) {
- if (islit || rb != 31) {
- TCGv tmp = tcg_temp_new(TCG_TYPE_I64);
- tcg_gen_shli_i64(tmp, cpu_ir[ra], 3);
- if (islit)
- tcg_gen_addi_i64(tmp, tmp, lit);
- else
- tcg_gen_add_i64(tmp, tmp, cpu_ir[rb]);
- tcg_gen_ext32s_i64(cpu_ir[rc], tmp);
- tcg_temp_free(tmp);
- } else {
- tcg_gen_shli_i64(cpu_ir[rc], cpu_ir[ra], 3);
- tcg_gen_ext32s_i64(cpu_ir[rc], cpu_ir[rc]);
- }
+ TCGv tmp = tcg_temp_new(TCG_TYPE_I64);
+ tcg_gen_shli_i64(tmp, cpu_ir[ra], 3);
+ if (islit)
+ tcg_gen_addi_i64(tmp, tmp, lit);
+ else
+ tcg_gen_add_i64(tmp, tmp, cpu_ir[rb]);
+ tcg_gen_ext32s_i64(cpu_ir[rc], tmp);
+ tcg_temp_free(tmp);
} else {
if (islit)
tcg_gen_movi_i64(cpu_ir[rc], lit);
- else if (rb != 31)
- tcg_gen_ext32s_i64(cpu_ir[rc], cpu_ir[rb]);
else
- tcg_gen_movi_i64(cpu_ir[rc], 0);
+ tcg_gen_ext32s_i64(cpu_ir[rc], cpu_ir[rb]);
}
}
break;
/* S8SUBL */
if (likely(rc != 31)) {
if (ra != 31) {
- if (islit || rb != 31) {
- TCGv tmp = tcg_temp_new(TCG_TYPE_I64);
- tcg_gen_shli_i64(tmp, cpu_ir[ra], 3);
- if (islit)
- tcg_gen_subi_i64(tmp, tmp, lit);
- else
- tcg_gen_sub_i64(tmp, tmp, cpu_ir[rb]);
- tcg_gen_ext32s_i64(cpu_ir[rc], tmp);
- tcg_temp_free(tmp);
- } else {
- tcg_gen_shli_i64(cpu_ir[rc], cpu_ir[ra], 3);
- tcg_gen_ext32s_i64(cpu_ir[rc], cpu_ir[rc]);
- }
+ TCGv tmp = tcg_temp_new(TCG_TYPE_I64);
+ tcg_gen_shli_i64(tmp, cpu_ir[ra], 3);
+ if (islit)
+ tcg_gen_subi_i64(tmp, tmp, lit);
+ else
+ tcg_gen_sub_i64(tmp, tmp, cpu_ir[rb]);
+ tcg_gen_ext32s_i64(cpu_ir[rc], tmp);
+ tcg_temp_free(tmp);
} else {
if (islit)
tcg_gen_movi_i64(cpu_ir[rc], -lit);
- else if (rb != 31) {
+ else
tcg_gen_neg_i64(cpu_ir[rc], cpu_ir[rb]);
tcg_gen_ext32s_i64(cpu_ir[rc], cpu_ir[rc]);
- } else
- tcg_gen_movi_i64(cpu_ir[rc], 0);
+ }
}
}
break;
if (ra != 31) {
if (islit)
tcg_gen_addi_i64(cpu_ir[rc], cpu_ir[ra], lit);
- else if (rb != 31)
- tcg_gen_add_i64(cpu_ir[rc], cpu_ir[ra], cpu_ir[rb]);
else
- tcg_gen_mov_i64(cpu_ir[rc], cpu_ir[ra]);
+ tcg_gen_add_i64(cpu_ir[rc], cpu_ir[ra], cpu_ir[rb]);
} else {
if (islit)
tcg_gen_movi_i64(cpu_ir[rc], lit);
- else if (rb != 31)
- tcg_gen_mov_i64(cpu_ir[rc], cpu_ir[rb]);
else
- tcg_gen_movi_i64(cpu_ir[rc], 0);
+ tcg_gen_mov_i64(cpu_ir[rc], cpu_ir[rb]);
}
}
break;
/* S4ADDQ */
if (likely(rc != 31)) {
if (ra != 31) {
- if (islit || rb != 31) {
- TCGv tmp = tcg_temp_new(TCG_TYPE_I64);
- tcg_gen_shli_i64(tmp, cpu_ir[ra], 2);
- if (islit)
- tcg_gen_addi_i64(cpu_ir[rc], tmp, lit);
- else
- tcg_gen_add_i64(cpu_ir[rc], tmp, cpu_ir[rb]);
- tcg_temp_free(tmp);
- } else
- tcg_gen_shli_i64(cpu_ir[rc], cpu_ir[ra], 2);
+ TCGv tmp = tcg_temp_new(TCG_TYPE_I64);
+ tcg_gen_shli_i64(tmp, cpu_ir[ra], 2);
+ if (islit)
+ tcg_gen_addi_i64(cpu_ir[rc], tmp, lit);
+ else
+ tcg_gen_add_i64(cpu_ir[rc], tmp, cpu_ir[rb]);
+ tcg_temp_free(tmp);
} else {
if (islit)
tcg_gen_movi_i64(cpu_ir[rc], lit);
- else if (rb != 31)
- tcg_gen_mov_i64(cpu_ir[rc], cpu_ir[rb]);
else
- tcg_gen_movi_i64(cpu_ir[rc], 0);
+ tcg_gen_mov_i64(cpu_ir[rc], cpu_ir[rb]);
}
}
break;
if (ra != 31) {
if (islit)
tcg_gen_subi_i64(cpu_ir[rc], cpu_ir[ra], lit);
- else if (rb != 31)
- tcg_gen_sub_i64(cpu_ir[rc], cpu_ir[ra], cpu_ir[rb]);
else
- tcg_gen_mov_i64(cpu_ir[rc], cpu_ir[ra]);
+ tcg_gen_sub_i64(cpu_ir[rc], cpu_ir[ra], cpu_ir[rb]);
} else {
if (islit)
tcg_gen_movi_i64(cpu_ir[rc], -lit);
- else if (rb != 31)
- tcg_gen_neg_i64(cpu_ir[rc], cpu_ir[rb]);
else
- tcg_gen_movi_i64(cpu_ir[rc], 0);
+ tcg_gen_neg_i64(cpu_ir[rc], cpu_ir[rb]);
}
}
break;
/* S4SUBQ */
if (likely(rc != 31)) {
if (ra != 31) {
- if (islit || rb != 31) {
- TCGv tmp = tcg_temp_new(TCG_TYPE_I64);
- tcg_gen_shli_i64(tmp, cpu_ir[ra], 2);
- if (islit)
- tcg_gen_subi_i64(cpu_ir[rc], tmp, lit);
- else
- tcg_gen_sub_i64(cpu_ir[rc], tmp, cpu_ir[rb]);
- tcg_temp_free(tmp);
- } else
- tcg_gen_shli_i64(cpu_ir[rc], cpu_ir[ra], 2);
+ TCGv tmp = tcg_temp_new(TCG_TYPE_I64);
+ tcg_gen_shli_i64(tmp, cpu_ir[ra], 2);
+ if (islit)
+ tcg_gen_subi_i64(cpu_ir[rc], tmp, lit);
+ else
+ tcg_gen_sub_i64(cpu_ir[rc], tmp, cpu_ir[rb]);
+ tcg_temp_free(tmp);
} else {
if (islit)
tcg_gen_movi_i64(cpu_ir[rc], -lit);
- else if (rb != 31)
- tcg_gen_neg_i64(cpu_ir[rc], cpu_ir[rb]);
else
- tcg_gen_movi_i64(cpu_ir[rc], 0);
+ tcg_gen_neg_i64(cpu_ir[rc], cpu_ir[rb]);
}
}
break;
/* S8ADDQ */
if (likely(rc != 31)) {
if (ra != 31) {
- if (islit || rb != 31) {
- TCGv tmp = tcg_temp_new(TCG_TYPE_I64);
- tcg_gen_shli_i64(tmp, cpu_ir[ra], 3);
- if (islit)
- tcg_gen_addi_i64(cpu_ir[rc], tmp, lit);
- else
- tcg_gen_add_i64(cpu_ir[rc], tmp, cpu_ir[rb]);
- tcg_temp_free(tmp);
- } else
- tcg_gen_shli_i64(cpu_ir[rc], cpu_ir[ra], 3);
+ TCGv tmp = tcg_temp_new(TCG_TYPE_I64);
+ tcg_gen_shli_i64(tmp, cpu_ir[ra], 3);
+ if (islit)
+ tcg_gen_addi_i64(cpu_ir[rc], tmp, lit);
+ else
+ tcg_gen_add_i64(cpu_ir[rc], tmp, cpu_ir[rb]);
+ tcg_temp_free(tmp);
} else {
if (islit)
tcg_gen_movi_i64(cpu_ir[rc], lit);
- else if (rb != 31)
- tcg_gen_mov_i64(cpu_ir[rc], cpu_ir[rb]);
else
- tcg_gen_movi_i64(cpu_ir[rc], 0);
+ tcg_gen_mov_i64(cpu_ir[rc], cpu_ir[rb]);
}
}
break;
/* S8SUBQ */
if (likely(rc != 31)) {
if (ra != 31) {
- if (islit || rb != 31) {
- TCGv tmp = tcg_temp_new(TCG_TYPE_I64);
- tcg_gen_shli_i64(tmp, cpu_ir[ra], 3);
- if (islit)
- tcg_gen_subi_i64(cpu_ir[rc], tmp, lit);
- else
- tcg_gen_sub_i64(cpu_ir[rc], tmp, cpu_ir[rb]);
- tcg_temp_free(tmp);
- } else
- tcg_gen_shli_i64(cpu_ir[rc], cpu_ir[ra], 3);
+ TCGv tmp = tcg_temp_new(TCG_TYPE_I64);
+ tcg_gen_shli_i64(tmp, cpu_ir[ra], 3);
+ if (islit)
+ tcg_gen_subi_i64(cpu_ir[rc], tmp, lit);
+ else
+ tcg_gen_sub_i64(cpu_ir[rc], tmp, cpu_ir[rb]);
+ tcg_temp_free(tmp);
} else {
if (islit)
tcg_gen_movi_i64(cpu_ir[rc], -lit);
- else if (rb != 31)
- tcg_gen_neg_i64(cpu_ir[rc], cpu_ir[rb]);
else
- tcg_gen_movi_i64(cpu_ir[rc], 0);
+ tcg_gen_neg_i64(cpu_ir[rc], cpu_ir[rb]);
}
}
break;
case 0x00:
/* AND */
if (likely(rc != 31)) {
- if (ra == 31 || (rb == 31 && !islit))
+ if (ra == 31)
tcg_gen_movi_i64(cpu_ir[rc], 0);
else if (islit)
tcg_gen_andi_i64(cpu_ir[rc], cpu_ir[ra], lit);
if (ra != 31) {
if (islit)
tcg_gen_andi_i64(cpu_ir[rc], cpu_ir[ra], ~lit);
- else if (rb != 31) {
+ else {
TCGv tmp = tcg_temp_new(TCG_TYPE_I64);
tcg_gen_not_i64(tmp, cpu_ir[rb]);
tcg_gen_and_i64(cpu_ir[rc], cpu_ir[ra], tmp);
tcg_temp_free(tmp);
- } else
- tcg_gen_mov_i64(cpu_ir[rc], cpu_ir[ra]);
+ }
} else
tcg_gen_movi_i64(cpu_ir[rc], 0);
}
if (ra != 31) {
if (islit)
tcg_gen_ori_i64(cpu_ir[rc], cpu_ir[ra], lit);
- else if (rb != 31)
+ else
tcg_gen_or_i64(cpu_ir[rc], cpu_ir[ra], cpu_ir[rb]);
- else
- tcg_gen_mov_i64(cpu_ir[rc], cpu_ir[ra]);
} else {
if (islit)
tcg_gen_movi_i64(cpu_ir[rc], lit);
- else if (rb != 31)
- tcg_gen_mov_i64(cpu_ir[rc], cpu_ir[rb]);
else
- tcg_gen_movi_i64(cpu_ir[rc], 0);
+ tcg_gen_mov_i64(cpu_ir[rc], cpu_ir[rb]);
}
}
break;
case 0x28:
/* ORNOT */
if (likely(rc != 31)) {
- if (rb == 31 && !islit)
- tcg_gen_movi_i64(cpu_ir[rc], ~0);
- else if (ra != 31) {
+ if (ra != 31) {
if (islit)
tcg_gen_ori_i64(cpu_ir[rc], cpu_ir[ra], ~lit);
else {
if (ra != 31) {
if (islit)
tcg_gen_xori_i64(cpu_ir[rc], cpu_ir[ra], lit);
- else if (rb != 31)
- tcg_gen_xor_i64(cpu_ir[rc], cpu_ir[ra], cpu_ir[rb]);
else
- tcg_gen_mov_i64(cpu_ir[rc], cpu_ir[ra]);
+ tcg_gen_xor_i64(cpu_ir[rc], cpu_ir[ra], cpu_ir[rb]);
} else {
if (islit)
tcg_gen_movi_i64(cpu_ir[rc], lit);
- else if (rb != 31)
- tcg_gen_mov_i64(cpu_ir[rc], cpu_ir[rb]);
else
- tcg_gen_movi_i64(cpu_ir[rc], 0);
+ tcg_gen_mov_i64(cpu_ir[rc], cpu_ir[rb]);
}
}
break;
if (ra != 31) {
if (islit)
tcg_gen_xori_i64(cpu_ir[rc], cpu_ir[ra], ~lit);
- else if (rb != 31) {
+ else {
TCGv tmp = tcg_temp_new(TCG_TYPE_I64);
tcg_gen_not_i64(tmp, cpu_ir[rb]);
tcg_gen_xor_i64(cpu_ir[rc], cpu_ir[ra], tmp);
tcg_temp_free(tmp);
- } else
- tcg_gen_mov_i64(cpu_ir[rc], cpu_ir[ra]);
+ }
} else {
if (islit)
tcg_gen_movi_i64(cpu_ir[rc], ~lit);
- else if (rb != 31)
- tcg_gen_not_i64(cpu_ir[rc], cpu_ir[rb]);
else
- tcg_gen_movi_i64(cpu_ir[rc], ~0);
+ tcg_gen_not_i64(cpu_ir[rc], cpu_ir[rb]);
}
}
break;
if (likely(rc != 31)) {
if (islit)
tcg_gen_movi_i64(cpu_ir[rc], helper_amask(lit));
- else if (rb != 31)
- tcg_gen_helper_1_1(helper_amask, cpu_ir[rc], cpu_ir[rb]);
else
- tcg_gen_movi_i64(cpu_ir[rc], 0);
+ tcg_gen_helper_1_1(helper_amask, cpu_ir[rc], cpu_ir[rb]);
}
break;
case 0x64:
if (ra != 31) {
if (islit)
tcg_gen_shri_i64(cpu_ir[rc], cpu_ir[ra], lit & 0x3f);
- else if (rb != 31) {
+ else {
TCGv shift = tcg_temp_new(TCG_TYPE_I64);
tcg_gen_andi_i64(shift, cpu_ir[rb], 0x3f);
tcg_gen_shr_i64(cpu_ir[rc], cpu_ir[ra], shift);
tcg_temp_free(shift);
- } else
- tcg_gen_mov_i64(cpu_ir[rc], cpu_ir[ra]);
+ }
} else
tcg_gen_movi_i64(cpu_ir[rc], 0);
}
if (ra != 31) {
if (islit)
tcg_gen_shli_i64(cpu_ir[rc], cpu_ir[ra], lit & 0x3f);
- else if (rb != 31) {
+ else {
TCGv shift = tcg_temp_new(TCG_TYPE_I64);
tcg_gen_andi_i64(shift, cpu_ir[rb], 0x3f);
tcg_gen_shl_i64(cpu_ir[rc], cpu_ir[ra], shift);
tcg_temp_free(shift);
- } else
- tcg_gen_mov_i64(cpu_ir[rc], cpu_ir[ra]);
+ }
} else
tcg_gen_movi_i64(cpu_ir[rc], 0);
}
if (ra != 31) {
if (islit)
tcg_gen_sari_i64(cpu_ir[rc], cpu_ir[ra], lit & 0x3f);
- else if (rb != 31) {
+ else {
TCGv shift = tcg_temp_new(TCG_TYPE_I64);
tcg_gen_andi_i64(shift, cpu_ir[rb], 0x3f);
tcg_gen_sar_i64(cpu_ir[rc], cpu_ir[ra], shift);
tcg_temp_free(shift);
- } else
- tcg_gen_mov_i64(cpu_ir[rc], cpu_ir[ra]);
+ }
} else
tcg_gen_movi_i64(cpu_ir[rc], 0);
}
case 0x00:
/* MULL */
if (likely(rc != 31)) {
- if (ra == 31 || (rb == 31 && !islit))
+ if (ra == 31)
tcg_gen_movi_i64(cpu_ir[rc], 0);
else {
if (islit)
case 0x20:
/* MULQ */
if (likely(rc != 31)) {
- if (ra == 31 || (rb == 31 && !islit))
+ if (ra == 31)
tcg_gen_movi_i64(cpu_ir[rc], 0);
else if (islit)
tcg_gen_muli_i64(cpu_ir[rc], cpu_ir[ra], lit);
if (likely(rc != 31)) {
if (islit)
tcg_gen_movi_i64(cpu_ir[rc], (int64_t)((int8_t)lit));
- else if (rb != 31)
- tcg_gen_ext8s_i64(cpu_ir[rc], cpu_ir[rb]);
else
- tcg_gen_movi_i64(cpu_ir[rc], 0);
+ tcg_gen_ext8s_i64(cpu_ir[rc], cpu_ir[rb]);
}
break;
case 0x01:
if (likely(rc != 31)) {
if (islit)
tcg_gen_movi_i64(cpu_ir[rc], (int64_t)((int16_t)lit));
- else if (rb != 31)
- tcg_gen_ext16s_i64(cpu_ir[rc], cpu_ir[rb]);
else
- tcg_gen_movi_i64(cpu_ir[rc], 0);
+ tcg_gen_ext16s_i64(cpu_ir[rc], cpu_ir[rb]);
}
break;
case 0x30:
if (likely(rc != 31)) {
if (islit)
tcg_gen_movi_i64(cpu_ir[rc], ctpop64(lit));
- else if (rb != 31)
- tcg_gen_helper_1_1(helper_ctpop, cpu_ir[rc], cpu_ir[rb]);
else
- tcg_gen_movi_i64(cpu_ir[rc], 0);
+ tcg_gen_helper_1_1(helper_ctpop, cpu_ir[rc], cpu_ir[rb]);
}
break;
case 0x31:
if (likely(rc != 31)) {
if (islit)
tcg_gen_movi_i64(cpu_ir[rc], clz64(lit));
- else if (rb != 31)
- tcg_gen_helper_1_1(helper_ctlz, cpu_ir[rc], cpu_ir[rb]);
else
- tcg_gen_movi_i64(cpu_ir[rc], 0);
+ tcg_gen_helper_1_1(helper_ctlz, cpu_ir[rc], cpu_ir[rb]);
}
break;
case 0x33:
if (likely(rc != 31)) {
if (islit)
tcg_gen_movi_i64(cpu_ir[rc], ctz64(lit));
- else if (rb != 31)
- tcg_gen_helper_1_1(helper_cttz, cpu_ir[rc], cpu_ir[rb]);
else
- tcg_gen_movi_i64(cpu_ir[rc], 0);
+ tcg_gen_helper_1_1(helper_cttz, cpu_ir[rc], cpu_ir[rb]);
}
break;
case 0x34: