Skip to content

Commit

Permalink
Signature register load dedicated functions
Browse files Browse the repository at this point in the history
  • Loading branch information
ZeroMemes committed Feb 8, 2023
1 parent db0d28e commit c847736
Show file tree
Hide file tree
Showing 3 changed files with 36 additions and 21 deletions.
19 changes: 12 additions & 7 deletions src/arch/x86/AVX2.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,11 @@
#include <libhat/Scanner.hpp>

#include <immintrin.h>
#include <tuple>

namespace hat::detail {

template<>
scan_result find_pattern<scan_mode::AVX2>(const std::byte* begin, const std::byte* end, signature_view signature) {
// 256 bit vector containing first signature byte repeated
const auto firstByte = _mm256_set1_epi8(static_cast<int8_t>(*signature[0]));

inline auto load_signature_256(signature_view signature) {
std::byte byteBuffer[32]{}; // The remaining signature bytes
std::byte maskBuffer[32]{}; // A bitmask for the signature bytes we care about
for (size_t i = 1; i < signature.size(); i++) {
Expand All @@ -22,9 +19,17 @@ namespace hat::detail {
maskBuffer[i - 1] = std::byte{0xFFu};
}
}
return std::make_tuple(
_mm256_loadu_si256(reinterpret_cast<__m256i*>(&byteBuffer)),
_mm256_loadu_si256(reinterpret_cast<__m256i*>(&maskBuffer))
);
}

const auto signatureBytes = _mm256_loadu_si256(reinterpret_cast<__m256i*>(&byteBuffer));
const auto signatureMask = _mm256_loadu_si256(reinterpret_cast<__m256i*>(&maskBuffer));
template<>
scan_result find_pattern<scan_mode::AVX2>(const std::byte* begin, const std::byte* end, signature_view signature) {
// 256 bit vector containing first signature byte repeated
const auto firstByte = _mm256_set1_epi8(static_cast<int8_t>(*signature[0]));
const auto [signatureBytes, signatureMask] = load_signature_256(signature);

auto vec = reinterpret_cast<const __m256i*>(begin);
const auto n = static_cast<size_t>(end - signature.size() - begin) / sizeof(__m256i);
Expand Down
19 changes: 12 additions & 7 deletions src/arch/x86/AVX512.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,11 @@
#include <libhat/Scanner.hpp>

#include <immintrin.h>
#include <tuple>

namespace hat::detail {

template<>
scan_result find_pattern<scan_mode::AVX512>(const std::byte* begin, const std::byte* end, signature_view signature) {
// 512 bit vector containing first signature byte repeated
const auto firstByte = _mm512_set1_epi8(static_cast<int8_t>(*signature[0]));

inline auto load_signature_512(signature_view signature) {
std::byte byteBuffer[64]{}; // The remaining signature bytes
uint64_t maskBuffer{}; // A bitmask for the signature bytes we care about
for (size_t i = 1; i < signature.size(); i++) {
Expand All @@ -22,9 +19,17 @@ namespace hat::detail {
maskBuffer |= (1ull << (i - 1));
}
}
return std::make_tuple(
_mm512_loadu_si512(&byteBuffer),
_cvtu64_mask64(maskBuffer)
);
}

const auto signatureBytes = _mm512_loadu_si512(&byteBuffer);
const auto signatureMask = _cvtu64_mask64(maskBuffer);
template<>
scan_result find_pattern<scan_mode::AVX512>(const std::byte* begin, const std::byte* end, signature_view signature) {
// 512 bit vector containing first signature byte repeated
const auto firstByte = _mm512_set1_epi8(static_cast<int8_t>(*signature[0]));
const auto [signatureBytes, signatureMask] = load_signature_512(signature);

auto vec = reinterpret_cast<const __m512i*>(begin);
const auto n = static_cast<size_t>(end - signature.size() - begin) / sizeof(__m512i);
Expand Down
19 changes: 12 additions & 7 deletions src/arch/x86/SSE.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,11 @@
#include <libhat/Scanner.hpp>

#include <immintrin.h>
#include <tuple>

namespace hat::detail {

template<>
scan_result find_pattern<scan_mode::SSE>(const std::byte* begin, const std::byte* end, signature_view signature) {
// 256 bit vector containing first signature byte repeated
const auto firstByte = _mm_set1_epi8(static_cast<int8_t>(*signature[0]));

inline auto load_signature_128(signature_view signature) {
std::byte byteBuffer[16]{}; // The remaining signature bytes
std::byte maskBuffer[16]{}; // A bitmask for the signature bytes we care about
for (size_t i = 1; i < signature.size(); i++) {
Expand All @@ -22,9 +19,17 @@ namespace hat::detail {
maskBuffer[i - 1] = std::byte{0xFFu};
}
}
return std::make_tuple(
_mm_loadu_si128(reinterpret_cast<__m128i*>(&byteBuffer)),
_mm_loadu_si128(reinterpret_cast<__m128i*>(&maskBuffer))
);
}

const auto signatureBytes = _mm_loadu_si128(reinterpret_cast<__m128i*>(&byteBuffer));
const auto signatureMask = _mm_loadu_si128(reinterpret_cast<__m128i*>(&maskBuffer));
template<>
scan_result find_pattern<scan_mode::SSE>(const std::byte* begin, const std::byte* end, signature_view signature) {
// 256 bit vector containing first signature byte repeated
const auto firstByte = _mm_set1_epi8(static_cast<int8_t>(*signature[0]));
const auto [signatureBytes, signatureMask] = load_signature_128(signature);

auto vec = reinterpret_cast<const __m128i*>(begin);
const auto n = static_cast<size_t>(end - signature.size() - begin) / sizeof(__m128i);
Expand Down

0 comments on commit c847736

Please sign in to comment.