emit_x64_vector_floating_point: Specify NanHandler::function_type explicitly
MSVC doesn't like dealing with auto return types
This commit is contained in:
parent
2ef59b4f03
commit
64c2f698a2
1 changed files with 13 additions and 13 deletions
|
@ -43,12 +43,19 @@ static T ChooseOnFsize([[maybe_unused]] T f32, [[maybe_unused]] T f64) {
|
||||||
|
|
||||||
template<size_t fsize, template<typename> class Indexer, size_t narg>
|
template<size_t fsize, template<typename> class Indexer, size_t narg>
|
||||||
struct NaNHandler {
|
struct NaNHandler {
|
||||||
|
public:
|
||||||
|
using FPT = mp::unsigned_integer_of_size<fsize>;
|
||||||
|
|
||||||
|
using function_type = void(*)(std::array<VectorArray<FPT>, narg>&);
|
||||||
|
|
||||||
|
static function_type GetDefault() {
|
||||||
|
return GetDefaultImpl(std::make_index_sequence<narg - 1>{});
|
||||||
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
template<size_t... argi>
|
template<size_t... argi>
|
||||||
static auto GetDefaultImpl(std::index_sequence<argi...>) {
|
static function_type GetDefaultImpl(std::index_sequence<argi...>) {
|
||||||
using FPT = mp::unsigned_integer_of_size<fsize>;
|
const auto result = [](std::array<VectorArray<FPT>, narg>& values) {
|
||||||
|
|
||||||
auto result = [](std::array<VectorArray<FPT>, sizeof...(argi) + 1>& values) {
|
|
||||||
VectorArray<FPT>& result = values[0];
|
VectorArray<FPT>& result = values[0];
|
||||||
for (size_t elementi = 0; elementi < result.size(); ++elementi) {
|
for (size_t elementi = 0; elementi < result.size(); ++elementi) {
|
||||||
const auto current_values = Indexer<FPT>{}(elementi, values[argi + 1]...);
|
const auto current_values = Indexer<FPT>{}(elementi, values[argi + 1]...);
|
||||||
|
@ -60,15 +67,8 @@ private:
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
return static_cast<mp::equivalent_function_type_t<decltype(result)>*>(result);
|
return static_cast<function_type>(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
public:
|
|
||||||
static auto GetDefault() {
|
|
||||||
return GetDefaultImpl(std::make_index_sequence<narg - 1>{});
|
|
||||||
}
|
|
||||||
|
|
||||||
using function_type = mp::return_type_t<decltype(GetDefault)>;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
template<size_t fsize, size_t nargs, typename NaNHandler>
|
template<size_t fsize, size_t nargs, typename NaNHandler>
|
||||||
|
@ -515,7 +515,7 @@ void EmitFPVectorMulAdd(BlockOfCode& code, EmitContext& ctx, IR::Inst* inst) {
|
||||||
using FPT = mp::unsigned_integer_of_size<fsize>;
|
using FPT = mp::unsigned_integer_of_size<fsize>;
|
||||||
|
|
||||||
if (code.DoesCpuSupport(Xbyak::util::Cpu::tFMA)) {
|
if (code.DoesCpuSupport(Xbyak::util::Cpu::tFMA)) {
|
||||||
auto x64_instruction = fsize == 32 ? &Xbyak::CodeGenerator::vfmadd231ps : &Xbyak::CodeGenerator::vfmadd231pd;
|
const auto x64_instruction = fsize == 32 ? &Xbyak::CodeGenerator::vfmadd231ps : &Xbyak::CodeGenerator::vfmadd231pd;
|
||||||
EmitFourOpVectorOperation<fsize, DefaultIndexer>(code, ctx, inst, x64_instruction,
|
EmitFourOpVectorOperation<fsize, DefaultIndexer>(code, ctx, inst, x64_instruction,
|
||||||
static_cast<void(*)(std::array<VectorArray<FPT>, 4>& values)>(
|
static_cast<void(*)(std::array<VectorArray<FPT>, 4>& values)>(
|
||||||
[](std::array<VectorArray<FPT>, 4>& values) {
|
[](std::array<VectorArray<FPT>, 4>& values) {
|
||||||
|
|
Loading…
Reference in a new issue