1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-10-18 10:32:48 +02:00

AArch64/ARM64: move ARM64 into AArch64's place

This commit starts with a "git mv ARM64 AArch64" and continues out
from there, renaming the C++ classes, intrinsics, and other
target-local objects for consistency.

"ARM64" test directories are also moved, and tests that began their
life in ARM64 use an arm64 triple, those from AArch64 use an aarch64
triple. Both should be equivalent though.

This finishes the AArch64 merge, and everyone should feel free to
continue committing as normal now.

llvm-svn: 209577
This commit is contained in:
Tim Northover 2014-05-24 12:50:23 +00:00
parent d7f173214f
commit ca0f4dc4f0
636 changed files with 14391 additions and 14497 deletions

View File

@ -127,7 +127,7 @@ set(LLVM_INCLUDE_DIR ${CMAKE_CURRENT_BINARY_DIR}/include)
set(LLVM_LIBDIR_SUFFIX "" CACHE STRING "Define suffix of library directory name (32/64)" )
set(LLVM_ALL_TARGETS
ARM64
AArch64
ARM
CppBackend
Hexagon
@ -143,7 +143,7 @@ set(LLVM_ALL_TARGETS
)
# List of targets with JIT support:
set(LLVM_TARGETS_WITH_JIT X86 PowerPC ARM64 ARM Mips SystemZ)
set(LLVM_TARGETS_WITH_JIT X86 PowerPC AArch64 ARM Mips SystemZ)
set(LLVM_TARGETS_TO_BUILD "all"
CACHE STRING "Semicolon-separated list of targets to build, or \"all\".")

View File

@ -419,9 +419,9 @@ AC_CACHE_CHECK([target architecture],[llvm_cv_target_arch],
amd64-* | x86_64-*) llvm_cv_target_arch="x86_64" ;;
sparc*-*) llvm_cv_target_arch="Sparc" ;;
powerpc*-*) llvm_cv_target_arch="PowerPC" ;;
arm64*-*) llvm_cv_target_arch="ARM64" ;;
arm64*-*) llvm_cv_target_arch="AArch64" ;;
arm*-*) llvm_cv_target_arch="ARM" ;;
aarch64*-*) llvm_cv_target_arch="ARM64" ;;
aarch64*-*) llvm_cv_target_arch="AArch64" ;;
mips-* | mips64-*) llvm_cv_target_arch="Mips" ;;
mipsel-* | mips64el-*) llvm_cv_target_arch="Mips" ;;
xcore-*) llvm_cv_target_arch="XCore" ;;
@ -455,9 +455,9 @@ case $host in
amd64-* | x86_64-*) host_arch="x86_64" ;;
sparc*-*) host_arch="Sparc" ;;
powerpc*-*) host_arch="PowerPC" ;;
arm64*-*) host_arch="ARM64" ;;
arm64*-*) host_arch="AArch64" ;;
arm*-*) host_arch="ARM" ;;
aarch64*-*) host_arch="ARM64" ;;
aarch64*-*) host_arch="AArch64" ;;
mips-* | mips64-*) host_arch="Mips" ;;
mipsel-* | mips64el-*) host_arch="Mips" ;;
xcore-*) host_arch="XCore" ;;
@ -796,7 +796,7 @@ else
esac
fi
TARGETS_WITH_JIT="ARM ARM64 Mips PowerPC SystemZ X86"
TARGETS_WITH_JIT="ARM AArch64 Mips PowerPC SystemZ X86"
AC_SUBST(TARGETS_WITH_JIT,$TARGETS_WITH_JIT)
dnl Allow enablement of building and installing docs
@ -949,7 +949,7 @@ if test "$llvm_cv_enable_crash_overrides" = "yes" ; then
fi
dnl List all possible targets
ALL_TARGETS="X86 Sparc PowerPC ARM ARM64 Mips XCore MSP430 CppBackend NVPTX Hexagon SystemZ R600"
ALL_TARGETS="X86 Sparc PowerPC ARM AArch64 Mips XCore MSP430 CppBackend NVPTX Hexagon SystemZ R600"
AC_SUBST(ALL_TARGETS,$ALL_TARGETS)
dnl Allow specific targets to be specified for building (or not)
@ -970,8 +970,8 @@ case "$enableval" in
x86_64) TARGETS_TO_BUILD="X86 $TARGETS_TO_BUILD" ;;
sparc) TARGETS_TO_BUILD="Sparc $TARGETS_TO_BUILD" ;;
powerpc) TARGETS_TO_BUILD="PowerPC $TARGETS_TO_BUILD" ;;
aarch64) TARGETS_TO_BUILD="ARM64 $TARGETS_TO_BUILD" ;;
arm64) TARGETS_TO_BUILD="ARM64 $TARGETS_TO_BUILD" ;;
aarch64) TARGETS_TO_BUILD="AArch64 $TARGETS_TO_BUILD" ;;
arm64) TARGETS_TO_BUILD="AArch64 $TARGETS_TO_BUILD" ;;
arm) TARGETS_TO_BUILD="ARM $TARGETS_TO_BUILD" ;;
mips) TARGETS_TO_BUILD="Mips $TARGETS_TO_BUILD" ;;
mipsel) TARGETS_TO_BUILD="Mips $TARGETS_TO_BUILD" ;;
@ -989,7 +989,7 @@ case "$enableval" in
x86_64) TARGETS_TO_BUILD="X86 $TARGETS_TO_BUILD" ;;
Sparc) TARGETS_TO_BUILD="Sparc $TARGETS_TO_BUILD" ;;
PowerPC) TARGETS_TO_BUILD="PowerPC $TARGETS_TO_BUILD" ;;
AArch64) TARGETS_TO_BUILD="ARM64 $TARGETS_TO_BUILD" ;;
AArch64) TARGETS_TO_BUILD="AArch64 $TARGETS_TO_BUILD" ;;
ARM) TARGETS_TO_BUILD="ARM $TARGETS_TO_BUILD" ;;
Mips) TARGETS_TO_BUILD="Mips $TARGETS_TO_BUILD" ;;
XCore) TARGETS_TO_BUILD="XCore $TARGETS_TO_BUILD" ;;

View File

@ -372,7 +372,7 @@ elseif (LLVM_NATIVE_ARCH MATCHES "powerpc")
elseif (LLVM_NATIVE_ARCH MATCHES "aarch64")
set(LLVM_NATIVE_ARCH AArch64)
elseif (LLVM_NATIVE_ARCH MATCHES "arm64")
set(LLVM_NATIVE_ARCH ARM64)
set(LLVM_NATIVE_ARCH AArch64)
elseif (LLVM_NATIVE_ARCH MATCHES "arm")
set(LLVM_NATIVE_ARCH ARM)
elseif (LLVM_NATIVE_ARCH MATCHES "mips")

18
configure vendored
View File

@ -4151,9 +4151,9 @@ else
amd64-* | x86_64-*) llvm_cv_target_arch="x86_64" ;;
sparc*-*) llvm_cv_target_arch="Sparc" ;;
powerpc*-*) llvm_cv_target_arch="PowerPC" ;;
arm64*-*) llvm_cv_target_arch="ARM64" ;;
arm64*-*) llvm_cv_target_arch="AArch64" ;;
arm*-*) llvm_cv_target_arch="ARM" ;;
aarch64*-*) llvm_cv_target_arch="ARM64" ;;
aarch64*-*) llvm_cv_target_arch="AArch64" ;;
mips-* | mips64-*) llvm_cv_target_arch="Mips" ;;
mipsel-* | mips64el-*) llvm_cv_target_arch="Mips" ;;
xcore-*) llvm_cv_target_arch="XCore" ;;
@ -4188,9 +4188,9 @@ case $host in
amd64-* | x86_64-*) host_arch="x86_64" ;;
sparc*-*) host_arch="Sparc" ;;
powerpc*-*) host_arch="PowerPC" ;;
arm64*-*) host_arch="ARM64" ;;
arm64*-*) host_arch="AArch64" ;;
arm*-*) host_arch="ARM" ;;
aarch64*-*) host_arch="ARM64" ;;
aarch64*-*) host_arch="AArch64" ;;
mips-* | mips64-*) host_arch="Mips" ;;
mipsel-* | mips64el-*) host_arch="Mips" ;;
xcore-*) host_arch="XCore" ;;
@ -5120,7 +5120,7 @@ else
esac
fi
TARGETS_WITH_JIT="ARM ARM64 Mips PowerPC SystemZ X86"
TARGETS_WITH_JIT="ARM AArch64 Mips PowerPC SystemZ X86"
TARGETS_WITH_JIT=$TARGETS_WITH_JIT
@ -5357,7 +5357,7 @@ _ACEOF
fi
ALL_TARGETS="X86 Sparc PowerPC ARM ARM64 Mips XCore MSP430 CppBackend NVPTX Hexagon SystemZ R600"
ALL_TARGETS="X86 Sparc PowerPC ARM AArch64 Mips XCore MSP430 CppBackend NVPTX Hexagon SystemZ R600"
ALL_TARGETS=$ALL_TARGETS
@ -5380,8 +5380,8 @@ case "$enableval" in
x86_64) TARGETS_TO_BUILD="X86 $TARGETS_TO_BUILD" ;;
sparc) TARGETS_TO_BUILD="Sparc $TARGETS_TO_BUILD" ;;
powerpc) TARGETS_TO_BUILD="PowerPC $TARGETS_TO_BUILD" ;;
aarch64) TARGETS_TO_BUILD="ARM64 $TARGETS_TO_BUILD" ;;
arm64) TARGETS_TO_BUILD="ARM64 $TARGETS_TO_BUILD" ;;
aarch64) TARGETS_TO_BUILD="AArch64 $TARGETS_TO_BUILD" ;;
arm64) TARGETS_TO_BUILD="AArch64 $TARGETS_TO_BUILD" ;;
arm) TARGETS_TO_BUILD="ARM $TARGETS_TO_BUILD" ;;
mips) TARGETS_TO_BUILD="Mips $TARGETS_TO_BUILD" ;;
mipsel) TARGETS_TO_BUILD="Mips $TARGETS_TO_BUILD" ;;
@ -5399,7 +5399,7 @@ case "$enableval" in
x86_64) TARGETS_TO_BUILD="X86 $TARGETS_TO_BUILD" ;;
Sparc) TARGETS_TO_BUILD="Sparc $TARGETS_TO_BUILD" ;;
PowerPC) TARGETS_TO_BUILD="PowerPC $TARGETS_TO_BUILD" ;;
AArch64) TARGETS_TO_BUILD="ARM64 $TARGETS_TO_BUILD" ;;
AArch64) TARGETS_TO_BUILD="AArch64 $TARGETS_TO_BUILD" ;;
ARM) TARGETS_TO_BUILD="ARM $TARGETS_TO_BUILD" ;;
Mips) TARGETS_TO_BUILD="Mips $TARGETS_TO_BUILD" ;;
XCore) TARGETS_TO_BUILD="XCore $TARGETS_TO_BUILD" ;;

View File

@ -6877,7 +6877,7 @@ register in surrounding code, including inline assembly. Because of that,
allocatable registers are not supported.
Warning: So far it only works with the stack pointer on selected
architectures (ARM, ARM64, AArch64, PowerPC and x86_64). Significant amount of
architectures (ARM, AArch64, PowerPC and x86_64). Significant amount of
work is needed to support other registers and even more so, allocatable
registers.

View File

@ -533,7 +533,7 @@ def int_clear_cache : Intrinsic<[], [llvm_ptr_ty, llvm_ptr_ty],
include "llvm/IR/IntrinsicsPowerPC.td"
include "llvm/IR/IntrinsicsX86.td"
include "llvm/IR/IntrinsicsARM.td"
include "llvm/IR/IntrinsicsARM64.td"
include "llvm/IR/IntrinsicsAArch64.td"
include "llvm/IR/IntrinsicsXCore.td"
include "llvm/IR/IntrinsicsHexagon.td"
include "llvm/IR/IntrinsicsNVVM.td"

View File

@ -1,4 +1,4 @@
//===- IntrinsicsARM64.td - Defines ARM64 intrinsics -------*- tablegen -*-===//
//===- IntrinsicsAARCH64.td - Defines AARCH64 intrinsics ---*- tablegen -*-===//
//
// The LLVM Compiler Infrastructure
//
@ -7,36 +7,36 @@
//
//===----------------------------------------------------------------------===//
//
// This file defines all of the ARM64-specific intrinsics.
// This file defines all of the AARCH64-specific intrinsics.
//
//===----------------------------------------------------------------------===//
let TargetPrefix = "arm64" in {
let TargetPrefix = "aarch64" in {
def int_arm64_ldxr : Intrinsic<[llvm_i64_ty], [llvm_anyptr_ty]>;
def int_arm64_ldaxr : Intrinsic<[llvm_i64_ty], [llvm_anyptr_ty]>;
def int_arm64_stxr : Intrinsic<[llvm_i32_ty], [llvm_i64_ty, llvm_anyptr_ty]>;
def int_arm64_stlxr : Intrinsic<[llvm_i32_ty], [llvm_i64_ty, llvm_anyptr_ty]>;
def int_aarch64_ldxr : Intrinsic<[llvm_i64_ty], [llvm_anyptr_ty]>;
def int_aarch64_ldaxr : Intrinsic<[llvm_i64_ty], [llvm_anyptr_ty]>;
def int_aarch64_stxr : Intrinsic<[llvm_i32_ty], [llvm_i64_ty, llvm_anyptr_ty]>;
def int_aarch64_stlxr : Intrinsic<[llvm_i32_ty], [llvm_i64_ty, llvm_anyptr_ty]>;
def int_arm64_ldxp : Intrinsic<[llvm_i64_ty, llvm_i64_ty], [llvm_ptr_ty]>;
def int_arm64_ldaxp : Intrinsic<[llvm_i64_ty, llvm_i64_ty], [llvm_ptr_ty]>;
def int_arm64_stxp : Intrinsic<[llvm_i32_ty],
def int_aarch64_ldxp : Intrinsic<[llvm_i64_ty, llvm_i64_ty], [llvm_ptr_ty]>;
def int_aarch64_ldaxp : Intrinsic<[llvm_i64_ty, llvm_i64_ty], [llvm_ptr_ty]>;
def int_aarch64_stxp : Intrinsic<[llvm_i32_ty],
[llvm_i64_ty, llvm_i64_ty, llvm_ptr_ty]>;
def int_arm64_stlxp : Intrinsic<[llvm_i32_ty],
def int_aarch64_stlxp : Intrinsic<[llvm_i32_ty],
[llvm_i64_ty, llvm_i64_ty, llvm_ptr_ty]>;
def int_arm64_clrex : Intrinsic<[]>;
def int_aarch64_clrex : Intrinsic<[]>;
def int_arm64_sdiv : Intrinsic<[llvm_anyint_ty], [LLVMMatchType<0>,
def int_aarch64_sdiv : Intrinsic<[llvm_anyint_ty], [LLVMMatchType<0>,
LLVMMatchType<0>], [IntrNoMem]>;
def int_arm64_udiv : Intrinsic<[llvm_anyint_ty], [LLVMMatchType<0>,
def int_aarch64_udiv : Intrinsic<[llvm_anyint_ty], [LLVMMatchType<0>,
LLVMMatchType<0>], [IntrNoMem]>;
}
//===----------------------------------------------------------------------===//
// Advanced SIMD (NEON)
let TargetPrefix = "arm64" in { // All intrinsics start with "llvm.arm64.".
let TargetPrefix = "aarch64" in { // All intrinsics start with "llvm.aarch64.".
class AdvSIMD_2Scalar_Float_Intrinsic
: Intrinsic<[llvm_anyfloat_ty], [LLVMMatchType<0>, LLVMMatchType<0>],
[IntrNoMem]>;
@ -139,269 +139,269 @@ let TargetPrefix = "arm64" in { // All intrinsics start with "llvm.arm64.".
let Properties = [IntrNoMem] in {
// Vector Add Across Lanes
def int_arm64_neon_saddv : AdvSIMD_1VectorArg_Int_Across_Intrinsic;
def int_arm64_neon_uaddv : AdvSIMD_1VectorArg_Int_Across_Intrinsic;
def int_arm64_neon_faddv : AdvSIMD_1VectorArg_Float_Across_Intrinsic;
def int_aarch64_neon_saddv : AdvSIMD_1VectorArg_Int_Across_Intrinsic;
def int_aarch64_neon_uaddv : AdvSIMD_1VectorArg_Int_Across_Intrinsic;
def int_aarch64_neon_faddv : AdvSIMD_1VectorArg_Float_Across_Intrinsic;
// Vector Long Add Across Lanes
def int_arm64_neon_saddlv : AdvSIMD_1VectorArg_Int_Across_Intrinsic;
def int_arm64_neon_uaddlv : AdvSIMD_1VectorArg_Int_Across_Intrinsic;
def int_aarch64_neon_saddlv : AdvSIMD_1VectorArg_Int_Across_Intrinsic;
def int_aarch64_neon_uaddlv : AdvSIMD_1VectorArg_Int_Across_Intrinsic;
// Vector Halving Add
def int_arm64_neon_shadd : AdvSIMD_2VectorArg_Intrinsic;
def int_arm64_neon_uhadd : AdvSIMD_2VectorArg_Intrinsic;
def int_aarch64_neon_shadd : AdvSIMD_2VectorArg_Intrinsic;
def int_aarch64_neon_uhadd : AdvSIMD_2VectorArg_Intrinsic;
// Vector Rounding Halving Add
def int_arm64_neon_srhadd : AdvSIMD_2VectorArg_Intrinsic;
def int_arm64_neon_urhadd : AdvSIMD_2VectorArg_Intrinsic;
def int_aarch64_neon_srhadd : AdvSIMD_2VectorArg_Intrinsic;
def int_aarch64_neon_urhadd : AdvSIMD_2VectorArg_Intrinsic;
// Vector Saturating Add
def int_arm64_neon_sqadd : AdvSIMD_2IntArg_Intrinsic;
def int_arm64_neon_suqadd : AdvSIMD_2IntArg_Intrinsic;
def int_arm64_neon_usqadd : AdvSIMD_2IntArg_Intrinsic;
def int_arm64_neon_uqadd : AdvSIMD_2IntArg_Intrinsic;
def int_aarch64_neon_sqadd : AdvSIMD_2IntArg_Intrinsic;
def int_aarch64_neon_suqadd : AdvSIMD_2IntArg_Intrinsic;
def int_aarch64_neon_usqadd : AdvSIMD_2IntArg_Intrinsic;
def int_aarch64_neon_uqadd : AdvSIMD_2IntArg_Intrinsic;
// Vector Add High-Half
// FIXME: this is a legacy intrinsic for aarch64_simd.h. Remove it when that
// header is no longer supported.
def int_arm64_neon_addhn : AdvSIMD_2VectorArg_Narrow_Intrinsic;
def int_aarch64_neon_addhn : AdvSIMD_2VectorArg_Narrow_Intrinsic;
// Vector Rounding Add High-Half
def int_arm64_neon_raddhn : AdvSIMD_2VectorArg_Narrow_Intrinsic;
def int_aarch64_neon_raddhn : AdvSIMD_2VectorArg_Narrow_Intrinsic;
// Vector Saturating Doubling Multiply High
def int_arm64_neon_sqdmulh : AdvSIMD_2IntArg_Intrinsic;
def int_aarch64_neon_sqdmulh : AdvSIMD_2IntArg_Intrinsic;
// Vector Saturating Rounding Doubling Multiply High
def int_arm64_neon_sqrdmulh : AdvSIMD_2IntArg_Intrinsic;
def int_aarch64_neon_sqrdmulh : AdvSIMD_2IntArg_Intrinsic;
// Vector Polynominal Multiply
def int_arm64_neon_pmul : AdvSIMD_2VectorArg_Intrinsic;
def int_aarch64_neon_pmul : AdvSIMD_2VectorArg_Intrinsic;
// Vector Long Multiply
def int_arm64_neon_smull : AdvSIMD_2VectorArg_Long_Intrinsic;
def int_arm64_neon_umull : AdvSIMD_2VectorArg_Long_Intrinsic;
def int_arm64_neon_pmull : AdvSIMD_2VectorArg_Long_Intrinsic;
def int_aarch64_neon_smull : AdvSIMD_2VectorArg_Long_Intrinsic;
def int_aarch64_neon_umull : AdvSIMD_2VectorArg_Long_Intrinsic;
def int_aarch64_neon_pmull : AdvSIMD_2VectorArg_Long_Intrinsic;
// 64-bit polynomial multiply really returns an i128, which is not legal. Fake
// it with a v16i8.
def int_arm64_neon_pmull64 :
def int_aarch64_neon_pmull64 :
Intrinsic<[llvm_v16i8_ty], [llvm_i64_ty, llvm_i64_ty], [IntrNoMem]>;
// Vector Extending Multiply
def int_arm64_neon_fmulx : AdvSIMD_2FloatArg_Intrinsic {
def int_aarch64_neon_fmulx : AdvSIMD_2FloatArg_Intrinsic {
let Properties = [IntrNoMem, Commutative];
}
// Vector Saturating Doubling Long Multiply
def int_arm64_neon_sqdmull : AdvSIMD_2VectorArg_Long_Intrinsic;
def int_arm64_neon_sqdmulls_scalar
def int_aarch64_neon_sqdmull : AdvSIMD_2VectorArg_Long_Intrinsic;
def int_aarch64_neon_sqdmulls_scalar
: Intrinsic<[llvm_i64_ty], [llvm_i32_ty, llvm_i32_ty], [IntrNoMem]>;
// Vector Halving Subtract
def int_arm64_neon_shsub : AdvSIMD_2VectorArg_Intrinsic;
def int_arm64_neon_uhsub : AdvSIMD_2VectorArg_Intrinsic;
def int_aarch64_neon_shsub : AdvSIMD_2VectorArg_Intrinsic;
def int_aarch64_neon_uhsub : AdvSIMD_2VectorArg_Intrinsic;
// Vector Saturating Subtract
def int_arm64_neon_sqsub : AdvSIMD_2IntArg_Intrinsic;
def int_arm64_neon_uqsub : AdvSIMD_2IntArg_Intrinsic;
def int_aarch64_neon_sqsub : AdvSIMD_2IntArg_Intrinsic;
def int_aarch64_neon_uqsub : AdvSIMD_2IntArg_Intrinsic;
// Vector Subtract High-Half
// FIXME: this is a legacy intrinsic for aarch64_simd.h. Remove it when that
// header is no longer supported.
def int_arm64_neon_subhn : AdvSIMD_2VectorArg_Narrow_Intrinsic;
def int_aarch64_neon_subhn : AdvSIMD_2VectorArg_Narrow_Intrinsic;
// Vector Rounding Subtract High-Half
def int_arm64_neon_rsubhn : AdvSIMD_2VectorArg_Narrow_Intrinsic;
def int_aarch64_neon_rsubhn : AdvSIMD_2VectorArg_Narrow_Intrinsic;
// Vector Compare Absolute Greater-than-or-equal
def int_arm64_neon_facge : AdvSIMD_2Arg_FloatCompare_Intrinsic;
def int_aarch64_neon_facge : AdvSIMD_2Arg_FloatCompare_Intrinsic;
// Vector Compare Absolute Greater-than
def int_arm64_neon_facgt : AdvSIMD_2Arg_FloatCompare_Intrinsic;
def int_aarch64_neon_facgt : AdvSIMD_2Arg_FloatCompare_Intrinsic;
// Vector Absolute Difference
def int_arm64_neon_sabd : AdvSIMD_2VectorArg_Intrinsic;
def int_arm64_neon_uabd : AdvSIMD_2VectorArg_Intrinsic;
def int_arm64_neon_fabd : AdvSIMD_2VectorArg_Intrinsic;
def int_aarch64_neon_sabd : AdvSIMD_2VectorArg_Intrinsic;
def int_aarch64_neon_uabd : AdvSIMD_2VectorArg_Intrinsic;
def int_aarch64_neon_fabd : AdvSIMD_2VectorArg_Intrinsic;
// Scalar Absolute Difference
def int_arm64_sisd_fabd : AdvSIMD_2Scalar_Float_Intrinsic;
def int_aarch64_sisd_fabd : AdvSIMD_2Scalar_Float_Intrinsic;
// Vector Max
def int_arm64_neon_smax : AdvSIMD_2VectorArg_Intrinsic;
def int_arm64_neon_umax : AdvSIMD_2VectorArg_Intrinsic;
def int_arm64_neon_fmax : AdvSIMD_2VectorArg_Intrinsic;
def int_arm64_neon_fmaxnmp : AdvSIMD_2VectorArg_Intrinsic;
def int_aarch64_neon_smax : AdvSIMD_2VectorArg_Intrinsic;
def int_aarch64_neon_umax : AdvSIMD_2VectorArg_Intrinsic;
def int_aarch64_neon_fmax : AdvSIMD_2VectorArg_Intrinsic;
def int_aarch64_neon_fmaxnmp : AdvSIMD_2VectorArg_Intrinsic;
// Vector Max Across Lanes
def int_arm64_neon_smaxv : AdvSIMD_1VectorArg_Int_Across_Intrinsic;
def int_arm64_neon_umaxv : AdvSIMD_1VectorArg_Int_Across_Intrinsic;
def int_arm64_neon_fmaxv : AdvSIMD_1VectorArg_Float_Across_Intrinsic;
def int_arm64_neon_fmaxnmv : AdvSIMD_1VectorArg_Float_Across_Intrinsic;
def int_aarch64_neon_smaxv : AdvSIMD_1VectorArg_Int_Across_Intrinsic;
def int_aarch64_neon_umaxv : AdvSIMD_1VectorArg_Int_Across_Intrinsic;
def int_aarch64_neon_fmaxv : AdvSIMD_1VectorArg_Float_Across_Intrinsic;
def int_aarch64_neon_fmaxnmv : AdvSIMD_1VectorArg_Float_Across_Intrinsic;
// Vector Min
def int_arm64_neon_smin : AdvSIMD_2VectorArg_Intrinsic;
def int_arm64_neon_umin : AdvSIMD_2VectorArg_Intrinsic;
def int_arm64_neon_fmin : AdvSIMD_2VectorArg_Intrinsic;
def int_arm64_neon_fminnmp : AdvSIMD_2VectorArg_Intrinsic;
def int_aarch64_neon_smin : AdvSIMD_2VectorArg_Intrinsic;
def int_aarch64_neon_umin : AdvSIMD_2VectorArg_Intrinsic;
def int_aarch64_neon_fmin : AdvSIMD_2VectorArg_Intrinsic;
def int_aarch64_neon_fminnmp : AdvSIMD_2VectorArg_Intrinsic;
// Vector Min/Max Number
def int_arm64_neon_fminnm : AdvSIMD_2FloatArg_Intrinsic;
def int_arm64_neon_fmaxnm : AdvSIMD_2FloatArg_Intrinsic;
def int_aarch64_neon_fminnm : AdvSIMD_2FloatArg_Intrinsic;
def int_aarch64_neon_fmaxnm : AdvSIMD_2FloatArg_Intrinsic;
// Vector Min Across Lanes
def int_arm64_neon_sminv : AdvSIMD_1VectorArg_Int_Across_Intrinsic;
def int_arm64_neon_uminv : AdvSIMD_1VectorArg_Int_Across_Intrinsic;
def int_arm64_neon_fminv : AdvSIMD_1VectorArg_Float_Across_Intrinsic;
def int_arm64_neon_fminnmv : AdvSIMD_1VectorArg_Float_Across_Intrinsic;
def int_aarch64_neon_sminv : AdvSIMD_1VectorArg_Int_Across_Intrinsic;
def int_aarch64_neon_uminv : AdvSIMD_1VectorArg_Int_Across_Intrinsic;
def int_aarch64_neon_fminv : AdvSIMD_1VectorArg_Float_Across_Intrinsic;
def int_aarch64_neon_fminnmv : AdvSIMD_1VectorArg_Float_Across_Intrinsic;
// Pairwise Add
def int_arm64_neon_addp : AdvSIMD_2VectorArg_Intrinsic;
def int_aarch64_neon_addp : AdvSIMD_2VectorArg_Intrinsic;
// Long Pairwise Add
// FIXME: In theory, we shouldn't need intrinsics for saddlp or
// uaddlp, but tblgen's type inference currently can't handle the
// pattern fragments this ends up generating.
def int_arm64_neon_saddlp : AdvSIMD_1VectorArg_Expand_Intrinsic;
def int_arm64_neon_uaddlp : AdvSIMD_1VectorArg_Expand_Intrinsic;
def int_aarch64_neon_saddlp : AdvSIMD_1VectorArg_Expand_Intrinsic;
def int_aarch64_neon_uaddlp : AdvSIMD_1VectorArg_Expand_Intrinsic;
// Folding Maximum
def int_arm64_neon_smaxp : AdvSIMD_2VectorArg_Intrinsic;
def int_arm64_neon_umaxp : AdvSIMD_2VectorArg_Intrinsic;
def int_arm64_neon_fmaxp : AdvSIMD_2VectorArg_Intrinsic;
def int_aarch64_neon_smaxp : AdvSIMD_2VectorArg_Intrinsic;
def int_aarch64_neon_umaxp : AdvSIMD_2VectorArg_Intrinsic;
def int_aarch64_neon_fmaxp : AdvSIMD_2VectorArg_Intrinsic;
// Folding Minimum
def int_arm64_neon_sminp : AdvSIMD_2VectorArg_Intrinsic;
def int_arm64_neon_uminp : AdvSIMD_2VectorArg_Intrinsic;
def int_arm64_neon_fminp : AdvSIMD_2VectorArg_Intrinsic;
def int_aarch64_neon_sminp : AdvSIMD_2VectorArg_Intrinsic;
def int_aarch64_neon_uminp : AdvSIMD_2VectorArg_Intrinsic;
def int_aarch64_neon_fminp : AdvSIMD_2VectorArg_Intrinsic;
// Reciprocal Estimate/Step
def int_arm64_neon_frecps : AdvSIMD_2FloatArg_Intrinsic;
def int_arm64_neon_frsqrts : AdvSIMD_2FloatArg_Intrinsic;
def int_aarch64_neon_frecps : AdvSIMD_2FloatArg_Intrinsic;
def int_aarch64_neon_frsqrts : AdvSIMD_2FloatArg_Intrinsic;
// Reciprocal Exponent
def int_arm64_neon_frecpx : AdvSIMD_1FloatArg_Intrinsic;
def int_aarch64_neon_frecpx : AdvSIMD_1FloatArg_Intrinsic;
// Vector Saturating Shift Left
def int_arm64_neon_sqshl : AdvSIMD_2IntArg_Intrinsic;
def int_arm64_neon_uqshl : AdvSIMD_2IntArg_Intrinsic;
def int_aarch64_neon_sqshl : AdvSIMD_2IntArg_Intrinsic;
def int_aarch64_neon_uqshl : AdvSIMD_2IntArg_Intrinsic;
// Vector Rounding Shift Left
def int_arm64_neon_srshl : AdvSIMD_2IntArg_Intrinsic;
def int_arm64_neon_urshl : AdvSIMD_2IntArg_Intrinsic;
def int_aarch64_neon_srshl : AdvSIMD_2IntArg_Intrinsic;
def int_aarch64_neon_urshl : AdvSIMD_2IntArg_Intrinsic;
// Vector Saturating Rounding Shift Left
def int_arm64_neon_sqrshl : AdvSIMD_2IntArg_Intrinsic;
def int_arm64_neon_uqrshl : AdvSIMD_2IntArg_Intrinsic;
def int_aarch64_neon_sqrshl : AdvSIMD_2IntArg_Intrinsic;
def int_aarch64_neon_uqrshl : AdvSIMD_2IntArg_Intrinsic;
// Vector Signed->Unsigned Shift Left by Constant
def int_arm64_neon_sqshlu : AdvSIMD_2IntArg_Intrinsic;
def int_aarch64_neon_sqshlu : AdvSIMD_2IntArg_Intrinsic;
// Vector Signed->Unsigned Narrowing Saturating Shift Right by Constant
def int_arm64_neon_sqshrun : AdvSIMD_2Arg_Scalar_Narrow_Intrinsic;
def int_aarch64_neon_sqshrun : AdvSIMD_2Arg_Scalar_Narrow_Intrinsic;
// Vector Signed->Unsigned Rounding Narrowing Saturating Shift Right by Const
def int_arm64_neon_sqrshrun : AdvSIMD_2Arg_Scalar_Narrow_Intrinsic;
def int_aarch64_neon_sqrshrun : AdvSIMD_2Arg_Scalar_Narrow_Intrinsic;
// Vector Narrowing Shift Right by Constant
def int_arm64_neon_sqshrn : AdvSIMD_2Arg_Scalar_Narrow_Intrinsic;
def int_arm64_neon_uqshrn : AdvSIMD_2Arg_Scalar_Narrow_Intrinsic;
def int_aarch64_neon_sqshrn : AdvSIMD_2Arg_Scalar_Narrow_Intrinsic;
def int_aarch64_neon_uqshrn : AdvSIMD_2Arg_Scalar_Narrow_Intrinsic;
// Vector Rounding Narrowing Shift Right by Constant
def int_arm64_neon_rshrn : AdvSIMD_2Arg_Scalar_Narrow_Intrinsic;
def int_aarch64_neon_rshrn : AdvSIMD_2Arg_Scalar_Narrow_Intrinsic;
// Vector Rounding Narrowing Saturating Shift Right by Constant
def int_arm64_neon_sqrshrn : AdvSIMD_2Arg_Scalar_Narrow_Intrinsic;
def int_arm64_neon_uqrshrn : AdvSIMD_2Arg_Scalar_Narrow_Intrinsic;
def int_aarch64_neon_sqrshrn : AdvSIMD_2Arg_Scalar_Narrow_Intrinsic;
def int_aarch64_neon_uqrshrn : AdvSIMD_2Arg_Scalar_Narrow_Intrinsic;
// Vector Shift Left
def int_arm64_neon_sshl : AdvSIMD_2IntArg_Intrinsic;
def int_arm64_neon_ushl : AdvSIMD_2IntArg_Intrinsic;
def int_aarch64_neon_sshl : AdvSIMD_2IntArg_Intrinsic;
def int_aarch64_neon_ushl : AdvSIMD_2IntArg_Intrinsic;
// Vector Widening Shift Left by Constant
def int_arm64_neon_shll : AdvSIMD_2VectorArg_Scalar_Wide_BySize_Intrinsic;
def int_arm64_neon_sshll : AdvSIMD_2VectorArg_Scalar_Wide_Intrinsic;
def int_arm64_neon_ushll : AdvSIMD_2VectorArg_Scalar_Wide_Intrinsic;
def int_aarch64_neon_shll : AdvSIMD_2VectorArg_Scalar_Wide_BySize_Intrinsic;
def int_aarch64_neon_sshll : AdvSIMD_2VectorArg_Scalar_Wide_Intrinsic;
def int_aarch64_neon_ushll : AdvSIMD_2VectorArg_Scalar_Wide_Intrinsic;
// Vector Shift Right by Constant and Insert
def int_arm64_neon_vsri : AdvSIMD_3VectorArg_Scalar_Intrinsic;
def int_aarch64_neon_vsri : AdvSIMD_3VectorArg_Scalar_Intrinsic;
// Vector Shift Left by Constant and Insert
def int_arm64_neon_vsli : AdvSIMD_3VectorArg_Scalar_Intrinsic;
def int_aarch64_neon_vsli : AdvSIMD_3VectorArg_Scalar_Intrinsic;
// Vector Saturating Narrow
def int_arm64_neon_scalar_sqxtn: AdvSIMD_1IntArg_Narrow_Intrinsic;
def int_arm64_neon_scalar_uqxtn : AdvSIMD_1IntArg_Narrow_Intrinsic;
def int_arm64_neon_sqxtn : AdvSIMD_1VectorArg_Narrow_Intrinsic;
def int_arm64_neon_uqxtn : AdvSIMD_1VectorArg_Narrow_Intrinsic;
def int_aarch64_neon_scalar_sqxtn: AdvSIMD_1IntArg_Narrow_Intrinsic;
def int_aarch64_neon_scalar_uqxtn : AdvSIMD_1IntArg_Narrow_Intrinsic;
def int_aarch64_neon_sqxtn : AdvSIMD_1VectorArg_Narrow_Intrinsic;
def int_aarch64_neon_uqxtn : AdvSIMD_1VectorArg_Narrow_Intrinsic;
// Vector Saturating Extract and Unsigned Narrow
def int_arm64_neon_scalar_sqxtun : AdvSIMD_1IntArg_Narrow_Intrinsic;
def int_arm64_neon_sqxtun : AdvSIMD_1VectorArg_Narrow_Intrinsic;
def int_aarch64_neon_scalar_sqxtun : AdvSIMD_1IntArg_Narrow_Intrinsic;
def int_aarch64_neon_sqxtun : AdvSIMD_1VectorArg_Narrow_Intrinsic;
// Vector Absolute Value
def int_arm64_neon_abs : AdvSIMD_1IntArg_Intrinsic;
def int_aarch64_neon_abs : AdvSIMD_1IntArg_Intrinsic;
// Vector Saturating Absolute Value
def int_arm64_neon_sqabs : AdvSIMD_1IntArg_Intrinsic;
def int_aarch64_neon_sqabs : AdvSIMD_1IntArg_Intrinsic;
// Vector Saturating Negation
def int_arm64_neon_sqneg : AdvSIMD_1IntArg_Intrinsic;
def int_aarch64_neon_sqneg : AdvSIMD_1IntArg_Intrinsic;
// Vector Count Leading Sign Bits
def int_arm64_neon_cls : AdvSIMD_1VectorArg_Intrinsic;
def int_aarch64_neon_cls : AdvSIMD_1VectorArg_Intrinsic;
// Vector Reciprocal Estimate
def int_arm64_neon_urecpe : AdvSIMD_1VectorArg_Intrinsic;
def int_arm64_neon_frecpe : AdvSIMD_1FloatArg_Intrinsic;
def int_aarch64_neon_urecpe : AdvSIMD_1VectorArg_Intrinsic;
def int_aarch64_neon_frecpe : AdvSIMD_1FloatArg_Intrinsic;
// Vector Square Root Estimate
def int_arm64_neon_ursqrte : AdvSIMD_1VectorArg_Intrinsic;
def int_arm64_neon_frsqrte : AdvSIMD_1FloatArg_Intrinsic;
def int_aarch64_neon_ursqrte : AdvSIMD_1VectorArg_Intrinsic;
def int_aarch64_neon_frsqrte : AdvSIMD_1FloatArg_Intrinsic;
// Vector Bitwise Reverse
def int_arm64_neon_rbit : AdvSIMD_1VectorArg_Intrinsic;
def int_aarch64_neon_rbit : AdvSIMD_1VectorArg_Intrinsic;
// Vector Conversions Between Half-Precision and Single-Precision.
def int_arm64_neon_vcvtfp2hf
def int_aarch64_neon_vcvtfp2hf
: Intrinsic<[llvm_v4i16_ty], [llvm_v4f32_ty], [IntrNoMem]>;
def int_arm64_neon_vcvthf2fp
def int_aarch64_neon_vcvthf2fp
: Intrinsic<[llvm_v4f32_ty], [llvm_v4i16_ty], [IntrNoMem]>;
// Vector Conversions Between Floating-point and Fixed-point.
def int_arm64_neon_vcvtfp2fxs : AdvSIMD_CvtFPToFx_Intrinsic;
def int_arm64_neon_vcvtfp2fxu : AdvSIMD_CvtFPToFx_Intrinsic;
def int_arm64_neon_vcvtfxs2fp : AdvSIMD_CvtFxToFP_Intrinsic;
def int_arm64_neon_vcvtfxu2fp : AdvSIMD_CvtFxToFP_Intrinsic;
def int_aarch64_neon_vcvtfp2fxs : AdvSIMD_CvtFPToFx_Intrinsic;
def int_aarch64_neon_vcvtfp2fxu : AdvSIMD_CvtFPToFx_Intrinsic;
def int_aarch64_neon_vcvtfxs2fp : AdvSIMD_CvtFxToFP_Intrinsic;
def int_aarch64_neon_vcvtfxu2fp : AdvSIMD_CvtFxToFP_Intrinsic;
// Vector FP->Int Conversions
def int_arm64_neon_fcvtas : AdvSIMD_FPToIntRounding_Intrinsic;
def int_arm64_neon_fcvtau : AdvSIMD_FPToIntRounding_Intrinsic;
def int_arm64_neon_fcvtms : AdvSIMD_FPToIntRounding_Intrinsic;
def int_arm64_neon_fcvtmu : AdvSIMD_FPToIntRounding_Intrinsic;
def int_arm64_neon_fcvtns : AdvSIMD_FPToIntRounding_Intrinsic;
def int_arm64_neon_fcvtnu : AdvSIMD_FPToIntRounding_Intrinsic;
def int_arm64_neon_fcvtps : AdvSIMD_FPToIntRounding_Intrinsic;
def int_arm64_neon_fcvtpu : AdvSIMD_FPToIntRounding_Intrinsic;
def int_arm64_neon_fcvtzs : AdvSIMD_FPToIntRounding_Intrinsic;
def int_arm64_neon_fcvtzu : AdvSIMD_FPToIntRounding_Intrinsic;
def int_aarch64_neon_fcvtas : AdvSIMD_FPToIntRounding_Intrinsic;
def int_aarch64_neon_fcvtau : AdvSIMD_FPToIntRounding_Intrinsic;
def int_aarch64_neon_fcvtms : AdvSIMD_FPToIntRounding_Intrinsic;
def int_aarch64_neon_fcvtmu : AdvSIMD_FPToIntRounding_Intrinsic;
def int_aarch64_neon_fcvtns : AdvSIMD_FPToIntRounding_Intrinsic;
def int_aarch64_neon_fcvtnu : AdvSIMD_FPToIntRounding_Intrinsic;
def int_aarch64_neon_fcvtps : AdvSIMD_FPToIntRounding_Intrinsic;
def int_aarch64_neon_fcvtpu : AdvSIMD_FPToIntRounding_Intrinsic;
def int_aarch64_neon_fcvtzs : AdvSIMD_FPToIntRounding_Intrinsic;
def int_aarch64_neon_fcvtzu : AdvSIMD_FPToIntRounding_Intrinsic;
// Vector FP Rounding: only ties to even is unrepresented by a normal
// intrinsic.
def int_arm64_neon_frintn : AdvSIMD_1FloatArg_Intrinsic;
def int_aarch64_neon_frintn : AdvSIMD_1FloatArg_Intrinsic;
// Scalar FP->Int conversions
// Vector FP Inexact Narrowing
def int_arm64_neon_fcvtxn : AdvSIMD_1VectorArg_Expand_Intrinsic;
def int_aarch64_neon_fcvtxn : AdvSIMD_1VectorArg_Expand_Intrinsic;
// Scalar FP Inexact Narrowing
def int_arm64_sisd_fcvtxn : Intrinsic<[llvm_float_ty], [llvm_double_ty],
def int_aarch64_sisd_fcvtxn : Intrinsic<[llvm_float_ty], [llvm_double_ty],
[IntrNoMem]>;
}
let TargetPrefix = "arm64" in { // All intrinsics start with "llvm.arm64.".
let TargetPrefix = "aarch64" in { // All intrinsics start with "llvm.aarch64.".
class AdvSIMD_2Vector2Index_Intrinsic
: Intrinsic<[llvm_anyvector_ty],
[llvm_anyvector_ty, llvm_i64_ty, LLVMMatchType<0>, llvm_i64_ty],
@ -409,9 +409,9 @@ let TargetPrefix = "arm64" in { // All intrinsics start with "llvm.arm64.".
}
// Vector element to element moves
def int_arm64_neon_vcopy_lane: AdvSIMD_2Vector2Index_Intrinsic;
def int_aarch64_neon_vcopy_lane: AdvSIMD_2Vector2Index_Intrinsic;
let TargetPrefix = "arm64" in { // All intrinsics start with "llvm.arm64.".
let TargetPrefix = "aarch64" in { // All intrinsics start with "llvm.aarch64.".
class AdvSIMD_1Vec_Load_Intrinsic
: Intrinsic<[llvm_anyvector_ty], [LLVMAnyPointerType<LLVMMatchType<0>>],
[IntrReadArgMem]>;
@ -482,35 +482,35 @@ let TargetPrefix = "arm64" in { // All intrinsics start with "llvm.arm64.".
// Memory ops
def int_arm64_neon_ld1x2 : AdvSIMD_2Vec_Load_Intrinsic;
def int_arm64_neon_ld1x3 : AdvSIMD_3Vec_Load_Intrinsic;
def int_arm64_neon_ld1x4 : AdvSIMD_4Vec_Load_Intrinsic;
def int_aarch64_neon_ld1x2 : AdvSIMD_2Vec_Load_Intrinsic;
def int_aarch64_neon_ld1x3 : AdvSIMD_3Vec_Load_Intrinsic;
def int_aarch64_neon_ld1x4 : AdvSIMD_4Vec_Load_Intrinsic;
def int_arm64_neon_st1x2 : AdvSIMD_2Vec_Store_Intrinsic;
def int_arm64_neon_st1x3 : AdvSIMD_3Vec_Store_Intrinsic;
def int_arm64_neon_st1x4 : AdvSIMD_4Vec_Store_Intrinsic;
def int_aarch64_neon_st1x2 : AdvSIMD_2Vec_Store_Intrinsic;
def int_aarch64_neon_st1x3 : AdvSIMD_3Vec_Store_Intrinsic;
def int_aarch64_neon_st1x4 : AdvSIMD_4Vec_Store_Intrinsic;
def int_arm64_neon_ld2 : AdvSIMD_2Vec_Load_Intrinsic;
def int_arm64_neon_ld3 : AdvSIMD_3Vec_Load_Intrinsic;
def int_arm64_neon_ld4 : AdvSIMD_4Vec_Load_Intrinsic;
def int_aarch64_neon_ld2 : AdvSIMD_2Vec_Load_Intrinsic;
def int_aarch64_neon_ld3 : AdvSIMD_3Vec_Load_Intrinsic;
def int_aarch64_neon_ld4 : AdvSIMD_4Vec_Load_Intrinsic;
def int_arm64_neon_ld2lane : AdvSIMD_2Vec_Load_Lane_Intrinsic;
def int_arm64_neon_ld3lane : AdvSIMD_3Vec_Load_Lane_Intrinsic;
def int_arm64_neon_ld4lane : AdvSIMD_4Vec_Load_Lane_Intrinsic;
def int_aarch64_neon_ld2lane : AdvSIMD_2Vec_Load_Lane_Intrinsic;
def int_aarch64_neon_ld3lane : AdvSIMD_3Vec_Load_Lane_Intrinsic;
def int_aarch64_neon_ld4lane : AdvSIMD_4Vec_Load_Lane_Intrinsic;
def int_arm64_neon_ld2r : AdvSIMD_2Vec_Load_Intrinsic;
def int_arm64_neon_ld3r : AdvSIMD_3Vec_Load_Intrinsic;
def int_arm64_neon_ld4r : AdvSIMD_4Vec_Load_Intrinsic;
def int_aarch64_neon_ld2r : AdvSIMD_2Vec_Load_Intrinsic;
def int_aarch64_neon_ld3r : AdvSIMD_3Vec_Load_Intrinsic;
def int_aarch64_neon_ld4r : AdvSIMD_4Vec_Load_Intrinsic;
def int_arm64_neon_st2 : AdvSIMD_2Vec_Store_Intrinsic;
def int_arm64_neon_st3 : AdvSIMD_3Vec_Store_Intrinsic;
def int_arm64_neon_st4 : AdvSIMD_4Vec_Store_Intrinsic;
def int_aarch64_neon_st2 : AdvSIMD_2Vec_Store_Intrinsic;
def int_aarch64_neon_st3 : AdvSIMD_3Vec_Store_Intrinsic;
def int_aarch64_neon_st4 : AdvSIMD_4Vec_Store_Intrinsic;
def int_arm64_neon_st2lane : AdvSIMD_2Vec_Store_Lane_Intrinsic;
def int_arm64_neon_st3lane : AdvSIMD_3Vec_Store_Lane_Intrinsic;
def int_arm64_neon_st4lane : AdvSIMD_4Vec_Store_Lane_Intrinsic;
def int_aarch64_neon_st2lane : AdvSIMD_2Vec_Store_Lane_Intrinsic;
def int_aarch64_neon_st3lane : AdvSIMD_3Vec_Store_Lane_Intrinsic;
def int_aarch64_neon_st4lane : AdvSIMD_4Vec_Store_Lane_Intrinsic;
let TargetPrefix = "arm64" in { // All intrinsics start with "llvm.arm64.".
let TargetPrefix = "aarch64" in { // All intrinsics start with "llvm.aarch64.".
class AdvSIMD_Tbl1_Intrinsic
: Intrinsic<[llvm_anyvector_ty], [llvm_v16i8_ty, LLVMMatchType<0>],
[IntrNoMem]>;
@ -548,17 +548,17 @@ let TargetPrefix = "arm64" in { // All intrinsics start with "llvm.arm64.".
llvm_v16i8_ty, llvm_v16i8_ty, LLVMMatchType<0>],
[IntrNoMem]>;
}
def int_arm64_neon_tbl1 : AdvSIMD_Tbl1_Intrinsic;
def int_arm64_neon_tbl2 : AdvSIMD_Tbl2_Intrinsic;
def int_arm64_neon_tbl3 : AdvSIMD_Tbl3_Intrinsic;
def int_arm64_neon_tbl4 : AdvSIMD_Tbl4_Intrinsic;
def int_aarch64_neon_tbl1 : AdvSIMD_Tbl1_Intrinsic;
def int_aarch64_neon_tbl2 : AdvSIMD_Tbl2_Intrinsic;
def int_aarch64_neon_tbl3 : AdvSIMD_Tbl3_Intrinsic;
def int_aarch64_neon_tbl4 : AdvSIMD_Tbl4_Intrinsic;
def int_arm64_neon_tbx1 : AdvSIMD_Tbx1_Intrinsic;
def int_arm64_neon_tbx2 : AdvSIMD_Tbx2_Intrinsic;
def int_arm64_neon_tbx3 : AdvSIMD_Tbx3_Intrinsic;
def int_arm64_neon_tbx4 : AdvSIMD_Tbx4_Intrinsic;
def int_aarch64_neon_tbx1 : AdvSIMD_Tbx1_Intrinsic;
def int_aarch64_neon_tbx2 : AdvSIMD_Tbx2_Intrinsic;
def int_aarch64_neon_tbx3 : AdvSIMD_Tbx3_Intrinsic;
def int_aarch64_neon_tbx4 : AdvSIMD_Tbx4_Intrinsic;
let TargetPrefix = "arm64" in {
let TargetPrefix = "aarch64" in {
class Crypto_AES_DataKey_Intrinsic
: Intrinsic<[llvm_v16i8_ty], [llvm_v16i8_ty, llvm_v16i8_ty], [IntrNoMem]>;
@ -592,45 +592,45 @@ let TargetPrefix = "arm64" in {
}
// AES
def int_arm64_crypto_aese : Crypto_AES_DataKey_Intrinsic;
def int_arm64_crypto_aesd : Crypto_AES_DataKey_Intrinsic;
def int_arm64_crypto_aesmc : Crypto_AES_Data_Intrinsic;
def int_arm64_crypto_aesimc : Crypto_AES_Data_Intrinsic;
def int_aarch64_crypto_aese : Crypto_AES_DataKey_Intrinsic;
def int_aarch64_crypto_aesd : Crypto_AES_DataKey_Intrinsic;
def int_aarch64_crypto_aesmc : Crypto_AES_Data_Intrinsic;
def int_aarch64_crypto_aesimc : Crypto_AES_Data_Intrinsic;
// SHA1
def int_arm64_crypto_sha1c : Crypto_SHA_5Hash4Schedule_Intrinsic;
def int_arm64_crypto_sha1p : Crypto_SHA_5Hash4Schedule_Intrinsic;
def int_arm64_crypto_sha1m : Crypto_SHA_5Hash4Schedule_Intrinsic;
def int_arm64_crypto_sha1h : Crypto_SHA_1Hash_Intrinsic;
def int_aarch64_crypto_sha1c : Crypto_SHA_5Hash4Schedule_Intrinsic;
def int_aarch64_crypto_sha1p : Crypto_SHA_5Hash4Schedule_Intrinsic;
def int_aarch64_crypto_sha1m : Crypto_SHA_5Hash4Schedule_Intrinsic;
def int_aarch64_crypto_sha1h : Crypto_SHA_1Hash_Intrinsic;
def int_arm64_crypto_sha1su0 : Crypto_SHA_12Schedule_Intrinsic;
def int_arm64_crypto_sha1su1 : Crypto_SHA_8Schedule_Intrinsic;
def int_aarch64_crypto_sha1su0 : Crypto_SHA_12Schedule_Intrinsic;
def int_aarch64_crypto_sha1su1 : Crypto_SHA_8Schedule_Intrinsic;
// SHA256
def int_arm64_crypto_sha256h : Crypto_SHA_8Hash4Schedule_Intrinsic;
def int_arm64_crypto_sha256h2 : Crypto_SHA_8Hash4Schedule_Intrinsic;
def int_arm64_crypto_sha256su0 : Crypto_SHA_8Schedule_Intrinsic;
def int_arm64_crypto_sha256su1 : Crypto_SHA_12Schedule_Intrinsic;
def int_aarch64_crypto_sha256h : Crypto_SHA_8Hash4Schedule_Intrinsic;
def int_aarch64_crypto_sha256h2 : Crypto_SHA_8Hash4Schedule_Intrinsic;
def int_aarch64_crypto_sha256su0 : Crypto_SHA_8Schedule_Intrinsic;
def int_aarch64_crypto_sha256su1 : Crypto_SHA_12Schedule_Intrinsic;
//===----------------------------------------------------------------------===//
// CRC32
let TargetPrefix = "arm64" in {
let TargetPrefix = "aarch64" in {
def int_arm64_crc32b : Intrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty],
def int_aarch64_crc32b : Intrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty],
[IntrNoMem]>;
def int_arm64_crc32cb : Intrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty],
def int_aarch64_crc32cb : Intrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty],
[IntrNoMem]>;
def int_arm64_crc32h : Intrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty],
def int_aarch64_crc32h : Intrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty],
[IntrNoMem]>;
def int_arm64_crc32ch : Intrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty],
def int_aarch64_crc32ch : Intrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty],
[IntrNoMem]>;
def int_arm64_crc32w : Intrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty],
def int_aarch64_crc32w : Intrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty],
[IntrNoMem]>;
def int_arm64_crc32cw : Intrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty],
def int_aarch64_crc32cw : Intrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty],
[IntrNoMem]>;
def int_arm64_crc32x : Intrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i64_ty],
def int_aarch64_crc32x : Intrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i64_ty],
[IntrNoMem]>;
def int_arm64_crc32cx : Intrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i64_ty],
def int_aarch64_crc32cx : Intrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i64_ty],
[IntrNoMem]>;
}

View File

@ -168,8 +168,9 @@ void RuntimeDyldMachO::resolveRelocation(const RelocationEntry &RE,
case Triple::thumb:
resolveARMRelocation(RE, Value);
break;
case Triple::aarch64:
case Triple::arm64:
resolveARM64Relocation(RE, Value);
resolveAArch64Relocation(RE, Value);
break;
}
}
@ -289,8 +290,8 @@ bool RuntimeDyldMachO::resolveARMRelocation(const RelocationEntry &RE,
return false;
}
bool RuntimeDyldMachO::resolveARM64Relocation(const RelocationEntry &RE,
uint64_t Value) {
bool RuntimeDyldMachO::resolveAArch64Relocation(const RelocationEntry &RE,
uint64_t Value) {
const SectionEntry &Section = Sections[RE.SectionID];
uint8_t* LocalAddress = Section.Address + RE.Offset;

View File

@ -41,7 +41,7 @@ private:
bool resolveI386Relocation(const RelocationEntry &RE, uint64_t Value);
bool resolveX86_64Relocation(const RelocationEntry &RE, uint64_t Value);
bool resolveARMRelocation(const RelocationEntry &RE, uint64_t Value);
bool resolveARM64Relocation(const RelocationEntry &RE, uint64_t Value);
bool resolveAArch64Relocation(const RelocationEntry &RE, uint64_t Value);
// Populate stubs in __jump_table section.
void populateJumpTable(MachOObjectFile &Obj, const SectionRef &JTSection,

View File

@ -312,7 +312,8 @@ bool LTOCodeGenerator::determineTarget(std::string &errMsg) {
MCpu = "core2";
else if (Triple.getArch() == llvm::Triple::x86)
MCpu = "yonah";
else if (Triple.getArch() == llvm::Triple::arm64)
else if (Triple.getArch() == llvm::Triple::arm64 ||
Triple.getArch() == llvm::Triple::aarch64)
MCpu = "cyclone";
}

View File

@ -168,7 +168,8 @@ LTOModule *LTOModule::makeLTOModule(MemoryBuffer *buffer,
CPU = "core2";
else if (Triple.getArch() == llvm::Triple::x86)
CPU = "yonah";
else if (Triple.getArch() == llvm::Triple::arm64)
else if (Triple.getArch() == llvm::Triple::arm64 ||
Triple.getArch() == llvm::Triple::aarch64)
CPU = "cyclone";
}

View File

@ -23,7 +23,8 @@ void MCObjectFileInfo::InitMachOMCObjectFileInfo(Triple T) {
IsFunctionEHFrameSymbolPrivate = false;
SupportsWeakOmittedEHFrame = false;
if (T.isOSDarwin() && T.getArch() == Triple::arm64)
if (T.isOSDarwin() &&
(T.getArch() == Triple::arm64 || T.getArch() == Triple::aarch64))
SupportsCompactUnwindWithoutEHFrame = true;
PersonalityEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel
@ -151,7 +152,8 @@ void MCObjectFileInfo::InitMachOMCObjectFileInfo(Triple T) {
COFFDebugSymbolsSection = nullptr;
if ((T.isMacOSX() && !T.isMacOSXVersionLT(10, 6)) ||
(T.isOSDarwin() && T.getArch() == Triple::arm64)) {
(T.isOSDarwin() &&
(T.getArch() == Triple::arm64 || T.getArch() == Triple::aarch64))) {
CompactUnwindSection =
Ctx->getMachOSection("__LD", "__compact_unwind",
MachO::S_ATTR_DEBUG,
@ -159,7 +161,7 @@ void MCObjectFileInfo::InitMachOMCObjectFileInfo(Triple T) {
if (T.getArch() == Triple::x86_64 || T.getArch() == Triple::x86)
CompactUnwindDwarfEHFrameOnly = 0x04000000;
else if (T.getArch() == Triple::arm64)
else if (T.getArch() == Triple::arm64 || T.getArch() == Triple::aarch64)
CompactUnwindDwarfEHFrameOnly = 0x03000000;
}
@ -785,7 +787,7 @@ void MCObjectFileInfo::InitMCObjectFileInfo(StringRef TT, Reloc::Model relocm,
// cellspu-apple-darwin. Perhaps we should fix in Triple?
if ((Arch == Triple::x86 || Arch == Triple::x86_64 ||
Arch == Triple::arm || Arch == Triple::thumb ||
Arch == Triple::arm64 ||
Arch == Triple::arm64 || Arch == Triple::aarch64 ||
Arch == Triple::ppc || Arch == Triple::ppc64 ||
Arch == Triple::UnknownArch) &&
(T.isOSDarwin() || T.isOSBinFormatMachO())) {

View File

@ -0,0 +1,49 @@
//==-- AArch64.h - Top-level interface for AArch64 --------------*- C++ -*-==//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// This file contains the entry points for global functions defined in the LLVM
// AArch64 back-end.
//
//===----------------------------------------------------------------------===//
#ifndef TARGET_AArch64_H
#define TARGET_AArch64_H
#include "Utils/AArch64BaseInfo.h"
#include "MCTargetDesc/AArch64MCTargetDesc.h"
#include "llvm/Target/TargetMachine.h"
#include "llvm/Support/DataTypes.h"
namespace llvm {
class AArch64TargetMachine;
class FunctionPass;
class MachineFunctionPass;
FunctionPass *createAArch64DeadRegisterDefinitions();
FunctionPass *createAArch64ConditionalCompares();
FunctionPass *createAArch64AdvSIMDScalar();
FunctionPass *createAArch64BranchRelaxation();
FunctionPass *createAArch64ISelDag(AArch64TargetMachine &TM,
CodeGenOpt::Level OptLevel);
FunctionPass *createAArch64StorePairSuppressPass();
FunctionPass *createAArch64ExpandPseudoPass();
FunctionPass *createAArch64LoadStoreOptimizationPass();
ModulePass *createAArch64PromoteConstantPass();
FunctionPass *createAArch64AddressTypePromotionPass();
/// \brief Creates an ARM-specific Target Transformation Info pass.
ImmutablePass *
createAArch64TargetTransformInfoPass(const AArch64TargetMachine *TM);
FunctionPass *createAArch64CleanupLocalDynamicTLSPass();
FunctionPass *createAArch64CollectLOHPass();
} // end namespace llvm
#endif

View File

@ -1,4 +1,4 @@
//===- ARM64.td - Describe the ARM64 Target Machine --------*- tablegen -*-===//
//=- AArch64.td - Describe the AArch64 Target Machine --------*- tablegen -*-=//
//
// The LLVM Compiler Infrastructure
//
@ -17,7 +17,7 @@
include "llvm/Target/Target.td"
//===----------------------------------------------------------------------===//
// ARM64 Subtarget features.
// AArch64 Subtarget features.
//
def FeatureFPARMv8 : SubtargetFeature<"fp-armv8", "HasFPARMv8", "true",
@ -44,23 +44,23 @@ def FeatureZCZeroing : SubtargetFeature<"zcz", "HasZeroCycleZeroing", "true",
// Register File Description
//===----------------------------------------------------------------------===//
include "ARM64RegisterInfo.td"
include "ARM64CallingConvention.td"
include "AArch64RegisterInfo.td"
include "AArch64CallingConvention.td"
//===----------------------------------------------------------------------===//
// Instruction Descriptions
//===----------------------------------------------------------------------===//
include "ARM64Schedule.td"
include "ARM64InstrInfo.td"
include "AArch64Schedule.td"
include "AArch64InstrInfo.td"
def ARM64InstrInfo : InstrInfo;
def AArch64InstrInfo : InstrInfo;
//===----------------------------------------------------------------------===//
// ARM64 Processors supported.
// AArch64 Processors supported.
//
include "ARM64SchedA53.td"
include "ARM64SchedCyclone.td"
include "AArch64SchedA53.td"
include "AArch64SchedCyclone.td"
def ProcA53 : SubtargetFeature<"a53", "ARMProcFamily", "CortexA53",
"Cortex-A53 ARM processors",
@ -109,7 +109,7 @@ def AppleAsmParserVariant : AsmParserVariant {
//===----------------------------------------------------------------------===//
// Assembly printer
//===----------------------------------------------------------------------===//
// ARM64 Uses the MC printer for asm output, so make sure the TableGen
// AArch64 Uses the MC printer for asm output, so make sure the TableGen
// AsmWriter bits get associated with the correct class.
def GenericAsmWriter : AsmWriter {
string AsmWriterClassName = "InstPrinter";
@ -127,8 +127,8 @@ def AppleAsmWriter : AsmWriter {
// Target Declaration
//===----------------------------------------------------------------------===//
def ARM64 : Target {
let InstructionSet = ARM64InstrInfo;
def AArch64 : Target {
let InstructionSet = AArch64InstrInfo;
let AssemblyParserVariants = [GenericAsmParserVariant, AppleAsmParserVariant];
let AssemblyWriters = [GenericAsmWriter, AppleAsmWriter];
}

View File

@ -1,5 +1,4 @@
//===-- ARM64AddressTypePromotion.cpp --- Promote type for addr accesses -===//
//===-- AArch64AddressTypePromotion.cpp --- Promote type for addr accesses -==//
//
// The LLVM Compiler Infrastructure
//
@ -29,7 +28,7 @@
// FIXME: This pass may be useful for other targets too.
// ===---------------------------------------------------------------------===//
#include "ARM64.h"
#include "AArch64.h"
#include "llvm/ADT/DenseMap.h"
#include "llvm/ADT/SmallPtrSet.h"
#include "llvm/ADT/SmallVector.h"
@ -45,38 +44,38 @@
using namespace llvm;
#define DEBUG_TYPE "arm64-type-promotion"
#define DEBUG_TYPE "aarch64-type-promotion"
static cl::opt<bool>
EnableAddressTypePromotion("arm64-type-promotion", cl::Hidden,
EnableAddressTypePromotion("aarch64-type-promotion", cl::Hidden,
cl::desc("Enable the type promotion pass"),
cl::init(true));
static cl::opt<bool>
EnableMerge("arm64-type-promotion-merge", cl::Hidden,
EnableMerge("aarch64-type-promotion-merge", cl::Hidden,
cl::desc("Enable merging of redundant sexts when one is dominating"
" the other."),
cl::init(true));
//===----------------------------------------------------------------------===//
// ARM64AddressTypePromotion
// AArch64AddressTypePromotion
//===----------------------------------------------------------------------===//
namespace llvm {
void initializeARM64AddressTypePromotionPass(PassRegistry &);
void initializeAArch64AddressTypePromotionPass(PassRegistry &);
}
namespace {
class ARM64AddressTypePromotion : public FunctionPass {
class AArch64AddressTypePromotion : public FunctionPass {
public:
static char ID;
ARM64AddressTypePromotion()
AArch64AddressTypePromotion()
: FunctionPass(ID), Func(nullptr), ConsideredSExtType(nullptr) {
initializeARM64AddressTypePromotionPass(*PassRegistry::getPassRegistry());
initializeAArch64AddressTypePromotionPass(*PassRegistry::getPassRegistry());
}
const char *getPassName() const override {
return "ARM64 Address Type Promotion";
return "AArch64 Address Type Promotion";
}
/// Iterate over the functions and promote the computation of interesting
@ -140,19 +139,19 @@ private:
};
} // end anonymous namespace.
char ARM64AddressTypePromotion::ID = 0;
char AArch64AddressTypePromotion::ID = 0;
INITIALIZE_PASS_BEGIN(ARM64AddressTypePromotion, "arm64-type-promotion",
"ARM64 Type Promotion Pass", false, false)
INITIALIZE_PASS_BEGIN(AArch64AddressTypePromotion, "aarch64-type-promotion",
"AArch64 Type Promotion Pass", false, false)
INITIALIZE_PASS_DEPENDENCY(DominatorTreeWrapperPass)
INITIALIZE_PASS_END(ARM64AddressTypePromotion, "arm64-type-promotion",
"ARM64 Type Promotion Pass", false, false)
INITIALIZE_PASS_END(AArch64AddressTypePromotion, "aarch64-type-promotion",
"AArch64 Type Promotion Pass", false, false)
FunctionPass *llvm::createARM64AddressTypePromotionPass() {
return new ARM64AddressTypePromotion();
FunctionPass *llvm::createAArch64AddressTypePromotionPass() {
return new AArch64AddressTypePromotion();
}
bool ARM64AddressTypePromotion::canGetThrough(const Instruction *Inst) {
bool AArch64AddressTypePromotion::canGetThrough(const Instruction *Inst) {
if (isa<SExtInst>(Inst))
return true;
@ -175,7 +174,7 @@ bool ARM64AddressTypePromotion::canGetThrough(const Instruction *Inst) {
return false;
}
bool ARM64AddressTypePromotion::shouldGetThrough(const Instruction *Inst) {
bool AArch64AddressTypePromotion::shouldGetThrough(const Instruction *Inst) {
// If the type of the sext is the same as the considered one, this sext
// will become useless.
// Otherwise, we will have to do something to preserve the original value,
@ -211,7 +210,7 @@ static bool shouldSExtOperand(const Instruction *Inst, int OpIdx) {
}
bool
ARM64AddressTypePromotion::shouldConsiderSExt(const Instruction *SExt) const {
AArch64AddressTypePromotion::shouldConsiderSExt(const Instruction *SExt) const {
if (SExt->getType() != ConsideredSExtType)
return false;
@ -249,7 +248,7 @@ ARM64AddressTypePromotion::shouldConsiderSExt(const Instruction *SExt) const {
// = a
// Iterate on 'c'.
bool
ARM64AddressTypePromotion::propagateSignExtension(Instructions &SExtInsts) {
AArch64AddressTypePromotion::propagateSignExtension(Instructions &SExtInsts) {
DEBUG(dbgs() << "*** Propagate Sign Extension ***\n");
bool LocalChange = false;
@ -375,8 +374,8 @@ ARM64AddressTypePromotion::propagateSignExtension(Instructions &SExtInsts) {
return LocalChange;
}
void ARM64AddressTypePromotion::mergeSExts(ValueToInsts &ValToSExtendedUses,
SetOfInstructions &ToRemove) {
void AArch64AddressTypePromotion::mergeSExts(ValueToInsts &ValToSExtendedUses,
SetOfInstructions &ToRemove) {
DominatorTree &DT = getAnalysis<DominatorTreeWrapperPass>().getDomTree();
for (auto &Entry : ValToSExtendedUses) {
@ -414,7 +413,7 @@ void ARM64AddressTypePromotion::mergeSExts(ValueToInsts &ValToSExtendedUses,
}
}
void ARM64AddressTypePromotion::analyzeSExtension(Instructions &SExtInsts) {
void AArch64AddressTypePromotion::analyzeSExtension(Instructions &SExtInsts) {
DEBUG(dbgs() << "*** Analyze Sign Extensions ***\n");
DenseMap<Value *, Instruction *> SeenChains;
@ -479,7 +478,7 @@ void ARM64AddressTypePromotion::analyzeSExtension(Instructions &SExtInsts) {
}
}
bool ARM64AddressTypePromotion::runOnFunction(Function &F) {
bool AArch64AddressTypePromotion::runOnFunction(Function &F) {
if (!EnableAddressTypePromotion || F.isDeclaration())
return false;
Func = &F;

View File

@ -1,4 +1,4 @@
//===-- ARM64AdvSIMDScalar.cpp - Replace dead defs w/ zero reg --===//
//===-- AArch64AdvSIMDScalar.cpp - Replace dead defs w/ zero reg --===//
//
// The LLVM Compiler Infrastructure
//
@ -33,9 +33,9 @@
// solution.
//===----------------------------------------------------------------------===//
#include "ARM64.h"
#include "ARM64InstrInfo.h"
#include "ARM64RegisterInfo.h"
#include "AArch64.h"
#include "AArch64InstrInfo.h"
#include "AArch64RegisterInfo.h"
#include "llvm/ADT/Statistic.h"
#include "llvm/CodeGen/MachineFunctionPass.h"
#include "llvm/CodeGen/MachineFunction.h"
@ -47,12 +47,12 @@
#include "llvm/Support/raw_ostream.h"
using namespace llvm;
#define DEBUG_TYPE "arm64-simd-scalar"
#define DEBUG_TYPE "aarch64-simd-scalar"
// Allow forcing all i64 operations with equivalent SIMD instructions to use
// them. For stress-testing the transformation function.
static cl::opt<bool>
TransformAll("arm64-simd-scalar-force-all",
TransformAll("aarch64-simd-scalar-force-all",
cl::desc("Force use of AdvSIMD scalar instructions everywhere"),
cl::init(false), cl::Hidden);
@ -61,9 +61,9 @@ STATISTIC(NumCopiesDeleted, "Number of cross-class copies deleted");
STATISTIC(NumCopiesInserted, "Number of cross-class copies inserted");
namespace {
class ARM64AdvSIMDScalar : public MachineFunctionPass {
class AArch64AdvSIMDScalar : public MachineFunctionPass {
MachineRegisterInfo *MRI;
const ARM64InstrInfo *TII;
const AArch64InstrInfo *TII;
private:
// isProfitableToTransform - Predicate function to determine whether an
@ -81,7 +81,7 @@ private:
public:
static char ID; // Pass identification, replacement for typeid.
explicit ARM64AdvSIMDScalar() : MachineFunctionPass(ID) {}
explicit AArch64AdvSIMDScalar() : MachineFunctionPass(ID) {}
bool runOnMachineFunction(MachineFunction &F) override;
@ -94,7 +94,7 @@ public:
MachineFunctionPass::getAnalysisUsage(AU);
}
};
char ARM64AdvSIMDScalar::ID = 0;
char AArch64AdvSIMDScalar::ID = 0;
} // end anonymous namespace
static bool isGPR64(unsigned Reg, unsigned SubReg,
@ -102,20 +102,20 @@ static bool isGPR64(unsigned Reg, unsigned SubReg,
if (SubReg)
return false;
if (TargetRegisterInfo::isVirtualRegister(Reg))
return MRI->getRegClass(Reg)->hasSuperClassEq(&ARM64::GPR64RegClass);
return ARM64::GPR64RegClass.contains(Reg);
return MRI->getRegClass(Reg)->hasSuperClassEq(&AArch64::GPR64RegClass);
return AArch64::GPR64RegClass.contains(Reg);
}
static bool isFPR64(unsigned Reg, unsigned SubReg,
const MachineRegisterInfo *MRI) {
if (TargetRegisterInfo::isVirtualRegister(Reg))
return (MRI->getRegClass(Reg)->hasSuperClassEq(&ARM64::FPR64RegClass) &&
return (MRI->getRegClass(Reg)->hasSuperClassEq(&AArch64::FPR64RegClass) &&
SubReg == 0) ||
(MRI->getRegClass(Reg)->hasSuperClassEq(&ARM64::FPR128RegClass) &&
SubReg == ARM64::dsub);
(MRI->getRegClass(Reg)->hasSuperClassEq(&AArch64::FPR128RegClass) &&
SubReg == AArch64::dsub);
// Physical register references just check the register class directly.
return (ARM64::FPR64RegClass.contains(Reg) && SubReg == 0) ||
(ARM64::FPR128RegClass.contains(Reg) && SubReg == ARM64::dsub);
return (AArch64::FPR64RegClass.contains(Reg) && SubReg == 0) ||
(AArch64::FPR128RegClass.contains(Reg) && SubReg == AArch64::dsub);
}
// getSrcFromCopy - Get the original source register for a GPR64 <--> FPR64
@ -125,17 +125,18 @@ static unsigned getSrcFromCopy(const MachineInstr *MI,
unsigned &SubReg) {
SubReg = 0;
// The "FMOV Xd, Dn" instruction is the typical form.
if (MI->getOpcode() == ARM64::FMOVDXr || MI->getOpcode() == ARM64::FMOVXDr)
if (MI->getOpcode() == AArch64::FMOVDXr ||
MI->getOpcode() == AArch64::FMOVXDr)
return MI->getOperand(1).getReg();
// A lane zero extract "UMOV.d Xd, Vn[0]" is equivalent. We shouldn't see
// these at this stage, but it's easy to check for.
if (MI->getOpcode() == ARM64::UMOVvi64 && MI->getOperand(2).getImm() == 0) {
SubReg = ARM64::dsub;
if (MI->getOpcode() == AArch64::UMOVvi64 && MI->getOperand(2).getImm() == 0) {
SubReg = AArch64::dsub;
return MI->getOperand(1).getReg();
}
// Or just a plain COPY instruction. This can be directly to/from FPR64,
// or it can be a dsub subreg reference to an FPR128.
if (MI->getOpcode() == ARM64::COPY) {
if (MI->getOpcode() == AArch64::COPY) {
if (isFPR64(MI->getOperand(0).getReg(), MI->getOperand(0).getSubReg(),
MRI) &&
isGPR64(MI->getOperand(1).getReg(), MI->getOperand(1).getSubReg(), MRI))
@ -161,10 +162,10 @@ static int getTransformOpcode(unsigned Opc) {
default:
break;
// FIXME: Lots more possibilities.
case ARM64::ADDXrr:
return ARM64::ADDv1i64;
case ARM64::SUBXrr:
return ARM64::SUBv1i64;
case AArch64::ADDXrr:
return AArch64::ADDv1i64;
case AArch64::SUBXrr:
return AArch64::SUBv1i64;
}
// No AdvSIMD equivalent, so just return the original opcode.
return Opc;
@ -178,7 +179,8 @@ static bool isTransformable(const MachineInstr *MI) {
// isProfitableToTransform - Predicate function to determine whether an
// instruction should be transformed to its equivalent AdvSIMD scalar
// instruction. "add Xd, Xn, Xm" ==> "add Dd, Da, Db", for example.
bool ARM64AdvSIMDScalar::isProfitableToTransform(const MachineInstr *MI) const {
bool
AArch64AdvSIMDScalar::isProfitableToTransform(const MachineInstr *MI) const {
// If this instruction isn't eligible to be transformed (no SIMD equivalent),
// early exit since that's the common case.
if (!isTransformable(MI))
@ -238,8 +240,8 @@ bool ARM64AdvSIMDScalar::isProfitableToTransform(const MachineInstr *MI) const {
// preferable to have it use the FPR64 in most cases, as if the source
// vector is an IMPLICIT_DEF, the INSERT_SUBREG just goes away entirely.
// Ditto for a lane insert.
else if (Use->getOpcode() == ARM64::INSERT_SUBREG ||
Use->getOpcode() == ARM64::INSvi64gpr)
else if (Use->getOpcode() == AArch64::INSERT_SUBREG ||
Use->getOpcode() == AArch64::INSvi64gpr)
;
else
AllUsesAreCopies = false;
@ -259,10 +261,10 @@ bool ARM64AdvSIMDScalar::isProfitableToTransform(const MachineInstr *MI) const {
return TransformAll;
}
static MachineInstr *insertCopy(const ARM64InstrInfo *TII, MachineInstr *MI,
static MachineInstr *insertCopy(const AArch64InstrInfo *TII, MachineInstr *MI,
unsigned Dst, unsigned Src, bool IsKill) {
MachineInstrBuilder MIB =
BuildMI(*MI->getParent(), MI, MI->getDebugLoc(), TII->get(ARM64::COPY),
BuildMI(*MI->getParent(), MI, MI->getDebugLoc(), TII->get(AArch64::COPY),
Dst)
.addReg(Src, getKillRegState(IsKill));
DEBUG(dbgs() << " adding copy: " << *MIB);
@ -273,7 +275,7 @@ static MachineInstr *insertCopy(const ARM64InstrInfo *TII, MachineInstr *MI,
// transformInstruction - Perform the transformation of an instruction
// to its equivalant AdvSIMD scalar instruction. Update inputs and outputs
// to be the correct register class, minimizing cross-class copies.
void ARM64AdvSIMDScalar::transformInstruction(MachineInstr *MI) {
void AArch64AdvSIMDScalar::transformInstruction(MachineInstr *MI) {
DEBUG(dbgs() << "Scalar transform: " << *MI);
MachineBasicBlock *MBB = MI->getParent();
@ -316,19 +318,19 @@ void ARM64AdvSIMDScalar::transformInstruction(MachineInstr *MI) {
// copy.
if (!Src0) {
SubReg0 = 0;
Src0 = MRI->createVirtualRegister(&ARM64::FPR64RegClass);
Src0 = MRI->createVirtualRegister(&AArch64::FPR64RegClass);
insertCopy(TII, MI, Src0, OrigSrc0, true);
}
if (!Src1) {
SubReg1 = 0;
Src1 = MRI->createVirtualRegister(&ARM64::FPR64RegClass);
Src1 = MRI->createVirtualRegister(&AArch64::FPR64RegClass);
insertCopy(TII, MI, Src1, OrigSrc1, true);
}
// Create a vreg for the destination.
// FIXME: No need to do this if the ultimate user expects an FPR64.
// Check for that and avoid the copy if possible.
unsigned Dst = MRI->createVirtualRegister(&ARM64::FPR64RegClass);
unsigned Dst = MRI->createVirtualRegister(&AArch64::FPR64RegClass);
// For now, all of the new instructions have the same simple three-register
// form, so no need to special case based on what instruction we're
@ -349,7 +351,7 @@ void ARM64AdvSIMDScalar::transformInstruction(MachineInstr *MI) {
}
// processMachineBasicBlock - Main optimzation loop.
bool ARM64AdvSIMDScalar::processMachineBasicBlock(MachineBasicBlock *MBB) {
bool AArch64AdvSIMDScalar::processMachineBasicBlock(MachineBasicBlock *MBB) {
bool Changed = false;
for (MachineBasicBlock::iterator I = MBB->begin(), E = MBB->end(); I != E;) {
MachineInstr *MI = I;
@ -363,13 +365,13 @@ bool ARM64AdvSIMDScalar::processMachineBasicBlock(MachineBasicBlock *MBB) {
}
// runOnMachineFunction - Pass entry point from PassManager.
bool ARM64AdvSIMDScalar::runOnMachineFunction(MachineFunction &mf) {
bool AArch64AdvSIMDScalar::runOnMachineFunction(MachineFunction &mf) {
bool Changed = false;
DEBUG(dbgs() << "***** ARM64AdvSIMDScalar *****\n");
DEBUG(dbgs() << "***** AArch64AdvSIMDScalar *****\n");
const TargetMachine &TM = mf.getTarget();
MRI = &mf.getRegInfo();
TII = static_cast<const ARM64InstrInfo *>(TM.getInstrInfo());
TII = static_cast<const AArch64InstrInfo *>(TM.getInstrInfo());
// Just check things on a one-block-at-a-time basis.
for (MachineFunction::iterator I = mf.begin(), E = mf.end(); I != E; ++I)
@ -378,8 +380,8 @@ bool ARM64AdvSIMDScalar::runOnMachineFunction(MachineFunction &mf) {
return Changed;
}
// createARM64AdvSIMDScalar - Factory function used by ARM64TargetMachine
// createAArch64AdvSIMDScalar - Factory function used by AArch64TargetMachine
// to add the pass to the PassManager.
FunctionPass *llvm::createARM64AdvSIMDScalar() {
return new ARM64AdvSIMDScalar();
FunctionPass *llvm::createAArch64AdvSIMDScalar() {
return new AArch64AdvSIMDScalar();
}

View File

@ -1,4 +1,4 @@
//===-- ARM64AsmPrinter.cpp - ARM64 LLVM assembly writer ------------------===//
//===-- AArch64AsmPrinter.cpp - AArch64 LLVM assembly writer --------------===//
//
// The LLVM Compiler Infrastructure
//
@ -8,16 +8,16 @@
//===----------------------------------------------------------------------===//
//
// This file contains a printer that converts from our internal representation
// of machine-dependent LLVM code to the ARM64 assembly language.
// of machine-dependent LLVM code to the AArch64 assembly language.
//
//===----------------------------------------------------------------------===//
#include "ARM64.h"
#include "ARM64MachineFunctionInfo.h"
#include "ARM64MCInstLower.h"
#include "ARM64RegisterInfo.h"
#include "ARM64Subtarget.h"
#include "InstPrinter/ARM64InstPrinter.h"
#include "AArch64.h"
#include "AArch64MachineFunctionInfo.h"
#include "AArch64MCInstLower.h"
#include "AArch64RegisterInfo.h"
#include "AArch64Subtarget.h"
#include "InstPrinter/AArch64InstPrinter.h"
#include "llvm/ADT/SmallString.h"
#include "llvm/ADT/StringSwitch.h"
#include "llvm/ADT/Twine.h"
@ -42,21 +42,24 @@ using namespace llvm;
namespace {
class ARM64AsmPrinter : public AsmPrinter {
/// Subtarget - Keep a pointer to the ARM64Subtarget around so that we can
class AArch64AsmPrinter : public AsmPrinter {
/// Subtarget - Keep a pointer to the AArch64Subtarget around so that we can
/// make the right decision when printing asm code for different targets.
const ARM64Subtarget *Subtarget;
const AArch64Subtarget *Subtarget;
ARM64MCInstLower MCInstLowering;
AArch64MCInstLower MCInstLowering;
StackMaps SM;
public:
ARM64AsmPrinter(TargetMachine &TM, MCStreamer &Streamer)
: AsmPrinter(TM, Streamer), Subtarget(&TM.getSubtarget<ARM64Subtarget>()),
MCInstLowering(OutContext, *Mang, *this), SM(*this), ARM64FI(nullptr),
AArch64AsmPrinter(TargetMachine &TM, MCStreamer &Streamer)
: AsmPrinter(TM, Streamer),
Subtarget(&TM.getSubtarget<AArch64Subtarget>()),
MCInstLowering(OutContext, *Mang, *this), SM(*this), AArch64FI(nullptr),
LOHLabelCounter(0) {}
const char *getPassName() const override { return "ARM64 Assembly Printer"; }
const char *getPassName() const override {
return "AArch64 Assembly Printer";
}
/// \brief Wrapper for MCInstLowering.lowerOperand() for the
/// tblgen'erated pseudo lowering.
@ -81,7 +84,7 @@ public:
}
bool runOnMachineFunction(MachineFunction &F) override {
ARM64FI = F.getInfo<ARM64FunctionInfo>();
AArch64FI = F.getInfo<AArch64FunctionInfo>();
return AsmPrinter::runOnMachineFunction(F);
}
@ -106,9 +109,9 @@ private:
MCSymbol *GetCPISymbol(unsigned CPID) const override;
void EmitEndOfAsmFile(Module &M) override;
ARM64FunctionInfo *ARM64FI;
AArch64FunctionInfo *AArch64FI;
/// \brief Emit the LOHs contained in ARM64FI.
/// \brief Emit the LOHs contained in AArch64FI.
void EmitLOHs();
typedef std::map<const MachineInstr *, MCSymbol *> MInstToMCSymbol;
@ -120,7 +123,7 @@ private:
//===----------------------------------------------------------------------===//
void ARM64AsmPrinter::EmitEndOfAsmFile(Module &M) {
void AArch64AsmPrinter::EmitEndOfAsmFile(Module &M) {
if (Subtarget->isTargetMachO()) {
// Funny Darwin hack: This flag tells the linker that no global symbols
// contain code that falls through to other global symbols (e.g. the obvious
@ -156,7 +159,7 @@ void ARM64AsmPrinter::EmitEndOfAsmFile(Module &M) {
}
MachineLocation
ARM64AsmPrinter::getDebugValueLocation(const MachineInstr *MI) const {
AArch64AsmPrinter::getDebugValueLocation(const MachineInstr *MI) const {
MachineLocation Location;
assert(MI->getNumOperands() == 4 && "Invalid no. of machine operands!");
// Frame address. Currently handles register +- offset only.
@ -168,10 +171,10 @@ ARM64AsmPrinter::getDebugValueLocation(const MachineInstr *MI) const {
return Location;
}
void ARM64AsmPrinter::EmitLOHs() {
void AArch64AsmPrinter::EmitLOHs() {
SmallVector<MCSymbol *, 3> MCArgs;
for (const auto &D : ARM64FI->getLOHContainer()) {
for (const auto &D : AArch64FI->getLOHContainer()) {
for (const MachineInstr *MI : D.getArgs()) {
MInstToMCSymbol::iterator LabelIt = LOHInstToLabel.find(MI);
assert(LabelIt != LOHInstToLabel.end() &&
@ -183,13 +186,13 @@ void ARM64AsmPrinter::EmitLOHs() {
}
}
void ARM64AsmPrinter::EmitFunctionBodyEnd() {
if (!ARM64FI->getLOHRelated().empty())
void AArch64AsmPrinter::EmitFunctionBodyEnd() {
if (!AArch64FI->getLOHRelated().empty())
EmitLOHs();
}
/// GetCPISymbol - Return the symbol for the specified constant pool entry.
MCSymbol *ARM64AsmPrinter::GetCPISymbol(unsigned CPID) const {
MCSymbol *AArch64AsmPrinter::GetCPISymbol(unsigned CPID) const {
// Darwin uses a linker-private symbol name for constant-pools (to
// avoid addends on the relocation?), ELF has no such concept and
// uses a normal private symbol.
@ -203,8 +206,8 @@ MCSymbol *ARM64AsmPrinter::GetCPISymbol(unsigned CPID) const {
Twine(getFunctionNumber()) + "_" + Twine(CPID));
}
void ARM64AsmPrinter::printOperand(const MachineInstr *MI, unsigned OpNum,
raw_ostream &O) {
void AArch64AsmPrinter::printOperand(const MachineInstr *MI, unsigned OpNum,
raw_ostream &O) {
const MachineOperand &MO = MI->getOperand(OpNum);
switch (MO.getType()) {
default:
@ -213,7 +216,7 @@ void ARM64AsmPrinter::printOperand(const MachineInstr *MI, unsigned OpNum,
unsigned Reg = MO.getReg();
assert(TargetRegisterInfo::isPhysicalRegister(Reg));
assert(!MO.getSubReg() && "Subregs should be eliminated!");
O << ARM64InstPrinter::getRegisterName(Reg);
O << AArch64InstPrinter::getRegisterName(Reg);
break;
}
case MachineOperand::MO_Immediate: {
@ -224,8 +227,8 @@ void ARM64AsmPrinter::printOperand(const MachineInstr *MI, unsigned OpNum,
}
}
bool ARM64AsmPrinter::printAsmMRegister(const MachineOperand &MO, char Mode,
raw_ostream &O) {
bool AArch64AsmPrinter::printAsmMRegister(const MachineOperand &MO, char Mode,
raw_ostream &O) {
unsigned Reg = MO.getReg();
switch (Mode) {
default:
@ -238,30 +241,30 @@ bool ARM64AsmPrinter::printAsmMRegister(const MachineOperand &MO, char Mode,
break;
}
O << ARM64InstPrinter::getRegisterName(Reg);
O << AArch64InstPrinter::getRegisterName(Reg);
return false;
}
// Prints the register in MO using class RC using the offset in the
// new register class. This should not be used for cross class
// printing.
bool ARM64AsmPrinter::printAsmRegInClass(const MachineOperand &MO,
const TargetRegisterClass *RC,
bool isVector, raw_ostream &O) {
bool AArch64AsmPrinter::printAsmRegInClass(const MachineOperand &MO,
const TargetRegisterClass *RC,
bool isVector, raw_ostream &O) {
assert(MO.isReg() && "Should only get here with a register!");
const ARM64RegisterInfo *RI =
static_cast<const ARM64RegisterInfo *>(TM.getRegisterInfo());
const AArch64RegisterInfo *RI =
static_cast<const AArch64RegisterInfo *>(TM.getRegisterInfo());
unsigned Reg = MO.getReg();
unsigned RegToPrint = RC->getRegister(RI->getEncodingValue(Reg));
assert(RI->regsOverlap(RegToPrint, Reg));
O << ARM64InstPrinter::getRegisterName(
RegToPrint, isVector ? ARM64::vreg : ARM64::NoRegAltName);
O << AArch64InstPrinter::getRegisterName(
RegToPrint, isVector ? AArch64::vreg : AArch64::NoRegAltName);
return false;
}
bool ARM64AsmPrinter::PrintAsmOperand(const MachineInstr *MI, unsigned OpNum,
unsigned AsmVariant,
const char *ExtraCode, raw_ostream &O) {
bool AArch64AsmPrinter::PrintAsmOperand(const MachineInstr *MI, unsigned OpNum,
unsigned AsmVariant,
const char *ExtraCode, raw_ostream &O) {
const MachineOperand &MO = MI->getOperand(OpNum);
// Does this asm operand have a single letter operand modifier?
if (ExtraCode && ExtraCode[0]) {
@ -276,8 +279,8 @@ bool ARM64AsmPrinter::PrintAsmOperand(const MachineInstr *MI, unsigned OpNum,
if (MO.isReg())
return printAsmMRegister(MO, ExtraCode[0], O);
if (MO.isImm() && MO.getImm() == 0) {
unsigned Reg = ExtraCode[0] == 'w' ? ARM64::WZR : ARM64::XZR;
O << ARM64InstPrinter::getRegisterName(Reg);
unsigned Reg = ExtraCode[0] == 'w' ? AArch64::WZR : AArch64::XZR;
O << AArch64InstPrinter::getRegisterName(Reg);
return false;
}
printOperand(MI, OpNum, O);
@ -291,19 +294,19 @@ bool ARM64AsmPrinter::PrintAsmOperand(const MachineInstr *MI, unsigned OpNum,
const TargetRegisterClass *RC;
switch (ExtraCode[0]) {
case 'b':
RC = &ARM64::FPR8RegClass;
RC = &AArch64::FPR8RegClass;
break;
case 'h':
RC = &ARM64::FPR16RegClass;
RC = &AArch64::FPR16RegClass;
break;
case 's':
RC = &ARM64::FPR32RegClass;
RC = &AArch64::FPR32RegClass;
break;
case 'd':
RC = &ARM64::FPR64RegClass;
RC = &AArch64::FPR64RegClass;
break;
case 'q':
RC = &ARM64::FPR128RegClass;
RC = &AArch64::FPR128RegClass;
break;
default:
return true;
@ -321,33 +324,35 @@ bool ARM64AsmPrinter::PrintAsmOperand(const MachineInstr *MI, unsigned OpNum,
unsigned Reg = MO.getReg();
// If this is a w or x register, print an x register.
if (ARM64::GPR32allRegClass.contains(Reg) ||
ARM64::GPR64allRegClass.contains(Reg))
if (AArch64::GPR32allRegClass.contains(Reg) ||
AArch64::GPR64allRegClass.contains(Reg))
return printAsmMRegister(MO, 'x', O);
// If this is a b, h, s, d, or q register, print it as a v register.
return printAsmRegInClass(MO, &ARM64::FPR128RegClass, true /* vector */, O);
return printAsmRegInClass(MO, &AArch64::FPR128RegClass, true /* vector */,
O);
}
printOperand(MI, OpNum, O);
return false;
}
bool ARM64AsmPrinter::PrintAsmMemoryOperand(const MachineInstr *MI,
unsigned OpNum, unsigned AsmVariant,
const char *ExtraCode,
raw_ostream &O) {
bool AArch64AsmPrinter::PrintAsmMemoryOperand(const MachineInstr *MI,
unsigned OpNum,
unsigned AsmVariant,
const char *ExtraCode,
raw_ostream &O) {
if (ExtraCode && ExtraCode[0])
return true; // Unknown modifier.
const MachineOperand &MO = MI->getOperand(OpNum);
assert(MO.isReg() && "unexpected inline asm memory operand");
O << "[" << ARM64InstPrinter::getRegisterName(MO.getReg()) << "]";
O << "[" << AArch64InstPrinter::getRegisterName(MO.getReg()) << "]";
return false;
}
void ARM64AsmPrinter::PrintDebugValueComment(const MachineInstr *MI,
raw_ostream &OS) {
void AArch64AsmPrinter::PrintDebugValueComment(const MachineInstr *MI,
raw_ostream &OS) {
unsigned NOps = MI->getNumOperands();
assert(NOps == 4);
OS << '\t' << MAI->getCommentString() << "DEBUG_VALUE: ";
@ -366,21 +371,21 @@ void ARM64AsmPrinter::PrintDebugValueComment(const MachineInstr *MI,
printOperand(MI, NOps - 2, OS);
}
void ARM64AsmPrinter::LowerSTACKMAP(MCStreamer &OutStreamer, StackMaps &SM,
const MachineInstr &MI) {
void AArch64AsmPrinter::LowerSTACKMAP(MCStreamer &OutStreamer, StackMaps &SM,
const MachineInstr &MI) {
unsigned NumNOPBytes = MI.getOperand(1).getImm();
SM.recordStackMap(MI);
// Emit padding.
assert(NumNOPBytes % 4 == 0 && "Invalid number of NOP bytes requested!");
for (unsigned i = 0; i < NumNOPBytes; i += 4)
EmitToStreamer(OutStreamer, MCInstBuilder(ARM64::HINT).addImm(0));
EmitToStreamer(OutStreamer, MCInstBuilder(AArch64::HINT).addImm(0));
}
// Lower a patchpoint of the form:
// [<def>], <id>, <numBytes>, <target>, <numArgs>
void ARM64AsmPrinter::LowerPATCHPOINT(MCStreamer &OutStreamer, StackMaps &SM,
const MachineInstr &MI) {
void AArch64AsmPrinter::LowerPATCHPOINT(MCStreamer &OutStreamer, StackMaps &SM,
const MachineInstr &MI) {
SM.recordPatchPoint(MI);
PatchPointOpers Opers(&MI);
@ -393,21 +398,21 @@ void ARM64AsmPrinter::LowerPATCHPOINT(MCStreamer &OutStreamer, StackMaps &SM,
unsigned ScratchReg = MI.getOperand(Opers.getNextScratchIdx()).getReg();
EncodedBytes = 16;
// Materialize the jump address:
EmitToStreamer(OutStreamer, MCInstBuilder(ARM64::MOVZWi)
EmitToStreamer(OutStreamer, MCInstBuilder(AArch64::MOVZWi)
.addReg(ScratchReg)
.addImm((CallTarget >> 32) & 0xFFFF)
.addImm(32));
EmitToStreamer(OutStreamer, MCInstBuilder(ARM64::MOVKWi)
EmitToStreamer(OutStreamer, MCInstBuilder(AArch64::MOVKWi)
.addReg(ScratchReg)
.addReg(ScratchReg)
.addImm((CallTarget >> 16) & 0xFFFF)
.addImm(16));
EmitToStreamer(OutStreamer, MCInstBuilder(ARM64::MOVKWi)
EmitToStreamer(OutStreamer, MCInstBuilder(AArch64::MOVKWi)
.addReg(ScratchReg)
.addReg(ScratchReg)
.addImm(CallTarget & 0xFFFF)
.addImm(0));
EmitToStreamer(OutStreamer, MCInstBuilder(ARM64::BLR).addReg(ScratchReg));
EmitToStreamer(OutStreamer, MCInstBuilder(AArch64::BLR).addReg(ScratchReg));
}
// Emit padding.
unsigned NumBytes = Opers.getMetaOper(PatchPointOpers::NBytesPos).getImm();
@ -416,19 +421,19 @@ void ARM64AsmPrinter::LowerPATCHPOINT(MCStreamer &OutStreamer, StackMaps &SM,
assert((NumBytes - EncodedBytes) % 4 == 0 &&
"Invalid number of NOP bytes requested!");
for (unsigned i = EncodedBytes; i < NumBytes; i += 4)
EmitToStreamer(OutStreamer, MCInstBuilder(ARM64::HINT).addImm(0));
EmitToStreamer(OutStreamer, MCInstBuilder(AArch64::HINT).addImm(0));
}
// Simple pseudo-instructions have their lowering (with expansion to real
// instructions) auto-generated.
#include "ARM64GenMCPseudoLowering.inc"
#include "AArch64GenMCPseudoLowering.inc"
void ARM64AsmPrinter::EmitInstruction(const MachineInstr *MI) {
void AArch64AsmPrinter::EmitInstruction(const MachineInstr *MI) {
// Do any auto-generated pseudo lowerings.
if (emitPseudoExpansionLowering(OutStreamer, MI))
return;
if (ARM64FI->getLOHRelated().count(MI)) {
if (AArch64FI->getLOHRelated().count(MI)) {
// Generate a label for LOH related instruction
MCSymbol *LOHLabel = GetTempSymbol("loh", LOHLabelCounter++);
// Associate the instruction with the label
@ -440,7 +445,7 @@ void ARM64AsmPrinter::EmitInstruction(const MachineInstr *MI) {
switch (MI->getOpcode()) {
default:
break;
case ARM64::DBG_VALUE: {
case AArch64::DBG_VALUE: {
if (isVerbose() && OutStreamer.hasRawTextSupport()) {
SmallString<128> TmpStr;
raw_svector_ostream OS(TmpStr);
@ -453,23 +458,23 @@ void ARM64AsmPrinter::EmitInstruction(const MachineInstr *MI) {
// Tail calls use pseudo instructions so they have the proper code-gen
// attributes (isCall, isReturn, etc.). We lower them to the real
// instruction here.
case ARM64::TCRETURNri: {
case AArch64::TCRETURNri: {
MCInst TmpInst;
TmpInst.setOpcode(ARM64::BR);
TmpInst.setOpcode(AArch64::BR);
TmpInst.addOperand(MCOperand::CreateReg(MI->getOperand(0).getReg()));
EmitToStreamer(OutStreamer, TmpInst);
return;
}
case ARM64::TCRETURNdi: {
case AArch64::TCRETURNdi: {
MCOperand Dest;
MCInstLowering.lowerOperand(MI->getOperand(0), Dest);
MCInst TmpInst;
TmpInst.setOpcode(ARM64::B);
TmpInst.setOpcode(AArch64::B);
TmpInst.addOperand(Dest);
EmitToStreamer(OutStreamer, TmpInst);
return;
}
case ARM64::TLSDESC_BLR: {
case AArch64::TLSDESC_BLR: {
MCOperand Callee, Sym;
MCInstLowering.lowerOperand(MI->getOperand(0), Callee);
MCInstLowering.lowerOperand(MI->getOperand(1), Sym);
@ -477,14 +482,14 @@ void ARM64AsmPrinter::EmitInstruction(const MachineInstr *MI) {
// First emit a relocation-annotation. This expands to no code, but requests
// the following instruction gets an R_AARCH64_TLSDESC_CALL.
MCInst TLSDescCall;
TLSDescCall.setOpcode(ARM64::TLSDESCCALL);
TLSDescCall.setOpcode(AArch64::TLSDESCCALL);
TLSDescCall.addOperand(Sym);
EmitToStreamer(OutStreamer, TLSDescCall);
// Other than that it's just a normal indirect call to the function loaded
// from the descriptor.
MCInst BLR;
BLR.setOpcode(ARM64::BLR);
BLR.setOpcode(AArch64::BLR);
BLR.addOperand(Callee);
EmitToStreamer(OutStreamer, BLR);
@ -505,10 +510,10 @@ void ARM64AsmPrinter::EmitInstruction(const MachineInstr *MI) {
}
// Force static initialization.
extern "C" void LLVMInitializeARM64AsmPrinter() {
RegisterAsmPrinter<ARM64AsmPrinter> X(TheARM64leTarget);
RegisterAsmPrinter<ARM64AsmPrinter> Y(TheARM64beTarget);
extern "C" void LLVMInitializeAArch64AsmPrinter() {
RegisterAsmPrinter<AArch64AsmPrinter> X(TheAArch64leTarget);
RegisterAsmPrinter<AArch64AsmPrinter> Y(TheAArch64beTarget);
RegisterAsmPrinter<ARM64AsmPrinter> Z(TheAArch64leTarget);
RegisterAsmPrinter<ARM64AsmPrinter> W(TheAArch64beTarget);
RegisterAsmPrinter<AArch64AsmPrinter> Z(TheARM64leTarget);
RegisterAsmPrinter<AArch64AsmPrinter> W(TheARM64beTarget);
}

View File

@ -1,4 +1,4 @@
//===-- ARM64BranchRelaxation.cpp - ARM64 branch relaxation ---------------===//
//===-- AArch64BranchRelaxation.cpp - AArch64 branch relaxation -----------===//
//
// The LLVM Compiler Infrastructure
//
@ -9,9 +9,9 @@
//
//===----------------------------------------------------------------------===//
#include "ARM64.h"
#include "ARM64InstrInfo.h"
#include "ARM64MachineFunctionInfo.h"
#include "AArch64.h"
#include "AArch64InstrInfo.h"
#include "AArch64MachineFunctionInfo.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/CodeGen/MachineFunctionPass.h"
#include "llvm/CodeGen/MachineInstrBuilder.h"
@ -23,29 +23,29 @@
#include "llvm/Support/CommandLine.h"
using namespace llvm;
#define DEBUG_TYPE "arm64-branch-relax"
#define DEBUG_TYPE "aarch64-branch-relax"
static cl::opt<bool>
BranchRelaxation("arm64-branch-relax", cl::Hidden, cl::init(true),
BranchRelaxation("aarch64-branch-relax", cl::Hidden, cl::init(true),
cl::desc("Relax out of range conditional branches"));
static cl::opt<unsigned>
TBZDisplacementBits("arm64-tbz-offset-bits", cl::Hidden, cl::init(14),
TBZDisplacementBits("aarch64-tbz-offset-bits", cl::Hidden, cl::init(14),
cl::desc("Restrict range of TB[N]Z instructions (DEBUG)"));
static cl::opt<unsigned>
CBZDisplacementBits("arm64-cbz-offset-bits", cl::Hidden, cl::init(19),
CBZDisplacementBits("aarch64-cbz-offset-bits", cl::Hidden, cl::init(19),
cl::desc("Restrict range of CB[N]Z instructions (DEBUG)"));
static cl::opt<unsigned>
BCCDisplacementBits("arm64-bcc-offset-bits", cl::Hidden, cl::init(19),
BCCDisplacementBits("aarch64-bcc-offset-bits", cl::Hidden, cl::init(19),
cl::desc("Restrict range of Bcc instructions (DEBUG)"));
STATISTIC(NumSplit, "Number of basic blocks split");
STATISTIC(NumRelaxed, "Number of conditional branches relaxed");
namespace {
class ARM64BranchRelaxation : public MachineFunctionPass {
class AArch64BranchRelaxation : public MachineFunctionPass {
/// BasicBlockInfo - Information about the offset and size of a single
/// basic block.
struct BasicBlockInfo {
@ -77,7 +77,7 @@ class ARM64BranchRelaxation : public MachineFunctionPass {
SmallVector<BasicBlockInfo, 16> BlockInfo;
MachineFunction *MF;
const ARM64InstrInfo *TII;
const AArch64InstrInfo *TII;
bool relaxBranchInstructions();
void scanFunction();
@ -92,19 +92,19 @@ class ARM64BranchRelaxation : public MachineFunctionPass {
public:
static char ID;
ARM64BranchRelaxation() : MachineFunctionPass(ID) {}
AArch64BranchRelaxation() : MachineFunctionPass(ID) {}
bool runOnMachineFunction(MachineFunction &MF) override;
const char *getPassName() const override {
return "ARM64 branch relaxation pass";
return "AArch64 branch relaxation pass";
}
};
char ARM64BranchRelaxation::ID = 0;
char AArch64BranchRelaxation::ID = 0;
}
/// verify - check BBOffsets, BBSizes, alignment of islands
void ARM64BranchRelaxation::verify() {
void AArch64BranchRelaxation::verify() {
#ifndef NDEBUG
unsigned PrevNum = MF->begin()->getNumber();
for (MachineBasicBlock &MBB : *MF) {
@ -118,7 +118,7 @@ void ARM64BranchRelaxation::verify() {
}
/// print block size and offset information - debugging
void ARM64BranchRelaxation::dumpBBs() {
void AArch64BranchRelaxation::dumpBBs() {
for (auto &MBB : *MF) {
const BasicBlockInfo &BBI = BlockInfo[MBB.getNumber()];
dbgs() << format("BB#%u\toffset=%08x\t", MBB.getNumber(), BBI.Offset)
@ -145,7 +145,7 @@ static bool BBHasFallthrough(MachineBasicBlock *MBB) {
/// scanFunction - Do the initial scan of the function, building up
/// information about each block.
void ARM64BranchRelaxation::scanFunction() {
void AArch64BranchRelaxation::scanFunction() {
BlockInfo.clear();
BlockInfo.resize(MF->getNumBlockIDs());
@ -162,7 +162,7 @@ void ARM64BranchRelaxation::scanFunction() {
/// computeBlockSize - Compute the size for MBB.
/// This function updates BlockInfo directly.
void ARM64BranchRelaxation::computeBlockSize(const MachineBasicBlock &MBB) {
void AArch64BranchRelaxation::computeBlockSize(const MachineBasicBlock &MBB) {
unsigned Size = 0;
for (const MachineInstr &MI : MBB)
Size += TII->GetInstSizeInBytes(&MI);
@ -172,7 +172,7 @@ void ARM64BranchRelaxation::computeBlockSize(const MachineBasicBlock &MBB) {
/// getInstrOffset - Return the current offset of the specified machine
/// instruction from the start of the function. This offset changes as stuff is
/// moved around inside the function.
unsigned ARM64BranchRelaxation::getInstrOffset(MachineInstr *MI) const {
unsigned AArch64BranchRelaxation::getInstrOffset(MachineInstr *MI) const {
MachineBasicBlock *MBB = MI->getParent();
// The offset is composed of two things: the sum of the sizes of all MBB's
@ -188,7 +188,7 @@ unsigned ARM64BranchRelaxation::getInstrOffset(MachineInstr *MI) const {
return Offset;
}
void ARM64BranchRelaxation::adjustBlockOffsets(MachineBasicBlock &Start) {
void AArch64BranchRelaxation::adjustBlockOffsets(MachineBasicBlock &Start) {
unsigned PrevNum = Start.getNumber();
for (auto &MBB : make_range(MachineFunction::iterator(Start), MF->end())) {
unsigned Num = MBB.getNumber();
@ -209,7 +209,7 @@ void ARM64BranchRelaxation::adjustBlockOffsets(MachineBasicBlock &Start) {
/// and must be updated by the caller! Other transforms follow using this
/// utility function, so no point updating now rather than waiting.
MachineBasicBlock *
ARM64BranchRelaxation::splitBlockBeforeInstr(MachineInstr *MI) {
AArch64BranchRelaxation::splitBlockBeforeInstr(MachineInstr *MI) {
MachineBasicBlock *OrigBB = MI->getParent();
// Create a new MBB for the code after the OrigBB.
@ -226,7 +226,7 @@ ARM64BranchRelaxation::splitBlockBeforeInstr(MachineInstr *MI) {
// Note the new unconditional branch is not being recorded.
// There doesn't seem to be meaningful DebugInfo available; this doesn't
// correspond to anything in the source.
BuildMI(OrigBB, DebugLoc(), TII->get(ARM64::B)).addMBB(NewBB);
BuildMI(OrigBB, DebugLoc(), TII->get(AArch64::B)).addMBB(NewBB);
// Insert an entry into BlockInfo to align it properly with the block numbers.
BlockInfo.insert(BlockInfo.begin() + NewBB->getNumber(), BasicBlockInfo());
@ -252,9 +252,9 @@ ARM64BranchRelaxation::splitBlockBeforeInstr(MachineInstr *MI) {
/// isBlockInRange - Returns true if the distance between specific MI and
/// specific BB can fit in MI's displacement field.
bool ARM64BranchRelaxation::isBlockInRange(MachineInstr *MI,
MachineBasicBlock *DestBB,
unsigned Bits) {
bool AArch64BranchRelaxation::isBlockInRange(MachineInstr *MI,
MachineBasicBlock *DestBB,
unsigned Bits) {
unsigned MaxOffs = ((1 << (Bits - 1)) - 1) << 2;
unsigned BrOffset = getInstrOffset(MI);
unsigned DestOffset = BlockInfo[DestBB->getNumber()].Offset;
@ -275,15 +275,15 @@ static bool isConditionalBranch(unsigned Opc) {
switch (Opc) {
default:
return false;
case ARM64::TBZW:
case ARM64::TBNZW:
case ARM64::TBZX:
case ARM64::TBNZX:
case ARM64::CBZW:
case ARM64::CBNZW:
case ARM64::CBZX:
case ARM64::CBNZX:
case ARM64::Bcc:
case AArch64::TBZW:
case AArch64::TBNZW:
case AArch64::TBZX:
case AArch64::TBNZX:
case AArch64::CBZW:
case AArch64::CBNZW:
case AArch64::CBZX:
case AArch64::CBNZX:
case AArch64::Bcc:
return true;
}
}
@ -292,16 +292,16 @@ static MachineBasicBlock *getDestBlock(MachineInstr *MI) {
switch (MI->getOpcode()) {
default:
assert(0 && "unexpected opcode!");
case ARM64::TBZW:
case ARM64::TBNZW:
case ARM64::TBZX:
case ARM64::TBNZX:
case AArch64::TBZW:
case AArch64::TBNZW:
case AArch64::TBZX:
case AArch64::TBNZX:
return MI->getOperand(2).getMBB();
case ARM64::CBZW:
case ARM64::CBNZW:
case ARM64::CBZX:
case ARM64::CBNZX:
case ARM64::Bcc:
case AArch64::CBZW:
case AArch64::CBNZW:
case AArch64::CBZX:
case AArch64::CBNZX:
case AArch64::Bcc:
return MI->getOperand(1).getMBB();
}
}
@ -310,15 +310,15 @@ static unsigned getOppositeConditionOpcode(unsigned Opc) {
switch (Opc) {
default:
assert(0 && "unexpected opcode!");
case ARM64::TBNZW: return ARM64::TBZW;
case ARM64::TBNZX: return ARM64::TBZX;
case ARM64::TBZW: return ARM64::TBNZW;
case ARM64::TBZX: return ARM64::TBNZX;
case ARM64::CBNZW: return ARM64::CBZW;
case ARM64::CBNZX: return ARM64::CBZX;
case ARM64::CBZW: return ARM64::CBNZW;
case ARM64::CBZX: return ARM64::CBNZX;
case ARM64::Bcc: return ARM64::Bcc; // Condition is an operand for Bcc.
case AArch64::TBNZW: return AArch64::TBZW;
case AArch64::TBNZX: return AArch64::TBZX;
case AArch64::TBZW: return AArch64::TBNZW;
case AArch64::TBZX: return AArch64::TBNZX;
case AArch64::CBNZW: return AArch64::CBZW;
case AArch64::CBNZX: return AArch64::CBZX;
case AArch64::CBZW: return AArch64::CBNZW;
case AArch64::CBZX: return AArch64::CBNZX;
case AArch64::Bcc: return AArch64::Bcc; // Condition is an operand for Bcc.
}
}
@ -326,32 +326,32 @@ static unsigned getBranchDisplacementBits(unsigned Opc) {
switch (Opc) {
default:
assert(0 && "unexpected opcode!");
case ARM64::TBNZW:
case ARM64::TBZW:
case ARM64::TBNZX:
case ARM64::TBZX:
case AArch64::TBNZW:
case AArch64::TBZW:
case AArch64::TBNZX:
case AArch64::TBZX:
return TBZDisplacementBits;
case ARM64::CBNZW:
case ARM64::CBZW:
case ARM64::CBNZX:
case ARM64::CBZX:
case AArch64::CBNZW:
case AArch64::CBZW:
case AArch64::CBNZX:
case AArch64::CBZX:
return CBZDisplacementBits;
case ARM64::Bcc:
case AArch64::Bcc:
return BCCDisplacementBits;
}
}
static inline void invertBccCondition(MachineInstr *MI) {
assert(MI->getOpcode() == ARM64::Bcc && "Unexpected opcode!");
ARM64CC::CondCode CC = (ARM64CC::CondCode)MI->getOperand(0).getImm();
CC = ARM64CC::getInvertedCondCode(CC);
assert(MI->getOpcode() == AArch64::Bcc && "Unexpected opcode!");
AArch64CC::CondCode CC = (AArch64CC::CondCode)MI->getOperand(0).getImm();
CC = AArch64CC::getInvertedCondCode(CC);
MI->getOperand(0).setImm((int64_t)CC);
}
/// fixupConditionalBranch - Fix up a conditional branch whose destination is
/// too far away to fit in its displacement field. It is converted to an inverse
/// conditional branch + an unconditional branch to the destination.
bool ARM64BranchRelaxation::fixupConditionalBranch(MachineInstr *MI) {
bool AArch64BranchRelaxation::fixupConditionalBranch(MachineInstr *MI) {
MachineBasicBlock *DestBB = getDestBlock(MI);
// Add an unconditional branch to the destination and invert the branch
@ -372,7 +372,7 @@ bool ARM64BranchRelaxation::fixupConditionalBranch(MachineInstr *MI) {
if (BMI != MI) {
if (std::next(MachineBasicBlock::iterator(MI)) ==
std::prev(MBB->getLastNonDebugInstr()) &&
BMI->getOpcode() == ARM64::B) {
BMI->getOpcode() == AArch64::B) {
// Last MI in the BB is an unconditional branch. Can we simply invert the
// condition and swap destinations:
// beq L1
@ -386,14 +386,15 @@ bool ARM64BranchRelaxation::fixupConditionalBranch(MachineInstr *MI) {
DEBUG(dbgs() << " Invert condition and swap its destination with "
<< *BMI);
BMI->getOperand(0).setMBB(DestBB);
unsigned OpNum =
(MI->getOpcode() == ARM64::TBZW || MI->getOpcode() == ARM64::TBNZW ||
MI->getOpcode() == ARM64::TBZX || MI->getOpcode() == ARM64::TBNZX)
? 2
: 1;
unsigned OpNum = (MI->getOpcode() == AArch64::TBZW ||
MI->getOpcode() == AArch64::TBNZW ||
MI->getOpcode() == AArch64::TBZX ||
MI->getOpcode() == AArch64::TBNZX)
? 2
: 1;
MI->getOperand(OpNum).setMBB(NewDest);
MI->setDesc(TII->get(getOppositeConditionOpcode(MI->getOpcode())));
if (MI->getOpcode() == ARM64::Bcc)
if (MI->getOpcode() == AArch64::Bcc)
invertBccCondition(MI);
return true;
}
@ -429,14 +430,14 @@ bool ARM64BranchRelaxation::fixupConditionalBranch(MachineInstr *MI) {
MachineInstrBuilder MIB = BuildMI(
MBB, DebugLoc(), TII->get(getOppositeConditionOpcode(MI->getOpcode())))
.addOperand(MI->getOperand(0));
if (MI->getOpcode() == ARM64::TBZW || MI->getOpcode() == ARM64::TBNZW ||
MI->getOpcode() == ARM64::TBZX || MI->getOpcode() == ARM64::TBNZX)
if (MI->getOpcode() == AArch64::TBZW || MI->getOpcode() == AArch64::TBNZW ||
MI->getOpcode() == AArch64::TBZX || MI->getOpcode() == AArch64::TBNZX)
MIB.addOperand(MI->getOperand(1));
if (MI->getOpcode() == ARM64::Bcc)
if (MI->getOpcode() == AArch64::Bcc)
invertBccCondition(MIB);
MIB.addMBB(NextBB);
BlockInfo[MBB->getNumber()].Size += TII->GetInstSizeInBytes(&MBB->back());
BuildMI(MBB, DebugLoc(), TII->get(ARM64::B)).addMBB(DestBB);
BuildMI(MBB, DebugLoc(), TII->get(AArch64::B)).addMBB(DestBB);
BlockInfo[MBB->getNumber()].Size += TII->GetInstSizeInBytes(&MBB->back());
// Remove the old conditional branch. It may or may not still be in MBB.
@ -448,7 +449,7 @@ bool ARM64BranchRelaxation::fixupConditionalBranch(MachineInstr *MI) {
return true;
}
bool ARM64BranchRelaxation::relaxBranchInstructions() {
bool AArch64BranchRelaxation::relaxBranchInstructions() {
bool Changed = false;
// Relaxing branches involves creating new basic blocks, so re-eval
// end() for termination.
@ -465,16 +466,16 @@ bool ARM64BranchRelaxation::relaxBranchInstructions() {
return Changed;
}
bool ARM64BranchRelaxation::runOnMachineFunction(MachineFunction &mf) {
bool AArch64BranchRelaxation::runOnMachineFunction(MachineFunction &mf) {
MF = &mf;
// If the pass is disabled, just bail early.
if (!BranchRelaxation)
return false;
DEBUG(dbgs() << "***** ARM64BranchRelaxation *****\n");
DEBUG(dbgs() << "***** AArch64BranchRelaxation *****\n");
TII = (const ARM64InstrInfo *)MF->getTarget().getInstrInfo();
TII = (const AArch64InstrInfo *)MF->getTarget().getInstrInfo();
// Renumber all of the machine basic blocks in the function, guaranteeing that
// the numbers agree with the position of the block in the function.
@ -502,8 +503,8 @@ bool ARM64BranchRelaxation::runOnMachineFunction(MachineFunction &mf) {
return MadeChange;
}
/// createARM64BranchRelaxation - returns an instance of the constpool
/// createAArch64BranchRelaxation - returns an instance of the constpool
/// island pass.
FunctionPass *llvm::createARM64BranchRelaxation() {
return new ARM64BranchRelaxation();
FunctionPass *llvm::createAArch64BranchRelaxation() {
return new AArch64BranchRelaxation();
}

View File

@ -1,4 +1,4 @@
//=== ARM64CallingConv.h - Custom Calling Convention Routines -*- C++ -*-===//
//=== AArch64CallingConv.h - Custom Calling Convention Routines -*- C++ -*-===//
//
// The LLVM Compiler Infrastructure
//
@ -7,38 +7,38 @@
//
//===----------------------------------------------------------------------===//
//
// This file contains the custom routines for the ARM64 Calling Convention that
// This file contains the custom routines for the AArch64 Calling Convention that
// aren't done by tablegen.
//
//===----------------------------------------------------------------------===//
#ifndef ARM64CALLINGCONV_H
#define ARM64CALLINGCONV_H
#ifndef AArch64CALLINGCONV_H
#define AArch64CALLINGCONV_H
#include "ARM64InstrInfo.h"
#include "AArch64InstrInfo.h"
#include "llvm/IR/CallingConv.h"
#include "llvm/CodeGen/CallingConvLower.h"
#include "llvm/Target/TargetInstrInfo.h"
namespace llvm {
/// CC_ARM64_Custom_i1i8i16_Reg - customized handling of passing i1/i8/i16 via
/// CC_AArch64_Custom_i1i8i16_Reg - customized handling of passing i1/i8/i16 via
/// register. Here, ValVT can be i1/i8/i16 or i32 depending on whether the
/// argument is already promoted and LocVT is i1/i8/i16. We only promote the
/// argument to i32 if we are sure this argument will be passed in register.
static bool CC_ARM64_Custom_i1i8i16_Reg(unsigned ValNo, MVT ValVT, MVT LocVT,
static bool CC_AArch64_Custom_i1i8i16_Reg(unsigned ValNo, MVT ValVT, MVT LocVT,
CCValAssign::LocInfo LocInfo,
ISD::ArgFlagsTy ArgFlags,
CCState &State,
bool IsWebKitJS = false) {
static const MCPhysReg RegList1[] = { ARM64::W0, ARM64::W1, ARM64::W2,
ARM64::W3, ARM64::W4, ARM64::W5,
ARM64::W6, ARM64::W7 };
static const MCPhysReg RegList2[] = { ARM64::X0, ARM64::X1, ARM64::X2,
ARM64::X3, ARM64::X4, ARM64::X5,
ARM64::X6, ARM64::X7 };
static const MCPhysReg WebKitRegList1[] = { ARM64::W0 };
static const MCPhysReg WebKitRegList2[] = { ARM64::X0 };
static const MCPhysReg RegList1[] = { AArch64::W0, AArch64::W1, AArch64::W2,
AArch64::W3, AArch64::W4, AArch64::W5,
AArch64::W6, AArch64::W7 };
static const MCPhysReg RegList2[] = { AArch64::X0, AArch64::X1, AArch64::X2,
AArch64::X3, AArch64::X4, AArch64::X5,
AArch64::X6, AArch64::X7 };
static const MCPhysReg WebKitRegList1[] = { AArch64::W0 };
static const MCPhysReg WebKitRegList2[] = { AArch64::X0 };
const MCPhysReg *List1 = IsWebKitJS ? WebKitRegList1 : RegList1;
const MCPhysReg *List2 = IsWebKitJS ? WebKitRegList2 : RegList2;
@ -63,22 +63,22 @@ static bool CC_ARM64_Custom_i1i8i16_Reg(unsigned ValNo, MVT ValVT, MVT LocVT,
return false;
}
/// CC_ARM64_WebKit_JS_i1i8i16_Reg - customized handling of passing i1/i8/i16
/// via register. This behaves the same as CC_ARM64_Custom_i1i8i16_Reg, but only
/// CC_AArch64_WebKit_JS_i1i8i16_Reg - customized handling of passing i1/i8/i16
/// via register. This behaves the same as CC_AArch64_Custom_i1i8i16_Reg, but only
/// uses the first register.
static bool CC_ARM64_WebKit_JS_i1i8i16_Reg(unsigned ValNo, MVT ValVT, MVT LocVT,
static bool CC_AArch64_WebKit_JS_i1i8i16_Reg(unsigned ValNo, MVT ValVT, MVT LocVT,
CCValAssign::LocInfo LocInfo,
ISD::ArgFlagsTy ArgFlags,
CCState &State) {
return CC_ARM64_Custom_i1i8i16_Reg(ValNo, ValVT, LocVT, LocInfo, ArgFlags,
return CC_AArch64_Custom_i1i8i16_Reg(ValNo, ValVT, LocVT, LocInfo, ArgFlags,
State, true);
}
/// CC_ARM64_Custom_i1i8i16_Stack: customized handling of passing i1/i8/i16 on
/// CC_AArch64_Custom_i1i8i16_Stack: customized handling of passing i1/i8/i16 on
/// stack. Here, ValVT can be i1/i8/i16 or i32 depending on whether the argument
/// is already promoted and LocVT is i1/i8/i16. If ValVT is already promoted,
/// it will be truncated back to i1/i8/i16.
static bool CC_ARM64_Custom_i1i8i16_Stack(unsigned ValNo, MVT ValVT, MVT LocVT,
static bool CC_AArch64_Custom_i1i8i16_Stack(unsigned ValNo, MVT ValVT, MVT LocVT,
CCValAssign::LocInfo LocInfo,
ISD::ArgFlagsTy ArgFlags,
CCState &State) {

View File

@ -1,4 +1,4 @@
//===- ARM64CallingConv.td - Calling Conventions for ARM64 -*- tablegen -*-===//
//=- AArch64CallingConv.td - Calling Conventions for AArch64 -*- tablegen -*-=//
//
// The LLVM Compiler Infrastructure
//
@ -7,7 +7,7 @@
//
//===----------------------------------------------------------------------===//
//
// This describes the calling conventions for ARM64 architecture.
// This describes the calling conventions for AArch64 architecture.
//
//===----------------------------------------------------------------------===//
@ -22,7 +22,7 @@ class CCIfBigEndian<CCAction A> :
// ARM AAPCS64 Calling Convention
//===----------------------------------------------------------------------===//
def CC_ARM64_AAPCS : CallingConv<[
def CC_AArch64_AAPCS : CallingConv<[
CCIfType<[v2f32], CCBitConvertToType<v2i32>>,
CCIfType<[v2f64, v4f32], CCBitConvertToType<v2i64>>,
@ -42,7 +42,7 @@ def CC_ARM64_AAPCS : CallingConv<[
// Handle i1, i8, i16, i32, i64, f32, f64 and v2f64 by passing in registers,
// up to eight each of GPR and FPR.
CCIfType<[i1, i8, i16], CCCustom<"CC_ARM64_Custom_i1i8i16_Reg">>,
CCIfType<[i1, i8, i16], CCCustom<"CC_AArch64_Custom_i1i8i16_Reg">>,
CCIfType<[i32], CCAssignToRegWithShadow<[W0, W1, W2, W3, W4, W5, W6, W7],
[X0, X1, X2, X3, X4, X5, X6, X7]>>,
// i128 is split to two i64s, we can't fit half to register X7.
@ -73,7 +73,7 @@ def CC_ARM64_AAPCS : CallingConv<[
CCAssignToStack<16, 16>>
]>;
def RetCC_ARM64_AAPCS : CallingConv<[
def RetCC_AArch64_AAPCS : CallingConv<[
CCIfType<[v2f32], CCBitConvertToType<v2i32>>,
CCIfType<[v2f64, v4f32], CCBitConvertToType<v2i64>>,
@ -104,7 +104,7 @@ def RetCC_ARM64_AAPCS : CallingConv<[
// from the standard one at this level:
// + i128s (i.e. split i64s) don't need even registers.
// + Stack slots are sized as needed rather than being at least 64-bit.
def CC_ARM64_DarwinPCS : CallingConv<[
def CC_AArch64_DarwinPCS : CallingConv<[
CCIfType<[v2f32], CCBitConvertToType<v2i32>>,
CCIfType<[v2f64, v4f32, f128], CCBitConvertToType<v2i64>>,
@ -117,7 +117,7 @@ def CC_ARM64_DarwinPCS : CallingConv<[
// Handle i1, i8, i16, i32, i64, f32, f64 and v2f64 by passing in registers,
// up to eight each of GPR and FPR.
CCIfType<[i1, i8, i16], CCCustom<"CC_ARM64_Custom_i1i8i16_Reg">>,
CCIfType<[i1, i8, i16], CCCustom<"CC_AArch64_Custom_i1i8i16_Reg">>,
CCIfType<[i32], CCAssignToRegWithShadow<[W0, W1, W2, W3, W4, W5, W6, W7],
[X0, X1, X2, X3, X4, X5, X6, X7]>>,
// i128 is split to two i64s, we can't fit half to register X7.
@ -140,14 +140,14 @@ def CC_ARM64_DarwinPCS : CallingConv<[
CCAssignToReg<[Q0, Q1, Q2, Q3, Q4, Q5, Q6, Q7]>>,
// If more than will fit in registers, pass them on the stack instead.
CCIfType<[i1, i8, i16], CCCustom<"CC_ARM64_Custom_i1i8i16_Stack">>,
CCIfType<[i1, i8, i16], CCCustom<"CC_AArch64_Custom_i1i8i16_Stack">>,
CCIfType<[i32, f32], CCAssignToStack<4, 4>>,
CCIfType<[i64, f64, v1f64, v2f32, v1i64, v2i32, v4i16, v8i8],
CCAssignToStack<8, 8>>,
CCIfType<[v2i64, v4i32, v8i16, v16i8, v4f32, v2f64], CCAssignToStack<16, 16>>
]>;
def CC_ARM64_DarwinPCS_VarArg : CallingConv<[
def CC_AArch64_DarwinPCS_VarArg : CallingConv<[
CCIfType<[v2f32], CCBitConvertToType<v2i32>>,
CCIfType<[v2f64, v4f32, f128], CCBitConvertToType<v2i64>>,
@ -166,9 +166,9 @@ def CC_ARM64_DarwinPCS_VarArg : CallingConv<[
// in register and the remaining arguments on stack. We allow 32bit stack slots,
// so that WebKit can write partial values in the stack and define the other
// 32bit quantity as undef.
def CC_ARM64_WebKit_JS : CallingConv<[
def CC_AArch64_WebKit_JS : CallingConv<[
// Handle i1, i8, i16, i32, and i64 passing in register X0 (W0).
CCIfType<[i1, i8, i16], CCCustom<"CC_ARM64_WebKit_JS_i1i8i16_Reg">>,
CCIfType<[i1, i8, i16], CCCustom<"CC_AArch64_WebKit_JS_i1i8i16_Reg">>,
CCIfType<[i32], CCAssignToRegWithShadow<[W0], [X0]>>,
CCIfType<[i64], CCAssignToRegWithShadow<[X0], [W0]>>,
@ -178,7 +178,7 @@ def CC_ARM64_WebKit_JS : CallingConv<[
CCIfType<[i64, f64], CCAssignToStack<8, 8>>
]>;
def RetCC_ARM64_WebKit_JS : CallingConv<[
def RetCC_AArch64_WebKit_JS : CallingConv<[
CCIfType<[i32], CCAssignToRegWithShadow<[W0, W1, W2, W3, W4, W5, W6, W7],
[X0, X1, X2, X3, X4, X5, X6, X7]>>,
CCIfType<[i64], CCAssignToRegWithShadow<[X0, X1, X2, X3, X4, X5, X6, X7],
@ -197,7 +197,7 @@ def RetCC_ARM64_WebKit_JS : CallingConv<[
// It would be better to model its preservation semantics properly (create a
// vreg on entry, use it in RET & tail call generation; make that vreg def if we
// end up saving LR as part of a call frame). Watch this space...
def CSR_ARM64_AAPCS : CalleeSavedRegs<(add LR, FP, X19, X20, X21, X22,
def CSR_AArch64_AAPCS : CalleeSavedRegs<(add LR, FP, X19, X20, X21, X22,
X23, X24, X25, X26, X27, X28,
D8, D9, D10, D11,
D12, D13, D14, D15)>;
@ -210,24 +210,24 @@ def CSR_ARM64_AAPCS : CalleeSavedRegs<(add LR, FP, X19, X20, X21, X22,
// (For generic ARM 64-bit ABI code, clang will not generate constructors or
// destructors with 'this' returns, so this RegMask will not be used in that
// case)
def CSR_ARM64_AAPCS_ThisReturn : CalleeSavedRegs<(add CSR_ARM64_AAPCS, X0)>;
def CSR_AArch64_AAPCS_ThisReturn : CalleeSavedRegs<(add CSR_AArch64_AAPCS, X0)>;
// The function used by Darwin to obtain the address of a thread-local variable
// guarantees more than a normal AAPCS function. x16 and x17 are used on the
// fast path for calculation, but other registers except X0 (argument/return)
// and LR (it is a call, after all) are preserved.
def CSR_ARM64_TLS_Darwin
def CSR_AArch64_TLS_Darwin
: CalleeSavedRegs<(add (sub (sequence "X%u", 1, 28), X16, X17),
FP,
(sequence "Q%u", 0, 31))>;
// The ELF stub used for TLS-descriptor access saves every feasible
// register. Only X0 and LR are clobbered.
def CSR_ARM64_TLS_ELF
def CSR_AArch64_TLS_ELF
: CalleeSavedRegs<(add (sequence "X%u", 1, 28), FP,
(sequence "Q%u", 0, 31))>;
def CSR_ARM64_AllRegs
def CSR_AArch64_AllRegs
: CalleeSavedRegs<(add (sequence "W%u", 0, 30), WSP,
(sequence "X%u", 0, 28), FP, LR, SP,
(sequence "B%u", 0, 31), (sequence "H%u", 0, 31),

View File

@ -1,4 +1,4 @@
//===-- ARM64CleanupLocalDynamicTLSPass.cpp -----------------------*- C++ -*-=//
//===-- AArch64CleanupLocalDynamicTLSPass.cpp ---------------------*- C++ -*-=//
//
// The LLVM Compiler Infrastructure
//
@ -22,10 +22,10 @@
// pass looks through a function and performs such combinations.
//
//===----------------------------------------------------------------------===//
#include "ARM64.h"
#include "ARM64InstrInfo.h"
#include "ARM64MachineFunctionInfo.h"
#include "ARM64TargetMachine.h"
#include "AArch64.h"
#include "AArch64InstrInfo.h"
#include "AArch64MachineFunctionInfo.h"
#include "AArch64TargetMachine.h"
#include "llvm/CodeGen/MachineDominators.h"
#include "llvm/CodeGen/MachineFunction.h"
#include "llvm/CodeGen/MachineFunctionPass.h"
@ -39,7 +39,7 @@ struct LDTLSCleanup : public MachineFunctionPass {
LDTLSCleanup() : MachineFunctionPass(ID) {}
bool runOnMachineFunction(MachineFunction &MF) override {
ARM64FunctionInfo *AFI = MF.getInfo<ARM64FunctionInfo>();
AArch64FunctionInfo *AFI = MF.getInfo<AArch64FunctionInfo>();
if (AFI->getNumLocalDynamicTLSAccesses() < 2) {
// No point folding accesses if there isn't at least two.
return false;
@ -62,7 +62,7 @@ struct LDTLSCleanup : public MachineFunctionPass {
for (MachineBasicBlock::iterator I = BB->begin(), E = BB->end(); I != E;
++I) {
switch (I->getOpcode()) {
case ARM64::TLSDESC_BLR:
case AArch64::TLSDESC_BLR:
// Make sure it's a local dynamic access.
if (!I->getOperand(1).isSymbol() ||
strcmp(I->getOperand(1).getSymbolName(), "_TLS_MODULE_BASE_"))
@ -92,15 +92,15 @@ struct LDTLSCleanup : public MachineFunctionPass {
MachineInstr *replaceTLSBaseAddrCall(MachineInstr *I,
unsigned TLSBaseAddrReg) {
MachineFunction *MF = I->getParent()->getParent();
const ARM64TargetMachine *TM =
static_cast<const ARM64TargetMachine *>(&MF->getTarget());
const ARM64InstrInfo *TII = TM->getInstrInfo();
const AArch64TargetMachine *TM =
static_cast<const AArch64TargetMachine *>(&MF->getTarget());
const AArch64InstrInfo *TII = TM->getInstrInfo();
// Insert a Copy from TLSBaseAddrReg to x0, which is where the rest of the
// code sequence assumes the address will be.
MachineInstr *Copy =
BuildMI(*I->getParent(), I, I->getDebugLoc(),
TII->get(TargetOpcode::COPY), ARM64::X0).addReg(TLSBaseAddrReg);
MachineInstr *Copy = BuildMI(*I->getParent(), I, I->getDebugLoc(),
TII->get(TargetOpcode::COPY),
AArch64::X0).addReg(TLSBaseAddrReg);
// Erase the TLS_base_addr instruction.
I->eraseFromParent();
@ -112,19 +112,19 @@ struct LDTLSCleanup : public MachineFunctionPass {
// inserting a copy instruction after I. Returns the new instruction.
MachineInstr *setRegister(MachineInstr *I, unsigned *TLSBaseAddrReg) {
MachineFunction *MF = I->getParent()->getParent();
const ARM64TargetMachine *TM =
static_cast<const ARM64TargetMachine *>(&MF->getTarget());
const ARM64InstrInfo *TII = TM->getInstrInfo();
const AArch64TargetMachine *TM =
static_cast<const AArch64TargetMachine *>(&MF->getTarget());
const AArch64InstrInfo *TII = TM->getInstrInfo();
// Create a virtual register for the TLS base address.
MachineRegisterInfo &RegInfo = MF->getRegInfo();
*TLSBaseAddrReg = RegInfo.createVirtualRegister(&ARM64::GPR64RegClass);
*TLSBaseAddrReg = RegInfo.createVirtualRegister(&AArch64::GPR64RegClass);
// Insert a copy from X0 to TLSBaseAddrReg for later.
MachineInstr *Next = I->getNextNode();
MachineInstr *Copy = BuildMI(*I->getParent(), Next, I->getDebugLoc(),
TII->get(TargetOpcode::COPY),
*TLSBaseAddrReg).addReg(ARM64::X0);
*TLSBaseAddrReg).addReg(AArch64::X0);
return Copy;
}
@ -142,6 +142,6 @@ struct LDTLSCleanup : public MachineFunctionPass {
}
char LDTLSCleanup::ID = 0;
FunctionPass *llvm::createARM64CleanupLocalDynamicTLSPass() {
FunctionPass *llvm::createAArch64CleanupLocalDynamicTLSPass() {
return new LDTLSCleanup();
}

View File

@ -1,4 +1,4 @@
//===-------------- ARM64CollectLOH.cpp - ARM64 collect LOH pass --*- C++ -*-=//
//===---------- AArch64CollectLOH.cpp - AArch64 collect LOH pass --*- C++ -*-=//
//
// The LLVM Compiler Infrastructure
//
@ -85,8 +85,8 @@
// This LOH aims at getting rid of redundant ADRP instructions.
//
// The overall design for emitting the LOHs is:
// 1. ARM64CollectLOH (this pass) records the LOHs in the ARM64FunctionInfo.
// 2. ARM64AsmPrinter reads the LOHs from ARM64FunctionInfo and it:
// 1. AArch64CollectLOH (this pass) records the LOHs in the AArch64FunctionInfo.
// 2. AArch64AsmPrinter reads the LOHs from AArch64FunctionInfo and it:
// 1. Associates them a label.
// 2. Emits them in a MCStreamer (EmitLOHDirective).
// - The MCMachOStreamer records them into the MCAssembler.
@ -98,10 +98,10 @@
// - Other ObjectWriters ignore them.
//===----------------------------------------------------------------------===//
#include "ARM64.h"
#include "ARM64InstrInfo.h"
#include "ARM64MachineFunctionInfo.h"
#include "MCTargetDesc/ARM64AddressingModes.h"
#include "AArch64.h"
#include "AArch64InstrInfo.h"
#include "AArch64MachineFunctionInfo.h"
#include "MCTargetDesc/AArch64AddressingModes.h"
#include "llvm/ADT/BitVector.h"
#include "llvm/ADT/DenseMap.h"
#include "llvm/ADT/MapVector.h"
@ -122,16 +122,16 @@
#include "llvm/ADT/Statistic.h"
using namespace llvm;
#define DEBUG_TYPE "arm64-collect-loh"
#define DEBUG_TYPE "aarch64-collect-loh"
static cl::opt<bool>
PreCollectRegister("arm64-collect-loh-pre-collect-register", cl::Hidden,
PreCollectRegister("aarch64-collect-loh-pre-collect-register", cl::Hidden,
cl::desc("Restrict analysis to registers invovled"
" in LOHs"),
cl::init(true));
static cl::opt<bool>
BasicBlockScopeOnly("arm64-collect-loh-bb-only", cl::Hidden,
BasicBlockScopeOnly("aarch64-collect-loh-bb-only", cl::Hidden,
cl::desc("Restrict analysis at basic block scope"),
cl::init(true));
@ -164,20 +164,20 @@ STATISTIC(NumADRSimpleCandidate, "Number of simplifiable ADRP + ADD");
STATISTIC(NumADRComplexCandidate, "Number of too complex ADRP + ADD");
namespace llvm {
void initializeARM64CollectLOHPass(PassRegistry &);
void initializeAArch64CollectLOHPass(PassRegistry &);
}
namespace {
struct ARM64CollectLOH : public MachineFunctionPass {
struct AArch64CollectLOH : public MachineFunctionPass {
static char ID;
ARM64CollectLOH() : MachineFunctionPass(ID) {
initializeARM64CollectLOHPass(*PassRegistry::getPassRegistry());
AArch64CollectLOH() : MachineFunctionPass(ID) {
initializeAArch64CollectLOHPass(*PassRegistry::getPassRegistry());
}
bool runOnMachineFunction(MachineFunction &MF) override;
const char *getPassName() const override {
return "ARM64 Collect Linker Optimization Hint (LOH)";
return "AArch64 Collect Linker Optimization Hint (LOH)";
}
void getAnalysisUsage(AnalysisUsage &AU) const override {
@ -214,14 +214,14 @@ typedef DenseMap<unsigned, unsigned> MapRegToId;
typedef SmallVector<unsigned, 32> MapIdToReg;
} // end anonymous namespace.
char ARM64CollectLOH::ID = 0;
char AArch64CollectLOH::ID = 0;
INITIALIZE_PASS_BEGIN(ARM64CollectLOH, "arm64-collect-loh",
"ARM64 Collect Linker Optimization Hint (LOH)", false,
INITIALIZE_PASS_BEGIN(AArch64CollectLOH, "aarch64-collect-loh",
"AArch64 Collect Linker Optimization Hint (LOH)", false,
false)
INITIALIZE_PASS_DEPENDENCY(MachineDominatorTree)
INITIALIZE_PASS_END(ARM64CollectLOH, "arm64-collect-loh",
"ARM64 Collect Linker Optimization Hint (LOH)", false,
INITIALIZE_PASS_END(AArch64CollectLOH, "aarch64-collect-loh",
"AArch64 Collect Linker Optimization Hint (LOH)", false,
false)
/// Given a couple (MBB, reg) get the corresponding set of instruction from
@ -295,7 +295,7 @@ static void initReachingDef(MachineFunction &MF,
BitVector &BBKillSet = Kill[&MBB];
BBKillSet.resize(NbReg);
for (const MachineInstr &MI : MBB) {
bool IsADRP = MI.getOpcode() == ARM64::ADRP;
bool IsADRP = MI.getOpcode() == AArch64::ADRP;
// Process uses first.
if (IsADRP || !ADRPMode)
@ -509,9 +509,9 @@ static bool canDefBePartOfLOH(const MachineInstr *Def) {
switch (Opc) {
default:
return false;
case ARM64::ADRP:
case AArch64::ADRP:
return true;
case ARM64::ADDXri:
case AArch64::ADDXri:
// Check immediate to see if the immediate is an address.
switch (Def->getOperand(2).getType()) {
default:
@ -522,7 +522,7 @@ static bool canDefBePartOfLOH(const MachineInstr *Def) {
case MachineOperand::MO_BlockAddress:
return true;
}
case ARM64::LDRXui:
case AArch64::LDRXui:
// Check immediate to see if the immediate is an address.
switch (Def->getOperand(2).getType()) {
default:
@ -541,13 +541,13 @@ static bool isCandidateStore(const MachineInstr *Instr) {
switch (Instr->getOpcode()) {
default:
return false;
case ARM64::STRBui:
case ARM64::STRHui:
case ARM64::STRWui:
case ARM64::STRXui:
case ARM64::STRSui:
case ARM64::STRDui:
case ARM64::STRQui:
case AArch64::STRBui:
case AArch64::STRHui:
case AArch64::STRWui:
case AArch64::STRXui:
case AArch64::STRSui:
case AArch64::STRDui:
case AArch64::STRQui:
// In case we have str xA, [xA, #imm], this is two different uses
// of xA and we cannot fold, otherwise the xA stored may be wrong,
// even if #imm == 0.
@ -582,7 +582,7 @@ static void reachedUsesToDefs(InstrToInstrs &UseToReachingDefs,
MapRegToId::const_iterator It;
// if all the reaching defs are not adrp, this use will not be
// simplifiable.
if ((ADRPMode && Def->getOpcode() != ARM64::ADRP) ||
if ((ADRPMode && Def->getOpcode() != AArch64::ADRP) ||
(!ADRPMode && !canDefBePartOfLOH(Def)) ||
(!ADRPMode && isCandidateStore(MI) &&
// store are LOH candidate iff the end of the chain is used as
@ -615,7 +615,7 @@ static void reachedUsesToDefs(InstrToInstrs &UseToReachingDefs,
/// Based on the use to defs information (in ADRPMode), compute the
/// opportunities of LOH ADRP-related.
static void computeADRP(const InstrToInstrs &UseToDefs,
ARM64FunctionInfo &ARM64FI,
AArch64FunctionInfo &AArch64FI,
const MachineDominatorTree *MDT) {
DEBUG(dbgs() << "*** Compute LOH for ADRP\n");
for (const auto &Entry : UseToDefs) {
@ -634,7 +634,7 @@ static void computeADRP(const InstrToInstrs &UseToDefs,
SmallVector<const MachineInstr *, 2> Args;
Args.push_back(L2);
Args.push_back(L1);
ARM64FI.addLOHDirective(MCLOH_AdrpAdrp, Args);
AArch64FI.addLOHDirective(MCLOH_AdrpAdrp, Args);
++NumADRPSimpleCandidate;
}
#ifdef DEBUG
@ -656,19 +656,19 @@ static bool isCandidateLoad(const MachineInstr *Instr) {
switch (Instr->getOpcode()) {
default:
return false;
case ARM64::LDRSBWui:
case ARM64::LDRSBXui:
case ARM64::LDRSHWui:
case ARM64::LDRSHXui:
case ARM64::LDRSWui:
case ARM64::LDRBui:
case ARM64::LDRHui:
case ARM64::LDRWui:
case ARM64::LDRXui:
case ARM64::LDRSui:
case ARM64::LDRDui:
case ARM64::LDRQui:
if (Instr->getOperand(2).getTargetFlags() & ARM64II::MO_GOT)
case AArch64::LDRSBWui:
case AArch64::LDRSBXui:
case AArch64::LDRSHWui:
case AArch64::LDRSHXui:
case AArch64::LDRSWui:
case AArch64::LDRBui:
case AArch64::LDRHui:
case AArch64::LDRWui:
case AArch64::LDRXui:
case AArch64::LDRSui:
case AArch64::LDRDui:
case AArch64::LDRQui:
if (Instr->getOperand(2).getTargetFlags() & AArch64II::MO_GOT)
return false;
return true;
}
@ -681,12 +681,12 @@ static bool supportLoadFromLiteral(const MachineInstr *Instr) {
switch (Instr->getOpcode()) {
default:
return false;
case ARM64::LDRSWui:
case ARM64::LDRWui:
case ARM64::LDRXui:
case ARM64::LDRSui:
case ARM64::LDRDui:
case ARM64::LDRQui:
case AArch64::LDRSWui:
case AArch64::LDRWui:
case AArch64::LDRXui:
case AArch64::LDRSui:
case AArch64::LDRDui:
case AArch64::LDRQui:
return true;
}
// Unreachable.
@ -705,7 +705,7 @@ static bool isCandidate(const MachineInstr *Instr,
return false;
const MachineInstr *Def = *UseToDefs.find(Instr)->second.begin();
if (Def->getOpcode() != ARM64::ADRP) {
if (Def->getOpcode() != AArch64::ADRP) {
// At this point, Def is ADDXri or LDRXui of the right type of
// symbol, because we filtered out the uses that were not defined
// by these kind of instructions (+ ADRP).
@ -728,7 +728,7 @@ static bool isCandidate(const MachineInstr *Instr,
// - top is ADRP.
// - check the simple chain property: each intermediate node must
// dominates the next one.
if (Def->getOpcode() == ARM64::ADRP)
if (Def->getOpcode() == AArch64::ADRP)
return MDT->dominates(Def, Instr);
return false;
}
@ -736,22 +736,22 @@ static bool isCandidate(const MachineInstr *Instr,
static bool registerADRCandidate(const MachineInstr &Use,
const InstrToInstrs &UseToDefs,
const InstrToInstrs *DefsPerColorToUses,
ARM64FunctionInfo &ARM64FI,
AArch64FunctionInfo &AArch64FI,
SetOfMachineInstr *InvolvedInLOHs,
const MapRegToId &RegToId) {
// Look for opportunities to turn ADRP -> ADD or
// ADRP -> LDR GOTPAGEOFF into ADR.
// If ADRP has more than one use. Give up.
if (Use.getOpcode() != ARM64::ADDXri &&
(Use.getOpcode() != ARM64::LDRXui ||
!(Use.getOperand(2).getTargetFlags() & ARM64II::MO_GOT)))
if (Use.getOpcode() != AArch64::ADDXri &&
(Use.getOpcode() != AArch64::LDRXui ||
!(Use.getOperand(2).getTargetFlags() & AArch64II::MO_GOT)))
return false;
InstrToInstrs::const_iterator It = UseToDefs.find(&Use);
// The map may contain garbage that we need to ignore.
if (It == UseToDefs.end() || It->second.empty())
return false;
const MachineInstr &Def = **It->second.begin();
if (Def.getOpcode() != ARM64::ADRP)
if (Def.getOpcode() != AArch64::ADRP)
return false;
// Check the number of users of ADRP.
const SetOfMachineInstr *Users =
@ -772,7 +772,7 @@ static bool registerADRCandidate(const MachineInstr &Use,
Args.push_back(&Def);
Args.push_back(&Use);
ARM64FI.addLOHDirective(Use.getOpcode() == ARM64::ADDXri ? MCLOH_AdrpAdd
AArch64FI.addLOHDirective(Use.getOpcode() == AArch64::ADDXri ? MCLOH_AdrpAdd
: MCLOH_AdrpLdrGot,
Args);
return true;
@ -782,7 +782,7 @@ static bool registerADRCandidate(const MachineInstr &Use,
/// opportunities of LOH non-ADRP-related
static void computeOthers(const InstrToInstrs &UseToDefs,
const InstrToInstrs *DefsPerColorToUses,
ARM64FunctionInfo &ARM64FI, const MapRegToId &RegToId,
AArch64FunctionInfo &AArch64FI, const MapRegToId &RegToId,
const MachineDominatorTree *MDT) {
SetOfMachineInstr *InvolvedInLOHs = nullptr;
#ifdef DEBUG
@ -839,7 +839,7 @@ static void computeOthers(const InstrToInstrs &UseToDefs,
const MachineInstr *L1 = Def;
const MachineInstr *L2 = nullptr;
unsigned ImmediateDefOpc = Def->getOpcode();
if (Def->getOpcode() != ARM64::ADRP) {
if (Def->getOpcode() != AArch64::ADRP) {
// Check the number of users of this node.
const SetOfMachineInstr *Users =
getUses(DefsPerColorToUses,
@ -899,10 +899,10 @@ static void computeOthers(const InstrToInstrs &UseToDefs,
continue;
}
bool IsL2Add = (ImmediateDefOpc == ARM64::ADDXri);
bool IsL2Add = (ImmediateDefOpc == AArch64::ADDXri);
// If the chain is three instructions long and ldr is the second element,
// then this ldr must load form GOT, otherwise this is not a correct chain.
if (L2 && !IsL2Add && L2->getOperand(2).getTargetFlags() != ARM64II::MO_GOT)
if (L2 && !IsL2Add && L2->getOperand(2).getTargetFlags() != AArch64II::MO_GOT)
continue;
SmallVector<const MachineInstr *, 3> Args;
MCLOHType Kind;
@ -944,18 +944,18 @@ static void computeOthers(const InstrToInstrs &UseToDefs,
#ifdef DEBUG
// get the immediate of the load
if (Candidate->getOperand(2).getImm() == 0)
if (ImmediateDefOpc == ARM64::ADDXri)
if (ImmediateDefOpc == AArch64::ADDXri)
++NumADDToLDR;
else
++NumLDRToLDR;
else if (ImmediateDefOpc == ARM64::ADDXri)
else if (ImmediateDefOpc == AArch64::ADDXri)
++NumADDToLDRWithImm;
else
++NumLDRToLDRWithImm;
#endif // DEBUG
}
} else {
if (ImmediateDefOpc == ARM64::ADRP)
if (ImmediateDefOpc == AArch64::ADRP)
continue;
else {
@ -978,23 +978,23 @@ static void computeOthers(const InstrToInstrs &UseToDefs,
#ifdef DEBUG
// get the immediate of the store
if (Candidate->getOperand(2).getImm() == 0)
if (ImmediateDefOpc == ARM64::ADDXri)
if (ImmediateDefOpc == AArch64::ADDXri)
++NumADDToSTR;
else
++NumLDRToSTR;
else if (ImmediateDefOpc == ARM64::ADDXri)
else if (ImmediateDefOpc == AArch64::ADDXri)
++NumADDToSTRWithImm;
else
++NumLDRToSTRWithImm;
#endif // DEBUG
}
}
ARM64FI.addLOHDirective(Kind, Args);
AArch64FI.addLOHDirective(Kind, Args);
}
// Now, we grabbed all the big patterns, check ADR opportunities.
for (const MachineInstr *Candidate : PotentialADROpportunities)
registerADRCandidate(*Candidate, UseToDefs, DefsPerColorToUses, ARM64FI,
registerADRCandidate(*Candidate, UseToDefs, DefsPerColorToUses, AArch64FI,
InvolvedInLOHs, RegToId);
}
@ -1041,15 +1041,15 @@ static void collectInvolvedReg(MachineFunction &MF, MapRegToId &RegToId,
}
}
bool ARM64CollectLOH::runOnMachineFunction(MachineFunction &MF) {
bool AArch64CollectLOH::runOnMachineFunction(MachineFunction &MF) {
const TargetMachine &TM = MF.getTarget();
const TargetRegisterInfo *TRI = TM.getRegisterInfo();
const MachineDominatorTree *MDT = &getAnalysis<MachineDominatorTree>();
MapRegToId RegToId;
MapIdToReg IdToReg;
ARM64FunctionInfo *ARM64FI = MF.getInfo<ARM64FunctionInfo>();
assert(ARM64FI && "No MachineFunctionInfo for this function!");
AArch64FunctionInfo *AArch64FI = MF.getInfo<AArch64FunctionInfo>();
assert(AArch64FI && "No MachineFunctionInfo for this function!");
DEBUG(dbgs() << "Looking for LOH in " << MF.getName() << '\n');
@ -1059,11 +1059,11 @@ bool ARM64CollectLOH::runOnMachineFunction(MachineFunction &MF) {
MachineInstr *DummyOp = nullptr;
if (BasicBlockScopeOnly) {
const ARM64InstrInfo *TII =
static_cast<const ARM64InstrInfo *>(TM.getInstrInfo());
const AArch64InstrInfo *TII =
static_cast<const AArch64InstrInfo *>(TM.getInstrInfo());
// For local analysis, create a dummy operation to record uses that are not
// local.
DummyOp = MF.CreateMachineInstr(TII->get(ARM64::COPY), DebugLoc());
DummyOp = MF.CreateMachineInstr(TII->get(AArch64::COPY), DebugLoc());
}
unsigned NbReg = RegToId.size();
@ -1084,7 +1084,7 @@ bool ARM64CollectLOH::runOnMachineFunction(MachineFunction &MF) {
reachedUsesToDefs(ADRPToReachingDefs, ColorOpToReachedUses, RegToId, true);
// Compute LOH for ADRP.
computeADRP(ADRPToReachingDefs, *ARM64FI, MDT);
computeADRP(ADRPToReachingDefs, *AArch64FI, MDT);
delete[] ColorOpToReachedUses;
// Continue with general ADRP -> ADD/LDR -> LDR/STR pattern.
@ -1100,7 +1100,7 @@ bool ARM64CollectLOH::runOnMachineFunction(MachineFunction &MF) {
reachedUsesToDefs(UsesToReachingDefs, ColorOpToReachedUses, RegToId, false);
// Compute other than AdrpAdrp LOH.
computeOthers(UsesToReachingDefs, ColorOpToReachedUses, *ARM64FI, RegToId,
computeOthers(UsesToReachingDefs, ColorOpToReachedUses, *AArch64FI, RegToId,
MDT);
delete[] ColorOpToReachedUses;
@ -1110,8 +1110,8 @@ bool ARM64CollectLOH::runOnMachineFunction(MachineFunction &MF) {
return Modified;
}
/// createARM64CollectLOHPass - returns an instance of the Statistic for
/// createAArch64CollectLOHPass - returns an instance of the Statistic for
/// linker optimization pass.
FunctionPass *llvm::createARM64CollectLOHPass() {
return new ARM64CollectLOH();
FunctionPass *llvm::createAArch64CollectLOHPass() {
return new AArch64CollectLOH();
}

View File

@ -1,4 +1,4 @@
//===-- ARM64ConditionalCompares.cpp --- CCMP formation for ARM64 ---------===//
//===-- AArch64ConditionalCompares.cpp --- CCMP formation for AArch64 -----===//
//
// The LLVM Compiler Infrastructure
//
@ -7,7 +7,7 @@
//
//===----------------------------------------------------------------------===//
//
// This file implements the ARM64ConditionalCompares pass which reduces
// This file implements the AArch64ConditionalCompares pass which reduces
// branching and code size by using the conditional compare instructions CCMP,
// CCMN, and FCMP.
//
@ -17,7 +17,7 @@
//
//===----------------------------------------------------------------------===//
#include "ARM64.h"
#include "AArch64.h"
#include "llvm/ADT/BitVector.h"
#include "llvm/ADT/DepthFirstIterator.h"
#include "llvm/ADT/SetVector.h"
@ -42,16 +42,16 @@
using namespace llvm;
#define DEBUG_TYPE "arm64-ccmp"
#define DEBUG_TYPE "aarch64-ccmp"
// Absolute maximum number of instructions allowed per speculated block.
// This bypasses all other heuristics, so it should be set fairly high.
static cl::opt<unsigned> BlockInstrLimit(
"arm64-ccmp-limit", cl::init(30), cl::Hidden,
"aarch64-ccmp-limit", cl::init(30), cl::Hidden,
cl::desc("Maximum number of instructions per speculated block."));
// Stress testing mode - disable heuristics.
static cl::opt<bool> Stress("arm64-stress-ccmp", cl::Hidden,
static cl::opt<bool> Stress("aarch64-stress-ccmp", cl::Hidden,
cl::desc("Turn all knobs to 11"));
STATISTIC(NumConsidered, "Number of ccmps considered");
@ -98,7 +98,7 @@ STATISTIC(NumCompBranches, "Number of cbz/cbnz branches converted");
//
// The cmp-conversion turns the compare instruction in CmpBB into a conditional
// compare, and merges CmpBB into Head, speculatively executing its
// instructions. The ARM64 conditional compare instructions have an immediate
// instructions. The AArch64 conditional compare instructions have an immediate
// operand that specifies the NZCV flag values when the condition is false and
// the compare isn't executed. This makes it possible to chain compares with
// different condition codes.
@ -162,13 +162,13 @@ private:
SmallVector<MachineOperand, 4> HeadCond;
/// The condition code that makes Head branch to CmpBB.
ARM64CC::CondCode HeadCmpBBCC;
AArch64CC::CondCode HeadCmpBBCC;
/// The branch condition in CmpBB.
SmallVector<MachineOperand, 4> CmpBBCond;
/// The condition code that makes CmpBB branch to Tail.
ARM64CC::CondCode CmpBBTailCC;
AArch64CC::CondCode CmpBBTailCC;
/// Check if the Tail PHIs are trivially convertible.
bool trivialTailPHIs();
@ -253,11 +253,11 @@ void SSACCmpConv::updateTailPHIs() {
}
}
// This pass runs before the ARM64DeadRegisterDefinitions pass, so compares are
// still writing virtual registers without any uses.
// This pass runs before the AArch64DeadRegisterDefinitions pass, so compares
// are still writing virtual registers without any uses.
bool SSACCmpConv::isDeadDef(unsigned DstReg) {
// Writes to the zero register are dead.
if (DstReg == ARM64::WZR || DstReg == ARM64::XZR)
if (DstReg == AArch64::WZR || DstReg == AArch64::XZR)
return true;
if (!TargetRegisterInfo::isVirtualRegister(DstReg))
return false;
@ -269,11 +269,11 @@ bool SSACCmpConv::isDeadDef(unsigned DstReg) {
// Parse a condition code returned by AnalyzeBranch, and compute the CondCode
// corresponding to TBB.
// Return
static bool parseCond(ArrayRef<MachineOperand> Cond, ARM64CC::CondCode &CC) {
static bool parseCond(ArrayRef<MachineOperand> Cond, AArch64CC::CondCode &CC) {
// A normal br.cond simply has the condition code.
if (Cond[0].getImm() != -1) {
assert(Cond.size() == 1 && "Unknown Cond array format");
CC = (ARM64CC::CondCode)(int)Cond[0].getImm();
CC = (AArch64CC::CondCode)(int)Cond[0].getImm();
return true;
}
// For tbz and cbz instruction, the opcode is next.
@ -282,15 +282,15 @@ static bool parseCond(ArrayRef<MachineOperand> Cond, ARM64CC::CondCode &CC) {
// This includes tbz / tbnz branches which can't be converted to
// ccmp + br.cond.
return false;
case ARM64::CBZW:
case ARM64::CBZX:
case AArch64::CBZW:
case AArch64::CBZX:
assert(Cond.size() == 3 && "Unknown Cond array format");
CC = ARM64CC::EQ;
CC = AArch64CC::EQ;
return true;
case ARM64::CBNZW:
case ARM64::CBNZX:
case AArch64::CBNZW:
case AArch64::CBNZX:
assert(Cond.size() == 3 && "Unknown Cond array format");
CC = ARM64CC::NE;
CC = AArch64CC::NE;
return true;
}
}
@ -300,12 +300,12 @@ MachineInstr *SSACCmpConv::findConvertibleCompare(MachineBasicBlock *MBB) {
if (I == MBB->end())
return nullptr;
// The terminator must be controlled by the flags.
if (!I->readsRegister(ARM64::NZCV)) {
if (!I->readsRegister(AArch64::NZCV)) {
switch (I->getOpcode()) {
case ARM64::CBZW:
case ARM64::CBZX:
case ARM64::CBNZW:
case ARM64::CBNZX:
case AArch64::CBZW:
case AArch64::CBZX:
case AArch64::CBNZW:
case AArch64::CBNZX:
// These can be converted into a ccmp against #0.
return I;
}
@ -320,11 +320,11 @@ MachineInstr *SSACCmpConv::findConvertibleCompare(MachineBasicBlock *MBB) {
assert(!I->isTerminator() && "Spurious terminator");
switch (I->getOpcode()) {
// cmp is an alias for subs with a dead destination register.
case ARM64::SUBSWri:
case ARM64::SUBSXri:
case AArch64::SUBSWri:
case AArch64::SUBSXri:
// cmn is an alias for adds with a dead destination register.
case ARM64::ADDSWri:
case ARM64::ADDSXri:
case AArch64::ADDSWri:
case AArch64::ADDSXri:
// Check that the immediate operand is within range, ccmp wants a uimm5.
// Rd = SUBSri Rn, imm, shift
if (I->getOperand(3).getImm() || !isUInt<5>(I->getOperand(2).getImm())) {
@ -333,25 +333,25 @@ MachineInstr *SSACCmpConv::findConvertibleCompare(MachineBasicBlock *MBB) {
return nullptr;
}
// Fall through.
case ARM64::SUBSWrr:
case ARM64::SUBSXrr:
case ARM64::ADDSWrr:
case ARM64::ADDSXrr:
case AArch64::SUBSWrr:
case AArch64::SUBSXrr:
case AArch64::ADDSWrr:
case AArch64::ADDSXrr:
if (isDeadDef(I->getOperand(0).getReg()))
return I;
DEBUG(dbgs() << "Can't convert compare with live destination: " << *I);
++NumLiveDstRejs;
return nullptr;
case ARM64::FCMPSrr:
case ARM64::FCMPDrr:
case ARM64::FCMPESrr:
case ARM64::FCMPEDrr:
case AArch64::FCMPSrr:
case AArch64::FCMPDrr:
case AArch64::FCMPESrr:
case AArch64::FCMPEDrr:
return I;
}
// Check for flag reads and clobbers.
MIOperands::PhysRegInfo PRI =
MIOperands(I).analyzePhysReg(ARM64::NZCV, TRI);
MIOperands(I).analyzePhysReg(AArch64::NZCV, TRI);
if (PRI.Reads) {
// The ccmp doesn't produce exactly the same flags as the original
@ -422,7 +422,7 @@ bool SSACCmpConv::canSpeculateInstrs(MachineBasicBlock *MBB,
}
// Only CmpMI is allowed to clobber the flags.
if (&I != CmpMI && I.modifiesRegister(ARM64::NZCV, TRI)) {
if (&I != CmpMI && I.modifiesRegister(AArch64::NZCV, TRI)) {
DEBUG(dbgs() << "Clobbers flags: " << I);
return false;
}
@ -519,7 +519,7 @@ bool SSACCmpConv::canConvert(MachineBasicBlock *MBB) {
// Make sure the branch direction is right.
if (TBB != CmpBB) {
assert(TBB == Tail && "Unexpected TBB");
HeadCmpBBCC = ARM64CC::getInvertedCondCode(HeadCmpBBCC);
HeadCmpBBCC = AArch64CC::getInvertedCondCode(HeadCmpBBCC);
}
CmpBBCond.clear();
@ -543,10 +543,10 @@ bool SSACCmpConv::canConvert(MachineBasicBlock *MBB) {
}
if (TBB != Tail)
CmpBBTailCC = ARM64CC::getInvertedCondCode(CmpBBTailCC);
CmpBBTailCC = AArch64CC::getInvertedCondCode(CmpBBTailCC);
DEBUG(dbgs() << "Head->CmpBB on " << ARM64CC::getCondCodeName(HeadCmpBBCC)
<< ", CmpBB->Tail on " << ARM64CC::getCondCodeName(CmpBBTailCC)
DEBUG(dbgs() << "Head->CmpBB on " << AArch64CC::getCondCodeName(HeadCmpBBCC)
<< ", CmpBB->Tail on " << AArch64CC::getCondCodeName(CmpBBTailCC)
<< '\n');
CmpMI = findConvertibleCompare(CmpBB);
@ -579,13 +579,13 @@ void SSACCmpConv::convert(SmallVectorImpl<MachineBasicBlock *> &RemovedBlocks) {
++NumCompBranches;
unsigned Opc = 0;
switch (HeadCond[1].getImm()) {
case ARM64::CBZW:
case ARM64::CBNZW:
Opc = ARM64::SUBSWri;
case AArch64::CBZW:
case AArch64::CBNZW:
Opc = AArch64::SUBSWri;
break;
case ARM64::CBZX:
case ARM64::CBNZX:
Opc = ARM64::SUBSXri;
case AArch64::CBZX:
case AArch64::CBNZX:
Opc = AArch64::SUBSXri;
break;
default:
llvm_unreachable("Cannot convert Head branch");
@ -615,27 +615,27 @@ void SSACCmpConv::convert(SmallVectorImpl<MachineBasicBlock *> &RemovedBlocks) {
switch (CmpMI->getOpcode()) {
default:
llvm_unreachable("Unknown compare opcode");
case ARM64::SUBSWri: Opc = ARM64::CCMPWi; break;
case ARM64::SUBSWrr: Opc = ARM64::CCMPWr; break;
case ARM64::SUBSXri: Opc = ARM64::CCMPXi; break;
case ARM64::SUBSXrr: Opc = ARM64::CCMPXr; break;
case ARM64::ADDSWri: Opc = ARM64::CCMNWi; break;
case ARM64::ADDSWrr: Opc = ARM64::CCMNWr; break;
case ARM64::ADDSXri: Opc = ARM64::CCMNXi; break;
case ARM64::ADDSXrr: Opc = ARM64::CCMNXr; break;
case ARM64::FCMPSrr: Opc = ARM64::FCCMPSrr; FirstOp = 0; break;
case ARM64::FCMPDrr: Opc = ARM64::FCCMPDrr; FirstOp = 0; break;
case ARM64::FCMPESrr: Opc = ARM64::FCCMPESrr; FirstOp = 0; break;
case ARM64::FCMPEDrr: Opc = ARM64::FCCMPEDrr; FirstOp = 0; break;
case ARM64::CBZW:
case ARM64::CBNZW:
Opc = ARM64::CCMPWi;
case AArch64::SUBSWri: Opc = AArch64::CCMPWi; break;
case AArch64::SUBSWrr: Opc = AArch64::CCMPWr; break;
case AArch64::SUBSXri: Opc = AArch64::CCMPXi; break;
case AArch64::SUBSXrr: Opc = AArch64::CCMPXr; break;
case AArch64::ADDSWri: Opc = AArch64::CCMNWi; break;
case AArch64::ADDSWrr: Opc = AArch64::CCMNWr; break;
case AArch64::ADDSXri: Opc = AArch64::CCMNXi; break;
case AArch64::ADDSXrr: Opc = AArch64::CCMNXr; break;
case AArch64::FCMPSrr: Opc = AArch64::FCCMPSrr; FirstOp = 0; break;
case AArch64::FCMPDrr: Opc = AArch64::FCCMPDrr; FirstOp = 0; break;
case AArch64::FCMPESrr: Opc = AArch64::FCCMPESrr; FirstOp = 0; break;
case AArch64::FCMPEDrr: Opc = AArch64::FCCMPEDrr; FirstOp = 0; break;
case AArch64::CBZW:
case AArch64::CBNZW:
Opc = AArch64::CCMPWi;
FirstOp = 0;
isZBranch = true;
break;
case ARM64::CBZX:
case ARM64::CBNZX:
Opc = ARM64::CCMPXi;
case AArch64::CBZX:
case AArch64::CBNZX:
Opc = AArch64::CCMPXi;
FirstOp = 0;
isZBranch = true;
break;
@ -646,7 +646,7 @@ void SSACCmpConv::convert(SmallVectorImpl<MachineBasicBlock *> &RemovedBlocks) {
// The NZCV immediate operand should provide flags for the case where Head
// would have branched to Tail. These flags should cause the new Head
// terminator to branch to tail.
unsigned NZCV = ARM64CC::getNZCVToSatisfyCondCode(CmpBBTailCC);
unsigned NZCV = AArch64CC::getNZCVToSatisfyCondCode(CmpBBTailCC);
const MCInstrDesc &MCID = TII->get(Opc);
MRI->constrainRegClass(CmpMI->getOperand(FirstOp).getReg(),
TII->getRegClass(MCID, 0, TRI, *MF));
@ -665,10 +665,10 @@ void SSACCmpConv::convert(SmallVectorImpl<MachineBasicBlock *> &RemovedBlocks) {
// If CmpMI was a terminator, we need a new conditional branch to replace it.
// This now becomes a Head terminator.
if (isZBranch) {
bool isNZ = CmpMI->getOpcode() == ARM64::CBNZW ||
CmpMI->getOpcode() == ARM64::CBNZX;
BuildMI(*Head, CmpMI, CmpMI->getDebugLoc(), TII->get(ARM64::Bcc))
.addImm(isNZ ? ARM64CC::NE : ARM64CC::EQ)
bool isNZ = CmpMI->getOpcode() == AArch64::CBNZW ||
CmpMI->getOpcode() == AArch64::CBNZX;
BuildMI(*Head, CmpMI, CmpMI->getDebugLoc(), TII->get(AArch64::Bcc))
.addImm(isNZ ? AArch64CC::NE : AArch64CC::EQ)
.addOperand(CmpMI->getOperand(1)); // Branch target.
}
CmpMI->eraseFromParent();
@ -687,10 +687,10 @@ int SSACCmpConv::expectedCodeSizeDelta() const {
// plus a branch instruction.
if (HeadCond[0].getImm() == -1) {
switch (HeadCond[1].getImm()) {
case ARM64::CBZW:
case ARM64::CBNZW:
case ARM64::CBZX:
case ARM64::CBNZX:
case AArch64::CBZW:
case AArch64::CBNZW:
case AArch64::CBZX:
case AArch64::CBNZX:
// Therefore delta += 1
delta = 1;
break;
@ -706,21 +706,21 @@ int SSACCmpConv::expectedCodeSizeDelta() const {
default:
--delta;
break;
case ARM64::CBZW:
case ARM64::CBNZW:
case ARM64::CBZX:
case ARM64::CBNZX:
case AArch64::CBZW:
case AArch64::CBNZW:
case AArch64::CBZX:
case AArch64::CBNZX:
break;
}
return delta;
}
//===----------------------------------------------------------------------===//
// ARM64ConditionalCompares Pass
// AArch64ConditionalCompares Pass
//===----------------------------------------------------------------------===//
namespace {
class ARM64ConditionalCompares : public MachineFunctionPass {
class AArch64ConditionalCompares : public MachineFunctionPass {
const TargetInstrInfo *TII;
const TargetRegisterInfo *TRI;
const MCSchedModel *SchedModel;
@ -735,11 +735,11 @@ class ARM64ConditionalCompares : public MachineFunctionPass {
public:
static char ID;
ARM64ConditionalCompares() : MachineFunctionPass(ID) {}
AArch64ConditionalCompares() : MachineFunctionPass(ID) {}
void getAnalysisUsage(AnalysisUsage &AU) const override;
bool runOnMachineFunction(MachineFunction &MF) override;
const char *getPassName() const override {
return "ARM64 Conditional Compares";
return "AArch64 Conditional Compares";
}
private:
@ -751,25 +751,25 @@ private:
};
} // end anonymous namespace
char ARM64ConditionalCompares::ID = 0;
char AArch64ConditionalCompares::ID = 0;
namespace llvm {
void initializeARM64ConditionalComparesPass(PassRegistry &);
void initializeAArch64ConditionalComparesPass(PassRegistry &);
}
INITIALIZE_PASS_BEGIN(ARM64ConditionalCompares, "arm64-ccmp", "ARM64 CCMP Pass",
false, false)
INITIALIZE_PASS_BEGIN(AArch64ConditionalCompares, "aarch64-ccmp",
"AArch64 CCMP Pass", false, false)
INITIALIZE_PASS_DEPENDENCY(MachineBranchProbabilityInfo)
INITIALIZE_PASS_DEPENDENCY(MachineDominatorTree)
INITIALIZE_PASS_DEPENDENCY(MachineTraceMetrics)
INITIALIZE_PASS_END(ARM64ConditionalCompares, "arm64-ccmp", "ARM64 CCMP Pass",
false, false)
INITIALIZE_PASS_END(AArch64ConditionalCompares, "aarch64-ccmp",
"AArch64 CCMP Pass", false, false)
FunctionPass *llvm::createARM64ConditionalCompares() {
return new ARM64ConditionalCompares();
FunctionPass *llvm::createAArch64ConditionalCompares() {
return new AArch64ConditionalCompares();
}
void ARM64ConditionalCompares::getAnalysisUsage(AnalysisUsage &AU) const {
void AArch64ConditionalCompares::getAnalysisUsage(AnalysisUsage &AU) const {
AU.addRequired<MachineBranchProbabilityInfo>();
AU.addRequired<MachineDominatorTree>();
AU.addPreserved<MachineDominatorTree>();
@ -781,8 +781,8 @@ void ARM64ConditionalCompares::getAnalysisUsage(AnalysisUsage &AU) const {
}
/// Update the dominator tree after if-conversion erased some blocks.
void
ARM64ConditionalCompares::updateDomTree(ArrayRef<MachineBasicBlock *> Removed) {
void AArch64ConditionalCompares::updateDomTree(
ArrayRef<MachineBasicBlock *> Removed) {
// convert() removes CmpBB which was previously dominated by Head.
// CmpBB children should be transferred to Head.
MachineDomTreeNode *HeadNode = DomTree->getNode(CmpConv.Head);
@ -798,7 +798,7 @@ ARM64ConditionalCompares::updateDomTree(ArrayRef<MachineBasicBlock *> Removed) {
/// Update LoopInfo after if-conversion.
void
ARM64ConditionalCompares::updateLoops(ArrayRef<MachineBasicBlock *> Removed) {
AArch64ConditionalCompares::updateLoops(ArrayRef<MachineBasicBlock *> Removed) {
if (!Loops)
return;
for (unsigned i = 0, e = Removed.size(); i != e; ++i)
@ -806,7 +806,7 @@ ARM64ConditionalCompares::updateLoops(ArrayRef<MachineBasicBlock *> Removed) {
}
/// Invalidate MachineTraceMetrics before if-conversion.
void ARM64ConditionalCompares::invalidateTraces() {
void AArch64ConditionalCompares::invalidateTraces() {
Traces->invalidate(CmpConv.Head);
Traces->invalidate(CmpConv.CmpBB);
}
@ -814,7 +814,7 @@ void ARM64ConditionalCompares::invalidateTraces() {
/// Apply cost model and heuristics to the if-conversion in IfConv.
/// Return true if the conversion is a good idea.
///
bool ARM64ConditionalCompares::shouldConvert() {
bool AArch64ConditionalCompares::shouldConvert() {
// Stress testing mode disables all cost considerations.
if (Stress)
return true;
@ -875,7 +875,7 @@ bool ARM64ConditionalCompares::shouldConvert() {
return true;
}
bool ARM64ConditionalCompares::tryConvert(MachineBasicBlock *MBB) {
bool AArch64ConditionalCompares::tryConvert(MachineBasicBlock *MBB) {
bool Changed = false;
while (CmpConv.canConvert(MBB) && shouldConvert()) {
invalidateTraces();
@ -888,8 +888,8 @@ bool ARM64ConditionalCompares::tryConvert(MachineBasicBlock *MBB) {
return Changed;
}
bool ARM64ConditionalCompares::runOnMachineFunction(MachineFunction &MF) {
DEBUG(dbgs() << "********** ARM64 Conditional Compares **********\n"
bool AArch64ConditionalCompares::runOnMachineFunction(MachineFunction &MF) {
DEBUG(dbgs() << "********** AArch64 Conditional Compares **********\n"
<< "********** Function: " << MF.getName() << '\n');
TII = MF.getTarget().getInstrInfo();
TRI = MF.getTarget().getRegisterInfo();

View File

@ -1,4 +1,4 @@
//===-- ARM64DeadRegisterDefinitions.cpp - Replace dead defs w/ zero reg --===//
//==-- AArch64DeadRegisterDefinitions.cpp - Replace dead defs w/ zero reg --==//
//
// The LLVM Compiler Infrastructure
//
@ -11,8 +11,8 @@
// hardware's register renamer.
//===----------------------------------------------------------------------===//
#include "ARM64.h"
#include "ARM64RegisterInfo.h"
#include "AArch64.h"
#include "AArch64RegisterInfo.h"
#include "llvm/ADT/Statistic.h"
#include "llvm/CodeGen/MachineFunctionPass.h"
#include "llvm/CodeGen/MachineFunction.h"
@ -21,12 +21,12 @@
#include "llvm/Support/raw_ostream.h"
using namespace llvm;
#define DEBUG_TYPE "arm64-dead-defs"
#define DEBUG_TYPE "aarch64-dead-defs"
STATISTIC(NumDeadDefsReplaced, "Number of dead definitions replaced");
namespace {
class ARM64DeadRegisterDefinitions : public MachineFunctionPass {
class AArch64DeadRegisterDefinitions : public MachineFunctionPass {
private:
const TargetRegisterInfo *TRI;
bool implicitlyDefinesOverlappingReg(unsigned Reg, const MachineInstr &MI);
@ -34,7 +34,7 @@ private:
bool usesFrameIndex(const MachineInstr &MI);
public:
static char ID; // Pass identification, replacement for typeid.
explicit ARM64DeadRegisterDefinitions() : MachineFunctionPass(ID) {}
explicit AArch64DeadRegisterDefinitions() : MachineFunctionPass(ID) {}
virtual bool runOnMachineFunction(MachineFunction &F) override;
@ -45,10 +45,10 @@ public:
MachineFunctionPass::getAnalysisUsage(AU);
}
};
char ARM64DeadRegisterDefinitions::ID = 0;
char AArch64DeadRegisterDefinitions::ID = 0;
} // end anonymous namespace
bool ARM64DeadRegisterDefinitions::implicitlyDefinesOverlappingReg(
bool AArch64DeadRegisterDefinitions::implicitlyDefinesOverlappingReg(
unsigned Reg, const MachineInstr &MI) {
for (const MachineOperand &MO : MI.implicit_operands())
if (MO.isReg() && MO.isDef())
@ -57,15 +57,15 @@ bool ARM64DeadRegisterDefinitions::implicitlyDefinesOverlappingReg(
return false;
}
bool ARM64DeadRegisterDefinitions::usesFrameIndex(const MachineInstr &MI) {
bool AArch64DeadRegisterDefinitions::usesFrameIndex(const MachineInstr &MI) {
for (const MachineOperand &Op : MI.uses())
if (Op.isFI())
return true;
return false;
}
bool
ARM64DeadRegisterDefinitions::processMachineBasicBlock(MachineBasicBlock &MBB) {
bool AArch64DeadRegisterDefinitions::processMachineBasicBlock(
MachineBasicBlock &MBB) {
bool Changed = false;
for (MachineInstr &MI : MBB) {
if (usesFrameIndex(MI)) {
@ -99,11 +99,11 @@ ARM64DeadRegisterDefinitions::processMachineBasicBlock(MachineBasicBlock &MBB) {
default:
DEBUG(dbgs() << " Ignoring, register is not a GPR.\n");
continue;
case ARM64::GPR32RegClassID:
NewReg = ARM64::WZR;
case AArch64::GPR32RegClassID:
NewReg = AArch64::WZR;
break;
case ARM64::GPR64RegClassID:
NewReg = ARM64::XZR;
case AArch64::GPR64RegClassID:
NewReg = AArch64::XZR;
break;
}
DEBUG(dbgs() << " Replacing with zero register. New:\n ");
@ -118,10 +118,10 @@ ARM64DeadRegisterDefinitions::processMachineBasicBlock(MachineBasicBlock &MBB) {
// Scan the function for instructions that have a dead definition of a
// register. Replace that register with the zero register when possible.
bool ARM64DeadRegisterDefinitions::runOnMachineFunction(MachineFunction &MF) {
bool AArch64DeadRegisterDefinitions::runOnMachineFunction(MachineFunction &MF) {
TRI = MF.getTarget().getRegisterInfo();
bool Changed = false;
DEBUG(dbgs() << "***** ARM64DeadRegisterDefinitions *****\n");
DEBUG(dbgs() << "***** AArch64DeadRegisterDefinitions *****\n");
for (auto &MBB : MF)
if (processMachineBasicBlock(MBB))
@ -129,6 +129,6 @@ bool ARM64DeadRegisterDefinitions::runOnMachineFunction(MachineFunction &MF) {
return Changed;
}
FunctionPass *llvm::createARM64DeadRegisterDefinitions() {
return new ARM64DeadRegisterDefinitions();
FunctionPass *llvm::createAArch64DeadRegisterDefinitions() {
return new AArch64DeadRegisterDefinitions();
}

View File

@ -1,4 +1,4 @@
//===-- ARM64ExpandPseudoInsts.cpp - Expand pseudo instructions ---*- C++ -*-=//
//==-- AArch64ExpandPseudoInsts.cpp - Expand pseudo instructions --*- C++ -*-=//
//
// The LLVM Compiler Infrastructure
//
@ -14,25 +14,25 @@
//
//===----------------------------------------------------------------------===//
#include "MCTargetDesc/ARM64AddressingModes.h"
#include "ARM64InstrInfo.h"
#include "MCTargetDesc/AArch64AddressingModes.h"
#include "AArch64InstrInfo.h"
#include "llvm/CodeGen/MachineFunctionPass.h"
#include "llvm/CodeGen/MachineInstrBuilder.h"
#include "llvm/Support/MathExtras.h"
using namespace llvm;
namespace {
class ARM64ExpandPseudo : public MachineFunctionPass {
class AArch64ExpandPseudo : public MachineFunctionPass {
public:
static char ID;
ARM64ExpandPseudo() : MachineFunctionPass(ID) {}
AArch64ExpandPseudo() : MachineFunctionPass(ID) {}
const ARM64InstrInfo *TII;
const AArch64InstrInfo *TII;
bool runOnMachineFunction(MachineFunction &Fn) override;
const char *getPassName() const override {
return "ARM64 pseudo instruction expansion pass";
return "AArch64 pseudo instruction expansion pass";
}
private:
@ -41,7 +41,7 @@ private:
bool expandMOVImm(MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI,
unsigned BitSize);
};
char ARM64ExpandPseudo::ID = 0;
char AArch64ExpandPseudo::ID = 0;
}
/// \brief Transfer implicit operands on the pseudo instruction to the
@ -87,17 +87,17 @@ static uint64_t replicateChunk(uint64_t Imm, unsigned FromIdx, unsigned ToIdx) {
static bool tryOrrMovk(uint64_t UImm, uint64_t OrrImm, MachineInstr &MI,
MachineBasicBlock &MBB,
MachineBasicBlock::iterator &MBBI,
const ARM64InstrInfo *TII, unsigned ChunkIdx) {
const AArch64InstrInfo *TII, unsigned ChunkIdx) {
assert(ChunkIdx < 4 && "Out of range chunk index specified!");
const unsigned ShiftAmt = ChunkIdx * 16;
uint64_t Encoding;
if (ARM64_AM::processLogicalImmediate(OrrImm, 64, Encoding)) {
if (AArch64_AM::processLogicalImmediate(OrrImm, 64, Encoding)) {
// Create the ORR-immediate instruction.
MachineInstrBuilder MIB =
BuildMI(MBB, MBBI, MI.getDebugLoc(), TII->get(ARM64::ORRXri))
BuildMI(MBB, MBBI, MI.getDebugLoc(), TII->get(AArch64::ORRXri))
.addOperand(MI.getOperand(0))
.addReg(ARM64::XZR)
.addReg(AArch64::XZR)
.addImm(Encoding);
// Create the MOVK instruction.
@ -105,11 +105,11 @@ static bool tryOrrMovk(uint64_t UImm, uint64_t OrrImm, MachineInstr &MI,
const unsigned DstReg = MI.getOperand(0).getReg();
const bool DstIsDead = MI.getOperand(0).isDead();
MachineInstrBuilder MIB1 =
BuildMI(MBB, MBBI, MI.getDebugLoc(), TII->get(ARM64::MOVKXi))
BuildMI(MBB, MBBI, MI.getDebugLoc(), TII->get(AArch64::MOVKXi))
.addReg(DstReg, RegState::Define | getDeadRegState(DstIsDead))
.addReg(DstReg)
.addImm(Imm16)
.addImm(ARM64_AM::getShifterImm(ARM64_AM::LSL, ShiftAmt));
.addImm(AArch64_AM::getShifterImm(AArch64_AM::LSL, ShiftAmt));
transferImpOps(MI, MIB, MIB1);
MI.eraseFromParent();
@ -124,7 +124,7 @@ static bool tryOrrMovk(uint64_t UImm, uint64_t OrrImm, MachineInstr &MI,
static bool canUseOrr(uint64_t Chunk, uint64_t &Encoding) {
Chunk = (Chunk << 48) | (Chunk << 32) | (Chunk << 16) | Chunk;
return ARM64_AM::processLogicalImmediate(Chunk, 64, Encoding);
return AArch64_AM::processLogicalImmediate(Chunk, 64, Encoding);
}
/// \brief Check for identical 16-bit chunks within the constant and if so
@ -138,7 +138,7 @@ static bool canUseOrr(uint64_t Chunk, uint64_t &Encoding) {
static bool tryToreplicateChunks(uint64_t UImm, MachineInstr &MI,
MachineBasicBlock &MBB,
MachineBasicBlock::iterator &MBBI,
const ARM64InstrInfo *TII) {
const AArch64InstrInfo *TII) {
typedef DenseMap<uint64_t, unsigned> CountMap;
CountMap Counts;
@ -162,9 +162,9 @@ static bool tryToreplicateChunks(uint64_t UImm, MachineInstr &MI,
const bool CountThree = Count == 3;
// Create the ORR-immediate instruction.
MachineInstrBuilder MIB =
BuildMI(MBB, MBBI, MI.getDebugLoc(), TII->get(ARM64::ORRXri))
BuildMI(MBB, MBBI, MI.getDebugLoc(), TII->get(AArch64::ORRXri))
.addOperand(MI.getOperand(0))
.addReg(ARM64::XZR)
.addReg(AArch64::XZR)
.addImm(Encoding);
const unsigned DstReg = MI.getOperand(0).getReg();
@ -182,12 +182,12 @@ static bool tryToreplicateChunks(uint64_t UImm, MachineInstr &MI,
// Create the first MOVK instruction.
MachineInstrBuilder MIB1 =
BuildMI(MBB, MBBI, MI.getDebugLoc(), TII->get(ARM64::MOVKXi))
BuildMI(MBB, MBBI, MI.getDebugLoc(), TII->get(AArch64::MOVKXi))
.addReg(DstReg,
RegState::Define | getDeadRegState(DstIsDead && CountThree))
.addReg(DstReg)
.addImm(Imm16)
.addImm(ARM64_AM::getShifterImm(ARM64_AM::LSL, ShiftAmt));
.addImm(AArch64_AM::getShifterImm(AArch64_AM::LSL, ShiftAmt));
// In case we have three instances the whole constant is now materialized
// and we can exit.
@ -207,11 +207,11 @@ static bool tryToreplicateChunks(uint64_t UImm, MachineInstr &MI,
// Create the second MOVK instruction.
MachineInstrBuilder MIB2 =
BuildMI(MBB, MBBI, MI.getDebugLoc(), TII->get(ARM64::MOVKXi))
BuildMI(MBB, MBBI, MI.getDebugLoc(), TII->get(AArch64::MOVKXi))
.addReg(DstReg, RegState::Define | getDeadRegState(DstIsDead))
.addReg(DstReg)
.addImm(Imm16)
.addImm(ARM64_AM::getShifterImm(ARM64_AM::LSL, ShiftAmt));
.addImm(AArch64_AM::getShifterImm(AArch64_AM::LSL, ShiftAmt));
transferImpOps(MI, MIB, MIB2);
MI.eraseFromParent();
@ -272,7 +272,7 @@ static uint64_t updateImm(uint64_t Imm, unsigned Idx, bool Clear) {
static bool trySequenceOfOnes(uint64_t UImm, MachineInstr &MI,
MachineBasicBlock &MBB,
MachineBasicBlock::iterator &MBBI,
const ARM64InstrInfo *TII) {
const AArch64InstrInfo *TII) {
const int NotSet = -1;
const uint64_t Mask = 0xFFFF;
@ -343,11 +343,11 @@ static bool trySequenceOfOnes(uint64_t UImm, MachineInstr &MI,
// Create the ORR-immediate instruction.
uint64_t Encoding = 0;
ARM64_AM::processLogicalImmediate(OrrImm, 64, Encoding);
AArch64_AM::processLogicalImmediate(OrrImm, 64, Encoding);
MachineInstrBuilder MIB =
BuildMI(MBB, MBBI, MI.getDebugLoc(), TII->get(ARM64::ORRXri))
BuildMI(MBB, MBBI, MI.getDebugLoc(), TII->get(AArch64::ORRXri))
.addOperand(MI.getOperand(0))
.addReg(ARM64::XZR)
.addReg(AArch64::XZR)
.addImm(Encoding);
const unsigned DstReg = MI.getOperand(0).getReg();
@ -356,12 +356,13 @@ static bool trySequenceOfOnes(uint64_t UImm, MachineInstr &MI,
const bool SingleMovk = SecondMovkIdx == NotSet;
// Create the first MOVK instruction.
MachineInstrBuilder MIB1 =
BuildMI(MBB, MBBI, MI.getDebugLoc(), TII->get(ARM64::MOVKXi))
BuildMI(MBB, MBBI, MI.getDebugLoc(), TII->get(AArch64::MOVKXi))
.addReg(DstReg,
RegState::Define | getDeadRegState(DstIsDead && SingleMovk))
.addReg(DstReg)
.addImm(getChunk(UImm, FirstMovkIdx))
.addImm(ARM64_AM::getShifterImm(ARM64_AM::LSL, FirstMovkIdx * 16));
.addImm(
AArch64_AM::getShifterImm(AArch64_AM::LSL, FirstMovkIdx * 16));
// Early exit in case we only need to emit a single MOVK instruction.
if (SingleMovk) {
@ -372,11 +373,12 @@ static bool trySequenceOfOnes(uint64_t UImm, MachineInstr &MI,
// Create the second MOVK instruction.
MachineInstrBuilder MIB2 =
BuildMI(MBB, MBBI, MI.getDebugLoc(), TII->get(ARM64::MOVKXi))
BuildMI(MBB, MBBI, MI.getDebugLoc(), TII->get(AArch64::MOVKXi))
.addReg(DstReg, RegState::Define | getDeadRegState(DstIsDead))
.addReg(DstReg)
.addImm(getChunk(UImm, SecondMovkIdx))
.addImm(ARM64_AM::getShifterImm(ARM64_AM::LSL, SecondMovkIdx * 16));
.addImm(
AArch64_AM::getShifterImm(AArch64_AM::LSL, SecondMovkIdx * 16));
transferImpOps(MI, MIB, MIB2);
MI.eraseFromParent();
@ -385,9 +387,9 @@ static bool trySequenceOfOnes(uint64_t UImm, MachineInstr &MI,
/// \brief Expand a MOVi32imm or MOVi64imm pseudo instruction to one or more
/// real move-immediate instructions to synthesize the immediate.
bool ARM64ExpandPseudo::expandMOVImm(MachineBasicBlock &MBB,
MachineBasicBlock::iterator MBBI,
unsigned BitSize) {
bool AArch64ExpandPseudo::expandMOVImm(MachineBasicBlock &MBB,
MachineBasicBlock::iterator MBBI,
unsigned BitSize) {
MachineInstr &MI = *MBBI;
uint64_t Imm = MI.getOperand(1).getImm();
const unsigned Mask = 0xFFFF;
@ -395,12 +397,12 @@ bool ARM64ExpandPseudo::expandMOVImm(MachineBasicBlock &MBB,
// Try a MOVI instruction (aka ORR-immediate with the zero register).
uint64_t UImm = Imm << (64 - BitSize) >> (64 - BitSize);
uint64_t Encoding;
if (ARM64_AM::processLogicalImmediate(UImm, BitSize, Encoding)) {
unsigned Opc = (BitSize == 32 ? ARM64::ORRWri : ARM64::ORRXri);
if (AArch64_AM::processLogicalImmediate(UImm, BitSize, Encoding)) {
unsigned Opc = (BitSize == 32 ? AArch64::ORRWri : AArch64::ORRXri);
MachineInstrBuilder MIB =
BuildMI(MBB, MBBI, MI.getDebugLoc(), TII->get(Opc))
.addOperand(MI.getOperand(0))
.addReg(BitSize == 32 ? ARM64::WZR : ARM64::XZR)
.addReg(BitSize == 32 ? AArch64::WZR : AArch64::XZR)
.addImm(Encoding);
transferImpOps(MI, MIB, MIB);
MI.eraseFromParent();
@ -504,9 +506,9 @@ bool ARM64ExpandPseudo::expandMOVImm(MachineBasicBlock &MBB,
unsigned FirstOpc;
if (BitSize == 32) {
Imm &= (1LL << 32) - 1;
FirstOpc = (isNeg ? ARM64::MOVNWi : ARM64::MOVZWi);
FirstOpc = (isNeg ? AArch64::MOVNWi : AArch64::MOVZWi);
} else {
FirstOpc = (isNeg ? ARM64::MOVNXi : ARM64::MOVZXi);
FirstOpc = (isNeg ? AArch64::MOVNXi : AArch64::MOVZXi);
}
unsigned Shift = 0; // LSL amount for high bits with MOVZ/MOVN
unsigned LastShift = 0; // LSL amount for last MOVK
@ -524,7 +526,7 @@ bool ARM64ExpandPseudo::expandMOVImm(MachineBasicBlock &MBB,
.addReg(DstReg, RegState::Define |
getDeadRegState(DstIsDead && Shift == LastShift))
.addImm(Imm16)
.addImm(ARM64_AM::getShifterImm(ARM64_AM::LSL, Shift));
.addImm(AArch64_AM::getShifterImm(AArch64_AM::LSL, Shift));
// If a MOVN was used for the high bits of a negative value, flip the rest
// of the bits back for use with MOVK.
@ -538,7 +540,7 @@ bool ARM64ExpandPseudo::expandMOVImm(MachineBasicBlock &MBB,
}
MachineInstrBuilder MIB2;
unsigned Opc = (BitSize == 32 ? ARM64::MOVKWi : ARM64::MOVKXi);
unsigned Opc = (BitSize == 32 ? AArch64::MOVKWi : AArch64::MOVKXi);
while (Shift != LastShift) {
Shift -= 16;
Imm16 = (Imm >> Shift) & Mask;
@ -550,7 +552,7 @@ bool ARM64ExpandPseudo::expandMOVImm(MachineBasicBlock &MBB,
getDeadRegState(DstIsDead && Shift == LastShift))
.addReg(DstReg)
.addImm(Imm16)
.addImm(ARM64_AM::getShifterImm(ARM64_AM::LSL, Shift));
.addImm(AArch64_AM::getShifterImm(AArch64_AM::LSL, Shift));
}
transferImpOps(MI, MIB1, MIB2);
@ -560,7 +562,7 @@ bool ARM64ExpandPseudo::expandMOVImm(MachineBasicBlock &MBB,
/// \brief If MBBI references a pseudo instruction that should be expanded here,
/// do the expansion and return true. Otherwise return false.
bool ARM64ExpandPseudo::expandMI(MachineBasicBlock &MBB,
bool AArch64ExpandPseudo::expandMI(MachineBasicBlock &MBB,
MachineBasicBlock::iterator MBBI) {
MachineInstr &MI = *MBBI;
unsigned Opcode = MI.getOpcode();
@ -568,75 +570,76 @@ bool ARM64ExpandPseudo::expandMI(MachineBasicBlock &MBB,
default:
break;
case ARM64::ADDWrr:
case ARM64::SUBWrr:
case ARM64::ADDXrr:
case ARM64::SUBXrr:
case ARM64::ADDSWrr:
case ARM64::SUBSWrr:
case ARM64::ADDSXrr:
case ARM64::SUBSXrr:
case ARM64::ANDWrr:
case ARM64::ANDXrr:
case ARM64::BICWrr:
case ARM64::BICXrr:
case ARM64::ANDSWrr:
case ARM64::ANDSXrr:
case ARM64::BICSWrr:
case ARM64::BICSXrr:
case ARM64::EONWrr:
case ARM64::EONXrr:
case ARM64::EORWrr:
case ARM64::EORXrr:
case ARM64::ORNWrr:
case ARM64::ORNXrr:
case ARM64::ORRWrr:
case ARM64::ORRXrr: {
case AArch64::ADDWrr:
case AArch64::SUBWrr:
case AArch64::ADDXrr:
case AArch64::SUBXrr:
case AArch64::ADDSWrr:
case AArch64::SUBSWrr:
case AArch64::ADDSXrr:
case AArch64::SUBSXrr:
case AArch64::ANDWrr:
case AArch64::ANDXrr:
case AArch64::BICWrr:
case AArch64::BICXrr:
case AArch64::ANDSWrr:
case AArch64::ANDSXrr:
case AArch64::BICSWrr:
case AArch64::BICSXrr:
case AArch64::EONWrr:
case AArch64::EONXrr:
case AArch64::EORWrr:
case AArch64::EORXrr:
case AArch64::ORNWrr:
case AArch64::ORNXrr:
case AArch64::ORRWrr:
case AArch64::ORRXrr: {
unsigned Opcode;
switch (MI.getOpcode()) {
default:
return false;
case ARM64::ADDWrr: Opcode = ARM64::ADDWrs; break;
case ARM64::SUBWrr: Opcode = ARM64::SUBWrs; break;
case ARM64::ADDXrr: Opcode = ARM64::ADDXrs; break;
case ARM64::SUBXrr: Opcode = ARM64::SUBXrs; break;
case ARM64::ADDSWrr: Opcode = ARM64::ADDSWrs; break;
case ARM64::SUBSWrr: Opcode = ARM64::SUBSWrs; break;
case ARM64::ADDSXrr: Opcode = ARM64::ADDSXrs; break;
case ARM64::SUBSXrr: Opcode = ARM64::SUBSXrs; break;
case ARM64::ANDWrr: Opcode = ARM64::ANDWrs; break;
case ARM64::ANDXrr: Opcode = ARM64::ANDXrs; break;
case ARM64::BICWrr: Opcode = ARM64::BICWrs; break;
case ARM64::BICXrr: Opcode = ARM64::BICXrs; break;
case ARM64::ANDSWrr: Opcode = ARM64::ANDSWrs; break;
case ARM64::ANDSXrr: Opcode = ARM64::ANDSXrs; break;
case ARM64::BICSWrr: Opcode = ARM64::BICSWrs; break;
case ARM64::BICSXrr: Opcode = ARM64::BICSXrs; break;
case ARM64::EONWrr: Opcode = ARM64::EONWrs; break;
case ARM64::EONXrr: Opcode = ARM64::EONXrs; break;
case ARM64::EORWrr: Opcode = ARM64::EORWrs; break;
case ARM64::EORXrr: Opcode = ARM64::EORXrs; break;
case ARM64::ORNWrr: Opcode = ARM64::ORNWrs; break;
case ARM64::ORNXrr: Opcode = ARM64::ORNXrs; break;
case ARM64::ORRWrr: Opcode = ARM64::ORRWrs; break;
case ARM64::ORRXrr: Opcode = ARM64::ORRXrs; break;
case AArch64::ADDWrr: Opcode = AArch64::ADDWrs; break;
case AArch64::SUBWrr: Opcode = AArch64::SUBWrs; break;
case AArch64::ADDXrr: Opcode = AArch64::ADDXrs; break;
case AArch64::SUBXrr: Opcode = AArch64::SUBXrs; break;
case AArch64::ADDSWrr: Opcode = AArch64::ADDSWrs; break;
case AArch64::SUBSWrr: Opcode = AArch64::SUBSWrs; break;
case AArch64::ADDSXrr: Opcode = AArch64::ADDSXrs; break;
case AArch64::SUBSXrr: Opcode = AArch64::SUBSXrs; break;
case AArch64::ANDWrr: Opcode = AArch64::ANDWrs; break;
case AArch64::ANDXrr: Opcode = AArch64::ANDXrs; break;
case AArch64::BICWrr: Opcode = AArch64::BICWrs; break;
case AArch64::BICXrr: Opcode = AArch64::BICXrs; break;
case AArch64::ANDSWrr: Opcode = AArch64::ANDSWrs; break;
case AArch64::ANDSXrr: Opcode = AArch64::ANDSXrs; break;
case AArch64::BICSWrr: Opcode = AArch64::BICSWrs; break;
case AArch64::BICSXrr: Opcode = AArch64::BICSXrs; break;
case AArch64::EONWrr: Opcode = AArch64::EONWrs; break;
case AArch64::EONXrr: Opcode = AArch64::EONXrs; break;
case AArch64::EORWrr: Opcode = AArch64::EORWrs; break;
case AArch64::EORXrr: Opcode = AArch64::EORXrs; break;
case AArch64::ORNWrr: Opcode = AArch64::ORNWrs; break;
case AArch64::ORNXrr: Opcode = AArch64::ORNXrs; break;
case AArch64::ORRWrr: Opcode = AArch64::ORRWrs; break;
case AArch64::ORRXrr: Opcode = AArch64::ORRXrs; break;
}
MachineInstrBuilder MIB1 =
BuildMI(MBB, MBBI, MI.getDebugLoc(), TII->get(Opcode),
MI.getOperand(0).getReg())
.addOperand(MI.getOperand(1))
.addOperand(MI.getOperand(2))
.addImm(ARM64_AM::getShifterImm(ARM64_AM::LSL, 0));
.addImm(AArch64_AM::getShifterImm(AArch64_AM::LSL, 0));
transferImpOps(MI, MIB1, MIB1);
MI.eraseFromParent();
return true;
}
case ARM64::FCVTSHpseudo: {
case AArch64::FCVTSHpseudo: {
MachineOperand Src = MI.getOperand(1);
Src.setImplicit();
unsigned SrcH = TII->getRegisterInfo().getSubReg(Src.getReg(), ARM64::hsub);
auto MIB = BuildMI(MBB, MBBI, MI.getDebugLoc(), TII->get(ARM64::FCVTSHr))
unsigned SrcH =
TII->getRegisterInfo().getSubReg(Src.getReg(), AArch64::hsub);
auto MIB = BuildMI(MBB, MBBI, MI.getDebugLoc(), TII->get(AArch64::FCVTSHr))
.addOperand(MI.getOperand(0))
.addReg(SrcH, RegState::Undef)
.addOperand(Src);
@ -644,33 +647,34 @@ bool ARM64ExpandPseudo::expandMI(MachineBasicBlock &MBB,
MI.eraseFromParent();
return true;
}
case ARM64::LOADgot: {
case AArch64::LOADgot: {
// Expand into ADRP + LDR.
unsigned DstReg = MI.getOperand(0).getReg();
const MachineOperand &MO1 = MI.getOperand(1);
unsigned Flags = MO1.getTargetFlags();
MachineInstrBuilder MIB1 =
BuildMI(MBB, MBBI, MI.getDebugLoc(), TII->get(ARM64::ADRP), DstReg);
BuildMI(MBB, MBBI, MI.getDebugLoc(), TII->get(AArch64::ADRP), DstReg);
MachineInstrBuilder MIB2 =
BuildMI(MBB, MBBI, MI.getDebugLoc(), TII->get(ARM64::LDRXui))
BuildMI(MBB, MBBI, MI.getDebugLoc(), TII->get(AArch64::LDRXui))
.addOperand(MI.getOperand(0))
.addReg(DstReg);
if (MO1.isGlobal()) {
MIB1.addGlobalAddress(MO1.getGlobal(), 0, Flags | ARM64II::MO_PAGE);
MIB1.addGlobalAddress(MO1.getGlobal(), 0, Flags | AArch64II::MO_PAGE);
MIB2.addGlobalAddress(MO1.getGlobal(), 0,
Flags | ARM64II::MO_PAGEOFF | ARM64II::MO_NC);
Flags | AArch64II::MO_PAGEOFF | AArch64II::MO_NC);
} else if (MO1.isSymbol()) {
MIB1.addExternalSymbol(MO1.getSymbolName(), Flags | ARM64II::MO_PAGE);
MIB1.addExternalSymbol(MO1.getSymbolName(), Flags | AArch64II::MO_PAGE);
MIB2.addExternalSymbol(MO1.getSymbolName(),
Flags | ARM64II::MO_PAGEOFF | ARM64II::MO_NC);
Flags | AArch64II::MO_PAGEOFF | AArch64II::MO_NC);
} else {
assert(MO1.isCPI() &&
"Only expect globals, externalsymbols, or constant pools");
MIB1.addConstantPoolIndex(MO1.getIndex(), MO1.getOffset(),
Flags | ARM64II::MO_PAGE);
Flags | AArch64II::MO_PAGE);
MIB2.addConstantPoolIndex(MO1.getIndex(), MO1.getOffset(),
Flags | ARM64II::MO_PAGEOFF | ARM64II::MO_NC);
Flags | AArch64II::MO_PAGEOFF |
AArch64II::MO_NC);
}
transferImpOps(MI, MIB1, MIB2);
@ -678,20 +682,20 @@ bool ARM64ExpandPseudo::expandMI(MachineBasicBlock &MBB,
return true;
}
case ARM64::MOVaddr:
case ARM64::MOVaddrJT:
case ARM64::MOVaddrCP:
case ARM64::MOVaddrBA:
case ARM64::MOVaddrTLS:
case ARM64::MOVaddrEXT: {
case AArch64::MOVaddr:
case AArch64::MOVaddrJT:
case AArch64::MOVaddrCP:
case AArch64::MOVaddrBA:
case AArch64::MOVaddrTLS:
case AArch64::MOVaddrEXT: {
// Expand into ADRP + ADD.
unsigned DstReg = MI.getOperand(0).getReg();
MachineInstrBuilder MIB1 =
BuildMI(MBB, MBBI, MI.getDebugLoc(), TII->get(ARM64::ADRP), DstReg)
BuildMI(MBB, MBBI, MI.getDebugLoc(), TII->get(AArch64::ADRP), DstReg)
.addOperand(MI.getOperand(1));
MachineInstrBuilder MIB2 =
BuildMI(MBB, MBBI, MI.getDebugLoc(), TII->get(ARM64::ADDXri))
BuildMI(MBB, MBBI, MI.getDebugLoc(), TII->get(AArch64::ADDXri))
.addOperand(MI.getOperand(0))
.addReg(DstReg)
.addOperand(MI.getOperand(2))
@ -702,13 +706,13 @@ bool ARM64ExpandPseudo::expandMI(MachineBasicBlock &MBB,
return true;
}
case ARM64::MOVi32imm:
case AArch64::MOVi32imm:
return expandMOVImm(MBB, MBBI, 32);
case ARM64::MOVi64imm:
case AArch64::MOVi64imm:
return expandMOVImm(MBB, MBBI, 64);
case ARM64::RET_ReallyLR:
BuildMI(MBB, MBBI, MI.getDebugLoc(), TII->get(ARM64::RET))
.addReg(ARM64::LR);
case AArch64::RET_ReallyLR:
BuildMI(MBB, MBBI, MI.getDebugLoc(), TII->get(AArch64::RET))
.addReg(AArch64::LR);
MI.eraseFromParent();
return true;
}
@ -717,7 +721,7 @@ bool ARM64ExpandPseudo::expandMI(MachineBasicBlock &MBB,
/// \brief Iterate over the instructions in basic block MBB and expand any
/// pseudo instructions. Return true if anything was modified.
bool ARM64ExpandPseudo::expandMBB(MachineBasicBlock &MBB) {
bool AArch64ExpandPseudo::expandMBB(MachineBasicBlock &MBB) {
bool Modified = false;
MachineBasicBlock::iterator MBBI = MBB.begin(), E = MBB.end();
@ -730,8 +734,8 @@ bool ARM64ExpandPseudo::expandMBB(MachineBasicBlock &MBB) {
return Modified;
}
bool ARM64ExpandPseudo::runOnMachineFunction(MachineFunction &MF) {
TII = static_cast<const ARM64InstrInfo *>(MF.getTarget().getInstrInfo());
bool AArch64ExpandPseudo::runOnMachineFunction(MachineFunction &MF) {
TII = static_cast<const AArch64InstrInfo *>(MF.getTarget().getInstrInfo());
bool Modified = false;
for (auto &MBB : MF)
@ -740,6 +744,6 @@ bool ARM64ExpandPseudo::runOnMachineFunction(MachineFunction &MF) {
}
/// \brief Returns an instance of the pseudo instruction expansion pass.
FunctionPass *llvm::createARM64ExpandPseudoPass() {
return new ARM64ExpandPseudo();
FunctionPass *llvm::createAArch64ExpandPseudoPass() {
return new AArch64ExpandPseudo();
}

View File

@ -1,4 +1,4 @@
//===- ARM64FrameLowering.cpp - ARM64 Frame Lowering -----------*- C++ -*-====//
//===- AArch64FrameLowering.cpp - AArch64 Frame Lowering -------*- C++ -*-====//
//
// The LLVM Compiler Infrastructure
//
@ -7,15 +7,15 @@
//
//===----------------------------------------------------------------------===//
//
// This file contains the ARM64 implementation of TargetFrameLowering class.
// This file contains the AArch64 implementation of TargetFrameLowering class.
//
//===----------------------------------------------------------------------===//
#include "ARM64FrameLowering.h"
#include "ARM64InstrInfo.h"
#include "ARM64MachineFunctionInfo.h"
#include "ARM64Subtarget.h"
#include "ARM64TargetMachine.h"
#include "AArch64FrameLowering.h"
#include "AArch64InstrInfo.h"
#include "AArch64MachineFunctionInfo.h"
#include "AArch64Subtarget.h"
#include "AArch64TargetMachine.h"
#include "llvm/ADT/Statistic.h"
#include "llvm/IR/DataLayout.h"
#include "llvm/IR/Function.h"
@ -33,8 +33,8 @@ using namespace llvm;
#define DEBUG_TYPE "frame-info"
static cl::opt<bool> EnableRedZone("arm64-redzone",
cl::desc("enable use of redzone on ARM64"),
static cl::opt<bool> EnableRedZone("aarch64-redzone",
cl::desc("enable use of redzone on AArch64"),
cl::init(false), cl::Hidden);
STATISTIC(NumRedZoneFunctions, "Number of functions using red zone");
@ -59,7 +59,7 @@ static unsigned estimateStackSize(MachineFunction &MF) {
return (unsigned)Offset;
}
bool ARM64FrameLowering::canUseRedZone(const MachineFunction &MF) const {
bool AArch64FrameLowering::canUseRedZone(const MachineFunction &MF) const {
if (!EnableRedZone)
return false;
// Don't use the red zone if the function explicitly asks us not to.
@ -69,7 +69,7 @@ bool ARM64FrameLowering::canUseRedZone(const MachineFunction &MF) const {
return false;
const MachineFrameInfo *MFI = MF.getFrameInfo();
const ARM64FunctionInfo *AFI = MF.getInfo<ARM64FunctionInfo>();
const AArch64FunctionInfo *AFI = MF.getInfo<AArch64FunctionInfo>();
unsigned NumBytes = AFI->getLocalStackSize();
// Note: currently hasFP() is always true for hasCalls(), but that's an
@ -82,13 +82,13 @@ bool ARM64FrameLowering::canUseRedZone(const MachineFunction &MF) const {
/// hasFP - Return true if the specified function should have a dedicated frame
/// pointer register.
bool ARM64FrameLowering::hasFP(const MachineFunction &MF) const {
bool AArch64FrameLowering::hasFP(const MachineFunction &MF) const {
const MachineFrameInfo *MFI = MF.getFrameInfo();
#ifndef NDEBUG
const TargetRegisterInfo *RegInfo = MF.getTarget().getRegisterInfo();
assert(!RegInfo->needsStackRealignment(MF) &&
"No stack realignment on ARM64!");
"No stack realignment on AArch64!");
#endif
return (MFI->hasCalls() || MFI->hasVarSizedObjects() ||
@ -100,15 +100,16 @@ bool ARM64FrameLowering::hasFP(const MachineFunction &MF) const {
/// immediately on entry to the current function. This eliminates the need for
/// add/sub sp brackets around call sites. Returns true if the call frame is
/// included as part of the stack frame.
bool ARM64FrameLowering::hasReservedCallFrame(const MachineFunction &MF) const {
bool
AArch64FrameLowering::hasReservedCallFrame(const MachineFunction &MF) const {
return !MF.getFrameInfo()->hasVarSizedObjects();
}
void ARM64FrameLowering::eliminateCallFramePseudoInstr(
void AArch64FrameLowering::eliminateCallFramePseudoInstr(
MachineFunction &MF, MachineBasicBlock &MBB,
MachineBasicBlock::iterator I) const {
const ARM64InstrInfo *TII =
static_cast<const ARM64InstrInfo *>(MF.getTarget().getInstrInfo());
const AArch64InstrInfo *TII =
static_cast<const AArch64InstrInfo *>(MF.getTarget().getInstrInfo());
DebugLoc DL = I->getDebugLoc();
int Opc = I->getOpcode();
bool IsDestroy = Opc == TII->getCallFrameDestroyOpcode();
@ -138,26 +139,26 @@ void ARM64FrameLowering::eliminateCallFramePseudoInstr(
// Mostly call frames will be allocated at the start of a function so
// this is OK, but it is a limitation that needs dealing with.
assert(Amount > -0xffffff && Amount < 0xffffff && "call frame too large");
emitFrameOffset(MBB, I, DL, ARM64::SP, ARM64::SP, Amount, TII);
emitFrameOffset(MBB, I, DL, AArch64::SP, AArch64::SP, Amount, TII);
}
} else if (CalleePopAmount != 0) {
// If the calling convention demands that the callee pops arguments from the
// stack, we want to add it back if we have a reserved call frame.
assert(CalleePopAmount < 0xffffff && "call frame too large");
emitFrameOffset(MBB, I, DL, ARM64::SP, ARM64::SP, -CalleePopAmount, TII);
emitFrameOffset(MBB, I, DL, AArch64::SP, AArch64::SP, -CalleePopAmount,
TII);
}
MBB.erase(I);
}
void
ARM64FrameLowering::emitCalleeSavedFrameMoves(MachineBasicBlock &MBB,
MachineBasicBlock::iterator MBBI,
unsigned FramePtr) const {
void AArch64FrameLowering::emitCalleeSavedFrameMoves(
MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI,
unsigned FramePtr) const {
MachineFunction &MF = *MBB.getParent();
MachineFrameInfo *MFI = MF.getFrameInfo();
MachineModuleInfo &MMI = MF.getMMI();
const MCRegisterInfo *MRI = MMI.getContext().getRegisterInfo();
const ARM64InstrInfo *TII = TM.getInstrInfo();
const AArch64InstrInfo *TII = TM.getInstrInfo();
DebugLoc DL = MBB.findDebugLoc(MBBI);
// Add callee saved registers to move list.
@ -185,7 +186,7 @@ ARM64FrameLowering::emitCalleeSavedFrameMoves(MachineBasicBlock &MBB,
// method automatically generates the directives when frame pointers are
// used. If we generate CFI directives for the extra "STP"s, the linker will
// lose track of the correct values for the frame pointer and link register.
if (HasFP && (FramePtr == Reg || Reg == ARM64::LR)) {
if (HasFP && (FramePtr == Reg || Reg == AArch64::LR)) {
TotalSkipped += stackGrowth;
continue;
}
@ -198,15 +199,15 @@ ARM64FrameLowering::emitCalleeSavedFrameMoves(MachineBasicBlock &MBB,
}
}
void ARM64FrameLowering::emitPrologue(MachineFunction &MF) const {
void AArch64FrameLowering::emitPrologue(MachineFunction &MF) const {
MachineBasicBlock &MBB = MF.front(); // Prologue goes in entry BB.
MachineBasicBlock::iterator MBBI = MBB.begin();
const MachineFrameInfo *MFI = MF.getFrameInfo();
const Function *Fn = MF.getFunction();
const ARM64RegisterInfo *RegInfo = TM.getRegisterInfo();
const ARM64InstrInfo *TII = TM.getInstrInfo();
const AArch64RegisterInfo *RegInfo = TM.getRegisterInfo();
const AArch64InstrInfo *TII = TM.getInstrInfo();
MachineModuleInfo &MMI = MF.getMMI();
ARM64FunctionInfo *AFI = MF.getInfo<ARM64FunctionInfo>();
AArch64FunctionInfo *AFI = MF.getInfo<AArch64FunctionInfo>();
bool needsFrameMoves = MMI.hasDebugInfo() || Fn->needsUnwindTableEntry();
bool HasFP = hasFP(MF);
DebugLoc DL = MBB.findDebugLoc(MBBI);
@ -224,7 +225,7 @@ void ARM64FrameLowering::emitPrologue(MachineFunction &MF) const {
// REDZONE: If the stack size is less than 128 bytes, we don't need
// to actually allocate.
if (NumBytes && !canUseRedZone(MF)) {
emitFrameOffset(MBB, MBBI, DL, ARM64::SP, ARM64::SP, -NumBytes, TII,
emitFrameOffset(MBB, MBBI, DL, AArch64::SP, AArch64::SP, -NumBytes, TII,
MachineInstr::FrameSetup);
// Encode the stack size of the leaf function.
@ -244,9 +245,9 @@ void ARM64FrameLowering::emitPrologue(MachineFunction &MF) const {
if (HasFP) {
// First instruction must a) allocate the stack and b) have an immediate
// that is a multiple of -2.
assert((MBBI->getOpcode() == ARM64::STPXpre ||
MBBI->getOpcode() == ARM64::STPDpre) &&
MBBI->getOperand(3).getReg() == ARM64::SP &&
assert((MBBI->getOpcode() == AArch64::STPXpre ||
MBBI->getOpcode() == AArch64::STPDpre) &&
MBBI->getOperand(3).getReg() == AArch64::SP &&
MBBI->getOperand(4).getImm() < 0 &&
(MBBI->getOperand(4).getImm() & 1) == 0);
@ -258,10 +259,10 @@ void ARM64FrameLowering::emitPrologue(MachineFunction &MF) const {
}
// Move past the saves of the callee-saved registers.
while (MBBI->getOpcode() == ARM64::STPXi ||
MBBI->getOpcode() == ARM64::STPDi ||
MBBI->getOpcode() == ARM64::STPXpre ||
MBBI->getOpcode() == ARM64::STPDpre) {
while (MBBI->getOpcode() == AArch64::STPXi ||
MBBI->getOpcode() == AArch64::STPDi ||
MBBI->getOpcode() == AArch64::STPXpre ||
MBBI->getOpcode() == AArch64::STPDpre) {
++MBBI;
NumBytes -= 16;
}
@ -271,7 +272,7 @@ void ARM64FrameLowering::emitPrologue(MachineFunction &MF) const {
// mov fp,sp when FPOffset is zero.
// Note: All stores of callee-saved registers are marked as "FrameSetup".
// This code marks the instruction(s) that set the FP also.
emitFrameOffset(MBB, MBBI, DL, ARM64::FP, ARM64::SP, FPOffset, TII,
emitFrameOffset(MBB, MBBI, DL, AArch64::FP, AArch64::SP, FPOffset, TII,
MachineInstr::FrameSetup);
}
@ -282,7 +283,7 @@ void ARM64FrameLowering::emitPrologue(MachineFunction &MF) const {
if (NumBytes) {
// If we're a leaf function, try using the red zone.
if (!canUseRedZone(MF))
emitFrameOffset(MBB, MBBI, DL, ARM64::SP, ARM64::SP, -NumBytes, TII,
emitFrameOffset(MBB, MBBI, DL, AArch64::SP, AArch64::SP, -NumBytes, TII,
MachineInstr::FrameSetup);
}
@ -295,7 +296,7 @@ void ARM64FrameLowering::emitPrologue(MachineFunction &MF) const {
// needed.
//
if (RegInfo->hasBasePointer(MF))
TII->copyPhysReg(MBB, MBBI, DL, ARM64::X19, ARM64::SP, false);
TII->copyPhysReg(MBB, MBBI, DL, AArch64::X19, AArch64::SP, false);
if (needsFrameMoves) {
const DataLayout *TD = MF.getTarget().getDataLayout();
@ -377,7 +378,7 @@ void ARM64FrameLowering::emitPrologue(MachineFunction &MF) const {
.addCFIIndex(CFIIndex);
// Record the location of the stored LR
unsigned LR = RegInfo->getDwarfRegNum(ARM64::LR, true);
unsigned LR = RegInfo->getDwarfRegNum(AArch64::LR, true);
CFIIndex = MMI.addFrameInst(
MCCFIInstruction::createOffset(nullptr, LR, StackGrowth));
BuildMI(MBB, MBBI, DL, TII->get(TargetOpcode::CFI_INSTRUCTION))
@ -410,15 +411,16 @@ static bool isCalleeSavedRegister(unsigned Reg, const MCPhysReg *CSRegs) {
static bool isCSRestore(MachineInstr *MI, const MCPhysReg *CSRegs) {
unsigned RtIdx = 0;
if (MI->getOpcode() == ARM64::LDPXpost || MI->getOpcode() == ARM64::LDPDpost)
if (MI->getOpcode() == AArch64::LDPXpost ||
MI->getOpcode() == AArch64::LDPDpost)
RtIdx = 1;
if (MI->getOpcode() == ARM64::LDPXpost ||
MI->getOpcode() == ARM64::LDPDpost || MI->getOpcode() == ARM64::LDPXi ||
MI->getOpcode() == ARM64::LDPDi) {
if (MI->getOpcode() == AArch64::LDPXpost ||
MI->getOpcode() == AArch64::LDPDpost ||
MI->getOpcode() == AArch64::LDPXi || MI->getOpcode() == AArch64::LDPDi) {
if (!isCalleeSavedRegister(MI->getOperand(RtIdx).getReg(), CSRegs) ||
!isCalleeSavedRegister(MI->getOperand(RtIdx + 1).getReg(), CSRegs) ||
MI->getOperand(RtIdx + 2).getReg() != ARM64::SP)
MI->getOperand(RtIdx + 2).getReg() != AArch64::SP)
return false;
return true;
}
@ -426,25 +428,25 @@ static bool isCSRestore(MachineInstr *MI, const MCPhysReg *CSRegs) {
return false;
}
void ARM64FrameLowering::emitEpilogue(MachineFunction &MF,
MachineBasicBlock &MBB) const {
void AArch64FrameLowering::emitEpilogue(MachineFunction &MF,
MachineBasicBlock &MBB) const {
MachineBasicBlock::iterator MBBI = MBB.getLastNonDebugInstr();
assert(MBBI->isReturn() && "Can only insert epilog into returning blocks");
MachineFrameInfo *MFI = MF.getFrameInfo();
const ARM64InstrInfo *TII =
static_cast<const ARM64InstrInfo *>(MF.getTarget().getInstrInfo());
const ARM64RegisterInfo *RegInfo =
static_cast<const ARM64RegisterInfo *>(MF.getTarget().getRegisterInfo());
const AArch64InstrInfo *TII =
static_cast<const AArch64InstrInfo *>(MF.getTarget().getInstrInfo());
const AArch64RegisterInfo *RegInfo = static_cast<const AArch64RegisterInfo *>(
MF.getTarget().getRegisterInfo());
DebugLoc DL = MBBI->getDebugLoc();
unsigned RetOpcode = MBBI->getOpcode();
int NumBytes = MFI->getStackSize();
const ARM64FunctionInfo *AFI = MF.getInfo<ARM64FunctionInfo>();
const AArch64FunctionInfo *AFI = MF.getInfo<AArch64FunctionInfo>();
// Initial and residual are named for consitency with the prologue. Note that
// in the epilogue, the residual adjustment is executed first.
uint64_t ArgumentPopSize = 0;
if (RetOpcode == ARM64::TCRETURNdi || RetOpcode == ARM64::TCRETURNri) {
if (RetOpcode == AArch64::TCRETURNdi || RetOpcode == AArch64::TCRETURNri) {
MachineOperand &StackAdjust = MBBI->getOperand(1);
// For a tail-call in a callee-pops-arguments environment, some or all of
@ -483,8 +485,8 @@ void ARM64FrameLowering::emitEpilogue(MachineFunction &MF,
// So NumBytes = StackSize + BytesInStackArgArea - CalleeArgStackSize
// = StackSize + ArgumentPopSize
//
// ARM64TargetLowering::LowerCall figures out ArgumentPopSize and keeps
// it as the 2nd argument of ARM64ISD::TC_RETURN.
// AArch64TargetLowering::LowerCall figures out ArgumentPopSize and keeps
// it as the 2nd argument of AArch64ISD::TC_RETURN.
NumBytes += ArgumentPopSize;
unsigned NumRestores = 0;
@ -508,7 +510,8 @@ void ARM64FrameLowering::emitEpilogue(MachineFunction &MF,
// If this was a redzone leaf function, we don't need to restore the
// stack pointer.
if (!canUseRedZone(MF))
emitFrameOffset(MBB, LastPopI, DL, ARM64::SP, ARM64::SP, NumBytes, TII);
emitFrameOffset(MBB, LastPopI, DL, AArch64::SP, AArch64::SP, NumBytes,
TII);
return;
}
@ -517,14 +520,14 @@ void ARM64FrameLowering::emitEpilogue(MachineFunction &MF,
// non-post-indexed loads for the restores if we aren't actually going to
// be able to save any instructions.
if (NumBytes || MFI->hasVarSizedObjects())
emitFrameOffset(MBB, LastPopI, DL, ARM64::SP, ARM64::FP,
emitFrameOffset(MBB, LastPopI, DL, AArch64::SP, AArch64::FP,
-(NumRestores - 1) * 16, TII, MachineInstr::NoFlags);
}
/// getFrameIndexOffset - Returns the displacement from the frame register to
/// the stack frame of the specified index.
int ARM64FrameLowering::getFrameIndexOffset(const MachineFunction &MF,
int FI) const {
int AArch64FrameLowering::getFrameIndexOffset(const MachineFunction &MF,
int FI) const {
unsigned FrameReg;
return getFrameIndexReference(MF, FI, FrameReg);
}
@ -533,19 +536,19 @@ int ARM64FrameLowering::getFrameIndexOffset(const MachineFunction &MF,
/// debug info. It's the same as what we use for resolving the code-gen
/// references for now. FIXME: This can go wrong when references are
/// SP-relative and simple call frames aren't used.
int ARM64FrameLowering::getFrameIndexReference(const MachineFunction &MF,
int FI,
unsigned &FrameReg) const {
int AArch64FrameLowering::getFrameIndexReference(const MachineFunction &MF,
int FI,
unsigned &FrameReg) const {
return resolveFrameIndexReference(MF, FI, FrameReg);
}
int ARM64FrameLowering::resolveFrameIndexReference(const MachineFunction &MF,
int FI, unsigned &FrameReg,
bool PreferFP) const {
int AArch64FrameLowering::resolveFrameIndexReference(const MachineFunction &MF,
int FI, unsigned &FrameReg,
bool PreferFP) const {
const MachineFrameInfo *MFI = MF.getFrameInfo();
const ARM64RegisterInfo *RegInfo =
static_cast<const ARM64RegisterInfo *>(MF.getTarget().getRegisterInfo());
const ARM64FunctionInfo *AFI = MF.getInfo<ARM64FunctionInfo>();
const AArch64RegisterInfo *RegInfo = static_cast<const AArch64RegisterInfo *>(
MF.getTarget().getRegisterInfo());
const AArch64FunctionInfo *AFI = MF.getInfo<AArch64FunctionInfo>();
int FPOffset = MFI->getObjectOffset(FI) + 16;
int Offset = MFI->getObjectOffset(FI) + MFI->getStackSize();
bool isFixed = MFI->isFixedObjectIndex(FI);
@ -587,7 +590,7 @@ int ARM64FrameLowering::resolveFrameIndexReference(const MachineFunction &MF,
if (RegInfo->hasBasePointer(MF))
FrameReg = RegInfo->getBaseRegister();
else {
FrameReg = ARM64::SP;
FrameReg = AArch64::SP;
// If we're using the red zone for this function, the SP won't actually
// be adjusted, so the offsets will be negative. They're also all
// within range of the signed 9-bit immediate instructions.
@ -599,16 +602,16 @@ int ARM64FrameLowering::resolveFrameIndexReference(const MachineFunction &MF,
}
static unsigned getPrologueDeath(MachineFunction &MF, unsigned Reg) {
if (Reg != ARM64::LR)
if (Reg != AArch64::LR)
return getKillRegState(true);
// LR maybe referred to later by an @llvm.returnaddress intrinsic.
bool LRLiveIn = MF.getRegInfo().isLiveIn(ARM64::LR);
bool LRLiveIn = MF.getRegInfo().isLiveIn(AArch64::LR);
bool LRKill = !(LRLiveIn && MF.getFrameInfo()->isReturnAddressTaken());
return getKillRegState(LRKill);
}
bool ARM64FrameLowering::spillCalleeSavedRegisters(
bool AArch64FrameLowering::spillCalleeSavedRegisters(
MachineBasicBlock &MBB, MachineBasicBlock::iterator MI,
const std::vector<CalleeSavedInfo> &CSI,
const TargetRegisterInfo *TRI) const {
@ -645,22 +648,22 @@ bool ARM64FrameLowering::spillCalleeSavedRegisters(
// Rationale: This sequence saves uop updates compared to a sequence of
// pre-increment spills like stp xi,xj,[sp,#-16]!
// Note: Similar rational and sequence for restores in epilog.
if (ARM64::GPR64RegClass.contains(Reg1)) {
assert(ARM64::GPR64RegClass.contains(Reg2) &&
if (AArch64::GPR64RegClass.contains(Reg1)) {
assert(AArch64::GPR64RegClass.contains(Reg2) &&
"Expected GPR64 callee-saved register pair!");
// For first spill use pre-increment store.
if (i == 0)
StrOpc = ARM64::STPXpre;
StrOpc = AArch64::STPXpre;
else
StrOpc = ARM64::STPXi;
} else if (ARM64::FPR64RegClass.contains(Reg1)) {
assert(ARM64::FPR64RegClass.contains(Reg2) &&
StrOpc = AArch64::STPXi;
} else if (AArch64::FPR64RegClass.contains(Reg1)) {
assert(AArch64::FPR64RegClass.contains(Reg2) &&
"Expected FPR64 callee-saved register pair!");
// For first spill use pre-increment store.
if (i == 0)
StrOpc = ARM64::STPDpre;
StrOpc = AArch64::STPDpre;
else
StrOpc = ARM64::STPDi;
StrOpc = AArch64::STPDi;
} else
llvm_unreachable("Unexpected callee saved register!");
DEBUG(dbgs() << "CSR spill: (" << TRI->getName(Reg1) << ", "
@ -672,19 +675,19 @@ bool ARM64FrameLowering::spillCalleeSavedRegisters(
assert((Offset >= -64 && Offset <= 63) &&
"Offset out of bounds for STP immediate");
MachineInstrBuilder MIB = BuildMI(MBB, MI, DL, TII.get(StrOpc));
if (StrOpc == ARM64::STPDpre || StrOpc == ARM64::STPXpre)
MIB.addReg(ARM64::SP, RegState::Define);
if (StrOpc == AArch64::STPDpre || StrOpc == AArch64::STPXpre)
MIB.addReg(AArch64::SP, RegState::Define);
MIB.addReg(Reg2, getPrologueDeath(MF, Reg2))
.addReg(Reg1, getPrologueDeath(MF, Reg1))
.addReg(ARM64::SP)
.addReg(AArch64::SP)
.addImm(Offset) // [sp, #offset * 8], where factor * 8 is implicit
.setMIFlag(MachineInstr::FrameSetup);
}
return true;
}
bool ARM64FrameLowering::restoreCalleeSavedRegisters(
bool AArch64FrameLowering::restoreCalleeSavedRegisters(
MachineBasicBlock &MBB, MachineBasicBlock::iterator MI,
const std::vector<CalleeSavedInfo> &CSI,
const TargetRegisterInfo *TRI) const {
@ -716,20 +719,20 @@ bool ARM64FrameLowering::restoreCalleeSavedRegisters(
assert((Count & 1) == 0 && "Odd number of callee-saved regs to spill!");
assert((i & 1) == 0 && "Odd index for callee-saved reg spill!");
if (ARM64::GPR64RegClass.contains(Reg1)) {
assert(ARM64::GPR64RegClass.contains(Reg2) &&
if (AArch64::GPR64RegClass.contains(Reg1)) {
assert(AArch64::GPR64RegClass.contains(Reg2) &&
"Expected GPR64 callee-saved register pair!");
if (i == Count - 2)
LdrOpc = ARM64::LDPXpost;
LdrOpc = AArch64::LDPXpost;
else
LdrOpc = ARM64::LDPXi;
} else if (ARM64::FPR64RegClass.contains(Reg1)) {
assert(ARM64::FPR64RegClass.contains(Reg2) &&
LdrOpc = AArch64::LDPXi;
} else if (AArch64::FPR64RegClass.contains(Reg1)) {
assert(AArch64::FPR64RegClass.contains(Reg2) &&
"Expected FPR64 callee-saved register pair!");
if (i == Count - 2)
LdrOpc = ARM64::LDPDpost;
LdrOpc = AArch64::LDPDpost;
else
LdrOpc = ARM64::LDPDi;
LdrOpc = AArch64::LDPDi;
} else
llvm_unreachable("Unexpected callee saved register!");
DEBUG(dbgs() << "CSR restore: (" << TRI->getName(Reg1) << ", "
@ -742,31 +745,31 @@ bool ARM64FrameLowering::restoreCalleeSavedRegisters(
assert((Offset >= -64 && Offset <= 63) &&
"Offset out of bounds for LDP immediate");
MachineInstrBuilder MIB = BuildMI(MBB, MI, DL, TII.get(LdrOpc));
if (LdrOpc == ARM64::LDPXpost || LdrOpc == ARM64::LDPDpost)
MIB.addReg(ARM64::SP, RegState::Define);
if (LdrOpc == AArch64::LDPXpost || LdrOpc == AArch64::LDPDpost)
MIB.addReg(AArch64::SP, RegState::Define);
MIB.addReg(Reg2, getDefRegState(true))
.addReg(Reg1, getDefRegState(true))
.addReg(ARM64::SP)
.addReg(AArch64::SP)
.addImm(Offset); // [sp], #offset * 8 or [sp, #offset * 8]
// where the factor * 8 is implicit
}
return true;
}
void ARM64FrameLowering::processFunctionBeforeCalleeSavedScan(
void AArch64FrameLowering::processFunctionBeforeCalleeSavedScan(
MachineFunction &MF, RegScavenger *RS) const {
const ARM64RegisterInfo *RegInfo =
static_cast<const ARM64RegisterInfo *>(MF.getTarget().getRegisterInfo());
ARM64FunctionInfo *AFI = MF.getInfo<ARM64FunctionInfo>();
const AArch64RegisterInfo *RegInfo = static_cast<const AArch64RegisterInfo *>(
MF.getTarget().getRegisterInfo());
AArch64FunctionInfo *AFI = MF.getInfo<AArch64FunctionInfo>();
MachineRegisterInfo *MRI = &MF.getRegInfo();
SmallVector<unsigned, 4> UnspilledCSGPRs;
SmallVector<unsigned, 4> UnspilledCSFPRs;
// The frame record needs to be created by saving the appropriate registers
if (hasFP(MF)) {
MRI->setPhysRegUsed(ARM64::FP);
MRI->setPhysRegUsed(ARM64::LR);
MRI->setPhysRegUsed(AArch64::FP);
MRI->setPhysRegUsed(AArch64::LR);
}
// Spill the BasePtr if it's used. Do this first thing so that the
@ -788,10 +791,10 @@ void ARM64FrameLowering::processFunctionBeforeCalleeSavedScan(
const unsigned OddReg = CSRegs[i];
const unsigned EvenReg = CSRegs[i + 1];
assert((ARM64::GPR64RegClass.contains(OddReg) &&
ARM64::GPR64RegClass.contains(EvenReg)) ^
(ARM64::FPR64RegClass.contains(OddReg) &&
ARM64::FPR64RegClass.contains(EvenReg)) &&
assert((AArch64::GPR64RegClass.contains(OddReg) &&
AArch64::GPR64RegClass.contains(EvenReg)) ^
(AArch64::FPR64RegClass.contains(OddReg) &&
AArch64::FPR64RegClass.contains(EvenReg)) &&
"Register class mismatch!");
const bool OddRegUsed = MRI->isPhysRegUsed(OddReg);
@ -800,7 +803,7 @@ void ARM64FrameLowering::processFunctionBeforeCalleeSavedScan(
// Early exit if none of the registers in the register pair is actually
// used.
if (!OddRegUsed && !EvenRegUsed) {
if (ARM64::GPR64RegClass.contains(OddReg)) {
if (AArch64::GPR64RegClass.contains(OddReg)) {
UnspilledCSGPRs.push_back(OddReg);
UnspilledCSGPRs.push_back(EvenReg);
} else {
@ -810,7 +813,7 @@ void ARM64FrameLowering::processFunctionBeforeCalleeSavedScan(
continue;
}
unsigned Reg = ARM64::NoRegister;
unsigned Reg = AArch64::NoRegister;
// If only one of the registers of the register pair is used, make sure to
// mark the other one as used as well.
if (OddRegUsed ^ EvenRegUsed) {
@ -822,17 +825,17 @@ void ARM64FrameLowering::processFunctionBeforeCalleeSavedScan(
DEBUG(dbgs() << ' ' << PrintReg(OddReg, RegInfo));
DEBUG(dbgs() << ' ' << PrintReg(EvenReg, RegInfo));
assert(((OddReg == ARM64::LR && EvenReg == ARM64::FP) ||
assert(((OddReg == AArch64::LR && EvenReg == AArch64::FP) ||
(RegInfo->getEncodingValue(OddReg) + 1 ==
RegInfo->getEncodingValue(EvenReg))) &&
"Register pair of non-adjacent registers!");
if (ARM64::GPR64RegClass.contains(OddReg)) {
if (AArch64::GPR64RegClass.contains(OddReg)) {
NumGPRSpilled += 2;
// If it's not a reserved register, we can use it in lieu of an
// emergency spill slot for the register scavenger.
// FIXME: It would be better to instead keep looking and choose another
// unspilled register that isn't reserved, if there is one.
if (Reg != ARM64::NoRegister && !RegInfo->isReservedReg(MF, Reg))
if (Reg != AArch64::NoRegister && !RegInfo->isReservedReg(MF, Reg))
ExtraCSSpill = true;
} else
NumFPRSpilled += 2;
@ -878,7 +881,7 @@ void ARM64FrameLowering::processFunctionBeforeCalleeSavedScan(
// If we didn't find an extra callee-saved register to spill, create
// an emergency spill slot.
if (!ExtraCSSpill) {
const TargetRegisterClass *RC = &ARM64::GPR64RegClass;
const TargetRegisterClass *RC = &AArch64::GPR64RegClass;
int FI = MFI->CreateStackObject(RC->getSize(), RC->getAlignment(), false);
RS->addScavengingFrameIndex(FI);
DEBUG(dbgs() << "No available CS registers, allocated fi#" << FI

View File

@ -1,4 +1,4 @@
//===-- ARM64FrameLowering.h - TargetFrameLowering for ARM64 ----*- C++ -*-===//
//==-- AArch64FrameLowering.h - TargetFrameLowering for AArch64 --*- C++ -*-==//
//
// The LLVM Compiler Infrastructure
//
@ -11,22 +11,22 @@
//
//===----------------------------------------------------------------------===//
#ifndef ARM64_FRAMELOWERING_H
#define ARM64_FRAMELOWERING_H
#ifndef AArch64_FRAMELOWERING_H
#define AArch64_FRAMELOWERING_H
#include "llvm/Target/TargetFrameLowering.h"
namespace llvm {
class ARM64Subtarget;
class ARM64TargetMachine;
class AArch64Subtarget;
class AArch64TargetMachine;
class ARM64FrameLowering : public TargetFrameLowering {
const ARM64TargetMachine &TM;
class AArch64FrameLowering : public TargetFrameLowering {
const AArch64TargetMachine &TM;
public:
explicit ARM64FrameLowering(const ARM64TargetMachine &TM,
const ARM64Subtarget &STI)
explicit AArch64FrameLowering(const AArch64TargetMachine &TM,
const AArch64Subtarget &STI)
: TargetFrameLowering(StackGrowsDown, 16, 0, 16,
false /*StackRealignable*/),
TM(TM) {}

View File

@ -1,4 +1,4 @@
//==-- ARM64ISelLowering.h - ARM64 DAG Lowering Interface --------*- C++ -*-==//
//==-- AArch64ISelLowering.h - AArch64 DAG Lowering Interface ----*- C++ -*-==//
//
// The LLVM Compiler Infrastructure
//
@ -7,13 +7,13 @@
//
//===----------------------------------------------------------------------===//
//
// This file defines the interfaces that ARM64 uses to lower LLVM code into a
// This file defines the interfaces that AArch64 uses to lower LLVM code into a
// selection DAG.
//
//===----------------------------------------------------------------------===//
#ifndef LLVM_TARGET_ARM64_ISELLOWERING_H
#define LLVM_TARGET_ARM64_ISELLOWERING_H
#ifndef LLVM_TARGET_AArch64_ISELLOWERING_H
#define LLVM_TARGET_AArch64_ISELLOWERING_H
#include "llvm/CodeGen/CallingConvLower.h"
#include "llvm/CodeGen/SelectionDAG.h"
@ -22,7 +22,7 @@
namespace llvm {
namespace ARM64ISD {
namespace AArch64ISD {
enum {
FIRST_NUMBER = ISD::BUILTIN_OP_END,
@ -188,16 +188,16 @@ enum {
ST4LANEpost
};
} // end namespace ARM64ISD
} // end namespace AArch64ISD
class ARM64Subtarget;
class ARM64TargetMachine;
class AArch64Subtarget;
class AArch64TargetMachine;
class ARM64TargetLowering : public TargetLowering {
class AArch64TargetLowering : public TargetLowering {
bool RequireStrictAlign;
public:
explicit ARM64TargetLowering(ARM64TargetMachine &TM);
explicit AArch64TargetLowering(AArch64TargetMachine &TM);
/// Selects the correct CCAssignFn for a the given CallingConvention
/// value.
@ -325,9 +325,9 @@ public:
bool shouldExpandAtomicInIR(Instruction *Inst) const override;
private:
/// Subtarget - Keep a pointer to the ARM64Subtarget around so that we can
/// Subtarget - Keep a pointer to the AArch64Subtarget around so that we can
/// make the right decision when generating code for different targets.
const ARM64Subtarget *Subtarget;
const AArch64Subtarget *Subtarget;
void addTypeForNEON(EVT VT, EVT PromotedBitwiseVT);
void addDRTypeForNEON(MVT VT);
@ -454,11 +454,11 @@ private:
SelectionDAG &DAG) const override;
};
namespace ARM64 {
namespace AArch64 {
FastISel *createFastISel(FunctionLoweringInfo &funcInfo,
const TargetLibraryInfo *libInfo);
} // end namespace ARM64
} // end namespace AArch64
} // end namespace llvm
#endif // LLVM_TARGET_ARM64_ISELLOWERING_H
#endif // LLVM_TARGET_AArch64_ISELLOWERING_H

View File

@ -1,4 +1,4 @@
//===- ARM64InstrAtomics.td - ARM64 Atomic codegen support -*- tablegen -*-===//
//=- AArch64InstrAtomics.td - AArch64 Atomic codegen support -*- tablegen -*-=//
//
// The LLVM Compiler Infrastructure
//
@ -7,7 +7,7 @@
//
//===----------------------------------------------------------------------===//
//
// ARM64 Atomic operand code-gen constructs.
// AArch64 Atomic operand code-gen constructs.
//
//===----------------------------------------------------------------------===//
@ -117,7 +117,7 @@ class releasing_store<PatFrag base>
return Ordering == Release || Ordering == SequentiallyConsistent;
}]>;
// An atomic store operation that doesn't actually need to be atomic on ARM64.
// An atomic store operation that doesn't actually need to be atomic on AArch64.
class relaxed_store<PatFrag base>
: PatFrag<(ops node:$ptr, node:$val), (base node:$ptr, node:$val), [{
AtomicOrdering Ordering = cast<AtomicSDNode>(N)->getOrdering();
@ -202,19 +202,19 @@ def : Pat<(relaxed_store<atomic_store_64>
// Load-exclusives.
def ldxr_1 : PatFrag<(ops node:$ptr), (int_arm64_ldxr node:$ptr), [{
def ldxr_1 : PatFrag<(ops node:$ptr), (int_aarch64_ldxr node:$ptr), [{
return cast<MemIntrinsicSDNode>(N)->getMemoryVT() == MVT::i8;
}]>;
def ldxr_2 : PatFrag<(ops node:$ptr), (int_arm64_ldxr node:$ptr), [{
def ldxr_2 : PatFrag<(ops node:$ptr), (int_aarch64_ldxr node:$ptr), [{
return cast<MemIntrinsicSDNode>(N)->getMemoryVT() == MVT::i16;
}]>;
def ldxr_4 : PatFrag<(ops node:$ptr), (int_arm64_ldxr node:$ptr), [{
def ldxr_4 : PatFrag<(ops node:$ptr), (int_aarch64_ldxr node:$ptr), [{
return cast<MemIntrinsicSDNode>(N)->getMemoryVT() == MVT::i32;
}]>;
def ldxr_8 : PatFrag<(ops node:$ptr), (int_arm64_ldxr node:$ptr), [{
def ldxr_8 : PatFrag<(ops node:$ptr), (int_aarch64_ldxr node:$ptr), [{
return cast<MemIntrinsicSDNode>(N)->getMemoryVT() == MVT::i64;
}]>;
@ -235,19 +235,19 @@ def : Pat<(and (ldxr_4 GPR64sp:$addr), 0xffffffff),
// Load-exclusives.
def ldaxr_1 : PatFrag<(ops node:$ptr), (int_arm64_ldaxr node:$ptr), [{
def ldaxr_1 : PatFrag<(ops node:$ptr), (int_aarch64_ldaxr node:$ptr), [{
return cast<MemIntrinsicSDNode>(N)->getMemoryVT() == MVT::i8;
}]>;
def ldaxr_2 : PatFrag<(ops node:$ptr), (int_arm64_ldaxr node:$ptr), [{
def ldaxr_2 : PatFrag<(ops node:$ptr), (int_aarch64_ldaxr node:$ptr), [{
return cast<MemIntrinsicSDNode>(N)->getMemoryVT() == MVT::i16;
}]>;
def ldaxr_4 : PatFrag<(ops node:$ptr), (int_arm64_ldaxr node:$ptr), [{
def ldaxr_4 : PatFrag<(ops node:$ptr), (int_aarch64_ldaxr node:$ptr), [{
return cast<MemIntrinsicSDNode>(N)->getMemoryVT() == MVT::i32;
}]>;
def ldaxr_8 : PatFrag<(ops node:$ptr), (int_arm64_ldaxr node:$ptr), [{
def ldaxr_8 : PatFrag<(ops node:$ptr), (int_aarch64_ldaxr node:$ptr), [{
return cast<MemIntrinsicSDNode>(N)->getMemoryVT() == MVT::i64;
}]>;
@ -269,22 +269,22 @@ def : Pat<(and (ldaxr_4 GPR64sp:$addr), 0xffffffff),
// Store-exclusives.
def stxr_1 : PatFrag<(ops node:$val, node:$ptr),
(int_arm64_stxr node:$val, node:$ptr), [{
(int_aarch64_stxr node:$val, node:$ptr), [{
return cast<MemIntrinsicSDNode>(N)->getMemoryVT() == MVT::i8;
}]>;
def stxr_2 : PatFrag<(ops node:$val, node:$ptr),
(int_arm64_stxr node:$val, node:$ptr), [{
(int_aarch64_stxr node:$val, node:$ptr), [{
return cast<MemIntrinsicSDNode>(N)->getMemoryVT() == MVT::i16;
}]>;
def stxr_4 : PatFrag<(ops node:$val, node:$ptr),
(int_arm64_stxr node:$val, node:$ptr), [{
(int_aarch64_stxr node:$val, node:$ptr), [{
return cast<MemIntrinsicSDNode>(N)->getMemoryVT() == MVT::i32;
}]>;
def stxr_8 : PatFrag<(ops node:$val, node:$ptr),
(int_arm64_stxr node:$val, node:$ptr), [{
(int_aarch64_stxr node:$val, node:$ptr), [{
return cast<MemIntrinsicSDNode>(N)->getMemoryVT() == MVT::i64;
}]>;
@ -315,22 +315,22 @@ def : Pat<(stxr_4 (and GPR64:$val, 0xffffffff), GPR64sp:$addr),
// Store-release-exclusives.
def stlxr_1 : PatFrag<(ops node:$val, node:$ptr),
(int_arm64_stlxr node:$val, node:$ptr), [{
(int_aarch64_stlxr node:$val, node:$ptr), [{
return cast<MemIntrinsicSDNode>(N)->getMemoryVT() == MVT::i8;
}]>;
def stlxr_2 : PatFrag<(ops node:$val, node:$ptr),
(int_arm64_stlxr node:$val, node:$ptr), [{
(int_aarch64_stlxr node:$val, node:$ptr), [{
return cast<MemIntrinsicSDNode>(N)->getMemoryVT() == MVT::i16;
}]>;
def stlxr_4 : PatFrag<(ops node:$val, node:$ptr),
(int_arm64_stlxr node:$val, node:$ptr), [{
(int_aarch64_stlxr node:$val, node:$ptr), [{
return cast<MemIntrinsicSDNode>(N)->getMemoryVT() == MVT::i32;
}]>;
def stlxr_8 : PatFrag<(ops node:$val, node:$ptr),
(int_arm64_stlxr node:$val, node:$ptr), [{
(int_aarch64_stlxr node:$val, node:$ptr), [{
return cast<MemIntrinsicSDNode>(N)->getMemoryVT() == MVT::i64;
}]>;
@ -361,4 +361,4 @@ def : Pat<(stlxr_4 (and GPR64:$val, 0xffffffff), GPR64sp:$addr),
// And clear exclusive.
def : Pat<(int_arm64_clrex), (CLREX 0xf)>;
def : Pat<(int_aarch64_clrex), (CLREX 0xf)>;

View File

@ -1,4 +1,4 @@
//===- ARM64InstrFormats.td - ARM64 Instruction Formats ------*- tblgen -*-===//
//===- AArch64InstrFormats.td - AArch64 Instruction Formats --*- tblgen -*-===//
//
// The LLVM Compiler Infrastructure
//
@ -8,7 +8,7 @@
//===----------------------------------------------------------------------===//
//===----------------------------------------------------------------------===//
// Describe ARM64 instructions format here
// Describe AArch64 instructions format here
//
// Format specifies the encoding used by the instruction. This is part of the
@ -21,8 +21,8 @@ class Format<bits<2> val> {
def PseudoFrm : Format<0>;
def NormalFrm : Format<1>; // Do we need any others?
// ARM64 Instruction Format
class ARM64Inst<Format f, string cstr> : Instruction {
// AArch64 Instruction Format
class AArch64Inst<Format f, string cstr> : Instruction {
field bits<32> Inst; // Instruction encoding.
// Mask of bits that cause an encoding to be UNPREDICTABLE.
// If a bit is set, then if the corresponding bit in the
@ -32,7 +32,7 @@ class ARM64Inst<Format f, string cstr> : Instruction {
// SoftFail is the generic name for this field, but we alias it so
// as to make it more obvious what it means in ARM-land.
field bits<32> SoftFail = Unpredictable;
let Namespace = "ARM64";
let Namespace = "AArch64";
Format F = f;
bits<2> Form = F.Value;
let Pattern = [];
@ -41,7 +41,7 @@ class ARM64Inst<Format f, string cstr> : Instruction {
// Pseudo instructions (don't have encoding information)
class Pseudo<dag oops, dag iops, list<dag> pattern, string cstr = "">
: ARM64Inst<PseudoFrm, cstr> {
: AArch64Inst<PseudoFrm, cstr> {
dag OutOperandList = oops;
dag InOperandList = iops;
let Pattern = pattern;
@ -49,7 +49,7 @@ class Pseudo<dag oops, dag iops, list<dag> pattern, string cstr = "">
}
// Real instructions (have encoding information)
class EncodedI<string cstr, list<dag> pattern> : ARM64Inst<NormalFrm, cstr> {
class EncodedI<string cstr, list<dag> pattern> : AArch64Inst<NormalFrm, cstr> {
let Pattern = pattern;
let Size = 4;
}
@ -440,11 +440,11 @@ def vecshiftL64 : Operand<i32>, ImmLeaf<i32, [{
// Crazy immediate formats used by 32-bit and 64-bit logical immediate
// instructions for splatting repeating bit patterns across the immediate.
def logical_imm32_XFORM : SDNodeXForm<imm, [{
uint64_t enc = ARM64_AM::encodeLogicalImmediate(N->getZExtValue(), 32);
uint64_t enc = AArch64_AM::encodeLogicalImmediate(N->getZExtValue(), 32);
return CurDAG->getTargetConstant(enc, MVT::i32);
}]>;
def logical_imm64_XFORM : SDNodeXForm<imm, [{
uint64_t enc = ARM64_AM::encodeLogicalImmediate(N->getZExtValue(), 64);
uint64_t enc = AArch64_AM::encodeLogicalImmediate(N->getZExtValue(), 64);
return CurDAG->getTargetConstant(enc, MVT::i32);
}]>;
@ -457,13 +457,13 @@ def LogicalImm64Operand : AsmOperandClass {
let DiagnosticType = "LogicalSecondSource";
}
def logical_imm32 : Operand<i32>, PatLeaf<(imm), [{
return ARM64_AM::isLogicalImmediate(N->getZExtValue(), 32);
return AArch64_AM::isLogicalImmediate(N->getZExtValue(), 32);
}], logical_imm32_XFORM> {
let PrintMethod = "printLogicalImm32";
let ParserMatchClass = LogicalImm32Operand;
}
def logical_imm64 : Operand<i64>, PatLeaf<(imm), [{
return ARM64_AM::isLogicalImmediate(N->getZExtValue(), 64);
return AArch64_AM::isLogicalImmediate(N->getZExtValue(), 64);
}], logical_imm64_XFORM> {
let PrintMethod = "printLogicalImm64";
let ParserMatchClass = LogicalImm64Operand;
@ -661,10 +661,10 @@ class arith_extended_reg32to64<ValueType Ty> : Operand<Ty>,
// Floating-point immediate.
def fpimm32 : Operand<f32>,
PatLeaf<(f32 fpimm), [{
return ARM64_AM::getFP32Imm(N->getValueAPF()) != -1;
return AArch64_AM::getFP32Imm(N->getValueAPF()) != -1;
}], SDNodeXForm<fpimm, [{
APFloat InVal = N->getValueAPF();
uint32_t enc = ARM64_AM::getFP32Imm(InVal);
uint32_t enc = AArch64_AM::getFP32Imm(InVal);
return CurDAG->getTargetConstant(enc, MVT::i32);
}]>> {
let ParserMatchClass = FPImmOperand;
@ -672,10 +672,10 @@ def fpimm32 : Operand<f32>,
}
def fpimm64 : Operand<f64>,
PatLeaf<(f64 fpimm), [{
return ARM64_AM::getFP64Imm(N->getValueAPF()) != -1;
return AArch64_AM::getFP64Imm(N->getValueAPF()) != -1;
}], SDNodeXForm<fpimm, [{
APFloat InVal = N->getValueAPF();
uint32_t enc = ARM64_AM::getFP64Imm(InVal);
uint32_t enc = AArch64_AM::getFP64Imm(InVal);
return CurDAG->getTargetConstant(enc, MVT::i32);
}]>> {
let ParserMatchClass = FPImmOperand;
@ -743,12 +743,12 @@ def VectorIndexD : Operand<i64>, ImmLeaf<i64, [{
// are encoded as the eight bit value 'abcdefgh'.
def simdimmtype10 : Operand<i32>,
PatLeaf<(f64 fpimm), [{
return ARM64_AM::isAdvSIMDModImmType10(N->getValueAPF()
return AArch64_AM::isAdvSIMDModImmType10(N->getValueAPF()
.bitcastToAPInt()
.getZExtValue());
}], SDNodeXForm<fpimm, [{
APFloat InVal = N->getValueAPF();
uint32_t enc = ARM64_AM::encodeAdvSIMDModImmType10(N->getValueAPF()
uint32_t enc = AArch64_AM::encodeAdvSIMDModImmType10(N->getValueAPF()
.bitcastToAPInt()
.getZExtValue());
return CurDAG->getTargetConstant(enc, MVT::i32);
@ -982,7 +982,7 @@ def am_brcond : Operand<OtherVT> {
class BranchCond : I<(outs), (ins ccode:$cond, am_brcond:$target),
"b", ".$cond\t$target", "",
[(ARM64brcond bb:$target, imm:$cond, NZCV)]>,
[(AArch64brcond bb:$target, imm:$cond, NZCV)]>,
Sched<[WriteBr]> {
let isBranch = 1;
let isTerminator = 1;
@ -1759,7 +1759,7 @@ multiclass AddSubS<bit isSub, string mnemonic, SDNode OpNode, string cmp> {
//---
def SDTA64EXTR : SDTypeProfile<1, 3, [SDTCisSameAs<0, 1>, SDTCisSameAs<0, 2>,
SDTCisPtrTy<3>]>;
def ARM64Extr : SDNode<"ARM64ISD::EXTR", SDTA64EXTR>;
def AArch64Extr : SDNode<"AArch64ISD::EXTR", SDTA64EXTR>;
class BaseExtractImm<RegisterClass regtype, Operand imm_type, string asm,
list<dag> patterns>
@ -1782,7 +1782,7 @@ class BaseExtractImm<RegisterClass regtype, Operand imm_type, string asm,
multiclass ExtractImm<string asm> {
def Wrri : BaseExtractImm<GPR32, imm0_31, asm,
[(set GPR32:$Rd,
(ARM64Extr GPR32:$Rn, GPR32:$Rm, imm0_31:$imm))]> {
(AArch64Extr GPR32:$Rn, GPR32:$Rm, imm0_31:$imm))]> {
let Inst{31} = 0;
let Inst{22} = 0;
// imm<5> must be zero.
@ -1790,7 +1790,7 @@ multiclass ExtractImm<string asm> {
}
def Xrri : BaseExtractImm<GPR64, imm0_63, asm,
[(set GPR64:$Rd,
(ARM64Extr GPR64:$Rn, GPR64:$Rm, imm0_63:$imm))]> {
(AArch64Extr GPR64:$Rn, GPR64:$Rm, imm0_63:$imm))]> {
let Inst{31} = 1;
let Inst{22} = 1;
@ -2081,7 +2081,7 @@ class BaseCondSelect<bit op, bits<2> op2, RegisterClass regtype, string asm>
: I<(outs regtype:$Rd), (ins regtype:$Rn, regtype:$Rm, ccode:$cond),
asm, "\t$Rd, $Rn, $Rm, $cond", "",
[(set regtype:$Rd,
(ARM64csel regtype:$Rn, regtype:$Rm, (i32 imm:$cond), NZCV))]>,
(AArch64csel regtype:$Rn, regtype:$Rm, (i32 imm:$cond), NZCV))]>,
Sched<[WriteI, ReadI, ReadI]> {
let Uses = [NZCV];
@ -2113,7 +2113,7 @@ class BaseCondSelectOp<bit op, bits<2> op2, RegisterClass regtype, string asm,
: I<(outs regtype:$Rd), (ins regtype:$Rn, regtype:$Rm, ccode:$cond),
asm, "\t$Rd, $Rn, $Rm, $cond", "",
[(set regtype:$Rd,
(ARM64csel regtype:$Rn, (frag regtype:$Rm),
(AArch64csel regtype:$Rn, (frag regtype:$Rm),
(i32 imm:$cond), NZCV))]>,
Sched<[WriteI, ReadI, ReadI]> {
let Uses = [NZCV];
@ -2133,8 +2133,8 @@ class BaseCondSelectOp<bit op, bits<2> op2, RegisterClass regtype, string asm,
}
def inv_cond_XFORM : SDNodeXForm<imm, [{
ARM64CC::CondCode CC = static_cast<ARM64CC::CondCode>(N->getZExtValue());
return CurDAG->getTargetConstant(ARM64CC::getInvertedCondCode(CC), MVT::i32);
AArch64CC::CondCode CC = static_cast<AArch64CC::CondCode>(N->getZExtValue());
return CurDAG->getTargetConstant(AArch64CC::getInvertedCondCode(CC), MVT::i32);
}]>;
multiclass CondSelectOp<bit op, bits<2> op2, string asm, PatFrag frag> {
@ -2145,11 +2145,11 @@ multiclass CondSelectOp<bit op, bits<2> op2, string asm, PatFrag frag> {
let Inst{31} = 1;
}
def : Pat<(ARM64csel (frag GPR32:$Rm), GPR32:$Rn, (i32 imm:$cond), NZCV),
def : Pat<(AArch64csel (frag GPR32:$Rm), GPR32:$Rn, (i32 imm:$cond), NZCV),
(!cast<Instruction>(NAME # Wr) GPR32:$Rn, GPR32:$Rm,
(inv_cond_XFORM imm:$cond))>;
def : Pat<(ARM64csel (frag GPR64:$Rm), GPR64:$Rn, (i32 imm:$cond), NZCV),
def : Pat<(AArch64csel (frag GPR64:$Rm), GPR64:$Rn, (i32 imm:$cond), NZCV),
(!cast<Instruction>(NAME # Xr) GPR64:$Rn, GPR64:$Rm,
(inv_cond_XFORM imm:$cond))>;
}
@ -2194,7 +2194,7 @@ class uimm12_scaled<int Scale> : Operand<i64> {
let ParserMatchClass
= !cast<AsmOperandClass>("UImm12OffsetScale" # Scale # "Operand");
let EncoderMethod
= "getLdStUImm12OpValue<ARM64::fixup_arm64_ldst_imm12_scale" # Scale # ">";
= "getLdStUImm12OpValue<AArch64::fixup_aarch64_ldst_imm12_scale" # Scale # ">";
let PrintMethod = "printUImm12Offset<" # Scale # ">";
}
@ -2782,7 +2782,7 @@ class BasePrefetchRO<bits<2> sz, bit V, bits<2> opc, dag outs, dag ins,
multiclass PrefetchRO<bits<2> sz, bit V, bits<2> opc, string asm> {
def roW : BasePrefetchRO<sz, V, opc, (outs),
(ins prfop:$Rt, GPR64sp:$Rn, GPR32:$Rm, ro_Wextend64:$extend),
asm, [(ARM64Prefetch imm:$Rt,
asm, [(AArch64Prefetch imm:$Rt,
(ro_Windexed64 GPR64sp:$Rn, GPR32:$Rm,
ro_Wextend64:$extend))]> {
let Inst{13} = 0b0;
@ -2790,7 +2790,7 @@ multiclass PrefetchRO<bits<2> sz, bit V, bits<2> opc, string asm> {
def roX : BasePrefetchRO<sz, V, opc, (outs),
(ins prfop:$Rt, GPR64sp:$Rn, GPR64:$Rm, ro_Xextend64:$extend),
asm, [(ARM64Prefetch imm:$Rt,
asm, [(AArch64Prefetch imm:$Rt,
(ro_Xindexed64 GPR64sp:$Rn, GPR64:$Rm,
ro_Xextend64:$extend))]> {
let Inst{13} = 0b1;
@ -3912,7 +3912,7 @@ class BaseFPCondSelect<RegisterClass regtype, ValueType vt, string asm>
: I<(outs regtype:$Rd), (ins regtype:$Rn, regtype:$Rm, ccode:$cond),
asm, "\t$Rd, $Rn, $Rm, $cond", "",
[(set regtype:$Rd,
(ARM64csel (vt regtype:$Rn), regtype:$Rm,
(AArch64csel (vt regtype:$Rn), regtype:$Rm,
(i32 imm:$cond), NZCV))]>,
Sched<[WriteF]> {
bits<5> Rd;
@ -5074,28 +5074,28 @@ multiclass SIMDLongThreeVectorSQDMLXTiedHS<bit U, bits<4> opc, string asm,
asm, ".4s", ".4h", ".4h",
[(set (v4i32 V128:$dst),
(Accum (v4i32 V128:$Rd),
(v4i32 (int_arm64_neon_sqdmull (v4i16 V64:$Rn),
(v4i32 (int_aarch64_neon_sqdmull (v4i16 V64:$Rn),
(v4i16 V64:$Rm)))))]>;
def v8i16_v4i32 : BaseSIMDDifferentThreeVectorTied<U, 0b011, opc,
V128, V128, V128,
asm#"2", ".4s", ".8h", ".8h",
[(set (v4i32 V128:$dst),
(Accum (v4i32 V128:$Rd),
(v4i32 (int_arm64_neon_sqdmull (extract_high_v8i16 V128:$Rn),
(v4i32 (int_aarch64_neon_sqdmull (extract_high_v8i16 V128:$Rn),
(extract_high_v8i16 V128:$Rm)))))]>;
def v2i32_v2i64 : BaseSIMDDifferentThreeVectorTied<U, 0b100, opc,
V128, V64, V64,
asm, ".2d", ".2s", ".2s",
[(set (v2i64 V128:$dst),
(Accum (v2i64 V128:$Rd),
(v2i64 (int_arm64_neon_sqdmull (v2i32 V64:$Rn),
(v2i64 (int_aarch64_neon_sqdmull (v2i32 V64:$Rn),
(v2i32 V64:$Rm)))))]>;
def v4i32_v2i64 : BaseSIMDDifferentThreeVectorTied<U, 0b101, opc,
V128, V128, V128,
asm#"2", ".2d", ".4s", ".4s",
[(set (v2i64 V128:$dst),
(Accum (v2i64 V128:$Rd),
(v2i64 (int_arm64_neon_sqdmull (extract_high_v4i32 V128:$Rn),
(v2i64 (int_aarch64_neon_sqdmull (extract_high_v4i32 V128:$Rn),
(extract_high_v4i32 V128:$Rm)))))]>;
}
@ -5140,7 +5140,7 @@ class BaseSIMDBitwiseExtract<bit size, RegisterOperand regtype, ValueType vty,
"{\t$Rd" # kind # ", $Rn" # kind # ", $Rm" # kind # ", $imm" #
"|" # kind # "\t$Rd, $Rn, $Rm, $imm}", "",
[(set (vty regtype:$Rd),
(ARM64ext regtype:$Rn, regtype:$Rm, (i32 imm:$imm)))]>,
(AArch64ext regtype:$Rn, regtype:$Rm, (i32 imm:$imm)))]>,
Sched<[WriteV]> {
bits<5> Rd;
bits<5> Rn;
@ -5409,7 +5409,7 @@ class BaseSIMDCmpTwoScalar<bit U, bits<2> size, bits<5> opcode,
class SIMDInexactCvtTwoScalar<bits<5> opcode, string asm>
: I<(outs FPR32:$Rd), (ins FPR64:$Rn), asm, "\t$Rd, $Rn", "",
[(set (f32 FPR32:$Rd), (int_arm64_sisd_fcvtxn (f64 FPR64:$Rn)))]>,
[(set (f32 FPR32:$Rd), (int_aarch64_sisd_fcvtxn (f64 FPR64:$Rn)))]>,
Sched<[WriteV]> {
bits<5> Rd;
bits<5> Rn;
@ -5627,7 +5627,7 @@ class SIMDDupFromMain<bit Q, bits<5> imm5, string size, ValueType vectype,
: BaseSIMDInsDup<Q, 0, (outs vecreg:$Rd), (ins regtype:$Rn), "dup",
"{\t$Rd" # size # ", $Rn" #
"|" # size # "\t$Rd, $Rn}", "",
[(set (vectype vecreg:$Rd), (ARM64dup regtype:$Rn))]> {
[(set (vectype vecreg:$Rd), (AArch64dup regtype:$Rn))]> {
let Inst{20-16} = imm5;
let Inst{14-11} = 0b0001;
}
@ -5646,7 +5646,7 @@ class SIMDDupFromElement<bit Q, string dstkind, string srckind,
class SIMDDup64FromElement
: SIMDDupFromElement<1, ".2d", ".d", v2i64, v2i64, V128,
VectorIndexD, i64, ARM64duplane64> {
VectorIndexD, i64, AArch64duplane64> {
bits<1> idx;
let Inst{20} = idx;
let Inst{19-16} = 0b1000;
@ -5655,7 +5655,7 @@ class SIMDDup64FromElement
class SIMDDup32FromElement<bit Q, string size, ValueType vectype,
RegisterOperand vecreg>
: SIMDDupFromElement<Q, size, ".s", vectype, v4i32, vecreg,
VectorIndexS, i64, ARM64duplane32> {
VectorIndexS, i64, AArch64duplane32> {
bits<2> idx;
let Inst{20-19} = idx;
let Inst{18-16} = 0b100;
@ -5664,7 +5664,7 @@ class SIMDDup32FromElement<bit Q, string size, ValueType vectype,
class SIMDDup16FromElement<bit Q, string size, ValueType vectype,
RegisterOperand vecreg>
: SIMDDupFromElement<Q, size, ".h", vectype, v8i16, vecreg,
VectorIndexH, i64, ARM64duplane16> {
VectorIndexH, i64, AArch64duplane16> {
bits<3> idx;
let Inst{20-18} = idx;
let Inst{17-16} = 0b10;
@ -5673,7 +5673,7 @@ class SIMDDup16FromElement<bit Q, string size, ValueType vectype,
class SIMDDup8FromElement<bit Q, string size, ValueType vectype,
RegisterOperand vecreg>
: SIMDDupFromElement<Q, size, ".b", vectype, v16i8, vecreg,
VectorIndexB, i64, ARM64duplane8> {
VectorIndexB, i64, AArch64duplane8> {
bits<4> idx;
let Inst{20-17} = idx;
let Inst{16} = 1;
@ -6312,7 +6312,7 @@ multiclass SIMDFPIndexedSD<bit U, bits<4> opc, string asm,
asm, ".2s", ".2s", ".2s", ".s",
[(set (v2f32 V64:$Rd),
(OpNode (v2f32 V64:$Rn),
(v2f32 (ARM64duplane32 (v4f32 V128:$Rm), VectorIndexS:$idx))))]> {
(v2f32 (AArch64duplane32 (v4f32 V128:$Rm), VectorIndexS:$idx))))]> {
bits<2> idx;
let Inst{11} = idx{1};
let Inst{21} = idx{0};
@ -6324,7 +6324,7 @@ multiclass SIMDFPIndexedSD<bit U, bits<4> opc, string asm,
asm, ".4s", ".4s", ".4s", ".s",
[(set (v4f32 V128:$Rd),
(OpNode (v4f32 V128:$Rn),
(v4f32 (ARM64duplane32 (v4f32 V128:$Rm), VectorIndexS:$idx))))]> {
(v4f32 (AArch64duplane32 (v4f32 V128:$Rm), VectorIndexS:$idx))))]> {
bits<2> idx;
let Inst{11} = idx{1};
let Inst{21} = idx{0};
@ -6336,7 +6336,7 @@ multiclass SIMDFPIndexedSD<bit U, bits<4> opc, string asm,
asm, ".2d", ".2d", ".2d", ".d",
[(set (v2f64 V128:$Rd),
(OpNode (v2f64 V128:$Rn),
(v2f64 (ARM64duplane64 (v2f64 V128:$Rm), VectorIndexD:$idx))))]> {
(v2f64 (AArch64duplane64 (v2f64 V128:$Rm), VectorIndexD:$idx))))]> {
bits<1> idx;
let Inst{11} = idx{0};
let Inst{21} = 0;
@ -6370,35 +6370,35 @@ multiclass SIMDFPIndexedSD<bit U, bits<4> opc, string asm,
multiclass SIMDFPIndexedSDTiedPatterns<string INST, SDPatternOperator OpNode> {
// 2 variants for the .2s version: DUPLANE from 128-bit and DUP scalar.
def : Pat<(v2f32 (OpNode (v2f32 V64:$Rd), (v2f32 V64:$Rn),
(ARM64duplane32 (v4f32 V128:$Rm),
(AArch64duplane32 (v4f32 V128:$Rm),
VectorIndexS:$idx))),
(!cast<Instruction>(INST # v2i32_indexed)
V64:$Rd, V64:$Rn, V128:$Rm, VectorIndexS:$idx)>;
def : Pat<(v2f32 (OpNode (v2f32 V64:$Rd), (v2f32 V64:$Rn),
(ARM64dup (f32 FPR32Op:$Rm)))),
(AArch64dup (f32 FPR32Op:$Rm)))),
(!cast<Instruction>(INST # "v2i32_indexed") V64:$Rd, V64:$Rn,
(SUBREG_TO_REG (i32 0), FPR32Op:$Rm, ssub), (i64 0))>;
// 2 variants for the .4s version: DUPLANE from 128-bit and DUP scalar.
def : Pat<(v4f32 (OpNode (v4f32 V128:$Rd), (v4f32 V128:$Rn),
(ARM64duplane32 (v4f32 V128:$Rm),
(AArch64duplane32 (v4f32 V128:$Rm),
VectorIndexS:$idx))),
(!cast<Instruction>(INST # "v4i32_indexed")
V128:$Rd, V128:$Rn, V128:$Rm, VectorIndexS:$idx)>;
def : Pat<(v4f32 (OpNode (v4f32 V128:$Rd), (v4f32 V128:$Rn),
(ARM64dup (f32 FPR32Op:$Rm)))),
(AArch64dup (f32 FPR32Op:$Rm)))),
(!cast<Instruction>(INST # "v4i32_indexed") V128:$Rd, V128:$Rn,
(SUBREG_TO_REG (i32 0), FPR32Op:$Rm, ssub), (i64 0))>;
// 2 variants for the .2d version: DUPLANE from 128-bit and DUP scalar.
def : Pat<(v2f64 (OpNode (v2f64 V128:$Rd), (v2f64 V128:$Rn),
(ARM64duplane64 (v2f64 V128:$Rm),
(AArch64duplane64 (v2f64 V128:$Rm),
VectorIndexD:$idx))),
(!cast<Instruction>(INST # "v2i64_indexed")
V128:$Rd, V128:$Rn, V128:$Rm, VectorIndexS:$idx)>;
def : Pat<(v2f64 (OpNode (v2f64 V128:$Rd), (v2f64 V128:$Rn),
(ARM64dup (f64 FPR64Op:$Rm)))),
(AArch64dup (f64 FPR64Op:$Rm)))),
(!cast<Instruction>(INST # "v2i64_indexed") V128:$Rd, V128:$Rn,
(SUBREG_TO_REG (i32 0), FPR64Op:$Rm, dsub), (i64 0))>;
@ -6471,7 +6471,7 @@ multiclass SIMDIndexedHS<bit U, bits<4> opc, string asm,
asm, ".4h", ".4h", ".4h", ".h",
[(set (v4i16 V64:$Rd),
(OpNode (v4i16 V64:$Rn),
(v4i16 (ARM64duplane16 (v8i16 V128_lo:$Rm), VectorIndexH:$idx))))]> {
(v4i16 (AArch64duplane16 (v8i16 V128_lo:$Rm), VectorIndexH:$idx))))]> {
bits<3> idx;
let Inst{11} = idx{2};
let Inst{21} = idx{1};
@ -6484,7 +6484,7 @@ multiclass SIMDIndexedHS<bit U, bits<4> opc, string asm,
asm, ".8h", ".8h", ".8h", ".h",
[(set (v8i16 V128:$Rd),
(OpNode (v8i16 V128:$Rn),
(v8i16 (ARM64duplane16 (v8i16 V128_lo:$Rm), VectorIndexH:$idx))))]> {
(v8i16 (AArch64duplane16 (v8i16 V128_lo:$Rm), VectorIndexH:$idx))))]> {
bits<3> idx;
let Inst{11} = idx{2};
let Inst{21} = idx{1};
@ -6497,7 +6497,7 @@ multiclass SIMDIndexedHS<bit U, bits<4> opc, string asm,
asm, ".2s", ".2s", ".2s", ".s",
[(set (v2i32 V64:$Rd),
(OpNode (v2i32 V64:$Rn),
(v2i32 (ARM64duplane32 (v4i32 V128:$Rm), VectorIndexS:$idx))))]> {
(v2i32 (AArch64duplane32 (v4i32 V128:$Rm), VectorIndexS:$idx))))]> {
bits<2> idx;
let Inst{11} = idx{1};
let Inst{21} = idx{0};
@ -6509,7 +6509,7 @@ multiclass SIMDIndexedHS<bit U, bits<4> opc, string asm,
asm, ".4s", ".4s", ".4s", ".s",
[(set (v4i32 V128:$Rd),
(OpNode (v4i32 V128:$Rn),
(v4i32 (ARM64duplane32 (v4i32 V128:$Rm), VectorIndexS:$idx))))]> {
(v4i32 (AArch64duplane32 (v4i32 V128:$Rm), VectorIndexS:$idx))))]> {
bits<2> idx;
let Inst{11} = idx{1};
let Inst{21} = idx{0};
@ -6545,7 +6545,7 @@ multiclass SIMDVectorIndexedHS<bit U, bits<4> opc, string asm,
asm, ".4h", ".4h", ".4h", ".h",
[(set (v4i16 V64:$Rd),
(OpNode (v4i16 V64:$Rn),
(v4i16 (ARM64duplane16 (v8i16 V128_lo:$Rm), VectorIndexH:$idx))))]> {
(v4i16 (AArch64duplane16 (v8i16 V128_lo:$Rm), VectorIndexH:$idx))))]> {
bits<3> idx;
let Inst{11} = idx{2};
let Inst{21} = idx{1};
@ -6558,7 +6558,7 @@ multiclass SIMDVectorIndexedHS<bit U, bits<4> opc, string asm,
asm, ".8h", ".8h", ".8h", ".h",
[(set (v8i16 V128:$Rd),
(OpNode (v8i16 V128:$Rn),
(v8i16 (ARM64duplane16 (v8i16 V128_lo:$Rm), VectorIndexH:$idx))))]> {
(v8i16 (AArch64duplane16 (v8i16 V128_lo:$Rm), VectorIndexH:$idx))))]> {
bits<3> idx;
let Inst{11} = idx{2};
let Inst{21} = idx{1};
@ -6571,7 +6571,7 @@ multiclass SIMDVectorIndexedHS<bit U, bits<4> opc, string asm,
asm, ".2s", ".2s", ".2s", ".s",
[(set (v2i32 V64:$Rd),
(OpNode (v2i32 V64:$Rn),
(v2i32 (ARM64duplane32 (v4i32 V128:$Rm), VectorIndexS:$idx))))]> {
(v2i32 (AArch64duplane32 (v4i32 V128:$Rm), VectorIndexS:$idx))))]> {
bits<2> idx;
let Inst{11} = idx{1};
let Inst{21} = idx{0};
@ -6583,7 +6583,7 @@ multiclass SIMDVectorIndexedHS<bit U, bits<4> opc, string asm,
asm, ".4s", ".4s", ".4s", ".s",
[(set (v4i32 V128:$Rd),
(OpNode (v4i32 V128:$Rn),
(v4i32 (ARM64duplane32 (v4i32 V128:$Rm), VectorIndexS:$idx))))]> {
(v4i32 (AArch64duplane32 (v4i32 V128:$Rm), VectorIndexS:$idx))))]> {
bits<2> idx;
let Inst{11} = idx{1};
let Inst{21} = idx{0};
@ -6597,7 +6597,7 @@ multiclass SIMDVectorIndexedHSTied<bit U, bits<4> opc, string asm,
asm, ".4h", ".4h", ".4h", ".h",
[(set (v4i16 V64:$dst),
(OpNode (v4i16 V64:$Rd),(v4i16 V64:$Rn),
(v4i16 (ARM64duplane16 (v8i16 V128_lo:$Rm), VectorIndexH:$idx))))]> {
(v4i16 (AArch64duplane16 (v8i16 V128_lo:$Rm), VectorIndexH:$idx))))]> {
bits<3> idx;
let Inst{11} = idx{2};
let Inst{21} = idx{1};
@ -6610,7 +6610,7 @@ multiclass SIMDVectorIndexedHSTied<bit U, bits<4> opc, string asm,
asm, ".8h", ".8h", ".8h", ".h",
[(set (v8i16 V128:$dst),
(OpNode (v8i16 V128:$Rd), (v8i16 V128:$Rn),
(v8i16 (ARM64duplane16 (v8i16 V128_lo:$Rm), VectorIndexH:$idx))))]> {
(v8i16 (AArch64duplane16 (v8i16 V128_lo:$Rm), VectorIndexH:$idx))))]> {
bits<3> idx;
let Inst{11} = idx{2};
let Inst{21} = idx{1};
@ -6623,7 +6623,7 @@ multiclass SIMDVectorIndexedHSTied<bit U, bits<4> opc, string asm,
asm, ".2s", ".2s", ".2s", ".s",
[(set (v2i32 V64:$dst),
(OpNode (v2i32 V64:$Rd), (v2i32 V64:$Rn),
(v2i32 (ARM64duplane32 (v4i32 V128:$Rm), VectorIndexS:$idx))))]> {
(v2i32 (AArch64duplane32 (v4i32 V128:$Rm), VectorIndexS:$idx))))]> {
bits<2> idx;
let Inst{11} = idx{1};
let Inst{21} = idx{0};
@ -6635,7 +6635,7 @@ multiclass SIMDVectorIndexedHSTied<bit U, bits<4> opc, string asm,
asm, ".4s", ".4s", ".4s", ".s",
[(set (v4i32 V128:$dst),
(OpNode (v4i32 V128:$Rd), (v4i32 V128:$Rn),
(v4i32 (ARM64duplane32 (v4i32 V128:$Rm), VectorIndexS:$idx))))]> {
(v4i32 (AArch64duplane32 (v4i32 V128:$Rm), VectorIndexS:$idx))))]> {
bits<2> idx;
let Inst{11} = idx{1};
let Inst{21} = idx{0};
@ -6650,7 +6650,7 @@ multiclass SIMDIndexedLongSD<bit U, bits<4> opc, string asm,
asm, ".4s", ".4s", ".4h", ".h",
[(set (v4i32 V128:$Rd),
(OpNode (v4i16 V64:$Rn),
(v4i16 (ARM64duplane16 (v8i16 V128_lo:$Rm), VectorIndexH:$idx))))]> {
(v4i16 (AArch64duplane16 (v8i16 V128_lo:$Rm), VectorIndexH:$idx))))]> {
bits<3> idx;
let Inst{11} = idx{2};
let Inst{21} = idx{1};
@ -6663,7 +6663,7 @@ multiclass SIMDIndexedLongSD<bit U, bits<4> opc, string asm,
asm#"2", ".4s", ".4s", ".8h", ".h",
[(set (v4i32 V128:$Rd),
(OpNode (extract_high_v8i16 V128:$Rn),
(extract_high_v8i16 (ARM64duplane16 (v8i16 V128_lo:$Rm),
(extract_high_v8i16 (AArch64duplane16 (v8i16 V128_lo:$Rm),
VectorIndexH:$idx))))]> {
bits<3> idx;
@ -6678,7 +6678,7 @@ multiclass SIMDIndexedLongSD<bit U, bits<4> opc, string asm,
asm, ".2d", ".2d", ".2s", ".s",
[(set (v2i64 V128:$Rd),
(OpNode (v2i32 V64:$Rn),
(v2i32 (ARM64duplane32 (v4i32 V128:$Rm), VectorIndexS:$idx))))]> {
(v2i32 (AArch64duplane32 (v4i32 V128:$Rm), VectorIndexS:$idx))))]> {
bits<2> idx;
let Inst{11} = idx{1};
let Inst{21} = idx{0};
@ -6690,7 +6690,7 @@ multiclass SIMDIndexedLongSD<bit U, bits<4> opc, string asm,
asm#"2", ".2d", ".2d", ".4s", ".s",
[(set (v2i64 V128:$Rd),
(OpNode (extract_high_v4i32 V128:$Rn),
(extract_high_v4i32 (ARM64duplane32 (v4i32 V128:$Rm),
(extract_high_v4i32 (AArch64duplane32 (v4i32 V128:$Rm),
VectorIndexS:$idx))))]> {
bits<2> idx;
let Inst{11} = idx{1};
@ -6723,9 +6723,9 @@ multiclass SIMDIndexedLongSQDMLXSDTied<bit U, bits<4> opc, string asm,
asm, ".4s", ".4s", ".4h", ".h",
[(set (v4i32 V128:$dst),
(Accum (v4i32 V128:$Rd),
(v4i32 (int_arm64_neon_sqdmull
(v4i32 (int_aarch64_neon_sqdmull
(v4i16 V64:$Rn),
(v4i16 (ARM64duplane16 (v8i16 V128_lo:$Rm),
(v4i16 (AArch64duplane16 (v8i16 V128_lo:$Rm),
VectorIndexH:$idx))))))]> {
bits<3> idx;
let Inst{11} = idx{2};
@ -6737,8 +6737,8 @@ multiclass SIMDIndexedLongSQDMLXSDTied<bit U, bits<4> opc, string asm,
// intermediate EXTRACT_SUBREG would be untyped.
def : Pat<(i32 (Accum (i32 FPR32Op:$Rd),
(i32 (vector_extract (v4i32
(int_arm64_neon_sqdmull (v4i16 V64:$Rn),
(v4i16 (ARM64duplane16 (v8i16 V128_lo:$Rm),
(int_aarch64_neon_sqdmull (v4i16 V64:$Rn),
(v4i16 (AArch64duplane16 (v8i16 V128_lo:$Rm),
VectorIndexH:$idx)))),
(i64 0))))),
(EXTRACT_SUBREG
@ -6753,10 +6753,10 @@ multiclass SIMDIndexedLongSQDMLXSDTied<bit U, bits<4> opc, string asm,
asm#"2", ".4s", ".4s", ".8h", ".h",
[(set (v4i32 V128:$dst),
(Accum (v4i32 V128:$Rd),
(v4i32 (int_arm64_neon_sqdmull
(v4i32 (int_aarch64_neon_sqdmull
(extract_high_v8i16 V128:$Rn),
(extract_high_v8i16
(ARM64duplane16 (v8i16 V128_lo:$Rm),
(AArch64duplane16 (v8i16 V128_lo:$Rm),
VectorIndexH:$idx))))))]> {
bits<3> idx;
let Inst{11} = idx{2};
@ -6770,9 +6770,9 @@ multiclass SIMDIndexedLongSQDMLXSDTied<bit U, bits<4> opc, string asm,
asm, ".2d", ".2d", ".2s", ".s",
[(set (v2i64 V128:$dst),
(Accum (v2i64 V128:$Rd),
(v2i64 (int_arm64_neon_sqdmull
(v2i64 (int_aarch64_neon_sqdmull
(v2i32 V64:$Rn),
(v2i32 (ARM64duplane32 (v4i32 V128:$Rm),
(v2i32 (AArch64duplane32 (v4i32 V128:$Rm),
VectorIndexS:$idx))))))]> {
bits<2> idx;
let Inst{11} = idx{1};
@ -6785,10 +6785,10 @@ multiclass SIMDIndexedLongSQDMLXSDTied<bit U, bits<4> opc, string asm,
asm#"2", ".2d", ".2d", ".4s", ".s",
[(set (v2i64 V128:$dst),
(Accum (v2i64 V128:$Rd),
(v2i64 (int_arm64_neon_sqdmull
(v2i64 (int_aarch64_neon_sqdmull
(extract_high_v4i32 V128:$Rn),
(extract_high_v4i32
(ARM64duplane32 (v4i32 V128:$Rm),
(AArch64duplane32 (v4i32 V128:$Rm),
VectorIndexS:$idx))))))]> {
bits<2> idx;
let Inst{11} = idx{1};
@ -6810,7 +6810,7 @@ multiclass SIMDIndexedLongSQDMLXSDTied<bit U, bits<4> opc, string asm,
asm, ".s", "", "", ".s",
[(set (i64 FPR64Op:$dst),
(Accum (i64 FPR64Op:$Rd),
(i64 (int_arm64_neon_sqdmulls_scalar
(i64 (int_aarch64_neon_sqdmulls_scalar
(i32 FPR32Op:$Rn),
(i32 (vector_extract (v4i32 V128:$Rm),
VectorIndexS:$idx))))))]> {
@ -6830,7 +6830,7 @@ multiclass SIMDVectorIndexedLongSD<bit U, bits<4> opc, string asm,
asm, ".4s", ".4s", ".4h", ".h",
[(set (v4i32 V128:$Rd),
(OpNode (v4i16 V64:$Rn),
(v4i16 (ARM64duplane16 (v8i16 V128_lo:$Rm), VectorIndexH:$idx))))]> {
(v4i16 (AArch64duplane16 (v8i16 V128_lo:$Rm), VectorIndexH:$idx))))]> {
bits<3> idx;
let Inst{11} = idx{2};
let Inst{21} = idx{1};
@ -6843,7 +6843,7 @@ multiclass SIMDVectorIndexedLongSD<bit U, bits<4> opc, string asm,
asm#"2", ".4s", ".4s", ".8h", ".h",
[(set (v4i32 V128:$Rd),
(OpNode (extract_high_v8i16 V128:$Rn),
(extract_high_v8i16 (ARM64duplane16 (v8i16 V128_lo:$Rm),
(extract_high_v8i16 (AArch64duplane16 (v8i16 V128_lo:$Rm),
VectorIndexH:$idx))))]> {
bits<3> idx;
@ -6858,7 +6858,7 @@ multiclass SIMDVectorIndexedLongSD<bit U, bits<4> opc, string asm,
asm, ".2d", ".2d", ".2s", ".s",
[(set (v2i64 V128:$Rd),
(OpNode (v2i32 V64:$Rn),
(v2i32 (ARM64duplane32 (v4i32 V128:$Rm), VectorIndexS:$idx))))]> {
(v2i32 (AArch64duplane32 (v4i32 V128:$Rm), VectorIndexS:$idx))))]> {
bits<2> idx;
let Inst{11} = idx{1};
let Inst{21} = idx{0};
@ -6870,7 +6870,7 @@ multiclass SIMDVectorIndexedLongSD<bit U, bits<4> opc, string asm,
asm#"2", ".2d", ".2d", ".4s", ".s",
[(set (v2i64 V128:$Rd),
(OpNode (extract_high_v4i32 V128:$Rn),
(extract_high_v4i32 (ARM64duplane32 (v4i32 V128:$Rm),
(extract_high_v4i32 (AArch64duplane32 (v4i32 V128:$Rm),
VectorIndexS:$idx))))]> {
bits<2> idx;
let Inst{11} = idx{1};
@ -6888,7 +6888,7 @@ multiclass SIMDVectorIndexedLongSDTied<bit U, bits<4> opc, string asm,
asm, ".4s", ".4s", ".4h", ".h",
[(set (v4i32 V128:$dst),
(OpNode (v4i32 V128:$Rd), (v4i16 V64:$Rn),
(v4i16 (ARM64duplane16 (v8i16 V128_lo:$Rm), VectorIndexH:$idx))))]> {
(v4i16 (AArch64duplane16 (v8i16 V128_lo:$Rm), VectorIndexH:$idx))))]> {
bits<3> idx;
let Inst{11} = idx{2};
let Inst{21} = idx{1};
@ -6902,7 +6902,7 @@ multiclass SIMDVectorIndexedLongSDTied<bit U, bits<4> opc, string asm,
[(set (v4i32 V128:$dst),
(OpNode (v4i32 V128:$Rd),
(extract_high_v8i16 V128:$Rn),
(extract_high_v8i16 (ARM64duplane16 (v8i16 V128_lo:$Rm),
(extract_high_v8i16 (AArch64duplane16 (v8i16 V128_lo:$Rm),
VectorIndexH:$idx))))]> {
bits<3> idx;
let Inst{11} = idx{2};
@ -6916,7 +6916,7 @@ multiclass SIMDVectorIndexedLongSDTied<bit U, bits<4> opc, string asm,
asm, ".2d", ".2d", ".2s", ".s",
[(set (v2i64 V128:$dst),
(OpNode (v2i64 V128:$Rd), (v2i32 V64:$Rn),
(v2i32 (ARM64duplane32 (v4i32 V128:$Rm), VectorIndexS:$idx))))]> {
(v2i32 (AArch64duplane32 (v4i32 V128:$Rm), VectorIndexS:$idx))))]> {
bits<2> idx;
let Inst{11} = idx{1};
let Inst{21} = idx{0};
@ -6929,7 +6929,7 @@ multiclass SIMDVectorIndexedLongSDTied<bit U, bits<4> opc, string asm,
[(set (v2i64 V128:$dst),
(OpNode (v2i64 V128:$Rd),
(extract_high_v4i32 V128:$Rn),
(extract_high_v4i32 (ARM64duplane32 (v4i32 V128:$Rm),
(extract_high_v4i32 (AArch64duplane32 (v4i32 V128:$Rm),
VectorIndexS:$idx))))]> {
bits<2> idx;
let Inst{11} = idx{1};

View File

@ -1,4 +1,4 @@
//===- ARM64InstrInfo.h - ARM64 Instruction Information ---------*- C++ -*-===//
//===- AArch64InstrInfo.h - AArch64 Instruction Information -----*- C++ -*-===//
//
// The LLVM Compiler Infrastructure
//
@ -7,44 +7,44 @@
//
//===----------------------------------------------------------------------===//
//
// This file contains the ARM64 implementation of the TargetInstrInfo class.
// This file contains the AArch64 implementation of the TargetInstrInfo class.
//
//===----------------------------------------------------------------------===//
#ifndef LLVM_TARGET_ARM64INSTRINFO_H
#define LLVM_TARGET_ARM64INSTRINFO_H
#ifndef LLVM_TARGET_AArch64INSTRINFO_H
#define LLVM_TARGET_AArch64INSTRINFO_H
#include "ARM64.h"
#include "ARM64RegisterInfo.h"
#include "AArch64.h"
#include "AArch64RegisterInfo.h"
#include "llvm/Target/TargetInstrInfo.h"
#define GET_INSTRINFO_HEADER
#include "ARM64GenInstrInfo.inc"
#include "AArch64GenInstrInfo.inc"
namespace llvm {
class ARM64Subtarget;
class ARM64TargetMachine;
class AArch64Subtarget;
class AArch64TargetMachine;
class ARM64InstrInfo : public ARM64GenInstrInfo {
class AArch64InstrInfo : public AArch64GenInstrInfo {
// Reserve bits in the MachineMemOperand target hint flags, starting at 1.
// They will be shifted into MOTargetHintStart when accessed.
enum TargetMemOperandFlags {
MOSuppressPair = 1
};
const ARM64RegisterInfo RI;
const ARM64Subtarget &Subtarget;
const AArch64RegisterInfo RI;
const AArch64Subtarget &Subtarget;
public:
explicit ARM64InstrInfo(const ARM64Subtarget &STI);
explicit AArch64InstrInfo(const AArch64Subtarget &STI);
/// getRegisterInfo - TargetInstrInfo is a superset of MRegister info. As
/// such, whenever a client has an instance of instruction info, it should
/// always be able to get register info as well (through this method).
const ARM64RegisterInfo &getRegisterInfo() const { return RI; }
const AArch64RegisterInfo &getRegisterInfo() const { return RI; }
const ARM64Subtarget &getSubTarget() const { return Subtarget; }
const AArch64Subtarget &getSubTarget() const { return Subtarget; }
unsigned GetInstSizeInBytes(const MachineInstr *MI) const;
@ -60,8 +60,8 @@ public:
/// is non-zero.
bool hasShiftedReg(const MachineInstr *MI) const;
/// Returns true if there is an extendable register and that the extending value
/// is non-zero.
/// Returns true if there is an extendable register and that the extending
/// value is non-zero.
bool hasExtendedReg(const MachineInstr *MI) const;
/// \brief Does this instruction set its full destination register to zero?
@ -168,63 +168,63 @@ private:
/// if necessary, to be replaced by the scavenger at the end of PEI.
void emitFrameOffset(MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI,
DebugLoc DL, unsigned DestReg, unsigned SrcReg, int Offset,
const ARM64InstrInfo *TII,
const AArch64InstrInfo *TII,
MachineInstr::MIFlag = MachineInstr::NoFlags,
bool SetNZCV = false);
/// rewriteARM64FrameIndex - Rewrite MI to access 'Offset' bytes from the
/// rewriteAArch64FrameIndex - Rewrite MI to access 'Offset' bytes from the
/// FP. Return false if the offset could not be handled directly in MI, and
/// return the left-over portion by reference.
bool rewriteARM64FrameIndex(MachineInstr &MI, unsigned FrameRegIdx,
bool rewriteAArch64FrameIndex(MachineInstr &MI, unsigned FrameRegIdx,
unsigned FrameReg, int &Offset,
const ARM64InstrInfo *TII);
const AArch64InstrInfo *TII);
/// \brief Use to report the frame offset status in isARM64FrameOffsetLegal.
enum ARM64FrameOffsetStatus {
ARM64FrameOffsetCannotUpdate = 0x0, ///< Offset cannot apply.
ARM64FrameOffsetIsLegal = 0x1, ///< Offset is legal.
ARM64FrameOffsetCanUpdate = 0x2 ///< Offset can apply, at least partly.
/// \brief Use to report the frame offset status in isAArch64FrameOffsetLegal.
enum AArch64FrameOffsetStatus {
AArch64FrameOffsetCannotUpdate = 0x0, ///< Offset cannot apply.
AArch64FrameOffsetIsLegal = 0x1, ///< Offset is legal.
AArch64FrameOffsetCanUpdate = 0x2 ///< Offset can apply, at least partly.
};
/// \brief Check if the @p Offset is a valid frame offset for @p MI.
/// The returned value reports the validity of the frame offset for @p MI.
/// It uses the values defined by ARM64FrameOffsetStatus for that.
/// If result == ARM64FrameOffsetCannotUpdate, @p MI cannot be updated to
/// It uses the values defined by AArch64FrameOffsetStatus for that.
/// If result == AArch64FrameOffsetCannotUpdate, @p MI cannot be updated to
/// use an offset.eq
/// If result & ARM64FrameOffsetIsLegal, @p Offset can completely be
/// If result & AArch64FrameOffsetIsLegal, @p Offset can completely be
/// rewriten in @p MI.
/// If result & ARM64FrameOffsetCanUpdate, @p Offset contains the
/// If result & AArch64FrameOffsetCanUpdate, @p Offset contains the
/// amount that is off the limit of the legal offset.
/// If set, @p OutUseUnscaledOp will contain the whether @p MI should be
/// turned into an unscaled operator, which opcode is in @p OutUnscaledOp.
/// If set, @p EmittableOffset contains the amount that can be set in @p MI
/// (possibly with @p OutUnscaledOp if OutUseUnscaledOp is true) and that
/// is a legal offset.
int isARM64FrameOffsetLegal(const MachineInstr &MI, int &Offset,
int isAArch64FrameOffsetLegal(const MachineInstr &MI, int &Offset,
bool *OutUseUnscaledOp = nullptr,
unsigned *OutUnscaledOp = nullptr,
int *EmittableOffset = nullptr);
static inline bool isUncondBranchOpcode(int Opc) { return Opc == ARM64::B; }
static inline bool isUncondBranchOpcode(int Opc) { return Opc == AArch64::B; }
static inline bool isCondBranchOpcode(int Opc) {
switch (Opc) {
case ARM64::Bcc:
case ARM64::CBZW:
case ARM64::CBZX:
case ARM64::CBNZW:
case ARM64::CBNZX:
case ARM64::TBZW:
case ARM64::TBZX:
case ARM64::TBNZW:
case ARM64::TBNZX:
case AArch64::Bcc:
case AArch64::CBZW:
case AArch64::CBZX:
case AArch64::CBNZW:
case AArch64::CBNZX:
case AArch64::TBZW:
case AArch64::TBZX:
case AArch64::TBNZW:
case AArch64::TBNZX:
return true;
default:
return false;
}
}
static inline bool isIndirectBranchOpcode(int Opc) { return Opc == ARM64::BR; }
static inline bool isIndirectBranchOpcode(int Opc) { return Opc == AArch64::BR; }
} // end namespace llvm

View File

@ -1,4 +1,4 @@
//===-- ARM64LoadStoreOptimizer.cpp - ARM64 load/store opt. pass --*- C++ -*-=//
//=- AArch64LoadStoreOptimizer.cpp - AArch64 load/store opt. pass -*- C++ -*-=//
//
// The LLVM Compiler Infrastructure
//
@ -12,8 +12,8 @@
//
//===----------------------------------------------------------------------===//
#include "ARM64InstrInfo.h"
#include "MCTargetDesc/ARM64AddressingModes.h"
#include "AArch64InstrInfo.h"
#include "MCTargetDesc/AArch64AddressingModes.h"
#include "llvm/ADT/BitVector.h"
#include "llvm/CodeGen/MachineBasicBlock.h"
#include "llvm/CodeGen/MachineFunctionPass.h"
@ -29,9 +29,9 @@
#include "llvm/ADT/Statistic.h"
using namespace llvm;
#define DEBUG_TYPE "arm64-ldst-opt"
#define DEBUG_TYPE "aarch64-ldst-opt"
/// ARM64AllocLoadStoreOpt - Post-register allocation pass to combine
/// AArch64AllocLoadStoreOpt - Post-register allocation pass to combine
/// load / store instructions to form ldp / stp instructions.
STATISTIC(NumPairCreated, "Number of load/store pair instructions generated");
@ -40,21 +40,21 @@ STATISTIC(NumPreFolded, "Number of pre-index updates folded");
STATISTIC(NumUnscaledPairCreated,
"Number of load/store from unscaled generated");
static cl::opt<unsigned> ScanLimit("arm64-load-store-scan-limit", cl::init(20),
static cl::opt<unsigned> ScanLimit("aarch64-load-store-scan-limit", cl::init(20),
cl::Hidden);
// Place holder while testing unscaled load/store combining
static cl::opt<bool>
EnableARM64UnscaledMemOp("arm64-unscaled-mem-op", cl::Hidden,
cl::desc("Allow ARM64 unscaled load/store combining"),
EnableAArch64UnscaledMemOp("aarch64-unscaled-mem-op", cl::Hidden,
cl::desc("Allow AArch64 unscaled load/store combining"),
cl::init(true));
namespace {
struct ARM64LoadStoreOpt : public MachineFunctionPass {
struct AArch64LoadStoreOpt : public MachineFunctionPass {
static char ID;
ARM64LoadStoreOpt() : MachineFunctionPass(ID) {}
AArch64LoadStoreOpt() : MachineFunctionPass(ID) {}
const ARM64InstrInfo *TII;
const AArch64InstrInfo *TII;
const TargetRegisterInfo *TRI;
// Scan the instructions looking for a load/store that can be combined
@ -102,76 +102,76 @@ struct ARM64LoadStoreOpt : public MachineFunctionPass {
bool runOnMachineFunction(MachineFunction &Fn) override;
const char *getPassName() const override {
return "ARM64 load / store optimization pass";
return "AArch64 load / store optimization pass";
}
private:
int getMemSize(MachineInstr *MemMI);
};
char ARM64LoadStoreOpt::ID = 0;
char AArch64LoadStoreOpt::ID = 0;
}
static bool isUnscaledLdst(unsigned Opc) {
switch (Opc) {
default:
return false;
case ARM64::STURSi:
case AArch64::STURSi:
return true;
case ARM64::STURDi:
case AArch64::STURDi:
return true;
case ARM64::STURQi:
case AArch64::STURQi:
return true;
case ARM64::STURWi:
case AArch64::STURWi:
return true;
case ARM64::STURXi:
case AArch64::STURXi:
return true;
case ARM64::LDURSi:
case AArch64::LDURSi:
return true;
case ARM64::LDURDi:
case AArch64::LDURDi:
return true;
case ARM64::LDURQi:
case AArch64::LDURQi:
return true;
case ARM64::LDURWi:
case AArch64::LDURWi:
return true;
case ARM64::LDURXi:
case AArch64::LDURXi:
return true;
}
}
// Size in bytes of the data moved by an unscaled load or store
int ARM64LoadStoreOpt::getMemSize(MachineInstr *MemMI) {
int AArch64LoadStoreOpt::getMemSize(MachineInstr *MemMI) {
switch (MemMI->getOpcode()) {
default:
llvm_unreachable("Opcode has has unknown size!");
case ARM64::STRSui:
case ARM64::STURSi:
case AArch64::STRSui:
case AArch64::STURSi:
return 4;
case ARM64::STRDui:
case ARM64::STURDi:
case AArch64::STRDui:
case AArch64::STURDi:
return 8;
case ARM64::STRQui:
case ARM64::STURQi:
case AArch64::STRQui:
case AArch64::STURQi:
return 16;
case ARM64::STRWui:
case ARM64::STURWi:
case AArch64::STRWui:
case AArch64::STURWi:
return 4;
case ARM64::STRXui:
case ARM64::STURXi:
case AArch64::STRXui:
case AArch64::STURXi:
return 8;
case ARM64::LDRSui:
case ARM64::LDURSi:
case AArch64::LDRSui:
case AArch64::LDURSi:
return 4;
case ARM64::LDRDui:
case ARM64::LDURDi:
case AArch64::LDRDui:
case AArch64::LDURDi:
return 8;
case ARM64::LDRQui:
case ARM64::LDURQi:
case AArch64::LDRQui:
case AArch64::LDURQi:
return 16;
case ARM64::LDRWui:
case ARM64::LDURWi:
case AArch64::LDRWui:
case AArch64::LDURWi:
return 4;
case ARM64::LDRXui:
case ARM64::LDURXi:
case AArch64::LDRXui:
case AArch64::LDURXi:
return 8;
}
}
@ -180,36 +180,36 @@ static unsigned getMatchingPairOpcode(unsigned Opc) {
switch (Opc) {
default:
llvm_unreachable("Opcode has no pairwise equivalent!");
case ARM64::STRSui:
case ARM64::STURSi:
return ARM64::STPSi;
case ARM64::STRDui:
case ARM64::STURDi:
return ARM64::STPDi;
case ARM64::STRQui:
case ARM64::STURQi:
return ARM64::STPQi;
case ARM64::STRWui:
case ARM64::STURWi:
return ARM64::STPWi;
case ARM64::STRXui:
case ARM64::STURXi:
return ARM64::STPXi;
case ARM64::LDRSui:
case ARM64::LDURSi:
return ARM64::LDPSi;
case ARM64::LDRDui:
case ARM64::LDURDi:
return ARM64::LDPDi;
case ARM64::LDRQui:
case ARM64::LDURQi:
return ARM64::LDPQi;
case ARM64::LDRWui:
case ARM64::LDURWi:
return ARM64::LDPWi;
case ARM64::LDRXui:
case ARM64::LDURXi:
return ARM64::LDPXi;
case AArch64::STRSui:
case AArch64::STURSi:
return AArch64::STPSi;
case AArch64::STRDui:
case AArch64::STURDi:
return AArch64::STPDi;
case AArch64::STRQui:
case AArch64::STURQi:
return AArch64::STPQi;
case AArch64::STRWui:
case AArch64::STURWi:
return AArch64::STPWi;
case AArch64::STRXui:
case AArch64::STURXi:
return AArch64::STPXi;
case AArch64::LDRSui:
case AArch64::LDURSi:
return AArch64::LDPSi;
case AArch64::LDRDui:
case AArch64::LDURDi:
return AArch64::LDPDi;
case AArch64::LDRQui:
case AArch64::LDURQi:
return AArch64::LDPQi;
case AArch64::LDRWui:
case AArch64::LDURWi:
return AArch64::LDPWi;
case AArch64::LDRXui:
case AArch64::LDURXi:
return AArch64::LDPXi;
}
}
@ -217,16 +217,16 @@ static unsigned getPreIndexedOpcode(unsigned Opc) {
switch (Opc) {
default:
llvm_unreachable("Opcode has no pre-indexed equivalent!");
case ARM64::STRSui: return ARM64::STRSpre;
case ARM64::STRDui: return ARM64::STRDpre;
case ARM64::STRQui: return ARM64::STRQpre;
case ARM64::STRWui: return ARM64::STRWpre;
case ARM64::STRXui: return ARM64::STRXpre;
case ARM64::LDRSui: return ARM64::LDRSpre;
case ARM64::LDRDui: return ARM64::LDRDpre;
case ARM64::LDRQui: return ARM64::LDRQpre;
case ARM64::LDRWui: return ARM64::LDRWpre;
case ARM64::LDRXui: return ARM64::LDRXpre;
case AArch64::STRSui: return AArch64::STRSpre;
case AArch64::STRDui: return AArch64::STRDpre;
case AArch64::STRQui: return AArch64::STRQpre;
case AArch64::STRWui: return AArch64::STRWpre;
case AArch64::STRXui: return AArch64::STRXpre;
case AArch64::LDRSui: return AArch64::LDRSpre;
case AArch64::LDRDui: return AArch64::LDRDpre;
case AArch64::LDRQui: return AArch64::LDRQpre;
case AArch64::LDRWui: return AArch64::LDRWpre;
case AArch64::LDRXui: return AArch64::LDRXpre;
}
}
@ -234,33 +234,33 @@ static unsigned getPostIndexedOpcode(unsigned Opc) {
switch (Opc) {
default:
llvm_unreachable("Opcode has no post-indexed wise equivalent!");
case ARM64::STRSui:
return ARM64::STRSpost;
case ARM64::STRDui:
return ARM64::STRDpost;
case ARM64::STRQui:
return ARM64::STRQpost;
case ARM64::STRWui:
return ARM64::STRWpost;
case ARM64::STRXui:
return ARM64::STRXpost;
case ARM64::LDRSui:
return ARM64::LDRSpost;
case ARM64::LDRDui:
return ARM64::LDRDpost;
case ARM64::LDRQui:
return ARM64::LDRQpost;
case ARM64::LDRWui:
return ARM64::LDRWpost;
case ARM64::LDRXui:
return ARM64::LDRXpost;
case AArch64::STRSui:
return AArch64::STRSpost;
case AArch64::STRDui:
return AArch64::STRDpost;
case AArch64::STRQui:
return AArch64::STRQpost;
case AArch64::STRWui:
return AArch64::STRWpost;
case AArch64::STRXui:
return AArch64::STRXpost;
case AArch64::LDRSui:
return AArch64::LDRSpost;
case AArch64::LDRDui:
return AArch64::LDRDpost;
case AArch64::LDRQui:
return AArch64::LDRQpost;
case AArch64::LDRWui:
return AArch64::LDRWpost;
case AArch64::LDRXui:
return AArch64::LDRXpost;
}
}
MachineBasicBlock::iterator
ARM64LoadStoreOpt::mergePairedInsns(MachineBasicBlock::iterator I,
MachineBasicBlock::iterator Paired,
bool mergeForward) {
AArch64LoadStoreOpt::mergePairedInsns(MachineBasicBlock::iterator I,
MachineBasicBlock::iterator Paired,
bool mergeForward) {
MachineBasicBlock::iterator NextI = I;
++NextI;
// If NextI is the second of the two instructions to be merged, we need
@ -271,7 +271,8 @@ ARM64LoadStoreOpt::mergePairedInsns(MachineBasicBlock::iterator I,
++NextI;
bool IsUnscaled = isUnscaledLdst(I->getOpcode());
int OffsetStride = IsUnscaled && EnableARM64UnscaledMemOp ? getMemSize(I) : 1;
int OffsetStride =
IsUnscaled && EnableAArch64UnscaledMemOp ? getMemSize(I) : 1;
unsigned NewOpc = getMatchingPairOpcode(I->getOpcode());
// Insert our new paired instruction after whichever of the paired
@ -294,7 +295,7 @@ ARM64LoadStoreOpt::mergePairedInsns(MachineBasicBlock::iterator I,
}
// Handle Unscaled
int OffsetImm = RtMI->getOperand(2).getImm();
if (IsUnscaled && EnableARM64UnscaledMemOp)
if (IsUnscaled && EnableAArch64UnscaledMemOp)
OffsetImm /= OffsetStride;
// Construct the new instruction.
@ -372,8 +373,8 @@ static int alignTo(int Num, int PowOf2) {
/// findMatchingInsn - Scan the instructions looking for a load/store that can
/// be combined with the current instruction into a load/store pair.
MachineBasicBlock::iterator
ARM64LoadStoreOpt::findMatchingInsn(MachineBasicBlock::iterator I,
bool &mergeForward, unsigned Limit) {
AArch64LoadStoreOpt::findMatchingInsn(MachineBasicBlock::iterator I,
bool &mergeForward, unsigned Limit) {
MachineBasicBlock::iterator E = I->getParent()->end();
MachineBasicBlock::iterator MBBI = I;
MachineInstr *FirstMI = I;
@ -394,7 +395,7 @@ ARM64LoadStoreOpt::findMatchingInsn(MachineBasicBlock::iterator I,
if (FirstMI->modifiesRegister(BaseReg, TRI))
return E;
int OffsetStride =
IsUnscaled && EnableARM64UnscaledMemOp ? getMemSize(FirstMI) : 1;
IsUnscaled && EnableAArch64UnscaledMemOp ? getMemSize(FirstMI) : 1;
if (!inBoundsForPair(IsUnscaled, Offset, OffsetStride))
return E;
@ -444,7 +445,7 @@ ARM64LoadStoreOpt::findMatchingInsn(MachineBasicBlock::iterator I,
// If the alignment requirements of the paired (scaled) instruction
// can't express the offset of the unscaled input, bail and keep
// looking.
if (IsUnscaled && EnableARM64UnscaledMemOp &&
if (IsUnscaled && EnableAArch64UnscaledMemOp &&
(alignTo(MinOffset, OffsetStride) != MinOffset)) {
trackRegDefsUses(MI, ModifiedRegs, UsedRegs, TRI);
continue;
@ -507,10 +508,10 @@ ARM64LoadStoreOpt::findMatchingInsn(MachineBasicBlock::iterator I,
}
MachineBasicBlock::iterator
ARM64LoadStoreOpt::mergePreIdxUpdateInsn(MachineBasicBlock::iterator I,
MachineBasicBlock::iterator Update) {
assert((Update->getOpcode() == ARM64::ADDXri ||
Update->getOpcode() == ARM64::SUBXri) &&
AArch64LoadStoreOpt::mergePreIdxUpdateInsn(MachineBasicBlock::iterator I,
MachineBasicBlock::iterator Update) {
assert((Update->getOpcode() == AArch64::ADDXri ||
Update->getOpcode() == AArch64::SUBXri) &&
"Unexpected base register update instruction to merge!");
MachineBasicBlock::iterator NextI = I;
// Return the instruction following the merged instruction, which is
@ -520,9 +521,9 @@ ARM64LoadStoreOpt::mergePreIdxUpdateInsn(MachineBasicBlock::iterator I,
++NextI;
int Value = Update->getOperand(2).getImm();
assert(ARM64_AM::getShiftValue(Update->getOperand(3).getImm()) == 0 &&
assert(AArch64_AM::getShiftValue(Update->getOperand(3).getImm()) == 0 &&
"Can't merge 1 << 12 offset into pre-indexed load / store");
if (Update->getOpcode() == ARM64::SUBXri)
if (Update->getOpcode() == AArch64::SUBXri)
Value = -Value;
unsigned NewOpc = getPreIndexedOpcode(I->getOpcode());
@ -550,11 +551,10 @@ ARM64LoadStoreOpt::mergePreIdxUpdateInsn(MachineBasicBlock::iterator I,
return NextI;
}
MachineBasicBlock::iterator
ARM64LoadStoreOpt::mergePostIdxUpdateInsn(MachineBasicBlock::iterator I,
MachineBasicBlock::iterator Update) {
assert((Update->getOpcode() == ARM64::ADDXri ||
Update->getOpcode() == ARM64::SUBXri) &&
MachineBasicBlock::iterator AArch64LoadStoreOpt::mergePostIdxUpdateInsn(
MachineBasicBlock::iterator I, MachineBasicBlock::iterator Update) {
assert((Update->getOpcode() == AArch64::ADDXri ||
Update->getOpcode() == AArch64::SUBXri) &&
"Unexpected base register update instruction to merge!");
MachineBasicBlock::iterator NextI = I;
// Return the instruction following the merged instruction, which is
@ -564,9 +564,9 @@ ARM64LoadStoreOpt::mergePostIdxUpdateInsn(MachineBasicBlock::iterator I,
++NextI;
int Value = Update->getOperand(2).getImm();
assert(ARM64_AM::getShiftValue(Update->getOperand(3).getImm()) == 0 &&
assert(AArch64_AM::getShiftValue(Update->getOperand(3).getImm()) == 0 &&
"Can't merge 1 << 12 offset into post-indexed load / store");
if (Update->getOpcode() == ARM64::SUBXri)
if (Update->getOpcode() == AArch64::SUBXri)
Value = -Value;
unsigned NewOpc = getPostIndexedOpcode(I->getOpcode());
@ -599,17 +599,17 @@ static bool isMatchingUpdateInsn(MachineInstr *MI, unsigned BaseReg,
switch (MI->getOpcode()) {
default:
break;
case ARM64::SUBXri:
case AArch64::SUBXri:
// Negate the offset for a SUB instruction.
Offset *= -1;
// FALLTHROUGH
case ARM64::ADDXri:
case AArch64::ADDXri:
// Make sure it's a vanilla immediate operand, not a relocation or
// anything else we can't handle.
if (!MI->getOperand(2).isImm())
break;
// Watch out for 1 << 12 shifted value.
if (ARM64_AM::getShiftValue(MI->getOperand(3).getImm()))
if (AArch64_AM::getShiftValue(MI->getOperand(3).getImm()))
break;
// If the instruction has the base register as source and dest and the
// immediate will fit in a signed 9-bit integer, then we have a match.
@ -627,9 +627,8 @@ static bool isMatchingUpdateInsn(MachineInstr *MI, unsigned BaseReg,
return false;
}
MachineBasicBlock::iterator
ARM64LoadStoreOpt::findMatchingUpdateInsnForward(MachineBasicBlock::iterator I,
unsigned Limit, int Value) {
MachineBasicBlock::iterator AArch64LoadStoreOpt::findMatchingUpdateInsnForward(
MachineBasicBlock::iterator I, unsigned Limit, int Value) {
MachineBasicBlock::iterator E = I->getParent()->end();
MachineInstr *MemMI = I;
MachineBasicBlock::iterator MBBI = I;
@ -682,9 +681,8 @@ ARM64LoadStoreOpt::findMatchingUpdateInsnForward(MachineBasicBlock::iterator I,
return E;
}
MachineBasicBlock::iterator
ARM64LoadStoreOpt::findMatchingUpdateInsnBackward(MachineBasicBlock::iterator I,
unsigned Limit) {
MachineBasicBlock::iterator AArch64LoadStoreOpt::findMatchingUpdateInsnBackward(
MachineBasicBlock::iterator I, unsigned Limit) {
MachineBasicBlock::iterator B = I->getParent()->begin();
MachineBasicBlock::iterator E = I->getParent()->end();
MachineInstr *MemMI = I;
@ -736,7 +734,7 @@ ARM64LoadStoreOpt::findMatchingUpdateInsnBackward(MachineBasicBlock::iterator I,
return E;
}
bool ARM64LoadStoreOpt::optimizeBlock(MachineBasicBlock &MBB) {
bool AArch64LoadStoreOpt::optimizeBlock(MachineBasicBlock &MBB) {
bool Modified = false;
// Two tranformations to do here:
// 1) Find loads and stores that can be merged into a single load or store
@ -762,27 +760,27 @@ bool ARM64LoadStoreOpt::optimizeBlock(MachineBasicBlock &MBB) {
// Just move on to the next instruction.
++MBBI;
break;
case ARM64::STRSui:
case ARM64::STRDui:
case ARM64::STRQui:
case ARM64::STRXui:
case ARM64::STRWui:
case ARM64::LDRSui:
case ARM64::LDRDui:
case ARM64::LDRQui:
case ARM64::LDRXui:
case ARM64::LDRWui:
case AArch64::STRSui:
case AArch64::STRDui:
case AArch64::STRQui:
case AArch64::STRXui:
case AArch64::STRWui:
case AArch64::LDRSui:
case AArch64::LDRDui:
case AArch64::LDRQui:
case AArch64::LDRXui:
case AArch64::LDRWui:
// do the unscaled versions as well
case ARM64::STURSi:
case ARM64::STURDi:
case ARM64::STURQi:
case ARM64::STURWi:
case ARM64::STURXi:
case ARM64::LDURSi:
case ARM64::LDURDi:
case ARM64::LDURQi:
case ARM64::LDURWi:
case ARM64::LDURXi: {
case AArch64::STURSi:
case AArch64::STURDi:
case AArch64::STURQi:
case AArch64::STURWi:
case AArch64::STURXi:
case AArch64::LDURSi:
case AArch64::LDURDi:
case AArch64::LDURQi:
case AArch64::LDURWi:
case AArch64::LDURXi: {
// If this is a volatile load/store, don't mess with it.
if (MI->hasOrderedMemoryRef()) {
++MBBI;
@ -794,7 +792,7 @@ bool ARM64LoadStoreOpt::optimizeBlock(MachineBasicBlock &MBB) {
break;
}
// Check if this load/store has a hint to avoid pair formation.
// MachineMemOperands hints are set by the ARM64StorePairSuppress pass.
// MachineMemOperands hints are set by the AArch64StorePairSuppress pass.
if (TII->isLdStPairSuppressed(MI)) {
++MBBI;
break;
@ -833,27 +831,27 @@ bool ARM64LoadStoreOpt::optimizeBlock(MachineBasicBlock &MBB) {
// Just move on to the next instruction.
++MBBI;
break;
case ARM64::STRSui:
case ARM64::STRDui:
case ARM64::STRQui:
case ARM64::STRXui:
case ARM64::STRWui:
case ARM64::LDRSui:
case ARM64::LDRDui:
case ARM64::LDRQui:
case ARM64::LDRXui:
case ARM64::LDRWui:
case AArch64::STRSui:
case AArch64::STRDui:
case AArch64::STRQui:
case AArch64::STRXui:
case AArch64::STRWui:
case AArch64::LDRSui:
case AArch64::LDRDui:
case AArch64::LDRQui:
case AArch64::LDRXui:
case AArch64::LDRWui:
// do the unscaled versions as well
case ARM64::STURSi:
case ARM64::STURDi:
case ARM64::STURQi:
case ARM64::STURWi:
case ARM64::STURXi:
case ARM64::LDURSi:
case ARM64::LDURDi:
case ARM64::LDURQi:
case ARM64::LDURWi:
case ARM64::LDURXi: {
case AArch64::STURSi:
case AArch64::STURDi:
case AArch64::STURQi:
case AArch64::STURWi:
case AArch64::STURXi:
case AArch64::LDURSi:
case AArch64::LDURDi:
case AArch64::LDURQi:
case AArch64::LDURWi:
case AArch64::LDURXi: {
// Make sure this is a reg+imm (as opposed to an address reloc).
if (!MI->getOperand(2).isImm()) {
++MBBI;
@ -922,9 +920,9 @@ bool ARM64LoadStoreOpt::optimizeBlock(MachineBasicBlock &MBB) {
return Modified;
}
bool ARM64LoadStoreOpt::runOnMachineFunction(MachineFunction &Fn) {
bool AArch64LoadStoreOpt::runOnMachineFunction(MachineFunction &Fn) {
const TargetMachine &TM = Fn.getTarget();
TII = static_cast<const ARM64InstrInfo *>(TM.getInstrInfo());
TII = static_cast<const AArch64InstrInfo *>(TM.getInstrInfo());
TRI = TM.getRegisterInfo();
bool Modified = false;
@ -939,6 +937,6 @@ bool ARM64LoadStoreOpt::runOnMachineFunction(MachineFunction &Fn) {
/// createARMLoadStoreOptimizationPass - returns an instance of the load / store
/// optimization pass.
FunctionPass *llvm::createARM64LoadStoreOptimizationPass() {
return new ARM64LoadStoreOpt();
FunctionPass *llvm::createAArch64LoadStoreOptimizationPass() {
return new AArch64LoadStoreOpt();
}

View File

@ -1,4 +1,4 @@
//===-- ARM64MCInstLower.cpp - Convert ARM64 MachineInstr to an MCInst---===//
//==-- AArch64MCInstLower.cpp - Convert AArch64 MachineInstr to an MCInst --==//
//
// The LLVM Compiler Infrastructure
//
@ -7,14 +7,14 @@
//
//===----------------------------------------------------------------------===//
//
// This file contains code to lower ARM64 MachineInstrs to their corresponding
// This file contains code to lower AArch64 MachineInstrs to their corresponding
// MCInst records.
//
//===----------------------------------------------------------------------===//
#include "ARM64MCInstLower.h"
#include "MCTargetDesc/ARM64MCExpr.h"
#include "Utils/ARM64BaseInfo.h"
#include "AArch64MCInstLower.h"
#include "MCTargetDesc/AArch64MCExpr.h"
#include "Utils/AArch64BaseInfo.h"
#include "llvm/CodeGen/AsmPrinter.h"
#include "llvm/CodeGen/MachineBasicBlock.h"
#include "llvm/CodeGen/MachineInstr.h"
@ -25,46 +25,46 @@
#include "llvm/Target/TargetMachine.h"
using namespace llvm;
ARM64MCInstLower::ARM64MCInstLower(MCContext &ctx, Mangler &mang,
AsmPrinter &printer)
AArch64MCInstLower::AArch64MCInstLower(MCContext &ctx, Mangler &mang,
AsmPrinter &printer)
: Ctx(ctx), Printer(printer), TargetTriple(printer.getTargetTriple()) {}
MCSymbol *
ARM64MCInstLower::GetGlobalAddressSymbol(const MachineOperand &MO) const {
AArch64MCInstLower::GetGlobalAddressSymbol(const MachineOperand &MO) const {
return Printer.getSymbol(MO.getGlobal());
}
MCSymbol *
ARM64MCInstLower::GetExternalSymbolSymbol(const MachineOperand &MO) const {
AArch64MCInstLower::GetExternalSymbolSymbol(const MachineOperand &MO) const {
return Printer.GetExternalSymbolSymbol(MO.getSymbolName());
}
MCOperand ARM64MCInstLower::lowerSymbolOperandDarwin(const MachineOperand &MO,
MCSymbol *Sym) const {
MCOperand AArch64MCInstLower::lowerSymbolOperandDarwin(const MachineOperand &MO,
MCSymbol *Sym) const {
// FIXME: We would like an efficient form for this, so we don't have to do a
// lot of extra uniquing.
MCSymbolRefExpr::VariantKind RefKind = MCSymbolRefExpr::VK_None;
if ((MO.getTargetFlags() & ARM64II::MO_GOT) != 0) {
if ((MO.getTargetFlags() & ARM64II::MO_FRAGMENT) == ARM64II::MO_PAGE)
if ((MO.getTargetFlags() & AArch64II::MO_GOT) != 0) {
if ((MO.getTargetFlags() & AArch64II::MO_FRAGMENT) == AArch64II::MO_PAGE)
RefKind = MCSymbolRefExpr::VK_GOTPAGE;
else if ((MO.getTargetFlags() & ARM64II::MO_FRAGMENT) ==
ARM64II::MO_PAGEOFF)
else if ((MO.getTargetFlags() & AArch64II::MO_FRAGMENT) ==
AArch64II::MO_PAGEOFF)
RefKind = MCSymbolRefExpr::VK_GOTPAGEOFF;
else
assert(0 && "Unexpected target flags with MO_GOT on GV operand");
} else if ((MO.getTargetFlags() & ARM64II::MO_TLS) != 0) {
if ((MO.getTargetFlags() & ARM64II::MO_FRAGMENT) == ARM64II::MO_PAGE)
} else if ((MO.getTargetFlags() & AArch64II::MO_TLS) != 0) {
if ((MO.getTargetFlags() & AArch64II::MO_FRAGMENT) == AArch64II::MO_PAGE)
RefKind = MCSymbolRefExpr::VK_TLVPPAGE;
else if ((MO.getTargetFlags() & ARM64II::MO_FRAGMENT) ==
ARM64II::MO_PAGEOFF)
else if ((MO.getTargetFlags() & AArch64II::MO_FRAGMENT) ==
AArch64II::MO_PAGEOFF)
RefKind = MCSymbolRefExpr::VK_TLVPPAGEOFF;
else
llvm_unreachable("Unexpected target flags with MO_TLS on GV operand");
} else {
if ((MO.getTargetFlags() & ARM64II::MO_FRAGMENT) == ARM64II::MO_PAGE)
if ((MO.getTargetFlags() & AArch64II::MO_FRAGMENT) == AArch64II::MO_PAGE)
RefKind = MCSymbolRefExpr::VK_PAGE;
else if ((MO.getTargetFlags() & ARM64II::MO_FRAGMENT) ==
ARM64II::MO_PAGEOFF)
else if ((MO.getTargetFlags() & AArch64II::MO_FRAGMENT) ==
AArch64II::MO_PAGEOFF)
RefKind = MCSymbolRefExpr::VK_PAGEOFF;
}
const MCExpr *Expr = MCSymbolRefExpr::Create(Sym, RefKind, Ctx);
@ -74,13 +74,13 @@ MCOperand ARM64MCInstLower::lowerSymbolOperandDarwin(const MachineOperand &MO,
return MCOperand::CreateExpr(Expr);
}
MCOperand ARM64MCInstLower::lowerSymbolOperandELF(const MachineOperand &MO,
MCSymbol *Sym) const {
MCOperand AArch64MCInstLower::lowerSymbolOperandELF(const MachineOperand &MO,
MCSymbol *Sym) const {
uint32_t RefFlags = 0;
if (MO.getTargetFlags() & ARM64II::MO_GOT)
RefFlags |= ARM64MCExpr::VK_GOT;
else if (MO.getTargetFlags() & ARM64II::MO_TLS) {
if (MO.getTargetFlags() & AArch64II::MO_GOT)
RefFlags |= AArch64MCExpr::VK_GOT;
else if (MO.getTargetFlags() & AArch64II::MO_TLS) {
TLSModel::Model Model;
if (MO.isGlobal()) {
const GlobalValue *GV = MO.getGlobal();
@ -93,39 +93,40 @@ MCOperand ARM64MCInstLower::lowerSymbolOperandELF(const MachineOperand &MO,
}
switch (Model) {
case TLSModel::InitialExec:
RefFlags |= ARM64MCExpr::VK_GOTTPREL;
RefFlags |= AArch64MCExpr::VK_GOTTPREL;
break;
case TLSModel::LocalExec:
RefFlags |= ARM64MCExpr::VK_TPREL;
RefFlags |= AArch64MCExpr::VK_TPREL;
break;
case TLSModel::LocalDynamic:
RefFlags |= ARM64MCExpr::VK_DTPREL;
RefFlags |= AArch64MCExpr::VK_DTPREL;
break;
case TLSModel::GeneralDynamic:
RefFlags |= ARM64MCExpr::VK_TLSDESC;
RefFlags |= AArch64MCExpr::VK_TLSDESC;
break;
}
} else {
// No modifier means this is a generic reference, classified as absolute for
// the cases where it matters (:abs_g0: etc).
RefFlags |= ARM64MCExpr::VK_ABS;
RefFlags |= AArch64MCExpr::VK_ABS;
}
if ((MO.getTargetFlags() & ARM64II::MO_FRAGMENT) == ARM64II::MO_PAGE)
RefFlags |= ARM64MCExpr::VK_PAGE;
else if ((MO.getTargetFlags() & ARM64II::MO_FRAGMENT) == ARM64II::MO_PAGEOFF)
RefFlags |= ARM64MCExpr::VK_PAGEOFF;
else if ((MO.getTargetFlags() & ARM64II::MO_FRAGMENT) == ARM64II::MO_G3)
RefFlags |= ARM64MCExpr::VK_G3;
else if ((MO.getTargetFlags() & ARM64II::MO_FRAGMENT) == ARM64II::MO_G2)
RefFlags |= ARM64MCExpr::VK_G2;
else if ((MO.getTargetFlags() & ARM64II::MO_FRAGMENT) == ARM64II::MO_G1)
RefFlags |= ARM64MCExpr::VK_G1;
else if ((MO.getTargetFlags() & ARM64II::MO_FRAGMENT) == ARM64II::MO_G0)
RefFlags |= ARM64MCExpr::VK_G0;
if ((MO.getTargetFlags() & AArch64II::MO_FRAGMENT) == AArch64II::MO_PAGE)
RefFlags |= AArch64MCExpr::VK_PAGE;
else if ((MO.getTargetFlags() & AArch64II::MO_FRAGMENT) ==
AArch64II::MO_PAGEOFF)
RefFlags |= AArch64MCExpr::VK_PAGEOFF;
else if ((MO.getTargetFlags() & AArch64II::MO_FRAGMENT) == AArch64II::MO_G3)
RefFlags |= AArch64MCExpr::VK_G3;
else if ((MO.getTargetFlags() & AArch64II::MO_FRAGMENT) == AArch64II::MO_G2)
RefFlags |= AArch64MCExpr::VK_G2;
else if ((MO.getTargetFlags() & AArch64II::MO_FRAGMENT) == AArch64II::MO_G1)
RefFlags |= AArch64MCExpr::VK_G1;
else if ((MO.getTargetFlags() & AArch64II::MO_FRAGMENT) == AArch64II::MO_G0)
RefFlags |= AArch64MCExpr::VK_G0;
if (MO.getTargetFlags() & ARM64II::MO_NC)
RefFlags |= ARM64MCExpr::VK_NC;
if (MO.getTargetFlags() & AArch64II::MO_NC)
RefFlags |= AArch64MCExpr::VK_NC;
const MCExpr *Expr =
MCSymbolRefExpr::Create(Sym, MCSymbolRefExpr::VK_None, Ctx);
@ -133,15 +134,15 @@ MCOperand ARM64MCInstLower::lowerSymbolOperandELF(const MachineOperand &MO,
Expr = MCBinaryExpr::CreateAdd(
Expr, MCConstantExpr::Create(MO.getOffset(), Ctx), Ctx);
ARM64MCExpr::VariantKind RefKind;
RefKind = static_cast<ARM64MCExpr::VariantKind>(RefFlags);
Expr = ARM64MCExpr::Create(Expr, RefKind, Ctx);
AArch64MCExpr::VariantKind RefKind;
RefKind = static_cast<AArch64MCExpr::VariantKind>(RefFlags);
Expr = AArch64MCExpr::Create(Expr, RefKind, Ctx);
return MCOperand::CreateExpr(Expr);
}
MCOperand ARM64MCInstLower::LowerSymbolOperand(const MachineOperand &MO,
MCSymbol *Sym) const {
MCOperand AArch64MCInstLower::LowerSymbolOperand(const MachineOperand &MO,
MCSymbol *Sym) const {
if (TargetTriple.isOSDarwin())
return lowerSymbolOperandDarwin(MO, Sym);
@ -149,8 +150,8 @@ MCOperand ARM64MCInstLower::LowerSymbolOperand(const MachineOperand &MO,
return lowerSymbolOperandELF(MO, Sym);
}
bool ARM64MCInstLower::lowerOperand(const MachineOperand &MO,
MCOperand &MCOp) const {
bool AArch64MCInstLower::lowerOperand(const MachineOperand &MO,
MCOperand &MCOp) const {
switch (MO.getType()) {
default:
assert(0 && "unknown operand type");
@ -190,7 +191,7 @@ bool ARM64MCInstLower::lowerOperand(const MachineOperand &MO,
return true;
}
void ARM64MCInstLower::Lower(const MachineInstr *MI, MCInst &OutMI) const {
void AArch64MCInstLower::Lower(const MachineInstr *MI, MCInst &OutMI) const {
OutMI.setOpcode(MI->getOpcode());
for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) {

View File

@ -1,4 +1,4 @@
//===-- ARM64MCInstLower.h - Lower MachineInstr to MCInst ----------------===//
//===-- AArch64MCInstLower.h - Lower MachineInstr to MCInst ---------------===//
//
// The LLVM Compiler Infrastructure
//
@ -7,8 +7,8 @@
//
//===----------------------------------------------------------------------===//
#ifndef ARM64_MCINSTLOWER_H
#define ARM64_MCINSTLOWER_H
#ifndef AArch64_MCINSTLOWER_H
#define AArch64_MCINSTLOWER_H
#include "llvm/ADT/Triple.h"
#include "llvm/Support/Compiler.h"
@ -25,15 +25,15 @@ class MachineModuleInfoMachO;
class MachineOperand;
class Mangler;
/// ARM64MCInstLower - This class is used to lower an MachineInstr
/// AArch64MCInstLower - This class is used to lower an MachineInstr
/// into an MCInst.
class LLVM_LIBRARY_VISIBILITY ARM64MCInstLower {
class LLVM_LIBRARY_VISIBILITY AArch64MCInstLower {
MCContext &Ctx;
AsmPrinter &Printer;
Triple TargetTriple;
public:
ARM64MCInstLower(MCContext &ctx, Mangler &mang, AsmPrinter &printer);
AArch64MCInstLower(MCContext &ctx, Mangler &mang, AsmPrinter &printer);
bool lowerOperand(const MachineOperand &MO, MCOperand &MCOp) const;
void Lower(const MachineInstr *MI, MCInst &OutMI) const;

View File

@ -1,4 +1,4 @@
//===- ARM64MachineFuctionInfo.h - ARM64 machine function info --*- C++ -*-===//
//=- AArch64MachineFuctionInfo.h - AArch64 machine function info --*- C++ -*-=//
//
// The LLVM Compiler Infrastructure
//
@ -7,12 +7,12 @@
//
//===----------------------------------------------------------------------===//
//
// This file declares ARM64-specific per-machine-function information.
// This file declares AArch64-specific per-machine-function information.
//
//===----------------------------------------------------------------------===//
#ifndef ARM64MACHINEFUNCTIONINFO_H
#define ARM64MACHINEFUNCTIONINFO_H
#ifndef AArch64MACHINEFUNCTIONINFO_H
#define AArch64MACHINEFUNCTIONINFO_H
#include "llvm/ADT/SmallPtrSet.h"
#include "llvm/ADT/SmallVector.h"
@ -21,9 +21,9 @@
namespace llvm {
/// ARM64FunctionInfo - This class is derived from MachineFunctionInfo and
/// contains private ARM64-specific information for each MachineFunction.
class ARM64FunctionInfo : public MachineFunctionInfo {
/// AArch64FunctionInfo - This class is derived from MachineFunctionInfo and
/// contains private AArch64-specific information for each MachineFunction.
class AArch64FunctionInfo : public MachineFunctionInfo {
/// Number of bytes of arguments this function has on the stack. If the callee
/// is expected to restore the argument stack this should be a multiple of 16,
@ -73,12 +73,12 @@ class ARM64FunctionInfo : public MachineFunctionInfo {
unsigned VarArgsFPRSize;
public:
ARM64FunctionInfo()
AArch64FunctionInfo()
: BytesInStackArgArea(0), ArgumentStackToRestore(0), HasStackFrame(false),
NumLocalDynamicTLSAccesses(0), VarArgsStackIndex(0), VarArgsGPRIndex(0),
VarArgsGPRSize(0), VarArgsFPRIndex(0), VarArgsFPRSize(0) {}
explicit ARM64FunctionInfo(MachineFunction &MF)
explicit AArch64FunctionInfo(MachineFunction &MF)
: BytesInStackArgArea(0), ArgumentStackToRestore(0), HasStackFrame(false),
NumLocalDynamicTLSAccesses(0), VarArgsStackIndex(0), VarArgsGPRIndex(0),
VarArgsGPRSize(0), VarArgsFPRIndex(0), VarArgsFPRSize(0) {
@ -160,4 +160,4 @@ private:
};
} // End llvm namespace
#endif // ARM64MACHINEFUNCTIONINFO_H
#endif // AArch64MACHINEFUNCTIONINFO_H

View File

@ -1,4 +1,4 @@
//===-- ARM64PerfectShuffle.h - AdvSIMD Perfect Shuffle Table -------------===//
//===-- AArch64PerfectShuffle.h - AdvSIMD Perfect Shuffle Table -----------===//
//
// The LLVM Compiler Infrastructure
//

View File

@ -1,5 +1,4 @@
//===-- ARM64PromoteConstant.cpp --- Promote constant to global for ARM64 -===//
//=- AArch64PromoteConstant.cpp --- Promote constant to global for AArch64 -==//
//
// The LLVM Compiler Infrastructure
//
@ -8,7 +7,7 @@
//
//===----------------------------------------------------------------------===//
//
// This file implements the ARM64PromoteConstant pass which promotes constants
// This file implements the AArch64PromoteConstant pass which promotes constants
// to global variables when this is likely to be more efficient. Currently only
// types related to constant vector (i.e., constant vector, array of constant
// vectors, constant structure with a constant vector field, etc.) are promoted
@ -21,7 +20,7 @@
// FIXME: This pass may be useful for other targets too.
//===----------------------------------------------------------------------===//
#include "ARM64.h"
#include "AArch64.h"
#include "llvm/ADT/Statistic.h"
#include "llvm/ADT/DenseMap.h"
#include "llvm/ADT/SmallSet.h"
@ -41,17 +40,17 @@
using namespace llvm;
#define DEBUG_TYPE "arm64-promote-const"
#define DEBUG_TYPE "aarch64-promote-const"
// Stress testing mode - disable heuristics.
static cl::opt<bool> Stress("arm64-stress-promote-const", cl::Hidden,
static cl::opt<bool> Stress("aarch64-stress-promote-const", cl::Hidden,
cl::desc("Promote all vector constants"));
STATISTIC(NumPromoted, "Number of promoted constants");
STATISTIC(NumPromotedUses, "Number of promoted constants uses");
//===----------------------------------------------------------------------===//
// ARM64PromoteConstant
// AArch64PromoteConstant
//===----------------------------------------------------------------------===//
namespace {
@ -81,13 +80,13 @@ namespace {
///
/// Therefore the final assembly final has 4 different loads. With this pass
/// enabled, only one load is issued for the constants.
class ARM64PromoteConstant : public ModulePass {
class AArch64PromoteConstant : public ModulePass {
public:
static char ID;
ARM64PromoteConstant() : ModulePass(ID) {}
AArch64PromoteConstant() : ModulePass(ID) {}
const char *getPassName() const override { return "ARM64 Promote Constant"; }
const char *getPassName() const override { return "AArch64 Promote Constant"; }
/// Iterate over the functions and promote the interesting constants into
/// global variables with module scope.
@ -202,20 +201,20 @@ private:
};
} // end anonymous namespace
char ARM64PromoteConstant::ID = 0;
char AArch64PromoteConstant::ID = 0;
namespace llvm {
void initializeARM64PromoteConstantPass(PassRegistry &);
void initializeAArch64PromoteConstantPass(PassRegistry &);
}
INITIALIZE_PASS_BEGIN(ARM64PromoteConstant, "arm64-promote-const",
"ARM64 Promote Constant Pass", false, false)
INITIALIZE_PASS_BEGIN(AArch64PromoteConstant, "aarch64-promote-const",
"AArch64 Promote Constant Pass", false, false)
INITIALIZE_PASS_DEPENDENCY(DominatorTreeWrapperPass)
INITIALIZE_PASS_END(ARM64PromoteConstant, "arm64-promote-const",
"ARM64 Promote Constant Pass", false, false)
INITIALIZE_PASS_END(AArch64PromoteConstant, "aarch64-promote-const",
"AArch64 Promote Constant Pass", false, false)
ModulePass *llvm::createARM64PromoteConstantPass() {
return new ARM64PromoteConstant();
ModulePass *llvm::createAArch64PromoteConstantPass() {
return new AArch64PromoteConstant();
}
/// Check if the given type uses a vector type.
@ -330,7 +329,7 @@ static bool shouldConvert(const Constant *Cst) {
}
Instruction *
ARM64PromoteConstant::findInsertionPoint(Value::user_iterator &Use) {
AArch64PromoteConstant::findInsertionPoint(Value::user_iterator &Use) {
// If this user is a phi, the insertion point is in the related
// incoming basic block.
PHINode *PhiInst = dyn_cast<PHINode>(*Use);
@ -344,9 +343,9 @@ ARM64PromoteConstant::findInsertionPoint(Value::user_iterator &Use) {
return InsertionPoint;
}
bool ARM64PromoteConstant::isDominated(Instruction *NewPt,
Value::user_iterator &UseIt,
InsertionPoints &InsertPts) {
bool AArch64PromoteConstant::isDominated(Instruction *NewPt,
Value::user_iterator &UseIt,
InsertionPoints &InsertPts) {
DominatorTree &DT = getAnalysis<DominatorTreeWrapperPass>(
*NewPt->getParent()->getParent()).getDomTree();
@ -371,9 +370,9 @@ bool ARM64PromoteConstant::isDominated(Instruction *NewPt,
return false;
}
bool ARM64PromoteConstant::tryAndMerge(Instruction *NewPt,
Value::user_iterator &UseIt,
InsertionPoints &InsertPts) {
bool AArch64PromoteConstant::tryAndMerge(Instruction *NewPt,
Value::user_iterator &UseIt,
InsertionPoints &InsertPts) {
DominatorTree &DT = getAnalysis<DominatorTreeWrapperPass>(
*NewPt->getParent()->getParent()).getDomTree();
BasicBlock *NewBB = NewPt->getParent();
@ -422,7 +421,7 @@ bool ARM64PromoteConstant::tryAndMerge(Instruction *NewPt,
return false;
}
void ARM64PromoteConstant::computeInsertionPoints(
void AArch64PromoteConstant::computeInsertionPoints(
Constant *Val, InsertionPointsPerFunc &InsPtsPerFunc) {
DEBUG(dbgs() << "** Compute insertion points **\n");
for (Value::user_iterator UseIt = Val->user_begin(),
@ -464,9 +463,8 @@ void ARM64PromoteConstant::computeInsertionPoints(
}
}
bool
ARM64PromoteConstant::insertDefinitions(Constant *Cst,
InsertionPointsPerFunc &InsPtsPerFunc) {
bool AArch64PromoteConstant::insertDefinitions(
Constant *Cst, InsertionPointsPerFunc &InsPtsPerFunc) {
// We will create one global variable per Module.
DenseMap<Module *, GlobalVariable *> ModuleToMergedGV;
bool HasChanged = false;
@ -533,13 +531,13 @@ ARM64PromoteConstant::insertDefinitions(Constant *Cst,
return HasChanged;
}
bool ARM64PromoteConstant::computeAndInsertDefinitions(Constant *Val) {
bool AArch64PromoteConstant::computeAndInsertDefinitions(Constant *Val) {
InsertionPointsPerFunc InsertPtsPerFunc;
computeInsertionPoints(Val, InsertPtsPerFunc);
return insertDefinitions(Val, InsertPtsPerFunc);
}
bool ARM64PromoteConstant::promoteConstant(Constant *Cst) {
bool AArch64PromoteConstant::promoteConstant(Constant *Cst) {
assert(Cst && "Given variable is not a valid constant.");
if (!shouldConvert(Cst))
@ -553,7 +551,7 @@ bool ARM64PromoteConstant::promoteConstant(Constant *Cst) {
return computeAndInsertDefinitions(Cst);
}
bool ARM64PromoteConstant::runOnFunction(Function &F) {
bool AArch64PromoteConstant::runOnFunction(Function &F) {
// Look for instructions using constant vector. Promote that constant to a
// global variable. Create as few loads of this variable as possible and
// update the uses accordingly.

View File

@ -1,4 +1,4 @@
//===- ARM64RegisterInfo.cpp - ARM64 Register Information -----------------===//
//===- AArch64RegisterInfo.cpp - AArch64 Register Information -------------===//
//
// The LLVM Compiler Infrastructure
//
@ -7,15 +7,16 @@
//
//===----------------------------------------------------------------------===//
//
// This file contains the ARM64 implementation of the TargetRegisterInfo class.
// This file contains the AArch64 implementation of the TargetRegisterInfo
// class.
//
//===----------------------------------------------------------------------===//
#include "ARM64RegisterInfo.h"
#include "ARM64FrameLowering.h"
#include "ARM64InstrInfo.h"
#include "ARM64Subtarget.h"
#include "MCTargetDesc/ARM64AddressingModes.h"
#include "AArch64RegisterInfo.h"
#include "AArch64FrameLowering.h"
#include "AArch64InstrInfo.h"
#include "AArch64Subtarget.h"
#include "MCTargetDesc/AArch64AddressingModes.h"
#include "llvm/ADT/BitVector.h"
#include "llvm/CodeGen/MachineFrameInfo.h"
#include "llvm/CodeGen/MachineInstrBuilder.h"
@ -30,39 +31,39 @@
using namespace llvm;
#define GET_REGINFO_TARGET_DESC
#include "ARM64GenRegisterInfo.inc"
#include "AArch64GenRegisterInfo.inc"
ARM64RegisterInfo::ARM64RegisterInfo(const ARM64InstrInfo *tii,
const ARM64Subtarget *sti)
: ARM64GenRegisterInfo(ARM64::LR), TII(tii), STI(sti) {}
AArch64RegisterInfo::AArch64RegisterInfo(const AArch64InstrInfo *tii,
const AArch64Subtarget *sti)
: AArch64GenRegisterInfo(AArch64::LR), TII(tii), STI(sti) {}
const MCPhysReg *
ARM64RegisterInfo::getCalleeSavedRegs(const MachineFunction *MF) const {
AArch64RegisterInfo::getCalleeSavedRegs(const MachineFunction *MF) const {
assert(MF && "Invalid MachineFunction pointer.");
if (MF->getFunction()->getCallingConv() == CallingConv::AnyReg)
return CSR_ARM64_AllRegs_SaveList;
return CSR_AArch64_AllRegs_SaveList;
else
return CSR_ARM64_AAPCS_SaveList;
return CSR_AArch64_AAPCS_SaveList;
}
const uint32_t *
ARM64RegisterInfo::getCallPreservedMask(CallingConv::ID CC) const {
AArch64RegisterInfo::getCallPreservedMask(CallingConv::ID CC) const {
if (CC == CallingConv::AnyReg)
return CSR_ARM64_AllRegs_RegMask;
return CSR_AArch64_AllRegs_RegMask;
else
return CSR_ARM64_AAPCS_RegMask;
return CSR_AArch64_AAPCS_RegMask;
}
const uint32_t *ARM64RegisterInfo::getTLSCallPreservedMask() const {
const uint32_t *AArch64RegisterInfo::getTLSCallPreservedMask() const {
if (STI->isTargetDarwin())
return CSR_ARM64_TLS_Darwin_RegMask;
return CSR_AArch64_TLS_Darwin_RegMask;
assert(STI->isTargetELF() && "only expect Darwin or ELF TLS");
return CSR_ARM64_TLS_ELF_RegMask;
return CSR_AArch64_TLS_ELF_RegMask;
}
const uint32_t *
ARM64RegisterInfo::getThisReturnPreservedMask(CallingConv::ID) const {
AArch64RegisterInfo::getThisReturnPreservedMask(CallingConv::ID) const {
// This should return a register mask that is the same as that returned by
// getCallPreservedMask but that additionally preserves the register used for
// the first i64 argument (which must also be the register used to return a
@ -70,57 +71,58 @@ ARM64RegisterInfo::getThisReturnPreservedMask(CallingConv::ID) const {
//
// In case that the calling convention does not use the same register for
// both, the function should return NULL (does not currently apply)
return CSR_ARM64_AAPCS_ThisReturn_RegMask;
return CSR_AArch64_AAPCS_ThisReturn_RegMask;
}
BitVector ARM64RegisterInfo::getReservedRegs(const MachineFunction &MF) const {
BitVector
AArch64RegisterInfo::getReservedRegs(const MachineFunction &MF) const {
const TargetFrameLowering *TFI = MF.getTarget().getFrameLowering();
// FIXME: avoid re-calculating this every time.
BitVector Reserved(getNumRegs());
Reserved.set(ARM64::SP);
Reserved.set(ARM64::XZR);
Reserved.set(ARM64::WSP);
Reserved.set(ARM64::WZR);
Reserved.set(AArch64::SP);
Reserved.set(AArch64::XZR);
Reserved.set(AArch64::WSP);
Reserved.set(AArch64::WZR);
if (TFI->hasFP(MF) || STI->isTargetDarwin()) {
Reserved.set(ARM64::FP);
Reserved.set(ARM64::W29);
Reserved.set(AArch64::FP);
Reserved.set(AArch64::W29);
}
if (STI->isTargetDarwin()) {
Reserved.set(ARM64::X18); // Platform register
Reserved.set(ARM64::W18);
Reserved.set(AArch64::X18); // Platform register
Reserved.set(AArch64::W18);
}
if (hasBasePointer(MF)) {
Reserved.set(ARM64::X19);
Reserved.set(ARM64::W19);
Reserved.set(AArch64::X19);
Reserved.set(AArch64::W19);
}
return Reserved;
}
bool ARM64RegisterInfo::isReservedReg(const MachineFunction &MF,
bool AArch64RegisterInfo::isReservedReg(const MachineFunction &MF,
unsigned Reg) const {
const TargetFrameLowering *TFI = MF.getTarget().getFrameLowering();
switch (Reg) {
default:
break;
case ARM64::SP:
case ARM64::XZR:
case ARM64::WSP:
case ARM64::WZR:
case AArch64::SP:
case AArch64::XZR:
case AArch64::WSP:
case AArch64::WZR:
return true;
case ARM64::X18:
case ARM64::W18:
case AArch64::X18:
case AArch64::W18:
return STI->isTargetDarwin();
case ARM64::FP:
case ARM64::W29:
case AArch64::FP:
case AArch64::W29:
return TFI->hasFP(MF) || STI->isTargetDarwin();
case ARM64::W19:
case ARM64::X19:
case AArch64::W19:
case AArch64::X19:
return hasBasePointer(MF);
}
@ -128,21 +130,21 @@ bool ARM64RegisterInfo::isReservedReg(const MachineFunction &MF,
}
const TargetRegisterClass *
ARM64RegisterInfo::getPointerRegClass(const MachineFunction &MF,
AArch64RegisterInfo::getPointerRegClass(const MachineFunction &MF,
unsigned Kind) const {
return &ARM64::GPR64RegClass;
return &AArch64::GPR64RegClass;
}
const TargetRegisterClass *
ARM64RegisterInfo::getCrossCopyRegClass(const TargetRegisterClass *RC) const {
if (RC == &ARM64::CCRRegClass)
AArch64RegisterInfo::getCrossCopyRegClass(const TargetRegisterClass *RC) const {
if (RC == &AArch64::CCRRegClass)
return nullptr; // Can't copy NZCV.
return RC;
}
unsigned ARM64RegisterInfo::getBaseRegister() const { return ARM64::X19; }
unsigned AArch64RegisterInfo::getBaseRegister() const { return AArch64::X19; }
bool ARM64RegisterInfo::hasBasePointer(const MachineFunction &MF) const {
bool AArch64RegisterInfo::hasBasePointer(const MachineFunction &MF) const {
const MachineFrameInfo *MFI = MF.getFrameInfo();
// In the presence of variable sized objects, if the fixed stack size is
@ -165,37 +167,39 @@ bool ARM64RegisterInfo::hasBasePointer(const MachineFunction &MF) const {
return false;
}
unsigned ARM64RegisterInfo::getFrameRegister(const MachineFunction &MF) const {
unsigned
AArch64RegisterInfo::getFrameRegister(const MachineFunction &MF) const {
const TargetFrameLowering *TFI = MF.getTarget().getFrameLowering();
return TFI->hasFP(MF) ? ARM64::FP : ARM64::SP;
return TFI->hasFP(MF) ? AArch64::FP : AArch64::SP;
}
bool
ARM64RegisterInfo::requiresRegisterScavenging(const MachineFunction &MF) const {
bool AArch64RegisterInfo::requiresRegisterScavenging(
const MachineFunction &MF) const {
return true;
}
bool ARM64RegisterInfo::requiresVirtualBaseRegisters(const MachineFunction &MF)
const {
bool AArch64RegisterInfo::requiresVirtualBaseRegisters(
const MachineFunction &MF) const {
return true;
}
bool
ARM64RegisterInfo::useFPForScavengingIndex(const MachineFunction &MF) const {
AArch64RegisterInfo::useFPForScavengingIndex(const MachineFunction &MF) const {
const MachineFrameInfo *MFI = MF.getFrameInfo();
// ARM64FrameLowering::resolveFrameIndexReference() can always fall back
// AArch64FrameLowering::resolveFrameIndexReference() can always fall back
// to the stack pointer, so only put the emergency spill slot next to the
// FP when there's no better way to access it (SP or base pointer).
return MFI->hasVarSizedObjects() && !hasBasePointer(MF);
}
bool ARM64RegisterInfo::requiresFrameIndexScavenging(const MachineFunction &MF)
const {
bool AArch64RegisterInfo::requiresFrameIndexScavenging(
const MachineFunction &MF) const {
return true;
}
bool ARM64RegisterInfo::cannotEliminateFrame(const MachineFunction &MF) const {
bool
AArch64RegisterInfo::cannotEliminateFrame(const MachineFunction &MF) const {
const MachineFrameInfo *MFI = MF.getFrameInfo();
// Only consider eliminating leaf frames.
if (MFI->hasCalls() || (MF.getTarget().Options.DisableFramePointerElim(MF) &&
@ -208,8 +212,8 @@ bool ARM64RegisterInfo::cannotEliminateFrame(const MachineFunction &MF) const {
/// reference would be better served by a base register other than FP
/// or SP. Used by LocalStackFrameAllocation to determine which frame index
/// references it should create new base registers for.
bool ARM64RegisterInfo::needsFrameBaseReg(MachineInstr *MI,
int64_t Offset) const {
bool AArch64RegisterInfo::needsFrameBaseReg(MachineInstr *MI,
int64_t Offset) const {
for (unsigned i = 0; !MI->getOperand(i).isFI(); ++i)
assert(i < MI->getNumOperands() &&
"Instr doesn't have FrameIndex operand!");
@ -268,30 +272,30 @@ bool ARM64RegisterInfo::needsFrameBaseReg(MachineInstr *MI,
return true;
}
bool ARM64RegisterInfo::isFrameOffsetLegal(const MachineInstr *MI,
int64_t Offset) const {
bool AArch64RegisterInfo::isFrameOffsetLegal(const MachineInstr *MI,
int64_t Offset) const {
assert(Offset <= INT_MAX && "Offset too big to fit in int.");
assert(MI && "Unable to get the legal offset for nil instruction.");
int SaveOffset = Offset;
return isARM64FrameOffsetLegal(*MI, SaveOffset) & ARM64FrameOffsetIsLegal;
return isAArch64FrameOffsetLegal(*MI, SaveOffset) & AArch64FrameOffsetIsLegal;
}
/// Insert defining instruction(s) for BaseReg to be a pointer to FrameIdx
/// at the beginning of the basic block.
void ARM64RegisterInfo::materializeFrameBaseRegister(MachineBasicBlock *MBB,
unsigned BaseReg,
int FrameIdx,
int64_t Offset) const {
void AArch64RegisterInfo::materializeFrameBaseRegister(MachineBasicBlock *MBB,
unsigned BaseReg,
int FrameIdx,
int64_t Offset) const {
MachineBasicBlock::iterator Ins = MBB->begin();
DebugLoc DL; // Defaults to "unknown"
if (Ins != MBB->end())
DL = Ins->getDebugLoc();
const MCInstrDesc &MCID = TII->get(ARM64::ADDXri);
const MCInstrDesc &MCID = TII->get(AArch64::ADDXri);
MachineRegisterInfo &MRI = MBB->getParent()->getRegInfo();
const MachineFunction &MF = *MBB->getParent();
MRI.constrainRegClass(BaseReg, TII->getRegClass(MCID, 0, this, MF));
unsigned Shifter = ARM64_AM::getShifterImm(ARM64_AM::LSL, 0);
unsigned Shifter = AArch64_AM::getShifterImm(AArch64_AM::LSL, 0);
BuildMI(*MBB, Ins, DL, MCID, BaseReg)
.addFrameIndex(FrameIdx)
@ -299,8 +303,8 @@ void ARM64RegisterInfo::materializeFrameBaseRegister(MachineBasicBlock *MBB,
.addImm(Shifter);
}
void ARM64RegisterInfo::resolveFrameIndex(MachineInstr &MI, unsigned BaseReg,
int64_t Offset) const {
void AArch64RegisterInfo::resolveFrameIndex(MachineInstr &MI, unsigned BaseReg,
int64_t Offset) const {
int Off = Offset; // ARM doesn't need the general 64-bit offsets
unsigned i = 0;
@ -308,20 +312,20 @@ void ARM64RegisterInfo::resolveFrameIndex(MachineInstr &MI, unsigned BaseReg,
++i;
assert(i < MI.getNumOperands() && "Instr doesn't have FrameIndex operand!");
}
bool Done = rewriteARM64FrameIndex(MI, i, BaseReg, Off, TII);
bool Done = rewriteAArch64FrameIndex(MI, i, BaseReg, Off, TII);
assert(Done && "Unable to resolve frame index!");
(void)Done;
}
void ARM64RegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II,
int SPAdj, unsigned FIOperandNum,
RegScavenger *RS) const {
void AArch64RegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II,
int SPAdj, unsigned FIOperandNum,
RegScavenger *RS) const {
assert(SPAdj == 0 && "Unexpected");
MachineInstr &MI = *II;
MachineBasicBlock &MBB = *MI.getParent();
MachineFunction &MF = *MBB.getParent();
const ARM64FrameLowering *TFI = static_cast<const ARM64FrameLowering *>(
const AArch64FrameLowering *TFI = static_cast<const AArch64FrameLowering *>(
MF.getTarget().getFrameLowering());
int FrameIndex = MI.getOperand(FIOperandNum).getIndex();
@ -341,7 +345,7 @@ void ARM64RegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II,
// Modify MI as necessary to handle as much of 'Offset' as possible
Offset = TFI->resolveFrameIndexReference(MF, FrameIndex, FrameReg);
if (rewriteARM64FrameIndex(MI, FIOperandNum, FrameReg, Offset, TII))
if (rewriteAArch64FrameIndex(MI, FIOperandNum, FrameReg, Offset, TII))
return;
assert((!RS || !RS->isScavengingFrameIndex(FrameIndex)) &&
@ -351,48 +355,48 @@ void ARM64RegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II,
// as much as possible above. Handle the rest, providing a register that is
// SP+LargeImm.
unsigned ScratchReg =
MF.getRegInfo().createVirtualRegister(&ARM64::GPR64RegClass);
MF.getRegInfo().createVirtualRegister(&AArch64::GPR64RegClass);
emitFrameOffset(MBB, II, MI.getDebugLoc(), ScratchReg, FrameReg, Offset, TII);
MI.getOperand(FIOperandNum).ChangeToRegister(ScratchReg, false, false, true);
}
namespace llvm {
unsigned ARM64RegisterInfo::getRegPressureLimit(const TargetRegisterClass *RC,
MachineFunction &MF) const {
unsigned AArch64RegisterInfo::getRegPressureLimit(const TargetRegisterClass *RC,
MachineFunction &MF) const {
const TargetFrameLowering *TFI = MF.getTarget().getFrameLowering();
switch (RC->getID()) {
default:
return 0;
case ARM64::GPR32RegClassID:
case ARM64::GPR32spRegClassID:
case ARM64::GPR32allRegClassID:
case ARM64::GPR64spRegClassID:
case ARM64::GPR64allRegClassID:
case ARM64::GPR64RegClassID:
case ARM64::GPR32commonRegClassID:
case ARM64::GPR64commonRegClassID:
case AArch64::GPR32RegClassID:
case AArch64::GPR32spRegClassID:
case AArch64::GPR32allRegClassID:
case AArch64::GPR64spRegClassID:
case AArch64::GPR64allRegClassID:
case AArch64::GPR64RegClassID:
case AArch64::GPR32commonRegClassID:
case AArch64::GPR64commonRegClassID:
return 32 - 1 // XZR/SP
- (TFI->hasFP(MF) || STI->isTargetDarwin()) // FP
- STI->isTargetDarwin() // X18 reserved as platform register
- hasBasePointer(MF); // X19
case ARM64::FPR8RegClassID:
case ARM64::FPR16RegClassID:
case ARM64::FPR32RegClassID:
case ARM64::FPR64RegClassID:
case ARM64::FPR128RegClassID:
case AArch64::FPR8RegClassID:
case AArch64::FPR16RegClassID:
case AArch64::FPR32RegClassID:
case AArch64::FPR64RegClassID:
case AArch64::FPR128RegClassID:
return 32;
case ARM64::DDRegClassID:
case ARM64::DDDRegClassID:
case ARM64::DDDDRegClassID:
case ARM64::QQRegClassID:
case ARM64::QQQRegClassID:
case ARM64::QQQQRegClassID:
case AArch64::DDRegClassID:
case AArch64::DDDRegClassID:
case AArch64::DDDDRegClassID:
case AArch64::QQRegClassID:
case AArch64::QQQRegClassID:
case AArch64::QQQQRegClassID:
return 32;
case ARM64::FPR128_loRegClassID:
case AArch64::FPR128_loRegClassID:
return 16;
}
}

View File

@ -1,4 +1,4 @@
//===- ARM64RegisterInfo.h - ARM64 Register Information Impl ----*- C++ -*-===//
//==- AArch64RegisterInfo.h - AArch64 Register Information Impl --*- C++ -*-==//
//
// The LLVM Compiler Infrastructure
//
@ -7,31 +7,31 @@
//
//===----------------------------------------------------------------------===//
//
// This file contains the ARM64 implementation of the MRegisterInfo class.
// This file contains the AArch64 implementation of the MRegisterInfo class.
//
//===----------------------------------------------------------------------===//
#ifndef LLVM_TARGET_ARM64REGISTERINFO_H
#define LLVM_TARGET_ARM64REGISTERINFO_H
#ifndef LLVM_TARGET_AArch64REGISTERINFO_H
#define LLVM_TARGET_AArch64REGISTERINFO_H
#define GET_REGINFO_HEADER
#include "ARM64GenRegisterInfo.inc"
#include "AArch64GenRegisterInfo.inc"
namespace llvm {
class ARM64InstrInfo;
class ARM64Subtarget;
class AArch64InstrInfo;
class AArch64Subtarget;
class MachineFunction;
class RegScavenger;
class TargetRegisterClass;
struct ARM64RegisterInfo : public ARM64GenRegisterInfo {
struct AArch64RegisterInfo : public AArch64GenRegisterInfo {
private:
const ARM64InstrInfo *TII;
const ARM64Subtarget *STI;
const AArch64InstrInfo *TII;
const AArch64Subtarget *STI;
public:
ARM64RegisterInfo(const ARM64InstrInfo *tii, const ARM64Subtarget *sti);
AArch64RegisterInfo(const AArch64InstrInfo *tii, const AArch64Subtarget *sti);
bool isReservedReg(const MachineFunction &MF, unsigned Reg) const;
@ -98,4 +98,4 @@ public:
} // end namespace llvm
#endif // LLVM_TARGET_ARM64REGISTERINFO_H
#endif // LLVM_TARGET_AArch64REGISTERINFO_H

View File

@ -0,0 +1,593 @@
//=- AArch64RegisterInfo.td - Describe the AArch64 Regisers --*- tablegen -*-=//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
//
//===----------------------------------------------------------------------===//
class AArch64Reg<bits<16> enc, string n, list<Register> subregs = [],
list<string> altNames = []>
: Register<n, altNames> {
let HWEncoding = enc;
let Namespace = "AArch64";
let SubRegs = subregs;
}
let Namespace = "AArch64" in {
def sub_32 : SubRegIndex<32>;
def bsub : SubRegIndex<8>;
def hsub : SubRegIndex<16>;
def ssub : SubRegIndex<32>;
def dsub : SubRegIndex<32>;
def qhisub : SubRegIndex<64>;
def qsub : SubRegIndex<64>;
// Note: Code depends on these having consecutive numbers
def dsub0 : SubRegIndex<64>;
def dsub1 : SubRegIndex<64>;
def dsub2 : SubRegIndex<64>;
def dsub3 : SubRegIndex<64>;
// Note: Code depends on these having consecutive numbers
def qsub0 : SubRegIndex<128>;
def qsub1 : SubRegIndex<128>;
def qsub2 : SubRegIndex<128>;
def qsub3 : SubRegIndex<128>;
}
let Namespace = "AArch64" in {
def vreg : RegAltNameIndex;
def vlist1 : RegAltNameIndex;
}
//===----------------------------------------------------------------------===//
// Registers
//===----------------------------------------------------------------------===//
def W0 : AArch64Reg<0, "w0" >, DwarfRegNum<[0]>;
def W1 : AArch64Reg<1, "w1" >, DwarfRegNum<[1]>;
def W2 : AArch64Reg<2, "w2" >, DwarfRegNum<[2]>;
def W3 : AArch64Reg<3, "w3" >, DwarfRegNum<[3]>;
def W4 : AArch64Reg<4, "w4" >, DwarfRegNum<[4]>;
def W5 : AArch64Reg<5, "w5" >, DwarfRegNum<[5]>;
def W6 : AArch64Reg<6, "w6" >, DwarfRegNum<[6]>;
def W7 : AArch64Reg<7, "w7" >, DwarfRegNum<[7]>;
def W8 : AArch64Reg<8, "w8" >, DwarfRegNum<[8]>;
def W9 : AArch64Reg<9, "w9" >, DwarfRegNum<[9]>;
def W10 : AArch64Reg<10, "w10">, DwarfRegNum<[10]>;
def W11 : AArch64Reg<11, "w11">, DwarfRegNum<[11]>;
def W12 : AArch64Reg<12, "w12">, DwarfRegNum<[12]>;
def W13 : AArch64Reg<13, "w13">, DwarfRegNum<[13]>;
def W14 : AArch64Reg<14, "w14">, DwarfRegNum<[14]>;
def W15 : AArch64Reg<15, "w15">, DwarfRegNum<[15]>;
def W16 : AArch64Reg<16, "w16">, DwarfRegNum<[16]>;
def W17 : AArch64Reg<17, "w17">, DwarfRegNum<[17]>;
def W18 : AArch64Reg<18, "w18">, DwarfRegNum<[18]>;
def W19 : AArch64Reg<19, "w19">, DwarfRegNum<[19]>;
def W20 : AArch64Reg<20, "w20">, DwarfRegNum<[20]>;
def W21 : AArch64Reg<21, "w21">, DwarfRegNum<[21]>;
def W22 : AArch64Reg<22, "w22">, DwarfRegNum<[22]>;
def W23 : AArch64Reg<23, "w23">, DwarfRegNum<[23]>;
def W24 : AArch64Reg<24, "w24">, DwarfRegNum<[24]>;
def W25 : AArch64Reg<25, "w25">, DwarfRegNum<[25]>;
def W26 : AArch64Reg<26, "w26">, DwarfRegNum<[26]>;
def W27 : AArch64Reg<27, "w27">, DwarfRegNum<[27]>;
def W28 : AArch64Reg<28, "w28">, DwarfRegNum<[28]>;
def W29 : AArch64Reg<29, "w29">, DwarfRegNum<[29]>;
def W30 : AArch64Reg<30, "w30">, DwarfRegNum<[30]>;
def WSP : AArch64Reg<31, "wsp">, DwarfRegNum<[31]>;
def WZR : AArch64Reg<31, "wzr">, DwarfRegAlias<WSP>;
let SubRegIndices = [sub_32] in {
def X0 : AArch64Reg<0, "x0", [W0]>, DwarfRegAlias<W0>;
def X1 : AArch64Reg<1, "x1", [W1]>, DwarfRegAlias<W1>;
def X2 : AArch64Reg<2, "x2", [W2]>, DwarfRegAlias<W2>;
def X3 : AArch64Reg<3, "x3", [W3]>, DwarfRegAlias<W3>;
def X4 : AArch64Reg<4, "x4", [W4]>, DwarfRegAlias<W4>;
def X5 : AArch64Reg<5, "x5", [W5]>, DwarfRegAlias<W5>;
def X6 : AArch64Reg<6, "x6", [W6]>, DwarfRegAlias<W6>;
def X7 : AArch64Reg<7, "x7", [W7]>, DwarfRegAlias<W7>;
def X8 : AArch64Reg<8, "x8", [W8]>, DwarfRegAlias<W8>;
def X9 : AArch64Reg<9, "x9", [W9]>, DwarfRegAlias<W9>;
def X10 : AArch64Reg<10, "x10", [W10]>, DwarfRegAlias<W10>;
def X11 : AArch64Reg<11, "x11", [W11]>, DwarfRegAlias<W11>;
def X12 : AArch64Reg<12, "x12", [W12]>, DwarfRegAlias<W12>;
def X13 : AArch64Reg<13, "x13", [W13]>, DwarfRegAlias<W13>;
def X14 : AArch64Reg<14, "x14", [W14]>, DwarfRegAlias<W14>;
def X15 : AArch64Reg<15, "x15", [W15]>, DwarfRegAlias<W15>;
def X16 : AArch64Reg<16, "x16", [W16]>, DwarfRegAlias<W16>;
def X17 : AArch64Reg<17, "x17", [W17]>, DwarfRegAlias<W17>;
def X18 : AArch64Reg<18, "x18", [W18]>, DwarfRegAlias<W18>;
def X19 : AArch64Reg<19, "x19", [W19]>, DwarfRegAlias<W19>;
def X20 : AArch64Reg<20, "x20", [W20]>, DwarfRegAlias<W20>;
def X21 : AArch64Reg<21, "x21", [W21]>, DwarfRegAlias<W21>;
def X22 : AArch64Reg<22, "x22", [W22]>, DwarfRegAlias<W22>;
def X23 : AArch64Reg<23, "x23", [W23]>, DwarfRegAlias<W23>;
def X24 : AArch64Reg<24, "x24", [W24]>, DwarfRegAlias<W24>;
def X25 : AArch64Reg<25, "x25", [W25]>, DwarfRegAlias<W25>;
def X26 : AArch64Reg<26, "x26", [W26]>, DwarfRegAlias<W26>;
def X27 : AArch64Reg<27, "x27", [W27]>, DwarfRegAlias<W27>;
def X28 : AArch64Reg<28, "x28", [W28]>, DwarfRegAlias<W28>;
def FP : AArch64Reg<29, "x29", [W29]>, DwarfRegAlias<W29>;
def LR : AArch64Reg<30, "x30", [W30]>, DwarfRegAlias<W30>;
def SP : AArch64Reg<31, "sp", [WSP]>, DwarfRegAlias<WSP>;
def XZR : AArch64Reg<31, "xzr", [WZR]>, DwarfRegAlias<WSP>;
}
// Condition code register.
def NZCV : AArch64Reg<0, "nzcv">;
// GPR register classes with the intersections of GPR32/GPR32sp and
// GPR64/GPR64sp for use by the coalescer.
def GPR32common : RegisterClass<"AArch64", [i32], 32, (sequence "W%u", 0, 30)> {
let AltOrders = [(rotl GPR32common, 8)];
let AltOrderSelect = [{ return 1; }];
}
def GPR64common : RegisterClass<"AArch64", [i64], 64,
(add (sequence "X%u", 0, 28), FP, LR)> {
let AltOrders = [(rotl GPR64common, 8)];
let AltOrderSelect = [{ return 1; }];
}
// GPR register classes which exclude SP/WSP.
def GPR32 : RegisterClass<"AArch64", [i32], 32, (add GPR32common, WZR)> {
let AltOrders = [(rotl GPR32, 8)];
let AltOrderSelect = [{ return 1; }];
}
def GPR64 : RegisterClass<"AArch64", [i64], 64, (add GPR64common, XZR)> {
let AltOrders = [(rotl GPR64, 8)];
let AltOrderSelect = [{ return 1; }];
}
// GPR register classes which include SP/WSP.
def GPR32sp : RegisterClass<"AArch64", [i32], 32, (add GPR32common, WSP)> {
let AltOrders = [(rotl GPR32sp, 8)];
let AltOrderSelect = [{ return 1; }];
}
def GPR64sp : RegisterClass<"AArch64", [i64], 64, (add GPR64common, SP)> {
let AltOrders = [(rotl GPR64sp, 8)];
let AltOrderSelect = [{ return 1; }];
}
def GPR32sponly : RegisterClass<"AArch64", [i32], 32, (add WSP)>;
def GPR64sponly : RegisterClass<"AArch64", [i64], 64, (add SP)>;
def GPR64spPlus0Operand : AsmOperandClass {
let Name = "GPR64sp0";
let RenderMethod = "addRegOperands";
let ParserMethod = "tryParseGPR64sp0Operand";
}
def GPR64sp0 : RegisterOperand<GPR64sp> {
let ParserMatchClass = GPR64spPlus0Operand;
}
// GPR register classes which include WZR/XZR AND SP/WSP. This is not a
// constraint used by any instructions, it is used as a common super-class.
def GPR32all : RegisterClass<"AArch64", [i32], 32, (add GPR32common, WZR, WSP)>;
def GPR64all : RegisterClass<"AArch64", [i64], 64, (add GPR64common, XZR, SP)>;
// For tail calls, we can't use callee-saved registers, as they are restored
// to the saved value before the tail call, which would clobber a call address.
// This is for indirect tail calls to store the address of the destination.
def tcGPR64 : RegisterClass<"AArch64", [i64], 64, (sub GPR64common, X19, X20, X21,
X22, X23, X24, X25, X26,
X27, X28)>;
// GPR register classes for post increment amount of vector load/store that
// has alternate printing when Rm=31 and prints a constant immediate value
// equal to the total number of bytes transferred.
// FIXME: TableGen *should* be able to do these itself now. There appears to be
// a bug in counting how many operands a Post-indexed MCInst should have which
// means the aliases don't trigger.
def GPR64pi1 : RegisterOperand<GPR64, "printPostIncOperand<1>">;
def GPR64pi2 : RegisterOperand<GPR64, "printPostIncOperand<2>">;
def GPR64pi3 : RegisterOperand<GPR64, "printPostIncOperand<3>">;
def GPR64pi4 : RegisterOperand<GPR64, "printPostIncOperand<4>">;
def GPR64pi6 : RegisterOperand<GPR64, "printPostIncOperand<6>">;
def GPR64pi8 : RegisterOperand<GPR64, "printPostIncOperand<8>">;
def GPR64pi12 : RegisterOperand<GPR64, "printPostIncOperand<12>">;
def GPR64pi16 : RegisterOperand<GPR64, "printPostIncOperand<16>">;
def GPR64pi24 : RegisterOperand<GPR64, "printPostIncOperand<24>">;
def GPR64pi32 : RegisterOperand<GPR64, "printPostIncOperand<32>">;
def GPR64pi48 : RegisterOperand<GPR64, "printPostIncOperand<48>">;
def GPR64pi64 : RegisterOperand<GPR64, "printPostIncOperand<64>">;
// Condition code regclass.
def CCR : RegisterClass<"AArch64", [i32], 32, (add NZCV)> {
let CopyCost = -1; // Don't allow copying of status registers.
// CCR is not allocatable.
let isAllocatable = 0;
}
//===----------------------------------------------------------------------===//
// Floating Point Scalar Registers
//===----------------------------------------------------------------------===//
def B0 : AArch64Reg<0, "b0">, DwarfRegNum<[64]>;
def B1 : AArch64Reg<1, "b1">, DwarfRegNum<[65]>;
def B2 : AArch64Reg<2, "b2">, DwarfRegNum<[66]>;
def B3 : AArch64Reg<3, "b3">, DwarfRegNum<[67]>;
def B4 : AArch64Reg<4, "b4">, DwarfRegNum<[68]>;
def B5 : AArch64Reg<5, "b5">, DwarfRegNum<[69]>;
def B6 : AArch64Reg<6, "b6">, DwarfRegNum<[70]>;
def B7 : AArch64Reg<7, "b7">, DwarfRegNum<[71]>;
def B8 : AArch64Reg<8, "b8">, DwarfRegNum<[72]>;
def B9 : AArch64Reg<9, "b9">, DwarfRegNum<[73]>;
def B10 : AArch64Reg<10, "b10">, DwarfRegNum<[74]>;
def B11 : AArch64Reg<11, "b11">, DwarfRegNum<[75]>;
def B12 : AArch64Reg<12, "b12">, DwarfRegNum<[76]>;
def B13 : AArch64Reg<13, "b13">, DwarfRegNum<[77]>;
def B14 : AArch64Reg<14, "b14">, DwarfRegNum<[78]>;
def B15 : AArch64Reg<15, "b15">, DwarfRegNum<[79]>;
def B16 : AArch64Reg<16, "b16">, DwarfRegNum<[80]>;
def B17 : AArch64Reg<17, "b17">, DwarfRegNum<[81]>;
def B18 : AArch64Reg<18, "b18">, DwarfRegNum<[82]>;
def B19 : AArch64Reg<19, "b19">, DwarfRegNum<[83]>;
def B20 : AArch64Reg<20, "b20">, DwarfRegNum<[84]>;
def B21 : AArch64Reg<21, "b21">, DwarfRegNum<[85]>;
def B22 : AArch64Reg<22, "b22">, DwarfRegNum<[86]>;
def B23 : AArch64Reg<23, "b23">, DwarfRegNum<[87]>;
def B24 : AArch64Reg<24, "b24">, DwarfRegNum<[88]>;
def B25 : AArch64Reg<25, "b25">, DwarfRegNum<[89]>;
def B26 : AArch64Reg<26, "b26">, DwarfRegNum<[90]>;
def B27 : AArch64Reg<27, "b27">, DwarfRegNum<[91]>;
def B28 : AArch64Reg<28, "b28">, DwarfRegNum<[92]>;
def B29 : AArch64Reg<29, "b29">, DwarfRegNum<[93]>;
def B30 : AArch64Reg<30, "b30">, DwarfRegNum<[94]>;
def B31 : AArch64Reg<31, "b31">, DwarfRegNum<[95]>;
let SubRegIndices = [bsub] in {
def H0 : AArch64Reg<0, "h0", [B0]>, DwarfRegAlias<B0>;
def H1 : AArch64Reg<1, "h1", [B1]>, DwarfRegAlias<B1>;
def H2 : AArch64Reg<2, "h2", [B2]>, DwarfRegAlias<B2>;
def H3 : AArch64Reg<3, "h3", [B3]>, DwarfRegAlias<B3>;
def H4 : AArch64Reg<4, "h4", [B4]>, DwarfRegAlias<B4>;
def H5 : AArch64Reg<5, "h5", [B5]>, DwarfRegAlias<B5>;
def H6 : AArch64Reg<6, "h6", [B6]>, DwarfRegAlias<B6>;
def H7 : AArch64Reg<7, "h7", [B7]>, DwarfRegAlias<B7>;
def H8 : AArch64Reg<8, "h8", [B8]>, DwarfRegAlias<B8>;
def H9 : AArch64Reg<9, "h9", [B9]>, DwarfRegAlias<B9>;
def H10 : AArch64Reg<10, "h10", [B10]>, DwarfRegAlias<B10>;
def H11 : AArch64Reg<11, "h11", [B11]>, DwarfRegAlias<B11>;
def H12 : AArch64Reg<12, "h12", [B12]>, DwarfRegAlias<B12>;
def H13 : AArch64Reg<13, "h13", [B13]>, DwarfRegAlias<B13>;
def H14 : AArch64Reg<14, "h14", [B14]>, DwarfRegAlias<B14>;
def H15 : AArch64Reg<15, "h15", [B15]>, DwarfRegAlias<B15>;
def H16 : AArch64Reg<16, "h16", [B16]>, DwarfRegAlias<B16>;
def H17 : AArch64Reg<17, "h17", [B17]>, DwarfRegAlias<B17>;
def H18 : AArch64Reg<18, "h18", [B18]>, DwarfRegAlias<B18>;
def H19 : AArch64Reg<19, "h19", [B19]>, DwarfRegAlias<B19>;
def H20 : AArch64Reg<20, "h20", [B20]>, DwarfRegAlias<B20>;
def H21 : AArch64Reg<21, "h21", [B21]>, DwarfRegAlias<B21>;
def H22 : AArch64Reg<22, "h22", [B22]>, DwarfRegAlias<B22>;
def H23 : AArch64Reg<23, "h23", [B23]>, DwarfRegAlias<B23>;
def H24 : AArch64Reg<24, "h24", [B24]>, DwarfRegAlias<B24>;
def H25 : AArch64Reg<25, "h25", [B25]>, DwarfRegAlias<B25>;
def H26 : AArch64Reg<26, "h26", [B26]>, DwarfRegAlias<B26>;
def H27 : AArch64Reg<27, "h27", [B27]>, DwarfRegAlias<B27>;
def H28 : AArch64Reg<28, "h28", [B28]>, DwarfRegAlias<B28>;
def H29 : AArch64Reg<29, "h29", [B29]>, DwarfRegAlias<B29>;
def H30 : AArch64Reg<30, "h30", [B30]>, DwarfRegAlias<B30>;
def H31 : AArch64Reg<31, "h31", [B31]>, DwarfRegAlias<B31>;
}
let SubRegIndices = [hsub] in {
def S0 : AArch64Reg<0, "s0", [H0]>, DwarfRegAlias<B0>;
def S1 : AArch64Reg<1, "s1", [H1]>, DwarfRegAlias<B1>;
def S2 : AArch64Reg<2, "s2", [H2]>, DwarfRegAlias<B2>;
def S3 : AArch64Reg<3, "s3", [H3]>, DwarfRegAlias<B3>;
def S4 : AArch64Reg<4, "s4", [H4]>, DwarfRegAlias<B4>;
def S5 : AArch64Reg<5, "s5", [H5]>, DwarfRegAlias<B5>;
def S6 : AArch64Reg<6, "s6", [H6]>, DwarfRegAlias<B6>;
def S7 : AArch64Reg<7, "s7", [H7]>, DwarfRegAlias<B7>;
def S8 : AArch64Reg<8, "s8", [H8]>, DwarfRegAlias<B8>;
def S9 : AArch64Reg<9, "s9", [H9]>, DwarfRegAlias<B9>;
def S10 : AArch64Reg<10, "s10", [H10]>, DwarfRegAlias<B10>;
def S11 : AArch64Reg<11, "s11", [H11]>, DwarfRegAlias<B11>;
def S12 : AArch64Reg<12, "s12", [H12]>, DwarfRegAlias<B12>;
def S13 : AArch64Reg<13, "s13", [H13]>, DwarfRegAlias<B13>;
def S14 : AArch64Reg<14, "s14", [H14]>, DwarfRegAlias<B14>;
def S15 : AArch64Reg<15, "s15", [H15]>, DwarfRegAlias<B15>;
def S16 : AArch64Reg<16, "s16", [H16]>, DwarfRegAlias<B16>;
def S17 : AArch64Reg<17, "s17", [H17]>, DwarfRegAlias<B17>;
def S18 : AArch64Reg<18, "s18", [H18]>, DwarfRegAlias<B18>;
def S19 : AArch64Reg<19, "s19", [H19]>, DwarfRegAlias<B19>;
def S20 : AArch64Reg<20, "s20", [H20]>, DwarfRegAlias<B20>;
def S21 : AArch64Reg<21, "s21", [H21]>, DwarfRegAlias<B21>;
def S22 : AArch64Reg<22, "s22", [H22]>, DwarfRegAlias<B22>;
def S23 : AArch64Reg<23, "s23", [H23]>, DwarfRegAlias<B23>;
def S24 : AArch64Reg<24, "s24", [H24]>, DwarfRegAlias<B24>;
def S25 : AArch64Reg<25, "s25", [H25]>, DwarfRegAlias<B25>;
def S26 : AArch64Reg<26, "s26", [H26]>, DwarfRegAlias<B26>;
def S27 : AArch64Reg<27, "s27", [H27]>, DwarfRegAlias<B27>;
def S28 : AArch64Reg<28, "s28", [H28]>, DwarfRegAlias<B28>;
def S29 : AArch64Reg<29, "s29", [H29]>, DwarfRegAlias<B29>;
def S30 : AArch64Reg<30, "s30", [H30]>, DwarfRegAlias<B30>;
def S31 : AArch64Reg<31, "s31", [H31]>, DwarfRegAlias<B31>;
}
let SubRegIndices = [ssub], RegAltNameIndices = [vreg, vlist1] in {
def D0 : AArch64Reg<0, "d0", [S0], ["v0", ""]>, DwarfRegAlias<B0>;
def D1 : AArch64Reg<1, "d1", [S1], ["v1", ""]>, DwarfRegAlias<B1>;
def D2 : AArch64Reg<2, "d2", [S2], ["v2", ""]>, DwarfRegAlias<B2>;
def D3 : AArch64Reg<3, "d3", [S3], ["v3", ""]>, DwarfRegAlias<B3>;
def D4 : AArch64Reg<4, "d4", [S4], ["v4", ""]>, DwarfRegAlias<B4>;
def D5 : AArch64Reg<5, "d5", [S5], ["v5", ""]>, DwarfRegAlias<B5>;
def D6 : AArch64Reg<6, "d6", [S6], ["v6", ""]>, DwarfRegAlias<B6>;
def D7 : AArch64Reg<7, "d7", [S7], ["v7", ""]>, DwarfRegAlias<B7>;
def D8 : AArch64Reg<8, "d8", [S8], ["v8", ""]>, DwarfRegAlias<B8>;
def D9 : AArch64Reg<9, "d9", [S9], ["v9", ""]>, DwarfRegAlias<B9>;
def D10 : AArch64Reg<10, "d10", [S10], ["v10", ""]>, DwarfRegAlias<B10>;
def D11 : AArch64Reg<11, "d11", [S11], ["v11", ""]>, DwarfRegAlias<B11>;
def D12 : AArch64Reg<12, "d12", [S12], ["v12", ""]>, DwarfRegAlias<B12>;
def D13 : AArch64Reg<13, "d13", [S13], ["v13", ""]>, DwarfRegAlias<B13>;
def D14 : AArch64Reg<14, "d14", [S14], ["v14", ""]>, DwarfRegAlias<B14>;
def D15 : AArch64Reg<15, "d15", [S15], ["v15", ""]>, DwarfRegAlias<B15>;
def D16 : AArch64Reg<16, "d16", [S16], ["v16", ""]>, DwarfRegAlias<B16>;
def D17 : AArch64Reg<17, "d17", [S17], ["v17", ""]>, DwarfRegAlias<B17>;
def D18 : AArch64Reg<18, "d18", [S18], ["v18", ""]>, DwarfRegAlias<B18>;
def D19 : AArch64Reg<19, "d19", [S19], ["v19", ""]>, DwarfRegAlias<B19>;
def D20 : AArch64Reg<20, "d20", [S20], ["v20", ""]>, DwarfRegAlias<B20>;
def D21 : AArch64Reg<21, "d21", [S21], ["v21", ""]>, DwarfRegAlias<B21>;
def D22 : AArch64Reg<22, "d22", [S22], ["v22", ""]>, DwarfRegAlias<B22>;
def D23 : AArch64Reg<23, "d23", [S23], ["v23", ""]>, DwarfRegAlias<B23>;
def D24 : AArch64Reg<24, "d24", [S24], ["v24", ""]>, DwarfRegAlias<B24>;
def D25 : AArch64Reg<25, "d25", [S25], ["v25", ""]>, DwarfRegAlias<B25>;
def D26 : AArch64Reg<26, "d26", [S26], ["v26", ""]>, DwarfRegAlias<B26>;
def D27 : AArch64Reg<27, "d27", [S27], ["v27", ""]>, DwarfRegAlias<B27>;
def D28 : AArch64Reg<28, "d28", [S28], ["v28", ""]>, DwarfRegAlias<B28>;
def D29 : AArch64Reg<29, "d29", [S29], ["v29", ""]>, DwarfRegAlias<B29>;
def D30 : AArch64Reg<30, "d30", [S30], ["v30", ""]>, DwarfRegAlias<B30>;
def D31 : AArch64Reg<31, "d31", [S31], ["v31", ""]>, DwarfRegAlias<B31>;
}
let SubRegIndices = [dsub], RegAltNameIndices = [vreg, vlist1] in {
def Q0 : AArch64Reg<0, "q0", [D0], ["v0", ""]>, DwarfRegAlias<B0>;
def Q1 : AArch64Reg<1, "q1", [D1], ["v1", ""]>, DwarfRegAlias<B1>;
def Q2 : AArch64Reg<2, "q2", [D2], ["v2", ""]>, DwarfRegAlias<B2>;
def Q3 : AArch64Reg<3, "q3", [D3], ["v3", ""]>, DwarfRegAlias<B3>;
def Q4 : AArch64Reg<4, "q4", [D4], ["v4", ""]>, DwarfRegAlias<B4>;
def Q5 : AArch64Reg<5, "q5", [D5], ["v5", ""]>, DwarfRegAlias<B5>;
def Q6 : AArch64Reg<6, "q6", [D6], ["v6", ""]>, DwarfRegAlias<B6>;
def Q7 : AArch64Reg<7, "q7", [D7], ["v7", ""]>, DwarfRegAlias<B7>;
def Q8 : AArch64Reg<8, "q8", [D8], ["v8", ""]>, DwarfRegAlias<B8>;
def Q9 : AArch64Reg<9, "q9", [D9], ["v9", ""]>, DwarfRegAlias<B9>;
def Q10 : AArch64Reg<10, "q10", [D10], ["v10", ""]>, DwarfRegAlias<B10>;
def Q11 : AArch64Reg<11, "q11", [D11], ["v11", ""]>, DwarfRegAlias<B11>;
def Q12 : AArch64Reg<12, "q12", [D12], ["v12", ""]>, DwarfRegAlias<B12>;
def Q13 : AArch64Reg<13, "q13", [D13], ["v13", ""]>, DwarfRegAlias<B13>;
def Q14 : AArch64Reg<14, "q14", [D14], ["v14", ""]>, DwarfRegAlias<B14>;
def Q15 : AArch64Reg<15, "q15", [D15], ["v15", ""]>, DwarfRegAlias<B15>;
def Q16 : AArch64Reg<16, "q16", [D16], ["v16", ""]>, DwarfRegAlias<B16>;
def Q17 : AArch64Reg<17, "q17", [D17], ["v17", ""]>, DwarfRegAlias<B17>;
def Q18 : AArch64Reg<18, "q18", [D18], ["v18", ""]>, DwarfRegAlias<B18>;
def Q19 : AArch64Reg<19, "q19", [D19], ["v19", ""]>, DwarfRegAlias<B19>;
def Q20 : AArch64Reg<20, "q20", [D20], ["v20", ""]>, DwarfRegAlias<B20>;
def Q21 : AArch64Reg<21, "q21", [D21], ["v21", ""]>, DwarfRegAlias<B21>;
def Q22 : AArch64Reg<22, "q22", [D22], ["v22", ""]>, DwarfRegAlias<B22>;
def Q23 : AArch64Reg<23, "q23", [D23], ["v23", ""]>, DwarfRegAlias<B23>;
def Q24 : AArch64Reg<24, "q24", [D24], ["v24", ""]>, DwarfRegAlias<B24>;
def Q25 : AArch64Reg<25, "q25", [D25], ["v25", ""]>, DwarfRegAlias<B25>;
def Q26 : AArch64Reg<26, "q26", [D26], ["v26", ""]>, DwarfRegAlias<B26>;
def Q27 : AArch64Reg<27, "q27", [D27], ["v27", ""]>, DwarfRegAlias<B27>;
def Q28 : AArch64Reg<28, "q28", [D28], ["v28", ""]>, DwarfRegAlias<B28>;
def Q29 : AArch64Reg<29, "q29", [D29], ["v29", ""]>, DwarfRegAlias<B29>;
def Q30 : AArch64Reg<30, "q30", [D30], ["v30", ""]>, DwarfRegAlias<B30>;
def Q31 : AArch64Reg<31, "q31", [D31], ["v31", ""]>, DwarfRegAlias<B31>;
}
def FPR8 : RegisterClass<"AArch64", [untyped], 8, (sequence "B%u", 0, 31)> {
let Size = 8;
}
def FPR16 : RegisterClass<"AArch64", [f16], 16, (sequence "H%u", 0, 31)> {
let Size = 16;
}
def FPR32 : RegisterClass<"AArch64", [f32, i32], 32,(sequence "S%u", 0, 31)>;
def FPR64 : RegisterClass<"AArch64", [f64, i64, v2f32, v1f64, v8i8, v4i16, v2i32,
v1i64],
64, (sequence "D%u", 0, 31)>;
// We don't (yet) have an f128 legal type, so don't use that here. We
// normalize 128-bit vectors to v2f64 for arg passing and such, so use
// that here.
def FPR128 : RegisterClass<"AArch64",
[v16i8, v8i16, v4i32, v2i64, v4f32, v2f64, f128],
128, (sequence "Q%u", 0, 31)>;
// The lower 16 vector registers. Some instructions can only take registers
// in this range.
def FPR128_lo : RegisterClass<"AArch64",
[v16i8, v8i16, v4i32, v2i64, v4f32, v2f64],
128, (trunc FPR128, 16)>;
// Pairs, triples, and quads of 64-bit vector registers.
def DSeqPairs : RegisterTuples<[dsub0, dsub1], [(rotl FPR64, 0), (rotl FPR64, 1)]>;
def DSeqTriples : RegisterTuples<[dsub0, dsub1, dsub2],
[(rotl FPR64, 0), (rotl FPR64, 1),
(rotl FPR64, 2)]>;
def DSeqQuads : RegisterTuples<[dsub0, dsub1, dsub2, dsub3],
[(rotl FPR64, 0), (rotl FPR64, 1),
(rotl FPR64, 2), (rotl FPR64, 3)]>;
def DD : RegisterClass<"AArch64", [untyped], 64, (add DSeqPairs)> {
let Size = 128;
}
def DDD : RegisterClass<"AArch64", [untyped], 64, (add DSeqTriples)> {
let Size = 196;
}
def DDDD : RegisterClass<"AArch64", [untyped], 64, (add DSeqQuads)> {
let Size = 256;
}
// Pairs, triples, and quads of 128-bit vector registers.
def QSeqPairs : RegisterTuples<[qsub0, qsub1], [(rotl FPR128, 0), (rotl FPR128, 1)]>;
def QSeqTriples : RegisterTuples<[qsub0, qsub1, qsub2],
[(rotl FPR128, 0), (rotl FPR128, 1),
(rotl FPR128, 2)]>;
def QSeqQuads : RegisterTuples<[qsub0, qsub1, qsub2, qsub3],
[(rotl FPR128, 0), (rotl FPR128, 1),
(rotl FPR128, 2), (rotl FPR128, 3)]>;
def QQ : RegisterClass<"AArch64", [untyped], 128, (add QSeqPairs)> {
let Size = 256;
}
def QQQ : RegisterClass<"AArch64", [untyped], 128, (add QSeqTriples)> {
let Size = 384;
}
def QQQQ : RegisterClass<"AArch64", [untyped], 128, (add QSeqQuads)> {
let Size = 512;
}
// Vector operand versions of the FP registers. Alternate name printing and
// assmebler matching.
def VectorReg64AsmOperand : AsmOperandClass {
let Name = "VectorReg64";
let PredicateMethod = "isVectorReg";
}
def VectorReg128AsmOperand : AsmOperandClass {
let Name = "VectorReg128";
let PredicateMethod = "isVectorReg";
}
def V64 : RegisterOperand<FPR64, "printVRegOperand"> {
let ParserMatchClass = VectorReg64AsmOperand;
}
def V128 : RegisterOperand<FPR128, "printVRegOperand"> {
let ParserMatchClass = VectorReg128AsmOperand;
}
def VectorRegLoAsmOperand : AsmOperandClass { let Name = "VectorRegLo"; }
def V128_lo : RegisterOperand<FPR128_lo, "printVRegOperand"> {
let ParserMatchClass = VectorRegLoAsmOperand;
}
class TypedVecListAsmOperand<int count, int regsize, int lanes, string kind>
: AsmOperandClass {
let Name = "TypedVectorList" # count # "_" # lanes # kind;
let PredicateMethod
= "isTypedVectorList<" # count # ", " # lanes # ", '" # kind # "'>";
let RenderMethod = "addVectorList" # regsize # "Operands<" # count # ">";
}
class TypedVecListRegOperand<RegisterClass Reg, int lanes, string kind>
: RegisterOperand<Reg, "printTypedVectorList<" # lanes # ", '"
# kind # "'>">;
multiclass VectorList<int count, RegisterClass Reg64, RegisterClass Reg128> {
// With implicit types (probably on instruction instead). E.g. { v0, v1 }
def _64AsmOperand : AsmOperandClass {
let Name = NAME # "64";
let PredicateMethod = "isImplicitlyTypedVectorList<" # count # ">";
let RenderMethod = "addVectorList64Operands<" # count # ">";
}
def "64" : RegisterOperand<Reg64, "printImplicitlyTypedVectorList"> {
let ParserMatchClass = !cast<AsmOperandClass>(NAME # "_64AsmOperand");
}
def _128AsmOperand : AsmOperandClass {
let Name = NAME # "128";
let PredicateMethod = "isImplicitlyTypedVectorList<" # count # ">";
let RenderMethod = "addVectorList128Operands<" # count # ">";
}
def "128" : RegisterOperand<Reg128, "printImplicitlyTypedVectorList"> {
let ParserMatchClass = !cast<AsmOperandClass>(NAME # "_128AsmOperand");
}
// 64-bit register lists with explicit type.
// { v0.8b, v1.8b }
def _8bAsmOperand : TypedVecListAsmOperand<count, 64, 8, "b">;
def "8b" : TypedVecListRegOperand<Reg64, 8, "b"> {
let ParserMatchClass = !cast<AsmOperandClass>(NAME # "_8bAsmOperand");
}
// { v0.4h, v1.4h }
def _4hAsmOperand : TypedVecListAsmOperand<count, 64, 4, "h">;
def "4h" : TypedVecListRegOperand<Reg64, 4, "h"> {
let ParserMatchClass = !cast<AsmOperandClass>(NAME # "_4hAsmOperand");
}
// { v0.2s, v1.2s }
def _2sAsmOperand : TypedVecListAsmOperand<count, 64, 2, "s">;
def "2s" : TypedVecListRegOperand<Reg64, 2, "s"> {
let ParserMatchClass = !cast<AsmOperandClass>(NAME # "_2sAsmOperand");
}
// { v0.1d, v1.1d }
def _1dAsmOperand : TypedVecListAsmOperand<count, 64, 1, "d">;
def "1d" : TypedVecListRegOperand<Reg64, 1, "d"> {
let ParserMatchClass = !cast<AsmOperandClass>(NAME # "_1dAsmOperand");
}
// 128-bit register lists with explicit type
// { v0.16b, v1.16b }
def _16bAsmOperand : TypedVecListAsmOperand<count, 128, 16, "b">;
def "16b" : TypedVecListRegOperand<Reg128, 16, "b"> {
let ParserMatchClass = !cast<AsmOperandClass>(NAME # "_16bAsmOperand");
}
// { v0.8h, v1.8h }
def _8hAsmOperand : TypedVecListAsmOperand<count, 128, 8, "h">;
def "8h" : TypedVecListRegOperand<Reg128, 8, "h"> {
let ParserMatchClass = !cast<AsmOperandClass>(NAME # "_8hAsmOperand");
}
// { v0.4s, v1.4s }
def _4sAsmOperand : TypedVecListAsmOperand<count, 128, 4, "s">;
def "4s" : TypedVecListRegOperand<Reg128, 4, "s"> {
let ParserMatchClass = !cast<AsmOperandClass>(NAME # "_4sAsmOperand");
}
// { v0.2d, v1.2d }
def _2dAsmOperand : TypedVecListAsmOperand<count, 128, 2, "d">;
def "2d" : TypedVecListRegOperand<Reg128, 2, "d"> {
let ParserMatchClass = !cast<AsmOperandClass>(NAME # "_2dAsmOperand");
}
// { v0.b, v1.b }
def _bAsmOperand : TypedVecListAsmOperand<count, 128, 0, "b">;
def "b" : TypedVecListRegOperand<Reg128, 0, "b"> {
let ParserMatchClass = !cast<AsmOperandClass>(NAME # "_bAsmOperand");
}
// { v0.h, v1.h }
def _hAsmOperand : TypedVecListAsmOperand<count, 128, 0, "h">;
def "h" : TypedVecListRegOperand<Reg128, 0, "h"> {
let ParserMatchClass = !cast<AsmOperandClass>(NAME # "_hAsmOperand");
}
// { v0.s, v1.s }
def _sAsmOperand : TypedVecListAsmOperand<count, 128, 0, "s">;
def "s" : TypedVecListRegOperand<Reg128, 0, "s"> {
let ParserMatchClass = !cast<AsmOperandClass>(NAME # "_sAsmOperand");
}
// { v0.d, v1.d }
def _dAsmOperand : TypedVecListAsmOperand<count, 128, 0, "d">;
def "d" : TypedVecListRegOperand<Reg128, 0, "d"> {
let ParserMatchClass = !cast<AsmOperandClass>(NAME # "_dAsmOperand");
}
}
defm VecListOne : VectorList<1, FPR64, FPR128>;
defm VecListTwo : VectorList<2, DD, QQ>;
defm VecListThree : VectorList<3, DDD, QQQ>;
defm VecListFour : VectorList<4, DDDD, QQQQ>;
// Register operand versions of the scalar FP registers.
def FPR16Op : RegisterOperand<FPR16, "printOperand">;
def FPR32Op : RegisterOperand<FPR32, "printOperand">;
def FPR64Op : RegisterOperand<FPR64, "printOperand">;
def FPR128Op : RegisterOperand<FPR128, "printOperand">;

View File

@ -1,4 +1,4 @@
//=- ARM64SchedA53.td - ARM Cortex-A53 Scheduling Definitions -*- tablegen -*-=//
//==- AArch64SchedA53.td - Cortex-A53 Scheduling Definitions -*- tablegen -*-=//
//
// The LLVM Compiler Infrastructure
//

View File

@ -1,4 +1,4 @@
//=- ARMSchedCyclone.td - ARM64 Cyclone Scheduling Defs ------*- tablegen -*-=//
//=- ARMSchedCyclone.td - AArch64 Cyclone Scheduling Defs ----*- tablegen -*-=//
//
// The LLVM Compiler Infrastructure
//
@ -7,7 +7,7 @@
//
//===----------------------------------------------------------------------===//
//
// This file defines the machine model for ARM64 Cyclone to support
// This file defines the machine model for AArch64 Cyclone to support
// instruction scheduling and other instruction cost heuristics.
//
//===----------------------------------------------------------------------===//
@ -239,13 +239,13 @@ def : WriteRes<WriteST, [CyUnitLS]> {
def CyWriteLDIdx : SchedWriteVariant<[
SchedVar<ScaledIdxPred, [WriteIS, WriteLD]>, // Load from scaled register.
SchedVar<NoSchedPred, [WriteLD]>]>; // Load from register offset.
def : SchedAlias<WriteLDIdx, CyWriteLDIdx>; // Map ARM64->Cyclone type.
def : SchedAlias<WriteLDIdx, CyWriteLDIdx>; // Map AArch64->Cyclone type.
// EXAMPLE: STR Xn, Xm [, lsl 3]
def CyWriteSTIdx : SchedWriteVariant<[
SchedVar<ScaledIdxPred, [WriteIS, WriteST]>, // Store to scaled register.
SchedVar<NoSchedPred, [WriteST]>]>; // Store to register offset.
def : SchedAlias<WriteSTIdx, CyWriteSTIdx>; // Map ARM64->Cyclone type.
def : SchedAlias<WriteSTIdx, CyWriteSTIdx>; // Map AArch64->Cyclone type.
// Read the (unshifted) base register Xn in the second micro-op one cycle later.
// EXAMPLE: LDR Xn, Xm [, lsl 3]
@ -253,7 +253,7 @@ def ReadBaseRS : SchedReadAdvance<1>;
def CyReadAdrBase : SchedReadVariant<[
SchedVar<ScaledIdxPred, [ReadBaseRS]>, // Read base reg after shifting offset.
SchedVar<NoSchedPred, [ReadDefault]>]>; // Read base reg with no shift.
def : SchedAlias<ReadAdrBase, CyReadAdrBase>; // Map ARM64->Cyclone type.
def : SchedAlias<ReadAdrBase, CyReadAdrBase>; // Map AArch64->Cyclone type.
//---
// 7.8.9,7.8.11. Load/Store, paired

View File

@ -1,4 +1,4 @@
//===-- ARMSchedule.td - ARM Scheduling Definitions --------*- tablegen -*-===//
//==-- AArch64Schedule.td - AArch64 Scheduling Definitions -*- tablegen -*-===//
//
// The LLVM Compiler Infrastructure
//
@ -11,12 +11,12 @@
// const MachineInstr *MI and const TargetSchedModel *SchedModel
// are defined by default.
def : PredicateProlog<[{
const ARM64InstrInfo *TII =
static_cast<const ARM64InstrInfo*>(SchedModel->getInstrInfo());
const AArch64InstrInfo *TII =
static_cast<const AArch64InstrInfo*>(SchedModel->getInstrInfo());
(void)TII;
}]>;
// ARM64 Scheduler Definitions
// AArch64 Scheduler Definitions
def WriteImm : SchedWrite; // MOVN, MOVZ
// TODO: Provide variants for MOV32/64imm Pseudos that dynamically

View File

@ -1,4 +1,4 @@
//===-- ARM64SelectionDAGInfo.cpp - ARM64 SelectionDAG Info ---------------===//
//===-- AArch64SelectionDAGInfo.cpp - AArch64 SelectionDAG Info -----------===//
//
// The LLVM Compiler Infrastructure
//
@ -7,22 +7,22 @@
//
//===----------------------------------------------------------------------===//
//
// This file implements the ARM64SelectionDAGInfo class.
// This file implements the AArch64SelectionDAGInfo class.
//
//===----------------------------------------------------------------------===//
#include "ARM64TargetMachine.h"
#include "AArch64TargetMachine.h"
using namespace llvm;
#define DEBUG_TYPE "arm64-selectiondag-info"
#define DEBUG_TYPE "aarch64-selectiondag-info"
ARM64SelectionDAGInfo::ARM64SelectionDAGInfo(const TargetMachine &TM)
AArch64SelectionDAGInfo::AArch64SelectionDAGInfo(const TargetMachine &TM)
: TargetSelectionDAGInfo(TM),
Subtarget(&TM.getSubtarget<ARM64Subtarget>()) {}
Subtarget(&TM.getSubtarget<AArch64Subtarget>()) {}
ARM64SelectionDAGInfo::~ARM64SelectionDAGInfo() {}
AArch64SelectionDAGInfo::~AArch64SelectionDAGInfo() {}
SDValue ARM64SelectionDAGInfo::EmitTargetCodeForMemset(
SDValue AArch64SelectionDAGInfo::EmitTargetCodeForMemset(
SelectionDAG &DAG, SDLoc dl, SDValue Chain, SDValue Dst, SDValue Src,
SDValue Size, unsigned Align, bool isVolatile,
MachinePointerInfo DstPtrInfo) const {
@ -34,8 +34,9 @@ SDValue ARM64SelectionDAGInfo::EmitTargetCodeForMemset(
// For small size (< 256), it is not beneficial to use bzero
// instead of memset.
if (bzeroEntry && (!SizeValue || SizeValue->getZExtValue() > 256)) {
const ARM64TargetLowering &TLI = *static_cast<const ARM64TargetLowering *>(
DAG.getTarget().getTargetLowering());
const AArch64TargetLowering &TLI =
*static_cast<const AArch64TargetLowering *>(
DAG.getTarget().getTargetLowering());
EVT IntPtr = TLI.getPointerTy();
Type *IntPtrTy = getDataLayout()->getIntPtrType(*DAG.getContext());

View File

@ -1,4 +1,4 @@
//===-- ARM64SelectionDAGInfo.h - ARM64 SelectionDAG Info -------*- C++ -*-===//
//===-- AArch64SelectionDAGInfo.h - AArch64 SelectionDAG Info ---*- C++ -*-===//
//
// The LLVM Compiler Infrastructure
//
@ -7,25 +7,25 @@
//
//===----------------------------------------------------------------------===//
//
// This file defines the ARM64 subclass for TargetSelectionDAGInfo.
// This file defines the AArch64 subclass for TargetSelectionDAGInfo.
//
//===----------------------------------------------------------------------===//
#ifndef ARM64SELECTIONDAGINFO_H
#define ARM64SELECTIONDAGINFO_H
#ifndef AArch64SELECTIONDAGINFO_H
#define AArch64SELECTIONDAGINFO_H
#include "llvm/Target/TargetSelectionDAGInfo.h"
namespace llvm {
class ARM64SelectionDAGInfo : public TargetSelectionDAGInfo {
class AArch64SelectionDAGInfo : public TargetSelectionDAGInfo {
/// Subtarget - Keep a pointer to the ARMSubtarget around so that we can
/// make the right decision when generating code for different targets.
const ARM64Subtarget *Subtarget;
const AArch64Subtarget *Subtarget;
public:
explicit ARM64SelectionDAGInfo(const TargetMachine &TM);
~ARM64SelectionDAGInfo();
explicit AArch64SelectionDAGInfo(const TargetMachine &TM);
~AArch64SelectionDAGInfo();
SDValue EmitTargetCodeForMemset(SelectionDAG &DAG, SDLoc dl, SDValue Chain,
SDValue Dst, SDValue Src, SDValue Size,

View File

@ -1,4 +1,4 @@
//===---- ARM64StorePairSuppress.cpp --- Suppress store pair formation ----===//
//===--- AArch64StorePairSuppress.cpp --- Suppress store pair formation ---===//
//
// The LLVM Compiler Infrastructure
//
@ -11,7 +11,7 @@
// store pairs. Later we may do the same for floating point loads.
// ===---------------------------------------------------------------------===//
#include "ARM64InstrInfo.h"
#include "AArch64InstrInfo.h"
#include "llvm/CodeGen/MachineFunction.h"
#include "llvm/CodeGen/MachineFunctionPass.h"
#include "llvm/CodeGen/MachineInstr.h"
@ -23,11 +23,11 @@
using namespace llvm;
#define DEBUG_TYPE "arm64-stp-suppress"
#define DEBUG_TYPE "aarch64-stp-suppress"
namespace {
class ARM64StorePairSuppress : public MachineFunctionPass {
const ARM64InstrInfo *TII;
class AArch64StorePairSuppress : public MachineFunctionPass {
const AArch64InstrInfo *TII;
const TargetRegisterInfo *TRI;
const MachineRegisterInfo *MRI;
MachineFunction *MF;
@ -37,10 +37,10 @@ class ARM64StorePairSuppress : public MachineFunctionPass {
public:
static char ID;
ARM64StorePairSuppress() : MachineFunctionPass(ID) {}
AArch64StorePairSuppress() : MachineFunctionPass(ID) {}
virtual const char *getPassName() const override {
return "ARM64 Store Pair Suppression";
return "AArch64 Store Pair Suppression";
}
bool runOnMachineFunction(MachineFunction &F) override;
@ -57,11 +57,11 @@ private:
MachineFunctionPass::getAnalysisUsage(AU);
}
};
char ARM64StorePairSuppress::ID = 0;
char AArch64StorePairSuppress::ID = 0;
} // anonymous
FunctionPass *llvm::createARM64StorePairSuppressPass() {
return new ARM64StorePairSuppress();
FunctionPass *llvm::createAArch64StorePairSuppressPass() {
return new AArch64StorePairSuppress();
}
/// Return true if an STP can be added to this block without increasing the
@ -70,7 +70,7 @@ FunctionPass *llvm::createARM64StorePairSuppressPass() {
/// critical path. If the critical path is longer than the resource height, the
/// extra vector ops can limit physreg renaming. Otherwise, it could simply
/// oversaturate the vector units.
bool ARM64StorePairSuppress::shouldAddSTPToBlock(const MachineBasicBlock *BB) {
bool AArch64StorePairSuppress::shouldAddSTPToBlock(const MachineBasicBlock *BB) {
if (!MinInstr)
MinInstr = Traces->getEnsemble(MachineTraceMetrics::TS_MinInstrCount);
@ -79,7 +79,7 @@ bool ARM64StorePairSuppress::shouldAddSTPToBlock(const MachineBasicBlock *BB) {
// Get the machine model's scheduling class for STPQi.
// Bypass TargetSchedule's SchedClass resolution since we only have an opcode.
unsigned SCIdx = TII->get(ARM64::STPDi).getSchedClass();
unsigned SCIdx = TII->get(AArch64::STPDi).getSchedClass();
const MCSchedClassDesc *SCDesc =
SchedModel.getMCSchedModel()->getSchedClassDesc(SCIdx);
@ -103,22 +103,22 @@ bool ARM64StorePairSuppress::shouldAddSTPToBlock(const MachineBasicBlock *BB) {
/// tell us if it's profitable with no cpu knowledge here.
///
/// FIXME: We plan to develop a decent Target abstraction for simple loads and
/// stores. Until then use a nasty switch similar to ARM64LoadStoreOptimizer.
bool ARM64StorePairSuppress::isNarrowFPStore(const MachineInstr &MI) {
/// stores. Until then use a nasty switch similar to AArch64LoadStoreOptimizer.
bool AArch64StorePairSuppress::isNarrowFPStore(const MachineInstr &MI) {
switch (MI.getOpcode()) {
default:
return false;
case ARM64::STRSui:
case ARM64::STRDui:
case ARM64::STURSi:
case ARM64::STURDi:
case AArch64::STRSui:
case AArch64::STRDui:
case AArch64::STURSi:
case AArch64::STURDi:
return true;
}
}
bool ARM64StorePairSuppress::runOnMachineFunction(MachineFunction &mf) {
bool AArch64StorePairSuppress::runOnMachineFunction(MachineFunction &mf) {
MF = &mf;
TII = static_cast<const ARM64InstrInfo *>(MF->getTarget().getInstrInfo());
TII = static_cast<const AArch64InstrInfo *>(MF->getTarget().getInstrInfo());
TRI = MF->getTarget().getRegisterInfo();
MRI = &MF->getRegInfo();
const TargetSubtargetInfo &ST =

View File

@ -1,4 +1,4 @@
//===-- ARM64Subtarget.cpp - ARM64 Subtarget Information --------*- C++ -*-===//
//===-- AArch64Subtarget.cpp - AArch64 Subtarget Information ----*- C++ -*-===//
//
// The LLVM Compiler Infrastructure
//
@ -7,12 +7,12 @@
//
//===----------------------------------------------------------------------===//
//
// This file implements the ARM64 specific subclass of TargetSubtarget.
// This file implements the AArch64 specific subclass of TargetSubtarget.
//
//===----------------------------------------------------------------------===//
#include "ARM64InstrInfo.h"
#include "ARM64Subtarget.h"
#include "AArch64InstrInfo.h"
#include "AArch64Subtarget.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/CodeGen/MachineScheduler.h"
#include "llvm/IR/GlobalValue.h"
@ -20,22 +20,23 @@
using namespace llvm;
#define DEBUG_TYPE "arm64-subtarget"
#define DEBUG_TYPE "aarch64-subtarget"
#define GET_SUBTARGETINFO_CTOR
#define GET_SUBTARGETINFO_TARGET_DESC
#include "ARM64GenSubtargetInfo.inc"
#include "AArch64GenSubtargetInfo.inc"
static cl::opt<bool>
EnableEarlyIfConvert("arm64-early-ifcvt", cl::desc("Enable the early if "
EnableEarlyIfConvert("aarch64-early-ifcvt", cl::desc("Enable the early if "
"converter pass"), cl::init(true), cl::Hidden);
ARM64Subtarget::ARM64Subtarget(const std::string &TT, const std::string &CPU,
const std::string &FS, bool LittleEndian)
: ARM64GenSubtargetInfo(TT, CPU, FS), ARMProcFamily(Others),
AArch64Subtarget::AArch64Subtarget(const std::string &TT,
const std::string &CPU,
const std::string &FS, bool LittleEndian)
: AArch64GenSubtargetInfo(TT, CPU, FS), ARMProcFamily(Others),
HasFPARMv8(false), HasNEON(false), HasCrypto(false), HasCRC(false),
HasZeroCycleRegMove(false), HasZeroCycleZeroing(false),
CPUString(CPU), TargetTriple(TT), IsLittleEndian(LittleEndian) {
HasZeroCycleRegMove(false), HasZeroCycleZeroing(false), CPUString(CPU),
TargetTriple(TT), IsLittleEndian(LittleEndian) {
// Determine default and user-specified characteristics
if (CPUString.empty())
@ -47,7 +48,7 @@ ARM64Subtarget::ARM64Subtarget(const std::string &TT, const std::string &CPU,
/// ClassifyGlobalReference - Find the target operand flags that describe
/// how a global value should be referenced for the current subtarget.
unsigned char
ARM64Subtarget::ClassifyGlobalReference(const GlobalValue *GV,
AArch64Subtarget::ClassifyGlobalReference(const GlobalValue *GV,
const TargetMachine &TM) const {
// Determine whether this is a reference to a definition or a declaration.
@ -60,13 +61,13 @@ ARM64Subtarget::ClassifyGlobalReference(const GlobalValue *GV,
// MachO large model always goes via a GOT, simply to get a single 8-byte
// absolute relocation on all global addresses.
if (TM.getCodeModel() == CodeModel::Large && isTargetMachO())
return ARM64II::MO_GOT;
return AArch64II::MO_GOT;
// The small code mode's direct accesses use ADRP, which cannot necessarily
// produce the value 0 (if the code is above 4GB). Therefore they must use the
// GOT.
if (TM.getCodeModel() == CodeModel::Small && GV->isWeakForLinker() && isDecl)
return ARM64II::MO_GOT;
return AArch64II::MO_GOT;
// If symbol visibility is hidden, the extra load is not needed if
// the symbol is definitely defined in the current translation unit.
@ -78,14 +79,14 @@ ARM64Subtarget::ClassifyGlobalReference(const GlobalValue *GV,
// defined could end up in unexpected places. Use a GOT.
if (TM.getRelocationModel() != Reloc::Static && GV->hasDefaultVisibility()) {
if (isTargetMachO())
return (isDecl || GV->isWeakForLinker()) ? ARM64II::MO_GOT
: ARM64II::MO_NO_FLAG;
return (isDecl || GV->isWeakForLinker()) ? AArch64II::MO_GOT
: AArch64II::MO_NO_FLAG;
else
// No need to go through the GOT for local symbols on ELF.
return GV->hasLocalLinkage() ? ARM64II::MO_NO_FLAG : ARM64II::MO_GOT;
return GV->hasLocalLinkage() ? AArch64II::MO_NO_FLAG : AArch64II::MO_GOT;
}
return ARM64II::MO_NO_FLAG;
return AArch64II::MO_NO_FLAG;
}
/// This function returns the name of a function which has an interface
@ -93,7 +94,7 @@ ARM64Subtarget::ClassifyGlobalReference(const GlobalValue *GV,
/// the current subtarget and it is considered prefereable over
/// memset with zero passed as the second argument. Otherwise it
/// returns null.
const char *ARM64Subtarget::getBZeroEntry() const {
const char *AArch64Subtarget::getBZeroEntry() const {
// Prefer bzero on Darwin only.
if(isTargetDarwin())
return "bzero";
@ -101,7 +102,7 @@ const char *ARM64Subtarget::getBZeroEntry() const {
return nullptr;
}
void ARM64Subtarget::overrideSchedPolicy(MachineSchedPolicy &Policy,
void AArch64Subtarget::overrideSchedPolicy(MachineSchedPolicy &Policy,
MachineInstr *begin, MachineInstr *end,
unsigned NumRegionInstrs) const {
// LNT run (at least on Cyclone) showed reasonably significant gains for
@ -110,6 +111,6 @@ void ARM64Subtarget::overrideSchedPolicy(MachineSchedPolicy &Policy,
Policy.OnlyBottomUp = false;
}
bool ARM64Subtarget::enableEarlyIfConversion() const {
bool AArch64Subtarget::enableEarlyIfConversion() const {
return EnableEarlyIfConvert;
}

View File

@ -1,4 +1,4 @@
//=====---- ARM64Subtarget.h - Define Subtarget for the ARM64 -*- C++ -*--====//
//===--- AArch64Subtarget.h - Define Subtarget for the AArch64 -*- C++ -*--===//
//
// The LLVM Compiler Infrastructure
//
@ -7,25 +7,25 @@
//
//===----------------------------------------------------------------------===//
//
// This file declares the ARM64 specific subclass of TargetSubtarget.
// This file declares the AArch64 specific subclass of TargetSubtarget.
//
//===----------------------------------------------------------------------===//
#ifndef ARM64SUBTARGET_H
#define ARM64SUBTARGET_H
#ifndef AArch64SUBTARGET_H
#define AArch64SUBTARGET_H
#include "llvm/Target/TargetSubtargetInfo.h"
#include "ARM64RegisterInfo.h"
#include "AArch64RegisterInfo.h"
#include <string>
#define GET_SUBTARGETINFO_HEADER
#include "ARM64GenSubtargetInfo.inc"
#include "AArch64GenSubtargetInfo.inc"
namespace llvm {
class GlobalValue;
class StringRef;
class ARM64Subtarget : public ARM64GenSubtargetInfo {
class AArch64Subtarget : public AArch64GenSubtargetInfo {
protected:
enum ARMProcFamilyEnum {Others, CortexA53, CortexA57, Cyclone};
@ -55,7 +55,7 @@ protected:
public:
/// This constructor initializes the data members to match that
/// of the specified triple.
ARM64Subtarget(const std::string &TT, const std::string &CPU,
AArch64Subtarget(const std::string &TT, const std::string &CPU,
const std::string &FS, bool LittleEndian);
bool enableMachineScheduler() const override { return true; }
@ -107,4 +107,4 @@ public:
};
} // End llvm namespace
#endif // ARM64SUBTARGET_H
#endif // AArch64SUBTARGET_H

View File

@ -1,4 +1,4 @@
//===-- ARM64TargetMachine.cpp - Define TargetMachine for ARM64 -----------===//
//===-- AArch64TargetMachine.cpp - Define TargetMachine for AArch64 -------===//
//
// The LLVM Compiler Infrastructure
//
@ -10,8 +10,8 @@
//
//===----------------------------------------------------------------------===//
#include "ARM64.h"
#include "ARM64TargetMachine.h"
#include "AArch64.h"
#include "AArch64TargetMachine.h"
#include "llvm/PassManager.h"
#include "llvm/CodeGen/Passes.h"
#include "llvm/Support/CommandLine.h"
@ -21,28 +21,28 @@
using namespace llvm;
static cl::opt<bool>
EnableCCMP("arm64-ccmp", cl::desc("Enable the CCMP formation pass"),
EnableCCMP("aarch64-ccmp", cl::desc("Enable the CCMP formation pass"),
cl::init(true), cl::Hidden);
static cl::opt<bool>
EnableStPairSuppress("arm64-stp-suppress", cl::desc("Suppress STP for ARM64"),
EnableStPairSuppress("aarch64-stp-suppress", cl::desc("Suppress STP for AArch64"),
cl::init(true), cl::Hidden);
static cl::opt<bool>
EnableAdvSIMDScalar("arm64-simd-scalar", cl::desc("Enable use of AdvSIMD scalar"
EnableAdvSIMDScalar("aarch64-simd-scalar", cl::desc("Enable use of AdvSIMD scalar"
" integer instructions"), cl::init(false), cl::Hidden);
static cl::opt<bool>
EnablePromoteConstant("arm64-promote-const", cl::desc("Enable the promote "
EnablePromoteConstant("aarch64-promote-const", cl::desc("Enable the promote "
"constant pass"), cl::init(true), cl::Hidden);
static cl::opt<bool>
EnableCollectLOH("arm64-collect-loh", cl::desc("Enable the pass that emits the"
EnableCollectLOH("aarch64-collect-loh", cl::desc("Enable the pass that emits the"
" linker optimization hints (LOH)"), cl::init(true),
cl::Hidden);
static cl::opt<bool>
EnableDeadRegisterElimination("arm64-dead-def-elimination", cl::Hidden,
EnableDeadRegisterElimination("aarch64-dead-def-elimination", cl::Hidden,
cl::desc("Enable the pass that removes dead"
" definitons and replaces stores to"
" them with stores to the zero"
@ -50,67 +50,67 @@ EnableDeadRegisterElimination("arm64-dead-def-elimination", cl::Hidden,
cl::init(true));
static cl::opt<bool>
EnableLoadStoreOpt("arm64-load-store-opt", cl::desc("Enable the load/store pair"
EnableLoadStoreOpt("aarch64-load-store-opt", cl::desc("Enable the load/store pair"
" optimization pass"), cl::init(true), cl::Hidden);
extern "C" void LLVMInitializeARM64Target() {
extern "C" void LLVMInitializeAArch64Target() {
// Register the target.
RegisterTargetMachine<ARM64leTargetMachine> X(TheARM64leTarget);
RegisterTargetMachine<ARM64beTargetMachine> Y(TheARM64beTarget);
RegisterTargetMachine<AArch64leTargetMachine> X(TheAArch64leTarget);
RegisterTargetMachine<AArch64beTargetMachine> Y(TheAArch64beTarget);
RegisterTargetMachine<ARM64leTargetMachine> Z(TheAArch64leTarget);
RegisterTargetMachine<ARM64beTargetMachine> W(TheAArch64beTarget);
RegisterTargetMachine<AArch64leTargetMachine> Z(TheARM64leTarget);
RegisterTargetMachine<AArch64beTargetMachine> W(TheARM64beTarget);
}
/// TargetMachine ctor - Create an ARM64 architecture model.
/// TargetMachine ctor - Create an AArch64 architecture model.
///
ARM64TargetMachine::ARM64TargetMachine(const Target &T, StringRef TT,
StringRef CPU, StringRef FS,
const TargetOptions &Options,
Reloc::Model RM, CodeModel::Model CM,
CodeGenOpt::Level OL,
bool LittleEndian)
AArch64TargetMachine::AArch64TargetMachine(const Target &T, StringRef TT,
StringRef CPU, StringRef FS,
const TargetOptions &Options,
Reloc::Model RM, CodeModel::Model CM,
CodeGenOpt::Level OL,
bool LittleEndian)
: LLVMTargetMachine(T, TT, CPU, FS, Options, RM, CM, OL),
Subtarget(TT, CPU, FS, LittleEndian),
// This nested ternary is horrible, but DL needs to be properly initialized
// This nested ternary is horrible, but DL needs to be properly
// initialized
// before TLInfo is constructed.
DL(Subtarget.isTargetMachO() ?
"e-m:o-i64:64-i128:128-n32:64-S128" :
(LittleEndian ?
"e-m:e-i64:64-i128:128-n32:64-S128" :
"E-m:e-i64:64-i128:128-n32:64-S128")),
DL(Subtarget.isTargetMachO()
? "e-m:o-i64:64-i128:128-n32:64-S128"
: (LittleEndian ? "e-m:e-i64:64-i128:128-n32:64-S128"
: "E-m:e-i64:64-i128:128-n32:64-S128")),
InstrInfo(Subtarget), TLInfo(*this), FrameLowering(*this, Subtarget),
TSInfo(*this) {
initAsmInfo();
}
void ARM64leTargetMachine::anchor() { }
void AArch64leTargetMachine::anchor() { }
ARM64leTargetMachine::
ARM64leTargetMachine(const Target &T, StringRef TT,
AArch64leTargetMachine::
AArch64leTargetMachine(const Target &T, StringRef TT,
StringRef CPU, StringRef FS, const TargetOptions &Options,
Reloc::Model RM, CodeModel::Model CM,
CodeGenOpt::Level OL)
: ARM64TargetMachine(T, TT, CPU, FS, Options, RM, CM, OL, true) {}
: AArch64TargetMachine(T, TT, CPU, FS, Options, RM, CM, OL, true) {}
void ARM64beTargetMachine::anchor() { }
void AArch64beTargetMachine::anchor() { }
ARM64beTargetMachine::
ARM64beTargetMachine(const Target &T, StringRef TT,
AArch64beTargetMachine::
AArch64beTargetMachine(const Target &T, StringRef TT,
StringRef CPU, StringRef FS, const TargetOptions &Options,
Reloc::Model RM, CodeModel::Model CM,
CodeGenOpt::Level OL)
: ARM64TargetMachine(T, TT, CPU, FS, Options, RM, CM, OL, false) {}
: AArch64TargetMachine(T, TT, CPU, FS, Options, RM, CM, OL, false) {}
namespace {
/// ARM64 Code Generator Pass Configuration Options.
class ARM64PassConfig : public TargetPassConfig {
/// AArch64 Code Generator Pass Configuration Options.
class AArch64PassConfig : public TargetPassConfig {
public:
ARM64PassConfig(ARM64TargetMachine *TM, PassManagerBase &PM)
AArch64PassConfig(AArch64TargetMachine *TM, PassManagerBase &PM)
: TargetPassConfig(TM, PM) {}
ARM64TargetMachine &getARM64TargetMachine() const {
return getTM<ARM64TargetMachine>();
AArch64TargetMachine &getAArch64TargetMachine() const {
return getTM<AArch64TargetMachine>();
}
bool addPreISel() override;
@ -123,28 +123,28 @@ public:
};
} // namespace
void ARM64TargetMachine::addAnalysisPasses(PassManagerBase &PM) {
// Add first the target-independent BasicTTI pass, then our ARM64 pass. This
// allows the ARM64 pass to delegate to the target independent layer when
void AArch64TargetMachine::addAnalysisPasses(PassManagerBase &PM) {
// Add first the target-independent BasicTTI pass, then our AArch64 pass. This
// allows the AArch64 pass to delegate to the target independent layer when
// appropriate.
PM.add(createBasicTargetTransformInfoPass(this));
PM.add(createARM64TargetTransformInfoPass(this));
PM.add(createAArch64TargetTransformInfoPass(this));
}
TargetPassConfig *ARM64TargetMachine::createPassConfig(PassManagerBase &PM) {
return new ARM64PassConfig(this, PM);
TargetPassConfig *AArch64TargetMachine::createPassConfig(PassManagerBase &PM) {
return new AArch64PassConfig(this, PM);
}
// Pass Pipeline Configuration
bool ARM64PassConfig::addPreISel() {
bool AArch64PassConfig::addPreISel() {
// Run promote constant before global merge, so that the promoted constants
// get a chance to be merged
if (TM->getOptLevel() != CodeGenOpt::None && EnablePromoteConstant)
addPass(createARM64PromoteConstantPass());
addPass(createAArch64PromoteConstantPass());
if (TM->getOptLevel() != CodeGenOpt::None)
addPass(createGlobalMergePass(TM));
if (TM->getOptLevel() != CodeGenOpt::None)
addPass(createARM64AddressTypePromotionPass());
addPass(createAArch64AddressTypePromotionPass());
// Always expand atomic operations, we don't deal with atomicrmw or cmpxchg
// ourselves.
@ -153,56 +153,56 @@ bool ARM64PassConfig::addPreISel() {
return false;
}
bool ARM64PassConfig::addInstSelector() {
addPass(createARM64ISelDag(getARM64TargetMachine(), getOptLevel()));
bool AArch64PassConfig::addInstSelector() {
addPass(createAArch64ISelDag(getAArch64TargetMachine(), getOptLevel()));
// For ELF, cleanup any local-dynamic TLS accesses (i.e. combine as many
// references to _TLS_MODULE_BASE_ as possible.
if (TM->getSubtarget<ARM64Subtarget>().isTargetELF() &&
if (TM->getSubtarget<AArch64Subtarget>().isTargetELF() &&
getOptLevel() != CodeGenOpt::None)
addPass(createARM64CleanupLocalDynamicTLSPass());
addPass(createAArch64CleanupLocalDynamicTLSPass());
return false;
}
bool ARM64PassConfig::addILPOpts() {
bool AArch64PassConfig::addILPOpts() {
if (EnableCCMP)
addPass(createARM64ConditionalCompares());
addPass(createAArch64ConditionalCompares());
addPass(&EarlyIfConverterID);
if (EnableStPairSuppress)
addPass(createARM64StorePairSuppressPass());
addPass(createAArch64StorePairSuppressPass());
return true;
}
bool ARM64PassConfig::addPreRegAlloc() {
bool AArch64PassConfig::addPreRegAlloc() {
// Use AdvSIMD scalar instructions whenever profitable.
if (TM->getOptLevel() != CodeGenOpt::None && EnableAdvSIMDScalar)
addPass(createARM64AdvSIMDScalar());
addPass(createAArch64AdvSIMDScalar());
return true;
}
bool ARM64PassConfig::addPostRegAlloc() {
bool AArch64PassConfig::addPostRegAlloc() {
// Change dead register definitions to refer to the zero register.
if (TM->getOptLevel() != CodeGenOpt::None && EnableDeadRegisterElimination)
addPass(createARM64DeadRegisterDefinitions());
addPass(createAArch64DeadRegisterDefinitions());
return true;
}
bool ARM64PassConfig::addPreSched2() {
bool AArch64PassConfig::addPreSched2() {
// Expand some pseudo instructions to allow proper scheduling.
addPass(createARM64ExpandPseudoPass());
addPass(createAArch64ExpandPseudoPass());
// Use load/store pair instructions when possible.
if (TM->getOptLevel() != CodeGenOpt::None && EnableLoadStoreOpt)
addPass(createARM64LoadStoreOptimizationPass());
addPass(createAArch64LoadStoreOptimizationPass());
return true;
}
bool ARM64PassConfig::addPreEmitPass() {
bool AArch64PassConfig::addPreEmitPass() {
// Relax conditional branch instructions if they're otherwise out of
// range of their destination.
addPass(createARM64BranchRelaxation());
addPass(createAArch64BranchRelaxation());
if (TM->getOptLevel() != CodeGenOpt::None && EnableCollectLOH &&
TM->getSubtarget<ARM64Subtarget>().isTargetMachO())
addPass(createARM64CollectLOHPass());
TM->getSubtarget<AArch64Subtarget>().isTargetMachO())
addPass(createAArch64CollectLOHPass());
return true;
}

View File

@ -0,0 +1,94 @@
//==-- AArch64TargetMachine.h - Define TargetMachine for AArch64 -*- C++ -*-==//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// This file declares the AArch64 specific subclass of TargetMachine.
//
//===----------------------------------------------------------------------===//
#ifndef AArch64TARGETMACHINE_H
#define AArch64TARGETMACHINE_H
#include "AArch64InstrInfo.h"
#include "AArch64ISelLowering.h"
#include "AArch64Subtarget.h"
#include "AArch64FrameLowering.h"
#include "AArch64SelectionDAGInfo.h"
#include "llvm/IR/DataLayout.h"
#include "llvm/Target/TargetMachine.h"
#include "llvm/MC/MCStreamer.h"
namespace llvm {
class AArch64TargetMachine : public LLVMTargetMachine {
protected:
AArch64Subtarget Subtarget;
private:
const DataLayout DL;
AArch64InstrInfo InstrInfo;
AArch64TargetLowering TLInfo;
AArch64FrameLowering FrameLowering;
AArch64SelectionDAGInfo TSInfo;
public:
AArch64TargetMachine(const Target &T, StringRef TT, StringRef CPU,
StringRef FS, const TargetOptions &Options,
Reloc::Model RM, CodeModel::Model CM,
CodeGenOpt::Level OL, bool IsLittleEndian);
const AArch64Subtarget *getSubtargetImpl() const override {
return &Subtarget;
}
const AArch64TargetLowering *getTargetLowering() const override {
return &TLInfo;
}
const DataLayout *getDataLayout() const override { return &DL; }
const AArch64FrameLowering *getFrameLowering() const override {
return &FrameLowering;
}
const AArch64InstrInfo *getInstrInfo() const override { return &InstrInfo; }
const AArch64RegisterInfo *getRegisterInfo() const override {
return &InstrInfo.getRegisterInfo();
}
const AArch64SelectionDAGInfo *getSelectionDAGInfo() const override {
return &TSInfo;
}
// Pass Pipeline Configuration
TargetPassConfig *createPassConfig(PassManagerBase &PM) override;
/// \brief Register AArch64 analysis passes with a pass manager.
void addAnalysisPasses(PassManagerBase &PM) override;
};
// AArch64leTargetMachine - AArch64 little endian target machine.
//
class AArch64leTargetMachine : public AArch64TargetMachine {
virtual void anchor();
public:
AArch64leTargetMachine(const Target &T, StringRef TT, StringRef CPU,
StringRef FS, const TargetOptions &Options,
Reloc::Model RM, CodeModel::Model CM,
CodeGenOpt::Level OL);
};
// AArch64beTargetMachine - AArch64 big endian target machine.
//
class AArch64beTargetMachine : public AArch64TargetMachine {
virtual void anchor();
public:
AArch64beTargetMachine(const Target &T, StringRef TT, StringRef CPU,
StringRef FS, const TargetOptions &Options,
Reloc::Model RM, CodeModel::Model CM,
CodeGenOpt::Level OL);
};
} // end namespace llvm
#endif

View File

@ -1,4 +1,4 @@
//===-- ARM64TargetObjectFile.cpp - ARM64 Object Info ---------------------===//
//===-- AArch64TargetObjectFile.cpp - AArch64 Object Info -----------------===//
//
// The LLVM Compiler Infrastructure
//
@ -7,8 +7,8 @@
//
//===----------------------------------------------------------------------===//
#include "ARM64TargetObjectFile.h"
#include "ARM64TargetMachine.h"
#include "AArch64TargetObjectFile.h"
#include "AArch64TargetMachine.h"
#include "llvm/IR/Mangler.h"
#include "llvm/MC/MCContext.h"
#include "llvm/MC/MCExpr.h"
@ -17,13 +17,13 @@
using namespace llvm;
using namespace dwarf;
void ARM64_ELFTargetObjectFile::Initialize(MCContext &Ctx,
const TargetMachine &TM) {
void AArch64_ELFTargetObjectFile::Initialize(MCContext &Ctx,
const TargetMachine &TM) {
TargetLoweringObjectFileELF::Initialize(Ctx, TM);
InitializeELF(TM.Options.UseInitArray);
}
const MCExpr *ARM64_MachoTargetObjectFile::getTTypeGlobalReference(
const MCExpr *AArch64_MachoTargetObjectFile::getTTypeGlobalReference(
const GlobalValue *GV, unsigned Encoding, Mangler &Mang,
const TargetMachine &TM, MachineModuleInfo *MMI,
MCStreamer &Streamer) const {
@ -45,7 +45,7 @@ const MCExpr *ARM64_MachoTargetObjectFile::getTTypeGlobalReference(
GV, Encoding, Mang, TM, MMI, Streamer);
}
MCSymbol *ARM64_MachoTargetObjectFile::getCFIPersonalitySymbol(
MCSymbol *AArch64_MachoTargetObjectFile::getCFIPersonalitySymbol(
const GlobalValue *GV, Mangler &Mang, const TargetMachine &TM,
MachineModuleInfo *MMI) const {
return TM.getSymbol(GV, Mang);

View File

@ -1,4 +1,4 @@
//===-- ARM64TargetObjectFile.h - ARM64 Object Info -*- C++ -------------*-===//
//===-- AArch64TargetObjectFile.h - AArch64 Object Info -*- C++ ---------*-===//
//
// The LLVM Compiler Infrastructure
//
@ -7,22 +7,22 @@
//
//===----------------------------------------------------------------------===//
#ifndef LLVM_TARGET_ARM64_TARGETOBJECTFILE_H
#define LLVM_TARGET_ARM64_TARGETOBJECTFILE_H
#ifndef LLVM_TARGET_AArch64_TARGETOBJECTFILE_H
#define LLVM_TARGET_AArch64_TARGETOBJECTFILE_H
#include "llvm/CodeGen/TargetLoweringObjectFileImpl.h"
#include "llvm/Target/TargetLoweringObjectFile.h"
namespace llvm {
class ARM64TargetMachine;
class AArch64TargetMachine;
/// This implementation is used for AArch64 ELF targets (Linux in particular).
class ARM64_ELFTargetObjectFile : public TargetLoweringObjectFileELF {
class AArch64_ELFTargetObjectFile : public TargetLoweringObjectFileELF {
void Initialize(MCContext &Ctx, const TargetMachine &TM) override;
};
/// ARM64_MachoTargetObjectFile - This TLOF implementation is used for Darwin.
class ARM64_MachoTargetObjectFile : public TargetLoweringObjectFileMachO {
/// AArch64_MachoTargetObjectFile - This TLOF implementation is used for Darwin.
class AArch64_MachoTargetObjectFile : public TargetLoweringObjectFileMachO {
public:
const MCExpr *getTTypeGlobalReference(const GlobalValue *GV,
unsigned Encoding, Mangler &Mang,

View File

@ -1,4 +1,4 @@
//===-- ARM64TargetTransformInfo.cpp - ARM64 specific TTI pass ------------===//
//===-- AArch64TargetTransformInfo.cpp - AArch64 specific TTI pass --------===//
//
// The LLVM Compiler Infrastructure
//
@ -8,15 +8,15 @@
//===----------------------------------------------------------------------===//
/// \file
/// This file implements a TargetTransformInfo analysis pass specific to the
/// ARM64 target machine. It uses the target's detailed information to provide
/// AArch64 target machine. It uses the target's detailed information to provide
/// more precise answers to certain TTI queries, while letting the target
/// independent and default TTI implementations handle the rest.
///
//===----------------------------------------------------------------------===//
#include "ARM64.h"
#include "ARM64TargetMachine.h"
#include "MCTargetDesc/ARM64AddressingModes.h"
#include "AArch64.h"
#include "AArch64TargetMachine.h"
#include "MCTargetDesc/AArch64AddressingModes.h"
#include "llvm/Analysis/TargetTransformInfo.h"
#include "llvm/Support/Debug.h"
#include "llvm/Target/CostTable.h"
@ -24,35 +24,35 @@
#include <algorithm>
using namespace llvm;
#define DEBUG_TYPE "arm64tti"
#define DEBUG_TYPE "aarch64tti"
// Declare the pass initialization routine locally as target-specific passes
// don't have a target-wide initialization entry point, and so we rely on the
// pass constructor initialization.
namespace llvm {
void initializeARM64TTIPass(PassRegistry &);
void initializeAArch64TTIPass(PassRegistry &);
}
namespace {
class ARM64TTI final : public ImmutablePass, public TargetTransformInfo {
const ARM64TargetMachine *TM;
const ARM64Subtarget *ST;
const ARM64TargetLowering *TLI;
class AArch64TTI final : public ImmutablePass, public TargetTransformInfo {
const AArch64TargetMachine *TM;
const AArch64Subtarget *ST;
const AArch64TargetLowering *TLI;
/// Estimate the overhead of scalarizing an instruction. Insert and Extract
/// are set if the result needs to be inserted and/or extracted from vectors.
unsigned getScalarizationOverhead(Type *Ty, bool Insert, bool Extract) const;
public:
ARM64TTI() : ImmutablePass(ID), TM(nullptr), ST(nullptr), TLI(nullptr) {
AArch64TTI() : ImmutablePass(ID), TM(nullptr), ST(nullptr), TLI(nullptr) {
llvm_unreachable("This pass cannot be directly constructed");
}
ARM64TTI(const ARM64TargetMachine *TM)
AArch64TTI(const AArch64TargetMachine *TM)
: ImmutablePass(ID), TM(TM), ST(TM->getSubtargetImpl()),
TLI(TM->getTargetLowering()) {
initializeARM64TTIPass(*PassRegistry::getPassRegistry());
initializeAArch64TTIPass(*PassRegistry::getPassRegistry());
}
void initializePass() override { pushTTIStack(this); }
@ -129,21 +129,21 @@ public:
} // end anonymous namespace
INITIALIZE_AG_PASS(ARM64TTI, TargetTransformInfo, "arm64tti",
"ARM64 Target Transform Info", true, true, false)
char ARM64TTI::ID = 0;
INITIALIZE_AG_PASS(AArch64TTI, TargetTransformInfo, "aarch64tti",
"AArch64 Target Transform Info", true, true, false)
char AArch64TTI::ID = 0;
ImmutablePass *
llvm::createARM64TargetTransformInfoPass(const ARM64TargetMachine *TM) {
return new ARM64TTI(TM);
llvm::createAArch64TargetTransformInfoPass(const AArch64TargetMachine *TM) {
return new AArch64TTI(TM);
}
/// \brief Calculate the cost of materializing a 64-bit value. This helper
/// method might only calculate a fraction of a larger immediate. Therefore it
/// is valid to return a cost of ZERO.
unsigned ARM64TTI::getIntImmCost(int64_t Val) const {
unsigned AArch64TTI::getIntImmCost(int64_t Val) const {
// Check if the immediate can be encoded within an instruction.
if (Val == 0 || ARM64_AM::isLogicalImmediate(Val, 64))
if (Val == 0 || AArch64_AM::isLogicalImmediate(Val, 64))
return 0;
if (Val < 0)
@ -155,7 +155,7 @@ unsigned ARM64TTI::getIntImmCost(int64_t Val) const {
}
/// \brief Calculate the cost of materializing the given constant.
unsigned ARM64TTI::getIntImmCost(const APInt &Imm, Type *Ty) const {
unsigned AArch64TTI::getIntImmCost(const APInt &Imm, Type *Ty) const {
assert(Ty->isIntegerTy());
unsigned BitSize = Ty->getPrimitiveSizeInBits();
@ -179,7 +179,7 @@ unsigned ARM64TTI::getIntImmCost(const APInt &Imm, Type *Ty) const {
return std::max(1U, Cost);
}
unsigned ARM64TTI::getIntImmCost(unsigned Opcode, unsigned Idx,
unsigned AArch64TTI::getIntImmCost(unsigned Opcode, unsigned Idx,
const APInt &Imm, Type *Ty) const {
assert(Ty->isIntegerTy());
@ -237,14 +237,14 @@ unsigned ARM64TTI::getIntImmCost(unsigned Opcode, unsigned Idx,
if (Idx == ImmIdx) {
unsigned NumConstants = (BitSize + 63) / 64;
unsigned Cost = ARM64TTI::getIntImmCost(Imm, Ty);
unsigned Cost = AArch64TTI::getIntImmCost(Imm, Ty);
return (Cost <= NumConstants * TCC_Basic)
? static_cast<unsigned>(TCC_Free) : Cost;
}
return ARM64TTI::getIntImmCost(Imm, Ty);
return AArch64TTI::getIntImmCost(Imm, Ty);
}
unsigned ARM64TTI::getIntImmCost(Intrinsic::ID IID, unsigned Idx,
unsigned AArch64TTI::getIntImmCost(Intrinsic::ID IID, unsigned Idx,
const APInt &Imm, Type *Ty) const {
assert(Ty->isIntegerTy());
@ -265,7 +265,7 @@ unsigned ARM64TTI::getIntImmCost(Intrinsic::ID IID, unsigned Idx,
case Intrinsic::umul_with_overflow:
if (Idx == 1) {
unsigned NumConstants = (BitSize + 63) / 64;
unsigned Cost = ARM64TTI::getIntImmCost(Imm, Ty);
unsigned Cost = AArch64TTI::getIntImmCost(Imm, Ty);
return (Cost <= NumConstants * TCC_Basic)
? static_cast<unsigned>(TCC_Free) : Cost;
}
@ -280,18 +280,19 @@ unsigned ARM64TTI::getIntImmCost(Intrinsic::ID IID, unsigned Idx,
return TCC_Free;
break;
}
return ARM64TTI::getIntImmCost(Imm, Ty);
return AArch64TTI::getIntImmCost(Imm, Ty);
}
ARM64TTI::PopcntSupportKind ARM64TTI::getPopcntSupport(unsigned TyWidth) const {
AArch64TTI::PopcntSupportKind
AArch64TTI::getPopcntSupport(unsigned TyWidth) const {
assert(isPowerOf2_32(TyWidth) && "Ty width must be power of 2");
if (TyWidth == 32 || TyWidth == 64)
return PSK_FastHardware;
// TODO: ARM64TargetLowering::LowerCTPOP() supports 128bit popcount.
// TODO: AArch64TargetLowering::LowerCTPOP() supports 128bit popcount.
return PSK_Software;
}
unsigned ARM64TTI::getCastInstrCost(unsigned Opcode, Type *Dst,
unsigned AArch64TTI::getCastInstrCost(unsigned Opcode, Type *Dst,
Type *Src) const {
int ISD = TLI->InstructionOpcodeToISD(Opcode);
assert(ISD && "Invalid opcode");
@ -338,7 +339,7 @@ unsigned ARM64TTI::getCastInstrCost(unsigned Opcode, Type *Dst,
return TargetTransformInfo::getCastInstrCost(Opcode, Dst, Src);
}
unsigned ARM64TTI::getVectorInstrCost(unsigned Opcode, Type *Val,
unsigned AArch64TTI::getVectorInstrCost(unsigned Opcode, Type *Val,
unsigned Index) const {
assert(Val->isVectorTy() && "This must be a vector type");
@ -363,7 +364,7 @@ unsigned ARM64TTI::getVectorInstrCost(unsigned Opcode, Type *Val,
return 2;
}
unsigned ARM64TTI::getArithmeticInstrCost(unsigned Opcode, Type *Ty,
unsigned AArch64TTI::getArithmeticInstrCost(unsigned Opcode, Type *Ty,
OperandValueKind Opd1Info,
OperandValueKind Opd2Info) const {
// Legalize the type.
@ -386,7 +387,7 @@ unsigned ARM64TTI::getArithmeticInstrCost(unsigned Opcode, Type *Ty,
}
}
unsigned ARM64TTI::getAddressComputationCost(Type *Ty, bool IsComplex) const {
unsigned AArch64TTI::getAddressComputationCost(Type *Ty, bool IsComplex) const {
// Address computations in vectorized code with non-consecutive addresses will
// likely result in more instructions compared to scalar code where the
// computation can more often be merged into the index mode. The resulting
@ -401,7 +402,7 @@ unsigned ARM64TTI::getAddressComputationCost(Type *Ty, bool IsComplex) const {
return 1;
}
unsigned ARM64TTI::getCmpSelInstrCost(unsigned Opcode, Type *ValTy,
unsigned AArch64TTI::getCmpSelInstrCost(unsigned Opcode, Type *ValTy,
Type *CondTy) const {
int ISD = TLI->InstructionOpcodeToISD(Opcode);
@ -432,7 +433,7 @@ unsigned ARM64TTI::getCmpSelInstrCost(unsigned Opcode, Type *ValTy,
return TargetTransformInfo::getCmpSelInstrCost(Opcode, ValTy, CondTy);
}
unsigned ARM64TTI::getMemoryOpCost(unsigned Opcode, Type *Src,
unsigned AArch64TTI::getMemoryOpCost(unsigned Opcode, Type *Src,
unsigned Alignment,
unsigned AddressSpace) const {
std::pair<unsigned, MVT> LT = TLI->getTypeLegalizationCost(Src);

View File

@ -1,6 +1,6 @@
include_directories( ${CMAKE_CURRENT_BINARY_DIR}/.. ${CMAKE_CURRENT_SOURCE_DIR}/.. )
add_llvm_library(LLVMARM64AsmParser
ARM64AsmParser.cpp
add_llvm_library(LLVMAArch64AsmParser
AArch64AsmParser.cpp
)

View File

@ -1,4 +1,4 @@
;===- ./lib/Target/ARM64/AsmParser/LLVMBuild.txt ---------------*- Conf -*--===;
;===- ./lib/Target/AArch64/AsmParser/LLVMBuild.txt ---------------*- Conf -*--===;
;
; The LLVM Compiler Infrastructure
;
@ -17,7 +17,7 @@
[component_0]
type = Library
name = ARM64AsmParser
parent = ARM64
required_libraries = ARM64Desc ARM64Info ARM64Utils MC MCParser Support
add_to_library_groups = ARM64
name = AArch64AsmParser
parent = AArch64
required_libraries = AArch64Desc AArch64Info AArch64Utils MC MCParser Support
add_to_library_groups = AArch64

View File

@ -1,4 +1,4 @@
##===- lib/Target/ARM/AsmParser/Makefile -------------------*- Makefile -*-===##
##===- lib/Target/AArch64/AsmParser/Makefile ---------------*- Makefile -*-===##
#
# The LLVM Compiler Infrastructure
#
@ -7,7 +7,7 @@
#
##===----------------------------------------------------------------------===##
LEVEL = ../../../..
LIBRARYNAME = LLVMARM64AsmParser
LIBRARYNAME = LLVMAArch64AsmParser
# Hack: we need to include 'main' ARM target directory to grab private headers
CPP.Flags += -I$(PROJ_OBJ_DIR)/.. -I$(PROJ_SRC_DIR)/..

View File

@ -0,0 +1,51 @@
set(LLVM_TARGET_DEFINITIONS AArch64.td)
tablegen(LLVM AArch64GenRegisterInfo.inc -gen-register-info)
tablegen(LLVM AArch64GenInstrInfo.inc -gen-instr-info)
tablegen(LLVM AArch64GenMCCodeEmitter.inc -gen-emitter -mc-emitter)
tablegen(LLVM AArch64GenMCPseudoLowering.inc -gen-pseudo-lowering)
tablegen(LLVM AArch64GenAsmWriter.inc -gen-asm-writer)
tablegen(LLVM AArch64GenAsmWriter1.inc -gen-asm-writer -asmwriternum=1)
tablegen(LLVM AArch64GenAsmMatcher.inc -gen-asm-matcher)
tablegen(LLVM AArch64GenDAGISel.inc -gen-dag-isel)
tablegen(LLVM AArch64GenFastISel.inc -gen-fast-isel)
tablegen(LLVM AArch64GenCallingConv.inc -gen-callingconv)
tablegen(LLVM AArch64GenSubtargetInfo.inc -gen-subtarget)
tablegen(LLVM AArch64GenDisassemblerTables.inc -gen-disassembler)
add_public_tablegen_target(AArch64CommonTableGen)
add_llvm_target(AArch64CodeGen
AArch64AddressTypePromotion.cpp
AArch64AdvSIMDScalarPass.cpp
AArch64AsmPrinter.cpp
AArch64BranchRelaxation.cpp
AArch64CleanupLocalDynamicTLSPass.cpp
AArch64CollectLOH.cpp
AArch64ConditionalCompares.cpp
AArch64DeadRegisterDefinitionsPass.cpp
AArch64ExpandPseudoInsts.cpp
AArch64FastISel.cpp
AArch64FrameLowering.cpp
AArch64ISelDAGToDAG.cpp
AArch64ISelLowering.cpp
AArch64InstrInfo.cpp
AArch64LoadStoreOptimizer.cpp
AArch64MCInstLower.cpp
AArch64PromoteConstant.cpp
AArch64RegisterInfo.cpp
AArch64SelectionDAGInfo.cpp
AArch64StorePairSuppress.cpp
AArch64Subtarget.cpp
AArch64TargetMachine.cpp
AArch64TargetObjectFile.cpp
AArch64TargetTransformInfo.cpp
)
add_dependencies(LLVMAArch64CodeGen intrinsics_gen)
add_subdirectory(TargetInfo)
add_subdirectory(AsmParser)
add_subdirectory(Disassembler)
add_subdirectory(InstPrinter)
add_subdirectory(MCTargetDesc)
add_subdirectory(Utils)

View File

@ -1,4 +1,4 @@
//===- ARM64Disassembler.h - Disassembler for ARM64 -------------*- C++ -*-===//
//===- AArch64Disassembler.h - Disassembler for AArch64 ---------*- C++ -*-===//
//
// The LLVM Compiler Infrastructure
//
@ -10,8 +10,8 @@
//
//===----------------------------------------------------------------------===//
#ifndef ARM64DISASSEMBLER_H
#define ARM64DISASSEMBLER_H
#ifndef AArch64DISASSEMBLER_H
#define AArch64DISASSEMBLER_H
#include "llvm/MC/MCDisassembler.h"
@ -21,12 +21,12 @@ class MCInst;
class MemoryObject;
class raw_ostream;
class ARM64Disassembler : public MCDisassembler {
class AArch64Disassembler : public MCDisassembler {
public:
ARM64Disassembler(const MCSubtargetInfo &STI, MCContext &Ctx)
AArch64Disassembler(const MCSubtargetInfo &STI, MCContext &Ctx)
: MCDisassembler(STI, Ctx) {}
~ARM64Disassembler() {}
~AArch64Disassembler() {}
/// getInstruction - See MCDisassembler.
MCDisassembler::DecodeStatus

View File

@ -1,4 +1,4 @@
//===- ARM64ExternalSymbolizer.cpp - Symbolizer for ARM64 -------*- C++ -*-===//
//===- AArch64ExternalSymbolizer.cpp - Symbolizer for AArch64 ---*- C++ -*-===//
//
// The LLVM Compiler Infrastructure
//
@ -7,10 +7,10 @@
//
//===----------------------------------------------------------------------===//
#include "ARM64ExternalSymbolizer.h"
#include "ARM64Subtarget.h"
#include "MCTargetDesc/ARM64AddressingModes.h"
#include "Utils/ARM64BaseInfo.h"
#include "AArch64ExternalSymbolizer.h"
#include "AArch64Subtarget.h"
#include "MCTargetDesc/AArch64AddressingModes.h"
#include "Utils/AArch64BaseInfo.h"
#include "llvm/MC/MCContext.h"
#include "llvm/MC/MCExpr.h"
#include "llvm/MC/MCInst.h"
@ -19,7 +19,7 @@
using namespace llvm;
#define DEBUG_TYPE "arm64-disassembler"
#define DEBUG_TYPE "aarch64-disassembler"
static MCSymbolRefExpr::VariantKind
getVariant(uint64_t LLVMDisassembler_VariantKind) {
@ -58,14 +58,9 @@ getVariant(uint64_t LLVMDisassembler_VariantKind) {
/// a symbol look up is done to see it is returns a specific reference type
/// to add to the comment stream. This function returns Success if it adds
/// an operand to the MCInst and Fail otherwise.
bool ARM64ExternalSymbolizer::tryAddingSymbolicOperand(
MCInst &MI,
raw_ostream &CommentStream,
int64_t Value,
uint64_t Address,
bool IsBranch,
uint64_t Offset,
uint64_t InstSize) {
bool AArch64ExternalSymbolizer::tryAddingSymbolicOperand(
MCInst &MI, raw_ostream &CommentStream, int64_t Value, uint64_t Address,
bool IsBranch, uint64_t Offset, uint64_t InstSize) {
// FIXME: This method shares a lot of code with
// MCExternalSymbolizer::tryAddingSymbolicOperand. It may be possible
// refactor the MCExternalSymbolizer interface to allow more of this
@ -94,7 +89,7 @@ bool ARM64ExternalSymbolizer::tryAddingSymbolicOperand(
else if (ReferenceType ==
LLVMDisassembler_ReferenceType_Out_Objc_Message)
CommentStream << "Objc message: " << ReferenceName;
} else if (MI.getOpcode() == ARM64::ADRP) {
} else if (MI.getOpcode() == AArch64::ADRP) {
ReferenceType = LLVMDisassembler_ReferenceType_In_ARM64_ADRP;
// otool expects the fully encoded ADRP instruction to be passed in as
// the value here, so reconstruct it:
@ -107,19 +102,19 @@ bool ARM64ExternalSymbolizer::tryAddingSymbolicOperand(
&ReferenceName);
CommentStream << format("0x%llx",
0xfffffffffffff000LL & (Address + Value));
} else if (MI.getOpcode() == ARM64::ADDXri ||
MI.getOpcode() == ARM64::LDRXui ||
MI.getOpcode() == ARM64::LDRXl ||
MI.getOpcode() == ARM64::ADR) {
if (MI.getOpcode() == ARM64::ADDXri)
} else if (MI.getOpcode() == AArch64::ADDXri ||
MI.getOpcode() == AArch64::LDRXui ||
MI.getOpcode() == AArch64::LDRXl ||
MI.getOpcode() == AArch64::ADR) {
if (MI.getOpcode() == AArch64::ADDXri)
ReferenceType = LLVMDisassembler_ReferenceType_In_ARM64_ADDXri;
else if (MI.getOpcode() == ARM64::LDRXui)
else if (MI.getOpcode() == AArch64::LDRXui)
ReferenceType = LLVMDisassembler_ReferenceType_In_ARM64_LDRXui;
if (MI.getOpcode() == ARM64::LDRXl) {
if (MI.getOpcode() == AArch64::LDRXl) {
ReferenceType = LLVMDisassembler_ReferenceType_In_ARM64_LDRXl;
SymbolLookUp(DisInfo, Address + Value, &ReferenceType, Address,
&ReferenceName);
} else if (MI.getOpcode() == ARM64::ADR) {
} else if (MI.getOpcode() == AArch64::ADR) {
ReferenceType = LLVMDisassembler_ReferenceType_In_ARM64_ADR;
SymbolLookUp(DisInfo, Address + Value, &ReferenceType, Address,
&ReferenceName);
@ -128,7 +123,7 @@ bool ARM64ExternalSymbolizer::tryAddingSymbolicOperand(
// otool expects the fully encoded ADD/LDR instruction to be passed in
// as the value here, so reconstruct it:
unsigned EncodedInst =
MI.getOpcode() == ARM64::ADDXri ? 0x91000000: 0xF9400000;
MI.getOpcode() == AArch64::ADDXri ? 0x91000000: 0xF9400000;
EncodedInst |= Value << 10; // imm12 [+ shift:2 for ADD]
EncodedInst |=
MCRI.getEncodingValue(MI.getOperand(1).getReg()) << 5; // Rn

View File

@ -1,4 +1,4 @@
//===- ARM64ExternalSymbolizer.h - Symbolizer for ARM64 ---------*- C++ -*-===//
//===- AArch64ExternalSymbolizer.h - Symbolizer for AArch64 -----*- C++ -*-===//
//
// The LLVM Compiler Infrastructure
//
@ -7,25 +7,26 @@
//
//===----------------------------------------------------------------------===//
//
// Symbolize ARM64 assembly code during disassembly using callbacks.
// Symbolize AArch64 assembly code during disassembly using callbacks.
//
//===----------------------------------------------------------------------===//
#ifndef ARM64EXTERNALSYMBOLIZER_H
#define ARM64EXTERNALSYMBOLIZER_H
#ifndef AArch64EXTERNALSYMBOLIZER_H
#define AArch64EXTERNALSYMBOLIZER_H
#include "llvm/MC/MCExternalSymbolizer.h"
namespace llvm {
class ARM64ExternalSymbolizer : public MCExternalSymbolizer {
class AArch64ExternalSymbolizer : public MCExternalSymbolizer {
public:
ARM64ExternalSymbolizer(MCContext &Ctx,
std::unique_ptr<MCRelocationInfo> RelInfo,
LLVMOpInfoCallback GetOpInfo,
LLVMSymbolLookupCallback SymbolLookUp, void *DisInfo)
: MCExternalSymbolizer(Ctx, std::move(RelInfo), GetOpInfo, SymbolLookUp,
DisInfo) {}
AArch64ExternalSymbolizer(MCContext &Ctx,
std::unique_ptr<MCRelocationInfo> RelInfo,
LLVMOpInfoCallback GetOpInfo,
LLVMSymbolLookupCallback SymbolLookUp,
void *DisInfo)
: MCExternalSymbolizer(Ctx, std::move(RelInfo), GetOpInfo, SymbolLookUp,
DisInfo) {}
bool tryAddingSymbolicOperand(MCInst &MI, raw_ostream &CommentStream,
int64_t Value, uint64_t Address, bool IsBranch,

View File

@ -1,8 +1,8 @@
include_directories( ${CMAKE_CURRENT_BINARY_DIR}/.. ${CMAKE_CURRENT_SOURCE_DIR}/.. )
add_llvm_library(LLVMARM64Disassembler
ARM64Disassembler.cpp
ARM64ExternalSymbolizer.cpp
add_llvm_library(LLVMAArch64Disassembler
AArch64Disassembler.cpp
AArch64ExternalSymbolizer.cpp
)
# workaround for hanging compilation on MSVC8, 9 and 10
#if( MSVC_VERSION EQUAL 1400 OR MSVC_VERSION EQUAL 1500 OR MSVC_VERSION EQUAL 1600 )
@ -11,4 +11,4 @@ add_llvm_library(LLVMARM64Disassembler
# PROPERTY COMPILE_FLAGS "/Od"
# )
#endif()
add_dependencies(LLVMARM64Disassembler ARM64CommonTableGen)
add_dependencies(LLVMAArch64Disassembler AArch64CommonTableGen)

View File

@ -1,4 +1,4 @@
;===- ./lib/Target/ARM64/Disassembler/LLVMBuild.txt ------------*- Conf -*--===;
;===- ./lib/Target/AArch64/Disassembler/LLVMBuild.txt ------------*- Conf -*--===;
;
; The LLVM Compiler Infrastructure
;
@ -17,7 +17,7 @@
[component_0]
type = Library
name = ARM64Disassembler
parent = ARM64
required_libraries = ARM64Info ARM64Utils MC Support
add_to_library_groups = ARM64
name = AArch64Disassembler
parent = AArch64
required_libraries = AArch64Info AArch64Utils MC Support
add_to_library_groups = AArch64

View File

@ -1,4 +1,4 @@
##===- lib/Target/ARM64/Disassembler/Makefile --------------*- Makefile -*-===##
##===- lib/Target/AArch64/Disassembler/Makefile ------------*- Makefile -*-===##
#
# The LLVM Compiler Infrastructure
#
@ -8,7 +8,7 @@
##===----------------------------------------------------------------------===##
LEVEL = ../../../..
LIBRARYNAME = LLVMARM64Disassembler
LIBRARYNAME = LLVMAArch64Disassembler
# Hack: we need to include 'main' arm target directory to grab private headers
CPPFLAGS = -I$(PROJ_OBJ_DIR)/.. -I$(PROJ_SRC_DIR)/..

File diff suppressed because it is too large Load Diff

View File

@ -1,4 +1,4 @@
//===-- ARM64InstPrinter.h - Convert ARM64 MCInst to assembly syntax ------===//
//===-- AArch64InstPrinter.h - Convert AArch64 MCInst to assembly syntax --===//
//
// The LLVM Compiler Infrastructure
//
@ -7,14 +7,14 @@
//
//===----------------------------------------------------------------------===//
//
// This class prints an ARM64 MCInst to a .s file.
// This class prints an AArch64 MCInst to a .s file.
//
//===----------------------------------------------------------------------===//
#ifndef ARM64INSTPRINTER_H
#define ARM64INSTPRINTER_H
#ifndef AArch64INSTPRINTER_H
#define AArch64INSTPRINTER_H
#include "MCTargetDesc/ARM64MCTargetDesc.h"
#include "MCTargetDesc/AArch64MCTargetDesc.h"
#include "llvm/ADT/StringRef.h"
#include "llvm/MC/MCInstPrinter.h"
#include "llvm/MC/MCSubtargetInfo.h"
@ -23,10 +23,10 @@ namespace llvm {
class MCOperand;
class ARM64InstPrinter : public MCInstPrinter {
class AArch64InstPrinter : public MCInstPrinter {
public:
ARM64InstPrinter(const MCAsmInfo &MAI, const MCInstrInfo &MII,
const MCRegisterInfo &MRI, const MCSubtargetInfo &STI);
AArch64InstPrinter(const MCAsmInfo &MAI, const MCInstrInfo &MII,
const MCRegisterInfo &MRI, const MCSubtargetInfo &STI);
void printInst(const MCInst *MI, raw_ostream &O, StringRef Annot) override;
void printRegName(raw_ostream &OS, unsigned RegNo) const override;
@ -40,7 +40,7 @@ public:
return getRegisterName(RegNo);
}
static const char *getRegisterName(unsigned RegNo,
unsigned AltIdx = ARM64::NoRegAltName);
unsigned AltIdx = AArch64::NoRegAltName);
protected:
bool printSysAlias(const MCInst *MI, raw_ostream &O);
@ -118,9 +118,9 @@ protected:
void printSIMDType10Operand(const MCInst *MI, unsigned OpNum, raw_ostream &O);
};
class ARM64AppleInstPrinter : public ARM64InstPrinter {
class AArch64AppleInstPrinter : public AArch64InstPrinter {
public:
ARM64AppleInstPrinter(const MCAsmInfo &MAI, const MCInstrInfo &MII,
AArch64AppleInstPrinter(const MCAsmInfo &MAI, const MCInstrInfo &MII,
const MCRegisterInfo &MRI, const MCSubtargetInfo &STI);
void printInst(const MCInst *MI, raw_ostream &O, StringRef Annot) override;
@ -133,7 +133,7 @@ public:
return getRegisterName(RegNo);
}
static const char *getRegisterName(unsigned RegNo,
unsigned AltIdx = ARM64::NoRegAltName);
unsigned AltIdx = AArch64::NoRegAltName);
};
}

View File

@ -0,0 +1,7 @@
include_directories( ${CMAKE_CURRENT_BINARY_DIR}/.. ${CMAKE_CURRENT_SOURCE_DIR}/.. )
add_llvm_library(LLVMAArch64AsmPrinter
AArch64InstPrinter.cpp
)
add_dependencies(LLVMAArch64AsmPrinter AArch64CommonTableGen)

View File

@ -1,4 +1,4 @@
;===- ./lib/Target/ARM64/InstPrinter/LLVMBuild.txt -------------*- Conf -*--===;
;===- ./lib/Target/AArch64/InstPrinter/LLVMBuild.txt -------------*- Conf -*--===;
;
; The LLVM Compiler Infrastructure
;
@ -17,8 +17,8 @@
[component_0]
type = Library
name = ARM64AsmPrinter
parent = ARM64
required_libraries = ARM64Utils MC Support
add_to_library_groups = ARM64
name = AArch64AsmPrinter
parent = AArch64
required_libraries = AArch64Utils MC Support
add_to_library_groups = AArch64

View File

@ -1,4 +1,4 @@
##===- lib/Target/ARM64/AsmPrinter/Makefile ----------------*- Makefile -*-===##
##===- lib/Target/AArch64/AsmPrinter/Makefile --------------*- Makefile -*-===##
#
# The LLVM Compiler Infrastructure
#
@ -7,7 +7,7 @@
#
##===----------------------------------------------------------------------===##
LEVEL = ../../../..
LIBRARYNAME = LLVMARM64AsmPrinter
LIBRARYNAME = LLVMAArch64AsmPrinter
# Hack: we need to include 'main' arm target directory to grab private headers
CPP.Flags += -I$(PROJ_OBJ_DIR)/.. -I$(PROJ_SRC_DIR)/..

View File

@ -1,4 +1,4 @@
;===- ./lib/Target/ARM64/LLVMBuild.txt -------------------------*- Conf -*--===;
;===- ./lib/Target/AArch64/LLVMBuild.txt -------------------------*- Conf -*--===;
;
; The LLVM Compiler Infrastructure
;
@ -20,7 +20,7 @@ subdirectories = AsmParser Disassembler InstPrinter MCTargetDesc TargetInfo Util
[component_0]
type = TargetGroup
name = ARM64
name = AArch64
parent = Target
has_asmparser = 1
has_asmprinter = 1
@ -29,7 +29,7 @@ has_jit = 1
[component_1]
type = Library
name = ARM64CodeGen
parent = ARM64
required_libraries = ARM64AsmPrinter ARM64Desc ARM64Info ARM64Utils Analysis AsmPrinter CodeGen Core MC Scalar SelectionDAG Support Target
add_to_library_groups = ARM64
name = AArch64CodeGen
parent = AArch64
required_libraries = AArch64AsmPrinter AArch64Desc AArch64Info AArch64Utils Analysis AsmPrinter CodeGen Core MC Scalar SelectionDAG Support Target
add_to_library_groups = AArch64

View File

@ -1,4 +1,4 @@
//===- ARM64AddressingModes.h - ARM64 Addressing Modes ----------*- C++ -*-===//
//===- AArch64AddressingModes.h - AArch64 Addressing Modes ------*- C++ -*-===//
//
// The LLVM Compiler Infrastructure
//
@ -7,12 +7,12 @@
//
//===----------------------------------------------------------------------===//
//
// This file contains the ARM64 addressing mode implementation stuff.
// This file contains the AArch64 addressing mode implementation stuff.
//
//===----------------------------------------------------------------------===//
#ifndef LLVM_TARGET_ARM64_ARM64ADDRESSINGMODES_H
#define LLVM_TARGET_ARM64_ARM64ADDRESSINGMODES_H
#ifndef LLVM_TARGET_AArch64_AArch64ADDRESSINGMODES_H
#define LLVM_TARGET_AArch64_AArch64ADDRESSINGMODES_H
#include "llvm/ADT/APFloat.h"
#include "llvm/ADT/APInt.h"
@ -22,8 +22,8 @@
namespace llvm {
/// ARM64_AM - ARM64 Addressing Mode Stuff
namespace ARM64_AM {
/// AArch64_AM - AArch64 Addressing Mode Stuff
namespace AArch64_AM {
//===----------------------------------------------------------------------===//
// Shifts
@ -49,35 +49,35 @@ enum ShiftExtendType {
};
/// getShiftName - Get the string encoding for the shift type.
static inline const char *getShiftExtendName(ARM64_AM::ShiftExtendType ST) {
static inline const char *getShiftExtendName(AArch64_AM::ShiftExtendType ST) {
switch (ST) {
default: assert(false && "unhandled shift type!");
case ARM64_AM::LSL: return "lsl";
case ARM64_AM::LSR: return "lsr";
case ARM64_AM::ASR: return "asr";
case ARM64_AM::ROR: return "ror";
case ARM64_AM::MSL: return "msl";
case ARM64_AM::UXTB: return "uxtb";
case ARM64_AM::UXTH: return "uxth";
case ARM64_AM::UXTW: return "uxtw";
case ARM64_AM::UXTX: return "uxtx";
case ARM64_AM::SXTB: return "sxtb";
case ARM64_AM::SXTH: return "sxth";
case ARM64_AM::SXTW: return "sxtw";
case ARM64_AM::SXTX: return "sxtx";
case AArch64_AM::LSL: return "lsl";
case AArch64_AM::LSR: return "lsr";
case AArch64_AM::ASR: return "asr";
case AArch64_AM::ROR: return "ror";
case AArch64_AM::MSL: return "msl";
case AArch64_AM::UXTB: return "uxtb";
case AArch64_AM::UXTH: return "uxth";
case AArch64_AM::UXTW: return "uxtw";
case AArch64_AM::UXTX: return "uxtx";
case AArch64_AM::SXTB: return "sxtb";
case AArch64_AM::SXTH: return "sxth";
case AArch64_AM::SXTW: return "sxtw";
case AArch64_AM::SXTX: return "sxtx";
}
return nullptr;
}
/// getShiftType - Extract the shift type.
static inline ARM64_AM::ShiftExtendType getShiftType(unsigned Imm) {
static inline AArch64_AM::ShiftExtendType getShiftType(unsigned Imm) {
switch ((Imm >> 6) & 0x7) {
default: return ARM64_AM::InvalidShiftExtend;
case 0: return ARM64_AM::LSL;
case 1: return ARM64_AM::LSR;
case 2: return ARM64_AM::ASR;
case 3: return ARM64_AM::ROR;
case 4: return ARM64_AM::MSL;
default: return AArch64_AM::InvalidShiftExtend;
case 0: return AArch64_AM::LSL;
case 1: return AArch64_AM::LSR;
case 2: return AArch64_AM::ASR;
case 3: return AArch64_AM::ROR;
case 4: return AArch64_AM::MSL;
}
}
@ -95,17 +95,17 @@ static inline unsigned getShiftValue(unsigned Imm) {
/// 100 ==> msl
/// {8-6} = shifter
/// {5-0} = imm
static inline unsigned getShifterImm(ARM64_AM::ShiftExtendType ST,
static inline unsigned getShifterImm(AArch64_AM::ShiftExtendType ST,
unsigned Imm) {
assert((Imm & 0x3f) == Imm && "Illegal shifted immedate value!");
unsigned STEnc = 0;
switch (ST) {
default: llvm_unreachable("Invalid shift requested");
case ARM64_AM::LSL: STEnc = 0; break;
case ARM64_AM::LSR: STEnc = 1; break;
case ARM64_AM::ASR: STEnc = 2; break;
case ARM64_AM::ROR: STEnc = 3; break;
case ARM64_AM::MSL: STEnc = 4; break;
case AArch64_AM::LSL: STEnc = 0; break;
case AArch64_AM::LSR: STEnc = 1; break;
case AArch64_AM::ASR: STEnc = 2; break;
case AArch64_AM::ROR: STEnc = 3; break;
case AArch64_AM::MSL: STEnc = 4; break;
}
return (STEnc << 6) | (Imm & 0x3f);
}
@ -120,22 +120,22 @@ static inline unsigned getArithShiftValue(unsigned Imm) {
}
/// getExtendType - Extract the extend type for operands of arithmetic ops.
static inline ARM64_AM::ShiftExtendType getExtendType(unsigned Imm) {
static inline AArch64_AM::ShiftExtendType getExtendType(unsigned Imm) {
assert((Imm & 0x7) == Imm && "invalid immediate!");
switch (Imm) {
default: llvm_unreachable("Compiler bug!");
case 0: return ARM64_AM::UXTB;
case 1: return ARM64_AM::UXTH;
case 2: return ARM64_AM::UXTW;
case 3: return ARM64_AM::UXTX;
case 4: return ARM64_AM::SXTB;
case 5: return ARM64_AM::SXTH;
case 6: return ARM64_AM::SXTW;
case 7: return ARM64_AM::SXTX;
case 0: return AArch64_AM::UXTB;
case 1: return AArch64_AM::UXTH;
case 2: return AArch64_AM::UXTW;
case 3: return AArch64_AM::UXTX;
case 4: return AArch64_AM::SXTB;
case 5: return AArch64_AM::SXTH;
case 6: return AArch64_AM::SXTW;
case 7: return AArch64_AM::SXTX;
}
}
static inline ARM64_AM::ShiftExtendType getArithExtendType(unsigned Imm) {
static inline AArch64_AM::ShiftExtendType getArithExtendType(unsigned Imm) {
return getExtendType((Imm >> 3) & 0x7);
}
@ -148,17 +148,17 @@ static inline ARM64_AM::ShiftExtendType getArithExtendType(unsigned Imm) {
/// 101 ==> sxth
/// 110 ==> sxtw
/// 111 ==> sxtx
inline unsigned getExtendEncoding(ARM64_AM::ShiftExtendType ET) {
inline unsigned getExtendEncoding(AArch64_AM::ShiftExtendType ET) {
switch (ET) {
default: llvm_unreachable("Invalid extend type requested");
case ARM64_AM::UXTB: return 0; break;
case ARM64_AM::UXTH: return 1; break;
case ARM64_AM::UXTW: return 2; break;
case ARM64_AM::UXTX: return 3; break;
case ARM64_AM::SXTB: return 4; break;
case ARM64_AM::SXTH: return 5; break;
case ARM64_AM::SXTW: return 6; break;
case ARM64_AM::SXTX: return 7; break;
case AArch64_AM::UXTB: return 0; break;
case AArch64_AM::UXTH: return 1; break;
case AArch64_AM::UXTW: return 2; break;
case AArch64_AM::UXTX: return 3; break;
case AArch64_AM::SXTB: return 4; break;
case AArch64_AM::SXTH: return 5; break;
case AArch64_AM::SXTW: return 6; break;
case AArch64_AM::SXTX: return 7; break;
}
}
@ -167,7 +167,7 @@ inline unsigned getExtendEncoding(ARM64_AM::ShiftExtendType ET) {
/// imm: 3-bit extend amount
/// {5-3} = shifter
/// {2-0} = imm3
static inline unsigned getArithExtendImm(ARM64_AM::ShiftExtendType ET,
static inline unsigned getArithExtendImm(AArch64_AM::ShiftExtendType ET,
unsigned Imm) {
assert((Imm & 0x7) == Imm && "Illegal shifted immedate value!");
return (getExtendEncoding(ET) << 3) | (Imm & 0x7);
@ -181,7 +181,7 @@ static inline bool getMemDoShift(unsigned Imm) {
/// getExtendType - Extract the extend type for the offset operand of
/// loads/stores.
static inline ARM64_AM::ShiftExtendType getMemExtendType(unsigned Imm) {
static inline AArch64_AM::ShiftExtendType getMemExtendType(unsigned Imm) {
return getExtendType((Imm >> 1) & 0x7);
}
@ -197,7 +197,7 @@ static inline ARM64_AM::ShiftExtendType getMemExtendType(unsigned Imm) {
/// 111 ==> sxtx
/// {3-1} = shifter
/// {0} = doshift
static inline unsigned getMemExtendImm(ARM64_AM::ShiftExtendType ET,
static inline unsigned getMemExtendImm(AArch64_AM::ShiftExtendType ET,
bool DoShift) {
return (getExtendEncoding(ET) << 1) | unsigned(DoShift);
}
@ -731,7 +731,7 @@ static inline uint64_t decodeAdvSIMDModImmType12(uint8_t Imm) {
return (EncVal << 32) | EncVal;
}
} // end namespace ARM64_AM
} // end namespace AArch64_AM
} // end namespace llvm

View File

@ -1,4 +1,4 @@
//===-- ARM64AsmBackend.cpp - ARM64 Assembler Backend ---------------------===//
//===-- AArch64AsmBackend.cpp - AArch64 Assembler Backend -----------------===//
//
// The LLVM Compiler Infrastructure
//
@ -7,9 +7,9 @@
//
//===----------------------------------------------------------------------===//
#include "ARM64.h"
#include "ARM64RegisterInfo.h"
#include "MCTargetDesc/ARM64FixupKinds.h"
#include "AArch64.h"
#include "AArch64RegisterInfo.h"
#include "MCTargetDesc/AArch64FixupKinds.h"
#include "llvm/ADT/Triple.h"
#include "llvm/MC/MCAsmBackend.h"
#include "llvm/MC/MCDirectives.h"
@ -23,38 +23,38 @@ using namespace llvm;
namespace {
class ARM64AsmBackend : public MCAsmBackend {
class AArch64AsmBackend : public MCAsmBackend {
static const unsigned PCRelFlagVal =
MCFixupKindInfo::FKF_IsAlignedDownTo32Bits | MCFixupKindInfo::FKF_IsPCRel;
public:
ARM64AsmBackend(const Target &T) : MCAsmBackend() {}
AArch64AsmBackend(const Target &T) : MCAsmBackend() {}
unsigned getNumFixupKinds() const override {
return ARM64::NumTargetFixupKinds;
return AArch64::NumTargetFixupKinds;
}
const MCFixupKindInfo &getFixupKindInfo(MCFixupKind Kind) const override {
const static MCFixupKindInfo Infos[ARM64::NumTargetFixupKinds] = {
const static MCFixupKindInfo Infos[AArch64::NumTargetFixupKinds] = {
// This table *must* be in the order that the fixup_* kinds are defined in
// ARM64FixupKinds.h.
// AArch64FixupKinds.h.
//
// Name Offset (bits) Size (bits) Flags
{ "fixup_arm64_pcrel_adr_imm21", 0, 32, PCRelFlagVal },
{ "fixup_arm64_pcrel_adrp_imm21", 0, 32, PCRelFlagVal },
{ "fixup_arm64_add_imm12", 10, 12, 0 },
{ "fixup_arm64_ldst_imm12_scale1", 10, 12, 0 },
{ "fixup_arm64_ldst_imm12_scale2", 10, 12, 0 },
{ "fixup_arm64_ldst_imm12_scale4", 10, 12, 0 },
{ "fixup_arm64_ldst_imm12_scale8", 10, 12, 0 },
{ "fixup_arm64_ldst_imm12_scale16", 10, 12, 0 },
{ "fixup_arm64_ldr_pcrel_imm19", 5, 19, PCRelFlagVal },
{ "fixup_arm64_movw", 5, 16, 0 },
{ "fixup_arm64_pcrel_branch14", 5, 14, PCRelFlagVal },
{ "fixup_arm64_pcrel_branch19", 5, 19, PCRelFlagVal },
{ "fixup_arm64_pcrel_branch26", 0, 26, PCRelFlagVal },
{ "fixup_arm64_pcrel_call26", 0, 26, PCRelFlagVal },
{ "fixup_arm64_tlsdesc_call", 0, 0, 0 }
{ "fixup_aarch64_pcrel_adr_imm21", 0, 32, PCRelFlagVal },
{ "fixup_aarch64_pcrel_adrp_imm21", 0, 32, PCRelFlagVal },
{ "fixup_aarch64_add_imm12", 10, 12, 0 },
{ "fixup_aarch64_ldst_imm12_scale1", 10, 12, 0 },
{ "fixup_aarch64_ldst_imm12_scale2", 10, 12, 0 },
{ "fixup_aarch64_ldst_imm12_scale4", 10, 12, 0 },
{ "fixup_aarch64_ldst_imm12_scale8", 10, 12, 0 },
{ "fixup_aarch64_ldst_imm12_scale16", 10, 12, 0 },
{ "fixup_aarch64_ldr_pcrel_imm19", 5, 19, PCRelFlagVal },
{ "fixup_aarch64_movw", 5, 16, 0 },
{ "fixup_aarch64_pcrel_branch14", 5, 14, PCRelFlagVal },
{ "fixup_aarch64_pcrel_branch19", 5, 19, PCRelFlagVal },
{ "fixup_aarch64_pcrel_branch26", 0, 26, PCRelFlagVal },
{ "fixup_aarch64_pcrel_call26", 0, 26, PCRelFlagVal },
{ "fixup_aarch64_tlsdesc_call", 0, 0, 0 }
};
if (Kind < FirstTargetFixupKind)
@ -88,31 +88,31 @@ static unsigned getFixupKindNumBytes(unsigned Kind) {
default:
assert(0 && "Unknown fixup kind!");
case ARM64::fixup_arm64_tlsdesc_call:
case AArch64::fixup_aarch64_tlsdesc_call:
return 0;
case FK_Data_1:
return 1;
case FK_Data_2:
case ARM64::fixup_arm64_movw:
case AArch64::fixup_aarch64_movw:
return 2;
case ARM64::fixup_arm64_pcrel_branch14:
case ARM64::fixup_arm64_add_imm12:
case ARM64::fixup_arm64_ldst_imm12_scale1:
case ARM64::fixup_arm64_ldst_imm12_scale2:
case ARM64::fixup_arm64_ldst_imm12_scale4:
case ARM64::fixup_arm64_ldst_imm12_scale8:
case ARM64::fixup_arm64_ldst_imm12_scale16:
case ARM64::fixup_arm64_ldr_pcrel_imm19:
case ARM64::fixup_arm64_pcrel_branch19:
case AArch64::fixup_aarch64_pcrel_branch14:
case AArch64::fixup_aarch64_add_imm12:
case AArch64::fixup_aarch64_ldst_imm12_scale1:
case AArch64::fixup_aarch64_ldst_imm12_scale2:
case AArch64::fixup_aarch64_ldst_imm12_scale4:
case AArch64::fixup_aarch64_ldst_imm12_scale8:
case AArch64::fixup_aarch64_ldst_imm12_scale16:
case AArch64::fixup_aarch64_ldr_pcrel_imm19:
case AArch64::fixup_aarch64_pcrel_branch19:
return 3;
case ARM64::fixup_arm64_pcrel_adr_imm21:
case ARM64::fixup_arm64_pcrel_adrp_imm21:
case ARM64::fixup_arm64_pcrel_branch26:
case ARM64::fixup_arm64_pcrel_call26:
case AArch64::fixup_aarch64_pcrel_adr_imm21:
case AArch64::fixup_aarch64_pcrel_adrp_imm21:
case AArch64::fixup_aarch64_pcrel_branch26:
case AArch64::fixup_aarch64_pcrel_call26:
case FK_Data_4:
return 4;
@ -132,49 +132,49 @@ static uint64_t adjustFixupValue(unsigned Kind, uint64_t Value) {
switch (Kind) {
default:
assert(false && "Unknown fixup kind!");
case ARM64::fixup_arm64_pcrel_adr_imm21:
case AArch64::fixup_aarch64_pcrel_adr_imm21:
if (SignedValue > 2097151 || SignedValue < -2097152)
report_fatal_error("fixup value out of range");
return AdrImmBits(Value & 0x1fffffULL);
case ARM64::fixup_arm64_pcrel_adrp_imm21:
case AArch64::fixup_aarch64_pcrel_adrp_imm21:
return AdrImmBits((Value & 0x1fffff000ULL) >> 12);
case ARM64::fixup_arm64_ldr_pcrel_imm19:
case ARM64::fixup_arm64_pcrel_branch19:
case AArch64::fixup_aarch64_ldr_pcrel_imm19:
case AArch64::fixup_aarch64_pcrel_branch19:
// Signed 21-bit immediate
if (SignedValue > 2097151 || SignedValue < -2097152)
report_fatal_error("fixup value out of range");
// Low two bits are not encoded.
return (Value >> 2) & 0x7ffff;
case ARM64::fixup_arm64_add_imm12:
case ARM64::fixup_arm64_ldst_imm12_scale1:
case AArch64::fixup_aarch64_add_imm12:
case AArch64::fixup_aarch64_ldst_imm12_scale1:
// Unsigned 12-bit immediate
if (Value >= 0x1000)
report_fatal_error("invalid imm12 fixup value");
return Value;
case ARM64::fixup_arm64_ldst_imm12_scale2:
case AArch64::fixup_aarch64_ldst_imm12_scale2:
// Unsigned 12-bit immediate which gets multiplied by 2
if (Value & 1 || Value >= 0x2000)
report_fatal_error("invalid imm12 fixup value");
return Value >> 1;
case ARM64::fixup_arm64_ldst_imm12_scale4:
case AArch64::fixup_aarch64_ldst_imm12_scale4:
// Unsigned 12-bit immediate which gets multiplied by 4
if (Value & 3 || Value >= 0x4000)
report_fatal_error("invalid imm12 fixup value");
return Value >> 2;
case ARM64::fixup_arm64_ldst_imm12_scale8:
case AArch64::fixup_aarch64_ldst_imm12_scale8:
// Unsigned 12-bit immediate which gets multiplied by 8
if (Value & 7 || Value >= 0x8000)
report_fatal_error("invalid imm12 fixup value");
return Value >> 3;
case ARM64::fixup_arm64_ldst_imm12_scale16:
case AArch64::fixup_aarch64_ldst_imm12_scale16:
// Unsigned 12-bit immediate which gets multiplied by 16
if (Value & 15 || Value >= 0x10000)
report_fatal_error("invalid imm12 fixup value");
return Value >> 4;
case ARM64::fixup_arm64_movw:
case AArch64::fixup_aarch64_movw:
report_fatal_error("no resolvable MOVZ/MOVK fixups supported yet");
return Value;
case ARM64::fixup_arm64_pcrel_branch14:
case AArch64::fixup_aarch64_pcrel_branch14:
// Signed 16-bit immediate
if (SignedValue > 32767 || SignedValue < -32768)
report_fatal_error("fixup value out of range");
@ -182,8 +182,8 @@ static uint64_t adjustFixupValue(unsigned Kind, uint64_t Value) {
if (Value & 0x3)
report_fatal_error("fixup not sufficiently aligned");
return (Value >> 2) & 0x3fff;
case ARM64::fixup_arm64_pcrel_branch26:
case ARM64::fixup_arm64_pcrel_call26:
case AArch64::fixup_aarch64_pcrel_branch26:
case AArch64::fixup_aarch64_pcrel_call26:
// Signed 28-bit immediate
if (SignedValue > 134217727 || SignedValue < -134217728)
report_fatal_error("fixup value out of range");
@ -199,9 +199,9 @@ static uint64_t adjustFixupValue(unsigned Kind, uint64_t Value) {
}
}
void ARM64AsmBackend::applyFixup(const MCFixup &Fixup, char *Data,
unsigned DataSize, uint64_t Value,
bool IsPCRel) const {
void AArch64AsmBackend::applyFixup(const MCFixup &Fixup, char *Data,
unsigned DataSize, uint64_t Value,
bool IsPCRel) const {
unsigned NumBytes = getFixupKindNumBytes(Fixup.getKind());
if (!Value)
return; // Doesn't change encoding.
@ -221,25 +221,27 @@ void ARM64AsmBackend::applyFixup(const MCFixup &Fixup, char *Data,
Data[Offset + i] |= uint8_t((Value >> (i * 8)) & 0xff);
}
bool ARM64AsmBackend::mayNeedRelaxation(const MCInst &Inst) const {
bool AArch64AsmBackend::mayNeedRelaxation(const MCInst &Inst) const {
return false;
}
bool ARM64AsmBackend::fixupNeedsRelaxation(const MCFixup &Fixup, uint64_t Value,
const MCRelaxableFragment *DF,
const MCAsmLayout &Layout) const {
// FIXME: This isn't correct for ARM64. Just moving the "generic" logic
bool AArch64AsmBackend::fixupNeedsRelaxation(const MCFixup &Fixup,
uint64_t Value,
const MCRelaxableFragment *DF,
const MCAsmLayout &Layout) const {
// FIXME: This isn't correct for AArch64. Just moving the "generic" logic
// into the targets for now.
//
// Relax if the value is too big for a (signed) i8.
return int64_t(Value) != int64_t(int8_t(Value));
}
void ARM64AsmBackend::relaxInstruction(const MCInst &Inst, MCInst &Res) const {
assert(false && "ARM64AsmBackend::relaxInstruction() unimplemented");
void AArch64AsmBackend::relaxInstruction(const MCInst &Inst,
MCInst &Res) const {
assert(false && "AArch64AsmBackend::relaxInstruction() unimplemented");
}
bool ARM64AsmBackend::writeNopData(uint64_t Count, MCObjectWriter *OW) const {
bool AArch64AsmBackend::writeNopData(uint64_t Count, MCObjectWriter *OW) const {
// If the count is not 4-byte aligned, we must be writing data into the text
// section (otherwise we have unaligned instructions, and thus have far
// bigger problems), so just write zeros instead.
@ -263,14 +265,14 @@ namespace CU {
enum CompactUnwindEncodings {
/// \brief A "frameless" leaf function, where no non-volatile registers are
/// saved. The return remains in LR throughout the function.
UNWIND_ARM64_MODE_FRAMELESS = 0x02000000,
UNWIND_AArch64_MODE_FRAMELESS = 0x02000000,
/// \brief No compact unwind encoding available. Instead the low 23-bits of
/// the compact unwind encoding is the offset of the DWARF FDE in the
/// __eh_frame section. This mode is never used in object files. It is only
/// generated by the linker in final linked images, which have only DWARF info
/// for a function.
UNWIND_ARM64_MODE_DWARF = 0x03000000,
UNWIND_AArch64_MODE_DWARF = 0x03000000,
/// \brief This is a standard arm64 prologue where FP/LR are immediately
/// pushed on the stack, then SP is copied to FP. If there are any
@ -278,40 +280,40 @@ enum CompactUnwindEncodings {
/// in a contiguous ranger right below the saved FP/LR pair. Any subset of the
/// five X pairs and four D pairs can be saved, but the memory layout must be
/// in register number order.
UNWIND_ARM64_MODE_FRAME = 0x04000000,
UNWIND_AArch64_MODE_FRAME = 0x04000000,
/// \brief Frame register pair encodings.
UNWIND_ARM64_FRAME_X19_X20_PAIR = 0x00000001,
UNWIND_ARM64_FRAME_X21_X22_PAIR = 0x00000002,
UNWIND_ARM64_FRAME_X23_X24_PAIR = 0x00000004,
UNWIND_ARM64_FRAME_X25_X26_PAIR = 0x00000008,
UNWIND_ARM64_FRAME_X27_X28_PAIR = 0x00000010,
UNWIND_ARM64_FRAME_D8_D9_PAIR = 0x00000100,
UNWIND_ARM64_FRAME_D10_D11_PAIR = 0x00000200,
UNWIND_ARM64_FRAME_D12_D13_PAIR = 0x00000400,
UNWIND_ARM64_FRAME_D14_D15_PAIR = 0x00000800
UNWIND_AArch64_FRAME_X19_X20_PAIR = 0x00000001,
UNWIND_AArch64_FRAME_X21_X22_PAIR = 0x00000002,
UNWIND_AArch64_FRAME_X23_X24_PAIR = 0x00000004,
UNWIND_AArch64_FRAME_X25_X26_PAIR = 0x00000008,
UNWIND_AArch64_FRAME_X27_X28_PAIR = 0x00000010,
UNWIND_AArch64_FRAME_D8_D9_PAIR = 0x00000100,
UNWIND_AArch64_FRAME_D10_D11_PAIR = 0x00000200,
UNWIND_AArch64_FRAME_D12_D13_PAIR = 0x00000400,
UNWIND_AArch64_FRAME_D14_D15_PAIR = 0x00000800
};
} // end CU namespace
// FIXME: This should be in a separate file.
class DarwinARM64AsmBackend : public ARM64AsmBackend {
class DarwinAArch64AsmBackend : public AArch64AsmBackend {
const MCRegisterInfo &MRI;
/// \brief Encode compact unwind stack adjustment for frameless functions.
/// See UNWIND_ARM64_FRAMELESS_STACK_SIZE_MASK in compact_unwind_encoding.h.
/// See UNWIND_AArch64_FRAMELESS_STACK_SIZE_MASK in compact_unwind_encoding.h.
/// The stack size always needs to be 16 byte aligned.
uint32_t encodeStackAdjustment(uint32_t StackSize) const {
return (StackSize / 16) << 12;
}
public:
DarwinARM64AsmBackend(const Target &T, const MCRegisterInfo &MRI)
: ARM64AsmBackend(T), MRI(MRI) {}
DarwinAArch64AsmBackend(const Target &T, const MCRegisterInfo &MRI)
: AArch64AsmBackend(T), MRI(MRI) {}
MCObjectWriter *createObjectWriter(raw_ostream &OS) const override {
return createARM64MachObjectWriter(OS, MachO::CPU_TYPE_ARM64,
MachO::CPU_SUBTYPE_ARM64_ALL);
return createAArch64MachObjectWriter(OS, MachO::CPU_TYPE_ARM64,
MachO::CPU_SUBTYPE_ARM64_ALL);
}
bool doesSectionRequireSymbols(const MCSection &Section) const override {
@ -354,7 +356,7 @@ public:
uint32_t generateCompactUnwindEncoding(
ArrayRef<MCCFIInstruction> Instrs) const override {
if (Instrs.empty())
return CU::UNWIND_ARM64_MODE_FRAMELESS;
return CU::UNWIND_AArch64_MODE_FRAMELESS;
bool HasFP = false;
unsigned StackSize = 0;
@ -366,11 +368,11 @@ public:
switch (Inst.getOperation()) {
default:
// Cannot handle this directive: bail out.
return CU::UNWIND_ARM64_MODE_DWARF;
return CU::UNWIND_AArch64_MODE_DWARF;
case MCCFIInstruction::OpDefCfa: {
// Defines a frame pointer.
assert(getXRegFromWReg(MRI.getLLVMRegNum(Inst.getRegister(), true)) ==
ARM64::FP &&
AArch64::FP &&
"Invalid frame pointer!");
assert(i + 2 < e && "Insufficient CFI instructions to define a frame!");
@ -387,11 +389,11 @@ public:
LRReg = getXRegFromWReg(LRReg);
FPReg = getXRegFromWReg(FPReg);
assert(LRReg == ARM64::LR && FPReg == ARM64::FP &&
assert(LRReg == AArch64::LR && FPReg == AArch64::FP &&
"Pushing invalid registers for frame!");
// Indicate that the function has a frame.
CompactUnwindEncoding |= CU::UNWIND_ARM64_MODE_FRAME;
CompactUnwindEncoding |= CU::UNWIND_AArch64_MODE_FRAME;
HasFP = true;
break;
}
@ -405,11 +407,11 @@ public:
// `.cfi_offset' instructions with the appropriate registers specified.
unsigned Reg1 = MRI.getLLVMRegNum(Inst.getRegister(), true);
if (i + 1 == e)
return CU::UNWIND_ARM64_MODE_DWARF;
return CU::UNWIND_AArch64_MODE_DWARF;
const MCCFIInstruction &Inst2 = Instrs[++i];
if (Inst2.getOperation() != MCCFIInstruction::OpOffset)
return CU::UNWIND_ARM64_MODE_DWARF;
return CU::UNWIND_AArch64_MODE_DWARF;
unsigned Reg2 = MRI.getLLVMRegNum(Inst2.getRegister(), true);
// N.B. The encodings must be in register number order, and the X
@ -423,21 +425,21 @@ public:
Reg1 = getXRegFromWReg(Reg1);
Reg2 = getXRegFromWReg(Reg2);
if (Reg1 == ARM64::X19 && Reg2 == ARM64::X20 &&
if (Reg1 == AArch64::X19 && Reg2 == AArch64::X20 &&
(CompactUnwindEncoding & 0xF1E) == 0)
CompactUnwindEncoding |= CU::UNWIND_ARM64_FRAME_X19_X20_PAIR;
else if (Reg1 == ARM64::X21 && Reg2 == ARM64::X22 &&
CompactUnwindEncoding |= CU::UNWIND_AArch64_FRAME_X19_X20_PAIR;
else if (Reg1 == AArch64::X21 && Reg2 == AArch64::X22 &&
(CompactUnwindEncoding & 0xF1C) == 0)
CompactUnwindEncoding |= CU::UNWIND_ARM64_FRAME_X21_X22_PAIR;
else if (Reg1 == ARM64::X23 && Reg2 == ARM64::X24 &&
CompactUnwindEncoding |= CU::UNWIND_AArch64_FRAME_X21_X22_PAIR;
else if (Reg1 == AArch64::X23 && Reg2 == AArch64::X24 &&
(CompactUnwindEncoding & 0xF18) == 0)
CompactUnwindEncoding |= CU::UNWIND_ARM64_FRAME_X23_X24_PAIR;
else if (Reg1 == ARM64::X25 && Reg2 == ARM64::X26 &&
CompactUnwindEncoding |= CU::UNWIND_AArch64_FRAME_X23_X24_PAIR;
else if (Reg1 == AArch64::X25 && Reg2 == AArch64::X26 &&
(CompactUnwindEncoding & 0xF10) == 0)
CompactUnwindEncoding |= CU::UNWIND_ARM64_FRAME_X25_X26_PAIR;
else if (Reg1 == ARM64::X27 && Reg2 == ARM64::X28 &&
CompactUnwindEncoding |= CU::UNWIND_AArch64_FRAME_X25_X26_PAIR;
else if (Reg1 == AArch64::X27 && Reg2 == AArch64::X28 &&
(CompactUnwindEncoding & 0xF00) == 0)
CompactUnwindEncoding |= CU::UNWIND_ARM64_FRAME_X27_X28_PAIR;
CompactUnwindEncoding |= CU::UNWIND_AArch64_FRAME_X27_X28_PAIR;
else {
Reg1 = getDRegFromBReg(Reg1);
Reg2 = getDRegFromBReg(Reg2);
@ -446,20 +448,20 @@ public:
// D10/D11 pair = 0x00000200,
// D12/D13 pair = 0x00000400,
// D14/D15 pair = 0x00000800
if (Reg1 == ARM64::D8 && Reg2 == ARM64::D9 &&
if (Reg1 == AArch64::D8 && Reg2 == AArch64::D9 &&
(CompactUnwindEncoding & 0xE00) == 0)
CompactUnwindEncoding |= CU::UNWIND_ARM64_FRAME_D8_D9_PAIR;
else if (Reg1 == ARM64::D10 && Reg2 == ARM64::D11 &&
CompactUnwindEncoding |= CU::UNWIND_AArch64_FRAME_D8_D9_PAIR;
else if (Reg1 == AArch64::D10 && Reg2 == AArch64::D11 &&
(CompactUnwindEncoding & 0xC00) == 0)
CompactUnwindEncoding |= CU::UNWIND_ARM64_FRAME_D10_D11_PAIR;
else if (Reg1 == ARM64::D12 && Reg2 == ARM64::D13 &&
CompactUnwindEncoding |= CU::UNWIND_AArch64_FRAME_D10_D11_PAIR;
else if (Reg1 == AArch64::D12 && Reg2 == AArch64::D13 &&
(CompactUnwindEncoding & 0x800) == 0)
CompactUnwindEncoding |= CU::UNWIND_ARM64_FRAME_D12_D13_PAIR;
else if (Reg1 == ARM64::D14 && Reg2 == ARM64::D15)
CompactUnwindEncoding |= CU::UNWIND_ARM64_FRAME_D14_D15_PAIR;
CompactUnwindEncoding |= CU::UNWIND_AArch64_FRAME_D12_D13_PAIR;
else if (Reg1 == AArch64::D14 && Reg2 == AArch64::D15)
CompactUnwindEncoding |= CU::UNWIND_AArch64_FRAME_D14_D15_PAIR;
else
// A pair was pushed which we cannot handle.
return CU::UNWIND_ARM64_MODE_DWARF;
return CU::UNWIND_AArch64_MODE_DWARF;
}
break;
@ -471,9 +473,9 @@ public:
// With compact unwind info we can only represent stack adjustments of up
// to 65520 bytes.
if (StackSize > 65520)
return CU::UNWIND_ARM64_MODE_DWARF;
return CU::UNWIND_AArch64_MODE_DWARF;
CompactUnwindEncoding |= CU::UNWIND_ARM64_MODE_FRAMELESS;
CompactUnwindEncoding |= CU::UNWIND_AArch64_MODE_FRAMELESS;
CompactUnwindEncoding |= encodeStackAdjustment(StackSize);
}
@ -485,16 +487,16 @@ public:
namespace {
class ELFARM64AsmBackend : public ARM64AsmBackend {
class ELFAArch64AsmBackend : public AArch64AsmBackend {
public:
uint8_t OSABI;
bool IsLittleEndian;
ELFARM64AsmBackend(const Target &T, uint8_t OSABI, bool IsLittleEndian)
: ARM64AsmBackend(T), OSABI(OSABI), IsLittleEndian(IsLittleEndian) {}
ELFAArch64AsmBackend(const Target &T, uint8_t OSABI, bool IsLittleEndian)
: AArch64AsmBackend(T), OSABI(OSABI), IsLittleEndian(IsLittleEndian) {}
MCObjectWriter *createObjectWriter(raw_ostream &OS) const override {
return createARM64ELFObjectWriter(OS, OSABI, IsLittleEndian);
return createAArch64ELFObjectWriter(OS, OSABI, IsLittleEndian);
}
void processFixupValue(const MCAssembler &Asm, const MCAsmLayout &Layout,
@ -506,12 +508,10 @@ public:
uint64_t Value, bool IsPCRel) const override;
};
void ELFARM64AsmBackend::processFixupValue(const MCAssembler &Asm,
const MCAsmLayout &Layout,
const MCFixup &Fixup,
const MCFragment *DF,
const MCValue &Target,
uint64_t &Value, bool &IsResolved) {
void ELFAArch64AsmBackend::processFixupValue(
const MCAssembler &Asm, const MCAsmLayout &Layout, const MCFixup &Fixup,
const MCFragment *DF, const MCValue &Target, uint64_t &Value,
bool &IsResolved) {
// The ADRP instruction adds some multiple of 0x1000 to the current PC &
// ~0xfff. This means that the required offset to reach a symbol can vary by
// up to one step depending on where the ADRP is in memory. For example:
@ -524,13 +524,13 @@ void ELFARM64AsmBackend::processFixupValue(const MCAssembler &Asm,
// same page as the ADRP and the instruction should encode 0x0. Assuming the
// section isn't 0x1000-aligned, we therefore need to delegate this decision
// to the linker -- a relocation!
if ((uint32_t)Fixup.getKind() == ARM64::fixup_arm64_pcrel_adrp_imm21)
if ((uint32_t)Fixup.getKind() == AArch64::fixup_aarch64_pcrel_adrp_imm21)
IsResolved = false;
}
void ELFARM64AsmBackend::applyFixup(const MCFixup &Fixup, char *Data,
unsigned DataSize, uint64_t Value,
bool IsPCRel) const {
void ELFAArch64AsmBackend::applyFixup(const MCFixup &Fixup, char *Data,
unsigned DataSize, uint64_t Value,
bool IsPCRel) const {
// store fixups in .eh_frame section in big endian order
if (!IsLittleEndian && Fixup.getKind() == FK_Data_4) {
const MCSection *Sec = Fixup.getValue()->FindAssociatedSection();
@ -538,27 +538,29 @@ void ELFARM64AsmBackend::applyFixup(const MCFixup &Fixup, char *Data,
if (SecELF->getSectionName() == ".eh_frame")
Value = ByteSwap_32(unsigned(Value));
}
ARM64AsmBackend::applyFixup (Fixup, Data, DataSize, Value, IsPCRel);
AArch64AsmBackend::applyFixup (Fixup, Data, DataSize, Value, IsPCRel);
}
}
MCAsmBackend *llvm::createARM64leAsmBackend(const Target &T,
MCAsmBackend *llvm::createAArch64leAsmBackend(const Target &T,
const MCRegisterInfo &MRI,
StringRef TT, StringRef CPU) {
Triple TheTriple(TT);
if (TheTriple.isOSDarwin())
return new DarwinARM64AsmBackend(T, MRI);
return new DarwinAArch64AsmBackend(T, MRI);
assert(TheTriple.isOSBinFormatELF() && "Expect either MachO or ELF target");
return new ELFARM64AsmBackend(T, TheTriple.getOS(), /*IsLittleEndian=*/true);
return new ELFAArch64AsmBackend(T, TheTriple.getOS(), /*IsLittleEndian=*/true);
}
MCAsmBackend *llvm::createARM64beAsmBackend(const Target &T,
MCAsmBackend *llvm::createAArch64beAsmBackend(const Target &T,
const MCRegisterInfo &MRI,
StringRef TT, StringRef CPU) {
Triple TheTriple(TT);
assert(TheTriple.isOSBinFormatELF() && "Big endian is only supported for ELF targets!");
return new ELFARM64AsmBackend(T, TheTriple.getOS(), /*IsLittleEndian=*/false);
assert(TheTriple.isOSBinFormatELF() &&
"Big endian is only supported for ELF targets!");
return new ELFAArch64AsmBackend(T, TheTriple.getOS(),
/*IsLittleEndian=*/false);
}

View File

@ -1,4 +1,4 @@
//===-- ARM64ELFObjectWriter.cpp - ARM64 ELF Writer -----------------------===//
//===-- AArch64ELFObjectWriter.cpp - AArch64 ELF Writer -------------------===//
//
// The LLVM Compiler Infrastructure
//
@ -12,9 +12,9 @@
//
//===----------------------------------------------------------------------===//
#include "MCTargetDesc/ARM64FixupKinds.h"
#include "MCTargetDesc/ARM64MCExpr.h"
#include "MCTargetDesc/ARM64MCTargetDesc.h"
#include "MCTargetDesc/AArch64FixupKinds.h"
#include "MCTargetDesc/AArch64MCExpr.h"
#include "MCTargetDesc/AArch64MCTargetDesc.h"
#include "llvm/MC/MCELFObjectWriter.h"
#include "llvm/MC/MCValue.h"
#include "llvm/Support/ErrorHandling.h"
@ -22,11 +22,11 @@
using namespace llvm;
namespace {
class ARM64ELFObjectWriter : public MCELFObjectTargetWriter {
class AArch64ELFObjectWriter : public MCELFObjectTargetWriter {
public:
ARM64ELFObjectWriter(uint8_t OSABI, bool IsLittleEndian);
AArch64ELFObjectWriter(uint8_t OSABI, bool IsLittleEndian);
virtual ~ARM64ELFObjectWriter();
virtual ~AArch64ELFObjectWriter();
protected:
unsigned GetRelocType(const MCValue &Target, const MCFixup &Fixup,
@ -36,19 +36,20 @@ private:
};
}
ARM64ELFObjectWriter::ARM64ELFObjectWriter(uint8_t OSABI, bool IsLittleEndian)
AArch64ELFObjectWriter::AArch64ELFObjectWriter(uint8_t OSABI,
bool IsLittleEndian)
: MCELFObjectTargetWriter(/*Is64Bit*/ true, OSABI, ELF::EM_AARCH64,
/*HasRelocationAddend*/ true) {}
ARM64ELFObjectWriter::~ARM64ELFObjectWriter() {}
AArch64ELFObjectWriter::~AArch64ELFObjectWriter() {}
unsigned ARM64ELFObjectWriter::GetRelocType(const MCValue &Target,
unsigned AArch64ELFObjectWriter::GetRelocType(const MCValue &Target,
const MCFixup &Fixup,
bool IsPCRel) const {
ARM64MCExpr::VariantKind RefKind =
static_cast<ARM64MCExpr::VariantKind>(Target.getRefKind());
ARM64MCExpr::VariantKind SymLoc = ARM64MCExpr::getSymbolLoc(RefKind);
bool IsNC = ARM64MCExpr::isNotChecked(RefKind);
AArch64MCExpr::VariantKind RefKind =
static_cast<AArch64MCExpr::VariantKind>(Target.getRefKind());
AArch64MCExpr::VariantKind SymLoc = AArch64MCExpr::getSymbolLoc(RefKind);
bool IsNC = AArch64MCExpr::isNotChecked(RefKind);
assert((!Target.getSymA() ||
Target.getSymA()->getKind() == MCSymbolRefExpr::VK_None) &&
@ -66,30 +67,30 @@ unsigned ARM64ELFObjectWriter::GetRelocType(const MCValue &Target,
return ELF::R_AARCH64_PREL32;
case FK_Data_8:
return ELF::R_AARCH64_PREL64;
case ARM64::fixup_arm64_pcrel_adr_imm21:
assert(SymLoc == ARM64MCExpr::VK_NONE && "unexpected ADR relocation");
case AArch64::fixup_aarch64_pcrel_adr_imm21:
assert(SymLoc == AArch64MCExpr::VK_NONE && "unexpected ADR relocation");
return ELF::R_AARCH64_ADR_PREL_LO21;
case ARM64::fixup_arm64_pcrel_adrp_imm21:
if (SymLoc == ARM64MCExpr::VK_ABS && !IsNC)
case AArch64::fixup_aarch64_pcrel_adrp_imm21:
if (SymLoc == AArch64MCExpr::VK_ABS && !IsNC)
return ELF::R_AARCH64_ADR_PREL_PG_HI21;
if (SymLoc == ARM64MCExpr::VK_GOT && !IsNC)
if (SymLoc == AArch64MCExpr::VK_GOT && !IsNC)
return ELF::R_AARCH64_ADR_GOT_PAGE;
if (SymLoc == ARM64MCExpr::VK_GOTTPREL && !IsNC)
if (SymLoc == AArch64MCExpr::VK_GOTTPREL && !IsNC)
return ELF::R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21;
if (SymLoc == ARM64MCExpr::VK_TLSDESC && !IsNC)
if (SymLoc == AArch64MCExpr::VK_TLSDESC && !IsNC)
return ELF::R_AARCH64_TLSDESC_ADR_PAGE;
llvm_unreachable("invalid symbol kind for ADRP relocation");
case ARM64::fixup_arm64_pcrel_branch26:
case AArch64::fixup_aarch64_pcrel_branch26:
return ELF::R_AARCH64_JUMP26;
case ARM64::fixup_arm64_pcrel_call26:
case AArch64::fixup_aarch64_pcrel_call26:
return ELF::R_AARCH64_CALL26;
case ARM64::fixup_arm64_ldr_pcrel_imm19:
if (SymLoc == ARM64MCExpr::VK_GOTTPREL)
case AArch64::fixup_aarch64_ldr_pcrel_imm19:
if (SymLoc == AArch64MCExpr::VK_GOTTPREL)
return ELF::R_AARCH64_TLSIE_LD_GOTTPREL_PREL19;
return ELF::R_AARCH64_LD_PREL_LO19;
case ARM64::fixup_arm64_pcrel_branch14:
case AArch64::fixup_aarch64_pcrel_branch14:
return ELF::R_AARCH64_TSTBR14;
case ARM64::fixup_arm64_pcrel_branch19:
case AArch64::fixup_aarch64_pcrel_branch19:
return ELF::R_AARCH64_CONDBR19;
default:
llvm_unreachable("Unsupported pc-relative fixup kind");
@ -102,142 +103,142 @@ unsigned ARM64ELFObjectWriter::GetRelocType(const MCValue &Target,
return ELF::R_AARCH64_ABS32;
case FK_Data_8:
return ELF::R_AARCH64_ABS64;
case ARM64::fixup_arm64_add_imm12:
if (RefKind == ARM64MCExpr::VK_DTPREL_HI12)
case AArch64::fixup_aarch64_add_imm12:
if (RefKind == AArch64MCExpr::VK_DTPREL_HI12)
return ELF::R_AARCH64_TLSLD_ADD_DTPREL_HI12;
if (RefKind == ARM64MCExpr::VK_TPREL_HI12)
if (RefKind == AArch64MCExpr::VK_TPREL_HI12)
return ELF::R_AARCH64_TLSLE_ADD_TPREL_HI12;
if (RefKind == ARM64MCExpr::VK_DTPREL_LO12_NC)
if (RefKind == AArch64MCExpr::VK_DTPREL_LO12_NC)
return ELF::R_AARCH64_TLSLD_ADD_DTPREL_LO12_NC;
if (RefKind == ARM64MCExpr::VK_DTPREL_LO12)
if (RefKind == AArch64MCExpr::VK_DTPREL_LO12)
return ELF::R_AARCH64_TLSLD_ADD_DTPREL_LO12;
if (RefKind == ARM64MCExpr::VK_TPREL_LO12_NC)
if (RefKind == AArch64MCExpr::VK_TPREL_LO12_NC)
return ELF::R_AARCH64_TLSLE_ADD_TPREL_LO12_NC;
if (RefKind == ARM64MCExpr::VK_TPREL_LO12)
if (RefKind == AArch64MCExpr::VK_TPREL_LO12)
return ELF::R_AARCH64_TLSLE_ADD_TPREL_LO12;
if (RefKind == ARM64MCExpr::VK_TLSDESC_LO12)
if (RefKind == AArch64MCExpr::VK_TLSDESC_LO12)
return ELF::R_AARCH64_TLSDESC_ADD_LO12_NC;
if (SymLoc == ARM64MCExpr::VK_ABS && IsNC)
if (SymLoc == AArch64MCExpr::VK_ABS && IsNC)
return ELF::R_AARCH64_ADD_ABS_LO12_NC;
report_fatal_error("invalid fixup for add (uimm12) instruction");
return 0;
case ARM64::fixup_arm64_ldst_imm12_scale1:
if (SymLoc == ARM64MCExpr::VK_ABS && IsNC)
case AArch64::fixup_aarch64_ldst_imm12_scale1:
if (SymLoc == AArch64MCExpr::VK_ABS && IsNC)
return ELF::R_AARCH64_LDST8_ABS_LO12_NC;
if (SymLoc == ARM64MCExpr::VK_DTPREL && !IsNC)
if (SymLoc == AArch64MCExpr::VK_DTPREL && !IsNC)
return ELF::R_AARCH64_TLSLD_LDST8_DTPREL_LO12;
if (SymLoc == ARM64MCExpr::VK_DTPREL && IsNC)
if (SymLoc == AArch64MCExpr::VK_DTPREL && IsNC)
return ELF::R_AARCH64_TLSLD_LDST8_DTPREL_LO12_NC;
if (SymLoc == ARM64MCExpr::VK_TPREL && !IsNC)
if (SymLoc == AArch64MCExpr::VK_TPREL && !IsNC)
return ELF::R_AARCH64_TLSLE_LDST8_TPREL_LO12;
if (SymLoc == ARM64MCExpr::VK_TPREL && IsNC)
if (SymLoc == AArch64MCExpr::VK_TPREL && IsNC)
return ELF::R_AARCH64_TLSLE_LDST8_TPREL_LO12_NC;
report_fatal_error("invalid fixup for 8-bit load/store instruction");
return 0;
case ARM64::fixup_arm64_ldst_imm12_scale2:
if (SymLoc == ARM64MCExpr::VK_ABS && IsNC)
case AArch64::fixup_aarch64_ldst_imm12_scale2:
if (SymLoc == AArch64MCExpr::VK_ABS && IsNC)
return ELF::R_AARCH64_LDST16_ABS_LO12_NC;
if (SymLoc == ARM64MCExpr::VK_DTPREL && !IsNC)
if (SymLoc == AArch64MCExpr::VK_DTPREL && !IsNC)
return ELF::R_AARCH64_TLSLD_LDST16_DTPREL_LO12;
if (SymLoc == ARM64MCExpr::VK_DTPREL && IsNC)
if (SymLoc == AArch64MCExpr::VK_DTPREL && IsNC)
return ELF::R_AARCH64_TLSLD_LDST16_DTPREL_LO12_NC;
if (SymLoc == ARM64MCExpr::VK_TPREL && !IsNC)
if (SymLoc == AArch64MCExpr::VK_TPREL && !IsNC)
return ELF::R_AARCH64_TLSLE_LDST16_TPREL_LO12;
if (SymLoc == ARM64MCExpr::VK_TPREL && IsNC)
if (SymLoc == AArch64MCExpr::VK_TPREL && IsNC)
return ELF::R_AARCH64_TLSLE_LDST16_TPREL_LO12_NC;
report_fatal_error("invalid fixup for 16-bit load/store instruction");
return 0;
case ARM64::fixup_arm64_ldst_imm12_scale4:
if (SymLoc == ARM64MCExpr::VK_ABS && IsNC)
case AArch64::fixup_aarch64_ldst_imm12_scale4:
if (SymLoc == AArch64MCExpr::VK_ABS && IsNC)
return ELF::R_AARCH64_LDST32_ABS_LO12_NC;
if (SymLoc == ARM64MCExpr::VK_DTPREL && !IsNC)
if (SymLoc == AArch64MCExpr::VK_DTPREL && !IsNC)
return ELF::R_AARCH64_TLSLD_LDST32_DTPREL_LO12;
if (SymLoc == ARM64MCExpr::VK_DTPREL && IsNC)
if (SymLoc == AArch64MCExpr::VK_DTPREL && IsNC)
return ELF::R_AARCH64_TLSLD_LDST32_DTPREL_LO12_NC;
if (SymLoc == ARM64MCExpr::VK_TPREL && !IsNC)
if (SymLoc == AArch64MCExpr::VK_TPREL && !IsNC)
return ELF::R_AARCH64_TLSLE_LDST32_TPREL_LO12;
if (SymLoc == ARM64MCExpr::VK_TPREL && IsNC)
if (SymLoc == AArch64MCExpr::VK_TPREL && IsNC)
return ELF::R_AARCH64_TLSLE_LDST32_TPREL_LO12_NC;
report_fatal_error("invalid fixup for 32-bit load/store instruction");
return 0;
case ARM64::fixup_arm64_ldst_imm12_scale8:
if (SymLoc == ARM64MCExpr::VK_ABS && IsNC)
case AArch64::fixup_aarch64_ldst_imm12_scale8:
if (SymLoc == AArch64MCExpr::VK_ABS && IsNC)
return ELF::R_AARCH64_LDST64_ABS_LO12_NC;
if (SymLoc == ARM64MCExpr::VK_GOT && IsNC)
if (SymLoc == AArch64MCExpr::VK_GOT && IsNC)
return ELF::R_AARCH64_LD64_GOT_LO12_NC;
if (SymLoc == ARM64MCExpr::VK_DTPREL && !IsNC)
if (SymLoc == AArch64MCExpr::VK_DTPREL && !IsNC)
return ELF::R_AARCH64_TLSLD_LDST64_DTPREL_LO12;
if (SymLoc == ARM64MCExpr::VK_DTPREL && IsNC)
if (SymLoc == AArch64MCExpr::VK_DTPREL && IsNC)
return ELF::R_AARCH64_TLSLD_LDST64_DTPREL_LO12_NC;
if (SymLoc == ARM64MCExpr::VK_TPREL && !IsNC)
if (SymLoc == AArch64MCExpr::VK_TPREL && !IsNC)
return ELF::R_AARCH64_TLSLE_LDST64_TPREL_LO12;
if (SymLoc == ARM64MCExpr::VK_TPREL && IsNC)
if (SymLoc == AArch64MCExpr::VK_TPREL && IsNC)
return ELF::R_AARCH64_TLSLE_LDST64_TPREL_LO12_NC;
if (SymLoc == ARM64MCExpr::VK_GOTTPREL && IsNC)
if (SymLoc == AArch64MCExpr::VK_GOTTPREL && IsNC)
return ELF::R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC;
if (SymLoc == ARM64MCExpr::VK_TLSDESC && IsNC)
if (SymLoc == AArch64MCExpr::VK_TLSDESC && IsNC)
return ELF::R_AARCH64_TLSDESC_LD64_LO12_NC;
report_fatal_error("invalid fixup for 64-bit load/store instruction");
return 0;
case ARM64::fixup_arm64_ldst_imm12_scale16:
if (SymLoc == ARM64MCExpr::VK_ABS && IsNC)
case AArch64::fixup_aarch64_ldst_imm12_scale16:
if (SymLoc == AArch64MCExpr::VK_ABS && IsNC)
return ELF::R_AARCH64_LDST128_ABS_LO12_NC;
report_fatal_error("invalid fixup for 128-bit load/store instruction");
return 0;
case ARM64::fixup_arm64_movw:
if (RefKind == ARM64MCExpr::VK_ABS_G3)
case AArch64::fixup_aarch64_movw:
if (RefKind == AArch64MCExpr::VK_ABS_G3)
return ELF::R_AARCH64_MOVW_UABS_G3;
if (RefKind == ARM64MCExpr::VK_ABS_G2)
if (RefKind == AArch64MCExpr::VK_ABS_G2)
return ELF::R_AARCH64_MOVW_UABS_G2;
if (RefKind == ARM64MCExpr::VK_ABS_G2_S)
if (RefKind == AArch64MCExpr::VK_ABS_G2_S)
return ELF::R_AARCH64_MOVW_SABS_G2;
if (RefKind == ARM64MCExpr::VK_ABS_G2_NC)
if (RefKind == AArch64MCExpr::VK_ABS_G2_NC)
return ELF::R_AARCH64_MOVW_UABS_G2_NC;
if (RefKind == ARM64MCExpr::VK_ABS_G1)
if (RefKind == AArch64MCExpr::VK_ABS_G1)
return ELF::R_AARCH64_MOVW_UABS_G1;
if (RefKind == ARM64MCExpr::VK_ABS_G1_S)
if (RefKind == AArch64MCExpr::VK_ABS_G1_S)
return ELF::R_AARCH64_MOVW_SABS_G1;
if (RefKind == ARM64MCExpr::VK_ABS_G1_NC)
if (RefKind == AArch64MCExpr::VK_ABS_G1_NC)
return ELF::R_AARCH64_MOVW_UABS_G1_NC;
if (RefKind == ARM64MCExpr::VK_ABS_G0)
if (RefKind == AArch64MCExpr::VK_ABS_G0)
return ELF::R_AARCH64_MOVW_UABS_G0;
if (RefKind == ARM64MCExpr::VK_ABS_G0_S)
if (RefKind == AArch64MCExpr::VK_ABS_G0_S)
return ELF::R_AARCH64_MOVW_SABS_G0;
if (RefKind == ARM64MCExpr::VK_ABS_G0_NC)
if (RefKind == AArch64MCExpr::VK_ABS_G0_NC)
return ELF::R_AARCH64_MOVW_UABS_G0_NC;
if (RefKind == ARM64MCExpr::VK_DTPREL_G2)
if (RefKind == AArch64MCExpr::VK_DTPREL_G2)
return ELF::R_AARCH64_TLSLD_MOVW_DTPREL_G2;
if (RefKind == ARM64MCExpr::VK_DTPREL_G1)
if (RefKind == AArch64MCExpr::VK_DTPREL_G1)
return ELF::R_AARCH64_TLSLD_MOVW_DTPREL_G1;
if (RefKind == ARM64MCExpr::VK_DTPREL_G1_NC)
if (RefKind == AArch64MCExpr::VK_DTPREL_G1_NC)
return ELF::R_AARCH64_TLSLD_MOVW_DTPREL_G1_NC;
if (RefKind == ARM64MCExpr::VK_DTPREL_G0)
if (RefKind == AArch64MCExpr::VK_DTPREL_G0)
return ELF::R_AARCH64_TLSLD_MOVW_DTPREL_G0;
if (RefKind == ARM64MCExpr::VK_DTPREL_G0_NC)
if (RefKind == AArch64MCExpr::VK_DTPREL_G0_NC)
return ELF::R_AARCH64_TLSLD_MOVW_DTPREL_G0_NC;
if (RefKind == ARM64MCExpr::VK_TPREL_G2)
if (RefKind == AArch64MCExpr::VK_TPREL_G2)
return ELF::R_AARCH64_TLSLE_MOVW_TPREL_G2;
if (RefKind == ARM64MCExpr::VK_TPREL_G1)
if (RefKind == AArch64MCExpr::VK_TPREL_G1)
return ELF::R_AARCH64_TLSLE_MOVW_TPREL_G1;
if (RefKind == ARM64MCExpr::VK_TPREL_G1_NC)
if (RefKind == AArch64MCExpr::VK_TPREL_G1_NC)
return ELF::R_AARCH64_TLSLE_MOVW_TPREL_G1_NC;
if (RefKind == ARM64MCExpr::VK_TPREL_G0)
if (RefKind == AArch64MCExpr::VK_TPREL_G0)
return ELF::R_AARCH64_TLSLE_MOVW_TPREL_G0;
if (RefKind == ARM64MCExpr::VK_TPREL_G0_NC)
if (RefKind == AArch64MCExpr::VK_TPREL_G0_NC)
return ELF::R_AARCH64_TLSLE_MOVW_TPREL_G0_NC;
if (RefKind == ARM64MCExpr::VK_GOTTPREL_G1)
if (RefKind == AArch64MCExpr::VK_GOTTPREL_G1)
return ELF::R_AARCH64_TLSIE_MOVW_GOTTPREL_G1;
if (RefKind == ARM64MCExpr::VK_GOTTPREL_G0_NC)
if (RefKind == AArch64MCExpr::VK_GOTTPREL_G0_NC)
return ELF::R_AARCH64_TLSIE_MOVW_GOTTPREL_G0_NC;
report_fatal_error("invalid fixup for movz/movk instruction");
return 0;
case ARM64::fixup_arm64_tlsdesc_call:
case AArch64::fixup_aarch64_tlsdesc_call:
return ELF::R_AARCH64_TLSDESC_CALL;
default:
llvm_unreachable("Unknown ELF relocation type");
@ -247,9 +248,10 @@ unsigned ARM64ELFObjectWriter::GetRelocType(const MCValue &Target,
llvm_unreachable("Unimplemented fixup -> relocation");
}
MCObjectWriter *llvm::createARM64ELFObjectWriter(raw_ostream &OS,
MCObjectWriter *llvm::createAArch64ELFObjectWriter(raw_ostream &OS,
uint8_t OSABI,
bool IsLittleEndian) {
MCELFObjectTargetWriter *MOTW = new ARM64ELFObjectWriter(OSABI, IsLittleEndian);
MCELFObjectTargetWriter *MOTW =
new AArch64ELFObjectWriter(OSABI, IsLittleEndian);
return createELFObjectWriter(MOTW, OS, IsLittleEndian);
}

View File

@ -1,4 +1,4 @@
//===- lib/MC/ARM64ELFStreamer.cpp - ELF Object Output for ARM64 ----------===//
//===- lib/MC/AArch64ELFStreamer.cpp - ELF Object Output for AArch64 ------===//
//
// The LLVM Compiler Infrastructure
//
@ -53,14 +53,14 @@ namespace {
///
/// As a result this system is orthogonal to the DataRegion infrastructure used
/// by MachO. Beware!
class ARM64ELFStreamer : public MCELFStreamer {
class AArch64ELFStreamer : public MCELFStreamer {
public:
ARM64ELFStreamer(MCContext &Context, MCAsmBackend &TAB, raw_ostream &OS,
AArch64ELFStreamer(MCContext &Context, MCAsmBackend &TAB, raw_ostream &OS,
MCCodeEmitter *Emitter)
: MCELFStreamer(Context, TAB, OS, Emitter), MappingSymbolCounter(0),
LastEMS(EMS_None) {}
~ARM64ELFStreamer() {}
~AArch64ELFStreamer() {}
void ChangeSection(const MCSection *Section,
const MCExpr *Subsection) override {
@ -83,7 +83,7 @@ public:
}
/// This is one of the functions used to emit data into an ELF section, so the
/// ARM64 streamer overrides it to add the appropriate mapping symbol ($d)
/// AArch64 streamer overrides it to add the appropriate mapping symbol ($d)
/// if necessary.
void EmitBytes(StringRef Data) override {
EmitDataMappingSymbol();
@ -91,7 +91,7 @@ public:
}
/// This is one of the functions used to emit data into an ELF section, so the
/// ARM64 streamer overrides it to add the appropriate mapping symbol ($d)
/// AArch64 streamer overrides it to add the appropriate mapping symbol ($d)
/// if necessary.
void EmitValueImpl(const MCExpr *Value, unsigned Size,
const SMLoc &Loc) override {
@ -147,10 +147,10 @@ private:
}
namespace llvm {
MCELFStreamer *createARM64ELFStreamer(MCContext &Context, MCAsmBackend &TAB,
raw_ostream &OS, MCCodeEmitter *Emitter,
bool RelaxAll, bool NoExecStack) {
ARM64ELFStreamer *S = new ARM64ELFStreamer(Context, TAB, OS, Emitter);
MCELFStreamer *createAArch64ELFStreamer(MCContext &Context, MCAsmBackend &TAB,
raw_ostream &OS, MCCodeEmitter *Emitter,
bool RelaxAll, bool NoExecStack) {
AArch64ELFStreamer *S = new AArch64ELFStreamer(Context, TAB, OS, Emitter);
if (RelaxAll)
S->getAssembler().setRelaxAll(true);
if (NoExecStack)

View File

@ -1,4 +1,4 @@
//===-- ARM64ELFStreamer.h - ELF Streamer for ARM64 -------------*- C++ -*-===//
//===-- AArch64ELFStreamer.h - ELF Streamer for AArch64 ---------*- C++ -*-===//
//
// The LLVM Compiler Infrastructure
//
@ -7,7 +7,7 @@
//
//===----------------------------------------------------------------------===//
//
// This file implements ELF streamer information for the ARM64 backend.
// This file implements ELF streamer information for the AArch64 backend.
//
//===----------------------------------------------------------------------===//
@ -18,9 +18,9 @@
namespace llvm {
MCELFStreamer *createARM64ELFStreamer(MCContext &Context, MCAsmBackend &TAB,
raw_ostream &OS, MCCodeEmitter *Emitter,
bool RelaxAll, bool NoExecStack);
MCELFStreamer *createAArch64ELFStreamer(MCContext &Context, MCAsmBackend &TAB,
raw_ostream &OS, MCCodeEmitter *Emitter,
bool RelaxAll, bool NoExecStack);
}
#endif // ARM64_ELF_STREAMER_H
#endif // AArch64_ELF_STREAMER_H

View File

@ -0,0 +1,76 @@
//===-- AArch64FixupKinds.h - AArch64 Specific Fixup Entries ----*- C++ -*-===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#ifndef LLVM_AArch64FIXUPKINDS_H
#define LLVM_AArch64FIXUPKINDS_H
#include "llvm/MC/MCFixup.h"
namespace llvm {
namespace AArch64 {
enum Fixups {
// fixup_aarch64_pcrel_adr_imm21 - A 21-bit pc-relative immediate inserted into
// an ADR instruction.
fixup_aarch64_pcrel_adr_imm21 = FirstTargetFixupKind,
// fixup_aarch64_pcrel_adrp_imm21 - A 21-bit pc-relative immediate inserted into
// an ADRP instruction.
fixup_aarch64_pcrel_adrp_imm21,
// fixup_aarch64_imm12 - 12-bit fixup for add/sub instructions.
// No alignment adjustment. All value bits are encoded.
fixup_aarch64_add_imm12,
// fixup_aarch64_ldst_imm12_* - unsigned 12-bit fixups for load and
// store instructions.
fixup_aarch64_ldst_imm12_scale1,
fixup_aarch64_ldst_imm12_scale2,
fixup_aarch64_ldst_imm12_scale4,
fixup_aarch64_ldst_imm12_scale8,
fixup_aarch64_ldst_imm12_scale16,
// fixup_aarch64_ldr_pcrel_imm19 - The high 19 bits of a 21-bit pc-relative
// immediate. Same encoding as fixup_aarch64_pcrel_adrhi, except this is used by
// pc-relative loads and generates relocations directly when necessary.
fixup_aarch64_ldr_pcrel_imm19,
// FIXME: comment
fixup_aarch64_movw,
// fixup_aarch64_pcrel_imm14 - The high 14 bits of a 21-bit pc-relative
// immediate.
fixup_aarch64_pcrel_branch14,
// fixup_aarch64_pcrel_branch19 - The high 19 bits of a 21-bit pc-relative
// immediate. Same encoding as fixup_aarch64_pcrel_adrhi, except this is use by
// b.cc and generates relocations directly when necessary.
fixup_aarch64_pcrel_branch19,
// fixup_aarch64_pcrel_branch26 - The high 26 bits of a 28-bit pc-relative
// immediate.
fixup_aarch64_pcrel_branch26,
// fixup_aarch64_pcrel_call26 - The high 26 bits of a 28-bit pc-relative
// immediate. Distinguished from branch26 only on ELF.
fixup_aarch64_pcrel_call26,
// fixup_aarch64_tlsdesc_call - zero-space placeholder for the ELF
// R_AARCH64_TLSDESC_CALL relocation.
fixup_aarch64_tlsdesc_call,
// Marker
LastTargetFixupKind,
NumTargetFixupKinds = LastTargetFixupKind - FirstTargetFixupKind
};
} // end namespace AArch64
} // end namespace llvm
#endif

View File

@ -1,4 +1,4 @@
//===-- ARM64MCAsmInfo.cpp - ARM64 asm properties -----------------------===//
//===-- AArch64MCAsmInfo.cpp - AArch64 asm properties ---------------------===//
//
// The LLVM Compiler Infrastructure
//
@ -7,11 +7,11 @@
//
//===----------------------------------------------------------------------===//
//
// This file contains the declarations of the ARM64MCAsmInfo properties.
// This file contains the declarations of the AArch64MCAsmInfo properties.
//
//===----------------------------------------------------------------------===//
#include "ARM64MCAsmInfo.h"
#include "AArch64MCAsmInfo.h"
#include "llvm/ADT/Triple.h"
#include "llvm/MC/MCExpr.h"
#include "llvm/MC/MCContext.h"
@ -26,13 +26,13 @@ enum AsmWriterVariantTy {
};
static cl::opt<AsmWriterVariantTy> AsmWriterVariant(
"arm64-neon-syntax", cl::init(Default),
cl::desc("Choose style of NEON code to emit from ARM64 backend:"),
"aarch64-neon-syntax", cl::init(Default),
cl::desc("Choose style of NEON code to emit from AArch64 backend:"),
cl::values(clEnumValN(Generic, "generic", "Emit generic NEON assembly"),
clEnumValN(Apple, "apple", "Emit Apple-style NEON assembly"),
clEnumValEnd));
ARM64MCAsmInfoDarwin::ARM64MCAsmInfoDarwin() {
AArch64MCAsmInfoDarwin::AArch64MCAsmInfoDarwin() {
// We prefer NEON instructions to be printed in the short form.
AssemblerDialect = AsmWriterVariant == Default ? 1 : AsmWriterVariant;
@ -49,7 +49,7 @@ ARM64MCAsmInfoDarwin::ARM64MCAsmInfoDarwin() {
ExceptionsType = ExceptionHandling::DwarfCFI;
}
const MCExpr *ARM64MCAsmInfoDarwin::getExprForPersonalitySymbol(
const MCExpr *AArch64MCAsmInfoDarwin::getExprForPersonalitySymbol(
const MCSymbol *Sym, unsigned Encoding, MCStreamer &Streamer) const {
// On Darwin, we can reference dwarf symbols with foo@GOT-., which
// is an indirect pc-relative reference. The default implementation
@ -64,9 +64,9 @@ const MCExpr *ARM64MCAsmInfoDarwin::getExprForPersonalitySymbol(
return MCBinaryExpr::CreateSub(Res, PC, Context);
}
ARM64MCAsmInfoELF::ARM64MCAsmInfoELF(StringRef TT) {
AArch64MCAsmInfoELF::AArch64MCAsmInfoELF(StringRef TT) {
Triple T(TT);
if (T.getArch() == Triple::arm64_be)
if (T.getArch() == Triple::arm64_be || T.getArch() == Triple::aarch64_be)
IsLittleEndian = false;
// We prefer NEON instructions to be printed in the short form.

View File

@ -1,4 +1,4 @@
//=====-- ARM64MCAsmInfo.h - ARM64 asm properties -----------*- C++ -*--====//
//=====-- AArch64MCAsmInfo.h - AArch64 asm properties ---------*- C++ -*--====//
//
// The LLVM Compiler Infrastructure
//
@ -7,12 +7,12 @@
//
//===----------------------------------------------------------------------===//
//
// This file contains the declaration of the ARM64MCAsmInfo class.
// This file contains the declaration of the AArch64MCAsmInfo class.
//
//===----------------------------------------------------------------------===//
#ifndef ARM64TARGETASMINFO_H
#define ARM64TARGETASMINFO_H
#ifndef AArch64TARGETASMINFO_H
#define AArch64TARGETASMINFO_H
#include "llvm/MC/MCAsmInfoDarwin.h"
@ -20,15 +20,15 @@ namespace llvm {
class Target;
class StringRef;
class MCStreamer;
struct ARM64MCAsmInfoDarwin : public MCAsmInfoDarwin {
explicit ARM64MCAsmInfoDarwin();
struct AArch64MCAsmInfoDarwin : public MCAsmInfoDarwin {
explicit AArch64MCAsmInfoDarwin();
const MCExpr *
getExprForPersonalitySymbol(const MCSymbol *Sym, unsigned Encoding,
MCStreamer &Streamer) const override;
};
struct ARM64MCAsmInfoELF : public MCAsmInfo {
explicit ARM64MCAsmInfoELF(StringRef TT);
struct AArch64MCAsmInfoELF : public MCAsmInfo {
explicit AArch64MCAsmInfoELF(StringRef TT);
};
} // namespace llvm

View File

@ -1,4 +1,4 @@
//===-- ARM64/ARM64MCCodeEmitter.cpp - Convert ARM64 code to machine code -===//
//=- AArch64/AArch64MCCodeEmitter.cpp - Convert AArch64 code to machine code-=//
//
// The LLVM Compiler Infrastructure
//
@ -7,14 +7,14 @@
//
//===----------------------------------------------------------------------===//
//
// This file implements the ARM64MCCodeEmitter class.
// This file implements the AArch64MCCodeEmitter class.
//
//===----------------------------------------------------------------------===//
#include "MCTargetDesc/ARM64AddressingModes.h"
#include "MCTargetDesc/ARM64FixupKinds.h"
#include "MCTargetDesc/ARM64MCExpr.h"
#include "Utils/ARM64BaseInfo.h"
#include "MCTargetDesc/AArch64AddressingModes.h"
#include "MCTargetDesc/AArch64FixupKinds.h"
#include "MCTargetDesc/AArch64MCExpr.h"
#include "Utils/AArch64BaseInfo.h"
#include "llvm/MC/MCCodeEmitter.h"
#include "llvm/MC/MCContext.h"
#include "llvm/MC/MCInst.h"
@ -32,17 +32,17 @@ STATISTIC(MCNumFixups, "Number of MC fixups created.");
namespace {
class ARM64MCCodeEmitter : public MCCodeEmitter {
class AArch64MCCodeEmitter : public MCCodeEmitter {
MCContext &Ctx;
ARM64MCCodeEmitter(const ARM64MCCodeEmitter &); // DO NOT IMPLEMENT
void operator=(const ARM64MCCodeEmitter &); // DO NOT IMPLEMENT
AArch64MCCodeEmitter(const AArch64MCCodeEmitter &); // DO NOT IMPLEMENT
void operator=(const AArch64MCCodeEmitter &); // DO NOT IMPLEMENT
public:
ARM64MCCodeEmitter(const MCInstrInfo &mcii, const MCSubtargetInfo &sti,
AArch64MCCodeEmitter(const MCInstrInfo &mcii, const MCSubtargetInfo &sti,
MCContext &ctx)
: Ctx(ctx) {}
~ARM64MCCodeEmitter() {}
~AArch64MCCodeEmitter() {}
// getBinaryCodeForInstr - TableGen'erated function for getting the
// binary encoding for an instruction.
@ -203,19 +203,19 @@ public:
} // end anonymous namespace
MCCodeEmitter *llvm::createARM64MCCodeEmitter(const MCInstrInfo &MCII,
const MCRegisterInfo &MRI,
const MCSubtargetInfo &STI,
MCContext &Ctx) {
return new ARM64MCCodeEmitter(MCII, STI, Ctx);
MCCodeEmitter *llvm::createAArch64MCCodeEmitter(const MCInstrInfo &MCII,
const MCRegisterInfo &MRI,
const MCSubtargetInfo &STI,
MCContext &Ctx) {
return new AArch64MCCodeEmitter(MCII, STI, Ctx);
}
/// getMachineOpValue - Return binary encoding of operand. If the machine
/// operand requires relocation, record the relocation and return zero.
unsigned
ARM64MCCodeEmitter::getMachineOpValue(const MCInst &MI, const MCOperand &MO,
SmallVectorImpl<MCFixup> &Fixups,
const MCSubtargetInfo &STI) const {
AArch64MCCodeEmitter::getMachineOpValue(const MCInst &MI, const MCOperand &MO,
SmallVectorImpl<MCFixup> &Fixups,
const MCSubtargetInfo &STI) const {
if (MO.isReg())
return Ctx.getRegisterInfo()->getEncodingValue(MO.getReg());
else {
@ -228,9 +228,9 @@ ARM64MCCodeEmitter::getMachineOpValue(const MCInst &MI, const MCOperand &MO,
}
template<unsigned FixupKind> uint32_t
ARM64MCCodeEmitter::getLdStUImm12OpValue(const MCInst &MI, unsigned OpIdx,
SmallVectorImpl<MCFixup> &Fixups,
const MCSubtargetInfo &STI) const {
AArch64MCCodeEmitter::getLdStUImm12OpValue(const MCInst &MI, unsigned OpIdx,
SmallVectorImpl<MCFixup> &Fixups,
const MCSubtargetInfo &STI) const {
const MCOperand &MO = MI.getOperand(OpIdx);
uint32_t ImmVal = 0;
@ -249,9 +249,9 @@ ARM64MCCodeEmitter::getLdStUImm12OpValue(const MCInst &MI, unsigned OpIdx,
/// getAdrLabelOpValue - Return encoding info for 21-bit immediate ADR label
/// target.
uint32_t
ARM64MCCodeEmitter::getAdrLabelOpValue(const MCInst &MI, unsigned OpIdx,
SmallVectorImpl<MCFixup> &Fixups,
const MCSubtargetInfo &STI) const {
AArch64MCCodeEmitter::getAdrLabelOpValue(const MCInst &MI, unsigned OpIdx,
SmallVectorImpl<MCFixup> &Fixups,
const MCSubtargetInfo &STI) const {
const MCOperand &MO = MI.getOperand(OpIdx);
// If the destination is an immediate, we have nothing to do.
@ -260,9 +260,9 @@ ARM64MCCodeEmitter::getAdrLabelOpValue(const MCInst &MI, unsigned OpIdx,
assert(MO.isExpr() && "Unexpected target type!");
const MCExpr *Expr = MO.getExpr();
MCFixupKind Kind = MI.getOpcode() == ARM64::ADR
? MCFixupKind(ARM64::fixup_arm64_pcrel_adr_imm21)
: MCFixupKind(ARM64::fixup_arm64_pcrel_adrp_imm21);
MCFixupKind Kind = MI.getOpcode() == AArch64::ADR
? MCFixupKind(AArch64::fixup_aarch64_pcrel_adr_imm21)
: MCFixupKind(AArch64::fixup_aarch64_pcrel_adrp_imm21);
Fixups.push_back(MCFixup::Create(0, Expr, Kind, MI.getLoc()));
MCNumFixups += 1;
@ -275,15 +275,15 @@ ARM64MCCodeEmitter::getAdrLabelOpValue(const MCInst &MI, unsigned OpIdx,
/// the 2-bit shift field. The shift field is stored in bits 13-14 of the
/// return value.
uint32_t
ARM64MCCodeEmitter::getAddSubImmOpValue(const MCInst &MI, unsigned OpIdx,
SmallVectorImpl<MCFixup> &Fixups,
const MCSubtargetInfo &STI) const {
AArch64MCCodeEmitter::getAddSubImmOpValue(const MCInst &MI, unsigned OpIdx,
SmallVectorImpl<MCFixup> &Fixups,
const MCSubtargetInfo &STI) const {
// Suboperands are [imm, shifter].
const MCOperand &MO = MI.getOperand(OpIdx);
const MCOperand &MO1 = MI.getOperand(OpIdx + 1);
assert(ARM64_AM::getShiftType(MO1.getImm()) == ARM64_AM::LSL &&
assert(AArch64_AM::getShiftType(MO1.getImm()) == AArch64_AM::LSL &&
"unexpected shift type for add/sub immediate");
unsigned ShiftVal = ARM64_AM::getShiftValue(MO1.getImm());
unsigned ShiftVal = AArch64_AM::getShiftValue(MO1.getImm());
assert((ShiftVal == 0 || ShiftVal == 12) &&
"unexpected shift value for add/sub immediate");
if (MO.isImm())
@ -292,7 +292,7 @@ ARM64MCCodeEmitter::getAddSubImmOpValue(const MCInst &MI, unsigned OpIdx,
const MCExpr *Expr = MO.getExpr();
// Encode the 12 bits of the fixup.
MCFixupKind Kind = MCFixupKind(ARM64::fixup_arm64_add_imm12);
MCFixupKind Kind = MCFixupKind(AArch64::fixup_aarch64_add_imm12);
Fixups.push_back(MCFixup::Create(0, Expr, Kind, MI.getLoc()));
++MCNumFixups;
@ -302,7 +302,7 @@ ARM64MCCodeEmitter::getAddSubImmOpValue(const MCInst &MI, unsigned OpIdx,
/// getCondBranchTargetOpValue - Return the encoded value for a conditional
/// branch target.
uint32_t ARM64MCCodeEmitter::getCondBranchTargetOpValue(
uint32_t AArch64MCCodeEmitter::getCondBranchTargetOpValue(
const MCInst &MI, unsigned OpIdx, SmallVectorImpl<MCFixup> &Fixups,
const MCSubtargetInfo &STI) const {
const MCOperand &MO = MI.getOperand(OpIdx);
@ -312,7 +312,7 @@ uint32_t ARM64MCCodeEmitter::getCondBranchTargetOpValue(
return MO.getImm();
assert(MO.isExpr() && "Unexpected target type!");
MCFixupKind Kind = MCFixupKind(ARM64::fixup_arm64_pcrel_branch19);
MCFixupKind Kind = MCFixupKind(AArch64::fixup_aarch64_pcrel_branch19);
Fixups.push_back(MCFixup::Create(0, MO.getExpr(), Kind, MI.getLoc()));
++MCNumFixups;
@ -324,9 +324,9 @@ uint32_t ARM64MCCodeEmitter::getCondBranchTargetOpValue(
/// getLoadLiteralOpValue - Return the encoded value for a load-literal
/// pc-relative address.
uint32_t
ARM64MCCodeEmitter::getLoadLiteralOpValue(const MCInst &MI, unsigned OpIdx,
SmallVectorImpl<MCFixup> &Fixups,
const MCSubtargetInfo &STI) const {
AArch64MCCodeEmitter::getLoadLiteralOpValue(const MCInst &MI, unsigned OpIdx,
SmallVectorImpl<MCFixup> &Fixups,
const MCSubtargetInfo &STI) const {
const MCOperand &MO = MI.getOperand(OpIdx);
// If the destination is an immediate, we have nothing to do.
@ -334,7 +334,7 @@ ARM64MCCodeEmitter::getLoadLiteralOpValue(const MCInst &MI, unsigned OpIdx,
return MO.getImm();
assert(MO.isExpr() && "Unexpected target type!");
MCFixupKind Kind = MCFixupKind(ARM64::fixup_arm64_ldr_pcrel_imm19);
MCFixupKind Kind = MCFixupKind(AArch64::fixup_aarch64_ldr_pcrel_imm19);
Fixups.push_back(MCFixup::Create(0, MO.getExpr(), Kind, MI.getLoc()));
++MCNumFixups;
@ -344,18 +344,18 @@ ARM64MCCodeEmitter::getLoadLiteralOpValue(const MCInst &MI, unsigned OpIdx,
}
uint32_t
ARM64MCCodeEmitter::getMemExtendOpValue(const MCInst &MI, unsigned OpIdx,
SmallVectorImpl<MCFixup> &Fixups,
const MCSubtargetInfo &STI) const {
AArch64MCCodeEmitter::getMemExtendOpValue(const MCInst &MI, unsigned OpIdx,
SmallVectorImpl<MCFixup> &Fixups,
const MCSubtargetInfo &STI) const {
unsigned SignExtend = MI.getOperand(OpIdx).getImm();
unsigned DoShift = MI.getOperand(OpIdx + 1).getImm();
return (SignExtend << 1) | DoShift;
}
uint32_t
ARM64MCCodeEmitter::getMoveWideImmOpValue(const MCInst &MI, unsigned OpIdx,
SmallVectorImpl<MCFixup> &Fixups,
const MCSubtargetInfo &STI) const {
AArch64MCCodeEmitter::getMoveWideImmOpValue(const MCInst &MI, unsigned OpIdx,
SmallVectorImpl<MCFixup> &Fixups,
const MCSubtargetInfo &STI) const {
const MCOperand &MO = MI.getOperand(OpIdx);
if (MO.isImm())
@ -363,7 +363,7 @@ ARM64MCCodeEmitter::getMoveWideImmOpValue(const MCInst &MI, unsigned OpIdx,
assert(MO.isExpr() && "Unexpected movz/movk immediate");
Fixups.push_back(MCFixup::Create(
0, MO.getExpr(), MCFixupKind(ARM64::fixup_arm64_movw), MI.getLoc()));
0, MO.getExpr(), MCFixupKind(AArch64::fixup_aarch64_movw), MI.getLoc()));
++MCNumFixups;
@ -372,7 +372,7 @@ ARM64MCCodeEmitter::getMoveWideImmOpValue(const MCInst &MI, unsigned OpIdx,
/// getTestBranchTargetOpValue - Return the encoded value for a test-bit-and-
/// branch target.
uint32_t ARM64MCCodeEmitter::getTestBranchTargetOpValue(
uint32_t AArch64MCCodeEmitter::getTestBranchTargetOpValue(
const MCInst &MI, unsigned OpIdx, SmallVectorImpl<MCFixup> &Fixups,
const MCSubtargetInfo &STI) const {
const MCOperand &MO = MI.getOperand(OpIdx);
@ -382,7 +382,7 @@ uint32_t ARM64MCCodeEmitter::getTestBranchTargetOpValue(
return MO.getImm();
assert(MO.isExpr() && "Unexpected ADR target type!");
MCFixupKind Kind = MCFixupKind(ARM64::fixup_arm64_pcrel_branch14);
MCFixupKind Kind = MCFixupKind(AArch64::fixup_aarch64_pcrel_branch14);
Fixups.push_back(MCFixup::Create(0, MO.getExpr(), Kind, MI.getLoc()));
++MCNumFixups;
@ -394,9 +394,9 @@ uint32_t ARM64MCCodeEmitter::getTestBranchTargetOpValue(
/// getBranchTargetOpValue - Return the encoded value for an unconditional
/// branch target.
uint32_t
ARM64MCCodeEmitter::getBranchTargetOpValue(const MCInst &MI, unsigned OpIdx,
SmallVectorImpl<MCFixup> &Fixups,
const MCSubtargetInfo &STI) const {
AArch64MCCodeEmitter::getBranchTargetOpValue(const MCInst &MI, unsigned OpIdx,
SmallVectorImpl<MCFixup> &Fixups,
const MCSubtargetInfo &STI) const {
const MCOperand &MO = MI.getOperand(OpIdx);
// If the destination is an immediate, we have nothing to do.
@ -404,9 +404,9 @@ ARM64MCCodeEmitter::getBranchTargetOpValue(const MCInst &MI, unsigned OpIdx,
return MO.getImm();
assert(MO.isExpr() && "Unexpected ADR target type!");
MCFixupKind Kind = MI.getOpcode() == ARM64::BL
? MCFixupKind(ARM64::fixup_arm64_pcrel_call26)
: MCFixupKind(ARM64::fixup_arm64_pcrel_branch26);
MCFixupKind Kind = MI.getOpcode() == AArch64::BL
? MCFixupKind(AArch64::fixup_aarch64_pcrel_call26)
: MCFixupKind(AArch64::fixup_aarch64_pcrel_branch26);
Fixups.push_back(MCFixup::Create(0, MO.getExpr(), Kind, MI.getLoc()));
++MCNumFixups;
@ -422,9 +422,9 @@ ARM64MCCodeEmitter::getBranchTargetOpValue(const MCInst &MI, unsigned OpIdx,
/// 10 -> 16
/// 11 -> 24
uint32_t
ARM64MCCodeEmitter::getVecShifterOpValue(const MCInst &MI, unsigned OpIdx,
SmallVectorImpl<MCFixup> &Fixups,
const MCSubtargetInfo &STI) const {
AArch64MCCodeEmitter::getVecShifterOpValue(const MCInst &MI, unsigned OpIdx,
SmallVectorImpl<MCFixup> &Fixups,
const MCSubtargetInfo &STI) const {
const MCOperand &MO = MI.getOperand(OpIdx);
assert(MO.isImm() && "Expected an immediate value for the shift amount!");
@ -446,36 +446,35 @@ ARM64MCCodeEmitter::getVecShifterOpValue(const MCInst &MI, unsigned OpIdx,
}
uint32_t
ARM64MCCodeEmitter::getSIMDShift64OpValue(const MCInst &MI, unsigned OpIdx,
SmallVectorImpl<MCFixup> &Fixups,
const MCSubtargetInfo &STI) const {
AArch64MCCodeEmitter::getSIMDShift64OpValue(const MCInst &MI, unsigned OpIdx,
SmallVectorImpl<MCFixup> &Fixups,
const MCSubtargetInfo &STI) const {
const MCOperand &MO = MI.getOperand(OpIdx);
assert(MO.isImm() && "Expected an immediate value for the shift amount!");
return 64 - (MO.getImm());
}
uint32_t
ARM64MCCodeEmitter::getSIMDShift64_32OpValue(const MCInst &MI, unsigned OpIdx,
SmallVectorImpl<MCFixup> &Fixups,
const MCSubtargetInfo &STI) const {
uint32_t AArch64MCCodeEmitter::getSIMDShift64_32OpValue(
const MCInst &MI, unsigned OpIdx, SmallVectorImpl<MCFixup> &Fixups,
const MCSubtargetInfo &STI) const {
const MCOperand &MO = MI.getOperand(OpIdx);
assert(MO.isImm() && "Expected an immediate value for the shift amount!");
return 64 - (MO.getImm() | 32);
}
uint32_t
ARM64MCCodeEmitter::getSIMDShift32OpValue(const MCInst &MI, unsigned OpIdx,
SmallVectorImpl<MCFixup> &Fixups,
const MCSubtargetInfo &STI) const {
AArch64MCCodeEmitter::getSIMDShift32OpValue(const MCInst &MI, unsigned OpIdx,
SmallVectorImpl<MCFixup> &Fixups,
const MCSubtargetInfo &STI) const {
const MCOperand &MO = MI.getOperand(OpIdx);
assert(MO.isImm() && "Expected an immediate value for the shift amount!");
return 32 - (MO.getImm() | 16);
}
uint32_t
ARM64MCCodeEmitter::getSIMDShift16OpValue(const MCInst &MI, unsigned OpIdx,
SmallVectorImpl<MCFixup> &Fixups,
const MCSubtargetInfo &STI) const {
AArch64MCCodeEmitter::getSIMDShift16OpValue(const MCInst &MI, unsigned OpIdx,
SmallVectorImpl<MCFixup> &Fixups,
const MCSubtargetInfo &STI) const {
const MCOperand &MO = MI.getOperand(OpIdx);
assert(MO.isImm() && "Expected an immediate value for the shift amount!");
return 16 - (MO.getImm() | 8);
@ -483,7 +482,7 @@ ARM64MCCodeEmitter::getSIMDShift16OpValue(const MCInst &MI, unsigned OpIdx,
/// getFixedPointScaleOpValue - Return the encoded value for the
// FP-to-fixed-point scale factor.
uint32_t ARM64MCCodeEmitter::getFixedPointScaleOpValue(
uint32_t AArch64MCCodeEmitter::getFixedPointScaleOpValue(
const MCInst &MI, unsigned OpIdx, SmallVectorImpl<MCFixup> &Fixups,
const MCSubtargetInfo &STI) const {
const MCOperand &MO = MI.getOperand(OpIdx);
@ -492,72 +491,72 @@ uint32_t ARM64MCCodeEmitter::getFixedPointScaleOpValue(
}
uint32_t
ARM64MCCodeEmitter::getVecShiftR64OpValue(const MCInst &MI, unsigned OpIdx,
SmallVectorImpl<MCFixup> &Fixups,
const MCSubtargetInfo &STI) const {
AArch64MCCodeEmitter::getVecShiftR64OpValue(const MCInst &MI, unsigned OpIdx,
SmallVectorImpl<MCFixup> &Fixups,
const MCSubtargetInfo &STI) const {
const MCOperand &MO = MI.getOperand(OpIdx);
assert(MO.isImm() && "Expected an immediate value for the scale amount!");
return 64 - MO.getImm();
}
uint32_t
ARM64MCCodeEmitter::getVecShiftR32OpValue(const MCInst &MI, unsigned OpIdx,
SmallVectorImpl<MCFixup> &Fixups,
const MCSubtargetInfo &STI) const {
AArch64MCCodeEmitter::getVecShiftR32OpValue(const MCInst &MI, unsigned OpIdx,
SmallVectorImpl<MCFixup> &Fixups,
const MCSubtargetInfo &STI) const {
const MCOperand &MO = MI.getOperand(OpIdx);
assert(MO.isImm() && "Expected an immediate value for the scale amount!");
return 32 - MO.getImm();
}
uint32_t
ARM64MCCodeEmitter::getVecShiftR16OpValue(const MCInst &MI, unsigned OpIdx,
SmallVectorImpl<MCFixup> &Fixups,
const MCSubtargetInfo &STI) const {
AArch64MCCodeEmitter::getVecShiftR16OpValue(const MCInst &MI, unsigned OpIdx,
SmallVectorImpl<MCFixup> &Fixups,
const MCSubtargetInfo &STI) const {
const MCOperand &MO = MI.getOperand(OpIdx);
assert(MO.isImm() && "Expected an immediate value for the scale amount!");
return 16 - MO.getImm();
}
uint32_t
ARM64MCCodeEmitter::getVecShiftR8OpValue(const MCInst &MI, unsigned OpIdx,
SmallVectorImpl<MCFixup> &Fixups,
const MCSubtargetInfo &STI) const {
AArch64MCCodeEmitter::getVecShiftR8OpValue(const MCInst &MI, unsigned OpIdx,
SmallVectorImpl<MCFixup> &Fixups,
const MCSubtargetInfo &STI) const {
const MCOperand &MO = MI.getOperand(OpIdx);
assert(MO.isImm() && "Expected an immediate value for the scale amount!");
return 8 - MO.getImm();
}
uint32_t
ARM64MCCodeEmitter::getVecShiftL64OpValue(const MCInst &MI, unsigned OpIdx,
SmallVectorImpl<MCFixup> &Fixups,
const MCSubtargetInfo &STI) const {
AArch64MCCodeEmitter::getVecShiftL64OpValue(const MCInst &MI, unsigned OpIdx,
SmallVectorImpl<MCFixup> &Fixups,
const MCSubtargetInfo &STI) const {
const MCOperand &MO = MI.getOperand(OpIdx);
assert(MO.isImm() && "Expected an immediate value for the scale amount!");
return MO.getImm() - 64;
}
uint32_t
ARM64MCCodeEmitter::getVecShiftL32OpValue(const MCInst &MI, unsigned OpIdx,
SmallVectorImpl<MCFixup> &Fixups,
const MCSubtargetInfo &STI) const {
AArch64MCCodeEmitter::getVecShiftL32OpValue(const MCInst &MI, unsigned OpIdx,
SmallVectorImpl<MCFixup> &Fixups,
const MCSubtargetInfo &STI) const {
const MCOperand &MO = MI.getOperand(OpIdx);
assert(MO.isImm() && "Expected an immediate value for the scale amount!");
return MO.getImm() - 32;
}
uint32_t
ARM64MCCodeEmitter::getVecShiftL16OpValue(const MCInst &MI, unsigned OpIdx,
SmallVectorImpl<MCFixup> &Fixups,
const MCSubtargetInfo &STI) const {
AArch64MCCodeEmitter::getVecShiftL16OpValue(const MCInst &MI, unsigned OpIdx,
SmallVectorImpl<MCFixup> &Fixups,
const MCSubtargetInfo &STI) const {
const MCOperand &MO = MI.getOperand(OpIdx);
assert(MO.isImm() && "Expected an immediate value for the scale amount!");
return MO.getImm() - 16;
}
uint32_t
ARM64MCCodeEmitter::getVecShiftL8OpValue(const MCInst &MI, unsigned OpIdx,
SmallVectorImpl<MCFixup> &Fixups,
const MCSubtargetInfo &STI) const {
AArch64MCCodeEmitter::getVecShiftL8OpValue(const MCInst &MI, unsigned OpIdx,
SmallVectorImpl<MCFixup> &Fixups,
const MCSubtargetInfo &STI) const {
const MCOperand &MO = MI.getOperand(OpIdx);
assert(MO.isImm() && "Expected an immediate value for the scale amount!");
return MO.getImm() - 8;
@ -565,20 +564,19 @@ ARM64MCCodeEmitter::getVecShiftL8OpValue(const MCInst &MI, unsigned OpIdx,
/// getMoveVecShifterOpValue - Return the encoded value for the vector move
/// shifter (MSL).
uint32_t
ARM64MCCodeEmitter::getMoveVecShifterOpValue(const MCInst &MI, unsigned OpIdx,
SmallVectorImpl<MCFixup> &Fixups,
const MCSubtargetInfo &STI) const {
uint32_t AArch64MCCodeEmitter::getMoveVecShifterOpValue(
const MCInst &MI, unsigned OpIdx, SmallVectorImpl<MCFixup> &Fixups,
const MCSubtargetInfo &STI) const {
const MCOperand &MO = MI.getOperand(OpIdx);
assert(MO.isImm() &&
"Expected an immediate value for the move shift amount!");
unsigned ShiftVal = ARM64_AM::getShiftValue(MO.getImm());
unsigned ShiftVal = AArch64_AM::getShiftValue(MO.getImm());
assert((ShiftVal == 8 || ShiftVal == 16) && "Invalid shift amount!");
return ShiftVal == 8 ? 0 : 1;
}
unsigned ARM64MCCodeEmitter::fixMOVZ(const MCInst &MI, unsigned EncodedValue,
const MCSubtargetInfo &STI) const {
unsigned AArch64MCCodeEmitter::fixMOVZ(const MCInst &MI, unsigned EncodedValue,
const MCSubtargetInfo &STI) const {
// If one of the signed fixup kinds is applied to a MOVZ instruction, the
// eventual result could be either a MOVZ or a MOVN. It's the MCCodeEmitter's
// job to ensure that any bits possibly affected by this are 0. This means we
@ -589,15 +587,15 @@ unsigned ARM64MCCodeEmitter::fixMOVZ(const MCInst &MI, unsigned EncodedValue,
if (UImm16MO.isImm())
return EncodedValue;
const ARM64MCExpr *A64E = cast<ARM64MCExpr>(UImm16MO.getExpr());
const AArch64MCExpr *A64E = cast<AArch64MCExpr>(UImm16MO.getExpr());
switch (A64E->getKind()) {
case ARM64MCExpr::VK_DTPREL_G2:
case ARM64MCExpr::VK_DTPREL_G1:
case ARM64MCExpr::VK_DTPREL_G0:
case ARM64MCExpr::VK_GOTTPREL_G1:
case ARM64MCExpr::VK_TPREL_G2:
case ARM64MCExpr::VK_TPREL_G1:
case ARM64MCExpr::VK_TPREL_G0:
case AArch64MCExpr::VK_DTPREL_G2:
case AArch64MCExpr::VK_DTPREL_G1:
case AArch64MCExpr::VK_DTPREL_G0:
case AArch64MCExpr::VK_GOTTPREL_G1:
case AArch64MCExpr::VK_TPREL_G2:
case AArch64MCExpr::VK_TPREL_G1:
case AArch64MCExpr::VK_TPREL_G0:
return EncodedValue & ~(1u << 30);
default:
// Nothing to do for an unsigned fixup.
@ -608,14 +606,14 @@ unsigned ARM64MCCodeEmitter::fixMOVZ(const MCInst &MI, unsigned EncodedValue,
return EncodedValue & ~(1u << 30);
}
void ARM64MCCodeEmitter::EncodeInstruction(const MCInst &MI, raw_ostream &OS,
SmallVectorImpl<MCFixup> &Fixups,
const MCSubtargetInfo &STI) const {
if (MI.getOpcode() == ARM64::TLSDESCCALL) {
void AArch64MCCodeEmitter::EncodeInstruction(const MCInst &MI, raw_ostream &OS,
SmallVectorImpl<MCFixup> &Fixups,
const MCSubtargetInfo &STI) const {
if (MI.getOpcode() == AArch64::TLSDESCCALL) {
// This is a directive which applies an R_AARCH64_TLSDESC_CALL to the
// following (BLR) instruction. It doesn't emit any code itself so it
// doesn't go through the normal TableGenerated channels.
MCFixupKind Fixup = MCFixupKind(ARM64::fixup_arm64_tlsdesc_call);
MCFixupKind Fixup = MCFixupKind(AArch64::fixup_aarch64_tlsdesc_call);
Fixups.push_back(MCFixup::Create(0, MI.getOperand(0).getExpr(), Fixup));
return;
}
@ -626,9 +624,9 @@ void ARM64MCCodeEmitter::EncodeInstruction(const MCInst &MI, raw_ostream &OS,
}
unsigned
ARM64MCCodeEmitter::fixMulHigh(const MCInst &MI,
unsigned EncodedValue,
const MCSubtargetInfo &STI) const {
AArch64MCCodeEmitter::fixMulHigh(const MCInst &MI,
unsigned EncodedValue,
const MCSubtargetInfo &STI) const {
// The Ra field of SMULH and UMULH is unused: it should be assembled as 31
// (i.e. all bits 1) but is ignored by the processor.
EncodedValue |= 0x1f << 10;
@ -636,23 +634,21 @@ ARM64MCCodeEmitter::fixMulHigh(const MCInst &MI,
}
template<int hasRs, int hasRt2> unsigned
ARM64MCCodeEmitter::fixLoadStoreExclusive(const MCInst &MI,
unsigned EncodedValue,
const MCSubtargetInfo &STI) const {
AArch64MCCodeEmitter::fixLoadStoreExclusive(const MCInst &MI,
unsigned EncodedValue,
const MCSubtargetInfo &STI) const {
if (!hasRs) EncodedValue |= 0x001F0000;
if (!hasRt2) EncodedValue |= 0x00007C00;
return EncodedValue;
}
unsigned
ARM64MCCodeEmitter::fixOneOperandFPComparison(const MCInst &MI,
unsigned EncodedValue,
const MCSubtargetInfo &STI) const {
unsigned AArch64MCCodeEmitter::fixOneOperandFPComparison(
const MCInst &MI, unsigned EncodedValue, const MCSubtargetInfo &STI) const {
// The Rm field of FCMP and friends is unused - it should be assembled
// as 0, but is ignored by the processor.
EncodedValue &= ~(0x1f << 16);
return EncodedValue;
}
#include "ARM64GenMCCodeEmitter.inc"
#include "AArch64GenMCCodeEmitter.inc"

View File

@ -1,4 +1,4 @@
//===-- ARM64MCExpr.cpp - ARM64 specific MC expression classes --------===//
//===-- AArch64MCExpr.cpp - AArch64 specific MC expression classes --------===//
//
// The LLVM Compiler Infrastructure
//
@ -12,7 +12,7 @@
//
//===----------------------------------------------------------------------===//
#include "ARM64MCExpr.h"
#include "AArch64MCExpr.h"
#include "llvm/MC/MCAssembler.h"
#include "llvm/MC/MCContext.h"
#include "llvm/MC/MCELF.h"
@ -25,12 +25,12 @@ using namespace llvm;
#define DEBUG_TYPE "aarch64symbolrefexpr"
const ARM64MCExpr *ARM64MCExpr::Create(const MCExpr *Expr, VariantKind Kind,
const AArch64MCExpr *AArch64MCExpr::Create(const MCExpr *Expr, VariantKind Kind,
MCContext &Ctx) {
return new (Ctx) ARM64MCExpr(Expr, Kind);
return new (Ctx) AArch64MCExpr(Expr, Kind);
}
StringRef ARM64MCExpr::getVariantKindName() const {
StringRef AArch64MCExpr::getVariantKindName() const {
switch (static_cast<uint32_t>(getKind())) {
case VK_CALL: return "";
case VK_LO12: return ":lo12:";
@ -75,7 +75,7 @@ StringRef ARM64MCExpr::getVariantKindName() const {
}
}
void ARM64MCExpr::PrintImpl(raw_ostream &OS) const {
void AArch64MCExpr::PrintImpl(raw_ostream &OS) const {
if (getKind() != VK_NONE)
OS << getVariantKindName();
OS << *Expr;
@ -110,15 +110,15 @@ static void AddValueSymbolsImpl(const MCExpr *Value, MCAssembler *Asm) {
}
}
void ARM64MCExpr::AddValueSymbols(MCAssembler *Asm) const {
void AArch64MCExpr::AddValueSymbols(MCAssembler *Asm) const {
AddValueSymbolsImpl(getSubExpr(), Asm);
}
const MCSection *ARM64MCExpr::FindAssociatedSection() const {
const MCSection *AArch64MCExpr::FindAssociatedSection() const {
llvm_unreachable("FIXME: what goes here?");
}
bool ARM64MCExpr::EvaluateAsRelocatableImpl(MCValue &Res,
bool AArch64MCExpr::EvaluateAsRelocatableImpl(MCValue &Res,
const MCAsmLayout *Layout) const {
if (!getSubExpr()->EvaluateAsRelocatable(Res, Layout))
return false;
@ -159,7 +159,7 @@ static void fixELFSymbolsInTLSFixupsImpl(const MCExpr *Expr, MCAssembler &Asm) {
}
}
void ARM64MCExpr::fixELFSymbolsInTLSFixups(MCAssembler &Asm) const {
void AArch64MCExpr::fixELFSymbolsInTLSFixups(MCAssembler &Asm) const {
switch (getSymbolLoc(Kind)) {
default:
return;

View File

@ -1,4 +1,4 @@
//=---- ARM64MCExpr.h - ARM64 specific MC expression classes ------*- C++ -*-=//
//=--- AArch64MCExpr.h - AArch64 specific MC expression classes ---*- C++ -*-=//
//
// The LLVM Compiler Infrastructure
//
@ -7,20 +7,20 @@
//
//===----------------------------------------------------------------------===//
//
// This file describes ARM64-specific MCExprs, used for modifiers like
// This file describes AArch64-specific MCExprs, used for modifiers like
// ":lo12:" or ":gottprel_g1:".
//
//===----------------------------------------------------------------------===//
#ifndef LLVM_ARM64MCEXPR_H
#define LLVM_ARM64MCEXPR_H
#ifndef LLVM_AArch64MCEXPR_H
#define LLVM_AArch64MCEXPR_H
#include "llvm/MC/MCExpr.h"
#include "llvm/Support/ErrorHandling.h"
namespace llvm {
class ARM64MCExpr : public MCTargetExpr {
class AArch64MCExpr : public MCTargetExpr {
public:
enum VariantKind {
VK_NONE = 0x000,
@ -105,14 +105,14 @@ private:
const MCExpr *Expr;
const VariantKind Kind;
explicit ARM64MCExpr(const MCExpr *Expr, VariantKind Kind)
explicit AArch64MCExpr(const MCExpr *Expr, VariantKind Kind)
: Expr(Expr), Kind(Kind) {}
public:
/// @name Construction
/// @{
static const ARM64MCExpr *Create(const MCExpr *Expr, VariantKind Kind,
static const AArch64MCExpr *Create(const MCExpr *Expr, VariantKind Kind,
MCContext &Ctx);
/// @}
@ -160,7 +160,7 @@ public:
return E->getKind() == MCExpr::Target;
}
static bool classof(const ARM64MCExpr *) { return true; }
static bool classof(const AArch64MCExpr *) { return true; }
};
} // end namespace llvm

View File

@ -0,0 +1,225 @@
//===-- AArch64MCTargetDesc.cpp - AArch64 Target Descriptions ---*- C++ -*-===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// This file provides AArch64 specific target descriptions.
//
//===----------------------------------------------------------------------===//
#include "AArch64MCTargetDesc.h"
#include "AArch64ELFStreamer.h"
#include "AArch64MCAsmInfo.h"
#include "InstPrinter/AArch64InstPrinter.h"
#include "llvm/MC/MCCodeGenInfo.h"
#include "llvm/MC/MCInstrInfo.h"
#include "llvm/MC/MCRegisterInfo.h"
#include "llvm/MC/MCStreamer.h"
#include "llvm/MC/MCSubtargetInfo.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/TargetRegistry.h"
using namespace llvm;
#define GET_INSTRINFO_MC_DESC
#include "AArch64GenInstrInfo.inc"
#define GET_SUBTARGETINFO_MC_DESC
#include "AArch64GenSubtargetInfo.inc"
#define GET_REGINFO_MC_DESC
#include "AArch64GenRegisterInfo.inc"
static MCInstrInfo *createAArch64MCInstrInfo() {
MCInstrInfo *X = new MCInstrInfo();
InitAArch64MCInstrInfo(X);
return X;
}
static MCSubtargetInfo *
createAArch64MCSubtargetInfo(StringRef TT, StringRef CPU, StringRef FS) {
MCSubtargetInfo *X = new MCSubtargetInfo();
if (CPU.empty())
CPU = "generic";
InitAArch64MCSubtargetInfo(X, TT, CPU, FS);
return X;
}
static MCRegisterInfo *createAArch64MCRegisterInfo(StringRef Triple) {
MCRegisterInfo *X = new MCRegisterInfo();
InitAArch64MCRegisterInfo(X, AArch64::LR);
return X;
}
static MCAsmInfo *createAArch64MCAsmInfo(const MCRegisterInfo &MRI,
StringRef TT) {
Triple TheTriple(TT);
MCAsmInfo *MAI;
if (TheTriple.isOSDarwin())
MAI = new AArch64MCAsmInfoDarwin();
else {
assert(TheTriple.isOSBinFormatELF() && "Only expect Darwin or ELF");
MAI = new AArch64MCAsmInfoELF(TT);
}
// Initial state of the frame pointer is SP.
unsigned Reg = MRI.getDwarfRegNum(AArch64::SP, true);
MCCFIInstruction Inst = MCCFIInstruction::createDefCfa(nullptr, Reg, 0);
MAI->addInitialFrameState(Inst);
return MAI;
}
static MCCodeGenInfo *createAArch64MCCodeGenInfo(StringRef TT, Reloc::Model RM,
CodeModel::Model CM,
CodeGenOpt::Level OL) {
Triple TheTriple(TT);
assert((TheTriple.isOSBinFormatELF() || TheTriple.isOSBinFormatMachO()) &&
"Only expect Darwin and ELF targets");
if (CM == CodeModel::Default)
CM = CodeModel::Small;
// The default MCJIT memory managers make no guarantees about where they can
// find an executable page; JITed code needs to be able to refer to globals
// no matter how far away they are.
else if (CM == CodeModel::JITDefault)
CM = CodeModel::Large;
else if (CM != CodeModel::Small && CM != CodeModel::Large)
report_fatal_error(
"Only small and large code models are allowed on AArch64");
// AArch64 Darwin is always PIC.
if (TheTriple.isOSDarwin())
RM = Reloc::PIC_;
// On ELF platforms the default static relocation model has a smart enough
// linker to cope with referencing external symbols defined in a shared
// library. Hence DynamicNoPIC doesn't need to be promoted to PIC.
else if (RM == Reloc::Default || RM == Reloc::DynamicNoPIC)
RM = Reloc::Static;
MCCodeGenInfo *X = new MCCodeGenInfo();
X->InitMCCodeGenInfo(RM, CM, OL);
return X;
}
static MCInstPrinter *createAArch64MCInstPrinter(const Target &T,
unsigned SyntaxVariant,
const MCAsmInfo &MAI,
const MCInstrInfo &MII,
const MCRegisterInfo &MRI,
const MCSubtargetInfo &STI) {
if (SyntaxVariant == 0)
return new AArch64InstPrinter(MAI, MII, MRI, STI);
if (SyntaxVariant == 1)
return new AArch64AppleInstPrinter(MAI, MII, MRI, STI);
return nullptr;
}
static MCStreamer *createMCStreamer(const Target &T, StringRef TT,
MCContext &Ctx, MCAsmBackend &TAB,
raw_ostream &OS, MCCodeEmitter *Emitter,
const MCSubtargetInfo &STI, bool RelaxAll,
bool NoExecStack) {
Triple TheTriple(TT);
if (TheTriple.isOSDarwin())
return createMachOStreamer(Ctx, TAB, OS, Emitter, RelaxAll,
/*LabelSections*/ true);
return createAArch64ELFStreamer(Ctx, TAB, OS, Emitter, RelaxAll, NoExecStack);
}
// Force static initialization.
extern "C" void LLVMInitializeAArch64TargetMC() {
// Register the MC asm info.
RegisterMCAsmInfoFn X(TheAArch64leTarget, createAArch64MCAsmInfo);
RegisterMCAsmInfoFn Y(TheAArch64beTarget, createAArch64MCAsmInfo);
RegisterMCAsmInfoFn Z(TheARM64leTarget, createAArch64MCAsmInfo);
RegisterMCAsmInfoFn W(TheARM64beTarget, createAArch64MCAsmInfo);
// Register the MC codegen info.
TargetRegistry::RegisterMCCodeGenInfo(TheAArch64leTarget,
createAArch64MCCodeGenInfo);
TargetRegistry::RegisterMCCodeGenInfo(TheAArch64beTarget,
createAArch64MCCodeGenInfo);
TargetRegistry::RegisterMCCodeGenInfo(TheARM64leTarget,
createAArch64MCCodeGenInfo);
TargetRegistry::RegisterMCCodeGenInfo(TheARM64beTarget,
createAArch64MCCodeGenInfo);
// Register the MC instruction info.
TargetRegistry::RegisterMCInstrInfo(TheAArch64leTarget,
createAArch64MCInstrInfo);
TargetRegistry::RegisterMCInstrInfo(TheAArch64beTarget,
createAArch64MCInstrInfo);
TargetRegistry::RegisterMCInstrInfo(TheARM64leTarget,
createAArch64MCInstrInfo);
TargetRegistry::RegisterMCInstrInfo(TheARM64beTarget,
createAArch64MCInstrInfo);
// Register the MC register info.
TargetRegistry::RegisterMCRegInfo(TheAArch64leTarget,
createAArch64MCRegisterInfo);
TargetRegistry::RegisterMCRegInfo(TheAArch64beTarget,
createAArch64MCRegisterInfo);
TargetRegistry::RegisterMCRegInfo(TheARM64leTarget,
createAArch64MCRegisterInfo);
TargetRegistry::RegisterMCRegInfo(TheARM64beTarget,
createAArch64MCRegisterInfo);
// Register the MC subtarget info.
TargetRegistry::RegisterMCSubtargetInfo(TheAArch64leTarget,
createAArch64MCSubtargetInfo);
TargetRegistry::RegisterMCSubtargetInfo(TheAArch64beTarget,
createAArch64MCSubtargetInfo);
TargetRegistry::RegisterMCSubtargetInfo(TheARM64leTarget,
createAArch64MCSubtargetInfo);
TargetRegistry::RegisterMCSubtargetInfo(TheARM64beTarget,
createAArch64MCSubtargetInfo);
// Register the asm backend.
TargetRegistry::RegisterMCAsmBackend(TheAArch64leTarget,
createAArch64leAsmBackend);
TargetRegistry::RegisterMCAsmBackend(TheAArch64beTarget,
createAArch64beAsmBackend);
TargetRegistry::RegisterMCAsmBackend(TheARM64leTarget,
createAArch64leAsmBackend);
TargetRegistry::RegisterMCAsmBackend(TheARM64beTarget,
createAArch64beAsmBackend);
// Register the MC Code Emitter
TargetRegistry::RegisterMCCodeEmitter(TheAArch64leTarget,
createAArch64MCCodeEmitter);
TargetRegistry::RegisterMCCodeEmitter(TheAArch64beTarget,
createAArch64MCCodeEmitter);
TargetRegistry::RegisterMCCodeEmitter(TheARM64leTarget,
createAArch64MCCodeEmitter);
TargetRegistry::RegisterMCCodeEmitter(TheARM64beTarget,
createAArch64MCCodeEmitter);
// Register the object streamer.
TargetRegistry::RegisterMCObjectStreamer(TheAArch64leTarget,
createMCStreamer);
TargetRegistry::RegisterMCObjectStreamer(TheAArch64beTarget,
createMCStreamer);
TargetRegistry::RegisterMCObjectStreamer(TheARM64leTarget, createMCStreamer);
TargetRegistry::RegisterMCObjectStreamer(TheARM64beTarget, createMCStreamer);
// Register the MCInstPrinter.
TargetRegistry::RegisterMCInstPrinter(TheAArch64leTarget,
createAArch64MCInstPrinter);
TargetRegistry::RegisterMCInstPrinter(TheAArch64beTarget,
createAArch64MCInstPrinter);
TargetRegistry::RegisterMCInstPrinter(TheARM64leTarget,
createAArch64MCInstPrinter);
TargetRegistry::RegisterMCInstPrinter(TheARM64beTarget,
createAArch64MCInstPrinter);
}

View File

@ -1,4 +1,4 @@
//===-- ARM64MCTargetDesc.h - ARM64 Target Descriptions ---------*- C++ -*-===//
//===-- AArch64MCTargetDesc.h - AArch64 Target Descriptions -----*- C++ -*-===//
//
// The LLVM Compiler Infrastructure
//
@ -7,12 +7,12 @@
//
//===----------------------------------------------------------------------===//
//
// This file provides ARM64 specific target descriptions.
// This file provides AArch64 specific target descriptions.
//
//===----------------------------------------------------------------------===//
#ifndef ARM64MCTARGETDESC_H
#define ARM64MCTARGETDESC_H
#ifndef AArch64MCTARGETDESC_H
#define AArch64MCTARGETDESC_H
#include "llvm/Support/DataTypes.h"
#include <string>
@ -29,40 +29,42 @@ class StringRef;
class Target;
class raw_ostream;
extern Target TheARM64leTarget;
extern Target TheARM64beTarget;
extern Target TheAArch64leTarget;
extern Target TheAArch64beTarget;
extern Target TheARM64leTarget;
extern Target TheARM64beTarget;
MCCodeEmitter *createARM64MCCodeEmitter(const MCInstrInfo &MCII,
MCCodeEmitter *createAArch64MCCodeEmitter(const MCInstrInfo &MCII,
const MCRegisterInfo &MRI,
const MCSubtargetInfo &STI,
MCContext &Ctx);
MCAsmBackend *createARM64leAsmBackend(const Target &T, const MCRegisterInfo &MRI,
StringRef TT, StringRef CPU);
MCAsmBackend *createARM64beAsmBackend(const Target &T, const MCRegisterInfo &MRI,
StringRef TT, StringRef CPU);
MCAsmBackend *createAArch64leAsmBackend(const Target &T,
const MCRegisterInfo &MRI, StringRef TT,
StringRef CPU);
MCAsmBackend *createAArch64beAsmBackend(const Target &T,
const MCRegisterInfo &MRI, StringRef TT,
StringRef CPU);
MCObjectWriter *createARM64ELFObjectWriter(raw_ostream &OS, uint8_t OSABI,
bool IsLittleEndian);
MCObjectWriter *createAArch64ELFObjectWriter(raw_ostream &OS, uint8_t OSABI,
bool IsLittleEndian);
MCObjectWriter *createARM64MachObjectWriter(raw_ostream &OS, uint32_t CPUType,
MCObjectWriter *createAArch64MachObjectWriter(raw_ostream &OS, uint32_t CPUType,
uint32_t CPUSubtype);
} // End llvm namespace
// Defines symbolic names for ARM64 registers. This defines a mapping from
// Defines symbolic names for AArch64 registers. This defines a mapping from
// register name to register number.
//
#define GET_REGINFO_ENUM
#include "ARM64GenRegisterInfo.inc"
#include "AArch64GenRegisterInfo.inc"
// Defines symbolic names for the ARM64 instructions.
// Defines symbolic names for the AArch64 instructions.
//
#define GET_INSTRINFO_ENUM
#include "ARM64GenInstrInfo.inc"
#include "AArch64GenInstrInfo.inc"
#define GET_SUBTARGETINFO_ENUM
#include "ARM64GenSubtargetInfo.inc"
#include "AArch64GenSubtargetInfo.inc"
#endif

View File

@ -1,4 +1,4 @@
//===-- ARMMachObjectWriter.cpp - ARM Mach Object Writer ------------------===//
//===-- AArch64MachObjectWriter.cpp - ARM Mach Object Writer --------------===//
//
// The LLVM Compiler Infrastructure
//
@ -7,8 +7,8 @@
//
//===----------------------------------------------------------------------===//
#include "MCTargetDesc/ARM64FixupKinds.h"
#include "MCTargetDesc/ARM64MCTargetDesc.h"
#include "MCTargetDesc/AArch64FixupKinds.h"
#include "MCTargetDesc/AArch64MCTargetDesc.h"
#include "llvm/MC/MCAssembler.h"
#include "llvm/MC/MCAsmLayout.h"
#include "llvm/MC/MCContext.h"
@ -23,13 +23,13 @@
using namespace llvm;
namespace {
class ARM64MachObjectWriter : public MCMachObjectTargetWriter {
bool getARM64FixupKindMachOInfo(const MCFixup &Fixup, unsigned &RelocType,
class AArch64MachObjectWriter : public MCMachObjectTargetWriter {
bool getAArch64FixupKindMachOInfo(const MCFixup &Fixup, unsigned &RelocType,
const MCSymbolRefExpr *Sym,
unsigned &Log2Size, const MCAssembler &Asm);
public:
ARM64MachObjectWriter(uint32_t CPUType, uint32_t CPUSubtype)
AArch64MachObjectWriter(uint32_t CPUType, uint32_t CPUSubtype)
: MCMachObjectTargetWriter(true /* is64Bit */, CPUType, CPUSubtype,
/*UseAggressiveSymbolFolding=*/true) {}
@ -40,7 +40,7 @@ public:
};
}
bool ARM64MachObjectWriter::getARM64FixupKindMachOInfo(
bool AArch64MachObjectWriter::getAArch64FixupKindMachOInfo(
const MCFixup &Fixup, unsigned &RelocType, const MCSymbolRefExpr *Sym,
unsigned &Log2Size, const MCAssembler &Asm) {
RelocType = unsigned(MachO::ARM64_RELOC_UNSIGNED);
@ -66,12 +66,12 @@ bool ARM64MachObjectWriter::getARM64FixupKindMachOInfo(
if (Sym->getKind() == MCSymbolRefExpr::VK_GOT)
RelocType = unsigned(MachO::ARM64_RELOC_POINTER_TO_GOT);
return true;
case ARM64::fixup_arm64_add_imm12:
case ARM64::fixup_arm64_ldst_imm12_scale1:
case ARM64::fixup_arm64_ldst_imm12_scale2:
case ARM64::fixup_arm64_ldst_imm12_scale4:
case ARM64::fixup_arm64_ldst_imm12_scale8:
case ARM64::fixup_arm64_ldst_imm12_scale16:
case AArch64::fixup_aarch64_add_imm12:
case AArch64::fixup_aarch64_ldst_imm12_scale1:
case AArch64::fixup_aarch64_ldst_imm12_scale2:
case AArch64::fixup_aarch64_ldst_imm12_scale4:
case AArch64::fixup_aarch64_ldst_imm12_scale8:
case AArch64::fixup_aarch64_ldst_imm12_scale16:
Log2Size = llvm::Log2_32(4);
switch (Sym->getKind()) {
default:
@ -86,7 +86,7 @@ bool ARM64MachObjectWriter::getARM64FixupKindMachOInfo(
RelocType = unsigned(MachO::ARM64_RELOC_TLVP_LOAD_PAGEOFF12);
return true;
}
case ARM64::fixup_arm64_pcrel_adrp_imm21:
case AArch64::fixup_aarch64_pcrel_adrp_imm21:
Log2Size = llvm::Log2_32(4);
// This encompasses the relocation for the whole 21-bit value.
switch (Sym->getKind()) {
@ -104,15 +104,15 @@ bool ARM64MachObjectWriter::getARM64FixupKindMachOInfo(
return true;
}
return true;
case ARM64::fixup_arm64_pcrel_branch26:
case ARM64::fixup_arm64_pcrel_call26:
case AArch64::fixup_aarch64_pcrel_branch26:
case AArch64::fixup_aarch64_pcrel_call26:
Log2Size = llvm::Log2_32(4);
RelocType = unsigned(MachO::ARM64_RELOC_BRANCH26);
return true;
}
}
void ARM64MachObjectWriter::RecordRelocation(
void AArch64MachObjectWriter::RecordRelocation(
MachObjectWriter *Writer, const MCAssembler &Asm, const MCAsmLayout &Layout,
const MCFragment *Fragment, const MCFixup &Fixup, MCValue Target,
uint64_t &FixedValue) {
@ -129,20 +129,20 @@ void ARM64MachObjectWriter::RecordRelocation(
FixupOffset += Fixup.getOffset();
// ARM64 pcrel relocation addends do not include the section offset.
// AArch64 pcrel relocation addends do not include the section offset.
if (IsPCRel)
FixedValue += FixupOffset;
// ADRP fixups use relocations for the whole symbol value and only
// put the addend in the instruction itself. Clear out any value the
// generic code figured out from the sybmol definition.
if (Kind == ARM64::fixup_arm64_pcrel_adrp_imm21)
if (Kind == AArch64::fixup_aarch64_pcrel_adrp_imm21)
FixedValue = 0;
// imm19 relocations are for conditional branches, which require
// assembler local symbols. If we got here, that's not what we have,
// so complain loudly.
if (Kind == ARM64::fixup_arm64_pcrel_branch19) {
if (Kind == AArch64::fixup_aarch64_pcrel_branch19) {
Asm.getContext().FatalError(Fixup.getLoc(),
"conditional branch requires assembler-local"
" label. '" +
@ -153,15 +153,15 @@ void ARM64MachObjectWriter::RecordRelocation(
// 14-bit branch relocations should only target internal labels, and so
// should never get here.
if (Kind == ARM64::fixup_arm64_pcrel_branch14) {
if (Kind == AArch64::fixup_aarch64_pcrel_branch14) {
Asm.getContext().FatalError(Fixup.getLoc(),
"Invalid relocation on conditional branch!");
return;
}
if (!getARM64FixupKindMachOInfo(Fixup, Type, Target.getSymA(), Log2Size,
if (!getAArch64FixupKindMachOInfo(Fixup, Type, Target.getSymA(), Log2Size,
Asm)) {
Asm.getContext().FatalError(Fixup.getLoc(), "unknown ARM64 fixup kind!");
Asm.getContext().FatalError(Fixup.getLoc(), "unknown AArch64 fixup kind!");
return;
}
@ -220,7 +220,7 @@ void ARM64MachObjectWriter::RecordRelocation(
"unsupported pc-relative relocation of "
"difference");
// ARM64 always uses external relocations. If there is no symbol to use as
// AArch64 always uses external relocations. If there is no symbol to use as
// a base address (a local symbol with no preceding non-local symbol),
// error out.
//
@ -305,9 +305,9 @@ void ARM64MachObjectWriter::RecordRelocation(
Base = nullptr;
}
// ARM64 uses external relocations as much as possible. For debug sections,
// and for pointer-sized relocations (.quad), we allow section relocations.
// It's code sections that run into trouble.
// AArch64 uses external relocations as much as possible. For debug
// sections, and for pointer-sized relocations (.quad), we allow section
// relocations. It's code sections that run into trouble.
if (Base) {
Index = Base->getIndex();
IsExtern = 1;
@ -387,9 +387,10 @@ void ARM64MachObjectWriter::RecordRelocation(
Writer->addRelocation(Fragment->getParent(), MRE);
}
MCObjectWriter *llvm::createARM64MachObjectWriter(raw_ostream &OS,
MCObjectWriter *llvm::createAArch64MachObjectWriter(raw_ostream &OS,
uint32_t CPUType,
uint32_t CPUSubtype) {
return createMachObjectWriter(new ARM64MachObjectWriter(CPUType, CPUSubtype),
OS, /*IsLittleEndian=*/true);
return createMachObjectWriter(
new AArch64MachObjectWriter(CPUType, CPUSubtype), OS,
/*IsLittleEndian=*/true);
}

View File

@ -0,0 +1,14 @@
add_llvm_library(LLVMAArch64Desc
AArch64AsmBackend.cpp
AArch64ELFObjectWriter.cpp
AArch64ELFStreamer.cpp
AArch64MCAsmInfo.cpp
AArch64MCCodeEmitter.cpp
AArch64MCExpr.cpp
AArch64MCTargetDesc.cpp
AArch64MachObjectWriter.cpp
)
add_dependencies(LLVMAArch64Desc AArch64CommonTableGen)
# Hack: we need to include 'main' target directory to grab private headers
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/.. ${CMAKE_CURRENT_BINARY_DIR}/..)

View File

@ -1,4 +1,4 @@
;===- ./lib/Target/ARM64/MCTargetDesc/LLVMBuild.txt ------------*- Conf -*--===;
;===- ./lib/Target/AArch64/MCTargetDesc/LLVMBuild.txt ------------*- Conf -*--===;
;
; The LLVM Compiler Infrastructure
;
@ -17,8 +17,8 @@
[component_0]
type = Library
name = ARM64Desc
parent = ARM64
required_libraries = ARM64AsmPrinter ARM64Info MC Support
add_to_library_groups = ARM64
name = AArch64Desc
parent = AArch64
required_libraries = AArch64AsmPrinter AArch64Info MC Support
add_to_library_groups = AArch64

View File

@ -1,4 +1,4 @@
##===- lib/Target/ARM64/TargetDesc/Makefile ----------------*- Makefile -*-===##
##===- lib/Target/AArch64/TargetDesc/Makefile --------------*- Makefile -*-===##
#
# The LLVM Compiler Infrastructure
#
@ -8,7 +8,7 @@
##===----------------------------------------------------------------------===##
LEVEL = ../../../..
LIBRARYNAME = LLVMARM64Desc
LIBRARYNAME = LLVMAArch64Desc
# Hack: we need to include 'main' target directory to grab private headers
CPP.Flags += -I$(PROJ_OBJ_DIR)/.. -I$(PROJ_SRC_DIR)/..

View File

@ -0,0 +1,25 @@
##===- lib/Target/AArch64/Makefile -------------------------*- Makefile -*-===##
#
# The LLVM Compiler Infrastructure
#
# This file is distributed under the University of Illinois Open Source
# License. See LICENSE.TXT for details.
#
##===----------------------------------------------------------------------===##
LEVEL = ../../..
LIBRARYNAME = LLVMAArch64CodeGen
TARGET = AArch64
# Make sure that tblgen is run, first thing.
BUILT_SOURCES = AArch64GenRegisterInfo.inc AArch64GenInstrInfo.inc \
AArch64GenAsmWriter.inc AArch64GenAsmWriter1.inc \
AArch64GenDAGISel.inc \
AArch64GenCallingConv.inc AArch64GenAsmMatcher.inc \
AArch64GenSubtargetInfo.inc AArch64GenMCCodeEmitter.inc \
AArch64GenFastISel.inc AArch64GenDisassemblerTables.inc \
AArch64GenMCPseudoLowering.inc
DIRS = TargetInfo InstPrinter AsmParser Disassembler MCTargetDesc Utils
include $(LEVEL)/Makefile.common

View File

@ -1,4 +1,4 @@
//===-- ARM64TargetInfo.cpp - ARM64 Target Implementation -----------------===//
//===-- AArch64TargetInfo.cpp - AArch64 Target Implementation -----------------===//
//
// The LLVM Compiler Infrastructure
//
@ -12,20 +12,20 @@
using namespace llvm;
namespace llvm {
Target TheARM64leTarget;
Target TheARM64beTarget;
Target TheAArch64leTarget;
Target TheAArch64beTarget;
Target TheARM64leTarget;
Target TheARM64beTarget;
} // end namespace llvm
extern "C" void LLVMInitializeARM64TargetInfo() {
extern "C" void LLVMInitializeAArch64TargetInfo() {
RegisterTarget<Triple::arm64, /*HasJIT=*/true> X(TheARM64leTarget, "arm64",
"ARM64 (little endian)");
"AArch64 (little endian)");
RegisterTarget<Triple::arm64_be, /*HasJIT=*/true> Y(TheARM64beTarget, "arm64_be",
"ARM64 (big endian)");
"AArch64 (big endian)");
RegisterTarget<Triple::aarch64, /*HasJIT=*/true> Z(
TheAArch64leTarget, "aarch64", "ARM64 (little endian)");
TheAArch64leTarget, "aarch64", "AArch64 (little endian)");
RegisterTarget<Triple::aarch64_be, /*HasJIT=*/true> W(
TheAArch64beTarget, "aarch64_be", "ARM64 (big endian)");
TheAArch64beTarget, "aarch64_be", "AArch64 (big endian)");
}

View File

@ -0,0 +1,7 @@
include_directories( ${CMAKE_CURRENT_BINARY_DIR}/.. ${CMAKE_CURRENT_SOURCE_DIR}/.. )
add_llvm_library(LLVMAArch64Info
AArch64TargetInfo.cpp
)
add_dependencies(LLVMAArch64Info AArch64CommonTableGen)

View File

@ -1,4 +1,4 @@
;===- ./lib/Target/ARM64/Utils/LLVMBuild.txt ----------------*- Conf -*--===;
;===- ./lib/Target/AArch64/TargetInfo/LLVMBuild.txt --------------*- Conf -*--===;
;
; The LLVM Compiler Infrastructure
;
@ -17,7 +17,7 @@
[component_0]
type = Library
name = ARM64Utils
parent = ARM64
name = AArch64Info
parent = AArch64
required_libraries = Support
add_to_library_groups = ARM64
add_to_library_groups = AArch64

View File

@ -1,4 +1,4 @@
##===- lib/Target/ARM64/TargetInfo/Makefile ----------------*- Makefile -*-===##
##===- lib/Target/AArch64/TargetInfo/Makefile --------------*- Makefile -*-===##
#
# The LLVM Compiler Infrastructure
#
@ -7,7 +7,7 @@
#
##===----------------------------------------------------------------------===##
LEVEL = ../../../..
LIBRARYNAME = LLVMARM64Info
LIBRARYNAME = LLVMAArch64Info
# Hack: we need to include 'main' target directory to grab private headers
CPPFLAGS = -I$(PROJ_OBJ_DIR)/.. -I$(PROJ_SRC_DIR)/..

View File

@ -1,4 +1,4 @@
//===-- ARM64BaseInfo.cpp - ARM64 Base encoding information------------===//
//===-- AArch64BaseInfo.cpp - AArch64 Base encoding information------------===//
//
// The LLVM Compiler Infrastructure
//
@ -7,10 +7,10 @@
//
//===----------------------------------------------------------------------===//
//
// This file provides basic encoding and assembly information for ARM64.
// This file provides basic encoding and assembly information for AArch64.
//
//===----------------------------------------------------------------------===//
#include "ARM64BaseInfo.h"
#include "AArch64BaseInfo.h"
#include "llvm/ADT/APFloat.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/StringExtras.h"
@ -18,7 +18,7 @@
using namespace llvm;
StringRef ARM64NamedImmMapper::toString(uint32_t Value, bool &Valid) const {
StringRef AArch64NamedImmMapper::toString(uint32_t Value, bool &Valid) const {
for (unsigned i = 0; i < NumPairs; ++i) {
if (Pairs[i].Value == Value) {
Valid = true;
@ -30,7 +30,7 @@ StringRef ARM64NamedImmMapper::toString(uint32_t Value, bool &Valid) const {
return StringRef();
}
uint32_t ARM64NamedImmMapper::fromString(StringRef Name, bool &Valid) const {
uint32_t AArch64NamedImmMapper::fromString(StringRef Name, bool &Valid) const {
std::string LowerCaseName = Name.lower();
for (unsigned i = 0; i < NumPairs; ++i) {
if (Pairs[i].Name == LowerCaseName) {
@ -43,11 +43,11 @@ uint32_t ARM64NamedImmMapper::fromString(StringRef Name, bool &Valid) const {
return -1;
}
bool ARM64NamedImmMapper::validImm(uint32_t Value) const {
bool AArch64NamedImmMapper::validImm(uint32_t Value) const {
return Value < TooBigImm;
}
const ARM64NamedImmMapper::Mapping ARM64AT::ATMapper::ATPairs[] = {
const AArch64NamedImmMapper::Mapping AArch64AT::ATMapper::ATPairs[] = {
{"s1e1r", S1E1R},
{"s1e2r", S1E2R},
{"s1e3r", S1E3R},
@ -62,10 +62,10 @@ const ARM64NamedImmMapper::Mapping ARM64AT::ATMapper::ATPairs[] = {
{"s12e0w", S12E0W},
};
ARM64AT::ATMapper::ATMapper()
: ARM64NamedImmMapper(ATPairs, 0) {}
AArch64AT::ATMapper::ATMapper()
: AArch64NamedImmMapper(ATPairs, 0) {}
const ARM64NamedImmMapper::Mapping ARM64DB::DBarrierMapper::DBarrierPairs[] = {
const AArch64NamedImmMapper::Mapping AArch64DB::DBarrierMapper::DBarrierPairs[] = {
{"oshld", OSHLD},
{"oshst", OSHST},
{"osh", OSH},
@ -80,10 +80,10 @@ const ARM64NamedImmMapper::Mapping ARM64DB::DBarrierMapper::DBarrierPairs[] = {
{"sy", SY}
};
ARM64DB::DBarrierMapper::DBarrierMapper()
: ARM64NamedImmMapper(DBarrierPairs, 16u) {}
AArch64DB::DBarrierMapper::DBarrierMapper()
: AArch64NamedImmMapper(DBarrierPairs, 16u) {}
const ARM64NamedImmMapper::Mapping ARM64DC::DCMapper::DCPairs[] = {
const AArch64NamedImmMapper::Mapping AArch64DC::DCMapper::DCPairs[] = {
{"zva", ZVA},
{"ivac", IVAC},
{"isw", ISW},
@ -94,26 +94,26 @@ const ARM64NamedImmMapper::Mapping ARM64DC::DCMapper::DCPairs[] = {
{"cisw", CISW}
};
ARM64DC::DCMapper::DCMapper()
: ARM64NamedImmMapper(DCPairs, 0) {}
AArch64DC::DCMapper::DCMapper()
: AArch64NamedImmMapper(DCPairs, 0) {}
const ARM64NamedImmMapper::Mapping ARM64IC::ICMapper::ICPairs[] = {
const AArch64NamedImmMapper::Mapping AArch64IC::ICMapper::ICPairs[] = {
{"ialluis", IALLUIS},
{"iallu", IALLU},
{"ivau", IVAU}
};
ARM64IC::ICMapper::ICMapper()
: ARM64NamedImmMapper(ICPairs, 0) {}
AArch64IC::ICMapper::ICMapper()
: AArch64NamedImmMapper(ICPairs, 0) {}
const ARM64NamedImmMapper::Mapping ARM64ISB::ISBMapper::ISBPairs[] = {
const AArch64NamedImmMapper::Mapping AArch64ISB::ISBMapper::ISBPairs[] = {
{"sy", SY},
};
ARM64ISB::ISBMapper::ISBMapper()
: ARM64NamedImmMapper(ISBPairs, 16) {}
AArch64ISB::ISBMapper::ISBMapper()
: AArch64NamedImmMapper(ISBPairs, 16) {}
const ARM64NamedImmMapper::Mapping ARM64PRFM::PRFMMapper::PRFMPairs[] = {
const AArch64NamedImmMapper::Mapping AArch64PRFM::PRFMMapper::PRFMPairs[] = {
{"pldl1keep", PLDL1KEEP},
{"pldl1strm", PLDL1STRM},
{"pldl2keep", PLDL2KEEP},
@ -134,19 +134,19 @@ const ARM64NamedImmMapper::Mapping ARM64PRFM::PRFMMapper::PRFMPairs[] = {
{"pstl3strm", PSTL3STRM}
};
ARM64PRFM::PRFMMapper::PRFMMapper()
: ARM64NamedImmMapper(PRFMPairs, 32) {}
AArch64PRFM::PRFMMapper::PRFMMapper()
: AArch64NamedImmMapper(PRFMPairs, 32) {}
const ARM64NamedImmMapper::Mapping ARM64PState::PStateMapper::PStatePairs[] = {
const AArch64NamedImmMapper::Mapping AArch64PState::PStateMapper::PStatePairs[] = {
{"spsel", SPSel},
{"daifset", DAIFSet},
{"daifclr", DAIFClr}
};
ARM64PState::PStateMapper::PStateMapper()
: ARM64NamedImmMapper(PStatePairs, 0) {}
AArch64PState::PStateMapper::PStateMapper()
: AArch64NamedImmMapper(PStatePairs, 0) {}
const ARM64NamedImmMapper::Mapping ARM64SysReg::MRSMapper::MRSPairs[] = {
const AArch64NamedImmMapper::Mapping AArch64SysReg::MRSMapper::MRSPairs[] = {
{"mdccsr_el0", MDCCSR_EL0},
{"dbgdtrrx_el0", DBGDTRRX_EL0},
{"mdrar_el1", MDRAR_EL1},
@ -176,16 +176,16 @@ const ARM64NamedImmMapper::Mapping ARM64SysReg::MRSMapper::MRSPairs[] = {
{"id_isar3_el1", ID_ISAR3_EL1},
{"id_isar4_el1", ID_ISAR4_EL1},
{"id_isar5_el1", ID_ISAR5_EL1},
{"id_aa64pfr0_el1", ID_AARM64PFR0_EL1},
{"id_aa64pfr1_el1", ID_AARM64PFR1_EL1},
{"id_aa64dfr0_el1", ID_AARM64DFR0_EL1},
{"id_aa64dfr1_el1", ID_AARM64DFR1_EL1},
{"id_aa64afr0_el1", ID_AARM64AFR0_EL1},
{"id_aa64afr1_el1", ID_AARM64AFR1_EL1},
{"id_aa64isar0_el1", ID_AARM64ISAR0_EL1},
{"id_aa64isar1_el1", ID_AARM64ISAR1_EL1},
{"id_aa64mmfr0_el1", ID_AARM64MMFR0_EL1},
{"id_aa64mmfr1_el1", ID_AARM64MMFR1_EL1},
{"id_aa64pfr0_el1", ID_A64PFR0_EL1},
{"id_aa64pfr1_el1", ID_A64PFR1_EL1},
{"id_aa64dfr0_el1", ID_A64DFR0_EL1},
{"id_aa64dfr1_el1", ID_A64DFR1_EL1},
{"id_aa64afr0_el1", ID_A64AFR0_EL1},
{"id_aa64afr1_el1", ID_A64AFR1_EL1},
{"id_aa64isar0_el1", ID_A64ISAR0_EL1},
{"id_aa64isar1_el1", ID_A64ISAR1_EL1},
{"id_aa64mmfr0_el1", ID_A64MMFR0_EL1},
{"id_aa64mmfr1_el1", ID_A64MMFR1_EL1},
{"mvfr0_el1", MVFR0_EL1},
{"mvfr1_el1", MVFR1_EL1},
{"mvfr2_el1", MVFR2_EL1},
@ -245,13 +245,13 @@ const ARM64NamedImmMapper::Mapping ARM64SysReg::MRSMapper::MRSPairs[] = {
{"ich_elsr_el2", ICH_ELSR_EL2}
};
ARM64SysReg::MRSMapper::MRSMapper(uint64_t FeatureBits)
AArch64SysReg::MRSMapper::MRSMapper(uint64_t FeatureBits)
: SysRegMapper(FeatureBits) {
InstPairs = &MRSPairs[0];
NumInstPairs = llvm::array_lengthof(MRSPairs);
}
const ARM64NamedImmMapper::Mapping ARM64SysReg::MSRMapper::MSRPairs[] = {
const AArch64NamedImmMapper::Mapping AArch64SysReg::MSRMapper::MSRPairs[] = {
{"dbgdtrtx_el0", DBGDTRTX_EL0},
{"oslar_el1", OSLAR_EL1},
{"pmswinc_el0", PMSWINC_EL0},
@ -269,14 +269,14 @@ const ARM64NamedImmMapper::Mapping ARM64SysReg::MSRMapper::MSRPairs[] = {
{"icc_sgi0r_el1", ICC_SGI0R_EL1}
};
ARM64SysReg::MSRMapper::MSRMapper(uint64_t FeatureBits)
AArch64SysReg::MSRMapper::MSRMapper(uint64_t FeatureBits)
: SysRegMapper(FeatureBits) {
InstPairs = &MSRPairs[0];
NumInstPairs = llvm::array_lengthof(MSRPairs);
}
const ARM64NamedImmMapper::Mapping ARM64SysReg::SysRegMapper::SysRegPairs[] = {
const AArch64NamedImmMapper::Mapping AArch64SysReg::SysRegMapper::SysRegPairs[] = {
{"osdtrrx_el1", OSDTRRX_EL1},
{"osdtrtx_el1", OSDTRTX_EL1},
{"teecr32_el1", TEECR32_EL1},
@ -755,13 +755,13 @@ const ARM64NamedImmMapper::Mapping ARM64SysReg::SysRegMapper::SysRegPairs[] = {
{"ich_lr15_el2", ICH_LR15_EL2}
};
const ARM64NamedImmMapper::Mapping
ARM64SysReg::SysRegMapper::CycloneSysRegPairs[] = {
const AArch64NamedImmMapper::Mapping
AArch64SysReg::SysRegMapper::CycloneSysRegPairs[] = {
{"cpm_ioacc_ctl_el3", CPM_IOACC_CTL_EL3}
};
uint32_t
ARM64SysReg::SysRegMapper::fromString(StringRef Name, bool &Valid) const {
AArch64SysReg::SysRegMapper::fromString(StringRef Name, bool &Valid) const {
std::string NameLower = Name.lower();
// First search the registers shared by all
@ -773,7 +773,7 @@ ARM64SysReg::SysRegMapper::fromString(StringRef Name, bool &Valid) const {
}
// Next search for target specific registers
if (FeatureBits & ARM64::ProcCyclone) {
if (FeatureBits & AArch64::ProcCyclone) {
for (unsigned i = 0; i < array_lengthof(CycloneSysRegPairs); ++i) {
if (CycloneSysRegPairs[i].Name == NameLower) {
Valid = true;
@ -814,7 +814,7 @@ ARM64SysReg::SysRegMapper::fromString(StringRef Name, bool &Valid) const {
}
std::string
ARM64SysReg::SysRegMapper::toString(uint32_t Bits, bool &Valid) const {
AArch64SysReg::SysRegMapper::toString(uint32_t Bits, bool &Valid) const {
// First search the registers shared by all
for (unsigned i = 0; i < array_lengthof(SysRegPairs); ++i) {
if (SysRegPairs[i].Value == Bits) {
@ -824,7 +824,7 @@ ARM64SysReg::SysRegMapper::toString(uint32_t Bits, bool &Valid) const {
}
// Next search for target specific registers
if (FeatureBits & ARM64::ProcCyclone) {
if (FeatureBits & AArch64::ProcCyclone) {
for (unsigned i = 0; i < array_lengthof(CycloneSysRegPairs); ++i) {
if (CycloneSysRegPairs[i].Value == Bits) {
Valid = true;
@ -862,7 +862,7 @@ ARM64SysReg::SysRegMapper::toString(uint32_t Bits, bool &Valid) const {
+ "_c" + utostr(CRm) + "_" + utostr(Op2);
}
const ARM64NamedImmMapper::Mapping ARM64TLBI::TLBIMapper::TLBIPairs[] = {
const AArch64NamedImmMapper::Mapping AArch64TLBI::TLBIMapper::TLBIPairs[] = {
{"ipas2e1is", IPAS2E1IS},
{"ipas2le1is", IPAS2LE1IS},
{"vmalle1is", VMALLE1IS},
@ -897,5 +897,5 @@ const ARM64NamedImmMapper::Mapping ARM64TLBI::TLBIMapper::TLBIPairs[] = {
{"vaale1", VAALE1}
};
ARM64TLBI::TLBIMapper::TLBIMapper()
: ARM64NamedImmMapper(TLBIPairs, 0) {}
AArch64TLBI::TLBIMapper::TLBIMapper()
: AArch64NamedImmMapper(TLBIPairs, 0) {}

View File

@ -1,4 +1,4 @@
//===-- ARM64BaseInfo.h - Top level definitions for ARM64 -------*- C++ -*-===//
//===-- AArch64BaseInfo.h - Top level definitions for AArch64 ---*- C++ -*-===//
//
// The LLVM Compiler Infrastructure
//
@ -8,18 +8,18 @@
//===----------------------------------------------------------------------===//
//
// This file contains small standalone helper functions and enum definitions for
// the ARM64 target useful for the compiler back-end and the MC libraries.
// the AArch64 target useful for the compiler back-end and the MC libraries.
// As such, it deliberately does not include references to LLVM core
// code gen types, passes, etc..
//
//===----------------------------------------------------------------------===//
#ifndef ARM64BASEINFO_H
#define ARM64BASEINFO_H
#ifndef AArch64BASEINFO_H
#define AArch64BASEINFO_H
// FIXME: Is it easiest to fix this layering violation by moving the .inc
// #includes from ARM64MCTargetDesc.h to here?
#include "MCTargetDesc/ARM64MCTargetDesc.h" // For ARM64::X0 and friends.
// #includes from AArch64MCTargetDesc.h to here?
#include "MCTargetDesc/AArch64MCTargetDesc.h" // For AArch64::X0 and friends.
#include "llvm/ADT/STLExtras.h"
#include "llvm/ADT/StringSwitch.h"
#include "llvm/Support/ErrorHandling.h"
@ -28,39 +28,39 @@ namespace llvm {
inline static unsigned getWRegFromXReg(unsigned Reg) {
switch (Reg) {
case ARM64::X0: return ARM64::W0;
case ARM64::X1: return ARM64::W1;
case ARM64::X2: return ARM64::W2;
case ARM64::X3: return ARM64::W3;
case ARM64::X4: return ARM64::W4;
case ARM64::X5: return ARM64::W5;
case ARM64::X6: return ARM64::W6;
case ARM64::X7: return ARM64::W7;
case ARM64::X8: return ARM64::W8;
case ARM64::X9: return ARM64::W9;
case ARM64::X10: return ARM64::W10;
case ARM64::X11: return ARM64::W11;
case ARM64::X12: return ARM64::W12;
case ARM64::X13: return ARM64::W13;
case ARM64::X14: return ARM64::W14;
case ARM64::X15: return ARM64::W15;
case ARM64::X16: return ARM64::W16;
case ARM64::X17: return ARM64::W17;
case ARM64::X18: return ARM64::W18;
case ARM64::X19: return ARM64::W19;
case ARM64::X20: return ARM64::W20;
case ARM64::X21: return ARM64::W21;
case ARM64::X22: return ARM64::W22;
case ARM64::X23: return ARM64::W23;
case ARM64::X24: return ARM64::W24;
case ARM64::X25: return ARM64::W25;
case ARM64::X26: return ARM64::W26;
case ARM64::X27: return ARM64::W27;
case ARM64::X28: return ARM64::W28;
case ARM64::FP: return ARM64::W29;
case ARM64::LR: return ARM64::W30;
case ARM64::SP: return ARM64::WSP;
case ARM64::XZR: return ARM64::WZR;
case AArch64::X0: return AArch64::W0;
case AArch64::X1: return AArch64::W1;
case AArch64::X2: return AArch64::W2;
case AArch64::X3: return AArch64::W3;
case AArch64::X4: return AArch64::W4;
case AArch64::X5: return AArch64::W5;
case AArch64::X6: return AArch64::W6;
case AArch64::X7: return AArch64::W7;
case AArch64::X8: return AArch64::W8;
case AArch64::X9: return AArch64::W9;
case AArch64::X10: return AArch64::W10;
case AArch64::X11: return AArch64::W11;
case AArch64::X12: return AArch64::W12;
case AArch64::X13: return AArch64::W13;
case AArch64::X14: return AArch64::W14;
case AArch64::X15: return AArch64::W15;
case AArch64::X16: return AArch64::W16;
case AArch64::X17: return AArch64::W17;
case AArch64::X18: return AArch64::W18;
case AArch64::X19: return AArch64::W19;
case AArch64::X20: return AArch64::W20;
case AArch64::X21: return AArch64::W21;
case AArch64::X22: return AArch64::W22;
case AArch64::X23: return AArch64::W23;
case AArch64::X24: return AArch64::W24;
case AArch64::X25: return AArch64::W25;
case AArch64::X26: return AArch64::W26;
case AArch64::X27: return AArch64::W27;
case AArch64::X28: return AArch64::W28;
case AArch64::FP: return AArch64::W29;
case AArch64::LR: return AArch64::W30;
case AArch64::SP: return AArch64::WSP;
case AArch64::XZR: return AArch64::WZR;
}
// For anything else, return it unchanged.
return Reg;
@ -68,39 +68,39 @@ inline static unsigned getWRegFromXReg(unsigned Reg) {
inline static unsigned getXRegFromWReg(unsigned Reg) {
switch (Reg) {
case ARM64::W0: return ARM64::X0;
case ARM64::W1: return ARM64::X1;
case ARM64::W2: return ARM64::X2;
case ARM64::W3: return ARM64::X3;
case ARM64::W4: return ARM64::X4;
case ARM64::W5: return ARM64::X5;
case ARM64::W6: return ARM64::X6;
case ARM64::W7: return ARM64::X7;
case ARM64::W8: return ARM64::X8;
case ARM64::W9: return ARM64::X9;
case ARM64::W10: return ARM64::X10;
case ARM64::W11: return ARM64::X11;
case ARM64::W12: return ARM64::X12;
case ARM64::W13: return ARM64::X13;
case ARM64::W14: return ARM64::X14;
case ARM64::W15: return ARM64::X15;
case ARM64::W16: return ARM64::X16;
case ARM64::W17: return ARM64::X17;
case ARM64::W18: return ARM64::X18;
case ARM64::W19: return ARM64::X19;
case ARM64::W20: return ARM64::X20;
case ARM64::W21: return ARM64::X21;
case ARM64::W22: return ARM64::X22;
case ARM64::W23: return ARM64::X23;
case ARM64::W24: return ARM64::X24;
case ARM64::W25: return ARM64::X25;
case ARM64::W26: return ARM64::X26;
case ARM64::W27: return ARM64::X27;
case ARM64::W28: return ARM64::X28;
case ARM64::W29: return ARM64::FP;
case ARM64::W30: return ARM64::LR;
case ARM64::WSP: return ARM64::SP;
case ARM64::WZR: return ARM64::XZR;
case AArch64::W0: return AArch64::X0;
case AArch64::W1: return AArch64::X1;
case AArch64::W2: return AArch64::X2;
case AArch64::W3: return AArch64::X3;
case AArch64::W4: return AArch64::X4;
case AArch64::W5: return AArch64::X5;
case AArch64::W6: return AArch64::X6;
case AArch64::W7: return AArch64::X7;
case AArch64::W8: return AArch64::X8;
case AArch64::W9: return AArch64::X9;
case AArch64::W10: return AArch64::X10;
case AArch64::W11: return AArch64::X11;
case AArch64::W12: return AArch64::X12;
case AArch64::W13: return AArch64::X13;
case AArch64::W14: return AArch64::X14;
case AArch64::W15: return AArch64::X15;
case AArch64::W16: return AArch64::X16;
case AArch64::W17: return AArch64::X17;
case AArch64::W18: return AArch64::X18;
case AArch64::W19: return AArch64::X19;
case AArch64::W20: return AArch64::X20;
case AArch64::W21: return AArch64::X21;
case AArch64::W22: return AArch64::X22;
case AArch64::W23: return AArch64::X23;
case AArch64::W24: return AArch64::X24;
case AArch64::W25: return AArch64::X25;
case AArch64::W26: return AArch64::X26;
case AArch64::W27: return AArch64::X27;
case AArch64::W28: return AArch64::X28;
case AArch64::W29: return AArch64::FP;
case AArch64::W30: return AArch64::LR;
case AArch64::WSP: return AArch64::SP;
case AArch64::WZR: return AArch64::XZR;
}
// For anything else, return it unchanged.
return Reg;
@ -108,38 +108,38 @@ inline static unsigned getXRegFromWReg(unsigned Reg) {
static inline unsigned getBRegFromDReg(unsigned Reg) {
switch (Reg) {
case ARM64::D0: return ARM64::B0;
case ARM64::D1: return ARM64::B1;
case ARM64::D2: return ARM64::B2;
case ARM64::D3: return ARM64::B3;
case ARM64::D4: return ARM64::B4;
case ARM64::D5: return ARM64::B5;
case ARM64::D6: return ARM64::B6;
case ARM64::D7: return ARM64::B7;
case ARM64::D8: return ARM64::B8;
case ARM64::D9: return ARM64::B9;
case ARM64::D10: return ARM64::B10;
case ARM64::D11: return ARM64::B11;
case ARM64::D12: return ARM64::B12;
case ARM64::D13: return ARM64::B13;
case ARM64::D14: return ARM64::B14;
case ARM64::D15: return ARM64::B15;
case ARM64::D16: return ARM64::B16;
case ARM64::D17: return ARM64::B17;
case ARM64::D18: return ARM64::B18;
case ARM64::D19: return ARM64::B19;
case ARM64::D20: return ARM64::B20;
case ARM64::D21: return ARM64::B21;
case ARM64::D22: return ARM64::B22;
case ARM64::D23: return ARM64::B23;
case ARM64::D24: return ARM64::B24;
case ARM64::D25: return ARM64::B25;
case ARM64::D26: return ARM64::B26;
case ARM64::D27: return ARM64::B27;
case ARM64::D28: return ARM64::B28;
case ARM64::D29: return ARM64::B29;
case ARM64::D30: return ARM64::B30;
case ARM64::D31: return ARM64::B31;
case AArch64::D0: return AArch64::B0;
case AArch64::D1: return AArch64::B1;
case AArch64::D2: return AArch64::B2;
case AArch64::D3: return AArch64::B3;
case AArch64::D4: return AArch64::B4;
case AArch64::D5: return AArch64::B5;
case AArch64::D6: return AArch64::B6;
case AArch64::D7: return AArch64::B7;
case AArch64::D8: return AArch64::B8;
case AArch64::D9: return AArch64::B9;
case AArch64::D10: return AArch64::B10;
case AArch64::D11: return AArch64::B11;
case AArch64::D12: return AArch64::B12;
case AArch64::D13: return AArch64::B13;
case AArch64::D14: return AArch64::B14;
case AArch64::D15: return AArch64::B15;
case AArch64::D16: return AArch64::B16;
case AArch64::D17: return AArch64::B17;
case AArch64::D18: return AArch64::B18;
case AArch64::D19: return AArch64::B19;
case AArch64::D20: return AArch64::B20;
case AArch64::D21: return AArch64::B21;
case AArch64::D22: return AArch64::B22;
case AArch64::D23: return AArch64::B23;
case AArch64::D24: return AArch64::B24;
case AArch64::D25: return AArch64::B25;
case AArch64::D26: return AArch64::B26;
case AArch64::D27: return AArch64::B27;
case AArch64::D28: return AArch64::B28;
case AArch64::D29: return AArch64::B29;
case AArch64::D30: return AArch64::B30;
case AArch64::D31: return AArch64::B31;
}
// For anything else, return it unchanged.
return Reg;
@ -148,44 +148,44 @@ static inline unsigned getBRegFromDReg(unsigned Reg) {
static inline unsigned getDRegFromBReg(unsigned Reg) {
switch (Reg) {
case ARM64::B0: return ARM64::D0;
case ARM64::B1: return ARM64::D1;
case ARM64::B2: return ARM64::D2;
case ARM64::B3: return ARM64::D3;
case ARM64::B4: return ARM64::D4;
case ARM64::B5: return ARM64::D5;
case ARM64::B6: return ARM64::D6;
case ARM64::B7: return ARM64::D7;
case ARM64::B8: return ARM64::D8;
case ARM64::B9: return ARM64::D9;
case ARM64::B10: return ARM64::D10;
case ARM64::B11: return ARM64::D11;
case ARM64::B12: return ARM64::D12;
case ARM64::B13: return ARM64::D13;
case ARM64::B14: return ARM64::D14;
case ARM64::B15: return ARM64::D15;
case ARM64::B16: return ARM64::D16;
case ARM64::B17: return ARM64::D17;
case ARM64::B18: return ARM64::D18;
case ARM64::B19: return ARM64::D19;
case ARM64::B20: return ARM64::D20;
case ARM64::B21: return ARM64::D21;
case ARM64::B22: return ARM64::D22;
case ARM64::B23: return ARM64::D23;
case ARM64::B24: return ARM64::D24;
case ARM64::B25: return ARM64::D25;
case ARM64::B26: return ARM64::D26;
case ARM64::B27: return ARM64::D27;
case ARM64::B28: return ARM64::D28;
case ARM64::B29: return ARM64::D29;
case ARM64::B30: return ARM64::D30;
case ARM64::B31: return ARM64::D31;
case AArch64::B0: return AArch64::D0;
case AArch64::B1: return AArch64::D1;
case AArch64::B2: return AArch64::D2;
case AArch64::B3: return AArch64::D3;
case AArch64::B4: return AArch64::D4;
case AArch64::B5: return AArch64::D5;
case AArch64::B6: return AArch64::D6;
case AArch64::B7: return AArch64::D7;
case AArch64::B8: return AArch64::D8;
case AArch64::B9: return AArch64::D9;
case AArch64::B10: return AArch64::D10;
case AArch64::B11: return AArch64::D11;
case AArch64::B12: return AArch64::D12;
case AArch64::B13: return AArch64::D13;
case AArch64::B14: return AArch64::D14;
case AArch64::B15: return AArch64::D15;
case AArch64::B16: return AArch64::D16;
case AArch64::B17: return AArch64::D17;
case AArch64::B18: return AArch64::D18;
case AArch64::B19: return AArch64::D19;
case AArch64::B20: return AArch64::D20;
case AArch64::B21: return AArch64::D21;
case AArch64::B22: return AArch64::D22;
case AArch64::B23: return AArch64::D23;
case AArch64::B24: return AArch64::D24;
case AArch64::B25: return AArch64::D25;
case AArch64::B26: return AArch64::D26;
case AArch64::B27: return AArch64::D27;
case AArch64::B28: return AArch64::D28;
case AArch64::B29: return AArch64::D29;
case AArch64::B30: return AArch64::D30;
case AArch64::B31: return AArch64::D31;
}
// For anything else, return it unchanged.
return Reg;
}
namespace ARM64CC {
namespace AArch64CC {
// The CondCodes constants map directly to the 4-bit encoding of the condition
// field for predicated instructions.
@ -277,7 +277,7 @@ inline static unsigned getNZCVToSatisfyCondCode(CondCode Code) {
case LE: return Z; // Z == 1 || N != V
}
}
} // end namespace ARM64CC
} // end namespace AArch64CC
/// Instances of this class can perform bidirectional mapping from random
/// identifier strings to operand encodings. For example "MSR" takes a named
@ -290,14 +290,14 @@ inline static unsigned getNZCVToSatisfyCondCode(CondCode Code) {
/// out just how often these instructions are emitted before working on it. It
/// might even be optimal to just reorder the tables for the common instructions
/// rather than changing the algorithm.
struct ARM64NamedImmMapper {
struct AArch64NamedImmMapper {
struct Mapping {
const char *Name;
uint32_t Value;
};
template<int N>
ARM64NamedImmMapper(const Mapping (&Pairs)[N], uint32_t TooBigImm)
AArch64NamedImmMapper(const Mapping (&Pairs)[N], uint32_t TooBigImm)
: Pairs(&Pairs[0]), NumPairs(N), TooBigImm(TooBigImm) {}
StringRef toString(uint32_t Value, bool &Valid) const;
@ -313,7 +313,7 @@ protected:
uint32_t TooBigImm;
};
namespace ARM64AT {
namespace AArch64AT {
enum ATValues {
Invalid = -1, // Op0 Op1 CRn CRm Op2
S1E1R = 0x43c0, // 01 000 0111 1000 000
@ -330,14 +330,14 @@ namespace ARM64AT {
S12E0W = 0x63c7 // 01 100 0111 1000 111
};
struct ATMapper : ARM64NamedImmMapper {
struct ATMapper : AArch64NamedImmMapper {
const static Mapping ATPairs[];
ATMapper();
};
}
namespace ARM64DB {
namespace AArch64DB {
enum DBValues {
Invalid = -1,
OSHLD = 0x1,
@ -354,14 +354,14 @@ namespace ARM64DB {
SY = 0xf
};
struct DBarrierMapper : ARM64NamedImmMapper {
struct DBarrierMapper : AArch64NamedImmMapper {
const static Mapping DBarrierPairs[];
DBarrierMapper();
};
}
namespace ARM64DC {
namespace AArch64DC {
enum DCValues {
Invalid = -1, // Op1 CRn CRm Op2
ZVA = 0x5ba1, // 01 011 0111 0100 001
@ -374,7 +374,7 @@ namespace ARM64DC {
CISW = 0x43f2 // 01 000 0111 1110 010
};
struct DCMapper : ARM64NamedImmMapper {
struct DCMapper : AArch64NamedImmMapper {
const static Mapping DCPairs[];
DCMapper();
@ -382,7 +382,7 @@ namespace ARM64DC {
}
namespace ARM64IC {
namespace AArch64IC {
enum ICValues {
Invalid = -1, // Op1 CRn CRm Op2
IALLUIS = 0x0388, // 000 0111 0001 000
@ -391,7 +391,7 @@ namespace ARM64IC {
};
struct ICMapper : ARM64NamedImmMapper {
struct ICMapper : AArch64NamedImmMapper {
const static Mapping ICPairs[];
ICMapper();
@ -402,19 +402,19 @@ namespace ARM64IC {
}
}
namespace ARM64ISB {
namespace AArch64ISB {
enum ISBValues {
Invalid = -1,
SY = 0xf
};
struct ISBMapper : ARM64NamedImmMapper {
struct ISBMapper : AArch64NamedImmMapper {
const static Mapping ISBPairs[];
ISBMapper();
};
}
namespace ARM64PRFM {
namespace AArch64PRFM {
enum PRFMValues {
Invalid = -1,
PLDL1KEEP = 0x00,
@ -437,14 +437,14 @@ namespace ARM64PRFM {
PSTL3STRM = 0x15
};
struct PRFMMapper : ARM64NamedImmMapper {
struct PRFMMapper : AArch64NamedImmMapper {
const static Mapping PRFMPairs[];
PRFMMapper();
};
}
namespace ARM64PState {
namespace AArch64PState {
enum PStateValues {
Invalid = -1,
SPSel = 0x05,
@ -452,7 +452,7 @@ namespace ARM64PState {
DAIFClr = 0x1f
};
struct PStateMapper : ARM64NamedImmMapper {
struct PStateMapper : AArch64NamedImmMapper {
const static Mapping PStatePairs[];
PStateMapper();
@ -460,7 +460,7 @@ namespace ARM64PState {
}
namespace ARM64SE {
namespace AArch64SE {
enum ShiftExtSpecifiers {
Invalid = -1,
LSL,
@ -481,7 +481,7 @@ namespace ARM64SE {
};
}
namespace ARM64Layout {
namespace AArch64Layout {
enum VectorLayout {
Invalid = -1,
VL_8B,
@ -504,43 +504,43 @@ namespace ARM64Layout {
}
inline static const char *
ARM64VectorLayoutToString(ARM64Layout::VectorLayout Layout) {
AArch64VectorLayoutToString(AArch64Layout::VectorLayout Layout) {
switch (Layout) {
case ARM64Layout::VL_8B: return ".8b";
case ARM64Layout::VL_4H: return ".4h";
case ARM64Layout::VL_2S: return ".2s";
case ARM64Layout::VL_1D: return ".1d";
case ARM64Layout::VL_16B: return ".16b";
case ARM64Layout::VL_8H: return ".8h";
case ARM64Layout::VL_4S: return ".4s";
case ARM64Layout::VL_2D: return ".2d";
case ARM64Layout::VL_B: return ".b";
case ARM64Layout::VL_H: return ".h";
case ARM64Layout::VL_S: return ".s";
case ARM64Layout::VL_D: return ".d";
case AArch64Layout::VL_8B: return ".8b";
case AArch64Layout::VL_4H: return ".4h";
case AArch64Layout::VL_2S: return ".2s";
case AArch64Layout::VL_1D: return ".1d";
case AArch64Layout::VL_16B: return ".16b";
case AArch64Layout::VL_8H: return ".8h";
case AArch64Layout::VL_4S: return ".4s";
case AArch64Layout::VL_2D: return ".2d";
case AArch64Layout::VL_B: return ".b";
case AArch64Layout::VL_H: return ".h";
case AArch64Layout::VL_S: return ".s";
case AArch64Layout::VL_D: return ".d";
default: llvm_unreachable("Unknown Vector Layout");
}
}
inline static ARM64Layout::VectorLayout
ARM64StringToVectorLayout(StringRef LayoutStr) {
return StringSwitch<ARM64Layout::VectorLayout>(LayoutStr)
.Case(".8b", ARM64Layout::VL_8B)
.Case(".4h", ARM64Layout::VL_4H)
.Case(".2s", ARM64Layout::VL_2S)
.Case(".1d", ARM64Layout::VL_1D)
.Case(".16b", ARM64Layout::VL_16B)
.Case(".8h", ARM64Layout::VL_8H)
.Case(".4s", ARM64Layout::VL_4S)
.Case(".2d", ARM64Layout::VL_2D)
.Case(".b", ARM64Layout::VL_B)
.Case(".h", ARM64Layout::VL_H)
.Case(".s", ARM64Layout::VL_S)
.Case(".d", ARM64Layout::VL_D)
.Default(ARM64Layout::Invalid);
inline static AArch64Layout::VectorLayout
AArch64StringToVectorLayout(StringRef LayoutStr) {
return StringSwitch<AArch64Layout::VectorLayout>(LayoutStr)
.Case(".8b", AArch64Layout::VL_8B)
.Case(".4h", AArch64Layout::VL_4H)
.Case(".2s", AArch64Layout::VL_2S)
.Case(".1d", AArch64Layout::VL_1D)
.Case(".16b", AArch64Layout::VL_16B)
.Case(".8h", AArch64Layout::VL_8H)
.Case(".4s", AArch64Layout::VL_4S)
.Case(".2d", AArch64Layout::VL_2D)
.Case(".b", AArch64Layout::VL_B)
.Case(".h", AArch64Layout::VL_H)
.Case(".s", AArch64Layout::VL_S)
.Case(".d", AArch64Layout::VL_D)
.Default(AArch64Layout::Invalid);
}
namespace ARM64SysReg {
namespace AArch64SysReg {
enum SysRegROValues {
MDCCSR_EL0 = 0x9808, // 10 011 0000 0001 000
DBGDTRRX_EL0 = 0x9828, // 10 011 0000 0101 000
@ -571,16 +571,16 @@ namespace ARM64SysReg {
ID_ISAR3_EL1 = 0xc013, // 11 000 0000 0010 011
ID_ISAR4_EL1 = 0xc014, // 11 000 0000 0010 100
ID_ISAR5_EL1 = 0xc015, // 11 000 0000 0010 101
ID_AARM64PFR0_EL1 = 0xc020, // 11 000 0000 0100 000
ID_AARM64PFR1_EL1 = 0xc021, // 11 000 0000 0100 001
ID_AARM64DFR0_EL1 = 0xc028, // 11 000 0000 0101 000
ID_AARM64DFR1_EL1 = 0xc029, // 11 000 0000 0101 001
ID_AARM64AFR0_EL1 = 0xc02c, // 11 000 0000 0101 100
ID_AARM64AFR1_EL1 = 0xc02d, // 11 000 0000 0101 101
ID_AARM64ISAR0_EL1 = 0xc030, // 11 000 0000 0110 000
ID_AARM64ISAR1_EL1 = 0xc031, // 11 000 0000 0110 001
ID_AARM64MMFR0_EL1 = 0xc038, // 11 000 0000 0111 000
ID_AARM64MMFR1_EL1 = 0xc039, // 11 000 0000 0111 001
ID_A64PFR0_EL1 = 0xc020, // 11 000 0000 0100 000
ID_A64PFR1_EL1 = 0xc021, // 11 000 0000 0100 001
ID_A64DFR0_EL1 = 0xc028, // 11 000 0000 0101 000
ID_A64DFR1_EL1 = 0xc029, // 11 000 0000 0101 001
ID_A64AFR0_EL1 = 0xc02c, // 11 000 0000 0101 100
ID_A64AFR1_EL1 = 0xc02d, // 11 000 0000 0101 101
ID_A64ISAR0_EL1 = 0xc030, // 11 000 0000 0110 000
ID_A64ISAR1_EL1 = 0xc031, // 11 000 0000 0110 001
ID_A64MMFR0_EL1 = 0xc038, // 11 000 0000 0111 000
ID_A64MMFR1_EL1 = 0xc039, // 11 000 0000 0111 001
MVFR0_EL1 = 0xc018, // 11 000 0000 0011 000
MVFR1_EL1 = 0xc019, // 11 000 0000 0011 001
MVFR2_EL1 = 0xc01a, // 11 000 0000 0011 010
@ -1143,15 +1143,15 @@ namespace ARM64SysReg {
CPM_IOACC_CTL_EL3 = 0xff90
};
// Note that these do not inherit from ARM64NamedImmMapper. This class is
// Note that these do not inherit from AArch64NamedImmMapper. This class is
// sufficiently different in its behaviour that I don't believe it's worth
// burdening the common ARM64NamedImmMapper with abstractions only needed in
// burdening the common AArch64NamedImmMapper with abstractions only needed in
// this one case.
struct SysRegMapper {
static const ARM64NamedImmMapper::Mapping SysRegPairs[];
static const ARM64NamedImmMapper::Mapping CycloneSysRegPairs[];
static const AArch64NamedImmMapper::Mapping SysRegPairs[];
static const AArch64NamedImmMapper::Mapping CycloneSysRegPairs[];
const ARM64NamedImmMapper::Mapping *InstPairs;
const AArch64NamedImmMapper::Mapping *InstPairs;
size_t NumInstPairs;
uint64_t FeatureBits;
@ -1161,19 +1161,19 @@ namespace ARM64SysReg {
};
struct MSRMapper : SysRegMapper {
static const ARM64NamedImmMapper::Mapping MSRPairs[];
static const AArch64NamedImmMapper::Mapping MSRPairs[];
MSRMapper(uint64_t FeatureBits);
};
struct MRSMapper : SysRegMapper {
static const ARM64NamedImmMapper::Mapping MRSPairs[];
static const AArch64NamedImmMapper::Mapping MRSPairs[];
MRSMapper(uint64_t FeatureBits);
};
uint32_t ParseGenericRegister(StringRef Name, bool &Valid);
}
namespace ARM64TLBI {
namespace AArch64TLBI {
enum TLBIValues {
Invalid = -1, // Op0 Op1 CRn CRm Op2
IPAS2E1IS = 0x6401, // 01 100 1000 0000 001
@ -1210,7 +1210,7 @@ namespace ARM64TLBI {
VAALE1 = 0x443f // 01 000 1000 0111 111
};
struct TLBIMapper : ARM64NamedImmMapper {
struct TLBIMapper : AArch64NamedImmMapper {
const static Mapping TLBIPairs[];
TLBIMapper();
@ -1235,11 +1235,11 @@ namespace ARM64TLBI {
}
}
namespace ARM64II {
namespace AArch64II {
/// Target Operand Flag enum.
enum TOF {
//===------------------------------------------------------------------===//
// ARM64 Specific MachineOperand flags.
// AArch64 Specific MachineOperand flags.
MO_NO_FLAG,
@ -1287,7 +1287,7 @@ namespace ARM64II {
/// referee will affect interpretation.
MO_TLS = 0x20
};
} // end namespace ARM64II
} // end namespace AArch64II
} // end namespace llvm

Some files were not shown because too many files have changed in this diff Show More