| ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py |
| ; RUN: llc < %s -mtriple=aarch64-none-eabi -code-model=tiny -verify-machineinstrs | FileCheck %s |
| |
| %struct.T = type <{ i32, i64, i8, i32 }> |
| |
| @ptr = external local_unnamed_addr global i32*, align 8 |
| @ch = external local_unnamed_addr global i32, align 4 |
| @ch8 = external local_unnamed_addr global i8, align 4 |
| @t = external local_unnamed_addr global %struct.T, align 4 |
| @t2 = external local_unnamed_addr global %struct.T, align 2 |
| @f = external local_unnamed_addr global float, align 4 |
| |
| define i32 @barp() { |
| ; CHECK-LABEL: barp: |
| ; CHECK: // %bb.0: // %entry |
| ; CHECK-NEXT: ldr x8, ptr |
| ; CHECK-NEXT: ldr w0, [x8] |
| ; CHECK-NEXT: ret |
| entry: |
| %0 = load i32*, i32** @ptr, align 8 |
| %1 = load i32, i32* %0, align 4 |
| ret i32 %1 |
| } |
| |
| define i32 @barch() { |
| ; CHECK-LABEL: barch: |
| ; CHECK: // %bb.0: // %entry |
| ; CHECK-NEXT: ldr w0, ch |
| ; CHECK-NEXT: ret |
| entry: |
| %0 = load i32, i32* @ch, align 4 |
| ret i32 %0 |
| } |
| |
| define i32 @barta() { |
| ; CHECK-LABEL: barta: |
| ; CHECK: // %bb.0: // %entry |
| ; CHECK-NEXT: ldr w0, t |
| ; CHECK-NEXT: ret |
| entry: |
| %0 = load i32, i32* getelementptr inbounds (%struct.T, %struct.T* @t, i64 0, i32 0), align 4 |
| ret i32 %0 |
| } |
| |
| define i64 @bartb() { |
| ; CHECK-LABEL: bartb: |
| ; CHECK: // %bb.0: // %entry |
| ; CHECK-NEXT: ldr x0, t+4 |
| ; CHECK-NEXT: ret |
| entry: |
| %0 = load i64, i64* getelementptr inbounds (%struct.T, %struct.T* @t, i64 0, i32 1), align 8 |
| ret i64 %0 |
| } |
| |
| define i32 @bartc() { |
| ; CHECK-LABEL: bartc: |
| ; CHECK: // %bb.0: // %entry |
| ; CHECK-NEXT: adr x8, t+13 |
| ; CHECK-NEXT: ldr w0, [x8] |
| ; CHECK-NEXT: ret |
| entry: |
| %0 = load i32, i32* getelementptr inbounds (%struct.T, %struct.T* @t, i64 0, i32 3), align 1 |
| ret i32 %0 |
| } |
| |
| define i32 @bart2a() { |
| ; CHECK-LABEL: bart2a: |
| ; CHECK: // %bb.0: // %entry |
| ; CHECK-NEXT: adr x8, t2 |
| ; CHECK-NEXT: ldr w0, [x8] |
| ; CHECK-NEXT: ret |
| entry: |
| %0 = load i32, i32* getelementptr inbounds (%struct.T, %struct.T* @t2, i64 0, i32 0), align 2 |
| ret i32 %0 |
| } |
| |
| define i64 @zextload() { |
| ; CHECK-LABEL: zextload: |
| ; CHECK: // %bb.0: // %entry |
| ; CHECK-NEXT: ldr w0, ch |
| ; CHECK-NEXT: ret |
| entry: |
| %0 = load i32, i32* @ch, align 4 |
| %1 = zext i32 %0 to i64 |
| ret i64 %1 |
| } |
| |
| define i64 @zextload8() { |
| ; CHECK-LABEL: zextload8: |
| ; CHECK: // %bb.0: // %entry |
| ; CHECK-NEXT: adr x8, ch8 |
| ; CHECK-NEXT: ldrb w0, [x8] |
| ; CHECK-NEXT: ret |
| entry: |
| %0 = load i8, i8* @ch8, align 4 |
| %1 = zext i8 %0 to i64 |
| ret i64 %1 |
| } |
| |
| define i64 @sextload() { |
| ; CHECK-LABEL: sextload: |
| ; CHECK: // %bb.0: // %entry |
| ; CHECK-NEXT: ldrsw x0, ch |
| ; CHECK-NEXT: ret |
| entry: |
| %0 = load i32, i32* @ch, align 4 |
| %1 = sext i32 %0 to i64 |
| ret i64 %1 |
| } |
| |
| define i64 @sextload8() { |
| ; CHECK-LABEL: sextload8: |
| ; CHECK: // %bb.0: // %entry |
| ; CHECK-NEXT: adr x8, ch8 |
| ; CHECK-NEXT: ldrsb x0, [x8] |
| ; CHECK-NEXT: ret |
| entry: |
| %0 = load i8, i8* @ch8, align 4 |
| %1 = sext i8 %0 to i64 |
| ret i64 %1 |
| } |
| |
| define float @floatload() { |
| ; CHECK-LABEL: floatload: |
| ; CHECK: // %bb.0: // %entry |
| ; CHECK-NEXT: ldr s0, f |
| ; CHECK-NEXT: ret |
| entry: |
| %0 = load float, float* @f, align 4 |
| ret float %0 |
| } |
| |