From bec7ad9fd6bceb6521448b24faddb01bc52de3a7 Mon Sep 17 00:00:00 2001 From: Luke Lau Date: Wed, 6 Mar 2024 14:58:42 +0800 Subject: [PATCH] [RISCV] Add tests for vw{add,sub,mul} with nested extend. NFC These test cases show (op (ext a), (ext b)) patterns where the dest EEW is more than 2 * source EEW. These could be lowered into widening ops where we still have extend the operands, but at a smaller EEW. --- llvm/test/CodeGen/RISCV/rvv/vwadd-sdnode.ll | 1088 +++++++++++++++++-- llvm/test/CodeGen/RISCV/rvv/vwmul-sdnode.ll | 864 ++++++++++++++- llvm/test/CodeGen/RISCV/rvv/vwsub-sdnode.ll | 1072 ++++++++++++++++-- 3 files changed, 2848 insertions(+), 176 deletions(-) diff --git a/llvm/test/CodeGen/RISCV/rvv/vwadd-sdnode.ll b/llvm/test/CodeGen/RISCV/rvv/vwadd-sdnode.ll index 89e69565b39e3fd..a559fbf2bc8a7ab 100644 --- a/llvm/test/CodeGen/RISCV/rvv/vwadd-sdnode.ll +++ b/llvm/test/CodeGen/RISCV/rvv/vwadd-sdnode.ll @@ -2,8 +2,8 @@ ; RUN: llc -mtriple=riscv32 -mattr=+v -verify-machineinstrs < %s | FileCheck %s ; RUN: llc -mtriple=riscv64 -mattr=+v -verify-machineinstrs < %s | FileCheck %s -define @vwadd_vv_nxv1i64( %va, %vb) { -; CHECK-LABEL: vwadd_vv_nxv1i64: +define @vwadd_vv_nxv1i64_nxv1i32( %va, %vb) { +; CHECK-LABEL: vwadd_vv_nxv1i64_nxv1i32: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a0, zero, e32, mf2, ta, ma ; CHECK-NEXT: vwadd.vv v10, v8, v9 @@ -15,8 +15,8 @@ define @vwadd_vv_nxv1i64( %va, %ve } -define @vwaddu_vv_nxv1i64( %va, %vb) { -; CHECK-LABEL: vwaddu_vv_nxv1i64: +define @vwaddu_vv_nxv1i64_nxv1i32( %va, %vb) { +; CHECK-LABEL: vwaddu_vv_nxv1i64_nxv1i32: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a0, zero, e32, mf2, ta, ma ; CHECK-NEXT: vwaddu.vv v10, v8, v9 @@ -28,8 +28,8 @@ define @vwaddu_vv_nxv1i64( %va, %ve } -define @vwadd_vx_nxv1i64( %va, i32 %b) { -; CHECK-LABEL: vwadd_vx_nxv1i64: +define @vwadd_vx_nxv1i64_nxv1i32( %va, i32 %b) { +; CHECK-LABEL: vwadd_vx_nxv1i64_nxv1i32: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a1, zero, e32, mf2, ta, ma ; CHECK-NEXT: vwadd.vx v9, v8, a0 @@ -43,8 +43,8 @@ define @vwadd_vx_nxv1i64( %va, i32 %b) { ret %ve } -define @vwaddu_vx_nxv1i64( %va, i32 %b) { -; CHECK-LABEL: vwaddu_vx_nxv1i64: +define @vwaddu_vx_nxv1i64_nxv1i32( %va, i32 %b) { +; CHECK-LABEL: vwaddu_vx_nxv1i64_nxv1i32: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a1, zero, e32, mf2, ta, ma ; CHECK-NEXT: vwaddu.vx v9, v8, a0 @@ -58,8 +58,8 @@ define @vwaddu_vx_nxv1i64( %va, i32 %b) { ret %ve } -define @vwadd_wv_nxv1i64( %va, %vb) { -; CHECK-LABEL: vwadd_wv_nxv1i64: +define @vwadd_wv_nxv1i64_nxv1i32( %va, %vb) { +; CHECK-LABEL: vwadd_wv_nxv1i64_nxv1i32: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a0, zero, e32, mf2, ta, ma ; CHECK-NEXT: vwadd.wv v8, v8, v9 @@ -69,8 +69,8 @@ define @vwadd_wv_nxv1i64( %va, %vd } -define @vwaddu_wv_nxv1i64( %va, %vb) { -; CHECK-LABEL: vwaddu_wv_nxv1i64: +define @vwaddu_wv_nxv1i64_nxv1i32( %va, %vb) { +; CHECK-LABEL: vwaddu_wv_nxv1i64_nxv1i32: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a0, zero, e32, mf2, ta, ma ; CHECK-NEXT: vwaddu.wv v8, v8, v9 @@ -80,8 +80,8 @@ define @vwaddu_wv_nxv1i64( %va, %vd } -define @vwadd_wx_nxv1i64( %va, i32 %b) { -; CHECK-LABEL: vwadd_wx_nxv1i64: +define @vwadd_wx_nxv1i64_nxv1i32( %va, i32 %b) { +; CHECK-LABEL: vwadd_wx_nxv1i64_nxv1i32: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a1, zero, e32, mf2, ta, ma ; CHECK-NEXT: vwadd.wx v8, v8, a0 @@ -93,8 +93,8 @@ define @vwadd_wx_nxv1i64( %va, i32 %b) { ret %vc } -define @vwaddu_wx_nxv1i64( %va, i32 %b) { -; CHECK-LABEL: vwaddu_wx_nxv1i64: +define @vwaddu_wx_nxv1i64_nxv1i32( %va, i32 %b) { +; CHECK-LABEL: vwaddu_wx_nxv1i64_nxv1i32: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a1, zero, e32, mf2, ta, ma ; CHECK-NEXT: vwaddu.wx v8, v8, a0 @@ -106,8 +106,8 @@ define @vwaddu_wx_nxv1i64( %va, i32 %b) { ret %vc } -define @vwadd_vv_nxv2i64( %va, %vb) { -; CHECK-LABEL: vwadd_vv_nxv2i64: +define @vwadd_vv_nxv2i64_nxv2i32( %va, %vb) { +; CHECK-LABEL: vwadd_vv_nxv2i64_nxv2i32: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a0, zero, e32, m1, ta, ma ; CHECK-NEXT: vwadd.vv v10, v8, v9 @@ -119,8 +119,8 @@ define @vwadd_vv_nxv2i64( %va, %ve } -define @vwaddu_vv_nxv2i64( %va, %vb) { -; CHECK-LABEL: vwaddu_vv_nxv2i64: +define @vwaddu_vv_nxv2i64_nxv2i32( %va, %vb) { +; CHECK-LABEL: vwaddu_vv_nxv2i64_nxv2i32: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a0, zero, e32, m1, ta, ma ; CHECK-NEXT: vwaddu.vv v10, v8, v9 @@ -132,8 +132,8 @@ define @vwaddu_vv_nxv2i64( %va, %ve } -define @vwadd_vx_nxv2i64( %va, i32 %b) { -; CHECK-LABEL: vwadd_vx_nxv2i64: +define @vwadd_vx_nxv2i64_nxv2i32( %va, i32 %b) { +; CHECK-LABEL: vwadd_vx_nxv2i64_nxv2i32: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a1, zero, e32, m1, ta, ma ; CHECK-NEXT: vwadd.vx v10, v8, a0 @@ -147,8 +147,8 @@ define @vwadd_vx_nxv2i64( %va, i32 %b) { ret %ve } -define @vwaddu_vx_nxv2i64( %va, i32 %b) { -; CHECK-LABEL: vwaddu_vx_nxv2i64: +define @vwaddu_vx_nxv2i64_nxv2i32( %va, i32 %b) { +; CHECK-LABEL: vwaddu_vx_nxv2i64_nxv2i32: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a1, zero, e32, m1, ta, ma ; CHECK-NEXT: vwaddu.vx v10, v8, a0 @@ -162,8 +162,8 @@ define @vwaddu_vx_nxv2i64( %va, i32 %b) { ret %ve } -define @vwadd_wv_nxv2i64( %va, %vb) { -; CHECK-LABEL: vwadd_wv_nxv2i64: +define @vwadd_wv_nxv2i64_nxv2i32( %va, %vb) { +; CHECK-LABEL: vwadd_wv_nxv2i64_nxv2i32: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a0, zero, e32, m1, ta, ma ; CHECK-NEXT: vwadd.wv v8, v8, v10 @@ -173,8 +173,8 @@ define @vwadd_wv_nxv2i64( %va, %vd } -define @vwaddu_wv_nxv2i64( %va, %vb) { -; CHECK-LABEL: vwaddu_wv_nxv2i64: +define @vwaddu_wv_nxv2i64_nxv2i32( %va, %vb) { +; CHECK-LABEL: vwaddu_wv_nxv2i64_nxv2i32: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a0, zero, e32, m1, ta, ma ; CHECK-NEXT: vwaddu.wv v8, v8, v10 @@ -184,8 +184,8 @@ define @vwaddu_wv_nxv2i64( %va, %vd } -define @vwadd_wx_nxv2i64( %va, i32 %b) { -; CHECK-LABEL: vwadd_wx_nxv2i64: +define @vwadd_wx_nxv2i64_nxv2i32( %va, i32 %b) { +; CHECK-LABEL: vwadd_wx_nxv2i64_nxv2i32: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a1, zero, e32, m1, ta, ma ; CHECK-NEXT: vwadd.wx v8, v8, a0 @@ -197,8 +197,8 @@ define @vwadd_wx_nxv2i64( %va, i32 %b) { ret %vc } -define @vwaddu_wx_nxv2i64( %va, i32 %b) { -; CHECK-LABEL: vwaddu_wx_nxv2i64: +define @vwaddu_wx_nxv2i64_nxv2i32( %va, i32 %b) { +; CHECK-LABEL: vwaddu_wx_nxv2i64_nxv2i32: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a1, zero, e32, m1, ta, ma ; CHECK-NEXT: vwaddu.wx v8, v8, a0 @@ -210,8 +210,8 @@ define @vwaddu_wx_nxv2i64( %va, i32 %b) { ret %vc } -define @vwadd_vv_nxv4i64( %va, %vb) { -; CHECK-LABEL: vwadd_vv_nxv4i64: +define @vwadd_vv_nxv4i64_nxv4i32( %va, %vb) { +; CHECK-LABEL: vwadd_vv_nxv4i64_nxv4i32: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a0, zero, e32, m2, ta, ma ; CHECK-NEXT: vwadd.vv v12, v8, v10 @@ -223,8 +223,8 @@ define @vwadd_vv_nxv4i64( %va, %ve } -define @vwaddu_vv_nxv4i64( %va, %vb) { -; CHECK-LABEL: vwaddu_vv_nxv4i64: +define @vwaddu_vv_nxv4i64_nxv4i32( %va, %vb) { +; CHECK-LABEL: vwaddu_vv_nxv4i64_nxv4i32: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a0, zero, e32, m2, ta, ma ; CHECK-NEXT: vwaddu.vv v12, v8, v10 @@ -236,8 +236,8 @@ define @vwaddu_vv_nxv4i64( %va, %ve } -define @vwadd_vx_nxv4i64( %va, i32 %b) { -; CHECK-LABEL: vwadd_vx_nxv4i64: +define @vwadd_vx_nxv4i64_nxv4i32( %va, i32 %b) { +; CHECK-LABEL: vwadd_vx_nxv4i64_nxv4i32: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a1, zero, e32, m2, ta, ma ; CHECK-NEXT: vwadd.vx v12, v8, a0 @@ -251,8 +251,8 @@ define @vwadd_vx_nxv4i64( %va, i32 %b) { ret %ve } -define @vwaddu_vx_nxv4i64( %va, i32 %b) { -; CHECK-LABEL: vwaddu_vx_nxv4i64: +define @vwaddu_vx_nxv4i64_nxv4i32( %va, i32 %b) { +; CHECK-LABEL: vwaddu_vx_nxv4i64_nxv4i32: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a1, zero, e32, m2, ta, ma ; CHECK-NEXT: vwaddu.vx v12, v8, a0 @@ -266,8 +266,8 @@ define @vwaddu_vx_nxv4i64( %va, i32 %b) { ret %ve } -define @vwadd_wv_nxv4i64( %va, %vb) { -; CHECK-LABEL: vwadd_wv_nxv4i64: +define @vwadd_wv_nxv4i64_nxv4i32( %va, %vb) { +; CHECK-LABEL: vwadd_wv_nxv4i64_nxv4i32: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a0, zero, e32, m2, ta, ma ; CHECK-NEXT: vwadd.wv v8, v8, v12 @@ -277,8 +277,8 @@ define @vwadd_wv_nxv4i64( %va, %vd } -define @vwaddu_wv_nxv4i64( %va, %vb) { -; CHECK-LABEL: vwaddu_wv_nxv4i64: +define @vwaddu_wv_nxv4i64_nxv4i32( %va, %vb) { +; CHECK-LABEL: vwaddu_wv_nxv4i64_nxv4i32: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a0, zero, e32, m2, ta, ma ; CHECK-NEXT: vwaddu.wv v8, v8, v12 @@ -288,8 +288,8 @@ define @vwaddu_wv_nxv4i64( %va, %vd } -define @vwadd_wx_nxv4i64( %va, i32 %b) { -; CHECK-LABEL: vwadd_wx_nxv4i64: +define @vwadd_wx_nxv4i64_nxv4i32( %va, i32 %b) { +; CHECK-LABEL: vwadd_wx_nxv4i64_nxv4i32: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a1, zero, e32, m2, ta, ma ; CHECK-NEXT: vwadd.wx v8, v8, a0 @@ -301,8 +301,8 @@ define @vwadd_wx_nxv4i64( %va, i32 %b) { ret %vc } -define @vwaddu_wx_nxv4i64( %va, i32 %b) { -; CHECK-LABEL: vwaddu_wx_nxv4i64: +define @vwaddu_wx_nxv4i64_nxv4i32( %va, i32 %b) { +; CHECK-LABEL: vwaddu_wx_nxv4i64_nxv4i32: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a1, zero, e32, m2, ta, ma ; CHECK-NEXT: vwaddu.wx v8, v8, a0 @@ -314,8 +314,8 @@ define @vwaddu_wx_nxv4i64( %va, i32 %b) { ret %vc } -define @vwadd_vv_nxv8i64( %va, %vb) { -; CHECK-LABEL: vwadd_vv_nxv8i64: +define @vwadd_vv_nxv8i64_nxv8i32( %va, %vb) { +; CHECK-LABEL: vwadd_vv_nxv8i64_nxv8i32: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, ma ; CHECK-NEXT: vwadd.vv v16, v8, v12 @@ -327,8 +327,8 @@ define @vwadd_vv_nxv8i64( %va, %ve } -define @vwaddu_vv_nxv8i64( %va, %vb) { -; CHECK-LABEL: vwaddu_vv_nxv8i64: +define @vwaddu_vv_nxv8i64_nxv8i32( %va, %vb) { +; CHECK-LABEL: vwaddu_vv_nxv8i64_nxv8i32: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, ma ; CHECK-NEXT: vwaddu.vv v16, v8, v12 @@ -340,8 +340,8 @@ define @vwaddu_vv_nxv8i64( %va, %ve } -define @vwadd_vx_nxv8i64( %va, i32 %b) { -; CHECK-LABEL: vwadd_vx_nxv8i64: +define @vwadd_vx_nxv8i64_nxv8i32( %va, i32 %b) { +; CHECK-LABEL: vwadd_vx_nxv8i64_nxv8i32: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a1, zero, e32, m4, ta, ma ; CHECK-NEXT: vwadd.vx v16, v8, a0 @@ -355,8 +355,8 @@ define @vwadd_vx_nxv8i64( %va, i32 %b) { ret %ve } -define @vwaddu_vx_nxv8i64( %va, i32 %b) { -; CHECK-LABEL: vwaddu_vx_nxv8i64: +define @vwaddu_vx_nxv8i64_nxv8i32( %va, i32 %b) { +; CHECK-LABEL: vwaddu_vx_nxv8i64_nxv8i32: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a1, zero, e32, m4, ta, ma ; CHECK-NEXT: vwaddu.vx v16, v8, a0 @@ -370,8 +370,8 @@ define @vwaddu_vx_nxv8i64( %va, i32 %b) { ret %ve } -define @vwadd_wv_nxv8i64( %va, %vb) { -; CHECK-LABEL: vwadd_wv_nxv8i64: +define @vwadd_wv_nxv8i64_nxv8i32( %va, %vb) { +; CHECK-LABEL: vwadd_wv_nxv8i64_nxv8i32: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, ma ; CHECK-NEXT: vwadd.wv v8, v8, v16 @@ -381,8 +381,8 @@ define @vwadd_wv_nxv8i64( %va, %vd } -define @vwaddu_wv_nxv8i64( %va, %vb) { -; CHECK-LABEL: vwaddu_wv_nxv8i64: +define @vwaddu_wv_nxv8i64_nxv8i32( %va, %vb) { +; CHECK-LABEL: vwaddu_wv_nxv8i64_nxv8i32: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, ma ; CHECK-NEXT: vwaddu.wv v8, v8, v16 @@ -392,8 +392,8 @@ define @vwaddu_wv_nxv8i64( %va, %vd } -define @vwadd_wx_nxv8i64( %va, i32 %b) { -; CHECK-LABEL: vwadd_wx_nxv8i64: +define @vwadd_wx_nxv8i64_nxv8i32( %va, i32 %b) { +; CHECK-LABEL: vwadd_wx_nxv8i64_nxv8i32: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a1, zero, e32, m4, ta, ma ; CHECK-NEXT: vwadd.wx v8, v8, a0 @@ -405,8 +405,8 @@ define @vwadd_wx_nxv8i64( %va, i32 %b) { ret %vc } -define @vwaddu_wx_nxv8i64( %va, i32 %b) { -; CHECK-LABEL: vwaddu_wx_nxv8i64: +define @vwaddu_wx_nxv8i64_nxv8i32( %va, i32 %b) { +; CHECK-LABEL: vwaddu_wx_nxv8i64_nxv8i32: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a1, zero, e32, m4, ta, ma ; CHECK-NEXT: vwaddu.wx v8, v8, a0 @@ -417,3 +417,963 @@ define @vwaddu_wx_nxv8i64( %va, i32 %b) { %vc = add %va, %vb ret %vc } + +define @vwadd_vv_nxv1i64_nxv1i16( %va, %vb) { +; CHECK-LABEL: vwadd_vv_nxv1i64_nxv1i16: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a0, zero, e64, m1, ta, ma +; CHECK-NEXT: vsext.vf4 v10, v8 +; CHECK-NEXT: vsext.vf4 v8, v9 +; CHECK-NEXT: vadd.vv v8, v10, v8 +; CHECK-NEXT: ret + %vc = sext %va to + %vd = sext %vb to + %ve = add %vc, %vd + ret %ve +} + +define @vwaddu_vv_nxv1i64_nxv1i16( %va, %vb) { +; CHECK-LABEL: vwaddu_vv_nxv1i64_nxv1i16: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a0, zero, e64, m1, ta, ma +; CHECK-NEXT: vzext.vf4 v10, v8 +; CHECK-NEXT: vzext.vf4 v8, v9 +; CHECK-NEXT: vadd.vv v8, v10, v8 +; CHECK-NEXT: ret + %vc = zext %va to + %vd = zext %vb to + %ve = add %vc, %vd + ret %ve +} + +define @vwadd_vx_nxv1i64_nxv1i16( %va, i16 %b) { +; CHECK-LABEL: vwadd_vx_nxv1i64_nxv1i16: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a1, zero, e16, mf4, ta, ma +; CHECK-NEXT: vmv.v.x v9, a0 +; CHECK-NEXT: vsetvli zero, zero, e64, m1, ta, ma +; CHECK-NEXT: vsext.vf4 v10, v8 +; CHECK-NEXT: vsext.vf4 v8, v9 +; CHECK-NEXT: vadd.vv v8, v10, v8 +; CHECK-NEXT: ret + %head = insertelement poison, i16 %b, i16 0 + %splat = shufflevector %head, poison, zeroinitializer + %vc = sext %va to + %vd = sext %splat to + %ve = add %vc, %vd + ret %ve +} + +define @vwaddu_vx_nxv1i64_nxv1i16( %va, i16 %b) { +; CHECK-LABEL: vwaddu_vx_nxv1i64_nxv1i16: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a1, zero, e16, mf4, ta, ma +; CHECK-NEXT: vmv.v.x v9, a0 +; CHECK-NEXT: vsetvli zero, zero, e64, m1, ta, ma +; CHECK-NEXT: vzext.vf4 v10, v8 +; CHECK-NEXT: vzext.vf4 v8, v9 +; CHECK-NEXT: vadd.vv v8, v10, v8 +; CHECK-NEXT: ret + %head = insertelement poison, i16 %b, i16 0 + %splat = shufflevector %head, poison, zeroinitializer + %vc = zext %va to + %vd = zext %splat to + %ve = add %vc, %vd + ret %ve +} + +define @vwadd_wv_nxv1i64_nxv1i16( %va, %vb) { +; CHECK-LABEL: vwadd_wv_nxv1i64_nxv1i16: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a0, zero, e64, m1, ta, ma +; CHECK-NEXT: vsext.vf4 v10, v9 +; CHECK-NEXT: vadd.vv v8, v8, v10 +; CHECK-NEXT: ret + %vc = sext %vb to + %vd = add %va, %vc + ret %vd +} + +define @vwaddu_wv_nxv1i64_nxv1i16( %va, %vb) { +; CHECK-LABEL: vwaddu_wv_nxv1i64_nxv1i16: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a0, zero, e64, m1, ta, ma +; CHECK-NEXT: vzext.vf4 v10, v9 +; CHECK-NEXT: vadd.vv v8, v8, v10 +; CHECK-NEXT: ret + %vc = zext %vb to + %vd = add %va, %vc + ret %vd +} + +define @vwadd_wx_nxv1i64_nxv1i16( %va, i16 %b) { +; CHECK-LABEL: vwadd_wx_nxv1i64_nxv1i16: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a1, zero, e16, mf4, ta, ma +; CHECK-NEXT: vmv.v.x v9, a0 +; CHECK-NEXT: vsetvli zero, zero, e64, m1, ta, ma +; CHECK-NEXT: vsext.vf4 v10, v9 +; CHECK-NEXT: vadd.vv v8, v8, v10 +; CHECK-NEXT: ret + %head = insertelement poison, i16 %b, i16 0 + %splat = shufflevector %head, poison, zeroinitializer + %vb = sext %splat to + %vc = add %va, %vb + ret %vc +} + +define @vwaddu_wx_nxv1i64_nxv1i16( %va, i16 %b) { +; CHECK-LABEL: vwaddu_wx_nxv1i64_nxv1i16: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a1, zero, e16, mf4, ta, ma +; CHECK-NEXT: vmv.v.x v9, a0 +; CHECK-NEXT: vsetvli zero, zero, e64, m1, ta, ma +; CHECK-NEXT: vzext.vf4 v10, v9 +; CHECK-NEXT: vadd.vv v8, v8, v10 +; CHECK-NEXT: ret + %head = insertelement poison, i16 %b, i16 0 + %splat = shufflevector %head, poison, zeroinitializer + %vb = zext %splat to + %vc = add %va, %vb + ret %vc +} + +define @vwadd_vv_nxv2i64_nxv2i16( %va, %vb) { +; CHECK-LABEL: vwadd_vv_nxv2i64_nxv2i16: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a0, zero, e64, m2, ta, ma +; CHECK-NEXT: vsext.vf4 v10, v8 +; CHECK-NEXT: vsext.vf4 v12, v9 +; CHECK-NEXT: vadd.vv v8, v10, v12 +; CHECK-NEXT: ret + %vc = sext %va to + %vd = sext %vb to + %ve = add %vc, %vd + ret %ve +} + +define @vwaddu_vv_nxv2i64_nxv2i16( %va, %vb) { +; CHECK-LABEL: vwaddu_vv_nxv2i64_nxv2i16: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a0, zero, e64, m2, ta, ma +; CHECK-NEXT: vzext.vf4 v10, v8 +; CHECK-NEXT: vzext.vf4 v12, v9 +; CHECK-NEXT: vadd.vv v8, v10, v12 +; CHECK-NEXT: ret + %vc = zext %va to + %vd = zext %vb to + %ve = add %vc, %vd + ret %ve +} + +define @vwadd_vx_nxv2i64_nxv2i16( %va, i16 %b) { +; CHECK-LABEL: vwadd_vx_nxv2i64_nxv2i16: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a1, zero, e16, mf2, ta, ma +; CHECK-NEXT: vmv.v.x v9, a0 +; CHECK-NEXT: vsetvli zero, zero, e64, m2, ta, ma +; CHECK-NEXT: vsext.vf4 v10, v8 +; CHECK-NEXT: vsext.vf4 v12, v9 +; CHECK-NEXT: vadd.vv v8, v10, v12 +; CHECK-NEXT: ret + %head = insertelement poison, i16 %b, i16 0 + %splat = shufflevector %head, poison, zeroinitializer + %vc = sext %va to + %vd = sext %splat to + %ve = add %vc, %vd + ret %ve +} + +define @vwaddu_vx_nxv2i64_nxv2i16( %va, i16 %b) { +; CHECK-LABEL: vwaddu_vx_nxv2i64_nxv2i16: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a1, zero, e16, mf2, ta, ma +; CHECK-NEXT: vmv.v.x v9, a0 +; CHECK-NEXT: vsetvli zero, zero, e64, m2, ta, ma +; CHECK-NEXT: vzext.vf4 v10, v8 +; CHECK-NEXT: vzext.vf4 v12, v9 +; CHECK-NEXT: vadd.vv v8, v10, v12 +; CHECK-NEXT: ret + %head = insertelement poison, i16 %b, i16 0 + %splat = shufflevector %head, poison, zeroinitializer + %vc = zext %va to + %vd = zext %splat to + %ve = add %vc, %vd + ret %ve +} + +define @vwadd_wv_nxv2i64_nxv2i16( %va, %vb) { +; CHECK-LABEL: vwadd_wv_nxv2i64_nxv2i16: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a0, zero, e64, m2, ta, ma +; CHECK-NEXT: vsext.vf4 v12, v10 +; CHECK-NEXT: vadd.vv v8, v8, v12 +; CHECK-NEXT: ret + %vc = sext %vb to + %vd = add %va, %vc + ret %vd +} + +define @vwaddu_wv_nxv2i64_nxv2i16( %va, %vb) { +; CHECK-LABEL: vwaddu_wv_nxv2i64_nxv2i16: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a0, zero, e64, m2, ta, ma +; CHECK-NEXT: vzext.vf4 v12, v10 +; CHECK-NEXT: vadd.vv v8, v8, v12 +; CHECK-NEXT: ret + %vc = zext %vb to + %vd = add %va, %vc + ret %vd +} + +define @vwadd_wx_nxv2i64_nxv2i16( %va, i16 %b) { +; CHECK-LABEL: vwadd_wx_nxv2i64_nxv2i16: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a1, zero, e16, mf2, ta, ma +; CHECK-NEXT: vmv.v.x v10, a0 +; CHECK-NEXT: vsetvli zero, zero, e64, m2, ta, ma +; CHECK-NEXT: vsext.vf4 v12, v10 +; CHECK-NEXT: vadd.vv v8, v8, v12 +; CHECK-NEXT: ret + %head = insertelement poison, i16 %b, i16 0 + %splat = shufflevector %head, poison, zeroinitializer + %vb = sext %splat to + %vc = add %va, %vb + ret %vc +} + +define @vwaddu_wx_nxv2i64_nxv2i16( %va, i16 %b) { +; CHECK-LABEL: vwaddu_wx_nxv2i64_nxv2i16: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a1, zero, e16, mf2, ta, ma +; CHECK-NEXT: vmv.v.x v10, a0 +; CHECK-NEXT: vsetvli zero, zero, e64, m2, ta, ma +; CHECK-NEXT: vzext.vf4 v12, v10 +; CHECK-NEXT: vadd.vv v8, v8, v12 +; CHECK-NEXT: ret + %head = insertelement poison, i16 %b, i16 0 + %splat = shufflevector %head, poison, zeroinitializer + %vb = zext %splat to + %vc = add %va, %vb + ret %vc +} + +define @vwadd_vv_nxv4i64_nxv4i16( %va, %vb) { +; CHECK-LABEL: vwadd_vv_nxv4i64_nxv4i16: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a0, zero, e64, m4, ta, ma +; CHECK-NEXT: vsext.vf4 v12, v8 +; CHECK-NEXT: vsext.vf4 v16, v9 +; CHECK-NEXT: vadd.vv v8, v12, v16 +; CHECK-NEXT: ret + %vc = sext %va to + %vd = sext %vb to + %ve = add %vc, %vd + ret %ve +} + +define @vwaddu_vv_nxv4i64_nxv4i16( %va, %vb) { +; CHECK-LABEL: vwaddu_vv_nxv4i64_nxv4i16: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a0, zero, e64, m4, ta, ma +; CHECK-NEXT: vzext.vf4 v12, v8 +; CHECK-NEXT: vzext.vf4 v16, v9 +; CHECK-NEXT: vadd.vv v8, v12, v16 +; CHECK-NEXT: ret + %vc = zext %va to + %vd = zext %vb to + %ve = add %vc, %vd + ret %ve +} + +define @vwadd_vx_nxv4i64_nxv4i16( %va, i16 %b) { +; CHECK-LABEL: vwadd_vx_nxv4i64_nxv4i16: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a1, zero, e16, m1, ta, ma +; CHECK-NEXT: vmv.v.x v9, a0 +; CHECK-NEXT: vsetvli zero, zero, e64, m4, ta, ma +; CHECK-NEXT: vsext.vf4 v12, v8 +; CHECK-NEXT: vsext.vf4 v16, v9 +; CHECK-NEXT: vadd.vv v8, v12, v16 +; CHECK-NEXT: ret + %head = insertelement poison, i16 %b, i16 0 + %splat = shufflevector %head, poison, zeroinitializer + %vc = sext %va to + %vd = sext %splat to + %ve = add %vc, %vd + ret %ve +} + +define @vwaddu_vx_nxv4i64_nxv4i16( %va, i16 %b) { +; CHECK-LABEL: vwaddu_vx_nxv4i64_nxv4i16: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a1, zero, e16, m1, ta, ma +; CHECK-NEXT: vmv.v.x v9, a0 +; CHECK-NEXT: vsetvli zero, zero, e64, m4, ta, ma +; CHECK-NEXT: vzext.vf4 v12, v8 +; CHECK-NEXT: vzext.vf4 v16, v9 +; CHECK-NEXT: vadd.vv v8, v12, v16 +; CHECK-NEXT: ret + %head = insertelement poison, i16 %b, i16 0 + %splat = shufflevector %head, poison, zeroinitializer + %vc = zext %va to + %vd = zext %splat to + %ve = add %vc, %vd + ret %ve +} + +define @vwadd_wv_nxv4i64_nxv4i16( %va, %vb) { +; CHECK-LABEL: vwadd_wv_nxv4i64_nxv4i16: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a0, zero, e64, m4, ta, ma +; CHECK-NEXT: vsext.vf4 v16, v12 +; CHECK-NEXT: vadd.vv v8, v8, v16 +; CHECK-NEXT: ret + %vc = sext %vb to + %vd = add %va, %vc + ret %vd +} + +define @vwaddu_wv_nxv4i64_nxv4i16( %va, %vb) { +; CHECK-LABEL: vwaddu_wv_nxv4i64_nxv4i16: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a0, zero, e64, m4, ta, ma +; CHECK-NEXT: vzext.vf4 v16, v12 +; CHECK-NEXT: vadd.vv v8, v8, v16 +; CHECK-NEXT: ret + %vc = zext %vb to + %vd = add %va, %vc + ret %vd +} + +define @vwadd_wx_nxv4i64_nxv4i16( %va, i16 %b) { +; CHECK-LABEL: vwadd_wx_nxv4i64_nxv4i16: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a1, zero, e16, m1, ta, ma +; CHECK-NEXT: vmv.v.x v12, a0 +; CHECK-NEXT: vsetvli zero, zero, e64, m4, ta, ma +; CHECK-NEXT: vsext.vf4 v16, v12 +; CHECK-NEXT: vadd.vv v8, v8, v16 +; CHECK-NEXT: ret + %head = insertelement poison, i16 %b, i16 0 + %splat = shufflevector %head, poison, zeroinitializer + %vb = sext %splat to + %vc = add %va, %vb + ret %vc +} + +define @vwaddu_wx_nxv4i64_nxv4i16( %va, i16 %b) { +; CHECK-LABEL: vwaddu_wx_nxv4i64_nxv4i16: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a1, zero, e16, m1, ta, ma +; CHECK-NEXT: vmv.v.x v12, a0 +; CHECK-NEXT: vsetvli zero, zero, e64, m4, ta, ma +; CHECK-NEXT: vzext.vf4 v16, v12 +; CHECK-NEXT: vadd.vv v8, v8, v16 +; CHECK-NEXT: ret + %head = insertelement poison, i16 %b, i16 0 + %splat = shufflevector %head, poison, zeroinitializer + %vb = zext %splat to + %vc = add %va, %vb + ret %vc +} + +define @vwadd_vv_nxv8i64_nxv8i16( %va, %vb) { +; CHECK-LABEL: vwadd_vv_nxv8i64_nxv8i16: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a0, zero, e64, m8, ta, ma +; CHECK-NEXT: vsext.vf4 v16, v8 +; CHECK-NEXT: vsext.vf4 v24, v10 +; CHECK-NEXT: vadd.vv v8, v16, v24 +; CHECK-NEXT: ret + %vc = sext %va to + %vd = sext %vb to + %ve = add %vc, %vd + ret %ve +} + +define @vwaddu_vv_nxv8i64_nxv8i16( %va, %vb) { +; CHECK-LABEL: vwaddu_vv_nxv8i64_nxv8i16: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a0, zero, e64, m8, ta, ma +; CHECK-NEXT: vzext.vf4 v16, v8 +; CHECK-NEXT: vzext.vf4 v24, v10 +; CHECK-NEXT: vadd.vv v8, v16, v24 +; CHECK-NEXT: ret + %vc = zext %va to + %vd = zext %vb to + %ve = add %vc, %vd + ret %ve +} + +define @vwadd_vx_nxv8i64_nxv8i16( %va, i16 %b) { +; CHECK-LABEL: vwadd_vx_nxv8i64_nxv8i16: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a1, zero, e16, m2, ta, ma +; CHECK-NEXT: vmv.v.x v10, a0 +; CHECK-NEXT: vsetvli zero, zero, e64, m8, ta, ma +; CHECK-NEXT: vsext.vf4 v16, v8 +; CHECK-NEXT: vsext.vf4 v24, v10 +; CHECK-NEXT: vadd.vv v8, v16, v24 +; CHECK-NEXT: ret + %head = insertelement poison, i16 %b, i16 0 + %splat = shufflevector %head, poison, zeroinitializer + %vc = sext %va to + %vd = sext %splat to + %ve = add %vc, %vd + ret %ve +} + +define @vwaddu_vx_nxv8i64_nxv8i16( %va, i16 %b) { +; CHECK-LABEL: vwaddu_vx_nxv8i64_nxv8i16: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a1, zero, e16, m2, ta, ma +; CHECK-NEXT: vmv.v.x v10, a0 +; CHECK-NEXT: vsetvli zero, zero, e64, m8, ta, ma +; CHECK-NEXT: vzext.vf4 v16, v8 +; CHECK-NEXT: vzext.vf4 v24, v10 +; CHECK-NEXT: vadd.vv v8, v16, v24 +; CHECK-NEXT: ret + %head = insertelement poison, i16 %b, i16 0 + %splat = shufflevector %head, poison, zeroinitializer + %vc = zext %va to + %vd = zext %splat to + %ve = add %vc, %vd + ret %ve +} + +define @vwadd_wv_nxv8i64_nxv8i16( %va, %vb) { +; CHECK-LABEL: vwadd_wv_nxv8i64_nxv8i16: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a0, zero, e64, m8, ta, ma +; CHECK-NEXT: vsext.vf4 v24, v16 +; CHECK-NEXT: vadd.vv v8, v8, v24 +; CHECK-NEXT: ret + %vc = sext %vb to + %vd = add %va, %vc + ret %vd +} + +define @vwaddu_wv_nxv8i64_nxv8i16( %va, %vb) { +; CHECK-LABEL: vwaddu_wv_nxv8i64_nxv8i16: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a0, zero, e64, m8, ta, ma +; CHECK-NEXT: vzext.vf4 v24, v16 +; CHECK-NEXT: vadd.vv v8, v8, v24 +; CHECK-NEXT: ret + %vc = zext %vb to + %vd = add %va, %vc + ret %vd +} + +define @vwadd_wx_nxv8i64_nxv8i16( %va, i16 %b) { +; CHECK-LABEL: vwadd_wx_nxv8i64_nxv8i16: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a1, zero, e16, m2, ta, ma +; CHECK-NEXT: vmv.v.x v16, a0 +; CHECK-NEXT: vsetvli zero, zero, e64, m8, ta, ma +; CHECK-NEXT: vsext.vf4 v24, v16 +; CHECK-NEXT: vadd.vv v8, v8, v24 +; CHECK-NEXT: ret + %head = insertelement poison, i16 %b, i16 0 + %splat = shufflevector %head, poison, zeroinitializer + %vb = sext %splat to + %vc = add %va, %vb + ret %vc +} + +define @vwaddu_wx_nxv8i64_nxv8i16( %va, i16 %b) { +; CHECK-LABEL: vwaddu_wx_nxv8i64_nxv8i16: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a1, zero, e16, m2, ta, ma +; CHECK-NEXT: vmv.v.x v16, a0 +; CHECK-NEXT: vsetvli zero, zero, e64, m8, ta, ma +; CHECK-NEXT: vzext.vf4 v24, v16 +; CHECK-NEXT: vadd.vv v8, v8, v24 +; CHECK-NEXT: ret + %head = insertelement poison, i16 %b, i16 0 + %splat = shufflevector %head, poison, zeroinitializer + %vb = zext %splat to + %vc = add %va, %vb + ret %vc +} + +define @vwadd_vv_nxv1i64_nxv1i8( %va, %vb) { +; CHECK-LABEL: vwadd_vv_nxv1i64_nxv1i8: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a0, zero, e64, m1, ta, ma +; CHECK-NEXT: vsext.vf8 v10, v8 +; CHECK-NEXT: vsext.vf8 v8, v9 +; CHECK-NEXT: vadd.vv v8, v10, v8 +; CHECK-NEXT: ret + %vc = sext %va to + %vd = sext %vb to + %ve = add %vc, %vd + ret %ve +} + +define @vwaddu_vv_nxv1i64_nxv1i8( %va, %vb) { +; CHECK-LABEL: vwaddu_vv_nxv1i64_nxv1i8: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a0, zero, e64, m1, ta, ma +; CHECK-NEXT: vzext.vf8 v10, v8 +; CHECK-NEXT: vzext.vf8 v8, v9 +; CHECK-NEXT: vadd.vv v8, v10, v8 +; CHECK-NEXT: ret + %vc = zext %va to + %vd = zext %vb to + %ve = add %vc, %vd + ret %ve +} + +define @vwadd_vx_nxv1i64_nxv1i8( %va, i8 %b) { +; CHECK-LABEL: vwadd_vx_nxv1i64_nxv1i8: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a1, zero, e8, mf8, ta, ma +; CHECK-NEXT: vmv.v.x v9, a0 +; CHECK-NEXT: vsetvli zero, zero, e64, m1, ta, ma +; CHECK-NEXT: vsext.vf8 v10, v8 +; CHECK-NEXT: vsext.vf8 v8, v9 +; CHECK-NEXT: vadd.vv v8, v10, v8 +; CHECK-NEXT: ret + %head = insertelement poison, i8 %b, i8 0 + %splat = shufflevector %head, poison, zeroinitializer + %vc = sext %va to + %vd = sext %splat to + %ve = add %vc, %vd + ret %ve +} + +define @vwaddu_vx_nxv1i64_nxv1i8( %va, i8 %b) { +; CHECK-LABEL: vwaddu_vx_nxv1i64_nxv1i8: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a1, zero, e8, mf8, ta, ma +; CHECK-NEXT: vmv.v.x v9, a0 +; CHECK-NEXT: vsetvli zero, zero, e64, m1, ta, ma +; CHECK-NEXT: vzext.vf8 v10, v8 +; CHECK-NEXT: vzext.vf8 v8, v9 +; CHECK-NEXT: vadd.vv v8, v10, v8 +; CHECK-NEXT: ret + %head = insertelement poison, i8 %b, i8 0 + %splat = shufflevector %head, poison, zeroinitializer + %vc = zext %va to + %vd = zext %splat to + %ve = add %vc, %vd + ret %ve +} + +define @vwadd_wv_nxv1i64_nxv1i8( %va, %vb) { +; CHECK-LABEL: vwadd_wv_nxv1i64_nxv1i8: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a0, zero, e64, m1, ta, ma +; CHECK-NEXT: vsext.vf8 v10, v9 +; CHECK-NEXT: vadd.vv v8, v8, v10 +; CHECK-NEXT: ret + %vc = sext %vb to + %vd = add %va, %vc + ret %vd +} + +define @vwaddu_wv_nxv1i64_nxv1i8( %va, %vb) { +; CHECK-LABEL: vwaddu_wv_nxv1i64_nxv1i8: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a0, zero, e64, m1, ta, ma +; CHECK-NEXT: vzext.vf8 v10, v9 +; CHECK-NEXT: vadd.vv v8, v8, v10 +; CHECK-NEXT: ret + %vc = zext %vb to + %vd = add %va, %vc + ret %vd +} + +define @vwadd_wx_nxv1i64_nxv1i8( %va, i8 %b) { +; CHECK-LABEL: vwadd_wx_nxv1i64_nxv1i8: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a1, zero, e8, mf8, ta, ma +; CHECK-NEXT: vmv.v.x v9, a0 +; CHECK-NEXT: vsetvli zero, zero, e64, m1, ta, ma +; CHECK-NEXT: vsext.vf8 v10, v9 +; CHECK-NEXT: vadd.vv v8, v8, v10 +; CHECK-NEXT: ret + %head = insertelement poison, i8 %b, i8 0 + %splat = shufflevector %head, poison, zeroinitializer + %vb = sext %splat to + %vc = add %va, %vb + ret %vc +} + +define @vwaddu_wx_nxv1i64_nxv1i8( %va, i8 %b) { +; CHECK-LABEL: vwaddu_wx_nxv1i64_nxv1i8: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a1, zero, e8, mf8, ta, ma +; CHECK-NEXT: vmv.v.x v9, a0 +; CHECK-NEXT: vsetvli zero, zero, e64, m1, ta, ma +; CHECK-NEXT: vzext.vf8 v10, v9 +; CHECK-NEXT: vadd.vv v8, v8, v10 +; CHECK-NEXT: ret + %head = insertelement poison, i8 %b, i8 0 + %splat = shufflevector %head, poison, zeroinitializer + %vb = zext %splat to + %vc = add %va, %vb + ret %vc +} + +define @vwadd_vv_nxv2i64_nxv2i8( %va, %vb) { +; CHECK-LABEL: vwadd_vv_nxv2i64_nxv2i8: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a0, zero, e64, m2, ta, ma +; CHECK-NEXT: vsext.vf8 v10, v8 +; CHECK-NEXT: vsext.vf8 v12, v9 +; CHECK-NEXT: vadd.vv v8, v10, v12 +; CHECK-NEXT: ret + %vc = sext %va to + %vd = sext %vb to + %ve = add %vc, %vd + ret %ve +} + +define @vwaddu_vv_nxv2i64_nxv2i8( %va, %vb) { +; CHECK-LABEL: vwaddu_vv_nxv2i64_nxv2i8: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a0, zero, e64, m2, ta, ma +; CHECK-NEXT: vzext.vf8 v10, v8 +; CHECK-NEXT: vzext.vf8 v12, v9 +; CHECK-NEXT: vadd.vv v8, v10, v12 +; CHECK-NEXT: ret + %vc = zext %va to + %vd = zext %vb to + %ve = add %vc, %vd + ret %ve +} + +define @vwadd_vx_nxv2i64_nxv2i8( %va, i8 %b) { +; CHECK-LABEL: vwadd_vx_nxv2i64_nxv2i8: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a1, zero, e8, mf4, ta, ma +; CHECK-NEXT: vmv.v.x v9, a0 +; CHECK-NEXT: vsetvli zero, zero, e64, m2, ta, ma +; CHECK-NEXT: vsext.vf8 v10, v8 +; CHECK-NEXT: vsext.vf8 v12, v9 +; CHECK-NEXT: vadd.vv v8, v10, v12 +; CHECK-NEXT: ret + %head = insertelement poison, i8 %b, i8 0 + %splat = shufflevector %head, poison, zeroinitializer + %vc = sext %va to + %vd = sext %splat to + %ve = add %vc, %vd + ret %ve +} + +define @vwaddu_vx_nxv2i64_nxv2i8( %va, i8 %b) { +; CHECK-LABEL: vwaddu_vx_nxv2i64_nxv2i8: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a1, zero, e8, mf4, ta, ma +; CHECK-NEXT: vmv.v.x v9, a0 +; CHECK-NEXT: vsetvli zero, zero, e64, m2, ta, ma +; CHECK-NEXT: vzext.vf8 v10, v8 +; CHECK-NEXT: vzext.vf8 v12, v9 +; CHECK-NEXT: vadd.vv v8, v10, v12 +; CHECK-NEXT: ret + %head = insertelement poison, i8 %b, i8 0 + %splat = shufflevector %head, poison, zeroinitializer + %vc = zext %va to + %vd = zext %splat to + %ve = add %vc, %vd + ret %ve +} + +define @vwadd_wv_nxv2i64_nxv2i8( %va, %vb) { +; CHECK-LABEL: vwadd_wv_nxv2i64_nxv2i8: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a0, zero, e64, m2, ta, ma +; CHECK-NEXT: vsext.vf8 v12, v10 +; CHECK-NEXT: vadd.vv v8, v8, v12 +; CHECK-NEXT: ret + %vc = sext %vb to + %vd = add %va, %vc + ret %vd +} + +define @vwaddu_wv_nxv2i64_nxv2i8( %va, %vb) { +; CHECK-LABEL: vwaddu_wv_nxv2i64_nxv2i8: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a0, zero, e64, m2, ta, ma +; CHECK-NEXT: vzext.vf8 v12, v10 +; CHECK-NEXT: vadd.vv v8, v8, v12 +; CHECK-NEXT: ret + %vc = zext %vb to + %vd = add %va, %vc + ret %vd +} + +define @vwadd_wx_nxv2i64_nxv2i8( %va, i8 %b) { +; CHECK-LABEL: vwadd_wx_nxv2i64_nxv2i8: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a1, zero, e8, mf4, ta, ma +; CHECK-NEXT: vmv.v.x v10, a0 +; CHECK-NEXT: vsetvli zero, zero, e64, m2, ta, ma +; CHECK-NEXT: vsext.vf8 v12, v10 +; CHECK-NEXT: vadd.vv v8, v8, v12 +; CHECK-NEXT: ret + %head = insertelement poison, i8 %b, i8 0 + %splat = shufflevector %head, poison, zeroinitializer + %vb = sext %splat to + %vc = add %va, %vb + ret %vc +} + +define @vwaddu_wx_nxv2i64_nxv2i8( %va, i8 %b) { +; CHECK-LABEL: vwaddu_wx_nxv2i64_nxv2i8: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a1, zero, e8, mf4, ta, ma +; CHECK-NEXT: vmv.v.x v10, a0 +; CHECK-NEXT: vsetvli zero, zero, e64, m2, ta, ma +; CHECK-NEXT: vzext.vf8 v12, v10 +; CHECK-NEXT: vadd.vv v8, v8, v12 +; CHECK-NEXT: ret + %head = insertelement poison, i8 %b, i8 0 + %splat = shufflevector %head, poison, zeroinitializer + %vb = zext %splat to + %vc = add %va, %vb + ret %vc +} + +define @vwadd_vv_nxv4i64_nxv4i8( %va, %vb) { +; CHECK-LABEL: vwadd_vv_nxv4i64_nxv4i8: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a0, zero, e64, m4, ta, ma +; CHECK-NEXT: vsext.vf8 v12, v8 +; CHECK-NEXT: vsext.vf8 v16, v9 +; CHECK-NEXT: vadd.vv v8, v12, v16 +; CHECK-NEXT: ret + %vc = sext %va to + %vd = sext %vb to + %ve = add %vc, %vd + ret %ve +} + +define @vwaddu_vv_nxv4i64_nxv4i8( %va, %vb) { +; CHECK-LABEL: vwaddu_vv_nxv4i64_nxv4i8: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a0, zero, e64, m4, ta, ma +; CHECK-NEXT: vzext.vf8 v12, v8 +; CHECK-NEXT: vzext.vf8 v16, v9 +; CHECK-NEXT: vadd.vv v8, v12, v16 +; CHECK-NEXT: ret + %vc = zext %va to + %vd = zext %vb to + %ve = add %vc, %vd + ret %ve +} + +define @vwadd_vx_nxv4i64_nxv4i8( %va, i8 %b) { +; CHECK-LABEL: vwadd_vx_nxv4i64_nxv4i8: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a1, zero, e8, mf2, ta, ma +; CHECK-NEXT: vmv.v.x v9, a0 +; CHECK-NEXT: vsetvli zero, zero, e64, m4, ta, ma +; CHECK-NEXT: vsext.vf8 v12, v8 +; CHECK-NEXT: vsext.vf8 v16, v9 +; CHECK-NEXT: vadd.vv v8, v12, v16 +; CHECK-NEXT: ret + %head = insertelement poison, i8 %b, i8 0 + %splat = shufflevector %head, poison, zeroinitializer + %vc = sext %va to + %vd = sext %splat to + %ve = add %vc, %vd + ret %ve +} + +define @vwaddu_vx_nxv4i64_nxv4i8( %va, i8 %b) { +; CHECK-LABEL: vwaddu_vx_nxv4i64_nxv4i8: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a1, zero, e8, mf2, ta, ma +; CHECK-NEXT: vmv.v.x v9, a0 +; CHECK-NEXT: vsetvli zero, zero, e64, m4, ta, ma +; CHECK-NEXT: vzext.vf8 v12, v8 +; CHECK-NEXT: vzext.vf8 v16, v9 +; CHECK-NEXT: vadd.vv v8, v12, v16 +; CHECK-NEXT: ret + %head = insertelement poison, i8 %b, i8 0 + %splat = shufflevector %head, poison, zeroinitializer + %vc = zext %va to + %vd = zext %splat to + %ve = add %vc, %vd + ret %ve +} + +define @vwadd_wv_nxv4i64_nxv4i8( %va, %vb) { +; CHECK-LABEL: vwadd_wv_nxv4i64_nxv4i8: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a0, zero, e64, m4, ta, ma +; CHECK-NEXT: vsext.vf8 v16, v12 +; CHECK-NEXT: vadd.vv v8, v8, v16 +; CHECK-NEXT: ret + %vc = sext %vb to + %vd = add %va, %vc + ret %vd +} + +define @vwaddu_wv_nxv4i64_nxv4i8( %va, %vb) { +; CHECK-LABEL: vwaddu_wv_nxv4i64_nxv4i8: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a0, zero, e64, m4, ta, ma +; CHECK-NEXT: vzext.vf8 v16, v12 +; CHECK-NEXT: vadd.vv v8, v8, v16 +; CHECK-NEXT: ret + %vc = zext %vb to + %vd = add %va, %vc + ret %vd +} + +define @vwadd_wx_nxv4i64_nxv4i8( %va, i8 %b) { +; CHECK-LABEL: vwadd_wx_nxv4i64_nxv4i8: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a1, zero, e8, mf2, ta, ma +; CHECK-NEXT: vmv.v.x v12, a0 +; CHECK-NEXT: vsetvli zero, zero, e64, m4, ta, ma +; CHECK-NEXT: vsext.vf8 v16, v12 +; CHECK-NEXT: vadd.vv v8, v8, v16 +; CHECK-NEXT: ret + %head = insertelement poison, i8 %b, i8 0 + %splat = shufflevector %head, poison, zeroinitializer + %vb = sext %splat to + %vc = add %va, %vb + ret %vc +} + +define @vwaddu_wx_nxv4i64_nxv4i8( %va, i8 %b) { +; CHECK-LABEL: vwaddu_wx_nxv4i64_nxv4i8: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a1, zero, e8, mf2, ta, ma +; CHECK-NEXT: vmv.v.x v12, a0 +; CHECK-NEXT: vsetvli zero, zero, e64, m4, ta, ma +; CHECK-NEXT: vzext.vf8 v16, v12 +; CHECK-NEXT: vadd.vv v8, v8, v16 +; CHECK-NEXT: ret + %head = insertelement poison, i8 %b, i8 0 + %splat = shufflevector %head, poison, zeroinitializer + %vb = zext %splat to + %vc = add %va, %vb + ret %vc +} + +define @vwadd_vv_nxv8i64_nxv8i8( %va, %vb) { +; CHECK-LABEL: vwadd_vv_nxv8i64_nxv8i8: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a0, zero, e64, m8, ta, ma +; CHECK-NEXT: vsext.vf8 v16, v8 +; CHECK-NEXT: vsext.vf8 v24, v9 +; CHECK-NEXT: vadd.vv v8, v16, v24 +; CHECK-NEXT: ret + %vc = sext %va to + %vd = sext %vb to + %ve = add %vc, %vd + ret %ve +} + +define @vwaddu_vv_nxv8i64_nxv8i8( %va, %vb) { +; CHECK-LABEL: vwaddu_vv_nxv8i64_nxv8i8: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a0, zero, e64, m8, ta, ma +; CHECK-NEXT: vzext.vf8 v16, v8 +; CHECK-NEXT: vzext.vf8 v24, v9 +; CHECK-NEXT: vadd.vv v8, v16, v24 +; CHECK-NEXT: ret + %vc = zext %va to + %vd = zext %vb to + %ve = add %vc, %vd + ret %ve +} + +define @vwadd_vx_nxv8i64_nxv8i8( %va, i8 %b) { +; CHECK-LABEL: vwadd_vx_nxv8i64_nxv8i8: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a1, zero, e8, m1, ta, ma +; CHECK-NEXT: vmv.v.x v9, a0 +; CHECK-NEXT: vsetvli zero, zero, e64, m8, ta, ma +; CHECK-NEXT: vsext.vf8 v16, v8 +; CHECK-NEXT: vsext.vf8 v24, v9 +; CHECK-NEXT: vadd.vv v8, v16, v24 +; CHECK-NEXT: ret + %head = insertelement poison, i8 %b, i8 0 + %splat = shufflevector %head, poison, zeroinitializer + %vc = sext %va to + %vd = sext %splat to + %ve = add %vc, %vd + ret %ve +} + +define @vwaddu_vx_nxv8i64_nxv8i8( %va, i8 %b) { +; CHECK-LABEL: vwaddu_vx_nxv8i64_nxv8i8: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a1, zero, e8, m1, ta, ma +; CHECK-NEXT: vmv.v.x v9, a0 +; CHECK-NEXT: vsetvli zero, zero, e64, m8, ta, ma +; CHECK-NEXT: vzext.vf8 v16, v8 +; CHECK-NEXT: vzext.vf8 v24, v9 +; CHECK-NEXT: vadd.vv v8, v16, v24 +; CHECK-NEXT: ret + %head = insertelement poison, i8 %b, i8 0 + %splat = shufflevector %head, poison, zeroinitializer + %vc = zext %va to + %vd = zext %splat to + %ve = add %vc, %vd + ret %ve +} + +define @vwadd_wv_nxv8i64_nxv8i8( %va, %vb) { +; CHECK-LABEL: vwadd_wv_nxv8i64_nxv8i8: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a0, zero, e64, m8, ta, ma +; CHECK-NEXT: vsext.vf8 v24, v16 +; CHECK-NEXT: vadd.vv v8, v8, v24 +; CHECK-NEXT: ret + %vc = sext %vb to + %vd = add %va, %vc + ret %vd +} + +define @vwaddu_wv_nxv8i64_nxv8i8( %va, %vb) { +; CHECK-LABEL: vwaddu_wv_nxv8i64_nxv8i8: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a0, zero, e64, m8, ta, ma +; CHECK-NEXT: vzext.vf8 v24, v16 +; CHECK-NEXT: vadd.vv v8, v8, v24 +; CHECK-NEXT: ret + %vc = zext %vb to + %vd = add %va, %vc + ret %vd +} + +define @vwadd_wx_nxv8i64_nxv8i8( %va, i8 %b) { +; CHECK-LABEL: vwadd_wx_nxv8i64_nxv8i8: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a1, zero, e8, m1, ta, ma +; CHECK-NEXT: vmv.v.x v16, a0 +; CHECK-NEXT: vsetvli zero, zero, e64, m8, ta, ma +; CHECK-NEXT: vsext.vf8 v24, v16 +; CHECK-NEXT: vadd.vv v8, v8, v24 +; CHECK-NEXT: ret + %head = insertelement poison, i8 %b, i8 0 + %splat = shufflevector %head, poison, zeroinitializer + %vb = sext %splat to + %vc = add %va, %vb + ret %vc +} + +define @vwaddu_wx_nxv8i64_nxv8i8( %va, i8 %b) { +; CHECK-LABEL: vwaddu_wx_nxv8i64_nxv8i8: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a1, zero, e8, m1, ta, ma +; CHECK-NEXT: vmv.v.x v16, a0 +; CHECK-NEXT: vsetvli zero, zero, e64, m8, ta, ma +; CHECK-NEXT: vzext.vf8 v24, v16 +; CHECK-NEXT: vadd.vv v8, v8, v24 +; CHECK-NEXT: ret + %head = insertelement poison, i8 %b, i8 0 + %splat = shufflevector %head, poison, zeroinitializer + %vb = zext %splat to + %vc = add %va, %vb + ret %vc +} diff --git a/llvm/test/CodeGen/RISCV/rvv/vwmul-sdnode.ll b/llvm/test/CodeGen/RISCV/rvv/vwmul-sdnode.ll index 98918ea21652313..3634162eefd642f 100644 --- a/llvm/test/CodeGen/RISCV/rvv/vwmul-sdnode.ll +++ b/llvm/test/CodeGen/RISCV/rvv/vwmul-sdnode.ll @@ -2,8 +2,8 @@ ; RUN: llc -mtriple=riscv32 -mattr=+v -verify-machineinstrs < %s | FileCheck %s ; RUN: llc -mtriple=riscv64 -mattr=+v -verify-machineinstrs < %s | FileCheck %s -define @vwmul_vv_nxv1i64( %va, %vb) { -; CHECK-LABEL: vwmul_vv_nxv1i64: +define @vwmul_vv_nxv1i64_nxv1i32( %va, %vb) { +; CHECK-LABEL: vwmul_vv_nxv1i64_nxv1i32: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a0, zero, e32, mf2, ta, ma ; CHECK-NEXT: vwmul.vv v10, v8, v9 @@ -15,8 +15,8 @@ define @vwmul_vv_nxv1i64( %va, %ve } -define @vwmulu_vv_nxv1i64( %va, %vb) { -; CHECK-LABEL: vwmulu_vv_nxv1i64: +define @vwmulu_vv_nxv1i64_nxv1i32( %va, %vb) { +; CHECK-LABEL: vwmulu_vv_nxv1i64_nxv1i32: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a0, zero, e32, mf2, ta, ma ; CHECK-NEXT: vwmulu.vv v10, v8, v9 @@ -28,8 +28,8 @@ define @vwmulu_vv_nxv1i64( %va, %ve } -define @vwmulsu_vv_nxv1i64( %va, %vb) { -; CHECK-LABEL: vwmulsu_vv_nxv1i64: +define @vwmulsu_vv_nxv1i64_nxv1i32( %va, %vb) { +; CHECK-LABEL: vwmulsu_vv_nxv1i64_nxv1i32: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a0, zero, e32, mf2, ta, ma ; CHECK-NEXT: vwmulsu.vv v10, v8, v9 @@ -41,8 +41,8 @@ define @vwmulsu_vv_nxv1i64( %va, %ve } -define @vwmul_vx_nxv1i64( %va, i32 %b) { -; CHECK-LABEL: vwmul_vx_nxv1i64: +define @vwmul_vx_nxv1i64_nxv1i32( %va, i32 %b) { +; CHECK-LABEL: vwmul_vx_nxv1i64_nxv1i32: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a1, zero, e32, mf2, ta, ma ; CHECK-NEXT: vwmul.vx v9, v8, a0 @@ -56,8 +56,8 @@ define @vwmul_vx_nxv1i64( %va, i32 %b) { ret %ve } -define @vwmulu_vx_nxv1i64( %va, i32 %b) { -; CHECK-LABEL: vwmulu_vx_nxv1i64: +define @vwmulu_vx_nxv1i64_nxv1i32( %va, i32 %b) { +; CHECK-LABEL: vwmulu_vx_nxv1i64_nxv1i32: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a1, zero, e32, mf2, ta, ma ; CHECK-NEXT: vwmulu.vx v9, v8, a0 @@ -71,8 +71,8 @@ define @vwmulu_vx_nxv1i64( %va, i32 %b) { ret %ve } -define @vwmulsu_vx_nxv1i64( %va, i32 %b) { -; CHECK-LABEL: vwmulsu_vx_nxv1i64: +define @vwmulsu_vx_nxv1i64_nxv1i32( %va, i32 %b) { +; CHECK-LABEL: vwmulsu_vx_nxv1i64_nxv1i32: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a1, zero, e32, mf2, ta, ma ; CHECK-NEXT: vwmulsu.vx v9, v8, a0 @@ -86,8 +86,8 @@ define @vwmulsu_vx_nxv1i64( %va, i32 %b) { ret %ve } -define @vwmul_vv_nxv2i64( %va, %vb) { -; CHECK-LABEL: vwmul_vv_nxv2i64: +define @vwmul_vv_nxv2i64_nxv2i32( %va, %vb) { +; CHECK-LABEL: vwmul_vv_nxv2i64_nxv2i32: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a0, zero, e32, m1, ta, ma ; CHECK-NEXT: vwmul.vv v10, v8, v9 @@ -99,8 +99,8 @@ define @vwmul_vv_nxv2i64( %va, %ve } -define @vwmulu_vv_nxv2i64( %va, %vb) { -; CHECK-LABEL: vwmulu_vv_nxv2i64: +define @vwmulu_vv_nxv2i64_nxv2i32( %va, %vb) { +; CHECK-LABEL: vwmulu_vv_nxv2i64_nxv2i32: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a0, zero, e32, m1, ta, ma ; CHECK-NEXT: vwmulu.vv v10, v8, v9 @@ -112,8 +112,8 @@ define @vwmulu_vv_nxv2i64( %va, %ve } -define @vwmulsu_vv_nxv2i64( %va, %vb) { -; CHECK-LABEL: vwmulsu_vv_nxv2i64: +define @vwmulsu_vv_nxv2i64_nxv2i32( %va, %vb) { +; CHECK-LABEL: vwmulsu_vv_nxv2i64_nxv2i32: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a0, zero, e32, m1, ta, ma ; CHECK-NEXT: vwmulsu.vv v10, v8, v9 @@ -125,8 +125,8 @@ define @vwmulsu_vv_nxv2i64( %va, %ve } -define @vwmul_vx_nxv2i64( %va, i32 %b) { -; CHECK-LABEL: vwmul_vx_nxv2i64: +define @vwmul_vx_nxv2i64_nxv2i32( %va, i32 %b) { +; CHECK-LABEL: vwmul_vx_nxv2i64_nxv2i32: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a1, zero, e32, m1, ta, ma ; CHECK-NEXT: vwmul.vx v10, v8, a0 @@ -140,8 +140,8 @@ define @vwmul_vx_nxv2i64( %va, i32 %b) { ret %ve } -define @vwmulu_vx_nxv2i64( %va, i32 %b) { -; CHECK-LABEL: vwmulu_vx_nxv2i64: +define @vwmulu_vx_nxv2i64_nxv2i32( %va, i32 %b) { +; CHECK-LABEL: vwmulu_vx_nxv2i64_nxv2i32: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a1, zero, e32, m1, ta, ma ; CHECK-NEXT: vwmulu.vx v10, v8, a0 @@ -155,8 +155,8 @@ define @vwmulu_vx_nxv2i64( %va, i32 %b) { ret %ve } -define @vwmulsu_vx_nxv2i64( %va, i32 %b) { -; CHECK-LABEL: vwmulsu_vx_nxv2i64: +define @vwmulsu_vx_nxv2i64_nxv2i32( %va, i32 %b) { +; CHECK-LABEL: vwmulsu_vx_nxv2i64_nxv2i32: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a1, zero, e32, m1, ta, ma ; CHECK-NEXT: vwmulsu.vx v10, v8, a0 @@ -170,8 +170,8 @@ define @vwmulsu_vx_nxv2i64( %va, i32 %b) { ret %ve } -define @vwmul_vv_nxv4i64( %va, %vb) { -; CHECK-LABEL: vwmul_vv_nxv4i64: +define @vwmul_vv_nxv4i64_nxv4i32( %va, %vb) { +; CHECK-LABEL: vwmul_vv_nxv4i64_nxv4i32: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a0, zero, e32, m2, ta, ma ; CHECK-NEXT: vwmul.vv v12, v8, v10 @@ -183,8 +183,8 @@ define @vwmul_vv_nxv4i64( %va, %ve } -define @vwmulu_vv_nxv4i64( %va, %vb) { -; CHECK-LABEL: vwmulu_vv_nxv4i64: +define @vwmulu_vv_nxv4i64_nxv4i32( %va, %vb) { +; CHECK-LABEL: vwmulu_vv_nxv4i64_nxv4i32: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a0, zero, e32, m2, ta, ma ; CHECK-NEXT: vwmulu.vv v12, v8, v10 @@ -196,8 +196,8 @@ define @vwmulu_vv_nxv4i64( %va, %ve } -define @vwmulsu_vv_nxv4i64( %va, %vb) { -; CHECK-LABEL: vwmulsu_vv_nxv4i64: +define @vwmulsu_vv_nxv4i64_nxv4i32( %va, %vb) { +; CHECK-LABEL: vwmulsu_vv_nxv4i64_nxv4i32: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a0, zero, e32, m2, ta, ma ; CHECK-NEXT: vwmulsu.vv v12, v8, v10 @@ -209,8 +209,8 @@ define @vwmulsu_vv_nxv4i64( %va, %ve } -define @vwmul_vx_nxv4i64( %va, i32 %b) { -; CHECK-LABEL: vwmul_vx_nxv4i64: +define @vwmul_vx_nxv4i64_nxv4i32( %va, i32 %b) { +; CHECK-LABEL: vwmul_vx_nxv4i64_nxv4i32: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a1, zero, e32, m2, ta, ma ; CHECK-NEXT: vwmul.vx v12, v8, a0 @@ -224,8 +224,8 @@ define @vwmul_vx_nxv4i64( %va, i32 %b) { ret %ve } -define @vwmulu_vx_nxv4i64( %va, i32 %b) { -; CHECK-LABEL: vwmulu_vx_nxv4i64: +define @vwmulu_vx_nxv4i64_nxv4i32( %va, i32 %b) { +; CHECK-LABEL: vwmulu_vx_nxv4i64_nxv4i32: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a1, zero, e32, m2, ta, ma ; CHECK-NEXT: vwmulu.vx v12, v8, a0 @@ -239,8 +239,8 @@ define @vwmulu_vx_nxv4i64( %va, i32 %b) { ret %ve } -define @vwmulsu_vx_nxv4i64( %va, i32 %b) { -; CHECK-LABEL: vwmulsu_vx_nxv4i64: +define @vwmulsu_vx_nxv4i64_nxv4i32( %va, i32 %b) { +; CHECK-LABEL: vwmulsu_vx_nxv4i64_nxv4i32: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a1, zero, e32, m2, ta, ma ; CHECK-NEXT: vwmulsu.vx v12, v8, a0 @@ -254,8 +254,8 @@ define @vwmulsu_vx_nxv4i64( %va, i32 %b) { ret %ve } -define @vwmul_vv_nxv8i64( %va, %vb) { -; CHECK-LABEL: vwmul_vv_nxv8i64: +define @vwmul_vv_nxv8i64_nxv8i32( %va, %vb) { +; CHECK-LABEL: vwmul_vv_nxv8i64_nxv8i32: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, ma ; CHECK-NEXT: vwmul.vv v16, v8, v12 @@ -267,8 +267,8 @@ define @vwmul_vv_nxv8i64( %va, %ve } -define @vwmulu_vv_nxv8i64( %va, %vb) { -; CHECK-LABEL: vwmulu_vv_nxv8i64: +define @vwmulu_vv_nxv8i64_nxv8i32( %va, %vb) { +; CHECK-LABEL: vwmulu_vv_nxv8i64_nxv8i32: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, ma ; CHECK-NEXT: vwmulu.vv v16, v8, v12 @@ -280,8 +280,8 @@ define @vwmulu_vv_nxv8i64( %va, %ve } -define @vwmulsu_vv_nxv8i64( %va, %vb) { -; CHECK-LABEL: vwmulsu_vv_nxv8i64: +define @vwmulsu_vv_nxv8i64_nxv8i32( %va, %vb) { +; CHECK-LABEL: vwmulsu_vv_nxv8i64_nxv8i32: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, ma ; CHECK-NEXT: vwmulsu.vv v16, v8, v12 @@ -293,8 +293,8 @@ define @vwmulsu_vv_nxv8i64( %va, %ve } -define @vwmul_vx_nxv8i64( %va, i32 %b) { -; CHECK-LABEL: vwmul_vx_nxv8i64: +define @vwmul_vx_nxv8i64_nxv8i32( %va, i32 %b) { +; CHECK-LABEL: vwmul_vx_nxv8i64_nxv8i32: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a1, zero, e32, m4, ta, ma ; CHECK-NEXT: vwmul.vx v16, v8, a0 @@ -308,8 +308,8 @@ define @vwmul_vx_nxv8i64( %va, i32 %b) { ret %ve } -define @vwmulu_vx_nxv8i64( %va, i32 %b) { -; CHECK-LABEL: vwmulu_vx_nxv8i64: +define @vwmulu_vx_nxv8i64_nxv8i32( %va, i32 %b) { +; CHECK-LABEL: vwmulu_vx_nxv8i64_nxv8i32: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a1, zero, e32, m4, ta, ma ; CHECK-NEXT: vwmulu.vx v16, v8, a0 @@ -323,8 +323,8 @@ define @vwmulu_vx_nxv8i64( %va, i32 %b) { ret %ve } -define @vwmulsu_vx_nxv8i64( %va, i32 %b) { -; CHECK-LABEL: vwmulsu_vx_nxv8i64: +define @vwmulsu_vx_nxv8i64_nxv8i32( %va, i32 %b) { +; CHECK-LABEL: vwmulsu_vx_nxv8i64_nxv8i32: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a1, zero, e32, m4, ta, ma ; CHECK-NEXT: vwmulsu.vx v16, v8, a0 @@ -337,3 +337,771 @@ define @vwmulsu_vx_nxv8i64( %va, i32 %b) { %ve = mul %vc, %vd ret %ve } + +define @vwmul_vv_nxv1i64_nxv1i16( %va, %vb) { +; CHECK-LABEL: vwmul_vv_nxv1i64_nxv1i16: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a0, zero, e64, m1, ta, ma +; CHECK-NEXT: vsext.vf4 v10, v8 +; CHECK-NEXT: vsext.vf4 v8, v9 +; CHECK-NEXT: vmul.vv v8, v10, v8 +; CHECK-NEXT: ret + %vc = sext %va to + %vd = sext %vb to + %ve = mul %vc, %vd + ret %ve +} + +define @vwmulu_vv_nxv1i64_nxv1i16( %va, %vb) { +; CHECK-LABEL: vwmulu_vv_nxv1i64_nxv1i16: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a0, zero, e64, m1, ta, ma +; CHECK-NEXT: vzext.vf4 v10, v8 +; CHECK-NEXT: vzext.vf4 v8, v9 +; CHECK-NEXT: vmul.vv v8, v10, v8 +; CHECK-NEXT: ret + %vc = zext %va to + %vd = zext %vb to + %ve = mul %vc, %vd + ret %ve +} + +define @vwmulsu_vv_nxv1i64_nxv1i16( %va, %vb) { +; CHECK-LABEL: vwmulsu_vv_nxv1i64_nxv1i16: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a0, zero, e64, m1, ta, ma +; CHECK-NEXT: vsext.vf4 v10, v8 +; CHECK-NEXT: vzext.vf4 v8, v9 +; CHECK-NEXT: vmul.vv v8, v10, v8 +; CHECK-NEXT: ret + %vc = sext %va to + %vd = zext %vb to + %ve = mul %vc, %vd + ret %ve +} + +define @vwmul_vx_nxv1i64_nxv1i16( %va, i16 %b) { +; CHECK-LABEL: vwmul_vx_nxv1i64_nxv1i16: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a1, zero, e16, mf4, ta, ma +; CHECK-NEXT: vmv.v.x v9, a0 +; CHECK-NEXT: vsetvli zero, zero, e64, m1, ta, ma +; CHECK-NEXT: vsext.vf4 v10, v8 +; CHECK-NEXT: vsext.vf4 v8, v9 +; CHECK-NEXT: vmul.vv v8, v10, v8 +; CHECK-NEXT: ret + %head = insertelement undef, i16 %b, i16 0 + %splat = shufflevector %head, undef, zeroinitializer + %vc = sext %va to + %vd = sext %splat to + %ve = mul %vc, %vd + ret %ve +} + +define @vwmulu_vx_nxv1i64_nxv1i16( %va, i16 %b) { +; CHECK-LABEL: vwmulu_vx_nxv1i64_nxv1i16: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a1, zero, e16, mf4, ta, ma +; CHECK-NEXT: vmv.v.x v9, a0 +; CHECK-NEXT: vsetvli zero, zero, e64, m1, ta, ma +; CHECK-NEXT: vzext.vf4 v10, v8 +; CHECK-NEXT: vzext.vf4 v8, v9 +; CHECK-NEXT: vmul.vv v8, v10, v8 +; CHECK-NEXT: ret + %head = insertelement undef, i16 %b, i16 0 + %splat = shufflevector %head, undef, zeroinitializer + %vc = zext %va to + %vd = zext %splat to + %ve = mul %vc, %vd + ret %ve +} + +define @vwmulsu_vx_nxv1i64_nxv1i16( %va, i16 %b) { +; CHECK-LABEL: vwmulsu_vx_nxv1i64_nxv1i16: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a1, zero, e16, mf4, ta, ma +; CHECK-NEXT: vmv.v.x v9, a0 +; CHECK-NEXT: vsetvli zero, zero, e64, m1, ta, ma +; CHECK-NEXT: vsext.vf4 v10, v8 +; CHECK-NEXT: vzext.vf4 v8, v9 +; CHECK-NEXT: vmul.vv v8, v10, v8 +; CHECK-NEXT: ret + %head = insertelement undef, i16 %b, i16 0 + %splat = shufflevector %head, undef, zeroinitializer + %vc = sext %va to + %vd = zext %splat to + %ve = mul %vc, %vd + ret %ve +} + +define @vwmul_vv_nxv2i64_nxv2i16( %va, %vb) { +; CHECK-LABEL: vwmul_vv_nxv2i64_nxv2i16: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a0, zero, e64, m2, ta, ma +; CHECK-NEXT: vsext.vf4 v10, v8 +; CHECK-NEXT: vsext.vf4 v12, v9 +; CHECK-NEXT: vmul.vv v8, v10, v12 +; CHECK-NEXT: ret + %vc = sext %va to + %vd = sext %vb to + %ve = mul %vc, %vd + ret %ve +} + +define @vwmulu_vv_nxv2i64_nxv2i16( %va, %vb) { +; CHECK-LABEL: vwmulu_vv_nxv2i64_nxv2i16: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a0, zero, e64, m2, ta, ma +; CHECK-NEXT: vzext.vf4 v10, v8 +; CHECK-NEXT: vzext.vf4 v12, v9 +; CHECK-NEXT: vmul.vv v8, v10, v12 +; CHECK-NEXT: ret + %vc = zext %va to + %vd = zext %vb to + %ve = mul %vc, %vd + ret %ve +} + +define @vwmulsu_vv_nxv2i64_nxv2i16( %va, %vb) { +; CHECK-LABEL: vwmulsu_vv_nxv2i64_nxv2i16: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a0, zero, e64, m2, ta, ma +; CHECK-NEXT: vsext.vf4 v10, v8 +; CHECK-NEXT: vzext.vf4 v12, v9 +; CHECK-NEXT: vmul.vv v8, v10, v12 +; CHECK-NEXT: ret + %vc = sext %va to + %vd = zext %vb to + %ve = mul %vc, %vd + ret %ve +} + +define @vwmul_vx_nxv2i64_nxv2i16( %va, i16 %b) { +; CHECK-LABEL: vwmul_vx_nxv2i64_nxv2i16: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a1, zero, e16, mf2, ta, ma +; CHECK-NEXT: vmv.v.x v9, a0 +; CHECK-NEXT: vsetvli zero, zero, e64, m2, ta, ma +; CHECK-NEXT: vsext.vf4 v10, v8 +; CHECK-NEXT: vsext.vf4 v12, v9 +; CHECK-NEXT: vmul.vv v8, v10, v12 +; CHECK-NEXT: ret + %head = insertelement undef, i16 %b, i16 0 + %splat = shufflevector %head, undef, zeroinitializer + %vc = sext %va to + %vd = sext %splat to + %ve = mul %vc, %vd + ret %ve +} + +define @vwmulu_vx_nxv2i64_nxv2i16( %va, i16 %b) { +; CHECK-LABEL: vwmulu_vx_nxv2i64_nxv2i16: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a1, zero, e16, mf2, ta, ma +; CHECK-NEXT: vmv.v.x v9, a0 +; CHECK-NEXT: vsetvli zero, zero, e64, m2, ta, ma +; CHECK-NEXT: vzext.vf4 v10, v8 +; CHECK-NEXT: vzext.vf4 v12, v9 +; CHECK-NEXT: vmul.vv v8, v10, v12 +; CHECK-NEXT: ret + %head = insertelement undef, i16 %b, i16 0 + %splat = shufflevector %head, undef, zeroinitializer + %vc = zext %va to + %vd = zext %splat to + %ve = mul %vc, %vd + ret %ve +} + +define @vwmulsu_vx_nxv2i64_nxv2i16( %va, i16 %b) { +; CHECK-LABEL: vwmulsu_vx_nxv2i64_nxv2i16: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a1, zero, e16, mf2, ta, ma +; CHECK-NEXT: vmv.v.x v9, a0 +; CHECK-NEXT: vsetvli zero, zero, e64, m2, ta, ma +; CHECK-NEXT: vsext.vf4 v10, v8 +; CHECK-NEXT: vzext.vf4 v12, v9 +; CHECK-NEXT: vmul.vv v8, v10, v12 +; CHECK-NEXT: ret + %head = insertelement undef, i16 %b, i16 0 + %splat = shufflevector %head, undef, zeroinitializer + %vc = sext %va to + %vd = zext %splat to + %ve = mul %vc, %vd + ret %ve +} + +define @vwmul_vv_nxv4i64_nxv4i16( %va, %vb) { +; CHECK-LABEL: vwmul_vv_nxv4i64_nxv4i16: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a0, zero, e64, m4, ta, ma +; CHECK-NEXT: vsext.vf4 v12, v8 +; CHECK-NEXT: vsext.vf4 v16, v9 +; CHECK-NEXT: vmul.vv v8, v12, v16 +; CHECK-NEXT: ret + %vc = sext %va to + %vd = sext %vb to + %ve = mul %vc, %vd + ret %ve +} + +define @vwmulu_vv_nxv4i64_nxv4i16( %va, %vb) { +; CHECK-LABEL: vwmulu_vv_nxv4i64_nxv4i16: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a0, zero, e64, m4, ta, ma +; CHECK-NEXT: vzext.vf4 v12, v8 +; CHECK-NEXT: vzext.vf4 v16, v9 +; CHECK-NEXT: vmul.vv v8, v12, v16 +; CHECK-NEXT: ret + %vc = zext %va to + %vd = zext %vb to + %ve = mul %vc, %vd + ret %ve +} + +define @vwmulsu_vv_nxv4i64_nxv4i16( %va, %vb) { +; CHECK-LABEL: vwmulsu_vv_nxv4i64_nxv4i16: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a0, zero, e64, m4, ta, ma +; CHECK-NEXT: vsext.vf4 v12, v8 +; CHECK-NEXT: vzext.vf4 v16, v9 +; CHECK-NEXT: vmul.vv v8, v12, v16 +; CHECK-NEXT: ret + %vc = sext %va to + %vd = zext %vb to + %ve = mul %vc, %vd + ret %ve +} + +define @vwmul_vx_nxv4i64_nxv4i16( %va, i16 %b) { +; CHECK-LABEL: vwmul_vx_nxv4i64_nxv4i16: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a1, zero, e16, m1, ta, ma +; CHECK-NEXT: vmv.v.x v9, a0 +; CHECK-NEXT: vsetvli zero, zero, e64, m4, ta, ma +; CHECK-NEXT: vsext.vf4 v12, v8 +; CHECK-NEXT: vsext.vf4 v16, v9 +; CHECK-NEXT: vmul.vv v8, v12, v16 +; CHECK-NEXT: ret + %head = insertelement undef, i16 %b, i16 0 + %splat = shufflevector %head, undef, zeroinitializer + %vc = sext %va to + %vd = sext %splat to + %ve = mul %vc, %vd + ret %ve +} + +define @vwmulu_vx_nxv4i64_nxv4i16( %va, i16 %b) { +; CHECK-LABEL: vwmulu_vx_nxv4i64_nxv4i16: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a1, zero, e16, m1, ta, ma +; CHECK-NEXT: vmv.v.x v9, a0 +; CHECK-NEXT: vsetvli zero, zero, e64, m4, ta, ma +; CHECK-NEXT: vzext.vf4 v12, v8 +; CHECK-NEXT: vzext.vf4 v16, v9 +; CHECK-NEXT: vmul.vv v8, v12, v16 +; CHECK-NEXT: ret + %head = insertelement undef, i16 %b, i16 0 + %splat = shufflevector %head, undef, zeroinitializer + %vc = zext %va to + %vd = zext %splat to + %ve = mul %vc, %vd + ret %ve +} + +define @vwmulsu_vx_nxv4i64_nxv4i16( %va, i16 %b) { +; CHECK-LABEL: vwmulsu_vx_nxv4i64_nxv4i16: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a1, zero, e16, m1, ta, ma +; CHECK-NEXT: vmv.v.x v9, a0 +; CHECK-NEXT: vsetvli zero, zero, e64, m4, ta, ma +; CHECK-NEXT: vsext.vf4 v12, v8 +; CHECK-NEXT: vzext.vf4 v16, v9 +; CHECK-NEXT: vmul.vv v8, v12, v16 +; CHECK-NEXT: ret + %head = insertelement undef, i16 %b, i16 0 + %splat = shufflevector %head, undef, zeroinitializer + %vc = sext %va to + %vd = zext %splat to + %ve = mul %vc, %vd + ret %ve +} + +define @vwmul_vv_nxv8i64_nxv8i16( %va, %vb) { +; CHECK-LABEL: vwmul_vv_nxv8i64_nxv8i16: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a0, zero, e64, m8, ta, ma +; CHECK-NEXT: vsext.vf4 v16, v8 +; CHECK-NEXT: vsext.vf4 v24, v10 +; CHECK-NEXT: vmul.vv v8, v16, v24 +; CHECK-NEXT: ret + %vc = sext %va to + %vd = sext %vb to + %ve = mul %vc, %vd + ret %ve +} + +define @vwmulu_vv_nxv8i64_nxv8i16( %va, %vb) { +; CHECK-LABEL: vwmulu_vv_nxv8i64_nxv8i16: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a0, zero, e64, m8, ta, ma +; CHECK-NEXT: vzext.vf4 v16, v8 +; CHECK-NEXT: vzext.vf4 v24, v10 +; CHECK-NEXT: vmul.vv v8, v16, v24 +; CHECK-NEXT: ret + %vc = zext %va to + %vd = zext %vb to + %ve = mul %vc, %vd + ret %ve +} + +define @vwmulsu_vv_nxv8i64_nxv8i16( %va, %vb) { +; CHECK-LABEL: vwmulsu_vv_nxv8i64_nxv8i16: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a0, zero, e64, m8, ta, ma +; CHECK-NEXT: vsext.vf4 v16, v8 +; CHECK-NEXT: vzext.vf4 v24, v10 +; CHECK-NEXT: vmul.vv v8, v16, v24 +; CHECK-NEXT: ret + %vc = sext %va to + %vd = zext %vb to + %ve = mul %vc, %vd + ret %ve +} + +define @vwmul_vx_nxv8i64_nxv8i16( %va, i16 %b) { +; CHECK-LABEL: vwmul_vx_nxv8i64_nxv8i16: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a1, zero, e16, m2, ta, ma +; CHECK-NEXT: vmv.v.x v10, a0 +; CHECK-NEXT: vsetvli zero, zero, e64, m8, ta, ma +; CHECK-NEXT: vsext.vf4 v16, v8 +; CHECK-NEXT: vsext.vf4 v24, v10 +; CHECK-NEXT: vmul.vv v8, v16, v24 +; CHECK-NEXT: ret + %head = insertelement undef, i16 %b, i16 0 + %splat = shufflevector %head, undef, zeroinitializer + %vc = sext %va to + %vd = sext %splat to + %ve = mul %vc, %vd + ret %ve +} + +define @vwmulu_vx_nxv8i64_nxv8i16( %va, i16 %b) { +; CHECK-LABEL: vwmulu_vx_nxv8i64_nxv8i16: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a1, zero, e16, m2, ta, ma +; CHECK-NEXT: vmv.v.x v10, a0 +; CHECK-NEXT: vsetvli zero, zero, e64, m8, ta, ma +; CHECK-NEXT: vzext.vf4 v16, v8 +; CHECK-NEXT: vzext.vf4 v24, v10 +; CHECK-NEXT: vmul.vv v8, v16, v24 +; CHECK-NEXT: ret + %head = insertelement undef, i16 %b, i16 0 + %splat = shufflevector %head, undef, zeroinitializer + %vc = zext %va to + %vd = zext %splat to + %ve = mul %vc, %vd + ret %ve +} + +define @vwmulsu_vx_nxv8i64_nxv8i16( %va, i16 %b) { +; CHECK-LABEL: vwmulsu_vx_nxv8i64_nxv8i16: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a1, zero, e16, m2, ta, ma +; CHECK-NEXT: vmv.v.x v10, a0 +; CHECK-NEXT: vsetvli zero, zero, e64, m8, ta, ma +; CHECK-NEXT: vsext.vf4 v16, v8 +; CHECK-NEXT: vzext.vf4 v24, v10 +; CHECK-NEXT: vmul.vv v8, v16, v24 +; CHECK-NEXT: ret + %head = insertelement undef, i16 %b, i16 0 + %splat = shufflevector %head, undef, zeroinitializer + %vc = sext %va to + %vd = zext %splat to + %ve = mul %vc, %vd + ret %ve +} + +define @vwmul_vv_nxv1i64_nxv1i8( %va, %vb) { +; CHECK-LABEL: vwmul_vv_nxv1i64_nxv1i8: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a0, zero, e64, m1, ta, ma +; CHECK-NEXT: vsext.vf8 v10, v8 +; CHECK-NEXT: vsext.vf8 v8, v9 +; CHECK-NEXT: vmul.vv v8, v10, v8 +; CHECK-NEXT: ret + %vc = sext %va to + %vd = sext %vb to + %ve = mul %vc, %vd + ret %ve +} + +define @vwmulu_vv_nxv1i64_nxv1i8( %va, %vb) { +; CHECK-LABEL: vwmulu_vv_nxv1i64_nxv1i8: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a0, zero, e64, m1, ta, ma +; CHECK-NEXT: vzext.vf8 v10, v8 +; CHECK-NEXT: vzext.vf8 v8, v9 +; CHECK-NEXT: vmul.vv v8, v10, v8 +; CHECK-NEXT: ret + %vc = zext %va to + %vd = zext %vb to + %ve = mul %vc, %vd + ret %ve +} + +define @vwmulsu_vv_nxv1i64_nxv1i8( %va, %vb) { +; CHECK-LABEL: vwmulsu_vv_nxv1i64_nxv1i8: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a0, zero, e64, m1, ta, ma +; CHECK-NEXT: vsext.vf8 v10, v8 +; CHECK-NEXT: vzext.vf8 v8, v9 +; CHECK-NEXT: vmul.vv v8, v10, v8 +; CHECK-NEXT: ret + %vc = sext %va to + %vd = zext %vb to + %ve = mul %vc, %vd + ret %ve +} + +define @vwmul_vx_nxv1i64_nxv1i8( %va, i8 %b) { +; CHECK-LABEL: vwmul_vx_nxv1i64_nxv1i8: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a1, zero, e8, mf8, ta, ma +; CHECK-NEXT: vmv.v.x v9, a0 +; CHECK-NEXT: vsetvli zero, zero, e64, m1, ta, ma +; CHECK-NEXT: vsext.vf8 v10, v8 +; CHECK-NEXT: vsext.vf8 v8, v9 +; CHECK-NEXT: vmul.vv v8, v10, v8 +; CHECK-NEXT: ret + %head = insertelement undef, i8 %b, i8 0 + %splat = shufflevector %head, undef, zeroinitializer + %vc = sext %va to + %vd = sext %splat to + %ve = mul %vc, %vd + ret %ve +} + +define @vwmulu_vx_nxv1i64_nxv1i8( %va, i8 %b) { +; CHECK-LABEL: vwmulu_vx_nxv1i64_nxv1i8: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a1, zero, e8, mf8, ta, ma +; CHECK-NEXT: vmv.v.x v9, a0 +; CHECK-NEXT: vsetvli zero, zero, e64, m1, ta, ma +; CHECK-NEXT: vzext.vf8 v10, v8 +; CHECK-NEXT: vzext.vf8 v8, v9 +; CHECK-NEXT: vmul.vv v8, v10, v8 +; CHECK-NEXT: ret + %head = insertelement undef, i8 %b, i8 0 + %splat = shufflevector %head, undef, zeroinitializer + %vc = zext %va to + %vd = zext %splat to + %ve = mul %vc, %vd + ret %ve +} + +define @vwmulsu_vx_nxv1i64_nxv1i8( %va, i8 %b) { +; CHECK-LABEL: vwmulsu_vx_nxv1i64_nxv1i8: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a1, zero, e8, mf8, ta, ma +; CHECK-NEXT: vmv.v.x v9, a0 +; CHECK-NEXT: vsetvli zero, zero, e64, m1, ta, ma +; CHECK-NEXT: vsext.vf8 v10, v8 +; CHECK-NEXT: vzext.vf8 v8, v9 +; CHECK-NEXT: vmul.vv v8, v10, v8 +; CHECK-NEXT: ret + %head = insertelement undef, i8 %b, i8 0 + %splat = shufflevector %head, undef, zeroinitializer + %vc = sext %va to + %vd = zext %splat to + %ve = mul %vc, %vd + ret %ve +} + +define @vwmul_vv_nxv2i64_nxv2i8( %va, %vb) { +; CHECK-LABEL: vwmul_vv_nxv2i64_nxv2i8: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a0, zero, e64, m2, ta, ma +; CHECK-NEXT: vsext.vf8 v10, v8 +; CHECK-NEXT: vsext.vf8 v12, v9 +; CHECK-NEXT: vmul.vv v8, v10, v12 +; CHECK-NEXT: ret + %vc = sext %va to + %vd = sext %vb to + %ve = mul %vc, %vd + ret %ve +} + +define @vwmulu_vv_nxv2i64_nxv2i8( %va, %vb) { +; CHECK-LABEL: vwmulu_vv_nxv2i64_nxv2i8: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a0, zero, e64, m2, ta, ma +; CHECK-NEXT: vzext.vf8 v10, v8 +; CHECK-NEXT: vzext.vf8 v12, v9 +; CHECK-NEXT: vmul.vv v8, v10, v12 +; CHECK-NEXT: ret + %vc = zext %va to + %vd = zext %vb to + %ve = mul %vc, %vd + ret %ve +} + +define @vwmulsu_vv_nxv2i64_nxv2i8( %va, %vb) { +; CHECK-LABEL: vwmulsu_vv_nxv2i64_nxv2i8: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a0, zero, e64, m2, ta, ma +; CHECK-NEXT: vsext.vf8 v10, v8 +; CHECK-NEXT: vzext.vf8 v12, v9 +; CHECK-NEXT: vmul.vv v8, v10, v12 +; CHECK-NEXT: ret + %vc = sext %va to + %vd = zext %vb to + %ve = mul %vc, %vd + ret %ve +} + +define @vwmul_vx_nxv2i64_nxv2i8( %va, i8 %b) { +; CHECK-LABEL: vwmul_vx_nxv2i64_nxv2i8: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a1, zero, e8, mf4, ta, ma +; CHECK-NEXT: vmv.v.x v9, a0 +; CHECK-NEXT: vsetvli zero, zero, e64, m2, ta, ma +; CHECK-NEXT: vsext.vf8 v10, v8 +; CHECK-NEXT: vsext.vf8 v12, v9 +; CHECK-NEXT: vmul.vv v8, v10, v12 +; CHECK-NEXT: ret + %head = insertelement undef, i8 %b, i8 0 + %splat = shufflevector %head, undef, zeroinitializer + %vc = sext %va to + %vd = sext %splat to + %ve = mul %vc, %vd + ret %ve +} + +define @vwmulu_vx_nxv2i64_nxv2i8( %va, i8 %b) { +; CHECK-LABEL: vwmulu_vx_nxv2i64_nxv2i8: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a1, zero, e8, mf4, ta, ma +; CHECK-NEXT: vmv.v.x v9, a0 +; CHECK-NEXT: vsetvli zero, zero, e64, m2, ta, ma +; CHECK-NEXT: vzext.vf8 v10, v8 +; CHECK-NEXT: vzext.vf8 v12, v9 +; CHECK-NEXT: vmul.vv v8, v10, v12 +; CHECK-NEXT: ret + %head = insertelement undef, i8 %b, i8 0 + %splat = shufflevector %head, undef, zeroinitializer + %vc = zext %va to + %vd = zext %splat to + %ve = mul %vc, %vd + ret %ve +} + +define @vwmulsu_vx_nxv2i64_nxv2i8( %va, i8 %b) { +; CHECK-LABEL: vwmulsu_vx_nxv2i64_nxv2i8: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a1, zero, e8, mf4, ta, ma +; CHECK-NEXT: vmv.v.x v9, a0 +; CHECK-NEXT: vsetvli zero, zero, e64, m2, ta, ma +; CHECK-NEXT: vsext.vf8 v10, v8 +; CHECK-NEXT: vzext.vf8 v12, v9 +; CHECK-NEXT: vmul.vv v8, v10, v12 +; CHECK-NEXT: ret + %head = insertelement undef, i8 %b, i8 0 + %splat = shufflevector %head, undef, zeroinitializer + %vc = sext %va to + %vd = zext %splat to + %ve = mul %vc, %vd + ret %ve +} + +define @vwmul_vv_nxv4i64_nxv4i8( %va, %vb) { +; CHECK-LABEL: vwmul_vv_nxv4i64_nxv4i8: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a0, zero, e64, m4, ta, ma +; CHECK-NEXT: vsext.vf8 v12, v8 +; CHECK-NEXT: vsext.vf8 v16, v9 +; CHECK-NEXT: vmul.vv v8, v12, v16 +; CHECK-NEXT: ret + %vc = sext %va to + %vd = sext %vb to + %ve = mul %vc, %vd + ret %ve +} + +define @vwmulu_vv_nxv4i64_nxv4i8( %va, %vb) { +; CHECK-LABEL: vwmulu_vv_nxv4i64_nxv4i8: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a0, zero, e64, m4, ta, ma +; CHECK-NEXT: vzext.vf8 v12, v8 +; CHECK-NEXT: vzext.vf8 v16, v9 +; CHECK-NEXT: vmul.vv v8, v12, v16 +; CHECK-NEXT: ret + %vc = zext %va to + %vd = zext %vb to + %ve = mul %vc, %vd + ret %ve +} + +define @vwmulsu_vv_nxv4i64_nxv4i8( %va, %vb) { +; CHECK-LABEL: vwmulsu_vv_nxv4i64_nxv4i8: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a0, zero, e64, m4, ta, ma +; CHECK-NEXT: vsext.vf8 v12, v8 +; CHECK-NEXT: vzext.vf8 v16, v9 +; CHECK-NEXT: vmul.vv v8, v12, v16 +; CHECK-NEXT: ret + %vc = sext %va to + %vd = zext %vb to + %ve = mul %vc, %vd + ret %ve +} + +define @vwmul_vx_nxv4i64_nxv4i8( %va, i8 %b) { +; CHECK-LABEL: vwmul_vx_nxv4i64_nxv4i8: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a1, zero, e8, mf2, ta, ma +; CHECK-NEXT: vmv.v.x v9, a0 +; CHECK-NEXT: vsetvli zero, zero, e64, m4, ta, ma +; CHECK-NEXT: vsext.vf8 v12, v8 +; CHECK-NEXT: vsext.vf8 v16, v9 +; CHECK-NEXT: vmul.vv v8, v12, v16 +; CHECK-NEXT: ret + %head = insertelement undef, i8 %b, i8 0 + %splat = shufflevector %head, undef, zeroinitializer + %vc = sext %va to + %vd = sext %splat to + %ve = mul %vc, %vd + ret %ve +} + +define @vwmulu_vx_nxv4i64_nxv4i8( %va, i8 %b) { +; CHECK-LABEL: vwmulu_vx_nxv4i64_nxv4i8: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a1, zero, e8, mf2, ta, ma +; CHECK-NEXT: vmv.v.x v9, a0 +; CHECK-NEXT: vsetvli zero, zero, e64, m4, ta, ma +; CHECK-NEXT: vzext.vf8 v12, v8 +; CHECK-NEXT: vzext.vf8 v16, v9 +; CHECK-NEXT: vmul.vv v8, v12, v16 +; CHECK-NEXT: ret + %head = insertelement undef, i8 %b, i8 0 + %splat = shufflevector %head, undef, zeroinitializer + %vc = zext %va to + %vd = zext %splat to + %ve = mul %vc, %vd + ret %ve +} + +define @vwmulsu_vx_nxv4i64_nxv4i8( %va, i8 %b) { +; CHECK-LABEL: vwmulsu_vx_nxv4i64_nxv4i8: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a1, zero, e8, mf2, ta, ma +; CHECK-NEXT: vmv.v.x v9, a0 +; CHECK-NEXT: vsetvli zero, zero, e64, m4, ta, ma +; CHECK-NEXT: vsext.vf8 v12, v8 +; CHECK-NEXT: vzext.vf8 v16, v9 +; CHECK-NEXT: vmul.vv v8, v12, v16 +; CHECK-NEXT: ret + %head = insertelement undef, i8 %b, i8 0 + %splat = shufflevector %head, undef, zeroinitializer + %vc = sext %va to + %vd = zext %splat to + %ve = mul %vc, %vd + ret %ve +} + +define @vwmul_vv_nxv8i64_nxv8i8( %va, %vb) { +; CHECK-LABEL: vwmul_vv_nxv8i64_nxv8i8: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a0, zero, e64, m8, ta, ma +; CHECK-NEXT: vsext.vf8 v16, v8 +; CHECK-NEXT: vsext.vf8 v24, v9 +; CHECK-NEXT: vmul.vv v8, v16, v24 +; CHECK-NEXT: ret + %vc = sext %va to + %vd = sext %vb to + %ve = mul %vc, %vd + ret %ve +} + +define @vwmulu_vv_nxv8i64_nxv8i8( %va, %vb) { +; CHECK-LABEL: vwmulu_vv_nxv8i64_nxv8i8: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a0, zero, e64, m8, ta, ma +; CHECK-NEXT: vzext.vf8 v16, v8 +; CHECK-NEXT: vzext.vf8 v24, v9 +; CHECK-NEXT: vmul.vv v8, v16, v24 +; CHECK-NEXT: ret + %vc = zext %va to + %vd = zext %vb to + %ve = mul %vc, %vd + ret %ve +} + +define @vwmulsu_vv_nxv8i64_nxv8i8( %va, %vb) { +; CHECK-LABEL: vwmulsu_vv_nxv8i64_nxv8i8: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a0, zero, e64, m8, ta, ma +; CHECK-NEXT: vsext.vf8 v16, v8 +; CHECK-NEXT: vzext.vf8 v24, v9 +; CHECK-NEXT: vmul.vv v8, v16, v24 +; CHECK-NEXT: ret + %vc = sext %va to + %vd = zext %vb to + %ve = mul %vc, %vd + ret %ve +} + +define @vwmul_vx_nxv8i64_nxv8i8( %va, i8 %b) { +; CHECK-LABEL: vwmul_vx_nxv8i64_nxv8i8: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a1, zero, e8, m1, ta, ma +; CHECK-NEXT: vmv.v.x v9, a0 +; CHECK-NEXT: vsetvli zero, zero, e64, m8, ta, ma +; CHECK-NEXT: vsext.vf8 v16, v8 +; CHECK-NEXT: vsext.vf8 v24, v9 +; CHECK-NEXT: vmul.vv v8, v16, v24 +; CHECK-NEXT: ret + %head = insertelement undef, i8 %b, i8 0 + %splat = shufflevector %head, undef, zeroinitializer + %vc = sext %va to + %vd = sext %splat to + %ve = mul %vc, %vd + ret %ve +} + +define @vwmulu_vx_nxv8i64_nxv8i8( %va, i8 %b) { +; CHECK-LABEL: vwmulu_vx_nxv8i64_nxv8i8: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a1, zero, e8, m1, ta, ma +; CHECK-NEXT: vmv.v.x v9, a0 +; CHECK-NEXT: vsetvli zero, zero, e64, m8, ta, ma +; CHECK-NEXT: vzext.vf8 v16, v8 +; CHECK-NEXT: vzext.vf8 v24, v9 +; CHECK-NEXT: vmul.vv v8, v16, v24 +; CHECK-NEXT: ret + %head = insertelement undef, i8 %b, i8 0 + %splat = shufflevector %head, undef, zeroinitializer + %vc = zext %va to + %vd = zext %splat to + %ve = mul %vc, %vd + ret %ve +} + +define @vwmulsu_vx_nxv8i64_nxv8i8( %va, i8 %b) { +; CHECK-LABEL: vwmulsu_vx_nxv8i64_nxv8i8: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a1, zero, e8, m1, ta, ma +; CHECK-NEXT: vmv.v.x v9, a0 +; CHECK-NEXT: vsetvli zero, zero, e64, m8, ta, ma +; CHECK-NEXT: vsext.vf8 v16, v8 +; CHECK-NEXT: vzext.vf8 v24, v9 +; CHECK-NEXT: vmul.vv v8, v16, v24 +; CHECK-NEXT: ret + %head = insertelement undef, i8 %b, i8 0 + %splat = shufflevector %head, undef, zeroinitializer + %vc = sext %va to + %vd = zext %splat to + %ve = mul %vc, %vd + ret %ve +} diff --git a/llvm/test/CodeGen/RISCV/rvv/vwsub-sdnode.ll b/llvm/test/CodeGen/RISCV/rvv/vwsub-sdnode.ll index a6a15c164343602..123469ade0ed4d7 100644 --- a/llvm/test/CodeGen/RISCV/rvv/vwsub-sdnode.ll +++ b/llvm/test/CodeGen/RISCV/rvv/vwsub-sdnode.ll @@ -2,8 +2,8 @@ ; RUN: llc -mtriple=riscv32 -mattr=+v -verify-machineinstrs < %s | FileCheck %s ; RUN: llc -mtriple=riscv64 -mattr=+v -verify-machineinstrs < %s | FileCheck %s -define @vwsub_vv_nxv1i64( %va, %vb) { -; CHECK-LABEL: vwsub_vv_nxv1i64: +define @vwsub_vv_nxv1i64_nxv1i32( %va, %vb) { +; CHECK-LABEL: vwsub_vv_nxv1i64_nxv1i32: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a0, zero, e32, mf2, ta, ma ; CHECK-NEXT: vwsub.vv v10, v8, v9 @@ -15,8 +15,8 @@ define @vwsub_vv_nxv1i64( %va, %ve } -define @vwsubu_vv_nxv1i64( %va, %vb) { -; CHECK-LABEL: vwsubu_vv_nxv1i64: +define @vwsubu_vv_nxv1i64_nxv1i32( %va, %vb) { +; CHECK-LABEL: vwsubu_vv_nxv1i64_nxv1i32: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a0, zero, e32, mf2, ta, ma ; CHECK-NEXT: vwsubu.vv v10, v8, v9 @@ -28,8 +28,8 @@ define @vwsubu_vv_nxv1i64( %va, %ve } -define @vwsub_vx_nxv1i64( %va, i32 %b) { -; CHECK-LABEL: vwsub_vx_nxv1i64: +define @vwsub_vx_nxv1i64_nxv1i32( %va, i32 %b) { +; CHECK-LABEL: vwsub_vx_nxv1i64_nxv1i32: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a1, zero, e32, mf2, ta, ma ; CHECK-NEXT: vwsub.vx v9, v8, a0 @@ -43,8 +43,8 @@ define @vwsub_vx_nxv1i64( %va, i32 %b) { ret %ve } -define @vwsubu_vx_nxv1i64( %va, i32 %b) { -; CHECK-LABEL: vwsubu_vx_nxv1i64: +define @vwsubu_vx_nxv1i64_nxv1i32( %va, i32 %b) { +; CHECK-LABEL: vwsubu_vx_nxv1i64_nxv1i32: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a1, zero, e32, mf2, ta, ma ; CHECK-NEXT: vwsubu.vx v9, v8, a0 @@ -58,8 +58,8 @@ define @vwsubu_vx_nxv1i64( %va, i32 %b) { ret %ve } -define @vwsub_wv_nxv1i64( %va, %vb) { -; CHECK-LABEL: vwsub_wv_nxv1i64: +define @vwsub_wv_nxv1i64_nxv1i32( %va, %vb) { +; CHECK-LABEL: vwsub_wv_nxv1i64_nxv1i32: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a0, zero, e32, mf2, ta, ma ; CHECK-NEXT: vwsub.wv v8, v8, v9 @@ -69,8 +69,8 @@ define @vwsub_wv_nxv1i64( %va, %vd } -define @vwsubu_wv_nxv1i64( %va, %vb) { -; CHECK-LABEL: vwsubu_wv_nxv1i64: +define @vwsubu_wv_nxv1i64_nxv1i32( %va, %vb) { +; CHECK-LABEL: vwsubu_wv_nxv1i64_nxv1i32: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a0, zero, e32, mf2, ta, ma ; CHECK-NEXT: vwsubu.wv v8, v8, v9 @@ -80,8 +80,8 @@ define @vwsubu_wv_nxv1i64( %va, %vd } -define @vwsub_wx_nxv1i64( %va, i32 %b) { -; CHECK-LABEL: vwsub_wx_nxv1i64: +define @vwsub_wx_nxv1i64_nxv1i32( %va, i32 %b) { +; CHECK-LABEL: vwsub_wx_nxv1i64_nxv1i32: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a1, zero, e32, mf2, ta, ma ; CHECK-NEXT: vwsub.wx v8, v8, a0 @@ -93,8 +93,8 @@ define @vwsub_wx_nxv1i64( %va, i32 %b) { ret %vc } -define @vwsubu_wx_nxv1i64( %va, i32 %b) { -; CHECK-LABEL: vwsubu_wx_nxv1i64: +define @vwsubu_wx_nxv1i64_nxv1i32( %va, i32 %b) { +; CHECK-LABEL: vwsubu_wx_nxv1i64_nxv1i32: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a1, zero, e32, mf2, ta, ma ; CHECK-NEXT: vwsubu.wx v8, v8, a0 @@ -106,8 +106,8 @@ define @vwsubu_wx_nxv1i64( %va, i32 %b) { ret %vc } -define @vwsub_vv_nxv2i64( %va, %vb) { -; CHECK-LABEL: vwsub_vv_nxv2i64: +define @vwsub_vv_nxv2i64_nxv2i32( %va, %vb) { +; CHECK-LABEL: vwsub_vv_nxv2i64_nxv2i32: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a0, zero, e32, m1, ta, ma ; CHECK-NEXT: vwsub.vv v10, v8, v9 @@ -119,8 +119,8 @@ define @vwsub_vv_nxv2i64( %va, %ve } -define @vwsubu_vv_nxv2i64( %va, %vb) { -; CHECK-LABEL: vwsubu_vv_nxv2i64: +define @vwsubu_vv_nxv2i64_nxv2i32( %va, %vb) { +; CHECK-LABEL: vwsubu_vv_nxv2i64_nxv2i32: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a0, zero, e32, m1, ta, ma ; CHECK-NEXT: vwsubu.vv v10, v8, v9 @@ -132,8 +132,8 @@ define @vwsubu_vv_nxv2i64( %va, %ve } -define @vwsub_vx_nxv2i64( %va, i32 %b) { -; CHECK-LABEL: vwsub_vx_nxv2i64: +define @vwsub_vx_nxv2i64_nxv2i32( %va, i32 %b) { +; CHECK-LABEL: vwsub_vx_nxv2i64_nxv2i32: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a1, zero, e32, m1, ta, ma ; CHECK-NEXT: vwsub.vx v10, v8, a0 @@ -147,8 +147,8 @@ define @vwsub_vx_nxv2i64( %va, i32 %b) { ret %ve } -define @vwsubu_vx_nxv2i64( %va, i32 %b) { -; CHECK-LABEL: vwsubu_vx_nxv2i64: +define @vwsubu_vx_nxv2i64_nxv2i32( %va, i32 %b) { +; CHECK-LABEL: vwsubu_vx_nxv2i64_nxv2i32: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a1, zero, e32, m1, ta, ma ; CHECK-NEXT: vwsubu.vx v10, v8, a0 @@ -162,8 +162,8 @@ define @vwsubu_vx_nxv2i64( %va, i32 %b) { ret %ve } -define @vwsub_wv_nxv2i64( %va, %vb) { -; CHECK-LABEL: vwsub_wv_nxv2i64: +define @vwsub_wv_nxv2i64_nxv2i32( %va, %vb) { +; CHECK-LABEL: vwsub_wv_nxv2i64_nxv2i32: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a0, zero, e32, m1, ta, ma ; CHECK-NEXT: vwsub.wv v8, v8, v10 @@ -173,8 +173,8 @@ define @vwsub_wv_nxv2i64( %va, %vd } -define @vwsubu_wv_nxv2i64( %va, %vb) { -; CHECK-LABEL: vwsubu_wv_nxv2i64: +define @vwsubu_wv_nxv2i64_nxv2i32( %va, %vb) { +; CHECK-LABEL: vwsubu_wv_nxv2i64_nxv2i32: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a0, zero, e32, m1, ta, ma ; CHECK-NEXT: vwsubu.wv v8, v8, v10 @@ -184,8 +184,8 @@ define @vwsubu_wv_nxv2i64( %va, %vd } -define @vwsub_wx_nxv2i64( %va, i32 %b) { -; CHECK-LABEL: vwsub_wx_nxv2i64: +define @vwsub_wx_nxv2i64_nxv2i32( %va, i32 %b) { +; CHECK-LABEL: vwsub_wx_nxv2i64_nxv2i32: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a1, zero, e32, m1, ta, ma ; CHECK-NEXT: vwsub.wx v8, v8, a0 @@ -197,8 +197,8 @@ define @vwsub_wx_nxv2i64( %va, i32 %b) { ret %vc } -define @vwsubu_wx_nxv2i64( %va, i32 %b) { -; CHECK-LABEL: vwsubu_wx_nxv2i64: +define @vwsubu_wx_nxv2i64_nxv2i32( %va, i32 %b) { +; CHECK-LABEL: vwsubu_wx_nxv2i64_nxv2i32: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a1, zero, e32, m1, ta, ma ; CHECK-NEXT: vwsubu.wx v8, v8, a0 @@ -210,8 +210,8 @@ define @vwsubu_wx_nxv2i64( %va, i32 %b) { ret %vc } -define @vwsub_vv_nxv4i64( %va, %vb) { -; CHECK-LABEL: vwsub_vv_nxv4i64: +define @vwsub_vv_nxv4i64_nxv4i32( %va, %vb) { +; CHECK-LABEL: vwsub_vv_nxv4i64_nxv4i32: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a0, zero, e32, m2, ta, ma ; CHECK-NEXT: vwsub.vv v12, v8, v10 @@ -223,8 +223,8 @@ define @vwsub_vv_nxv4i64( %va, %ve } -define @vwsubu_vv_nxv4i64( %va, %vb) { -; CHECK-LABEL: vwsubu_vv_nxv4i64: +define @vwsubu_vv_nxv4i64_nxv4i32( %va, %vb) { +; CHECK-LABEL: vwsubu_vv_nxv4i64_nxv4i32: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a0, zero, e32, m2, ta, ma ; CHECK-NEXT: vwsubu.vv v12, v8, v10 @@ -236,8 +236,8 @@ define @vwsubu_vv_nxv4i64( %va, %ve } -define @vwsub_vx_nxv4i64( %va, i32 %b) { -; CHECK-LABEL: vwsub_vx_nxv4i64: +define @vwsub_vx_nxv4i64_nxv4i32( %va, i32 %b) { +; CHECK-LABEL: vwsub_vx_nxv4i64_nxv4i32: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a1, zero, e32, m2, ta, ma ; CHECK-NEXT: vwsub.vx v12, v8, a0 @@ -251,8 +251,8 @@ define @vwsub_vx_nxv4i64( %va, i32 %b) { ret %ve } -define @vwsubu_vx_nxv4i64( %va, i32 %b) { -; CHECK-LABEL: vwsubu_vx_nxv4i64: +define @vwsubu_vx_nxv4i64_nxv4i32( %va, i32 %b) { +; CHECK-LABEL: vwsubu_vx_nxv4i64_nxv4i32: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a1, zero, e32, m2, ta, ma ; CHECK-NEXT: vwsubu.vx v12, v8, a0 @@ -266,8 +266,8 @@ define @vwsubu_vx_nxv4i64( %va, i32 %b) { ret %ve } -define @vwsub_wv_nxv4i64( %va, %vb) { -; CHECK-LABEL: vwsub_wv_nxv4i64: +define @vwsub_wv_nxv4i64_nxv4i32( %va, %vb) { +; CHECK-LABEL: vwsub_wv_nxv4i64_nxv4i32: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a0, zero, e32, m2, ta, ma ; CHECK-NEXT: vwsub.wv v8, v8, v12 @@ -277,8 +277,8 @@ define @vwsub_wv_nxv4i64( %va, %vd } -define @vwsubu_wv_nxv4i64( %va, %vb) { -; CHECK-LABEL: vwsubu_wv_nxv4i64: +define @vwsubu_wv_nxv4i64_nxv4i32( %va, %vb) { +; CHECK-LABEL: vwsubu_wv_nxv4i64_nxv4i32: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a0, zero, e32, m2, ta, ma ; CHECK-NEXT: vwsubu.wv v8, v8, v12 @@ -288,8 +288,8 @@ define @vwsubu_wv_nxv4i64( %va, %vd } -define @vwsub_wx_nxv4i64( %va, i32 %b) { -; CHECK-LABEL: vwsub_wx_nxv4i64: +define @vwsub_wx_nxv4i64_nxv4i32( %va, i32 %b) { +; CHECK-LABEL: vwsub_wx_nxv4i64_nxv4i32: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a1, zero, e32, m2, ta, ma ; CHECK-NEXT: vwsub.wx v8, v8, a0 @@ -301,8 +301,8 @@ define @vwsub_wx_nxv4i64( %va, i32 %b) { ret %vc } -define @vwsubu_wx_nxv4i64( %va, i32 %b) { -; CHECK-LABEL: vwsubu_wx_nxv4i64: +define @vwsubu_wx_nxv4i64_nxv4i32( %va, i32 %b) { +; CHECK-LABEL: vwsubu_wx_nxv4i64_nxv4i32: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a1, zero, e32, m2, ta, ma ; CHECK-NEXT: vwsubu.wx v8, v8, a0 @@ -314,8 +314,8 @@ define @vwsubu_wx_nxv4i64( %va, i32 %b) { ret %vc } -define @vwsub_vv_nxv8i64( %va, %vb) { -; CHECK-LABEL: vwsub_vv_nxv8i64: +define @vwsub_vv_nxv8i64_nxv8i32( %va, %vb) { +; CHECK-LABEL: vwsub_vv_nxv8i64_nxv8i32: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, ma ; CHECK-NEXT: vwsub.vv v16, v8, v12 @@ -327,8 +327,8 @@ define @vwsub_vv_nxv8i64( %va, %ve } -define @vwsubu_vv_nxv8i64( %va, %vb) { -; CHECK-LABEL: vwsubu_vv_nxv8i64: +define @vwsubu_vv_nxv8i64_nxv8i32( %va, %vb) { +; CHECK-LABEL: vwsubu_vv_nxv8i64_nxv8i32: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, ma ; CHECK-NEXT: vwsubu.vv v16, v8, v12 @@ -340,8 +340,8 @@ define @vwsubu_vv_nxv8i64( %va, %ve } -define @vwsub_vx_nxv8i64( %va, i32 %b) { -; CHECK-LABEL: vwsub_vx_nxv8i64: +define @vwsub_vx_nxv8i64_nxv8i32( %va, i32 %b) { +; CHECK-LABEL: vwsub_vx_nxv8i64_nxv8i32: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a1, zero, e32, m4, ta, ma ; CHECK-NEXT: vwsub.vx v16, v8, a0 @@ -355,8 +355,8 @@ define @vwsub_vx_nxv8i64( %va, i32 %b) { ret %ve } -define @vwsubu_vx_nxv8i64( %va, i32 %b) { -; CHECK-LABEL: vwsubu_vx_nxv8i64: +define @vwsubu_vx_nxv8i64_nxv8i32( %va, i32 %b) { +; CHECK-LABEL: vwsubu_vx_nxv8i64_nxv8i32: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a1, zero, e32, m4, ta, ma ; CHECK-NEXT: vwsubu.vx v16, v8, a0 @@ -370,8 +370,8 @@ define @vwsubu_vx_nxv8i64( %va, i32 %b) { ret %ve } -define @vwsub_wv_nxv8i64( %va, %vb) { -; CHECK-LABEL: vwsub_wv_nxv8i64: +define @vwsub_wv_nxv8i64_nxv8i32( %va, %vb) { +; CHECK-LABEL: vwsub_wv_nxv8i64_nxv8i32: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, ma ; CHECK-NEXT: vwsub.wv v8, v8, v16 @@ -381,8 +381,8 @@ define @vwsub_wv_nxv8i64( %va, %vd } -define @vwsubu_wv_nxv8i64( %va, %vb) { -; CHECK-LABEL: vwsubu_wv_nxv8i64: +define @vwsubu_wv_nxv8i64_nxv8i32( %va, %vb) { +; CHECK-LABEL: vwsubu_wv_nxv8i64_nxv8i32: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, ma ; CHECK-NEXT: vwsubu.wv v8, v8, v16 @@ -392,8 +392,8 @@ define @vwsubu_wv_nxv8i64( %va, %vd } -define @vwsub_wx_nxv8i64( %va, i32 %b) { -; CHECK-LABEL: vwsub_wx_nxv8i64: +define @vwsub_wx_nxv8i64_nxv8i32( %va, i32 %b) { +; CHECK-LABEL: vwsub_wx_nxv8i64_nxv8i32: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a1, zero, e32, m4, ta, ma ; CHECK-NEXT: vwsub.wx v8, v8, a0 @@ -405,8 +405,8 @@ define @vwsub_wx_nxv8i64( %va, i32 %b) { ret %vc } -define @vwsubu_wx_nxv8i64( %va, i32 %b) { -; CHECK-LABEL: vwsubu_wx_nxv8i64: +define @vwsubu_wx_nxv8i64_nxv8i32( %va, i32 %b) { +; CHECK-LABEL: vwsubu_wx_nxv8i64_nxv8i32: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a1, zero, e32, m4, ta, ma ; CHECK-NEXT: vwsubu.wx v8, v8, a0 @@ -417,3 +417,947 @@ define @vwsubu_wx_nxv8i64( %va, i32 %b) { %vc = sub %va, %vb ret %vc } + +define @vwsub_vv_nxv1i64_nxv1i16( %va, %vb) { +; CHECK-LABEL: vwsub_vv_nxv1i64_nxv1i16: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a0, zero, e64, m1, ta, ma +; CHECK-NEXT: vsext.vf4 v10, v8 +; CHECK-NEXT: vsext.vf4 v8, v9 +; CHECK-NEXT: vsub.vv v8, v10, v8 +; CHECK-NEXT: ret + %vc = sext %va to + %vd = sext %vb to + %ve = sub %vc, %vd + ret %ve +} + +define @vwsubu_vv_nxv1i64_nxv1i16( %va, %vb) { +; CHECK-LABEL: vwsubu_vv_nxv1i64_nxv1i16: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a0, zero, e16, mf4, ta, ma +; CHECK-NEXT: vwsubu.vv v10, v8, v9 +; CHECK-NEXT: vsetvli zero, zero, e64, m1, ta, ma +; CHECK-NEXT: vsext.vf2 v8, v10 +; CHECK-NEXT: ret + %vc = zext %va to + %vd = zext %vb to + %ve = sub %vc, %vd + ret %ve +} + +define @vwsub_vx_nxv1i64_nxv1i16( %va, i16 %b) { +; CHECK-LABEL: vwsub_vx_nxv1i64_nxv1i16: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a1, zero, e16, mf4, ta, ma +; CHECK-NEXT: vmv.v.x v9, a0 +; CHECK-NEXT: vsetvli zero, zero, e64, m1, ta, ma +; CHECK-NEXT: vsext.vf4 v10, v8 +; CHECK-NEXT: vsext.vf4 v8, v9 +; CHECK-NEXT: vsub.vv v8, v10, v8 +; CHECK-NEXT: ret + %head = insertelement poison, i16 %b, i16 0 + %splat = shufflevector %head, poison, zeroinitializer + %vc = sext %va to + %vd = sext %splat to + %ve = sub %vc, %vd + ret %ve +} + +define @vwsubu_vx_nxv1i64_nxv1i16( %va, i16 %b) { +; CHECK-LABEL: vwsubu_vx_nxv1i64_nxv1i16: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a1, zero, e16, mf4, ta, ma +; CHECK-NEXT: vwsubu.vx v9, v8, a0 +; CHECK-NEXT: vsetvli zero, zero, e64, m1, ta, ma +; CHECK-NEXT: vsext.vf2 v8, v9 +; CHECK-NEXT: ret + %head = insertelement poison, i16 %b, i16 0 + %splat = shufflevector %head, poison, zeroinitializer + %vc = zext %va to + %vd = zext %splat to + %ve = sub %vc, %vd + ret %ve +} + +define @vwsub_wv_nxv1i64_nxv1i16( %va, %vb) { +; CHECK-LABEL: vwsub_wv_nxv1i64_nxv1i16: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a0, zero, e64, m1, ta, ma +; CHECK-NEXT: vsext.vf4 v10, v9 +; CHECK-NEXT: vsub.vv v8, v8, v10 +; CHECK-NEXT: ret + %vc = sext %vb to + %vd = sub %va, %vc + ret %vd +} + +define @vwsubu_wv_nxv1i64_nxv1i16( %va, %vb) { +; CHECK-LABEL: vwsubu_wv_nxv1i64_nxv1i16: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a0, zero, e64, m1, ta, ma +; CHECK-NEXT: vzext.vf4 v10, v9 +; CHECK-NEXT: vsub.vv v8, v8, v10 +; CHECK-NEXT: ret + %vc = zext %vb to + %vd = sub %va, %vc + ret %vd +} + +define @vwsub_wx_nxv1i64_nxv1i16( %va, i16 %b) { +; CHECK-LABEL: vwsub_wx_nxv1i64_nxv1i16: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a1, zero, e16, mf4, ta, ma +; CHECK-NEXT: vmv.v.x v9, a0 +; CHECK-NEXT: vsetvli zero, zero, e64, m1, ta, ma +; CHECK-NEXT: vsext.vf4 v10, v9 +; CHECK-NEXT: vsub.vv v8, v8, v10 +; CHECK-NEXT: ret + %head = insertelement poison, i16 %b, i16 0 + %splat = shufflevector %head, poison, zeroinitializer + %vb = sext %splat to + %vc = sub %va, %vb + ret %vc +} + +define @vwsubu_wx_nxv1i64_nxv1i16( %va, i16 %b) { +; CHECK-LABEL: vwsubu_wx_nxv1i64_nxv1i16: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a1, zero, e16, mf4, ta, ma +; CHECK-NEXT: vmv.v.x v9, a0 +; CHECK-NEXT: vsetvli zero, zero, e64, m1, ta, ma +; CHECK-NEXT: vzext.vf4 v10, v9 +; CHECK-NEXT: vsub.vv v8, v8, v10 +; CHECK-NEXT: ret + %head = insertelement poison, i16 %b, i16 0 + %splat = shufflevector %head, poison, zeroinitializer + %vb = zext %splat to + %vc = sub %va, %vb + ret %vc +} + +define @vwsub_vv_nxv2i64_nxv2i16( %va, %vb) { +; CHECK-LABEL: vwsub_vv_nxv2i64_nxv2i16: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a0, zero, e64, m2, ta, ma +; CHECK-NEXT: vsext.vf4 v10, v8 +; CHECK-NEXT: vsext.vf4 v12, v9 +; CHECK-NEXT: vsub.vv v8, v10, v12 +; CHECK-NEXT: ret + %vc = sext %va to + %vd = sext %vb to + %ve = sub %vc, %vd + ret %ve +} + +define @vwsubu_vv_nxv2i64_nxv2i16( %va, %vb) { +; CHECK-LABEL: vwsubu_vv_nxv2i64_nxv2i16: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a0, zero, e16, mf2, ta, ma +; CHECK-NEXT: vwsubu.vv v10, v8, v9 +; CHECK-NEXT: vsetvli zero, zero, e64, m2, ta, ma +; CHECK-NEXT: vsext.vf2 v8, v10 +; CHECK-NEXT: ret + %vc = zext %va to + %vd = zext %vb to + %ve = sub %vc, %vd + ret %ve +} + +define @vwsub_vx_nxv2i64_nxv2i16( %va, i16 %b) { +; CHECK-LABEL: vwsub_vx_nxv2i64_nxv2i16: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a1, zero, e16, mf2, ta, ma +; CHECK-NEXT: vmv.v.x v9, a0 +; CHECK-NEXT: vsetvli zero, zero, e64, m2, ta, ma +; CHECK-NEXT: vsext.vf4 v10, v8 +; CHECK-NEXT: vsext.vf4 v12, v9 +; CHECK-NEXT: vsub.vv v8, v10, v12 +; CHECK-NEXT: ret + %head = insertelement poison, i16 %b, i16 0 + %splat = shufflevector %head, poison, zeroinitializer + %vc = sext %va to + %vd = sext %splat to + %ve = sub %vc, %vd + ret %ve +} + +define @vwsubu_vx_nxv2i64_nxv2i16( %va, i16 %b) { +; CHECK-LABEL: vwsubu_vx_nxv2i64_nxv2i16: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a1, zero, e16, mf2, ta, ma +; CHECK-NEXT: vwsubu.vx v10, v8, a0 +; CHECK-NEXT: vsetvli zero, zero, e64, m2, ta, ma +; CHECK-NEXT: vsext.vf2 v8, v10 +; CHECK-NEXT: ret + %head = insertelement poison, i16 %b, i16 0 + %splat = shufflevector %head, poison, zeroinitializer + %vc = zext %va to + %vd = zext %splat to + %ve = sub %vc, %vd + ret %ve +} + +define @vwsub_wv_nxv2i64_nxv2i16( %va, %vb) { +; CHECK-LABEL: vwsub_wv_nxv2i64_nxv2i16: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a0, zero, e64, m2, ta, ma +; CHECK-NEXT: vsext.vf4 v12, v10 +; CHECK-NEXT: vsub.vv v8, v8, v12 +; CHECK-NEXT: ret + %vc = sext %vb to + %vd = sub %va, %vc + ret %vd +} + +define @vwsubu_wv_nxv2i64_nxv2i16( %va, %vb) { +; CHECK-LABEL: vwsubu_wv_nxv2i64_nxv2i16: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a0, zero, e64, m2, ta, ma +; CHECK-NEXT: vzext.vf4 v12, v10 +; CHECK-NEXT: vsub.vv v8, v8, v12 +; CHECK-NEXT: ret + %vc = zext %vb to + %vd = sub %va, %vc + ret %vd +} + +define @vwsub_wx_nxv2i64_nxv2i16( %va, i16 %b) { +; CHECK-LABEL: vwsub_wx_nxv2i64_nxv2i16: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a1, zero, e16, mf2, ta, ma +; CHECK-NEXT: vmv.v.x v10, a0 +; CHECK-NEXT: vsetvli zero, zero, e64, m2, ta, ma +; CHECK-NEXT: vsext.vf4 v12, v10 +; CHECK-NEXT: vsub.vv v8, v8, v12 +; CHECK-NEXT: ret + %head = insertelement poison, i16 %b, i16 0 + %splat = shufflevector %head, poison, zeroinitializer + %vb = sext %splat to + %vc = sub %va, %vb + ret %vc +} + +define @vwsubu_wx_nxv2i64_nxv2i16( %va, i16 %b) { +; CHECK-LABEL: vwsubu_wx_nxv2i64_nxv2i16: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a1, zero, e16, mf2, ta, ma +; CHECK-NEXT: vmv.v.x v10, a0 +; CHECK-NEXT: vsetvli zero, zero, e64, m2, ta, ma +; CHECK-NEXT: vzext.vf4 v12, v10 +; CHECK-NEXT: vsub.vv v8, v8, v12 +; CHECK-NEXT: ret + %head = insertelement poison, i16 %b, i16 0 + %splat = shufflevector %head, poison, zeroinitializer + %vb = zext %splat to + %vc = sub %va, %vb + ret %vc +} + +define @vwsub_vv_nxv4i64_nxv4i16( %va, %vb) { +; CHECK-LABEL: vwsub_vv_nxv4i64_nxv4i16: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a0, zero, e64, m4, ta, ma +; CHECK-NEXT: vsext.vf4 v12, v8 +; CHECK-NEXT: vsext.vf4 v16, v9 +; CHECK-NEXT: vsub.vv v8, v12, v16 +; CHECK-NEXT: ret + %vc = sext %va to + %vd = sext %vb to + %ve = sub %vc, %vd + ret %ve +} + +define @vwsubu_vv_nxv4i64_nxv4i16( %va, %vb) { +; CHECK-LABEL: vwsubu_vv_nxv4i64_nxv4i16: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a0, zero, e16, m1, ta, ma +; CHECK-NEXT: vwsubu.vv v12, v8, v9 +; CHECK-NEXT: vsetvli zero, zero, e64, m4, ta, ma +; CHECK-NEXT: vsext.vf2 v8, v12 +; CHECK-NEXT: ret + %vc = zext %va to + %vd = zext %vb to + %ve = sub %vc, %vd + ret %ve +} + +define @vwsub_vx_nxv4i64_nxv4i16( %va, i16 %b) { +; CHECK-LABEL: vwsub_vx_nxv4i64_nxv4i16: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a1, zero, e16, m1, ta, ma +; CHECK-NEXT: vmv.v.x v9, a0 +; CHECK-NEXT: vsetvli zero, zero, e64, m4, ta, ma +; CHECK-NEXT: vsext.vf4 v12, v8 +; CHECK-NEXT: vsext.vf4 v16, v9 +; CHECK-NEXT: vsub.vv v8, v12, v16 +; CHECK-NEXT: ret + %head = insertelement poison, i16 %b, i16 0 + %splat = shufflevector %head, poison, zeroinitializer + %vc = sext %va to + %vd = sext %splat to + %ve = sub %vc, %vd + ret %ve +} + +define @vwsubu_vx_nxv4i64_nxv4i16( %va, i16 %b) { +; CHECK-LABEL: vwsubu_vx_nxv4i64_nxv4i16: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a1, zero, e16, m1, ta, ma +; CHECK-NEXT: vwsubu.vx v12, v8, a0 +; CHECK-NEXT: vsetvli zero, zero, e64, m4, ta, ma +; CHECK-NEXT: vsext.vf2 v8, v12 +; CHECK-NEXT: ret + %head = insertelement poison, i16 %b, i16 0 + %splat = shufflevector %head, poison, zeroinitializer + %vc = zext %va to + %vd = zext %splat to + %ve = sub %vc, %vd + ret %ve +} + +define @vwsub_wv_nxv4i64_nxv4i16( %va, %vb) { +; CHECK-LABEL: vwsub_wv_nxv4i64_nxv4i16: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a0, zero, e64, m4, ta, ma +; CHECK-NEXT: vsext.vf4 v16, v12 +; CHECK-NEXT: vsub.vv v8, v8, v16 +; CHECK-NEXT: ret + %vc = sext %vb to + %vd = sub %va, %vc + ret %vd +} + +define @vwsubu_wv_nxv4i64_nxv4i16( %va, %vb) { +; CHECK-LABEL: vwsubu_wv_nxv4i64_nxv4i16: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a0, zero, e64, m4, ta, ma +; CHECK-NEXT: vzext.vf4 v16, v12 +; CHECK-NEXT: vsub.vv v8, v8, v16 +; CHECK-NEXT: ret + %vc = zext %vb to + %vd = sub %va, %vc + ret %vd +} + +define @vwsub_wx_nxv4i64_nxv4i16( %va, i16 %b) { +; CHECK-LABEL: vwsub_wx_nxv4i64_nxv4i16: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a1, zero, e16, m1, ta, ma +; CHECK-NEXT: vmv.v.x v12, a0 +; CHECK-NEXT: vsetvli zero, zero, e64, m4, ta, ma +; CHECK-NEXT: vsext.vf4 v16, v12 +; CHECK-NEXT: vsub.vv v8, v8, v16 +; CHECK-NEXT: ret + %head = insertelement poison, i16 %b, i16 0 + %splat = shufflevector %head, poison, zeroinitializer + %vb = sext %splat to + %vc = sub %va, %vb + ret %vc +} + +define @vwsubu_wx_nxv4i64_nxv4i16( %va, i16 %b) { +; CHECK-LABEL: vwsubu_wx_nxv4i64_nxv4i16: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a1, zero, e16, m1, ta, ma +; CHECK-NEXT: vmv.v.x v12, a0 +; CHECK-NEXT: vsetvli zero, zero, e64, m4, ta, ma +; CHECK-NEXT: vzext.vf4 v16, v12 +; CHECK-NEXT: vsub.vv v8, v8, v16 +; CHECK-NEXT: ret + %head = insertelement poison, i16 %b, i16 0 + %splat = shufflevector %head, poison, zeroinitializer + %vb = zext %splat to + %vc = sub %va, %vb + ret %vc +} + +define @vwsub_vv_nxv8i64_nxv8i16( %va, %vb) { +; CHECK-LABEL: vwsub_vv_nxv8i64_nxv8i16: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a0, zero, e64, m8, ta, ma +; CHECK-NEXT: vsext.vf4 v16, v8 +; CHECK-NEXT: vsext.vf4 v24, v10 +; CHECK-NEXT: vsub.vv v8, v16, v24 +; CHECK-NEXT: ret + %vc = sext %va to + %vd = sext %vb to + %ve = sub %vc, %vd + ret %ve +} + +define @vwsubu_vv_nxv8i64_nxv8i16( %va, %vb) { +; CHECK-LABEL: vwsubu_vv_nxv8i64_nxv8i16: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a0, zero, e16, m2, ta, ma +; CHECK-NEXT: vwsubu.vv v16, v8, v10 +; CHECK-NEXT: vsetvli zero, zero, e64, m8, ta, ma +; CHECK-NEXT: vsext.vf2 v8, v16 +; CHECK-NEXT: ret + %vc = zext %va to + %vd = zext %vb to + %ve = sub %vc, %vd + ret %ve +} + +define @vwsub_vx_nxv8i64_nxv8i16( %va, i16 %b) { +; CHECK-LABEL: vwsub_vx_nxv8i64_nxv8i16: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a1, zero, e16, m2, ta, ma +; CHECK-NEXT: vmv.v.x v10, a0 +; CHECK-NEXT: vsetvli zero, zero, e64, m8, ta, ma +; CHECK-NEXT: vsext.vf4 v16, v8 +; CHECK-NEXT: vsext.vf4 v24, v10 +; CHECK-NEXT: vsub.vv v8, v16, v24 +; CHECK-NEXT: ret + %head = insertelement poison, i16 %b, i16 0 + %splat = shufflevector %head, poison, zeroinitializer + %vc = sext %va to + %vd = sext %splat to + %ve = sub %vc, %vd + ret %ve +} + +define @vwsubu_vx_nxv8i64_nxv8i16( %va, i16 %b) { +; CHECK-LABEL: vwsubu_vx_nxv8i64_nxv8i16: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a1, zero, e16, m2, ta, ma +; CHECK-NEXT: vwsubu.vx v16, v8, a0 +; CHECK-NEXT: vsetvli zero, zero, e64, m8, ta, ma +; CHECK-NEXT: vsext.vf2 v8, v16 +; CHECK-NEXT: ret + %head = insertelement poison, i16 %b, i16 0 + %splat = shufflevector %head, poison, zeroinitializer + %vc = zext %va to + %vd = zext %splat to + %ve = sub %vc, %vd + ret %ve +} + +define @vwsub_wv_nxv8i64_nxv8i16( %va, %vb) { +; CHECK-LABEL: vwsub_wv_nxv8i64_nxv8i16: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a0, zero, e64, m8, ta, ma +; CHECK-NEXT: vsext.vf4 v24, v16 +; CHECK-NEXT: vsub.vv v8, v8, v24 +; CHECK-NEXT: ret + %vc = sext %vb to + %vd = sub %va, %vc + ret %vd +} + +define @vwsubu_wv_nxv8i64_nxv8i16( %va, %vb) { +; CHECK-LABEL: vwsubu_wv_nxv8i64_nxv8i16: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a0, zero, e64, m8, ta, ma +; CHECK-NEXT: vzext.vf4 v24, v16 +; CHECK-NEXT: vsub.vv v8, v8, v24 +; CHECK-NEXT: ret + %vc = zext %vb to + %vd = sub %va, %vc + ret %vd +} + +define @vwsub_wx_nxv8i64_nxv8i16( %va, i16 %b) { +; CHECK-LABEL: vwsub_wx_nxv8i64_nxv8i16: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a1, zero, e16, m2, ta, ma +; CHECK-NEXT: vmv.v.x v16, a0 +; CHECK-NEXT: vsetvli zero, zero, e64, m8, ta, ma +; CHECK-NEXT: vsext.vf4 v24, v16 +; CHECK-NEXT: vsub.vv v8, v8, v24 +; CHECK-NEXT: ret + %head = insertelement poison, i16 %b, i16 0 + %splat = shufflevector %head, poison, zeroinitializer + %vb = sext %splat to + %vc = sub %va, %vb + ret %vc +} + +define @vwsubu_wx_nxv8i64_nxv8i16( %va, i16 %b) { +; CHECK-LABEL: vwsubu_wx_nxv8i64_nxv8i16: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a1, zero, e16, m2, ta, ma +; CHECK-NEXT: vmv.v.x v16, a0 +; CHECK-NEXT: vsetvli zero, zero, e64, m8, ta, ma +; CHECK-NEXT: vzext.vf4 v24, v16 +; CHECK-NEXT: vsub.vv v8, v8, v24 +; CHECK-NEXT: ret + %head = insertelement poison, i16 %b, i16 0 + %splat = shufflevector %head, poison, zeroinitializer + %vb = zext %splat to + %vc = sub %va, %vb + ret %vc +} + +define @vwsub_vv_nxv1i64_nxv1i8( %va, %vb) { +; CHECK-LABEL: vwsub_vv_nxv1i64_nxv1i8: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a0, zero, e64, m1, ta, ma +; CHECK-NEXT: vsext.vf8 v10, v8 +; CHECK-NEXT: vsext.vf8 v8, v9 +; CHECK-NEXT: vsub.vv v8, v10, v8 +; CHECK-NEXT: ret + %vc = sext %va to + %vd = sext %vb to + %ve = sub %vc, %vd + ret %ve +} + +define @vwsubu_vv_nxv1i64_nxv1i8( %va, %vb) { +; CHECK-LABEL: vwsubu_vv_nxv1i64_nxv1i8: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a0, zero, e8, mf8, ta, ma +; CHECK-NEXT: vwsubu.vv v10, v8, v9 +; CHECK-NEXT: vsetvli zero, zero, e64, m1, ta, ma +; CHECK-NEXT: vsext.vf4 v8, v10 +; CHECK-NEXT: ret + %vc = zext %va to + %vd = zext %vb to + %ve = sub %vc, %vd + ret %ve +} + +define @vwsub_vx_nxv1i64_nxv1i8( %va, i8 %b) { +; CHECK-LABEL: vwsub_vx_nxv1i64_nxv1i8: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a1, zero, e8, mf8, ta, ma +; CHECK-NEXT: vmv.v.x v9, a0 +; CHECK-NEXT: vsetvli zero, zero, e64, m1, ta, ma +; CHECK-NEXT: vsext.vf8 v10, v8 +; CHECK-NEXT: vsext.vf8 v8, v9 +; CHECK-NEXT: vsub.vv v8, v10, v8 +; CHECK-NEXT: ret + %head = insertelement poison, i8 %b, i8 0 + %splat = shufflevector %head, poison, zeroinitializer + %vc = sext %va to + %vd = sext %splat to + %ve = sub %vc, %vd + ret %ve +} + +define @vwsubu_vx_nxv1i64_nxv1i8( %va, i8 %b) { +; CHECK-LABEL: vwsubu_vx_nxv1i64_nxv1i8: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a1, zero, e8, mf8, ta, ma +; CHECK-NEXT: vwsubu.vx v9, v8, a0 +; CHECK-NEXT: vsetvli zero, zero, e64, m1, ta, ma +; CHECK-NEXT: vsext.vf4 v8, v9 +; CHECK-NEXT: ret + %head = insertelement poison, i8 %b, i8 0 + %splat = shufflevector %head, poison, zeroinitializer + %vc = zext %va to + %vd = zext %splat to + %ve = sub %vc, %vd + ret %ve +} + +define @vwsub_wv_nxv1i64_nxv1i8( %va, %vb) { +; CHECK-LABEL: vwsub_wv_nxv1i64_nxv1i8: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a0, zero, e64, m1, ta, ma +; CHECK-NEXT: vsext.vf8 v10, v9 +; CHECK-NEXT: vsub.vv v8, v8, v10 +; CHECK-NEXT: ret + %vc = sext %vb to + %vd = sub %va, %vc + ret %vd +} + +define @vwsubu_wv_nxv1i64_nxv1i8( %va, %vb) { +; CHECK-LABEL: vwsubu_wv_nxv1i64_nxv1i8: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a0, zero, e64, m1, ta, ma +; CHECK-NEXT: vzext.vf8 v10, v9 +; CHECK-NEXT: vsub.vv v8, v8, v10 +; CHECK-NEXT: ret + %vc = zext %vb to + %vd = sub %va, %vc + ret %vd +} + +define @vwsub_wx_nxv1i64_nxv1i8( %va, i8 %b) { +; CHECK-LABEL: vwsub_wx_nxv1i64_nxv1i8: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a1, zero, e8, mf8, ta, ma +; CHECK-NEXT: vmv.v.x v9, a0 +; CHECK-NEXT: vsetvli zero, zero, e64, m1, ta, ma +; CHECK-NEXT: vsext.vf8 v10, v9 +; CHECK-NEXT: vsub.vv v8, v8, v10 +; CHECK-NEXT: ret + %head = insertelement poison, i8 %b, i8 0 + %splat = shufflevector %head, poison, zeroinitializer + %vb = sext %splat to + %vc = sub %va, %vb + ret %vc +} + +define @vwsubu_wx_nxv1i64_nxv1i8( %va, i8 %b) { +; CHECK-LABEL: vwsubu_wx_nxv1i64_nxv1i8: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a1, zero, e8, mf8, ta, ma +; CHECK-NEXT: vmv.v.x v9, a0 +; CHECK-NEXT: vsetvli zero, zero, e64, m1, ta, ma +; CHECK-NEXT: vzext.vf8 v10, v9 +; CHECK-NEXT: vsub.vv v8, v8, v10 +; CHECK-NEXT: ret + %head = insertelement poison, i8 %b, i8 0 + %splat = shufflevector %head, poison, zeroinitializer + %vb = zext %splat to + %vc = sub %va, %vb + ret %vc +} + +define @vwsub_vv_nxv2i64_nxv2i8( %va, %vb) { +; CHECK-LABEL: vwsub_vv_nxv2i64_nxv2i8: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a0, zero, e64, m2, ta, ma +; CHECK-NEXT: vsext.vf8 v10, v8 +; CHECK-NEXT: vsext.vf8 v12, v9 +; CHECK-NEXT: vsub.vv v8, v10, v12 +; CHECK-NEXT: ret + %vc = sext %va to + %vd = sext %vb to + %ve = sub %vc, %vd + ret %ve +} + +define @vwsubu_vv_nxv2i64_nxv2i8( %va, %vb) { +; CHECK-LABEL: vwsubu_vv_nxv2i64_nxv2i8: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a0, zero, e8, mf4, ta, ma +; CHECK-NEXT: vwsubu.vv v10, v8, v9 +; CHECK-NEXT: vsetvli zero, zero, e64, m2, ta, ma +; CHECK-NEXT: vsext.vf4 v8, v10 +; CHECK-NEXT: ret + %vc = zext %va to + %vd = zext %vb to + %ve = sub %vc, %vd + ret %ve +} + +define @vwsub_vx_nxv2i64_nxv2i8( %va, i8 %b) { +; CHECK-LABEL: vwsub_vx_nxv2i64_nxv2i8: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a1, zero, e8, mf4, ta, ma +; CHECK-NEXT: vmv.v.x v9, a0 +; CHECK-NEXT: vsetvli zero, zero, e64, m2, ta, ma +; CHECK-NEXT: vsext.vf8 v10, v8 +; CHECK-NEXT: vsext.vf8 v12, v9 +; CHECK-NEXT: vsub.vv v8, v10, v12 +; CHECK-NEXT: ret + %head = insertelement poison, i8 %b, i8 0 + %splat = shufflevector %head, poison, zeroinitializer + %vc = sext %va to + %vd = sext %splat to + %ve = sub %vc, %vd + ret %ve +} + +define @vwsubu_vx_nxv2i64_nxv2i8( %va, i8 %b) { +; CHECK-LABEL: vwsubu_vx_nxv2i64_nxv2i8: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a1, zero, e8, mf4, ta, ma +; CHECK-NEXT: vwsubu.vx v10, v8, a0 +; CHECK-NEXT: vsetvli zero, zero, e64, m2, ta, ma +; CHECK-NEXT: vsext.vf4 v8, v10 +; CHECK-NEXT: ret + %head = insertelement poison, i8 %b, i8 0 + %splat = shufflevector %head, poison, zeroinitializer + %vc = zext %va to + %vd = zext %splat to + %ve = sub %vc, %vd + ret %ve +} + +define @vwsub_wv_nxv2i64_nxv2i8( %va, %vb) { +; CHECK-LABEL: vwsub_wv_nxv2i64_nxv2i8: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a0, zero, e64, m2, ta, ma +; CHECK-NEXT: vsext.vf8 v12, v10 +; CHECK-NEXT: vsub.vv v8, v8, v12 +; CHECK-NEXT: ret + %vc = sext %vb to + %vd = sub %va, %vc + ret %vd +} + +define @vwsubu_wv_nxv2i64_nxv2i8( %va, %vb) { +; CHECK-LABEL: vwsubu_wv_nxv2i64_nxv2i8: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a0, zero, e64, m2, ta, ma +; CHECK-NEXT: vzext.vf8 v12, v10 +; CHECK-NEXT: vsub.vv v8, v8, v12 +; CHECK-NEXT: ret + %vc = zext %vb to + %vd = sub %va, %vc + ret %vd +} + +define @vwsub_wx_nxv2i64_nxv2i8( %va, i8 %b) { +; CHECK-LABEL: vwsub_wx_nxv2i64_nxv2i8: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a1, zero, e8, mf4, ta, ma +; CHECK-NEXT: vmv.v.x v10, a0 +; CHECK-NEXT: vsetvli zero, zero, e64, m2, ta, ma +; CHECK-NEXT: vsext.vf8 v12, v10 +; CHECK-NEXT: vsub.vv v8, v8, v12 +; CHECK-NEXT: ret + %head = insertelement poison, i8 %b, i8 0 + %splat = shufflevector %head, poison, zeroinitializer + %vb = sext %splat to + %vc = sub %va, %vb + ret %vc +} + +define @vwsubu_wx_nxv2i64_nxv2i8( %va, i8 %b) { +; CHECK-LABEL: vwsubu_wx_nxv2i64_nxv2i8: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a1, zero, e8, mf4, ta, ma +; CHECK-NEXT: vmv.v.x v10, a0 +; CHECK-NEXT: vsetvli zero, zero, e64, m2, ta, ma +; CHECK-NEXT: vzext.vf8 v12, v10 +; CHECK-NEXT: vsub.vv v8, v8, v12 +; CHECK-NEXT: ret + %head = insertelement poison, i8 %b, i8 0 + %splat = shufflevector %head, poison, zeroinitializer + %vb = zext %splat to + %vc = sub %va, %vb + ret %vc +} + +define @vwsub_vv_nxv4i64_nxv4i8( %va, %vb) { +; CHECK-LABEL: vwsub_vv_nxv4i64_nxv4i8: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a0, zero, e64, m4, ta, ma +; CHECK-NEXT: vsext.vf8 v12, v8 +; CHECK-NEXT: vsext.vf8 v16, v9 +; CHECK-NEXT: vsub.vv v8, v12, v16 +; CHECK-NEXT: ret + %vc = sext %va to + %vd = sext %vb to + %ve = sub %vc, %vd + ret %ve +} + +define @vwsubu_vv_nxv4i64_nxv4i8( %va, %vb) { +; CHECK-LABEL: vwsubu_vv_nxv4i64_nxv4i8: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a0, zero, e8, mf2, ta, ma +; CHECK-NEXT: vwsubu.vv v12, v8, v9 +; CHECK-NEXT: vsetvli zero, zero, e64, m4, ta, ma +; CHECK-NEXT: vsext.vf4 v8, v12 +; CHECK-NEXT: ret + %vc = zext %va to + %vd = zext %vb to + %ve = sub %vc, %vd + ret %ve +} + +define @vwsub_vx_nxv4i64_nxv4i8( %va, i8 %b) { +; CHECK-LABEL: vwsub_vx_nxv4i64_nxv4i8: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a1, zero, e8, mf2, ta, ma +; CHECK-NEXT: vmv.v.x v9, a0 +; CHECK-NEXT: vsetvli zero, zero, e64, m4, ta, ma +; CHECK-NEXT: vsext.vf8 v12, v8 +; CHECK-NEXT: vsext.vf8 v16, v9 +; CHECK-NEXT: vsub.vv v8, v12, v16 +; CHECK-NEXT: ret + %head = insertelement poison, i8 %b, i8 0 + %splat = shufflevector %head, poison, zeroinitializer + %vc = sext %va to + %vd = sext %splat to + %ve = sub %vc, %vd + ret %ve +} + +define @vwsubu_vx_nxv4i64_nxv4i8( %va, i8 %b) { +; CHECK-LABEL: vwsubu_vx_nxv4i64_nxv4i8: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a1, zero, e8, mf2, ta, ma +; CHECK-NEXT: vwsubu.vx v12, v8, a0 +; CHECK-NEXT: vsetvli zero, zero, e64, m4, ta, ma +; CHECK-NEXT: vsext.vf4 v8, v12 +; CHECK-NEXT: ret + %head = insertelement poison, i8 %b, i8 0 + %splat = shufflevector %head, poison, zeroinitializer + %vc = zext %va to + %vd = zext %splat to + %ve = sub %vc, %vd + ret %ve +} + +define @vwsub_wv_nxv4i64_nxv4i8( %va, %vb) { +; CHECK-LABEL: vwsub_wv_nxv4i64_nxv4i8: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a0, zero, e64, m4, ta, ma +; CHECK-NEXT: vsext.vf8 v16, v12 +; CHECK-NEXT: vsub.vv v8, v8, v16 +; CHECK-NEXT: ret + %vc = sext %vb to + %vd = sub %va, %vc + ret %vd +} + +define @vwsubu_wv_nxv4i64_nxv4i8( %va, %vb) { +; CHECK-LABEL: vwsubu_wv_nxv4i64_nxv4i8: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a0, zero, e64, m4, ta, ma +; CHECK-NEXT: vzext.vf8 v16, v12 +; CHECK-NEXT: vsub.vv v8, v8, v16 +; CHECK-NEXT: ret + %vc = zext %vb to + %vd = sub %va, %vc + ret %vd +} + +define @vwsub_wx_nxv4i64_nxv4i8( %va, i8 %b) { +; CHECK-LABEL: vwsub_wx_nxv4i64_nxv4i8: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a1, zero, e8, mf2, ta, ma +; CHECK-NEXT: vmv.v.x v12, a0 +; CHECK-NEXT: vsetvli zero, zero, e64, m4, ta, ma +; CHECK-NEXT: vsext.vf8 v16, v12 +; CHECK-NEXT: vsub.vv v8, v8, v16 +; CHECK-NEXT: ret + %head = insertelement poison, i8 %b, i8 0 + %splat = shufflevector %head, poison, zeroinitializer + %vb = sext %splat to + %vc = sub %va, %vb + ret %vc +} + +define @vwsubu_wx_nxv4i64_nxv4i8( %va, i8 %b) { +; CHECK-LABEL: vwsubu_wx_nxv4i64_nxv4i8: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a1, zero, e8, mf2, ta, ma +; CHECK-NEXT: vmv.v.x v12, a0 +; CHECK-NEXT: vsetvli zero, zero, e64, m4, ta, ma +; CHECK-NEXT: vzext.vf8 v16, v12 +; CHECK-NEXT: vsub.vv v8, v8, v16 +; CHECK-NEXT: ret + %head = insertelement poison, i8 %b, i8 0 + %splat = shufflevector %head, poison, zeroinitializer + %vb = zext %splat to + %vc = sub %va, %vb + ret %vc +} + +define @vwsub_vv_nxv8i64_nxv8i8( %va, %vb) { +; CHECK-LABEL: vwsub_vv_nxv8i64_nxv8i8: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a0, zero, e64, m8, ta, ma +; CHECK-NEXT: vsext.vf8 v16, v8 +; CHECK-NEXT: vsext.vf8 v24, v9 +; CHECK-NEXT: vsub.vv v8, v16, v24 +; CHECK-NEXT: ret + %vc = sext %va to + %vd = sext %vb to + %ve = sub %vc, %vd + ret %ve +} + +define @vwsubu_vv_nxv8i64_nxv8i8( %va, %vb) { +; CHECK-LABEL: vwsubu_vv_nxv8i64_nxv8i8: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a0, zero, e8, m1, ta, ma +; CHECK-NEXT: vwsubu.vv v16, v8, v9 +; CHECK-NEXT: vsetvli zero, zero, e64, m8, ta, ma +; CHECK-NEXT: vsext.vf4 v8, v16 +; CHECK-NEXT: ret + %vc = zext %va to + %vd = zext %vb to + %ve = sub %vc, %vd + ret %ve +} + +define @vwsub_vx_nxv8i64_nxv8i8( %va, i8 %b) { +; CHECK-LABEL: vwsub_vx_nxv8i64_nxv8i8: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a1, zero, e8, m1, ta, ma +; CHECK-NEXT: vmv.v.x v9, a0 +; CHECK-NEXT: vsetvli zero, zero, e64, m8, ta, ma +; CHECK-NEXT: vsext.vf8 v16, v8 +; CHECK-NEXT: vsext.vf8 v24, v9 +; CHECK-NEXT: vsub.vv v8, v16, v24 +; CHECK-NEXT: ret + %head = insertelement poison, i8 %b, i8 0 + %splat = shufflevector %head, poison, zeroinitializer + %vc = sext %va to + %vd = sext %splat to + %ve = sub %vc, %vd + ret %ve +} + +define @vwsubu_vx_nxv8i64_nxv8i8( %va, i8 %b) { +; CHECK-LABEL: vwsubu_vx_nxv8i64_nxv8i8: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a1, zero, e8, m1, ta, ma +; CHECK-NEXT: vwsubu.vx v16, v8, a0 +; CHECK-NEXT: vsetvli zero, zero, e64, m8, ta, ma +; CHECK-NEXT: vsext.vf4 v8, v16 +; CHECK-NEXT: ret + %head = insertelement poison, i8 %b, i8 0 + %splat = shufflevector %head, poison, zeroinitializer + %vc = zext %va to + %vd = zext %splat to + %ve = sub %vc, %vd + ret %ve +} + +define @vwsub_wv_nxv8i64_nxv8i8( %va, %vb) { +; CHECK-LABEL: vwsub_wv_nxv8i64_nxv8i8: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a0, zero, e64, m8, ta, ma +; CHECK-NEXT: vsext.vf8 v24, v16 +; CHECK-NEXT: vsub.vv v8, v8, v24 +; CHECK-NEXT: ret + %vc = sext %vb to + %vd = sub %va, %vc + ret %vd +} + +define @vwsubu_wv_nxv8i64_nxv8i8( %va, %vb) { +; CHECK-LABEL: vwsubu_wv_nxv8i64_nxv8i8: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a0, zero, e64, m8, ta, ma +; CHECK-NEXT: vzext.vf8 v24, v16 +; CHECK-NEXT: vsub.vv v8, v8, v24 +; CHECK-NEXT: ret + %vc = zext %vb to + %vd = sub %va, %vc + ret %vd +} + +define @vwsub_wx_nxv8i64_nxv8i8( %va, i8 %b) { +; CHECK-LABEL: vwsub_wx_nxv8i64_nxv8i8: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a1, zero, e8, m1, ta, ma +; CHECK-NEXT: vmv.v.x v16, a0 +; CHECK-NEXT: vsetvli zero, zero, e64, m8, ta, ma +; CHECK-NEXT: vsext.vf8 v24, v16 +; CHECK-NEXT: vsub.vv v8, v8, v24 +; CHECK-NEXT: ret + %head = insertelement poison, i8 %b, i8 0 + %splat = shufflevector %head, poison, zeroinitializer + %vb = sext %splat to + %vc = sub %va, %vb + ret %vc +} + +define @vwsubu_wx_nxv8i64_nxv8i8( %va, i8 %b) { +; CHECK-LABEL: vwsubu_wx_nxv8i64_nxv8i8: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a1, zero, e8, m1, ta, ma +; CHECK-NEXT: vmv.v.x v16, a0 +; CHECK-NEXT: vsetvli zero, zero, e64, m8, ta, ma +; CHECK-NEXT: vzext.vf8 v24, v16 +; CHECK-NEXT: vsub.vv v8, v8, v24 +; CHECK-NEXT: ret + %head = insertelement poison, i8 %b, i8 0 + %splat = shufflevector %head, poison, zeroinitializer + %vb = zext %splat to + %vc = sub %va, %vb + ret %vc +}