wip! lprd implementation
This commit is contained in:
parent
cce6a52db9
commit
74294f281d
1 changed files with 63 additions and 1 deletions
|
|
@ -1607,7 +1607,69 @@ static bool trans_LPR(DisasContext *ctx, arg_LPR* a) {
|
|||
}
|
||||
|
||||
static bool trans_LPRD(DisasContext *ctx, arg_LPRD* a) {
|
||||
gen_helper_raise_unimplemented_instruction(tcg_env);
|
||||
TCGv dst;
|
||||
TCGv src;
|
||||
int32_t mask = 0;
|
||||
|
||||
switch (a->p1) { // src, regular register
|
||||
// TODO
|
||||
default:
|
||||
src = r[a->p1];
|
||||
break;
|
||||
}
|
||||
|
||||
switch (a->p2) { // dest, special register
|
||||
case CR16C_PRD_CFG:
|
||||
// CFG is only 16 bits so no regpair handling needed
|
||||
// TODO verify
|
||||
tcg_gen_extract_i32(cfg_sr, src, 9, 1);
|
||||
tcg_gen_extract_i32(cfg_ed, src, 8, 1);
|
||||
tcg_gen_extract_i32(cfg_lic, src, 5, 1);
|
||||
tcg_gen_extract_i32(cfg_ic, src, 4, 1);
|
||||
tcg_gen_extract_i32(cfg_ldc, src, 3, 1);
|
||||
tcg_gen_extract_i32(cfg_dc, src, 2, 1);
|
||||
|
||||
return true;
|
||||
break;
|
||||
case CR16C_PRD_PSR:
|
||||
// PSR is only 16 bits so no regpair handling needed
|
||||
// TODO verify
|
||||
tcg_gen_extract_i32(psr_i, src, 11, 1);
|
||||
tcg_gen_extract_i32(psr_p, src, 10, 1);
|
||||
tcg_gen_extract_i32(psr_e, src, 9, 1);
|
||||
tcg_gen_extract_i32(psr_n, src, 7, 1);
|
||||
tcg_gen_extract_i32(psr_z, src, 6, 1);
|
||||
tcg_gen_extract_i32(psr_f, src, 5, 1);
|
||||
tcg_gen_extract_i32(psr_u, src, 3, 1);
|
||||
tcg_gen_extract_i32(psr_l, src, 2, 1);
|
||||
tcg_gen_extract_i32(psr_t, src, 1, 1);
|
||||
tcg_gen_extract_i32(psr_c, src, 0, 1);
|
||||
|
||||
return true;
|
||||
break;
|
||||
case CR16C_PRD_INTBASE:
|
||||
dst = intbase;
|
||||
mask |= 0xfffffe;
|
||||
break;
|
||||
case CR16C_PRD_ISP:
|
||||
dst = isp;
|
||||
mask |= 0xfffffe;
|
||||
break;
|
||||
case CR16C_PRD_USP:
|
||||
dst = usp;
|
||||
mask |= 0xffffff;
|
||||
break;
|
||||
default:
|
||||
gen_helper_raise_unimplemented_instruction(tcg_env);
|
||||
return true;
|
||||
break;
|
||||
}
|
||||
|
||||
TCGv tmp = tcg_temp_new_i32();
|
||||
// TODO actually handle register pairs lol
|
||||
tcg_gen_andi_i32(tmp, r[a->p1], mask);
|
||||
|
||||
tcg_gen_mov_i32(dst, tmp);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue