Commit 8f539d2a authored by wtc@chromium.org's avatar wtc@chromium.org

Port the __SSE2__ code to Visual C++.

R=thakis@chromium.org
BUG=none

Review URL: https://codereview.chromium.org/383543003

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@282773 0039d316-1c4b-4281-b951-d872f2087c98
parent b7d172c3
...@@ -4,6 +4,12 @@ ...@@ -4,6 +4,12 @@
#include "net/tools/balsa/balsa_frame.h" #include "net/tools/balsa/balsa_frame.h"
// Visual C++ defines _M_IX86_FP as 2 if the /arch:SSE2 compiler option is
// specified.
#if !defined(__SSE2__) && _M_IX86_FP == 2
#define __SSE2__ 1
#endif
#include <assert.h> #include <assert.h>
#if __SSE2__ #if __SSE2__
#include <emmintrin.h> #include <emmintrin.h>
...@@ -26,7 +32,16 @@ ...@@ -26,7 +32,16 @@
#include "net/tools/balsa/string_piece_utils.h" #include "net/tools/balsa/string_piece_utils.h"
#if defined(COMPILER_MSVC) #if defined(COMPILER_MSVC)
#include <intrin.h>
#include <string.h> #include <string.h>
#pragma intrinsic(_BitScanForward)
static int ffs(int i) {
unsigned long index;
return _BitScanForward(&index, i) ? index + 1 : 0;
}
#define strncasecmp _strnicmp #define strncasecmp _strnicmp
#else #else
#include <strings.h> #include <strings.h>
...@@ -503,8 +518,7 @@ inline void BalsaFrame::FindColonsAndParseIntoKeyValue() { ...@@ -503,8 +518,7 @@ inline void BalsaFrame::FindColonsAndParseIntoKeyValue() {
// The last line is always just a newline (and is uninteresting). // The last line is always just a newline (and is uninteresting).
const Lines::size_type lines_size_m1 = lines_.size() - 1; const Lines::size_type lines_size_m1 = lines_.size() - 1;
#if __SSE2__ #if __SSE2__
const __v16qi colons = { ':', ':', ':', ':', ':', ':', ':', ':', const __m128i colons = _mm_set1_epi8(':');
':', ':', ':', ':', ':', ':', ':', ':'};
const char* header_lines_end_m16 = headers_->OriginalHeaderStreamEnd() - 16; const char* header_lines_end_m16 = headers_->OriginalHeaderStreamEnd() - 16;
#endif // __SSE2__ #endif // __SSE2__
const char* current = stream_begin + lines_[1].first; const char* current = stream_begin + lines_[1].first;
...@@ -575,8 +589,7 @@ inline void BalsaFrame::FindColonsAndParseIntoKeyValue() { ...@@ -575,8 +589,7 @@ inline void BalsaFrame::FindColonsAndParseIntoKeyValue() {
while (current < header_lines_end_m16) { while (current < header_lines_end_m16) {
__m128i header_bytes = __m128i header_bytes =
_mm_loadu_si128(reinterpret_cast<const __m128i *>(current)); _mm_loadu_si128(reinterpret_cast<const __m128i *>(current));
__m128i colon_cmp = __m128i colon_cmp = _mm_cmpeq_epi8(header_bytes, colons);
_mm_cmpeq_epi8(header_bytes, reinterpret_cast<__m128i>(colons));
int colon_msk = _mm_movemask_epi8(colon_cmp); int colon_msk = _mm_movemask_epi8(colon_cmp);
if (colon_msk == 0) { if (colon_msk == 0) {
current += 16; current += 16;
...@@ -982,8 +995,7 @@ size_t BalsaFrame::ProcessHeaders(const char* message_start, ...@@ -982,8 +995,7 @@ size_t BalsaFrame::ProcessHeaders(const char* message_start,
#if __SSE2__ #if __SSE2__
{ {
const char* const message_end_m16 = message_end - 16; const char* const message_end_m16 = message_end - 16;
__v16qi newlines = { '\n', '\n', '\n', '\n', '\n', '\n', '\n', '\n', __m128i newlines = _mm_set1_epi8('\n');
'\n', '\n', '\n', '\n', '\n', '\n', '\n', '\n' };
while (message_current < message_end_m16) { while (message_current < message_end_m16) {
// What this does (using compiler intrinsics): // What this does (using compiler intrinsics):
// //
...@@ -999,8 +1011,7 @@ size_t BalsaFrame::ProcessHeaders(const char* message_start, ...@@ -999,8 +1011,7 @@ size_t BalsaFrame::ProcessHeaders(const char* message_start,
__m128i msg_bytes = __m128i msg_bytes =
_mm_loadu_si128(const_cast<__m128i *>( _mm_loadu_si128(const_cast<__m128i *>(
reinterpret_cast<const __m128i *>(message_current))); reinterpret_cast<const __m128i *>(message_current)));
__m128i newline_cmp = __m128i newline_cmp = _mm_cmpeq_epi8(msg_bytes, newlines);
_mm_cmpeq_epi8(msg_bytes, reinterpret_cast<__m128i>(newlines));
int newline_msk = _mm_movemask_epi8(newline_cmp); int newline_msk = _mm_movemask_epi8(newline_cmp);
if (newline_msk == 0) { if (newline_msk == 0) {
message_current += 16; message_current += 16;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment