|
35 | 35 | #include "xenia/cpu/backend/x64/x64_emitter.h" |
36 | 36 | #include "xenia/cpu/backend/x64/x64_op.h" |
37 | 37 | #include "xenia/cpu/backend/x64/x64_tracers.h" |
| 38 | +#include "xenia/cpu/backend/x64/x64_util.h" |
38 | 39 | #include "xenia/cpu/hir/hir_builder.h" |
39 | 40 | #include "xenia/cpu/processor.h" |
40 | 41 |
|
@@ -745,21 +746,30 @@ struct SELECT_V128_V128 |
745 | 746 | : Sequence<SELECT_V128_V128, |
746 | 747 | I<OPCODE_SELECT, V128Op, V128Op, V128Op, V128Op>> { |
747 | 748 | static void Emit(X64Emitter& e, const EmitArgType& i) { |
748 | | - Xmm src1 = i.src1.is_constant ? e.xmm0 : i.src1; |
| 749 | + const Xmm src1 = i.src1.is_constant ? e.xmm0 : i.src1; |
749 | 750 | if (i.src1.is_constant) { |
750 | 751 | e.LoadConstantXmm(src1, i.src1.constant()); |
751 | 752 | } |
752 | 753 |
|
753 | | - Xmm src2 = i.src2.is_constant ? e.xmm1 : i.src2; |
| 754 | + const Xmm src2 = i.src2.is_constant ? e.xmm1 : i.src2; |
754 | 755 | if (i.src2.is_constant) { |
755 | 756 | e.LoadConstantXmm(src2, i.src2.constant()); |
756 | 757 | } |
757 | 758 |
|
758 | | - Xmm src3 = i.src3.is_constant ? e.xmm2 : i.src3; |
| 759 | + const Xmm src3 = i.src3.is_constant ? e.xmm2 : i.src3; |
759 | 760 | if (i.src3.is_constant) { |
760 | 761 | e.LoadConstantXmm(src3, i.src3.constant()); |
761 | 762 | } |
762 | 763 |
|
| 764 | + if (e.IsFeatureEnabled(kX64EmitAVX512Ortho)) { |
| 765 | + e.vmovdqa(e.xmm3, src1); |
| 766 | + e.vpternlogd(e.xmm3, src2, src3, |
| 767 | + (~TernaryOperand::a & TernaryOperand::b) | |
| 768 | + (TernaryOperand::c & TernaryOperand::a)); |
| 769 | + e.vmovdqa(i.dest, e.xmm3); |
| 770 | + return; |
| 771 | + } |
| 772 | + |
763 | 773 | // src1 ? src2 : src3; |
764 | 774 | e.vpandn(e.xmm3, src1, src2); |
765 | 775 | e.vpand(i.dest, src1, src3); |
|
0 commit comments