mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-28 05:56:05 +00:00
[AArch64][GlobalISel] Update and cleanup a number of gisel tests. NFC
Mostly removing unnecessary -global-isel-abort=2 or adding fallback messages
This commit is contained in:
parent
5f9db0876a
commit
28064bfad1
@ -1,6 +1,6 @@
|
||||
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 4
|
||||
; RUN: llc -mtriple=aarch64-none-linux-gnu %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-SD
|
||||
; RUN: llc -mtriple=aarch64-none-linux-gnu -global-isel -global-isel-abort=2 %s -o - 2>&1 | FileCheck %s --check-prefixes=CHECK,CHECK-GI
|
||||
; RUN: llc -mtriple=aarch64-none-linux-gnu -global-isel %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-GI
|
||||
|
||||
; ===== Legal Scalars =====
|
||||
|
||||
|
@ -1,78 +1,68 @@
|
||||
; RUN: llc < %s -mtriple=arm64-apple-ios7.0.0 | FileCheck %s
|
||||
; RUN: llc < %s -mtriple=arm64-apple-ios7.0.0 -O0 -pass-remarks-missed=gisel* -global-isel-abort=2 | FileCheck %s --check-prefixes=GISEL,FALLBACK
|
||||
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
|
||||
; RUN: llc < %s -mtriple=arm64-apple-ios7.0.0 | FileCheck %s --check-prefixes=CHECK,CHECK-SD
|
||||
; RUN: llc < %s -mtriple=arm64-apple-ios7.0.0 -global-isel | FileCheck %s --check-prefixes=CHECK,CHECK-GI
|
||||
|
||||
target datalayout = "e-m:o-i64:64-i128:128-n32:64-S128"
|
||||
|
||||
; Function Attrs: nounwind readnone
|
||||
declare i32 @llvm.ctlz.i32(i32, i1) #0
|
||||
declare i64 @llvm.ctlz.i64(i64, i1) #1
|
||||
|
||||
; Function Attrs: nounwind ssp
|
||||
; FALLBACK-NOT: remark{{.*}}clrsb32
|
||||
define i32 @clrsb32(i32 %x) #2 {
|
||||
; CHECK-LABEL: clrsb32:
|
||||
; CHECK: ; %bb.0: ; %entry
|
||||
; CHECK-NEXT: cls w0, w0
|
||||
; CHECK-NEXT: ret
|
||||
entry:
|
||||
%shr = ashr i32 %x, 31
|
||||
%xor = xor i32 %shr, %x
|
||||
%mul = shl i32 %xor, 1
|
||||
%add = or i32 %mul, 1
|
||||
%0 = tail call i32 @llvm.ctlz.i32(i32 %add, i1 false)
|
||||
|
||||
ret i32 %0
|
||||
; CHECK-LABEL: clrsb32
|
||||
; CHECK: cls [[TEMP:w[0-9]+]], [[TEMP]]
|
||||
|
||||
; GISEL-LABEL: clrsb32
|
||||
; GISEL: cls [[TEMP:w[0-9]+]], [[TEMP]]
|
||||
}
|
||||
|
||||
; Function Attrs: nounwind ssp
|
||||
; FALLBACK-NOT: remark{{.*}}clrsb64
|
||||
define i64 @clrsb64(i64 %x) #3 {
|
||||
; CHECK-LABEL: clrsb64:
|
||||
; CHECK: ; %bb.0: ; %entry
|
||||
; CHECK-NEXT: cls x0, x0
|
||||
; CHECK-NEXT: ret
|
||||
entry:
|
||||
%shr = ashr i64 %x, 63
|
||||
%xor = xor i64 %shr, %x
|
||||
%mul = shl nsw i64 %xor, 1
|
||||
%add = or i64 %mul, 1
|
||||
%0 = tail call i64 @llvm.ctlz.i64(i64 %add, i1 false)
|
||||
|
||||
ret i64 %0
|
||||
; CHECK-LABEL: clrsb64
|
||||
; CHECK: cls [[TEMP:x[0-9]+]], [[TEMP]]
|
||||
; GISEL-LABEL: clrsb64
|
||||
; GISEL: cls [[TEMP:x[0-9]+]], [[TEMP]]
|
||||
}
|
||||
|
||||
; Function Attrs: nounwind ssp
|
||||
; FALLBACK-NOT: remark{{.*}}clrsb32_zeroundef
|
||||
define i32 @clrsb32_zeroundef(i32 %x) #2 {
|
||||
; CHECK-LABEL: clrsb32_zeroundef:
|
||||
; CHECK: ; %bb.0: ; %entry
|
||||
; CHECK-NEXT: cls w0, w0
|
||||
; CHECK-NEXT: ret
|
||||
entry:
|
||||
%shr = ashr i32 %x, 31
|
||||
%xor = xor i32 %shr, %x
|
||||
%mul = shl i32 %xor, 1
|
||||
%add = or i32 %mul, 1
|
||||
%0 = tail call i32 @llvm.ctlz.i32(i32 %add, i1 true)
|
||||
|
||||
ret i32 %0
|
||||
; CHECK-LABEL: clrsb32_zeroundef
|
||||
; CHECK: cls [[TEMP:w[0-9]+]], [[TEMP]]
|
||||
|
||||
; GISEL-LABEL: clrsb32_zeroundef
|
||||
; GISEL: cls [[TEMP:w[0-9]+]], [[TEMP]]
|
||||
}
|
||||
|
||||
; Function Attrs: nounwind ssp
|
||||
; FALLBACK-NOT: remark{{.*}}clrsb64
|
||||
define i64 @clrsb64_zeroundef(i64 %x) #3 {
|
||||
; CHECK-LABEL: clrsb64_zeroundef:
|
||||
; CHECK: ; %bb.0: ; %entry
|
||||
; CHECK-NEXT: cls x0, x0
|
||||
; CHECK-NEXT: ret
|
||||
entry:
|
||||
%shr = ashr i64 %x, 63
|
||||
%xor = xor i64 %shr, %x
|
||||
%mul = shl nsw i64 %xor, 1
|
||||
%add = or i64 %mul, 1
|
||||
%0 = tail call i64 @llvm.ctlz.i64(i64 %add, i1 true)
|
||||
|
||||
ret i64 %0
|
||||
; CHECK-LABEL: clrsb64_zeroundef
|
||||
; CHECK: cls [[TEMP:x[0-9]+]], [[TEMP]]
|
||||
; GISEL-LABEL: clrsb64_zeroundef
|
||||
; GISEL: cls [[TEMP:x[0-9]+]], [[TEMP]]
|
||||
}
|
||||
|
||||
;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
|
||||
; CHECK-GI: {{.*}}
|
||||
; CHECK-SD: {{.*}}
|
||||
|
@ -1,12 +1,22 @@
|
||||
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
|
||||
; RUN: llc < %s -mtriple=arm64-eabi -aarch64-neon-syntax=apple | FileCheck %s
|
||||
; RUN: llc < %s -mtriple=arm64-eabi -aarch64-neon-syntax=apple | FileCheck %s --check-prefixes=CHECK,CHECK-SD
|
||||
; RUN: llc < %s -mtriple=arm64-eabi -aarch64-neon-syntax=apple -global-isel | FileCheck %s --check-prefixes=CHECK,CHECK-GI
|
||||
|
||||
define void @testLeftGood8x8(<8 x i8> %src1, <8 x i8> %src2, ptr %dest) nounwind {
|
||||
; CHECK-LABEL: testLeftGood8x8:
|
||||
; CHECK: // %bb.0:
|
||||
; CHECK-NEXT: sli.8b v0, v1, #3
|
||||
; CHECK-NEXT: str d0, [x0]
|
||||
; CHECK-NEXT: ret
|
||||
; CHECK-SD-LABEL: testLeftGood8x8:
|
||||
; CHECK-SD: // %bb.0:
|
||||
; CHECK-SD-NEXT: sli.8b v0, v1, #3
|
||||
; CHECK-SD-NEXT: str d0, [x0]
|
||||
; CHECK-SD-NEXT: ret
|
||||
;
|
||||
; CHECK-GI-LABEL: testLeftGood8x8:
|
||||
; CHECK-GI: // %bb.0:
|
||||
; CHECK-GI-NEXT: movi.8b v2, #7
|
||||
; CHECK-GI-NEXT: shl.8b v1, v1, #3
|
||||
; CHECK-GI-NEXT: and.8b v0, v0, v2
|
||||
; CHECK-GI-NEXT: orr.8b v0, v0, v1
|
||||
; CHECK-GI-NEXT: str d0, [x0]
|
||||
; CHECK-GI-NEXT: ret
|
||||
%and.i = and <8 x i8> %src1, <i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7>
|
||||
%vshl_n = shl <8 x i8> %src2, <i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3>
|
||||
%result = or <8 x i8> %and.i, %vshl_n
|
||||
@ -15,14 +25,23 @@ define void @testLeftGood8x8(<8 x i8> %src1, <8 x i8> %src2, ptr %dest) nounwind
|
||||
}
|
||||
|
||||
define void @testLeftBad8x8(<8 x i8> %src1, <8 x i8> %src2, ptr %dest) nounwind {
|
||||
; CHECK-LABEL: testLeftBad8x8:
|
||||
; CHECK: // %bb.0:
|
||||
; CHECK-NEXT: movi.8b v2, #165
|
||||
; CHECK-NEXT: add.8b v1, v1, v1
|
||||
; CHECK-NEXT: and.8b v0, v0, v2
|
||||
; CHECK-NEXT: orr.8b v0, v0, v1
|
||||
; CHECK-NEXT: str d0, [x0]
|
||||
; CHECK-NEXT: ret
|
||||
; CHECK-SD-LABEL: testLeftBad8x8:
|
||||
; CHECK-SD: // %bb.0:
|
||||
; CHECK-SD-NEXT: movi.8b v2, #165
|
||||
; CHECK-SD-NEXT: add.8b v1, v1, v1
|
||||
; CHECK-SD-NEXT: and.8b v0, v0, v2
|
||||
; CHECK-SD-NEXT: orr.8b v0, v0, v1
|
||||
; CHECK-SD-NEXT: str d0, [x0]
|
||||
; CHECK-SD-NEXT: ret
|
||||
;
|
||||
; CHECK-GI-LABEL: testLeftBad8x8:
|
||||
; CHECK-GI: // %bb.0:
|
||||
; CHECK-GI-NEXT: movi.8b v2, #165
|
||||
; CHECK-GI-NEXT: shl.8b v1, v1, #1
|
||||
; CHECK-GI-NEXT: and.8b v0, v0, v2
|
||||
; CHECK-GI-NEXT: orr.8b v0, v0, v1
|
||||
; CHECK-GI-NEXT: str d0, [x0]
|
||||
; CHECK-GI-NEXT: ret
|
||||
%and.i = and <8 x i8> %src1, <i8 165, i8 165, i8 165, i8 165, i8 165, i8 165, i8 165, i8 165>
|
||||
%vshl_n = shl <8 x i8> %src2, <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>
|
||||
%result = or <8 x i8> %and.i, %vshl_n
|
||||
@ -31,11 +50,20 @@ define void @testLeftBad8x8(<8 x i8> %src1, <8 x i8> %src2, ptr %dest) nounwind
|
||||
}
|
||||
|
||||
define void @testRightGood8x8(<8 x i8> %src1, <8 x i8> %src2, ptr %dest) nounwind {
|
||||
; CHECK-LABEL: testRightGood8x8:
|
||||
; CHECK: // %bb.0:
|
||||
; CHECK-NEXT: sri.8b v0, v1, #3
|
||||
; CHECK-NEXT: str d0, [x0]
|
||||
; CHECK-NEXT: ret
|
||||
; CHECK-SD-LABEL: testRightGood8x8:
|
||||
; CHECK-SD: // %bb.0:
|
||||
; CHECK-SD-NEXT: sri.8b v0, v1, #3
|
||||
; CHECK-SD-NEXT: str d0, [x0]
|
||||
; CHECK-SD-NEXT: ret
|
||||
;
|
||||
; CHECK-GI-LABEL: testRightGood8x8:
|
||||
; CHECK-GI: // %bb.0:
|
||||
; CHECK-GI-NEXT: movi.8b v2, #224
|
||||
; CHECK-GI-NEXT: ushr.8b v1, v1, #3
|
||||
; CHECK-GI-NEXT: and.8b v0, v0, v2
|
||||
; CHECK-GI-NEXT: orr.8b v0, v0, v1
|
||||
; CHECK-GI-NEXT: str d0, [x0]
|
||||
; CHECK-GI-NEXT: ret
|
||||
%and.i = and <8 x i8> %src1, <i8 224, i8 224, i8 224, i8 224, i8 224, i8 224, i8 224, i8 224>
|
||||
%vshl_n = lshr <8 x i8> %src2, <i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3>
|
||||
%result = or <8 x i8> %and.i, %vshl_n
|
||||
@ -60,11 +88,20 @@ define void @testRightBad8x8(<8 x i8> %src1, <8 x i8> %src2, ptr %dest) nounwind
|
||||
}
|
||||
|
||||
define void @testLeftGood16x8(<16 x i8> %src1, <16 x i8> %src2, ptr %dest) nounwind {
|
||||
; CHECK-LABEL: testLeftGood16x8:
|
||||
; CHECK: // %bb.0:
|
||||
; CHECK-NEXT: sli.16b v0, v1, #3
|
||||
; CHECK-NEXT: str q0, [x0]
|
||||
; CHECK-NEXT: ret
|
||||
; CHECK-SD-LABEL: testLeftGood16x8:
|
||||
; CHECK-SD: // %bb.0:
|
||||
; CHECK-SD-NEXT: sli.16b v0, v1, #3
|
||||
; CHECK-SD-NEXT: str q0, [x0]
|
||||
; CHECK-SD-NEXT: ret
|
||||
;
|
||||
; CHECK-GI-LABEL: testLeftGood16x8:
|
||||
; CHECK-GI: // %bb.0:
|
||||
; CHECK-GI-NEXT: movi.16b v2, #7
|
||||
; CHECK-GI-NEXT: shl.16b v1, v1, #3
|
||||
; CHECK-GI-NEXT: and.16b v0, v0, v2
|
||||
; CHECK-GI-NEXT: orr.16b v0, v0, v1
|
||||
; CHECK-GI-NEXT: str q0, [x0]
|
||||
; CHECK-GI-NEXT: ret
|
||||
%and.i = and <16 x i8> %src1, <i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7>
|
||||
%vshl_n = shl <16 x i8> %src2, <i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3>
|
||||
%result = or <16 x i8> %and.i, %vshl_n
|
||||
@ -73,14 +110,23 @@ define void @testLeftGood16x8(<16 x i8> %src1, <16 x i8> %src2, ptr %dest) nounw
|
||||
}
|
||||
|
||||
define void @testLeftBad16x8(<16 x i8> %src1, <16 x i8> %src2, ptr %dest) nounwind {
|
||||
; CHECK-LABEL: testLeftBad16x8:
|
||||
; CHECK: // %bb.0:
|
||||
; CHECK-NEXT: movi.16b v2, #165
|
||||
; CHECK-NEXT: add.16b v1, v1, v1
|
||||
; CHECK-NEXT: and.16b v0, v0, v2
|
||||
; CHECK-NEXT: orr.16b v0, v0, v1
|
||||
; CHECK-NEXT: str q0, [x0]
|
||||
; CHECK-NEXT: ret
|
||||
; CHECK-SD-LABEL: testLeftBad16x8:
|
||||
; CHECK-SD: // %bb.0:
|
||||
; CHECK-SD-NEXT: movi.16b v2, #165
|
||||
; CHECK-SD-NEXT: add.16b v1, v1, v1
|
||||
; CHECK-SD-NEXT: and.16b v0, v0, v2
|
||||
; CHECK-SD-NEXT: orr.16b v0, v0, v1
|
||||
; CHECK-SD-NEXT: str q0, [x0]
|
||||
; CHECK-SD-NEXT: ret
|
||||
;
|
||||
; CHECK-GI-LABEL: testLeftBad16x8:
|
||||
; CHECK-GI: // %bb.0:
|
||||
; CHECK-GI-NEXT: movi.16b v2, #165
|
||||
; CHECK-GI-NEXT: shl.16b v1, v1, #1
|
||||
; CHECK-GI-NEXT: and.16b v0, v0, v2
|
||||
; CHECK-GI-NEXT: orr.16b v0, v0, v1
|
||||
; CHECK-GI-NEXT: str q0, [x0]
|
||||
; CHECK-GI-NEXT: ret
|
||||
%and.i = and <16 x i8> %src1, <i8 165, i8 165, i8 165, i8 165, i8 165, i8 165, i8 165, i8 165, i8 165, i8 165, i8 165, i8 165, i8 165, i8 165, i8 165, i8 165>
|
||||
%vshl_n = shl <16 x i8> %src2, <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>
|
||||
%result = or <16 x i8> %and.i, %vshl_n
|
||||
@ -89,11 +135,20 @@ define void @testLeftBad16x8(<16 x i8> %src1, <16 x i8> %src2, ptr %dest) nounwi
|
||||
}
|
||||
|
||||
define void @testRightGood16x8(<16 x i8> %src1, <16 x i8> %src2, ptr %dest) nounwind {
|
||||
; CHECK-LABEL: testRightGood16x8:
|
||||
; CHECK: // %bb.0:
|
||||
; CHECK-NEXT: sri.16b v0, v1, #3
|
||||
; CHECK-NEXT: str q0, [x0]
|
||||
; CHECK-NEXT: ret
|
||||
; CHECK-SD-LABEL: testRightGood16x8:
|
||||
; CHECK-SD: // %bb.0:
|
||||
; CHECK-SD-NEXT: sri.16b v0, v1, #3
|
||||
; CHECK-SD-NEXT: str q0, [x0]
|
||||
; CHECK-SD-NEXT: ret
|
||||
;
|
||||
; CHECK-GI-LABEL: testRightGood16x8:
|
||||
; CHECK-GI: // %bb.0:
|
||||
; CHECK-GI-NEXT: movi.16b v2, #224
|
||||
; CHECK-GI-NEXT: ushr.16b v1, v1, #3
|
||||
; CHECK-GI-NEXT: and.16b v0, v0, v2
|
||||
; CHECK-GI-NEXT: orr.16b v0, v0, v1
|
||||
; CHECK-GI-NEXT: str q0, [x0]
|
||||
; CHECK-GI-NEXT: ret
|
||||
%and.i = and <16 x i8> %src1, <i8 224, i8 224, i8 224, i8 224, i8 224, i8 224, i8 224, i8 224, i8 224, i8 224, i8 224, i8 224, i8 224, i8 224, i8 224, i8 224>
|
||||
%vshl_n = lshr <16 x i8> %src2, <i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3>
|
||||
%result = or <16 x i8> %and.i, %vshl_n
|
||||
@ -118,11 +173,20 @@ define void @testRightBad16x8(<16 x i8> %src1, <16 x i8> %src2, ptr %dest) nounw
|
||||
}
|
||||
|
||||
define void @testLeftGood4x16(<4 x i16> %src1, <4 x i16> %src2, ptr %dest) nounwind {
|
||||
; CHECK-LABEL: testLeftGood4x16:
|
||||
; CHECK: // %bb.0:
|
||||
; CHECK-NEXT: sli.4h v0, v1, #14
|
||||
; CHECK-NEXT: str d0, [x0]
|
||||
; CHECK-NEXT: ret
|
||||
; CHECK-SD-LABEL: testLeftGood4x16:
|
||||
; CHECK-SD: // %bb.0:
|
||||
; CHECK-SD-NEXT: sli.4h v0, v1, #14
|
||||
; CHECK-SD-NEXT: str d0, [x0]
|
||||
; CHECK-SD-NEXT: ret
|
||||
;
|
||||
; CHECK-GI-LABEL: testLeftGood4x16:
|
||||
; CHECK-GI: // %bb.0:
|
||||
; CHECK-GI-NEXT: mvni.4h v2, #192, lsl #8
|
||||
; CHECK-GI-NEXT: shl.4h v1, v1, #14
|
||||
; CHECK-GI-NEXT: and.8b v0, v0, v2
|
||||
; CHECK-GI-NEXT: orr.8b v0, v0, v1
|
||||
; CHECK-GI-NEXT: str d0, [x0]
|
||||
; CHECK-GI-NEXT: ret
|
||||
%and.i = and <4 x i16> %src1, <i16 16383, i16 16383, i16 16383, i16 16383>
|
||||
%vshl_n = shl <4 x i16> %src2, <i16 14, i16 14, i16 14, i16 14>
|
||||
%result = or <4 x i16> %and.i, %vshl_n
|
||||
@ -131,15 +195,25 @@ define void @testLeftGood4x16(<4 x i16> %src1, <4 x i16> %src2, ptr %dest) nounw
|
||||
}
|
||||
|
||||
define void @testLeftBad4x16(<4 x i16> %src1, <4 x i16> %src2, ptr %dest) nounwind {
|
||||
; CHECK-LABEL: testLeftBad4x16:
|
||||
; CHECK: // %bb.0:
|
||||
; CHECK-NEXT: mov w8, #16500
|
||||
; CHECK-NEXT: shl.4h v1, v1, #14
|
||||
; CHECK-NEXT: dup.4h v2, w8
|
||||
; CHECK-NEXT: and.8b v0, v0, v2
|
||||
; CHECK-NEXT: orr.8b v0, v0, v1
|
||||
; CHECK-NEXT: str d0, [x0]
|
||||
; CHECK-NEXT: ret
|
||||
; CHECK-SD-LABEL: testLeftBad4x16:
|
||||
; CHECK-SD: // %bb.0:
|
||||
; CHECK-SD-NEXT: mov w8, #16500 // =0x4074
|
||||
; CHECK-SD-NEXT: shl.4h v1, v1, #14
|
||||
; CHECK-SD-NEXT: dup.4h v2, w8
|
||||
; CHECK-SD-NEXT: and.8b v0, v0, v2
|
||||
; CHECK-SD-NEXT: orr.8b v0, v0, v1
|
||||
; CHECK-SD-NEXT: str d0, [x0]
|
||||
; CHECK-SD-NEXT: ret
|
||||
;
|
||||
; CHECK-GI-LABEL: testLeftBad4x16:
|
||||
; CHECK-GI: // %bb.0:
|
||||
; CHECK-GI-NEXT: adrp x8, .LCPI9_0
|
||||
; CHECK-GI-NEXT: shl.4h v1, v1, #14
|
||||
; CHECK-GI-NEXT: ldr d2, [x8, :lo12:.LCPI9_0]
|
||||
; CHECK-GI-NEXT: and.8b v0, v0, v2
|
||||
; CHECK-GI-NEXT: orr.8b v0, v0, v1
|
||||
; CHECK-GI-NEXT: str d0, [x0]
|
||||
; CHECK-GI-NEXT: ret
|
||||
%and.i = and <4 x i16> %src1, <i16 16500, i16 16500, i16 16500, i16 16500>
|
||||
%vshl_n = shl <4 x i16> %src2, <i16 14, i16 14, i16 14, i16 14>
|
||||
%result = or <4 x i16> %and.i, %vshl_n
|
||||
@ -148,11 +222,20 @@ define void @testLeftBad4x16(<4 x i16> %src1, <4 x i16> %src2, ptr %dest) nounwi
|
||||
}
|
||||
|
||||
define void @testRightGood4x16(<4 x i16> %src1, <4 x i16> %src2, ptr %dest) nounwind {
|
||||
; CHECK-LABEL: testRightGood4x16:
|
||||
; CHECK: // %bb.0:
|
||||
; CHECK-NEXT: sri.4h v0, v1, #14
|
||||
; CHECK-NEXT: str d0, [x0]
|
||||
; CHECK-NEXT: ret
|
||||
; CHECK-SD-LABEL: testRightGood4x16:
|
||||
; CHECK-SD: // %bb.0:
|
||||
; CHECK-SD-NEXT: sri.4h v0, v1, #14
|
||||
; CHECK-SD-NEXT: str d0, [x0]
|
||||
; CHECK-SD-NEXT: ret
|
||||
;
|
||||
; CHECK-GI-LABEL: testRightGood4x16:
|
||||
; CHECK-GI: // %bb.0:
|
||||
; CHECK-GI-NEXT: mvni.4h v2, #3
|
||||
; CHECK-GI-NEXT: ushr.4h v1, v1, #14
|
||||
; CHECK-GI-NEXT: and.8b v0, v0, v2
|
||||
; CHECK-GI-NEXT: orr.8b v0, v0, v1
|
||||
; CHECK-GI-NEXT: str d0, [x0]
|
||||
; CHECK-GI-NEXT: ret
|
||||
%and.i = and <4 x i16> %src1, <i16 65532, i16 65532, i16 65532, i16 65532>
|
||||
%vshl_n = lshr <4 x i16> %src2, <i16 14, i16 14, i16 14, i16 14>
|
||||
%result = or <4 x i16> %and.i, %vshl_n
|
||||
@ -161,14 +244,24 @@ define void @testRightGood4x16(<4 x i16> %src1, <4 x i16> %src2, ptr %dest) noun
|
||||
}
|
||||
|
||||
define void @testRightBad4x16(<4 x i16> %src1, <4 x i16> %src2, ptr %dest) nounwind {
|
||||
; CHECK-LABEL: testRightBad4x16:
|
||||
; CHECK: // %bb.0:
|
||||
; CHECK-NEXT: mov w8, #16500
|
||||
; CHECK-NEXT: dup.4h v2, w8
|
||||
; CHECK-NEXT: and.8b v0, v0, v2
|
||||
; CHECK-NEXT: usra.4h v0, v1, #14
|
||||
; CHECK-NEXT: str d0, [x0]
|
||||
; CHECK-NEXT: ret
|
||||
; CHECK-SD-LABEL: testRightBad4x16:
|
||||
; CHECK-SD: // %bb.0:
|
||||
; CHECK-SD-NEXT: mov w8, #16500 // =0x4074
|
||||
; CHECK-SD-NEXT: dup.4h v2, w8
|
||||
; CHECK-SD-NEXT: and.8b v0, v0, v2
|
||||
; CHECK-SD-NEXT: usra.4h v0, v1, #14
|
||||
; CHECK-SD-NEXT: str d0, [x0]
|
||||
; CHECK-SD-NEXT: ret
|
||||
;
|
||||
; CHECK-GI-LABEL: testRightBad4x16:
|
||||
; CHECK-GI: // %bb.0:
|
||||
; CHECK-GI-NEXT: adrp x8, .LCPI11_0
|
||||
; CHECK-GI-NEXT: ushr.4h v1, v1, #14
|
||||
; CHECK-GI-NEXT: ldr d2, [x8, :lo12:.LCPI11_0]
|
||||
; CHECK-GI-NEXT: and.8b v0, v0, v2
|
||||
; CHECK-GI-NEXT: orr.8b v0, v0, v1
|
||||
; CHECK-GI-NEXT: str d0, [x0]
|
||||
; CHECK-GI-NEXT: ret
|
||||
%and.i = and <4 x i16> %src1, <i16 16500, i16 16500, i16 16500, i16 16500>
|
||||
%vshl_n = lshr <4 x i16> %src2, <i16 14, i16 14, i16 14, i16 14>
|
||||
%result = or <4 x i16> %and.i, %vshl_n
|
||||
@ -177,11 +270,20 @@ define void @testRightBad4x16(<4 x i16> %src1, <4 x i16> %src2, ptr %dest) nounw
|
||||
}
|
||||
|
||||
define void @testLeftGood8x16(<8 x i16> %src1, <8 x i16> %src2, ptr %dest) nounwind {
|
||||
; CHECK-LABEL: testLeftGood8x16:
|
||||
; CHECK: // %bb.0:
|
||||
; CHECK-NEXT: sli.8h v0, v1, #14
|
||||
; CHECK-NEXT: str q0, [x0]
|
||||
; CHECK-NEXT: ret
|
||||
; CHECK-SD-LABEL: testLeftGood8x16:
|
||||
; CHECK-SD: // %bb.0:
|
||||
; CHECK-SD-NEXT: sli.8h v0, v1, #14
|
||||
; CHECK-SD-NEXT: str q0, [x0]
|
||||
; CHECK-SD-NEXT: ret
|
||||
;
|
||||
; CHECK-GI-LABEL: testLeftGood8x16:
|
||||
; CHECK-GI: // %bb.0:
|
||||
; CHECK-GI-NEXT: mvni.8h v2, #192, lsl #8
|
||||
; CHECK-GI-NEXT: shl.8h v1, v1, #14
|
||||
; CHECK-GI-NEXT: and.16b v0, v0, v2
|
||||
; CHECK-GI-NEXT: orr.16b v0, v0, v1
|
||||
; CHECK-GI-NEXT: str q0, [x0]
|
||||
; CHECK-GI-NEXT: ret
|
||||
%and.i = and <8 x i16> %src1, <i16 16383, i16 16383, i16 16383, i16 16383, i16 16383, i16 16383, i16 16383, i16 16383>
|
||||
%vshl_n = shl <8 x i16> %src2, <i16 14, i16 14, i16 14, i16 14, i16 14, i16 14, i16 14, i16 14>
|
||||
%result = or <8 x i16> %and.i, %vshl_n
|
||||
@ -190,15 +292,25 @@ define void @testLeftGood8x16(<8 x i16> %src1, <8 x i16> %src2, ptr %dest) nounw
|
||||
}
|
||||
|
||||
define void @testLeftBad8x16(<8 x i16> %src1, <8 x i16> %src2, ptr %dest) nounwind {
|
||||
; CHECK-LABEL: testLeftBad8x16:
|
||||
; CHECK: // %bb.0:
|
||||
; CHECK-NEXT: mov w8, #16500
|
||||
; CHECK-NEXT: shl.8h v1, v1, #14
|
||||
; CHECK-NEXT: dup.8h v2, w8
|
||||
; CHECK-NEXT: and.16b v0, v0, v2
|
||||
; CHECK-NEXT: orr.16b v0, v0, v1
|
||||
; CHECK-NEXT: str q0, [x0]
|
||||
; CHECK-NEXT: ret
|
||||
; CHECK-SD-LABEL: testLeftBad8x16:
|
||||
; CHECK-SD: // %bb.0:
|
||||
; CHECK-SD-NEXT: mov w8, #16500 // =0x4074
|
||||
; CHECK-SD-NEXT: shl.8h v1, v1, #14
|
||||
; CHECK-SD-NEXT: dup.8h v2, w8
|
||||
; CHECK-SD-NEXT: and.16b v0, v0, v2
|
||||
; CHECK-SD-NEXT: orr.16b v0, v0, v1
|
||||
; CHECK-SD-NEXT: str q0, [x0]
|
||||
; CHECK-SD-NEXT: ret
|
||||
;
|
||||
; CHECK-GI-LABEL: testLeftBad8x16:
|
||||
; CHECK-GI: // %bb.0:
|
||||
; CHECK-GI-NEXT: adrp x8, .LCPI13_0
|
||||
; CHECK-GI-NEXT: shl.8h v1, v1, #14
|
||||
; CHECK-GI-NEXT: ldr q2, [x8, :lo12:.LCPI13_0]
|
||||
; CHECK-GI-NEXT: and.16b v0, v0, v2
|
||||
; CHECK-GI-NEXT: orr.16b v0, v0, v1
|
||||
; CHECK-GI-NEXT: str q0, [x0]
|
||||
; CHECK-GI-NEXT: ret
|
||||
%and.i = and <8 x i16> %src1, <i16 16500, i16 16500, i16 16500, i16 16500, i16 16500, i16 16500, i16 16500, i16 16500>
|
||||
%vshl_n = shl <8 x i16> %src2, <i16 14, i16 14, i16 14, i16 14, i16 14, i16 14, i16 14, i16 14>
|
||||
%result = or <8 x i16> %and.i, %vshl_n
|
||||
@ -207,11 +319,20 @@ define void @testLeftBad8x16(<8 x i16> %src1, <8 x i16> %src2, ptr %dest) nounwi
|
||||
}
|
||||
|
||||
define void @testRightGood8x16(<8 x i16> %src1, <8 x i16> %src2, ptr %dest) nounwind {
|
||||
; CHECK-LABEL: testRightGood8x16:
|
||||
; CHECK: // %bb.0:
|
||||
; CHECK-NEXT: sri.8h v0, v1, #14
|
||||
; CHECK-NEXT: str q0, [x0]
|
||||
; CHECK-NEXT: ret
|
||||
; CHECK-SD-LABEL: testRightGood8x16:
|
||||
; CHECK-SD: // %bb.0:
|
||||
; CHECK-SD-NEXT: sri.8h v0, v1, #14
|
||||
; CHECK-SD-NEXT: str q0, [x0]
|
||||
; CHECK-SD-NEXT: ret
|
||||
;
|
||||
; CHECK-GI-LABEL: testRightGood8x16:
|
||||
; CHECK-GI: // %bb.0:
|
||||
; CHECK-GI-NEXT: mvni.8h v2, #3
|
||||
; CHECK-GI-NEXT: ushr.8h v1, v1, #14
|
||||
; CHECK-GI-NEXT: and.16b v0, v0, v2
|
||||
; CHECK-GI-NEXT: orr.16b v0, v0, v1
|
||||
; CHECK-GI-NEXT: str q0, [x0]
|
||||
; CHECK-GI-NEXT: ret
|
||||
%and.i = and <8 x i16> %src1, <i16 65532, i16 65532, i16 65532, i16 65532, i16 65532, i16 65532, i16 65532, i16 65532>
|
||||
%vshl_n = lshr <8 x i16> %src2, <i16 14, i16 14, i16 14, i16 14, i16 14, i16 14, i16 14, i16 14>
|
||||
%result = or <8 x i16> %and.i, %vshl_n
|
||||
@ -220,14 +341,24 @@ define void @testRightGood8x16(<8 x i16> %src1, <8 x i16> %src2, ptr %dest) noun
|
||||
}
|
||||
|
||||
define void @testRightBad8x16(<8 x i16> %src1, <8 x i16> %src2, ptr %dest) nounwind {
|
||||
; CHECK-LABEL: testRightBad8x16:
|
||||
; CHECK: // %bb.0:
|
||||
; CHECK-NEXT: mov w8, #16500
|
||||
; CHECK-NEXT: dup.8h v2, w8
|
||||
; CHECK-NEXT: and.16b v0, v0, v2
|
||||
; CHECK-NEXT: usra.8h v0, v1, #14
|
||||
; CHECK-NEXT: str q0, [x0]
|
||||
; CHECK-NEXT: ret
|
||||
; CHECK-SD-LABEL: testRightBad8x16:
|
||||
; CHECK-SD: // %bb.0:
|
||||
; CHECK-SD-NEXT: mov w8, #16500 // =0x4074
|
||||
; CHECK-SD-NEXT: dup.8h v2, w8
|
||||
; CHECK-SD-NEXT: and.16b v0, v0, v2
|
||||
; CHECK-SD-NEXT: usra.8h v0, v1, #14
|
||||
; CHECK-SD-NEXT: str q0, [x0]
|
||||
; CHECK-SD-NEXT: ret
|
||||
;
|
||||
; CHECK-GI-LABEL: testRightBad8x16:
|
||||
; CHECK-GI: // %bb.0:
|
||||
; CHECK-GI-NEXT: adrp x8, .LCPI15_0
|
||||
; CHECK-GI-NEXT: ushr.8h v1, v1, #14
|
||||
; CHECK-GI-NEXT: ldr q2, [x8, :lo12:.LCPI15_0]
|
||||
; CHECK-GI-NEXT: and.16b v0, v0, v2
|
||||
; CHECK-GI-NEXT: orr.16b v0, v0, v1
|
||||
; CHECK-GI-NEXT: str q0, [x0]
|
||||
; CHECK-GI-NEXT: ret
|
||||
%and.i = and <8 x i16> %src1, <i16 16500, i16 16500, i16 16500, i16 16500, i16 16500, i16 16500, i16 16500, i16 16500>
|
||||
%vshl_n = lshr <8 x i16> %src2, <i16 14, i16 14, i16 14, i16 14, i16 14, i16 14, i16 14, i16 14>
|
||||
%result = or <8 x i16> %and.i, %vshl_n
|
||||
@ -236,11 +367,20 @@ define void @testRightBad8x16(<8 x i16> %src1, <8 x i16> %src2, ptr %dest) nounw
|
||||
}
|
||||
|
||||
define void @testLeftGood2x32(<2 x i32> %src1, <2 x i32> %src2, ptr %dest) nounwind {
|
||||
; CHECK-LABEL: testLeftGood2x32:
|
||||
; CHECK: // %bb.0:
|
||||
; CHECK-NEXT: sli.2s v0, v1, #22
|
||||
; CHECK-NEXT: str d0, [x0]
|
||||
; CHECK-NEXT: ret
|
||||
; CHECK-SD-LABEL: testLeftGood2x32:
|
||||
; CHECK-SD: // %bb.0:
|
||||
; CHECK-SD-NEXT: sli.2s v0, v1, #22
|
||||
; CHECK-SD-NEXT: str d0, [x0]
|
||||
; CHECK-SD-NEXT: ret
|
||||
;
|
||||
; CHECK-GI-LABEL: testLeftGood2x32:
|
||||
; CHECK-GI: // %bb.0:
|
||||
; CHECK-GI-NEXT: movi.2s v2, #63, msl #16
|
||||
; CHECK-GI-NEXT: shl.2s v1, v1, #22
|
||||
; CHECK-GI-NEXT: and.8b v0, v0, v2
|
||||
; CHECK-GI-NEXT: orr.8b v0, v0, v1
|
||||
; CHECK-GI-NEXT: str d0, [x0]
|
||||
; CHECK-GI-NEXT: ret
|
||||
%and.i = and <2 x i32> %src1, <i32 4194303, i32 4194303>
|
||||
%vshl_n = shl <2 x i32> %src2, <i32 22, i32 22>
|
||||
%result = or <2 x i32> %and.i, %vshl_n
|
||||
@ -249,15 +389,25 @@ define void @testLeftGood2x32(<2 x i32> %src1, <2 x i32> %src2, ptr %dest) nounw
|
||||
}
|
||||
|
||||
define void @testLeftBad2x32(<2 x i32> %src1, <2 x i32> %src2, ptr %dest) nounwind {
|
||||
; CHECK-LABEL: testLeftBad2x32:
|
||||
; CHECK: // %bb.0:
|
||||
; CHECK-NEXT: mov w8, #4194300
|
||||
; CHECK-NEXT: shl.2s v1, v1, #22
|
||||
; CHECK-NEXT: dup.2s v2, w8
|
||||
; CHECK-NEXT: and.8b v0, v0, v2
|
||||
; CHECK-NEXT: orr.8b v0, v0, v1
|
||||
; CHECK-NEXT: str d0, [x0]
|
||||
; CHECK-NEXT: ret
|
||||
; CHECK-SD-LABEL: testLeftBad2x32:
|
||||
; CHECK-SD: // %bb.0:
|
||||
; CHECK-SD-NEXT: mov w8, #4194300 // =0x3ffffc
|
||||
; CHECK-SD-NEXT: shl.2s v1, v1, #22
|
||||
; CHECK-SD-NEXT: dup.2s v2, w8
|
||||
; CHECK-SD-NEXT: and.8b v0, v0, v2
|
||||
; CHECK-SD-NEXT: orr.8b v0, v0, v1
|
||||
; CHECK-SD-NEXT: str d0, [x0]
|
||||
; CHECK-SD-NEXT: ret
|
||||
;
|
||||
; CHECK-GI-LABEL: testLeftBad2x32:
|
||||
; CHECK-GI: // %bb.0:
|
||||
; CHECK-GI-NEXT: adrp x8, .LCPI17_0
|
||||
; CHECK-GI-NEXT: shl.2s v1, v1, #22
|
||||
; CHECK-GI-NEXT: ldr d2, [x8, :lo12:.LCPI17_0]
|
||||
; CHECK-GI-NEXT: and.8b v0, v0, v2
|
||||
; CHECK-GI-NEXT: orr.8b v0, v0, v1
|
||||
; CHECK-GI-NEXT: str d0, [x0]
|
||||
; CHECK-GI-NEXT: ret
|
||||
%and.i = and <2 x i32> %src1, <i32 4194300, i32 4194300>
|
||||
%vshl_n = shl <2 x i32> %src2, <i32 22, i32 22>
|
||||
%result = or <2 x i32> %and.i, %vshl_n
|
||||
@ -266,11 +416,20 @@ define void @testLeftBad2x32(<2 x i32> %src1, <2 x i32> %src2, ptr %dest) nounwi
|
||||
}
|
||||
|
||||
define void @testRightGood2x32(<2 x i32> %src1, <2 x i32> %src2, ptr %dest) nounwind {
|
||||
; CHECK-LABEL: testRightGood2x32:
|
||||
; CHECK: // %bb.0:
|
||||
; CHECK-NEXT: sri.2s v0, v1, #22
|
||||
; CHECK-NEXT: str d0, [x0]
|
||||
; CHECK-NEXT: ret
|
||||
; CHECK-SD-LABEL: testRightGood2x32:
|
||||
; CHECK-SD: // %bb.0:
|
||||
; CHECK-SD-NEXT: sri.2s v0, v1, #22
|
||||
; CHECK-SD-NEXT: str d0, [x0]
|
||||
; CHECK-SD-NEXT: ret
|
||||
;
|
||||
; CHECK-GI-LABEL: testRightGood2x32:
|
||||
; CHECK-GI: // %bb.0:
|
||||
; CHECK-GI-NEXT: mvni.2s v2, #3, msl #8
|
||||
; CHECK-GI-NEXT: ushr.2s v1, v1, #22
|
||||
; CHECK-GI-NEXT: and.8b v0, v0, v2
|
||||
; CHECK-GI-NEXT: orr.8b v0, v0, v1
|
||||
; CHECK-GI-NEXT: str d0, [x0]
|
||||
; CHECK-GI-NEXT: ret
|
||||
%and.i = and <2 x i32> %src1, <i32 4294966272, i32 4294966272>
|
||||
%vshl_n = lshr <2 x i32> %src2, <i32 22, i32 22>
|
||||
%result = or <2 x i32> %and.i, %vshl_n
|
||||
@ -279,15 +438,25 @@ define void @testRightGood2x32(<2 x i32> %src1, <2 x i32> %src2, ptr %dest) noun
|
||||
}
|
||||
|
||||
define void @testRightBad2x32(<2 x i32> %src1, <2 x i32> %src2, ptr %dest) nounwind {
|
||||
; CHECK-LABEL: testRightBad2x32:
|
||||
; CHECK: // %bb.0:
|
||||
; CHECK-NEXT: mov w8, #4194300
|
||||
; CHECK-NEXT: ushr.2s v1, v1, #22
|
||||
; CHECK-NEXT: dup.2s v2, w8
|
||||
; CHECK-NEXT: and.8b v0, v0, v2
|
||||
; CHECK-NEXT: orr.8b v0, v0, v1
|
||||
; CHECK-NEXT: str d0, [x0]
|
||||
; CHECK-NEXT: ret
|
||||
; CHECK-SD-LABEL: testRightBad2x32:
|
||||
; CHECK-SD: // %bb.0:
|
||||
; CHECK-SD-NEXT: mov w8, #4194300 // =0x3ffffc
|
||||
; CHECK-SD-NEXT: ushr.2s v1, v1, #22
|
||||
; CHECK-SD-NEXT: dup.2s v2, w8
|
||||
; CHECK-SD-NEXT: and.8b v0, v0, v2
|
||||
; CHECK-SD-NEXT: orr.8b v0, v0, v1
|
||||
; CHECK-SD-NEXT: str d0, [x0]
|
||||
; CHECK-SD-NEXT: ret
|
||||
;
|
||||
; CHECK-GI-LABEL: testRightBad2x32:
|
||||
; CHECK-GI: // %bb.0:
|
||||
; CHECK-GI-NEXT: adrp x8, .LCPI19_0
|
||||
; CHECK-GI-NEXT: ushr.2s v1, v1, #22
|
||||
; CHECK-GI-NEXT: ldr d2, [x8, :lo12:.LCPI19_0]
|
||||
; CHECK-GI-NEXT: and.8b v0, v0, v2
|
||||
; CHECK-GI-NEXT: orr.8b v0, v0, v1
|
||||
; CHECK-GI-NEXT: str d0, [x0]
|
||||
; CHECK-GI-NEXT: ret
|
||||
%and.i = and <2 x i32> %src1, <i32 4194300, i32 4194300>
|
||||
%vshl_n = lshr <2 x i32> %src2, <i32 22, i32 22>
|
||||
%result = or <2 x i32> %and.i, %vshl_n
|
||||
@ -296,11 +465,20 @@ define void @testRightBad2x32(<2 x i32> %src1, <2 x i32> %src2, ptr %dest) nounw
|
||||
}
|
||||
|
||||
define void @testLeftGood4x32(<4 x i32> %src1, <4 x i32> %src2, ptr %dest) nounwind {
|
||||
; CHECK-LABEL: testLeftGood4x32:
|
||||
; CHECK: // %bb.0:
|
||||
; CHECK-NEXT: sli.4s v0, v1, #22
|
||||
; CHECK-NEXT: str q0, [x0]
|
||||
; CHECK-NEXT: ret
|
||||
; CHECK-SD-LABEL: testLeftGood4x32:
|
||||
; CHECK-SD: // %bb.0:
|
||||
; CHECK-SD-NEXT: sli.4s v0, v1, #22
|
||||
; CHECK-SD-NEXT: str q0, [x0]
|
||||
; CHECK-SD-NEXT: ret
|
||||
;
|
||||
; CHECK-GI-LABEL: testLeftGood4x32:
|
||||
; CHECK-GI: // %bb.0:
|
||||
; CHECK-GI-NEXT: movi.4s v2, #63, msl #16
|
||||
; CHECK-GI-NEXT: shl.4s v1, v1, #22
|
||||
; CHECK-GI-NEXT: and.16b v0, v0, v2
|
||||
; CHECK-GI-NEXT: orr.16b v0, v0, v1
|
||||
; CHECK-GI-NEXT: str q0, [x0]
|
||||
; CHECK-GI-NEXT: ret
|
||||
%and.i = and <4 x i32> %src1, <i32 4194303, i32 4194303, i32 4194303, i32 4194303>
|
||||
%vshl_n = shl <4 x i32> %src2, <i32 22, i32 22, i32 22, i32 22>
|
||||
%result = or <4 x i32> %and.i, %vshl_n
|
||||
@ -309,15 +487,25 @@ define void @testLeftGood4x32(<4 x i32> %src1, <4 x i32> %src2, ptr %dest) nounw
|
||||
}
|
||||
|
||||
define void @testLeftBad4x32(<4 x i32> %src1, <4 x i32> %src2, ptr %dest) nounwind {
|
||||
; CHECK-LABEL: testLeftBad4x32:
|
||||
; CHECK: // %bb.0:
|
||||
; CHECK-NEXT: mov w8, #4194300
|
||||
; CHECK-NEXT: shl.4s v1, v1, #22
|
||||
; CHECK-NEXT: dup.4s v2, w8
|
||||
; CHECK-NEXT: and.16b v0, v0, v2
|
||||
; CHECK-NEXT: orr.16b v0, v0, v1
|
||||
; CHECK-NEXT: str q0, [x0]
|
||||
; CHECK-NEXT: ret
|
||||
; CHECK-SD-LABEL: testLeftBad4x32:
|
||||
; CHECK-SD: // %bb.0:
|
||||
; CHECK-SD-NEXT: mov w8, #4194300 // =0x3ffffc
|
||||
; CHECK-SD-NEXT: shl.4s v1, v1, #22
|
||||
; CHECK-SD-NEXT: dup.4s v2, w8
|
||||
; CHECK-SD-NEXT: and.16b v0, v0, v2
|
||||
; CHECK-SD-NEXT: orr.16b v0, v0, v1
|
||||
; CHECK-SD-NEXT: str q0, [x0]
|
||||
; CHECK-SD-NEXT: ret
|
||||
;
|
||||
; CHECK-GI-LABEL: testLeftBad4x32:
|
||||
; CHECK-GI: // %bb.0:
|
||||
; CHECK-GI-NEXT: adrp x8, .LCPI21_0
|
||||
; CHECK-GI-NEXT: shl.4s v1, v1, #22
|
||||
; CHECK-GI-NEXT: ldr q2, [x8, :lo12:.LCPI21_0]
|
||||
; CHECK-GI-NEXT: and.16b v0, v0, v2
|
||||
; CHECK-GI-NEXT: orr.16b v0, v0, v1
|
||||
; CHECK-GI-NEXT: str q0, [x0]
|
||||
; CHECK-GI-NEXT: ret
|
||||
%and.i = and <4 x i32> %src1, <i32 4194300, i32 4194300, i32 4194300, i32 4194300>
|
||||
%vshl_n = shl <4 x i32> %src2, <i32 22, i32 22, i32 22, i32 22>
|
||||
%result = or <4 x i32> %and.i, %vshl_n
|
||||
@ -326,11 +514,20 @@ define void @testLeftBad4x32(<4 x i32> %src1, <4 x i32> %src2, ptr %dest) nounwi
|
||||
}
|
||||
|
||||
define void @testRightGood4x32(<4 x i32> %src1, <4 x i32> %src2, ptr %dest) nounwind {
|
||||
; CHECK-LABEL: testRightGood4x32:
|
||||
; CHECK: // %bb.0:
|
||||
; CHECK-NEXT: sri.4s v0, v1, #22
|
||||
; CHECK-NEXT: str q0, [x0]
|
||||
; CHECK-NEXT: ret
|
||||
; CHECK-SD-LABEL: testRightGood4x32:
|
||||
; CHECK-SD: // %bb.0:
|
||||
; CHECK-SD-NEXT: sri.4s v0, v1, #22
|
||||
; CHECK-SD-NEXT: str q0, [x0]
|
||||
; CHECK-SD-NEXT: ret
|
||||
;
|
||||
; CHECK-GI-LABEL: testRightGood4x32:
|
||||
; CHECK-GI: // %bb.0:
|
||||
; CHECK-GI-NEXT: mvni.4s v2, #3, msl #8
|
||||
; CHECK-GI-NEXT: ushr.4s v1, v1, #22
|
||||
; CHECK-GI-NEXT: and.16b v0, v0, v2
|
||||
; CHECK-GI-NEXT: orr.16b v0, v0, v1
|
||||
; CHECK-GI-NEXT: str q0, [x0]
|
||||
; CHECK-GI-NEXT: ret
|
||||
%and.i = and <4 x i32> %src1, <i32 4294966272, i32 4294966272, i32 4294966272, i32 4294966272>
|
||||
%vshl_n = lshr <4 x i32> %src2, <i32 22, i32 22, i32 22, i32 22>
|
||||
%result = or <4 x i32> %and.i, %vshl_n
|
||||
@ -339,15 +536,25 @@ define void @testRightGood4x32(<4 x i32> %src1, <4 x i32> %src2, ptr %dest) noun
|
||||
}
|
||||
|
||||
define void @testRightBad4x32(<4 x i32> %src1, <4 x i32> %src2, ptr %dest) nounwind {
|
||||
; CHECK-LABEL: testRightBad4x32:
|
||||
; CHECK: // %bb.0:
|
||||
; CHECK-NEXT: mov w8, #4194300
|
||||
; CHECK-NEXT: ushr.4s v1, v1, #22
|
||||
; CHECK-NEXT: dup.4s v2, w8
|
||||
; CHECK-NEXT: and.16b v0, v0, v2
|
||||
; CHECK-NEXT: orr.16b v0, v0, v1
|
||||
; CHECK-NEXT: str q0, [x0]
|
||||
; CHECK-NEXT: ret
|
||||
; CHECK-SD-LABEL: testRightBad4x32:
|
||||
; CHECK-SD: // %bb.0:
|
||||
; CHECK-SD-NEXT: mov w8, #4194300 // =0x3ffffc
|
||||
; CHECK-SD-NEXT: ushr.4s v1, v1, #22
|
||||
; CHECK-SD-NEXT: dup.4s v2, w8
|
||||
; CHECK-SD-NEXT: and.16b v0, v0, v2
|
||||
; CHECK-SD-NEXT: orr.16b v0, v0, v1
|
||||
; CHECK-SD-NEXT: str q0, [x0]
|
||||
; CHECK-SD-NEXT: ret
|
||||
;
|
||||
; CHECK-GI-LABEL: testRightBad4x32:
|
||||
; CHECK-GI: // %bb.0:
|
||||
; CHECK-GI-NEXT: adrp x8, .LCPI23_0
|
||||
; CHECK-GI-NEXT: ushr.4s v1, v1, #22
|
||||
; CHECK-GI-NEXT: ldr q2, [x8, :lo12:.LCPI23_0]
|
||||
; CHECK-GI-NEXT: and.16b v0, v0, v2
|
||||
; CHECK-GI-NEXT: orr.16b v0, v0, v1
|
||||
; CHECK-GI-NEXT: str q0, [x0]
|
||||
; CHECK-GI-NEXT: ret
|
||||
%and.i = and <4 x i32> %src1, <i32 4194300, i32 4194300, i32 4194300, i32 4194300>
|
||||
%vshl_n = lshr <4 x i32> %src2, <i32 22, i32 22, i32 22, i32 22>
|
||||
%result = or <4 x i32> %and.i, %vshl_n
|
||||
@ -356,11 +563,20 @@ define void @testRightBad4x32(<4 x i32> %src1, <4 x i32> %src2, ptr %dest) nounw
|
||||
}
|
||||
|
||||
define void @testLeftGood2x64(<2 x i64> %src1, <2 x i64> %src2, ptr %dest) nounwind {
|
||||
; CHECK-LABEL: testLeftGood2x64:
|
||||
; CHECK: // %bb.0:
|
||||
; CHECK-NEXT: sli.2d v0, v1, #48
|
||||
; CHECK-NEXT: str q0, [x0]
|
||||
; CHECK-NEXT: ret
|
||||
; CHECK-SD-LABEL: testLeftGood2x64:
|
||||
; CHECK-SD: // %bb.0:
|
||||
; CHECK-SD-NEXT: sli.2d v0, v1, #48
|
||||
; CHECK-SD-NEXT: str q0, [x0]
|
||||
; CHECK-SD-NEXT: ret
|
||||
;
|
||||
; CHECK-GI-LABEL: testLeftGood2x64:
|
||||
; CHECK-GI: // %bb.0:
|
||||
; CHECK-GI-NEXT: movi.2d v2, #0x00ffffffffffff
|
||||
; CHECK-GI-NEXT: shl.2d v1, v1, #48
|
||||
; CHECK-GI-NEXT: and.16b v0, v0, v2
|
||||
; CHECK-GI-NEXT: orr.16b v0, v0, v1
|
||||
; CHECK-GI-NEXT: str q0, [x0]
|
||||
; CHECK-GI-NEXT: ret
|
||||
%and.i = and <2 x i64> %src1, <i64 281474976710655, i64 281474976710655>
|
||||
%vshl_n = shl <2 x i64> %src2, <i64 48, i64 48>
|
||||
%result = or <2 x i64> %and.i, %vshl_n
|
||||
@ -369,16 +585,26 @@ define void @testLeftGood2x64(<2 x i64> %src1, <2 x i64> %src2, ptr %dest) nounw
|
||||
}
|
||||
|
||||
define void @testLeftBad2x64(<2 x i64> %src1, <2 x i64> %src2, ptr %dest) nounwind {
|
||||
; CHECK-LABEL: testLeftBad2x64:
|
||||
; CHECK: // %bb.0:
|
||||
; CHECK-NEXT: mov x8, #10
|
||||
; CHECK-NEXT: shl.2d v1, v1, #48
|
||||
; CHECK-NEXT: movk x8, #1, lsl #48
|
||||
; CHECK-NEXT: dup.2d v2, x8
|
||||
; CHECK-NEXT: and.16b v0, v0, v2
|
||||
; CHECK-NEXT: orr.16b v0, v0, v1
|
||||
; CHECK-NEXT: str q0, [x0]
|
||||
; CHECK-NEXT: ret
|
||||
; CHECK-SD-LABEL: testLeftBad2x64:
|
||||
; CHECK-SD: // %bb.0:
|
||||
; CHECK-SD-NEXT: mov x8, #10 // =0xa
|
||||
; CHECK-SD-NEXT: shl.2d v1, v1, #48
|
||||
; CHECK-SD-NEXT: movk x8, #1, lsl #48
|
||||
; CHECK-SD-NEXT: dup.2d v2, x8
|
||||
; CHECK-SD-NEXT: and.16b v0, v0, v2
|
||||
; CHECK-SD-NEXT: orr.16b v0, v0, v1
|
||||
; CHECK-SD-NEXT: str q0, [x0]
|
||||
; CHECK-SD-NEXT: ret
|
||||
;
|
||||
; CHECK-GI-LABEL: testLeftBad2x64:
|
||||
; CHECK-GI: // %bb.0:
|
||||
; CHECK-GI-NEXT: adrp x8, .LCPI25_0
|
||||
; CHECK-GI-NEXT: shl.2d v1, v1, #48
|
||||
; CHECK-GI-NEXT: ldr q2, [x8, :lo12:.LCPI25_0]
|
||||
; CHECK-GI-NEXT: and.16b v0, v0, v2
|
||||
; CHECK-GI-NEXT: orr.16b v0, v0, v1
|
||||
; CHECK-GI-NEXT: str q0, [x0]
|
||||
; CHECK-GI-NEXT: ret
|
||||
%and.i = and <2 x i64> %src1, <i64 281474976710666, i64 281474976710666>
|
||||
%vshl_n = shl <2 x i64> %src2, <i64 48, i64 48>
|
||||
%result = or <2 x i64> %and.i, %vshl_n
|
||||
@ -387,11 +613,20 @@ define void @testLeftBad2x64(<2 x i64> %src1, <2 x i64> %src2, ptr %dest) nounwi
|
||||
}
|
||||
|
||||
define void @testRightGood2x64(<2 x i64> %src1, <2 x i64> %src2, ptr %dest) nounwind {
|
||||
; CHECK-LABEL: testRightGood2x64:
|
||||
; CHECK: // %bb.0:
|
||||
; CHECK-NEXT: sri.2d v0, v1, #48
|
||||
; CHECK-NEXT: str q0, [x0]
|
||||
; CHECK-NEXT: ret
|
||||
; CHECK-SD-LABEL: testRightGood2x64:
|
||||
; CHECK-SD: // %bb.0:
|
||||
; CHECK-SD-NEXT: sri.2d v0, v1, #48
|
||||
; CHECK-SD-NEXT: str q0, [x0]
|
||||
; CHECK-SD-NEXT: ret
|
||||
;
|
||||
; CHECK-GI-LABEL: testRightGood2x64:
|
||||
; CHECK-GI: // %bb.0:
|
||||
; CHECK-GI-NEXT: movi.2d v2, #0xffffffffffff0000
|
||||
; CHECK-GI-NEXT: ushr.2d v1, v1, #48
|
||||
; CHECK-GI-NEXT: and.16b v0, v0, v2
|
||||
; CHECK-GI-NEXT: orr.16b v0, v0, v1
|
||||
; CHECK-GI-NEXT: str q0, [x0]
|
||||
; CHECK-GI-NEXT: ret
|
||||
%and.i = and <2 x i64> %src1, <i64 18446744073709486080, i64 18446744073709486080>
|
||||
%vshl_n = lshr <2 x i64> %src2, <i64 48, i64 48>
|
||||
%result = or <2 x i64> %and.i, %vshl_n
|
||||
@ -400,16 +635,26 @@ define void @testRightGood2x64(<2 x i64> %src1, <2 x i64> %src2, ptr %dest) noun
|
||||
}
|
||||
|
||||
define void @testRightBad2x64(<2 x i64> %src1, <2 x i64> %src2, ptr %dest) nounwind {
|
||||
; CHECK-LABEL: testRightBad2x64:
|
||||
; CHECK: // %bb.0:
|
||||
; CHECK-NEXT: mov x8, #10
|
||||
; CHECK-NEXT: ushr.2d v1, v1, #48
|
||||
; CHECK-NEXT: movk x8, #1, lsl #48
|
||||
; CHECK-NEXT: dup.2d v2, x8
|
||||
; CHECK-NEXT: and.16b v0, v0, v2
|
||||
; CHECK-NEXT: orr.16b v0, v0, v1
|
||||
; CHECK-NEXT: str q0, [x0]
|
||||
; CHECK-NEXT: ret
|
||||
; CHECK-SD-LABEL: testRightBad2x64:
|
||||
; CHECK-SD: // %bb.0:
|
||||
; CHECK-SD-NEXT: mov x8, #10 // =0xa
|
||||
; CHECK-SD-NEXT: ushr.2d v1, v1, #48
|
||||
; CHECK-SD-NEXT: movk x8, #1, lsl #48
|
||||
; CHECK-SD-NEXT: dup.2d v2, x8
|
||||
; CHECK-SD-NEXT: and.16b v0, v0, v2
|
||||
; CHECK-SD-NEXT: orr.16b v0, v0, v1
|
||||
; CHECK-SD-NEXT: str q0, [x0]
|
||||
; CHECK-SD-NEXT: ret
|
||||
;
|
||||
; CHECK-GI-LABEL: testRightBad2x64:
|
||||
; CHECK-GI: // %bb.0:
|
||||
; CHECK-GI-NEXT: adrp x8, .LCPI27_0
|
||||
; CHECK-GI-NEXT: ushr.2d v1, v1, #48
|
||||
; CHECK-GI-NEXT: ldr q2, [x8, :lo12:.LCPI27_0]
|
||||
; CHECK-GI-NEXT: and.16b v0, v0, v2
|
||||
; CHECK-GI-NEXT: orr.16b v0, v0, v1
|
||||
; CHECK-GI-NEXT: str q0, [x0]
|
||||
; CHECK-GI-NEXT: ret
|
||||
%and.i = and <2 x i64> %src1, <i64 281474976710666, i64 281474976710666>
|
||||
%vshl_n = lshr <2 x i64> %src2, <i64 48, i64 48>
|
||||
%result = or <2 x i64> %and.i, %vshl_n
|
||||
@ -418,11 +663,19 @@ define void @testRightBad2x64(<2 x i64> %src1, <2 x i64> %src2, ptr %dest) nounw
|
||||
}
|
||||
|
||||
define void @testLeftShouldNotCreateSLI1x128(<1 x i128> %src1, <1 x i128> %src2, ptr %dest) nounwind {
|
||||
; CHECK-LABEL: testLeftShouldNotCreateSLI1x128:
|
||||
; CHECK: // %bb.0:
|
||||
; CHECK-NEXT: bfi x1, x2, #6, #58
|
||||
; CHECK-NEXT: stp x0, x1, [x4]
|
||||
; CHECK-NEXT: ret
|
||||
; CHECK-SD-LABEL: testLeftShouldNotCreateSLI1x128:
|
||||
; CHECK-SD: // %bb.0:
|
||||
; CHECK-SD-NEXT: bfi x1, x2, #6, #58
|
||||
; CHECK-SD-NEXT: stp x0, x1, [x4]
|
||||
; CHECK-SD-NEXT: ret
|
||||
;
|
||||
; CHECK-GI-LABEL: testLeftShouldNotCreateSLI1x128:
|
||||
; CHECK-GI: // %bb.0:
|
||||
; CHECK-GI-NEXT: mov.d v0[0], x0
|
||||
; CHECK-GI-NEXT: bfi x1, x2, #6, #58
|
||||
; CHECK-GI-NEXT: mov.d v0[1], x1
|
||||
; CHECK-GI-NEXT: str q0, [x4]
|
||||
; CHECK-GI-NEXT: ret
|
||||
%and.i = and <1 x i128> %src1, <i128 1180591620717411303423>
|
||||
%vshl_n = shl <1 x i128> %src2, <i128 70>
|
||||
%result = or <1 x i128> %and.i, %vshl_n
|
||||
|
@ -1,154 +1,254 @@
|
||||
; RUN: llc < %s -mtriple=arm64-eabi -aarch64-neon-syntax=apple | FileCheck %s
|
||||
; RUN: llc < %s -global-isel -global-isel-abort=2 -pass-remarks-missed=gisel* -mtriple=arm64-eabi -aarch64-neon-syntax=apple | FileCheck %s
|
||||
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
|
||||
; RUN: llc < %s -mtriple=arm64-eabi -aarch64-neon-syntax=apple | FileCheck %s --check-prefixes=CHECK,CHECK-SD
|
||||
; RUN: llc < %s -mtriple=arm64-eabi -aarch64-neon-syntax=apple -global-isel | FileCheck %s --check-prefixes=CHECK,CHECK-GI
|
||||
|
||||
; FALLBACK-NOT: remark{{.*}}test_vclz_u8
|
||||
define <8 x i8> @test_vclz_u8(<8 x i8> %a) nounwind readnone ssp {
|
||||
; CHECK-LABEL: test_vclz_u8:
|
||||
; CHECK: clz.8b v0, v0
|
||||
; CHECK-NEXT: ret
|
||||
; CHECK-LABEL: test_vclz_u8:
|
||||
; CHECK: // %bb.0:
|
||||
; CHECK-NEXT: clz.8b v0, v0
|
||||
; CHECK-NEXT: ret
|
||||
%vclz.i = tail call <8 x i8> @llvm.ctlz.v8i8(<8 x i8> %a, i1 false) nounwind
|
||||
ret <8 x i8> %vclz.i
|
||||
}
|
||||
|
||||
; FALLBACK-NOT: remark{{.*}}test_vclz_s8
|
||||
define <8 x i8> @test_vclz_s8(<8 x i8> %a) nounwind readnone ssp {
|
||||
; CHECK-LABEL: test_vclz_s8:
|
||||
; CHECK: clz.8b v0, v0
|
||||
; CHECK-NEXT: ret
|
||||
; CHECK-LABEL: test_vclz_s8:
|
||||
; CHECK: // %bb.0:
|
||||
; CHECK-NEXT: clz.8b v0, v0
|
||||
; CHECK-NEXT: ret
|
||||
%vclz.i = tail call <8 x i8> @llvm.ctlz.v8i8(<8 x i8> %a, i1 false) nounwind
|
||||
ret <8 x i8> %vclz.i
|
||||
}
|
||||
|
||||
; FALLBACK-NOT: remark{{.*}}test_vclz_u16
|
||||
define <4 x i16> @test_vclz_u16(<4 x i16> %a) nounwind readnone ssp {
|
||||
; CHECK-LABEL: test_vclz_u16:
|
||||
; CHECK: clz.4h v0, v0
|
||||
; CHECK-NEXT: ret
|
||||
; CHECK-LABEL: test_vclz_u16:
|
||||
; CHECK: // %bb.0:
|
||||
; CHECK-NEXT: clz.4h v0, v0
|
||||
; CHECK-NEXT: ret
|
||||
%vclz1.i = tail call <4 x i16> @llvm.ctlz.v4i16(<4 x i16> %a, i1 false) nounwind
|
||||
ret <4 x i16> %vclz1.i
|
||||
}
|
||||
|
||||
; FALLBACK-NOT: remark{{.*}}test_vclz_s16
|
||||
define <4 x i16> @test_vclz_s16(<4 x i16> %a) nounwind readnone ssp {
|
||||
; CHECK-LABEL: test_vclz_s16:
|
||||
; CHECK: clz.4h v0, v0
|
||||
; CHECK-NEXT: ret
|
||||
; CHECK-LABEL: test_vclz_s16:
|
||||
; CHECK: // %bb.0:
|
||||
; CHECK-NEXT: clz.4h v0, v0
|
||||
; CHECK-NEXT: ret
|
||||
%vclz1.i = tail call <4 x i16> @llvm.ctlz.v4i16(<4 x i16> %a, i1 false) nounwind
|
||||
ret <4 x i16> %vclz1.i
|
||||
}
|
||||
|
||||
; FALLBACK-NOT: remark{{.*}}test_vclz_u32
|
||||
define <2 x i32> @test_vclz_u32(<2 x i32> %a) nounwind readnone ssp {
|
||||
; CHECK-LABEL: test_vclz_u32:
|
||||
; CHECK: clz.2s v0, v0
|
||||
; CHECK-NEXT: ret
|
||||
; CHECK-LABEL: test_vclz_u32:
|
||||
; CHECK: // %bb.0:
|
||||
; CHECK-NEXT: clz.2s v0, v0
|
||||
; CHECK-NEXT: ret
|
||||
%vclz1.i = tail call <2 x i32> @llvm.ctlz.v2i32(<2 x i32> %a, i1 false) nounwind
|
||||
ret <2 x i32> %vclz1.i
|
||||
}
|
||||
|
||||
; FALLBACK-NOT: remark{{.*}}test_vclz_s32
|
||||
define <2 x i32> @test_vclz_s32(<2 x i32> %a) nounwind readnone ssp {
|
||||
; CHECK-LABEL: test_vclz_s32:
|
||||
; CHECK: clz.2s v0, v0
|
||||
; CHECK-NEXT: ret
|
||||
; CHECK-LABEL: test_vclz_s32:
|
||||
; CHECK: // %bb.0:
|
||||
; CHECK-NEXT: clz.2s v0, v0
|
||||
; CHECK-NEXT: ret
|
||||
%vclz1.i = tail call <2 x i32> @llvm.ctlz.v2i32(<2 x i32> %a, i1 false) nounwind
|
||||
ret <2 x i32> %vclz1.i
|
||||
}
|
||||
|
||||
; FALLBACK-NOT: remark{{.*}}test_vclz_u64
|
||||
define <1 x i64> @test_vclz_u64(<1 x i64> %a) nounwind readnone ssp {
|
||||
; CHECK-LABEL: test_vclz_u64:
|
||||
; CHECK-SD-LABEL: test_vclz_u64:
|
||||
; CHECK-SD: // %bb.0:
|
||||
; CHECK-SD-NEXT: ushr d1, d0, #1
|
||||
; CHECK-SD-NEXT: orr.8b v0, v0, v1
|
||||
; CHECK-SD-NEXT: ushr d1, d0, #2
|
||||
; CHECK-SD-NEXT: orr.8b v0, v0, v1
|
||||
; CHECK-SD-NEXT: ushr d1, d0, #4
|
||||
; CHECK-SD-NEXT: orr.8b v0, v0, v1
|
||||
; CHECK-SD-NEXT: ushr d1, d0, #8
|
||||
; CHECK-SD-NEXT: orr.8b v0, v0, v1
|
||||
; CHECK-SD-NEXT: ushr d1, d0, #16
|
||||
; CHECK-SD-NEXT: orr.8b v0, v0, v1
|
||||
; CHECK-SD-NEXT: ushr d1, d0, #32
|
||||
; CHECK-SD-NEXT: orr.8b v0, v0, v1
|
||||
; CHECK-SD-NEXT: mvn.8b v0, v0
|
||||
; CHECK-SD-NEXT: cnt.8b v0, v0
|
||||
; CHECK-SD-NEXT: uaddlp.4h v0, v0
|
||||
; CHECK-SD-NEXT: uaddlp.2s v0, v0
|
||||
; CHECK-SD-NEXT: uaddlp.1d v0, v0
|
||||
; CHECK-SD-NEXT: ret
|
||||
;
|
||||
; CHECK-GI-LABEL: test_vclz_u64:
|
||||
; CHECK-GI: // %bb.0:
|
||||
; CHECK-GI-NEXT: fmov x8, d0
|
||||
; CHECK-GI-NEXT: clz x8, x8
|
||||
; CHECK-GI-NEXT: fmov d0, x8
|
||||
; CHECK-GI-NEXT: ret
|
||||
%vclz1.i = tail call <1 x i64> @llvm.ctlz.v1i64(<1 x i64> %a, i1 false) nounwind
|
||||
ret <1 x i64> %vclz1.i
|
||||
}
|
||||
|
||||
; FALLBACK-NOT: remark{{.*}}test_vclz_s64
|
||||
define <1 x i64> @test_vclz_s64(<1 x i64> %a) nounwind readnone ssp {
|
||||
; CHECK-LABEL: test_vclz_s64:
|
||||
; CHECK-SD-LABEL: test_vclz_s64:
|
||||
; CHECK-SD: // %bb.0:
|
||||
; CHECK-SD-NEXT: ushr d1, d0, #1
|
||||
; CHECK-SD-NEXT: orr.8b v0, v0, v1
|
||||
; CHECK-SD-NEXT: ushr d1, d0, #2
|
||||
; CHECK-SD-NEXT: orr.8b v0, v0, v1
|
||||
; CHECK-SD-NEXT: ushr d1, d0, #4
|
||||
; CHECK-SD-NEXT: orr.8b v0, v0, v1
|
||||
; CHECK-SD-NEXT: ushr d1, d0, #8
|
||||
; CHECK-SD-NEXT: orr.8b v0, v0, v1
|
||||
; CHECK-SD-NEXT: ushr d1, d0, #16
|
||||
; CHECK-SD-NEXT: orr.8b v0, v0, v1
|
||||
; CHECK-SD-NEXT: ushr d1, d0, #32
|
||||
; CHECK-SD-NEXT: orr.8b v0, v0, v1
|
||||
; CHECK-SD-NEXT: mvn.8b v0, v0
|
||||
; CHECK-SD-NEXT: cnt.8b v0, v0
|
||||
; CHECK-SD-NEXT: uaddlp.4h v0, v0
|
||||
; CHECK-SD-NEXT: uaddlp.2s v0, v0
|
||||
; CHECK-SD-NEXT: uaddlp.1d v0, v0
|
||||
; CHECK-SD-NEXT: ret
|
||||
;
|
||||
; CHECK-GI-LABEL: test_vclz_s64:
|
||||
; CHECK-GI: // %bb.0:
|
||||
; CHECK-GI-NEXT: fmov x8, d0
|
||||
; CHECK-GI-NEXT: clz x8, x8
|
||||
; CHECK-GI-NEXT: fmov d0, x8
|
||||
; CHECK-GI-NEXT: ret
|
||||
%vclz1.i = tail call <1 x i64> @llvm.ctlz.v1i64(<1 x i64> %a, i1 false) nounwind
|
||||
ret <1 x i64> %vclz1.i
|
||||
}
|
||||
|
||||
; FALLBACK-NOT: remark{{.*}}test_vclzq_u8
|
||||
define <16 x i8> @test_vclzq_u8(<16 x i8> %a) nounwind readnone ssp {
|
||||
; CHECK-LABEL: test_vclzq_u8:
|
||||
; CHECK: clz.16b v0, v0
|
||||
; CHECK-NEXT: ret
|
||||
; CHECK-LABEL: test_vclzq_u8:
|
||||
; CHECK: // %bb.0:
|
||||
; CHECK-NEXT: clz.16b v0, v0
|
||||
; CHECK-NEXT: ret
|
||||
%vclz.i = tail call <16 x i8> @llvm.ctlz.v16i8(<16 x i8> %a, i1 false) nounwind
|
||||
ret <16 x i8> %vclz.i
|
||||
}
|
||||
|
||||
; FALLBACK-NOT: remark{{.*}}test_vclzq_s8
|
||||
define <16 x i8> @test_vclzq_s8(<16 x i8> %a) nounwind readnone ssp {
|
||||
; CHECK-LABEL: test_vclzq_s8:
|
||||
; CHECK: clz.16b v0, v0
|
||||
; CHECK-NEXT: ret
|
||||
; CHECK-LABEL: test_vclzq_s8:
|
||||
; CHECK: // %bb.0:
|
||||
; CHECK-NEXT: clz.16b v0, v0
|
||||
; CHECK-NEXT: ret
|
||||
%vclz.i = tail call <16 x i8> @llvm.ctlz.v16i8(<16 x i8> %a, i1 false) nounwind
|
||||
ret <16 x i8> %vclz.i
|
||||
}
|
||||
|
||||
; FALLBACK-NOT: remark{{.*}}test_vclzq_u16
|
||||
define <8 x i16> @test_vclzq_u16(<8 x i16> %a) nounwind readnone ssp {
|
||||
; CHECK-LABEL: test_vclzq_u16:
|
||||
; CHECK: clz.8h v0, v0
|
||||
; CHECK-NEXT: ret
|
||||
; CHECK-LABEL: test_vclzq_u16:
|
||||
; CHECK: // %bb.0:
|
||||
; CHECK-NEXT: clz.8h v0, v0
|
||||
; CHECK-NEXT: ret
|
||||
%vclz1.i = tail call <8 x i16> @llvm.ctlz.v8i16(<8 x i16> %a, i1 false) nounwind
|
||||
ret <8 x i16> %vclz1.i
|
||||
}
|
||||
|
||||
; FALLBACK-NOT: remark{{.*}}test_vclzq_s16
|
||||
define <8 x i16> @test_vclzq_s16(<8 x i16> %a) nounwind readnone ssp {
|
||||
; CHECK-LABEL: test_vclzq_s16:
|
||||
; CHECK: clz.8h v0, v0
|
||||
; CHECK-NEXT: ret
|
||||
; CHECK-LABEL: test_vclzq_s16:
|
||||
; CHECK: // %bb.0:
|
||||
; CHECK-NEXT: clz.8h v0, v0
|
||||
; CHECK-NEXT: ret
|
||||
%vclz1.i = tail call <8 x i16> @llvm.ctlz.v8i16(<8 x i16> %a, i1 false) nounwind
|
||||
ret <8 x i16> %vclz1.i
|
||||
}
|
||||
|
||||
; FALLBACK-NOT: remark{{.*}}test_vclzq_u32
|
||||
define <4 x i32> @test_vclzq_u32(<4 x i32> %a) nounwind readnone ssp {
|
||||
; CHECK-LABEL: test_vclzq_u32:
|
||||
; CHECK: clz.4s v0, v0
|
||||
; CHECK-NEXT: ret
|
||||
; CHECK-LABEL: test_vclzq_u32:
|
||||
; CHECK: // %bb.0:
|
||||
; CHECK-NEXT: clz.4s v0, v0
|
||||
; CHECK-NEXT: ret
|
||||
%vclz1.i = tail call <4 x i32> @llvm.ctlz.v4i32(<4 x i32> %a, i1 false) nounwind
|
||||
ret <4 x i32> %vclz1.i
|
||||
}
|
||||
|
||||
; FALLBACK-NOT: remark{{.*}}test_vclzq_s32
|
||||
define <4 x i32> @test_vclzq_s32(<4 x i32> %a) nounwind readnone ssp {
|
||||
; CHECK-LABEL: test_vclzq_s32:
|
||||
; CHECK: clz.4s v0, v0
|
||||
; CHECK-NEXT: ret
|
||||
; CHECK-LABEL: test_vclzq_s32:
|
||||
; CHECK: // %bb.0:
|
||||
; CHECK-NEXT: clz.4s v0, v0
|
||||
; CHECK-NEXT: ret
|
||||
%vclz1.i = tail call <4 x i32> @llvm.ctlz.v4i32(<4 x i32> %a, i1 false) nounwind
|
||||
ret <4 x i32> %vclz1.i
|
||||
}
|
||||
|
||||
; FALLBACK-NOT: remark{{.*}}test_vclzq_u64
|
||||
define <2 x i64> @test_vclzq_u64(<2 x i64> %a) nounwind readnone ssp {
|
||||
; CHECK-LABEL: test_vclzq_u64:
|
||||
; CHECK-SD-LABEL: test_vclzq_u64:
|
||||
; CHECK-SD: // %bb.0:
|
||||
; CHECK-SD-NEXT: ushr.2d v1, v0, #1
|
||||
; CHECK-SD-NEXT: orr.16b v0, v0, v1
|
||||
; CHECK-SD-NEXT: ushr.2d v1, v0, #2
|
||||
; CHECK-SD-NEXT: orr.16b v0, v0, v1
|
||||
; CHECK-SD-NEXT: ushr.2d v1, v0, #4
|
||||
; CHECK-SD-NEXT: orr.16b v0, v0, v1
|
||||
; CHECK-SD-NEXT: ushr.2d v1, v0, #8
|
||||
; CHECK-SD-NEXT: orr.16b v0, v0, v1
|
||||
; CHECK-SD-NEXT: ushr.2d v1, v0, #16
|
||||
; CHECK-SD-NEXT: orr.16b v0, v0, v1
|
||||
; CHECK-SD-NEXT: ushr.2d v1, v0, #32
|
||||
; CHECK-SD-NEXT: orr.16b v0, v0, v1
|
||||
; CHECK-SD-NEXT: mvn.16b v0, v0
|
||||
; CHECK-SD-NEXT: cnt.16b v0, v0
|
||||
; CHECK-SD-NEXT: uaddlp.8h v0, v0
|
||||
; CHECK-SD-NEXT: uaddlp.4s v0, v0
|
||||
; CHECK-SD-NEXT: uaddlp.2d v0, v0
|
||||
; CHECK-SD-NEXT: ret
|
||||
;
|
||||
; CHECK-GI-LABEL: test_vclzq_u64:
|
||||
; CHECK-GI: // %bb.0:
|
||||
; CHECK-GI-NEXT: fmov x8, d0
|
||||
; CHECK-GI-NEXT: mov.d x9, v0[1]
|
||||
; CHECK-GI-NEXT: clz x8, x8
|
||||
; CHECK-GI-NEXT: mov.d v0[0], x8
|
||||
; CHECK-GI-NEXT: clz x8, x9
|
||||
; CHECK-GI-NEXT: mov.d v0[1], x8
|
||||
; CHECK-GI-NEXT: ret
|
||||
%vclz1.i = tail call <2 x i64> @llvm.ctlz.v2i64(<2 x i64> %a, i1 false) nounwind
|
||||
ret <2 x i64> %vclz1.i
|
||||
}
|
||||
|
||||
; FALLBACK-NOT: remark{{.*}}test_vclzq_s64
|
||||
define <2 x i64> @test_vclzq_s64(<2 x i64> %a) nounwind readnone ssp {
|
||||
; CHECK-LABEL: test_vclzq_s64:
|
||||
; CHECK-SD-LABEL: test_vclzq_s64:
|
||||
; CHECK-SD: // %bb.0:
|
||||
; CHECK-SD-NEXT: ushr.2d v1, v0, #1
|
||||
; CHECK-SD-NEXT: orr.16b v0, v0, v1
|
||||
; CHECK-SD-NEXT: ushr.2d v1, v0, #2
|
||||
; CHECK-SD-NEXT: orr.16b v0, v0, v1
|
||||
; CHECK-SD-NEXT: ushr.2d v1, v0, #4
|
||||
; CHECK-SD-NEXT: orr.16b v0, v0, v1
|
||||
; CHECK-SD-NEXT: ushr.2d v1, v0, #8
|
||||
; CHECK-SD-NEXT: orr.16b v0, v0, v1
|
||||
; CHECK-SD-NEXT: ushr.2d v1, v0, #16
|
||||
; CHECK-SD-NEXT: orr.16b v0, v0, v1
|
||||
; CHECK-SD-NEXT: ushr.2d v1, v0, #32
|
||||
; CHECK-SD-NEXT: orr.16b v0, v0, v1
|
||||
; CHECK-SD-NEXT: mvn.16b v0, v0
|
||||
; CHECK-SD-NEXT: cnt.16b v0, v0
|
||||
; CHECK-SD-NEXT: uaddlp.8h v0, v0
|
||||
; CHECK-SD-NEXT: uaddlp.4s v0, v0
|
||||
; CHECK-SD-NEXT: uaddlp.2d v0, v0
|
||||
; CHECK-SD-NEXT: ret
|
||||
;
|
||||
; CHECK-GI-LABEL: test_vclzq_s64:
|
||||
; CHECK-GI: // %bb.0:
|
||||
; CHECK-GI-NEXT: fmov x8, d0
|
||||
; CHECK-GI-NEXT: mov.d x9, v0[1]
|
||||
; CHECK-GI-NEXT: clz x8, x8
|
||||
; CHECK-GI-NEXT: mov.d v0[0], x8
|
||||
; CHECK-GI-NEXT: clz x8, x9
|
||||
; CHECK-GI-NEXT: mov.d v0[1], x8
|
||||
; CHECK-GI-NEXT: ret
|
||||
%vclz1.i = tail call <2 x i64> @llvm.ctlz.v2i64(<2 x i64> %a, i1 false) nounwind
|
||||
ret <2 x i64> %vclz1.i
|
||||
}
|
||||
|
||||
declare <2 x i64> @llvm.ctlz.v2i64(<2 x i64>, i1) nounwind readnone
|
||||
|
||||
declare <4 x i32> @llvm.ctlz.v4i32(<4 x i32>, i1) nounwind readnone
|
||||
|
||||
declare <8 x i16> @llvm.ctlz.v8i16(<8 x i16>, i1) nounwind readnone
|
||||
|
||||
declare <16 x i8> @llvm.ctlz.v16i8(<16 x i8>, i1) nounwind readnone
|
||||
|
||||
declare <1 x i64> @llvm.ctlz.v1i64(<1 x i64>, i1) nounwind readnone
|
||||
|
||||
declare <2 x i32> @llvm.ctlz.v2i32(<2 x i32>, i1) nounwind readnone
|
||||
|
||||
declare <4 x i16> @llvm.ctlz.v4i16(<4 x i16>, i1) nounwind readnone
|
||||
|
||||
declare <8 x i8> @llvm.ctlz.v8i8(<8 x i8>, i1) nounwind readnone
|
||||
|
@ -1,6 +1,6 @@
|
||||
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
|
||||
; RUN: llc -mtriple=aarch64 %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-SD
|
||||
; RUN: llc -mtriple=aarch64 -global-isel -global-isel-abort=2 %s -o - 2>&1 | FileCheck %s --check-prefixes=CHECK,CHECK-GI
|
||||
; RUN: llc -mtriple=aarch64 -global-isel %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-GI
|
||||
|
||||
define <4 x i8> @concat1(<2 x i8> %A, <2 x i8> %B) {
|
||||
; CHECK-SD-LABEL: concat1:
|
||||
|
@ -1,6 +1,6 @@
|
||||
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
|
||||
; RUN: llc -mtriple=aarch64-linux-gnu < %s | FileCheck %s --check-prefixes=CHECK,CHECK-SD
|
||||
; RUN: llc -mtriple=aarch64 -global-isel -global-isel-abort=2 -verify-machineinstrs %s -o - 2>&1 | FileCheck %s --check-prefixes=CHECK,CHECK-GI
|
||||
; RUN: llc -mtriple=aarch64 -global-isel -verify-machineinstrs %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-GI
|
||||
|
||||
define <2 x i32> @and_extract_zext_idx0(<4 x i16> %vec) nounwind {
|
||||
; CHECK-SD-LABEL: and_extract_zext_idx0:
|
||||
|
@ -2,6 +2,13 @@
|
||||
; RUN: llc -mtriple=aarch64 -mattr=+sve -verify-machineinstrs %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-SD
|
||||
; RUN: llc -mtriple=aarch64 -mattr=+sve -aarch64-enable-gisel-sve=1 -global-isel -global-isel-abort=2 -verify-machineinstrs %s -o - 2>&1 | FileCheck %s --check-prefixes=CHECK,CHECK-GI
|
||||
|
||||
; CHECK-GI: warning: Instruction selection used fallback path for insert_vscale_8_i16_zero
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for insert_vscale_8_i16
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for insert_vscale_16_i8_zero
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for insert_vscale_16_i8
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for extract_vscale_16_i8
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for extract_vscale_16_i8_zero
|
||||
|
||||
define <vscale x 2 x i64> @insert_vscale_2_i64_zero(<vscale x 2 x i64> %vec, i64 %elt) {
|
||||
; CHECK-SD-LABEL: insert_vscale_2_i64_zero:
|
||||
; CHECK-SD: // %bb.0: // %entry
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -1,6 +1,6 @@
|
||||
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
|
||||
; RUN: llc -mtriple=aarch64-none-linux-gnu %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-SD
|
||||
; RUN: llc -mtriple=aarch64-none-linux-gnu -global-isel -global-isel-abort=2 %s -o - 2>&1 | FileCheck %s --check-prefixes=CHECK,CHECK-GI
|
||||
; RUN: llc -mtriple=aarch64-none-linux-gnu -global-isel %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-GI
|
||||
|
||||
define {<2 x half>, <2 x half>} @vector_deinterleave_v2f16_v4f16(<4 x half> %vec) {
|
||||
; CHECK-SD-LABEL: vector_deinterleave_v2f16_v4f16:
|
||||
|
@ -1,11 +1,84 @@
|
||||
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
|
||||
; RUN: llc -mtriple=aarch64 %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-NOFP16
|
||||
; RUN: llc -mtriple=aarch64 -mattr=+fullfp16 %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-FP16
|
||||
; RUN: llc -mtriple=aarch64 -global-isel=true -global-isel-abort=2 %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-NOFP16
|
||||
; RUN: llc -mtriple=aarch64 -global-isel=true -global-isel-abort=2 -mattr=+fullfp16 %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-FP16
|
||||
; RUN: llc -mtriple=aarch64 -global-isel=true -global-isel-abort=2 %s -o - 2>&1 | FileCheck %s --check-prefixes=CHECK,CHECK-GI
|
||||
; RUN: llc -mtriple=aarch64 -global-isel=true -global-isel-abort=2 -mattr=+fullfp16 %s -o - 2>&1 | FileCheck %s --check-prefixes=CHECK,CHECK-GI
|
||||
|
||||
; Check that constrained fp intrinsics are correctly lowered.
|
||||
|
||||
; CHECK-GI: warning: Instruction selection used fallback path for add_f16
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for sub_f16
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for mul_f16
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for div_f16
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for frem_f16
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for fma_f16
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for fptosi_i32_f16
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for fptoui_i32_f16
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for fptosi_i64_f16
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for fptoui_i64_f16
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for sitofp_f16_i32
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for uitofp_f16_i32
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for sitofp_f16_i64
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for uitofp_f16_i64
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for sitofp_f16_i128
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for uitofp_f16_i128
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for sqrt_f16
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for powi_f16
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for sin_f16
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for cos_f16
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for tan_f16
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for asin_f16
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for acos_f16
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for atan_f16
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for atan2_f16
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for sinh_f16
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for cosh_f16
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for tanh_f16
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for pow_f16
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for log_f16
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for log10_f16
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for log2_f16
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for exp_f16
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for exp2_f16
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for rint_f16
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for nearbyint_f16
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for lrint_f16
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for llrint_f16
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for maxnum_f16
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for minnum_f16
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for ceil_f16
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for floor_f16
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for lround_f16
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for llround_f16
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for round_f16
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for roundeven_f16
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for trunc_f16
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for fcmp_olt_f16
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for fcmp_ole_f16
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for fcmp_ogt_f16
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for fcmp_oge_f16
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for fcmp_oeq_f16
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for fcmp_one_f16
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for fcmp_ult_f16
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for fcmp_ule_f16
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for fcmp_ugt_f16
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for fcmp_uge_f16
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for fcmp_ueq_f16
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for fcmp_une_f16
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for fcmps_olt_f16
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for fcmps_ole_f16
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for fcmps_ogt_f16
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for fcmps_oge_f16
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for fcmps_oeq_f16
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for fcmps_one_f16
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for fcmps_ult_f16
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for fcmps_ule_f16
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for fcmps_ugt_f16
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for fcmps_uge_f16
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for fcmps_ueq_f16
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for fcmps_une_f16
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for fptrunc_f16_f32
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for fpext_f32_f16
|
||||
|
||||
; Half-precision intrinsics
|
||||
|
||||
|
@ -1,9 +1,86 @@
|
||||
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
|
||||
; RUN: llc -mtriple=aarch64 %s -disable-strictnode-mutation -o - | FileCheck %s
|
||||
; RUN: llc -mtriple=aarch64 -global-isel=true -global-isel-abort=2 -disable-strictnode-mutation %s -o - | FileCheck %s
|
||||
; RUN: llc -mtriple=aarch64 %s -disable-strictnode-mutation -o - | FileCheck %s --check-prefixes=CHECK,CHECK-SD
|
||||
; RUN: llc -mtriple=aarch64 -global-isel=true -global-isel-abort=2 -disable-strictnode-mutation %s -o - 2>&1 | FileCheck %s --check-prefixes=CHECK,CHECK-GI
|
||||
|
||||
; Check that constrained fp vector intrinsics are correctly lowered.
|
||||
|
||||
; CHECK-GI: warning: Instruction selection used fallback path for add_v4f32
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for sub_v4f32
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for mul_v4f32
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for div_v4f32
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for fma_v4f32
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for fptosi_v4i32_v4f32
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for fptoui_v4i32_v4f32
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for fptosi_v4i64_v4f32
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for fptoui_v4i64_v4f32
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for sitofp_v4f32_v4i32
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for uitofp_v4f32_v4i32
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for sitofp_v4f32_v4i64
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for uitofp_v4f32_v4i64
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for sqrt_v4f32
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for rint_v4f32
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for nearbyint_v4f32
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for maxnum_v4f32
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for minnum_v4f32
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for ceil_v4f32
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for floor_v4f32
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for round_v4f32
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for roundeven_v4f32
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for trunc_v4f32
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for fcmp_v4f32
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for fcmps_v4f32
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for add_v2f64
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for sub_v2f64
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for mul_v2f64
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for div_v2f64
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for fma_v2f64
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for fptosi_v2i32_v2f64
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for fptoui_v2i32_v2f64
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for fptosi_v2i64_v2f64
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for fptoui_v2i64_v2f64
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for sitofp_v2f64_v2i32
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for uitofp_v2f64_v2i32
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for sitofp_v2f64_v2i64
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for uitofp_v2f64_v2i64
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for sqrt_v2f64
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for rint_v2f64
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for nearbyint_v2f64
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for maxnum_v2f64
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for minnum_v2f64
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for ceil_v2f64
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for floor_v2f64
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for round_v2f64
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for roundeven_v2f64
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for trunc_v2f64
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for fcmp_v2f64
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for fcmps_v2f64
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for add_v1f64
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for sub_v1f64
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for mul_v1f64
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for div_v1f64
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for fma_v1f64
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for fptosi_v1i32_v1f64
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for fptoui_v1i32_v1f64
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for fptosi_v1i64_v1f64
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for fptoui_v1i64_v1f64
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for sitofp_v1f64_v1i32
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for uitofp_v1f64_v1i32
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for sitofp_v1f64_v1i64
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for uitofp_v1f64_v1i64
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for sqrt_v1f64
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for rint_v1f64
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for nearbyint_v1f64
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for maxnum_v1f64
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for minnum_v1f64
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for ceil_v1f64
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for floor_v1f64
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for round_v1f64
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for roundeven_v1f64
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for trunc_v1f64
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for fcmp_v1f61
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for fcmps_v1f61
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for fptrunc_v2f32_v2f64
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for fpext_v2f64_v2f32
|
||||
|
||||
; Single-precision intrinsics
|
||||
|
||||
@ -882,3 +959,7 @@ declare <1 x i1> @llvm.experimental.constrained.fcmps.v1f64(<1 x double>, <1 x d
|
||||
|
||||
declare <2 x float> @llvm.experimental.constrained.fptrunc.v2f32.v2f64(<2 x double>, metadata, metadata)
|
||||
declare <2 x double> @llvm.experimental.constrained.fpext.v2f64.v2f32(<2 x float>, metadata)
|
||||
|
||||
;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
|
||||
; CHECK-GI: {{.*}}
|
||||
; CHECK-SD: {{.*}}
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -1,8 +1,8 @@
|
||||
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
|
||||
; RUN: llc < %s -mtriple=aarch64 | FileCheck %s --check-prefixes=CHECK,CHECK-SD,CHECK-SD-CVT
|
||||
; RUN: llc < %s -mtriple=aarch64 -mattr=+fullfp16 | FileCheck %s --check-prefixes=CHECK,CHECK-SD,CHECK-SD-FP16
|
||||
; RUN: llc < %s -mtriple=aarch64 -global-isel -global-isel-abort=2 2>&1 | FileCheck %s --check-prefixes=CHECK,CHECK-GI,CHECK-GI-CVT
|
||||
; RUN: llc < %s -mtriple=aarch64 -mattr=+fullfp16 -global-isel -global-isel-abort=2 2>&1 | FileCheck %s --check-prefixes=CHECK,CHECK-GI,CHECK-GI-FP16
|
||||
; RUN: llc < %s -mtriple=aarch64 -global-isel | FileCheck %s --check-prefixes=CHECK,CHECK-GI,CHECK-GI-CVT
|
||||
; RUN: llc < %s -mtriple=aarch64 -mattr=+fullfp16 -global-isel | FileCheck %s --check-prefixes=CHECK,CHECK-GI,CHECK-GI-FP16
|
||||
|
||||
;
|
||||
; 32-bit float to signed integer
|
||||
|
@ -1,8 +1,8 @@
|
||||
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
|
||||
; RUN: llc < %s -mtriple=aarch64 | FileCheck %s --check-prefixes=CHECK,CHECK-SD,CHECK-SD-CVT
|
||||
; RUN: llc < %s -mtriple=aarch64 -mattr=+fullfp16 | FileCheck %s --check-prefixes=CHECK,CHECK-SD,CHECK-SD-FP16
|
||||
; RUN: llc < %s -mtriple=aarch64 -global-isel -global-isel-abort=2 2>&1 | FileCheck %s --check-prefixes=CHECK,CHECK-GI,CHECK-GI-CVT
|
||||
; RUN: llc < %s -mtriple=aarch64 -mattr=+fullfp16 -global-isel -global-isel-abort=2 2>&1 | FileCheck %s --check-prefixes=CHECK,CHECK-GI,CHECK-GI-FP16
|
||||
; RUN: llc < %s -mtriple=aarch64 -global-isel | FileCheck %s --check-prefixes=CHECK,CHECK-GI,CHECK-GI-CVT
|
||||
; RUN: llc < %s -mtriple=aarch64 -mattr=+fullfp16 -global-isel | FileCheck %s --check-prefixes=CHECK,CHECK-GI,CHECK-GI-FP16
|
||||
|
||||
;
|
||||
; 32-bit float to unsigned integer
|
||||
|
@ -1,6 +1,6 @@
|
||||
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
|
||||
; RUN: llc < %s -mtriple=aarch64-- | FileCheck %s --check-prefixes=CHECK,CHECK-SD
|
||||
; RUN: llc < %s -mtriple=aarch64-- -global-isel -global-isel-abort=2 | FileCheck %s --check-prefixes=CHECK,CHECK-GI
|
||||
; RUN: llc < %s -mtriple=aarch64-- -global-isel | FileCheck %s --check-prefixes=CHECK,CHECK-GI
|
||||
|
||||
declare i8 @llvm.fshl.i8(i8, i8, i8)
|
||||
declare i16 @llvm.fshl.i16(i16, i16, i16)
|
||||
|
@ -4,6 +4,63 @@
|
||||
; RUN: llc -mtriple=aarch64 -global-isel -global-isel-abort=2 -verify-machineinstrs %s -o - 2>&1 | FileCheck %s --check-prefixes=CHECK,CHECK-GI,CHECK-GI-NOFP16
|
||||
; RUN: llc -mtriple=aarch64 -mattr=+fullfp16 -global-isel -global-isel-abort=2 -verify-machineinstrs %s -o - 2>&1 | FileCheck %s --check-prefixes=CHECK,CHECK-GI,CHECK-GI-FP16
|
||||
|
||||
; CHECK-GI: warning: Instruction selection used fallback path for stofp_i64_bf16
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for utofp_i64_bf16
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for stofp_i32_bf16
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for utofp_i32_bf16
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for stofp_i16_bf16
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for utofp_i16_bf16
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for stofp_i8_bf16
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for utofp_i8_bf16
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for stofp_v2i64_v2bf16
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for utofp_v2i64_v2bf16
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for stofp_v3i64_v3bf16
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for utofp_v3i64_v3bf16
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for stofp_v4i64_v4bf16
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for utofp_v4i64_v4bf16
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for stofp_v8i64_v8bf16
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for utofp_v8i64_v8bf16
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for stofp_v16i64_v16bf16
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for utofp_v16i64_v16bf16
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for stofp_v32i64_v32bf16
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for utofp_v32i64_v32bf16
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for stofp_v2i32_v2bf16
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for utofp_v2i32_v2bf16
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for stofp_v3i32_v3bf16
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for utofp_v3i32_v3bf16
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for stofp_v4i32_v4bf16
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for utofp_v4i32_v4bf16
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for stofp_v8i32_v8bf16
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for utofp_v8i32_v8bf16
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for stofp_v16i32_v16bf16
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for utofp_v16i32_v16bf16
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for stofp_v32i32_v32bf16
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for utofp_v32i32_v32bf16
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for stofp_v2i16_v2bf16
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for utofp_v2i16_v2bf16
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for stofp_v3i16_v3bf16
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for utofp_v3i16_v3bf16
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for stofp_v4i16_v4bf16
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for utofp_v4i16_v4bf16
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for stofp_v8i16_v8bf16
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for utofp_v8i16_v8bf16
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for stofp_v16i16_v16bf16
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for utofp_v16i16_v16bf16
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for stofp_v32i16_v32bf16
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for utofp_v32i16_v32bf16
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for stofp_v2i8_v2bf16
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for utofp_v2i8_v2bf16
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for stofp_v3i8_v3bf16
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for utofp_v3i8_v3bf16
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for stofp_v4i8_v4bf16
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for utofp_v4i8_v4bf16
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for stofp_v8i8_v8bf16
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for utofp_v8i8_v8bf16
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for stofp_v16i8_v16bf16
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for utofp_v16i8_v16bf16
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for stofp_v32i8_v32bf16
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for utofp_v32i8_v32bf16
|
||||
|
||||
define bfloat @stofp_i64_bf16(i64 %a) {
|
||||
; CHECK-LABEL: stofp_i64_bf16:
|
||||
; CHECK: // %bb.0: // %entry
|
||||
|
@ -1,6 +1,6 @@
|
||||
; RUN: llc < %s -mtriple=aarch64-w64-mingw32 | FileCheck %s
|
||||
; RUN: llc < %s -global-isel -global-isel-abort=2 -pass-remarks-missed=gisel* \
|
||||
; RUN: -mtriple=aarch64-w64-mingw32 2>&1| FileCheck %s --check-prefixes=GISEL,FALLBACK
|
||||
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
|
||||
; RUN: llc < %s -mtriple=aarch64-w64-mingw32 | FileCheck %s --check-prefixes=CHECK,CHECK-SD
|
||||
; RUN: llc < %s -mtriple=aarch64-w64-mingw32 -global-isel | FileCheck %s --check-prefixes=CHECK,CHECK-GI
|
||||
|
||||
@var = external local_unnamed_addr global i32, align 4
|
||||
@dsolocalvar = external dso_local local_unnamed_addr global i32, align 4
|
||||
@ -10,10 +10,11 @@
|
||||
|
||||
define dso_local i32 @getVar() {
|
||||
; CHECK-LABEL: getVar:
|
||||
; CHECK: adrp x8, .refptr.var
|
||||
; CHECK: ldr x8, [x8, :lo12:.refptr.var]
|
||||
; CHECK: ldr w0, [x8]
|
||||
; CHECK: ret
|
||||
; CHECK: // %bb.0: // %entry
|
||||
; CHECK-NEXT: adrp x8, .refptr.var
|
||||
; CHECK-NEXT: ldr x8, [x8, :lo12:.refptr.var]
|
||||
; CHECK-NEXT: ldr w0, [x8]
|
||||
; CHECK-NEXT: ret
|
||||
entry:
|
||||
%0 = load i32, ptr @var, align 4
|
||||
ret i32 %0
|
||||
@ -21,9 +22,10 @@ entry:
|
||||
|
||||
define dso_local i32 @getDsoLocalVar() {
|
||||
; CHECK-LABEL: getDsoLocalVar:
|
||||
; CHECK: adrp x8, dsolocalvar
|
||||
; CHECK: ldr w0, [x8, :lo12:dsolocalvar]
|
||||
; CHECK: ret
|
||||
; CHECK: // %bb.0: // %entry
|
||||
; CHECK-NEXT: adrp x8, dsolocalvar
|
||||
; CHECK-NEXT: ldr w0, [x8, :lo12:dsolocalvar]
|
||||
; CHECK-NEXT: ret
|
||||
entry:
|
||||
%0 = load i32, ptr @dsolocalvar, align 4
|
||||
ret i32 %0
|
||||
@ -31,9 +33,10 @@ entry:
|
||||
|
||||
define dso_local i32 @getLocalVar() {
|
||||
; CHECK-LABEL: getLocalVar:
|
||||
; CHECK: adrp x8, localvar
|
||||
; CHECK: ldr w0, [x8, :lo12:localvar]
|
||||
; CHECK: ret
|
||||
; CHECK: // %bb.0: // %entry
|
||||
; CHECK-NEXT: adrp x8, localvar
|
||||
; CHECK-NEXT: ldr w0, [x8, :lo12:localvar]
|
||||
; CHECK-NEXT: ret
|
||||
entry:
|
||||
%0 = load i32, ptr @localvar, align 4
|
||||
ret i32 %0
|
||||
@ -41,9 +44,10 @@ entry:
|
||||
|
||||
define dso_local i32 @getLocalCommon() {
|
||||
; CHECK-LABEL: getLocalCommon:
|
||||
; CHECK: adrp x8, localcommon
|
||||
; CHECK: ldr w0, [x8, :lo12:localcommon]
|
||||
; CHECK: ret
|
||||
; CHECK: // %bb.0: // %entry
|
||||
; CHECK-NEXT: adrp x8, localcommon
|
||||
; CHECK-NEXT: ldr w0, [x8, :lo12:localcommon]
|
||||
; CHECK-NEXT: ret
|
||||
entry:
|
||||
%0 = load i32, ptr @localcommon, align 4
|
||||
ret i32 %0
|
||||
@ -51,10 +55,11 @@ entry:
|
||||
|
||||
define dso_local i32 @getExtVar() {
|
||||
; CHECK-LABEL: getExtVar:
|
||||
; CHECK: adrp x8, __imp_extvar
|
||||
; CHECK: ldr x8, [x8, :lo12:__imp_extvar]
|
||||
; CHECK: ldr w0, [x8]
|
||||
; CHECK: ret
|
||||
; CHECK: // %bb.0: // %entry
|
||||
; CHECK-NEXT: adrp x8, __imp_extvar
|
||||
; CHECK-NEXT: ldr x8, [x8, :lo12:__imp_extvar]
|
||||
; CHECK-NEXT: ldr w0, [x8]
|
||||
; CHECK-NEXT: ret
|
||||
entry:
|
||||
%0 = load i32, ptr @extvar, align 4
|
||||
ret i32 %0
|
||||
@ -62,7 +67,8 @@ entry:
|
||||
|
||||
define dso_local void @callFunc() {
|
||||
; CHECK-LABEL: callFunc:
|
||||
; CHECK: b otherFunc
|
||||
; CHECK: // %bb.0: // %entry
|
||||
; CHECK-NEXT: b otherFunc
|
||||
entry:
|
||||
tail call void @otherFunc()
|
||||
ret void
|
||||
@ -70,16 +76,40 @@ entry:
|
||||
|
||||
declare dso_local void @otherFunc()
|
||||
|
||||
; FALLBACK-NOT: remark:{{.*}}sspFunc
|
||||
define dso_local void @sspFunc() #0 {
|
||||
; CHECK-LABEL: sspFunc:
|
||||
; CHECK: adrp x8, .refptr.__stack_chk_guard
|
||||
; CHECK: ldr x8, [x8, :lo12:.refptr.__stack_chk_guard]
|
||||
; CHECK: ldr x8, [x8]
|
||||
; GISEL-LABEL: sspFunc:
|
||||
; GISEL: adrp x8, .refptr.__stack_chk_guard
|
||||
; GISEL: ldr x8, [x8, :lo12:.refptr.__stack_chk_guard]
|
||||
; GISEL: ldr x8, [x8]
|
||||
; CHECK: .seh_proc sspFunc
|
||||
; CHECK-NEXT: // %bb.0: // %entry
|
||||
; CHECK-NEXT: sub sp, sp, #32
|
||||
; CHECK-NEXT: .seh_stackalloc 32
|
||||
; CHECK-NEXT: str x30, [sp, #16] // 8-byte Folded Spill
|
||||
; CHECK-NEXT: .seh_save_reg x30, 16
|
||||
; CHECK-NEXT: .seh_endprologue
|
||||
; CHECK-NEXT: adrp x8, .refptr.__stack_chk_guard
|
||||
; CHECK-NEXT: add x0, sp, #7
|
||||
; CHECK-NEXT: ldr x8, [x8, :lo12:.refptr.__stack_chk_guard]
|
||||
; CHECK-NEXT: ldr x8, [x8]
|
||||
; CHECK-NEXT: str x8, [sp, #8]
|
||||
; CHECK-NEXT: bl ptrUser
|
||||
; CHECK-NEXT: adrp x8, .refptr.__stack_chk_guard
|
||||
; CHECK-NEXT: ldr x8, [x8, :lo12:.refptr.__stack_chk_guard]
|
||||
; CHECK-NEXT: ldr x9, [sp, #8]
|
||||
; CHECK-NEXT: ldr x8, [x8]
|
||||
; CHECK-NEXT: cmp x8, x9
|
||||
; CHECK-NEXT: b.ne .LBB6_2
|
||||
; CHECK-NEXT: // %bb.1: // %entry
|
||||
; CHECK-NEXT: .seh_startepilogue
|
||||
; CHECK-NEXT: ldr x30, [sp, #16] // 8-byte Folded Reload
|
||||
; CHECK-NEXT: .seh_save_reg x30, 16
|
||||
; CHECK-NEXT: add sp, sp, #32
|
||||
; CHECK-NEXT: .seh_stackalloc 32
|
||||
; CHECK-NEXT: .seh_endepilogue
|
||||
; CHECK-NEXT: ret
|
||||
; CHECK-NEXT: .LBB6_2: // %entry
|
||||
; CHECK-NEXT: bl __stack_chk_fail
|
||||
; CHECK-NEXT: brk #0x1
|
||||
; CHECK-NEXT: .seh_endfunclet
|
||||
; CHECK-NEXT: .seh_endproc
|
||||
entry:
|
||||
%c = alloca i8, align 1
|
||||
call void @llvm.lifetime.start.p0(i64 1, ptr nonnull %c)
|
||||
@ -102,3 +132,7 @@ attributes #0 = { sspstrong }
|
||||
; CHECK: .globl .refptr.var
|
||||
; CHECK: .refptr.var:
|
||||
; CHECK: .xword var
|
||||
|
||||
;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
|
||||
; CHECK-GI: {{.*}}
|
||||
; CHECK-SD: {{.*}}
|
||||
|
@ -1,6 +1,6 @@
|
||||
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
|
||||
; RUN: llc -mtriple=aarch64 %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-SD
|
||||
; RUN: llc -mtriple=aarch64 %s -o - -global-isel -global-isel-abort=2 2>&1 | FileCheck %s --check-prefixes=CHECK,CHECK-GI
|
||||
; RUN: llc -mtriple=aarch64 %s -o - -global-isel | FileCheck %s --check-prefixes=CHECK,CHECK-GI
|
||||
|
||||
define <1 x i64> @v1i64(<1 x i64> %a) {
|
||||
; CHECK-SD-LABEL: v1i64:
|
||||
|
@ -1,7 +1,6 @@
|
||||
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
|
||||
; RUN: llc < %s -mtriple=arm64-eabi -verify-machineinstrs | FileCheck %s --check-prefixes=CHECK,SDAG
|
||||
; RUN: llc < %s -mtriple=arm64-eabi -global-isel -global-isel-abort=2 -verify-machineinstrs | FileCheck %s --check-prefixes=CHECK,GISEL
|
||||
|
||||
; RUN: llc < %s -mtriple=arm64-eabi -verify-machineinstrs | FileCheck %s --check-prefixes=CHECK,CHECK-SD
|
||||
; RUN: llc < %s -mtriple=arm64-eabi -global-isel -verify-machineinstrs | FileCheck %s --check-prefixes=CHECK,CHECK-GI
|
||||
|
||||
define zeroext i1 @saddo1.i32.unused(i32 %v1, i32 %v2, ptr %res) {
|
||||
; CHECK-LABEL: saddo1.i32.unused:
|
||||
@ -105,19 +104,19 @@ entry:
|
||||
ret i1 %obit
|
||||
}
|
||||
define zeroext i1 @saddo.add.i32(i32 %v1, i32 %v2, i32 %v3, i32 %v4, i32 %v5, ptr %res) {
|
||||
; SDAG-LABEL: saddo.add.i32:
|
||||
; SDAG: // %bb.0: // %entry
|
||||
; SDAG-NEXT: add w8, w4, #100
|
||||
; SDAG-NEXT: subs w8, w8, #100
|
||||
; SDAG-NEXT: cset w0, vs
|
||||
; SDAG-NEXT: str w8, [x5]
|
||||
; SDAG-NEXT: ret
|
||||
; CHECK-SD-LABEL: saddo.add.i32:
|
||||
; CHECK-SD: // %bb.0: // %entry
|
||||
; CHECK-SD-NEXT: add w8, w4, #100
|
||||
; CHECK-SD-NEXT: subs w8, w8, #100
|
||||
; CHECK-SD-NEXT: cset w0, vs
|
||||
; CHECK-SD-NEXT: str w8, [x5]
|
||||
; CHECK-SD-NEXT: ret
|
||||
;
|
||||
; GISEL-LABEL: saddo.add.i32:
|
||||
; GISEL: // %bb.0: // %entry
|
||||
; GISEL-NEXT: mov w0, wzr
|
||||
; GISEL-NEXT: str w4, [x5]
|
||||
; GISEL-NEXT: ret
|
||||
; CHECK-GI-LABEL: saddo.add.i32:
|
||||
; CHECK-GI: // %bb.0: // %entry
|
||||
; CHECK-GI-NEXT: mov w0, wzr
|
||||
; CHECK-GI-NEXT: str w4, [x5]
|
||||
; CHECK-GI-NEXT: ret
|
||||
entry:
|
||||
%lhs = add nsw i32 %v5, 100
|
||||
%t = call {i32, i1} @llvm.sadd.with.overflow.i32(i32 %lhs, i32 -100)
|
||||
@ -128,20 +127,20 @@ entry:
|
||||
}
|
||||
|
||||
define zeroext i1 @uaddo.add.i32(i32 %v1, i32 %v2, i32 %v3, i32 %v4, i32 %v5, ptr %res) {
|
||||
; SDAG-LABEL: uaddo.add.i32:
|
||||
; SDAG: // %bb.0: // %entry
|
||||
; SDAG-NEXT: add w8, w4, #5
|
||||
; SDAG-NEXT: adds w8, w8, #5
|
||||
; SDAG-NEXT: cset w0, hs
|
||||
; SDAG-NEXT: str w8, [x5]
|
||||
; SDAG-NEXT: ret
|
||||
; CHECK-SD-LABEL: uaddo.add.i32:
|
||||
; CHECK-SD: // %bb.0: // %entry
|
||||
; CHECK-SD-NEXT: add w8, w4, #5
|
||||
; CHECK-SD-NEXT: adds w8, w8, #5
|
||||
; CHECK-SD-NEXT: cset w0, hs
|
||||
; CHECK-SD-NEXT: str w8, [x5]
|
||||
; CHECK-SD-NEXT: ret
|
||||
;
|
||||
; GISEL-LABEL: uaddo.add.i32:
|
||||
; GISEL: // %bb.0: // %entry
|
||||
; GISEL-NEXT: adds w8, w4, #10
|
||||
; GISEL-NEXT: cset w0, hs
|
||||
; GISEL-NEXT: str w8, [x5]
|
||||
; GISEL-NEXT: ret
|
||||
; CHECK-GI-LABEL: uaddo.add.i32:
|
||||
; CHECK-GI: // %bb.0: // %entry
|
||||
; CHECK-GI-NEXT: adds w8, w4, #10
|
||||
; CHECK-GI-NEXT: cset w0, hs
|
||||
; CHECK-GI-NEXT: str w8, [x5]
|
||||
; CHECK-GI-NEXT: ret
|
||||
entry:
|
||||
%lhs = add nuw i32 %v5, 5
|
||||
%t = call {i32, i1} @llvm.uadd.with.overflow.i32(i32 %lhs, i32 5)
|
||||
|
@ -1,6 +1,6 @@
|
||||
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
|
||||
; RUN: llc -mtriple=aarch64 -global-isel=0 -verify-machineinstrs %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-SD
|
||||
; RUN: llc -mtriple=aarch64 -global-isel=1 -global-isel-abort=2 -verify-machineinstrs %s -o - 2>&1 | FileCheck %s --check-prefixes=CHECK,CHECK-GI
|
||||
; RUN: llc -mtriple=aarch64 -global-isel=1 -verify-machineinstrs %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-GI
|
||||
|
||||
define i8 @ti8(i1 %c, ptr %p, i8 %a, i8 %b) {
|
||||
; CHECK-SD-LABEL: ti8:
|
||||
|
@ -1,6 +1,6 @@
|
||||
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
|
||||
; RUN: llc < %s -mtriple=aarch64-- | FileCheck %s --check-prefixes=CHECK,CHECK-SD
|
||||
; RUN: llc < %s -mtriple=aarch64-- -global-isel -global-isel-abort=2 2>&1 | FileCheck %s --check-prefixes=CHECK,CHECK-GI
|
||||
; RUN: llc < %s -mtriple=aarch64-- -global-isel | FileCheck %s --check-prefixes=CHECK,CHECK-GI
|
||||
|
||||
declare i4 @llvm.sadd.sat.i4(i4, i4)
|
||||
declare i8 @llvm.sadd.sat.i8(i8, i8)
|
||||
|
@ -1,6 +1,6 @@
|
||||
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
|
||||
; RUN: llc < %s -mtriple=aarch64-- | FileCheck %s --check-prefixes=CHECK,CHECK-SD
|
||||
; RUN: llc < %s -mtriple=aarch64-- -global-isel -global-isel-abort=2 2>&1 | FileCheck %s --check-prefixes=CHECK,CHECK-GI
|
||||
; RUN: llc < %s -mtriple=aarch64-- -global-isel | FileCheck %s --check-prefixes=CHECK,CHECK-GI
|
||||
|
||||
declare i4 @llvm.sadd.sat.i4(i4, i4)
|
||||
declare i8 @llvm.sadd.sat.i8(i8, i8)
|
||||
|
@ -2,6 +2,10 @@
|
||||
; RUN: llc < %s -mtriple=aarch64-- | FileCheck %s --check-prefixes=CHECK,CHECK-SD
|
||||
; RUN: llc < %s -mtriple=aarch64-- -global-isel -global-isel-abort=2 2>&1 | FileCheck %s --check-prefixes=CHECK,CHECK-GI
|
||||
|
||||
; CHECK-GI: warning: Instruction selection used fallback path for v16i4
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for v16i1
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for v2i128
|
||||
|
||||
declare <1 x i8> @llvm.sadd.sat.v1i8(<1 x i8>, <1 x i8>)
|
||||
declare <2 x i8> @llvm.sadd.sat.v2i8(<2 x i8>, <2 x i8>)
|
||||
declare <4 x i8> @llvm.sadd.sat.v4i8(<4 x i8>, <4 x i8>)
|
||||
|
@ -1,6 +1,6 @@
|
||||
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 2
|
||||
; RUN: llc -mtriple=aarch64 -verify-machineinstrs %s -o - 2>&1 | FileCheck %s --check-prefixes=CHECK,CHECK-SD
|
||||
; RUN: llc -mtriple=aarch64 -global-isel -global-isel-abort=2 -verify-machineinstrs %s -o - 2>&1 | FileCheck %s --check-prefixes=CHECK,CHECK-GI
|
||||
; RUN: llc -mtriple=aarch64 -global-isel -verify-machineinstrs %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-GI
|
||||
|
||||
define i16 @sext_i8_to_i16(i8 %a) {
|
||||
; CHECK-LABEL: sext_i8_to_i16:
|
||||
|
@ -1,6 +1,6 @@
|
||||
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
|
||||
; RUN: llc < %s -mtriple=aarch64-- | FileCheck %s --check-prefixes=CHECK,CHECK-SD
|
||||
; RUN: llc < %s -mtriple=aarch64-- -global-isel -global-isel-abort=2 2>&1 | FileCheck %s --check-prefixes=CHECK,CHECK-GI
|
||||
; RUN: llc < %s -mtriple=aarch64-- -global-isel | FileCheck %s --check-prefixes=CHECK,CHECK-GI
|
||||
|
||||
declare i4 @llvm.ssub.sat.i4(i4, i4)
|
||||
declare i8 @llvm.ssub.sat.i8(i8, i8)
|
||||
|
@ -1,6 +1,6 @@
|
||||
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
|
||||
; RUN: llc < %s -mtriple=aarch64-- | FileCheck %s --check-prefixes=CHECK,CHECK-SD
|
||||
; RUN: llc < %s -mtriple=aarch64-- -global-isel -global-isel-abort=2 2>&1 | FileCheck %s --check-prefixes=CHECK,CHECK-GI
|
||||
; RUN: llc < %s -mtriple=aarch64-- -global-isel | FileCheck %s --check-prefixes=CHECK,CHECK-GI
|
||||
|
||||
declare i4 @llvm.ssub.sat.i4(i4, i4)
|
||||
declare i8 @llvm.ssub.sat.i8(i8, i8)
|
||||
|
@ -2,6 +2,10 @@
|
||||
; RUN: llc < %s -mtriple=aarch64-- | FileCheck %s --check-prefixes=CHECK,CHECK-SD
|
||||
; RUN: llc < %s -mtriple=aarch64-- -global-isel -global-isel-abort=2 2>&1 | FileCheck %s --check-prefixes=CHECK,CHECK-GI
|
||||
|
||||
; CHECK-GI: warning: Instruction selection used fallback path for v16i4
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for v16i1
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for v2i128
|
||||
|
||||
declare <1 x i8> @llvm.ssub.sat.v1i8(<1 x i8>, <1 x i8>)
|
||||
declare <2 x i8> @llvm.ssub.sat.v2i8(<2 x i8>, <2 x i8>)
|
||||
declare <4 x i8> @llvm.ssub.sat.v4i8(<4 x i8>, <4 x i8>)
|
||||
|
@ -1,6 +1,6 @@
|
||||
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
|
||||
; RUN: llc < %s -mtriple=aarch64-- | FileCheck %s --check-prefixes=CHECK,CHECK-SD
|
||||
; RUN: llc < %s -mtriple=aarch64-- -global-isel -global-isel-abort=2 2>&1 | FileCheck %s --check-prefixes=CHECK,CHECK-GI
|
||||
; RUN: llc < %s -mtriple=aarch64-- -global-isel | FileCheck %s --check-prefixes=CHECK,CHECK-GI
|
||||
|
||||
declare i4 @llvm.uadd.sat.i4(i4, i4)
|
||||
declare i8 @llvm.uadd.sat.i8(i8, i8)
|
||||
|
@ -1,6 +1,6 @@
|
||||
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
|
||||
; RUN: llc < %s -mtriple=aarch64-- | FileCheck %s --check-prefixes=CHECK,CHECK-SD
|
||||
; RUN: llc < %s -mtriple=aarch64-- -global-isel -global-isel-abort=2 2>&1 | FileCheck %s --check-prefixes=CHECK,CHECK-GI
|
||||
; RUN: llc < %s -mtriple=aarch64-- -global-isel | FileCheck %s --check-prefixes=CHECK,CHECK-GI
|
||||
|
||||
declare i4 @llvm.uadd.sat.i4(i4, i4)
|
||||
declare i8 @llvm.uadd.sat.i8(i8, i8)
|
||||
|
@ -2,6 +2,10 @@
|
||||
; RUN: llc < %s -mtriple=aarch64-- | FileCheck %s --check-prefixes=CHECK,CHECK-SD
|
||||
; RUN: llc < %s -mtriple=aarch64-- -global-isel -global-isel-abort=2 2>&1 | FileCheck %s --check-prefixes=CHECK,CHECK-GI
|
||||
|
||||
; CHECK-GI: warning: Instruction selection used fallback path for v16i4
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for v16i1
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for v2i128
|
||||
|
||||
declare <1 x i8> @llvm.uadd.sat.v1i8(<1 x i8>, <1 x i8>)
|
||||
declare <2 x i8> @llvm.uadd.sat.v2i8(<2 x i8>, <2 x i8>)
|
||||
declare <4 x i8> @llvm.uadd.sat.v4i8(<4 x i8>, <4 x i8>)
|
||||
|
@ -1,6 +1,6 @@
|
||||
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
|
||||
; RUN: llc < %s -mtriple=aarch64-- | FileCheck %s --check-prefixes=CHECK,CHECK-SD
|
||||
; RUN: llc < %s -mtriple=aarch64-- -global-isel -global-isel-abort=2 2>&1 | FileCheck %s --check-prefixes=CHECK,CHECK-GI
|
||||
; RUN: llc < %s -mtriple=aarch64-- -global-isel | FileCheck %s --check-prefixes=CHECK,CHECK-GI
|
||||
|
||||
declare i4 @llvm.usub.sat.i4(i4, i4)
|
||||
declare i8 @llvm.usub.sat.i8(i8, i8)
|
||||
|
@ -1,6 +1,6 @@
|
||||
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
|
||||
; RUN: llc < %s -mtriple=aarch64-- | FileCheck %s --check-prefixes=CHECK,CHECK-SD
|
||||
; RUN: llc < %s -mtriple=aarch64-- -global-isel -global-isel-abort=2 2>&1 | FileCheck %s --check-prefixes=CHECK,CHECK-GI
|
||||
; RUN: llc < %s -mtriple=aarch64-- -global-isel | FileCheck %s --check-prefixes=CHECK,CHECK-GI
|
||||
|
||||
declare i4 @llvm.usub.sat.i4(i4, i4)
|
||||
declare i8 @llvm.usub.sat.i8(i8, i8)
|
||||
|
@ -2,6 +2,10 @@
|
||||
; RUN: llc < %s -mtriple=aarch64-- | FileCheck %s --check-prefixes=CHECK,CHECK-SD
|
||||
; RUN: llc < %s -mtriple=aarch64-- -global-isel -global-isel-abort=2 2>&1 | FileCheck %s --check-prefixes=CHECK,CHECK-GI
|
||||
|
||||
; CHECK-GI: warning: Instruction selection used fallback path for v16i4
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for v16i1
|
||||
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for v2i128
|
||||
|
||||
declare <1 x i8> @llvm.usub.sat.v1i8(<1 x i8>, <1 x i8>)
|
||||
declare <2 x i8> @llvm.usub.sat.v2i8(<2 x i8>, <2 x i8>)
|
||||
declare <4 x i8> @llvm.usub.sat.v4i8(<4 x i8>, <4 x i8>)
|
||||
|
@ -1,6 +1,6 @@
|
||||
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
|
||||
; RUN: llc < %s -mtriple=aarch64-none-linux-gnu -mattr=+neon | FileCheck %s --check-prefixes=CHECK,CHECK-SD
|
||||
; RUN: llc < %s -mtriple=aarch64-none-linux-gnu -mattr=+neon -global-isel -global-isel-abort=2 2>&1 | FileCheck %s --check-prefixes=CHECK,CHECK-GI
|
||||
; RUN: llc < %s -mtriple=aarch64-none-linux-gnu -mattr=+neon -global-isel | FileCheck %s --check-prefixes=CHECK,CHECK-GI
|
||||
|
||||
declare i1 @llvm.vector.reduce.umax.v1i1(<1 x i1> %a)
|
||||
declare i8 @llvm.vector.reduce.umax.v1i8(<1 x i8> %a)
|
||||
|
Loading…
x
Reference in New Issue
Block a user