mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-24 11:42:57 +01:00
bc7846dad0
This adds GlobalISel equivalents for the following from AArch64InstrFormats: - arith_shifted_reg32 - arith_shifted_reg64 And partial support for - logical_shifted_reg32 - logical_shifted_reg32 The only thing missing for the logical cases is support for rotates. Other than the missing support, the transformation is identical for the arithmetic shifted register and the logical shifted register. Lots of tests here: - Add select-arith-shifted-reg.mir to show that we correctly select add and sub instructions which use this pattern. - Add select-logical-shifted-reg.mir to cover patterns which are not shared between the arithmetic and logical cases. - Update addsub-shifted.ll to show that we correctly fold shifts into adds/subs. - Update eon.ll to show that we can select the eon instruction by folding xors. Differential Revision: https://reviews.llvm.org/D66163 llvm-svn: 369460
33 lines
770 B
LLVM
33 lines
770 B
LLVM
; RUN: llc -mtriple=aarch64-none-linux-gnu < %s | FileCheck %s
|
|
; RUN: llc %s -pass-remarks-missed=gisel* -mtriple=aarch64-none-linux-gnu -global-isel -o - 2>&1 | FileCheck %s
|
|
|
|
; CHECK-NOT: remark
|
|
|
|
; Check that the eon instruction is generated instead of eor,movn
|
|
define i64 @test1(i64 %a, i64 %b, i64 %c) {
|
|
; CHECK-LABEL: test1:
|
|
; CHECK: eon
|
|
; CHECK: ret
|
|
entry:
|
|
%shl = shl i64 %b, 4
|
|
%neg = xor i64 %a, -1
|
|
%xor = xor i64 %shl, %neg
|
|
ret i64 %xor
|
|
}
|
|
|
|
; Same check with mutliple uses of %neg
|
|
define i64 @test2(i64 %a, i64 %b, i64 %c) {
|
|
; CHECK-LABEL: test2:
|
|
; CHECK: eon
|
|
; CHECK: eon
|
|
; CHECK: lsl
|
|
; CHECK: ret
|
|
entry:
|
|
%shl = shl i64 %b, 4
|
|
%neg = xor i64 %shl, -1
|
|
%xor = xor i64 %neg, %a
|
|
%xor1 = xor i64 %c, %neg
|
|
%shl2 = shl i64 %xor, %xor1
|
|
ret i64 %shl2
|
|
}
|