https://github.com/sihuan created 
https://github.com/llvm/llvm-project/pull/203191

Add header wrappers for pmseq/pmsne/pmslt[u]/pmsgt[u]/pmsge[u]/pmsle[u] as 
element-wise vector comparisons cast to the unsigned result type.

>From 5c670e653c845ad614483498ff3adc3ada972e2f Mon Sep 17 00:00:00 2001
From: SiHuaN <[email protected]>
Date: Wed, 10 Jun 2026 18:04:56 +0800
Subject: [PATCH] [Clang][RISCV] packed comparison intrinsics

Add header wrappers for pmseq/pmsne/pmslt[u]/pmsgt[u]/pmsge[u]/pmsle[u]
as element-wise vector comparisons cast to the unsigned result type.
---
 clang/lib/Headers/riscv_packed_simd.h         |   71 +
 clang/test/CodeGen/RISCV/rvp-intrinsics.c     | 1444 +++++++++++++++++
 .../riscv_packed_simd.c                       |  444 +++++
 3 files changed, 1959 insertions(+)

diff --git a/clang/lib/Headers/riscv_packed_simd.h 
b/clang/lib/Headers/riscv_packed_simd.h
index 828cb90f8034a..39f2f4cd2c704 100644
--- a/clang/lib/Headers/riscv_packed_simd.h
+++ b/clang/lib/Headers/riscv_packed_simd.h
@@ -86,6 +86,12 @@ typedef uint32_t uint32x2_t 
__attribute__((__vector_size__(8)));
         __builtin_elementwise_add_sat(__rs1, __rs1), __rs2);                   
\
   }
 
+#define __packed_cmp(name, ty, rty, op)                                        
\
+  static __inline__ rty __DEFAULT_FN_ATTRS __riscv_##name(ty __rs1,            
\
+                                                          ty __rs2) {          
\
+    return (rty)(__rs1 op __rs2);                                              
\
+  }
+
 // clang-format off: macro call sites have no trailing semicolons, which
 // confuses clang-format into a deeply nested expression.
 
@@ -213,6 +219,70 @@ __packed_binary_builtin(pmaxu_u8x8, uint8x8_t, 
__builtin_elementwise_max)
 __packed_binary_builtin(pmaxu_u16x4, uint16x4_t, __builtin_elementwise_max)
 __packed_binary_builtin(pmaxu_u32x2, uint32x2_t, __builtin_elementwise_max)
 
+/* Packed Comparison (32-bit) */
+__packed_cmp(pmseq_i8x4_u8x4, int8x4_t, uint8x4_t, ==)
+__packed_cmp(pmseq_u8x4_u8x4, uint8x4_t, uint8x4_t, ==)
+__packed_cmp(pmsne_i8x4_u8x4, int8x4_t, uint8x4_t, !=)
+__packed_cmp(pmsne_u8x4_u8x4, uint8x4_t, uint8x4_t, !=)
+__packed_cmp(pmslt_u8x4, int8x4_t, uint8x4_t, <)
+__packed_cmp(pmsltu_u8x4, uint8x4_t, uint8x4_t, <)
+__packed_cmp(pmsgt_u8x4, int8x4_t, uint8x4_t, >)
+__packed_cmp(pmsgtu_u8x4, uint8x4_t, uint8x4_t, >)
+__packed_cmp(pmsge_u8x4, int8x4_t, uint8x4_t, >=)
+__packed_cmp(pmsgeu_u8x4, uint8x4_t, uint8x4_t, >=)
+__packed_cmp(pmsle_u8x4, int8x4_t, uint8x4_t, <=)
+__packed_cmp(pmsleu_u8x4, uint8x4_t, uint8x4_t, <=)
+__packed_cmp(pmseq_i16x2_u16x2, int16x2_t, uint16x2_t, ==)
+__packed_cmp(pmseq_u16x2_u16x2, uint16x2_t, uint16x2_t, ==)
+__packed_cmp(pmsne_i16x2_u16x2, int16x2_t, uint16x2_t, !=)
+__packed_cmp(pmsne_u16x2_u16x2, uint16x2_t, uint16x2_t, !=)
+__packed_cmp(pmslt_u16x2, int16x2_t, uint16x2_t, <)
+__packed_cmp(pmsltu_u16x2, uint16x2_t, uint16x2_t, <)
+__packed_cmp(pmsgt_u16x2, int16x2_t, uint16x2_t, >)
+__packed_cmp(pmsgtu_u16x2, uint16x2_t, uint16x2_t, >)
+__packed_cmp(pmsge_u16x2, int16x2_t, uint16x2_t, >=)
+__packed_cmp(pmsgeu_u16x2, uint16x2_t, uint16x2_t, >=)
+__packed_cmp(pmsle_u16x2, int16x2_t, uint16x2_t, <=)
+__packed_cmp(pmsleu_u16x2, uint16x2_t, uint16x2_t, <=)
+
+/* Packed Comparison (64-bit) */
+__packed_cmp(pmseq_i8x8_u8x8, int8x8_t, uint8x8_t, ==)
+__packed_cmp(pmseq_u8x8_u8x8, uint8x8_t, uint8x8_t, ==)
+__packed_cmp(pmsne_i8x8_u8x8, int8x8_t, uint8x8_t, !=)
+__packed_cmp(pmsne_u8x8_u8x8, uint8x8_t, uint8x8_t, !=)
+__packed_cmp(pmslt_u8x8, int8x8_t, uint8x8_t, <)
+__packed_cmp(pmsltu_u8x8, uint8x8_t, uint8x8_t, <)
+__packed_cmp(pmsgt_u8x8, int8x8_t, uint8x8_t, >)
+__packed_cmp(pmsgtu_u8x8, uint8x8_t, uint8x8_t, >)
+__packed_cmp(pmsge_u8x8, int8x8_t, uint8x8_t, >=)
+__packed_cmp(pmsgeu_u8x8, uint8x8_t, uint8x8_t, >=)
+__packed_cmp(pmsle_u8x8, int8x8_t, uint8x8_t, <=)
+__packed_cmp(pmsleu_u8x8, uint8x8_t, uint8x8_t, <=)
+__packed_cmp(pmseq_i16x4_u16x4, int16x4_t, uint16x4_t, ==)
+__packed_cmp(pmseq_u16x4_u16x4, uint16x4_t, uint16x4_t, ==)
+__packed_cmp(pmsne_i16x4_u16x4, int16x4_t, uint16x4_t, !=)
+__packed_cmp(pmsne_u16x4_u16x4, uint16x4_t, uint16x4_t, !=)
+__packed_cmp(pmslt_u16x4, int16x4_t, uint16x4_t, <)
+__packed_cmp(pmsltu_u16x4, uint16x4_t, uint16x4_t, <)
+__packed_cmp(pmsgt_u16x4, int16x4_t, uint16x4_t, >)
+__packed_cmp(pmsgtu_u16x4, uint16x4_t, uint16x4_t, >)
+__packed_cmp(pmsge_u16x4, int16x4_t, uint16x4_t, >=)
+__packed_cmp(pmsgeu_u16x4, uint16x4_t, uint16x4_t, >=)
+__packed_cmp(pmsle_u16x4, int16x4_t, uint16x4_t, <=)
+__packed_cmp(pmsleu_u16x4, uint16x4_t, uint16x4_t, <=)
+__packed_cmp(pmseq_i32x2_u32x2, int32x2_t, uint32x2_t, ==)
+__packed_cmp(pmseq_u32x2_u32x2, uint32x2_t, uint32x2_t, ==)
+__packed_cmp(pmsne_i32x2_u32x2, int32x2_t, uint32x2_t, !=)
+__packed_cmp(pmsne_u32x2_u32x2, uint32x2_t, uint32x2_t, !=)
+__packed_cmp(pmslt_u32x2, int32x2_t, uint32x2_t, <)
+__packed_cmp(pmsltu_u32x2, uint32x2_t, uint32x2_t, <)
+__packed_cmp(pmsgt_u32x2, int32x2_t, uint32x2_t, >)
+__packed_cmp(pmsgtu_u32x2, uint32x2_t, uint32x2_t, >)
+__packed_cmp(pmsge_u32x2, int32x2_t, uint32x2_t, >=)
+__packed_cmp(pmsgeu_u32x2, uint32x2_t, uint32x2_t, >=)
+__packed_cmp(pmsle_u32x2, int32x2_t, uint32x2_t, <=)
+__packed_cmp(pmsleu_u32x2, uint32x2_t, uint32x2_t, <=)
+
 /* Packed Shifts (32-bit) */
 __packed_shift8(psll_s_u8x4, uint8x4_t, <<)
 __packed_shift8(psll_s_i8x4, int8x4_t, <<)
@@ -297,6 +367,7 @@ __packed_unary_op(pnot_u32x2, uint32x2_t, ~)
 #undef __packed_binary_builtin
 #undef __packed_sh1add
 #undef __packed_sh1sadd
+#undef __packed_cmp
 #undef __DEFAULT_FN_ATTRS
 
 #if defined(__cplusplus)
diff --git a/clang/test/CodeGen/RISCV/rvp-intrinsics.c 
b/clang/test/CodeGen/RISCV/rvp-intrinsics.c
index 73db0bee19def..71fb5eb1f0e25 100644
--- a/clang/test/CodeGen/RISCV/rvp-intrinsics.c
+++ b/clang/test/CodeGen/RISCV/rvp-intrinsics.c
@@ -2107,6 +2107,1450 @@ uint16x4_t test_pmaxu_u16x4(uint16x4_t a, uint16x4_t 
b) {
 uint32x2_t test_pmaxu_u32x2(uint32x2_t a, uint32x2_t b) {
   return __riscv_pmaxu_u32x2(a, b);
 }
+/* Packed Comparison (32-bit) */
+
+// RV32-LABEL: define dso_local i32 @test_pmseq_i8x4_u8x4(
+// RV32-SAME: i32 noundef [[A_COERCE:%.*]], i32 noundef [[B_COERCE:%.*]]) 
#[[ATTR0]] {
+// RV32-NEXT:  [[ENTRY:.*:]]
+// RV32-NEXT:    [[TMP0:%.*]] = bitcast i32 [[A_COERCE]] to <4 x i8>
+// RV32-NEXT:    [[TMP1:%.*]] = bitcast i32 [[B_COERCE]] to <4 x i8>
+// RV32-NEXT:    [[CMP_I:%.*]] = icmp eq <4 x i8> [[TMP0]], [[TMP1]]
+// RV32-NEXT:    [[SEXT_I:%.*]] = sext <4 x i1> [[CMP_I]] to <4 x i8>
+// RV32-NEXT:    [[TMP2:%.*]] = bitcast <4 x i8> [[SEXT_I]] to i32
+// RV32-NEXT:    ret i32 [[TMP2]]
+//
+// RV64-LABEL: define dso_local i32 @test_pmseq_i8x4_u8x4(
+// RV64-SAME: i32 noundef [[A_COERCE:%.*]], i32 noundef [[B_COERCE:%.*]]) 
#[[ATTR0]] {
+// RV64-NEXT:  [[ENTRY:.*:]]
+// RV64-NEXT:    [[TMP0:%.*]] = bitcast i32 [[A_COERCE]] to <4 x i8>
+// RV64-NEXT:    [[TMP1:%.*]] = bitcast i32 [[B_COERCE]] to <4 x i8>
+// RV64-NEXT:    [[CMP_I:%.*]] = icmp eq <4 x i8> [[TMP0]], [[TMP1]]
+// RV64-NEXT:    [[SEXT_I:%.*]] = sext <4 x i1> [[CMP_I]] to <4 x i8>
+// RV64-NEXT:    [[TMP2:%.*]] = bitcast <4 x i8> [[SEXT_I]] to i32
+// RV64-NEXT:    ret i32 [[TMP2]]
+//
+uint8x4_t test_pmseq_i8x4_u8x4(int8x4_t a, int8x4_t b) {
+  return __riscv_pmseq_i8x4_u8x4(a, b);
+}
+
+// RV32-LABEL: define dso_local i32 @test_pmseq_u8x4_u8x4(
+// RV32-SAME: i32 noundef [[A_COERCE:%.*]], i32 noundef [[B_COERCE:%.*]]) 
#[[ATTR0]] {
+// RV32-NEXT:  [[ENTRY:.*:]]
+// RV32-NEXT:    [[TMP0:%.*]] = bitcast i32 [[A_COERCE]] to <4 x i8>
+// RV32-NEXT:    [[TMP1:%.*]] = bitcast i32 [[B_COERCE]] to <4 x i8>
+// RV32-NEXT:    [[CMP_I:%.*]] = icmp eq <4 x i8> [[TMP0]], [[TMP1]]
+// RV32-NEXT:    [[SEXT_I:%.*]] = sext <4 x i1> [[CMP_I]] to <4 x i8>
+// RV32-NEXT:    [[TMP2:%.*]] = bitcast <4 x i8> [[SEXT_I]] to i32
+// RV32-NEXT:    ret i32 [[TMP2]]
+//
+// RV64-LABEL: define dso_local i32 @test_pmseq_u8x4_u8x4(
+// RV64-SAME: i32 noundef [[A_COERCE:%.*]], i32 noundef [[B_COERCE:%.*]]) 
#[[ATTR0]] {
+// RV64-NEXT:  [[ENTRY:.*:]]
+// RV64-NEXT:    [[TMP0:%.*]] = bitcast i32 [[A_COERCE]] to <4 x i8>
+// RV64-NEXT:    [[TMP1:%.*]] = bitcast i32 [[B_COERCE]] to <4 x i8>
+// RV64-NEXT:    [[CMP_I:%.*]] = icmp eq <4 x i8> [[TMP0]], [[TMP1]]
+// RV64-NEXT:    [[SEXT_I:%.*]] = sext <4 x i1> [[CMP_I]] to <4 x i8>
+// RV64-NEXT:    [[TMP2:%.*]] = bitcast <4 x i8> [[SEXT_I]] to i32
+// RV64-NEXT:    ret i32 [[TMP2]]
+//
+uint8x4_t test_pmseq_u8x4_u8x4(uint8x4_t a, uint8x4_t b) {
+  return __riscv_pmseq_u8x4_u8x4(a, b);
+}
+
+// RV32-LABEL: define dso_local i32 @test_pmsne_i8x4_u8x4(
+// RV32-SAME: i32 noundef [[A_COERCE:%.*]], i32 noundef [[B_COERCE:%.*]]) 
#[[ATTR0]] {
+// RV32-NEXT:  [[ENTRY:.*:]]
+// RV32-NEXT:    [[TMP0:%.*]] = bitcast i32 [[A_COERCE]] to <4 x i8>
+// RV32-NEXT:    [[TMP1:%.*]] = bitcast i32 [[B_COERCE]] to <4 x i8>
+// RV32-NEXT:    [[CMP_I:%.*]] = icmp ne <4 x i8> [[TMP0]], [[TMP1]]
+// RV32-NEXT:    [[SEXT_I:%.*]] = sext <4 x i1> [[CMP_I]] to <4 x i8>
+// RV32-NEXT:    [[TMP2:%.*]] = bitcast <4 x i8> [[SEXT_I]] to i32
+// RV32-NEXT:    ret i32 [[TMP2]]
+//
+// RV64-LABEL: define dso_local i32 @test_pmsne_i8x4_u8x4(
+// RV64-SAME: i32 noundef [[A_COERCE:%.*]], i32 noundef [[B_COERCE:%.*]]) 
#[[ATTR0]] {
+// RV64-NEXT:  [[ENTRY:.*:]]
+// RV64-NEXT:    [[TMP0:%.*]] = bitcast i32 [[A_COERCE]] to <4 x i8>
+// RV64-NEXT:    [[TMP1:%.*]] = bitcast i32 [[B_COERCE]] to <4 x i8>
+// RV64-NEXT:    [[CMP_I:%.*]] = icmp ne <4 x i8> [[TMP0]], [[TMP1]]
+// RV64-NEXT:    [[SEXT_I:%.*]] = sext <4 x i1> [[CMP_I]] to <4 x i8>
+// RV64-NEXT:    [[TMP2:%.*]] = bitcast <4 x i8> [[SEXT_I]] to i32
+// RV64-NEXT:    ret i32 [[TMP2]]
+//
+uint8x4_t test_pmsne_i8x4_u8x4(int8x4_t a, int8x4_t b) {
+  return __riscv_pmsne_i8x4_u8x4(a, b);
+}
+
+// RV32-LABEL: define dso_local i32 @test_pmsne_u8x4_u8x4(
+// RV32-SAME: i32 noundef [[A_COERCE:%.*]], i32 noundef [[B_COERCE:%.*]]) 
#[[ATTR0]] {
+// RV32-NEXT:  [[ENTRY:.*:]]
+// RV32-NEXT:    [[TMP0:%.*]] = bitcast i32 [[A_COERCE]] to <4 x i8>
+// RV32-NEXT:    [[TMP1:%.*]] = bitcast i32 [[B_COERCE]] to <4 x i8>
+// RV32-NEXT:    [[CMP_I:%.*]] = icmp ne <4 x i8> [[TMP0]], [[TMP1]]
+// RV32-NEXT:    [[SEXT_I:%.*]] = sext <4 x i1> [[CMP_I]] to <4 x i8>
+// RV32-NEXT:    [[TMP2:%.*]] = bitcast <4 x i8> [[SEXT_I]] to i32
+// RV32-NEXT:    ret i32 [[TMP2]]
+//
+// RV64-LABEL: define dso_local i32 @test_pmsne_u8x4_u8x4(
+// RV64-SAME: i32 noundef [[A_COERCE:%.*]], i32 noundef [[B_COERCE:%.*]]) 
#[[ATTR0]] {
+// RV64-NEXT:  [[ENTRY:.*:]]
+// RV64-NEXT:    [[TMP0:%.*]] = bitcast i32 [[A_COERCE]] to <4 x i8>
+// RV64-NEXT:    [[TMP1:%.*]] = bitcast i32 [[B_COERCE]] to <4 x i8>
+// RV64-NEXT:    [[CMP_I:%.*]] = icmp ne <4 x i8> [[TMP0]], [[TMP1]]
+// RV64-NEXT:    [[SEXT_I:%.*]] = sext <4 x i1> [[CMP_I]] to <4 x i8>
+// RV64-NEXT:    [[TMP2:%.*]] = bitcast <4 x i8> [[SEXT_I]] to i32
+// RV64-NEXT:    ret i32 [[TMP2]]
+//
+uint8x4_t test_pmsne_u8x4_u8x4(uint8x4_t a, uint8x4_t b) {
+  return __riscv_pmsne_u8x4_u8x4(a, b);
+}
+
+// RV32-LABEL: define dso_local i32 @test_pmslt_u8x4(
+// RV32-SAME: i32 noundef [[A_COERCE:%.*]], i32 noundef [[B_COERCE:%.*]]) 
#[[ATTR0]] {
+// RV32-NEXT:  [[ENTRY:.*:]]
+// RV32-NEXT:    [[TMP0:%.*]] = bitcast i32 [[A_COERCE]] to <4 x i8>
+// RV32-NEXT:    [[TMP1:%.*]] = bitcast i32 [[B_COERCE]] to <4 x i8>
+// RV32-NEXT:    [[CMP_I:%.*]] = icmp slt <4 x i8> [[TMP0]], [[TMP1]]
+// RV32-NEXT:    [[SEXT_I:%.*]] = sext <4 x i1> [[CMP_I]] to <4 x i8>
+// RV32-NEXT:    [[TMP2:%.*]] = bitcast <4 x i8> [[SEXT_I]] to i32
+// RV32-NEXT:    ret i32 [[TMP2]]
+//
+// RV64-LABEL: define dso_local i32 @test_pmslt_u8x4(
+// RV64-SAME: i32 noundef [[A_COERCE:%.*]], i32 noundef [[B_COERCE:%.*]]) 
#[[ATTR0]] {
+// RV64-NEXT:  [[ENTRY:.*:]]
+// RV64-NEXT:    [[TMP0:%.*]] = bitcast i32 [[A_COERCE]] to <4 x i8>
+// RV64-NEXT:    [[TMP1:%.*]] = bitcast i32 [[B_COERCE]] to <4 x i8>
+// RV64-NEXT:    [[CMP_I:%.*]] = icmp slt <4 x i8> [[TMP0]], [[TMP1]]
+// RV64-NEXT:    [[SEXT_I:%.*]] = sext <4 x i1> [[CMP_I]] to <4 x i8>
+// RV64-NEXT:    [[TMP2:%.*]] = bitcast <4 x i8> [[SEXT_I]] to i32
+// RV64-NEXT:    ret i32 [[TMP2]]
+//
+uint8x4_t test_pmslt_u8x4(int8x4_t a, int8x4_t b) {
+  return __riscv_pmslt_u8x4(a, b);
+}
+
+// RV32-LABEL: define dso_local i32 @test_pmsltu_u8x4(
+// RV32-SAME: i32 noundef [[A_COERCE:%.*]], i32 noundef [[B_COERCE:%.*]]) 
#[[ATTR0]] {
+// RV32-NEXT:  [[ENTRY:.*:]]
+// RV32-NEXT:    [[TMP0:%.*]] = bitcast i32 [[A_COERCE]] to <4 x i8>
+// RV32-NEXT:    [[TMP1:%.*]] = bitcast i32 [[B_COERCE]] to <4 x i8>
+// RV32-NEXT:    [[CMP_I:%.*]] = icmp ult <4 x i8> [[TMP0]], [[TMP1]]
+// RV32-NEXT:    [[SEXT_I:%.*]] = sext <4 x i1> [[CMP_I]] to <4 x i8>
+// RV32-NEXT:    [[TMP2:%.*]] = bitcast <4 x i8> [[SEXT_I]] to i32
+// RV32-NEXT:    ret i32 [[TMP2]]
+//
+// RV64-LABEL: define dso_local i32 @test_pmsltu_u8x4(
+// RV64-SAME: i32 noundef [[A_COERCE:%.*]], i32 noundef [[B_COERCE:%.*]]) 
#[[ATTR0]] {
+// RV64-NEXT:  [[ENTRY:.*:]]
+// RV64-NEXT:    [[TMP0:%.*]] = bitcast i32 [[A_COERCE]] to <4 x i8>
+// RV64-NEXT:    [[TMP1:%.*]] = bitcast i32 [[B_COERCE]] to <4 x i8>
+// RV64-NEXT:    [[CMP_I:%.*]] = icmp ult <4 x i8> [[TMP0]], [[TMP1]]
+// RV64-NEXT:    [[SEXT_I:%.*]] = sext <4 x i1> [[CMP_I]] to <4 x i8>
+// RV64-NEXT:    [[TMP2:%.*]] = bitcast <4 x i8> [[SEXT_I]] to i32
+// RV64-NEXT:    ret i32 [[TMP2]]
+//
+uint8x4_t test_pmsltu_u8x4(uint8x4_t a, uint8x4_t b) {
+  return __riscv_pmsltu_u8x4(a, b);
+}
+
+// RV32-LABEL: define dso_local i32 @test_pmsgt_u8x4(
+// RV32-SAME: i32 noundef [[A_COERCE:%.*]], i32 noundef [[B_COERCE:%.*]]) 
#[[ATTR0]] {
+// RV32-NEXT:  [[ENTRY:.*:]]
+// RV32-NEXT:    [[TMP0:%.*]] = bitcast i32 [[A_COERCE]] to <4 x i8>
+// RV32-NEXT:    [[TMP1:%.*]] = bitcast i32 [[B_COERCE]] to <4 x i8>
+// RV32-NEXT:    [[CMP_I:%.*]] = icmp sgt <4 x i8> [[TMP0]], [[TMP1]]
+// RV32-NEXT:    [[SEXT_I:%.*]] = sext <4 x i1> [[CMP_I]] to <4 x i8>
+// RV32-NEXT:    [[TMP2:%.*]] = bitcast <4 x i8> [[SEXT_I]] to i32
+// RV32-NEXT:    ret i32 [[TMP2]]
+//
+// RV64-LABEL: define dso_local i32 @test_pmsgt_u8x4(
+// RV64-SAME: i32 noundef [[A_COERCE:%.*]], i32 noundef [[B_COERCE:%.*]]) 
#[[ATTR0]] {
+// RV64-NEXT:  [[ENTRY:.*:]]
+// RV64-NEXT:    [[TMP0:%.*]] = bitcast i32 [[A_COERCE]] to <4 x i8>
+// RV64-NEXT:    [[TMP1:%.*]] = bitcast i32 [[B_COERCE]] to <4 x i8>
+// RV64-NEXT:    [[CMP_I:%.*]] = icmp sgt <4 x i8> [[TMP0]], [[TMP1]]
+// RV64-NEXT:    [[SEXT_I:%.*]] = sext <4 x i1> [[CMP_I]] to <4 x i8>
+// RV64-NEXT:    [[TMP2:%.*]] = bitcast <4 x i8> [[SEXT_I]] to i32
+// RV64-NEXT:    ret i32 [[TMP2]]
+//
+uint8x4_t test_pmsgt_u8x4(int8x4_t a, int8x4_t b) {
+  return __riscv_pmsgt_u8x4(a, b);
+}
+
+// RV32-LABEL: define dso_local i32 @test_pmsgtu_u8x4(
+// RV32-SAME: i32 noundef [[A_COERCE:%.*]], i32 noundef [[B_COERCE:%.*]]) 
#[[ATTR0]] {
+// RV32-NEXT:  [[ENTRY:.*:]]
+// RV32-NEXT:    [[TMP0:%.*]] = bitcast i32 [[A_COERCE]] to <4 x i8>
+// RV32-NEXT:    [[TMP1:%.*]] = bitcast i32 [[B_COERCE]] to <4 x i8>
+// RV32-NEXT:    [[CMP_I:%.*]] = icmp ugt <4 x i8> [[TMP0]], [[TMP1]]
+// RV32-NEXT:    [[SEXT_I:%.*]] = sext <4 x i1> [[CMP_I]] to <4 x i8>
+// RV32-NEXT:    [[TMP2:%.*]] = bitcast <4 x i8> [[SEXT_I]] to i32
+// RV32-NEXT:    ret i32 [[TMP2]]
+//
+// RV64-LABEL: define dso_local i32 @test_pmsgtu_u8x4(
+// RV64-SAME: i32 noundef [[A_COERCE:%.*]], i32 noundef [[B_COERCE:%.*]]) 
#[[ATTR0]] {
+// RV64-NEXT:  [[ENTRY:.*:]]
+// RV64-NEXT:    [[TMP0:%.*]] = bitcast i32 [[A_COERCE]] to <4 x i8>
+// RV64-NEXT:    [[TMP1:%.*]] = bitcast i32 [[B_COERCE]] to <4 x i8>
+// RV64-NEXT:    [[CMP_I:%.*]] = icmp ugt <4 x i8> [[TMP0]], [[TMP1]]
+// RV64-NEXT:    [[SEXT_I:%.*]] = sext <4 x i1> [[CMP_I]] to <4 x i8>
+// RV64-NEXT:    [[TMP2:%.*]] = bitcast <4 x i8> [[SEXT_I]] to i32
+// RV64-NEXT:    ret i32 [[TMP2]]
+//
+uint8x4_t test_pmsgtu_u8x4(uint8x4_t a, uint8x4_t b) {
+  return __riscv_pmsgtu_u8x4(a, b);
+}
+
+// RV32-LABEL: define dso_local i32 @test_pmsge_u8x4(
+// RV32-SAME: i32 noundef [[A_COERCE:%.*]], i32 noundef [[B_COERCE:%.*]]) 
#[[ATTR0]] {
+// RV32-NEXT:  [[ENTRY:.*:]]
+// RV32-NEXT:    [[TMP0:%.*]] = bitcast i32 [[A_COERCE]] to <4 x i8>
+// RV32-NEXT:    [[TMP1:%.*]] = bitcast i32 [[B_COERCE]] to <4 x i8>
+// RV32-NEXT:    [[CMP_I:%.*]] = icmp sge <4 x i8> [[TMP0]], [[TMP1]]
+// RV32-NEXT:    [[SEXT_I:%.*]] = sext <4 x i1> [[CMP_I]] to <4 x i8>
+// RV32-NEXT:    [[TMP2:%.*]] = bitcast <4 x i8> [[SEXT_I]] to i32
+// RV32-NEXT:    ret i32 [[TMP2]]
+//
+// RV64-LABEL: define dso_local i32 @test_pmsge_u8x4(
+// RV64-SAME: i32 noundef [[A_COERCE:%.*]], i32 noundef [[B_COERCE:%.*]]) 
#[[ATTR0]] {
+// RV64-NEXT:  [[ENTRY:.*:]]
+// RV64-NEXT:    [[TMP0:%.*]] = bitcast i32 [[A_COERCE]] to <4 x i8>
+// RV64-NEXT:    [[TMP1:%.*]] = bitcast i32 [[B_COERCE]] to <4 x i8>
+// RV64-NEXT:    [[CMP_I:%.*]] = icmp sge <4 x i8> [[TMP0]], [[TMP1]]
+// RV64-NEXT:    [[SEXT_I:%.*]] = sext <4 x i1> [[CMP_I]] to <4 x i8>
+// RV64-NEXT:    [[TMP2:%.*]] = bitcast <4 x i8> [[SEXT_I]] to i32
+// RV64-NEXT:    ret i32 [[TMP2]]
+//
+uint8x4_t test_pmsge_u8x4(int8x4_t a, int8x4_t b) {
+  return __riscv_pmsge_u8x4(a, b);
+}
+
+// RV32-LABEL: define dso_local i32 @test_pmsgeu_u8x4(
+// RV32-SAME: i32 noundef [[A_COERCE:%.*]], i32 noundef [[B_COERCE:%.*]]) 
#[[ATTR0]] {
+// RV32-NEXT:  [[ENTRY:.*:]]
+// RV32-NEXT:    [[TMP0:%.*]] = bitcast i32 [[A_COERCE]] to <4 x i8>
+// RV32-NEXT:    [[TMP1:%.*]] = bitcast i32 [[B_COERCE]] to <4 x i8>
+// RV32-NEXT:    [[CMP_I:%.*]] = icmp uge <4 x i8> [[TMP0]], [[TMP1]]
+// RV32-NEXT:    [[SEXT_I:%.*]] = sext <4 x i1> [[CMP_I]] to <4 x i8>
+// RV32-NEXT:    [[TMP2:%.*]] = bitcast <4 x i8> [[SEXT_I]] to i32
+// RV32-NEXT:    ret i32 [[TMP2]]
+//
+// RV64-LABEL: define dso_local i32 @test_pmsgeu_u8x4(
+// RV64-SAME: i32 noundef [[A_COERCE:%.*]], i32 noundef [[B_COERCE:%.*]]) 
#[[ATTR0]] {
+// RV64-NEXT:  [[ENTRY:.*:]]
+// RV64-NEXT:    [[TMP0:%.*]] = bitcast i32 [[A_COERCE]] to <4 x i8>
+// RV64-NEXT:    [[TMP1:%.*]] = bitcast i32 [[B_COERCE]] to <4 x i8>
+// RV64-NEXT:    [[CMP_I:%.*]] = icmp uge <4 x i8> [[TMP0]], [[TMP1]]
+// RV64-NEXT:    [[SEXT_I:%.*]] = sext <4 x i1> [[CMP_I]] to <4 x i8>
+// RV64-NEXT:    [[TMP2:%.*]] = bitcast <4 x i8> [[SEXT_I]] to i32
+// RV64-NEXT:    ret i32 [[TMP2]]
+//
+uint8x4_t test_pmsgeu_u8x4(uint8x4_t a, uint8x4_t b) {
+  return __riscv_pmsgeu_u8x4(a, b);
+}
+
+// RV32-LABEL: define dso_local i32 @test_pmsle_u8x4(
+// RV32-SAME: i32 noundef [[A_COERCE:%.*]], i32 noundef [[B_COERCE:%.*]]) 
#[[ATTR0]] {
+// RV32-NEXT:  [[ENTRY:.*:]]
+// RV32-NEXT:    [[TMP0:%.*]] = bitcast i32 [[A_COERCE]] to <4 x i8>
+// RV32-NEXT:    [[TMP1:%.*]] = bitcast i32 [[B_COERCE]] to <4 x i8>
+// RV32-NEXT:    [[CMP_I:%.*]] = icmp sle <4 x i8> [[TMP0]], [[TMP1]]
+// RV32-NEXT:    [[SEXT_I:%.*]] = sext <4 x i1> [[CMP_I]] to <4 x i8>
+// RV32-NEXT:    [[TMP2:%.*]] = bitcast <4 x i8> [[SEXT_I]] to i32
+// RV32-NEXT:    ret i32 [[TMP2]]
+//
+// RV64-LABEL: define dso_local i32 @test_pmsle_u8x4(
+// RV64-SAME: i32 noundef [[A_COERCE:%.*]], i32 noundef [[B_COERCE:%.*]]) 
#[[ATTR0]] {
+// RV64-NEXT:  [[ENTRY:.*:]]
+// RV64-NEXT:    [[TMP0:%.*]] = bitcast i32 [[A_COERCE]] to <4 x i8>
+// RV64-NEXT:    [[TMP1:%.*]] = bitcast i32 [[B_COERCE]] to <4 x i8>
+// RV64-NEXT:    [[CMP_I:%.*]] = icmp sle <4 x i8> [[TMP0]], [[TMP1]]
+// RV64-NEXT:    [[SEXT_I:%.*]] = sext <4 x i1> [[CMP_I]] to <4 x i8>
+// RV64-NEXT:    [[TMP2:%.*]] = bitcast <4 x i8> [[SEXT_I]] to i32
+// RV64-NEXT:    ret i32 [[TMP2]]
+//
+uint8x4_t test_pmsle_u8x4(int8x4_t a, int8x4_t b) {
+  return __riscv_pmsle_u8x4(a, b);
+}
+
+// RV32-LABEL: define dso_local i32 @test_pmsleu_u8x4(
+// RV32-SAME: i32 noundef [[A_COERCE:%.*]], i32 noundef [[B_COERCE:%.*]]) 
#[[ATTR0]] {
+// RV32-NEXT:  [[ENTRY:.*:]]
+// RV32-NEXT:    [[TMP0:%.*]] = bitcast i32 [[A_COERCE]] to <4 x i8>
+// RV32-NEXT:    [[TMP1:%.*]] = bitcast i32 [[B_COERCE]] to <4 x i8>
+// RV32-NEXT:    [[CMP_I:%.*]] = icmp ule <4 x i8> [[TMP0]], [[TMP1]]
+// RV32-NEXT:    [[SEXT_I:%.*]] = sext <4 x i1> [[CMP_I]] to <4 x i8>
+// RV32-NEXT:    [[TMP2:%.*]] = bitcast <4 x i8> [[SEXT_I]] to i32
+// RV32-NEXT:    ret i32 [[TMP2]]
+//
+// RV64-LABEL: define dso_local i32 @test_pmsleu_u8x4(
+// RV64-SAME: i32 noundef [[A_COERCE:%.*]], i32 noundef [[B_COERCE:%.*]]) 
#[[ATTR0]] {
+// RV64-NEXT:  [[ENTRY:.*:]]
+// RV64-NEXT:    [[TMP0:%.*]] = bitcast i32 [[A_COERCE]] to <4 x i8>
+// RV64-NEXT:    [[TMP1:%.*]] = bitcast i32 [[B_COERCE]] to <4 x i8>
+// RV64-NEXT:    [[CMP_I:%.*]] = icmp ule <4 x i8> [[TMP0]], [[TMP1]]
+// RV64-NEXT:    [[SEXT_I:%.*]] = sext <4 x i1> [[CMP_I]] to <4 x i8>
+// RV64-NEXT:    [[TMP2:%.*]] = bitcast <4 x i8> [[SEXT_I]] to i32
+// RV64-NEXT:    ret i32 [[TMP2]]
+//
+uint8x4_t test_pmsleu_u8x4(uint8x4_t a, uint8x4_t b) {
+  return __riscv_pmsleu_u8x4(a, b);
+}
+
+// RV32-LABEL: define dso_local i32 @test_pmseq_i16x2_u16x2(
+// RV32-SAME: i32 noundef [[A_COERCE:%.*]], i32 noundef [[B_COERCE:%.*]]) 
#[[ATTR0]] {
+// RV32-NEXT:  [[ENTRY:.*:]]
+// RV32-NEXT:    [[TMP0:%.*]] = bitcast i32 [[A_COERCE]] to <2 x i16>
+// RV32-NEXT:    [[TMP1:%.*]] = bitcast i32 [[B_COERCE]] to <2 x i16>
+// RV32-NEXT:    [[CMP_I:%.*]] = icmp eq <2 x i16> [[TMP0]], [[TMP1]]
+// RV32-NEXT:    [[SEXT_I:%.*]] = sext <2 x i1> [[CMP_I]] to <2 x i16>
+// RV32-NEXT:    [[TMP2:%.*]] = bitcast <2 x i16> [[SEXT_I]] to i32
+// RV32-NEXT:    ret i32 [[TMP2]]
+//
+// RV64-LABEL: define dso_local i32 @test_pmseq_i16x2_u16x2(
+// RV64-SAME: i32 noundef [[A_COERCE:%.*]], i32 noundef [[B_COERCE:%.*]]) 
#[[ATTR0]] {
+// RV64-NEXT:  [[ENTRY:.*:]]
+// RV64-NEXT:    [[TMP0:%.*]] = bitcast i32 [[A_COERCE]] to <2 x i16>
+// RV64-NEXT:    [[TMP1:%.*]] = bitcast i32 [[B_COERCE]] to <2 x i16>
+// RV64-NEXT:    [[CMP_I:%.*]] = icmp eq <2 x i16> [[TMP0]], [[TMP1]]
+// RV64-NEXT:    [[SEXT_I:%.*]] = sext <2 x i1> [[CMP_I]] to <2 x i16>
+// RV64-NEXT:    [[TMP2:%.*]] = bitcast <2 x i16> [[SEXT_I]] to i32
+// RV64-NEXT:    ret i32 [[TMP2]]
+//
+uint16x2_t test_pmseq_i16x2_u16x2(int16x2_t a, int16x2_t b) {
+  return __riscv_pmseq_i16x2_u16x2(a, b);
+}
+
+// RV32-LABEL: define dso_local i32 @test_pmseq_u16x2_u16x2(
+// RV32-SAME: i32 noundef [[A_COERCE:%.*]], i32 noundef [[B_COERCE:%.*]]) 
#[[ATTR0]] {
+// RV32-NEXT:  [[ENTRY:.*:]]
+// RV32-NEXT:    [[TMP0:%.*]] = bitcast i32 [[A_COERCE]] to <2 x i16>
+// RV32-NEXT:    [[TMP1:%.*]] = bitcast i32 [[B_COERCE]] to <2 x i16>
+// RV32-NEXT:    [[CMP_I:%.*]] = icmp eq <2 x i16> [[TMP0]], [[TMP1]]
+// RV32-NEXT:    [[SEXT_I:%.*]] = sext <2 x i1> [[CMP_I]] to <2 x i16>
+// RV32-NEXT:    [[TMP2:%.*]] = bitcast <2 x i16> [[SEXT_I]] to i32
+// RV32-NEXT:    ret i32 [[TMP2]]
+//
+// RV64-LABEL: define dso_local i32 @test_pmseq_u16x2_u16x2(
+// RV64-SAME: i32 noundef [[A_COERCE:%.*]], i32 noundef [[B_COERCE:%.*]]) 
#[[ATTR0]] {
+// RV64-NEXT:  [[ENTRY:.*:]]
+// RV64-NEXT:    [[TMP0:%.*]] = bitcast i32 [[A_COERCE]] to <2 x i16>
+// RV64-NEXT:    [[TMP1:%.*]] = bitcast i32 [[B_COERCE]] to <2 x i16>
+// RV64-NEXT:    [[CMP_I:%.*]] = icmp eq <2 x i16> [[TMP0]], [[TMP1]]
+// RV64-NEXT:    [[SEXT_I:%.*]] = sext <2 x i1> [[CMP_I]] to <2 x i16>
+// RV64-NEXT:    [[TMP2:%.*]] = bitcast <2 x i16> [[SEXT_I]] to i32
+// RV64-NEXT:    ret i32 [[TMP2]]
+//
+uint16x2_t test_pmseq_u16x2_u16x2(uint16x2_t a, uint16x2_t b) {
+  return __riscv_pmseq_u16x2_u16x2(a, b);
+}
+
+// RV32-LABEL: define dso_local i32 @test_pmsne_i16x2_u16x2(
+// RV32-SAME: i32 noundef [[A_COERCE:%.*]], i32 noundef [[B_COERCE:%.*]]) 
#[[ATTR0]] {
+// RV32-NEXT:  [[ENTRY:.*:]]
+// RV32-NEXT:    [[TMP0:%.*]] = bitcast i32 [[A_COERCE]] to <2 x i16>
+// RV32-NEXT:    [[TMP1:%.*]] = bitcast i32 [[B_COERCE]] to <2 x i16>
+// RV32-NEXT:    [[CMP_I:%.*]] = icmp ne <2 x i16> [[TMP0]], [[TMP1]]
+// RV32-NEXT:    [[SEXT_I:%.*]] = sext <2 x i1> [[CMP_I]] to <2 x i16>
+// RV32-NEXT:    [[TMP2:%.*]] = bitcast <2 x i16> [[SEXT_I]] to i32
+// RV32-NEXT:    ret i32 [[TMP2]]
+//
+// RV64-LABEL: define dso_local i32 @test_pmsne_i16x2_u16x2(
+// RV64-SAME: i32 noundef [[A_COERCE:%.*]], i32 noundef [[B_COERCE:%.*]]) 
#[[ATTR0]] {
+// RV64-NEXT:  [[ENTRY:.*:]]
+// RV64-NEXT:    [[TMP0:%.*]] = bitcast i32 [[A_COERCE]] to <2 x i16>
+// RV64-NEXT:    [[TMP1:%.*]] = bitcast i32 [[B_COERCE]] to <2 x i16>
+// RV64-NEXT:    [[CMP_I:%.*]] = icmp ne <2 x i16> [[TMP0]], [[TMP1]]
+// RV64-NEXT:    [[SEXT_I:%.*]] = sext <2 x i1> [[CMP_I]] to <2 x i16>
+// RV64-NEXT:    [[TMP2:%.*]] = bitcast <2 x i16> [[SEXT_I]] to i32
+// RV64-NEXT:    ret i32 [[TMP2]]
+//
+uint16x2_t test_pmsne_i16x2_u16x2(int16x2_t a, int16x2_t b) {
+  return __riscv_pmsne_i16x2_u16x2(a, b);
+}
+
+// RV32-LABEL: define dso_local i32 @test_pmsne_u16x2_u16x2(
+// RV32-SAME: i32 noundef [[A_COERCE:%.*]], i32 noundef [[B_COERCE:%.*]]) 
#[[ATTR0]] {
+// RV32-NEXT:  [[ENTRY:.*:]]
+// RV32-NEXT:    [[TMP0:%.*]] = bitcast i32 [[A_COERCE]] to <2 x i16>
+// RV32-NEXT:    [[TMP1:%.*]] = bitcast i32 [[B_COERCE]] to <2 x i16>
+// RV32-NEXT:    [[CMP_I:%.*]] = icmp ne <2 x i16> [[TMP0]], [[TMP1]]
+// RV32-NEXT:    [[SEXT_I:%.*]] = sext <2 x i1> [[CMP_I]] to <2 x i16>
+// RV32-NEXT:    [[TMP2:%.*]] = bitcast <2 x i16> [[SEXT_I]] to i32
+// RV32-NEXT:    ret i32 [[TMP2]]
+//
+// RV64-LABEL: define dso_local i32 @test_pmsne_u16x2_u16x2(
+// RV64-SAME: i32 noundef [[A_COERCE:%.*]], i32 noundef [[B_COERCE:%.*]]) 
#[[ATTR0]] {
+// RV64-NEXT:  [[ENTRY:.*:]]
+// RV64-NEXT:    [[TMP0:%.*]] = bitcast i32 [[A_COERCE]] to <2 x i16>
+// RV64-NEXT:    [[TMP1:%.*]] = bitcast i32 [[B_COERCE]] to <2 x i16>
+// RV64-NEXT:    [[CMP_I:%.*]] = icmp ne <2 x i16> [[TMP0]], [[TMP1]]
+// RV64-NEXT:    [[SEXT_I:%.*]] = sext <2 x i1> [[CMP_I]] to <2 x i16>
+// RV64-NEXT:    [[TMP2:%.*]] = bitcast <2 x i16> [[SEXT_I]] to i32
+// RV64-NEXT:    ret i32 [[TMP2]]
+//
+uint16x2_t test_pmsne_u16x2_u16x2(uint16x2_t a, uint16x2_t b) {
+  return __riscv_pmsne_u16x2_u16x2(a, b);
+}
+
+// RV32-LABEL: define dso_local i32 @test_pmslt_u16x2(
+// RV32-SAME: i32 noundef [[A_COERCE:%.*]], i32 noundef [[B_COERCE:%.*]]) 
#[[ATTR0]] {
+// RV32-NEXT:  [[ENTRY:.*:]]
+// RV32-NEXT:    [[TMP0:%.*]] = bitcast i32 [[A_COERCE]] to <2 x i16>
+// RV32-NEXT:    [[TMP1:%.*]] = bitcast i32 [[B_COERCE]] to <2 x i16>
+// RV32-NEXT:    [[CMP_I:%.*]] = icmp slt <2 x i16> [[TMP0]], [[TMP1]]
+// RV32-NEXT:    [[SEXT_I:%.*]] = sext <2 x i1> [[CMP_I]] to <2 x i16>
+// RV32-NEXT:    [[TMP2:%.*]] = bitcast <2 x i16> [[SEXT_I]] to i32
+// RV32-NEXT:    ret i32 [[TMP2]]
+//
+// RV64-LABEL: define dso_local i32 @test_pmslt_u16x2(
+// RV64-SAME: i32 noundef [[A_COERCE:%.*]], i32 noundef [[B_COERCE:%.*]]) 
#[[ATTR0]] {
+// RV64-NEXT:  [[ENTRY:.*:]]
+// RV64-NEXT:    [[TMP0:%.*]] = bitcast i32 [[A_COERCE]] to <2 x i16>
+// RV64-NEXT:    [[TMP1:%.*]] = bitcast i32 [[B_COERCE]] to <2 x i16>
+// RV64-NEXT:    [[CMP_I:%.*]] = icmp slt <2 x i16> [[TMP0]], [[TMP1]]
+// RV64-NEXT:    [[SEXT_I:%.*]] = sext <2 x i1> [[CMP_I]] to <2 x i16>
+// RV64-NEXT:    [[TMP2:%.*]] = bitcast <2 x i16> [[SEXT_I]] to i32
+// RV64-NEXT:    ret i32 [[TMP2]]
+//
+uint16x2_t test_pmslt_u16x2(int16x2_t a, int16x2_t b) {
+  return __riscv_pmslt_u16x2(a, b);
+}
+
+// RV32-LABEL: define dso_local i32 @test_pmsltu_u16x2(
+// RV32-SAME: i32 noundef [[A_COERCE:%.*]], i32 noundef [[B_COERCE:%.*]]) 
#[[ATTR0]] {
+// RV32-NEXT:  [[ENTRY:.*:]]
+// RV32-NEXT:    [[TMP0:%.*]] = bitcast i32 [[A_COERCE]] to <2 x i16>
+// RV32-NEXT:    [[TMP1:%.*]] = bitcast i32 [[B_COERCE]] to <2 x i16>
+// RV32-NEXT:    [[CMP_I:%.*]] = icmp ult <2 x i16> [[TMP0]], [[TMP1]]
+// RV32-NEXT:    [[SEXT_I:%.*]] = sext <2 x i1> [[CMP_I]] to <2 x i16>
+// RV32-NEXT:    [[TMP2:%.*]] = bitcast <2 x i16> [[SEXT_I]] to i32
+// RV32-NEXT:    ret i32 [[TMP2]]
+//
+// RV64-LABEL: define dso_local i32 @test_pmsltu_u16x2(
+// RV64-SAME: i32 noundef [[A_COERCE:%.*]], i32 noundef [[B_COERCE:%.*]]) 
#[[ATTR0]] {
+// RV64-NEXT:  [[ENTRY:.*:]]
+// RV64-NEXT:    [[TMP0:%.*]] = bitcast i32 [[A_COERCE]] to <2 x i16>
+// RV64-NEXT:    [[TMP1:%.*]] = bitcast i32 [[B_COERCE]] to <2 x i16>
+// RV64-NEXT:    [[CMP_I:%.*]] = icmp ult <2 x i16> [[TMP0]], [[TMP1]]
+// RV64-NEXT:    [[SEXT_I:%.*]] = sext <2 x i1> [[CMP_I]] to <2 x i16>
+// RV64-NEXT:    [[TMP2:%.*]] = bitcast <2 x i16> [[SEXT_I]] to i32
+// RV64-NEXT:    ret i32 [[TMP2]]
+//
+uint16x2_t test_pmsltu_u16x2(uint16x2_t a, uint16x2_t b) {
+  return __riscv_pmsltu_u16x2(a, b);
+}
+
+// RV32-LABEL: define dso_local i32 @test_pmsgt_u16x2(
+// RV32-SAME: i32 noundef [[A_COERCE:%.*]], i32 noundef [[B_COERCE:%.*]]) 
#[[ATTR0]] {
+// RV32-NEXT:  [[ENTRY:.*:]]
+// RV32-NEXT:    [[TMP0:%.*]] = bitcast i32 [[A_COERCE]] to <2 x i16>
+// RV32-NEXT:    [[TMP1:%.*]] = bitcast i32 [[B_COERCE]] to <2 x i16>
+// RV32-NEXT:    [[CMP_I:%.*]] = icmp sgt <2 x i16> [[TMP0]], [[TMP1]]
+// RV32-NEXT:    [[SEXT_I:%.*]] = sext <2 x i1> [[CMP_I]] to <2 x i16>
+// RV32-NEXT:    [[TMP2:%.*]] = bitcast <2 x i16> [[SEXT_I]] to i32
+// RV32-NEXT:    ret i32 [[TMP2]]
+//
+// RV64-LABEL: define dso_local i32 @test_pmsgt_u16x2(
+// RV64-SAME: i32 noundef [[A_COERCE:%.*]], i32 noundef [[B_COERCE:%.*]]) 
#[[ATTR0]] {
+// RV64-NEXT:  [[ENTRY:.*:]]
+// RV64-NEXT:    [[TMP0:%.*]] = bitcast i32 [[A_COERCE]] to <2 x i16>
+// RV64-NEXT:    [[TMP1:%.*]] = bitcast i32 [[B_COERCE]] to <2 x i16>
+// RV64-NEXT:    [[CMP_I:%.*]] = icmp sgt <2 x i16> [[TMP0]], [[TMP1]]
+// RV64-NEXT:    [[SEXT_I:%.*]] = sext <2 x i1> [[CMP_I]] to <2 x i16>
+// RV64-NEXT:    [[TMP2:%.*]] = bitcast <2 x i16> [[SEXT_I]] to i32
+// RV64-NEXT:    ret i32 [[TMP2]]
+//
+uint16x2_t test_pmsgt_u16x2(int16x2_t a, int16x2_t b) {
+  return __riscv_pmsgt_u16x2(a, b);
+}
+
+// RV32-LABEL: define dso_local i32 @test_pmsgtu_u16x2(
+// RV32-SAME: i32 noundef [[A_COERCE:%.*]], i32 noundef [[B_COERCE:%.*]]) 
#[[ATTR0]] {
+// RV32-NEXT:  [[ENTRY:.*:]]
+// RV32-NEXT:    [[TMP0:%.*]] = bitcast i32 [[A_COERCE]] to <2 x i16>
+// RV32-NEXT:    [[TMP1:%.*]] = bitcast i32 [[B_COERCE]] to <2 x i16>
+// RV32-NEXT:    [[CMP_I:%.*]] = icmp ugt <2 x i16> [[TMP0]], [[TMP1]]
+// RV32-NEXT:    [[SEXT_I:%.*]] = sext <2 x i1> [[CMP_I]] to <2 x i16>
+// RV32-NEXT:    [[TMP2:%.*]] = bitcast <2 x i16> [[SEXT_I]] to i32
+// RV32-NEXT:    ret i32 [[TMP2]]
+//
+// RV64-LABEL: define dso_local i32 @test_pmsgtu_u16x2(
+// RV64-SAME: i32 noundef [[A_COERCE:%.*]], i32 noundef [[B_COERCE:%.*]]) 
#[[ATTR0]] {
+// RV64-NEXT:  [[ENTRY:.*:]]
+// RV64-NEXT:    [[TMP0:%.*]] = bitcast i32 [[A_COERCE]] to <2 x i16>
+// RV64-NEXT:    [[TMP1:%.*]] = bitcast i32 [[B_COERCE]] to <2 x i16>
+// RV64-NEXT:    [[CMP_I:%.*]] = icmp ugt <2 x i16> [[TMP0]], [[TMP1]]
+// RV64-NEXT:    [[SEXT_I:%.*]] = sext <2 x i1> [[CMP_I]] to <2 x i16>
+// RV64-NEXT:    [[TMP2:%.*]] = bitcast <2 x i16> [[SEXT_I]] to i32
+// RV64-NEXT:    ret i32 [[TMP2]]
+//
+uint16x2_t test_pmsgtu_u16x2(uint16x2_t a, uint16x2_t b) {
+  return __riscv_pmsgtu_u16x2(a, b);
+}
+
+// RV32-LABEL: define dso_local i32 @test_pmsge_u16x2(
+// RV32-SAME: i32 noundef [[A_COERCE:%.*]], i32 noundef [[B_COERCE:%.*]]) 
#[[ATTR0]] {
+// RV32-NEXT:  [[ENTRY:.*:]]
+// RV32-NEXT:    [[TMP0:%.*]] = bitcast i32 [[A_COERCE]] to <2 x i16>
+// RV32-NEXT:    [[TMP1:%.*]] = bitcast i32 [[B_COERCE]] to <2 x i16>
+// RV32-NEXT:    [[CMP_I:%.*]] = icmp sge <2 x i16> [[TMP0]], [[TMP1]]
+// RV32-NEXT:    [[SEXT_I:%.*]] = sext <2 x i1> [[CMP_I]] to <2 x i16>
+// RV32-NEXT:    [[TMP2:%.*]] = bitcast <2 x i16> [[SEXT_I]] to i32
+// RV32-NEXT:    ret i32 [[TMP2]]
+//
+// RV64-LABEL: define dso_local i32 @test_pmsge_u16x2(
+// RV64-SAME: i32 noundef [[A_COERCE:%.*]], i32 noundef [[B_COERCE:%.*]]) 
#[[ATTR0]] {
+// RV64-NEXT:  [[ENTRY:.*:]]
+// RV64-NEXT:    [[TMP0:%.*]] = bitcast i32 [[A_COERCE]] to <2 x i16>
+// RV64-NEXT:    [[TMP1:%.*]] = bitcast i32 [[B_COERCE]] to <2 x i16>
+// RV64-NEXT:    [[CMP_I:%.*]] = icmp sge <2 x i16> [[TMP0]], [[TMP1]]
+// RV64-NEXT:    [[SEXT_I:%.*]] = sext <2 x i1> [[CMP_I]] to <2 x i16>
+// RV64-NEXT:    [[TMP2:%.*]] = bitcast <2 x i16> [[SEXT_I]] to i32
+// RV64-NEXT:    ret i32 [[TMP2]]
+//
+uint16x2_t test_pmsge_u16x2(int16x2_t a, int16x2_t b) {
+  return __riscv_pmsge_u16x2(a, b);
+}
+
+// RV32-LABEL: define dso_local i32 @test_pmsgeu_u16x2(
+// RV32-SAME: i32 noundef [[A_COERCE:%.*]], i32 noundef [[B_COERCE:%.*]]) 
#[[ATTR0]] {
+// RV32-NEXT:  [[ENTRY:.*:]]
+// RV32-NEXT:    [[TMP0:%.*]] = bitcast i32 [[A_COERCE]] to <2 x i16>
+// RV32-NEXT:    [[TMP1:%.*]] = bitcast i32 [[B_COERCE]] to <2 x i16>
+// RV32-NEXT:    [[CMP_I:%.*]] = icmp uge <2 x i16> [[TMP0]], [[TMP1]]
+// RV32-NEXT:    [[SEXT_I:%.*]] = sext <2 x i1> [[CMP_I]] to <2 x i16>
+// RV32-NEXT:    [[TMP2:%.*]] = bitcast <2 x i16> [[SEXT_I]] to i32
+// RV32-NEXT:    ret i32 [[TMP2]]
+//
+// RV64-LABEL: define dso_local i32 @test_pmsgeu_u16x2(
+// RV64-SAME: i32 noundef [[A_COERCE:%.*]], i32 noundef [[B_COERCE:%.*]]) 
#[[ATTR0]] {
+// RV64-NEXT:  [[ENTRY:.*:]]
+// RV64-NEXT:    [[TMP0:%.*]] = bitcast i32 [[A_COERCE]] to <2 x i16>
+// RV64-NEXT:    [[TMP1:%.*]] = bitcast i32 [[B_COERCE]] to <2 x i16>
+// RV64-NEXT:    [[CMP_I:%.*]] = icmp uge <2 x i16> [[TMP0]], [[TMP1]]
+// RV64-NEXT:    [[SEXT_I:%.*]] = sext <2 x i1> [[CMP_I]] to <2 x i16>
+// RV64-NEXT:    [[TMP2:%.*]] = bitcast <2 x i16> [[SEXT_I]] to i32
+// RV64-NEXT:    ret i32 [[TMP2]]
+//
+uint16x2_t test_pmsgeu_u16x2(uint16x2_t a, uint16x2_t b) {
+  return __riscv_pmsgeu_u16x2(a, b);
+}
+
+// RV32-LABEL: define dso_local i32 @test_pmsle_u16x2(
+// RV32-SAME: i32 noundef [[A_COERCE:%.*]], i32 noundef [[B_COERCE:%.*]]) 
#[[ATTR0]] {
+// RV32-NEXT:  [[ENTRY:.*:]]
+// RV32-NEXT:    [[TMP0:%.*]] = bitcast i32 [[A_COERCE]] to <2 x i16>
+// RV32-NEXT:    [[TMP1:%.*]] = bitcast i32 [[B_COERCE]] to <2 x i16>
+// RV32-NEXT:    [[CMP_I:%.*]] = icmp sle <2 x i16> [[TMP0]], [[TMP1]]
+// RV32-NEXT:    [[SEXT_I:%.*]] = sext <2 x i1> [[CMP_I]] to <2 x i16>
+// RV32-NEXT:    [[TMP2:%.*]] = bitcast <2 x i16> [[SEXT_I]] to i32
+// RV32-NEXT:    ret i32 [[TMP2]]
+//
+// RV64-LABEL: define dso_local i32 @test_pmsle_u16x2(
+// RV64-SAME: i32 noundef [[A_COERCE:%.*]], i32 noundef [[B_COERCE:%.*]]) 
#[[ATTR0]] {
+// RV64-NEXT:  [[ENTRY:.*:]]
+// RV64-NEXT:    [[TMP0:%.*]] = bitcast i32 [[A_COERCE]] to <2 x i16>
+// RV64-NEXT:    [[TMP1:%.*]] = bitcast i32 [[B_COERCE]] to <2 x i16>
+// RV64-NEXT:    [[CMP_I:%.*]] = icmp sle <2 x i16> [[TMP0]], [[TMP1]]
+// RV64-NEXT:    [[SEXT_I:%.*]] = sext <2 x i1> [[CMP_I]] to <2 x i16>
+// RV64-NEXT:    [[TMP2:%.*]] = bitcast <2 x i16> [[SEXT_I]] to i32
+// RV64-NEXT:    ret i32 [[TMP2]]
+//
+uint16x2_t test_pmsle_u16x2(int16x2_t a, int16x2_t b) {
+  return __riscv_pmsle_u16x2(a, b);
+}
+
+// RV32-LABEL: define dso_local i32 @test_pmsleu_u16x2(
+// RV32-SAME: i32 noundef [[A_COERCE:%.*]], i32 noundef [[B_COERCE:%.*]]) 
#[[ATTR0]] {
+// RV32-NEXT:  [[ENTRY:.*:]]
+// RV32-NEXT:    [[TMP0:%.*]] = bitcast i32 [[A_COERCE]] to <2 x i16>
+// RV32-NEXT:    [[TMP1:%.*]] = bitcast i32 [[B_COERCE]] to <2 x i16>
+// RV32-NEXT:    [[CMP_I:%.*]] = icmp ule <2 x i16> [[TMP0]], [[TMP1]]
+// RV32-NEXT:    [[SEXT_I:%.*]] = sext <2 x i1> [[CMP_I]] to <2 x i16>
+// RV32-NEXT:    [[TMP2:%.*]] = bitcast <2 x i16> [[SEXT_I]] to i32
+// RV32-NEXT:    ret i32 [[TMP2]]
+//
+// RV64-LABEL: define dso_local i32 @test_pmsleu_u16x2(
+// RV64-SAME: i32 noundef [[A_COERCE:%.*]], i32 noundef [[B_COERCE:%.*]]) 
#[[ATTR0]] {
+// RV64-NEXT:  [[ENTRY:.*:]]
+// RV64-NEXT:    [[TMP0:%.*]] = bitcast i32 [[A_COERCE]] to <2 x i16>
+// RV64-NEXT:    [[TMP1:%.*]] = bitcast i32 [[B_COERCE]] to <2 x i16>
+// RV64-NEXT:    [[CMP_I:%.*]] = icmp ule <2 x i16> [[TMP0]], [[TMP1]]
+// RV64-NEXT:    [[SEXT_I:%.*]] = sext <2 x i1> [[CMP_I]] to <2 x i16>
+// RV64-NEXT:    [[TMP2:%.*]] = bitcast <2 x i16> [[SEXT_I]] to i32
+// RV64-NEXT:    ret i32 [[TMP2]]
+//
+uint16x2_t test_pmsleu_u16x2(uint16x2_t a, uint16x2_t b) {
+  return __riscv_pmsleu_u16x2(a, b);
+}
+
+/* Packed Comparison (64-bit) */
+
+// RV32-LABEL: define dso_local i64 @test_pmseq_i8x8_u8x8(
+// RV32-SAME: i64 noundef [[A_COERCE:%.*]], i64 noundef [[B_COERCE:%.*]]) 
#[[ATTR0]] {
+// RV32-NEXT:  [[ENTRY:.*:]]
+// RV32-NEXT:    [[TMP0:%.*]] = bitcast i64 [[A_COERCE]] to <8 x i8>
+// RV32-NEXT:    [[TMP1:%.*]] = bitcast i64 [[B_COERCE]] to <8 x i8>
+// RV32-NEXT:    [[CMP_I:%.*]] = icmp eq <8 x i8> [[TMP0]], [[TMP1]]
+// RV32-NEXT:    [[SEXT_I:%.*]] = sext <8 x i1> [[CMP_I]] to <8 x i8>
+// RV32-NEXT:    [[TMP2:%.*]] = bitcast <8 x i8> [[SEXT_I]] to i64
+// RV32-NEXT:    ret i64 [[TMP2]]
+//
+// RV64-LABEL: define dso_local i64 @test_pmseq_i8x8_u8x8(
+// RV64-SAME: i64 noundef [[A_COERCE:%.*]], i64 noundef [[B_COERCE:%.*]]) 
#[[ATTR0]] {
+// RV64-NEXT:  [[ENTRY:.*:]]
+// RV64-NEXT:    [[TMP0:%.*]] = bitcast i64 [[A_COERCE]] to <8 x i8>
+// RV64-NEXT:    [[TMP1:%.*]] = bitcast i64 [[B_COERCE]] to <8 x i8>
+// RV64-NEXT:    [[CMP_I:%.*]] = icmp eq <8 x i8> [[TMP0]], [[TMP1]]
+// RV64-NEXT:    [[SEXT_I:%.*]] = sext <8 x i1> [[CMP_I]] to <8 x i8>
+// RV64-NEXT:    [[TMP2:%.*]] = bitcast <8 x i8> [[SEXT_I]] to i64
+// RV64-NEXT:    ret i64 [[TMP2]]
+//
+uint8x8_t test_pmseq_i8x8_u8x8(int8x8_t a, int8x8_t b) {
+  return __riscv_pmseq_i8x8_u8x8(a, b);
+}
+
+// RV32-LABEL: define dso_local i64 @test_pmseq_u8x8_u8x8(
+// RV32-SAME: i64 noundef [[A_COERCE:%.*]], i64 noundef [[B_COERCE:%.*]]) 
#[[ATTR0]] {
+// RV32-NEXT:  [[ENTRY:.*:]]
+// RV32-NEXT:    [[TMP0:%.*]] = bitcast i64 [[A_COERCE]] to <8 x i8>
+// RV32-NEXT:    [[TMP1:%.*]] = bitcast i64 [[B_COERCE]] to <8 x i8>
+// RV32-NEXT:    [[CMP_I:%.*]] = icmp eq <8 x i8> [[TMP0]], [[TMP1]]
+// RV32-NEXT:    [[SEXT_I:%.*]] = sext <8 x i1> [[CMP_I]] to <8 x i8>
+// RV32-NEXT:    [[TMP2:%.*]] = bitcast <8 x i8> [[SEXT_I]] to i64
+// RV32-NEXT:    ret i64 [[TMP2]]
+//
+// RV64-LABEL: define dso_local i64 @test_pmseq_u8x8_u8x8(
+// RV64-SAME: i64 noundef [[A_COERCE:%.*]], i64 noundef [[B_COERCE:%.*]]) 
#[[ATTR0]] {
+// RV64-NEXT:  [[ENTRY:.*:]]
+// RV64-NEXT:    [[TMP0:%.*]] = bitcast i64 [[A_COERCE]] to <8 x i8>
+// RV64-NEXT:    [[TMP1:%.*]] = bitcast i64 [[B_COERCE]] to <8 x i8>
+// RV64-NEXT:    [[CMP_I:%.*]] = icmp eq <8 x i8> [[TMP0]], [[TMP1]]
+// RV64-NEXT:    [[SEXT_I:%.*]] = sext <8 x i1> [[CMP_I]] to <8 x i8>
+// RV64-NEXT:    [[TMP2:%.*]] = bitcast <8 x i8> [[SEXT_I]] to i64
+// RV64-NEXT:    ret i64 [[TMP2]]
+//
+uint8x8_t test_pmseq_u8x8_u8x8(uint8x8_t a, uint8x8_t b) {
+  return __riscv_pmseq_u8x8_u8x8(a, b);
+}
+
+// RV32-LABEL: define dso_local i64 @test_pmsne_i8x8_u8x8(
+// RV32-SAME: i64 noundef [[A_COERCE:%.*]], i64 noundef [[B_COERCE:%.*]]) 
#[[ATTR0]] {
+// RV32-NEXT:  [[ENTRY:.*:]]
+// RV32-NEXT:    [[TMP0:%.*]] = bitcast i64 [[A_COERCE]] to <8 x i8>
+// RV32-NEXT:    [[TMP1:%.*]] = bitcast i64 [[B_COERCE]] to <8 x i8>
+// RV32-NEXT:    [[CMP_I:%.*]] = icmp ne <8 x i8> [[TMP0]], [[TMP1]]
+// RV32-NEXT:    [[SEXT_I:%.*]] = sext <8 x i1> [[CMP_I]] to <8 x i8>
+// RV32-NEXT:    [[TMP2:%.*]] = bitcast <8 x i8> [[SEXT_I]] to i64
+// RV32-NEXT:    ret i64 [[TMP2]]
+//
+// RV64-LABEL: define dso_local i64 @test_pmsne_i8x8_u8x8(
+// RV64-SAME: i64 noundef [[A_COERCE:%.*]], i64 noundef [[B_COERCE:%.*]]) 
#[[ATTR0]] {
+// RV64-NEXT:  [[ENTRY:.*:]]
+// RV64-NEXT:    [[TMP0:%.*]] = bitcast i64 [[A_COERCE]] to <8 x i8>
+// RV64-NEXT:    [[TMP1:%.*]] = bitcast i64 [[B_COERCE]] to <8 x i8>
+// RV64-NEXT:    [[CMP_I:%.*]] = icmp ne <8 x i8> [[TMP0]], [[TMP1]]
+// RV64-NEXT:    [[SEXT_I:%.*]] = sext <8 x i1> [[CMP_I]] to <8 x i8>
+// RV64-NEXT:    [[TMP2:%.*]] = bitcast <8 x i8> [[SEXT_I]] to i64
+// RV64-NEXT:    ret i64 [[TMP2]]
+//
+uint8x8_t test_pmsne_i8x8_u8x8(int8x8_t a, int8x8_t b) {
+  return __riscv_pmsne_i8x8_u8x8(a, b);
+}
+
+// RV32-LABEL: define dso_local i64 @test_pmsne_u8x8_u8x8(
+// RV32-SAME: i64 noundef [[A_COERCE:%.*]], i64 noundef [[B_COERCE:%.*]]) 
#[[ATTR0]] {
+// RV32-NEXT:  [[ENTRY:.*:]]
+// RV32-NEXT:    [[TMP0:%.*]] = bitcast i64 [[A_COERCE]] to <8 x i8>
+// RV32-NEXT:    [[TMP1:%.*]] = bitcast i64 [[B_COERCE]] to <8 x i8>
+// RV32-NEXT:    [[CMP_I:%.*]] = icmp ne <8 x i8> [[TMP0]], [[TMP1]]
+// RV32-NEXT:    [[SEXT_I:%.*]] = sext <8 x i1> [[CMP_I]] to <8 x i8>
+// RV32-NEXT:    [[TMP2:%.*]] = bitcast <8 x i8> [[SEXT_I]] to i64
+// RV32-NEXT:    ret i64 [[TMP2]]
+//
+// RV64-LABEL: define dso_local i64 @test_pmsne_u8x8_u8x8(
+// RV64-SAME: i64 noundef [[A_COERCE:%.*]], i64 noundef [[B_COERCE:%.*]]) 
#[[ATTR0]] {
+// RV64-NEXT:  [[ENTRY:.*:]]
+// RV64-NEXT:    [[TMP0:%.*]] = bitcast i64 [[A_COERCE]] to <8 x i8>
+// RV64-NEXT:    [[TMP1:%.*]] = bitcast i64 [[B_COERCE]] to <8 x i8>
+// RV64-NEXT:    [[CMP_I:%.*]] = icmp ne <8 x i8> [[TMP0]], [[TMP1]]
+// RV64-NEXT:    [[SEXT_I:%.*]] = sext <8 x i1> [[CMP_I]] to <8 x i8>
+// RV64-NEXT:    [[TMP2:%.*]] = bitcast <8 x i8> [[SEXT_I]] to i64
+// RV64-NEXT:    ret i64 [[TMP2]]
+//
+uint8x8_t test_pmsne_u8x8_u8x8(uint8x8_t a, uint8x8_t b) {
+  return __riscv_pmsne_u8x8_u8x8(a, b);
+}
+
+// RV32-LABEL: define dso_local i64 @test_pmslt_u8x8(
+// RV32-SAME: i64 noundef [[A_COERCE:%.*]], i64 noundef [[B_COERCE:%.*]]) 
#[[ATTR0]] {
+// RV32-NEXT:  [[ENTRY:.*:]]
+// RV32-NEXT:    [[TMP0:%.*]] = bitcast i64 [[A_COERCE]] to <8 x i8>
+// RV32-NEXT:    [[TMP1:%.*]] = bitcast i64 [[B_COERCE]] to <8 x i8>
+// RV32-NEXT:    [[CMP_I:%.*]] = icmp slt <8 x i8> [[TMP0]], [[TMP1]]
+// RV32-NEXT:    [[SEXT_I:%.*]] = sext <8 x i1> [[CMP_I]] to <8 x i8>
+// RV32-NEXT:    [[TMP2:%.*]] = bitcast <8 x i8> [[SEXT_I]] to i64
+// RV32-NEXT:    ret i64 [[TMP2]]
+//
+// RV64-LABEL: define dso_local i64 @test_pmslt_u8x8(
+// RV64-SAME: i64 noundef [[A_COERCE:%.*]], i64 noundef [[B_COERCE:%.*]]) 
#[[ATTR0]] {
+// RV64-NEXT:  [[ENTRY:.*:]]
+// RV64-NEXT:    [[TMP0:%.*]] = bitcast i64 [[A_COERCE]] to <8 x i8>
+// RV64-NEXT:    [[TMP1:%.*]] = bitcast i64 [[B_COERCE]] to <8 x i8>
+// RV64-NEXT:    [[CMP_I:%.*]] = icmp slt <8 x i8> [[TMP0]], [[TMP1]]
+// RV64-NEXT:    [[SEXT_I:%.*]] = sext <8 x i1> [[CMP_I]] to <8 x i8>
+// RV64-NEXT:    [[TMP2:%.*]] = bitcast <8 x i8> [[SEXT_I]] to i64
+// RV64-NEXT:    ret i64 [[TMP2]]
+//
+uint8x8_t test_pmslt_u8x8(int8x8_t a, int8x8_t b) {
+  return __riscv_pmslt_u8x8(a, b);
+}
+
+// RV32-LABEL: define dso_local i64 @test_pmsltu_u8x8(
+// RV32-SAME: i64 noundef [[A_COERCE:%.*]], i64 noundef [[B_COERCE:%.*]]) 
#[[ATTR0]] {
+// RV32-NEXT:  [[ENTRY:.*:]]
+// RV32-NEXT:    [[TMP0:%.*]] = bitcast i64 [[A_COERCE]] to <8 x i8>
+// RV32-NEXT:    [[TMP1:%.*]] = bitcast i64 [[B_COERCE]] to <8 x i8>
+// RV32-NEXT:    [[CMP_I:%.*]] = icmp ult <8 x i8> [[TMP0]], [[TMP1]]
+// RV32-NEXT:    [[SEXT_I:%.*]] = sext <8 x i1> [[CMP_I]] to <8 x i8>
+// RV32-NEXT:    [[TMP2:%.*]] = bitcast <8 x i8> [[SEXT_I]] to i64
+// RV32-NEXT:    ret i64 [[TMP2]]
+//
+// RV64-LABEL: define dso_local i64 @test_pmsltu_u8x8(
+// RV64-SAME: i64 noundef [[A_COERCE:%.*]], i64 noundef [[B_COERCE:%.*]]) 
#[[ATTR0]] {
+// RV64-NEXT:  [[ENTRY:.*:]]
+// RV64-NEXT:    [[TMP0:%.*]] = bitcast i64 [[A_COERCE]] to <8 x i8>
+// RV64-NEXT:    [[TMP1:%.*]] = bitcast i64 [[B_COERCE]] to <8 x i8>
+// RV64-NEXT:    [[CMP_I:%.*]] = icmp ult <8 x i8> [[TMP0]], [[TMP1]]
+// RV64-NEXT:    [[SEXT_I:%.*]] = sext <8 x i1> [[CMP_I]] to <8 x i8>
+// RV64-NEXT:    [[TMP2:%.*]] = bitcast <8 x i8> [[SEXT_I]] to i64
+// RV64-NEXT:    ret i64 [[TMP2]]
+//
+uint8x8_t test_pmsltu_u8x8(uint8x8_t a, uint8x8_t b) {
+  return __riscv_pmsltu_u8x8(a, b);
+}
+
+// RV32-LABEL: define dso_local i64 @test_pmsgt_u8x8(
+// RV32-SAME: i64 noundef [[A_COERCE:%.*]], i64 noundef [[B_COERCE:%.*]]) 
#[[ATTR0]] {
+// RV32-NEXT:  [[ENTRY:.*:]]
+// RV32-NEXT:    [[TMP0:%.*]] = bitcast i64 [[A_COERCE]] to <8 x i8>
+// RV32-NEXT:    [[TMP1:%.*]] = bitcast i64 [[B_COERCE]] to <8 x i8>
+// RV32-NEXT:    [[CMP_I:%.*]] = icmp sgt <8 x i8> [[TMP0]], [[TMP1]]
+// RV32-NEXT:    [[SEXT_I:%.*]] = sext <8 x i1> [[CMP_I]] to <8 x i8>
+// RV32-NEXT:    [[TMP2:%.*]] = bitcast <8 x i8> [[SEXT_I]] to i64
+// RV32-NEXT:    ret i64 [[TMP2]]
+//
+// RV64-LABEL: define dso_local i64 @test_pmsgt_u8x8(
+// RV64-SAME: i64 noundef [[A_COERCE:%.*]], i64 noundef [[B_COERCE:%.*]]) 
#[[ATTR0]] {
+// RV64-NEXT:  [[ENTRY:.*:]]
+// RV64-NEXT:    [[TMP0:%.*]] = bitcast i64 [[A_COERCE]] to <8 x i8>
+// RV64-NEXT:    [[TMP1:%.*]] = bitcast i64 [[B_COERCE]] to <8 x i8>
+// RV64-NEXT:    [[CMP_I:%.*]] = icmp sgt <8 x i8> [[TMP0]], [[TMP1]]
+// RV64-NEXT:    [[SEXT_I:%.*]] = sext <8 x i1> [[CMP_I]] to <8 x i8>
+// RV64-NEXT:    [[TMP2:%.*]] = bitcast <8 x i8> [[SEXT_I]] to i64
+// RV64-NEXT:    ret i64 [[TMP2]]
+//
+uint8x8_t test_pmsgt_u8x8(int8x8_t a, int8x8_t b) {
+  return __riscv_pmsgt_u8x8(a, b);
+}
+
+// RV32-LABEL: define dso_local i64 @test_pmsgtu_u8x8(
+// RV32-SAME: i64 noundef [[A_COERCE:%.*]], i64 noundef [[B_COERCE:%.*]]) 
#[[ATTR0]] {
+// RV32-NEXT:  [[ENTRY:.*:]]
+// RV32-NEXT:    [[TMP0:%.*]] = bitcast i64 [[A_COERCE]] to <8 x i8>
+// RV32-NEXT:    [[TMP1:%.*]] = bitcast i64 [[B_COERCE]] to <8 x i8>
+// RV32-NEXT:    [[CMP_I:%.*]] = icmp ugt <8 x i8> [[TMP0]], [[TMP1]]
+// RV32-NEXT:    [[SEXT_I:%.*]] = sext <8 x i1> [[CMP_I]] to <8 x i8>
+// RV32-NEXT:    [[TMP2:%.*]] = bitcast <8 x i8> [[SEXT_I]] to i64
+// RV32-NEXT:    ret i64 [[TMP2]]
+//
+// RV64-LABEL: define dso_local i64 @test_pmsgtu_u8x8(
+// RV64-SAME: i64 noundef [[A_COERCE:%.*]], i64 noundef [[B_COERCE:%.*]]) 
#[[ATTR0]] {
+// RV64-NEXT:  [[ENTRY:.*:]]
+// RV64-NEXT:    [[TMP0:%.*]] = bitcast i64 [[A_COERCE]] to <8 x i8>
+// RV64-NEXT:    [[TMP1:%.*]] = bitcast i64 [[B_COERCE]] to <8 x i8>
+// RV64-NEXT:    [[CMP_I:%.*]] = icmp ugt <8 x i8> [[TMP0]], [[TMP1]]
+// RV64-NEXT:    [[SEXT_I:%.*]] = sext <8 x i1> [[CMP_I]] to <8 x i8>
+// RV64-NEXT:    [[TMP2:%.*]] = bitcast <8 x i8> [[SEXT_I]] to i64
+// RV64-NEXT:    ret i64 [[TMP2]]
+//
+uint8x8_t test_pmsgtu_u8x8(uint8x8_t a, uint8x8_t b) {
+  return __riscv_pmsgtu_u8x8(a, b);
+}
+
+// RV32-LABEL: define dso_local i64 @test_pmsge_u8x8(
+// RV32-SAME: i64 noundef [[A_COERCE:%.*]], i64 noundef [[B_COERCE:%.*]]) 
#[[ATTR0]] {
+// RV32-NEXT:  [[ENTRY:.*:]]
+// RV32-NEXT:    [[TMP0:%.*]] = bitcast i64 [[A_COERCE]] to <8 x i8>
+// RV32-NEXT:    [[TMP1:%.*]] = bitcast i64 [[B_COERCE]] to <8 x i8>
+// RV32-NEXT:    [[CMP_I:%.*]] = icmp sge <8 x i8> [[TMP0]], [[TMP1]]
+// RV32-NEXT:    [[SEXT_I:%.*]] = sext <8 x i1> [[CMP_I]] to <8 x i8>
+// RV32-NEXT:    [[TMP2:%.*]] = bitcast <8 x i8> [[SEXT_I]] to i64
+// RV32-NEXT:    ret i64 [[TMP2]]
+//
+// RV64-LABEL: define dso_local i64 @test_pmsge_u8x8(
+// RV64-SAME: i64 noundef [[A_COERCE:%.*]], i64 noundef [[B_COERCE:%.*]]) 
#[[ATTR0]] {
+// RV64-NEXT:  [[ENTRY:.*:]]
+// RV64-NEXT:    [[TMP0:%.*]] = bitcast i64 [[A_COERCE]] to <8 x i8>
+// RV64-NEXT:    [[TMP1:%.*]] = bitcast i64 [[B_COERCE]] to <8 x i8>
+// RV64-NEXT:    [[CMP_I:%.*]] = icmp sge <8 x i8> [[TMP0]], [[TMP1]]
+// RV64-NEXT:    [[SEXT_I:%.*]] = sext <8 x i1> [[CMP_I]] to <8 x i8>
+// RV64-NEXT:    [[TMP2:%.*]] = bitcast <8 x i8> [[SEXT_I]] to i64
+// RV64-NEXT:    ret i64 [[TMP2]]
+//
+uint8x8_t test_pmsge_u8x8(int8x8_t a, int8x8_t b) {
+  return __riscv_pmsge_u8x8(a, b);
+}
+
+// RV32-LABEL: define dso_local i64 @test_pmsgeu_u8x8(
+// RV32-SAME: i64 noundef [[A_COERCE:%.*]], i64 noundef [[B_COERCE:%.*]]) 
#[[ATTR0]] {
+// RV32-NEXT:  [[ENTRY:.*:]]
+// RV32-NEXT:    [[TMP0:%.*]] = bitcast i64 [[A_COERCE]] to <8 x i8>
+// RV32-NEXT:    [[TMP1:%.*]] = bitcast i64 [[B_COERCE]] to <8 x i8>
+// RV32-NEXT:    [[CMP_I:%.*]] = icmp uge <8 x i8> [[TMP0]], [[TMP1]]
+// RV32-NEXT:    [[SEXT_I:%.*]] = sext <8 x i1> [[CMP_I]] to <8 x i8>
+// RV32-NEXT:    [[TMP2:%.*]] = bitcast <8 x i8> [[SEXT_I]] to i64
+// RV32-NEXT:    ret i64 [[TMP2]]
+//
+// RV64-LABEL: define dso_local i64 @test_pmsgeu_u8x8(
+// RV64-SAME: i64 noundef [[A_COERCE:%.*]], i64 noundef [[B_COERCE:%.*]]) 
#[[ATTR0]] {
+// RV64-NEXT:  [[ENTRY:.*:]]
+// RV64-NEXT:    [[TMP0:%.*]] = bitcast i64 [[A_COERCE]] to <8 x i8>
+// RV64-NEXT:    [[TMP1:%.*]] = bitcast i64 [[B_COERCE]] to <8 x i8>
+// RV64-NEXT:    [[CMP_I:%.*]] = icmp uge <8 x i8> [[TMP0]], [[TMP1]]
+// RV64-NEXT:    [[SEXT_I:%.*]] = sext <8 x i1> [[CMP_I]] to <8 x i8>
+// RV64-NEXT:    [[TMP2:%.*]] = bitcast <8 x i8> [[SEXT_I]] to i64
+// RV64-NEXT:    ret i64 [[TMP2]]
+//
+uint8x8_t test_pmsgeu_u8x8(uint8x8_t a, uint8x8_t b) {
+  return __riscv_pmsgeu_u8x8(a, b);
+}
+
+// RV32-LABEL: define dso_local i64 @test_pmsle_u8x8(
+// RV32-SAME: i64 noundef [[A_COERCE:%.*]], i64 noundef [[B_COERCE:%.*]]) 
#[[ATTR0]] {
+// RV32-NEXT:  [[ENTRY:.*:]]
+// RV32-NEXT:    [[TMP0:%.*]] = bitcast i64 [[A_COERCE]] to <8 x i8>
+// RV32-NEXT:    [[TMP1:%.*]] = bitcast i64 [[B_COERCE]] to <8 x i8>
+// RV32-NEXT:    [[CMP_I:%.*]] = icmp sle <8 x i8> [[TMP0]], [[TMP1]]
+// RV32-NEXT:    [[SEXT_I:%.*]] = sext <8 x i1> [[CMP_I]] to <8 x i8>
+// RV32-NEXT:    [[TMP2:%.*]] = bitcast <8 x i8> [[SEXT_I]] to i64
+// RV32-NEXT:    ret i64 [[TMP2]]
+//
+// RV64-LABEL: define dso_local i64 @test_pmsle_u8x8(
+// RV64-SAME: i64 noundef [[A_COERCE:%.*]], i64 noundef [[B_COERCE:%.*]]) 
#[[ATTR0]] {
+// RV64-NEXT:  [[ENTRY:.*:]]
+// RV64-NEXT:    [[TMP0:%.*]] = bitcast i64 [[A_COERCE]] to <8 x i8>
+// RV64-NEXT:    [[TMP1:%.*]] = bitcast i64 [[B_COERCE]] to <8 x i8>
+// RV64-NEXT:    [[CMP_I:%.*]] = icmp sle <8 x i8> [[TMP0]], [[TMP1]]
+// RV64-NEXT:    [[SEXT_I:%.*]] = sext <8 x i1> [[CMP_I]] to <8 x i8>
+// RV64-NEXT:    [[TMP2:%.*]] = bitcast <8 x i8> [[SEXT_I]] to i64
+// RV64-NEXT:    ret i64 [[TMP2]]
+//
+uint8x8_t test_pmsle_u8x8(int8x8_t a, int8x8_t b) {
+  return __riscv_pmsle_u8x8(a, b);
+}
+
+// RV32-LABEL: define dso_local i64 @test_pmsleu_u8x8(
+// RV32-SAME: i64 noundef [[A_COERCE:%.*]], i64 noundef [[B_COERCE:%.*]]) 
#[[ATTR0]] {
+// RV32-NEXT:  [[ENTRY:.*:]]
+// RV32-NEXT:    [[TMP0:%.*]] = bitcast i64 [[A_COERCE]] to <8 x i8>
+// RV32-NEXT:    [[TMP1:%.*]] = bitcast i64 [[B_COERCE]] to <8 x i8>
+// RV32-NEXT:    [[CMP_I:%.*]] = icmp ule <8 x i8> [[TMP0]], [[TMP1]]
+// RV32-NEXT:    [[SEXT_I:%.*]] = sext <8 x i1> [[CMP_I]] to <8 x i8>
+// RV32-NEXT:    [[TMP2:%.*]] = bitcast <8 x i8> [[SEXT_I]] to i64
+// RV32-NEXT:    ret i64 [[TMP2]]
+//
+// RV64-LABEL: define dso_local i64 @test_pmsleu_u8x8(
+// RV64-SAME: i64 noundef [[A_COERCE:%.*]], i64 noundef [[B_COERCE:%.*]]) 
#[[ATTR0]] {
+// RV64-NEXT:  [[ENTRY:.*:]]
+// RV64-NEXT:    [[TMP0:%.*]] = bitcast i64 [[A_COERCE]] to <8 x i8>
+// RV64-NEXT:    [[TMP1:%.*]] = bitcast i64 [[B_COERCE]] to <8 x i8>
+// RV64-NEXT:    [[CMP_I:%.*]] = icmp ule <8 x i8> [[TMP0]], [[TMP1]]
+// RV64-NEXT:    [[SEXT_I:%.*]] = sext <8 x i1> [[CMP_I]] to <8 x i8>
+// RV64-NEXT:    [[TMP2:%.*]] = bitcast <8 x i8> [[SEXT_I]] to i64
+// RV64-NEXT:    ret i64 [[TMP2]]
+//
+uint8x8_t test_pmsleu_u8x8(uint8x8_t a, uint8x8_t b) {
+  return __riscv_pmsleu_u8x8(a, b);
+}
+
+// RV32-LABEL: define dso_local i64 @test_pmseq_i16x4_u16x4(
+// RV32-SAME: i64 noundef [[A_COERCE:%.*]], i64 noundef [[B_COERCE:%.*]]) 
#[[ATTR0]] {
+// RV32-NEXT:  [[ENTRY:.*:]]
+// RV32-NEXT:    [[TMP0:%.*]] = bitcast i64 [[A_COERCE]] to <4 x i16>
+// RV32-NEXT:    [[TMP1:%.*]] = bitcast i64 [[B_COERCE]] to <4 x i16>
+// RV32-NEXT:    [[CMP_I:%.*]] = icmp eq <4 x i16> [[TMP0]], [[TMP1]]
+// RV32-NEXT:    [[SEXT_I:%.*]] = sext <4 x i1> [[CMP_I]] to <4 x i16>
+// RV32-NEXT:    [[TMP2:%.*]] = bitcast <4 x i16> [[SEXT_I]] to i64
+// RV32-NEXT:    ret i64 [[TMP2]]
+//
+// RV64-LABEL: define dso_local i64 @test_pmseq_i16x4_u16x4(
+// RV64-SAME: i64 noundef [[A_COERCE:%.*]], i64 noundef [[B_COERCE:%.*]]) 
#[[ATTR0]] {
+// RV64-NEXT:  [[ENTRY:.*:]]
+// RV64-NEXT:    [[TMP0:%.*]] = bitcast i64 [[A_COERCE]] to <4 x i16>
+// RV64-NEXT:    [[TMP1:%.*]] = bitcast i64 [[B_COERCE]] to <4 x i16>
+// RV64-NEXT:    [[CMP_I:%.*]] = icmp eq <4 x i16> [[TMP0]], [[TMP1]]
+// RV64-NEXT:    [[SEXT_I:%.*]] = sext <4 x i1> [[CMP_I]] to <4 x i16>
+// RV64-NEXT:    [[TMP2:%.*]] = bitcast <4 x i16> [[SEXT_I]] to i64
+// RV64-NEXT:    ret i64 [[TMP2]]
+//
+uint16x4_t test_pmseq_i16x4_u16x4(int16x4_t a, int16x4_t b) {
+  return __riscv_pmseq_i16x4_u16x4(a, b);
+}
+
+// RV32-LABEL: define dso_local i64 @test_pmseq_u16x4_u16x4(
+// RV32-SAME: i64 noundef [[A_COERCE:%.*]], i64 noundef [[B_COERCE:%.*]]) 
#[[ATTR0]] {
+// RV32-NEXT:  [[ENTRY:.*:]]
+// RV32-NEXT:    [[TMP0:%.*]] = bitcast i64 [[A_COERCE]] to <4 x i16>
+// RV32-NEXT:    [[TMP1:%.*]] = bitcast i64 [[B_COERCE]] to <4 x i16>
+// RV32-NEXT:    [[CMP_I:%.*]] = icmp eq <4 x i16> [[TMP0]], [[TMP1]]
+// RV32-NEXT:    [[SEXT_I:%.*]] = sext <4 x i1> [[CMP_I]] to <4 x i16>
+// RV32-NEXT:    [[TMP2:%.*]] = bitcast <4 x i16> [[SEXT_I]] to i64
+// RV32-NEXT:    ret i64 [[TMP2]]
+//
+// RV64-LABEL: define dso_local i64 @test_pmseq_u16x4_u16x4(
+// RV64-SAME: i64 noundef [[A_COERCE:%.*]], i64 noundef [[B_COERCE:%.*]]) 
#[[ATTR0]] {
+// RV64-NEXT:  [[ENTRY:.*:]]
+// RV64-NEXT:    [[TMP0:%.*]] = bitcast i64 [[A_COERCE]] to <4 x i16>
+// RV64-NEXT:    [[TMP1:%.*]] = bitcast i64 [[B_COERCE]] to <4 x i16>
+// RV64-NEXT:    [[CMP_I:%.*]] = icmp eq <4 x i16> [[TMP0]], [[TMP1]]
+// RV64-NEXT:    [[SEXT_I:%.*]] = sext <4 x i1> [[CMP_I]] to <4 x i16>
+// RV64-NEXT:    [[TMP2:%.*]] = bitcast <4 x i16> [[SEXT_I]] to i64
+// RV64-NEXT:    ret i64 [[TMP2]]
+//
+uint16x4_t test_pmseq_u16x4_u16x4(uint16x4_t a, uint16x4_t b) {
+  return __riscv_pmseq_u16x4_u16x4(a, b);
+}
+
+// RV32-LABEL: define dso_local i64 @test_pmsne_i16x4_u16x4(
+// RV32-SAME: i64 noundef [[A_COERCE:%.*]], i64 noundef [[B_COERCE:%.*]]) 
#[[ATTR0]] {
+// RV32-NEXT:  [[ENTRY:.*:]]
+// RV32-NEXT:    [[TMP0:%.*]] = bitcast i64 [[A_COERCE]] to <4 x i16>
+// RV32-NEXT:    [[TMP1:%.*]] = bitcast i64 [[B_COERCE]] to <4 x i16>
+// RV32-NEXT:    [[CMP_I:%.*]] = icmp ne <4 x i16> [[TMP0]], [[TMP1]]
+// RV32-NEXT:    [[SEXT_I:%.*]] = sext <4 x i1> [[CMP_I]] to <4 x i16>
+// RV32-NEXT:    [[TMP2:%.*]] = bitcast <4 x i16> [[SEXT_I]] to i64
+// RV32-NEXT:    ret i64 [[TMP2]]
+//
+// RV64-LABEL: define dso_local i64 @test_pmsne_i16x4_u16x4(
+// RV64-SAME: i64 noundef [[A_COERCE:%.*]], i64 noundef [[B_COERCE:%.*]]) 
#[[ATTR0]] {
+// RV64-NEXT:  [[ENTRY:.*:]]
+// RV64-NEXT:    [[TMP0:%.*]] = bitcast i64 [[A_COERCE]] to <4 x i16>
+// RV64-NEXT:    [[TMP1:%.*]] = bitcast i64 [[B_COERCE]] to <4 x i16>
+// RV64-NEXT:    [[CMP_I:%.*]] = icmp ne <4 x i16> [[TMP0]], [[TMP1]]
+// RV64-NEXT:    [[SEXT_I:%.*]] = sext <4 x i1> [[CMP_I]] to <4 x i16>
+// RV64-NEXT:    [[TMP2:%.*]] = bitcast <4 x i16> [[SEXT_I]] to i64
+// RV64-NEXT:    ret i64 [[TMP2]]
+//
+uint16x4_t test_pmsne_i16x4_u16x4(int16x4_t a, int16x4_t b) {
+  return __riscv_pmsne_i16x4_u16x4(a, b);
+}
+
+// RV32-LABEL: define dso_local i64 @test_pmsne_u16x4_u16x4(
+// RV32-SAME: i64 noundef [[A_COERCE:%.*]], i64 noundef [[B_COERCE:%.*]]) 
#[[ATTR0]] {
+// RV32-NEXT:  [[ENTRY:.*:]]
+// RV32-NEXT:    [[TMP0:%.*]] = bitcast i64 [[A_COERCE]] to <4 x i16>
+// RV32-NEXT:    [[TMP1:%.*]] = bitcast i64 [[B_COERCE]] to <4 x i16>
+// RV32-NEXT:    [[CMP_I:%.*]] = icmp ne <4 x i16> [[TMP0]], [[TMP1]]
+// RV32-NEXT:    [[SEXT_I:%.*]] = sext <4 x i1> [[CMP_I]] to <4 x i16>
+// RV32-NEXT:    [[TMP2:%.*]] = bitcast <4 x i16> [[SEXT_I]] to i64
+// RV32-NEXT:    ret i64 [[TMP2]]
+//
+// RV64-LABEL: define dso_local i64 @test_pmsne_u16x4_u16x4(
+// RV64-SAME: i64 noundef [[A_COERCE:%.*]], i64 noundef [[B_COERCE:%.*]]) 
#[[ATTR0]] {
+// RV64-NEXT:  [[ENTRY:.*:]]
+// RV64-NEXT:    [[TMP0:%.*]] = bitcast i64 [[A_COERCE]] to <4 x i16>
+// RV64-NEXT:    [[TMP1:%.*]] = bitcast i64 [[B_COERCE]] to <4 x i16>
+// RV64-NEXT:    [[CMP_I:%.*]] = icmp ne <4 x i16> [[TMP0]], [[TMP1]]
+// RV64-NEXT:    [[SEXT_I:%.*]] = sext <4 x i1> [[CMP_I]] to <4 x i16>
+// RV64-NEXT:    [[TMP2:%.*]] = bitcast <4 x i16> [[SEXT_I]] to i64
+// RV64-NEXT:    ret i64 [[TMP2]]
+//
+uint16x4_t test_pmsne_u16x4_u16x4(uint16x4_t a, uint16x4_t b) {
+  return __riscv_pmsne_u16x4_u16x4(a, b);
+}
+
+// RV32-LABEL: define dso_local i64 @test_pmslt_u16x4(
+// RV32-SAME: i64 noundef [[A_COERCE:%.*]], i64 noundef [[B_COERCE:%.*]]) 
#[[ATTR0]] {
+// RV32-NEXT:  [[ENTRY:.*:]]
+// RV32-NEXT:    [[TMP0:%.*]] = bitcast i64 [[A_COERCE]] to <4 x i16>
+// RV32-NEXT:    [[TMP1:%.*]] = bitcast i64 [[B_COERCE]] to <4 x i16>
+// RV32-NEXT:    [[CMP_I:%.*]] = icmp slt <4 x i16> [[TMP0]], [[TMP1]]
+// RV32-NEXT:    [[SEXT_I:%.*]] = sext <4 x i1> [[CMP_I]] to <4 x i16>
+// RV32-NEXT:    [[TMP2:%.*]] = bitcast <4 x i16> [[SEXT_I]] to i64
+// RV32-NEXT:    ret i64 [[TMP2]]
+//
+// RV64-LABEL: define dso_local i64 @test_pmslt_u16x4(
+// RV64-SAME: i64 noundef [[A_COERCE:%.*]], i64 noundef [[B_COERCE:%.*]]) 
#[[ATTR0]] {
+// RV64-NEXT:  [[ENTRY:.*:]]
+// RV64-NEXT:    [[TMP0:%.*]] = bitcast i64 [[A_COERCE]] to <4 x i16>
+// RV64-NEXT:    [[TMP1:%.*]] = bitcast i64 [[B_COERCE]] to <4 x i16>
+// RV64-NEXT:    [[CMP_I:%.*]] = icmp slt <4 x i16> [[TMP0]], [[TMP1]]
+// RV64-NEXT:    [[SEXT_I:%.*]] = sext <4 x i1> [[CMP_I]] to <4 x i16>
+// RV64-NEXT:    [[TMP2:%.*]] = bitcast <4 x i16> [[SEXT_I]] to i64
+// RV64-NEXT:    ret i64 [[TMP2]]
+//
+uint16x4_t test_pmslt_u16x4(int16x4_t a, int16x4_t b) {
+  return __riscv_pmslt_u16x4(a, b);
+}
+
+// RV32-LABEL: define dso_local i64 @test_pmsltu_u16x4(
+// RV32-SAME: i64 noundef [[A_COERCE:%.*]], i64 noundef [[B_COERCE:%.*]]) 
#[[ATTR0]] {
+// RV32-NEXT:  [[ENTRY:.*:]]
+// RV32-NEXT:    [[TMP0:%.*]] = bitcast i64 [[A_COERCE]] to <4 x i16>
+// RV32-NEXT:    [[TMP1:%.*]] = bitcast i64 [[B_COERCE]] to <4 x i16>
+// RV32-NEXT:    [[CMP_I:%.*]] = icmp ult <4 x i16> [[TMP0]], [[TMP1]]
+// RV32-NEXT:    [[SEXT_I:%.*]] = sext <4 x i1> [[CMP_I]] to <4 x i16>
+// RV32-NEXT:    [[TMP2:%.*]] = bitcast <4 x i16> [[SEXT_I]] to i64
+// RV32-NEXT:    ret i64 [[TMP2]]
+//
+// RV64-LABEL: define dso_local i64 @test_pmsltu_u16x4(
+// RV64-SAME: i64 noundef [[A_COERCE:%.*]], i64 noundef [[B_COERCE:%.*]]) 
#[[ATTR0]] {
+// RV64-NEXT:  [[ENTRY:.*:]]
+// RV64-NEXT:    [[TMP0:%.*]] = bitcast i64 [[A_COERCE]] to <4 x i16>
+// RV64-NEXT:    [[TMP1:%.*]] = bitcast i64 [[B_COERCE]] to <4 x i16>
+// RV64-NEXT:    [[CMP_I:%.*]] = icmp ult <4 x i16> [[TMP0]], [[TMP1]]
+// RV64-NEXT:    [[SEXT_I:%.*]] = sext <4 x i1> [[CMP_I]] to <4 x i16>
+// RV64-NEXT:    [[TMP2:%.*]] = bitcast <4 x i16> [[SEXT_I]] to i64
+// RV64-NEXT:    ret i64 [[TMP2]]
+//
+uint16x4_t test_pmsltu_u16x4(uint16x4_t a, uint16x4_t b) {
+  return __riscv_pmsltu_u16x4(a, b);
+}
+
+// RV32-LABEL: define dso_local i64 @test_pmsgt_u16x4(
+// RV32-SAME: i64 noundef [[A_COERCE:%.*]], i64 noundef [[B_COERCE:%.*]]) 
#[[ATTR0]] {
+// RV32-NEXT:  [[ENTRY:.*:]]
+// RV32-NEXT:    [[TMP0:%.*]] = bitcast i64 [[A_COERCE]] to <4 x i16>
+// RV32-NEXT:    [[TMP1:%.*]] = bitcast i64 [[B_COERCE]] to <4 x i16>
+// RV32-NEXT:    [[CMP_I:%.*]] = icmp sgt <4 x i16> [[TMP0]], [[TMP1]]
+// RV32-NEXT:    [[SEXT_I:%.*]] = sext <4 x i1> [[CMP_I]] to <4 x i16>
+// RV32-NEXT:    [[TMP2:%.*]] = bitcast <4 x i16> [[SEXT_I]] to i64
+// RV32-NEXT:    ret i64 [[TMP2]]
+//
+// RV64-LABEL: define dso_local i64 @test_pmsgt_u16x4(
+// RV64-SAME: i64 noundef [[A_COERCE:%.*]], i64 noundef [[B_COERCE:%.*]]) 
#[[ATTR0]] {
+// RV64-NEXT:  [[ENTRY:.*:]]
+// RV64-NEXT:    [[TMP0:%.*]] = bitcast i64 [[A_COERCE]] to <4 x i16>
+// RV64-NEXT:    [[TMP1:%.*]] = bitcast i64 [[B_COERCE]] to <4 x i16>
+// RV64-NEXT:    [[CMP_I:%.*]] = icmp sgt <4 x i16> [[TMP0]], [[TMP1]]
+// RV64-NEXT:    [[SEXT_I:%.*]] = sext <4 x i1> [[CMP_I]] to <4 x i16>
+// RV64-NEXT:    [[TMP2:%.*]] = bitcast <4 x i16> [[SEXT_I]] to i64
+// RV64-NEXT:    ret i64 [[TMP2]]
+//
+uint16x4_t test_pmsgt_u16x4(int16x4_t a, int16x4_t b) {
+  return __riscv_pmsgt_u16x4(a, b);
+}
+
+// RV32-LABEL: define dso_local i64 @test_pmsgtu_u16x4(
+// RV32-SAME: i64 noundef [[A_COERCE:%.*]], i64 noundef [[B_COERCE:%.*]]) 
#[[ATTR0]] {
+// RV32-NEXT:  [[ENTRY:.*:]]
+// RV32-NEXT:    [[TMP0:%.*]] = bitcast i64 [[A_COERCE]] to <4 x i16>
+// RV32-NEXT:    [[TMP1:%.*]] = bitcast i64 [[B_COERCE]] to <4 x i16>
+// RV32-NEXT:    [[CMP_I:%.*]] = icmp ugt <4 x i16> [[TMP0]], [[TMP1]]
+// RV32-NEXT:    [[SEXT_I:%.*]] = sext <4 x i1> [[CMP_I]] to <4 x i16>
+// RV32-NEXT:    [[TMP2:%.*]] = bitcast <4 x i16> [[SEXT_I]] to i64
+// RV32-NEXT:    ret i64 [[TMP2]]
+//
+// RV64-LABEL: define dso_local i64 @test_pmsgtu_u16x4(
+// RV64-SAME: i64 noundef [[A_COERCE:%.*]], i64 noundef [[B_COERCE:%.*]]) 
#[[ATTR0]] {
+// RV64-NEXT:  [[ENTRY:.*:]]
+// RV64-NEXT:    [[TMP0:%.*]] = bitcast i64 [[A_COERCE]] to <4 x i16>
+// RV64-NEXT:    [[TMP1:%.*]] = bitcast i64 [[B_COERCE]] to <4 x i16>
+// RV64-NEXT:    [[CMP_I:%.*]] = icmp ugt <4 x i16> [[TMP0]], [[TMP1]]
+// RV64-NEXT:    [[SEXT_I:%.*]] = sext <4 x i1> [[CMP_I]] to <4 x i16>
+// RV64-NEXT:    [[TMP2:%.*]] = bitcast <4 x i16> [[SEXT_I]] to i64
+// RV64-NEXT:    ret i64 [[TMP2]]
+//
+uint16x4_t test_pmsgtu_u16x4(uint16x4_t a, uint16x4_t b) {
+  return __riscv_pmsgtu_u16x4(a, b);
+}
+
+// RV32-LABEL: define dso_local i64 @test_pmsge_u16x4(
+// RV32-SAME: i64 noundef [[A_COERCE:%.*]], i64 noundef [[B_COERCE:%.*]]) 
#[[ATTR0]] {
+// RV32-NEXT:  [[ENTRY:.*:]]
+// RV32-NEXT:    [[TMP0:%.*]] = bitcast i64 [[A_COERCE]] to <4 x i16>
+// RV32-NEXT:    [[TMP1:%.*]] = bitcast i64 [[B_COERCE]] to <4 x i16>
+// RV32-NEXT:    [[CMP_I:%.*]] = icmp sge <4 x i16> [[TMP0]], [[TMP1]]
+// RV32-NEXT:    [[SEXT_I:%.*]] = sext <4 x i1> [[CMP_I]] to <4 x i16>
+// RV32-NEXT:    [[TMP2:%.*]] = bitcast <4 x i16> [[SEXT_I]] to i64
+// RV32-NEXT:    ret i64 [[TMP2]]
+//
+// RV64-LABEL: define dso_local i64 @test_pmsge_u16x4(
+// RV64-SAME: i64 noundef [[A_COERCE:%.*]], i64 noundef [[B_COERCE:%.*]]) 
#[[ATTR0]] {
+// RV64-NEXT:  [[ENTRY:.*:]]
+// RV64-NEXT:    [[TMP0:%.*]] = bitcast i64 [[A_COERCE]] to <4 x i16>
+// RV64-NEXT:    [[TMP1:%.*]] = bitcast i64 [[B_COERCE]] to <4 x i16>
+// RV64-NEXT:    [[CMP_I:%.*]] = icmp sge <4 x i16> [[TMP0]], [[TMP1]]
+// RV64-NEXT:    [[SEXT_I:%.*]] = sext <4 x i1> [[CMP_I]] to <4 x i16>
+// RV64-NEXT:    [[TMP2:%.*]] = bitcast <4 x i16> [[SEXT_I]] to i64
+// RV64-NEXT:    ret i64 [[TMP2]]
+//
+uint16x4_t test_pmsge_u16x4(int16x4_t a, int16x4_t b) {
+  return __riscv_pmsge_u16x4(a, b);
+}
+
+// RV32-LABEL: define dso_local i64 @test_pmsgeu_u16x4(
+// RV32-SAME: i64 noundef [[A_COERCE:%.*]], i64 noundef [[B_COERCE:%.*]]) 
#[[ATTR0]] {
+// RV32-NEXT:  [[ENTRY:.*:]]
+// RV32-NEXT:    [[TMP0:%.*]] = bitcast i64 [[A_COERCE]] to <4 x i16>
+// RV32-NEXT:    [[TMP1:%.*]] = bitcast i64 [[B_COERCE]] to <4 x i16>
+// RV32-NEXT:    [[CMP_I:%.*]] = icmp uge <4 x i16> [[TMP0]], [[TMP1]]
+// RV32-NEXT:    [[SEXT_I:%.*]] = sext <4 x i1> [[CMP_I]] to <4 x i16>
+// RV32-NEXT:    [[TMP2:%.*]] = bitcast <4 x i16> [[SEXT_I]] to i64
+// RV32-NEXT:    ret i64 [[TMP2]]
+//
+// RV64-LABEL: define dso_local i64 @test_pmsgeu_u16x4(
+// RV64-SAME: i64 noundef [[A_COERCE:%.*]], i64 noundef [[B_COERCE:%.*]]) 
#[[ATTR0]] {
+// RV64-NEXT:  [[ENTRY:.*:]]
+// RV64-NEXT:    [[TMP0:%.*]] = bitcast i64 [[A_COERCE]] to <4 x i16>
+// RV64-NEXT:    [[TMP1:%.*]] = bitcast i64 [[B_COERCE]] to <4 x i16>
+// RV64-NEXT:    [[CMP_I:%.*]] = icmp uge <4 x i16> [[TMP0]], [[TMP1]]
+// RV64-NEXT:    [[SEXT_I:%.*]] = sext <4 x i1> [[CMP_I]] to <4 x i16>
+// RV64-NEXT:    [[TMP2:%.*]] = bitcast <4 x i16> [[SEXT_I]] to i64
+// RV64-NEXT:    ret i64 [[TMP2]]
+//
+uint16x4_t test_pmsgeu_u16x4(uint16x4_t a, uint16x4_t b) {
+  return __riscv_pmsgeu_u16x4(a, b);
+}
+
+// RV32-LABEL: define dso_local i64 @test_pmsle_u16x4(
+// RV32-SAME: i64 noundef [[A_COERCE:%.*]], i64 noundef [[B_COERCE:%.*]]) 
#[[ATTR0]] {
+// RV32-NEXT:  [[ENTRY:.*:]]
+// RV32-NEXT:    [[TMP0:%.*]] = bitcast i64 [[A_COERCE]] to <4 x i16>
+// RV32-NEXT:    [[TMP1:%.*]] = bitcast i64 [[B_COERCE]] to <4 x i16>
+// RV32-NEXT:    [[CMP_I:%.*]] = icmp sle <4 x i16> [[TMP0]], [[TMP1]]
+// RV32-NEXT:    [[SEXT_I:%.*]] = sext <4 x i1> [[CMP_I]] to <4 x i16>
+// RV32-NEXT:    [[TMP2:%.*]] = bitcast <4 x i16> [[SEXT_I]] to i64
+// RV32-NEXT:    ret i64 [[TMP2]]
+//
+// RV64-LABEL: define dso_local i64 @test_pmsle_u16x4(
+// RV64-SAME: i64 noundef [[A_COERCE:%.*]], i64 noundef [[B_COERCE:%.*]]) 
#[[ATTR0]] {
+// RV64-NEXT:  [[ENTRY:.*:]]
+// RV64-NEXT:    [[TMP0:%.*]] = bitcast i64 [[A_COERCE]] to <4 x i16>
+// RV64-NEXT:    [[TMP1:%.*]] = bitcast i64 [[B_COERCE]] to <4 x i16>
+// RV64-NEXT:    [[CMP_I:%.*]] = icmp sle <4 x i16> [[TMP0]], [[TMP1]]
+// RV64-NEXT:    [[SEXT_I:%.*]] = sext <4 x i1> [[CMP_I]] to <4 x i16>
+// RV64-NEXT:    [[TMP2:%.*]] = bitcast <4 x i16> [[SEXT_I]] to i64
+// RV64-NEXT:    ret i64 [[TMP2]]
+//
+uint16x4_t test_pmsle_u16x4(int16x4_t a, int16x4_t b) {
+  return __riscv_pmsle_u16x4(a, b);
+}
+
+// RV32-LABEL: define dso_local i64 @test_pmsleu_u16x4(
+// RV32-SAME: i64 noundef [[A_COERCE:%.*]], i64 noundef [[B_COERCE:%.*]]) 
#[[ATTR0]] {
+// RV32-NEXT:  [[ENTRY:.*:]]
+// RV32-NEXT:    [[TMP0:%.*]] = bitcast i64 [[A_COERCE]] to <4 x i16>
+// RV32-NEXT:    [[TMP1:%.*]] = bitcast i64 [[B_COERCE]] to <4 x i16>
+// RV32-NEXT:    [[CMP_I:%.*]] = icmp ule <4 x i16> [[TMP0]], [[TMP1]]
+// RV32-NEXT:    [[SEXT_I:%.*]] = sext <4 x i1> [[CMP_I]] to <4 x i16>
+// RV32-NEXT:    [[TMP2:%.*]] = bitcast <4 x i16> [[SEXT_I]] to i64
+// RV32-NEXT:    ret i64 [[TMP2]]
+//
+// RV64-LABEL: define dso_local i64 @test_pmsleu_u16x4(
+// RV64-SAME: i64 noundef [[A_COERCE:%.*]], i64 noundef [[B_COERCE:%.*]]) 
#[[ATTR0]] {
+// RV64-NEXT:  [[ENTRY:.*:]]
+// RV64-NEXT:    [[TMP0:%.*]] = bitcast i64 [[A_COERCE]] to <4 x i16>
+// RV64-NEXT:    [[TMP1:%.*]] = bitcast i64 [[B_COERCE]] to <4 x i16>
+// RV64-NEXT:    [[CMP_I:%.*]] = icmp ule <4 x i16> [[TMP0]], [[TMP1]]
+// RV64-NEXT:    [[SEXT_I:%.*]] = sext <4 x i1> [[CMP_I]] to <4 x i16>
+// RV64-NEXT:    [[TMP2:%.*]] = bitcast <4 x i16> [[SEXT_I]] to i64
+// RV64-NEXT:    ret i64 [[TMP2]]
+//
+uint16x4_t test_pmsleu_u16x4(uint16x4_t a, uint16x4_t b) {
+  return __riscv_pmsleu_u16x4(a, b);
+}
+
+// RV32-LABEL: define dso_local i64 @test_pmseq_i32x2_u32x2(
+// RV32-SAME: i64 noundef [[A_COERCE:%.*]], i64 noundef [[B_COERCE:%.*]]) 
#[[ATTR0]] {
+// RV32-NEXT:  [[ENTRY:.*:]]
+// RV32-NEXT:    [[TMP0:%.*]] = bitcast i64 [[A_COERCE]] to <2 x i32>
+// RV32-NEXT:    [[TMP1:%.*]] = bitcast i64 [[B_COERCE]] to <2 x i32>
+// RV32-NEXT:    [[CMP_I:%.*]] = icmp eq <2 x i32> [[TMP0]], [[TMP1]]
+// RV32-NEXT:    [[SEXT_I:%.*]] = sext <2 x i1> [[CMP_I]] to <2 x i32>
+// RV32-NEXT:    [[TMP2:%.*]] = bitcast <2 x i32> [[SEXT_I]] to i64
+// RV32-NEXT:    ret i64 [[TMP2]]
+//
+// RV64-LABEL: define dso_local i64 @test_pmseq_i32x2_u32x2(
+// RV64-SAME: i64 noundef [[A_COERCE:%.*]], i64 noundef [[B_COERCE:%.*]]) 
#[[ATTR0]] {
+// RV64-NEXT:  [[ENTRY:.*:]]
+// RV64-NEXT:    [[TMP0:%.*]] = bitcast i64 [[A_COERCE]] to <2 x i32>
+// RV64-NEXT:    [[TMP1:%.*]] = bitcast i64 [[B_COERCE]] to <2 x i32>
+// RV64-NEXT:    [[CMP_I:%.*]] = icmp eq <2 x i32> [[TMP0]], [[TMP1]]
+// RV64-NEXT:    [[SEXT_I:%.*]] = sext <2 x i1> [[CMP_I]] to <2 x i32>
+// RV64-NEXT:    [[TMP2:%.*]] = bitcast <2 x i32> [[SEXT_I]] to i64
+// RV64-NEXT:    ret i64 [[TMP2]]
+//
+uint32x2_t test_pmseq_i32x2_u32x2(int32x2_t a, int32x2_t b) {
+  return __riscv_pmseq_i32x2_u32x2(a, b);
+}
+
+// RV32-LABEL: define dso_local i64 @test_pmseq_u32x2_u32x2(
+// RV32-SAME: i64 noundef [[A_COERCE:%.*]], i64 noundef [[B_COERCE:%.*]]) 
#[[ATTR0]] {
+// RV32-NEXT:  [[ENTRY:.*:]]
+// RV32-NEXT:    [[TMP0:%.*]] = bitcast i64 [[A_COERCE]] to <2 x i32>
+// RV32-NEXT:    [[TMP1:%.*]] = bitcast i64 [[B_COERCE]] to <2 x i32>
+// RV32-NEXT:    [[CMP_I:%.*]] = icmp eq <2 x i32> [[TMP0]], [[TMP1]]
+// RV32-NEXT:    [[SEXT_I:%.*]] = sext <2 x i1> [[CMP_I]] to <2 x i32>
+// RV32-NEXT:    [[TMP2:%.*]] = bitcast <2 x i32> [[SEXT_I]] to i64
+// RV32-NEXT:    ret i64 [[TMP2]]
+//
+// RV64-LABEL: define dso_local i64 @test_pmseq_u32x2_u32x2(
+// RV64-SAME: i64 noundef [[A_COERCE:%.*]], i64 noundef [[B_COERCE:%.*]]) 
#[[ATTR0]] {
+// RV64-NEXT:  [[ENTRY:.*:]]
+// RV64-NEXT:    [[TMP0:%.*]] = bitcast i64 [[A_COERCE]] to <2 x i32>
+// RV64-NEXT:    [[TMP1:%.*]] = bitcast i64 [[B_COERCE]] to <2 x i32>
+// RV64-NEXT:    [[CMP_I:%.*]] = icmp eq <2 x i32> [[TMP0]], [[TMP1]]
+// RV64-NEXT:    [[SEXT_I:%.*]] = sext <2 x i1> [[CMP_I]] to <2 x i32>
+// RV64-NEXT:    [[TMP2:%.*]] = bitcast <2 x i32> [[SEXT_I]] to i64
+// RV64-NEXT:    ret i64 [[TMP2]]
+//
+uint32x2_t test_pmseq_u32x2_u32x2(uint32x2_t a, uint32x2_t b) {
+  return __riscv_pmseq_u32x2_u32x2(a, b);
+}
+
+// RV32-LABEL: define dso_local i64 @test_pmsne_i32x2_u32x2(
+// RV32-SAME: i64 noundef [[A_COERCE:%.*]], i64 noundef [[B_COERCE:%.*]]) 
#[[ATTR0]] {
+// RV32-NEXT:  [[ENTRY:.*:]]
+// RV32-NEXT:    [[TMP0:%.*]] = bitcast i64 [[A_COERCE]] to <2 x i32>
+// RV32-NEXT:    [[TMP1:%.*]] = bitcast i64 [[B_COERCE]] to <2 x i32>
+// RV32-NEXT:    [[CMP_I:%.*]] = icmp ne <2 x i32> [[TMP0]], [[TMP1]]
+// RV32-NEXT:    [[SEXT_I:%.*]] = sext <2 x i1> [[CMP_I]] to <2 x i32>
+// RV32-NEXT:    [[TMP2:%.*]] = bitcast <2 x i32> [[SEXT_I]] to i64
+// RV32-NEXT:    ret i64 [[TMP2]]
+//
+// RV64-LABEL: define dso_local i64 @test_pmsne_i32x2_u32x2(
+// RV64-SAME: i64 noundef [[A_COERCE:%.*]], i64 noundef [[B_COERCE:%.*]]) 
#[[ATTR0]] {
+// RV64-NEXT:  [[ENTRY:.*:]]
+// RV64-NEXT:    [[TMP0:%.*]] = bitcast i64 [[A_COERCE]] to <2 x i32>
+// RV64-NEXT:    [[TMP1:%.*]] = bitcast i64 [[B_COERCE]] to <2 x i32>
+// RV64-NEXT:    [[CMP_I:%.*]] = icmp ne <2 x i32> [[TMP0]], [[TMP1]]
+// RV64-NEXT:    [[SEXT_I:%.*]] = sext <2 x i1> [[CMP_I]] to <2 x i32>
+// RV64-NEXT:    [[TMP2:%.*]] = bitcast <2 x i32> [[SEXT_I]] to i64
+// RV64-NEXT:    ret i64 [[TMP2]]
+//
+uint32x2_t test_pmsne_i32x2_u32x2(int32x2_t a, int32x2_t b) {
+  return __riscv_pmsne_i32x2_u32x2(a, b);
+}
+
+// RV32-LABEL: define dso_local i64 @test_pmsne_u32x2_u32x2(
+// RV32-SAME: i64 noundef [[A_COERCE:%.*]], i64 noundef [[B_COERCE:%.*]]) 
#[[ATTR0]] {
+// RV32-NEXT:  [[ENTRY:.*:]]
+// RV32-NEXT:    [[TMP0:%.*]] = bitcast i64 [[A_COERCE]] to <2 x i32>
+// RV32-NEXT:    [[TMP1:%.*]] = bitcast i64 [[B_COERCE]] to <2 x i32>
+// RV32-NEXT:    [[CMP_I:%.*]] = icmp ne <2 x i32> [[TMP0]], [[TMP1]]
+// RV32-NEXT:    [[SEXT_I:%.*]] = sext <2 x i1> [[CMP_I]] to <2 x i32>
+// RV32-NEXT:    [[TMP2:%.*]] = bitcast <2 x i32> [[SEXT_I]] to i64
+// RV32-NEXT:    ret i64 [[TMP2]]
+//
+// RV64-LABEL: define dso_local i64 @test_pmsne_u32x2_u32x2(
+// RV64-SAME: i64 noundef [[A_COERCE:%.*]], i64 noundef [[B_COERCE:%.*]]) 
#[[ATTR0]] {
+// RV64-NEXT:  [[ENTRY:.*:]]
+// RV64-NEXT:    [[TMP0:%.*]] = bitcast i64 [[A_COERCE]] to <2 x i32>
+// RV64-NEXT:    [[TMP1:%.*]] = bitcast i64 [[B_COERCE]] to <2 x i32>
+// RV64-NEXT:    [[CMP_I:%.*]] = icmp ne <2 x i32> [[TMP0]], [[TMP1]]
+// RV64-NEXT:    [[SEXT_I:%.*]] = sext <2 x i1> [[CMP_I]] to <2 x i32>
+// RV64-NEXT:    [[TMP2:%.*]] = bitcast <2 x i32> [[SEXT_I]] to i64
+// RV64-NEXT:    ret i64 [[TMP2]]
+//
+uint32x2_t test_pmsne_u32x2_u32x2(uint32x2_t a, uint32x2_t b) {
+  return __riscv_pmsne_u32x2_u32x2(a, b);
+}
+
+// RV32-LABEL: define dso_local i64 @test_pmslt_u32x2(
+// RV32-SAME: i64 noundef [[A_COERCE:%.*]], i64 noundef [[B_COERCE:%.*]]) 
#[[ATTR0]] {
+// RV32-NEXT:  [[ENTRY:.*:]]
+// RV32-NEXT:    [[TMP0:%.*]] = bitcast i64 [[A_COERCE]] to <2 x i32>
+// RV32-NEXT:    [[TMP1:%.*]] = bitcast i64 [[B_COERCE]] to <2 x i32>
+// RV32-NEXT:    [[CMP_I:%.*]] = icmp slt <2 x i32> [[TMP0]], [[TMP1]]
+// RV32-NEXT:    [[SEXT_I:%.*]] = sext <2 x i1> [[CMP_I]] to <2 x i32>
+// RV32-NEXT:    [[TMP2:%.*]] = bitcast <2 x i32> [[SEXT_I]] to i64
+// RV32-NEXT:    ret i64 [[TMP2]]
+//
+// RV64-LABEL: define dso_local i64 @test_pmslt_u32x2(
+// RV64-SAME: i64 noundef [[A_COERCE:%.*]], i64 noundef [[B_COERCE:%.*]]) 
#[[ATTR0]] {
+// RV64-NEXT:  [[ENTRY:.*:]]
+// RV64-NEXT:    [[TMP0:%.*]] = bitcast i64 [[A_COERCE]] to <2 x i32>
+// RV64-NEXT:    [[TMP1:%.*]] = bitcast i64 [[B_COERCE]] to <2 x i32>
+// RV64-NEXT:    [[CMP_I:%.*]] = icmp slt <2 x i32> [[TMP0]], [[TMP1]]
+// RV64-NEXT:    [[SEXT_I:%.*]] = sext <2 x i1> [[CMP_I]] to <2 x i32>
+// RV64-NEXT:    [[TMP2:%.*]] = bitcast <2 x i32> [[SEXT_I]] to i64
+// RV64-NEXT:    ret i64 [[TMP2]]
+//
+uint32x2_t test_pmslt_u32x2(int32x2_t a, int32x2_t b) {
+  return __riscv_pmslt_u32x2(a, b);
+}
+
+// RV32-LABEL: define dso_local i64 @test_pmsltu_u32x2(
+// RV32-SAME: i64 noundef [[A_COERCE:%.*]], i64 noundef [[B_COERCE:%.*]]) 
#[[ATTR0]] {
+// RV32-NEXT:  [[ENTRY:.*:]]
+// RV32-NEXT:    [[TMP0:%.*]] = bitcast i64 [[A_COERCE]] to <2 x i32>
+// RV32-NEXT:    [[TMP1:%.*]] = bitcast i64 [[B_COERCE]] to <2 x i32>
+// RV32-NEXT:    [[CMP_I:%.*]] = icmp ult <2 x i32> [[TMP0]], [[TMP1]]
+// RV32-NEXT:    [[SEXT_I:%.*]] = sext <2 x i1> [[CMP_I]] to <2 x i32>
+// RV32-NEXT:    [[TMP2:%.*]] = bitcast <2 x i32> [[SEXT_I]] to i64
+// RV32-NEXT:    ret i64 [[TMP2]]
+//
+// RV64-LABEL: define dso_local i64 @test_pmsltu_u32x2(
+// RV64-SAME: i64 noundef [[A_COERCE:%.*]], i64 noundef [[B_COERCE:%.*]]) 
#[[ATTR0]] {
+// RV64-NEXT:  [[ENTRY:.*:]]
+// RV64-NEXT:    [[TMP0:%.*]] = bitcast i64 [[A_COERCE]] to <2 x i32>
+// RV64-NEXT:    [[TMP1:%.*]] = bitcast i64 [[B_COERCE]] to <2 x i32>
+// RV64-NEXT:    [[CMP_I:%.*]] = icmp ult <2 x i32> [[TMP0]], [[TMP1]]
+// RV64-NEXT:    [[SEXT_I:%.*]] = sext <2 x i1> [[CMP_I]] to <2 x i32>
+// RV64-NEXT:    [[TMP2:%.*]] = bitcast <2 x i32> [[SEXT_I]] to i64
+// RV64-NEXT:    ret i64 [[TMP2]]
+//
+uint32x2_t test_pmsltu_u32x2(uint32x2_t a, uint32x2_t b) {
+  return __riscv_pmsltu_u32x2(a, b);
+}
+
+// RV32-LABEL: define dso_local i64 @test_pmsgt_u32x2(
+// RV32-SAME: i64 noundef [[A_COERCE:%.*]], i64 noundef [[B_COERCE:%.*]]) 
#[[ATTR0]] {
+// RV32-NEXT:  [[ENTRY:.*:]]
+// RV32-NEXT:    [[TMP0:%.*]] = bitcast i64 [[A_COERCE]] to <2 x i32>
+// RV32-NEXT:    [[TMP1:%.*]] = bitcast i64 [[B_COERCE]] to <2 x i32>
+// RV32-NEXT:    [[CMP_I:%.*]] = icmp sgt <2 x i32> [[TMP0]], [[TMP1]]
+// RV32-NEXT:    [[SEXT_I:%.*]] = sext <2 x i1> [[CMP_I]] to <2 x i32>
+// RV32-NEXT:    [[TMP2:%.*]] = bitcast <2 x i32> [[SEXT_I]] to i64
+// RV32-NEXT:    ret i64 [[TMP2]]
+//
+// RV64-LABEL: define dso_local i64 @test_pmsgt_u32x2(
+// RV64-SAME: i64 noundef [[A_COERCE:%.*]], i64 noundef [[B_COERCE:%.*]]) 
#[[ATTR0]] {
+// RV64-NEXT:  [[ENTRY:.*:]]
+// RV64-NEXT:    [[TMP0:%.*]] = bitcast i64 [[A_COERCE]] to <2 x i32>
+// RV64-NEXT:    [[TMP1:%.*]] = bitcast i64 [[B_COERCE]] to <2 x i32>
+// RV64-NEXT:    [[CMP_I:%.*]] = icmp sgt <2 x i32> [[TMP0]], [[TMP1]]
+// RV64-NEXT:    [[SEXT_I:%.*]] = sext <2 x i1> [[CMP_I]] to <2 x i32>
+// RV64-NEXT:    [[TMP2:%.*]] = bitcast <2 x i32> [[SEXT_I]] to i64
+// RV64-NEXT:    ret i64 [[TMP2]]
+//
+uint32x2_t test_pmsgt_u32x2(int32x2_t a, int32x2_t b) {
+  return __riscv_pmsgt_u32x2(a, b);
+}
+
+// RV32-LABEL: define dso_local i64 @test_pmsgtu_u32x2(
+// RV32-SAME: i64 noundef [[A_COERCE:%.*]], i64 noundef [[B_COERCE:%.*]]) 
#[[ATTR0]] {
+// RV32-NEXT:  [[ENTRY:.*:]]
+// RV32-NEXT:    [[TMP0:%.*]] = bitcast i64 [[A_COERCE]] to <2 x i32>
+// RV32-NEXT:    [[TMP1:%.*]] = bitcast i64 [[B_COERCE]] to <2 x i32>
+// RV32-NEXT:    [[CMP_I:%.*]] = icmp ugt <2 x i32> [[TMP0]], [[TMP1]]
+// RV32-NEXT:    [[SEXT_I:%.*]] = sext <2 x i1> [[CMP_I]] to <2 x i32>
+// RV32-NEXT:    [[TMP2:%.*]] = bitcast <2 x i32> [[SEXT_I]] to i64
+// RV32-NEXT:    ret i64 [[TMP2]]
+//
+// RV64-LABEL: define dso_local i64 @test_pmsgtu_u32x2(
+// RV64-SAME: i64 noundef [[A_COERCE:%.*]], i64 noundef [[B_COERCE:%.*]]) 
#[[ATTR0]] {
+// RV64-NEXT:  [[ENTRY:.*:]]
+// RV64-NEXT:    [[TMP0:%.*]] = bitcast i64 [[A_COERCE]] to <2 x i32>
+// RV64-NEXT:    [[TMP1:%.*]] = bitcast i64 [[B_COERCE]] to <2 x i32>
+// RV64-NEXT:    [[CMP_I:%.*]] = icmp ugt <2 x i32> [[TMP0]], [[TMP1]]
+// RV64-NEXT:    [[SEXT_I:%.*]] = sext <2 x i1> [[CMP_I]] to <2 x i32>
+// RV64-NEXT:    [[TMP2:%.*]] = bitcast <2 x i32> [[SEXT_I]] to i64
+// RV64-NEXT:    ret i64 [[TMP2]]
+//
+uint32x2_t test_pmsgtu_u32x2(uint32x2_t a, uint32x2_t b) {
+  return __riscv_pmsgtu_u32x2(a, b);
+}
+
+// RV32-LABEL: define dso_local i64 @test_pmsge_u32x2(
+// RV32-SAME: i64 noundef [[A_COERCE:%.*]], i64 noundef [[B_COERCE:%.*]]) 
#[[ATTR0]] {
+// RV32-NEXT:  [[ENTRY:.*:]]
+// RV32-NEXT:    [[TMP0:%.*]] = bitcast i64 [[A_COERCE]] to <2 x i32>
+// RV32-NEXT:    [[TMP1:%.*]] = bitcast i64 [[B_COERCE]] to <2 x i32>
+// RV32-NEXT:    [[CMP_I:%.*]] = icmp sge <2 x i32> [[TMP0]], [[TMP1]]
+// RV32-NEXT:    [[SEXT_I:%.*]] = sext <2 x i1> [[CMP_I]] to <2 x i32>
+// RV32-NEXT:    [[TMP2:%.*]] = bitcast <2 x i32> [[SEXT_I]] to i64
+// RV32-NEXT:    ret i64 [[TMP2]]
+//
+// RV64-LABEL: define dso_local i64 @test_pmsge_u32x2(
+// RV64-SAME: i64 noundef [[A_COERCE:%.*]], i64 noundef [[B_COERCE:%.*]]) 
#[[ATTR0]] {
+// RV64-NEXT:  [[ENTRY:.*:]]
+// RV64-NEXT:    [[TMP0:%.*]] = bitcast i64 [[A_COERCE]] to <2 x i32>
+// RV64-NEXT:    [[TMP1:%.*]] = bitcast i64 [[B_COERCE]] to <2 x i32>
+// RV64-NEXT:    [[CMP_I:%.*]] = icmp sge <2 x i32> [[TMP0]], [[TMP1]]
+// RV64-NEXT:    [[SEXT_I:%.*]] = sext <2 x i1> [[CMP_I]] to <2 x i32>
+// RV64-NEXT:    [[TMP2:%.*]] = bitcast <2 x i32> [[SEXT_I]] to i64
+// RV64-NEXT:    ret i64 [[TMP2]]
+//
+uint32x2_t test_pmsge_u32x2(int32x2_t a, int32x2_t b) {
+  return __riscv_pmsge_u32x2(a, b);
+}
+
+// RV32-LABEL: define dso_local i64 @test_pmsgeu_u32x2(
+// RV32-SAME: i64 noundef [[A_COERCE:%.*]], i64 noundef [[B_COERCE:%.*]]) 
#[[ATTR0]] {
+// RV32-NEXT:  [[ENTRY:.*:]]
+// RV32-NEXT:    [[TMP0:%.*]] = bitcast i64 [[A_COERCE]] to <2 x i32>
+// RV32-NEXT:    [[TMP1:%.*]] = bitcast i64 [[B_COERCE]] to <2 x i32>
+// RV32-NEXT:    [[CMP_I:%.*]] = icmp uge <2 x i32> [[TMP0]], [[TMP1]]
+// RV32-NEXT:    [[SEXT_I:%.*]] = sext <2 x i1> [[CMP_I]] to <2 x i32>
+// RV32-NEXT:    [[TMP2:%.*]] = bitcast <2 x i32> [[SEXT_I]] to i64
+// RV32-NEXT:    ret i64 [[TMP2]]
+//
+// RV64-LABEL: define dso_local i64 @test_pmsgeu_u32x2(
+// RV64-SAME: i64 noundef [[A_COERCE:%.*]], i64 noundef [[B_COERCE:%.*]]) 
#[[ATTR0]] {
+// RV64-NEXT:  [[ENTRY:.*:]]
+// RV64-NEXT:    [[TMP0:%.*]] = bitcast i64 [[A_COERCE]] to <2 x i32>
+// RV64-NEXT:    [[TMP1:%.*]] = bitcast i64 [[B_COERCE]] to <2 x i32>
+// RV64-NEXT:    [[CMP_I:%.*]] = icmp uge <2 x i32> [[TMP0]], [[TMP1]]
+// RV64-NEXT:    [[SEXT_I:%.*]] = sext <2 x i1> [[CMP_I]] to <2 x i32>
+// RV64-NEXT:    [[TMP2:%.*]] = bitcast <2 x i32> [[SEXT_I]] to i64
+// RV64-NEXT:    ret i64 [[TMP2]]
+//
+uint32x2_t test_pmsgeu_u32x2(uint32x2_t a, uint32x2_t b) {
+  return __riscv_pmsgeu_u32x2(a, b);
+}
+
+// RV32-LABEL: define dso_local i64 @test_pmsle_u32x2(
+// RV32-SAME: i64 noundef [[A_COERCE:%.*]], i64 noundef [[B_COERCE:%.*]]) 
#[[ATTR0]] {
+// RV32-NEXT:  [[ENTRY:.*:]]
+// RV32-NEXT:    [[TMP0:%.*]] = bitcast i64 [[A_COERCE]] to <2 x i32>
+// RV32-NEXT:    [[TMP1:%.*]] = bitcast i64 [[B_COERCE]] to <2 x i32>
+// RV32-NEXT:    [[CMP_I:%.*]] = icmp sle <2 x i32> [[TMP0]], [[TMP1]]
+// RV32-NEXT:    [[SEXT_I:%.*]] = sext <2 x i1> [[CMP_I]] to <2 x i32>
+// RV32-NEXT:    [[TMP2:%.*]] = bitcast <2 x i32> [[SEXT_I]] to i64
+// RV32-NEXT:    ret i64 [[TMP2]]
+//
+// RV64-LABEL: define dso_local i64 @test_pmsle_u32x2(
+// RV64-SAME: i64 noundef [[A_COERCE:%.*]], i64 noundef [[B_COERCE:%.*]]) 
#[[ATTR0]] {
+// RV64-NEXT:  [[ENTRY:.*:]]
+// RV64-NEXT:    [[TMP0:%.*]] = bitcast i64 [[A_COERCE]] to <2 x i32>
+// RV64-NEXT:    [[TMP1:%.*]] = bitcast i64 [[B_COERCE]] to <2 x i32>
+// RV64-NEXT:    [[CMP_I:%.*]] = icmp sle <2 x i32> [[TMP0]], [[TMP1]]
+// RV64-NEXT:    [[SEXT_I:%.*]] = sext <2 x i1> [[CMP_I]] to <2 x i32>
+// RV64-NEXT:    [[TMP2:%.*]] = bitcast <2 x i32> [[SEXT_I]] to i64
+// RV64-NEXT:    ret i64 [[TMP2]]
+//
+uint32x2_t test_pmsle_u32x2(int32x2_t a, int32x2_t b) {
+  return __riscv_pmsle_u32x2(a, b);
+}
+
+// RV32-LABEL: define dso_local i64 @test_pmsleu_u32x2(
+// RV32-SAME: i64 noundef [[A_COERCE:%.*]], i64 noundef [[B_COERCE:%.*]]) 
#[[ATTR0]] {
+// RV32-NEXT:  [[ENTRY:.*:]]
+// RV32-NEXT:    [[TMP0:%.*]] = bitcast i64 [[A_COERCE]] to <2 x i32>
+// RV32-NEXT:    [[TMP1:%.*]] = bitcast i64 [[B_COERCE]] to <2 x i32>
+// RV32-NEXT:    [[CMP_I:%.*]] = icmp ule <2 x i32> [[TMP0]], [[TMP1]]
+// RV32-NEXT:    [[SEXT_I:%.*]] = sext <2 x i1> [[CMP_I]] to <2 x i32>
+// RV32-NEXT:    [[TMP2:%.*]] = bitcast <2 x i32> [[SEXT_I]] to i64
+// RV32-NEXT:    ret i64 [[TMP2]]
+//
+// RV64-LABEL: define dso_local i64 @test_pmsleu_u32x2(
+// RV64-SAME: i64 noundef [[A_COERCE:%.*]], i64 noundef [[B_COERCE:%.*]]) 
#[[ATTR0]] {
+// RV64-NEXT:  [[ENTRY:.*:]]
+// RV64-NEXT:    [[TMP0:%.*]] = bitcast i64 [[A_COERCE]] to <2 x i32>
+// RV64-NEXT:    [[TMP1:%.*]] = bitcast i64 [[B_COERCE]] to <2 x i32>
+// RV64-NEXT:    [[CMP_I:%.*]] = icmp ule <2 x i32> [[TMP0]], [[TMP1]]
+// RV64-NEXT:    [[SEXT_I:%.*]] = sext <2 x i1> [[CMP_I]] to <2 x i32>
+// RV64-NEXT:    [[TMP2:%.*]] = bitcast <2 x i32> [[SEXT_I]] to i64
+// RV64-NEXT:    ret i64 [[TMP2]]
+//
+uint32x2_t test_pmsleu_u32x2(uint32x2_t a, uint32x2_t b) {
+  return __riscv_pmsleu_u32x2(a, b);
+}
+
 
 /* Packed Shifts (32-bit) */
 
diff --git a/cross-project-tests/intrinsic-header-tests/riscv_packed_simd.c 
b/cross-project-tests/intrinsic-header-tests/riscv_packed_simd.c
index 288780e1252c0..971795c877198 100644
--- a/cross-project-tests/intrinsic-header-tests/riscv_packed_simd.c
+++ b/cross-project-tests/intrinsic-header-tests/riscv_packed_simd.c
@@ -1196,3 +1196,447 @@ int32x2_t test_pnot_i32x2(int32x2_t a) { return 
__riscv_pnot_i32x2(a); }
 // RV32-COUNT-2: not{{[[:space:]]}}
 // RV64:         not{{[[:space:]]}}
 uint32x2_t test_pnot_u32x2(uint32x2_t a) { return __riscv_pnot_u32x2(a); }
+
+// CHECK-LABEL: test_pmseq_i8x4_u8x4:
+// CHECK:       pmseq.b
+uint8x4_t test_pmseq_i8x4_u8x4(int8x4_t a, int8x4_t b) {
+  return __riscv_pmseq_i8x4_u8x4(a, b);
+}
+
+// CHECK-LABEL: test_pmseq_u8x4_u8x4:
+// CHECK:       pmseq.b
+uint8x4_t test_pmseq_u8x4_u8x4(uint8x4_t a, uint8x4_t b) {
+  return __riscv_pmseq_u8x4_u8x4(a, b);
+}
+
+// CHECK-LABEL: test_pmsne_i8x4_u8x4:
+// CHECK:       pmseq.b
+// CHECK:       not{{[[:space:]]}}
+uint8x4_t test_pmsne_i8x4_u8x4(int8x4_t a, int8x4_t b) {
+  return __riscv_pmsne_i8x4_u8x4(a, b);
+}
+
+// CHECK-LABEL: test_pmsne_u8x4_u8x4:
+// CHECK:       pmseq.b
+// CHECK:       not{{[[:space:]]}}
+uint8x4_t test_pmsne_u8x4_u8x4(uint8x4_t a, uint8x4_t b) {
+  return __riscv_pmsne_u8x4_u8x4(a, b);
+}
+
+// CHECK-LABEL: test_pmslt_u8x4:
+// CHECK:       pmslt.b
+uint8x4_t test_pmslt_u8x4(int8x4_t a, int8x4_t b) {
+  return __riscv_pmslt_u8x4(a, b);
+}
+
+// CHECK-LABEL: test_pmsltu_u8x4:
+// CHECK:       pmsltu.b
+uint8x4_t test_pmsltu_u8x4(uint8x4_t a, uint8x4_t b) {
+  return __riscv_pmsltu_u8x4(a, b);
+}
+
+// CHECK-LABEL: test_pmsgt_u8x4:
+// CHECK:       pmslt.b
+uint8x4_t test_pmsgt_u8x4(int8x4_t a, int8x4_t b) {
+  return __riscv_pmsgt_u8x4(a, b);
+}
+
+// CHECK-LABEL: test_pmsgtu_u8x4:
+// CHECK:       pmsltu.b
+uint8x4_t test_pmsgtu_u8x4(uint8x4_t a, uint8x4_t b) {
+  return __riscv_pmsgtu_u8x4(a, b);
+}
+
+// CHECK-LABEL: test_pmsge_u8x4:
+// CHECK:       pmslt.b
+// CHECK:       not{{[[:space:]]}}
+uint8x4_t test_pmsge_u8x4(int8x4_t a, int8x4_t b) {
+  return __riscv_pmsge_u8x4(a, b);
+}
+
+// CHECK-LABEL: test_pmsgeu_u8x4:
+// CHECK:       pmsltu.b
+// CHECK:       not{{[[:space:]]}}
+uint8x4_t test_pmsgeu_u8x4(uint8x4_t a, uint8x4_t b) {
+  return __riscv_pmsgeu_u8x4(a, b);
+}
+
+// CHECK-LABEL: test_pmsle_u8x4:
+// CHECK:       pmslt.b
+// CHECK:       not{{[[:space:]]}}
+uint8x4_t test_pmsle_u8x4(int8x4_t a, int8x4_t b) {
+  return __riscv_pmsle_u8x4(a, b);
+}
+
+// CHECK-LABEL: test_pmsleu_u8x4:
+// CHECK:       pmsltu.b
+// CHECK:       not{{[[:space:]]}}
+uint8x4_t test_pmsleu_u8x4(uint8x4_t a, uint8x4_t b) {
+  return __riscv_pmsleu_u8x4(a, b);
+}
+
+// CHECK-LABEL: test_pmseq_i16x2_u16x2:
+// CHECK:       pmseq.h
+uint16x2_t test_pmseq_i16x2_u16x2(int16x2_t a, int16x2_t b) {
+  return __riscv_pmseq_i16x2_u16x2(a, b);
+}
+
+// CHECK-LABEL: test_pmseq_u16x2_u16x2:
+// CHECK:       pmseq.h
+uint16x2_t test_pmseq_u16x2_u16x2(uint16x2_t a, uint16x2_t b) {
+  return __riscv_pmseq_u16x2_u16x2(a, b);
+}
+
+// CHECK-LABEL: test_pmsne_i16x2_u16x2:
+// CHECK:       pmseq.h
+// CHECK:       not{{[[:space:]]}}
+uint16x2_t test_pmsne_i16x2_u16x2(int16x2_t a, int16x2_t b) {
+  return __riscv_pmsne_i16x2_u16x2(a, b);
+}
+
+// CHECK-LABEL: test_pmsne_u16x2_u16x2:
+// CHECK:       pmseq.h
+// CHECK:       not{{[[:space:]]}}
+uint16x2_t test_pmsne_u16x2_u16x2(uint16x2_t a, uint16x2_t b) {
+  return __riscv_pmsne_u16x2_u16x2(a, b);
+}
+
+// CHECK-LABEL: test_pmslt_u16x2:
+// CHECK:       pmslt.h
+uint16x2_t test_pmslt_u16x2(int16x2_t a, int16x2_t b) {
+  return __riscv_pmslt_u16x2(a, b);
+}
+
+// CHECK-LABEL: test_pmsltu_u16x2:
+// CHECK:       pmsltu.h
+uint16x2_t test_pmsltu_u16x2(uint16x2_t a, uint16x2_t b) {
+  return __riscv_pmsltu_u16x2(a, b);
+}
+
+// CHECK-LABEL: test_pmsgt_u16x2:
+// CHECK:       pmslt.h
+uint16x2_t test_pmsgt_u16x2(int16x2_t a, int16x2_t b) {
+  return __riscv_pmsgt_u16x2(a, b);
+}
+
+// CHECK-LABEL: test_pmsgtu_u16x2:
+// CHECK:       pmsltu.h
+uint16x2_t test_pmsgtu_u16x2(uint16x2_t a, uint16x2_t b) {
+  return __riscv_pmsgtu_u16x2(a, b);
+}
+
+// CHECK-LABEL: test_pmsge_u16x2:
+// CHECK:       pmslt.h
+// CHECK:       not{{[[:space:]]}}
+uint16x2_t test_pmsge_u16x2(int16x2_t a, int16x2_t b) {
+  return __riscv_pmsge_u16x2(a, b);
+}
+
+// CHECK-LABEL: test_pmsgeu_u16x2:
+// CHECK:       pmsltu.h
+// CHECK:       not{{[[:space:]]}}
+uint16x2_t test_pmsgeu_u16x2(uint16x2_t a, uint16x2_t b) {
+  return __riscv_pmsgeu_u16x2(a, b);
+}
+
+// CHECK-LABEL: test_pmsle_u16x2:
+// CHECK:       pmslt.h
+// CHECK:       not{{[[:space:]]}}
+uint16x2_t test_pmsle_u16x2(int16x2_t a, int16x2_t b) {
+  return __riscv_pmsle_u16x2(a, b);
+}
+
+// CHECK-LABEL: test_pmsleu_u16x2:
+// CHECK:       pmsltu.h
+// CHECK:       not{{[[:space:]]}}
+uint16x2_t test_pmsleu_u16x2(uint16x2_t a, uint16x2_t b) {
+  return __riscv_pmsleu_u16x2(a, b);
+}
+
+// CHECK-LABEL: test_pmseq_i8x8_u8x8:
+// RV32:        pmseq.db
+// RV64:        pmseq.b
+uint8x8_t test_pmseq_i8x8_u8x8(int8x8_t a, int8x8_t b) {
+  return __riscv_pmseq_i8x8_u8x8(a, b);
+}
+
+// CHECK-LABEL: test_pmseq_u8x8_u8x8:
+// RV32:        pmseq.db
+// RV64:        pmseq.b
+uint8x8_t test_pmseq_u8x8_u8x8(uint8x8_t a, uint8x8_t b) {
+  return __riscv_pmseq_u8x8_u8x8(a, b);
+}
+
+// CHECK-LABEL: test_pmsne_i8x8_u8x8:
+// RV32:         pmseq.db
+// RV32-COUNT-2: not{{[[:space:]]}}
+// RV64:         pmseq.b
+// RV64:         not{{[[:space:]]}}
+uint8x8_t test_pmsne_i8x8_u8x8(int8x8_t a, int8x8_t b) {
+  return __riscv_pmsne_i8x8_u8x8(a, b);
+}
+
+// CHECK-LABEL: test_pmsne_u8x8_u8x8:
+// RV32:         pmseq.db
+// RV32-COUNT-2: not{{[[:space:]]}}
+// RV64:         pmseq.b
+// RV64:         not{{[[:space:]]}}
+uint8x8_t test_pmsne_u8x8_u8x8(uint8x8_t a, uint8x8_t b) {
+  return __riscv_pmsne_u8x8_u8x8(a, b);
+}
+
+// CHECK-LABEL: test_pmslt_u8x8:
+// RV32:        pmslt.db
+// RV64:        pmslt.b
+uint8x8_t test_pmslt_u8x8(int8x8_t a, int8x8_t b) {
+  return __riscv_pmslt_u8x8(a, b);
+}
+
+// CHECK-LABEL: test_pmsltu_u8x8:
+// RV32:        pmsltu.db
+// RV64:        pmsltu.b
+uint8x8_t test_pmsltu_u8x8(uint8x8_t a, uint8x8_t b) {
+  return __riscv_pmsltu_u8x8(a, b);
+}
+
+// CHECK-LABEL: test_pmsgt_u8x8:
+// RV32:        pmslt.db
+// RV64:        pmslt.b
+uint8x8_t test_pmsgt_u8x8(int8x8_t a, int8x8_t b) {
+  return __riscv_pmsgt_u8x8(a, b);
+}
+
+// CHECK-LABEL: test_pmsgtu_u8x8:
+// RV32:        pmsltu.db
+// RV64:        pmsltu.b
+uint8x8_t test_pmsgtu_u8x8(uint8x8_t a, uint8x8_t b) {
+  return __riscv_pmsgtu_u8x8(a, b);
+}
+
+// CHECK-LABEL: test_pmsge_u8x8:
+// RV32:         pmslt.db
+// RV32-COUNT-2: not{{[[:space:]]}}
+// RV64:         pmslt.b
+// RV64:         not{{[[:space:]]}}
+uint8x8_t test_pmsge_u8x8(int8x8_t a, int8x8_t b) {
+  return __riscv_pmsge_u8x8(a, b);
+}
+
+// CHECK-LABEL: test_pmsgeu_u8x8:
+// RV32:         pmsltu.db
+// RV32-COUNT-2: not{{[[:space:]]}}
+// RV64:         pmsltu.b
+// RV64:         not{{[[:space:]]}}
+uint8x8_t test_pmsgeu_u8x8(uint8x8_t a, uint8x8_t b) {
+  return __riscv_pmsgeu_u8x8(a, b);
+}
+
+// CHECK-LABEL: test_pmsle_u8x8:
+// RV32:         pmslt.db
+// RV32-COUNT-2: not{{[[:space:]]}}
+// RV64:         pmslt.b
+// RV64:         not{{[[:space:]]}}
+uint8x8_t test_pmsle_u8x8(int8x8_t a, int8x8_t b) {
+  return __riscv_pmsle_u8x8(a, b);
+}
+
+// CHECK-LABEL: test_pmsleu_u8x8:
+// RV32:         pmsltu.db
+// RV32-COUNT-2: not{{[[:space:]]}}
+// RV64:         pmsltu.b
+// RV64:         not{{[[:space:]]}}
+uint8x8_t test_pmsleu_u8x8(uint8x8_t a, uint8x8_t b) {
+  return __riscv_pmsleu_u8x8(a, b);
+}
+
+// CHECK-LABEL: test_pmseq_i16x4_u16x4:
+// RV32:        pmseq.dh
+// RV64:        pmseq.h
+uint16x4_t test_pmseq_i16x4_u16x4(int16x4_t a, int16x4_t b) {
+  return __riscv_pmseq_i16x4_u16x4(a, b);
+}
+
+// CHECK-LABEL: test_pmseq_u16x4_u16x4:
+// RV32:        pmseq.dh
+// RV64:        pmseq.h
+uint16x4_t test_pmseq_u16x4_u16x4(uint16x4_t a, uint16x4_t b) {
+  return __riscv_pmseq_u16x4_u16x4(a, b);
+}
+
+// CHECK-LABEL: test_pmsne_i16x4_u16x4:
+// RV32:         pmseq.dh
+// RV32-COUNT-2: not{{[[:space:]]}}
+// RV64:         pmseq.h
+// RV64:         not{{[[:space:]]}}
+uint16x4_t test_pmsne_i16x4_u16x4(int16x4_t a, int16x4_t b) {
+  return __riscv_pmsne_i16x4_u16x4(a, b);
+}
+
+// CHECK-LABEL: test_pmsne_u16x4_u16x4:
+// RV32:         pmseq.dh
+// RV32-COUNT-2: not{{[[:space:]]}}
+// RV64:         pmseq.h
+// RV64:         not{{[[:space:]]}}
+uint16x4_t test_pmsne_u16x4_u16x4(uint16x4_t a, uint16x4_t b) {
+  return __riscv_pmsne_u16x4_u16x4(a, b);
+}
+
+// CHECK-LABEL: test_pmslt_u16x4:
+// RV32:        pmslt.dh
+// RV64:        pmslt.h
+uint16x4_t test_pmslt_u16x4(int16x4_t a, int16x4_t b) {
+  return __riscv_pmslt_u16x4(a, b);
+}
+
+// CHECK-LABEL: test_pmsltu_u16x4:
+// RV32:        pmsltu.dh
+// RV64:        pmsltu.h
+uint16x4_t test_pmsltu_u16x4(uint16x4_t a, uint16x4_t b) {
+  return __riscv_pmsltu_u16x4(a, b);
+}
+
+// CHECK-LABEL: test_pmsgt_u16x4:
+// RV32:        pmslt.dh
+// RV64:        pmslt.h
+uint16x4_t test_pmsgt_u16x4(int16x4_t a, int16x4_t b) {
+  return __riscv_pmsgt_u16x4(a, b);
+}
+
+// CHECK-LABEL: test_pmsgtu_u16x4:
+// RV32:        pmsltu.dh
+// RV64:        pmsltu.h
+uint16x4_t test_pmsgtu_u16x4(uint16x4_t a, uint16x4_t b) {
+  return __riscv_pmsgtu_u16x4(a, b);
+}
+
+// CHECK-LABEL: test_pmsge_u16x4:
+// RV32:         pmslt.dh
+// RV32-COUNT-2: not{{[[:space:]]}}
+// RV64:         pmslt.h
+// RV64:         not{{[[:space:]]}}
+uint16x4_t test_pmsge_u16x4(int16x4_t a, int16x4_t b) {
+  return __riscv_pmsge_u16x4(a, b);
+}
+
+// CHECK-LABEL: test_pmsgeu_u16x4:
+// RV32:         pmsltu.dh
+// RV32-COUNT-2: not{{[[:space:]]}}
+// RV64:         pmsltu.h
+// RV64:         not{{[[:space:]]}}
+uint16x4_t test_pmsgeu_u16x4(uint16x4_t a, uint16x4_t b) {
+  return __riscv_pmsgeu_u16x4(a, b);
+}
+
+// CHECK-LABEL: test_pmsle_u16x4:
+// RV32:         pmslt.dh
+// RV32-COUNT-2: not{{[[:space:]]}}
+// RV64:         pmslt.h
+// RV64:         not{{[[:space:]]}}
+uint16x4_t test_pmsle_u16x4(int16x4_t a, int16x4_t b) {
+  return __riscv_pmsle_u16x4(a, b);
+}
+
+// CHECK-LABEL: test_pmsleu_u16x4:
+// RV32:         pmsltu.dh
+// RV32-COUNT-2: not{{[[:space:]]}}
+// RV64:         pmsltu.h
+// RV64:         not{{[[:space:]]}}
+uint16x4_t test_pmsleu_u16x4(uint16x4_t a, uint16x4_t b) {
+  return __riscv_pmsleu_u16x4(a, b);
+}
+
+// CHECK-LABEL: test_pmseq_i32x2_u32x2:
+// RV32:        pmseq.dw
+// RV64:        pmseq.w
+uint32x2_t test_pmseq_i32x2_u32x2(int32x2_t a, int32x2_t b) {
+  return __riscv_pmseq_i32x2_u32x2(a, b);
+}
+
+// CHECK-LABEL: test_pmseq_u32x2_u32x2:
+// RV32:        pmseq.dw
+// RV64:        pmseq.w
+uint32x2_t test_pmseq_u32x2_u32x2(uint32x2_t a, uint32x2_t b) {
+  return __riscv_pmseq_u32x2_u32x2(a, b);
+}
+
+// CHECK-LABEL: test_pmsne_i32x2_u32x2:
+// RV32:         pmseq.dw
+// RV32-COUNT-2: not{{[[:space:]]}}
+// RV64:         pmseq.w
+// RV64:         not{{[[:space:]]}}
+uint32x2_t test_pmsne_i32x2_u32x2(int32x2_t a, int32x2_t b) {
+  return __riscv_pmsne_i32x2_u32x2(a, b);
+}
+
+// CHECK-LABEL: test_pmsne_u32x2_u32x2:
+// RV32:         pmseq.dw
+// RV32-COUNT-2: not{{[[:space:]]}}
+// RV64:         pmseq.w
+// RV64:         not{{[[:space:]]}}
+uint32x2_t test_pmsne_u32x2_u32x2(uint32x2_t a, uint32x2_t b) {
+  return __riscv_pmsne_u32x2_u32x2(a, b);
+}
+
+// CHECK-LABEL: test_pmslt_u32x2:
+// RV32:        pmslt.dw
+// RV64:        pmslt.w
+uint32x2_t test_pmslt_u32x2(int32x2_t a, int32x2_t b) {
+  return __riscv_pmslt_u32x2(a, b);
+}
+
+// CHECK-LABEL: test_pmsltu_u32x2:
+// RV32:        pmsltu.dw
+// RV64:        pmsltu.w
+uint32x2_t test_pmsltu_u32x2(uint32x2_t a, uint32x2_t b) {
+  return __riscv_pmsltu_u32x2(a, b);
+}
+
+// CHECK-LABEL: test_pmsgt_u32x2:
+// RV32:        pmslt.dw
+// RV64:        pmslt.w
+uint32x2_t test_pmsgt_u32x2(int32x2_t a, int32x2_t b) {
+  return __riscv_pmsgt_u32x2(a, b);
+}
+
+// CHECK-LABEL: test_pmsgtu_u32x2:
+// RV32:        pmsltu.dw
+// RV64:        pmsltu.w
+uint32x2_t test_pmsgtu_u32x2(uint32x2_t a, uint32x2_t b) {
+  return __riscv_pmsgtu_u32x2(a, b);
+}
+
+// CHECK-LABEL: test_pmsge_u32x2:
+// RV32:         pmslt.dw
+// RV32-COUNT-2: not{{[[:space:]]}}
+// RV64:         pmslt.w
+// RV64:         not{{[[:space:]]}}
+uint32x2_t test_pmsge_u32x2(int32x2_t a, int32x2_t b) {
+  return __riscv_pmsge_u32x2(a, b);
+}
+
+// CHECK-LABEL: test_pmsgeu_u32x2:
+// RV32:         pmsltu.dw
+// RV32-COUNT-2: not{{[[:space:]]}}
+// RV64:         pmsltu.w
+// RV64:         not{{[[:space:]]}}
+uint32x2_t test_pmsgeu_u32x2(uint32x2_t a, uint32x2_t b) {
+  return __riscv_pmsgeu_u32x2(a, b);
+}
+
+// CHECK-LABEL: test_pmsle_u32x2:
+// RV32:         pmslt.dw
+// RV32-COUNT-2: not{{[[:space:]]}}
+// RV64:         pmslt.w
+// RV64:         not{{[[:space:]]}}
+uint32x2_t test_pmsle_u32x2(int32x2_t a, int32x2_t b) {
+  return __riscv_pmsle_u32x2(a, b);
+}
+
+// CHECK-LABEL: test_pmsleu_u32x2:
+// RV32:         pmsltu.dw
+// RV32-COUNT-2: not{{[[:space:]]}}
+// RV64:         pmsltu.w
+// RV64:         not{{[[:space:]]}}
+uint32x2_t test_pmsleu_u32x2(uint32x2_t a, uint32x2_t b) {
+  return __riscv_pmsleu_u32x2(a, b);
+}

_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to