PPC: Fix vsl[b/h/w] and vsr[b/h/w] with variable shift amounts.
This commit is contained in:
parent
4260e3819b
commit
7a3af9b2c4
|
@ -5538,8 +5538,9 @@ struct VECTOR_SHL_V128
|
||||||
// See if the shift is equal first for a shortcut.
|
// See if the shift is equal first for a shortcut.
|
||||||
e.vpshuflw(e.xmm0, i.src2, 0b00000000);
|
e.vpshuflw(e.xmm0, i.src2, 0b00000000);
|
||||||
e.vpshufd(e.xmm0, e.xmm0, 0b00000000);
|
e.vpshufd(e.xmm0, e.xmm0, 0b00000000);
|
||||||
e.vptest(e.xmm0, i.src2);
|
e.vpxor(e.xmm1, e.xmm0, i.src2);
|
||||||
e.jnc(emu);
|
e.vptest(e.xmm1, e.xmm1);
|
||||||
|
e.jnz(emu);
|
||||||
|
|
||||||
// Equal. Shift using vpsllw.
|
// Equal. Shift using vpsllw.
|
||||||
e.mov(e.rax, 0xF);
|
e.mov(e.rax, 0xF);
|
||||||
|
@ -5615,8 +5616,9 @@ struct VECTOR_SHL_V128
|
||||||
// Only bother with this check if shift amt isn't constant.
|
// Only bother with this check if shift amt isn't constant.
|
||||||
if (!i.src2.is_constant) {
|
if (!i.src2.is_constant) {
|
||||||
e.vpshufd(e.xmm0, i.src2, 0b00000000);
|
e.vpshufd(e.xmm0, i.src2, 0b00000000);
|
||||||
e.vptest(e.xmm0, i.src2);
|
e.vpxor(e.xmm1, e.xmm0, i.src2);
|
||||||
e.jnc(emu);
|
e.vptest(e.xmm1, e.xmm1);
|
||||||
|
e.jnz(emu);
|
||||||
|
|
||||||
// Equal. Shift using vpsrad.
|
// Equal. Shift using vpsrad.
|
||||||
e.mov(e.rax, 0x1F);
|
e.mov(e.rax, 0x1F);
|
||||||
|
@ -5722,8 +5724,9 @@ struct VECTOR_SHR_V128
|
||||||
if (!i.src2.is_constant) {
|
if (!i.src2.is_constant) {
|
||||||
e.vpshuflw(e.xmm0, i.src2, 0b00000000);
|
e.vpshuflw(e.xmm0, i.src2, 0b00000000);
|
||||||
e.vpshufd(e.xmm0, e.xmm0, 0b00000000);
|
e.vpshufd(e.xmm0, e.xmm0, 0b00000000);
|
||||||
e.vptest(e.xmm0, i.src2);
|
e.vpxor(e.xmm1, e.xmm0, i.src2);
|
||||||
e.jnc(emu);
|
e.vptest(e.xmm1, e.xmm1);
|
||||||
|
e.jnz(emu);
|
||||||
|
|
||||||
// Equal. Shift using vpsrlw.
|
// Equal. Shift using vpsrlw.
|
||||||
e.mov(e.rax, 0xF);
|
e.mov(e.rax, 0xF);
|
||||||
|
@ -5799,8 +5802,9 @@ struct VECTOR_SHR_V128
|
||||||
// Only bother with this check if shift amt isn't constant.
|
// Only bother with this check if shift amt isn't constant.
|
||||||
if (!i.src2.is_constant) {
|
if (!i.src2.is_constant) {
|
||||||
e.vpshufd(e.xmm0, i.src2, 0b00000000);
|
e.vpshufd(e.xmm0, i.src2, 0b00000000);
|
||||||
e.vptest(e.xmm0, i.src2);
|
e.vpxor(e.xmm1, e.xmm0, i.src2);
|
||||||
e.jnc(emu);
|
e.vptest(e.xmm1, e.xmm1);
|
||||||
|
e.jnz(emu);
|
||||||
|
|
||||||
// Equal. Shift using vpsrld.
|
// Equal. Shift using vpsrld.
|
||||||
e.mov(e.rax, 0x1F);
|
e.mov(e.rax, 0x1F);
|
||||||
|
@ -5893,8 +5897,9 @@ struct VECTOR_SHA_V128
|
||||||
if (!i.src2.is_constant) {
|
if (!i.src2.is_constant) {
|
||||||
e.vpshuflw(e.xmm0, i.src2, 0b00000000);
|
e.vpshuflw(e.xmm0, i.src2, 0b00000000);
|
||||||
e.vpshufd(e.xmm0, e.xmm0, 0b00000000);
|
e.vpshufd(e.xmm0, e.xmm0, 0b00000000);
|
||||||
e.vptest(e.xmm0, i.src2);
|
e.vpxor(e.xmm1, e.xmm0, i.src2);
|
||||||
e.jnc(emu);
|
e.vptest(e.xmm1, e.xmm1);
|
||||||
|
e.jnz(emu);
|
||||||
|
|
||||||
// Equal. Shift using vpsraw.
|
// Equal. Shift using vpsraw.
|
||||||
e.mov(e.rax, 0xF);
|
e.mov(e.rax, 0xF);
|
||||||
|
@ -5965,8 +5970,9 @@ struct VECTOR_SHA_V128
|
||||||
// Only bother with this check if shift amt isn't constant.
|
// Only bother with this check if shift amt isn't constant.
|
||||||
if (!i.src2.is_constant) {
|
if (!i.src2.is_constant) {
|
||||||
e.vpshufd(e.xmm0, i.src2, 0b00000000);
|
e.vpshufd(e.xmm0, i.src2, 0b00000000);
|
||||||
e.vptest(e.xmm0, i.src2);
|
e.vpxor(e.xmm1, e.xmm0, i.src2);
|
||||||
e.jnc(emu);
|
e.vptest(e.xmm1, e.xmm1);
|
||||||
|
e.jnz(emu);
|
||||||
|
|
||||||
// Equal. Shift using vpsrad.
|
// Equal. Shift using vpsrad.
|
||||||
e.mov(e.rax, 0x1F);
|
e.mov(e.rax, 0x1F);
|
||||||
|
|
Loading…
Reference in New Issue