mirror of
https://git.suyu.dev/suyu/dynarmic.git
synced 2026-03-07 13:32:56 +00:00
ir: Add opcode for performing polynomial multiplication
This commit is contained in:
@@ -5,6 +5,7 @@
|
||||
*/
|
||||
|
||||
#include <algorithm>
|
||||
#include <bitset>
|
||||
#include <functional>
|
||||
#include <type_traits>
|
||||
|
||||
@@ -1865,6 +1866,27 @@ void EmitX64::EmitVectorPairedAddUnsignedWiden32(EmitContext& ctx, IR::Inst* ins
|
||||
ctx.reg_alloc.DefineValue(inst, a);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
static T PolynomialMultiply(T lhs, T rhs) {
|
||||
constexpr size_t bit_size = Common::BitSize<T>();
|
||||
const std::bitset<bit_size> operand(lhs);
|
||||
|
||||
T res = 0;
|
||||
for (size_t i = 0; i < bit_size; i++) {
|
||||
if (operand[i]) {
|
||||
res ^= rhs << i;
|
||||
}
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
void EmitX64::EmitVectorPolynomialMultiply8(EmitContext& ctx, IR::Inst* inst) {
|
||||
EmitTwoArgumentFallback(code, ctx, inst, [](VectorArray<u8>& result, const VectorArray<u8>& a, const VectorArray<u8>& b) {
|
||||
std::transform(a.begin(), a.end(), b.begin(), result.begin(), PolynomialMultiply<u8>);
|
||||
});
|
||||
}
|
||||
|
||||
void EmitX64::EmitVectorPopulationCount(EmitContext& ctx, IR::Inst* inst) {
|
||||
if (code.DoesCpuSupport(Xbyak::util::Cpu::tAVX512_BITALG)) {
|
||||
auto args = ctx.reg_alloc.GetArgumentInfo(inst);
|
||||
|
||||
Reference in New Issue
Block a user