forked from rust-lang/llvm-project
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[AArch64] Add support for Transactional Memory Extension (TME)
TME is a future architecture technology, documented in https://developer.arm.com/architectures/cpu-architecture/a-profile/exploration-tools https://developer.arm.com/docs/ddi0601/a More about the future architectures: https://community.arm.com/developer/ip-products/processors/b/processors-ip-blog/posts/new-technologies-for-the-arm-a-profile-architecture This patch adds support for the TME instructions TSTART, TTEST, TCOMMIT, and TCANCEL and the target feature/arch extension "tme". It also implements TME builtin functions, defined in ACLE Q2 2019 (https://developer.arm.com/docs/101028/latest) Patch by Javed Absar and Momchil Velikov Differential Revision: https://reviews.llvm.org/D64416 llvm-svn: 366322
- Loading branch information
1 parent
2889fe6
commit 4b8da3a
Showing
25 changed files
with
350 additions
and
13 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
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,10 @@ | ||
// RUN: %clang_cc1 -triple aarch64-eabi -target-feature +tme -S -emit-llvm %s -o - | FileCheck %s | ||
|
||
#define A -1 | ||
constexpr int f() { return 65536; } | ||
|
||
void t_cancel() { | ||
__builtin_arm_tcancel(f() + A); | ||
} | ||
|
||
// CHECK: call void @llvm.aarch64.tcancel(i64 65535) |
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,36 @@ | ||
// RUN: %clang_cc1 -triple aarch64-eabi -target-feature +tme -S -emit-llvm %s -o - | FileCheck %s | ||
// RUN: %clang_cc1 -DUSE_ACLE -triple aarch64-eabi -target-feature +tme -S -emit-llvm %s -o - | FileCheck %s | ||
|
||
#ifdef USE_ACLE | ||
#include "arm_acle.h" | ||
void test_tme_funcs() { | ||
__tstart(); | ||
(void)__ttest(); | ||
__tcommit(); | ||
__tcancel(0x789a); | ||
} | ||
#else | ||
void test_tme_funcs() { | ||
__builtin_arm_tstart(); | ||
(void)__builtin_arm_ttest(); | ||
__builtin_arm_tcommit(); | ||
__builtin_arm_tcancel(0x789a); | ||
} | ||
#endif | ||
// CHECK: call i64 @llvm.aarch64.tstart() | ||
// CHECK: call i64 @llvm.aarch64.ttest() | ||
// CHECK: call void @llvm.aarch64.tcommit() | ||
// CHECK: call void @llvm.aarch64.tcancel(i64 30874) | ||
|
||
// CHECK: declare i64 @llvm.aarch64.tstart() #1 | ||
// CHECK: declare i64 @llvm.aarch64.ttest() #1 | ||
// CHECK: declare void @llvm.aarch64.tcommit() #1 | ||
// CHECK: declare void @llvm.aarch64.tcancel(i64 immarg) #2 | ||
|
||
#ifdef __ARM_FEATURE_TME | ||
void arm_feature_tme_defined() {} | ||
#endif | ||
// CHECK: define void @arm_feature_tme_defined() | ||
|
||
// CHECK: attributes #1 = { nounwind } | ||
// CHECK: attributes #2 = { noreturn nounwind } |
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,8 @@ | ||
// RUN: %clang_cc1 -triple aarch64-eabi -verify %s | ||
|
||
#include "arm_acle.h" | ||
|
||
void test_no_tme_funcs() { | ||
__tstart(); // expected-warning{{implicit declaration of function '__tstart'}} | ||
__builtin_tstart(); // expected-error{{use of unknown builtin '__builtin_tstart'}} | ||
} |
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,4 @@ | ||
// RUN: %clang_cc1 -triple aarch64-eabi -target-feature +tme -verify %s | ||
void t_cancel(unsigned short u) { | ||
__builtin_arm_tcancel(u); // expected-error{{argument to '__builtin_arm_tcancel' must be a constant integer}} | ||
} |
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,4 @@ | ||
// RUN: %clang_cc1 -triple aarch64-eabi -target-feature +tme -verify %s | ||
void t_cancel() { | ||
__builtin_arm_tcancel(0x12345u); // expected-error{{argument value 74565 is outside the valid range [0, 65535]}} | ||
} |
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
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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,16 @@ | ||
; RUN: llc %s -o - | FileCheck %s | ||
|
||
target triple = "aarch64-unknown-unknown-eabi" | ||
|
||
define void @test_tcancel() #0 { | ||
tail call void @llvm.aarch64.tcancel(i64 0) #1 | ||
unreachable | ||
} | ||
|
||
declare void @llvm.aarch64.tcancel(i64 immarg) #1 | ||
|
||
attributes #0 = { "target-features"="+tme" } | ||
attributes #1 = { nounwind noreturn } | ||
|
||
; CHECK-LABEL: test_tcancel | ||
; CHECK: tcancel |
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,16 @@ | ||
; RUN: llc %s -o - | FileCheck %s | ||
|
||
target triple = "aarch64-unknown-unknown-eabi" | ||
|
||
define void @test_tcommit() #0 { | ||
tail call void @llvm.aarch64.tcommit() | ||
ret void | ||
} | ||
|
||
declare void @llvm.aarch64.tcommit() #1 | ||
|
||
attributes #0 = { "target-features"="+tme" } | ||
attributes #1 = { nounwind } | ||
|
||
; CHECK-LABEL: test_tcommit | ||
; CHECK: tcommit |
Oops, something went wrong.