/*
 * https://gcc.gnu.org/git/?p=gcc.git;a=blob_plain;f=gcc/config/loongarch/lasxintrin.h;hb=61f1001f2f4ab9128e5eb6e9a4adbbb0f9f0bc75
 */

/* LARCH Loongson ASX intrinsics include file.

   Copyright (C) 2018-2024 Free Software Foundation, Inc.

   This file is part of GCC.

   GCC is free software; you can redistribute it and/or modify it
   under the terms of the GNU General Public License as published
   by the Free Software Foundation; either version 3, or (at your
   option) any later version.

   GCC is distributed in the hope that it will be useful, but WITHOUT
   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
   or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
   License for more details.

   Under Section 7 of GPL version 3, you are granted additional
   permissions described in the GCC Runtime Library Exception, version
   3.1, as published by the Free Software Foundation.

   You should have received a copy of the GNU General Public License and
   a copy of the GCC Runtime Library Exception along with this program;
   see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
   <http://www.gnu.org/licenses/>.  */

#ifndef _GCC_LOONGSON_ASXINTRIN_H
#define _GCC_LOONGSON_ASXINTRIN_H 1

#if defined(__loongarch_asx)

typedef signed char v32i8 __attribute__ ((vector_size(32), aligned(32)));
typedef signed char v32i8_b __attribute__ ((vector_size(32), aligned(1)));
typedef unsigned char v32u8 __attribute__ ((vector_size(32), aligned(32)));
typedef unsigned char v32u8_b __attribute__ ((vector_size(32), aligned(1)));
typedef short v16i16 __attribute__ ((vector_size(32), aligned(32)));
typedef short v16i16_h __attribute__ ((vector_size(32), aligned(2)));
typedef unsigned short v16u16 __attribute__ ((vector_size(32), aligned(32)));
typedef unsigned short v16u16_h __attribute__ ((vector_size(32), aligned(2)));
typedef int v8i32 __attribute__ ((vector_size(32), aligned(32)));
typedef int v8i32_w __attribute__ ((vector_size(32), aligned(4)));
typedef unsigned int v8u32 __attribute__ ((vector_size(32), aligned(32)));
typedef unsigned int v8u32_w __attribute__ ((vector_size(32), aligned(4)));
typedef long long v4i64 __attribute__ ((vector_size(32), aligned(32)));
typedef long long v4i64_d __attribute__ ((vector_size(32), aligned(8)));
typedef unsigned long long v4u64 __attribute__ ((vector_size(32), aligned(32)));
typedef unsigned long long v4u64_d __attribute__ ((vector_size(32), aligned(8)));
typedef float v8f32 __attribute__ ((vector_size(32), aligned(32)));
typedef float v8f32_w __attribute__ ((vector_size(32), aligned(4)));
typedef double v4f64 __attribute__ ((vector_size(32), aligned(32)));
typedef double v4f64_d __attribute__ ((vector_size(32), aligned(8)));
typedef float __m256 __attribute__ ((__vector_size__ (32),
				     __may_alias__));
typedef long long __m256i __attribute__ ((__vector_size__ (32),
					  __may_alias__));
typedef double __m256d __attribute__ ((__vector_size__ (32),
				       __may_alias__));

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V32QI, V32QI, V32QI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvsll_b (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvsll_b ((v32i8)_1, (v32i8)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V16HI, V16HI, V16HI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvsll_h (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvsll_h ((v16i16)_1, (v16i16)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V8SI, V8SI, V8SI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvsll_w (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvsll_w ((v8i32)_1, (v8i32)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V4DI, V4DI, V4DI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvsll_d (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvsll_d ((v4i64)_1, (v4i64)_2);
}

/* Assembly instruction format:	xd, xj, ui3.  */
/* Data types in instruction templates:  V32QI, V32QI, UQI.  */
#define __lasx_xvslli_b(/*__m256i*/ _1, /*ui3*/ _2) \
  ((__m256i)__builtin_lasx_xvslli_b ((v32i8)(_1), (_2)))

/* Assembly instruction format:	xd, xj, ui4.  */
/* Data types in instruction templates:  V16HI, V16HI, UQI.  */
#define __lasx_xvslli_h(/*__m256i*/ _1, /*ui4*/ _2) \
  ((__m256i)__builtin_lasx_xvslli_h ((v16i16)(_1), (_2)))

/* Assembly instruction format:	xd, xj, ui5.  */
/* Data types in instruction templates:  V8SI, V8SI, UQI.  */
#define __lasx_xvslli_w(/*__m256i*/ _1, /*ui5*/ _2) \
  ((__m256i)__builtin_lasx_xvslli_w ((v8i32)(_1), (_2)))

/* Assembly instruction format:	xd, xj, ui6.  */
/* Data types in instruction templates:  V4DI, V4DI, UQI.  */
#define __lasx_xvslli_d(/*__m256i*/ _1, /*ui6*/ _2) \
  ((__m256i)__builtin_lasx_xvslli_d ((v4i64)(_1), (_2)))

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V32QI, V32QI, V32QI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvsra_b (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvsra_b ((v32i8)_1, (v32i8)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V16HI, V16HI, V16HI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvsra_h (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvsra_h ((v16i16)_1, (v16i16)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V8SI, V8SI, V8SI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvsra_w (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvsra_w ((v8i32)_1, (v8i32)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V4DI, V4DI, V4DI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvsra_d (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvsra_d ((v4i64)_1, (v4i64)_2);
}

/* Assembly instruction format:	xd, xj, ui3.  */
/* Data types in instruction templates:  V32QI, V32QI, UQI.  */
#define __lasx_xvsrai_b(/*__m256i*/ _1, /*ui3*/ _2) \
  ((__m256i)__builtin_lasx_xvsrai_b ((v32i8)(_1), (_2)))

/* Assembly instruction format:	xd, xj, ui4.  */
/* Data types in instruction templates:  V16HI, V16HI, UQI.  */
#define __lasx_xvsrai_h(/*__m256i*/ _1, /*ui4*/ _2) \
  ((__m256i)__builtin_lasx_xvsrai_h ((v16i16)(_1), (_2)))

/* Assembly instruction format:	xd, xj, ui5.  */
/* Data types in instruction templates:  V8SI, V8SI, UQI.  */
#define __lasx_xvsrai_w(/*__m256i*/ _1, /*ui5*/ _2) \
  ((__m256i)__builtin_lasx_xvsrai_w ((v8i32)(_1), (_2)))

/* Assembly instruction format:	xd, xj, ui6.  */
/* Data types in instruction templates:  V4DI, V4DI, UQI.  */
#define __lasx_xvsrai_d(/*__m256i*/ _1, /*ui6*/ _2) \
  ((__m256i)__builtin_lasx_xvsrai_d ((v4i64)(_1), (_2)))

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V32QI, V32QI, V32QI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvsrar_b (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvsrar_b ((v32i8)_1, (v32i8)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V16HI, V16HI, V16HI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvsrar_h (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvsrar_h ((v16i16)_1, (v16i16)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V8SI, V8SI, V8SI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvsrar_w (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvsrar_w ((v8i32)_1, (v8i32)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V4DI, V4DI, V4DI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvsrar_d (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvsrar_d ((v4i64)_1, (v4i64)_2);
}

/* Assembly instruction format:	xd, xj, ui3.  */
/* Data types in instruction templates:  V32QI, V32QI, UQI.  */
#define __lasx_xvsrari_b(/*__m256i*/ _1, /*ui3*/ _2) \
  ((__m256i)__builtin_lasx_xvsrari_b ((v32i8)(_1), (_2)))

/* Assembly instruction format:	xd, xj, ui4.  */
/* Data types in instruction templates:  V16HI, V16HI, UQI.  */
#define __lasx_xvsrari_h(/*__m256i*/ _1, /*ui4*/ _2) \
  ((__m256i)__builtin_lasx_xvsrari_h ((v16i16)(_1), (_2)))

/* Assembly instruction format:	xd, xj, ui5.  */
/* Data types in instruction templates:  V8SI, V8SI, UQI.  */
#define __lasx_xvsrari_w(/*__m256i*/ _1, /*ui5*/ _2) \
  ((__m256i)__builtin_lasx_xvsrari_w ((v8i32)(_1), (_2)))

/* Assembly instruction format:	xd, xj, ui6.  */
/* Data types in instruction templates:  V4DI, V4DI, UQI.  */
#define __lasx_xvsrari_d(/*__m256i*/ _1, /*ui6*/ _2) \
  ((__m256i)__builtin_lasx_xvsrari_d ((v4i64)(_1), (_2)))

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V32QI, V32QI, V32QI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvsrl_b (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvsrl_b ((v32i8)_1, (v32i8)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V16HI, V16HI, V16HI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvsrl_h (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvsrl_h ((v16i16)_1, (v16i16)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V8SI, V8SI, V8SI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvsrl_w (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvsrl_w ((v8i32)_1, (v8i32)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V4DI, V4DI, V4DI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvsrl_d (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvsrl_d ((v4i64)_1, (v4i64)_2);
}

/* Assembly instruction format:	xd, xj, ui3.  */
/* Data types in instruction templates:  V32QI, V32QI, UQI.  */
#define __lasx_xvsrli_b(/*__m256i*/ _1, /*ui3*/ _2) \
  ((__m256i)__builtin_lasx_xvsrli_b ((v32i8)(_1), (_2)))

/* Assembly instruction format:	xd, xj, ui4.  */
/* Data types in instruction templates:  V16HI, V16HI, UQI.  */
#define __lasx_xvsrli_h(/*__m256i*/ _1, /*ui4*/ _2) \
  ((__m256i)__builtin_lasx_xvsrli_h ((v16i16)(_1), (_2)))

/* Assembly instruction format:	xd, xj, ui5.  */
/* Data types in instruction templates:  V8SI, V8SI, UQI.  */
#define __lasx_xvsrli_w(/*__m256i*/ _1, /*ui5*/ _2) \
  ((__m256i)__builtin_lasx_xvsrli_w ((v8i32)(_1), (_2)))

/* Assembly instruction format:	xd, xj, ui6.  */
/* Data types in instruction templates:  V4DI, V4DI, UQI.  */
#define __lasx_xvsrli_d(/*__m256i*/ _1, /*ui6*/ _2) \
  ((__m256i)__builtin_lasx_xvsrli_d ((v4i64)(_1), (_2)))

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V32QI, V32QI, V32QI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvsrlr_b (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvsrlr_b ((v32i8)_1, (v32i8)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V16HI, V16HI, V16HI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvsrlr_h (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvsrlr_h ((v16i16)_1, (v16i16)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V8SI, V8SI, V8SI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvsrlr_w (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvsrlr_w ((v8i32)_1, (v8i32)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V4DI, V4DI, V4DI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvsrlr_d (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvsrlr_d ((v4i64)_1, (v4i64)_2);
}

/* Assembly instruction format:	xd, xj, ui3.  */
/* Data types in instruction templates:  V32QI, V32QI, UQI.  */
#define __lasx_xvsrlri_b(/*__m256i*/ _1, /*ui3*/ _2) \
  ((__m256i)__builtin_lasx_xvsrlri_b ((v32i8)(_1), (_2)))

/* Assembly instruction format:	xd, xj, ui4.  */
/* Data types in instruction templates:  V16HI, V16HI, UQI.  */
#define __lasx_xvsrlri_h(/*__m256i*/ _1, /*ui4*/ _2) \
  ((__m256i)__builtin_lasx_xvsrlri_h ((v16i16)(_1), (_2)))

/* Assembly instruction format:	xd, xj, ui5.  */
/* Data types in instruction templates:  V8SI, V8SI, UQI.  */
#define __lasx_xvsrlri_w(/*__m256i*/ _1, /*ui5*/ _2) \
  ((__m256i)__builtin_lasx_xvsrlri_w ((v8i32)(_1), (_2)))

/* Assembly instruction format:	xd, xj, ui6.  */
/* Data types in instruction templates:  V4DI, V4DI, UQI.  */
#define __lasx_xvsrlri_d(/*__m256i*/ _1, /*ui6*/ _2) \
  ((__m256i)__builtin_lasx_xvsrlri_d ((v4i64)(_1), (_2)))

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  UV32QI, UV32QI, UV32QI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvbitclr_b (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvbitclr_b ((v32u8)_1, (v32u8)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  UV16HI, UV16HI, UV16HI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvbitclr_h (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvbitclr_h ((v16u16)_1, (v16u16)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  UV8SI, UV8SI, UV8SI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvbitclr_w (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvbitclr_w ((v8u32)_1, (v8u32)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  UV4DI, UV4DI, UV4DI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvbitclr_d (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvbitclr_d ((v4u64)_1, (v4u64)_2);
}

/* Assembly instruction format:	xd, xj, ui3.  */
/* Data types in instruction templates:  UV32QI, UV32QI, UQI.  */
#define __lasx_xvbitclri_b(/*__m256i*/ _1, /*ui3*/ _2) \
  ((__m256i)__builtin_lasx_xvbitclri_b ((v32u8)(_1), (_2)))

/* Assembly instruction format:	xd, xj, ui4.  */
/* Data types in instruction templates:  UV16HI, UV16HI, UQI.  */
#define __lasx_xvbitclri_h(/*__m256i*/ _1, /*ui4*/ _2) \
  ((__m256i)__builtin_lasx_xvbitclri_h ((v16u16)(_1), (_2)))

/* Assembly instruction format:	xd, xj, ui5.  */
/* Data types in instruction templates:  UV8SI, UV8SI, UQI.  */
#define __lasx_xvbitclri_w(/*__m256i*/ _1, /*ui5*/ _2) \
  ((__m256i)__builtin_lasx_xvbitclri_w ((v8u32)(_1), (_2)))

/* Assembly instruction format:	xd, xj, ui6.  */
/* Data types in instruction templates:  UV4DI, UV4DI, UQI.  */
#define __lasx_xvbitclri_d(/*__m256i*/ _1, /*ui6*/ _2) \
  ((__m256i)__builtin_lasx_xvbitclri_d ((v4u64)(_1), (_2)))

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  UV32QI, UV32QI, UV32QI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvbitset_b (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvbitset_b ((v32u8)_1, (v32u8)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  UV16HI, UV16HI, UV16HI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvbitset_h (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvbitset_h ((v16u16)_1, (v16u16)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  UV8SI, UV8SI, UV8SI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvbitset_w (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvbitset_w ((v8u32)_1, (v8u32)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  UV4DI, UV4DI, UV4DI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvbitset_d (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvbitset_d ((v4u64)_1, (v4u64)_2);
}

/* Assembly instruction format:	xd, xj, ui3.  */
/* Data types in instruction templates:  UV32QI, UV32QI, UQI.  */
#define __lasx_xvbitseti_b(/*__m256i*/ _1, /*ui3*/ _2) \
  ((__m256i)__builtin_lasx_xvbitseti_b ((v32u8)(_1), (_2)))

/* Assembly instruction format:	xd, xj, ui4.  */
/* Data types in instruction templates:  UV16HI, UV16HI, UQI.  */
#define __lasx_xvbitseti_h(/*__m256i*/ _1, /*ui4*/ _2) \
  ((__m256i)__builtin_lasx_xvbitseti_h ((v16u16)(_1), (_2)))

/* Assembly instruction format:	xd, xj, ui5.  */
/* Data types in instruction templates:  UV8SI, UV8SI, UQI.  */
#define __lasx_xvbitseti_w(/*__m256i*/ _1, /*ui5*/ _2) \
  ((__m256i)__builtin_lasx_xvbitseti_w ((v8u32)(_1), (_2)))

/* Assembly instruction format:	xd, xj, ui6.  */
/* Data types in instruction templates:  UV4DI, UV4DI, UQI.  */
#define __lasx_xvbitseti_d(/*__m256i*/ _1, /*ui6*/ _2) \
  ((__m256i)__builtin_lasx_xvbitseti_d ((v4u64)(_1), (_2)))

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  UV32QI, UV32QI, UV32QI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvbitrev_b (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvbitrev_b ((v32u8)_1, (v32u8)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  UV16HI, UV16HI, UV16HI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvbitrev_h (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvbitrev_h ((v16u16)_1, (v16u16)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  UV8SI, UV8SI, UV8SI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvbitrev_w (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvbitrev_w ((v8u32)_1, (v8u32)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  UV4DI, UV4DI, UV4DI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvbitrev_d (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvbitrev_d ((v4u64)_1, (v4u64)_2);
}

/* Assembly instruction format:	xd, xj, ui3.  */
/* Data types in instruction templates:  UV32QI, UV32QI, UQI.  */
#define __lasx_xvbitrevi_b(/*__m256i*/ _1, /*ui3*/ _2) \
  ((__m256i)__builtin_lasx_xvbitrevi_b ((v32u8)(_1), (_2)))

/* Assembly instruction format:	xd, xj, ui4.  */
/* Data types in instruction templates:  UV16HI, UV16HI, UQI.  */
#define __lasx_xvbitrevi_h(/*__m256i*/ _1, /*ui4*/ _2) \
  ((__m256i)__builtin_lasx_xvbitrevi_h ((v16u16)(_1), (_2)))

/* Assembly instruction format:	xd, xj, ui5.  */
/* Data types in instruction templates:  UV8SI, UV8SI, UQI.  */
#define __lasx_xvbitrevi_w(/*__m256i*/ _1, /*ui5*/ _2) \
  ((__m256i)__builtin_lasx_xvbitrevi_w ((v8u32)(_1), (_2)))

/* Assembly instruction format:	xd, xj, ui6.  */
/* Data types in instruction templates:  UV4DI, UV4DI, UQI.  */
#define __lasx_xvbitrevi_d(/*__m256i*/ _1, /*ui6*/ _2) \
  ((__m256i)__builtin_lasx_xvbitrevi_d ((v4u64)(_1), (_2)))

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V32QI, V32QI, V32QI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvadd_b (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvadd_b ((v32i8)_1, (v32i8)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V16HI, V16HI, V16HI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvadd_h (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvadd_h ((v16i16)_1, (v16i16)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V8SI, V8SI, V8SI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvadd_w (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvadd_w ((v8i32)_1, (v8i32)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V4DI, V4DI, V4DI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvadd_d (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvadd_d ((v4i64)_1, (v4i64)_2);
}

/* Assembly instruction format:	xd, xj, ui5.  */
/* Data types in instruction templates:  V32QI, V32QI, UQI.  */
#define __lasx_xvaddi_bu(/*__m256i*/ _1, /*ui5*/ _2) \
  ((__m256i)__builtin_lasx_xvaddi_bu ((v32i8)(_1), (_2)))

/* Assembly instruction format:	xd, xj, ui5.  */
/* Data types in instruction templates:  V16HI, V16HI, UQI.  */
#define __lasx_xvaddi_hu(/*__m256i*/ _1, /*ui5*/ _2) \
  ((__m256i)__builtin_lasx_xvaddi_hu ((v16i16)(_1), (_2)))

/* Assembly instruction format:	xd, xj, ui5.  */
/* Data types in instruction templates:  V8SI, V8SI, UQI.  */
#define __lasx_xvaddi_wu(/*__m256i*/ _1, /*ui5*/ _2) \
  ((__m256i)__builtin_lasx_xvaddi_wu ((v8i32)(_1), (_2)))

/* Assembly instruction format:	xd, xj, ui5.  */
/* Data types in instruction templates:  V4DI, V4DI, UQI.  */
#define __lasx_xvaddi_du(/*__m256i*/ _1, /*ui5*/ _2) \
  ((__m256i)__builtin_lasx_xvaddi_du ((v4i64)(_1), (_2)))

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V32QI, V32QI, V32QI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvsub_b (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvsub_b ((v32i8)_1, (v32i8)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V16HI, V16HI, V16HI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvsub_h (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvsub_h ((v16i16)_1, (v16i16)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V8SI, V8SI, V8SI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvsub_w (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvsub_w ((v8i32)_1, (v8i32)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V4DI, V4DI, V4DI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvsub_d (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvsub_d ((v4i64)_1, (v4i64)_2);
}

/* Assembly instruction format:	xd, xj, ui5.  */
/* Data types in instruction templates:  V32QI, V32QI, UQI.  */
#define __lasx_xvsubi_bu(/*__m256i*/ _1, /*ui5*/ _2) \
  ((__m256i)__builtin_lasx_xvsubi_bu ((v32i8)(_1), (_2)))

/* Assembly instruction format:	xd, xj, ui5.  */
/* Data types in instruction templates:  V16HI, V16HI, UQI.  */
#define __lasx_xvsubi_hu(/*__m256i*/ _1, /*ui5*/ _2) \
  ((__m256i)__builtin_lasx_xvsubi_hu ((v16i16)(_1), (_2)))

/* Assembly instruction format:	xd, xj, ui5.  */
/* Data types in instruction templates:  V8SI, V8SI, UQI.  */
#define __lasx_xvsubi_wu(/*__m256i*/ _1, /*ui5*/ _2) \
  ((__m256i)__builtin_lasx_xvsubi_wu ((v8i32)(_1), (_2)))

/* Assembly instruction format:	xd, xj, ui5.  */
/* Data types in instruction templates:  V4DI, V4DI, UQI.  */
#define __lasx_xvsubi_du(/*__m256i*/ _1, /*ui5*/ _2) \
  ((__m256i)__builtin_lasx_xvsubi_du ((v4i64)(_1), (_2)))

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V32QI, V32QI, V32QI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvmax_b (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvmax_b ((v32i8)_1, (v32i8)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V16HI, V16HI, V16HI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvmax_h (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvmax_h ((v16i16)_1, (v16i16)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V8SI, V8SI, V8SI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvmax_w (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvmax_w ((v8i32)_1, (v8i32)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V4DI, V4DI, V4DI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvmax_d (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvmax_d ((v4i64)_1, (v4i64)_2);
}

/* Assembly instruction format:	xd, xj, si5.  */
/* Data types in instruction templates:  V32QI, V32QI, QI.  */
#define __lasx_xvmaxi_b(/*__m256i*/ _1, /*si5*/ _2) \
  ((__m256i)__builtin_lasx_xvmaxi_b ((v32i8)(_1), (_2)))

/* Assembly instruction format:	xd, xj, si5.  */
/* Data types in instruction templates:  V16HI, V16HI, QI.  */
#define __lasx_xvmaxi_h(/*__m256i*/ _1, /*si5*/ _2) \
  ((__m256i)__builtin_lasx_xvmaxi_h ((v16i16)(_1), (_2)))

/* Assembly instruction format:	xd, xj, si5.  */
/* Data types in instruction templates:  V8SI, V8SI, QI.  */
#define __lasx_xvmaxi_w(/*__m256i*/ _1, /*si5*/ _2) \
  ((__m256i)__builtin_lasx_xvmaxi_w ((v8i32)(_1), (_2)))

/* Assembly instruction format:	xd, xj, si5.  */
/* Data types in instruction templates:  V4DI, V4DI, QI.  */
#define __lasx_xvmaxi_d(/*__m256i*/ _1, /*si5*/ _2) \
  ((__m256i)__builtin_lasx_xvmaxi_d ((v4i64)(_1), (_2)))

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  UV32QI, UV32QI, UV32QI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvmax_bu (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvmax_bu ((v32u8)_1, (v32u8)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  UV16HI, UV16HI, UV16HI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvmax_hu (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvmax_hu ((v16u16)_1, (v16u16)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  UV8SI, UV8SI, UV8SI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvmax_wu (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvmax_wu ((v8u32)_1, (v8u32)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  UV4DI, UV4DI, UV4DI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvmax_du (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvmax_du ((v4u64)_1, (v4u64)_2);
}

/* Assembly instruction format:	xd, xj, ui5.  */
/* Data types in instruction templates:  UV32QI, UV32QI, UQI.  */
#define __lasx_xvmaxi_bu(/*__m256i*/ _1, /*ui5*/ _2) \
  ((__m256i)__builtin_lasx_xvmaxi_bu ((v32u8)(_1), (_2)))

/* Assembly instruction format:	xd, xj, ui5.  */
/* Data types in instruction templates:  UV16HI, UV16HI, UQI.  */
#define __lasx_xvmaxi_hu(/*__m256i*/ _1, /*ui5*/ _2) \
  ((__m256i)__builtin_lasx_xvmaxi_hu ((v16u16)(_1), (_2)))

/* Assembly instruction format:	xd, xj, ui5.  */
/* Data types in instruction templates:  UV8SI, UV8SI, UQI.  */
#define __lasx_xvmaxi_wu(/*__m256i*/ _1, /*ui5*/ _2) \
  ((__m256i)__builtin_lasx_xvmaxi_wu ((v8u32)(_1), (_2)))

/* Assembly instruction format:	xd, xj, ui5.  */
/* Data types in instruction templates:  UV4DI, UV4DI, UQI.  */
#define __lasx_xvmaxi_du(/*__m256i*/ _1, /*ui5*/ _2) \
  ((__m256i)__builtin_lasx_xvmaxi_du ((v4u64)(_1), (_2)))

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V32QI, V32QI, V32QI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvmin_b (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvmin_b ((v32i8)_1, (v32i8)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V16HI, V16HI, V16HI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvmin_h (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvmin_h ((v16i16)_1, (v16i16)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V8SI, V8SI, V8SI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvmin_w (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvmin_w ((v8i32)_1, (v8i32)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V4DI, V4DI, V4DI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvmin_d (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvmin_d ((v4i64)_1, (v4i64)_2);
}

/* Assembly instruction format:	xd, xj, si5.  */
/* Data types in instruction templates:  V32QI, V32QI, QI.  */
#define __lasx_xvmini_b(/*__m256i*/ _1, /*si5*/ _2) \
  ((__m256i)__builtin_lasx_xvmini_b ((v32i8)(_1), (_2)))

/* Assembly instruction format:	xd, xj, si5.  */
/* Data types in instruction templates:  V16HI, V16HI, QI.  */
#define __lasx_xvmini_h(/*__m256i*/ _1, /*si5*/ _2) \
  ((__m256i)__builtin_lasx_xvmini_h ((v16i16)(_1), (_2)))

/* Assembly instruction format:	xd, xj, si5.  */
/* Data types in instruction templates:  V8SI, V8SI, QI.  */
#define __lasx_xvmini_w(/*__m256i*/ _1, /*si5*/ _2) \
  ((__m256i)__builtin_lasx_xvmini_w ((v8i32)(_1), (_2)))

/* Assembly instruction format:	xd, xj, si5.  */
/* Data types in instruction templates:  V4DI, V4DI, QI.  */
#define __lasx_xvmini_d(/*__m256i*/ _1, /*si5*/ _2) \
  ((__m256i)__builtin_lasx_xvmini_d ((v4i64)(_1), (_2)))

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  UV32QI, UV32QI, UV32QI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvmin_bu (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvmin_bu ((v32u8)_1, (v32u8)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  UV16HI, UV16HI, UV16HI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvmin_hu (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvmin_hu ((v16u16)_1, (v16u16)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  UV8SI, UV8SI, UV8SI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvmin_wu (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvmin_wu ((v8u32)_1, (v8u32)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  UV4DI, UV4DI, UV4DI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvmin_du (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvmin_du ((v4u64)_1, (v4u64)_2);
}

/* Assembly instruction format:	xd, xj, ui5.  */
/* Data types in instruction templates:  UV32QI, UV32QI, UQI.  */
#define __lasx_xvmini_bu(/*__m256i*/ _1, /*ui5*/ _2) \
  ((__m256i)__builtin_lasx_xvmini_bu ((v32u8)(_1), (_2)))

/* Assembly instruction format:	xd, xj, ui5.  */
/* Data types in instruction templates:  UV16HI, UV16HI, UQI.  */
#define __lasx_xvmini_hu(/*__m256i*/ _1, /*ui5*/ _2) \
  ((__m256i)__builtin_lasx_xvmini_hu ((v16u16)(_1), (_2)))

/* Assembly instruction format:	xd, xj, ui5.  */
/* Data types in instruction templates:  UV8SI, UV8SI, UQI.  */
#define __lasx_xvmini_wu(/*__m256i*/ _1, /*ui5*/ _2) \
  ((__m256i)__builtin_lasx_xvmini_wu ((v8u32)(_1), (_2)))

/* Assembly instruction format:	xd, xj, ui5.  */
/* Data types in instruction templates:  UV4DI, UV4DI, UQI.  */
#define __lasx_xvmini_du(/*__m256i*/ _1, /*ui5*/ _2) \
  ((__m256i)__builtin_lasx_xvmini_du ((v4u64)(_1), (_2)))

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V32QI, V32QI, V32QI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvseq_b (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvseq_b ((v32i8)_1, (v32i8)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V16HI, V16HI, V16HI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvseq_h (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvseq_h ((v16i16)_1, (v16i16)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V8SI, V8SI, V8SI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvseq_w (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvseq_w ((v8i32)_1, (v8i32)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V4DI, V4DI, V4DI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvseq_d (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvseq_d ((v4i64)_1, (v4i64)_2);
}

/* Assembly instruction format:	xd, xj, si5.  */
/* Data types in instruction templates:  V32QI, V32QI, QI.  */
#define __lasx_xvseqi_b(/*__m256i*/ _1, /*si5*/ _2) \
  ((__m256i)__builtin_lasx_xvseqi_b ((v32i8)(_1), (_2)))

/* Assembly instruction format:	xd, xj, si5.  */
/* Data types in instruction templates:  V16HI, V16HI, QI.  */
#define __lasx_xvseqi_h(/*__m256i*/ _1, /*si5*/ _2) \
  ((__m256i)__builtin_lasx_xvseqi_h ((v16i16)(_1), (_2)))

/* Assembly instruction format:	xd, xj, si5.  */
/* Data types in instruction templates:  V8SI, V8SI, QI.  */
#define __lasx_xvseqi_w(/*__m256i*/ _1, /*si5*/ _2) \
  ((__m256i)__builtin_lasx_xvseqi_w ((v8i32)(_1), (_2)))

/* Assembly instruction format:	xd, xj, si5.  */
/* Data types in instruction templates:  V4DI, V4DI, QI.  */
#define __lasx_xvseqi_d(/*__m256i*/ _1, /*si5*/ _2) \
  ((__m256i)__builtin_lasx_xvseqi_d ((v4i64)(_1), (_2)))

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V32QI, V32QI, V32QI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvslt_b (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvslt_b ((v32i8)_1, (v32i8)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V16HI, V16HI, V16HI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvslt_h (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvslt_h ((v16i16)_1, (v16i16)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V8SI, V8SI, V8SI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvslt_w (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvslt_w ((v8i32)_1, (v8i32)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V4DI, V4DI, V4DI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvslt_d (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvslt_d ((v4i64)_1, (v4i64)_2);
}

/* Assembly instruction format:	xd, xj, si5.  */
/* Data types in instruction templates:  V32QI, V32QI, QI.  */
#define __lasx_xvslti_b(/*__m256i*/ _1, /*si5*/ _2) \
  ((__m256i)__builtin_lasx_xvslti_b ((v32i8)(_1), (_2)))

/* Assembly instruction format:	xd, xj, si5.  */
/* Data types in instruction templates:  V16HI, V16HI, QI.  */
#define __lasx_xvslti_h(/*__m256i*/ _1, /*si5*/ _2) \
  ((__m256i)__builtin_lasx_xvslti_h ((v16i16)(_1), (_2)))

/* Assembly instruction format:	xd, xj, si5.  */
/* Data types in instruction templates:  V8SI, V8SI, QI.  */
#define __lasx_xvslti_w(/*__m256i*/ _1, /*si5*/ _2) \
  ((__m256i)__builtin_lasx_xvslti_w ((v8i32)(_1), (_2)))

/* Assembly instruction format:	xd, xj, si5.  */
/* Data types in instruction templates:  V4DI, V4DI, QI.  */
#define __lasx_xvslti_d(/*__m256i*/ _1, /*si5*/ _2) \
  ((__m256i)__builtin_lasx_xvslti_d ((v4i64)(_1), (_2)))

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V32QI, UV32QI, UV32QI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvslt_bu (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvslt_bu ((v32u8)_1, (v32u8)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V16HI, UV16HI, UV16HI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvslt_hu (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvslt_hu ((v16u16)_1, (v16u16)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V8SI, UV8SI, UV8SI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvslt_wu (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvslt_wu ((v8u32)_1, (v8u32)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V4DI, UV4DI, UV4DI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvslt_du (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvslt_du ((v4u64)_1, (v4u64)_2);
}

/* Assembly instruction format:	xd, xj, ui5.  */
/* Data types in instruction templates:  V32QI, UV32QI, UQI.  */
#define __lasx_xvslti_bu(/*__m256i*/ _1, /*ui5*/ _2) \
  ((__m256i)__builtin_lasx_xvslti_bu ((v32u8)(_1), (_2)))

/* Assembly instruction format:	xd, xj, ui5.  */
/* Data types in instruction templates:  V16HI, UV16HI, UQI.  */
#define __lasx_xvslti_hu(/*__m256i*/ _1, /*ui5*/ _2) \
  ((__m256i)__builtin_lasx_xvslti_hu ((v16u16)(_1), (_2)))

/* Assembly instruction format:	xd, xj, ui5.  */
/* Data types in instruction templates:  V8SI, UV8SI, UQI.  */
#define __lasx_xvslti_wu(/*__m256i*/ _1, /*ui5*/ _2) \
  ((__m256i)__builtin_lasx_xvslti_wu ((v8u32)(_1), (_2)))

/* Assembly instruction format:	xd, xj, ui5.  */
/* Data types in instruction templates:  V4DI, UV4DI, UQI.  */
#define __lasx_xvslti_du(/*__m256i*/ _1, /*ui5*/ _2) \
  ((__m256i)__builtin_lasx_xvslti_du ((v4u64)(_1), (_2)))

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V32QI, V32QI, V32QI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvsle_b (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvsle_b ((v32i8)_1, (v32i8)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V16HI, V16HI, V16HI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvsle_h (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvsle_h ((v16i16)_1, (v16i16)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V8SI, V8SI, V8SI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvsle_w (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvsle_w ((v8i32)_1, (v8i32)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V4DI, V4DI, V4DI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvsle_d (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvsle_d ((v4i64)_1, (v4i64)_2);
}

/* Assembly instruction format:	xd, xj, si5.  */
/* Data types in instruction templates:  V32QI, V32QI, QI.  */
#define __lasx_xvslei_b(/*__m256i*/ _1, /*si5*/ _2) \
  ((__m256i)__builtin_lasx_xvslei_b ((v32i8)(_1), (_2)))

/* Assembly instruction format:	xd, xj, si5.  */
/* Data types in instruction templates:  V16HI, V16HI, QI.  */
#define __lasx_xvslei_h(/*__m256i*/ _1, /*si5*/ _2) \
  ((__m256i)__builtin_lasx_xvslei_h ((v16i16)(_1), (_2)))

/* Assembly instruction format:	xd, xj, si5.  */
/* Data types in instruction templates:  V8SI, V8SI, QI.  */
#define __lasx_xvslei_w(/*__m256i*/ _1, /*si5*/ _2) \
  ((__m256i)__builtin_lasx_xvslei_w ((v8i32)(_1), (_2)))

/* Assembly instruction format:	xd, xj, si5.  */
/* Data types in instruction templates:  V4DI, V4DI, QI.  */
#define __lasx_xvslei_d(/*__m256i*/ _1, /*si5*/ _2) \
  ((__m256i)__builtin_lasx_xvslei_d ((v4i64)(_1), (_2)))

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V32QI, UV32QI, UV32QI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvsle_bu (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvsle_bu ((v32u8)_1, (v32u8)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V16HI, UV16HI, UV16HI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvsle_hu (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvsle_hu ((v16u16)_1, (v16u16)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V8SI, UV8SI, UV8SI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvsle_wu (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvsle_wu ((v8u32)_1, (v8u32)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V4DI, UV4DI, UV4DI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvsle_du (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvsle_du ((v4u64)_1, (v4u64)_2);
}

/* Assembly instruction format:	xd, xj, ui5.  */
/* Data types in instruction templates:  V32QI, UV32QI, UQI.  */
#define __lasx_xvslei_bu(/*__m256i*/ _1, /*ui5*/ _2) \
  ((__m256i)__builtin_lasx_xvslei_bu ((v32u8)(_1), (_2)))

/* Assembly instruction format:	xd, xj, ui5.  */
/* Data types in instruction templates:  V16HI, UV16HI, UQI.  */
#define __lasx_xvslei_hu(/*__m256i*/ _1, /*ui5*/ _2) \
  ((__m256i)__builtin_lasx_xvslei_hu ((v16u16)(_1), (_2)))

/* Assembly instruction format:	xd, xj, ui5.  */
/* Data types in instruction templates:  V8SI, UV8SI, UQI.  */
#define __lasx_xvslei_wu(/*__m256i*/ _1, /*ui5*/ _2) \
  ((__m256i)__builtin_lasx_xvslei_wu ((v8u32)(_1), (_2)))

/* Assembly instruction format:	xd, xj, ui5.  */
/* Data types in instruction templates:  V4DI, UV4DI, UQI.  */
#define __lasx_xvslei_du(/*__m256i*/ _1, /*ui5*/ _2) \
  ((__m256i)__builtin_lasx_xvslei_du ((v4u64)(_1), (_2)))

/* Assembly instruction format:	xd, xj, ui3.  */
/* Data types in instruction templates:  V32QI, V32QI, UQI.  */
#define __lasx_xvsat_b(/*__m256i*/ _1, /*ui3*/ _2) \
  ((__m256i)__builtin_lasx_xvsat_b ((v32i8)(_1), (_2)))

/* Assembly instruction format:	xd, xj, ui4.  */
/* Data types in instruction templates:  V16HI, V16HI, UQI.  */
#define __lasx_xvsat_h(/*__m256i*/ _1, /*ui4*/ _2) \
  ((__m256i)__builtin_lasx_xvsat_h ((v16i16)(_1), (_2)))

/* Assembly instruction format:	xd, xj, ui5.  */
/* Data types in instruction templates:  V8SI, V8SI, UQI.  */
#define __lasx_xvsat_w(/*__m256i*/ _1, /*ui5*/ _2) \
  ((__m256i)__builtin_lasx_xvsat_w ((v8i32)(_1), (_2)))

/* Assembly instruction format:	xd, xj, ui6.  */
/* Data types in instruction templates:  V4DI, V4DI, UQI.  */
#define __lasx_xvsat_d(/*__m256i*/ _1, /*ui6*/ _2) \
  ((__m256i)__builtin_lasx_xvsat_d ((v4i64)(_1), (_2)))

/* Assembly instruction format:	xd, xj, ui3.  */
/* Data types in instruction templates:  UV32QI, UV32QI, UQI.  */
#define __lasx_xvsat_bu(/*__m256i*/ _1, /*ui3*/ _2) \
  ((__m256i)__builtin_lasx_xvsat_bu ((v32u8)(_1), (_2)))

/* Assembly instruction format:	xd, xj, ui4.  */
/* Data types in instruction templates:  UV16HI, UV16HI, UQI.  */
#define __lasx_xvsat_hu(/*__m256i*/ _1, /*ui4*/ _2) \
  ((__m256i)__builtin_lasx_xvsat_hu ((v16u16)(_1), (_2)))

/* Assembly instruction format:	xd, xj, ui5.  */
/* Data types in instruction templates:  UV8SI, UV8SI, UQI.  */
#define __lasx_xvsat_wu(/*__m256i*/ _1, /*ui5*/ _2) \
  ((__m256i)__builtin_lasx_xvsat_wu ((v8u32)(_1), (_2)))

/* Assembly instruction format:	xd, xj, ui6.  */
/* Data types in instruction templates:  UV4DI, UV4DI, UQI.  */
#define __lasx_xvsat_du(/*__m256i*/ _1, /*ui6*/ _2) \
  ((__m256i)__builtin_lasx_xvsat_du ((v4u64)(_1), (_2)))

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V32QI, V32QI, V32QI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvadda_b (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvadda_b ((v32i8)_1, (v32i8)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V16HI, V16HI, V16HI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvadda_h (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvadda_h ((v16i16)_1, (v16i16)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V8SI, V8SI, V8SI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvadda_w (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvadda_w ((v8i32)_1, (v8i32)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V4DI, V4DI, V4DI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvadda_d (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvadda_d ((v4i64)_1, (v4i64)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V32QI, V32QI, V32QI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvsadd_b (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvsadd_b ((v32i8)_1, (v32i8)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V16HI, V16HI, V16HI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvsadd_h (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvsadd_h ((v16i16)_1, (v16i16)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V8SI, V8SI, V8SI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvsadd_w (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvsadd_w ((v8i32)_1, (v8i32)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V4DI, V4DI, V4DI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvsadd_d (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvsadd_d ((v4i64)_1, (v4i64)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  UV32QI, UV32QI, UV32QI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvsadd_bu (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvsadd_bu ((v32u8)_1, (v32u8)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  UV16HI, UV16HI, UV16HI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvsadd_hu (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvsadd_hu ((v16u16)_1, (v16u16)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  UV8SI, UV8SI, UV8SI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvsadd_wu (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvsadd_wu ((v8u32)_1, (v8u32)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  UV4DI, UV4DI, UV4DI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvsadd_du (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvsadd_du ((v4u64)_1, (v4u64)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V32QI, V32QI, V32QI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvavg_b (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvavg_b ((v32i8)_1, (v32i8)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V16HI, V16HI, V16HI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvavg_h (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvavg_h ((v16i16)_1, (v16i16)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V8SI, V8SI, V8SI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvavg_w (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvavg_w ((v8i32)_1, (v8i32)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V4DI, V4DI, V4DI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvavg_d (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvavg_d ((v4i64)_1, (v4i64)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  UV32QI, UV32QI, UV32QI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvavg_bu (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvavg_bu ((v32u8)_1, (v32u8)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  UV16HI, UV16HI, UV16HI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvavg_hu (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvavg_hu ((v16u16)_1, (v16u16)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  UV8SI, UV8SI, UV8SI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvavg_wu (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvavg_wu ((v8u32)_1, (v8u32)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  UV4DI, UV4DI, UV4DI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvavg_du (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvavg_du ((v4u64)_1, (v4u64)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V32QI, V32QI, V32QI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvavgr_b (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvavgr_b ((v32i8)_1, (v32i8)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V16HI, V16HI, V16HI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvavgr_h (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvavgr_h ((v16i16)_1, (v16i16)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V8SI, V8SI, V8SI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvavgr_w (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvavgr_w ((v8i32)_1, (v8i32)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V4DI, V4DI, V4DI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvavgr_d (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvavgr_d ((v4i64)_1, (v4i64)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  UV32QI, UV32QI, UV32QI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvavgr_bu (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvavgr_bu ((v32u8)_1, (v32u8)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  UV16HI, UV16HI, UV16HI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvavgr_hu (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvavgr_hu ((v16u16)_1, (v16u16)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  UV8SI, UV8SI, UV8SI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvavgr_wu (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvavgr_wu ((v8u32)_1, (v8u32)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  UV4DI, UV4DI, UV4DI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvavgr_du (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvavgr_du ((v4u64)_1, (v4u64)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V32QI, V32QI, V32QI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvssub_b (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvssub_b ((v32i8)_1, (v32i8)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V16HI, V16HI, V16HI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvssub_h (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvssub_h ((v16i16)_1, (v16i16)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V8SI, V8SI, V8SI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvssub_w (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvssub_w ((v8i32)_1, (v8i32)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V4DI, V4DI, V4DI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvssub_d (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvssub_d ((v4i64)_1, (v4i64)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  UV32QI, UV32QI, UV32QI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvssub_bu (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvssub_bu ((v32u8)_1, (v32u8)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  UV16HI, UV16HI, UV16HI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvssub_hu (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvssub_hu ((v16u16)_1, (v16u16)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  UV8SI, UV8SI, UV8SI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvssub_wu (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvssub_wu ((v8u32)_1, (v8u32)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  UV4DI, UV4DI, UV4DI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvssub_du (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvssub_du ((v4u64)_1, (v4u64)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V32QI, V32QI, V32QI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvabsd_b (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvabsd_b ((v32i8)_1, (v32i8)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V16HI, V16HI, V16HI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvabsd_h (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvabsd_h ((v16i16)_1, (v16i16)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V8SI, V8SI, V8SI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvabsd_w (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvabsd_w ((v8i32)_1, (v8i32)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V4DI, V4DI, V4DI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvabsd_d (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvabsd_d ((v4i64)_1, (v4i64)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  UV32QI, UV32QI, UV32QI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvabsd_bu (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvabsd_bu ((v32u8)_1, (v32u8)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  UV16HI, UV16HI, UV16HI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvabsd_hu (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvabsd_hu ((v16u16)_1, (v16u16)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  UV8SI, UV8SI, UV8SI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvabsd_wu (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvabsd_wu ((v8u32)_1, (v8u32)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  UV4DI, UV4DI, UV4DI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvabsd_du (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvabsd_du ((v4u64)_1, (v4u64)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V32QI, V32QI, V32QI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvmul_b (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvmul_b ((v32i8)_1, (v32i8)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V16HI, V16HI, V16HI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvmul_h (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvmul_h ((v16i16)_1, (v16i16)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V8SI, V8SI, V8SI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvmul_w (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvmul_w ((v8i32)_1, (v8i32)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V4DI, V4DI, V4DI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvmul_d (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvmul_d ((v4i64)_1, (v4i64)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V32QI, V32QI, V32QI, V32QI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvmadd_b (__m256i _1, __m256i _2, __m256i _3)
{
  return (__m256i)__builtin_lasx_xvmadd_b ((v32i8)_1, (v32i8)_2, (v32i8)_3);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V16HI, V16HI, V16HI, V16HI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvmadd_h (__m256i _1, __m256i _2, __m256i _3)
{
  return (__m256i)__builtin_lasx_xvmadd_h ((v16i16)_1, (v16i16)_2, (v16i16)_3);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V8SI, V8SI, V8SI, V8SI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvmadd_w (__m256i _1, __m256i _2, __m256i _3)
{
  return (__m256i)__builtin_lasx_xvmadd_w ((v8i32)_1, (v8i32)_2, (v8i32)_3);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V4DI, V4DI, V4DI, V4DI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvmadd_d (__m256i _1, __m256i _2, __m256i _3)
{
  return (__m256i)__builtin_lasx_xvmadd_d ((v4i64)_1, (v4i64)_2, (v4i64)_3);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V32QI, V32QI, V32QI, V32QI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvmsub_b (__m256i _1, __m256i _2, __m256i _3)
{
  return (__m256i)__builtin_lasx_xvmsub_b ((v32i8)_1, (v32i8)_2, (v32i8)_3);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V16HI, V16HI, V16HI, V16HI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvmsub_h (__m256i _1, __m256i _2, __m256i _3)
{
  return (__m256i)__builtin_lasx_xvmsub_h ((v16i16)_1, (v16i16)_2, (v16i16)_3);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V8SI, V8SI, V8SI, V8SI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvmsub_w (__m256i _1, __m256i _2, __m256i _3)
{
  return (__m256i)__builtin_lasx_xvmsub_w ((v8i32)_1, (v8i32)_2, (v8i32)_3);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V4DI, V4DI, V4DI, V4DI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvmsub_d (__m256i _1, __m256i _2, __m256i _3)
{
  return (__m256i)__builtin_lasx_xvmsub_d ((v4i64)_1, (v4i64)_2, (v4i64)_3);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V32QI, V32QI, V32QI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvdiv_b (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvdiv_b ((v32i8)_1, (v32i8)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V16HI, V16HI, V16HI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvdiv_h (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvdiv_h ((v16i16)_1, (v16i16)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V8SI, V8SI, V8SI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvdiv_w (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvdiv_w ((v8i32)_1, (v8i32)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V4DI, V4DI, V4DI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvdiv_d (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvdiv_d ((v4i64)_1, (v4i64)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  UV32QI, UV32QI, UV32QI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvdiv_bu (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvdiv_bu ((v32u8)_1, (v32u8)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  UV16HI, UV16HI, UV16HI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvdiv_hu (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvdiv_hu ((v16u16)_1, (v16u16)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  UV8SI, UV8SI, UV8SI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvdiv_wu (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvdiv_wu ((v8u32)_1, (v8u32)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  UV4DI, UV4DI, UV4DI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvdiv_du (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvdiv_du ((v4u64)_1, (v4u64)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V16HI, V32QI, V32QI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvhaddw_h_b (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvhaddw_h_b ((v32i8)_1, (v32i8)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V8SI, V16HI, V16HI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvhaddw_w_h (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvhaddw_w_h ((v16i16)_1, (v16i16)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V4DI, V8SI, V8SI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvhaddw_d_w (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvhaddw_d_w ((v8i32)_1, (v8i32)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  UV16HI, UV32QI, UV32QI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvhaddw_hu_bu (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvhaddw_hu_bu ((v32u8)_1, (v32u8)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  UV8SI, UV16HI, UV16HI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvhaddw_wu_hu (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvhaddw_wu_hu ((v16u16)_1, (v16u16)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  UV4DI, UV8SI, UV8SI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvhaddw_du_wu (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvhaddw_du_wu ((v8u32)_1, (v8u32)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V16HI, V32QI, V32QI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvhsubw_h_b (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvhsubw_h_b ((v32i8)_1, (v32i8)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V8SI, V16HI, V16HI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvhsubw_w_h (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvhsubw_w_h ((v16i16)_1, (v16i16)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V4DI, V8SI, V8SI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvhsubw_d_w (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvhsubw_d_w ((v8i32)_1, (v8i32)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V16HI, UV32QI, UV32QI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvhsubw_hu_bu (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvhsubw_hu_bu ((v32u8)_1, (v32u8)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V8SI, UV16HI, UV16HI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvhsubw_wu_hu (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvhsubw_wu_hu ((v16u16)_1, (v16u16)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V4DI, UV8SI, UV8SI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvhsubw_du_wu (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvhsubw_du_wu ((v8u32)_1, (v8u32)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V32QI, V32QI, V32QI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvmod_b (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvmod_b ((v32i8)_1, (v32i8)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V16HI, V16HI, V16HI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvmod_h (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvmod_h ((v16i16)_1, (v16i16)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V8SI, V8SI, V8SI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvmod_w (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvmod_w ((v8i32)_1, (v8i32)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V4DI, V4DI, V4DI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvmod_d (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvmod_d ((v4i64)_1, (v4i64)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  UV32QI, UV32QI, UV32QI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvmod_bu (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvmod_bu ((v32u8)_1, (v32u8)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  UV16HI, UV16HI, UV16HI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvmod_hu (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvmod_hu ((v16u16)_1, (v16u16)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  UV8SI, UV8SI, UV8SI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvmod_wu (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvmod_wu ((v8u32)_1, (v8u32)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  UV4DI, UV4DI, UV4DI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvmod_du (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvmod_du ((v4u64)_1, (v4u64)_2);
}

/* Assembly instruction format:	xd, xj, ui4.  */
/* Data types in instruction templates:  V32QI, V32QI, UQI.  */
#define __lasx_xvrepl128vei_b(/*__m256i*/ _1, /*ui4*/ _2) \
  ((__m256i)__builtin_lasx_xvrepl128vei_b ((v32i8)(_1), (_2)))

/* Assembly instruction format:	xd, xj, ui3.  */
/* Data types in instruction templates:  V16HI, V16HI, UQI.  */
#define __lasx_xvrepl128vei_h(/*__m256i*/ _1, /*ui3*/ _2) \
  ((__m256i)__builtin_lasx_xvrepl128vei_h ((v16i16)(_1), (_2)))

/* Assembly instruction format:	xd, xj, ui2.  */
/* Data types in instruction templates:  V8SI, V8SI, UQI.  */
#define __lasx_xvrepl128vei_w(/*__m256i*/ _1, /*ui2*/ _2) \
  ((__m256i)__builtin_lasx_xvrepl128vei_w ((v8i32)(_1), (_2)))

/* Assembly instruction format:	xd, xj, ui1.  */
/* Data types in instruction templates:  V4DI, V4DI, UQI.  */
#define __lasx_xvrepl128vei_d(/*__m256i*/ _1, /*ui1*/ _2) \
  ((__m256i)__builtin_lasx_xvrepl128vei_d ((v4i64)(_1), (_2)))

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V32QI, V32QI, V32QI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvpickev_b (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvpickev_b ((v32i8)_1, (v32i8)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V16HI, V16HI, V16HI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvpickev_h (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvpickev_h ((v16i16)_1, (v16i16)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V8SI, V8SI, V8SI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvpickev_w (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvpickev_w ((v8i32)_1, (v8i32)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V4DI, V4DI, V4DI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvpickev_d (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvpickev_d ((v4i64)_1, (v4i64)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V32QI, V32QI, V32QI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvpickod_b (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvpickod_b ((v32i8)_1, (v32i8)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V16HI, V16HI, V16HI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvpickod_h (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvpickod_h ((v16i16)_1, (v16i16)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V8SI, V8SI, V8SI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvpickod_w (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvpickod_w ((v8i32)_1, (v8i32)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V4DI, V4DI, V4DI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvpickod_d (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvpickod_d ((v4i64)_1, (v4i64)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V32QI, V32QI, V32QI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvilvh_b (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvilvh_b ((v32i8)_1, (v32i8)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V16HI, V16HI, V16HI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvilvh_h (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvilvh_h ((v16i16)_1, (v16i16)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V8SI, V8SI, V8SI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvilvh_w (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvilvh_w ((v8i32)_1, (v8i32)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V4DI, V4DI, V4DI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvilvh_d (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvilvh_d ((v4i64)_1, (v4i64)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V32QI, V32QI, V32QI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvilvl_b (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvilvl_b ((v32i8)_1, (v32i8)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V16HI, V16HI, V16HI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvilvl_h (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvilvl_h ((v16i16)_1, (v16i16)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V8SI, V8SI, V8SI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvilvl_w (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvilvl_w ((v8i32)_1, (v8i32)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V4DI, V4DI, V4DI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvilvl_d (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvilvl_d ((v4i64)_1, (v4i64)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V32QI, V32QI, V32QI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvpackev_b (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvpackev_b ((v32i8)_1, (v32i8)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V16HI, V16HI, V16HI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvpackev_h (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvpackev_h ((v16i16)_1, (v16i16)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V8SI, V8SI, V8SI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvpackev_w (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvpackev_w ((v8i32)_1, (v8i32)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V4DI, V4DI, V4DI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvpackev_d (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvpackev_d ((v4i64)_1, (v4i64)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V32QI, V32QI, V32QI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvpackod_b (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvpackod_b ((v32i8)_1, (v32i8)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V16HI, V16HI, V16HI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvpackod_h (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvpackod_h ((v16i16)_1, (v16i16)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V8SI, V8SI, V8SI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvpackod_w (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvpackod_w ((v8i32)_1, (v8i32)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V4DI, V4DI, V4DI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvpackod_d (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvpackod_d ((v4i64)_1, (v4i64)_2);
}

/* Assembly instruction format:	xd, xj, xk, xa.  */
/* Data types in instruction templates:  V32QI, V32QI, V32QI, V32QI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvshuf_b (__m256i _1, __m256i _2, __m256i _3)
{
  return (__m256i)__builtin_lasx_xvshuf_b ((v32i8)_1, (v32i8)_2, (v32i8)_3);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V16HI, V16HI, V16HI, V16HI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvshuf_h (__m256i _1, __m256i _2, __m256i _3)
{
  return (__m256i)__builtin_lasx_xvshuf_h ((v16i16)_1, (v16i16)_2, (v16i16)_3);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V8SI, V8SI, V8SI, V8SI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvshuf_w (__m256i _1, __m256i _2, __m256i _3)
{
  return (__m256i)__builtin_lasx_xvshuf_w ((v8i32)_1, (v8i32)_2, (v8i32)_3);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V4DI, V4DI, V4DI, V4DI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvshuf_d (__m256i _1, __m256i _2, __m256i _3)
{
  return (__m256i)__builtin_lasx_xvshuf_d ((v4i64)_1, (v4i64)_2, (v4i64)_3);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  UV32QI, UV32QI, UV32QI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvand_v (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvand_v ((v32u8)_1, (v32u8)_2);
}

/* Assembly instruction format:	xd, xj, ui8.  */
/* Data types in instruction templates:  UV32QI, UV32QI, UQI.  */
#define __lasx_xvandi_b(/*__m256i*/ _1, /*ui8*/ _2) \
  ((__m256i)__builtin_lasx_xvandi_b ((v32u8)(_1), (_2)))

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  UV32QI, UV32QI, UV32QI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvor_v (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvor_v ((v32u8)_1, (v32u8)_2);
}

/* Assembly instruction format:	xd, xj, ui8.  */
/* Data types in instruction templates:  UV32QI, UV32QI, UQI.  */
#define __lasx_xvori_b(/*__m256i*/ _1, /*ui8*/ _2) \
  ((__m256i)__builtin_lasx_xvori_b ((v32u8)(_1), (_2)))

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  UV32QI, UV32QI, UV32QI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvnor_v (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvnor_v ((v32u8)_1, (v32u8)_2);
}

/* Assembly instruction format:	xd, xj, ui8.  */
/* Data types in instruction templates:  UV32QI, UV32QI, UQI.  */
#define __lasx_xvnori_b(/*__m256i*/ _1, /*ui8*/ _2) \
  ((__m256i)__builtin_lasx_xvnori_b ((v32u8)(_1), (_2)))

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  UV32QI, UV32QI, UV32QI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvxor_v (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvxor_v ((v32u8)_1, (v32u8)_2);
}

/* Assembly instruction format:	xd, xj, ui8.  */
/* Data types in instruction templates:  UV32QI, UV32QI, UQI.  */
#define __lasx_xvxori_b(/*__m256i*/ _1, /*ui8*/ _2) \
  ((__m256i)__builtin_lasx_xvxori_b ((v32u8)(_1), (_2)))

/* Assembly instruction format:	xd, xj, xk, xa.  */
/* Data types in instruction templates:  UV32QI, UV32QI, UV32QI, UV32QI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvbitsel_v (__m256i _1, __m256i _2, __m256i _3)
{
  return (__m256i)__builtin_lasx_xvbitsel_v ((v32u8)_1, (v32u8)_2, (v32u8)_3);
}

/* Assembly instruction format:	xd, xj, ui8.  */
/* Data types in instruction templates:  UV32QI, UV32QI, UV32QI, USI.  */
#define __lasx_xvbitseli_b(/*__m256i*/ _1, /*__m256i*/ _2, /*ui8*/ _3) \
  ((__m256i)__builtin_lasx_xvbitseli_b ((v32u8)(_1), (v32u8)(_2), (_3)))

/* Assembly instruction format:	xd, xj, ui8.  */
/* Data types in instruction templates:  V32QI, V32QI, USI.  */
#define __lasx_xvshuf4i_b(/*__m256i*/ _1, /*ui8*/ _2) \
  ((__m256i)__builtin_lasx_xvshuf4i_b ((v32i8)(_1), (_2)))

/* Assembly instruction format:	xd, xj, ui8.  */
/* Data types in instruction templates:  V16HI, V16HI, USI.  */
#define __lasx_xvshuf4i_h(/*__m256i*/ _1, /*ui8*/ _2) \
  ((__m256i)__builtin_lasx_xvshuf4i_h ((v16i16)(_1), (_2)))

/* Assembly instruction format:	xd, xj, ui8.  */
/* Data types in instruction templates:  V8SI, V8SI, USI.  */
#define __lasx_xvshuf4i_w(/*__m256i*/ _1, /*ui8*/ _2) \
  ((__m256i)__builtin_lasx_xvshuf4i_w ((v8i32)(_1), (_2)))

/* Assembly instruction format:	xd, rj.  */
/* Data types in instruction templates:  V32QI, SI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvreplgr2vr_b (int _1)
{
  return (__m256i)__builtin_lasx_xvreplgr2vr_b ((int)_1);
}

/* Assembly instruction format:	xd, rj.  */
/* Data types in instruction templates:  V16HI, SI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvreplgr2vr_h (int _1)
{
  return (__m256i)__builtin_lasx_xvreplgr2vr_h ((int)_1);
}

/* Assembly instruction format:	xd, rj.  */
/* Data types in instruction templates:  V8SI, SI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvreplgr2vr_w (int _1)
{
  return (__m256i)__builtin_lasx_xvreplgr2vr_w ((int)_1);
}

/* Assembly instruction format:	xd, rj.  */
/* Data types in instruction templates:  V4DI, DI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvreplgr2vr_d (long int _1)
{
  return (__m256i)__builtin_lasx_xvreplgr2vr_d ((long int)_1);
}

/* Assembly instruction format:	xd, xj.  */
/* Data types in instruction templates:  V32QI, V32QI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvpcnt_b (__m256i _1)
{
  return (__m256i)__builtin_lasx_xvpcnt_b ((v32i8)_1);
}

/* Assembly instruction format:	xd, xj.  */
/* Data types in instruction templates:  V16HI, V16HI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvpcnt_h (__m256i _1)
{
  return (__m256i)__builtin_lasx_xvpcnt_h ((v16i16)_1);
}

/* Assembly instruction format:	xd, xj.  */
/* Data types in instruction templates:  V8SI, V8SI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvpcnt_w (__m256i _1)
{
  return (__m256i)__builtin_lasx_xvpcnt_w ((v8i32)_1);
}

/* Assembly instruction format:	xd, xj.  */
/* Data types in instruction templates:  V4DI, V4DI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvpcnt_d (__m256i _1)
{
  return (__m256i)__builtin_lasx_xvpcnt_d ((v4i64)_1);
}

/* Assembly instruction format:	xd, xj.  */
/* Data types in instruction templates:  V32QI, V32QI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvclo_b (__m256i _1)
{
  return (__m256i)__builtin_lasx_xvclo_b ((v32i8)_1);
}

/* Assembly instruction format:	xd, xj.  */
/* Data types in instruction templates:  V16HI, V16HI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvclo_h (__m256i _1)
{
  return (__m256i)__builtin_lasx_xvclo_h ((v16i16)_1);
}

/* Assembly instruction format:	xd, xj.  */
/* Data types in instruction templates:  V8SI, V8SI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvclo_w (__m256i _1)
{
  return (__m256i)__builtin_lasx_xvclo_w ((v8i32)_1);
}

/* Assembly instruction format:	xd, xj.  */
/* Data types in instruction templates:  V4DI, V4DI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvclo_d (__m256i _1)
{
  return (__m256i)__builtin_lasx_xvclo_d ((v4i64)_1);
}

/* Assembly instruction format:	xd, xj.  */
/* Data types in instruction templates:  V32QI, V32QI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvclz_b (__m256i _1)
{
  return (__m256i)__builtin_lasx_xvclz_b ((v32i8)_1);
}

/* Assembly instruction format:	xd, xj.  */
/* Data types in instruction templates:  V16HI, V16HI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvclz_h (__m256i _1)
{
  return (__m256i)__builtin_lasx_xvclz_h ((v16i16)_1);
}

/* Assembly instruction format:	xd, xj.  */
/* Data types in instruction templates:  V8SI, V8SI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvclz_w (__m256i _1)
{
  return (__m256i)__builtin_lasx_xvclz_w ((v8i32)_1);
}

/* Assembly instruction format:	xd, xj.  */
/* Data types in instruction templates:  V4DI, V4DI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvclz_d (__m256i _1)
{
  return (__m256i)__builtin_lasx_xvclz_d ((v4i64)_1);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V8SF, V8SF, V8SF.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256 __lasx_xvfadd_s (__m256 _1, __m256 _2)
{
  return (__m256)__builtin_lasx_xvfadd_s ((v8f32)_1, (v8f32)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V4DF, V4DF, V4DF.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256d __lasx_xvfadd_d (__m256d _1, __m256d _2)
{
  return (__m256d)__builtin_lasx_xvfadd_d ((v4f64)_1, (v4f64)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V8SF, V8SF, V8SF.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256 __lasx_xvfsub_s (__m256 _1, __m256 _2)
{
  return (__m256)__builtin_lasx_xvfsub_s ((v8f32)_1, (v8f32)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V4DF, V4DF, V4DF.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256d __lasx_xvfsub_d (__m256d _1, __m256d _2)
{
  return (__m256d)__builtin_lasx_xvfsub_d ((v4f64)_1, (v4f64)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V8SF, V8SF, V8SF.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256 __lasx_xvfmul_s (__m256 _1, __m256 _2)
{
  return (__m256)__builtin_lasx_xvfmul_s ((v8f32)_1, (v8f32)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V4DF, V4DF, V4DF.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256d __lasx_xvfmul_d (__m256d _1, __m256d _2)
{
  return (__m256d)__builtin_lasx_xvfmul_d ((v4f64)_1, (v4f64)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V8SF, V8SF, V8SF.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256 __lasx_xvfdiv_s (__m256 _1, __m256 _2)
{
  return (__m256)__builtin_lasx_xvfdiv_s ((v8f32)_1, (v8f32)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V4DF, V4DF, V4DF.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256d __lasx_xvfdiv_d (__m256d _1, __m256d _2)
{
  return (__m256d)__builtin_lasx_xvfdiv_d ((v4f64)_1, (v4f64)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V16HI, V8SF, V8SF.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvfcvt_h_s (__m256 _1, __m256 _2)
{
  return (__m256i)__builtin_lasx_xvfcvt_h_s ((v8f32)_1, (v8f32)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V8SF, V4DF, V4DF.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256 __lasx_xvfcvt_s_d (__m256d _1, __m256d _2)
{
  return (__m256)__builtin_lasx_xvfcvt_s_d ((v4f64)_1, (v4f64)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V8SF, V8SF, V8SF.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256 __lasx_xvfmin_s (__m256 _1, __m256 _2)
{
  return (__m256)__builtin_lasx_xvfmin_s ((v8f32)_1, (v8f32)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V4DF, V4DF, V4DF.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256d __lasx_xvfmin_d (__m256d _1, __m256d _2)
{
  return (__m256d)__builtin_lasx_xvfmin_d ((v4f64)_1, (v4f64)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V8SF, V8SF, V8SF.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256 __lasx_xvfmina_s (__m256 _1, __m256 _2)
{
  return (__m256)__builtin_lasx_xvfmina_s ((v8f32)_1, (v8f32)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V4DF, V4DF, V4DF.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256d __lasx_xvfmina_d (__m256d _1, __m256d _2)
{
  return (__m256d)__builtin_lasx_xvfmina_d ((v4f64)_1, (v4f64)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V8SF, V8SF, V8SF.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256 __lasx_xvfmax_s (__m256 _1, __m256 _2)
{
  return (__m256)__builtin_lasx_xvfmax_s ((v8f32)_1, (v8f32)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V4DF, V4DF, V4DF.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256d __lasx_xvfmax_d (__m256d _1, __m256d _2)
{
  return (__m256d)__builtin_lasx_xvfmax_d ((v4f64)_1, (v4f64)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V8SF, V8SF, V8SF.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256 __lasx_xvfmaxa_s (__m256 _1, __m256 _2)
{
  return (__m256)__builtin_lasx_xvfmaxa_s ((v8f32)_1, (v8f32)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V4DF, V4DF, V4DF.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256d __lasx_xvfmaxa_d (__m256d _1, __m256d _2)
{
  return (__m256d)__builtin_lasx_xvfmaxa_d ((v4f64)_1, (v4f64)_2);
}

/* Assembly instruction format:	xd, xj.  */
/* Data types in instruction templates:  V8SI, V8SF.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvfclass_s (__m256 _1)
{
  return (__m256i)__builtin_lasx_xvfclass_s ((v8f32)_1);
}

/* Assembly instruction format:	xd, xj.  */
/* Data types in instruction templates:  V4DI, V4DF.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvfclass_d (__m256d _1)
{
  return (__m256i)__builtin_lasx_xvfclass_d ((v4f64)_1);
}

/* Assembly instruction format:	xd, xj.  */
/* Data types in instruction templates:  V8SF, V8SF.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256 __lasx_xvfsqrt_s (__m256 _1)
{
  return (__m256)__builtin_lasx_xvfsqrt_s ((v8f32)_1);
}

/* Assembly instruction format:	xd, xj.  */
/* Data types in instruction templates:  V4DF, V4DF.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256d __lasx_xvfsqrt_d (__m256d _1)
{
  return (__m256d)__builtin_lasx_xvfsqrt_d ((v4f64)_1);
}

/* Assembly instruction format:	xd, xj.  */
/* Data types in instruction templates:  V8SF, V8SF.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256 __lasx_xvfrecip_s (__m256 _1)
{
  return (__m256)__builtin_lasx_xvfrecip_s ((v8f32)_1);
}

/* Assembly instruction format:	xd, xj.  */
/* Data types in instruction templates:  V4DF, V4DF.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256d __lasx_xvfrecip_d (__m256d _1)
{
  return (__m256d)__builtin_lasx_xvfrecip_d ((v4f64)_1);
}

#if defined(__loongarch_frecipe)
/* Assembly instruction format: xd, xj.  */
/* Data types in instruction templates:  V8SF, V8SF.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256 __lasx_xvfrecipe_s (__m256 _1)
{
  return (__m256)__builtin_lasx_xvfrecipe_s ((v8f32)_1);
}

/* Assembly instruction format: xd, xj.  */
/* Data types in instruction templates:  V4DF, V4DF.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256d __lasx_xvfrecipe_d (__m256d _1)
{
  return (__m256d)__builtin_lasx_xvfrecipe_d ((v4f64)_1);
}

/* Assembly instruction format: xd, xj.  */
/* Data types in instruction templates:  V8SF, V8SF.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256 __lasx_xvfrsqrte_s (__m256 _1)
{
  return (__m256)__builtin_lasx_xvfrsqrte_s ((v8f32)_1);
}

/* Assembly instruction format: xd, xj.  */
/* Data types in instruction templates:  V4DF, V4DF.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256d __lasx_xvfrsqrte_d (__m256d _1)
{
  return (__m256d)__builtin_lasx_xvfrsqrte_d ((v4f64)_1);
}
#endif

/* Assembly instruction format:	xd, xj.  */
/* Data types in instruction templates:  V8SF, V8SF.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256 __lasx_xvfrint_s (__m256 _1)
{
  return (__m256)__builtin_lasx_xvfrint_s ((v8f32)_1);
}

/* Assembly instruction format:	xd, xj.  */
/* Data types in instruction templates:  V4DF, V4DF.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256d __lasx_xvfrint_d (__m256d _1)
{
  return (__m256d)__builtin_lasx_xvfrint_d ((v4f64)_1);
}

/* Assembly instruction format:	xd, xj.  */
/* Data types in instruction templates:  V8SF, V8SF.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256 __lasx_xvfrsqrt_s (__m256 _1)
{
  return (__m256)__builtin_lasx_xvfrsqrt_s ((v8f32)_1);
}

/* Assembly instruction format:	xd, xj.  */
/* Data types in instruction templates:  V4DF, V4DF.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256d __lasx_xvfrsqrt_d (__m256d _1)
{
  return (__m256d)__builtin_lasx_xvfrsqrt_d ((v4f64)_1);
}

/* Assembly instruction format:	xd, xj.  */
/* Data types in instruction templates:  V8SF, V8SF.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256 __lasx_xvflogb_s (__m256 _1)
{
  return (__m256)__builtin_lasx_xvflogb_s ((v8f32)_1);
}

/* Assembly instruction format:	xd, xj.  */
/* Data types in instruction templates:  V4DF, V4DF.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256d __lasx_xvflogb_d (__m256d _1)
{
  return (__m256d)__builtin_lasx_xvflogb_d ((v4f64)_1);
}

/* Assembly instruction format:	xd, xj.  */
/* Data types in instruction templates:  V8SF, V16HI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256 __lasx_xvfcvth_s_h (__m256i _1)
{
  return (__m256)__builtin_lasx_xvfcvth_s_h ((v16i16)_1);
}

/* Assembly instruction format:	xd, xj.  */
/* Data types in instruction templates:  V4DF, V8SF.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256d __lasx_xvfcvth_d_s (__m256 _1)
{
  return (__m256d)__builtin_lasx_xvfcvth_d_s ((v8f32)_1);
}

/* Assembly instruction format:	xd, xj.  */
/* Data types in instruction templates:  V8SF, V16HI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256 __lasx_xvfcvtl_s_h (__m256i _1)
{
  return (__m256)__builtin_lasx_xvfcvtl_s_h ((v16i16)_1);
}

/* Assembly instruction format:	xd, xj.  */
/* Data types in instruction templates:  V4DF, V8SF.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256d __lasx_xvfcvtl_d_s (__m256 _1)
{
  return (__m256d)__builtin_lasx_xvfcvtl_d_s ((v8f32)_1);
}

/* Assembly instruction format:	xd, xj.  */
/* Data types in instruction templates:  V8SI, V8SF.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvftint_w_s (__m256 _1)
{
  return (__m256i)__builtin_lasx_xvftint_w_s ((v8f32)_1);
}

/* Assembly instruction format:	xd, xj.  */
/* Data types in instruction templates:  V4DI, V4DF.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvftint_l_d (__m256d _1)
{
  return (__m256i)__builtin_lasx_xvftint_l_d ((v4f64)_1);
}

/* Assembly instruction format:	xd, xj.  */
/* Data types in instruction templates:  UV8SI, V8SF.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvftint_wu_s (__m256 _1)
{
  return (__m256i)__builtin_lasx_xvftint_wu_s ((v8f32)_1);
}

/* Assembly instruction format:	xd, xj.  */
/* Data types in instruction templates:  UV4DI, V4DF.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvftint_lu_d (__m256d _1)
{
  return (__m256i)__builtin_lasx_xvftint_lu_d ((v4f64)_1);
}

/* Assembly instruction format:	xd, xj.  */
/* Data types in instruction templates:  V8SI, V8SF.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvftintrz_w_s (__m256 _1)
{
  return (__m256i)__builtin_lasx_xvftintrz_w_s ((v8f32)_1);
}

/* Assembly instruction format:	xd, xj.  */
/* Data types in instruction templates:  V4DI, V4DF.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvftintrz_l_d (__m256d _1)
{
  return (__m256i)__builtin_lasx_xvftintrz_l_d ((v4f64)_1);
}

/* Assembly instruction format:	xd, xj.  */
/* Data types in instruction templates:  UV8SI, V8SF.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvftintrz_wu_s (__m256 _1)
{
  return (__m256i)__builtin_lasx_xvftintrz_wu_s ((v8f32)_1);
}

/* Assembly instruction format:	xd, xj.  */
/* Data types in instruction templates:  UV4DI, V4DF.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvftintrz_lu_d (__m256d _1)
{
  return (__m256i)__builtin_lasx_xvftintrz_lu_d ((v4f64)_1);
}

/* Assembly instruction format:	xd, xj.  */
/* Data types in instruction templates:  V8SF, V8SI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256 __lasx_xvffint_s_w (__m256i _1)
{
  return (__m256)__builtin_lasx_xvffint_s_w ((v8i32)_1);
}

/* Assembly instruction format:	xd, xj.  */
/* Data types in instruction templates:  V4DF, V4DI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256d __lasx_xvffint_d_l (__m256i _1)
{
  return (__m256d)__builtin_lasx_xvffint_d_l ((v4i64)_1);
}

/* Assembly instruction format:	xd, xj.  */
/* Data types in instruction templates:  V8SF, UV8SI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256 __lasx_xvffint_s_wu (__m256i _1)
{
  return (__m256)__builtin_lasx_xvffint_s_wu ((v8u32)_1);
}

/* Assembly instruction format:	xd, xj.  */
/* Data types in instruction templates:  V4DF, UV4DI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256d __lasx_xvffint_d_lu (__m256i _1)
{
  return (__m256d)__builtin_lasx_xvffint_d_lu ((v4u64)_1);
}

/* Assembly instruction format:	xd, xj, rk.  */
/* Data types in instruction templates:  V32QI, V32QI, SI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvreplve_b (__m256i _1, int _2)
{
  return (__m256i)__builtin_lasx_xvreplve_b ((v32i8)_1, (int)_2);
}

/* Assembly instruction format:	xd, xj, rk.  */
/* Data types in instruction templates:  V16HI, V16HI, SI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvreplve_h (__m256i _1, int _2)
{
  return (__m256i)__builtin_lasx_xvreplve_h ((v16i16)_1, (int)_2);
}

/* Assembly instruction format:	xd, xj, rk.  */
/* Data types in instruction templates:  V8SI, V8SI, SI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvreplve_w (__m256i _1, int _2)
{
  return (__m256i)__builtin_lasx_xvreplve_w ((v8i32)_1, (int)_2);
}

/* Assembly instruction format:	xd, xj, rk.  */
/* Data types in instruction templates:  V4DI, V4DI, SI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvreplve_d (__m256i _1, int _2)
{
  return (__m256i)__builtin_lasx_xvreplve_d ((v4i64)_1, (int)_2);
}

/* Assembly instruction format:	xd, xj, ui8.  */
/* Data types in instruction templates:  V8SI, V8SI, V8SI, USI.  */
#define __lasx_xvpermi_w(/*__m256i*/ _1, /*__m256i*/ _2, /*ui8*/ _3) \
  ((__m256i)__builtin_lasx_xvpermi_w ((v8i32)(_1), (v8i32)(_2), (_3)))

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  UV32QI, UV32QI, UV32QI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvandn_v (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvandn_v ((v32u8)_1, (v32u8)_2);
}

/* Assembly instruction format:	xd, xj.  */
/* Data types in instruction templates:  V32QI, V32QI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvneg_b (__m256i _1)
{
  return (__m256i)__builtin_lasx_xvneg_b ((v32i8)_1);
}

/* Assembly instruction format:	xd, xj.  */
/* Data types in instruction templates:  V16HI, V16HI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvneg_h (__m256i _1)
{
  return (__m256i)__builtin_lasx_xvneg_h ((v16i16)_1);
}

/* Assembly instruction format:	xd, xj.  */
/* Data types in instruction templates:  V8SI, V8SI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvneg_w (__m256i _1)
{
  return (__m256i)__builtin_lasx_xvneg_w ((v8i32)_1);
}

/* Assembly instruction format:	xd, xj.  */
/* Data types in instruction templates:  V4DI, V4DI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvneg_d (__m256i _1)
{
  return (__m256i)__builtin_lasx_xvneg_d ((v4i64)_1);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V32QI, V32QI, V32QI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvmuh_b (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvmuh_b ((v32i8)_1, (v32i8)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V16HI, V16HI, V16HI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvmuh_h (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvmuh_h ((v16i16)_1, (v16i16)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V8SI, V8SI, V8SI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvmuh_w (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvmuh_w ((v8i32)_1, (v8i32)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V4DI, V4DI, V4DI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvmuh_d (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvmuh_d ((v4i64)_1, (v4i64)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  UV32QI, UV32QI, UV32QI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvmuh_bu (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvmuh_bu ((v32u8)_1, (v32u8)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  UV16HI, UV16HI, UV16HI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvmuh_hu (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvmuh_hu ((v16u16)_1, (v16u16)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  UV8SI, UV8SI, UV8SI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvmuh_wu (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvmuh_wu ((v8u32)_1, (v8u32)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  UV4DI, UV4DI, UV4DI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvmuh_du (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvmuh_du ((v4u64)_1, (v4u64)_2);
}

/* Assembly instruction format:	xd, xj, ui3.  */
/* Data types in instruction templates:  V16HI, V32QI, UQI.  */
#define __lasx_xvsllwil_h_b(/*__m256i*/ _1, /*ui3*/ _2) \
  ((__m256i)__builtin_lasx_xvsllwil_h_b ((v32i8)(_1), (_2)))

/* Assembly instruction format:	xd, xj, ui4.  */
/* Data types in instruction templates:  V8SI, V16HI, UQI.  */
#define __lasx_xvsllwil_w_h(/*__m256i*/ _1, /*ui4*/ _2) \
  ((__m256i)__builtin_lasx_xvsllwil_w_h ((v16i16)(_1), (_2)))

/* Assembly instruction format:	xd, xj, ui5.  */
/* Data types in instruction templates:  V4DI, V8SI, UQI.  */
#define __lasx_xvsllwil_d_w(/*__m256i*/ _1, /*ui5*/ _2) \
  ((__m256i)__builtin_lasx_xvsllwil_d_w ((v8i32)(_1), (_2)))

/* Assembly instruction format:	xd, xj, ui3.  */
/* Data types in instruction templates:  UV16HI, UV32QI, UQI.  */
#define __lasx_xvsllwil_hu_bu(/*__m256i*/ _1, /*ui3*/ _2) \
  ((__m256i)__builtin_lasx_xvsllwil_hu_bu ((v32u8)(_1), (_2)))

/* Assembly instruction format:	xd, xj, ui4.  */
/* Data types in instruction templates:  UV8SI, UV16HI, UQI.  */
#define __lasx_xvsllwil_wu_hu(/*__m256i*/ _1, /*ui4*/ _2) \
  ((__m256i)__builtin_lasx_xvsllwil_wu_hu ((v16u16)(_1), (_2)))

/* Assembly instruction format:	xd, xj, ui5.  */
/* Data types in instruction templates:  UV4DI, UV8SI, UQI.  */
#define __lasx_xvsllwil_du_wu(/*__m256i*/ _1, /*ui5*/ _2) \
  ((__m256i)__builtin_lasx_xvsllwil_du_wu ((v8u32)(_1), (_2)))

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V32QI, V16HI, V16HI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvsran_b_h (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvsran_b_h ((v16i16)_1, (v16i16)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V16HI, V8SI, V8SI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvsran_h_w (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvsran_h_w ((v8i32)_1, (v8i32)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V8SI, V4DI, V4DI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvsran_w_d (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvsran_w_d ((v4i64)_1, (v4i64)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V32QI, V16HI, V16HI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvssran_b_h (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvssran_b_h ((v16i16)_1, (v16i16)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V16HI, V8SI, V8SI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvssran_h_w (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvssran_h_w ((v8i32)_1, (v8i32)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V8SI, V4DI, V4DI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvssran_w_d (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvssran_w_d ((v4i64)_1, (v4i64)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  UV32QI, UV16HI, UV16HI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvssran_bu_h (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvssran_bu_h ((v16u16)_1, (v16u16)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  UV16HI, UV8SI, UV8SI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvssran_hu_w (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvssran_hu_w ((v8u32)_1, (v8u32)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  UV8SI, UV4DI, UV4DI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvssran_wu_d (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvssran_wu_d ((v4u64)_1, (v4u64)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V32QI, V16HI, V16HI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvsrarn_b_h (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvsrarn_b_h ((v16i16)_1, (v16i16)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V16HI, V8SI, V8SI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvsrarn_h_w (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvsrarn_h_w ((v8i32)_1, (v8i32)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V8SI, V4DI, V4DI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvsrarn_w_d (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvsrarn_w_d ((v4i64)_1, (v4i64)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V32QI, V16HI, V16HI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvssrarn_b_h (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvssrarn_b_h ((v16i16)_1, (v16i16)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V16HI, V8SI, V8SI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvssrarn_h_w (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvssrarn_h_w ((v8i32)_1, (v8i32)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V8SI, V4DI, V4DI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvssrarn_w_d (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvssrarn_w_d ((v4i64)_1, (v4i64)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  UV32QI, UV16HI, UV16HI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvssrarn_bu_h (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvssrarn_bu_h ((v16u16)_1, (v16u16)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  UV16HI, UV8SI, UV8SI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvssrarn_hu_w (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvssrarn_hu_w ((v8u32)_1, (v8u32)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  UV8SI, UV4DI, UV4DI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvssrarn_wu_d (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvssrarn_wu_d ((v4u64)_1, (v4u64)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V32QI, V16HI, V16HI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvsrln_b_h (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvsrln_b_h ((v16i16)_1, (v16i16)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V16HI, V8SI, V8SI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvsrln_h_w (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvsrln_h_w ((v8i32)_1, (v8i32)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V8SI, V4DI, V4DI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvsrln_w_d (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvsrln_w_d ((v4i64)_1, (v4i64)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  UV32QI, UV16HI, UV16HI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvssrln_bu_h (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvssrln_bu_h ((v16u16)_1, (v16u16)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  UV16HI, UV8SI, UV8SI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvssrln_hu_w (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvssrln_hu_w ((v8u32)_1, (v8u32)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  UV8SI, UV4DI, UV4DI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvssrln_wu_d (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvssrln_wu_d ((v4u64)_1, (v4u64)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V32QI, V16HI, V16HI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvsrlrn_b_h (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvsrlrn_b_h ((v16i16)_1, (v16i16)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V16HI, V8SI, V8SI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvsrlrn_h_w (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvsrlrn_h_w ((v8i32)_1, (v8i32)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V8SI, V4DI, V4DI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvsrlrn_w_d (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvsrlrn_w_d ((v4i64)_1, (v4i64)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  UV32QI, UV16HI, UV16HI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvssrlrn_bu_h (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvssrlrn_bu_h ((v16u16)_1, (v16u16)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  UV16HI, UV8SI, UV8SI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvssrlrn_hu_w (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvssrlrn_hu_w ((v8u32)_1, (v8u32)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  UV8SI, UV4DI, UV4DI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvssrlrn_wu_d (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvssrlrn_wu_d ((v4u64)_1, (v4u64)_2);
}

/* Assembly instruction format:	xd, xj, ui5.  */
/* Data types in instruction templates:  V32QI, V32QI, V32QI, UQI.  */
#define __lasx_xvfrstpi_b(/*__m256i*/ _1, /*__m256i*/ _2, /*ui5*/ _3) \
  ((__m256i)__builtin_lasx_xvfrstpi_b ((v32i8)(_1), (v32i8)(_2), (_3)))

/* Assembly instruction format:	xd, xj, ui5.  */
/* Data types in instruction templates:  V16HI, V16HI, V16HI, UQI.  */
#define __lasx_xvfrstpi_h(/*__m256i*/ _1, /*__m256i*/ _2, /*ui5*/ _3) \
  ((__m256i)__builtin_lasx_xvfrstpi_h ((v16i16)(_1), (v16i16)(_2), (_3)))

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V32QI, V32QI, V32QI, V32QI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvfrstp_b (__m256i _1, __m256i _2, __m256i _3)
{
  return (__m256i)__builtin_lasx_xvfrstp_b ((v32i8)_1, (v32i8)_2, (v32i8)_3);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V16HI, V16HI, V16HI, V16HI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvfrstp_h (__m256i _1, __m256i _2, __m256i _3)
{
  return (__m256i)__builtin_lasx_xvfrstp_h ((v16i16)_1, (v16i16)_2, (v16i16)_3);
}

/* Assembly instruction format:	xd, xj, ui8.  */
/* Data types in instruction templates:  V4DI, V4DI, V4DI, USI.  */
#define __lasx_xvshuf4i_d(/*__m256i*/ _1, /*__m256i*/ _2, /*ui8*/ _3) \
  ((__m256i)__builtin_lasx_xvshuf4i_d ((v4i64)(_1), (v4i64)(_2), (_3)))

/* Assembly instruction format:	xd, xj, ui5.  */
/* Data types in instruction templates:  V32QI, V32QI, UQI.  */
#define __lasx_xvbsrl_v(/*__m256i*/ _1, /*ui5*/ _2) \
  ((__m256i)__builtin_lasx_xvbsrl_v ((v32i8)(_1), (_2)))

/* Assembly instruction format:	xd, xj, ui5.  */
/* Data types in instruction templates:  V32QI, V32QI, UQI.  */
#define __lasx_xvbsll_v(/*__m256i*/ _1, /*ui5*/ _2) \
  ((__m256i)__builtin_lasx_xvbsll_v ((v32i8)(_1), (_2)))

/* Assembly instruction format:	xd, xj, ui8.  */
/* Data types in instruction templates:  V32QI, V32QI, V32QI, USI.  */
#define __lasx_xvextrins_b(/*__m256i*/ _1, /*__m256i*/ _2, /*ui8*/ _3) \
  ((__m256i)__builtin_lasx_xvextrins_b ((v32i8)(_1), (v32i8)(_2), (_3)))

/* Assembly instruction format:	xd, xj, ui8.  */
/* Data types in instruction templates:  V16HI, V16HI, V16HI, USI.  */
#define __lasx_xvextrins_h(/*__m256i*/ _1, /*__m256i*/ _2, /*ui8*/ _3) \
  ((__m256i)__builtin_lasx_xvextrins_h ((v16i16)(_1), (v16i16)(_2), (_3)))

/* Assembly instruction format:	xd, xj, ui8.  */
/* Data types in instruction templates:  V8SI, V8SI, V8SI, USI.  */
#define __lasx_xvextrins_w(/*__m256i*/ _1, /*__m256i*/ _2, /*ui8*/ _3) \
  ((__m256i)__builtin_lasx_xvextrins_w ((v8i32)(_1), (v8i32)(_2), (_3)))

/* Assembly instruction format:	xd, xj, ui8.  */
/* Data types in instruction templates:  V4DI, V4DI, V4DI, USI.  */
#define __lasx_xvextrins_d(/*__m256i*/ _1, /*__m256i*/ _2, /*ui8*/ _3) \
  ((__m256i)__builtin_lasx_xvextrins_d ((v4i64)(_1), (v4i64)(_2), (_3)))

/* Assembly instruction format:	xd, xj.  */
/* Data types in instruction templates:  V32QI, V32QI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvmskltz_b (__m256i _1)
{
  return (__m256i)__builtin_lasx_xvmskltz_b ((v32i8)_1);
}

/* Assembly instruction format:	xd, xj.  */
/* Data types in instruction templates:  V16HI, V16HI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvmskltz_h (__m256i _1)
{
  return (__m256i)__builtin_lasx_xvmskltz_h ((v16i16)_1);
}

/* Assembly instruction format:	xd, xj.  */
/* Data types in instruction templates:  V8SI, V8SI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvmskltz_w (__m256i _1)
{
  return (__m256i)__builtin_lasx_xvmskltz_w ((v8i32)_1);
}

/* Assembly instruction format:	xd, xj.  */
/* Data types in instruction templates:  V4DI, V4DI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvmskltz_d (__m256i _1)
{
  return (__m256i)__builtin_lasx_xvmskltz_d ((v4i64)_1);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V32QI, V32QI, V32QI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvsigncov_b (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvsigncov_b ((v32i8)_1, (v32i8)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V16HI, V16HI, V16HI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvsigncov_h (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvsigncov_h ((v16i16)_1, (v16i16)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V8SI, V8SI, V8SI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvsigncov_w (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvsigncov_w ((v8i32)_1, (v8i32)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V4DI, V4DI, V4DI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvsigncov_d (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvsigncov_d ((v4i64)_1, (v4i64)_2);
}

/* Assembly instruction format:	xd, xj, xk, xa.  */
/* Data types in instruction templates:  V8SF, V8SF, V8SF, V8SF.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256 __lasx_xvfmadd_s (__m256 _1, __m256 _2, __m256 _3)
{
  return (__m256)__builtin_lasx_xvfmadd_s ((v8f32)_1, (v8f32)_2, (v8f32)_3);
}

/* Assembly instruction format:	xd, xj, xk, xa.  */
/* Data types in instruction templates:  V4DF, V4DF, V4DF, V4DF.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256d __lasx_xvfmadd_d (__m256d _1, __m256d _2, __m256d _3)
{
  return (__m256d)__builtin_lasx_xvfmadd_d ((v4f64)_1, (v4f64)_2, (v4f64)_3);
}

/* Assembly instruction format:	xd, xj, xk, xa.  */
/* Data types in instruction templates:  V8SF, V8SF, V8SF, V8SF.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256 __lasx_xvfmsub_s (__m256 _1, __m256 _2, __m256 _3)
{
  return (__m256)__builtin_lasx_xvfmsub_s ((v8f32)_1, (v8f32)_2, (v8f32)_3);
}

/* Assembly instruction format:	xd, xj, xk, xa.  */
/* Data types in instruction templates:  V4DF, V4DF, V4DF, V4DF.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256d __lasx_xvfmsub_d (__m256d _1, __m256d _2, __m256d _3)
{
  return (__m256d)__builtin_lasx_xvfmsub_d ((v4f64)_1, (v4f64)_2, (v4f64)_3);
}

/* Assembly instruction format:	xd, xj, xk, xa.  */
/* Data types in instruction templates:  V8SF, V8SF, V8SF, V8SF.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256 __lasx_xvfnmadd_s (__m256 _1, __m256 _2, __m256 _3)
{
  return (__m256)__builtin_lasx_xvfnmadd_s ((v8f32)_1, (v8f32)_2, (v8f32)_3);
}

/* Assembly instruction format:	xd, xj, xk, xa.  */
/* Data types in instruction templates:  V4DF, V4DF, V4DF, V4DF.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256d __lasx_xvfnmadd_d (__m256d _1, __m256d _2, __m256d _3)
{
  return (__m256d)__builtin_lasx_xvfnmadd_d ((v4f64)_1, (v4f64)_2, (v4f64)_3);
}

/* Assembly instruction format:	xd, xj, xk, xa.  */
/* Data types in instruction templates:  V8SF, V8SF, V8SF, V8SF.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256 __lasx_xvfnmsub_s (__m256 _1, __m256 _2, __m256 _3)
{
  return (__m256)__builtin_lasx_xvfnmsub_s ((v8f32)_1, (v8f32)_2, (v8f32)_3);
}

/* Assembly instruction format:	xd, xj, xk, xa.  */
/* Data types in instruction templates:  V4DF, V4DF, V4DF, V4DF.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256d __lasx_xvfnmsub_d (__m256d _1, __m256d _2, __m256d _3)
{
  return (__m256d)__builtin_lasx_xvfnmsub_d ((v4f64)_1, (v4f64)_2, (v4f64)_3);
}

/* Assembly instruction format:	xd, xj.  */
/* Data types in instruction templates:  V8SI, V8SF.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvftintrne_w_s (__m256 _1)
{
  return (__m256i)__builtin_lasx_xvftintrne_w_s ((v8f32)_1);
}

/* Assembly instruction format:	xd, xj.  */
/* Data types in instruction templates:  V4DI, V4DF.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvftintrne_l_d (__m256d _1)
{
  return (__m256i)__builtin_lasx_xvftintrne_l_d ((v4f64)_1);
}

/* Assembly instruction format:	xd, xj.  */
/* Data types in instruction templates:  V8SI, V8SF.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvftintrp_w_s (__m256 _1)
{
  return (__m256i)__builtin_lasx_xvftintrp_w_s ((v8f32)_1);
}

/* Assembly instruction format:	xd, xj.  */
/* Data types in instruction templates:  V4DI, V4DF.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvftintrp_l_d (__m256d _1)
{
  return (__m256i)__builtin_lasx_xvftintrp_l_d ((v4f64)_1);
}

/* Assembly instruction format:	xd, xj.  */
/* Data types in instruction templates:  V8SI, V8SF.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvftintrm_w_s (__m256 _1)
{
  return (__m256i)__builtin_lasx_xvftintrm_w_s ((v8f32)_1);
}

/* Assembly instruction format:	xd, xj.  */
/* Data types in instruction templates:  V4DI, V4DF.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvftintrm_l_d (__m256d _1)
{
  return (__m256i)__builtin_lasx_xvftintrm_l_d ((v4f64)_1);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V8SI, V4DF, V4DF.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvftint_w_d (__m256d _1, __m256d _2)
{
  return (__m256i)__builtin_lasx_xvftint_w_d ((v4f64)_1, (v4f64)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V8SF, V4DI, V4DI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256 __lasx_xvffint_s_l (__m256i _1, __m256i _2)
{
  return (__m256)__builtin_lasx_xvffint_s_l ((v4i64)_1, (v4i64)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V8SI, V4DF, V4DF.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvftintrz_w_d (__m256d _1, __m256d _2)
{
  return (__m256i)__builtin_lasx_xvftintrz_w_d ((v4f64)_1, (v4f64)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V8SI, V4DF, V4DF.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvftintrp_w_d (__m256d _1, __m256d _2)
{
  return (__m256i)__builtin_lasx_xvftintrp_w_d ((v4f64)_1, (v4f64)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V8SI, V4DF, V4DF.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvftintrm_w_d (__m256d _1, __m256d _2)
{
  return (__m256i)__builtin_lasx_xvftintrm_w_d ((v4f64)_1, (v4f64)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V8SI, V4DF, V4DF.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvftintrne_w_d (__m256d _1, __m256d _2)
{
  return (__m256i)__builtin_lasx_xvftintrne_w_d ((v4f64)_1, (v4f64)_2);
}

/* Assembly instruction format:	xd, xj.  */
/* Data types in instruction templates:  V4DI, V8SF.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvftinth_l_s (__m256 _1)
{
  return (__m256i)__builtin_lasx_xvftinth_l_s ((v8f32)_1);
}

/* Assembly instruction format:	xd, xj.  */
/* Data types in instruction templates:  V4DI, V8SF.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvftintl_l_s (__m256 _1)
{
  return (__m256i)__builtin_lasx_xvftintl_l_s ((v8f32)_1);
}

/* Assembly instruction format:	xd, xj.  */
/* Data types in instruction templates:  V4DF, V8SI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256d __lasx_xvffinth_d_w (__m256i _1)
{
  return (__m256d)__builtin_lasx_xvffinth_d_w ((v8i32)_1);
}

/* Assembly instruction format:	xd, xj.  */
/* Data types in instruction templates:  V4DF, V8SI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256d __lasx_xvffintl_d_w (__m256i _1)
{
  return (__m256d)__builtin_lasx_xvffintl_d_w ((v8i32)_1);
}

/* Assembly instruction format:	xd, xj.  */
/* Data types in instruction templates:  V4DI, V8SF.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvftintrzh_l_s (__m256 _1)
{
  return (__m256i)__builtin_lasx_xvftintrzh_l_s ((v8f32)_1);
}

/* Assembly instruction format:	xd, xj.  */
/* Data types in instruction templates:  V4DI, V8SF.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvftintrzl_l_s (__m256 _1)
{
  return (__m256i)__builtin_lasx_xvftintrzl_l_s ((v8f32)_1);
}

/* Assembly instruction format:	xd, xj.  */
/* Data types in instruction templates:  V4DI, V8SF.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvftintrph_l_s (__m256 _1)
{
  return (__m256i)__builtin_lasx_xvftintrph_l_s ((v8f32)_1);
}

/* Assembly instruction format:	xd, xj.  */
/* Data types in instruction templates:  V4DI, V8SF.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvftintrpl_l_s (__m256 _1)
{
  return (__m256i)__builtin_lasx_xvftintrpl_l_s ((v8f32)_1);
}

/* Assembly instruction format:	xd, xj.  */
/* Data types in instruction templates:  V4DI, V8SF.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvftintrmh_l_s (__m256 _1)
{
  return (__m256i)__builtin_lasx_xvftintrmh_l_s ((v8f32)_1);
}

/* Assembly instruction format:	xd, xj.  */
/* Data types in instruction templates:  V4DI, V8SF.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvftintrml_l_s (__m256 _1)
{
  return (__m256i)__builtin_lasx_xvftintrml_l_s ((v8f32)_1);
}

/* Assembly instruction format:	xd, xj.  */
/* Data types in instruction templates:  V4DI, V8SF.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvftintrneh_l_s (__m256 _1)
{
  return (__m256i)__builtin_lasx_xvftintrneh_l_s ((v8f32)_1);
}

/* Assembly instruction format:	xd, xj.  */
/* Data types in instruction templates:  V4DI, V8SF.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvftintrnel_l_s (__m256 _1)
{
  return (__m256i)__builtin_lasx_xvftintrnel_l_s ((v8f32)_1);
}

/* Assembly instruction format:	xd, xj.  */
/* Data types in instruction templates:  V8SF, V8SF.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256 __lasx_xvfrintrne_s (__m256 _1)
{
  return (__m256)__builtin_lasx_xvfrintrne_s ((v8f32)_1);
}

/* Assembly instruction format:	xd, xj.  */
/* Data types in instruction templates:  V4DF, V4DF.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256d __lasx_xvfrintrne_d (__m256d _1)
{
  return (__m256d)__builtin_lasx_xvfrintrne_d ((v4f64)_1);
}

/* Assembly instruction format:	xd, xj.  */
/* Data types in instruction templates:  V8SF, V8SF.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256 __lasx_xvfrintrz_s (__m256 _1)
{
  return (__m256)__builtin_lasx_xvfrintrz_s ((v8f32)_1);
}

/* Assembly instruction format:	xd, xj.  */
/* Data types in instruction templates:  V4DF, V4DF.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256d __lasx_xvfrintrz_d (__m256d _1)
{
  return (__m256d)__builtin_lasx_xvfrintrz_d ((v4f64)_1);
}

/* Assembly instruction format:	xd, xj.  */
/* Data types in instruction templates:  V8SF, V8SF.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256 __lasx_xvfrintrp_s (__m256 _1)
{
  return (__m256)__builtin_lasx_xvfrintrp_s ((v8f32)_1);
}

/* Assembly instruction format:	xd, xj.  */
/* Data types in instruction templates:  V4DF, V4DF.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256d __lasx_xvfrintrp_d (__m256d _1)
{
  return (__m256d)__builtin_lasx_xvfrintrp_d ((v4f64)_1);
}

/* Assembly instruction format:	xd, xj.  */
/* Data types in instruction templates:  V8SF, V8SF.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256 __lasx_xvfrintrm_s (__m256 _1)
{
  return (__m256)__builtin_lasx_xvfrintrm_s ((v8f32)_1);
}

/* Assembly instruction format:	xd, xj.  */
/* Data types in instruction templates:  V4DF, V4DF.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256d __lasx_xvfrintrm_d (__m256d _1)
{
  return (__m256d)__builtin_lasx_xvfrintrm_d ((v4f64)_1);
}

/* Assembly instruction format:	xd, rj, si12.  */
/* Data types in instruction templates:  V32QI, CVPOINTER, SI.  */
#define __lasx_xvld(/*void **/ _1, /*si12*/ _2) \
  ((__m256i)__builtin_lasx_xvld ((void *)(_1), (_2)))

/* Assembly instruction format:	xd, rj, si12.  */
/* Data types in instruction templates:  VOID, V32QI, CVPOINTER, SI.  */
#define __lasx_xvst(/*__m256i*/ _1, /*void **/ _2, /*si12*/ _3) \
  ((void)__builtin_lasx_xvst ((v32i8)(_1), (void *)(_2), (_3)))

/* Assembly instruction format:	xd, rj, si8, idx.  */
/* Data types in instruction templates:  VOID, V32QI, CVPOINTER, SI, UQI.  */
#define __lasx_xvstelm_b(/*__m256i*/ _1, /*void **/ _2, /*si8*/ _3, /*idx*/ _4) \
  ((void)__builtin_lasx_xvstelm_b ((v32i8)(_1), (void *)(_2), (_3), (_4)))

/* Assembly instruction format:	xd, rj, si8, idx.  */
/* Data types in instruction templates:  VOID, V16HI, CVPOINTER, SI, UQI.  */
#define __lasx_xvstelm_h(/*__m256i*/ _1, /*void **/ _2, /*si8*/ _3, /*idx*/ _4) \
  ((void)__builtin_lasx_xvstelm_h ((v16i16)(_1), (void *)(_2), (_3), (_4)))

/* Assembly instruction format:	xd, rj, si8, idx.  */
/* Data types in instruction templates:  VOID, V8SI, CVPOINTER, SI, UQI.  */
#define __lasx_xvstelm_w(/*__m256i*/ _1, /*void **/ _2, /*si8*/ _3, /*idx*/ _4) \
  ((void)__builtin_lasx_xvstelm_w ((v8i32)(_1), (void *)(_2), (_3), (_4)))

/* Assembly instruction format:	xd, rj, si8, idx.  */
/* Data types in instruction templates:  VOID, V4DI, CVPOINTER, SI, UQI.  */
#define __lasx_xvstelm_d(/*__m256i*/ _1, /*void **/ _2, /*si8*/ _3, /*idx*/ _4) \
  ((void)__builtin_lasx_xvstelm_d ((v4i64)(_1), (void *)(_2), (_3), (_4)))

/* Assembly instruction format:	xd, xj, ui3.  */
/* Data types in instruction templates:  V8SI, V8SI, V8SI, UQI.  */
#define __lasx_xvinsve0_w(/*__m256i*/ _1, /*__m256i*/ _2, /*ui3*/ _3) \
  ((__m256i)__builtin_lasx_xvinsve0_w ((v8i32)(_1), (v8i32)(_2), (_3)))

/* Assembly instruction format:	xd, xj, ui2.  */
/* Data types in instruction templates:  V4DI, V4DI, V4DI, UQI.  */
#define __lasx_xvinsve0_d(/*__m256i*/ _1, /*__m256i*/ _2, /*ui2*/ _3) \
  ((__m256i)__builtin_lasx_xvinsve0_d ((v4i64)(_1), (v4i64)(_2), (_3)))

/* Assembly instruction format:	xd, xj, ui3.  */
/* Data types in instruction templates:  V8SI, V8SI, UQI.  */
#define __lasx_xvpickve_w(/*__m256i*/ _1, /*ui3*/ _2) \
  ((__m256i)__builtin_lasx_xvpickve_w ((v8i32)(_1), (_2)))

/* Assembly instruction format:	xd, xj, ui2.  */
/* Data types in instruction templates:  V4DI, V4DI, UQI.  */
#define __lasx_xvpickve_d(/*__m256i*/ _1, /*ui2*/ _2) \
  ((__m256i)__builtin_lasx_xvpickve_d ((v4i64)(_1), (_2)))

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V32QI, V16HI, V16HI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvssrlrn_b_h (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvssrlrn_b_h ((v16i16)_1, (v16i16)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V16HI, V8SI, V8SI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvssrlrn_h_w (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvssrlrn_h_w ((v8i32)_1, (v8i32)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V8SI, V4DI, V4DI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvssrlrn_w_d (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvssrlrn_w_d ((v4i64)_1, (v4i64)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V32QI, V16HI, V16HI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvssrln_b_h (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvssrln_b_h ((v16i16)_1, (v16i16)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V16HI, V8SI, V8SI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvssrln_h_w (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvssrln_h_w ((v8i32)_1, (v8i32)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V8SI, V4DI, V4DI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvssrln_w_d (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvssrln_w_d ((v4i64)_1, (v4i64)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V32QI, V32QI, V32QI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvorn_v (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvorn_v ((v32i8)_1, (v32i8)_2);
}

/* Assembly instruction format:	xd, i13.  */
/* Data types in instruction templates:  V4DI, HI.  */
#define __lasx_xvldi(/*i13*/ _1) \
  ((__m256i)__builtin_lasx_xvldi ((_1)))

/* Assembly instruction format:	xd, rj, rk.  */
/* Data types in instruction templates:  V32QI, CVPOINTER, DI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvldx (void * _1, long int _2)
{
  return (__m256i)__builtin_lasx_xvldx ((void *)_1, (long int)_2);
}

/* Assembly instruction format:	xd, rj, rk.  */
/* Data types in instruction templates:  VOID, V32QI, CVPOINTER, DI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
void __lasx_xvstx (__m256i _1, void * _2, long int _3)
{
  return (void)__builtin_lasx_xvstx ((v32i8)_1, (void *)_2, (long int)_3);
}

/* Assembly instruction format:	xd, xj.  */
/* Data types in instruction templates:  UV4DI, UV4DI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvextl_qu_du (__m256i _1)
{
  return (__m256i)__builtin_lasx_xvextl_qu_du ((v4u64)_1);
}

/* Assembly instruction format:	xd, rj, ui3.  */
/* Data types in instruction templates:  V8SI, V8SI, SI, UQI.  */
#define __lasx_xvinsgr2vr_w(/*__m256i*/ _1, /*int*/ _2, /*ui3*/ _3) \
  ((__m256i)__builtin_lasx_xvinsgr2vr_w ((v8i32)(_1), (int)(_2), (_3)))

/* Assembly instruction format:	xd, rj, ui2.  */
/* Data types in instruction templates:  V4DI, V4DI, DI, UQI.  */
#define __lasx_xvinsgr2vr_d(/*__m256i*/ _1, /*long int*/ _2, /*ui2*/ _3) \
  ((__m256i)__builtin_lasx_xvinsgr2vr_d ((v4i64)(_1), (long int)(_2), (_3)))

/* Assembly instruction format:	xd, xj.  */
/* Data types in instruction templates:  V32QI, V32QI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvreplve0_b (__m256i _1)
{
  return (__m256i)__builtin_lasx_xvreplve0_b ((v32i8)_1);
}

/* Assembly instruction format:	xd, xj.  */
/* Data types in instruction templates:  V16HI, V16HI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvreplve0_h (__m256i _1)
{
  return (__m256i)__builtin_lasx_xvreplve0_h ((v16i16)_1);
}

/* Assembly instruction format:	xd, xj.  */
/* Data types in instruction templates:  V8SI, V8SI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvreplve0_w (__m256i _1)
{
  return (__m256i)__builtin_lasx_xvreplve0_w ((v8i32)_1);
}

/* Assembly instruction format:	xd, xj.  */
/* Data types in instruction templates:  V4DI, V4DI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvreplve0_d (__m256i _1)
{
  return (__m256i)__builtin_lasx_xvreplve0_d ((v4i64)_1);
}

/* Assembly instruction format:	xd, xj.  */
/* Data types in instruction templates:  V32QI, V32QI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvreplve0_q (__m256i _1)
{
  return (__m256i)__builtin_lasx_xvreplve0_q ((v32i8)_1);
}

/* Assembly instruction format:	xd, xj.  */
/* Data types in instruction templates:  V16HI, V32QI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_vext2xv_h_b (__m256i _1)
{
  return (__m256i)__builtin_lasx_vext2xv_h_b ((v32i8)_1);
}

/* Assembly instruction format:	xd, xj.  */
/* Data types in instruction templates:  V8SI, V16HI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_vext2xv_w_h (__m256i _1)
{
  return (__m256i)__builtin_lasx_vext2xv_w_h ((v16i16)_1);
}

/* Assembly instruction format:	xd, xj.  */
/* Data types in instruction templates:  V4DI, V8SI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_vext2xv_d_w (__m256i _1)
{
  return (__m256i)__builtin_lasx_vext2xv_d_w ((v8i32)_1);
}

/* Assembly instruction format:	xd, xj.  */
/* Data types in instruction templates:  V8SI, V32QI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_vext2xv_w_b (__m256i _1)
{
  return (__m256i)__builtin_lasx_vext2xv_w_b ((v32i8)_1);
}

/* Assembly instruction format:	xd, xj.  */
/* Data types in instruction templates:  V4DI, V16HI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_vext2xv_d_h (__m256i _1)
{
  return (__m256i)__builtin_lasx_vext2xv_d_h ((v16i16)_1);
}

/* Assembly instruction format:	xd, xj.  */
/* Data types in instruction templates:  V4DI, V32QI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_vext2xv_d_b (__m256i _1)
{
  return (__m256i)__builtin_lasx_vext2xv_d_b ((v32i8)_1);
}

/* Assembly instruction format:	xd, xj.  */
/* Data types in instruction templates:  V16HI, V32QI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_vext2xv_hu_bu (__m256i _1)
{
  return (__m256i)__builtin_lasx_vext2xv_hu_bu ((v32i8)_1);
}

/* Assembly instruction format:	xd, xj.  */
/* Data types in instruction templates:  V8SI, V16HI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_vext2xv_wu_hu (__m256i _1)
{
  return (__m256i)__builtin_lasx_vext2xv_wu_hu ((v16i16)_1);
}

/* Assembly instruction format:	xd, xj.  */
/* Data types in instruction templates:  V4DI, V8SI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_vext2xv_du_wu (__m256i _1)
{
  return (__m256i)__builtin_lasx_vext2xv_du_wu ((v8i32)_1);
}

/* Assembly instruction format:	xd, xj.  */
/* Data types in instruction templates:  V8SI, V32QI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_vext2xv_wu_bu (__m256i _1)
{
  return (__m256i)__builtin_lasx_vext2xv_wu_bu ((v32i8)_1);
}

/* Assembly instruction format:	xd, xj.  */
/* Data types in instruction templates:  V4DI, V16HI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_vext2xv_du_hu (__m256i _1)
{
  return (__m256i)__builtin_lasx_vext2xv_du_hu ((v16i16)_1);
}

/* Assembly instruction format:	xd, xj.  */
/* Data types in instruction templates:  V4DI, V32QI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_vext2xv_du_bu (__m256i _1)
{
  return (__m256i)__builtin_lasx_vext2xv_du_bu ((v32i8)_1);
}

/* Assembly instruction format:	xd, xj, ui8.  */
/* Data types in instruction templates:  V32QI, V32QI, V32QI, USI.  */
#define __lasx_xvpermi_q(/*__m256i*/ _1, /*__m256i*/ _2, /*ui8*/ _3) \
  ((__m256i)__builtin_lasx_xvpermi_q ((v32i8)(_1), (v32i8)(_2), (_3)))

/* Assembly instruction format:	xd, xj, ui8.  */
/* Data types in instruction templates:  V4DI, V4DI, USI.  */
#define __lasx_xvpermi_d(/*__m256i*/ _1, /*ui8*/ _2) \
  ((__m256i)__builtin_lasx_xvpermi_d ((v4i64)(_1), (_2)))

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V8SI, V8SI, V8SI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvperm_w (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvperm_w ((v8i32)_1, (v8i32)_2);
}

/* Assembly instruction format:	xd, rj, si12.  */
/* Data types in instruction templates:  V32QI, CVPOINTER, SI.  */
#define __lasx_xvldrepl_b(/*void **/ _1, /*si12*/ _2) \
  ((__m256i)__builtin_lasx_xvldrepl_b ((void *)(_1), (_2)))

/* Assembly instruction format:	xd, rj, si11.  */
/* Data types in instruction templates:  V16HI, CVPOINTER, SI.  */
#define __lasx_xvldrepl_h(/*void **/ _1, /*si11*/ _2) \
  ((__m256i)__builtin_lasx_xvldrepl_h ((void *)(_1), (_2)))

/* Assembly instruction format:	xd, rj, si10.  */
/* Data types in instruction templates:  V8SI, CVPOINTER, SI.  */
#define __lasx_xvldrepl_w(/*void **/ _1, /*si10*/ _2) \
  ((__m256i)__builtin_lasx_xvldrepl_w ((void *)(_1), (_2)))

/* Assembly instruction format:	xd, rj, si9.  */
/* Data types in instruction templates:  V4DI, CVPOINTER, SI.  */
#define __lasx_xvldrepl_d(/*void **/ _1, /*si9*/ _2) \
  ((__m256i)__builtin_lasx_xvldrepl_d ((void *)(_1), (_2)))

/* Assembly instruction format:	rd, xj, ui3.  */
/* Data types in instruction templates:  SI, V8SI, UQI.  */
#define __lasx_xvpickve2gr_w(/*__m256i*/ _1, /*ui3*/ _2) \
  ((int)__builtin_lasx_xvpickve2gr_w ((v8i32)(_1), (_2)))

/* Assembly instruction format:	rd, xj, ui3.  */
/* Data types in instruction templates:  USI, V8SI, UQI.  */
#define __lasx_xvpickve2gr_wu(/*__m256i*/ _1, /*ui3*/ _2) \
  ((unsigned int)__builtin_lasx_xvpickve2gr_wu ((v8i32)(_1), (_2)))

/* Assembly instruction format:	rd, xj, ui2.  */
/* Data types in instruction templates:  DI, V4DI, UQI.  */
#define __lasx_xvpickve2gr_d(/*__m256i*/ _1, /*ui2*/ _2) \
  ((long int)__builtin_lasx_xvpickve2gr_d ((v4i64)(_1), (_2)))

/* Assembly instruction format:	rd, xj, ui2.  */
/* Data types in instruction templates:  UDI, V4DI, UQI.  */
#define __lasx_xvpickve2gr_du(/*__m256i*/ _1, /*ui2*/ _2) \
  ((unsigned long int)__builtin_lasx_xvpickve2gr_du ((v4i64)(_1), (_2)))

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V4DI, V4DI, V4DI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvaddwev_q_d (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvaddwev_q_d ((v4i64)_1, (v4i64)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V4DI, V8SI, V8SI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvaddwev_d_w (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvaddwev_d_w ((v8i32)_1, (v8i32)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V8SI, V16HI, V16HI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvaddwev_w_h (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvaddwev_w_h ((v16i16)_1, (v16i16)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V16HI, V32QI, V32QI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvaddwev_h_b (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvaddwev_h_b ((v32i8)_1, (v32i8)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V4DI, UV4DI, UV4DI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvaddwev_q_du (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvaddwev_q_du ((v4u64)_1, (v4u64)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V4DI, UV8SI, UV8SI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvaddwev_d_wu (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvaddwev_d_wu ((v8u32)_1, (v8u32)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V8SI, UV16HI, UV16HI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvaddwev_w_hu (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvaddwev_w_hu ((v16u16)_1, (v16u16)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V16HI, UV32QI, UV32QI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvaddwev_h_bu (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvaddwev_h_bu ((v32u8)_1, (v32u8)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V4DI, V4DI, V4DI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvsubwev_q_d (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvsubwev_q_d ((v4i64)_1, (v4i64)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V4DI, V8SI, V8SI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvsubwev_d_w (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvsubwev_d_w ((v8i32)_1, (v8i32)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V8SI, V16HI, V16HI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvsubwev_w_h (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvsubwev_w_h ((v16i16)_1, (v16i16)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V16HI, V32QI, V32QI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvsubwev_h_b (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvsubwev_h_b ((v32i8)_1, (v32i8)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V4DI, UV4DI, UV4DI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvsubwev_q_du (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvsubwev_q_du ((v4u64)_1, (v4u64)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V4DI, UV8SI, UV8SI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvsubwev_d_wu (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvsubwev_d_wu ((v8u32)_1, (v8u32)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V8SI, UV16HI, UV16HI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvsubwev_w_hu (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvsubwev_w_hu ((v16u16)_1, (v16u16)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V16HI, UV32QI, UV32QI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvsubwev_h_bu (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvsubwev_h_bu ((v32u8)_1, (v32u8)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V4DI, V4DI, V4DI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvmulwev_q_d (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvmulwev_q_d ((v4i64)_1, (v4i64)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V4DI, V8SI, V8SI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvmulwev_d_w (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvmulwev_d_w ((v8i32)_1, (v8i32)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V8SI, V16HI, V16HI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvmulwev_w_h (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvmulwev_w_h ((v16i16)_1, (v16i16)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V16HI, V32QI, V32QI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvmulwev_h_b (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvmulwev_h_b ((v32i8)_1, (v32i8)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V4DI, UV4DI, UV4DI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvmulwev_q_du (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvmulwev_q_du ((v4u64)_1, (v4u64)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V4DI, UV8SI, UV8SI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvmulwev_d_wu (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvmulwev_d_wu ((v8u32)_1, (v8u32)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V8SI, UV16HI, UV16HI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvmulwev_w_hu (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvmulwev_w_hu ((v16u16)_1, (v16u16)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V16HI, UV32QI, UV32QI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvmulwev_h_bu (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvmulwev_h_bu ((v32u8)_1, (v32u8)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V4DI, V4DI, V4DI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvaddwod_q_d (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvaddwod_q_d ((v4i64)_1, (v4i64)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V4DI, V8SI, V8SI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvaddwod_d_w (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvaddwod_d_w ((v8i32)_1, (v8i32)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V8SI, V16HI, V16HI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvaddwod_w_h (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvaddwod_w_h ((v16i16)_1, (v16i16)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V16HI, V32QI, V32QI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvaddwod_h_b (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvaddwod_h_b ((v32i8)_1, (v32i8)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V4DI, UV4DI, UV4DI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvaddwod_q_du (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvaddwod_q_du ((v4u64)_1, (v4u64)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V4DI, UV8SI, UV8SI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvaddwod_d_wu (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvaddwod_d_wu ((v8u32)_1, (v8u32)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V8SI, UV16HI, UV16HI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvaddwod_w_hu (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvaddwod_w_hu ((v16u16)_1, (v16u16)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V16HI, UV32QI, UV32QI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvaddwod_h_bu (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvaddwod_h_bu ((v32u8)_1, (v32u8)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V4DI, V4DI, V4DI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvsubwod_q_d (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvsubwod_q_d ((v4i64)_1, (v4i64)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V4DI, V8SI, V8SI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvsubwod_d_w (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvsubwod_d_w ((v8i32)_1, (v8i32)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V8SI, V16HI, V16HI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvsubwod_w_h (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvsubwod_w_h ((v16i16)_1, (v16i16)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V16HI, V32QI, V32QI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvsubwod_h_b (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvsubwod_h_b ((v32i8)_1, (v32i8)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V4DI, UV4DI, UV4DI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvsubwod_q_du (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvsubwod_q_du ((v4u64)_1, (v4u64)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V4DI, UV8SI, UV8SI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvsubwod_d_wu (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvsubwod_d_wu ((v8u32)_1, (v8u32)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V8SI, UV16HI, UV16HI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvsubwod_w_hu (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvsubwod_w_hu ((v16u16)_1, (v16u16)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V16HI, UV32QI, UV32QI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvsubwod_h_bu (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvsubwod_h_bu ((v32u8)_1, (v32u8)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V4DI, V4DI, V4DI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvmulwod_q_d (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvmulwod_q_d ((v4i64)_1, (v4i64)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V4DI, V8SI, V8SI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvmulwod_d_w (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvmulwod_d_w ((v8i32)_1, (v8i32)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V8SI, V16HI, V16HI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvmulwod_w_h (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvmulwod_w_h ((v16i16)_1, (v16i16)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V16HI, V32QI, V32QI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvmulwod_h_b (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvmulwod_h_b ((v32i8)_1, (v32i8)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V4DI, UV4DI, UV4DI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvmulwod_q_du (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvmulwod_q_du ((v4u64)_1, (v4u64)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V4DI, UV8SI, UV8SI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvmulwod_d_wu (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvmulwod_d_wu ((v8u32)_1, (v8u32)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V8SI, UV16HI, UV16HI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvmulwod_w_hu (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvmulwod_w_hu ((v16u16)_1, (v16u16)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V16HI, UV32QI, UV32QI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvmulwod_h_bu (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvmulwod_h_bu ((v32u8)_1, (v32u8)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V4DI, UV8SI, V8SI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvaddwev_d_wu_w (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvaddwev_d_wu_w ((v8u32)_1, (v8i32)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V8SI, UV16HI, V16HI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvaddwev_w_hu_h (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvaddwev_w_hu_h ((v16u16)_1, (v16i16)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V16HI, UV32QI, V32QI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvaddwev_h_bu_b (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvaddwev_h_bu_b ((v32u8)_1, (v32i8)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V4DI, UV8SI, V8SI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvmulwev_d_wu_w (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvmulwev_d_wu_w ((v8u32)_1, (v8i32)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V8SI, UV16HI, V16HI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvmulwev_w_hu_h (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvmulwev_w_hu_h ((v16u16)_1, (v16i16)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V16HI, UV32QI, V32QI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvmulwev_h_bu_b (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvmulwev_h_bu_b ((v32u8)_1, (v32i8)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V4DI, UV8SI, V8SI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvaddwod_d_wu_w (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvaddwod_d_wu_w ((v8u32)_1, (v8i32)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V8SI, UV16HI, V16HI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvaddwod_w_hu_h (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvaddwod_w_hu_h ((v16u16)_1, (v16i16)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V16HI, UV32QI, V32QI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvaddwod_h_bu_b (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvaddwod_h_bu_b ((v32u8)_1, (v32i8)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V4DI, UV8SI, V8SI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvmulwod_d_wu_w (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvmulwod_d_wu_w ((v8u32)_1, (v8i32)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V8SI, UV16HI, V16HI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvmulwod_w_hu_h (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvmulwod_w_hu_h ((v16u16)_1, (v16i16)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V16HI, UV32QI, V32QI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvmulwod_h_bu_b (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvmulwod_h_bu_b ((v32u8)_1, (v32i8)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V4DI, V4DI, V4DI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvhaddw_q_d (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvhaddw_q_d ((v4i64)_1, (v4i64)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  UV4DI, UV4DI, UV4DI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvhaddw_qu_du (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvhaddw_qu_du ((v4u64)_1, (v4u64)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V4DI, V4DI, V4DI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvhsubw_q_d (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvhsubw_q_d ((v4i64)_1, (v4i64)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  UV4DI, UV4DI, UV4DI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvhsubw_qu_du (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvhsubw_qu_du ((v4u64)_1, (v4u64)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V4DI, V4DI, V4DI, V4DI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvmaddwev_q_d (__m256i _1, __m256i _2, __m256i _3)
{
  return (__m256i)__builtin_lasx_xvmaddwev_q_d ((v4i64)_1, (v4i64)_2, (v4i64)_3);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V4DI, V4DI, V8SI, V8SI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvmaddwev_d_w (__m256i _1, __m256i _2, __m256i _3)
{
  return (__m256i)__builtin_lasx_xvmaddwev_d_w ((v4i64)_1, (v8i32)_2, (v8i32)_3);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V8SI, V8SI, V16HI, V16HI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvmaddwev_w_h (__m256i _1, __m256i _2, __m256i _3)
{
  return (__m256i)__builtin_lasx_xvmaddwev_w_h ((v8i32)_1, (v16i16)_2, (v16i16)_3);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V16HI, V16HI, V32QI, V32QI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvmaddwev_h_b (__m256i _1, __m256i _2, __m256i _3)
{
  return (__m256i)__builtin_lasx_xvmaddwev_h_b ((v16i16)_1, (v32i8)_2, (v32i8)_3);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  UV4DI, UV4DI, UV4DI, UV4DI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvmaddwev_q_du (__m256i _1, __m256i _2, __m256i _3)
{
  return (__m256i)__builtin_lasx_xvmaddwev_q_du ((v4u64)_1, (v4u64)_2, (v4u64)_3);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  UV4DI, UV4DI, UV8SI, UV8SI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvmaddwev_d_wu (__m256i _1, __m256i _2, __m256i _3)
{
  return (__m256i)__builtin_lasx_xvmaddwev_d_wu ((v4u64)_1, (v8u32)_2, (v8u32)_3);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  UV8SI, UV8SI, UV16HI, UV16HI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvmaddwev_w_hu (__m256i _1, __m256i _2, __m256i _3)
{
  return (__m256i)__builtin_lasx_xvmaddwev_w_hu ((v8u32)_1, (v16u16)_2, (v16u16)_3);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  UV16HI, UV16HI, UV32QI, UV32QI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvmaddwev_h_bu (__m256i _1, __m256i _2, __m256i _3)
{
  return (__m256i)__builtin_lasx_xvmaddwev_h_bu ((v16u16)_1, (v32u8)_2, (v32u8)_3);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V4DI, V4DI, V4DI, V4DI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvmaddwod_q_d (__m256i _1, __m256i _2, __m256i _3)
{
  return (__m256i)__builtin_lasx_xvmaddwod_q_d ((v4i64)_1, (v4i64)_2, (v4i64)_3);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V4DI, V4DI, V8SI, V8SI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvmaddwod_d_w (__m256i _1, __m256i _2, __m256i _3)
{
  return (__m256i)__builtin_lasx_xvmaddwod_d_w ((v4i64)_1, (v8i32)_2, (v8i32)_3);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V8SI, V8SI, V16HI, V16HI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvmaddwod_w_h (__m256i _1, __m256i _2, __m256i _3)
{
  return (__m256i)__builtin_lasx_xvmaddwod_w_h ((v8i32)_1, (v16i16)_2, (v16i16)_3);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V16HI, V16HI, V32QI, V32QI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvmaddwod_h_b (__m256i _1, __m256i _2, __m256i _3)
{
  return (__m256i)__builtin_lasx_xvmaddwod_h_b ((v16i16)_1, (v32i8)_2, (v32i8)_3);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  UV4DI, UV4DI, UV4DI, UV4DI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvmaddwod_q_du (__m256i _1, __m256i _2, __m256i _3)
{
  return (__m256i)__builtin_lasx_xvmaddwod_q_du ((v4u64)_1, (v4u64)_2, (v4u64)_3);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  UV4DI, UV4DI, UV8SI, UV8SI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvmaddwod_d_wu (__m256i _1, __m256i _2, __m256i _3)
{
  return (__m256i)__builtin_lasx_xvmaddwod_d_wu ((v4u64)_1, (v8u32)_2, (v8u32)_3);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  UV8SI, UV8SI, UV16HI, UV16HI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvmaddwod_w_hu (__m256i _1, __m256i _2, __m256i _3)
{
  return (__m256i)__builtin_lasx_xvmaddwod_w_hu ((v8u32)_1, (v16u16)_2, (v16u16)_3);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  UV16HI, UV16HI, UV32QI, UV32QI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvmaddwod_h_bu (__m256i _1, __m256i _2, __m256i _3)
{
  return (__m256i)__builtin_lasx_xvmaddwod_h_bu ((v16u16)_1, (v32u8)_2, (v32u8)_3);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V4DI, V4DI, UV4DI, V4DI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvmaddwev_q_du_d (__m256i _1, __m256i _2, __m256i _3)
{
  return (__m256i)__builtin_lasx_xvmaddwev_q_du_d ((v4i64)_1, (v4u64)_2, (v4i64)_3);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V4DI, V4DI, UV8SI, V8SI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvmaddwev_d_wu_w (__m256i _1, __m256i _2, __m256i _3)
{
  return (__m256i)__builtin_lasx_xvmaddwev_d_wu_w ((v4i64)_1, (v8u32)_2, (v8i32)_3);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V8SI, V8SI, UV16HI, V16HI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvmaddwev_w_hu_h (__m256i _1, __m256i _2, __m256i _3)
{
  return (__m256i)__builtin_lasx_xvmaddwev_w_hu_h ((v8i32)_1, (v16u16)_2, (v16i16)_3);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V16HI, V16HI, UV32QI, V32QI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvmaddwev_h_bu_b (__m256i _1, __m256i _2, __m256i _3)
{
  return (__m256i)__builtin_lasx_xvmaddwev_h_bu_b ((v16i16)_1, (v32u8)_2, (v32i8)_3);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V4DI, V4DI, UV4DI, V4DI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvmaddwod_q_du_d (__m256i _1, __m256i _2, __m256i _3)
{
  return (__m256i)__builtin_lasx_xvmaddwod_q_du_d ((v4i64)_1, (v4u64)_2, (v4i64)_3);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V4DI, V4DI, UV8SI, V8SI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvmaddwod_d_wu_w (__m256i _1, __m256i _2, __m256i _3)
{
  return (__m256i)__builtin_lasx_xvmaddwod_d_wu_w ((v4i64)_1, (v8u32)_2, (v8i32)_3);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V8SI, V8SI, UV16HI, V16HI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvmaddwod_w_hu_h (__m256i _1, __m256i _2, __m256i _3)
{
  return (__m256i)__builtin_lasx_xvmaddwod_w_hu_h ((v8i32)_1, (v16u16)_2, (v16i16)_3);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V16HI, V16HI, UV32QI, V32QI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvmaddwod_h_bu_b (__m256i _1, __m256i _2, __m256i _3)
{
  return (__m256i)__builtin_lasx_xvmaddwod_h_bu_b ((v16i16)_1, (v32u8)_2, (v32i8)_3);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V32QI, V32QI, V32QI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvrotr_b (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvrotr_b ((v32i8)_1, (v32i8)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V16HI, V16HI, V16HI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvrotr_h (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvrotr_h ((v16i16)_1, (v16i16)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V8SI, V8SI, V8SI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvrotr_w (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvrotr_w ((v8i32)_1, (v8i32)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V4DI, V4DI, V4DI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvrotr_d (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvrotr_d ((v4i64)_1, (v4i64)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V4DI, V4DI, V4DI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvadd_q (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvadd_q ((v4i64)_1, (v4i64)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V4DI, V4DI, V4DI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvsub_q (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvsub_q ((v4i64)_1, (v4i64)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V4DI, UV4DI, V4DI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvaddwev_q_du_d (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvaddwev_q_du_d ((v4u64)_1, (v4i64)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V4DI, UV4DI, V4DI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvaddwod_q_du_d (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvaddwod_q_du_d ((v4u64)_1, (v4i64)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V4DI, UV4DI, V4DI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvmulwev_q_du_d (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvmulwev_q_du_d ((v4u64)_1, (v4i64)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V4DI, UV4DI, V4DI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvmulwod_q_du_d (__m256i _1, __m256i _2)
{
  return (__m256i)__builtin_lasx_xvmulwod_q_du_d ((v4u64)_1, (v4i64)_2);
}

/* Assembly instruction format:	xd, xj.  */
/* Data types in instruction templates:  V32QI, V32QI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvmskgez_b (__m256i _1)
{
  return (__m256i)__builtin_lasx_xvmskgez_b ((v32i8)_1);
}

/* Assembly instruction format:	xd, xj.  */
/* Data types in instruction templates:  V32QI, V32QI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvmsknz_b (__m256i _1)
{
  return (__m256i)__builtin_lasx_xvmsknz_b ((v32i8)_1);
}

/* Assembly instruction format:	xd, xj.  */
/* Data types in instruction templates:  V16HI, V32QI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvexth_h_b (__m256i _1)
{
  return (__m256i)__builtin_lasx_xvexth_h_b ((v32i8)_1);
}

/* Assembly instruction format:	xd, xj.  */
/* Data types in instruction templates:  V8SI, V16HI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvexth_w_h (__m256i _1)
{
  return (__m256i)__builtin_lasx_xvexth_w_h ((v16i16)_1);
}

/* Assembly instruction format:	xd, xj.  */
/* Data types in instruction templates:  V4DI, V8SI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvexth_d_w (__m256i _1)
{
  return (__m256i)__builtin_lasx_xvexth_d_w ((v8i32)_1);
}

/* Assembly instruction format:	xd, xj.  */
/* Data types in instruction templates:  V4DI, V4DI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvexth_q_d (__m256i _1)
{
  return (__m256i)__builtin_lasx_xvexth_q_d ((v4i64)_1);
}

/* Assembly instruction format:	xd, xj.  */
/* Data types in instruction templates:  UV16HI, UV32QI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvexth_hu_bu (__m256i _1)
{
  return (__m256i)__builtin_lasx_xvexth_hu_bu ((v32u8)_1);
}

/* Assembly instruction format:	xd, xj.  */
/* Data types in instruction templates:  UV8SI, UV16HI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvexth_wu_hu (__m256i _1)
{
  return (__m256i)__builtin_lasx_xvexth_wu_hu ((v16u16)_1);
}

/* Assembly instruction format:	xd, xj.  */
/* Data types in instruction templates:  UV4DI, UV8SI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvexth_du_wu (__m256i _1)
{
  return (__m256i)__builtin_lasx_xvexth_du_wu ((v8u32)_1);
}

/* Assembly instruction format:	xd, xj.  */
/* Data types in instruction templates:  UV4DI, UV4DI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvexth_qu_du (__m256i _1)
{
  return (__m256i)__builtin_lasx_xvexth_qu_du ((v4u64)_1);
}

/* Assembly instruction format:	xd, xj, ui3.  */
/* Data types in instruction templates:  V32QI, V32QI, UQI.  */
#define __lasx_xvrotri_b(/*__m256i*/ _1, /*ui3*/ _2) \
  ((__m256i)__builtin_lasx_xvrotri_b ((v32i8)(_1), (_2)))

/* Assembly instruction format:	xd, xj, ui4.  */
/* Data types in instruction templates:  V16HI, V16HI, UQI.  */
#define __lasx_xvrotri_h(/*__m256i*/ _1, /*ui4*/ _2) \
  ((__m256i)__builtin_lasx_xvrotri_h ((v16i16)(_1), (_2)))

/* Assembly instruction format:	xd, xj, ui5.  */
/* Data types in instruction templates:  V8SI, V8SI, UQI.  */
#define __lasx_xvrotri_w(/*__m256i*/ _1, /*ui5*/ _2) \
  ((__m256i)__builtin_lasx_xvrotri_w ((v8i32)(_1), (_2)))

/* Assembly instruction format:	xd, xj, ui6.  */
/* Data types in instruction templates:  V4DI, V4DI, UQI.  */
#define __lasx_xvrotri_d(/*__m256i*/ _1, /*ui6*/ _2) \
  ((__m256i)__builtin_lasx_xvrotri_d ((v4i64)(_1), (_2)))

/* Assembly instruction format:	xd, xj.  */
/* Data types in instruction templates:  V4DI, V4DI.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvextl_q_d (__m256i _1)
{
  return (__m256i)__builtin_lasx_xvextl_q_d ((v4i64)_1);
}

/* Assembly instruction format:	xd, xj, ui4.  */
/* Data types in instruction templates:  V32QI, V32QI, V32QI, USI.  */
#define __lasx_xvsrlni_b_h(/*__m256i*/ _1, /*__m256i*/ _2, /*ui4*/ _3) \
  ((__m256i)__builtin_lasx_xvsrlni_b_h ((v32i8)(_1), (v32i8)(_2), (_3)))

/* Assembly instruction format:	xd, xj, ui5.  */
/* Data types in instruction templates:  V16HI, V16HI, V16HI, USI.  */
#define __lasx_xvsrlni_h_w(/*__m256i*/ _1, /*__m256i*/ _2, /*ui5*/ _3) \
  ((__m256i)__builtin_lasx_xvsrlni_h_w ((v16i16)(_1), (v16i16)(_2), (_3)))

/* Assembly instruction format:	xd, xj, ui6.  */
/* Data types in instruction templates:  V8SI, V8SI, V8SI, USI.  */
#define __lasx_xvsrlni_w_d(/*__m256i*/ _1, /*__m256i*/ _2, /*ui6*/ _3) \
  ((__m256i)__builtin_lasx_xvsrlni_w_d ((v8i32)(_1), (v8i32)(_2), (_3)))

/* Assembly instruction format:	xd, xj, ui7.  */
/* Data types in instruction templates:  V4DI, V4DI, V4DI, USI.  */
#define __lasx_xvsrlni_d_q(/*__m256i*/ _1, /*__m256i*/ _2, /*ui7*/ _3) \
  ((__m256i)__builtin_lasx_xvsrlni_d_q ((v4i64)(_1), (v4i64)(_2), (_3)))

/* Assembly instruction format:	xd, xj, ui4.  */
/* Data types in instruction templates:  V32QI, V32QI, V32QI, USI.  */
#define __lasx_xvsrlrni_b_h(/*__m256i*/ _1, /*__m256i*/ _2, /*ui4*/ _3) \
  ((__m256i)__builtin_lasx_xvsrlrni_b_h ((v32i8)(_1), (v32i8)(_2), (_3)))

/* Assembly instruction format:	xd, xj, ui5.  */
/* Data types in instruction templates:  V16HI, V16HI, V16HI, USI.  */
#define __lasx_xvsrlrni_h_w(/*__m256i*/ _1, /*__m256i*/ _2, /*ui5*/ _3) \
  ((__m256i)__builtin_lasx_xvsrlrni_h_w ((v16i16)(_1), (v16i16)(_2), (_3)))

/* Assembly instruction format:	xd, xj, ui6.  */
/* Data types in instruction templates:  V8SI, V8SI, V8SI, USI.  */
#define __lasx_xvsrlrni_w_d(/*__m256i*/ _1, /*__m256i*/ _2, /*ui6*/ _3) \
  ((__m256i)__builtin_lasx_xvsrlrni_w_d ((v8i32)(_1), (v8i32)(_2), (_3)))

/* Assembly instruction format:	xd, xj, ui7.  */
/* Data types in instruction templates:  V4DI, V4DI, V4DI, USI.  */
#define __lasx_xvsrlrni_d_q(/*__m256i*/ _1, /*__m256i*/ _2, /*ui7*/ _3) \
  ((__m256i)__builtin_lasx_xvsrlrni_d_q ((v4i64)(_1), (v4i64)(_2), (_3)))

/* Assembly instruction format:	xd, xj, ui4.  */
/* Data types in instruction templates:  V32QI, V32QI, V32QI, USI.  */
#define __lasx_xvssrlni_b_h(/*__m256i*/ _1, /*__m256i*/ _2, /*ui4*/ _3) \
  ((__m256i)__builtin_lasx_xvssrlni_b_h ((v32i8)(_1), (v32i8)(_2), (_3)))

/* Assembly instruction format:	xd, xj, ui5.  */
/* Data types in instruction templates:  V16HI, V16HI, V16HI, USI.  */
#define __lasx_xvssrlni_h_w(/*__m256i*/ _1, /*__m256i*/ _2, /*ui5*/ _3) \
  ((__m256i)__builtin_lasx_xvssrlni_h_w ((v16i16)(_1), (v16i16)(_2), (_3)))

/* Assembly instruction format:	xd, xj, ui6.  */
/* Data types in instruction templates:  V8SI, V8SI, V8SI, USI.  */
#define __lasx_xvssrlni_w_d(/*__m256i*/ _1, /*__m256i*/ _2, /*ui6*/ _3) \
  ((__m256i)__builtin_lasx_xvssrlni_w_d ((v8i32)(_1), (v8i32)(_2), (_3)))

/* Assembly instruction format:	xd, xj, ui7.  */
/* Data types in instruction templates:  V4DI, V4DI, V4DI, USI.  */
#define __lasx_xvssrlni_d_q(/*__m256i*/ _1, /*__m256i*/ _2, /*ui7*/ _3) \
  ((__m256i)__builtin_lasx_xvssrlni_d_q ((v4i64)(_1), (v4i64)(_2), (_3)))

/* Assembly instruction format:	xd, xj, ui4.  */
/* Data types in instruction templates:  UV32QI, UV32QI, V32QI, USI.  */
#define __lasx_xvssrlni_bu_h(/*__m256i*/ _1, /*__m256i*/ _2, /*ui4*/ _3) \
  ((__m256i)__builtin_lasx_xvssrlni_bu_h ((v32u8)(_1), (v32i8)(_2), (_3)))

/* Assembly instruction format:	xd, xj, ui5.  */
/* Data types in instruction templates:  UV16HI, UV16HI, V16HI, USI.  */
#define __lasx_xvssrlni_hu_w(/*__m256i*/ _1, /*__m256i*/ _2, /*ui5*/ _3) \
  ((__m256i)__builtin_lasx_xvssrlni_hu_w ((v16u16)(_1), (v16i16)(_2), (_3)))

/* Assembly instruction format:	xd, xj, ui6.  */
/* Data types in instruction templates:  UV8SI, UV8SI, V8SI, USI.  */
#define __lasx_xvssrlni_wu_d(/*__m256i*/ _1, /*__m256i*/ _2, /*ui6*/ _3) \
  ((__m256i)__builtin_lasx_xvssrlni_wu_d ((v8u32)(_1), (v8i32)(_2), (_3)))

/* Assembly instruction format:	xd, xj, ui7.  */
/* Data types in instruction templates:  UV4DI, UV4DI, V4DI, USI.  */
#define __lasx_xvssrlni_du_q(/*__m256i*/ _1, /*__m256i*/ _2, /*ui7*/ _3) \
  ((__m256i)__builtin_lasx_xvssrlni_du_q ((v4u64)(_1), (v4i64)(_2), (_3)))

/* Assembly instruction format:	xd, xj, ui4.  */
/* Data types in instruction templates:  V32QI, V32QI, V32QI, USI.  */
#define __lasx_xvssrlrni_b_h(/*__m256i*/ _1, /*__m256i*/ _2, /*ui4*/ _3) \
  ((__m256i)__builtin_lasx_xvssrlrni_b_h ((v32i8)(_1), (v32i8)(_2), (_3)))

/* Assembly instruction format:	xd, xj, ui5.  */
/* Data types in instruction templates:  V16HI, V16HI, V16HI, USI.  */
#define __lasx_xvssrlrni_h_w(/*__m256i*/ _1, /*__m256i*/ _2, /*ui5*/ _3) \
  ((__m256i)__builtin_lasx_xvssrlrni_h_w ((v16i16)(_1), (v16i16)(_2), (_3)))

/* Assembly instruction format:	xd, xj, ui6.  */
/* Data types in instruction templates:  V8SI, V8SI, V8SI, USI.  */
#define __lasx_xvssrlrni_w_d(/*__m256i*/ _1, /*__m256i*/ _2, /*ui6*/ _3) \
  ((__m256i)__builtin_lasx_xvssrlrni_w_d ((v8i32)(_1), (v8i32)(_2), (_3)))

/* Assembly instruction format:	xd, xj, ui7.  */
/* Data types in instruction templates:  V4DI, V4DI, V4DI, USI.  */
#define __lasx_xvssrlrni_d_q(/*__m256i*/ _1, /*__m256i*/ _2, /*ui7*/ _3) \
  ((__m256i)__builtin_lasx_xvssrlrni_d_q ((v4i64)(_1), (v4i64)(_2), (_3)))

/* Assembly instruction format:	xd, xj, ui4.  */
/* Data types in instruction templates:  UV32QI, UV32QI, V32QI, USI.  */
#define __lasx_xvssrlrni_bu_h(/*__m256i*/ _1, /*__m256i*/ _2, /*ui4*/ _3) \
  ((__m256i)__builtin_lasx_xvssrlrni_bu_h ((v32u8)(_1), (v32i8)(_2), (_3)))

/* Assembly instruction format:	xd, xj, ui5.  */
/* Data types in instruction templates:  UV16HI, UV16HI, V16HI, USI.  */
#define __lasx_xvssrlrni_hu_w(/*__m256i*/ _1, /*__m256i*/ _2, /*ui5*/ _3) \
  ((__m256i)__builtin_lasx_xvssrlrni_hu_w ((v16u16)(_1), (v16i16)(_2), (_3)))

/* Assembly instruction format:	xd, xj, ui6.  */
/* Data types in instruction templates:  UV8SI, UV8SI, V8SI, USI.  */
#define __lasx_xvssrlrni_wu_d(/*__m256i*/ _1, /*__m256i*/ _2, /*ui6*/ _3) \
  ((__m256i)__builtin_lasx_xvssrlrni_wu_d ((v8u32)(_1), (v8i32)(_2), (_3)))

/* Assembly instruction format:	xd, xj, ui7.  */
/* Data types in instruction templates:  UV4DI, UV4DI, V4DI, USI.  */
#define __lasx_xvssrlrni_du_q(/*__m256i*/ _1, /*__m256i*/ _2, /*ui7*/ _3) \
  ((__m256i)__builtin_lasx_xvssrlrni_du_q ((v4u64)(_1), (v4i64)(_2), (_3)))

/* Assembly instruction format:	xd, xj, ui4.  */
/* Data types in instruction templates:  V32QI, V32QI, V32QI, USI.  */
#define __lasx_xvsrani_b_h(/*__m256i*/ _1, /*__m256i*/ _2, /*ui4*/ _3) \
  ((__m256i)__builtin_lasx_xvsrani_b_h ((v32i8)(_1), (v32i8)(_2), (_3)))

/* Assembly instruction format:	xd, xj, ui5.  */
/* Data types in instruction templates:  V16HI, V16HI, V16HI, USI.  */
#define __lasx_xvsrani_h_w(/*__m256i*/ _1, /*__m256i*/ _2, /*ui5*/ _3) \
  ((__m256i)__builtin_lasx_xvsrani_h_w ((v16i16)(_1), (v16i16)(_2), (_3)))

/* Assembly instruction format:	xd, xj, ui6.  */
/* Data types in instruction templates:  V8SI, V8SI, V8SI, USI.  */
#define __lasx_xvsrani_w_d(/*__m256i*/ _1, /*__m256i*/ _2, /*ui6*/ _3) \
  ((__m256i)__builtin_lasx_xvsrani_w_d ((v8i32)(_1), (v8i32)(_2), (_3)))

/* Assembly instruction format:	xd, xj, ui7.  */
/* Data types in instruction templates:  V4DI, V4DI, V4DI, USI.  */
#define __lasx_xvsrani_d_q(/*__m256i*/ _1, /*__m256i*/ _2, /*ui7*/ _3) \
  ((__m256i)__builtin_lasx_xvsrani_d_q ((v4i64)(_1), (v4i64)(_2), (_3)))

/* Assembly instruction format:	xd, xj, ui4.  */
/* Data types in instruction templates:  V32QI, V32QI, V32QI, USI.  */
#define __lasx_xvsrarni_b_h(/*__m256i*/ _1, /*__m256i*/ _2, /*ui4*/ _3) \
  ((__m256i)__builtin_lasx_xvsrarni_b_h ((v32i8)(_1), (v32i8)(_2), (_3)))

/* Assembly instruction format:	xd, xj, ui5.  */
/* Data types in instruction templates:  V16HI, V16HI, V16HI, USI.  */
#define __lasx_xvsrarni_h_w(/*__m256i*/ _1, /*__m256i*/ _2, /*ui5*/ _3) \
  ((__m256i)__builtin_lasx_xvsrarni_h_w ((v16i16)(_1), (v16i16)(_2), (_3)))

/* Assembly instruction format:	xd, xj, ui6.  */
/* Data types in instruction templates:  V8SI, V8SI, V8SI, USI.  */
#define __lasx_xvsrarni_w_d(/*__m256i*/ _1, /*__m256i*/ _2, /*ui6*/ _3) \
  ((__m256i)__builtin_lasx_xvsrarni_w_d ((v8i32)(_1), (v8i32)(_2), (_3)))

/* Assembly instruction format:	xd, xj, ui7.  */
/* Data types in instruction templates:  V4DI, V4DI, V4DI, USI.  */
#define __lasx_xvsrarni_d_q(/*__m256i*/ _1, /*__m256i*/ _2, /*ui7*/ _3) \
  ((__m256i)__builtin_lasx_xvsrarni_d_q ((v4i64)(_1), (v4i64)(_2), (_3)))

/* Assembly instruction format:	xd, xj, ui4.  */
/* Data types in instruction templates:  V32QI, V32QI, V32QI, USI.  */
#define __lasx_xvssrani_b_h(/*__m256i*/ _1, /*__m256i*/ _2, /*ui4*/ _3) \
  ((__m256i)__builtin_lasx_xvssrani_b_h ((v32i8)(_1), (v32i8)(_2), (_3)))

/* Assembly instruction format:	xd, xj, ui5.  */
/* Data types in instruction templates:  V16HI, V16HI, V16HI, USI.  */
#define __lasx_xvssrani_h_w(/*__m256i*/ _1, /*__m256i*/ _2, /*ui5*/ _3) \
  ((__m256i)__builtin_lasx_xvssrani_h_w ((v16i16)(_1), (v16i16)(_2), (_3)))

/* Assembly instruction format:	xd, xj, ui6.  */
/* Data types in instruction templates:  V8SI, V8SI, V8SI, USI.  */
#define __lasx_xvssrani_w_d(/*__m256i*/ _1, /*__m256i*/ _2, /*ui6*/ _3) \
  ((__m256i)__builtin_lasx_xvssrani_w_d ((v8i32)(_1), (v8i32)(_2), (_3)))

/* Assembly instruction format:	xd, xj, ui7.  */
/* Data types in instruction templates:  V4DI, V4DI, V4DI, USI.  */
#define __lasx_xvssrani_d_q(/*__m256i*/ _1, /*__m256i*/ _2, /*ui7*/ _3) \
  ((__m256i)__builtin_lasx_xvssrani_d_q ((v4i64)(_1), (v4i64)(_2), (_3)))

/* Assembly instruction format:	xd, xj, ui4.  */
/* Data types in instruction templates:  UV32QI, UV32QI, V32QI, USI.  */
#define __lasx_xvssrani_bu_h(/*__m256i*/ _1, /*__m256i*/ _2, /*ui4*/ _3) \
  ((__m256i)__builtin_lasx_xvssrani_bu_h ((v32u8)(_1), (v32i8)(_2), (_3)))

/* Assembly instruction format:	xd, xj, ui5.  */
/* Data types in instruction templates:  UV16HI, UV16HI, V16HI, USI.  */
#define __lasx_xvssrani_hu_w(/*__m256i*/ _1, /*__m256i*/ _2, /*ui5*/ _3) \
  ((__m256i)__builtin_lasx_xvssrani_hu_w ((v16u16)(_1), (v16i16)(_2), (_3)))

/* Assembly instruction format:	xd, xj, ui6.  */
/* Data types in instruction templates:  UV8SI, UV8SI, V8SI, USI.  */
#define __lasx_xvssrani_wu_d(/*__m256i*/ _1, /*__m256i*/ _2, /*ui6*/ _3) \
  ((__m256i)__builtin_lasx_xvssrani_wu_d ((v8u32)(_1), (v8i32)(_2), (_3)))

/* Assembly instruction format:	xd, xj, ui7.  */
/* Data types in instruction templates:  UV4DI, UV4DI, V4DI, USI.  */
#define __lasx_xvssrani_du_q(/*__m256i*/ _1, /*__m256i*/ _2, /*ui7*/ _3) \
  ((__m256i)__builtin_lasx_xvssrani_du_q ((v4u64)(_1), (v4i64)(_2), (_3)))

/* Assembly instruction format:	xd, xj, ui4.  */
/* Data types in instruction templates:  V32QI, V32QI, V32QI, USI.  */
#define __lasx_xvssrarni_b_h(/*__m256i*/ _1, /*__m256i*/ _2, /*ui4*/ _3) \
  ((__m256i)__builtin_lasx_xvssrarni_b_h ((v32i8)(_1), (v32i8)(_2), (_3)))

/* Assembly instruction format:	xd, xj, ui5.  */
/* Data types in instruction templates:  V16HI, V16HI, V16HI, USI.  */
#define __lasx_xvssrarni_h_w(/*__m256i*/ _1, /*__m256i*/ _2, /*ui5*/ _3) \
  ((__m256i)__builtin_lasx_xvssrarni_h_w ((v16i16)(_1), (v16i16)(_2), (_3)))

/* Assembly instruction format:	xd, xj, ui6.  */
/* Data types in instruction templates:  V8SI, V8SI, V8SI, USI.  */
#define __lasx_xvssrarni_w_d(/*__m256i*/ _1, /*__m256i*/ _2, /*ui6*/ _3) \
  ((__m256i)__builtin_lasx_xvssrarni_w_d ((v8i32)(_1), (v8i32)(_2), (_3)))

/* Assembly instruction format:	xd, xj, ui7.  */
/* Data types in instruction templates:  V4DI, V4DI, V4DI, USI.  */
#define __lasx_xvssrarni_d_q(/*__m256i*/ _1, /*__m256i*/ _2, /*ui7*/ _3) \
  ((__m256i)__builtin_lasx_xvssrarni_d_q ((v4i64)(_1), (v4i64)(_2), (_3)))

/* Assembly instruction format:	xd, xj, ui4.  */
/* Data types in instruction templates:  UV32QI, UV32QI, V32QI, USI.  */
#define __lasx_xvssrarni_bu_h(/*__m256i*/ _1, /*__m256i*/ _2, /*ui4*/ _3) \
  ((__m256i)__builtin_lasx_xvssrarni_bu_h ((v32u8)(_1), (v32i8)(_2), (_3)))

/* Assembly instruction format:	xd, xj, ui5.  */
/* Data types in instruction templates:  UV16HI, UV16HI, V16HI, USI.  */
#define __lasx_xvssrarni_hu_w(/*__m256i*/ _1, /*__m256i*/ _2, /*ui5*/ _3) \
  ((__m256i)__builtin_lasx_xvssrarni_hu_w ((v16u16)(_1), (v16i16)(_2), (_3)))

/* Assembly instruction format:	xd, xj, ui6.  */
/* Data types in instruction templates:  UV8SI, UV8SI, V8SI, USI.  */
#define __lasx_xvssrarni_wu_d(/*__m256i*/ _1, /*__m256i*/ _2, /*ui6*/ _3) \
  ((__m256i)__builtin_lasx_xvssrarni_wu_d ((v8u32)(_1), (v8i32)(_2), (_3)))

/* Assembly instruction format:	xd, xj, ui7.  */
/* Data types in instruction templates:  UV4DI, UV4DI, V4DI, USI.  */
#define __lasx_xvssrarni_du_q(/*__m256i*/ _1, /*__m256i*/ _2, /*ui7*/ _3) \
  ((__m256i)__builtin_lasx_xvssrarni_du_q ((v4u64)(_1), (v4i64)(_2), (_3)))

/* Assembly instruction format:	cd, xj.  */
/* Data types in instruction templates:  SI, UV32QI.  */
#define __lasx_xbnz_b(/*__m256i*/ _1) \
  ((int)__builtin_lasx_xbnz_b ((v32u8)(_1)))

/* Assembly instruction format:	cd, xj.  */
/* Data types in instruction templates:  SI, UV4DI.  */
#define __lasx_xbnz_d(/*__m256i*/ _1) \
  ((int)__builtin_lasx_xbnz_d ((v4u64)(_1)))

/* Assembly instruction format:	cd, xj.  */
/* Data types in instruction templates:  SI, UV16HI.  */
#define __lasx_xbnz_h(/*__m256i*/ _1) \
  ((int)__builtin_lasx_xbnz_h ((v16u16)(_1)))

/* Assembly instruction format:	cd, xj.  */
/* Data types in instruction templates:  SI, UV32QI.  */
#define __lasx_xbnz_v(/*__m256i*/ _1) \
  ((int)__builtin_lasx_xbnz_v ((v32u8)(_1)))

/* Assembly instruction format:	cd, xj.  */
/* Data types in instruction templates:  SI, UV8SI.  */
#define __lasx_xbnz_w(/*__m256i*/ _1) \
  ((int)__builtin_lasx_xbnz_w ((v8u32)(_1)))

/* Assembly instruction format:	cd, xj.  */
/* Data types in instruction templates:  SI, UV32QI.  */
#define __lasx_xbz_b(/*__m256i*/ _1) \
  ((int)__builtin_lasx_xbz_b ((v32u8)(_1)))

/* Assembly instruction format:	cd, xj.  */
/* Data types in instruction templates:  SI, UV4DI.  */
#define __lasx_xbz_d(/*__m256i*/ _1) \
  ((int)__builtin_lasx_xbz_d ((v4u64)(_1)))

/* Assembly instruction format:	cd, xj.  */
/* Data types in instruction templates:  SI, UV16HI.  */
#define __lasx_xbz_h(/*__m256i*/ _1) \
  ((int)__builtin_lasx_xbz_h ((v16u16)(_1)))

/* Assembly instruction format:	cd, xj.  */
/* Data types in instruction templates:  SI, UV32QI.  */
#define __lasx_xbz_v(/*__m256i*/ _1) \
  ((int)__builtin_lasx_xbz_v ((v32u8)(_1)))

/* Assembly instruction format:	cd, xj.  */
/* Data types in instruction templates:  SI, UV8SI.  */
#define __lasx_xbz_w(/*__m256i*/ _1) \
  ((int)__builtin_lasx_xbz_w ((v8u32)(_1)))

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V4DI, V4DF, V4DF.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvfcmp_caf_d (__m256d _1, __m256d _2)
{
  return (__m256i)__builtin_lasx_xvfcmp_caf_d ((v4f64)_1, (v4f64)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V8SI, V8SF, V8SF.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvfcmp_caf_s (__m256 _1, __m256 _2)
{
  return (__m256i)__builtin_lasx_xvfcmp_caf_s ((v8f32)_1, (v8f32)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V4DI, V4DF, V4DF.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvfcmp_ceq_d (__m256d _1, __m256d _2)
{
  return (__m256i)__builtin_lasx_xvfcmp_ceq_d ((v4f64)_1, (v4f64)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V8SI, V8SF, V8SF.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvfcmp_ceq_s (__m256 _1, __m256 _2)
{
  return (__m256i)__builtin_lasx_xvfcmp_ceq_s ((v8f32)_1, (v8f32)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V4DI, V4DF, V4DF.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvfcmp_cle_d (__m256d _1, __m256d _2)
{
  return (__m256i)__builtin_lasx_xvfcmp_cle_d ((v4f64)_1, (v4f64)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V8SI, V8SF, V8SF.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvfcmp_cle_s (__m256 _1, __m256 _2)
{
  return (__m256i)__builtin_lasx_xvfcmp_cle_s ((v8f32)_1, (v8f32)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V4DI, V4DF, V4DF.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvfcmp_clt_d (__m256d _1, __m256d _2)
{
  return (__m256i)__builtin_lasx_xvfcmp_clt_d ((v4f64)_1, (v4f64)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V8SI, V8SF, V8SF.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvfcmp_clt_s (__m256 _1, __m256 _2)
{
  return (__m256i)__builtin_lasx_xvfcmp_clt_s ((v8f32)_1, (v8f32)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V4DI, V4DF, V4DF.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvfcmp_cne_d (__m256d _1, __m256d _2)
{
  return (__m256i)__builtin_lasx_xvfcmp_cne_d ((v4f64)_1, (v4f64)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V8SI, V8SF, V8SF.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvfcmp_cne_s (__m256 _1, __m256 _2)
{
  return (__m256i)__builtin_lasx_xvfcmp_cne_s ((v8f32)_1, (v8f32)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V4DI, V4DF, V4DF.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvfcmp_cor_d (__m256d _1, __m256d _2)
{
  return (__m256i)__builtin_lasx_xvfcmp_cor_d ((v4f64)_1, (v4f64)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V8SI, V8SF, V8SF.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvfcmp_cor_s (__m256 _1, __m256 _2)
{
  return (__m256i)__builtin_lasx_xvfcmp_cor_s ((v8f32)_1, (v8f32)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V4DI, V4DF, V4DF.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvfcmp_cueq_d (__m256d _1, __m256d _2)
{
  return (__m256i)__builtin_lasx_xvfcmp_cueq_d ((v4f64)_1, (v4f64)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V8SI, V8SF, V8SF.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvfcmp_cueq_s (__m256 _1, __m256 _2)
{
  return (__m256i)__builtin_lasx_xvfcmp_cueq_s ((v8f32)_1, (v8f32)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V4DI, V4DF, V4DF.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvfcmp_cule_d (__m256d _1, __m256d _2)
{
  return (__m256i)__builtin_lasx_xvfcmp_cule_d ((v4f64)_1, (v4f64)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V8SI, V8SF, V8SF.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvfcmp_cule_s (__m256 _1, __m256 _2)
{
  return (__m256i)__builtin_lasx_xvfcmp_cule_s ((v8f32)_1, (v8f32)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V4DI, V4DF, V4DF.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvfcmp_cult_d (__m256d _1, __m256d _2)
{
  return (__m256i)__builtin_lasx_xvfcmp_cult_d ((v4f64)_1, (v4f64)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V8SI, V8SF, V8SF.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvfcmp_cult_s (__m256 _1, __m256 _2)
{
  return (__m256i)__builtin_lasx_xvfcmp_cult_s ((v8f32)_1, (v8f32)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V4DI, V4DF, V4DF.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvfcmp_cun_d (__m256d _1, __m256d _2)
{
  return (__m256i)__builtin_lasx_xvfcmp_cun_d ((v4f64)_1, (v4f64)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V4DI, V4DF, V4DF.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvfcmp_cune_d (__m256d _1, __m256d _2)
{
  return (__m256i)__builtin_lasx_xvfcmp_cune_d ((v4f64)_1, (v4f64)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V8SI, V8SF, V8SF.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvfcmp_cune_s (__m256 _1, __m256 _2)
{
  return (__m256i)__builtin_lasx_xvfcmp_cune_s ((v8f32)_1, (v8f32)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V8SI, V8SF, V8SF.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvfcmp_cun_s (__m256 _1, __m256 _2)
{
  return (__m256i)__builtin_lasx_xvfcmp_cun_s ((v8f32)_1, (v8f32)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V4DI, V4DF, V4DF.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvfcmp_saf_d (__m256d _1, __m256d _2)
{
  return (__m256i)__builtin_lasx_xvfcmp_saf_d ((v4f64)_1, (v4f64)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V8SI, V8SF, V8SF.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvfcmp_saf_s (__m256 _1, __m256 _2)
{
  return (__m256i)__builtin_lasx_xvfcmp_saf_s ((v8f32)_1, (v8f32)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V4DI, V4DF, V4DF.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvfcmp_seq_d (__m256d _1, __m256d _2)
{
  return (__m256i)__builtin_lasx_xvfcmp_seq_d ((v4f64)_1, (v4f64)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V8SI, V8SF, V8SF.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvfcmp_seq_s (__m256 _1, __m256 _2)
{
  return (__m256i)__builtin_lasx_xvfcmp_seq_s ((v8f32)_1, (v8f32)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V4DI, V4DF, V4DF.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvfcmp_sle_d (__m256d _1, __m256d _2)
{
  return (__m256i)__builtin_lasx_xvfcmp_sle_d ((v4f64)_1, (v4f64)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V8SI, V8SF, V8SF.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvfcmp_sle_s (__m256 _1, __m256 _2)
{
  return (__m256i)__builtin_lasx_xvfcmp_sle_s ((v8f32)_1, (v8f32)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V4DI, V4DF, V4DF.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvfcmp_slt_d (__m256d _1, __m256d _2)
{
  return (__m256i)__builtin_lasx_xvfcmp_slt_d ((v4f64)_1, (v4f64)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V8SI, V8SF, V8SF.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvfcmp_slt_s (__m256 _1, __m256 _2)
{
  return (__m256i)__builtin_lasx_xvfcmp_slt_s ((v8f32)_1, (v8f32)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V4DI, V4DF, V4DF.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvfcmp_sne_d (__m256d _1, __m256d _2)
{
  return (__m256i)__builtin_lasx_xvfcmp_sne_d ((v4f64)_1, (v4f64)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V8SI, V8SF, V8SF.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvfcmp_sne_s (__m256 _1, __m256 _2)
{
  return (__m256i)__builtin_lasx_xvfcmp_sne_s ((v8f32)_1, (v8f32)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V4DI, V4DF, V4DF.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvfcmp_sor_d (__m256d _1, __m256d _2)
{
  return (__m256i)__builtin_lasx_xvfcmp_sor_d ((v4f64)_1, (v4f64)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V8SI, V8SF, V8SF.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvfcmp_sor_s (__m256 _1, __m256 _2)
{
  return (__m256i)__builtin_lasx_xvfcmp_sor_s ((v8f32)_1, (v8f32)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V4DI, V4DF, V4DF.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvfcmp_sueq_d (__m256d _1, __m256d _2)
{
  return (__m256i)__builtin_lasx_xvfcmp_sueq_d ((v4f64)_1, (v4f64)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V8SI, V8SF, V8SF.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvfcmp_sueq_s (__m256 _1, __m256 _2)
{
  return (__m256i)__builtin_lasx_xvfcmp_sueq_s ((v8f32)_1, (v8f32)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V4DI, V4DF, V4DF.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvfcmp_sule_d (__m256d _1, __m256d _2)
{
  return (__m256i)__builtin_lasx_xvfcmp_sule_d ((v4f64)_1, (v4f64)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V8SI, V8SF, V8SF.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvfcmp_sule_s (__m256 _1, __m256 _2)
{
  return (__m256i)__builtin_lasx_xvfcmp_sule_s ((v8f32)_1, (v8f32)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V4DI, V4DF, V4DF.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvfcmp_sult_d (__m256d _1, __m256d _2)
{
  return (__m256i)__builtin_lasx_xvfcmp_sult_d ((v4f64)_1, (v4f64)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V8SI, V8SF, V8SF.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvfcmp_sult_s (__m256 _1, __m256 _2)
{
  return (__m256i)__builtin_lasx_xvfcmp_sult_s ((v8f32)_1, (v8f32)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V4DI, V4DF, V4DF.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvfcmp_sun_d (__m256d _1, __m256d _2)
{
  return (__m256i)__builtin_lasx_xvfcmp_sun_d ((v4f64)_1, (v4f64)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V4DI, V4DF, V4DF.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvfcmp_sune_d (__m256d _1, __m256d _2)
{
  return (__m256i)__builtin_lasx_xvfcmp_sune_d ((v4f64)_1, (v4f64)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V8SI, V8SF, V8SF.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvfcmp_sune_s (__m256 _1, __m256 _2)
{
  return (__m256i)__builtin_lasx_xvfcmp_sune_s ((v8f32)_1, (v8f32)_2);
}

/* Assembly instruction format:	xd, xj, xk.  */
/* Data types in instruction templates:  V8SI, V8SF, V8SF.  */
extern __inline __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__m256i __lasx_xvfcmp_sun_s (__m256 _1, __m256 _2)
{
  return (__m256i)__builtin_lasx_xvfcmp_sun_s ((v8f32)_1, (v8f32)_2);
}

/* Assembly instruction format:	xd, xj, ui2.  */
/* Data types in instruction templates:  V4DF, V4DF, UQI.  */
#define __lasx_xvpickve_d_f(/*__m256d*/ _1, /*ui2*/ _2) \
  ((__m256d)__builtin_lasx_xvpickve_d_f ((v4f64)(_1), (_2)))

/* Assembly instruction format:	xd, xj, ui3.  */
/* Data types in instruction templates:  V8SF, V8SF, UQI.  */
#define __lasx_xvpickve_w_f(/*__m256*/ _1, /*ui3*/ _2) \
  ((__m256)__builtin_lasx_xvpickve_w_f ((v8f32)(_1), (_2)))

/* Assembly instruction format:	xd, si10.  */
/* Data types in instruction templates:  V32QI, HI.  */
#define __lasx_xvrepli_b(/*si10*/ _1) \
  ((__m256i)__builtin_lasx_xvrepli_b ((_1)))

/* Assembly instruction format:	xd, si10.  */
/* Data types in instruction templates:  V4DI, HI.  */
#define __lasx_xvrepli_d(/*si10*/ _1) \
  ((__m256i)__builtin_lasx_xvrepli_d ((_1)))

/* Assembly instruction format:	xd, si10.  */
/* Data types in instruction templates:  V16HI, HI.  */
#define __lasx_xvrepli_h(/*si10*/ _1) \
  ((__m256i)__builtin_lasx_xvrepli_h ((_1)))

/* Assembly instruction format:	xd, si10.  */
/* Data types in instruction templates:  V8SI, HI.  */
#define __lasx_xvrepli_w(/*si10*/ _1) \
  ((__m256i)__builtin_lasx_xvrepli_w ((_1)))

#endif /* defined(__loongarch_asx).  */
#endif /* _GCC_LOONGSON_ASXINTRIN_H.  */
