Buckets:
arudradey/fullhtml-storage / emsdk /upstream /emscripten /cache /sysroot /include /compat /smmintrin.h
| /* | |
| * Copyright 2020 The Emscripten Authors. All rights reserved. | |
| * Emscripten is available under two separate licenses, the MIT license and the | |
| * University of Illinois/NCSA Open Source License. Both these licenses can be | |
| * found in the LICENSE file. | |
| */ | |
| static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) | |
| _mm_blendv_epi8(__m128i __a, __m128i __b, __m128i __mask) | |
| { | |
| v128_t __M = wasm_i8x16_shr((v128_t)__mask, 7); | |
| return (__m128i)wasm_v128_bitselect((v128_t)__b, (v128_t)__a, __M); | |
| } | |
| static __inline__ __m128d __attribute__((__always_inline__, __nodebug__)) | |
| _mm_blendv_pd(__m128d __a, __m128d __b, __m128d __mask) | |
| { | |
| v128_t __M = wasm_i64x2_shr((v128_t)__mask, 63); | |
| return (__m128d)wasm_v128_bitselect((v128_t)__b, (v128_t)__a, __M); | |
| } | |
| static __inline__ __m128 __attribute__((__always_inline__, __nodebug__)) | |
| _mm_blendv_ps(__m128 __a, __m128 __b, __m128 __mask) | |
| { | |
| v128_t __M = wasm_i32x4_shr((v128_t)__mask, 31); | |
| return (__m128)wasm_v128_bitselect((v128_t)__b, (v128_t)__a, __M); | |
| } | |
| static __inline__ __m128d __attribute__((__always_inline__, __nodebug__)) | |
| _mm_ceil_pd(__m128d __a) | |
| { | |
| return (__m128d)wasm_f64x2_ceil((v128_t)__a); | |
| } | |
| static __inline__ __m128 __attribute__((__always_inline__, __nodebug__)) | |
| _mm_ceil_ps(__m128 __a) | |
| { | |
| return (__m128)wasm_f32x4_ceil((v128_t)__a); | |
| } | |
| static __inline__ __m128 __attribute__((__always_inline__, __nodebug__)) | |
| _mm_ceil_ss(__m128 __a, __m128 __b) | |
| { | |
| return _mm_move_ss(__a, _mm_ceil_ps(__b)); | |
| } | |
| static __inline__ __m128d __attribute__((__always_inline__, __nodebug__)) | |
| _mm_ceil_sd(__m128d __a, __m128d __b) | |
| { | |
| return _mm_move_sd(__a, _mm_ceil_pd(__b)); | |
| } | |
| static __inline__ __m128d __attribute__((__always_inline__, __nodebug__)) | |
| _mm_floor_pd(__m128d __a) | |
| { | |
| return (__m128d)wasm_f64x2_floor((v128_t)__a); | |
| } | |
| static __inline__ __m128 __attribute__((__always_inline__, __nodebug__)) | |
| _mm_floor_ps(__m128 __a) | |
| { | |
| return (__m128)wasm_f32x4_floor((v128_t)__a); | |
| } | |
| static __inline__ __m128 __attribute__((__always_inline__, __nodebug__)) | |
| _mm_floor_ss(__m128 __a, __m128 __b) | |
| { | |
| return _mm_move_ss(__a, _mm_floor_ps(__b)); | |
| } | |
| static __inline__ __m128d __attribute__((__always_inline__, __nodebug__)) | |
| _mm_floor_sd(__m128d __a, __m128d __b) | |
| { | |
| return _mm_move_sd(__a, _mm_floor_pd(__b)); | |
| } | |
| static __inline__ __m128d __attribute__((__always_inline__, __nodebug__)) | |
| _mm_round_pd(__m128d __a, int __rounding) | |
| { | |
| switch(__rounding & 7) | |
| { | |
| case _MM_FROUND_TO_NEG_INF: return _mm_floor_pd(__a); | |
| case _MM_FROUND_TO_POS_INF: return _mm_ceil_pd(__a); | |
| case _MM_FROUND_TO_ZERO: | |
| return (__m128d)wasm_f64x2_trunc((v128_t)__a); | |
| default: | |
| // _MM_FROUND_TO_NEAREST_INT and _MM_FROUND_CUR_DIRECTION (which is always nearest in Wasm SIMD) | |
| // SSE implements "Banker's rounding", where even half-ways, e.g. 2.5 are rounded down, | |
| // and odd numbers e.g. 3.5 are rounded up. | |
| return (__m128d)wasm_f64x2_nearest((v128_t)__a); | |
| } | |
| } | |
| static __inline__ __m128 __attribute__((__always_inline__, __nodebug__)) | |
| _mm_round_ps(__m128 __a, int __rounding) | |
| { | |
| switch(__rounding & 7) | |
| { | |
| case _MM_FROUND_TO_NEG_INF: return _mm_floor_ps(__a); | |
| case _MM_FROUND_TO_POS_INF: return _mm_ceil_ps(__a); | |
| case _MM_FROUND_TO_ZERO: | |
| return (__m128)wasm_f32x4_trunc((v128_t)__a); | |
| default: | |
| // _MM_FROUND_TO_NEAREST_INT and _MM_FROUND_CUR_DIRECTION (which is always nearest in Wasm SIMD) | |
| // SSE implements "Banker's rounding", where even half-ways, e.g. 2.5 are rounded down, | |
| // and odd numbers e.g. 3.5 are rounded up. | |
| return (__m128)wasm_f32x4_nearest((v128_t)__a); | |
| } | |
| } | |
| static __inline__ __m128 __attribute__((__always_inline__, __nodebug__)) | |
| _mm_round_ss(__m128 __a, __m128 __b, int __rounding) | |
| { | |
| return _mm_move_ss(__a, _mm_round_ps(__b, __rounding)); | |
| } | |
| static __inline__ __m128d __attribute__((__always_inline__, __nodebug__)) | |
| _mm_round_sd(__m128d __a, __m128d __b, int __rounding) | |
| { | |
| return _mm_move_sd(__a, _mm_round_pd(__b, __rounding)); | |
| } | |
| static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) | |
| _mm_mullo_epi32(__m128i __a, __m128i __b) | |
| { | |
| return (__m128i)wasm_i32x4_mul(__a, __b); | |
| } | |
| static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) | |
| _mm_mul_epi32(__m128i __a, __m128i __b) | |
| { | |
| return (__m128i)wasm_i64x2_extmul_low_i32x4( | |
| (v128_t)_mm_shuffle_epi32(__a, _MM_SHUFFLE(2, 0, 2, 0)), | |
| (v128_t)_mm_shuffle_epi32(__b, _MM_SHUFFLE(2, 0, 2, 0))); | |
| } | |
| static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) | |
| _mm_min_epi8(__m128i __a, __m128i __b) | |
| { | |
| return (__m128i)wasm_i8x16_min(__a, __b); | |
| } | |
| static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) | |
| _mm_max_epi8(__m128i __a, __m128i __b) | |
| { | |
| return (__m128i)wasm_i8x16_max(__a, __b); | |
| } | |
| static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) | |
| _mm_min_epu16(__m128i __a, __m128i __b) | |
| { | |
| return (__m128i)wasm_u16x8_min(__a, __b); | |
| } | |
| static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) | |
| _mm_max_epu16(__m128i __a, __m128i __b) | |
| { | |
| return (__m128i)wasm_u16x8_max(__a, __b); | |
| } | |
| static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) | |
| _mm_min_epi32(__m128i __a, __m128i __b) | |
| { | |
| return (__m128i)wasm_i32x4_min(__a, __b); | |
| } | |
| static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) | |
| _mm_max_epi32(__m128i __a, __m128i __b) | |
| { | |
| return (__m128i)wasm_i32x4_max(__a, __b); | |
| } | |
| static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) | |
| _mm_min_epu32(__m128i __a, __m128i __b) | |
| { | |
| return (__m128i)wasm_u32x4_min(__a, __b); | |
| } | |
| static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) | |
| _mm_max_epu32(__m128i __a, __m128i __b) | |
| { | |
| return (__m128i)wasm_u32x4_max(__a, __b); | |
| } | |
| static __inline__ int __attribute__((__always_inline__, __nodebug__, DIAGNOSE_SLOW)) | |
| _mm_testz_si128(__m128i __a, __m128i __b) | |
| { | |
| v128_t __m = wasm_v128_and(__a, __b); | |
| return (wasm_i64x2_extract_lane(__m, 0) | wasm_i64x2_extract_lane(__m, 1)) == 0; | |
| } | |
| static __inline__ int __attribute__((__always_inline__, __nodebug__, DIAGNOSE_SLOW)) | |
| _mm_testc_si128(__m128i __a, __m128i __b) | |
| { | |
| v128_t __m = wasm_v128_andnot(__b, __a); | |
| return (wasm_i64x2_extract_lane(__m, 0) | wasm_i64x2_extract_lane(__m, 1)) == 0; | |
| } | |
| static __inline__ int __attribute__((__always_inline__, __nodebug__)) | |
| _mm_testnzc_si128(__m128i __a, __m128i __b) | |
| { | |
| v128_t __m1 = wasm_v128_and(__a, __b); | |
| v128_t __m2 = wasm_v128_andnot(__b, __a); | |
| return (wasm_i64x2_extract_lane(__m1, 0) | wasm_i64x2_extract_lane(__m1, 1)) | |
| && (wasm_i64x2_extract_lane(__m2, 0) | wasm_i64x2_extract_lane(__m2, 1)); | |
| } | |
| static __inline__ int __attribute__((__always_inline__, __nodebug__, DIAGNOSE_SLOW)) | |
| _mm_test_all_ones(__m128i __a) | |
| { | |
| return (wasm_i64x2_extract_lane(__a, 0) & wasm_i64x2_extract_lane(__a, 1)) == 0xFFFFFFFFFFFFFFFFull; | |
| } | |
| static __inline__ int __attribute__((__always_inline__, __nodebug__, DIAGNOSE_SLOW)) | |
| _mm_test_all_zeros(__m128i __a, __m128i __mask) | |
| { | |
| v128_t __m = wasm_v128_and(__a, __mask); | |
| return (wasm_i64x2_extract_lane(__m, 0) | wasm_i64x2_extract_lane(__m, 1)) == 0; | |
| } | |
| static __inline__ int __attribute__((__always_inline__, __nodebug__, DIAGNOSE_SLOW)) | |
| _mm_test_mix_ones_zeros(__m128i __a, __m128i __mask) | |
| { | |
| v128_t __m = wasm_v128_and(__a, __mask); | |
| long long __c0 = wasm_i64x2_extract_lane(__m, 0); | |
| long long __c1 = wasm_i64x2_extract_lane(__m, 1); | |
| long long __ones = __c0 | __c1; | |
| long long __zeros = ~(__c0 & __c1); | |
| return __ones && __zeros; | |
| } | |
| static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) | |
| _mm_cmpeq_epi64(__m128i __a, __m128i __b) | |
| { | |
| const __m128i __mask = _mm_cmpeq_epi32(__a, __b); | |
| return _mm_and_si128(__mask, _mm_shuffle_epi32(__mask, _MM_SHUFFLE(2, 3, 0, 1))); | |
| } | |
| static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) | |
| _mm_cvtepi8_epi16(__m128i __a) | |
| { | |
| return (__m128i)wasm_i16x8_widen_low_i8x16((v128_t)__a); | |
| } | |
| static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) | |
| _mm_cvtepi8_epi32(__m128i __a) | |
| { | |
| return (__m128i)wasm_i32x4_widen_low_i16x8(wasm_i16x8_widen_low_i8x16((v128_t)__a)); | |
| } | |
| static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) | |
| _mm_cvtepi8_epi64(__m128i __a) | |
| { | |
| const __m128i __exta = _mm_cvtepi8_epi32(__a); | |
| const __m128i __sign = _mm_cmpgt_epi32(_mm_setzero_si128(), __exta); | |
| return _mm_unpacklo_epi32(__exta, __sign); | |
| } | |
| static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) | |
| _mm_cvtepi16_epi32(__m128i __a) | |
| { | |
| return (__m128i)wasm_i32x4_widen_low_i16x8((v128_t)__a); | |
| } | |
| static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) | |
| _mm_cvtepi16_epi64(__m128i __a) | |
| { | |
| const __m128i __exta = _mm_cvtepi16_epi32(__a); | |
| const __m128i __sign = _mm_cmpgt_epi32(_mm_setzero_si128(), __exta); | |
| return _mm_unpacklo_epi32(__exta, __sign); | |
| } | |
| static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) | |
| _mm_cvtepi32_epi64(__m128i __a) | |
| { | |
| const __m128i __sign = _mm_cmpgt_epi32(_mm_setzero_si128(), __a); | |
| return _mm_unpacklo_epi32(__a, __sign); | |
| } | |
| static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) | |
| _mm_cvtepu8_epi16(__m128i __a) | |
| { | |
| return (__m128i)wasm_u16x8_extend_low_u8x16((v128_t)__a); | |
| } | |
| static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) | |
| _mm_cvtepu8_epi32(__m128i __a) | |
| { | |
| return (__m128i)wasm_u32x4_extend_low_u16x8(wasm_i16x8_widen_low_u8x16((v128_t)__a)); | |
| } | |
| static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) | |
| _mm_cvtepu8_epi64(__m128i __a) | |
| { | |
| const __m128i __zero = _mm_setzero_si128(); | |
| return _mm_unpacklo_epi32(_mm_unpacklo_epi16(_mm_unpacklo_epi8(__a, __zero), __zero), __zero); | |
| } | |
| static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) | |
| _mm_cvtepu16_epi32(__m128i __a) | |
| { | |
| return (__m128i)wasm_u32x4_extend_low_u16x8((v128_t)__a); | |
| } | |
| static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) | |
| _mm_cvtepu16_epi64(__m128i __a) | |
| { | |
| const __m128i __zero = _mm_setzero_si128(); | |
| return _mm_unpacklo_epi32(_mm_unpacklo_epi16(__a, __zero), __zero); | |
| } | |
| static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) | |
| _mm_cvtepu32_epi64(__m128i __a) | |
| { | |
| const __m128i __zero = _mm_setzero_si128(); | |
| return _mm_unpacklo_epi32(__a, __zero); | |
| } | |
| static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) | |
| _mm_packus_epi32(__m128i __a, __m128i __b) | |
| { | |
| return (__m128i)wasm_u16x8_narrow_i32x4(__a, __b); | |
| } | |
| static __inline__ unsigned short __attribute__((__always_inline__, __nodebug__)) | |
| __uabs(int __i) | |
| { | |
| return (unsigned short)((__i >= 0) ? __i : -__i); | |
| } | |
| static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) | |
| _mm_mpsadbw_epu8(__m128i __a, __m128i __b, int __imm8) | |
| { | |
| int __aOffset = __imm8 & 4; | |
| int __bOffset = (__imm8 & 3) << 2; | |
| unsigned short __ret[8]; | |
| for(int __i = 0; __i < 8; ++__i) | |
| { | |
| __ret[__i] = __uabs(((__u8x16)__a)[__i + __aOffset ] - ((__u8x16)__b)[__bOffset ]) | |
| + __uabs(((__u8x16)__a)[__i + __aOffset + 1] - ((__u8x16)__b)[__bOffset + 1]) | |
| + __uabs(((__u8x16)__a)[__i + __aOffset + 2] - ((__u8x16)__b)[__bOffset + 2]) | |
| + __uabs(((__u8x16)__a)[__i + __aOffset + 3] - ((__u8x16)__b)[__bOffset + 3]); | |
| } | |
| return (__m128i)wasm_v128_load(__ret); | |
| } | |
| static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) | |
| _mm_minpos_epu16(__m128i __a) | |
| { | |
| unsigned short __min[2] = { 0xFFFF, 0 }; | |
| for(int __i = 0; __i < 8; ++__i) | |
| { | |
| unsigned short __v = ((__u16x8)__a)[__i]; | |
| if (__v < __min[0]) | |
| { | |
| __min[0] = __v; | |
| __min[1] = __i; | |
| } | |
| } | |
| return (__m128i)wasm_i32x4_make(*(int*)__min, 0, 0, 0); | |
| } | |
| // Clang and GCC compatibility: Both Clang and GCC include SSE4.2 headers from SSE4.1 headers | |
Xet Storage Details
- Size:
- 17.6 kB
- Xet hash:
- fbe4a9efc7950351614440357a7fc7e23668e1aa1c6e2f944e5b506312653d5f
·
Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.