backend/x64: Add constants

Used to redefine x86 assembly-constants without
including platform-dependent headers such as `immintrin.h`.

Currently includes vpcmp constants as well as ternary logic
utility-terms.

Removes `immintrin.h` requirement from emit_x64_vector_saturation
and updates our usage of `vpcmp` and `vpternlog` with the new constants
This commit is contained in:
Wunkolo 2021-05-24 10:46:06 -07:00 committed by merry
parent e8c266d0d3
commit fa8cc1ac36
4 changed files with 49 additions and 1 deletions

View file

@ -273,6 +273,7 @@ if (ARCHITECTURE STREQUAL "x86_64")
backend/x64/callback.h backend/x64/callback.h
backend/x64/constant_pool.cpp backend/x64/constant_pool.cpp
backend/x64/constant_pool.h backend/x64/constant_pool.h
backend/x64/constants.h
backend/x64/devirtualize.h backend/x64/devirtualize.h
backend/x64/emit_x64.cpp backend/x64/emit_x64.cpp
backend/x64/emit_x64.h backend/x64/emit_x64.h

View file

@ -0,0 +1,45 @@
/* This file is part of the dynarmic project.
* Copyright (c) 2016 MerryMage
* SPDX-License-Identifier: 0BSD
*/
#pragma once
#include "dynarmic/common/common_types.h"
namespace Dynarmic::Backend::X64 {
// Redefinition of _MM_CMPINT_* constants for use with the 'vpcmp' instruction
namespace CmpInt {
constexpr u8 Equal = 0x0;
constexpr u8 LessThan = 0x1;
constexpr u8 LessEqual = 0x2;
constexpr u8 False = 0x3;
constexpr u8 NotEqual = 0x4;
constexpr u8 NotLessThan = 0x5;
constexpr u8 GreaterEqual = 0x5;
constexpr u8 NotLessEqual = 0x6;
constexpr u8 GreaterThan = 0x6;
constexpr u8 True = 0x7;
} // namespace CmpInt
// Used to generate ternary logic truth-tables for vpternlog
// Use these to directly refer to terms and perform binary operations upon them
// and the resulting value will be the ternary lookup table
// ex:
// (Tern::a | ~Tern::b) & Tern::c
// = 0b10100010
// = 0xa2
// vpternlog a, b, c, 0xa2
//
// ~(Tern::a ^ Tern::b) & Tern::c
// = 0b10000010
// = 0x82
// vpternlog a, b, c, 0x82
namespace Tern {
constexpr u8 a = 0b11110000;
constexpr u8 b = 0b11001100;
constexpr u8 c = 0b10101010;
} // namespace Tern
} // namespace Dynarmic::Backend::X64

View file

@ -12,6 +12,7 @@
#include "dynarmic/backend/x64/abi.h" #include "dynarmic/backend/x64/abi.h"
#include "dynarmic/backend/x64/block_of_code.h" #include "dynarmic/backend/x64/block_of_code.h"
#include "dynarmic/backend/x64/constants.h"
#include "dynarmic/backend/x64/emit_x64.h" #include "dynarmic/backend/x64/emit_x64.h"
#include "dynarmic/common/assert.h" #include "dynarmic/common/assert.h"
#include "dynarmic/common/bit_util.h" #include "dynarmic/common/bit_util.h"
@ -4358,7 +4359,7 @@ void EmitX64::EmitVectorTableLookup128(EmitContext& ctx, IR::Inst* inst) {
// Handle vector-table 2,3 // Handle vector-table 2,3
// vpcmpuble // vpcmpuble
code.vpcmpub(upper_mask, indicies, code.MConst(xword, 0x3F3F3F3F3F3F3F3F, 0x3F3F3F3F3F3F3F3F), 2); code.vpcmpub(upper_mask, indicies, code.MConst(xword, 0x3F3F3F3F3F3F3F3F, 0x3F3F3F3F3F3F3F3F), CmpInt::LessEqual);
code.kandnw(write_mask, write_mask, upper_mask); code.kandnw(write_mask, write_mask, upper_mask);
const Xbyak::Xmm xmm_table2 = ctx.reg_alloc.UseScratchXmm(table[2]); const Xbyak::Xmm xmm_table2 = ctx.reg_alloc.UseScratchXmm(table[2]);

View file

@ -4,6 +4,7 @@
*/ */
#include "dynarmic/backend/x64/block_of_code.h" #include "dynarmic/backend/x64/block_of_code.h"
#include "dynarmic/backend/x64/constants.h"
#include "dynarmic/backend/x64/emit_x64.h" #include "dynarmic/backend/x64/emit_x64.h"
#include "dynarmic/common/common_types.h" #include "dynarmic/common/common_types.h"
#include "dynarmic/ir/microinstruction.h" #include "dynarmic/ir/microinstruction.h"