mirror of
https://github.com/boostorg/beast.git
synced 2025-08-02 06:15:24 +02:00
Disable SSE4.2 optimizations
This commit is contained in:
@@ -9,6 +9,7 @@ Version 76:
|
|||||||
* serializing file_body is not const
|
* serializing file_body is not const
|
||||||
* Add file_body_win32
|
* Add file_body_win32
|
||||||
* Fix parse illegal characters in obs-fold
|
* Fix parse illegal characters in obs-fold
|
||||||
|
* Disable SSE4.2 optimizations
|
||||||
|
|
||||||
API Changes:
|
API Changes:
|
||||||
|
|
||||||
|
@@ -19,45 +19,6 @@
|
|||||||
#include <cstddef>
|
#include <cstddef>
|
||||||
#include <utility>
|
#include <utility>
|
||||||
|
|
||||||
/*
|
|
||||||
Portions of this file based on code from picophttpparser,
|
|
||||||
copyright notice below.
|
|
||||||
https://github.com/h2o/picohttpparser
|
|
||||||
*/
|
|
||||||
/*
|
|
||||||
* Copyright (c) 2009-2014 Kazuho Oku, Tokuhiro Matsuno, Daisuke Murase,
|
|
||||||
* Shigeo Mitsunari
|
|
||||||
*
|
|
||||||
* The software is licensed under either the MIT License (below) or the Perl
|
|
||||||
* license.
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to
|
|
||||||
* deal in the Software without restriction, including without limitation the
|
|
||||||
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
|
||||||
* sell copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
||||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
|
||||||
* IN THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#if ! BEAST_NO_INTRINSICS
|
|
||||||
# ifdef BOOST_MSVC
|
|
||||||
# include <nmmintrin.h>
|
|
||||||
# else
|
|
||||||
# include <x86intrin.h>
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
namespace beast {
|
namespace beast {
|
||||||
namespace http {
|
namespace http {
|
||||||
namespace detail {
|
namespace detail {
|
||||||
@@ -65,15 +26,6 @@ namespace detail {
|
|||||||
class basic_parser_base
|
class basic_parser_base
|
||||||
{
|
{
|
||||||
protected:
|
protected:
|
||||||
#if ! BEAST_NO_INTRINSICS
|
|
||||||
bool sse42_;
|
|
||||||
|
|
||||||
basic_parser_base()
|
|
||||||
: sse42_(beast::detail::get_cpu_info().sse42)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// limit on the size of the obs-fold buffer
|
// limit on the size of the obs-fold buffer
|
||||||
//
|
//
|
||||||
// https://stackoverflow.com/questions/686217/maximum-on-http-header-values
|
// https://stackoverflow.com/questions/686217/maximum-on-http-header-values
|
||||||
@@ -214,36 +166,7 @@ protected:
|
|||||||
size_t ranges_size)
|
size_t ranges_size)
|
||||||
{
|
{
|
||||||
bool found = false;
|
bool found = false;
|
||||||
|
|
||||||
#if ! BEAST_NO_INTRINSICS
|
|
||||||
if(BOOST_LIKELY(sse42_))
|
|
||||||
{
|
|
||||||
if(BOOST_LIKELY(buf_end - buf >= 16))
|
|
||||||
{
|
|
||||||
__m128i ranges16 = _mm_loadu_si128((__m128i const*)ranges);
|
|
||||||
std::size_t left = (buf_end - buf) & ~15;
|
|
||||||
do
|
|
||||||
{
|
|
||||||
__m128i b16 = _mm_loadu_si128((__m128i const*)buf);
|
|
||||||
int r = _mm_cmpestri(ranges16, ranges_size, b16, 16,
|
|
||||||
_SIDD_LEAST_SIGNIFICANT | _SIDD_CMP_RANGES | _SIDD_UBYTE_OPS);
|
|
||||||
if(BOOST_UNLIKELY(r != 16))
|
|
||||||
{
|
|
||||||
buf += r;
|
|
||||||
found = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
buf += 16;
|
|
||||||
left -= 16;
|
|
||||||
}
|
|
||||||
while(BOOST_LIKELY(left != 0));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#else
|
|
||||||
boost::ignore_unused(buf_end, ranges, ranges_size);
|
boost::ignore_unused(buf_end, ranges, ranges_size);
|
||||||
|
|
||||||
#endif
|
|
||||||
return {buf, found};
|
return {buf, found};
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -326,48 +249,6 @@ protected:
|
|||||||
char const*& token_last,
|
char const*& token_last,
|
||||||
error_code& ec)
|
error_code& ec)
|
||||||
{
|
{
|
||||||
#if ! BEAST_NO_INTRINSICS
|
|
||||||
static char const ranges1[] =
|
|
||||||
"\0\010" // allow HT */
|
|
||||||
"\012\037" // allow SP and up to but not including DEL
|
|
||||||
"\177\177" // allow chars w. MSB set
|
|
||||||
;
|
|
||||||
bool found;
|
|
||||||
std::tie(p, found) = find_fast(
|
|
||||||
p, last, ranges1, sizeof(ranges1) - 1);
|
|
||||||
if(found)
|
|
||||||
goto found_control;
|
|
||||||
#else
|
|
||||||
/* find non-printable char within the next 8 bytes, this is the hottest code; manually inlined */
|
|
||||||
while(BOOST_LIKELY(last - p >= 8))
|
|
||||||
{
|
|
||||||
#define BEAST_PARSE_TOKEN_TO_EOL_REPEAT() \
|
|
||||||
do \
|
|
||||||
{ \
|
|
||||||
if(BOOST_UNLIKELY( \
|
|
||||||
! is_print(*p))) \
|
|
||||||
goto non_printable; \
|
|
||||||
++p; \
|
|
||||||
} \
|
|
||||||
while(0);
|
|
||||||
BEAST_PARSE_TOKEN_TO_EOL_REPEAT();
|
|
||||||
BEAST_PARSE_TOKEN_TO_EOL_REPEAT();
|
|
||||||
BEAST_PARSE_TOKEN_TO_EOL_REPEAT();
|
|
||||||
BEAST_PARSE_TOKEN_TO_EOL_REPEAT();
|
|
||||||
BEAST_PARSE_TOKEN_TO_EOL_REPEAT();
|
|
||||||
BEAST_PARSE_TOKEN_TO_EOL_REPEAT();
|
|
||||||
BEAST_PARSE_TOKEN_TO_EOL_REPEAT();
|
|
||||||
BEAST_PARSE_TOKEN_TO_EOL_REPEAT();
|
|
||||||
#undef BEAST_PARSE_TOKEN_TO_EOL_REPEAT
|
|
||||||
continue;
|
|
||||||
non_printable:
|
|
||||||
if((BOOST_LIKELY((unsigned char)*p < '\040') &&
|
|
||||||
BOOST_LIKELY(*p != '\011')) ||
|
|
||||||
BOOST_UNLIKELY(*p == '\177'))
|
|
||||||
goto found_control;
|
|
||||||
++p;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
for(;; ++p)
|
for(;; ++p)
|
||||||
{
|
{
|
||||||
if(p >= last)
|
if(p >= last)
|
||||||
|
Reference in New Issue
Block a user