diff --git a/src/hwlm/hwlm.c b/src/hwlm/hwlm.c index 054f05c4..2e16f1ac 100644 --- a/src/hwlm/hwlm.c +++ b/src/hwlm/hwlm.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Intel Corporation + * Copyright (c) 2015-2016, Intel Corporation * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: @@ -37,6 +37,7 @@ #include "fdr/fdr.h" #include "nfa/accel.h" #include "nfa/shufti.h" +#include "nfa/truffle.h" #include "nfa/vermicelli.h" #include @@ -64,8 +65,13 @@ const u8 *run_hwlm_accel(const union AccelAux *aux, const u8 *ptr, case ACCEL_SHUFTI: DEBUG_PRINTF("single shufti\n"); return shuftiExec(aux->shufti.lo, aux->shufti.hi, ptr, end); + case ACCEL_TRUFFLE: + DEBUG_PRINTF("truffle\n"); + return truffleExec(aux->truffle.mask1, aux->truffle.mask2, ptr, end); default: /* no acceleration, fall through and return current ptr */ + DEBUG_PRINTF("no accel; %u\n", (int)aux->accel_type); + assert(aux->accel_type == ACCEL_NONE); return ptr; } } diff --git a/src/hwlm/hwlm_build.cpp b/src/hwlm/hwlm_build.cpp index b3978017..27361c8c 100644 --- a/src/hwlm/hwlm_build.cpp +++ b/src/hwlm/hwlm_build.cpp @@ -38,6 +38,7 @@ #include "ue2common.h" #include "fdr/fdr_compile.h" #include "nfa/shufticompile.h" +#include "nfa/trufflecompile.h" #include "util/alloc.h" #include "util/bitutils.h" #include "util/charreach.h" @@ -372,12 +373,9 @@ void findForwardAccelScheme(const vector &lits, for (u32 i = 0; i < MAX_ACCEL_OFFSET && i < lit.s.length(); i++) { unsigned char c = lit.s[i]; if (lit.nocase) { - DEBUG_PRINTF("adding %02hhx to %u\n", mytoupper(c), i); - DEBUG_PRINTF("adding %02hhx to %u\n", mytolower(c), i); reach[i].set(mytoupper(c)); reach[i].set(mytolower(c)); } else { - DEBUG_PRINTF("adding %02hhx to %u\n", c, i); reach[i].set(c); } } @@ -397,7 +395,7 @@ void findForwardAccelScheme(const vector &lits, assert(min_offset <= min_len); if (min_count > MAX_SHUFTI_WIDTH) { - DEBUG_PRINTF("min shufti with %u chars is too wide\n", min_count); + DEBUG_PRINTF("FAIL: min shufti with %u chars is too wide\n", min_count); return; } @@ -410,7 +408,11 @@ void findForwardAccelScheme(const vector &lits, return; } - DEBUG_PRINTF("fail\n"); + truffleBuildMasks(cr, &aux->truffle.mask1, &aux->truffle.mask2); + DEBUG_PRINTF("built truffle for %s (%zu chars, offset %u)\n", + describeClass(cr).c_str(), cr.count(), min_offset); + aux->truffle.accel_type = ACCEL_TRUFFLE; + aux->truffle.offset = verify_u8(min_offset); } static