mirror of
https://github.com/simdjson/simdjson
synced 2026-06-08 17:27:07 +00:00
Trying again... (#235)
This commit is contained in:
@@ -24,46 +24,46 @@ really_inline void flatten_bits(uint32_t *base_ptr, uint32_t &base,
|
||||
// Unfortunately, in other cases,
|
||||
// it helps tremendously.
|
||||
if(bits == 0) return;
|
||||
uint32_t cnt = _popcnt64(bits);
|
||||
uint32_t cnt = _mm_popcnt_u64(bits);
|
||||
uint32_t next_base = base + cnt;
|
||||
idx -= 64;
|
||||
base_ptr += base;
|
||||
{
|
||||
base_ptr[0] = idx + __tzcnt_u64(bits);
|
||||
base_ptr[0] = idx + _tzcnt_u64(bits);
|
||||
bits = _blsr_u64(bits);
|
||||
base_ptr[1] = idx + __tzcnt_u64(bits);
|
||||
base_ptr[1] = idx + _tzcnt_u64(bits);
|
||||
bits = _blsr_u64(bits);
|
||||
base_ptr[2] = idx + __tzcnt_u64(bits);
|
||||
base_ptr[2] = idx + _tzcnt_u64(bits);
|
||||
bits = _blsr_u64(bits);
|
||||
base_ptr[3] = idx + __tzcnt_u64(bits);
|
||||
base_ptr[3] = idx + _tzcnt_u64(bits);
|
||||
bits = _blsr_u64(bits);
|
||||
base_ptr[4] = idx + __tzcnt_u64(bits);
|
||||
base_ptr[4] = idx + _tzcnt_u64(bits);
|
||||
bits = _blsr_u64(bits);
|
||||
base_ptr[5] = idx + __tzcnt_u64(bits);
|
||||
base_ptr[5] = idx + _tzcnt_u64(bits);
|
||||
bits = _blsr_u64(bits);
|
||||
base_ptr[6] = idx + __tzcnt_u64(bits);
|
||||
base_ptr[6] = idx + _tzcnt_u64(bits);
|
||||
bits = _blsr_u64(bits);
|
||||
base_ptr[7] = idx + __tzcnt_u64(bits);
|
||||
base_ptr[7] = idx + _tzcnt_u64(bits);
|
||||
bits = _blsr_u64(bits);
|
||||
base_ptr += 8;
|
||||
}
|
||||
// We hope that the next branch is easily predicted.
|
||||
if (cnt > 8) {
|
||||
base_ptr[0] = idx + __tzcnt_u64(bits);
|
||||
base_ptr[0] = idx + _tzcnt_u64(bits);
|
||||
bits = _blsr_u64(bits);
|
||||
base_ptr[1] = idx + __tzcnt_u64(bits);
|
||||
base_ptr[1] = idx + _tzcnt_u64(bits);
|
||||
bits = _blsr_u64(bits);
|
||||
base_ptr[2] = idx + __tzcnt_u64(bits);
|
||||
base_ptr[2] = idx + _tzcnt_u64(bits);
|
||||
bits = _blsr_u64(bits);
|
||||
base_ptr[3] = idx + __tzcnt_u64(bits);
|
||||
base_ptr[3] = idx + _tzcnt_u64(bits);
|
||||
bits = _blsr_u64(bits);
|
||||
base_ptr[4] = idx + __tzcnt_u64(bits);
|
||||
base_ptr[4] = idx + _tzcnt_u64(bits);
|
||||
bits = _blsr_u64(bits);
|
||||
base_ptr[5] = idx + __tzcnt_u64(bits);
|
||||
base_ptr[5] = idx + _tzcnt_u64(bits);
|
||||
bits = _blsr_u64(bits);
|
||||
base_ptr[6] = idx + __tzcnt_u64(bits);
|
||||
base_ptr[6] = idx + _tzcnt_u64(bits);
|
||||
bits = _blsr_u64(bits);
|
||||
base_ptr[7] = idx + __tzcnt_u64(bits);
|
||||
base_ptr[7] = idx + _tzcnt_u64(bits);
|
||||
bits = _blsr_u64(bits);
|
||||
base_ptr += 8;
|
||||
}
|
||||
@@ -71,7 +71,7 @@ really_inline void flatten_bits(uint32_t *base_ptr, uint32_t &base,
|
||||
// since it means having one structural or pseudo-structral element
|
||||
// every 4 characters (possible with inputs like "","","",...).
|
||||
do {
|
||||
base_ptr[0] = idx + __tzcnt_u64(bits);
|
||||
base_ptr[0] = idx + _tzcnt_u64(bits);
|
||||
bits = _blsr_u64(bits);
|
||||
base_ptr++;
|
||||
} while(bits != 0);
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
|
||||
#include "simdjson/stage1_find_marks.h"
|
||||
#include "simdjson/stage1_find_marks_macros.h"
|
||||
#include "simdjson/stage1_find_marks_flatten.h"
|
||||
#include "simdjson/stage1_find_marks_flatten_haswell.h"
|
||||
#include "simdjson/simdutf8check_haswell.h"
|
||||
|
||||
#ifdef IS_X86_64
|
||||
|
||||
@@ -9,7 +9,7 @@ TARGET_HASWELL
|
||||
namespace simdjson {
|
||||
template<>
|
||||
int find_structural_bits<architecture::haswell>(const uint8_t *buf, size_t len, ParsedJson &pj) {
|
||||
FIND_STRUCTURAL_BITS(architecture::haswell, buf, len, pj, simdjson::flatten_bits);
|
||||
FIND_STRUCTURAL_BITS(architecture::haswell, buf, len, pj, simdjson::haswell::flatten_bits);
|
||||
}
|
||||
} // simdjson
|
||||
UNTARGET_REGION
|
||||
|
||||
Reference in New Issue
Block a user