sequenzo 0.1.21__cp312-cp312-macosx_10_9_x86_64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of sequenzo might be problematic. Click here for more details.
- sequenzo/__init__.py +240 -0
- sequenzo/big_data/__init__.py +12 -0
- sequenzo/big_data/clara/__init__.py +26 -0
- sequenzo/big_data/clara/clara.py +467 -0
- sequenzo/big_data/clara/utils/__init__.py +27 -0
- sequenzo/big_data/clara/utils/aggregatecases.py +92 -0
- sequenzo/big_data/clara/utils/davies_bouldin.py +91 -0
- sequenzo/big_data/clara/utils/get_weighted_diss.cpython-312-darwin.so +0 -0
- sequenzo/big_data/clara/utils/wfcmdd.py +205 -0
- sequenzo/big_data/clara/visualization.py +88 -0
- sequenzo/clustering/KMedoids.py +196 -0
- sequenzo/clustering/__init__.py +30 -0
- sequenzo/clustering/clustering_c_code.cpython-312-darwin.so +0 -0
- sequenzo/clustering/hierarchical_clustering.py +1380 -0
- sequenzo/clustering/src/KMedoid.cpp +262 -0
- sequenzo/clustering/src/PAM.cpp +236 -0
- sequenzo/clustering/src/PAMonce.cpp +234 -0
- sequenzo/clustering/src/cluster_quality.cpp +496 -0
- sequenzo/clustering/src/cluster_quality.h +128 -0
- sequenzo/clustering/src/cluster_quality_backup.cpp +570 -0
- sequenzo/clustering/src/module.cpp +228 -0
- sequenzo/clustering/src/weightedinertia.cpp +111 -0
- sequenzo/clustering/utils/__init__.py +27 -0
- sequenzo/clustering/utils/disscenter.py +122 -0
- sequenzo/data_preprocessing/__init__.py +20 -0
- sequenzo/data_preprocessing/helpers.py +256 -0
- sequenzo/datasets/__init__.py +41 -0
- sequenzo/datasets/biofam.csv +2001 -0
- sequenzo/datasets/biofam_child_domain.csv +2001 -0
- sequenzo/datasets/biofam_left_domain.csv +2001 -0
- sequenzo/datasets/biofam_married_domain.csv +2001 -0
- sequenzo/datasets/chinese_colonial_territories.csv +12 -0
- sequenzo/datasets/country_co2_emissions.csv +194 -0
- sequenzo/datasets/country_co2_emissions_global_deciles.csv +195 -0
- sequenzo/datasets/country_co2_emissions_global_quintiles.csv +195 -0
- sequenzo/datasets/country_co2_emissions_local_deciles.csv +195 -0
- sequenzo/datasets/country_co2_emissions_local_quintiles.csv +195 -0
- sequenzo/datasets/country_gdp_per_capita.csv +194 -0
- sequenzo/datasets/mvad.csv +713 -0
- sequenzo/datasets/pairfam_family.csv +1867 -0
- sequenzo/datasets/polyadic_samplec1.csv +61 -0
- sequenzo/datasets/polyadic_samplep1.csv +61 -0
- sequenzo/datasets/polyadic_seqc1.csv +61 -0
- sequenzo/datasets/polyadic_seqp1.csv +61 -0
- sequenzo/define_sequence_data.py +609 -0
- sequenzo/dissimilarity_measures/__init__.py +31 -0
- sequenzo/dissimilarity_measures/c_code.cpython-312-darwin.so +0 -0
- sequenzo/dissimilarity_measures/get_distance_matrix.py +702 -0
- sequenzo/dissimilarity_measures/get_substitution_cost_matrix.py +241 -0
- sequenzo/dissimilarity_measures/src/DHDdistance.cpp +148 -0
- sequenzo/dissimilarity_measures/src/LCPdistance.cpp +114 -0
- sequenzo/dissimilarity_measures/src/OMdistance.cpp +247 -0
- sequenzo/dissimilarity_measures/src/OMspellDistance.cpp +281 -0
- sequenzo/dissimilarity_measures/src/__init__.py +0 -0
- sequenzo/dissimilarity_measures/src/dist2matrix.cpp +63 -0
- sequenzo/dissimilarity_measures/src/dp_utils.h +160 -0
- sequenzo/dissimilarity_measures/src/module.cpp +34 -0
- sequenzo/dissimilarity_measures/src/setup.py +30 -0
- sequenzo/dissimilarity_measures/src/utils.h +25 -0
- sequenzo/dissimilarity_measures/src/xsimd/.github/cmake-test/main.cpp +6 -0
- sequenzo/dissimilarity_measures/src/xsimd/benchmark/main.cpp +159 -0
- sequenzo/dissimilarity_measures/src/xsimd/benchmark/xsimd_benchmark.hpp +565 -0
- sequenzo/dissimilarity_measures/src/xsimd/docs/source/conf.py +37 -0
- sequenzo/dissimilarity_measures/src/xsimd/examples/mandelbrot.cpp +330 -0
- sequenzo/dissimilarity_measures/src/xsimd/examples/pico_bench.hpp +246 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/common/xsimd_common_arithmetic.hpp +266 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/common/xsimd_common_complex.hpp +112 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/common/xsimd_common_details.hpp +323 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/common/xsimd_common_logical.hpp +218 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/common/xsimd_common_math.hpp +2583 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/common/xsimd_common_memory.hpp +880 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/common/xsimd_common_rounding.hpp +72 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/common/xsimd_common_swizzle.hpp +174 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/common/xsimd_common_trigo.hpp +978 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_avx.hpp +1924 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_avx2.hpp +1144 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_avx512bw.hpp +656 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_avx512cd.hpp +28 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_avx512dq.hpp +244 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_avx512er.hpp +20 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_avx512f.hpp +2650 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_avx512ifma.hpp +20 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_avx512pf.hpp +20 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_avx512vbmi.hpp +77 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_avx512vbmi2.hpp +131 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_avx512vnni_avx512bw.hpp +20 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_avx512vnni_avx512vbmi2.hpp +20 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_avxvnni.hpp +20 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_common.hpp +24 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_common_fwd.hpp +77 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_constants.hpp +393 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_emulated.hpp +788 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_fma3_avx.hpp +93 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_fma3_avx2.hpp +46 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_fma3_sse.hpp +97 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_fma4.hpp +92 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_i8mm_neon64.hpp +17 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_isa.hpp +142 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_neon.hpp +3142 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_neon64.hpp +1543 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_rvv.hpp +1513 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_scalar.hpp +1260 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_sse2.hpp +2024 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_sse3.hpp +67 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_sse4_1.hpp +339 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_sse4_2.hpp +44 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_ssse3.hpp +186 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_sve.hpp +1155 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_vsx.hpp +892 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_wasm.hpp +1780 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/config/xsimd_arch.hpp +240 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/config/xsimd_config.hpp +484 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/config/xsimd_cpuid.hpp +269 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/config/xsimd_inline.hpp +27 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/math/xsimd_rem_pio2.hpp +719 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/memory/xsimd_aligned_allocator.hpp +349 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/memory/xsimd_alignment.hpp +91 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_all_registers.hpp +55 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_api.hpp +2765 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_avx2_register.hpp +44 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_avx512bw_register.hpp +51 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_avx512cd_register.hpp +51 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_avx512dq_register.hpp +51 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_avx512er_register.hpp +51 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_avx512f_register.hpp +77 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_avx512ifma_register.hpp +51 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_avx512pf_register.hpp +51 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_avx512vbmi2_register.hpp +51 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_avx512vbmi_register.hpp +51 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_avx512vnni_avx512bw_register.hpp +54 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_avx512vnni_avx512vbmi2_register.hpp +53 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_avx_register.hpp +64 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_avxvnni_register.hpp +44 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_batch.hpp +1524 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_batch_constant.hpp +300 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_common_arch.hpp +47 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_emulated_register.hpp +80 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_fma3_avx2_register.hpp +50 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_fma3_avx_register.hpp +50 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_fma3_sse_register.hpp +50 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_fma4_register.hpp +50 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_i8mm_neon64_register.hpp +55 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_neon64_register.hpp +55 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_neon_register.hpp +154 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_register.hpp +94 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_rvv_register.hpp +506 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_sse2_register.hpp +59 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_sse3_register.hpp +49 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_sse4_1_register.hpp +48 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_sse4_2_register.hpp +48 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_ssse3_register.hpp +48 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_sve_register.hpp +156 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_traits.hpp +337 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_utils.hpp +536 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_vsx_register.hpp +77 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_wasm_register.hpp +59 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/xsimd.hpp +75 -0
- sequenzo/dissimilarity_measures/src/xsimd/test/architectures/dummy.cpp +7 -0
- sequenzo/dissimilarity_measures/src/xsimd/test/doc/explicit_use_of_an_instruction_set.cpp +13 -0
- sequenzo/dissimilarity_measures/src/xsimd/test/doc/explicit_use_of_an_instruction_set_mean.cpp +24 -0
- sequenzo/dissimilarity_measures/src/xsimd/test/doc/explicit_use_of_an_instruction_set_mean_aligned.cpp +25 -0
- sequenzo/dissimilarity_measures/src/xsimd/test/doc/explicit_use_of_an_instruction_set_mean_arch_independent.cpp +28 -0
- sequenzo/dissimilarity_measures/src/xsimd/test/doc/explicit_use_of_an_instruction_set_mean_tag_dispatch.cpp +25 -0
- sequenzo/dissimilarity_measures/src/xsimd/test/doc/manipulating_abstract_batches.cpp +7 -0
- sequenzo/dissimilarity_measures/src/xsimd/test/doc/manipulating_parametric_batches.cpp +8 -0
- sequenzo/dissimilarity_measures/src/xsimd/test/doc/sum.hpp +31 -0
- sequenzo/dissimilarity_measures/src/xsimd/test/doc/sum_avx2.cpp +3 -0
- sequenzo/dissimilarity_measures/src/xsimd/test/doc/sum_sse2.cpp +3 -0
- sequenzo/dissimilarity_measures/src/xsimd/test/doc/writing_vectorized_code.cpp +11 -0
- sequenzo/dissimilarity_measures/src/xsimd/test/main.cpp +31 -0
- sequenzo/dissimilarity_measures/src/xsimd/test/test_api.cpp +230 -0
- sequenzo/dissimilarity_measures/src/xsimd/test/test_arch.cpp +217 -0
- sequenzo/dissimilarity_measures/src/xsimd/test/test_basic_math.cpp +183 -0
- sequenzo/dissimilarity_measures/src/xsimd/test/test_batch.cpp +1049 -0
- sequenzo/dissimilarity_measures/src/xsimd/test/test_batch_bool.cpp +508 -0
- sequenzo/dissimilarity_measures/src/xsimd/test/test_batch_cast.cpp +409 -0
- sequenzo/dissimilarity_measures/src/xsimd/test/test_batch_complex.cpp +712 -0
- sequenzo/dissimilarity_measures/src/xsimd/test/test_batch_constant.cpp +286 -0
- sequenzo/dissimilarity_measures/src/xsimd/test/test_batch_float.cpp +141 -0
- sequenzo/dissimilarity_measures/src/xsimd/test/test_batch_int.cpp +365 -0
- sequenzo/dissimilarity_measures/src/xsimd/test/test_batch_manip.cpp +308 -0
- sequenzo/dissimilarity_measures/src/xsimd/test/test_bitwise_cast.cpp +222 -0
- sequenzo/dissimilarity_measures/src/xsimd/test/test_complex_exponential.cpp +226 -0
- sequenzo/dissimilarity_measures/src/xsimd/test/test_complex_hyperbolic.cpp +183 -0
- sequenzo/dissimilarity_measures/src/xsimd/test/test_complex_power.cpp +265 -0
- sequenzo/dissimilarity_measures/src/xsimd/test/test_complex_trigonometric.cpp +236 -0
- sequenzo/dissimilarity_measures/src/xsimd/test/test_conversion.cpp +248 -0
- sequenzo/dissimilarity_measures/src/xsimd/test/test_custom_default_arch.cpp +28 -0
- sequenzo/dissimilarity_measures/src/xsimd/test/test_error_gamma.cpp +170 -0
- sequenzo/dissimilarity_measures/src/xsimd/test/test_explicit_batch_instantiation.cpp +32 -0
- sequenzo/dissimilarity_measures/src/xsimd/test/test_exponential.cpp +202 -0
- sequenzo/dissimilarity_measures/src/xsimd/test/test_extract_pair.cpp +92 -0
- sequenzo/dissimilarity_measures/src/xsimd/test/test_fp_manipulation.cpp +77 -0
- sequenzo/dissimilarity_measures/src/xsimd/test/test_gnu_source.cpp +30 -0
- sequenzo/dissimilarity_measures/src/xsimd/test/test_hyperbolic.cpp +167 -0
- sequenzo/dissimilarity_measures/src/xsimd/test/test_load_store.cpp +304 -0
- sequenzo/dissimilarity_measures/src/xsimd/test/test_memory.cpp +61 -0
- sequenzo/dissimilarity_measures/src/xsimd/test/test_poly_evaluation.cpp +64 -0
- sequenzo/dissimilarity_measures/src/xsimd/test/test_power.cpp +184 -0
- sequenzo/dissimilarity_measures/src/xsimd/test/test_rounding.cpp +199 -0
- sequenzo/dissimilarity_measures/src/xsimd/test/test_select.cpp +101 -0
- sequenzo/dissimilarity_measures/src/xsimd/test/test_shuffle.cpp +760 -0
- sequenzo/dissimilarity_measures/src/xsimd/test/test_sum.cpp +4 -0
- sequenzo/dissimilarity_measures/src/xsimd/test/test_sum.hpp +34 -0
- sequenzo/dissimilarity_measures/src/xsimd/test/test_traits.cpp +172 -0
- sequenzo/dissimilarity_measures/src/xsimd/test/test_trigonometric.cpp +208 -0
- sequenzo/dissimilarity_measures/src/xsimd/test/test_utils.hpp +611 -0
- sequenzo/dissimilarity_measures/src/xsimd/test/test_wasm/test_wasm_playwright.py +123 -0
- sequenzo/dissimilarity_measures/src/xsimd/test/test_xsimd_api.cpp +1460 -0
- sequenzo/dissimilarity_measures/utils/__init__.py +16 -0
- sequenzo/dissimilarity_measures/utils/get_LCP_length_for_2_seq.py +44 -0
- sequenzo/dissimilarity_measures/utils/get_sm_trate_substitution_cost_matrix.cpython-312-darwin.so +0 -0
- sequenzo/dissimilarity_measures/utils/seqconc.cpython-312-darwin.so +0 -0
- sequenzo/dissimilarity_measures/utils/seqdss.cpython-312-darwin.so +0 -0
- sequenzo/dissimilarity_measures/utils/seqdur.cpython-312-darwin.so +0 -0
- sequenzo/dissimilarity_measures/utils/seqlength.cpython-312-darwin.so +0 -0
- sequenzo/multidomain/__init__.py +23 -0
- sequenzo/multidomain/association_between_domains.py +311 -0
- sequenzo/multidomain/cat.py +431 -0
- sequenzo/multidomain/combt.py +519 -0
- sequenzo/multidomain/dat.py +89 -0
- sequenzo/multidomain/idcd.py +139 -0
- sequenzo/multidomain/linked_polyad.py +292 -0
- sequenzo/openmp_setup.py +233 -0
- sequenzo/prefix_tree/__init__.py +43 -0
- sequenzo/prefix_tree/individual_level_indicators.py +1274 -0
- sequenzo/prefix_tree/system_level_indicators.py +465 -0
- sequenzo/prefix_tree/utils.py +54 -0
- sequenzo/sequence_characteristics/__init__.py +40 -0
- sequenzo/sequence_characteristics/complexity_index.py +49 -0
- sequenzo/sequence_characteristics/overall_cross_sectional_entropy.py +220 -0
- sequenzo/sequence_characteristics/plot_characteristics.py +593 -0
- sequenzo/sequence_characteristics/simple_characteristics.py +311 -0
- sequenzo/sequence_characteristics/state_frequencies_and_entropy_per_sequence.py +39 -0
- sequenzo/sequence_characteristics/turbulence.py +155 -0
- sequenzo/sequence_characteristics/variance_of_spell_durations.py +86 -0
- sequenzo/sequence_characteristics/within_sequence_entropy.py +43 -0
- sequenzo/suffix_tree/__init__.py +48 -0
- sequenzo/suffix_tree/individual_level_indicators.py +1638 -0
- sequenzo/suffix_tree/system_level_indicators.py +456 -0
- sequenzo/suffix_tree/utils.py +56 -0
- sequenzo/visualization/__init__.py +29 -0
- sequenzo/visualization/plot_mean_time.py +194 -0
- sequenzo/visualization/plot_modal_state.py +276 -0
- sequenzo/visualization/plot_most_frequent_sequences.py +147 -0
- sequenzo/visualization/plot_relative_frequency.py +404 -0
- sequenzo/visualization/plot_sequence_index.py +937 -0
- sequenzo/visualization/plot_single_medoid.py +153 -0
- sequenzo/visualization/plot_state_distribution.py +613 -0
- sequenzo/visualization/plot_transition_matrix.py +190 -0
- sequenzo/visualization/utils/__init__.py +23 -0
- sequenzo/visualization/utils/utils.py +310 -0
- sequenzo/with_event_history_analysis/__init__.py +35 -0
- sequenzo/with_event_history_analysis/sequence_analysis_multi_state_model.py +850 -0
- sequenzo/with_event_history_analysis/sequence_history_analysis.py +283 -0
- sequenzo-0.1.21.dist-info/METADATA +308 -0
- sequenzo-0.1.21.dist-info/RECORD +254 -0
- sequenzo-0.1.21.dist-info/WHEEL +5 -0
- sequenzo-0.1.21.dist-info/licenses/LICENSE +28 -0
- sequenzo-0.1.21.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,1780 @@
|
|
|
1
|
+
/***************************************************************************
|
|
2
|
+
* Copyright (c) Johan Mabille, Sylvain Corlay, Wolf Vollprecht and *
|
|
3
|
+
* Martin Renou *
|
|
4
|
+
* Copyright (c) QuantStack *
|
|
5
|
+
* Copyright (c) Serge Guelton *
|
|
6
|
+
* Copyright (c) Anutosh Bhat *
|
|
7
|
+
* *
|
|
8
|
+
* Distributed under the terms of the BSD 3-Clause License. *
|
|
9
|
+
* *
|
|
10
|
+
* The full license is in the file LICENSE, distributed with this software. *
|
|
11
|
+
****************************************************************************/
|
|
12
|
+
|
|
13
|
+
#ifndef XSIMD_WASM_HPP
|
|
14
|
+
#define XSIMD_WASM_HPP
|
|
15
|
+
|
|
16
|
+
#include <type_traits>
|
|
17
|
+
|
|
18
|
+
#include "../types/xsimd_wasm_register.hpp"
|
|
19
|
+
|
|
20
|
+
namespace xsimd
|
|
21
|
+
{
|
|
22
|
+
template <typename T, class A, bool... Values>
|
|
23
|
+
struct batch_bool_constant;
|
|
24
|
+
|
|
25
|
+
template <class T_out, class T_in, class A>
|
|
26
|
+
XSIMD_INLINE batch<T_out, A> bitwise_cast(batch<T_in, A> const& x) noexcept;
|
|
27
|
+
|
|
28
|
+
template <typename T, class A, T... Values>
|
|
29
|
+
struct batch_constant;
|
|
30
|
+
|
|
31
|
+
namespace kernel
|
|
32
|
+
{
|
|
33
|
+
using namespace types;
|
|
34
|
+
|
|
35
|
+
// fwd
|
|
36
|
+
template <class A, class T, size_t I>
|
|
37
|
+
XSIMD_INLINE batch<T, A> insert(batch<T, A> const& self, T val, index<I>, requires_arch<common>) noexcept;
|
|
38
|
+
template <class A, typename T, typename ITy, ITy... Indices>
|
|
39
|
+
XSIMD_INLINE batch<T, A> shuffle(batch<T, A> const& x, batch<T, A> const& y, batch_constant<ITy, A, Indices...>, requires_arch<common>) noexcept;
|
|
40
|
+
template <class A, class T>
|
|
41
|
+
XSIMD_INLINE batch<T, A> avg(batch<T, A> const&, batch<T, A> const&, requires_arch<common>) noexcept;
|
|
42
|
+
template <class A, class T>
|
|
43
|
+
XSIMD_INLINE void transpose(batch<T, A>* matrix_begin, batch<T, A>* matrix_end, requires_arch<common>) noexcept;
|
|
44
|
+
|
|
45
|
+
// abs
|
|
46
|
+
template <class A, class T, typename std::enable_if<std::is_integral<T>::value && std::is_signed<T>::value, void>::type>
|
|
47
|
+
XSIMD_INLINE batch<T, A> abs(batch<T, A> const& self, requires_arch<wasm>) noexcept
|
|
48
|
+
{
|
|
49
|
+
XSIMD_IF_CONSTEXPR(sizeof(T) == 1)
|
|
50
|
+
{
|
|
51
|
+
return wasm_i8x16_abs(self);
|
|
52
|
+
}
|
|
53
|
+
else XSIMD_IF_CONSTEXPR(sizeof(T) == 2)
|
|
54
|
+
{
|
|
55
|
+
return wasm_i16x8_abs(self);
|
|
56
|
+
}
|
|
57
|
+
else XSIMD_IF_CONSTEXPR(sizeof(T) == 4)
|
|
58
|
+
{
|
|
59
|
+
return wasm_i32x4_abs(self);
|
|
60
|
+
}
|
|
61
|
+
else XSIMD_IF_CONSTEXPR(sizeof(T) == 8)
|
|
62
|
+
{
|
|
63
|
+
return wasm_i64x2_abs(self);
|
|
64
|
+
}
|
|
65
|
+
else
|
|
66
|
+
{
|
|
67
|
+
assert(false && "unsupported arch/op combination");
|
|
68
|
+
return {};
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
template <class A>
|
|
73
|
+
XSIMD_INLINE batch<float, A> abs(batch<float, A> const& self, requires_arch<wasm>) noexcept
|
|
74
|
+
{
|
|
75
|
+
return wasm_f32x4_abs(self);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
template <class A>
|
|
79
|
+
XSIMD_INLINE batch<double, A> abs(batch<double, A> const& self, requires_arch<wasm>) noexcept
|
|
80
|
+
{
|
|
81
|
+
return wasm_f64x2_abs(self);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// add
|
|
85
|
+
template <class A, class T, class = typename std::enable_if<std::is_integral<T>::value, void>::type>
|
|
86
|
+
XSIMD_INLINE batch<T, A> add(batch<T, A> const& self, batch<T, A> const& other, requires_arch<wasm>) noexcept
|
|
87
|
+
{
|
|
88
|
+
XSIMD_IF_CONSTEXPR(sizeof(T) == 1)
|
|
89
|
+
{
|
|
90
|
+
return wasm_i8x16_add(self, other);
|
|
91
|
+
}
|
|
92
|
+
else XSIMD_IF_CONSTEXPR(sizeof(T) == 2)
|
|
93
|
+
{
|
|
94
|
+
return wasm_i16x8_add(self, other);
|
|
95
|
+
}
|
|
96
|
+
else XSIMD_IF_CONSTEXPR(sizeof(T) == 4)
|
|
97
|
+
{
|
|
98
|
+
return wasm_i32x4_add(self, other);
|
|
99
|
+
}
|
|
100
|
+
else XSIMD_IF_CONSTEXPR(sizeof(T) == 8)
|
|
101
|
+
{
|
|
102
|
+
return wasm_i64x2_add(self, other);
|
|
103
|
+
}
|
|
104
|
+
else
|
|
105
|
+
{
|
|
106
|
+
assert(false && "unsupported arch/op combination");
|
|
107
|
+
return {};
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
template <class A>
|
|
112
|
+
XSIMD_INLINE batch<float, A> add(batch<float, A> const& self, batch<float, A> const& other, requires_arch<wasm>) noexcept
|
|
113
|
+
{
|
|
114
|
+
return wasm_f32x4_add(self, other);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
template <class A>
|
|
118
|
+
XSIMD_INLINE batch<double, A> add(batch<double, A> const& self, batch<double, A> const& other, requires_arch<wasm>) noexcept
|
|
119
|
+
{
|
|
120
|
+
return wasm_f64x2_add(self, other);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
// avgr
|
|
124
|
+
template <class A, class T, class = typename std::enable_if<std::is_unsigned<T>::value, void>::type>
|
|
125
|
+
XSIMD_INLINE batch<T, A> avgr(batch<T, A> const& self, batch<T, A> const& other, requires_arch<wasm>) noexcept
|
|
126
|
+
{
|
|
127
|
+
XSIMD_IF_CONSTEXPR(sizeof(T) == 1)
|
|
128
|
+
{
|
|
129
|
+
return wasm_u8x16_avgr(self, other);
|
|
130
|
+
}
|
|
131
|
+
else XSIMD_IF_CONSTEXPR(sizeof(T) == 2)
|
|
132
|
+
{
|
|
133
|
+
return wasm_u16x8_avgr(self, other);
|
|
134
|
+
}
|
|
135
|
+
else
|
|
136
|
+
{
|
|
137
|
+
return avgr(self, other, common {});
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
// avg
|
|
142
|
+
template <class A, class T, class = typename std::enable_if<std::is_unsigned<T>::value, void>::type>
|
|
143
|
+
XSIMD_INLINE batch<T, A> avg(batch<T, A> const& self, batch<T, A> const& other, requires_arch<wasm>) noexcept
|
|
144
|
+
{
|
|
145
|
+
XSIMD_IF_CONSTEXPR(sizeof(T) == 1)
|
|
146
|
+
{
|
|
147
|
+
auto adj = ((self ^ other) << 7) >> 7;
|
|
148
|
+
return avgr(self, other, A {}) - adj;
|
|
149
|
+
}
|
|
150
|
+
else XSIMD_IF_CONSTEXPR(sizeof(T) == 2)
|
|
151
|
+
{
|
|
152
|
+
auto adj = ((self ^ other) << 15) >> 15;
|
|
153
|
+
return avgr(self, other, A {}) - adj;
|
|
154
|
+
}
|
|
155
|
+
else
|
|
156
|
+
{
|
|
157
|
+
return avg(self, other, common {});
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
// all
|
|
162
|
+
template <class A>
|
|
163
|
+
XSIMD_INLINE bool all(batch_bool<float, A> const& self, requires_arch<wasm>) noexcept
|
|
164
|
+
{
|
|
165
|
+
return wasm_i32x4_bitmask(self) == 0x0F;
|
|
166
|
+
}
|
|
167
|
+
template <class A>
|
|
168
|
+
XSIMD_INLINE bool all(batch_bool<double, A> const& self, requires_arch<wasm>) noexcept
|
|
169
|
+
{
|
|
170
|
+
return wasm_i64x2_bitmask(self) == 0x03;
|
|
171
|
+
}
|
|
172
|
+
template <class A, class T, class = typename std::enable_if<std::is_integral<T>::value, void>::type>
|
|
173
|
+
XSIMD_INLINE bool all(batch_bool<T, A> const& self, requires_arch<wasm>) noexcept
|
|
174
|
+
{
|
|
175
|
+
return wasm_i8x16_bitmask(self) == 0xFFFF;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
// any
|
|
179
|
+
template <class A>
|
|
180
|
+
XSIMD_INLINE bool any(batch_bool<float, A> const& self, requires_arch<wasm>) noexcept
|
|
181
|
+
{
|
|
182
|
+
return wasm_i32x4_bitmask(self) != 0;
|
|
183
|
+
}
|
|
184
|
+
template <class A>
|
|
185
|
+
XSIMD_INLINE bool any(batch_bool<double, A> const& self, requires_arch<wasm>) noexcept
|
|
186
|
+
{
|
|
187
|
+
return wasm_i64x2_bitmask(self) != 0;
|
|
188
|
+
}
|
|
189
|
+
template <class A, class T, class = typename std::enable_if<std::is_integral<T>::value, void>::type>
|
|
190
|
+
XSIMD_INLINE bool any(batch_bool<T, A> const& self, requires_arch<wasm>) noexcept
|
|
191
|
+
{
|
|
192
|
+
return wasm_i8x16_bitmask(self) != 0;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
// batch_bool_cast
|
|
196
|
+
template <class A, class T_out, class T_in>
|
|
197
|
+
XSIMD_INLINE batch_bool<T_out, A> batch_bool_cast(batch_bool<T_in, A> const& self, batch_bool<T_out, A> const&, requires_arch<wasm>) noexcept
|
|
198
|
+
{
|
|
199
|
+
return { bitwise_cast<T_out>(batch<T_in, A>(self.data)).data };
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
// bitwise_and
|
|
203
|
+
template <class A, class T>
|
|
204
|
+
XSIMD_INLINE batch<T, A> bitwise_and(batch<T, A> const& self, batch<T, A> const& other, requires_arch<wasm>) noexcept
|
|
205
|
+
{
|
|
206
|
+
return wasm_v128_and(self, other);
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
template <class A, class T>
|
|
210
|
+
XSIMD_INLINE batch_bool<T, A> bitwise_and(batch_bool<T, A> const& self, batch_bool<T, A> const& other, requires_arch<wasm>) noexcept
|
|
211
|
+
{
|
|
212
|
+
return wasm_v128_and(self, other);
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
// bitwise_andnot
|
|
216
|
+
template <class A, class T>
|
|
217
|
+
XSIMD_INLINE batch<T, A> bitwise_andnot(batch<T, A> const& self, batch<T, A> const& other, requires_arch<wasm>) noexcept
|
|
218
|
+
{
|
|
219
|
+
return wasm_v128_andnot(self, other);
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
template <class A, class T>
|
|
223
|
+
XSIMD_INLINE batch_bool<T, A> bitwise_andnot(batch_bool<T, A> const& self, batch_bool<T, A> const& other, requires_arch<wasm>) noexcept
|
|
224
|
+
{
|
|
225
|
+
return wasm_v128_andnot(self, other);
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
// bitwise_cast
|
|
229
|
+
template <class A, class T, class Tp>
|
|
230
|
+
XSIMD_INLINE batch<Tp, A> bitwise_cast(batch<T, A> const& self, batch<Tp, A> const&, requires_arch<wasm>) noexcept
|
|
231
|
+
{
|
|
232
|
+
return batch<Tp, A>(self.data);
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
// bitwise_or
|
|
236
|
+
template <class A, class T>
|
|
237
|
+
XSIMD_INLINE batch<T, A> bitwise_or(batch<T, A> const& self, batch<T, A> const& other, requires_arch<wasm>) noexcept
|
|
238
|
+
{
|
|
239
|
+
return wasm_v128_or(self, other);
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
template <class A, class T>
|
|
243
|
+
XSIMD_INLINE batch_bool<T, A> bitwise_or(batch_bool<T, A> const& self, batch_bool<T, A> const& other, requires_arch<wasm>) noexcept
|
|
244
|
+
{
|
|
245
|
+
return wasm_v128_or(self, other);
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
// bitwise_lshift
|
|
249
|
+
template <class A, class T, class = typename std::enable_if<std::is_integral<T>::value, void>::type>
|
|
250
|
+
XSIMD_INLINE batch<T, A> bitwise_lshift(batch<T, A> const& self, int32_t other, requires_arch<wasm>) noexcept
|
|
251
|
+
{
|
|
252
|
+
XSIMD_IF_CONSTEXPR(sizeof(T) == 1)
|
|
253
|
+
{
|
|
254
|
+
return wasm_i8x16_shl(self, other);
|
|
255
|
+
}
|
|
256
|
+
else XSIMD_IF_CONSTEXPR(sizeof(T) == 2)
|
|
257
|
+
{
|
|
258
|
+
return wasm_i16x8_shl(self, other);
|
|
259
|
+
}
|
|
260
|
+
else XSIMD_IF_CONSTEXPR(sizeof(T) == 4)
|
|
261
|
+
{
|
|
262
|
+
return wasm_i32x4_shl(self, other);
|
|
263
|
+
}
|
|
264
|
+
else XSIMD_IF_CONSTEXPR(sizeof(T) == 8)
|
|
265
|
+
{
|
|
266
|
+
return wasm_i64x2_shl(self, other);
|
|
267
|
+
}
|
|
268
|
+
else
|
|
269
|
+
{
|
|
270
|
+
assert(false && "unsupported arch/op combination");
|
|
271
|
+
return {};
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
// bitwise_rshift
|
|
276
|
+
template <class A, class T, class = typename std::enable_if<std::is_integral<T>::value, void>::type>
|
|
277
|
+
XSIMD_INLINE batch<T, A> bitwise_rshift(batch<T, A> const& self, int32_t other, requires_arch<wasm>) noexcept
|
|
278
|
+
{
|
|
279
|
+
if (std::is_signed<T>::value)
|
|
280
|
+
{
|
|
281
|
+
XSIMD_IF_CONSTEXPR(sizeof(T) == 1)
|
|
282
|
+
{
|
|
283
|
+
return wasm_i8x16_shr(self, other);
|
|
284
|
+
}
|
|
285
|
+
else XSIMD_IF_CONSTEXPR(sizeof(T) == 2)
|
|
286
|
+
{
|
|
287
|
+
return wasm_i16x8_shr(self, other);
|
|
288
|
+
}
|
|
289
|
+
else XSIMD_IF_CONSTEXPR(sizeof(T) == 4)
|
|
290
|
+
{
|
|
291
|
+
return wasm_i32x4_shr(self, other);
|
|
292
|
+
}
|
|
293
|
+
else XSIMD_IF_CONSTEXPR(sizeof(T) == 8)
|
|
294
|
+
{
|
|
295
|
+
return wasm_i64x2_shr(self, other);
|
|
296
|
+
}
|
|
297
|
+
else
|
|
298
|
+
{
|
|
299
|
+
assert(false && "unsupported arch/op combination");
|
|
300
|
+
return {};
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
else
|
|
304
|
+
{
|
|
305
|
+
XSIMD_IF_CONSTEXPR(sizeof(T) == 1)
|
|
306
|
+
{
|
|
307
|
+
return wasm_u8x16_shr(self, other);
|
|
308
|
+
}
|
|
309
|
+
else XSIMD_IF_CONSTEXPR(sizeof(T) == 2)
|
|
310
|
+
{
|
|
311
|
+
return wasm_u16x8_shr(self, other);
|
|
312
|
+
}
|
|
313
|
+
else XSIMD_IF_CONSTEXPR(sizeof(T) == 4)
|
|
314
|
+
{
|
|
315
|
+
return wasm_u32x4_shr(self, other);
|
|
316
|
+
}
|
|
317
|
+
else XSIMD_IF_CONSTEXPR(sizeof(T) == 8)
|
|
318
|
+
{
|
|
319
|
+
return wasm_u64x2_shr(self, other);
|
|
320
|
+
}
|
|
321
|
+
else
|
|
322
|
+
{
|
|
323
|
+
assert(false && "unsupported arch/op combination");
|
|
324
|
+
return {};
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
// bitwise_not
|
|
330
|
+
template <class A, class T>
|
|
331
|
+
XSIMD_INLINE batch<T, A> bitwise_not(batch<T, A> const& self, requires_arch<wasm>) noexcept
|
|
332
|
+
{
|
|
333
|
+
return wasm_v128_not(self);
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
template <class A, class T>
|
|
337
|
+
XSIMD_INLINE batch_bool<T, A> bitwise_not(batch_bool<T, A> const& self, requires_arch<wasm>) noexcept
|
|
338
|
+
{
|
|
339
|
+
return wasm_v128_not(self);
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
// bitwise_xor
|
|
343
|
+
template <class A, class T>
|
|
344
|
+
XSIMD_INLINE batch<T, A> bitwise_xor(batch<T, A> const& self, batch<T, A> const& other, requires_arch<wasm>) noexcept
|
|
345
|
+
{
|
|
346
|
+
return wasm_v128_xor(self, other);
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
template <class A, class T>
|
|
350
|
+
XSIMD_INLINE batch_bool<T, A> bitwise_xor(batch_bool<T, A> const& self, batch_bool<T, A> const& other, requires_arch<wasm>) noexcept
|
|
351
|
+
{
|
|
352
|
+
return wasm_v128_xor(self, other);
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
// broadcast
|
|
356
|
+
template <class A>
|
|
357
|
+
batch<float, A> XSIMD_INLINE broadcast(float val, requires_arch<wasm>) noexcept
|
|
358
|
+
{
|
|
359
|
+
return wasm_f32x4_splat(val);
|
|
360
|
+
}
|
|
361
|
+
template <class A, class T, class = typename std::enable_if<std::is_integral<T>::value, void>::type>
|
|
362
|
+
XSIMD_INLINE batch<T, A> broadcast(T val, requires_arch<wasm>) noexcept
|
|
363
|
+
{
|
|
364
|
+
XSIMD_IF_CONSTEXPR(sizeof(T) == 1)
|
|
365
|
+
{
|
|
366
|
+
return wasm_i8x16_splat(val);
|
|
367
|
+
}
|
|
368
|
+
else XSIMD_IF_CONSTEXPR(sizeof(T) == 2)
|
|
369
|
+
{
|
|
370
|
+
return wasm_i16x8_splat(val);
|
|
371
|
+
}
|
|
372
|
+
else XSIMD_IF_CONSTEXPR(sizeof(T) == 4)
|
|
373
|
+
{
|
|
374
|
+
return wasm_i32x4_splat(val);
|
|
375
|
+
}
|
|
376
|
+
else XSIMD_IF_CONSTEXPR(sizeof(T) == 8)
|
|
377
|
+
{
|
|
378
|
+
return wasm_i64x2_splat(val);
|
|
379
|
+
}
|
|
380
|
+
else
|
|
381
|
+
{
|
|
382
|
+
assert(false && "unsupported arch/op combination");
|
|
383
|
+
return {};
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
template <class A>
|
|
387
|
+
XSIMD_INLINE batch<double, A> broadcast(double val, requires_arch<wasm>) noexcept
|
|
388
|
+
{
|
|
389
|
+
return wasm_f64x2_splat(val);
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
// ceil
|
|
393
|
+
template <class A>
|
|
394
|
+
XSIMD_INLINE batch<float, A> ceil(batch<float, A> const& self, requires_arch<wasm>) noexcept
|
|
395
|
+
{
|
|
396
|
+
return wasm_f32x4_ceil(self);
|
|
397
|
+
}
|
|
398
|
+
template <class A>
|
|
399
|
+
XSIMD_INLINE batch<double, A> ceil(batch<double, A> const& self, requires_arch<wasm>) noexcept
|
|
400
|
+
{
|
|
401
|
+
return wasm_f64x2_ceil(self);
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
// div
|
|
405
|
+
template <class A>
|
|
406
|
+
XSIMD_INLINE batch<float, A> div(batch<float, A> const& self, batch<float, A> const& other, requires_arch<wasm>) noexcept
|
|
407
|
+
{
|
|
408
|
+
return wasm_f32x4_div(self, other);
|
|
409
|
+
}
|
|
410
|
+
template <class A>
|
|
411
|
+
XSIMD_INLINE batch<double, A> div(batch<double, A> const& self, batch<double, A> const& other, requires_arch<wasm>) noexcept
|
|
412
|
+
{
|
|
413
|
+
return wasm_f64x2_div(self, other);
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
// eq
|
|
417
|
+
template <class A>
|
|
418
|
+
XSIMD_INLINE batch_bool<float, A> eq(batch<float, A> const& self, batch<float, A> const& other, requires_arch<wasm>) noexcept
|
|
419
|
+
{
|
|
420
|
+
return wasm_f32x4_eq(self, other);
|
|
421
|
+
}
|
|
422
|
+
template <class A>
|
|
423
|
+
XSIMD_INLINE batch_bool<float, A> eq(batch_bool<float, A> const& self, batch_bool<float, A> const& other, requires_arch<wasm>) noexcept
|
|
424
|
+
{
|
|
425
|
+
return wasm_i32x4_eq(self, other);
|
|
426
|
+
}
|
|
427
|
+
template <class A, class T, class = typename std::enable_if<std::is_integral<T>::value, void>::type>
|
|
428
|
+
XSIMD_INLINE batch_bool<T, A> eq(batch<T, A> const& self, batch<T, A> const& other, requires_arch<wasm>) noexcept
|
|
429
|
+
{
|
|
430
|
+
XSIMD_IF_CONSTEXPR(sizeof(T) == 1)
|
|
431
|
+
{
|
|
432
|
+
return wasm_i8x16_eq(self, other);
|
|
433
|
+
}
|
|
434
|
+
else XSIMD_IF_CONSTEXPR(sizeof(T) == 2)
|
|
435
|
+
{
|
|
436
|
+
return wasm_i16x8_eq(self, other);
|
|
437
|
+
}
|
|
438
|
+
else XSIMD_IF_CONSTEXPR(sizeof(T) == 4)
|
|
439
|
+
{
|
|
440
|
+
return wasm_i32x4_eq(self, other);
|
|
441
|
+
}
|
|
442
|
+
else XSIMD_IF_CONSTEXPR(sizeof(T) == 8)
|
|
443
|
+
{
|
|
444
|
+
return wasm_i64x2_eq(self, other);
|
|
445
|
+
}
|
|
446
|
+
else
|
|
447
|
+
{
|
|
448
|
+
assert(false && "unsupported arch/op combination");
|
|
449
|
+
return {};
|
|
450
|
+
}
|
|
451
|
+
}
|
|
452
|
+
template <class A, class T, class = typename std::enable_if<std::is_integral<T>::value, void>::type>
|
|
453
|
+
XSIMD_INLINE batch_bool<T, A> eq(batch_bool<T, A> const& self, batch_bool<T, A> const& other, requires_arch<wasm>) noexcept
|
|
454
|
+
{
|
|
455
|
+
XSIMD_IF_CONSTEXPR(sizeof(T) == 1)
|
|
456
|
+
{
|
|
457
|
+
return wasm_i8x16_eq(self, other);
|
|
458
|
+
}
|
|
459
|
+
else XSIMD_IF_CONSTEXPR(sizeof(T) == 2)
|
|
460
|
+
{
|
|
461
|
+
return wasm_i16x8_eq(self, other);
|
|
462
|
+
}
|
|
463
|
+
else XSIMD_IF_CONSTEXPR(sizeof(T) == 4)
|
|
464
|
+
{
|
|
465
|
+
return wasm_i32x4_eq(self, other);
|
|
466
|
+
}
|
|
467
|
+
else XSIMD_IF_CONSTEXPR(sizeof(T) == 8)
|
|
468
|
+
{
|
|
469
|
+
return wasm_i64x2_eq(self, other);
|
|
470
|
+
}
|
|
471
|
+
else
|
|
472
|
+
{
|
|
473
|
+
assert(false && "unsupported arch/op combination");
|
|
474
|
+
return {};
|
|
475
|
+
}
|
|
476
|
+
}
|
|
477
|
+
template <class A>
|
|
478
|
+
XSIMD_INLINE batch_bool<double, A> eq(batch<double, A> const& self, batch<double, A> const& other, requires_arch<wasm>) noexcept
|
|
479
|
+
{
|
|
480
|
+
return wasm_f64x2_eq(self, other);
|
|
481
|
+
}
|
|
482
|
+
template <class A>
|
|
483
|
+
XSIMD_INLINE batch_bool<double, A> eq(batch_bool<double, A> const& self, batch_bool<double, A> const& other, requires_arch<wasm>) noexcept
|
|
484
|
+
{
|
|
485
|
+
return wasm_i64x2_eq(self, other);
|
|
486
|
+
}
|
|
487
|
+
|
|
488
|
+
// fast_cast
|
|
489
|
+
namespace detail
|
|
490
|
+
{
|
|
491
|
+
template <class A>
|
|
492
|
+
XSIMD_INLINE batch<float, A> fast_cast(batch<int32_t, A> const& self, batch<float, A> const&, requires_arch<wasm>) noexcept
|
|
493
|
+
{
|
|
494
|
+
return wasm_f32x4_convert_i32x4(self);
|
|
495
|
+
}
|
|
496
|
+
|
|
497
|
+
template <class A>
|
|
498
|
+
XSIMD_INLINE batch<double, A> fast_cast(batch<uint64_t, A> const& x, batch<double, A> const&, requires_arch<wasm>) noexcept
|
|
499
|
+
{
|
|
500
|
+
// from https://stackoverflow.com/questions/41144668/how-to-efficiently-perform-double-int64-conversions-with-sse-avx
|
|
501
|
+
// adapted to wasm
|
|
502
|
+
v128_t xH = wasm_u64x2_shr(x, 32);
|
|
503
|
+
xH = wasm_v128_or(xH, wasm_f64x2_splat(19342813113834066795298816.)); // 2^84
|
|
504
|
+
v128_t mask = wasm_i16x8_make(0xFFFF, 0xFFFF, 0x0000, 0x0000, 0xFFFF, 0xFFFF, 0x0000, 0x0000);
|
|
505
|
+
v128_t xL = wasm_v128_or(wasm_v128_and(mask, x), wasm_v128_andnot(wasm_f64x2_splat(0x0010000000000000), mask)); // 2^52
|
|
506
|
+
v128_t f = wasm_f64x2_sub(xH, wasm_f64x2_splat(19342813118337666422669312.)); // 2^84 + 2^52
|
|
507
|
+
return wasm_f64x2_add(f, xL);
|
|
508
|
+
}
|
|
509
|
+
|
|
510
|
+
template <class A>
|
|
511
|
+
XSIMD_INLINE batch<double, A> fast_cast(batch<int64_t, A> const& x, batch<double, A> const&, requires_arch<wasm>) noexcept
|
|
512
|
+
{
|
|
513
|
+
// from https://stackoverflow.com/questions/41144668/how-to-efficiently-perform-double-int64-conversions-with-sse-avx
|
|
514
|
+
// adapted to wasm
|
|
515
|
+
v128_t xH = wasm_i32x4_shr(x, 16);
|
|
516
|
+
xH = wasm_v128_and(xH, wasm_i16x8_make(0x0000, 0x0000, 0xFFFF, 0xFFFF, 0x0000, 0x0000, 0xFFFF, 0xFFFF));
|
|
517
|
+
xH = wasm_i64x2_add(xH, wasm_f64x2_splat(442721857769029238784.)); // 3*2^67
|
|
518
|
+
v128_t mask = wasm_i16x8_make(0xFFFF, 0xFFFF, 0xFFFF, 0x0000, 0xFFFF, 0xFFFF, 0xFFFF, 0x0000);
|
|
519
|
+
v128_t xL = wasm_v128_or(wasm_v128_and(mask, x), wasm_v128_andnot(wasm_f64x2_splat(0x0010000000000000), mask)); // 2^52
|
|
520
|
+
v128_t f = wasm_f64x2_sub(xH, wasm_f64x2_splat(442726361368656609280.)); // 3*2^67 + 2^52
|
|
521
|
+
return wasm_f64x2_add(f, xL);
|
|
522
|
+
}
|
|
523
|
+
|
|
524
|
+
template <class A>
|
|
525
|
+
XSIMD_INLINE batch<int32_t, A> fast_cast(batch<float, A> const& self, batch<int32_t, A> const&, requires_arch<wasm>) noexcept
|
|
526
|
+
{
|
|
527
|
+
return wasm_i32x4_make(
|
|
528
|
+
static_cast<int32_t>(wasm_f32x4_extract_lane(self, 0)),
|
|
529
|
+
static_cast<int32_t>(wasm_f32x4_extract_lane(self, 1)),
|
|
530
|
+
static_cast<int32_t>(wasm_f32x4_extract_lane(self, 2)),
|
|
531
|
+
static_cast<int32_t>(wasm_f32x4_extract_lane(self, 3)));
|
|
532
|
+
}
|
|
533
|
+
}
|
|
534
|
+
// first
|
|
535
|
+
template <class A>
|
|
536
|
+
XSIMD_INLINE float first(batch<float, A> const& self, requires_arch<wasm>) noexcept
|
|
537
|
+
{
|
|
538
|
+
return wasm_f32x4_extract_lane(self, 0);
|
|
539
|
+
}
|
|
540
|
+
template <class A, class T, class = typename std::enable_if<std::is_integral<T>::value, void>::type>
|
|
541
|
+
XSIMD_INLINE T first(batch<T, A> const& self, requires_arch<wasm>) noexcept
|
|
542
|
+
{
|
|
543
|
+
XSIMD_IF_CONSTEXPR(sizeof(T) == 1)
|
|
544
|
+
{
|
|
545
|
+
return wasm_i8x16_extract_lane(self, 0);
|
|
546
|
+
}
|
|
547
|
+
else XSIMD_IF_CONSTEXPR(sizeof(T) == 2)
|
|
548
|
+
{
|
|
549
|
+
return wasm_i16x8_extract_lane(self, 0);
|
|
550
|
+
}
|
|
551
|
+
else XSIMD_IF_CONSTEXPR(sizeof(T) == 4)
|
|
552
|
+
{
|
|
553
|
+
return wasm_i32x4_extract_lane(self, 0);
|
|
554
|
+
}
|
|
555
|
+
else XSIMD_IF_CONSTEXPR(sizeof(T) == 8)
|
|
556
|
+
{
|
|
557
|
+
return wasm_i64x2_extract_lane(self, 0);
|
|
558
|
+
}
|
|
559
|
+
else
|
|
560
|
+
{
|
|
561
|
+
assert(false && "unsupported arch/op combination");
|
|
562
|
+
return {};
|
|
563
|
+
}
|
|
564
|
+
}
|
|
565
|
+
template <class A>
|
|
566
|
+
XSIMD_INLINE double first(batch<double, A> const& self, requires_arch<wasm>) noexcept
|
|
567
|
+
{
|
|
568
|
+
return wasm_f64x2_extract_lane(self, 0);
|
|
569
|
+
}
|
|
570
|
+
|
|
571
|
+
// floor
|
|
572
|
+
template <class A>
|
|
573
|
+
XSIMD_INLINE batch<float, A> floor(batch<float, A> const& self, requires_arch<wasm>) noexcept
|
|
574
|
+
{
|
|
575
|
+
return wasm_f32x4_floor(self);
|
|
576
|
+
}
|
|
577
|
+
|
|
578
|
+
template <class A>
|
|
579
|
+
XSIMD_INLINE batch<double, A> floor(batch<double, A> const& self, requires_arch<wasm>) noexcept
|
|
580
|
+
{
|
|
581
|
+
return wasm_f64x2_floor(self);
|
|
582
|
+
}
|
|
583
|
+
|
|
584
|
+
// from_mask
|
|
585
|
+
template <class A>
|
|
586
|
+
XSIMD_INLINE batch_bool<float, A> from_mask(batch_bool<float, A> const&, uint64_t mask, requires_arch<wasm>) noexcept
|
|
587
|
+
{
|
|
588
|
+
alignas(A::alignment()) static const uint32_t lut[][4] = {
|
|
589
|
+
{ 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
|
|
590
|
+
{ 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000 },
|
|
591
|
+
{ 0x00000000, 0xFFFFFFFF, 0x00000000, 0x00000000 },
|
|
592
|
+
{ 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000 },
|
|
593
|
+
{ 0x00000000, 0x00000000, 0xFFFFFFFF, 0x00000000 },
|
|
594
|
+
{ 0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000 },
|
|
595
|
+
{ 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000 },
|
|
596
|
+
{ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000 },
|
|
597
|
+
{ 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF },
|
|
598
|
+
{ 0xFFFFFFFF, 0x00000000, 0x00000000, 0xFFFFFFFF },
|
|
599
|
+
{ 0x00000000, 0xFFFFFFFF, 0x00000000, 0xFFFFFFFF },
|
|
600
|
+
{ 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0xFFFFFFFF },
|
|
601
|
+
{ 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF },
|
|
602
|
+
{ 0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF },
|
|
603
|
+
{ 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF },
|
|
604
|
+
{ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF },
|
|
605
|
+
};
|
|
606
|
+
assert(!(mask & ~0xFul) && "inbound mask");
|
|
607
|
+
return wasm_v128_load((const v128_t*)lut[mask]);
|
|
608
|
+
}
|
|
609
|
+
template <class A>
|
|
610
|
+
XSIMD_INLINE batch_bool<double, A> from_mask(batch_bool<double, A> const&, uint64_t mask, requires_arch<wasm>) noexcept
|
|
611
|
+
{
|
|
612
|
+
alignas(A::alignment()) static const uint64_t lut[][4] = {
|
|
613
|
+
{ 0x0000000000000000ul, 0x0000000000000000ul },
|
|
614
|
+
{ 0xFFFFFFFFFFFFFFFFul, 0x0000000000000000ul },
|
|
615
|
+
{ 0x0000000000000000ul, 0xFFFFFFFFFFFFFFFFul },
|
|
616
|
+
{ 0xFFFFFFFFFFFFFFFFul, 0xFFFFFFFFFFFFFFFFul },
|
|
617
|
+
};
|
|
618
|
+
assert(!(mask & ~0x3ul) && "inbound mask");
|
|
619
|
+
return wasm_v128_load((const v128_t*)lut[mask]);
|
|
620
|
+
}
|
|
621
|
+
template <class T, class A, class = typename std::enable_if<std::is_integral<T>::value, void>::type>
|
|
622
|
+
XSIMD_INLINE batch_bool<T, A> from_mask(batch_bool<T, A> const&, uint64_t mask, requires_arch<wasm>) noexcept
|
|
623
|
+
{
|
|
624
|
+
alignas(A::alignment()) static const uint64_t lut64[] = {
|
|
625
|
+
0x0000000000000000,
|
|
626
|
+
0x000000000000FFFF,
|
|
627
|
+
0x00000000FFFF0000,
|
|
628
|
+
0x00000000FFFFFFFF,
|
|
629
|
+
0x0000FFFF00000000,
|
|
630
|
+
0x0000FFFF0000FFFF,
|
|
631
|
+
0x0000FFFFFFFF0000,
|
|
632
|
+
0x0000FFFFFFFFFFFF,
|
|
633
|
+
0xFFFF000000000000,
|
|
634
|
+
0xFFFF00000000FFFF,
|
|
635
|
+
0xFFFF0000FFFF0000,
|
|
636
|
+
0xFFFF0000FFFFFFFF,
|
|
637
|
+
0xFFFFFFFF00000000,
|
|
638
|
+
0xFFFFFFFF0000FFFF,
|
|
639
|
+
0xFFFFFFFFFFFF0000,
|
|
640
|
+
0xFFFFFFFFFFFFFFFF,
|
|
641
|
+
};
|
|
642
|
+
alignas(A::alignment()) static const uint32_t lut32[] = {
|
|
643
|
+
0x00000000,
|
|
644
|
+
0x000000FF,
|
|
645
|
+
0x0000FF00,
|
|
646
|
+
0x0000FFFF,
|
|
647
|
+
0x00FF0000,
|
|
648
|
+
0x00FF00FF,
|
|
649
|
+
0x00FFFF00,
|
|
650
|
+
0x00FFFFFF,
|
|
651
|
+
0xFF000000,
|
|
652
|
+
0xFF0000FF,
|
|
653
|
+
0xFF00FF00,
|
|
654
|
+
0xFF00FFFF,
|
|
655
|
+
0xFFFF0000,
|
|
656
|
+
0xFFFF00FF,
|
|
657
|
+
0xFFFFFF00,
|
|
658
|
+
0xFFFFFFFF,
|
|
659
|
+
};
|
|
660
|
+
alignas(A::alignment()) static const uint32_t lut16[][4] = {
|
|
661
|
+
{ 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
|
|
662
|
+
{ 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000 },
|
|
663
|
+
{ 0x00000000, 0xFFFFFFFF, 0x00000000, 0x00000000 },
|
|
664
|
+
{ 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000 },
|
|
665
|
+
{ 0x00000000, 0x00000000, 0xFFFFFFFF, 0x00000000 },
|
|
666
|
+
{ 0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000 },
|
|
667
|
+
{ 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000 },
|
|
668
|
+
{ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000 },
|
|
669
|
+
{ 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF },
|
|
670
|
+
{ 0xFFFFFFFF, 0x00000000, 0x00000000, 0xFFFFFFFF },
|
|
671
|
+
{ 0x00000000, 0xFFFFFFFF, 0x00000000, 0xFFFFFFFF },
|
|
672
|
+
{ 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0xFFFFFFFF },
|
|
673
|
+
{ 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF },
|
|
674
|
+
{ 0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF },
|
|
675
|
+
{ 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF },
|
|
676
|
+
{ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF },
|
|
677
|
+
};
|
|
678
|
+
alignas(A::alignment()) static const uint64_t lut8[][4] = {
|
|
679
|
+
{ 0x0000000000000000ul, 0x0000000000000000ul },
|
|
680
|
+
{ 0xFFFFFFFFFFFFFFFFul, 0x0000000000000000ul },
|
|
681
|
+
{ 0x0000000000000000ul, 0xFFFFFFFFFFFFFFFFul },
|
|
682
|
+
{ 0xFFFFFFFFFFFFFFFFul, 0xFFFFFFFFFFFFFFFFul },
|
|
683
|
+
};
|
|
684
|
+
XSIMD_IF_CONSTEXPR(sizeof(T) == 1)
|
|
685
|
+
{
|
|
686
|
+
assert(!(mask & ~0xFFFF) && "inbound mask");
|
|
687
|
+
return wasm_i32x4_make(lut32[mask & 0xF], lut32[(mask >> 4) & 0xF], lut32[(mask >> 8) & 0xF], lut32[mask >> 12]);
|
|
688
|
+
}
|
|
689
|
+
else XSIMD_IF_CONSTEXPR(sizeof(T) == 2)
|
|
690
|
+
{
|
|
691
|
+
assert(!(mask & ~0xFF) && "inbound mask");
|
|
692
|
+
return wasm_i64x2_make(lut64[mask & 0xF], lut64[mask >> 4]);
|
|
693
|
+
}
|
|
694
|
+
else XSIMD_IF_CONSTEXPR(sizeof(T) == 4)
|
|
695
|
+
{
|
|
696
|
+
assert(!(mask & ~0xFul) && "inbound mask");
|
|
697
|
+
return wasm_v128_load((const v128_t*)lut16[mask]);
|
|
698
|
+
}
|
|
699
|
+
else XSIMD_IF_CONSTEXPR(sizeof(T) == 8)
|
|
700
|
+
{
|
|
701
|
+
assert(!(mask & ~0x3ul) && "inbound mask");
|
|
702
|
+
return wasm_v128_load((const v128_t*)lut8[mask]);
|
|
703
|
+
}
|
|
704
|
+
}
|
|
705
|
+
|
|
706
|
+
// ge
|
|
707
|
+
template <class A>
|
|
708
|
+
XSIMD_INLINE batch_bool<float, A> ge(batch<float, A> const& self, batch<float, A> const& other, requires_arch<wasm>) noexcept
|
|
709
|
+
{
|
|
710
|
+
return wasm_f32x4_ge(self, other);
|
|
711
|
+
}
|
|
712
|
+
template <class A>
|
|
713
|
+
XSIMD_INLINE batch_bool<double, A> ge(batch<double, A> const& self, batch<double, A> const& other, requires_arch<wasm>) noexcept
|
|
714
|
+
{
|
|
715
|
+
return wasm_f64x2_ge(self, other);
|
|
716
|
+
}
|
|
717
|
+
|
|
718
|
+
// gt
|
|
719
|
+
template <class A>
|
|
720
|
+
XSIMD_INLINE batch_bool<float, A> gt(batch<float, A> const& self, batch<float, A> const& other, requires_arch<wasm>) noexcept
|
|
721
|
+
{
|
|
722
|
+
return wasm_f32x4_gt(self, other);
|
|
723
|
+
}
|
|
724
|
+
template <class A, class T, class = typename std::enable_if<std::is_integral<T>::value, void>::type>
|
|
725
|
+
XSIMD_INLINE batch_bool<T, A> gt(batch<T, A> const& self, batch<T, A> const& other, requires_arch<wasm>) noexcept
|
|
726
|
+
{
|
|
727
|
+
if (std::is_signed<T>::value)
|
|
728
|
+
{
|
|
729
|
+
XSIMD_IF_CONSTEXPR(sizeof(T) == 1)
|
|
730
|
+
{
|
|
731
|
+
return wasm_i8x16_gt(self, other);
|
|
732
|
+
}
|
|
733
|
+
else XSIMD_IF_CONSTEXPR(sizeof(T) == 2)
|
|
734
|
+
{
|
|
735
|
+
return wasm_i16x8_gt(self, other);
|
|
736
|
+
}
|
|
737
|
+
else XSIMD_IF_CONSTEXPR(sizeof(T) == 4)
|
|
738
|
+
{
|
|
739
|
+
return wasm_i32x4_gt(self, other);
|
|
740
|
+
}
|
|
741
|
+
else XSIMD_IF_CONSTEXPR(sizeof(T) == 8)
|
|
742
|
+
{
|
|
743
|
+
return wasm_i64x2_gt(self, other);
|
|
744
|
+
}
|
|
745
|
+
else
|
|
746
|
+
{
|
|
747
|
+
assert(false && "unsupported arch/op combination");
|
|
748
|
+
return {};
|
|
749
|
+
}
|
|
750
|
+
}
|
|
751
|
+
else
|
|
752
|
+
{
|
|
753
|
+
XSIMD_IF_CONSTEXPR(sizeof(T) == 1)
|
|
754
|
+
{
|
|
755
|
+
return wasm_u8x16_gt(self, other);
|
|
756
|
+
}
|
|
757
|
+
else XSIMD_IF_CONSTEXPR(sizeof(T) == 2)
|
|
758
|
+
{
|
|
759
|
+
return wasm_u16x8_gt(self, other);
|
|
760
|
+
}
|
|
761
|
+
else XSIMD_IF_CONSTEXPR(sizeof(T) == 4)
|
|
762
|
+
{
|
|
763
|
+
return wasm_u32x4_gt(self, other);
|
|
764
|
+
}
|
|
765
|
+
else
|
|
766
|
+
{
|
|
767
|
+
return gt(self, other, common {});
|
|
768
|
+
}
|
|
769
|
+
}
|
|
770
|
+
}
|
|
771
|
+
|
|
772
|
+
template <class A>
|
|
773
|
+
XSIMD_INLINE batch_bool<double, A> gt(batch<double, A> const& self, batch<double, A> const& other, requires_arch<wasm>) noexcept
|
|
774
|
+
{
|
|
775
|
+
return wasm_f64x2_gt(self, other);
|
|
776
|
+
}
|
|
777
|
+
|
|
778
|
+
// haddp
|
|
779
|
+
template <class A>
|
|
780
|
+
XSIMD_INLINE batch<float, A> haddp(batch<float, A> const* row, requires_arch<wasm>) noexcept
|
|
781
|
+
{
|
|
782
|
+
v128_t tmp0 = wasm_i32x4_shuffle(row[0], row[1], 0, 4, 1, 5);
|
|
783
|
+
v128_t tmp1 = wasm_i32x4_shuffle(row[0], row[1], 2, 6, 3, 7);
|
|
784
|
+
v128_t tmp2 = wasm_i32x4_shuffle(row[2], row[3], 2, 6, 3, 7);
|
|
785
|
+
tmp0 = wasm_f32x4_add(tmp0, tmp1);
|
|
786
|
+
tmp1 = wasm_i32x4_shuffle(row[2], row[3], 0, 4, 1, 5);
|
|
787
|
+
tmp1 = wasm_f32x4_add(tmp1, tmp2);
|
|
788
|
+
tmp2 = wasm_i32x4_shuffle(tmp1, tmp0, 6, 7, 2, 3);
|
|
789
|
+
tmp0 = wasm_i32x4_shuffle(tmp0, tmp1, 0, 1, 4, 5);
|
|
790
|
+
return wasm_f32x4_add(tmp0, tmp2);
|
|
791
|
+
}
|
|
792
|
+
template <class A>
|
|
793
|
+
XSIMD_INLINE batch<double, A> haddp(batch<double, A> const* row, requires_arch<wasm>) noexcept
|
|
794
|
+
{
|
|
795
|
+
return wasm_f64x2_add(wasm_i64x2_shuffle(row[0], row[1], 0, 2),
|
|
796
|
+
wasm_i64x2_shuffle(row[0], row[1], 1, 3));
|
|
797
|
+
}
|
|
798
|
+
|
|
799
|
+
// insert
|
|
800
|
+
template <class A, size_t I>
|
|
801
|
+
XSIMD_INLINE batch<float, A> insert(batch<float, A> const& self, float val, index<I> pos, requires_arch<wasm>) noexcept
|
|
802
|
+
{
|
|
803
|
+
return wasm_f32x4_replace_lane(self, pos, val);
|
|
804
|
+
}
|
|
805
|
+
template <class A, class T, size_t I, class = typename std::enable_if<std::is_integral<T>::value, void>::type>
|
|
806
|
+
XSIMD_INLINE batch<T, A> insert(batch<T, A> const& self, T val, index<I> pos, requires_arch<wasm>) noexcept
|
|
807
|
+
{
|
|
808
|
+
if (std::is_signed<T>::value)
|
|
809
|
+
{
|
|
810
|
+
XSIMD_IF_CONSTEXPR(sizeof(T) == 1)
|
|
811
|
+
{
|
|
812
|
+
return wasm_i8x16_replace_lane(self, pos, val);
|
|
813
|
+
}
|
|
814
|
+
else XSIMD_IF_CONSTEXPR(sizeof(T) == 2)
|
|
815
|
+
{
|
|
816
|
+
return wasm_i16x8_replace_lane(self, pos, val);
|
|
817
|
+
}
|
|
818
|
+
else XSIMD_IF_CONSTEXPR(sizeof(T) == 4)
|
|
819
|
+
{
|
|
820
|
+
return wasm_i32x4_replace_lane(self, pos, val);
|
|
821
|
+
}
|
|
822
|
+
else XSIMD_IF_CONSTEXPR(sizeof(T) == 8)
|
|
823
|
+
{
|
|
824
|
+
return wasm_i64x2_replace_lane(self, pos, val);
|
|
825
|
+
}
|
|
826
|
+
else
|
|
827
|
+
{
|
|
828
|
+
assert(false && "unsupported arch/op combination");
|
|
829
|
+
return {};
|
|
830
|
+
}
|
|
831
|
+
}
|
|
832
|
+
else
|
|
833
|
+
{
|
|
834
|
+
XSIMD_IF_CONSTEXPR(sizeof(T) == 1)
|
|
835
|
+
{
|
|
836
|
+
return wasm_u8x16_replace_lane(self, pos, val);
|
|
837
|
+
}
|
|
838
|
+
else XSIMD_IF_CONSTEXPR(sizeof(T) == 2)
|
|
839
|
+
{
|
|
840
|
+
return wasm_u16x8_replace_lane(self, pos, val);
|
|
841
|
+
}
|
|
842
|
+
else XSIMD_IF_CONSTEXPR(sizeof(T) == 4)
|
|
843
|
+
{
|
|
844
|
+
return wasm_u32x4_replace_lane(self, pos, val);
|
|
845
|
+
}
|
|
846
|
+
else XSIMD_IF_CONSTEXPR(sizeof(T) == 8)
|
|
847
|
+
{
|
|
848
|
+
return wasm_u64x2_replace_lane(self, pos, val);
|
|
849
|
+
}
|
|
850
|
+
else
|
|
851
|
+
{
|
|
852
|
+
assert(false && "unsupported arch/op combination");
|
|
853
|
+
return {};
|
|
854
|
+
}
|
|
855
|
+
}
|
|
856
|
+
}
|
|
857
|
+
|
|
858
|
+
template <class A, size_t I>
|
|
859
|
+
XSIMD_INLINE batch<double, A> insert(batch<double, A> const& self, double val, index<I> pos, requires_arch<wasm>) noexcept
|
|
860
|
+
{
|
|
861
|
+
return wasm_f64x2_replace_lane(self, pos, val);
|
|
862
|
+
}
|
|
863
|
+
|
|
864
|
+
// isnan
|
|
865
|
+
template <class A>
|
|
866
|
+
XSIMD_INLINE batch_bool<float, A> isnan(batch<float, A> const& self, requires_arch<wasm>) noexcept
|
|
867
|
+
{
|
|
868
|
+
return wasm_v128_or(wasm_f32x4_ne(self, self), wasm_f32x4_ne(self, self));
|
|
869
|
+
}
|
|
870
|
+
template <class A>
|
|
871
|
+
XSIMD_INLINE batch_bool<double, A> isnan(batch<double, A> const& self, requires_arch<wasm>) noexcept
|
|
872
|
+
{
|
|
873
|
+
return wasm_v128_or(wasm_f64x2_ne(self, self), wasm_f64x2_ne(self, self));
|
|
874
|
+
}
|
|
875
|
+
|
|
876
|
+
// le
|
|
877
|
+
template <class A>
|
|
878
|
+
XSIMD_INLINE batch_bool<float, A> le(batch<float, A> const& self, batch<float, A> const& other, requires_arch<wasm>) noexcept
|
|
879
|
+
{
|
|
880
|
+
return wasm_f32x4_le(self, other);
|
|
881
|
+
}
|
|
882
|
+
template <class A>
|
|
883
|
+
XSIMD_INLINE batch_bool<double, A> le(batch<double, A> const& self, batch<double, A> const& other, requires_arch<wasm>) noexcept
|
|
884
|
+
{
|
|
885
|
+
return wasm_f64x2_le(self, other);
|
|
886
|
+
}
|
|
887
|
+
|
|
888
|
+
// load_aligned
|
|
889
|
+
template <class A>
|
|
890
|
+
XSIMD_INLINE batch<float, A> load_aligned(float const* mem, convert<float>, requires_arch<wasm>) noexcept
|
|
891
|
+
{
|
|
892
|
+
return wasm_v128_load(mem);
|
|
893
|
+
}
|
|
894
|
+
template <class A, class T, class = typename std::enable_if<std::is_integral<T>::value, void>::type>
|
|
895
|
+
XSIMD_INLINE batch<T, A> load_aligned(T const* mem, convert<T>, requires_arch<wasm>) noexcept
|
|
896
|
+
{
|
|
897
|
+
return wasm_v128_load((v128_t const*)mem);
|
|
898
|
+
}
|
|
899
|
+
template <class A>
|
|
900
|
+
XSIMD_INLINE batch<double, A> load_aligned(double const* mem, convert<double>, requires_arch<wasm>) noexcept
|
|
901
|
+
{
|
|
902
|
+
return wasm_v128_load(mem);
|
|
903
|
+
}
|
|
904
|
+
|
|
905
|
+
// load_complex
|
|
906
|
+
namespace detail
|
|
907
|
+
{
|
|
908
|
+
template <class A>
|
|
909
|
+
XSIMD_INLINE batch<std::complex<float>, A> load_complex(batch<float, A> const& hi, batch<float, A> const& lo, requires_arch<wasm>) noexcept
|
|
910
|
+
{
|
|
911
|
+
return { wasm_i32x4_shuffle(hi, lo, 0, 2, 4, 6), wasm_i32x4_shuffle(hi, lo, 1, 3, 5, 7) };
|
|
912
|
+
}
|
|
913
|
+
template <class A>
|
|
914
|
+
XSIMD_INLINE batch<std::complex<double>, A> load_complex(batch<double, A> const& hi, batch<double, A> const& lo, requires_arch<wasm>) noexcept
|
|
915
|
+
{
|
|
916
|
+
return { wasm_i64x2_shuffle(hi, lo, 0, 2), wasm_i64x2_shuffle(hi, lo, 1, 3) };
|
|
917
|
+
}
|
|
918
|
+
}
|
|
919
|
+
|
|
920
|
+
// load_unaligned
|
|
921
|
+
template <class A>
|
|
922
|
+
XSIMD_INLINE batch<float, A> load_unaligned(float const* mem, convert<float>, requires_arch<wasm>) noexcept
|
|
923
|
+
{
|
|
924
|
+
return wasm_v128_load(mem);
|
|
925
|
+
}
|
|
926
|
+
template <class A, class T, class = typename std::enable_if<std::is_integral<T>::value, void>::type>
|
|
927
|
+
XSIMD_INLINE batch<T, A> load_unaligned(T const* mem, convert<T>, requires_arch<wasm>) noexcept
|
|
928
|
+
{
|
|
929
|
+
return wasm_v128_load((v128_t const*)mem);
|
|
930
|
+
}
|
|
931
|
+
template <class A>
|
|
932
|
+
XSIMD_INLINE batch<double, A> load_unaligned(double const* mem, convert<double>, requires_arch<wasm>) noexcept
|
|
933
|
+
{
|
|
934
|
+
return wasm_v128_load(mem);
|
|
935
|
+
}
|
|
936
|
+
|
|
937
|
+
// lt
|
|
938
|
+
template <class A>
|
|
939
|
+
XSIMD_INLINE batch_bool<float, A> lt(batch<float, A> const& self, batch<float, A> const& other, requires_arch<wasm>) noexcept
|
|
940
|
+
{
|
|
941
|
+
return wasm_f32x4_lt(self, other);
|
|
942
|
+
}
|
|
943
|
+
template <class A, class T, class = typename std::enable_if<std::is_integral<T>::value, void>::type>
|
|
944
|
+
XSIMD_INLINE batch_bool<T, A> lt(batch<T, A> const& self, batch<T, A> const& other, requires_arch<wasm>) noexcept
|
|
945
|
+
{
|
|
946
|
+
if (std::is_signed<T>::value)
|
|
947
|
+
{
|
|
948
|
+
XSIMD_IF_CONSTEXPR(sizeof(T) == 1)
|
|
949
|
+
{
|
|
950
|
+
return wasm_i8x16_lt(self, other);
|
|
951
|
+
}
|
|
952
|
+
else XSIMD_IF_CONSTEXPR(sizeof(T) == 2)
|
|
953
|
+
{
|
|
954
|
+
return wasm_i16x8_lt(self, other);
|
|
955
|
+
}
|
|
956
|
+
else XSIMD_IF_CONSTEXPR(sizeof(T) == 4)
|
|
957
|
+
{
|
|
958
|
+
return wasm_i32x4_lt(self, other);
|
|
959
|
+
}
|
|
960
|
+
else XSIMD_IF_CONSTEXPR(sizeof(T) == 8)
|
|
961
|
+
{
|
|
962
|
+
return wasm_i64x2_lt(self, other);
|
|
963
|
+
}
|
|
964
|
+
else
|
|
965
|
+
{
|
|
966
|
+
assert(false && "unsupported arch/op combination");
|
|
967
|
+
return {};
|
|
968
|
+
}
|
|
969
|
+
}
|
|
970
|
+
else
|
|
971
|
+
{
|
|
972
|
+
XSIMD_IF_CONSTEXPR(sizeof(T) == 1)
|
|
973
|
+
{
|
|
974
|
+
return wasm_u8x16_lt(self, other);
|
|
975
|
+
}
|
|
976
|
+
else XSIMD_IF_CONSTEXPR(sizeof(T) == 2)
|
|
977
|
+
{
|
|
978
|
+
return wasm_u16x8_lt(self, other);
|
|
979
|
+
}
|
|
980
|
+
else XSIMD_IF_CONSTEXPR(sizeof(T) == 4)
|
|
981
|
+
{
|
|
982
|
+
return wasm_u32x4_lt(self, other);
|
|
983
|
+
}
|
|
984
|
+
else XSIMD_IF_CONSTEXPR(sizeof(T) == 8)
|
|
985
|
+
{
|
|
986
|
+
auto xself = wasm_v128_xor(self, wasm_i64x2_splat(std::numeric_limits<int64_t>::lowest()));
|
|
987
|
+
auto xother = wasm_v128_xor(other, wasm_i64x2_splat(std::numeric_limits<int64_t>::lowest()));
|
|
988
|
+
v128_t tmp1 = wasm_i64x2_sub(xself, xother);
|
|
989
|
+
v128_t tmp2 = wasm_v128_xor(xself, xother);
|
|
990
|
+
v128_t tmp3 = wasm_v128_andnot(xself, xother);
|
|
991
|
+
v128_t tmp4 = wasm_v128_andnot(tmp1, tmp2);
|
|
992
|
+
v128_t tmp5 = wasm_v128_or(tmp3, tmp4);
|
|
993
|
+
v128_t tmp6 = wasm_i32x4_shr(tmp5, 31);
|
|
994
|
+
return wasm_i32x4_shuffle(tmp6, wasm_i32x4_splat(0), 1, 1, 3, 3);
|
|
995
|
+
}
|
|
996
|
+
else
|
|
997
|
+
{
|
|
998
|
+
assert(false && "unsupported arch/op combination");
|
|
999
|
+
return {};
|
|
1000
|
+
}
|
|
1001
|
+
}
|
|
1002
|
+
}
|
|
1003
|
+
|
|
1004
|
+
template <class A>
|
|
1005
|
+
XSIMD_INLINE batch_bool<double, A> lt(batch<double, A> const& self, batch<double, A> const& other, requires_arch<wasm>) noexcept
|
|
1006
|
+
{
|
|
1007
|
+
return wasm_f64x2_lt(self, other);
|
|
1008
|
+
}
|
|
1009
|
+
|
|
1010
|
+
// mask
|
|
1011
|
+
template <class A, class T, class = typename std::enable_if<std::is_integral<T>::value, void>::type>
|
|
1012
|
+
XSIMD_INLINE uint64_t mask(batch_bool<T, A> const& self, requires_arch<wasm>) noexcept
|
|
1013
|
+
{
|
|
1014
|
+
XSIMD_IF_CONSTEXPR(sizeof(T) == 1)
|
|
1015
|
+
{
|
|
1016
|
+
return wasm_i8x16_bitmask(self);
|
|
1017
|
+
}
|
|
1018
|
+
else XSIMD_IF_CONSTEXPR(sizeof(T) == 2)
|
|
1019
|
+
{
|
|
1020
|
+
return wasm_i16x8_bitmask(self);
|
|
1021
|
+
}
|
|
1022
|
+
else XSIMD_IF_CONSTEXPR(sizeof(T) == 4)
|
|
1023
|
+
{
|
|
1024
|
+
return wasm_i32x4_bitmask(self);
|
|
1025
|
+
}
|
|
1026
|
+
else XSIMD_IF_CONSTEXPR(sizeof(T) == 8)
|
|
1027
|
+
{
|
|
1028
|
+
return wasm_i64x2_bitmask(self);
|
|
1029
|
+
}
|
|
1030
|
+
else
|
|
1031
|
+
{
|
|
1032
|
+
assert(false && "unsupported arch/op combination");
|
|
1033
|
+
return {};
|
|
1034
|
+
}
|
|
1035
|
+
}
|
|
1036
|
+
template <class A>
|
|
1037
|
+
XSIMD_INLINE uint64_t mask(batch_bool<float, A> const& self, requires_arch<wasm>) noexcept
|
|
1038
|
+
{
|
|
1039
|
+
return wasm_i32x4_bitmask(self);
|
|
1040
|
+
}
|
|
1041
|
+
|
|
1042
|
+
template <class A>
|
|
1043
|
+
XSIMD_INLINE uint64_t mask(batch_bool<double, A> const& self, requires_arch<wasm>) noexcept
|
|
1044
|
+
{
|
|
1045
|
+
return wasm_i64x2_bitmask(self);
|
|
1046
|
+
}
|
|
1047
|
+
|
|
1048
|
+
// max
|
|
1049
|
+
template <class A>
|
|
1050
|
+
XSIMD_INLINE batch<float, A> max(batch<float, A> const& self, batch<float, A> const& other, requires_arch<wasm>) noexcept
|
|
1051
|
+
{
|
|
1052
|
+
return wasm_f32x4_pmax(self, other);
|
|
1053
|
+
}
|
|
1054
|
+
template <class A, class T, class = typename std::enable_if<std::is_integral<T>::value, void>::type>
|
|
1055
|
+
XSIMD_INLINE batch<T, A> max(batch<T, A> const& self, batch<T, A> const& other, requires_arch<wasm>) noexcept
|
|
1056
|
+
{
|
|
1057
|
+
return select(self > other, self, other);
|
|
1058
|
+
}
|
|
1059
|
+
template <class A>
|
|
1060
|
+
XSIMD_INLINE batch<double, A> max(batch<double, A> const& self, batch<double, A> const& other, requires_arch<wasm>) noexcept
|
|
1061
|
+
{
|
|
1062
|
+
return wasm_f64x2_pmax(self, other);
|
|
1063
|
+
}
|
|
1064
|
+
|
|
1065
|
+
// min
|
|
1066
|
+
template <class A>
|
|
1067
|
+
XSIMD_INLINE batch<float, A> min(batch<float, A> const& self, batch<float, A> const& other, requires_arch<wasm>) noexcept
|
|
1068
|
+
{
|
|
1069
|
+
return wasm_f32x4_pmin(self, other);
|
|
1070
|
+
}
|
|
1071
|
+
template <class A, class T, class = typename std::enable_if<std::is_integral<T>::value, void>::type>
|
|
1072
|
+
XSIMD_INLINE batch<T, A> min(batch<T, A> const& self, batch<T, A> const& other, requires_arch<wasm>) noexcept
|
|
1073
|
+
{
|
|
1074
|
+
return select(self <= other, self, other);
|
|
1075
|
+
}
|
|
1076
|
+
template <class A>
|
|
1077
|
+
XSIMD_INLINE batch<double, A> min(batch<double, A> const& self, batch<double, A> const& other, requires_arch<wasm>) noexcept
|
|
1078
|
+
{
|
|
1079
|
+
return wasm_f64x2_pmin(self, other);
|
|
1080
|
+
}
|
|
1081
|
+
|
|
1082
|
+
// mul
|
|
1083
|
+
template <class A>
|
|
1084
|
+
XSIMD_INLINE batch<float, A> mul(batch<float, A> const& self, batch<float, A> const& other, requires_arch<wasm>) noexcept
|
|
1085
|
+
{
|
|
1086
|
+
return wasm_f32x4_mul(self, other);
|
|
1087
|
+
}
|
|
1088
|
+
template <class A>
|
|
1089
|
+
XSIMD_INLINE batch<double, A> mul(batch<double, A> const& self, batch<double, A> const& other, requires_arch<wasm>) noexcept
|
|
1090
|
+
{
|
|
1091
|
+
return wasm_f64x2_mul(self, other);
|
|
1092
|
+
}
|
|
1093
|
+
|
|
1094
|
+
// neg
|
|
1095
|
+
template <class A, class T, class = typename std::enable_if<std::is_integral<T>::value, void>::type>
|
|
1096
|
+
XSIMD_INLINE batch<T, A> neg(batch<T, A> const& self, requires_arch<wasm>) noexcept
|
|
1097
|
+
{
|
|
1098
|
+
XSIMD_IF_CONSTEXPR(sizeof(T) == 1)
|
|
1099
|
+
{
|
|
1100
|
+
return wasm_i8x16_neg(self);
|
|
1101
|
+
}
|
|
1102
|
+
else XSIMD_IF_CONSTEXPR(sizeof(T) == 2)
|
|
1103
|
+
{
|
|
1104
|
+
return wasm_i16x8_neg(self);
|
|
1105
|
+
}
|
|
1106
|
+
else XSIMD_IF_CONSTEXPR(sizeof(T) == 4)
|
|
1107
|
+
{
|
|
1108
|
+
return wasm_i32x4_neg(self);
|
|
1109
|
+
}
|
|
1110
|
+
else XSIMD_IF_CONSTEXPR(sizeof(T) == 8)
|
|
1111
|
+
{
|
|
1112
|
+
return wasm_i64x2_neg(self);
|
|
1113
|
+
}
|
|
1114
|
+
else
|
|
1115
|
+
{
|
|
1116
|
+
assert(false && "unsupported arch/op combination");
|
|
1117
|
+
return {};
|
|
1118
|
+
}
|
|
1119
|
+
}
|
|
1120
|
+
|
|
1121
|
+
template <class A>
|
|
1122
|
+
XSIMD_INLINE batch<float, A> neg(batch<float, A> const& self, requires_arch<wasm>) noexcept
|
|
1123
|
+
{
|
|
1124
|
+
return wasm_f32x4_neg(self);
|
|
1125
|
+
}
|
|
1126
|
+
|
|
1127
|
+
template <class A>
|
|
1128
|
+
XSIMD_INLINE batch<double, A> neg(batch<double, A> const& self, requires_arch<wasm>) noexcept
|
|
1129
|
+
{
|
|
1130
|
+
return wasm_f64x2_neg(self);
|
|
1131
|
+
}
|
|
1132
|
+
|
|
1133
|
+
// neq
|
|
1134
|
+
template <class A>
|
|
1135
|
+
XSIMD_INLINE batch_bool<float, A> neq(batch<float, A> const& self, batch<float, A> const& other, requires_arch<wasm>) noexcept
|
|
1136
|
+
{
|
|
1137
|
+
return wasm_f32x4_ne(self, other);
|
|
1138
|
+
}
|
|
1139
|
+
template <class A, class T, class = typename std::enable_if<std::is_integral<T>::value, void>::type>
|
|
1140
|
+
XSIMD_INLINE batch_bool<T, A> neq(batch<T, A> const& self, batch<T, A> const& other, requires_arch<wasm>) noexcept
|
|
1141
|
+
{
|
|
1142
|
+
return ~(self == other);
|
|
1143
|
+
}
|
|
1144
|
+
template <class A>
|
|
1145
|
+
XSIMD_INLINE batch_bool<float, A> neq(batch_bool<float, A> const& self, batch_bool<float, A> const& other, requires_arch<wasm>) noexcept
|
|
1146
|
+
{
|
|
1147
|
+
return wasm_f32x4_ne(self, other);
|
|
1148
|
+
}
|
|
1149
|
+
template <class A, class T, class = typename std::enable_if<std::is_integral<T>::value, void>::type>
|
|
1150
|
+
XSIMD_INLINE batch_bool<T, A> neq(batch_bool<T, A> const& self, batch_bool<T, A> const& other, requires_arch<wasm>) noexcept
|
|
1151
|
+
{
|
|
1152
|
+
return ~(self == other);
|
|
1153
|
+
}
|
|
1154
|
+
|
|
1155
|
+
template <class A>
|
|
1156
|
+
XSIMD_INLINE batch_bool<double, A> neq(batch<double, A> const& self, batch<double, A> const& other, requires_arch<wasm>) noexcept
|
|
1157
|
+
{
|
|
1158
|
+
return wasm_f64x2_ne(self, other);
|
|
1159
|
+
}
|
|
1160
|
+
template <class A>
|
|
1161
|
+
XSIMD_INLINE batch_bool<double, A> neq(batch_bool<double, A> const& self, batch_bool<double, A> const& other, requires_arch<wasm>) noexcept
|
|
1162
|
+
{
|
|
1163
|
+
return wasm_f64x2_ne(self, other);
|
|
1164
|
+
}
|
|
1165
|
+
|
|
1166
|
+
// reciprocal
|
|
1167
|
+
template <class A>
|
|
1168
|
+
XSIMD_INLINE batch<float, A> reciprocal(batch<float, A> const& self, requires_arch<wasm>) noexcept
|
|
1169
|
+
{
|
|
1170
|
+
v128_t one = wasm_f32x4_splat(1.0f);
|
|
1171
|
+
return wasm_f32x4_div(one, self);
|
|
1172
|
+
}
|
|
1173
|
+
template <class A>
|
|
1174
|
+
XSIMD_INLINE batch<double, A> reciprocal(batch<double, A> const& self, requires_arch<wasm>) noexcept
|
|
1175
|
+
{
|
|
1176
|
+
v128_t one = wasm_f64x2_splat(1.0);
|
|
1177
|
+
return wasm_f64x2_div(one, self);
|
|
1178
|
+
}
|
|
1179
|
+
|
|
1180
|
+
// reduce_add
|
|
1181
|
+
template <class A>
|
|
1182
|
+
XSIMD_INLINE float reduce_add(batch<float, A> const& self, requires_arch<wasm>) noexcept
|
|
1183
|
+
{
|
|
1184
|
+
v128_t tmp0 = wasm_f32x4_add(self, wasm_i32x4_shuffle(self, self, 6, 7, 2, 3));
|
|
1185
|
+
v128_t tmp1 = wasm_i32x4_shuffle(tmp0, tmp0, 1, 0, 4, 4);
|
|
1186
|
+
v128_t tmp2 = wasm_f32x4_add(tmp0, tmp1);
|
|
1187
|
+
v128_t tmp3 = wasm_i32x4_shuffle(tmp0, tmp2, 4, 1, 2, 3);
|
|
1188
|
+
return wasm_f32x4_extract_lane(tmp3, 0);
|
|
1189
|
+
}
|
|
1190
|
+
template <class A, class T, class = typename std::enable_if<std::is_integral<T>::value, void>::type>
|
|
1191
|
+
XSIMD_INLINE T reduce_add(batch<T, A> const& self, requires_arch<wasm>) noexcept
|
|
1192
|
+
{
|
|
1193
|
+
XSIMD_IF_CONSTEXPR(sizeof(T) == 4)
|
|
1194
|
+
{
|
|
1195
|
+
v128_t tmp0 = wasm_i32x4_shuffle(self, wasm_i32x4_splat(0), 2, 3, 0, 0);
|
|
1196
|
+
v128_t tmp1 = wasm_i32x4_add(self, tmp0);
|
|
1197
|
+
v128_t tmp2 = wasm_i32x4_shuffle(tmp1, wasm_i32x4_splat(0), 1, 0, 0, 0);
|
|
1198
|
+
v128_t tmp3 = wasm_i32x4_add(tmp1, tmp2);
|
|
1199
|
+
return wasm_i32x4_extract_lane(tmp3, 0);
|
|
1200
|
+
}
|
|
1201
|
+
else XSIMD_IF_CONSTEXPR(sizeof(T) == 8)
|
|
1202
|
+
{
|
|
1203
|
+
v128_t tmp0 = wasm_i32x4_shuffle(self, wasm_i32x4_splat(0), 2, 3, 0, 0);
|
|
1204
|
+
v128_t tmp1 = wasm_i64x2_add(self, tmp0);
|
|
1205
|
+
return wasm_i64x2_extract_lane(tmp1, 0);
|
|
1206
|
+
}
|
|
1207
|
+
else
|
|
1208
|
+
{
|
|
1209
|
+
return reduce_add(self, common {});
|
|
1210
|
+
}
|
|
1211
|
+
}
|
|
1212
|
+
template <class A>
|
|
1213
|
+
XSIMD_INLINE double reduce_add(batch<double, A> const& self, requires_arch<wasm>) noexcept
|
|
1214
|
+
{
|
|
1215
|
+
v128_t tmp0 = wasm_i64x2_shuffle(self, self, 1, 3);
|
|
1216
|
+
v128_t tmp1 = wasm_f64x2_add(self, tmp0);
|
|
1217
|
+
v128_t tmp2 = wasm_i64x2_shuffle(tmp0, tmp1, 2, 1);
|
|
1218
|
+
return wasm_f64x2_extract_lane(tmp2, 0);
|
|
1219
|
+
}
|
|
1220
|
+
|
|
1221
|
+
// reduce_mul
|
|
1222
|
+
template <class A>
|
|
1223
|
+
XSIMD_INLINE float reduce_mul(batch<float, A> const& self, requires_arch<wasm>) noexcept
|
|
1224
|
+
{
|
|
1225
|
+
v128_t tmp0 = wasm_f32x4_mul(self, wasm_i32x4_shuffle(self, self, 6, 7, 2, 3));
|
|
1226
|
+
v128_t tmp1 = wasm_i32x4_shuffle(tmp0, tmp0, 1, 0, 4, 4);
|
|
1227
|
+
v128_t tmp2 = wasm_f32x4_mul(tmp0, tmp1);
|
|
1228
|
+
v128_t tmp3 = wasm_i32x4_shuffle(tmp0, tmp2, 4, 1, 2, 3);
|
|
1229
|
+
return wasm_f32x4_extract_lane(tmp3, 0);
|
|
1230
|
+
}
|
|
1231
|
+
template <class A, class T, class = typename std::enable_if<std::is_integral<T>::value, void>::type>
|
|
1232
|
+
XSIMD_INLINE T reduce_mul(batch<T, A> const& self, requires_arch<wasm>) noexcept
|
|
1233
|
+
{
|
|
1234
|
+
XSIMD_IF_CONSTEXPR(sizeof(T) == 4)
|
|
1235
|
+
{
|
|
1236
|
+
v128_t tmp0 = wasm_i32x4_shuffle(self, wasm_i32x4_splat(0), 2, 3, 0, 0);
|
|
1237
|
+
v128_t tmp1 = wasm_i32x4_mul(self, tmp0);
|
|
1238
|
+
v128_t tmp2 = wasm_i32x4_shuffle(tmp1, wasm_i32x4_splat(0), 1, 0, 0, 0);
|
|
1239
|
+
v128_t tmp3 = wasm_i32x4_mul(tmp1, tmp2);
|
|
1240
|
+
return wasm_i32x4_extract_lane(tmp3, 0);
|
|
1241
|
+
}
|
|
1242
|
+
else XSIMD_IF_CONSTEXPR(sizeof(T) == 8)
|
|
1243
|
+
{
|
|
1244
|
+
v128_t tmp0 = wasm_i32x4_shuffle(self, wasm_i32x4_splat(0), 2, 3, 0, 0);
|
|
1245
|
+
v128_t tmp1 = wasm_i64x2_mul(self, tmp0);
|
|
1246
|
+
return wasm_i64x2_extract_lane(tmp1, 0);
|
|
1247
|
+
}
|
|
1248
|
+
else
|
|
1249
|
+
{
|
|
1250
|
+
return reduce_mul(self, common {});
|
|
1251
|
+
}
|
|
1252
|
+
}
|
|
1253
|
+
template <class A>
|
|
1254
|
+
XSIMD_INLINE double reduce_mul(batch<double, A> const& self, requires_arch<wasm>) noexcept
|
|
1255
|
+
{
|
|
1256
|
+
v128_t tmp0 = wasm_i64x2_shuffle(self, self, 1, 3);
|
|
1257
|
+
v128_t tmp1 = wasm_f64x2_mul(self, tmp0);
|
|
1258
|
+
v128_t tmp2 = wasm_i64x2_shuffle(tmp0, tmp1, 2, 1);
|
|
1259
|
+
return wasm_f64x2_extract_lane(tmp2, 0);
|
|
1260
|
+
}
|
|
1261
|
+
|
|
1262
|
+
// rsqrt
|
|
1263
|
+
template <class A>
|
|
1264
|
+
XSIMD_INLINE batch<float, A> rsqrt(batch<float, A> const& self, requires_arch<wasm>) noexcept
|
|
1265
|
+
{
|
|
1266
|
+
v128_t one = wasm_f32x4_splat(1.0f);
|
|
1267
|
+
return wasm_f32x4_div(one, wasm_f32x4_sqrt(self));
|
|
1268
|
+
}
|
|
1269
|
+
template <class A>
|
|
1270
|
+
XSIMD_INLINE batch<double, A> rsqrt(batch<double, A> const& self, requires_arch<wasm>) noexcept
|
|
1271
|
+
{
|
|
1272
|
+
v128_t one = wasm_f64x2_splat(1.0);
|
|
1273
|
+
return wasm_f64x2_div(one, wasm_f64x2_sqrt(self));
|
|
1274
|
+
}
|
|
1275
|
+
|
|
1276
|
+
// slide_left
|
|
1277
|
+
template <size_t N, class A, class T>
|
|
1278
|
+
XSIMD_INLINE batch<T, A> slide_left(batch<T, A> const& x, requires_arch<wasm>) noexcept
|
|
1279
|
+
{
|
|
1280
|
+
return wasm_i8x16_shuffle(
|
|
1281
|
+
wasm_i64x2_const(0, 0), x, ((N) & 0xF0) ? 0 : 16 - ((N) & 0xF),
|
|
1282
|
+
((N) & 0xF0) ? 0 : 17 - ((N) & 0xF), ((N) & 0xF0) ? 0 : 18 - ((N) & 0xF),
|
|
1283
|
+
((N) & 0xF0) ? 0 : 19 - ((N) & 0xF), ((N) & 0xF0) ? 0 : 20 - ((N) & 0xF),
|
|
1284
|
+
((N) & 0xF0) ? 0 : 21 - ((N) & 0xF), ((N) & 0xF0) ? 0 : 22 - ((N) & 0xF),
|
|
1285
|
+
((N) & 0xF0) ? 0 : 23 - ((N) & 0xF), ((N) & 0xF0) ? 0 : 24 - ((N) & 0xF),
|
|
1286
|
+
((N) & 0xF0) ? 0 : 25 - ((N) & 0xF), ((N) & 0xF0) ? 0 : 26 - ((N) & 0xF),
|
|
1287
|
+
((N) & 0xF0) ? 0 : 27 - ((N) & 0xF), ((N) & 0xF0) ? 0 : 28 - ((N) & 0xF),
|
|
1288
|
+
((N) & 0xF0) ? 0 : 29 - ((N) & 0xF), ((N) & 0xF0) ? 0 : 30 - ((N) & 0xF),
|
|
1289
|
+
((N) & 0xF0) ? 0 : 31 - ((N) & 0xF));
|
|
1290
|
+
}
|
|
1291
|
+
|
|
1292
|
+
// slide_right
|
|
1293
|
+
template <size_t N, class A, class T>
|
|
1294
|
+
XSIMD_INLINE batch<T, A> slide_right(batch<T, A> const& x, requires_arch<wasm>) noexcept
|
|
1295
|
+
{
|
|
1296
|
+
return wasm_i8x16_shuffle(
|
|
1297
|
+
x, wasm_i64x2_const(0, 0), ((N) & 0xF0) ? 16 : ((N) & 0xF) + 0,
|
|
1298
|
+
((N) & 0xF0) ? 16 : ((N) & 0xF) + 1, ((N) & 0xF0) ? 16 : ((N) & 0xF) + 2,
|
|
1299
|
+
((N) & 0xF0) ? 16 : ((N) & 0xF) + 3, ((N) & 0xF0) ? 16 : ((N) & 0xF) + 4,
|
|
1300
|
+
((N) & 0xF0) ? 16 : ((N) & 0xF) + 5, ((N) & 0xF0) ? 16 : ((N) & 0xF) + 6,
|
|
1301
|
+
((N) & 0xF0) ? 16 : ((N) & 0xF) + 7, ((N) & 0xF0) ? 16 : ((N) & 0xF) + 8,
|
|
1302
|
+
((N) & 0xF0) ? 16 : ((N) & 0xF) + 9, ((N) & 0xF0) ? 16 : ((N) & 0xF) + 10,
|
|
1303
|
+
((N) & 0xF0) ? 16 : ((N) & 0xF) + 11, ((N) & 0xF0) ? 16 : ((N) & 0xF) + 12,
|
|
1304
|
+
((N) & 0xF0) ? 16 : ((N) & 0xF) + 13, ((N) & 0xF0) ? 16 : ((N) & 0xF) + 14,
|
|
1305
|
+
((N) & 0xF0) ? 16 : ((N) & 0xF) + 15);
|
|
1306
|
+
}
|
|
1307
|
+
|
|
1308
|
+
// sadd
|
|
1309
|
+
template <class A, class T, class = typename std::enable_if<std::is_integral<T>::value, void>::type>
|
|
1310
|
+
XSIMD_INLINE batch<T, A> sadd(batch<T, A> const& self, batch<T, A> const& other, requires_arch<wasm>) noexcept
|
|
1311
|
+
{
|
|
1312
|
+
if (std::is_signed<T>::value)
|
|
1313
|
+
{
|
|
1314
|
+
XSIMD_IF_CONSTEXPR(sizeof(T) == 1)
|
|
1315
|
+
{
|
|
1316
|
+
return wasm_i8x16_add_sat(self, other);
|
|
1317
|
+
}
|
|
1318
|
+
else XSIMD_IF_CONSTEXPR(sizeof(T) == 2)
|
|
1319
|
+
{
|
|
1320
|
+
return wasm_i16x8_add_sat(self, other);
|
|
1321
|
+
}
|
|
1322
|
+
else
|
|
1323
|
+
{
|
|
1324
|
+
return sadd(self, other, common {});
|
|
1325
|
+
}
|
|
1326
|
+
}
|
|
1327
|
+
else
|
|
1328
|
+
{
|
|
1329
|
+
XSIMD_IF_CONSTEXPR(sizeof(T) == 1)
|
|
1330
|
+
{
|
|
1331
|
+
return wasm_u8x16_add_sat(self, other);
|
|
1332
|
+
}
|
|
1333
|
+
else XSIMD_IF_CONSTEXPR(sizeof(T) == 2)
|
|
1334
|
+
{
|
|
1335
|
+
return wasm_u16x8_add_sat(self, other);
|
|
1336
|
+
}
|
|
1337
|
+
else
|
|
1338
|
+
{
|
|
1339
|
+
return sadd(self, other, common {});
|
|
1340
|
+
}
|
|
1341
|
+
}
|
|
1342
|
+
}
|
|
1343
|
+
|
|
1344
|
+
// select
|
|
1345
|
+
template <class A>
|
|
1346
|
+
XSIMD_INLINE batch<float, A> select(batch_bool<float, A> const& cond, batch<float, A> const& true_br, batch<float, A> const& false_br, requires_arch<wasm>) noexcept
|
|
1347
|
+
{
|
|
1348
|
+
return wasm_v128_or(wasm_v128_and(cond, true_br), wasm_v128_andnot(false_br, cond));
|
|
1349
|
+
}
|
|
1350
|
+
|
|
1351
|
+
template <class A, class T, class = typename std::enable_if<std::is_integral<T>::value, void>::type>
|
|
1352
|
+
XSIMD_INLINE batch<T, A> select(batch_bool<T, A> const& cond, batch<T, A> const& true_br, batch<T, A> const& false_br, requires_arch<wasm>) noexcept
|
|
1353
|
+
{
|
|
1354
|
+
return wasm_v128_or(wasm_v128_and(cond, true_br), wasm_v128_andnot(false_br, cond));
|
|
1355
|
+
}
|
|
1356
|
+
template <class A, class T, bool... Values, class = typename std::enable_if<std::is_integral<T>::value, void>::type>
|
|
1357
|
+
XSIMD_INLINE batch<T, A> select(batch_bool_constant<T, A, Values...> const&, batch<T, A> const& true_br, batch<T, A> const& false_br, requires_arch<wasm>) noexcept
|
|
1358
|
+
{
|
|
1359
|
+
return select(batch_bool<T, A> { Values... }, true_br, false_br, wasm {});
|
|
1360
|
+
}
|
|
1361
|
+
template <class A>
|
|
1362
|
+
XSIMD_INLINE batch<double, A> select(batch_bool<double, A> const& cond, batch<double, A> const& true_br, batch<double, A> const& false_br, requires_arch<wasm>) noexcept
|
|
1363
|
+
{
|
|
1364
|
+
return wasm_v128_or(wasm_v128_and(cond, true_br), wasm_v128_andnot(false_br, cond));
|
|
1365
|
+
}
|
|
1366
|
+
|
|
1367
|
+
// shuffle
|
|
1368
|
+
template <class A, class ITy, ITy I0, ITy I1, ITy I2, ITy I3>
|
|
1369
|
+
XSIMD_INLINE batch<float, A> shuffle(batch<float, A> const& x, batch<float, A> const& y, batch_constant<ITy, A, I0, I1, I2, I3>, requires_arch<wasm>) noexcept
|
|
1370
|
+
{
|
|
1371
|
+
return wasm_i32x4_shuffle(x, y, I0, I1, I2, I3);
|
|
1372
|
+
}
|
|
1373
|
+
|
|
1374
|
+
template <class A, class ITy, ITy I0, ITy I1>
|
|
1375
|
+
XSIMD_INLINE batch<double, A> shuffle(batch<double, A> const& x, batch<double, A> const& y, batch_constant<ITy, A, I0, I1>, requires_arch<wasm>) noexcept
|
|
1376
|
+
{
|
|
1377
|
+
return wasm_i64x2_shuffle(x, y, I0, I1);
|
|
1378
|
+
}
|
|
1379
|
+
|
|
1380
|
+
// set
|
|
1381
|
+
template <class A, class... Values>
|
|
1382
|
+
XSIMD_INLINE batch<float, A> set(batch<float, A> const&, requires_arch<wasm>, Values... values) noexcept
|
|
1383
|
+
{
|
|
1384
|
+
static_assert(sizeof...(Values) == batch<float, A>::size, "consistent init");
|
|
1385
|
+
return wasm_f32x4_make(values...);
|
|
1386
|
+
}
|
|
1387
|
+
|
|
1388
|
+
template <class A, class T, class = typename std::enable_if<std::is_integral<T>::value, void>::type>
|
|
1389
|
+
XSIMD_INLINE batch<T, A> set(batch<T, A> const&, requires_arch<wasm>, T v0, T v1) noexcept
|
|
1390
|
+
{
|
|
1391
|
+
return wasm_i64x2_make(v0, v1);
|
|
1392
|
+
}
|
|
1393
|
+
|
|
1394
|
+
template <class A, class T, class = typename std::enable_if<std::is_integral<T>::value, void>::type>
|
|
1395
|
+
XSIMD_INLINE batch<T, A> set(batch<T, A> const&, requires_arch<wasm>, T v0, T v1, T v2, T v3) noexcept
|
|
1396
|
+
{
|
|
1397
|
+
return wasm_i32x4_make(v0, v1, v2, v3);
|
|
1398
|
+
}
|
|
1399
|
+
|
|
1400
|
+
template <class A, class T, class = typename std::enable_if<std::is_integral<T>::value, void>::type>
|
|
1401
|
+
XSIMD_INLINE batch<T, A> set(batch<T, A> const&, requires_arch<wasm>, T v0, T v1, T v2, T v3, T v4, T v5, T v6, T v7) noexcept
|
|
1402
|
+
{
|
|
1403
|
+
return wasm_i16x8_make(v0, v1, v2, v3, v4, v5, v6, v7);
|
|
1404
|
+
}
|
|
1405
|
+
|
|
1406
|
+
template <class A, class T, class = typename std::enable_if<std::is_integral<T>::value, void>::type>
|
|
1407
|
+
XSIMD_INLINE batch<T, A> set(batch<T, A> const&, requires_arch<wasm>, T v0, T v1, T v2, T v3, T v4, T v5, T v6, T v7, T v8, T v9, T v10, T v11, T v12, T v13, T v14, T v15) noexcept
|
|
1408
|
+
{
|
|
1409
|
+
return wasm_i8x16_make(v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15);
|
|
1410
|
+
}
|
|
1411
|
+
|
|
1412
|
+
template <class A, class... Values>
|
|
1413
|
+
XSIMD_INLINE batch<double, A> set(batch<double, A> const&, requires_arch<wasm>, Values... values) noexcept
|
|
1414
|
+
{
|
|
1415
|
+
static_assert(sizeof...(Values) == batch<double, A>::size, "consistent init");
|
|
1416
|
+
return wasm_f64x2_make(values...);
|
|
1417
|
+
}
|
|
1418
|
+
|
|
1419
|
+
template <class A, class T, class... Values, class = typename std::enable_if<std::is_integral<T>::value, void>::type>
|
|
1420
|
+
XSIMD_INLINE batch_bool<T, A> set(batch_bool<T, A> const&, requires_arch<wasm>, Values... values) noexcept
|
|
1421
|
+
{
|
|
1422
|
+
return set(batch<T, A>(), A {}, static_cast<T>(values ? -1LL : 0LL)...).data;
|
|
1423
|
+
}
|
|
1424
|
+
|
|
1425
|
+
template <class A, class... Values>
|
|
1426
|
+
XSIMD_INLINE batch_bool<float, A> set(batch_bool<float, A> const&, requires_arch<wasm>, Values... values) noexcept
|
|
1427
|
+
{
|
|
1428
|
+
static_assert(sizeof...(Values) == batch_bool<float, A>::size, "consistent init");
|
|
1429
|
+
return set(batch<int32_t, A>(), A {}, static_cast<int32_t>(values ? -1LL : 0LL)...).data;
|
|
1430
|
+
}
|
|
1431
|
+
|
|
1432
|
+
template <class A, class... Values>
|
|
1433
|
+
XSIMD_INLINE batch_bool<double, A> set(batch_bool<double, A> const&, requires_arch<wasm>, Values... values) noexcept
|
|
1434
|
+
{
|
|
1435
|
+
static_assert(sizeof...(Values) == batch_bool<double, A>::size, "consistent init");
|
|
1436
|
+
return set(batch<int64_t, A>(), A {}, static_cast<int64_t>(values ? -1LL : 0LL)...).data;
|
|
1437
|
+
}
|
|
1438
|
+
|
|
1439
|
+
// ssub
|
|
1440
|
+
template <class A, class T, class = typename std::enable_if<std::is_integral<T>::value, void>::type>
|
|
1441
|
+
XSIMD_INLINE batch<T, A> ssub(batch<T, A> const& self, batch<T, A> const& other, requires_arch<wasm>) noexcept
|
|
1442
|
+
{
|
|
1443
|
+
if (std::is_signed<T>::value)
|
|
1444
|
+
{
|
|
1445
|
+
XSIMD_IF_CONSTEXPR(sizeof(T) == 1)
|
|
1446
|
+
{
|
|
1447
|
+
return wasm_i8x16_sub_sat(self, other);
|
|
1448
|
+
}
|
|
1449
|
+
else XSIMD_IF_CONSTEXPR(sizeof(T) == 2)
|
|
1450
|
+
{
|
|
1451
|
+
return wasm_i16x8_sub_sat(self, other);
|
|
1452
|
+
}
|
|
1453
|
+
else
|
|
1454
|
+
{
|
|
1455
|
+
return ssub(self, other, common {});
|
|
1456
|
+
}
|
|
1457
|
+
}
|
|
1458
|
+
else
|
|
1459
|
+
{
|
|
1460
|
+
XSIMD_IF_CONSTEXPR(sizeof(T) == 1)
|
|
1461
|
+
{
|
|
1462
|
+
return wasm_u8x16_sub_sat(self, other);
|
|
1463
|
+
}
|
|
1464
|
+
else XSIMD_IF_CONSTEXPR(sizeof(T) == 2)
|
|
1465
|
+
{
|
|
1466
|
+
return wasm_u16x8_sub_sat(self, other);
|
|
1467
|
+
}
|
|
1468
|
+
else
|
|
1469
|
+
{
|
|
1470
|
+
return ssub(self, other, common {});
|
|
1471
|
+
}
|
|
1472
|
+
}
|
|
1473
|
+
}
|
|
1474
|
+
|
|
1475
|
+
// store_aligned
|
|
1476
|
+
template <class A>
|
|
1477
|
+
XSIMD_INLINE void store_aligned(float* mem, batch<float, A> const& self, requires_arch<wasm>) noexcept
|
|
1478
|
+
{
|
|
1479
|
+
return wasm_v128_store(mem, self);
|
|
1480
|
+
}
|
|
1481
|
+
template <class A, class T, class = typename std::enable_if<std::is_integral<T>::value, void>::type>
|
|
1482
|
+
XSIMD_INLINE void store_aligned(T* mem, batch<T, A> const& self, requires_arch<wasm>) noexcept
|
|
1483
|
+
{
|
|
1484
|
+
return wasm_v128_store((v128_t*)mem, self);
|
|
1485
|
+
}
|
|
1486
|
+
template <class A, class T, class = typename std::enable_if<std::is_integral<T>::value, void>::type>
|
|
1487
|
+
XSIMD_INLINE void store_aligned(T* mem, batch_bool<T, A> const& self, requires_arch<wasm>) noexcept
|
|
1488
|
+
{
|
|
1489
|
+
return wasm_v128_store((v128_t*)mem, self);
|
|
1490
|
+
}
|
|
1491
|
+
template <class A>
|
|
1492
|
+
XSIMD_INLINE void store_aligned(double* mem, batch<double, A> const& self, requires_arch<wasm>) noexcept
|
|
1493
|
+
{
|
|
1494
|
+
return wasm_v128_store(mem, self);
|
|
1495
|
+
}
|
|
1496
|
+
|
|
1497
|
+
// store_complex
|
|
1498
|
+
namespace detail
|
|
1499
|
+
{
|
|
1500
|
+
// complex_low
|
|
1501
|
+
template <class A>
|
|
1502
|
+
XSIMD_INLINE batch<float, A> complex_low(batch<std::complex<float>, A> const& self, requires_arch<wasm>) noexcept
|
|
1503
|
+
{
|
|
1504
|
+
return wasm_i32x4_shuffle(self.real(), self.imag(), 0, 4, 1, 5);
|
|
1505
|
+
}
|
|
1506
|
+
// complex_high
|
|
1507
|
+
template <class A>
|
|
1508
|
+
XSIMD_INLINE batch<float, A> complex_high(batch<std::complex<float>, A> const& self, requires_arch<wasm>) noexcept
|
|
1509
|
+
{
|
|
1510
|
+
return wasm_i32x4_shuffle(self.real(), self.imag(), 2, 6, 3, 7);
|
|
1511
|
+
}
|
|
1512
|
+
template <class A>
|
|
1513
|
+
XSIMD_INLINE batch<double, A> complex_low(batch<std::complex<double>, A> const& self, requires_arch<wasm>) noexcept
|
|
1514
|
+
{
|
|
1515
|
+
return wasm_i64x2_shuffle(self.real(), self.imag(), 0, 2);
|
|
1516
|
+
}
|
|
1517
|
+
template <class A>
|
|
1518
|
+
XSIMD_INLINE batch<double, A> complex_high(batch<std::complex<double>, A> const& self, requires_arch<wasm>) noexcept
|
|
1519
|
+
{
|
|
1520
|
+
return wasm_i64x2_shuffle(self.real(), self.imag(), 1, 3);
|
|
1521
|
+
}
|
|
1522
|
+
}
|
|
1523
|
+
|
|
1524
|
+
// store_unaligned
|
|
1525
|
+
template <class A>
|
|
1526
|
+
XSIMD_INLINE void store_unaligned(float* mem, batch<float, A> const& self, requires_arch<wasm>) noexcept
|
|
1527
|
+
{
|
|
1528
|
+
return wasm_v128_store(mem, self);
|
|
1529
|
+
}
|
|
1530
|
+
template <class A, class T, class = typename std::enable_if<std::is_integral<T>::value, void>::type>
|
|
1531
|
+
XSIMD_INLINE void store_unaligned(T* mem, batch<T, A> const& self, requires_arch<wasm>) noexcept
|
|
1532
|
+
{
|
|
1533
|
+
return wasm_v128_store((v128_t*)mem, self);
|
|
1534
|
+
}
|
|
1535
|
+
template <class A, class T, class = typename std::enable_if<std::is_integral<T>::value, void>::type>
|
|
1536
|
+
XSIMD_INLINE void store_unaligned(T* mem, batch_bool<T, A> const& self, requires_arch<wasm>) noexcept
|
|
1537
|
+
{
|
|
1538
|
+
return wasm_v128_store((v128_t*)mem, self);
|
|
1539
|
+
}
|
|
1540
|
+
template <class A>
|
|
1541
|
+
XSIMD_INLINE void store_unaligned(double* mem, batch<double, A> const& self, requires_arch<wasm>) noexcept
|
|
1542
|
+
{
|
|
1543
|
+
return wasm_v128_store(mem, self);
|
|
1544
|
+
}
|
|
1545
|
+
|
|
1546
|
+
// sub
|
|
1547
|
+
template <class A>
|
|
1548
|
+
XSIMD_INLINE batch<float, A> sub(batch<float, A> const& self, batch<float, A> const& other, requires_arch<wasm>) noexcept
|
|
1549
|
+
{
|
|
1550
|
+
return wasm_f32x4_sub(self, other);
|
|
1551
|
+
}
|
|
1552
|
+
template <class A, class T, class = typename std::enable_if<std::is_integral<T>::value, void>::type>
|
|
1553
|
+
XSIMD_INLINE batch<T, A> sub(batch<T, A> const& self, batch<T, A> const& other, requires_arch<wasm>) noexcept
|
|
1554
|
+
{
|
|
1555
|
+
XSIMD_IF_CONSTEXPR(sizeof(T) == 1)
|
|
1556
|
+
{
|
|
1557
|
+
return wasm_i8x16_sub(self, other);
|
|
1558
|
+
}
|
|
1559
|
+
else XSIMD_IF_CONSTEXPR(sizeof(T) == 2)
|
|
1560
|
+
{
|
|
1561
|
+
return wasm_i16x8_sub(self, other);
|
|
1562
|
+
}
|
|
1563
|
+
else XSIMD_IF_CONSTEXPR(sizeof(T) == 4)
|
|
1564
|
+
{
|
|
1565
|
+
return wasm_i32x4_sub(self, other);
|
|
1566
|
+
}
|
|
1567
|
+
else XSIMD_IF_CONSTEXPR(sizeof(T) == 8)
|
|
1568
|
+
{
|
|
1569
|
+
return wasm_i64x2_sub(self, other);
|
|
1570
|
+
}
|
|
1571
|
+
else
|
|
1572
|
+
{
|
|
1573
|
+
assert(false && "unsupported arch/op combination");
|
|
1574
|
+
return {};
|
|
1575
|
+
}
|
|
1576
|
+
}
|
|
1577
|
+
template <class A>
|
|
1578
|
+
XSIMD_INLINE batch<double, A> sub(batch<double, A> const& self, batch<double, A> const& other, requires_arch<wasm>) noexcept
|
|
1579
|
+
{
|
|
1580
|
+
return wasm_f64x2_sub(self, other);
|
|
1581
|
+
}
|
|
1582
|
+
|
|
1583
|
+
// sqrt
|
|
1584
|
+
template <class A>
|
|
1585
|
+
XSIMD_INLINE batch<float, A> sqrt(batch<float, A> const& val, requires_arch<wasm>) noexcept
|
|
1586
|
+
{
|
|
1587
|
+
return wasm_f32x4_sqrt(val);
|
|
1588
|
+
}
|
|
1589
|
+
template <class A>
|
|
1590
|
+
XSIMD_INLINE batch<double, A> sqrt(batch<double, A> const& val, requires_arch<wasm>) noexcept
|
|
1591
|
+
{
|
|
1592
|
+
return wasm_f64x2_sqrt(val);
|
|
1593
|
+
}
|
|
1594
|
+
|
|
1595
|
+
// swizzle
|
|
1596
|
+
template <class A, uint32_t V0, uint32_t V1, uint32_t V2, uint32_t V3>
|
|
1597
|
+
XSIMD_INLINE batch<float, A> swizzle(batch<float, A> const& self, batch_constant<uint32_t, A, V0, V1, V2, V3>, requires_arch<wasm>) noexcept
|
|
1598
|
+
{
|
|
1599
|
+
return wasm_i32x4_shuffle(self, self, V0, V1, V2, V3);
|
|
1600
|
+
}
|
|
1601
|
+
|
|
1602
|
+
template <class A, uint64_t V0, uint64_t V1>
|
|
1603
|
+
XSIMD_INLINE batch<double, A> swizzle(batch<double, A> const& self, batch_constant<uint64_t, A, V0, V1>, requires_arch<wasm>) noexcept
|
|
1604
|
+
{
|
|
1605
|
+
return wasm_i64x2_shuffle(self, self, V0, V1);
|
|
1606
|
+
}
|
|
1607
|
+
|
|
1608
|
+
template <class A, uint64_t V0, uint64_t V1>
|
|
1609
|
+
XSIMD_INLINE batch<uint64_t, A> swizzle(batch<uint64_t, A> const& self, batch_constant<uint64_t, A, V0, V1>, requires_arch<wasm>) noexcept
|
|
1610
|
+
{
|
|
1611
|
+
return wasm_i64x2_shuffle(self, self, V0, V1);
|
|
1612
|
+
}
|
|
1613
|
+
|
|
1614
|
+
template <class A, uint64_t V0, uint64_t V1>
|
|
1615
|
+
XSIMD_INLINE batch<int64_t, A> swizzle(batch<int64_t, A> const& self, batch_constant<uint64_t, A, V0, V1> mask, requires_arch<wasm>) noexcept
|
|
1616
|
+
{
|
|
1617
|
+
return bitwise_cast<int64_t>(swizzle(bitwise_cast<uint64_t>(self), mask, wasm {}));
|
|
1618
|
+
}
|
|
1619
|
+
|
|
1620
|
+
template <class A, uint32_t V0, uint32_t V1, uint32_t V2, uint32_t V3>
|
|
1621
|
+
XSIMD_INLINE batch<uint32_t, A> swizzle(batch<uint32_t, A> const& self, batch_constant<uint32_t, A, V0, V1, V2, V3>, requires_arch<wasm>) noexcept
|
|
1622
|
+
{
|
|
1623
|
+
return wasm_i32x4_shuffle(self, self, V0, V1, V2, V3);
|
|
1624
|
+
}
|
|
1625
|
+
|
|
1626
|
+
template <class A, uint32_t V0, uint32_t V1, uint32_t V2, uint32_t V3>
|
|
1627
|
+
XSIMD_INLINE batch<int32_t, A> swizzle(batch<int32_t, A> const& self, batch_constant<uint32_t, A, V0, V1, V2, V3> mask, requires_arch<wasm>) noexcept
|
|
1628
|
+
{
|
|
1629
|
+
return bitwise_cast<int32_t>(swizzle(bitwise_cast<uint32_t>(self), mask, wasm {}));
|
|
1630
|
+
}
|
|
1631
|
+
|
|
1632
|
+
template <class A, uint16_t V0, uint16_t V1, uint16_t V2, uint16_t V3, uint16_t V4, uint16_t V5, uint16_t V6, uint16_t V7>
|
|
1633
|
+
XSIMD_INLINE batch<uint16_t, A> swizzle(batch<uint16_t, A> const& self, batch_constant<uint16_t, A, V0, V1, V2, V3, V4, V5, V6, V7>, requires_arch<wasm>) noexcept
|
|
1634
|
+
{
|
|
1635
|
+
return wasm_i16x8_shuffle(self, self, V0, V1, V2, V3, V4, V5, V6, V7);
|
|
1636
|
+
}
|
|
1637
|
+
|
|
1638
|
+
template <class A, uint16_t V0, uint16_t V1, uint16_t V2, uint16_t V3, uint16_t V4, uint16_t V5, uint16_t V6, uint16_t V7>
|
|
1639
|
+
XSIMD_INLINE batch<int16_t, A> swizzle(batch<int16_t, A> const& self, batch_constant<uint16_t, A, V0, V1, V2, V3, V4, V5, V6, V7> mask, requires_arch<wasm>) noexcept
|
|
1640
|
+
{
|
|
1641
|
+
return bitwise_cast<int16_t>(swizzle(bitwise_cast<uint16_t>(self), mask, wasm {}));
|
|
1642
|
+
}
|
|
1643
|
+
|
|
1644
|
+
template <class A, uint8_t V0, uint8_t V1, uint8_t V2, uint8_t V3, uint8_t V4, uint8_t V5, uint8_t V6, uint8_t V7,
|
|
1645
|
+
uint8_t V8, uint8_t V9, uint8_t V10, uint8_t V11, uint8_t V12, uint8_t V13, uint8_t V14, uint8_t V15>
|
|
1646
|
+
XSIMD_INLINE batch<uint8_t, A> swizzle(batch<uint8_t, A> const& self, batch_constant<uint8_t, A, V0, V1, V2, V3, V4, V5, V6, V7, V8, V9, V10, V11, V12, V13, V14, V15>, requires_arch<wasm>) noexcept
|
|
1647
|
+
{
|
|
1648
|
+
return wasm_i8x16_shuffle(self, self, V0, V1, V2, V3, V4, V5, V6, V7, V8, V9, V10, V11, V12, V13, V14, V15);
|
|
1649
|
+
}
|
|
1650
|
+
|
|
1651
|
+
template <class A, uint8_t V0, uint8_t V1, uint8_t V2, uint8_t V3, uint8_t V4, uint8_t V5, uint8_t V6, uint8_t V7,
|
|
1652
|
+
uint8_t V8, uint8_t V9, uint8_t V10, uint8_t V11, uint8_t V12, uint8_t V13, uint8_t V14, uint8_t V15>
|
|
1653
|
+
XSIMD_INLINE batch<int8_t, A> swizzle(batch<int8_t, A> const& self, batch_constant<uint8_t, A, V0, V1, V2, V3, V4, V5, V6, V7, V8, V9, V10, V11, V12, V13, V14, V15> mask, requires_arch<wasm>) noexcept
|
|
1654
|
+
{
|
|
1655
|
+
return bitwise_cast<int8_t>(swizzle(bitwise_cast<uint8_t>(self), mask, wasm {}));
|
|
1656
|
+
}
|
|
1657
|
+
|
|
1658
|
+
// transpose
|
|
1659
|
+
template <class A, class T>
|
|
1660
|
+
XSIMD_INLINE void transpose(batch<T, A>* matrix_begin, batch<T, A>* matrix_end, requires_arch<wasm>) noexcept
|
|
1661
|
+
{
|
|
1662
|
+
assert((matrix_end - matrix_begin == batch<T, A>::size) && "correctly sized matrix");
|
|
1663
|
+
(void)matrix_end;
|
|
1664
|
+
XSIMD_IF_CONSTEXPR(sizeof(T) == 4)
|
|
1665
|
+
{
|
|
1666
|
+
auto r0 = matrix_begin[0], r1 = matrix_begin[1], r2 = matrix_begin[2], r3 = matrix_begin[3];
|
|
1667
|
+
|
|
1668
|
+
auto t0 = wasm_i32x4_shuffle(r0, r1, 0, 4, 1, 5); // r0[0] r1[0] r0[1] r1[1]
|
|
1669
|
+
auto t1 = wasm_i32x4_shuffle(r0, r1, 2, 6, 3, 7); // r0[2] r1[2] r0[3] r1[3]
|
|
1670
|
+
|
|
1671
|
+
auto t2 = wasm_i32x4_shuffle(r2, r3, 0, 4, 1, 5); // r2[0] r3[0] r2[1] r3[1]
|
|
1672
|
+
auto t3 = wasm_i32x4_shuffle(r2, r3, 2, 6, 3, 7); // r2[2] r3[2] r2[3] r3[3]
|
|
1673
|
+
|
|
1674
|
+
matrix_begin[0] = wasm_i32x4_shuffle(t0, t2, 0, 1, 4, 5); // r0[0] r1[0] r2[0] r3[0]
|
|
1675
|
+
matrix_begin[1] = wasm_i32x4_shuffle(t0, t2, 2, 3, 6, 7); // r0[1] r1[1] r2[1] r3[1]
|
|
1676
|
+
matrix_begin[2] = wasm_i32x4_shuffle(t1, t3, 0, 1, 4, 5); // r0[2] r1[2] r2[2] r3[2]
|
|
1677
|
+
matrix_begin[3] = wasm_i32x4_shuffle(t1, t3, 2, 3, 6, 7); // r0[3] r1[3] r2[3] r3[3]
|
|
1678
|
+
}
|
|
1679
|
+
else XSIMD_IF_CONSTEXPR(sizeof(T) == 8)
|
|
1680
|
+
{
|
|
1681
|
+
auto r0 = matrix_begin[0], r1 = matrix_begin[1];
|
|
1682
|
+
|
|
1683
|
+
matrix_begin[0] = wasm_i64x2_shuffle(r0, r1, 0, 2);
|
|
1684
|
+
matrix_begin[1] = wasm_i64x2_shuffle(r0, r1, 1, 3);
|
|
1685
|
+
}
|
|
1686
|
+
else
|
|
1687
|
+
{
|
|
1688
|
+
transpose(matrix_begin, matrix_end, common {});
|
|
1689
|
+
}
|
|
1690
|
+
}
|
|
1691
|
+
|
|
1692
|
+
// trunc
|
|
1693
|
+
template <class A>
|
|
1694
|
+
XSIMD_INLINE batch<float, A> trunc(batch<float, A> const& self, requires_arch<wasm>) noexcept
|
|
1695
|
+
{
|
|
1696
|
+
return wasm_f32x4_trunc(self);
|
|
1697
|
+
}
|
|
1698
|
+
template <class A>
|
|
1699
|
+
XSIMD_INLINE batch<double, A> trunc(batch<double, A> const& self, requires_arch<wasm>) noexcept
|
|
1700
|
+
{
|
|
1701
|
+
return wasm_f64x2_trunc(self);
|
|
1702
|
+
}
|
|
1703
|
+
|
|
1704
|
+
// zip_hi
|
|
1705
|
+
template <class A>
|
|
1706
|
+
XSIMD_INLINE batch<float, A> zip_hi(batch<float, A> const& self, batch<float, A> const& other, requires_arch<wasm>) noexcept
|
|
1707
|
+
{
|
|
1708
|
+
return wasm_i32x4_shuffle(self, other, 2, 6, 3, 7);
|
|
1709
|
+
}
|
|
1710
|
+
template <class A, class T, class = typename std::enable_if<std::is_integral<T>::value, void>::type>
|
|
1711
|
+
XSIMD_INLINE batch<T, A> zip_hi(batch<T, A> const& self, batch<T, A> const& other, requires_arch<wasm>) noexcept
|
|
1712
|
+
{
|
|
1713
|
+
XSIMD_IF_CONSTEXPR(sizeof(T) == 1)
|
|
1714
|
+
{
|
|
1715
|
+
return wasm_i8x16_shuffle(self, other, 8, 24, 9, 25, 10, 26, 11, 27, 12, 28, 13, 29, 14, 30, 15, 31);
|
|
1716
|
+
}
|
|
1717
|
+
else XSIMD_IF_CONSTEXPR(sizeof(T) == 2)
|
|
1718
|
+
{
|
|
1719
|
+
return wasm_i16x8_shuffle(self, other, 4, 12, 5, 13, 6, 14, 7, 15);
|
|
1720
|
+
}
|
|
1721
|
+
else XSIMD_IF_CONSTEXPR(sizeof(T) == 4)
|
|
1722
|
+
{
|
|
1723
|
+
return wasm_i32x4_shuffle(self, other, 2, 6, 3, 7);
|
|
1724
|
+
}
|
|
1725
|
+
else XSIMD_IF_CONSTEXPR(sizeof(T) == 8)
|
|
1726
|
+
{
|
|
1727
|
+
return wasm_i64x2_shuffle(self, other, 1, 3);
|
|
1728
|
+
}
|
|
1729
|
+
else
|
|
1730
|
+
{
|
|
1731
|
+
assert(false && "unsupported arch/op combination");
|
|
1732
|
+
return {};
|
|
1733
|
+
}
|
|
1734
|
+
}
|
|
1735
|
+
template <class A>
|
|
1736
|
+
XSIMD_INLINE batch<double, A> zip_hi(batch<double, A> const& self, batch<double, A> const& other, requires_arch<wasm>) noexcept
|
|
1737
|
+
{
|
|
1738
|
+
return wasm_i64x2_shuffle(self, other, 1, 3);
|
|
1739
|
+
}
|
|
1740
|
+
|
|
1741
|
+
// zip_lo
|
|
1742
|
+
template <class A>
|
|
1743
|
+
XSIMD_INLINE batch<float, A> zip_lo(batch<float, A> const& self, batch<float, A> const& other, requires_arch<wasm>) noexcept
|
|
1744
|
+
{
|
|
1745
|
+
return wasm_i32x4_shuffle(self, other, 0, 4, 1, 5);
|
|
1746
|
+
}
|
|
1747
|
+
template <class A, class T, class = typename std::enable_if<std::is_integral<T>::value, void>::type>
|
|
1748
|
+
XSIMD_INLINE batch<T, A> zip_lo(batch<T, A> const& self, batch<T, A> const& other, requires_arch<wasm>) noexcept
|
|
1749
|
+
{
|
|
1750
|
+
XSIMD_IF_CONSTEXPR(sizeof(T) == 1)
|
|
1751
|
+
{
|
|
1752
|
+
return wasm_i8x16_shuffle(self, other, 0, 16, 1, 17, 2, 18, 3, 19, 4, 20, 5, 21, 6, 22, 7, 23);
|
|
1753
|
+
}
|
|
1754
|
+
else XSIMD_IF_CONSTEXPR(sizeof(T) == 2)
|
|
1755
|
+
{
|
|
1756
|
+
return wasm_i16x8_shuffle(self, other, 0, 8, 1, 9, 2, 10, 3, 11);
|
|
1757
|
+
}
|
|
1758
|
+
else XSIMD_IF_CONSTEXPR(sizeof(T) == 4)
|
|
1759
|
+
{
|
|
1760
|
+
return wasm_i32x4_shuffle(self, other, 0, 4, 1, 5);
|
|
1761
|
+
}
|
|
1762
|
+
else XSIMD_IF_CONSTEXPR(sizeof(T) == 8)
|
|
1763
|
+
{
|
|
1764
|
+
return wasm_i64x2_shuffle(self, other, 0, 2);
|
|
1765
|
+
}
|
|
1766
|
+
else
|
|
1767
|
+
{
|
|
1768
|
+
assert(false && "unsupported arch/op combination");
|
|
1769
|
+
return {};
|
|
1770
|
+
}
|
|
1771
|
+
}
|
|
1772
|
+
template <class A>
|
|
1773
|
+
XSIMD_INLINE batch<double, A> zip_lo(batch<double, A> const& self, batch<double, A> const& other, requires_arch<wasm>) noexcept
|
|
1774
|
+
{
|
|
1775
|
+
return wasm_i64x2_shuffle(self, other, 0, 2);
|
|
1776
|
+
}
|
|
1777
|
+
}
|
|
1778
|
+
}
|
|
1779
|
+
|
|
1780
|
+
#endif
|