649 lines
22 KiB
LLVM
649 lines
22 KiB
LLVM
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 2
|
|
; RUN: llc -mtriple=riscv64 -mattr=+zihintntl,+f,+d,+zfh,+v < %s | FileCheck %s -check-prefix=CHECK-RV64V
|
|
; RUN: llc -mtriple=riscv32 -mattr=+zihintntl,+f,+d,+zfh,+v < %s | FileCheck %s -check-prefix=CHECK-RV32V
|
|
|
|
define <vscale x 2 x i64> @test_nontemporal_load_nxv2i64(ptr %p) {
|
|
; CHECK-RV64V-LABEL: test_nontemporal_load_nxv2i64:
|
|
; CHECK-RV64V: # %bb.0:
|
|
; CHECK-RV64V-NEXT: ntl.all
|
|
; CHECK-RV64V-NEXT: vl2re64.v v8, (a0)
|
|
; CHECK-RV64V-NEXT: ret
|
|
;
|
|
; CHECK-RV32V-LABEL: test_nontemporal_load_nxv2i64:
|
|
; CHECK-RV32V: # %bb.0:
|
|
; CHECK-RV32V-NEXT: ntl.all
|
|
; CHECK-RV32V-NEXT: vl2re64.v v8, (a0)
|
|
; CHECK-RV32V-NEXT: ret
|
|
%1 = load <vscale x 2 x i64>, ptr %p, !nontemporal !0
|
|
ret <vscale x 2 x i64> %1
|
|
}
|
|
|
|
define <vscale x 4 x i32> @test_nontemporal_load_nxv4i32(ptr %p) {
|
|
; CHECK-RV64V-LABEL: test_nontemporal_load_nxv4i32:
|
|
; CHECK-RV64V: # %bb.0:
|
|
; CHECK-RV64V-NEXT: ntl.all
|
|
; CHECK-RV64V-NEXT: vl2re32.v v8, (a0)
|
|
; CHECK-RV64V-NEXT: ret
|
|
;
|
|
; CHECK-RV32V-LABEL: test_nontemporal_load_nxv4i32:
|
|
; CHECK-RV32V: # %bb.0:
|
|
; CHECK-RV32V-NEXT: ntl.all
|
|
; CHECK-RV32V-NEXT: vl2re32.v v8, (a0)
|
|
; CHECK-RV32V-NEXT: ret
|
|
%1 = load <vscale x 4 x i32>, ptr %p, !nontemporal !0
|
|
ret <vscale x 4 x i32> %1
|
|
}
|
|
|
|
define <vscale x 8 x i16> @test_nontemporal_load_nxv8i16(ptr %p) {
|
|
; CHECK-RV64V-LABEL: test_nontemporal_load_nxv8i16:
|
|
; CHECK-RV64V: # %bb.0:
|
|
; CHECK-RV64V-NEXT: ntl.all
|
|
; CHECK-RV64V-NEXT: vl2re16.v v8, (a0)
|
|
; CHECK-RV64V-NEXT: ret
|
|
;
|
|
; CHECK-RV32V-LABEL: test_nontemporal_load_nxv8i16:
|
|
; CHECK-RV32V: # %bb.0:
|
|
; CHECK-RV32V-NEXT: ntl.all
|
|
; CHECK-RV32V-NEXT: vl2re16.v v8, (a0)
|
|
; CHECK-RV32V-NEXT: ret
|
|
%1 = load <vscale x 8 x i16>, ptr %p, !nontemporal !0
|
|
ret <vscale x 8 x i16> %1
|
|
}
|
|
|
|
define <vscale x 16 x i8> @test_nontemporal_load_nxv16i8(ptr %p) {
|
|
; CHECK-RV64V-LABEL: test_nontemporal_load_nxv16i8:
|
|
; CHECK-RV64V: # %bb.0:
|
|
; CHECK-RV64V-NEXT: ntl.all
|
|
; CHECK-RV64V-NEXT: vl2r.v v8, (a0)
|
|
; CHECK-RV64V-NEXT: ret
|
|
;
|
|
; CHECK-RV32V-LABEL: test_nontemporal_load_nxv16i8:
|
|
; CHECK-RV32V: # %bb.0:
|
|
; CHECK-RV32V-NEXT: ntl.all
|
|
; CHECK-RV32V-NEXT: vl2r.v v8, (a0)
|
|
; CHECK-RV32V-NEXT: ret
|
|
%1 = load <vscale x 16 x i8>, ptr %p, !nontemporal !0
|
|
ret <vscale x 16 x i8> %1
|
|
}
|
|
|
|
define void @test_nontemporal_store_nxv2i64(ptr %p, <vscale x 2 x i64> %v) {
|
|
; CHECK-RV64V-LABEL: test_nontemporal_store_nxv2i64:
|
|
; CHECK-RV64V: # %bb.0:
|
|
; CHECK-RV64V-NEXT: ntl.all
|
|
; CHECK-RV64V-NEXT: vs2r.v v8, (a0)
|
|
; CHECK-RV64V-NEXT: ret
|
|
;
|
|
; CHECK-RV32V-LABEL: test_nontemporal_store_nxv2i64:
|
|
; CHECK-RV32V: # %bb.0:
|
|
; CHECK-RV32V-NEXT: ntl.all
|
|
; CHECK-RV32V-NEXT: vs2r.v v8, (a0)
|
|
; CHECK-RV32V-NEXT: ret
|
|
store <vscale x 2 x i64> %v, ptr %p, !nontemporal !0
|
|
ret void
|
|
}
|
|
|
|
define void @test_nontemporal_store_nxv4i32(ptr %p, <vscale x 4 x i32> %v) {
|
|
; CHECK-RV64V-LABEL: test_nontemporal_store_nxv4i32:
|
|
; CHECK-RV64V: # %bb.0:
|
|
; CHECK-RV64V-NEXT: ntl.all
|
|
; CHECK-RV64V-NEXT: vs2r.v v8, (a0)
|
|
; CHECK-RV64V-NEXT: ret
|
|
;
|
|
; CHECK-RV32V-LABEL: test_nontemporal_store_nxv4i32:
|
|
; CHECK-RV32V: # %bb.0:
|
|
; CHECK-RV32V-NEXT: ntl.all
|
|
; CHECK-RV32V-NEXT: vs2r.v v8, (a0)
|
|
; CHECK-RV32V-NEXT: ret
|
|
store <vscale x 4 x i32> %v, ptr %p, !nontemporal !0
|
|
ret void
|
|
}
|
|
|
|
define void @test_nontemporal_store_nxv8i16(ptr %p, <vscale x 8 x i16> %v) {
|
|
; CHECK-RV64V-LABEL: test_nontemporal_store_nxv8i16:
|
|
; CHECK-RV64V: # %bb.0:
|
|
; CHECK-RV64V-NEXT: ntl.all
|
|
; CHECK-RV64V-NEXT: vs2r.v v8, (a0)
|
|
; CHECK-RV64V-NEXT: ret
|
|
;
|
|
; CHECK-RV32V-LABEL: test_nontemporal_store_nxv8i16:
|
|
; CHECK-RV32V: # %bb.0:
|
|
; CHECK-RV32V-NEXT: ntl.all
|
|
; CHECK-RV32V-NEXT: vs2r.v v8, (a0)
|
|
; CHECK-RV32V-NEXT: ret
|
|
store <vscale x 8 x i16> %v, ptr %p, !nontemporal !0
|
|
ret void
|
|
}
|
|
|
|
define void @test_nontemporal_store_nxv16i8(ptr %p, <vscale x 16 x i8> %v) {
|
|
; CHECK-RV64V-LABEL: test_nontemporal_store_nxv16i8:
|
|
; CHECK-RV64V: # %bb.0:
|
|
; CHECK-RV64V-NEXT: ntl.all
|
|
; CHECK-RV64V-NEXT: vs2r.v v8, (a0)
|
|
; CHECK-RV64V-NEXT: ret
|
|
;
|
|
; CHECK-RV32V-LABEL: test_nontemporal_store_nxv16i8:
|
|
; CHECK-RV32V: # %bb.0:
|
|
; CHECK-RV32V-NEXT: ntl.all
|
|
; CHECK-RV32V-NEXT: vs2r.v v8, (a0)
|
|
; CHECK-RV32V-NEXT: ret
|
|
store <vscale x 16 x i8> %v, ptr %p, !nontemporal !0
|
|
ret void
|
|
}
|
|
|
|
define <vscale x 2 x i64> @test_nontemporal_P1_load_nxv2i64(ptr %p) {
|
|
; CHECK-RV64V-LABEL: test_nontemporal_P1_load_nxv2i64:
|
|
; CHECK-RV64V: # %bb.0:
|
|
; CHECK-RV64V-NEXT: ntl.p1
|
|
; CHECK-RV64V-NEXT: vl2re64.v v8, (a0)
|
|
; CHECK-RV64V-NEXT: ret
|
|
;
|
|
; CHECK-RV32V-LABEL: test_nontemporal_P1_load_nxv2i64:
|
|
; CHECK-RV32V: # %bb.0:
|
|
; CHECK-RV32V-NEXT: ntl.p1
|
|
; CHECK-RV32V-NEXT: vl2re64.v v8, (a0)
|
|
; CHECK-RV32V-NEXT: ret
|
|
%1 = load <vscale x 2 x i64>, ptr %p, !nontemporal !0, !riscv-nontemporal-domain !1
|
|
ret <vscale x 2 x i64> %1
|
|
}
|
|
|
|
define <vscale x 4 x i32> @test_nontemporal_P1_load_nxv4i32(ptr %p) {
|
|
; CHECK-RV64V-LABEL: test_nontemporal_P1_load_nxv4i32:
|
|
; CHECK-RV64V: # %bb.0:
|
|
; CHECK-RV64V-NEXT: ntl.p1
|
|
; CHECK-RV64V-NEXT: vl2re32.v v8, (a0)
|
|
; CHECK-RV64V-NEXT: ret
|
|
;
|
|
; CHECK-RV32V-LABEL: test_nontemporal_P1_load_nxv4i32:
|
|
; CHECK-RV32V: # %bb.0:
|
|
; CHECK-RV32V-NEXT: ntl.p1
|
|
; CHECK-RV32V-NEXT: vl2re32.v v8, (a0)
|
|
; CHECK-RV32V-NEXT: ret
|
|
%1 = load <vscale x 4 x i32>, ptr %p, !nontemporal !0, !riscv-nontemporal-domain !1
|
|
ret <vscale x 4 x i32> %1
|
|
}
|
|
|
|
define <vscale x 8 x i16> @test_nontemporal_P1_load_nxv8i16(ptr %p) {
|
|
; CHECK-RV64V-LABEL: test_nontemporal_P1_load_nxv8i16:
|
|
; CHECK-RV64V: # %bb.0:
|
|
; CHECK-RV64V-NEXT: ntl.p1
|
|
; CHECK-RV64V-NEXT: vl2re16.v v8, (a0)
|
|
; CHECK-RV64V-NEXT: ret
|
|
;
|
|
; CHECK-RV32V-LABEL: test_nontemporal_P1_load_nxv8i16:
|
|
; CHECK-RV32V: # %bb.0:
|
|
; CHECK-RV32V-NEXT: ntl.p1
|
|
; CHECK-RV32V-NEXT: vl2re16.v v8, (a0)
|
|
; CHECK-RV32V-NEXT: ret
|
|
%1 = load <vscale x 8 x i16>, ptr %p, !nontemporal !0, !riscv-nontemporal-domain !1
|
|
ret <vscale x 8 x i16> %1
|
|
}
|
|
|
|
define <vscale x 16 x i8> @test_nontemporal_P1_load_nxv16i8(ptr %p) {
|
|
; CHECK-RV64V-LABEL: test_nontemporal_P1_load_nxv16i8:
|
|
; CHECK-RV64V: # %bb.0:
|
|
; CHECK-RV64V-NEXT: ntl.p1
|
|
; CHECK-RV64V-NEXT: vl2r.v v8, (a0)
|
|
; CHECK-RV64V-NEXT: ret
|
|
;
|
|
; CHECK-RV32V-LABEL: test_nontemporal_P1_load_nxv16i8:
|
|
; CHECK-RV32V: # %bb.0:
|
|
; CHECK-RV32V-NEXT: ntl.p1
|
|
; CHECK-RV32V-NEXT: vl2r.v v8, (a0)
|
|
; CHECK-RV32V-NEXT: ret
|
|
%1 = load <vscale x 16 x i8>, ptr %p, !nontemporal !0, !riscv-nontemporal-domain !1
|
|
ret <vscale x 16 x i8> %1
|
|
}
|
|
|
|
define void @test_nontemporal_P1_store_nxv2i64(ptr %p, <vscale x 2 x i64> %v) {
|
|
; CHECK-RV64V-LABEL: test_nontemporal_P1_store_nxv2i64:
|
|
; CHECK-RV64V: # %bb.0:
|
|
; CHECK-RV64V-NEXT: ntl.p1
|
|
; CHECK-RV64V-NEXT: vs2r.v v8, (a0)
|
|
; CHECK-RV64V-NEXT: ret
|
|
;
|
|
; CHECK-RV32V-LABEL: test_nontemporal_P1_store_nxv2i64:
|
|
; CHECK-RV32V: # %bb.0:
|
|
; CHECK-RV32V-NEXT: ntl.p1
|
|
; CHECK-RV32V-NEXT: vs2r.v v8, (a0)
|
|
; CHECK-RV32V-NEXT: ret
|
|
store <vscale x 2 x i64> %v, ptr %p, !nontemporal !0, !riscv-nontemporal-domain !1
|
|
ret void
|
|
}
|
|
|
|
define void @test_nontemporal_P1_store_nxv4i32(ptr %p, <vscale x 4 x i32> %v) {
|
|
; CHECK-RV64V-LABEL: test_nontemporal_P1_store_nxv4i32:
|
|
; CHECK-RV64V: # %bb.0:
|
|
; CHECK-RV64V-NEXT: ntl.p1
|
|
; CHECK-RV64V-NEXT: vs2r.v v8, (a0)
|
|
; CHECK-RV64V-NEXT: ret
|
|
;
|
|
; CHECK-RV32V-LABEL: test_nontemporal_P1_store_nxv4i32:
|
|
; CHECK-RV32V: # %bb.0:
|
|
; CHECK-RV32V-NEXT: ntl.p1
|
|
; CHECK-RV32V-NEXT: vs2r.v v8, (a0)
|
|
; CHECK-RV32V-NEXT: ret
|
|
store <vscale x 4 x i32> %v, ptr %p, !nontemporal !0, !riscv-nontemporal-domain !1
|
|
ret void
|
|
}
|
|
|
|
define void @test_nontemporal_P1_store_nxv8i16(ptr %p, <vscale x 8 x i16> %v) {
|
|
; CHECK-RV64V-LABEL: test_nontemporal_P1_store_nxv8i16:
|
|
; CHECK-RV64V: # %bb.0:
|
|
; CHECK-RV64V-NEXT: ntl.p1
|
|
; CHECK-RV64V-NEXT: vs2r.v v8, (a0)
|
|
; CHECK-RV64V-NEXT: ret
|
|
;
|
|
; CHECK-RV32V-LABEL: test_nontemporal_P1_store_nxv8i16:
|
|
; CHECK-RV32V: # %bb.0:
|
|
; CHECK-RV32V-NEXT: ntl.p1
|
|
; CHECK-RV32V-NEXT: vs2r.v v8, (a0)
|
|
; CHECK-RV32V-NEXT: ret
|
|
store <vscale x 8 x i16> %v, ptr %p, !nontemporal !0, !riscv-nontemporal-domain !1
|
|
ret void
|
|
}
|
|
|
|
define void @test_nontemporal_P1_store_nxv16i8(ptr %p, <vscale x 16 x i8> %v) {
|
|
; CHECK-RV64V-LABEL: test_nontemporal_P1_store_nxv16i8:
|
|
; CHECK-RV64V: # %bb.0:
|
|
; CHECK-RV64V-NEXT: ntl.p1
|
|
; CHECK-RV64V-NEXT: vs2r.v v8, (a0)
|
|
; CHECK-RV64V-NEXT: ret
|
|
;
|
|
; CHECK-RV32V-LABEL: test_nontemporal_P1_store_nxv16i8:
|
|
; CHECK-RV32V: # %bb.0:
|
|
; CHECK-RV32V-NEXT: ntl.p1
|
|
; CHECK-RV32V-NEXT: vs2r.v v8, (a0)
|
|
; CHECK-RV32V-NEXT: ret
|
|
store <vscale x 16 x i8> %v, ptr %p, !nontemporal !0, !riscv-nontemporal-domain !1
|
|
ret void
|
|
}
|
|
|
|
define <vscale x 2 x i64> @test_nontemporal_PALL_load_nxv2i64(ptr %p) {
|
|
; CHECK-RV64V-LABEL: test_nontemporal_PALL_load_nxv2i64:
|
|
; CHECK-RV64V: # %bb.0:
|
|
; CHECK-RV64V-NEXT: ntl.pall
|
|
; CHECK-RV64V-NEXT: vl2re64.v v8, (a0)
|
|
; CHECK-RV64V-NEXT: ret
|
|
;
|
|
; CHECK-RV32V-LABEL: test_nontemporal_PALL_load_nxv2i64:
|
|
; CHECK-RV32V: # %bb.0:
|
|
; CHECK-RV32V-NEXT: ntl.pall
|
|
; CHECK-RV32V-NEXT: vl2re64.v v8, (a0)
|
|
; CHECK-RV32V-NEXT: ret
|
|
%1 = load <vscale x 2 x i64>, ptr %p, !nontemporal !0, !riscv-nontemporal-domain !2
|
|
ret <vscale x 2 x i64> %1
|
|
}
|
|
|
|
define <vscale x 4 x i32> @test_nontemporal_PALL_load_nxv4i32(ptr %p) {
|
|
; CHECK-RV64V-LABEL: test_nontemporal_PALL_load_nxv4i32:
|
|
; CHECK-RV64V: # %bb.0:
|
|
; CHECK-RV64V-NEXT: ntl.pall
|
|
; CHECK-RV64V-NEXT: vl2re32.v v8, (a0)
|
|
; CHECK-RV64V-NEXT: ret
|
|
;
|
|
; CHECK-RV32V-LABEL: test_nontemporal_PALL_load_nxv4i32:
|
|
; CHECK-RV32V: # %bb.0:
|
|
; CHECK-RV32V-NEXT: ntl.pall
|
|
; CHECK-RV32V-NEXT: vl2re32.v v8, (a0)
|
|
; CHECK-RV32V-NEXT: ret
|
|
%1 = load <vscale x 4 x i32>, ptr %p, !nontemporal !0, !riscv-nontemporal-domain !2
|
|
ret <vscale x 4 x i32> %1
|
|
}
|
|
|
|
define <vscale x 8 x i16> @test_nontemporal_PALL_load_nxv8i16(ptr %p) {
|
|
; CHECK-RV64V-LABEL: test_nontemporal_PALL_load_nxv8i16:
|
|
; CHECK-RV64V: # %bb.0:
|
|
; CHECK-RV64V-NEXT: ntl.pall
|
|
; CHECK-RV64V-NEXT: vl2re16.v v8, (a0)
|
|
; CHECK-RV64V-NEXT: ret
|
|
;
|
|
; CHECK-RV32V-LABEL: test_nontemporal_PALL_load_nxv8i16:
|
|
; CHECK-RV32V: # %bb.0:
|
|
; CHECK-RV32V-NEXT: ntl.pall
|
|
; CHECK-RV32V-NEXT: vl2re16.v v8, (a0)
|
|
; CHECK-RV32V-NEXT: ret
|
|
%1 = load <vscale x 8 x i16>, ptr %p, !nontemporal !0, !riscv-nontemporal-domain !2
|
|
ret <vscale x 8 x i16> %1
|
|
}
|
|
|
|
define <vscale x 16 x i8> @test_nontemporal_PALL_load_nxv16i8(ptr %p) {
|
|
; CHECK-RV64V-LABEL: test_nontemporal_PALL_load_nxv16i8:
|
|
; CHECK-RV64V: # %bb.0:
|
|
; CHECK-RV64V-NEXT: ntl.pall
|
|
; CHECK-RV64V-NEXT: vl2r.v v8, (a0)
|
|
; CHECK-RV64V-NEXT: ret
|
|
;
|
|
; CHECK-RV32V-LABEL: test_nontemporal_PALL_load_nxv16i8:
|
|
; CHECK-RV32V: # %bb.0:
|
|
; CHECK-RV32V-NEXT: ntl.pall
|
|
; CHECK-RV32V-NEXT: vl2r.v v8, (a0)
|
|
; CHECK-RV32V-NEXT: ret
|
|
%1 = load <vscale x 16 x i8>, ptr %p, !nontemporal !0, !riscv-nontemporal-domain !2
|
|
ret <vscale x 16 x i8> %1
|
|
}
|
|
|
|
define void @test_nontemporal_PALL_store_nxv2i64(ptr %p, <vscale x 2 x i64> %v) {
|
|
; CHECK-RV64V-LABEL: test_nontemporal_PALL_store_nxv2i64:
|
|
; CHECK-RV64V: # %bb.0:
|
|
; CHECK-RV64V-NEXT: ntl.pall
|
|
; CHECK-RV64V-NEXT: vs2r.v v8, (a0)
|
|
; CHECK-RV64V-NEXT: ret
|
|
;
|
|
; CHECK-RV32V-LABEL: test_nontemporal_PALL_store_nxv2i64:
|
|
; CHECK-RV32V: # %bb.0:
|
|
; CHECK-RV32V-NEXT: ntl.pall
|
|
; CHECK-RV32V-NEXT: vs2r.v v8, (a0)
|
|
; CHECK-RV32V-NEXT: ret
|
|
store <vscale x 2 x i64> %v, ptr %p, !nontemporal !0, !riscv-nontemporal-domain !2
|
|
ret void
|
|
}
|
|
|
|
define void @test_nontemporal_PALL_store_nxv4i32(ptr %p, <vscale x 4 x i32> %v) {
|
|
; CHECK-RV64V-LABEL: test_nontemporal_PALL_store_nxv4i32:
|
|
; CHECK-RV64V: # %bb.0:
|
|
; CHECK-RV64V-NEXT: ntl.pall
|
|
; CHECK-RV64V-NEXT: vs2r.v v8, (a0)
|
|
; CHECK-RV64V-NEXT: ret
|
|
;
|
|
; CHECK-RV32V-LABEL: test_nontemporal_PALL_store_nxv4i32:
|
|
; CHECK-RV32V: # %bb.0:
|
|
; CHECK-RV32V-NEXT: ntl.pall
|
|
; CHECK-RV32V-NEXT: vs2r.v v8, (a0)
|
|
; CHECK-RV32V-NEXT: ret
|
|
store <vscale x 4 x i32> %v, ptr %p, !nontemporal !0, !riscv-nontemporal-domain !2
|
|
ret void
|
|
}
|
|
|
|
define void @test_nontemporal_PALL_store_nxv8i16(ptr %p, <vscale x 8 x i16> %v) {
|
|
; CHECK-RV64V-LABEL: test_nontemporal_PALL_store_nxv8i16:
|
|
; CHECK-RV64V: # %bb.0:
|
|
; CHECK-RV64V-NEXT: ntl.pall
|
|
; CHECK-RV64V-NEXT: vs2r.v v8, (a0)
|
|
; CHECK-RV64V-NEXT: ret
|
|
;
|
|
; CHECK-RV32V-LABEL: test_nontemporal_PALL_store_nxv8i16:
|
|
; CHECK-RV32V: # %bb.0:
|
|
; CHECK-RV32V-NEXT: ntl.pall
|
|
; CHECK-RV32V-NEXT: vs2r.v v8, (a0)
|
|
; CHECK-RV32V-NEXT: ret
|
|
store <vscale x 8 x i16> %v, ptr %p, !nontemporal !0, !riscv-nontemporal-domain !2
|
|
ret void
|
|
}
|
|
|
|
define void @test_nontemporal_PALL_store_nxv16i8(ptr %p, <vscale x 16 x i8> %v) {
|
|
; CHECK-RV64V-LABEL: test_nontemporal_PALL_store_nxv16i8:
|
|
; CHECK-RV64V: # %bb.0:
|
|
; CHECK-RV64V-NEXT: ntl.pall
|
|
; CHECK-RV64V-NEXT: vs2r.v v8, (a0)
|
|
; CHECK-RV64V-NEXT: ret
|
|
;
|
|
; CHECK-RV32V-LABEL: test_nontemporal_PALL_store_nxv16i8:
|
|
; CHECK-RV32V: # %bb.0:
|
|
; CHECK-RV32V-NEXT: ntl.pall
|
|
; CHECK-RV32V-NEXT: vs2r.v v8, (a0)
|
|
; CHECK-RV32V-NEXT: ret
|
|
store <vscale x 16 x i8> %v, ptr %p, !nontemporal !0, !riscv-nontemporal-domain !2
|
|
ret void
|
|
}
|
|
|
|
define <vscale x 2 x i64> @test_nontemporal_S1_load_nxv2i64(ptr %p) {
|
|
; CHECK-RV64V-LABEL: test_nontemporal_S1_load_nxv2i64:
|
|
; CHECK-RV64V: # %bb.0:
|
|
; CHECK-RV64V-NEXT: ntl.s1
|
|
; CHECK-RV64V-NEXT: vl2re64.v v8, (a0)
|
|
; CHECK-RV64V-NEXT: ret
|
|
;
|
|
; CHECK-RV32V-LABEL: test_nontemporal_S1_load_nxv2i64:
|
|
; CHECK-RV32V: # %bb.0:
|
|
; CHECK-RV32V-NEXT: ntl.s1
|
|
; CHECK-RV32V-NEXT: vl2re64.v v8, (a0)
|
|
; CHECK-RV32V-NEXT: ret
|
|
%1 = load <vscale x 2 x i64>, ptr %p, !nontemporal !0, !riscv-nontemporal-domain !3
|
|
ret <vscale x 2 x i64> %1
|
|
}
|
|
|
|
define <vscale x 4 x i32> @test_nontemporal_S1_load_nxv4i32(ptr %p) {
|
|
; CHECK-RV64V-LABEL: test_nontemporal_S1_load_nxv4i32:
|
|
; CHECK-RV64V: # %bb.0:
|
|
; CHECK-RV64V-NEXT: ntl.s1
|
|
; CHECK-RV64V-NEXT: vl2re32.v v8, (a0)
|
|
; CHECK-RV64V-NEXT: ret
|
|
;
|
|
; CHECK-RV32V-LABEL: test_nontemporal_S1_load_nxv4i32:
|
|
; CHECK-RV32V: # %bb.0:
|
|
; CHECK-RV32V-NEXT: ntl.s1
|
|
; CHECK-RV32V-NEXT: vl2re32.v v8, (a0)
|
|
; CHECK-RV32V-NEXT: ret
|
|
%1 = load <vscale x 4 x i32>, ptr %p, !nontemporal !0, !riscv-nontemporal-domain !3
|
|
ret <vscale x 4 x i32> %1
|
|
}
|
|
|
|
define <vscale x 8 x i16> @test_nontemporal_S1_load_nxv8i16(ptr %p) {
|
|
; CHECK-RV64V-LABEL: test_nontemporal_S1_load_nxv8i16:
|
|
; CHECK-RV64V: # %bb.0:
|
|
; CHECK-RV64V-NEXT: ntl.s1
|
|
; CHECK-RV64V-NEXT: vl2re16.v v8, (a0)
|
|
; CHECK-RV64V-NEXT: ret
|
|
;
|
|
; CHECK-RV32V-LABEL: test_nontemporal_S1_load_nxv8i16:
|
|
; CHECK-RV32V: # %bb.0:
|
|
; CHECK-RV32V-NEXT: ntl.s1
|
|
; CHECK-RV32V-NEXT: vl2re16.v v8, (a0)
|
|
; CHECK-RV32V-NEXT: ret
|
|
%1 = load <vscale x 8 x i16>, ptr %p, !nontemporal !0, !riscv-nontemporal-domain !3
|
|
ret <vscale x 8 x i16> %1
|
|
}
|
|
|
|
define <vscale x 16 x i8> @test_nontemporal_S1_load_nxv16i8(ptr %p) {
|
|
; CHECK-RV64V-LABEL: test_nontemporal_S1_load_nxv16i8:
|
|
; CHECK-RV64V: # %bb.0:
|
|
; CHECK-RV64V-NEXT: ntl.s1
|
|
; CHECK-RV64V-NEXT: vl2r.v v8, (a0)
|
|
; CHECK-RV64V-NEXT: ret
|
|
;
|
|
; CHECK-RV32V-LABEL: test_nontemporal_S1_load_nxv16i8:
|
|
; CHECK-RV32V: # %bb.0:
|
|
; CHECK-RV32V-NEXT: ntl.s1
|
|
; CHECK-RV32V-NEXT: vl2r.v v8, (a0)
|
|
; CHECK-RV32V-NEXT: ret
|
|
%1 = load <vscale x 16 x i8>, ptr %p, !nontemporal !0, !riscv-nontemporal-domain !3
|
|
ret <vscale x 16 x i8> %1
|
|
}
|
|
|
|
define void @test_nontemporal_S1_store_nxv2i64(ptr %p, <vscale x 2 x i64> %v) {
|
|
; CHECK-RV64V-LABEL: test_nontemporal_S1_store_nxv2i64:
|
|
; CHECK-RV64V: # %bb.0:
|
|
; CHECK-RV64V-NEXT: ntl.s1
|
|
; CHECK-RV64V-NEXT: vs2r.v v8, (a0)
|
|
; CHECK-RV64V-NEXT: ret
|
|
;
|
|
; CHECK-RV32V-LABEL: test_nontemporal_S1_store_nxv2i64:
|
|
; CHECK-RV32V: # %bb.0:
|
|
; CHECK-RV32V-NEXT: ntl.s1
|
|
; CHECK-RV32V-NEXT: vs2r.v v8, (a0)
|
|
; CHECK-RV32V-NEXT: ret
|
|
store <vscale x 2 x i64> %v, ptr %p, !nontemporal !0, !riscv-nontemporal-domain !3
|
|
ret void
|
|
}
|
|
|
|
define void @test_nontemporal_S1_store_nxv4i32(ptr %p, <vscale x 4 x i32> %v) {
|
|
; CHECK-RV64V-LABEL: test_nontemporal_S1_store_nxv4i32:
|
|
; CHECK-RV64V: # %bb.0:
|
|
; CHECK-RV64V-NEXT: ntl.s1
|
|
; CHECK-RV64V-NEXT: vs2r.v v8, (a0)
|
|
; CHECK-RV64V-NEXT: ret
|
|
;
|
|
; CHECK-RV32V-LABEL: test_nontemporal_S1_store_nxv4i32:
|
|
; CHECK-RV32V: # %bb.0:
|
|
; CHECK-RV32V-NEXT: ntl.s1
|
|
; CHECK-RV32V-NEXT: vs2r.v v8, (a0)
|
|
; CHECK-RV32V-NEXT: ret
|
|
store <vscale x 4 x i32> %v, ptr %p, !nontemporal !0, !riscv-nontemporal-domain !3
|
|
ret void
|
|
}
|
|
|
|
define void @test_nontemporal_S1_store_nxv8i16(ptr %p, <vscale x 8 x i16> %v) {
|
|
; CHECK-RV64V-LABEL: test_nontemporal_S1_store_nxv8i16:
|
|
; CHECK-RV64V: # %bb.0:
|
|
; CHECK-RV64V-NEXT: ntl.s1
|
|
; CHECK-RV64V-NEXT: vs2r.v v8, (a0)
|
|
; CHECK-RV64V-NEXT: ret
|
|
;
|
|
; CHECK-RV32V-LABEL: test_nontemporal_S1_store_nxv8i16:
|
|
; CHECK-RV32V: # %bb.0:
|
|
; CHECK-RV32V-NEXT: ntl.s1
|
|
; CHECK-RV32V-NEXT: vs2r.v v8, (a0)
|
|
; CHECK-RV32V-NEXT: ret
|
|
store <vscale x 8 x i16> %v, ptr %p, !nontemporal !0, !riscv-nontemporal-domain !3
|
|
ret void
|
|
}
|
|
|
|
define void @test_nontemporal_S1_store_nxv16i8(ptr %p, <vscale x 16 x i8> %v) {
|
|
; CHECK-RV64V-LABEL: test_nontemporal_S1_store_nxv16i8:
|
|
; CHECK-RV64V: # %bb.0:
|
|
; CHECK-RV64V-NEXT: ntl.s1
|
|
; CHECK-RV64V-NEXT: vs2r.v v8, (a0)
|
|
; CHECK-RV64V-NEXT: ret
|
|
;
|
|
; CHECK-RV32V-LABEL: test_nontemporal_S1_store_nxv16i8:
|
|
; CHECK-RV32V: # %bb.0:
|
|
; CHECK-RV32V-NEXT: ntl.s1
|
|
; CHECK-RV32V-NEXT: vs2r.v v8, (a0)
|
|
; CHECK-RV32V-NEXT: ret
|
|
store <vscale x 16 x i8> %v, ptr %p, !nontemporal !0, !riscv-nontemporal-domain !3
|
|
ret void
|
|
}
|
|
|
|
define <vscale x 2 x i64> @test_nontemporal_ALL_load_nxv2i64(ptr %p) {
|
|
; CHECK-RV64V-LABEL: test_nontemporal_ALL_load_nxv2i64:
|
|
; CHECK-RV64V: # %bb.0:
|
|
; CHECK-RV64V-NEXT: ntl.all
|
|
; CHECK-RV64V-NEXT: vl2re64.v v8, (a0)
|
|
; CHECK-RV64V-NEXT: ret
|
|
;
|
|
; CHECK-RV32V-LABEL: test_nontemporal_ALL_load_nxv2i64:
|
|
; CHECK-RV32V: # %bb.0:
|
|
; CHECK-RV32V-NEXT: ntl.all
|
|
; CHECK-RV32V-NEXT: vl2re64.v v8, (a0)
|
|
; CHECK-RV32V-NEXT: ret
|
|
%1 = load <vscale x 2 x i64>, ptr %p, !nontemporal !0, !riscv-nontemporal-domain !4
|
|
ret <vscale x 2 x i64> %1
|
|
}
|
|
|
|
define <vscale x 4 x i32> @test_nontemporal_ALL_load_nxv4i32(ptr %p) {
|
|
; CHECK-RV64V-LABEL: test_nontemporal_ALL_load_nxv4i32:
|
|
; CHECK-RV64V: # %bb.0:
|
|
; CHECK-RV64V-NEXT: ntl.all
|
|
; CHECK-RV64V-NEXT: vl2re32.v v8, (a0)
|
|
; CHECK-RV64V-NEXT: ret
|
|
;
|
|
; CHECK-RV32V-LABEL: test_nontemporal_ALL_load_nxv4i32:
|
|
; CHECK-RV32V: # %bb.0:
|
|
; CHECK-RV32V-NEXT: ntl.all
|
|
; CHECK-RV32V-NEXT: vl2re32.v v8, (a0)
|
|
; CHECK-RV32V-NEXT: ret
|
|
%1 = load <vscale x 4 x i32>, ptr %p, !nontemporal !0, !riscv-nontemporal-domain !4
|
|
ret <vscale x 4 x i32> %1
|
|
}
|
|
|
|
define <vscale x 8 x i16> @test_nontemporal_ALL_load_nxv8i16(ptr %p) {
|
|
; CHECK-RV64V-LABEL: test_nontemporal_ALL_load_nxv8i16:
|
|
; CHECK-RV64V: # %bb.0:
|
|
; CHECK-RV64V-NEXT: ntl.all
|
|
; CHECK-RV64V-NEXT: vl2re16.v v8, (a0)
|
|
; CHECK-RV64V-NEXT: ret
|
|
;
|
|
; CHECK-RV32V-LABEL: test_nontemporal_ALL_load_nxv8i16:
|
|
; CHECK-RV32V: # %bb.0:
|
|
; CHECK-RV32V-NEXT: ntl.all
|
|
; CHECK-RV32V-NEXT: vl2re16.v v8, (a0)
|
|
; CHECK-RV32V-NEXT: ret
|
|
%1 = load <vscale x 8 x i16>, ptr %p, !nontemporal !0, !riscv-nontemporal-domain !4
|
|
ret <vscale x 8 x i16> %1
|
|
}
|
|
|
|
define <vscale x 16 x i8> @test_nontemporal_ALL_load_nxv16i8(ptr %p) {
|
|
; CHECK-RV64V-LABEL: test_nontemporal_ALL_load_nxv16i8:
|
|
; CHECK-RV64V: # %bb.0:
|
|
; CHECK-RV64V-NEXT: ntl.all
|
|
; CHECK-RV64V-NEXT: vl2r.v v8, (a0)
|
|
; CHECK-RV64V-NEXT: ret
|
|
;
|
|
; CHECK-RV32V-LABEL: test_nontemporal_ALL_load_nxv16i8:
|
|
; CHECK-RV32V: # %bb.0:
|
|
; CHECK-RV32V-NEXT: ntl.all
|
|
; CHECK-RV32V-NEXT: vl2r.v v8, (a0)
|
|
; CHECK-RV32V-NEXT: ret
|
|
%1 = load <vscale x 16 x i8>, ptr %p, !nontemporal !0, !riscv-nontemporal-domain !4
|
|
ret <vscale x 16 x i8> %1
|
|
}
|
|
|
|
define void @test_nontemporal_ALL_store_nxv2i64(ptr %p, <vscale x 2 x i64> %v) {
|
|
; CHECK-RV64V-LABEL: test_nontemporal_ALL_store_nxv2i64:
|
|
; CHECK-RV64V: # %bb.0:
|
|
; CHECK-RV64V-NEXT: ntl.all
|
|
; CHECK-RV64V-NEXT: vs2r.v v8, (a0)
|
|
; CHECK-RV64V-NEXT: ret
|
|
;
|
|
; CHECK-RV32V-LABEL: test_nontemporal_ALL_store_nxv2i64:
|
|
; CHECK-RV32V: # %bb.0:
|
|
; CHECK-RV32V-NEXT: ntl.all
|
|
; CHECK-RV32V-NEXT: vs2r.v v8, (a0)
|
|
; CHECK-RV32V-NEXT: ret
|
|
store <vscale x 2 x i64> %v, ptr %p, !nontemporal !0, !riscv-nontemporal-domain !4
|
|
ret void
|
|
}
|
|
|
|
define void @test_nontemporal_ALL_store_nxv4i32(ptr %p, <vscale x 4 x i32> %v) {
|
|
; CHECK-RV64V-LABEL: test_nontemporal_ALL_store_nxv4i32:
|
|
; CHECK-RV64V: # %bb.0:
|
|
; CHECK-RV64V-NEXT: ntl.all
|
|
; CHECK-RV64V-NEXT: vs2r.v v8, (a0)
|
|
; CHECK-RV64V-NEXT: ret
|
|
;
|
|
; CHECK-RV32V-LABEL: test_nontemporal_ALL_store_nxv4i32:
|
|
; CHECK-RV32V: # %bb.0:
|
|
; CHECK-RV32V-NEXT: ntl.all
|
|
; CHECK-RV32V-NEXT: vs2r.v v8, (a0)
|
|
; CHECK-RV32V-NEXT: ret
|
|
store <vscale x 4 x i32> %v, ptr %p, !nontemporal !0, !riscv-nontemporal-domain !4
|
|
ret void
|
|
}
|
|
|
|
define void @test_nontemporal_ALL_store_nxv8i16(ptr %p, <vscale x 8 x i16> %v) {
|
|
; CHECK-RV64V-LABEL: test_nontemporal_ALL_store_nxv8i16:
|
|
; CHECK-RV64V: # %bb.0:
|
|
; CHECK-RV64V-NEXT: ntl.all
|
|
; CHECK-RV64V-NEXT: vs2r.v v8, (a0)
|
|
; CHECK-RV64V-NEXT: ret
|
|
;
|
|
; CHECK-RV32V-LABEL: test_nontemporal_ALL_store_nxv8i16:
|
|
; CHECK-RV32V: # %bb.0:
|
|
; CHECK-RV32V-NEXT: ntl.all
|
|
; CHECK-RV32V-NEXT: vs2r.v v8, (a0)
|
|
; CHECK-RV32V-NEXT: ret
|
|
store <vscale x 8 x i16> %v, ptr %p, !nontemporal !0, !riscv-nontemporal-domain !4
|
|
ret void
|
|
}
|
|
|
|
define void @test_nontemporal_ALL_store_nxv16i8(ptr %p, <vscale x 16 x i8> %v) {
|
|
; CHECK-RV64V-LABEL: test_nontemporal_ALL_store_nxv16i8:
|
|
; CHECK-RV64V: # %bb.0:
|
|
; CHECK-RV64V-NEXT: ntl.all
|
|
; CHECK-RV64V-NEXT: vs2r.v v8, (a0)
|
|
; CHECK-RV64V-NEXT: ret
|
|
;
|
|
; CHECK-RV32V-LABEL: test_nontemporal_ALL_store_nxv16i8:
|
|
; CHECK-RV32V: # %bb.0:
|
|
; CHECK-RV32V-NEXT: ntl.all
|
|
; CHECK-RV32V-NEXT: vs2r.v v8, (a0)
|
|
; CHECK-RV32V-NEXT: ret
|
|
store <vscale x 16 x i8> %v, ptr %p, !nontemporal !0, !riscv-nontemporal-domain !4
|
|
ret void
|
|
}
|
|
|
|
!0 = !{i32 1}
|
|
!1 = !{i32 2}
|
|
!2 = !{i32 3}
|
|
!3 = !{i32 4}
|
|
!4 = !{i32 5}
|