From dffd876205c2affe56bb9257074c72d914b2529b Mon Sep 17 00:00:00 2001 From: Roman Divacky Date: Thu, 3 Apr 2014 18:04:52 +0000 Subject: [PATCH] Revert r205436: Extend the SSE2 comment lexing to AVX2. Only 16byte align when not on AVX2. This provides some 3% speedup when preprocessing gcc.c as a single file. The patch is wrong, it always uses SSE2, and when I fix that there's no speedup at all. I am not sure where the 3% came from previously. --Thi lie, and those below, will be ignored-- M Lex/Lexer.cpp git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@205548 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Lex/Lexer.cpp | 33 +++++---------------------------- 1 file changed, 5 insertions(+), 28 deletions(-) diff --git a/lib/Lex/Lexer.cpp b/lib/Lex/Lexer.cpp index 86d01d6cc8..0955cc5b33 100644 --- a/lib/Lex/Lexer.cpp +++ b/lib/Lex/Lexer.cpp @@ -2251,8 +2251,6 @@ static bool isEndOfBlockCommentWithEscapedNewLine(const char *CurPtr, #ifdef __SSE2__ #include -#elif __AVX2__ -#include #elif __ALTIVEC__ #include #undef bool @@ -2308,33 +2306,17 @@ bool Lexer::SkipBlockComment(Token &Result, const char *CurPtr, // If there is a code-completion point avoid the fast scan because it // doesn't check for '\0'. !(PP && PP->getCodeCompletionFileLoc() == FileLoc)) { -#ifndef __AVX2__ // While not aligned to a 16-byte boundary. while (C != '/' && ((intptr_t)CurPtr & 0x0F) != 0) C = *CurPtr++; -#endif if (C == '/') goto FoundSlash; #ifdef __SSE2__ -#define VECTOR_TYPE __m128i -#define SET1_EPI8(v) _mm_set1_epi8(v) -#define CMPEQ_EPI8(v1,v2) _mm_cmpeq_epi8(v1,v2) -#define MOVEMASK_EPI8(v) _mm_movemask_epi8(v) -#define STEP 16 -#elif __AVX2__ -#define VECTOR_TYPE __m256i -#define SET1_EPI8(v) _mm256_set1_epi8(v) -#define CMPEQ_EPI8(v1,v2) _mm256_cmpeq_epi8(v1,v2) -#define MOVEMASK_EPI8(v) _mm256_movemask_epi8(v) -#define STEP 32 -#endif - -#if defined(__SSE2__) || defined(__AVX2__) - VECTOR_TYPE Slashes = SET1_EPI8('/'); - while (CurPtr+STEP <= BufferEnd) { - int cmp = MOVEMASK_EPI8(CMPEQ_EPI8(*(const VECTOR_TYPE*)CurPtr, - Slashes)); + __m128i Slashes = _mm_set1_epi8('/'); + while (CurPtr+16 <= BufferEnd) { + int cmp = _mm_movemask_epi8(_mm_cmpeq_epi8(*(const __m128i*)CurPtr, + Slashes)); if (cmp != 0) { // Adjust the pointer to point directly after the first slash. It's // not necessary to set C here, it will be overwritten at the end of @@ -2342,13 +2324,8 @@ bool Lexer::SkipBlockComment(Token &Result, const char *CurPtr, CurPtr += llvm::countTrailingZeros(cmp) + 1; goto FoundSlash; } - CurPtr += STEP; + CurPtr += 16; } -#undef VECTOR_TYPE -#undef SET1_EPI8 -#undef CMPEQ_EPI8 -#undef MOVEMASK_EPI8 -#undef STEP #elif __ALTIVEC__ __vector unsigned char Slashes = { '/', '/', '/', '/', '/', '/', '/', '/', -- 2.40.0