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:
parent
e8c266d0d3
commit
fa8cc1ac36
4 changed files with 49 additions and 1 deletions
|
@ -273,6 +273,7 @@ if (ARCHITECTURE STREQUAL "x86_64")
|
|||
backend/x64/callback.h
|
||||
backend/x64/constant_pool.cpp
|
||||
backend/x64/constant_pool.h
|
||||
backend/x64/constants.h
|
||||
backend/x64/devirtualize.h
|
||||
backend/x64/emit_x64.cpp
|
||||
backend/x64/emit_x64.h
|
||||
|
|
45
src/dynarmic/backend/x64/constants.h
Normal file
45
src/dynarmic/backend/x64/constants.h
Normal 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
|
|
@ -12,6 +12,7 @@
|
|||
|
||||
#include "dynarmic/backend/x64/abi.h"
|
||||
#include "dynarmic/backend/x64/block_of_code.h"
|
||||
#include "dynarmic/backend/x64/constants.h"
|
||||
#include "dynarmic/backend/x64/emit_x64.h"
|
||||
#include "dynarmic/common/assert.h"
|
||||
#include "dynarmic/common/bit_util.h"
|
||||
|
@ -4358,7 +4359,7 @@ void EmitX64::EmitVectorTableLookup128(EmitContext& ctx, IR::Inst* inst) {
|
|||
|
||||
// Handle vector-table 2,3
|
||||
// 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);
|
||||
|
||||
const Xbyak::Xmm xmm_table2 = ctx.reg_alloc.UseScratchXmm(table[2]);
|
||||
|
|
|
@ -4,6 +4,7 @@
|
|||
*/
|
||||
|
||||
#include "dynarmic/backend/x64/block_of_code.h"
|
||||
#include "dynarmic/backend/x64/constants.h"
|
||||
#include "dynarmic/backend/x64/emit_x64.h"
|
||||
#include "dynarmic/common/common_types.h"
|
||||
#include "dynarmic/ir/microinstruction.h"
|
||||
|
|
Loading…
Reference in a new issue