1/*
2 * Copyright (c) 2015-2017, Intel Corporation
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are met:
6 *
7 * * Redistributions of source code must retain the above copyright notice,
8 * this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of Intel Corporation nor the names of its contributors
13 * may be used to endorse or promote products derived from this software
14 * without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
20 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26 * POSSIBILITY OF SUCH DAMAGE.
27 */
28
29#ifndef ACCEL_COMPILE_H
30#define ACCEL_COMPILE_H
31
32#include "ue2common.h"
33#include "util/charreach.h"
34#include "util/flat_containers.h"
35
36union AccelAux;
37
38namespace ue2 {
39
40struct AccelInfo {
41 AccelInfo() : single_offset(0U), double_offset(0U),
42 single_stops(CharReach::dot()) {}
43 u32 single_offset; /**< offset correction to apply to single schemes */
44 u32 double_offset; /**< offset correction to apply to double schemes */
45 CharReach double_stop1; /**< single-byte accel stop literals for double
46 * schemes */
47 flat_set<std::pair<u8, u8>> double_stop2; /**< double-byte accel stop
48 * literals */
49 CharReach single_stops; /**< escapes for single byte acceleration */
50};
51
52bool buildAccelAux(const AccelInfo &info, AccelAux *aux);
53
54/* returns true is the escape set can be handled with a masked double_verm */
55bool buildDvermMask(const flat_set<std::pair<u8, u8>> &escape_set,
56 u8 *m1_out = nullptr, u8 *m2_out = nullptr);
57
58} // namespace ue2
59
60#endif
61