LCOV - code coverage report
Current view: top level - third_party/aom/aom_dsp/simd - v256_intrinsics_v128.h (source / functions) Hit Total Coverage
Test: output.info Lines: 0 7 0.0 %
Date: 2017-07-14 16:53:18 Functions: 0 0 -
Legend: Lines: hit not hit

          Line data    Source code
       1             : /*
       2             :  * Copyright (c) 2016, Alliance for Open Media. All rights reserved
       3             :  *
       4             :  * This source code is subject to the terms of the BSD 2 Clause License and
       5             :  * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License
       6             :  * was not distributed with this source code in the LICENSE file, you can
       7             :  * obtain it at www.aomedia.org/license/software. If the Alliance for Open
       8             :  * Media Patent License 1.0 was not distributed with this source code in the
       9             :  * PATENTS file, you can obtain it at www.aomedia.org/license/patent.
      10             :  */
      11             : 
      12             : #ifndef _V256_INTRINSICS_V128_H
      13             : #define _V256_INTRINSICS_V128_H
      14             : 
      15             : #if HAVE_NEON
      16             : #include "./v128_intrinsics_arm.h"
      17             : #elif HAVE_SSE2
      18             : #include "./v128_intrinsics_x86.h"
      19             : #else
      20             : #include "./v128_intrinsics.h"
      21             : #endif
      22             : 
      23             : typedef struct { v128 lo, hi; } v256;
      24             : 
      25             : SIMD_INLINE uint32_t v256_low_u32(v256 a) { return v128_low_u32(a.lo); }
      26             : 
      27             : SIMD_INLINE v64 v256_low_v64(v256 a) { return v128_low_v64(a.lo); }
      28             : 
      29           0 : SIMD_INLINE v128 v256_low_v128(v256 a) { return a.lo; }
      30             : 
      31           0 : SIMD_INLINE v128 v256_high_v128(v256 a) { return a.hi; }
      32             : 
      33             : SIMD_INLINE v256 v256_from_v128(v128 hi, v128 lo) {
      34             :   v256 t;
      35           0 :   t.hi = hi;
      36           0 :   t.lo = lo;
      37           0 :   return t;
      38             : }
      39             : 
      40             : SIMD_INLINE v256 v256_from_64(uint64_t a, uint64_t b, uint64_t c, uint64_t d) {
      41             :   return v256_from_v128(v128_from_64(a, b), v128_from_64(c, d));
      42             : }
      43             : 
      44             : SIMD_INLINE v256 v256_from_v64(v64 a, v64 b, v64 c, v64 d) {
      45           0 :   return v256_from_v128(v128_from_v64(a, b), v128_from_v64(c, d));
      46             : }
      47             : 
      48             : SIMD_INLINE v256 v256_load_unaligned(const void *p) {
      49             :   return v256_from_v128(v128_load_unaligned((uint8_t *)p + 16),
      50             :                         v128_load_unaligned(p));
      51             : }
      52             : 
      53             : SIMD_INLINE v256 v256_load_aligned(const void *p) {
      54             :   return v256_from_v128(v128_load_aligned((uint8_t *)p + 16),
      55             :                         v128_load_aligned(p));
      56             : }
      57             : 
      58             : SIMD_INLINE void v256_store_unaligned(void *p, v256 a) {
      59             :   v128_store_unaligned(p, a.lo);
      60             :   v128_store_unaligned((uint8_t *)p + 16, a.hi);
      61             : }
      62             : 
      63             : SIMD_INLINE void v256_store_aligned(void *p, v256 a) {
      64             :   v128_store_aligned(p, a.lo);
      65             :   v128_store_aligned((uint8_t *)p + 16, a.hi);
      66             : }
      67             : 
      68             : SIMD_INLINE v256 v256_zero() {
      69             :   return v256_from_v128(v128_zero(), v128_zero());
      70             : }
      71             : 
      72             : SIMD_INLINE v256 v256_dup_8(uint8_t x) {
      73             :   v128 t = v128_dup_8(x);
      74             :   return v256_from_v128(t, t);
      75             : }
      76             : 
      77             : SIMD_INLINE v256 v256_dup_16(uint16_t x) {
      78             :   v128 t = v128_dup_16(x);
      79             :   return v256_from_v128(t, t);
      80             : }
      81             : 
      82             : SIMD_INLINE v256 v256_dup_32(uint32_t x) {
      83             :   v128 t = v128_dup_32(x);
      84             :   return v256_from_v128(t, t);
      85             : }
      86             : 
      87             : SIMD_INLINE int64_t v256_dotp_s16(v256 a, v256 b) {
      88             :   return v128_dotp_s16(a.hi, b.hi) + v128_dotp_s16(a.lo, b.lo);
      89             : }
      90             : 
      91             : SIMD_INLINE uint64_t v256_hadd_u8(v256 a) {
      92             :   return v128_hadd_u8(a.hi) + v128_hadd_u8(a.lo);
      93             : }
      94             : 
      95             : typedef struct {
      96             :   sad128_internal hi;
      97             :   sad128_internal lo;
      98             : } sad256_internal;
      99             : 
     100             : SIMD_INLINE sad256_internal v256_sad_u8_init() {
     101             :   sad256_internal t;
     102             :   t.hi = v128_sad_u8_init();
     103             :   t.lo = v128_sad_u8_init();
     104             :   return t;
     105             : }
     106             : 
     107             : /* Implementation dependent return value.  Result must be finalised with
     108             :    v256_sad_u8_sum().
     109             :    The result for more than 16 v256_sad_u8() calls is undefined. */
     110             : SIMD_INLINE sad256_internal v256_sad_u8(sad256_internal s, v256 a, v256 b) {
     111             :   sad256_internal t;
     112             :   t.hi = v128_sad_u8(s.hi, a.hi, b.hi);
     113             :   t.lo = v128_sad_u8(s.lo, a.lo, b.lo);
     114             :   return t;
     115             : }
     116             : 
     117             : SIMD_INLINE uint32_t v256_sad_u8_sum(sad256_internal s) {
     118             :   return v128_sad_u8_sum(s.hi) + v128_sad_u8_sum(s.lo);
     119             : }
     120             : 
     121             : typedef struct {
     122             :   ssd128_internal hi;
     123             :   ssd128_internal lo;
     124             : } ssd256_internal;
     125             : 
     126             : SIMD_INLINE ssd256_internal v256_ssd_u8_init() {
     127             :   ssd256_internal t;
     128             :   t.hi = v128_ssd_u8_init();
     129             :   t.lo = v128_ssd_u8_init();
     130             :   return t;
     131             : }
     132             : 
     133             : /* Implementation dependent return value.  Result must be finalised with
     134             :  * v256_ssd_u8_sum(). */
     135             : SIMD_INLINE ssd256_internal v256_ssd_u8(ssd256_internal s, v256 a, v256 b) {
     136             :   ssd256_internal t;
     137             :   t.hi = v128_ssd_u8(s.hi, a.hi, b.hi);
     138             :   t.lo = v128_ssd_u8(s.lo, a.lo, b.lo);
     139             :   return t;
     140             : }
     141             : 
     142             : SIMD_INLINE uint32_t v256_ssd_u8_sum(ssd256_internal s) {
     143             :   return v128_ssd_u8_sum(s.hi) + v128_ssd_u8_sum(s.lo);
     144             : }
     145             : 
     146             : SIMD_INLINE v256 v256_or(v256 a, v256 b) {
     147             :   return v256_from_v128(v128_or(a.hi, b.hi), v128_or(a.lo, b.lo));
     148             : }
     149             : 
     150             : SIMD_INLINE v256 v256_xor(v256 a, v256 b) {
     151             :   return v256_from_v128(v128_xor(a.hi, b.hi), v128_xor(a.lo, b.lo));
     152             : }
     153             : 
     154             : SIMD_INLINE v256 v256_and(v256 a, v256 b) {
     155             :   return v256_from_v128(v128_and(a.hi, b.hi), v128_and(a.lo, b.lo));
     156             : }
     157             : 
     158             : SIMD_INLINE v256 v256_andn(v256 a, v256 b) {
     159             :   return v256_from_v128(v128_andn(a.hi, b.hi), v128_andn(a.lo, b.lo));
     160             : }
     161             : 
     162             : SIMD_INLINE v256 v256_add_8(v256 a, v256 b) {
     163             :   return v256_from_v128(v128_add_8(a.hi, b.hi), v128_add_8(a.lo, b.lo));
     164             : }
     165             : 
     166             : SIMD_INLINE v256 v256_add_16(v256 a, v256 b) {
     167             :   return v256_from_v128(v128_add_16(a.hi, b.hi), v128_add_16(a.lo, b.lo));
     168             : }
     169             : 
     170             : SIMD_INLINE v256 v256_sadd_s16(v256 a, v256 b) {
     171             :   return v256_from_v128(v128_sadd_s16(a.hi, b.hi), v128_sadd_s16(a.lo, b.lo));
     172             : }
     173             : 
     174             : SIMD_INLINE v256 v256_add_32(v256 a, v256 b) {
     175             :   return v256_from_v128(v128_add_32(a.hi, b.hi), v128_add_32(a.lo, b.lo));
     176             : }
     177             : 
     178             : SIMD_INLINE v256 v256_padd_s16(v256 a) {
     179             :   return v256_from_v128(v128_padd_s16(a.hi), v128_padd_s16(a.lo));
     180             : }
     181             : 
     182             : SIMD_INLINE v256 v256_sub_8(v256 a, v256 b) {
     183             :   return v256_from_v128(v128_sub_8(a.hi, b.hi), v128_sub_8(a.lo, b.lo));
     184             : }
     185             : 
     186             : SIMD_INLINE v256 v256_ssub_u8(v256 a, v256 b) {
     187             :   return v256_from_v128(v128_ssub_u8(a.hi, b.hi), v128_ssub_u8(a.lo, b.lo));
     188             : }
     189             : 
     190             : SIMD_INLINE v256 v256_ssub_s8(v256 a, v256 b) {
     191             :   return v256_from_v128(v128_ssub_s8(a.hi, b.hi), v128_ssub_s8(a.lo, b.lo));
     192             : }
     193             : 
     194             : SIMD_INLINE v256 v256_sub_16(v256 a, v256 b) {
     195           0 :   return v256_from_v128(v128_sub_16(a.hi, b.hi), v128_sub_16(a.lo, b.lo));
     196             : }
     197             : 
     198             : SIMD_INLINE v256 v256_ssub_s16(v256 a, v256 b) {
     199             :   return v256_from_v128(v128_ssub_s16(a.hi, b.hi), v128_ssub_s16(a.lo, b.lo));
     200             : }
     201             : 
     202             : SIMD_INLINE v256 v256_ssub_u16(v256 a, v256 b) {
     203             :   return v256_from_v128(v128_ssub_u16(a.hi, b.hi), v128_ssub_u16(a.lo, b.lo));
     204             : }
     205             : 
     206             : SIMD_INLINE v256 v256_sub_32(v256 a, v256 b) {
     207             :   return v256_from_v128(v128_sub_32(a.hi, b.hi), v128_sub_32(a.lo, b.lo));
     208             : }
     209             : 
     210             : SIMD_INLINE v256 v256_abs_s16(v256 a) {
     211             :   return v256_from_v128(v128_abs_s16(a.hi), v128_abs_s16(a.lo));
     212             : }
     213             : 
     214             : SIMD_INLINE v256 v256_abs_s8(v256 a) {
     215             :   return v256_from_v128(v128_abs_s8(a.hi), v128_abs_s8(a.lo));
     216             : }
     217             : 
     218             : SIMD_INLINE v256 v256_mul_s16(v128 a, v128 b) {
     219             :   v128 lo_bits = v128_mullo_s16(a, b);
     220             :   v128 hi_bits = v128_mulhi_s16(a, b);
     221             :   return v256_from_v128(v128_ziphi_16(hi_bits, lo_bits),
     222             :                         v128_ziplo_16(hi_bits, lo_bits));
     223             : }
     224             : 
     225             : SIMD_INLINE v256 v256_mullo_s16(v256 a, v256 b) {
     226             :   return v256_from_v128(v128_mullo_s16(a.hi, b.hi), v128_mullo_s16(a.lo, b.lo));
     227             : }
     228             : 
     229             : SIMD_INLINE v256 v256_mulhi_s16(v256 a, v256 b) {
     230             :   return v256_from_v128(v128_mulhi_s16(a.hi, b.hi), v128_mulhi_s16(a.lo, b.lo));
     231             : }
     232             : 
     233             : SIMD_INLINE v256 v256_mullo_s32(v256 a, v256 b) {
     234             :   return v256_from_v128(v128_mullo_s32(a.hi, b.hi), v128_mullo_s32(a.lo, b.lo));
     235             : }
     236             : 
     237             : SIMD_INLINE v256 v256_madd_s16(v256 a, v256 b) {
     238             :   return v256_from_v128(v128_madd_s16(a.hi, b.hi), v128_madd_s16(a.lo, b.lo));
     239             : }
     240             : 
     241             : SIMD_INLINE v256 v256_madd_us8(v256 a, v256 b) {
     242             :   return v256_from_v128(v128_madd_us8(a.hi, b.hi), v128_madd_us8(a.lo, b.lo));
     243             : }
     244             : 
     245             : SIMD_INLINE v256 v256_avg_u8(v256 a, v256 b) {
     246             :   return v256_from_v128(v128_avg_u8(a.hi, b.hi), v128_avg_u8(a.lo, b.lo));
     247             : }
     248             : 
     249             : SIMD_INLINE v256 v256_rdavg_u8(v256 a, v256 b) {
     250             :   return v256_from_v128(v128_rdavg_u8(a.hi, b.hi), v128_rdavg_u8(a.lo, b.lo));
     251             : }
     252             : 
     253             : SIMD_INLINE v256 v256_avg_u16(v256 a, v256 b) {
     254             :   return v256_from_v128(v128_avg_u16(a.hi, b.hi), v128_avg_u16(a.lo, b.lo));
     255             : }
     256             : 
     257             : SIMD_INLINE v256 v256_min_u8(v256 a, v256 b) {
     258             :   return v256_from_v128(v128_min_u8(a.hi, b.hi), v128_min_u8(a.lo, b.lo));
     259             : }
     260             : 
     261             : SIMD_INLINE v256 v256_max_u8(v256 a, v256 b) {
     262             :   return v256_from_v128(v128_max_u8(a.hi, b.hi), v128_max_u8(a.lo, b.lo));
     263             : }
     264             : 
     265             : SIMD_INLINE v256 v256_min_s8(v256 a, v256 b) {
     266             :   return v256_from_v128(v128_min_s8(a.hi, b.hi), v128_min_s8(a.lo, b.lo));
     267             : }
     268             : 
     269             : SIMD_INLINE v256 v256_max_s8(v256 a, v256 b) {
     270             :   return v256_from_v128(v128_max_s8(a.hi, b.hi), v128_max_s8(a.lo, b.lo));
     271             : }
     272             : 
     273             : SIMD_INLINE v256 v256_min_s16(v256 a, v256 b) {
     274             :   return v256_from_v128(v128_min_s16(a.hi, b.hi), v128_min_s16(a.lo, b.lo));
     275             : }
     276             : 
     277             : SIMD_INLINE v256 v256_max_s16(v256 a, v256 b) {
     278             :   return v256_from_v128(v128_max_s16(a.hi, b.hi), v128_max_s16(a.lo, b.lo));
     279             : }
     280             : 
     281             : SIMD_INLINE v256 v256_ziplo_8(v256 a, v256 b) {
     282             :   return v256_from_v128(v128_ziphi_8(a.lo, b.lo), v128_ziplo_8(a.lo, b.lo));
     283             : }
     284             : 
     285             : SIMD_INLINE v256 v256_ziphi_8(v256 a, v256 b) {
     286             :   return v256_from_v128(v128_ziphi_8(a.hi, b.hi), v128_ziplo_8(a.hi, b.hi));
     287             : }
     288             : 
     289             : SIMD_INLINE v256 v256_ziplo_16(v256 a, v256 b) {
     290             :   return v256_from_v128(v128_ziphi_16(a.lo, b.lo), v128_ziplo_16(a.lo, b.lo));
     291             : }
     292             : 
     293             : SIMD_INLINE v256 v256_ziphi_16(v256 a, v256 b) {
     294             :   return v256_from_v128(v128_ziphi_16(a.hi, b.hi), v128_ziplo_16(a.hi, b.hi));
     295             : }
     296             : 
     297             : SIMD_INLINE v256 v256_ziplo_32(v256 a, v256 b) {
     298             :   return v256_from_v128(v128_ziphi_32(a.lo, b.lo), v128_ziplo_32(a.lo, b.lo));
     299             : }
     300             : 
     301             : SIMD_INLINE v256 v256_ziphi_32(v256 a, v256 b) {
     302             :   return v256_from_v128(v128_ziphi_32(a.hi, b.hi), v128_ziplo_32(a.hi, b.hi));
     303             : }
     304             : 
     305             : SIMD_INLINE v256 v256_ziplo_64(v256 a, v256 b) {
     306             :   return v256_from_v128(v128_ziphi_64(a.lo, b.lo), v128_ziplo_64(a.lo, b.lo));
     307             : }
     308             : 
     309             : SIMD_INLINE v256 v256_ziphi_64(v256 a, v256 b) {
     310             :   return v256_from_v128(v128_ziphi_64(a.hi, b.hi), v128_ziplo_64(a.hi, b.hi));
     311             : }
     312             : 
     313             : SIMD_INLINE v256 v256_ziplo_128(v256 a, v256 b) {
     314             :   return v256_from_v128(a.lo, b.lo);
     315             : }
     316             : 
     317             : SIMD_INLINE v256 v256_ziphi_128(v256 a, v256 b) {
     318             :   return v256_from_v128(a.hi, b.hi);
     319             : }
     320             : 
     321             : SIMD_INLINE v256 v256_zip_8(v128 a, v128 b) {
     322             :   return v256_from_v128(v128_ziphi_8(a, b), v128_ziplo_8(a, b));
     323             : }
     324             : 
     325             : SIMD_INLINE v256 v256_zip_16(v128 a, v128 b) {
     326             :   return v256_from_v128(v128_ziphi_16(a, b), v128_ziplo_16(a, b));
     327             : }
     328             : 
     329             : SIMD_INLINE v256 v256_zip_32(v128 a, v128 b) {
     330             :   return v256_from_v128(v128_ziphi_32(a, b), v128_ziplo_32(a, b));
     331             : }
     332             : 
     333             : SIMD_INLINE v256 v256_unziplo_8(v256 a, v256 b) {
     334             :   return v256_from_v128(v128_unziplo_8(a.hi, a.lo), v128_unziplo_8(b.hi, b.lo));
     335             : }
     336             : 
     337             : SIMD_INLINE v256 v256_unziphi_8(v256 a, v256 b) {
     338             :   return v256_from_v128(v128_unziphi_8(a.hi, a.lo), v128_unziphi_8(b.hi, b.lo));
     339             : }
     340             : 
     341             : SIMD_INLINE v256 v256_unziplo_16(v256 a, v256 b) {
     342             :   return v256_from_v128(v128_unziplo_16(a.hi, a.lo),
     343             :                         v128_unziplo_16(b.hi, b.lo));
     344             : }
     345             : 
     346             : SIMD_INLINE v256 v256_unziphi_16(v256 a, v256 b) {
     347             :   return v256_from_v128(v128_unziphi_16(a.hi, a.lo),
     348             :                         v128_unziphi_16(b.hi, b.lo));
     349             : }
     350             : 
     351             : SIMD_INLINE v256 v256_unziplo_32(v256 a, v256 b) {
     352             :   return v256_from_v128(v128_unziplo_32(a.hi, a.lo),
     353             :                         v128_unziplo_32(b.hi, b.lo));
     354             : }
     355             : 
     356             : SIMD_INLINE v256 v256_unziphi_32(v256 a, v256 b) {
     357             :   return v256_from_v128(v128_unziphi_32(a.hi, a.lo),
     358             :                         v128_unziphi_32(b.hi, b.lo));
     359             : }
     360             : 
     361             : SIMD_INLINE v256 v256_unpack_u8_s16(v128 a) {
     362             :   return v256_from_v128(v128_unpackhi_u8_s16(a), v128_unpacklo_u8_s16(a));
     363             : }
     364             : 
     365             : SIMD_INLINE v256 v256_unpacklo_u8_s16(v256 a) {
     366             :   return v256_from_v128(v128_unpackhi_u8_s16(a.lo), v128_unpacklo_u8_s16(a.lo));
     367             : }
     368             : 
     369             : SIMD_INLINE v256 v256_unpackhi_u8_s16(v256 a) {
     370             :   return v256_from_v128(v128_unpackhi_u8_s16(a.hi), v128_unpacklo_u8_s16(a.hi));
     371             : }
     372             : 
     373             : SIMD_INLINE v256 v256_unpack_s8_s16(v128 a) {
     374             :   return v256_from_v128(v128_unpackhi_s8_s16(a), v128_unpacklo_s8_s16(a));
     375             : }
     376             : 
     377             : SIMD_INLINE v256 v256_unpacklo_s8_s16(v256 a) {
     378             :   return v256_from_v128(v128_unpackhi_s8_s16(a.lo), v128_unpacklo_s8_s16(a.lo));
     379             : }
     380             : 
     381             : SIMD_INLINE v256 v256_unpackhi_s8_s16(v256 a) {
     382             :   return v256_from_v128(v128_unpackhi_s8_s16(a.hi), v128_unpacklo_s8_s16(a.hi));
     383             : }
     384             : 
     385             : SIMD_INLINE v256 v256_pack_s32_s16(v256 a, v256 b) {
     386             :   return v256_from_v128(v128_pack_s32_s16(a.hi, a.lo),
     387             :                         v128_pack_s32_s16(b.hi, b.lo));
     388             : }
     389             : 
     390             : SIMD_INLINE v256 v256_pack_s16_u8(v256 a, v256 b) {
     391             :   return v256_from_v128(v128_pack_s16_u8(a.hi, a.lo),
     392             :                         v128_pack_s16_u8(b.hi, b.lo));
     393             : }
     394             : 
     395             : SIMD_INLINE v256 v256_pack_s16_s8(v256 a, v256 b) {
     396             :   return v256_from_v128(v128_pack_s16_s8(a.hi, a.lo),
     397             :                         v128_pack_s16_s8(b.hi, b.lo));
     398             : }
     399             : 
     400             : SIMD_INLINE v256 v256_unpack_u16_s32(v128 a) {
     401             :   return v256_from_v128(v128_unpackhi_u16_s32(a), v128_unpacklo_u16_s32(a));
     402             : }
     403             : 
     404             : SIMD_INLINE v256 v256_unpack_s16_s32(v128 a) {
     405             :   return v256_from_v128(v128_unpackhi_s16_s32(a), v128_unpacklo_s16_s32(a));
     406             : }
     407             : 
     408             : SIMD_INLINE v256 v256_unpacklo_u16_s32(v256 a) {
     409             :   return v256_from_v128(v128_unpackhi_u16_s32(a.lo),
     410             :                         v128_unpacklo_u16_s32(a.lo));
     411             : }
     412             : 
     413             : SIMD_INLINE v256 v256_unpacklo_s16_s32(v256 a) {
     414             :   return v256_from_v128(v128_unpackhi_s16_s32(a.lo),
     415             :                         v128_unpacklo_s16_s32(a.lo));
     416             : }
     417             : 
     418             : SIMD_INLINE v256 v256_unpackhi_u16_s32(v256 a) {
     419             :   return v256_from_v128(v128_unpackhi_u16_s32(a.hi),
     420             :                         v128_unpacklo_u16_s32(a.hi));
     421             : }
     422             : 
     423             : SIMD_INLINE v256 v256_unpackhi_s16_s32(v256 a) {
     424             :   return v256_from_v128(v128_unpackhi_s16_s32(a.hi),
     425             :                         v128_unpacklo_s16_s32(a.hi));
     426             : }
     427             : 
     428             : SIMD_INLINE v256 v256_shuffle_8(v256 a, v256 pattern) {
     429             :   v128 c16 = v128_dup_8(16);
     430             :   v128 maskhi = v128_cmplt_s8(pattern.hi, c16);
     431             :   v128 masklo = v128_cmplt_s8(pattern.lo, c16);
     432             :   return v256_from_v128(
     433             :       v128_or(
     434             :           v128_and(v128_shuffle_8(a.lo, pattern.hi), maskhi),
     435             :           v128_andn(v128_shuffle_8(a.hi, v128_sub_8(pattern.hi, c16)), maskhi)),
     436             :       v128_or(v128_and(v128_shuffle_8(a.lo, pattern.lo), masklo),
     437             :               v128_andn(v128_shuffle_8(a.hi, v128_sub_8(pattern.lo, c16)),
     438             :                         masklo)));
     439             : }
     440             : 
     441             : SIMD_INLINE v256 v256_pshuffle_8(v256 a, v256 pattern) {
     442             :   return v256_from_v128(
     443             :       v128_shuffle_8(v256_high_v128(a), v256_high_v128(pattern)),
     444             :       v128_shuffle_8(v256_low_v128(a), v256_low_v128(pattern)));
     445             : }
     446             : 
     447             : SIMD_INLINE v256 v256_cmpgt_s8(v256 a, v256 b) {
     448             :   return v256_from_v128(v128_cmpgt_s8(a.hi, b.hi), v128_cmpgt_s8(a.lo, b.lo));
     449             : }
     450             : 
     451             : SIMD_INLINE v256 v256_cmplt_s8(v256 a, v256 b) {
     452             :   return v256_from_v128(v128_cmplt_s8(a.hi, b.hi), v128_cmplt_s8(a.lo, b.lo));
     453             : }
     454             : 
     455             : SIMD_INLINE v256 v256_cmpeq_8(v256 a, v256 b) {
     456             :   return v256_from_v128(v128_cmpeq_8(a.hi, b.hi), v128_cmpeq_8(a.lo, b.lo));
     457             : }
     458             : 
     459             : SIMD_INLINE v256 v256_cmpgt_s16(v256 a, v256 b) {
     460             :   return v256_from_v128(v128_cmpgt_s16(a.hi, b.hi), v128_cmpgt_s16(a.lo, b.lo));
     461             : }
     462             : 
     463             : SIMD_INLINE v256 v256_cmplt_s16(v256 a, v256 b) {
     464             :   return v256_from_v128(v128_cmplt_s16(a.hi, b.hi), v128_cmplt_s16(a.lo, b.lo));
     465             : }
     466             : 
     467             : SIMD_INLINE v256 v256_cmpeq_16(v256 a, v256 b) {
     468             :   return v256_from_v128(v128_cmpeq_16(a.hi, b.hi), v128_cmpeq_16(a.lo, b.lo));
     469             : }
     470             : 
     471             : SIMD_INLINE v256 v256_shl_8(v256 a, unsigned int c) {
     472             :   return v256_from_v128(v128_shl_8(a.hi, c), v128_shl_8(a.lo, c));
     473             : }
     474             : 
     475             : SIMD_INLINE v256 v256_shr_u8(v256 a, unsigned int c) {
     476             :   return v256_from_v128(v128_shr_u8(a.hi, c), v128_shr_u8(a.lo, c));
     477             : }
     478             : 
     479             : SIMD_INLINE v256 v256_shr_s8(v256 a, unsigned int c) {
     480             :   return v256_from_v128(v128_shr_s8(a.hi, c), v128_shr_s8(a.lo, c));
     481             : }
     482             : 
     483             : SIMD_INLINE v256 v256_shl_16(v256 a, unsigned int c) {
     484             :   return v256_from_v128(v128_shl_16(a.hi, c), v128_shl_16(a.lo, c));
     485             : }
     486             : 
     487             : SIMD_INLINE v256 v256_shr_u16(v256 a, unsigned int c) {
     488             :   return v256_from_v128(v128_shr_u16(a.hi, c), v128_shr_u16(a.lo, c));
     489             : }
     490             : 
     491             : SIMD_INLINE v256 v256_shr_s16(v256 a, unsigned int c) {
     492             :   return v256_from_v128(v128_shr_s16(a.hi, c), v128_shr_s16(a.lo, c));
     493             : }
     494             : 
     495             : SIMD_INLINE v256 v256_shl_32(v256 a, unsigned int c) {
     496             :   return v256_from_v128(v128_shl_32(a.hi, c), v128_shl_32(a.lo, c));
     497             : }
     498             : 
     499             : SIMD_INLINE v256 v256_shr_u32(v256 a, unsigned int c) {
     500             :   return v256_from_v128(v128_shr_u32(a.hi, c), v128_shr_u32(a.lo, c));
     501             : }
     502             : 
     503             : SIMD_INLINE v256 v256_shr_s32(v256 a, unsigned int c) {
     504             :   return v256_from_v128(v128_shr_s32(a.hi, c), v128_shr_s32(a.lo, c));
     505             : }
     506             : 
     507             : /* These intrinsics require immediate values, so we must use #defines
     508             :    to enforce that. */
     509             : #define v256_shl_n_byte(a, n)                                                 \
     510             :   ((n) < 16 ? v256_from_v128(v128_or(v128_shl_n_byte(a.hi, n),                \
     511             :                                      v128_shr_n_byte(a.lo, 16 - (n))),        \
     512             :                              v128_shl_n_byte(a.lo, (n)))                      \
     513             :             : v256_from_v128((n) > 16 ? v128_shl_n_byte(a.lo, (n)-16) : a.lo, \
     514             :                              v128_zero()))
     515             : 
     516             : #define v256_shr_n_byte(a, n)                                          \
     517             :   ((n) < 16 ? v256_from_v128(v128_shr_n_byte(a.hi, n),                 \
     518             :                              v128_or(v128_shr_n_byte(a.lo, n),         \
     519             :                                      v128_shl_n_byte(a.hi, 16 - (n)))) \
     520             :             : v256_from_v128(v128_zero(),                              \
     521             :                              (n) > 16 ? v128_shr_n_byte(a.hi, (n)-16) : a.hi))
     522             : 
     523             : #define v256_align(a, b, c) \
     524             :   ((c) ? v256_or(v256_shr_n_byte(b, c), v256_shl_n_byte(a, 32 - (c))) : b)
     525             : 
     526             : #define v256_shl_n_8(a, n) \
     527             :   v256_from_v128(v128_shl_n_8(a.hi, n), v128_shl_n_8(a.lo, n))
     528             : #define v256_shl_n_16(a, n) \
     529             :   v256_from_v128(v128_shl_n_16(a.hi, n), v128_shl_n_16(a.lo, n))
     530             : #define v256_shl_n_32(a, n) \
     531             :   v256_from_v128(v128_shl_n_32(a.hi, n), v128_shl_n_32(a.lo, n))
     532             : #define v256_shr_n_u8(a, n) \
     533             :   v256_from_v128(v128_shr_n_u8(a.hi, n), v128_shr_n_u8(a.lo, n))
     534             : #define v256_shr_n_u16(a, n) \
     535             :   v256_from_v128(v128_shr_n_u16(a.hi, n), v128_shr_n_u16(a.lo, n))
     536             : #define v256_shr_n_u32(a, n) \
     537             :   v256_from_v128(v128_shr_n_u32(a.hi, n), v128_shr_n_u32(a.lo, n))
     538             : #define v256_shr_n_s8(a, n) \
     539             :   v256_from_v128(v128_shr_n_s8(a.hi, n), v128_shr_n_s8(a.lo, n))
     540             : #define v256_shr_n_s16(a, n) \
     541             :   v256_from_v128(v128_shr_n_s16(a.hi, n), v128_shr_n_s16(a.lo, n))
     542             : #define v256_shr_n_s32(a, n) \
     543             :   v256_from_v128(v128_shr_n_s32(a.hi, n), v128_shr_n_s32(a.lo, n))
     544             : 
     545             : #endif /* _V256_INTRINSICS_V128_H */

Generated by: LCOV version 1.13