Fix for multiaccel matcher unit test

Test was failing on 32-bit OS with AVX2
This commit is contained in:
Anatoly Burakov 2016-04-19 15:40:18 +01:00 committed by Matthew Barr
parent 8f46b7cf2e
commit 01169e69d2

View File

@ -40,6 +40,7 @@ extern "C" {
#include "nfa/multivermicelli.h" #include "nfa/multivermicelli.h"
#include "nfa/multishufti.h" #include "nfa/multishufti.h"
#include "nfa/multitruffle.h" #include "nfa/multitruffle.h"
#include "util/alloc.h"
#include "util/charreach.h" #include "util/charreach.h"
#include <string> #include <string>
@ -68,17 +69,18 @@ char getChar(const CharReach &cr, bool match) {
// appends a string with matches/unmatches according to input match pattern // appends a string with matches/unmatches according to input match pattern
static static
void getMatch(vector<u8> &result, const string &pattern, const CharReach &cr) { void getMatch(u8 *result, u32 start, const string &pattern,
const CharReach &cr) {
for (const auto &c : pattern) { for (const auto &c : pattern) {
result.push_back(getChar(cr, c == '1')); result[start++] = getChar(cr, c == '1');
} }
} }
// appends non-matching noise of certain lengths // appends non-matching noise of certain lengths
static static
void getNoise(vector<u8> &result, u32 len, const CharReach &cr) { void getNoise(u8 *result, u32 start, u32 len, const CharReach &cr) {
for (unsigned i = 0; i < len; i++) { for (unsigned i = 0; i < len; i++) {
result.push_back(getChar(cr, false)); result[start + i] = getChar(cr, false);
} }
} }
@ -111,7 +113,7 @@ protected:
const MultiaccelTestParam &p = GetParam(); const MultiaccelTestParam &p = GetParam();
// reserve space in our buffer // reserve space in our buffer
buffer.reserve(BUF_SIZE); buffer = (u8 *)aligned_zmalloc(BUF_SIZE);
// store the index where we expect to see the match. note that it may // store the index where we expect to see the match. note that it may
// be different from where the match pattern has started since we may // be different from where the match pattern has started since we may
@ -129,13 +131,16 @@ protected:
const MultiaccelTestParam &p = GetParam(); const MultiaccelTestParam &p = GetParam();
// step 1: fill prefix with non-matching noise // step 1: fill prefix with non-matching noise
getNoise(buffer, p.match_pattern_start_idx, cr); u32 start = 0;
getNoise(buffer, start, p.match_pattern_start_idx, cr);
// step 2: add a match // step 2: add a match
getMatch(buffer, p.match_pattern, cr); start += p.match_pattern_start_idx;
getMatch(buffer, start, p.match_pattern, cr);
// step 3: fill in the rest of the buffer with non-matching noise // step 3: fill in the rest of the buffer with non-matching noise
getNoise(buffer, BUF_SIZE - p.match_pattern.size() - start += p.match_pattern.size();
getNoise(buffer, start, BUF_SIZE - p.match_pattern.size() -
p.match_pattern_start_idx, cr); p.match_pattern_start_idx, cr);
} }
@ -159,24 +164,25 @@ protected:
} }
virtual void TearDown() { virtual void TearDown() {
aligned_free(buffer);
} }
u32 match_idx; u32 match_idx;
vector<u8> buffer; u8 *buffer;
bool test_all_offsets; bool test_all_offsets;
}; };
static static
void runTest(const vector<u8> &buffer, AccelAux *aux, unsigned match_idx, void runTest(const u8 *buffer, AccelAux *aux, unsigned match_idx,
bool test_all_offsets) { bool test_all_offsets) {
const u8 *start = buffer.data(); const u8 *start = buffer;
const u8 *end = start + buffer.size(); const u8 *end = start + BUF_SIZE;
const u8 *match = start + match_idx; const u8 *match = start + match_idx;
// comparing indexes into the buffer is easier to understand than pointers // comparing indexes into the buffer is easier to understand than pointers
if (test_all_offsets) { if (test_all_offsets) {
// run_accel can only scan >15 byte buffers // run_accel can only scan >15 byte buffers
u32 end_offset = min(match_idx, (u32) buffer.size() - 15); u32 end_offset = min(match_idx, BUF_SIZE - 15);
for (unsigned offset = 0; offset < end_offset; offset++) { for (unsigned offset = 0; offset < end_offset; offset++) {
const u8 *ptr = run_accel(aux, (start + offset), end); const u8 *ptr = run_accel(aux, (start + offset), end);