mirror of
https://github.com/RPCSX/rpcsx.git
synced 2026-04-05 06:26:49 +00:00
Rewrite cpu_translator::rol, add fshl and fshr
Use new funnel shift intrinsics
This commit is contained in:
parent
42448cf3e5
commit
ac473eb400
3 changed files with 153 additions and 29 deletions
|
|
@ -5141,23 +5141,23 @@ public:
|
|||
|
||||
void ROTQBI(spu_opcode_t op)
|
||||
{
|
||||
const auto a = get_vr<u64[2]>(op.ra);
|
||||
const auto b = eval((get_vr<u64[2]>(op.rb) >> 32) & 0x7);
|
||||
set_vr(op.rt, a << zshuffle<u64[2]>(b, 1, 1) | zshuffle<u64[2]>(a, 1, 0) >> 56 >> zshuffle<u64[2]>(8 - b, 1, 1));
|
||||
const auto a = get_vr(op.ra);
|
||||
const auto b = zshuffle<u32[4]>(get_vr(op.rb) & 0x7, 3, 3, 3, 3);
|
||||
set_vr(op.rt, fshl(a, zshuffle<u32[4]>(a, 3, 0, 1, 2), b));
|
||||
}
|
||||
|
||||
void ROTQMBI(spu_opcode_t op)
|
||||
{
|
||||
const auto a = get_vr<u64[2]>(op.ra);
|
||||
const auto b = eval(-(get_vr<u64[2]>(op.rb) >> 32) & 0x7);
|
||||
set_vr(op.rt, a >> zshuffle<u64[2]>(b, 1, 1) | zshuffle<u64[2]>(a, 1, 2) << 56 << zshuffle<u64[2]>(8 - b, 1, 1));
|
||||
const auto a = get_vr(op.ra);
|
||||
const auto b = zshuffle<u32[4]>(-get_vr(op.rb) & 0x7, 3, 3, 3, 3);
|
||||
set_vr(op.rt, fshr(zshuffle<u32[4]>(a, 1, 2, 3, 4), a, b));
|
||||
}
|
||||
|
||||
void SHLQBI(spu_opcode_t op)
|
||||
{
|
||||
const auto a = get_vr<u64[2]>(op.ra);
|
||||
const auto b = eval((get_vr<u64[2]>(op.rb) >> 32) & 0x7);
|
||||
set_vr(op.rt, a << zshuffle<u64[2]>(b, 1, 1) | zshuffle<u64[2]>(a, 2, 0) >> 56 >> zshuffle<u64[2]>(8 - b, 1, 1));
|
||||
const auto a = get_vr(op.ra);
|
||||
const auto b = zshuffle<u32[4]>(get_vr(op.rb) & 0x7, 3, 3, 3, 3);
|
||||
set_vr(op.rt, fshl(a, zshuffle<u32[4]>(a, 4, 0, 1, 2), b));
|
||||
}
|
||||
|
||||
void ROTQBY(spu_opcode_t op)
|
||||
|
|
@ -5233,23 +5233,23 @@ public:
|
|||
|
||||
void ROTQBII(spu_opcode_t op)
|
||||
{
|
||||
const auto a = get_vr<u64[2]>(op.ra);
|
||||
const auto b = eval(get_imm<u64[2]>(op.i7, false) & 0x7);
|
||||
set_vr(op.rt, a << b | zshuffle<u64[2]>(a, 1, 0) >> 56 >> (8 - b));
|
||||
const auto a = get_vr(op.ra);
|
||||
const auto b = eval(get_imm(op.i7, false) & 0x7);
|
||||
set_vr(op.rt, fshl(a, zshuffle<u32[4]>(a, 3, 0, 1, 2), b));
|
||||
}
|
||||
|
||||
void ROTQMBII(spu_opcode_t op)
|
||||
{
|
||||
const auto a = get_vr<u64[2]>(op.ra);
|
||||
const auto b = eval(-get_imm<u64[2]>(op.i7, false) & 0x7);
|
||||
set_vr(op.rt, a >> b | zshuffle<u64[2]>(a, 1, 2) << 56 << (8 - b));
|
||||
const auto a = get_vr(op.ra);
|
||||
const auto b = eval(-get_imm(op.i7, false) & 0x7);
|
||||
set_vr(op.rt, fshr(zshuffle<u32[4]>(a, 1, 2, 3, 4), a, b));
|
||||
}
|
||||
|
||||
void SHLQBII(spu_opcode_t op)
|
||||
{
|
||||
const auto a = get_vr<u64[2]>(op.ra);
|
||||
const auto b = eval(get_imm<u64[2]>(op.i7, false) & 0x7);
|
||||
set_vr(op.rt, a << b | zshuffle<u64[2]>(a, 2, 0) >> 56 >> (8 - b));
|
||||
const auto a = get_vr(op.ra);
|
||||
const auto b = eval(get_imm(op.i7, false) & 0x7);
|
||||
set_vr(op.rt, fshl(a, zshuffle<u32[4]>(a, 4, 0, 1, 2), b));
|
||||
}
|
||||
|
||||
void ROTQBYI(spu_opcode_t op)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue