]> granicus.if.org Git - llvm/commitdiff
[AArch64] Implement __jcvt intrinsic from Armv8.3-A
authorKyrylo Tkachov <kyrylo.tkachov@arm.com>
Tue, 16 Jul 2019 09:27:39 +0000 (09:27 +0000)
committerKyrylo Tkachov <kyrylo.tkachov@arm.com>
Tue, 16 Jul 2019 09:27:39 +0000 (09:27 +0000)
The jcvt intrinsic defined in ACLE [1] is available when ARM_FEATURE_JCVT is defined.

This change introduces the AArch64 intrinsic, wires it up to the instruction and a new clang builtin function.
The __ARM_FEATURE_JCVT macro is now defined when an Armv8.3-A or higher target is used.
I've implemented the target detection logic in Clang so that this feature is enabled for architectures from armv8.3-a onwards (so -march=armv8.4-a also enables this, for example).

make check-all didn't show any new failures.

[1] https://developer.arm.com/docs/101028/latest/data-processing-intrinsics

Differential Revision: https://reviews.llvm.org/D64495

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@366197 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/IR/IntrinsicsAArch64.td
lib/Target/AArch64/AArch64InstrInfo.td
test/CodeGen/AArch64/fjcvtzs.ll [new file with mode: 0644]
utils/git-svn/git-llvm

index 720a7bdde2375088a4780ecd9ae6a4dd41358330..7616d6a90c1bcd6d074236c2e3fb8362edd442d6 100644 (file)
@@ -31,6 +31,8 @@ def int_aarch64_sdiv : Intrinsic<[llvm_anyint_ty], [LLVMMatchType<0>,
 def int_aarch64_udiv : Intrinsic<[llvm_anyint_ty], [LLVMMatchType<0>,
                                 LLVMMatchType<0>], [IntrNoMem]>;
 
+def int_aarch64_fjcvtzs : Intrinsic<[llvm_i32_ty], [llvm_double_ty], [IntrNoMem]>;
+
 //===----------------------------------------------------------------------===//
 // HINT
 
index 41497a6c4fbc078952e410245b83481daa6fe3d4..897b3ebb3847f46f76def153e658188e2c80e862 100644 (file)
@@ -717,7 +717,9 @@ let Predicates = [HasPA] in {
 // v8.3a floating point conversion for javascript
 let Predicates = [HasJS, HasFPARMv8] in
 def FJCVTZS  : BaseFPToIntegerUnscaled<0b01, 0b11, 0b110, FPR64, GPR32,
-                                      "fjcvtzs", []> {
+                                      "fjcvtzs",
+                                      [(set GPR32:$Rd,
+                                         (int_aarch64_fjcvtzs FPR64:$Rn))]> {
   let Inst{31} = 0;
 } // HasJS, HasFPARMv8
 
diff --git a/test/CodeGen/AArch64/fjcvtzs.ll b/test/CodeGen/AArch64/fjcvtzs.ll
new file mode 100644 (file)
index 0000000..017694d
--- /dev/null
@@ -0,0 +1,10 @@
+; RUN: llc -mtriple=arm64-eabi -mattr=+jsconv -o - %s | FileCheck %s
+
+define i32 @test_jcvt(double %v) {
+; CHECK-LABEL: test_jcvt:
+; CHECK: fjcvtzs w0, d0
+  %val = call i32 @llvm.aarch64.fjcvtzs(double %v)
+  ret i32 %val
+}
+
+declare i32 @llvm.aarch64.fjcvtzs(double)
index 289898d15b5fb9af1c00a447133dcc6a314eb248..13c49b5fdf0c6f2d1428dca1cffbb2fa23991e73 100755 (executable)
@@ -372,7 +372,7 @@ def svn_push_one_rev(svn_repo, rev, git_to_svn_mapping, dry_run):
     # Now we're ready to commit.
     commit_msg = git('show', '--pretty=%B', '--quiet', rev)
     if not dry_run:
-        commit_args = ['commit', '-m', commit_msg]
+        commit_args = ['commit', '-m', commit_msg, '--username', 'ktkachov']
         if '--force-interactive' in svn(svn_repo, 'commit', '--help'):
             commit_args.append('--force-interactive')
         log(svn(svn_repo, *commit_args))