Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[SveEmitter] Add builtins for contiguous prefetches
This patch also adds the enum `sv_prfop` for the prefetch operation specifier and checks to ensure the passed enum values are valid. Reviewers: SjoerdMeijer, efriedma, ctetreau Reviewed By: efriedma Tags: #clang Differential Revision: https://reviews.llvm.org/D78674
- Loading branch information
1 parent
9cd4deb
commit 823e2a6
Showing
14 changed files
with
654 additions
and
7 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
104 changes: 104 additions & 0 deletions
104
clang/test/CodeGen/aarch64-sve-intrinsics/acle_sve_prfb.c
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,104 @@ | ||
// RUN: %clang_cc1 -D__ARM_FEATURE_SVE -triple aarch64-none-linux-gnu -target-feature +sve -fallow-half-arguments-and-returns -S -O1 -Werror -Wall -emit-llvm -o - %s | FileCheck %s | ||
// RUN: %clang_cc1 -D__ARM_FEATURE_SVE -DSVE_OVERLOADED_FORMS -triple aarch64-none-linux-gnu -target-feature +sve -fallow-half-arguments-and-returns -S -O1 -Werror -Wall -emit-llvm -o - %s | FileCheck %s | ||
|
||
#include <arm_sve.h> | ||
|
||
#ifdef SVE_OVERLOADED_FORMS | ||
// A simple used,unused... macro, long enough to represent any SVE builtin. | ||
#define SVE_ACLE_FUNC(A1,A2_UNUSED,A3,A4_UNUSED) A1##A3 | ||
#else | ||
#define SVE_ACLE_FUNC(A1,A2,A3,A4) A1##A2##A3##A4 | ||
#endif | ||
|
||
void test_svprfb(svbool_t pg, const void *base) | ||
{ | ||
// CHECK-LABEL: test_svprfb | ||
// CHECK: @llvm.aarch64.sve.prf.nxv16i1(<vscale x 16 x i1> %pg, i8* %base, i32 0) | ||
return svprfb(pg, base, SV_PLDL1KEEP); | ||
} | ||
|
||
void test_svprfb_1(svbool_t pg, const void *base) | ||
{ | ||
// CHECK-LABEL: test_svprfb_1 | ||
// CHECK: @llvm.aarch64.sve.prf.nxv16i1(<vscale x 16 x i1> %pg, i8* %base, i32 1) | ||
return svprfb(pg, base, SV_PLDL1STRM); | ||
} | ||
|
||
void test_svprfb_2(svbool_t pg, const void *base) | ||
{ | ||
// CHECK-LABEL: test_svprfb_2 | ||
// CHECK: @llvm.aarch64.sve.prf.nxv16i1(<vscale x 16 x i1> %pg, i8* %base, i32 2) | ||
return svprfb(pg, base, SV_PLDL2KEEP); | ||
} | ||
|
||
void test_svprfb_3(svbool_t pg, const void *base) | ||
{ | ||
// CHECK-LABEL: test_svprfb_3 | ||
// CHECK: @llvm.aarch64.sve.prf.nxv16i1(<vscale x 16 x i1> %pg, i8* %base, i32 3) | ||
return svprfb(pg, base, SV_PLDL2STRM); | ||
} | ||
|
||
void test_svprfb_4(svbool_t pg, const void *base) | ||
{ | ||
// CHECK-LABEL: test_svprfb_4 | ||
// CHECK: @llvm.aarch64.sve.prf.nxv16i1(<vscale x 16 x i1> %pg, i8* %base, i32 4) | ||
return svprfb(pg, base, SV_PLDL3KEEP); | ||
} | ||
|
||
void test_svprfb_5(svbool_t pg, const void *base) | ||
{ | ||
// CHECK-LABEL: test_svprfb_5 | ||
// CHECK: @llvm.aarch64.sve.prf.nxv16i1(<vscale x 16 x i1> %pg, i8* %base, i32 5) | ||
return svprfb(pg, base, SV_PLDL3STRM); | ||
} | ||
|
||
void test_svprfb_6(svbool_t pg, const void *base) | ||
{ | ||
// CHECK-LABEL: test_svprfb_6 | ||
// CHECK: @llvm.aarch64.sve.prf.nxv16i1(<vscale x 16 x i1> %pg, i8* %base, i32 8) | ||
return svprfb(pg, base, SV_PSTL1KEEP); | ||
} | ||
|
||
void test_svprfb_7(svbool_t pg, const void *base) | ||
{ | ||
// CHECK-LABEL: test_svprfb_7 | ||
// CHECK: @llvm.aarch64.sve.prf.nxv16i1(<vscale x 16 x i1> %pg, i8* %base, i32 9) | ||
return svprfb(pg, base, SV_PSTL1STRM); | ||
} | ||
|
||
void test_svprfb_8(svbool_t pg, const void *base) | ||
{ | ||
// CHECK-LABEL: test_svprfb_8 | ||
// CHECK: @llvm.aarch64.sve.prf.nxv16i1(<vscale x 16 x i1> %pg, i8* %base, i32 10) | ||
return svprfb(pg, base, SV_PSTL2KEEP); | ||
} | ||
|
||
void test_svprfb_9(svbool_t pg, const void *base) | ||
{ | ||
// CHECK-LABEL: test_svprfb_9 | ||
// CHECK: @llvm.aarch64.sve.prf.nxv16i1(<vscale x 16 x i1> %pg, i8* %base, i32 11) | ||
return svprfb(pg, base, SV_PSTL2STRM); | ||
} | ||
|
||
void test_svprfb_10(svbool_t pg, const void *base) | ||
{ | ||
// CHECK-LABEL: test_svprfb_10 | ||
// CHECK: @llvm.aarch64.sve.prf.nxv16i1(<vscale x 16 x i1> %pg, i8* %base, i32 12) | ||
return svprfb(pg, base, SV_PSTL3KEEP); | ||
} | ||
|
||
void test_svprfb_11(svbool_t pg, const void *base) | ||
{ | ||
// CHECK-LABEL: test_svprfb_11 | ||
// CHECK: @llvm.aarch64.sve.prf.nxv16i1(<vscale x 16 x i1> %pg, i8* %base, i32 13) | ||
return svprfb(pg, base, SV_PSTL3STRM); | ||
} | ||
|
||
void test_svprfb_vnum(svbool_t pg, const void *base, int64_t vnum) | ||
{ | ||
// CHECK-LABEL: test_svprfb_vnum | ||
// CHECK: %[[BASE:.*]] = bitcast i8* %base to <vscale x 16 x i8>* | ||
// CHECK: %[[GEP:.*]] = getelementptr <vscale x 16 x i8>, <vscale x 16 x i8>* %[[BASE]], i64 %vnum, i64 0 | ||
// CHECK: @llvm.aarch64.sve.prf.nxv16i1(<vscale x 16 x i1> %pg, i8* %[[GEP]], i32 0) | ||
return svprfb_vnum(pg, base, vnum, SV_PLDL1KEEP); | ||
} |
118 changes: 118 additions & 0 deletions
118
clang/test/CodeGen/aarch64-sve-intrinsics/acle_sve_prfd.c
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,118 @@ | ||
// RUN: %clang_cc1 -D__ARM_FEATURE_SVE -triple aarch64-none-linux-gnu -target-feature +sve -fallow-half-arguments-and-returns -S -O1 -Werror -Wall -emit-llvm -o - %s | FileCheck %s | ||
// RUN: %clang_cc1 -D__ARM_FEATURE_SVE -DSVE_OVERLOADED_FORMS -triple aarch64-none-linux-gnu -target-feature +sve -fallow-half-arguments-and-returns -S -O1 -Werror -Wall -emit-llvm -o - %s | FileCheck %s | ||
|
||
#include <arm_sve.h> | ||
|
||
#ifdef SVE_OVERLOADED_FORMS | ||
// A simple used,unused... macro, long enough to represent any SVE builtin. | ||
#define SVE_ACLE_FUNC(A1,A2_UNUSED,A3,A4_UNUSED) A1##A3 | ||
#else | ||
#define SVE_ACLE_FUNC(A1,A2,A3,A4) A1##A2##A3##A4 | ||
#endif | ||
|
||
void test_svprfd(svbool_t pg, const void *base) | ||
{ | ||
// CHECK-LABEL: test_svprfd | ||
// CHECK: %[[PG:.*]] = call <vscale x 2 x i1> @llvm.aarch64.sve.convert.from.svbool.nxv2i1(<vscale x 16 x i1> %pg) | ||
// CHECK: @llvm.aarch64.sve.prf.nxv2i1(<vscale x 2 x i1> %[[PG]], i8* %base, i32 0) | ||
return svprfd(pg, base, SV_PLDL1KEEP); | ||
} | ||
|
||
void test_svprfd_1(svbool_t pg, const void *base) | ||
{ | ||
// CHECK-LABEL: test_svprfd_1 | ||
// CHECK: %[[PG:.*]] = call <vscale x 2 x i1> @llvm.aarch64.sve.convert.from.svbool.nxv2i1(<vscale x 16 x i1> %pg) | ||
// CHECK: @llvm.aarch64.sve.prf.nxv2i1(<vscale x 2 x i1> %[[PG]], i8* %base, i32 1) | ||
return svprfd(pg, base, SV_PLDL1STRM); | ||
} | ||
|
||
void test_svprfd_2(svbool_t pg, const void *base) | ||
{ | ||
// CHECK-LABEL: test_svprfd_2 | ||
// CHECK: %[[PG:.*]] = call <vscale x 2 x i1> @llvm.aarch64.sve.convert.from.svbool.nxv2i1(<vscale x 16 x i1> %pg) | ||
// CHECK: @llvm.aarch64.sve.prf.nxv2i1(<vscale x 2 x i1> %[[PG]], i8* %base, i32 2) | ||
return svprfd(pg, base, SV_PLDL2KEEP); | ||
} | ||
|
||
void test_svprfd_3(svbool_t pg, const void *base) | ||
{ | ||
// CHECK-LABEL: test_svprfd_3 | ||
// CHECK: %[[PG:.*]] = call <vscale x 2 x i1> @llvm.aarch64.sve.convert.from.svbool.nxv2i1(<vscale x 16 x i1> %pg) | ||
// CHECK: @llvm.aarch64.sve.prf.nxv2i1(<vscale x 2 x i1> %[[PG]], i8* %base, i32 3) | ||
return svprfd(pg, base, SV_PLDL2STRM); | ||
} | ||
|
||
void test_svprfd_4(svbool_t pg, const void *base) | ||
{ | ||
// CHECK-LABEL: test_svprfd_4 | ||
// CHECK: %[[PG:.*]] = call <vscale x 2 x i1> @llvm.aarch64.sve.convert.from.svbool.nxv2i1(<vscale x 16 x i1> %pg) | ||
// CHECK: @llvm.aarch64.sve.prf.nxv2i1(<vscale x 2 x i1> %[[PG]], i8* %base, i32 4) | ||
return svprfd(pg, base, SV_PLDL3KEEP); | ||
} | ||
|
||
void test_svprfd_5(svbool_t pg, const void *base) | ||
{ | ||
// CHECK-LABEL: test_svprfd_5 | ||
// CHECK: %[[PG:.*]] = call <vscale x 2 x i1> @llvm.aarch64.sve.convert.from.svbool.nxv2i1(<vscale x 16 x i1> %pg) | ||
// CHECK: @llvm.aarch64.sve.prf.nxv2i1(<vscale x 2 x i1> %[[PG]], i8* %base, i32 5) | ||
return svprfd(pg, base, SV_PLDL3STRM); | ||
} | ||
|
||
void test_svprfd_6(svbool_t pg, const void *base) | ||
{ | ||
// CHECK-LABEL: test_svprfd_6 | ||
// CHECK: %[[PG:.*]] = call <vscale x 2 x i1> @llvm.aarch64.sve.convert.from.svbool.nxv2i1(<vscale x 16 x i1> %pg) | ||
// CHECK: @llvm.aarch64.sve.prf.nxv2i1(<vscale x 2 x i1> %[[PG]], i8* %base, i32 8) | ||
return svprfd(pg, base, SV_PSTL1KEEP); | ||
} | ||
|
||
void test_svprfd_7(svbool_t pg, const void *base) | ||
{ | ||
// CHECK-LABEL: test_svprfd_7 | ||
// CHECK: %[[PG:.*]] = call <vscale x 2 x i1> @llvm.aarch64.sve.convert.from.svbool.nxv2i1(<vscale x 16 x i1> %pg) | ||
// CHECK: @llvm.aarch64.sve.prf.nxv2i1(<vscale x 2 x i1> %[[PG]], i8* %base, i32 9) | ||
return svprfd(pg, base, SV_PSTL1STRM); | ||
} | ||
|
||
void test_svprfd_8(svbool_t pg, const void *base) | ||
{ | ||
// CHECK-LABEL: test_svprfd_8 | ||
// CHECK: %[[PG:.*]] = call <vscale x 2 x i1> @llvm.aarch64.sve.convert.from.svbool.nxv2i1(<vscale x 16 x i1> %pg) | ||
// CHECK: @llvm.aarch64.sve.prf.nxv2i1(<vscale x 2 x i1> %[[PG]], i8* %base, i32 10) | ||
return svprfd(pg, base, SV_PSTL2KEEP); | ||
} | ||
|
||
void test_svprfd_9(svbool_t pg, const void *base) | ||
{ | ||
// CHECK-LABEL: test_svprfd_9 | ||
// CHECK: %[[PG:.*]] = call <vscale x 2 x i1> @llvm.aarch64.sve.convert.from.svbool.nxv2i1(<vscale x 16 x i1> %pg) | ||
// CHECK: @llvm.aarch64.sve.prf.nxv2i1(<vscale x 2 x i1> %[[PG]], i8* %base, i32 11) | ||
return svprfd(pg, base, SV_PSTL2STRM); | ||
} | ||
|
||
void test_svprfd_10(svbool_t pg, const void *base) | ||
{ | ||
// CHECK-LABEL: test_svprfd_10 | ||
// CHECK: %[[PG:.*]] = call <vscale x 2 x i1> @llvm.aarch64.sve.convert.from.svbool.nxv2i1(<vscale x 16 x i1> %pg) | ||
// CHECK: @llvm.aarch64.sve.prf.nxv2i1(<vscale x 2 x i1> %[[PG]], i8* %base, i32 12) | ||
return svprfd(pg, base, SV_PSTL3KEEP); | ||
} | ||
|
||
void test_svprfd_11(svbool_t pg, const void *base) | ||
{ | ||
// CHECK-LABEL: test_svprfd_11 | ||
// CHECK: %[[PG:.*]] = call <vscale x 2 x i1> @llvm.aarch64.sve.convert.from.svbool.nxv2i1(<vscale x 16 x i1> %pg) | ||
// CHECK: @llvm.aarch64.sve.prf.nxv2i1(<vscale x 2 x i1> %[[PG]], i8* %base, i32 13) | ||
return svprfd(pg, base, SV_PSTL3STRM); | ||
} | ||
|
||
void test_svprfd_vnum(svbool_t pg, const void *base, int64_t vnum) | ||
{ | ||
// CHECK-LABEL: test_svprfd_vnum | ||
// CHECK-DAG: %[[PG:.*]] = call <vscale x 2 x i1> @llvm.aarch64.sve.convert.from.svbool.nxv2i1(<vscale x 16 x i1> %pg) | ||
// CHECK-DAG: %[[BASE:.*]] = bitcast i8* %base to <vscale x 2 x i64>* | ||
// CHECK-DAG: %[[GEP:.*]] = getelementptr <vscale x 2 x i64>, <vscale x 2 x i64>* %[[BASE]], i64 %vnum | ||
// CHECK-DAG: %[[I8_BASE:.*]] = bitcast <vscale x 2 x i64>* %[[GEP]] to i8* | ||
// CHECK: @llvm.aarch64.sve.prf.nxv2i1(<vscale x 2 x i1> %[[PG]], i8* %[[I8_BASE]], i32 0) | ||
return svprfd_vnum(pg, base, vnum, SV_PLDL1KEEP); | ||
} |
Oops, something went wrong.