mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-09-02 11:30:10 +00:00
This is mostly a copy of the existing FastISel GEP code, but we have to duplicate it for AArch64, because otherwise we would bail out even for simple cases. This is because the standard fastEmit functions don't cover MUL at all and ADD is lowered very inefficientily. The original commit had a bug in the add emit logic, which has been fixed. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@219831 91177308-0d34-0410-b5e6-96231b3b80d8
42 lines
1.1 KiB
LLVM
42 lines
1.1 KiB
LLVM
; RUN: llc -mtriple=aarch64-apple-darwin -fast-isel -fast-isel-abort -verify-machineinstrs < %s | FileCheck %s
|
|
|
|
%struct.foo = type { i32, i64, float, double }
|
|
|
|
define double* @test_struct(%struct.foo* %f) {
|
|
; CHECK-LABEL: test_struct
|
|
; CHECK: add x0, x0, #24
|
|
%1 = getelementptr inbounds %struct.foo* %f, i64 0, i32 3
|
|
ret double* %1
|
|
}
|
|
|
|
define i32* @test_array1(i32* %a, i64 %i) {
|
|
; CHECK-LABEL: test_array1
|
|
; CHECK: orr [[REG:x[0-9]+]], xzr, #0x4
|
|
; CHECK-NEXT: madd x0, x1, [[REG]], x0
|
|
%1 = getelementptr inbounds i32* %a, i64 %i
|
|
ret i32* %1
|
|
}
|
|
|
|
define i32* @test_array2(i32* %a) {
|
|
; CHECK-LABEL: test_array2
|
|
; CHECK: add x0, x0, #16
|
|
%1 = getelementptr inbounds i32* %a, i64 4
|
|
ret i32* %1
|
|
}
|
|
|
|
define i32* @test_array3(i32* %a) {
|
|
; CHECK-LABEL: test_array3
|
|
; CHECK: add x0, x0, #1, lsl #12
|
|
%1 = getelementptr inbounds i32* %a, i64 1024
|
|
ret i32* %1
|
|
}
|
|
|
|
define i32* @test_array4(i32* %a) {
|
|
; CHECK-LABEL: test_array4
|
|
; CHECK: movz [[REG:x[0-9]+]], #0x1008
|
|
; CHECK-NEXR: add x0, x0, [[REG]]
|
|
%1 = getelementptr inbounds i32* %a, i64 1026
|
|
ret i32* %1
|
|
}
|
|
|