| ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 2 |
| ; RUN: llc -mtriple=armv5e-arm-none-eabi -mattr=+strict-align %s -o - | FileCheck %s --check-prefixes=CHECK-ARMV5TE |
| ; RUN: llc -mtriple=thumbv6t2-arm-none-eabi %s -o - | FileCheck %s --check-prefixes=CHECK-T2 |
| ; RUN: llc -mtriple=armv4t-arm-none-eabi -mattr=+strict-align %s -o - | FileCheck %s --check-prefixes=CHECK-ARMV4T |
| ; RUN: llc -mtriple=armv7-arm-none-eabi %s -o - | FileCheck %s --check-prefixes=CHECK-ARMV7 |
| ; RUN: llc -mtriple=armv7-arm-none-eabi -mattr=+strict-align %s -o - | FileCheck %s --check-prefixes=CHECK-ARMV7-STRICT |
| ; RUN: llc -mtriple=armv6-arm-none-eabi %s -o - | FileCheck %s --check-prefixes=CHECK-ARMV6 |
| ; RUN: llc -mtriple=armv6-arm-none-eabi -mattr=+strict-align %s -o - | FileCheck %s --check-prefixes=CHECK-ARMV6-STRICT |
| |
| @x = common dso_local global i64 0, align 8 |
| @y = common dso_local global i64 0, align 8 |
| |
| @x_unaligned = common dso_local global i64 0, align 1 |
| @y_unaligned = common dso_local global i64 0, align 1 |
| |
| @x_aligned_4 = common dso_local global i64 0, align 4 |
| @y_aligned_4 = common dso_local global i64 0, align 4 |
| |
| define void @test() { |
| ; CHECK-ARMV5TE-LABEL: test: |
| ; CHECK-ARMV5TE: @ %bb.0: @ %entry |
| ; CHECK-ARMV5TE-NEXT: ldr r0, .LCPI0_0 |
| ; CHECK-ARMV5TE-NEXT: ldr r2, .LCPI0_1 |
| ; CHECK-ARMV5TE-NEXT: ldrd r0, r1, [r0] |
| ; CHECK-ARMV5TE-NEXT: strd r0, r1, [r2] |
| ; CHECK-ARMV5TE-NEXT: bx lr |
| ; CHECK-ARMV5TE-NEXT: .p2align 2 |
| ; CHECK-ARMV5TE-NEXT: @ %bb.1: |
| ; CHECK-ARMV5TE-NEXT: .LCPI0_0: |
| ; CHECK-ARMV5TE-NEXT: .long x |
| ; CHECK-ARMV5TE-NEXT: .LCPI0_1: |
| ; CHECK-ARMV5TE-NEXT: .long y |
| ; |
| ; CHECK-T2-LABEL: test: |
| ; CHECK-T2: @ %bb.0: @ %entry |
| ; CHECK-T2-NEXT: movw r0, :lower16:x |
| ; CHECK-T2-NEXT: movw r2, :lower16:y |
| ; CHECK-T2-NEXT: movt r0, :upper16:x |
| ; CHECK-T2-NEXT: movt r2, :upper16:y |
| ; CHECK-T2-NEXT: ldrd r0, r1, [r0] |
| ; CHECK-T2-NEXT: strd r0, r1, [r2] |
| ; CHECK-T2-NEXT: bx lr |
| ; |
| ; CHECK-ARMV4T-LABEL: test: |
| ; CHECK-ARMV4T: @ %bb.0: @ %entry |
| ; CHECK-ARMV4T-NEXT: ldr r0, .LCPI0_0 |
| ; CHECK-ARMV4T-NEXT: ldr r2, .LCPI0_1 |
| ; CHECK-ARMV4T-NEXT: ldr r1, [r0] |
| ; CHECK-ARMV4T-NEXT: ldr r0, [r0, #4] |
| ; CHECK-ARMV4T-NEXT: str r0, [r2, #4] |
| ; CHECK-ARMV4T-NEXT: str r1, [r2] |
| ; CHECK-ARMV4T-NEXT: bx lr |
| ; CHECK-ARMV4T-NEXT: .p2align 2 |
| ; CHECK-ARMV4T-NEXT: @ %bb.1: |
| ; CHECK-ARMV4T-NEXT: .LCPI0_0: |
| ; CHECK-ARMV4T-NEXT: .long x |
| ; CHECK-ARMV4T-NEXT: .LCPI0_1: |
| ; CHECK-ARMV4T-NEXT: .long y |
| ; |
| ; CHECK-ARMV7-LABEL: test: |
| ; CHECK-ARMV7: @ %bb.0: @ %entry |
| ; CHECK-ARMV7-NEXT: movw r0, :lower16:x |
| ; CHECK-ARMV7-NEXT: movw r2, :lower16:y |
| ; CHECK-ARMV7-NEXT: movt r0, :upper16:x |
| ; CHECK-ARMV7-NEXT: movt r2, :upper16:y |
| ; CHECK-ARMV7-NEXT: ldrd r0, r1, [r0] |
| ; CHECK-ARMV7-NEXT: strd r0, r1, [r2] |
| ; CHECK-ARMV7-NEXT: bx lr |
| ; |
| ; CHECK-ARMV7-STRICT-LABEL: test: |
| ; CHECK-ARMV7-STRICT: @ %bb.0: @ %entry |
| ; CHECK-ARMV7-STRICT-NEXT: movw r0, :lower16:x |
| ; CHECK-ARMV7-STRICT-NEXT: movw r2, :lower16:y |
| ; CHECK-ARMV7-STRICT-NEXT: movt r0, :upper16:x |
| ; CHECK-ARMV7-STRICT-NEXT: movt r2, :upper16:y |
| ; CHECK-ARMV7-STRICT-NEXT: ldrd r0, r1, [r0] |
| ; CHECK-ARMV7-STRICT-NEXT: strd r0, r1, [r2] |
| ; CHECK-ARMV7-STRICT-NEXT: bx lr |
| ; |
| ; CHECK-ARMV6-LABEL: test: |
| ; CHECK-ARMV6: @ %bb.0: @ %entry |
| ; CHECK-ARMV6-NEXT: ldr r0, .LCPI0_0 |
| ; CHECK-ARMV6-NEXT: ldr r2, .LCPI0_1 |
| ; CHECK-ARMV6-NEXT: ldrd r0, r1, [r0] |
| ; CHECK-ARMV6-NEXT: strd r0, r1, [r2] |
| ; CHECK-ARMV6-NEXT: bx lr |
| ; CHECK-ARMV6-NEXT: .p2align 2 |
| ; CHECK-ARMV6-NEXT: @ %bb.1: |
| ; CHECK-ARMV6-NEXT: .LCPI0_0: |
| ; CHECK-ARMV6-NEXT: .long x |
| ; CHECK-ARMV6-NEXT: .LCPI0_1: |
| ; CHECK-ARMV6-NEXT: .long y |
| ; |
| ; CHECK-ARMV6-STRICT-LABEL: test: |
| ; CHECK-ARMV6-STRICT: @ %bb.0: @ %entry |
| ; CHECK-ARMV6-STRICT-NEXT: ldr r0, .LCPI0_0 |
| ; CHECK-ARMV6-STRICT-NEXT: ldr r2, .LCPI0_1 |
| ; CHECK-ARMV6-STRICT-NEXT: ldrd r0, r1, [r0] |
| ; CHECK-ARMV6-STRICT-NEXT: strd r0, r1, [r2] |
| ; CHECK-ARMV6-STRICT-NEXT: bx lr |
| ; CHECK-ARMV6-STRICT-NEXT: .p2align 2 |
| ; CHECK-ARMV6-STRICT-NEXT: @ %bb.1: |
| ; CHECK-ARMV6-STRICT-NEXT: .LCPI0_0: |
| ; CHECK-ARMV6-STRICT-NEXT: .long x |
| ; CHECK-ARMV6-STRICT-NEXT: .LCPI0_1: |
| ; CHECK-ARMV6-STRICT-NEXT: .long y |
| entry: |
| |
| |
| |
| |
| %0 = load volatile i64, ptr @x, align 8 |
| store volatile i64 %0, ptr @y, align 8 |
| ret void |
| } |
| |
| define void @test_unaligned() { |
| ; CHECK-ARMV5TE-LABEL: test_unaligned: |
| ; CHECK-ARMV5TE: @ %bb.0: @ %entry |
| ; CHECK-ARMV5TE-NEXT: .save {r4, r5, r6, lr} |
| ; CHECK-ARMV5TE-NEXT: push {r4, r5, r6, lr} |
| ; CHECK-ARMV5TE-NEXT: ldr r0, .LCPI1_0 |
| ; CHECK-ARMV5TE-NEXT: ldr r6, .LCPI1_1 |
| ; CHECK-ARMV5TE-NEXT: mov r1, r0 |
| ; CHECK-ARMV5TE-NEXT: ldrb lr, [r1, #4]! |
| ; CHECK-ARMV5TE-NEXT: ldrb r3, [r1, #2] |
| ; CHECK-ARMV5TE-NEXT: ldrb r12, [r1, #3] |
| ; CHECK-ARMV5TE-NEXT: ldrb r1, [r0] |
| ; CHECK-ARMV5TE-NEXT: ldrb r2, [r0, #1] |
| ; CHECK-ARMV5TE-NEXT: ldrb r4, [r0, #2] |
| ; CHECK-ARMV5TE-NEXT: ldrb r5, [r0, #3] |
| ; CHECK-ARMV5TE-NEXT: ldrb r0, [r0, #5] |
| ; CHECK-ARMV5TE-NEXT: strb r0, [r6, #5] |
| ; CHECK-ARMV5TE-NEXT: strb r4, [r6, #2] |
| ; CHECK-ARMV5TE-NEXT: strb r5, [r6, #3] |
| ; CHECK-ARMV5TE-NEXT: strb r1, [r6] |
| ; CHECK-ARMV5TE-NEXT: strb r2, [r6, #1] |
| ; CHECK-ARMV5TE-NEXT: strb lr, [r6, #4]! |
| ; CHECK-ARMV5TE-NEXT: strb r3, [r6, #2] |
| ; CHECK-ARMV5TE-NEXT: strb r12, [r6, #3] |
| ; CHECK-ARMV5TE-NEXT: pop {r4, r5, r6, pc} |
| ; CHECK-ARMV5TE-NEXT: .p2align 2 |
| ; CHECK-ARMV5TE-NEXT: @ %bb.1: |
| ; CHECK-ARMV5TE-NEXT: .LCPI1_0: |
| ; CHECK-ARMV5TE-NEXT: .long x_unaligned |
| ; CHECK-ARMV5TE-NEXT: .LCPI1_1: |
| ; CHECK-ARMV5TE-NEXT: .long y_unaligned |
| ; |
| ; CHECK-T2-LABEL: test_unaligned: |
| ; CHECK-T2: @ %bb.0: @ %entry |
| ; CHECK-T2-NEXT: movw r0, :lower16:x_unaligned |
| ; CHECK-T2-NEXT: movw r2, :lower16:y_unaligned |
| ; CHECK-T2-NEXT: movt r0, :upper16:x_unaligned |
| ; CHECK-T2-NEXT: movt r2, :upper16:y_unaligned |
| ; CHECK-T2-NEXT: ldr r1, [r0] |
| ; CHECK-T2-NEXT: ldr r0, [r0, #4] |
| ; CHECK-T2-NEXT: str r0, [r2, #4] |
| ; CHECK-T2-NEXT: str r1, [r2] |
| ; CHECK-T2-NEXT: bx lr |
| ; |
| ; CHECK-ARMV4T-LABEL: test_unaligned: |
| ; CHECK-ARMV4T: @ %bb.0: @ %entry |
| ; CHECK-ARMV4T-NEXT: .save {r4, r5, r6, lr} |
| ; CHECK-ARMV4T-NEXT: push {r4, r5, r6, lr} |
| ; CHECK-ARMV4T-NEXT: ldr r0, .LCPI1_0 |
| ; CHECK-ARMV4T-NEXT: ldr r6, .LCPI1_1 |
| ; CHECK-ARMV4T-NEXT: mov r1, r0 |
| ; CHECK-ARMV4T-NEXT: ldrb lr, [r1, #4]! |
| ; CHECK-ARMV4T-NEXT: ldrb r3, [r1, #2] |
| ; CHECK-ARMV4T-NEXT: ldrb r12, [r1, #3] |
| ; CHECK-ARMV4T-NEXT: ldrb r1, [r0] |
| ; CHECK-ARMV4T-NEXT: ldrb r2, [r0, #1] |
| ; CHECK-ARMV4T-NEXT: ldrb r4, [r0, #2] |
| ; CHECK-ARMV4T-NEXT: ldrb r5, [r0, #3] |
| ; CHECK-ARMV4T-NEXT: ldrb r0, [r0, #5] |
| ; CHECK-ARMV4T-NEXT: strb r0, [r6, #5] |
| ; CHECK-ARMV4T-NEXT: strb r4, [r6, #2] |
| ; CHECK-ARMV4T-NEXT: strb r5, [r6, #3] |
| ; CHECK-ARMV4T-NEXT: strb r1, [r6] |
| ; CHECK-ARMV4T-NEXT: strb r2, [r6, #1] |
| ; CHECK-ARMV4T-NEXT: strb lr, [r6, #4]! |
| ; CHECK-ARMV4T-NEXT: strb r3, [r6, #2] |
| ; CHECK-ARMV4T-NEXT: strb r12, [r6, #3] |
| ; CHECK-ARMV4T-NEXT: pop {r4, r5, r6, lr} |
| ; CHECK-ARMV4T-NEXT: bx lr |
| ; CHECK-ARMV4T-NEXT: .p2align 2 |
| ; CHECK-ARMV4T-NEXT: @ %bb.1: |
| ; CHECK-ARMV4T-NEXT: .LCPI1_0: |
| ; CHECK-ARMV4T-NEXT: .long x_unaligned |
| ; CHECK-ARMV4T-NEXT: .LCPI1_1: |
| ; CHECK-ARMV4T-NEXT: .long y_unaligned |
| ; |
| ; CHECK-ARMV7-LABEL: test_unaligned: |
| ; CHECK-ARMV7: @ %bb.0: @ %entry |
| ; CHECK-ARMV7-NEXT: movw r0, :lower16:x_unaligned |
| ; CHECK-ARMV7-NEXT: movw r2, :lower16:y_unaligned |
| ; CHECK-ARMV7-NEXT: movt r0, :upper16:x_unaligned |
| ; CHECK-ARMV7-NEXT: movt r2, :upper16:y_unaligned |
| ; CHECK-ARMV7-NEXT: ldr r1, [r0] |
| ; CHECK-ARMV7-NEXT: ldr r0, [r0, #4] |
| ; CHECK-ARMV7-NEXT: str r0, [r2, #4] |
| ; CHECK-ARMV7-NEXT: str r1, [r2] |
| ; CHECK-ARMV7-NEXT: bx lr |
| ; |
| ; CHECK-ARMV7-STRICT-LABEL: test_unaligned: |
| ; CHECK-ARMV7-STRICT: @ %bb.0: @ %entry |
| ; CHECK-ARMV7-STRICT-NEXT: .save {r4, r5, r6, lr} |
| ; CHECK-ARMV7-STRICT-NEXT: push {r4, r5, r6, lr} |
| ; CHECK-ARMV7-STRICT-NEXT: movw r0, :lower16:x_unaligned |
| ; CHECK-ARMV7-STRICT-NEXT: movw r6, :lower16:y_unaligned |
| ; CHECK-ARMV7-STRICT-NEXT: movt r0, :upper16:x_unaligned |
| ; CHECK-ARMV7-STRICT-NEXT: movt r6, :upper16:y_unaligned |
| ; CHECK-ARMV7-STRICT-NEXT: mov r1, r0 |
| ; CHECK-ARMV7-STRICT-NEXT: ldrb r12, [r1, #4]! |
| ; CHECK-ARMV7-STRICT-NEXT: ldrb r3, [r0] |
| ; CHECK-ARMV7-STRICT-NEXT: ldrb lr, [r0, #1] |
| ; CHECK-ARMV7-STRICT-NEXT: ldrb r2, [r0, #2] |
| ; CHECK-ARMV7-STRICT-NEXT: ldrb r4, [r0, #3] |
| ; CHECK-ARMV7-STRICT-NEXT: ldrb r0, [r0, #5] |
| ; CHECK-ARMV7-STRICT-NEXT: ldrb r5, [r1, #2] |
| ; CHECK-ARMV7-STRICT-NEXT: ldrb r1, [r1, #3] |
| ; CHECK-ARMV7-STRICT-NEXT: strb r0, [r6, #5] |
| ; CHECK-ARMV7-STRICT-NEXT: strb r2, [r6, #2] |
| ; CHECK-ARMV7-STRICT-NEXT: strb r4, [r6, #3] |
| ; CHECK-ARMV7-STRICT-NEXT: strb r3, [r6] |
| ; CHECK-ARMV7-STRICT-NEXT: strb lr, [r6, #1] |
| ; CHECK-ARMV7-STRICT-NEXT: strb r12, [r6, #4]! |
| ; CHECK-ARMV7-STRICT-NEXT: strb r5, [r6, #2] |
| ; CHECK-ARMV7-STRICT-NEXT: strb r1, [r6, #3] |
| ; CHECK-ARMV7-STRICT-NEXT: pop {r4, r5, r6, pc} |
| ; |
| ; CHECK-ARMV6-LABEL: test_unaligned: |
| ; CHECK-ARMV6: @ %bb.0: @ %entry |
| ; CHECK-ARMV6-NEXT: ldr r0, .LCPI1_0 |
| ; CHECK-ARMV6-NEXT: ldr r2, .LCPI1_1 |
| ; CHECK-ARMV6-NEXT: ldr r1, [r0] |
| ; CHECK-ARMV6-NEXT: ldr r0, [r0, #4] |
| ; CHECK-ARMV6-NEXT: str r0, [r2, #4] |
| ; CHECK-ARMV6-NEXT: str r1, [r2] |
| ; CHECK-ARMV6-NEXT: bx lr |
| ; CHECK-ARMV6-NEXT: .p2align 2 |
| ; CHECK-ARMV6-NEXT: @ %bb.1: |
| ; CHECK-ARMV6-NEXT: .LCPI1_0: |
| ; CHECK-ARMV6-NEXT: .long x_unaligned |
| ; CHECK-ARMV6-NEXT: .LCPI1_1: |
| ; CHECK-ARMV6-NEXT: .long y_unaligned |
| ; |
| ; CHECK-ARMV6-STRICT-LABEL: test_unaligned: |
| ; CHECK-ARMV6-STRICT: @ %bb.0: @ %entry |
| ; CHECK-ARMV6-STRICT-NEXT: .save {r4, r5, r6, lr} |
| ; CHECK-ARMV6-STRICT-NEXT: push {r4, r5, r6, lr} |
| ; CHECK-ARMV6-STRICT-NEXT: ldr r0, .LCPI1_0 |
| ; CHECK-ARMV6-STRICT-NEXT: ldr r6, .LCPI1_1 |
| ; CHECK-ARMV6-STRICT-NEXT: mov r1, r0 |
| ; CHECK-ARMV6-STRICT-NEXT: ldrb lr, [r1, #4]! |
| ; CHECK-ARMV6-STRICT-NEXT: ldrb r3, [r1, #2] |
| ; CHECK-ARMV6-STRICT-NEXT: ldrb r12, [r1, #3] |
| ; CHECK-ARMV6-STRICT-NEXT: ldrb r1, [r0] |
| ; CHECK-ARMV6-STRICT-NEXT: ldrb r2, [r0, #1] |
| ; CHECK-ARMV6-STRICT-NEXT: ldrb r4, [r0, #2] |
| ; CHECK-ARMV6-STRICT-NEXT: ldrb r5, [r0, #3] |
| ; CHECK-ARMV6-STRICT-NEXT: ldrb r0, [r0, #5] |
| ; CHECK-ARMV6-STRICT-NEXT: strb r0, [r6, #5] |
| ; CHECK-ARMV6-STRICT-NEXT: strb r4, [r6, #2] |
| ; CHECK-ARMV6-STRICT-NEXT: strb r5, [r6, #3] |
| ; CHECK-ARMV6-STRICT-NEXT: strb r1, [r6] |
| ; CHECK-ARMV6-STRICT-NEXT: strb r2, [r6, #1] |
| ; CHECK-ARMV6-STRICT-NEXT: strb lr, [r6, #4]! |
| ; CHECK-ARMV6-STRICT-NEXT: strb r3, [r6, #2] |
| ; CHECK-ARMV6-STRICT-NEXT: strb r12, [r6, #3] |
| ; CHECK-ARMV6-STRICT-NEXT: pop {r4, r5, r6, pc} |
| ; CHECK-ARMV6-STRICT-NEXT: .p2align 2 |
| ; CHECK-ARMV6-STRICT-NEXT: @ %bb.1: |
| ; CHECK-ARMV6-STRICT-NEXT: .LCPI1_0: |
| ; CHECK-ARMV6-STRICT-NEXT: .long x_unaligned |
| ; CHECK-ARMV6-STRICT-NEXT: .LCPI1_1: |
| ; CHECK-ARMV6-STRICT-NEXT: .long y_unaligned |
| entry: |
| %0 = load volatile i64, ptr @x_unaligned, align 1 |
| store volatile i64 %0, ptr @y_unaligned, align 1 |
| ret void |
| } |
| |
| define void @test_align_4() { |
| ; CHECK-ARMV5TE-LABEL: test_align_4: |
| ; CHECK-ARMV5TE: @ %bb.0: @ %entry |
| ; CHECK-ARMV5TE-NEXT: ldr r0, .LCPI2_0 |
| ; CHECK-ARMV5TE-NEXT: ldr r2, .LCPI2_1 |
| ; CHECK-ARMV5TE-NEXT: ldr r1, [r0] |
| ; CHECK-ARMV5TE-NEXT: ldr r0, [r0, #4] |
| ; CHECK-ARMV5TE-NEXT: str r0, [r2, #4] |
| ; CHECK-ARMV5TE-NEXT: str r1, [r2] |
| ; CHECK-ARMV5TE-NEXT: bx lr |
| ; CHECK-ARMV5TE-NEXT: .p2align 2 |
| ; CHECK-ARMV5TE-NEXT: @ %bb.1: |
| ; CHECK-ARMV5TE-NEXT: .LCPI2_0: |
| ; CHECK-ARMV5TE-NEXT: .long x_aligned_4 |
| ; CHECK-ARMV5TE-NEXT: .LCPI2_1: |
| ; CHECK-ARMV5TE-NEXT: .long y_aligned_4 |
| ; |
| ; CHECK-T2-LABEL: test_align_4: |
| ; CHECK-T2: @ %bb.0: @ %entry |
| ; CHECK-T2-NEXT: movw r0, :lower16:x_aligned_4 |
| ; CHECK-T2-NEXT: movw r2, :lower16:y_aligned_4 |
| ; CHECK-T2-NEXT: movt r0, :upper16:x_aligned_4 |
| ; CHECK-T2-NEXT: movt r2, :upper16:y_aligned_4 |
| ; CHECK-T2-NEXT: ldrd r0, r1, [r0] |
| ; CHECK-T2-NEXT: strd r0, r1, [r2] |
| ; CHECK-T2-NEXT: bx lr |
| ; |
| ; CHECK-ARMV4T-LABEL: test_align_4: |
| ; CHECK-ARMV4T: @ %bb.0: @ %entry |
| ; CHECK-ARMV4T-NEXT: ldr r0, .LCPI2_0 |
| ; CHECK-ARMV4T-NEXT: ldr r2, .LCPI2_1 |
| ; CHECK-ARMV4T-NEXT: ldr r1, [r0] |
| ; CHECK-ARMV4T-NEXT: ldr r0, [r0, #4] |
| ; CHECK-ARMV4T-NEXT: str r0, [r2, #4] |
| ; CHECK-ARMV4T-NEXT: str r1, [r2] |
| ; CHECK-ARMV4T-NEXT: bx lr |
| ; CHECK-ARMV4T-NEXT: .p2align 2 |
| ; CHECK-ARMV4T-NEXT: @ %bb.1: |
| ; CHECK-ARMV4T-NEXT: .LCPI2_0: |
| ; CHECK-ARMV4T-NEXT: .long x_aligned_4 |
| ; CHECK-ARMV4T-NEXT: .LCPI2_1: |
| ; CHECK-ARMV4T-NEXT: .long y_aligned_4 |
| ; |
| ; CHECK-ARMV7-LABEL: test_align_4: |
| ; CHECK-ARMV7: @ %bb.0: @ %entry |
| ; CHECK-ARMV7-NEXT: movw r0, :lower16:x_aligned_4 |
| ; CHECK-ARMV7-NEXT: movw r2, :lower16:y_aligned_4 |
| ; CHECK-ARMV7-NEXT: movt r0, :upper16:x_aligned_4 |
| ; CHECK-ARMV7-NEXT: movt r2, :upper16:y_aligned_4 |
| ; CHECK-ARMV7-NEXT: ldrd r0, r1, [r0] |
| ; CHECK-ARMV7-NEXT: strd r0, r1, [r2] |
| ; CHECK-ARMV7-NEXT: bx lr |
| ; |
| ; CHECK-ARMV7-STRICT-LABEL: test_align_4: |
| ; CHECK-ARMV7-STRICT: @ %bb.0: @ %entry |
| ; CHECK-ARMV7-STRICT-NEXT: movw r0, :lower16:x_aligned_4 |
| ; CHECK-ARMV7-STRICT-NEXT: movw r2, :lower16:y_aligned_4 |
| ; CHECK-ARMV7-STRICT-NEXT: movt r0, :upper16:x_aligned_4 |
| ; CHECK-ARMV7-STRICT-NEXT: movt r2, :upper16:y_aligned_4 |
| ; CHECK-ARMV7-STRICT-NEXT: ldrd r0, r1, [r0] |
| ; CHECK-ARMV7-STRICT-NEXT: strd r0, r1, [r2] |
| ; CHECK-ARMV7-STRICT-NEXT: bx lr |
| ; |
| ; CHECK-ARMV6-LABEL: test_align_4: |
| ; CHECK-ARMV6: @ %bb.0: @ %entry |
| ; CHECK-ARMV6-NEXT: ldr r0, .LCPI2_0 |
| ; CHECK-ARMV6-NEXT: ldr r2, .LCPI2_1 |
| ; CHECK-ARMV6-NEXT: ldrd r0, r1, [r0] |
| ; CHECK-ARMV6-NEXT: strd r0, r1, [r2] |
| ; CHECK-ARMV6-NEXT: bx lr |
| ; CHECK-ARMV6-NEXT: .p2align 2 |
| ; CHECK-ARMV6-NEXT: @ %bb.1: |
| ; CHECK-ARMV6-NEXT: .LCPI2_0: |
| ; CHECK-ARMV6-NEXT: .long x_aligned_4 |
| ; CHECK-ARMV6-NEXT: .LCPI2_1: |
| ; CHECK-ARMV6-NEXT: .long y_aligned_4 |
| ; |
| ; CHECK-ARMV6-STRICT-LABEL: test_align_4: |
| ; CHECK-ARMV6-STRICT: @ %bb.0: @ %entry |
| ; CHECK-ARMV6-STRICT-NEXT: ldr r0, .LCPI2_0 |
| ; CHECK-ARMV6-STRICT-NEXT: ldr r2, .LCPI2_1 |
| ; CHECK-ARMV6-STRICT-NEXT: ldr r1, [r0] |
| ; CHECK-ARMV6-STRICT-NEXT: ldr r0, [r0, #4] |
| ; CHECK-ARMV6-STRICT-NEXT: str r0, [r2, #4] |
| ; CHECK-ARMV6-STRICT-NEXT: str r1, [r2] |
| ; CHECK-ARMV6-STRICT-NEXT: bx lr |
| ; CHECK-ARMV6-STRICT-NEXT: .p2align 2 |
| ; CHECK-ARMV6-STRICT-NEXT: @ %bb.1: |
| ; CHECK-ARMV6-STRICT-NEXT: .LCPI2_0: |
| ; CHECK-ARMV6-STRICT-NEXT: .long x_aligned_4 |
| ; CHECK-ARMV6-STRICT-NEXT: .LCPI2_1: |
| ; CHECK-ARMV6-STRICT-NEXT: .long y_aligned_4 |
| entry: |
| %0 = load volatile i64, ptr @x_aligned_4, align 4 |
| store volatile i64 %0, ptr @y_aligned_4, align 4 |
| ret void |
| } |
| |
| define void @test_offset() { |
| ; CHECK-ARMV5TE-LABEL: test_offset: |
| ; CHECK-ARMV5TE: @ %bb.0: @ %entry |
| ; CHECK-ARMV5TE-NEXT: ldr r0, .LCPI3_0 |
| ; CHECK-ARMV5TE-NEXT: ldr r2, .LCPI3_1 |
| ; CHECK-ARMV5TE-NEXT: ldrd r0, r1, [r0, #-4] |
| ; CHECK-ARMV5TE-NEXT: strd r0, r1, [r2, #-4] |
| ; CHECK-ARMV5TE-NEXT: bx lr |
| ; CHECK-ARMV5TE-NEXT: .p2align 2 |
| ; CHECK-ARMV5TE-NEXT: @ %bb.1: |
| ; CHECK-ARMV5TE-NEXT: .LCPI3_0: |
| ; CHECK-ARMV5TE-NEXT: .long x |
| ; CHECK-ARMV5TE-NEXT: .LCPI3_1: |
| ; CHECK-ARMV5TE-NEXT: .long y |
| ; |
| ; CHECK-T2-LABEL: test_offset: |
| ; CHECK-T2: @ %bb.0: @ %entry |
| ; CHECK-T2-NEXT: movw r0, :lower16:x |
| ; CHECK-T2-NEXT: movw r2, :lower16:y |
| ; CHECK-T2-NEXT: movt r0, :upper16:x |
| ; CHECK-T2-NEXT: movt r2, :upper16:y |
| ; CHECK-T2-NEXT: ldrd r0, r1, [r0, #-4] |
| ; CHECK-T2-NEXT: strd r0, r1, [r2, #-4] |
| ; CHECK-T2-NEXT: bx lr |
| ; |
| ; CHECK-ARMV4T-LABEL: test_offset: |
| ; CHECK-ARMV4T: @ %bb.0: @ %entry |
| ; CHECK-ARMV4T-NEXT: ldr r0, .LCPI3_0 |
| ; CHECK-ARMV4T-NEXT: ldr r2, .LCPI3_1 |
| ; CHECK-ARMV4T-NEXT: ldr r1, [r0, #-4] |
| ; CHECK-ARMV4T-NEXT: ldr r0, [r0] |
| ; CHECK-ARMV4T-NEXT: str r0, [r2] |
| ; CHECK-ARMV4T-NEXT: str r1, [r2, #-4] |
| ; CHECK-ARMV4T-NEXT: bx lr |
| ; CHECK-ARMV4T-NEXT: .p2align 2 |
| ; CHECK-ARMV4T-NEXT: @ %bb.1: |
| ; CHECK-ARMV4T-NEXT: .LCPI3_0: |
| ; CHECK-ARMV4T-NEXT: .long x |
| ; CHECK-ARMV4T-NEXT: .LCPI3_1: |
| ; CHECK-ARMV4T-NEXT: .long y |
| ; |
| ; CHECK-ARMV7-LABEL: test_offset: |
| ; CHECK-ARMV7: @ %bb.0: @ %entry |
| ; CHECK-ARMV7-NEXT: movw r0, :lower16:x |
| ; CHECK-ARMV7-NEXT: movw r2, :lower16:y |
| ; CHECK-ARMV7-NEXT: movt r0, :upper16:x |
| ; CHECK-ARMV7-NEXT: movt r2, :upper16:y |
| ; CHECK-ARMV7-NEXT: ldrd r0, r1, [r0, #-4] |
| ; CHECK-ARMV7-NEXT: strd r0, r1, [r2, #-4] |
| ; CHECK-ARMV7-NEXT: bx lr |
| ; |
| ; CHECK-ARMV7-STRICT-LABEL: test_offset: |
| ; CHECK-ARMV7-STRICT: @ %bb.0: @ %entry |
| ; CHECK-ARMV7-STRICT-NEXT: movw r0, :lower16:x |
| ; CHECK-ARMV7-STRICT-NEXT: movw r2, :lower16:y |
| ; CHECK-ARMV7-STRICT-NEXT: movt r0, :upper16:x |
| ; CHECK-ARMV7-STRICT-NEXT: movt r2, :upper16:y |
| ; CHECK-ARMV7-STRICT-NEXT: ldrd r0, r1, [r0, #-4] |
| ; CHECK-ARMV7-STRICT-NEXT: strd r0, r1, [r2, #-4] |
| ; CHECK-ARMV7-STRICT-NEXT: bx lr |
| ; |
| ; CHECK-ARMV6-LABEL: test_offset: |
| ; CHECK-ARMV6: @ %bb.0: @ %entry |
| ; CHECK-ARMV6-NEXT: ldr r0, .LCPI3_0 |
| ; CHECK-ARMV6-NEXT: ldr r2, .LCPI3_1 |
| ; CHECK-ARMV6-NEXT: ldrd r0, r1, [r0, #-4] |
| ; CHECK-ARMV6-NEXT: strd r0, r1, [r2, #-4] |
| ; CHECK-ARMV6-NEXT: bx lr |
| ; CHECK-ARMV6-NEXT: .p2align 2 |
| ; CHECK-ARMV6-NEXT: @ %bb.1: |
| ; CHECK-ARMV6-NEXT: .LCPI3_0: |
| ; CHECK-ARMV6-NEXT: .long x |
| ; CHECK-ARMV6-NEXT: .LCPI3_1: |
| ; CHECK-ARMV6-NEXT: .long y |
| ; |
| ; CHECK-ARMV6-STRICT-LABEL: test_offset: |
| ; CHECK-ARMV6-STRICT: @ %bb.0: @ %entry |
| ; CHECK-ARMV6-STRICT-NEXT: ldr r0, .LCPI3_0 |
| ; CHECK-ARMV6-STRICT-NEXT: ldr r2, .LCPI3_1 |
| ; CHECK-ARMV6-STRICT-NEXT: ldrd r0, r1, [r0, #-4] |
| ; CHECK-ARMV6-STRICT-NEXT: strd r0, r1, [r2, #-4] |
| ; CHECK-ARMV6-STRICT-NEXT: bx lr |
| ; CHECK-ARMV6-STRICT-NEXT: .p2align 2 |
| ; CHECK-ARMV6-STRICT-NEXT: @ %bb.1: |
| ; CHECK-ARMV6-STRICT-NEXT: .LCPI3_0: |
| ; CHECK-ARMV6-STRICT-NEXT: .long x |
| ; CHECK-ARMV6-STRICT-NEXT: .LCPI3_1: |
| ; CHECK-ARMV6-STRICT-NEXT: .long y |
| entry: |
| %0 = load volatile i64, ptr getelementptr (i8, ptr @x, i32 -4), align 8 |
| store volatile i64 %0, ptr getelementptr (i8, ptr @y, i32 -4), align 8 |
| ret void |
| } |
| |
| define void @test_offset_1() { |
| ; CHECK-ARMV5TE-LABEL: test_offset_1: |
| ; CHECK-ARMV5TE: @ %bb.0: @ %entry |
| ; CHECK-ARMV5TE-NEXT: ldr r0, .LCPI4_0 |
| ; CHECK-ARMV5TE-NEXT: ldr r2, .LCPI4_1 |
| ; CHECK-ARMV5TE-NEXT: ldrd r0, r1, [r0, #255] |
| ; CHECK-ARMV5TE-NEXT: strd r0, r1, [r2, #255] |
| ; CHECK-ARMV5TE-NEXT: bx lr |
| ; CHECK-ARMV5TE-NEXT: .p2align 2 |
| ; CHECK-ARMV5TE-NEXT: @ %bb.1: |
| ; CHECK-ARMV5TE-NEXT: .LCPI4_0: |
| ; CHECK-ARMV5TE-NEXT: .long x |
| ; CHECK-ARMV5TE-NEXT: .LCPI4_1: |
| ; CHECK-ARMV5TE-NEXT: .long y |
| ; |
| ; CHECK-T2-LABEL: test_offset_1: |
| ; CHECK-T2: @ %bb.0: @ %entry |
| ; CHECK-T2-NEXT: movw r0, :lower16:y |
| ; CHECK-T2-NEXT: movw r1, :lower16:x |
| ; CHECK-T2-NEXT: movt r0, :upper16:y |
| ; CHECK-T2-NEXT: movt r1, :upper16:x |
| ; CHECK-T2-NEXT: adds r1, #255 |
| ; CHECK-T2-NEXT: adds r0, #255 |
| ; CHECK-T2-NEXT: ldrd r1, r2, [r1] |
| ; CHECK-T2-NEXT: strd r1, r2, [r0] |
| ; CHECK-T2-NEXT: bx lr |
| ; |
| ; CHECK-ARMV4T-LABEL: test_offset_1: |
| ; CHECK-ARMV4T: @ %bb.0: @ %entry |
| ; CHECK-ARMV4T-NEXT: ldr r0, .LCPI4_0 |
| ; CHECK-ARMV4T-NEXT: ldr r2, .LCPI4_1 |
| ; CHECK-ARMV4T-NEXT: ldr r1, [r0, #255] |
| ; CHECK-ARMV4T-NEXT: ldr r0, [r0, #259] |
| ; CHECK-ARMV4T-NEXT: str r0, [r2, #259] |
| ; CHECK-ARMV4T-NEXT: str r1, [r2, #255] |
| ; CHECK-ARMV4T-NEXT: bx lr |
| ; CHECK-ARMV4T-NEXT: .p2align 2 |
| ; CHECK-ARMV4T-NEXT: @ %bb.1: |
| ; CHECK-ARMV4T-NEXT: .LCPI4_0: |
| ; CHECK-ARMV4T-NEXT: .long x |
| ; CHECK-ARMV4T-NEXT: .LCPI4_1: |
| ; CHECK-ARMV4T-NEXT: .long y |
| ; |
| ; CHECK-ARMV7-LABEL: test_offset_1: |
| ; CHECK-ARMV7: @ %bb.0: @ %entry |
| ; CHECK-ARMV7-NEXT: movw r0, :lower16:x |
| ; CHECK-ARMV7-NEXT: movw r2, :lower16:y |
| ; CHECK-ARMV7-NEXT: movt r0, :upper16:x |
| ; CHECK-ARMV7-NEXT: movt r2, :upper16:y |
| ; CHECK-ARMV7-NEXT: ldrd r0, r1, [r0, #255] |
| ; CHECK-ARMV7-NEXT: strd r0, r1, [r2, #255] |
| ; CHECK-ARMV7-NEXT: bx lr |
| ; |
| ; CHECK-ARMV7-STRICT-LABEL: test_offset_1: |
| ; CHECK-ARMV7-STRICT: @ %bb.0: @ %entry |
| ; CHECK-ARMV7-STRICT-NEXT: movw r0, :lower16:x |
| ; CHECK-ARMV7-STRICT-NEXT: movw r2, :lower16:y |
| ; CHECK-ARMV7-STRICT-NEXT: movt r0, :upper16:x |
| ; CHECK-ARMV7-STRICT-NEXT: movt r2, :upper16:y |
| ; CHECK-ARMV7-STRICT-NEXT: ldrd r0, r1, [r0, #255] |
| ; CHECK-ARMV7-STRICT-NEXT: strd r0, r1, [r2, #255] |
| ; CHECK-ARMV7-STRICT-NEXT: bx lr |
| ; |
| ; CHECK-ARMV6-LABEL: test_offset_1: |
| ; CHECK-ARMV6: @ %bb.0: @ %entry |
| ; CHECK-ARMV6-NEXT: ldr r0, .LCPI4_0 |
| ; CHECK-ARMV6-NEXT: ldr r2, .LCPI4_1 |
| ; CHECK-ARMV6-NEXT: ldrd r0, r1, [r0, #255] |
| ; CHECK-ARMV6-NEXT: strd r0, r1, [r2, #255] |
| ; CHECK-ARMV6-NEXT: bx lr |
| ; CHECK-ARMV6-NEXT: .p2align 2 |
| ; CHECK-ARMV6-NEXT: @ %bb.1: |
| ; CHECK-ARMV6-NEXT: .LCPI4_0: |
| ; CHECK-ARMV6-NEXT: .long x |
| ; CHECK-ARMV6-NEXT: .LCPI4_1: |
| ; CHECK-ARMV6-NEXT: .long y |
| ; |
| ; CHECK-ARMV6-STRICT-LABEL: test_offset_1: |
| ; CHECK-ARMV6-STRICT: @ %bb.0: @ %entry |
| ; CHECK-ARMV6-STRICT-NEXT: ldr r0, .LCPI4_0 |
| ; CHECK-ARMV6-STRICT-NEXT: ldr r2, .LCPI4_1 |
| ; CHECK-ARMV6-STRICT-NEXT: ldrd r0, r1, [r0, #255] |
| ; CHECK-ARMV6-STRICT-NEXT: strd r0, r1, [r2, #255] |
| ; CHECK-ARMV6-STRICT-NEXT: bx lr |
| ; CHECK-ARMV6-STRICT-NEXT: .p2align 2 |
| ; CHECK-ARMV6-STRICT-NEXT: @ %bb.1: |
| ; CHECK-ARMV6-STRICT-NEXT: .LCPI4_0: |
| ; CHECK-ARMV6-STRICT-NEXT: .long x |
| ; CHECK-ARMV6-STRICT-NEXT: .LCPI4_1: |
| ; CHECK-ARMV6-STRICT-NEXT: .long y |
| |
| entry: |
| %0 = load volatile i64, ptr getelementptr (i8, ptr @x, i32 255), align 8 |
| store volatile i64 %0, ptr getelementptr (i8, ptr @y, i32 255), align 8 |
| ret void |
| } |
| |
| define void @test_offset_2() { |
| ; CHECK-ARMV5TE-LABEL: test_offset_2: |
| ; CHECK-ARMV5TE: @ %bb.0: @ %entry |
| ; CHECK-ARMV5TE-NEXT: ldr r0, .LCPI5_0 |
| ; CHECK-ARMV5TE-NEXT: ldr r2, .LCPI5_1 |
| ; CHECK-ARMV5TE-NEXT: add r0, r0, #256 |
| ; CHECK-ARMV5TE-NEXT: add r2, r2, #256 |
| ; CHECK-ARMV5TE-NEXT: ldrd r0, r1, [r0] |
| ; CHECK-ARMV5TE-NEXT: strd r0, r1, [r2] |
| ; CHECK-ARMV5TE-NEXT: bx lr |
| ; CHECK-ARMV5TE-NEXT: .p2align 2 |
| ; CHECK-ARMV5TE-NEXT: @ %bb.1: |
| ; CHECK-ARMV5TE-NEXT: .LCPI5_0: |
| ; CHECK-ARMV5TE-NEXT: .long x |
| ; CHECK-ARMV5TE-NEXT: .LCPI5_1: |
| ; CHECK-ARMV5TE-NEXT: .long y |
| ; |
| ; CHECK-T2-LABEL: test_offset_2: |
| ; CHECK-T2: @ %bb.0: @ %entry |
| ; CHECK-T2-NEXT: movw r0, :lower16:x |
| ; CHECK-T2-NEXT: movw r2, :lower16:y |
| ; CHECK-T2-NEXT: movt r0, :upper16:x |
| ; CHECK-T2-NEXT: movt r2, :upper16:y |
| ; CHECK-T2-NEXT: ldrd r0, r1, [r0, #256] |
| ; CHECK-T2-NEXT: strd r0, r1, [r2, #256] |
| ; CHECK-T2-NEXT: bx lr |
| ; |
| ; CHECK-ARMV4T-LABEL: test_offset_2: |
| ; CHECK-ARMV4T: @ %bb.0: @ %entry |
| ; CHECK-ARMV4T-NEXT: ldr r0, .LCPI5_0 |
| ; CHECK-ARMV4T-NEXT: ldr r2, .LCPI5_1 |
| ; CHECK-ARMV4T-NEXT: ldr r1, [r0, #256] |
| ; CHECK-ARMV4T-NEXT: ldr r0, [r0, #260] |
| ; CHECK-ARMV4T-NEXT: str r0, [r2, #260] |
| ; CHECK-ARMV4T-NEXT: str r1, [r2, #256] |
| ; CHECK-ARMV4T-NEXT: bx lr |
| ; CHECK-ARMV4T-NEXT: .p2align 2 |
| ; CHECK-ARMV4T-NEXT: @ %bb.1: |
| ; CHECK-ARMV4T-NEXT: .LCPI5_0: |
| ; CHECK-ARMV4T-NEXT: .long x |
| ; CHECK-ARMV4T-NEXT: .LCPI5_1: |
| ; CHECK-ARMV4T-NEXT: .long y |
| ; |
| ; CHECK-ARMV7-LABEL: test_offset_2: |
| ; CHECK-ARMV7: @ %bb.0: @ %entry |
| ; CHECK-ARMV7-NEXT: movw r0, :lower16:x |
| ; CHECK-ARMV7-NEXT: movw r2, :lower16:y |
| ; CHECK-ARMV7-NEXT: movt r0, :upper16:x |
| ; CHECK-ARMV7-NEXT: movt r2, :upper16:y |
| ; CHECK-ARMV7-NEXT: add r0, r0, #256 |
| ; CHECK-ARMV7-NEXT: add r2, r2, #256 |
| ; CHECK-ARMV7-NEXT: ldrd r0, r1, [r0] |
| ; CHECK-ARMV7-NEXT: strd r0, r1, [r2] |
| ; CHECK-ARMV7-NEXT: bx lr |
| ; |
| ; CHECK-ARMV7-STRICT-LABEL: test_offset_2: |
| ; CHECK-ARMV7-STRICT: @ %bb.0: @ %entry |
| ; CHECK-ARMV7-STRICT-NEXT: movw r0, :lower16:x |
| ; CHECK-ARMV7-STRICT-NEXT: movw r2, :lower16:y |
| ; CHECK-ARMV7-STRICT-NEXT: movt r0, :upper16:x |
| ; CHECK-ARMV7-STRICT-NEXT: movt r2, :upper16:y |
| ; CHECK-ARMV7-STRICT-NEXT: add r0, r0, #256 |
| ; CHECK-ARMV7-STRICT-NEXT: add r2, r2, #256 |
| ; CHECK-ARMV7-STRICT-NEXT: ldrd r0, r1, [r0] |
| ; CHECK-ARMV7-STRICT-NEXT: strd r0, r1, [r2] |
| ; CHECK-ARMV7-STRICT-NEXT: bx lr |
| ; |
| ; CHECK-ARMV6-LABEL: test_offset_2: |
| ; CHECK-ARMV6: @ %bb.0: @ %entry |
| ; CHECK-ARMV6-NEXT: ldr r0, .LCPI5_0 |
| ; CHECK-ARMV6-NEXT: ldr r2, .LCPI5_1 |
| ; CHECK-ARMV6-NEXT: add r0, r0, #256 |
| ; CHECK-ARMV6-NEXT: add r2, r2, #256 |
| ; CHECK-ARMV6-NEXT: ldrd r0, r1, [r0] |
| ; CHECK-ARMV6-NEXT: strd r0, r1, [r2] |
| ; CHECK-ARMV6-NEXT: bx lr |
| ; CHECK-ARMV6-NEXT: .p2align 2 |
| ; CHECK-ARMV6-NEXT: @ %bb.1: |
| ; CHECK-ARMV6-NEXT: .LCPI5_0: |
| ; CHECK-ARMV6-NEXT: .long x |
| ; CHECK-ARMV6-NEXT: .LCPI5_1: |
| ; CHECK-ARMV6-NEXT: .long y |
| ; |
| ; CHECK-ARMV6-STRICT-LABEL: test_offset_2: |
| ; CHECK-ARMV6-STRICT: @ %bb.0: @ %entry |
| ; CHECK-ARMV6-STRICT-NEXT: ldr r0, .LCPI5_0 |
| ; CHECK-ARMV6-STRICT-NEXT: ldr r2, .LCPI5_1 |
| ; CHECK-ARMV6-STRICT-NEXT: add r0, r0, #256 |
| ; CHECK-ARMV6-STRICT-NEXT: add r2, r2, #256 |
| ; CHECK-ARMV6-STRICT-NEXT: ldrd r0, r1, [r0] |
| ; CHECK-ARMV6-STRICT-NEXT: strd r0, r1, [r2] |
| ; CHECK-ARMV6-STRICT-NEXT: bx lr |
| ; CHECK-ARMV6-STRICT-NEXT: .p2align 2 |
| ; CHECK-ARMV6-STRICT-NEXT: @ %bb.1: |
| ; CHECK-ARMV6-STRICT-NEXT: .LCPI5_0: |
| ; CHECK-ARMV6-STRICT-NEXT: .long x |
| ; CHECK-ARMV6-STRICT-NEXT: .LCPI5_1: |
| ; CHECK-ARMV6-STRICT-NEXT: .long y |
| |
| entry: |
| %0 = load volatile i64, ptr getelementptr (i8, ptr @x, i32 256), align 8 |
| store volatile i64 %0, ptr getelementptr (i8, ptr @y, i32 256), align 8 |
| ret void |
| } |
| |
| define void @test_offset_3() { |
| ; CHECK-ARMV5TE-LABEL: test_offset_3: |
| ; CHECK-ARMV5TE: @ %bb.0: @ %entry |
| ; CHECK-ARMV5TE-NEXT: ldr r0, .LCPI6_0 |
| ; CHECK-ARMV5TE-NEXT: ldr r2, .LCPI6_1 |
| ; CHECK-ARMV5TE-NEXT: add r0, r0, #1020 |
| ; CHECK-ARMV5TE-NEXT: add r2, r2, #1020 |
| ; CHECK-ARMV5TE-NEXT: ldrd r0, r1, [r0] |
| ; CHECK-ARMV5TE-NEXT: strd r0, r1, [r2] |
| ; CHECK-ARMV5TE-NEXT: bx lr |
| ; CHECK-ARMV5TE-NEXT: .p2align 2 |
| ; CHECK-ARMV5TE-NEXT: @ %bb.1: |
| ; CHECK-ARMV5TE-NEXT: .LCPI6_0: |
| ; CHECK-ARMV5TE-NEXT: .long x |
| ; CHECK-ARMV5TE-NEXT: .LCPI6_1: |
| ; CHECK-ARMV5TE-NEXT: .long y |
| ; |
| ; CHECK-T2-LABEL: test_offset_3: |
| ; CHECK-T2: @ %bb.0: @ %entry |
| ; CHECK-T2-NEXT: movw r0, :lower16:x |
| ; CHECK-T2-NEXT: movw r2, :lower16:y |
| ; CHECK-T2-NEXT: movt r0, :upper16:x |
| ; CHECK-T2-NEXT: movt r2, :upper16:y |
| ; CHECK-T2-NEXT: ldrd r0, r1, [r0, #1020] |
| ; CHECK-T2-NEXT: strd r0, r1, [r2, #1020] |
| ; CHECK-T2-NEXT: bx lr |
| ; |
| ; CHECK-ARMV4T-LABEL: test_offset_3: |
| ; CHECK-ARMV4T: @ %bb.0: @ %entry |
| ; CHECK-ARMV4T-NEXT: ldr r0, .LCPI6_0 |
| ; CHECK-ARMV4T-NEXT: ldr r2, .LCPI6_1 |
| ; CHECK-ARMV4T-NEXT: ldr r1, [r0, #1020] |
| ; CHECK-ARMV4T-NEXT: ldr r0, [r0, #1024] |
| ; CHECK-ARMV4T-NEXT: str r0, [r2, #1024] |
| ; CHECK-ARMV4T-NEXT: str r1, [r2, #1020] |
| ; CHECK-ARMV4T-NEXT: bx lr |
| ; CHECK-ARMV4T-NEXT: .p2align 2 |
| ; CHECK-ARMV4T-NEXT: @ %bb.1: |
| ; CHECK-ARMV4T-NEXT: .LCPI6_0: |
| ; CHECK-ARMV4T-NEXT: .long x |
| ; CHECK-ARMV4T-NEXT: .LCPI6_1: |
| ; CHECK-ARMV4T-NEXT: .long y |
| ; |
| ; CHECK-ARMV7-LABEL: test_offset_3: |
| ; CHECK-ARMV7: @ %bb.0: @ %entry |
| ; CHECK-ARMV7-NEXT: movw r0, :lower16:x |
| ; CHECK-ARMV7-NEXT: movw r2, :lower16:y |
| ; CHECK-ARMV7-NEXT: movt r0, :upper16:x |
| ; CHECK-ARMV7-NEXT: movt r2, :upper16:y |
| ; CHECK-ARMV7-NEXT: add r0, r0, #1020 |
| ; CHECK-ARMV7-NEXT: add r2, r2, #1020 |
| ; CHECK-ARMV7-NEXT: ldrd r0, r1, [r0] |
| ; CHECK-ARMV7-NEXT: strd r0, r1, [r2] |
| ; CHECK-ARMV7-NEXT: bx lr |
| ; |
| ; CHECK-ARMV7-STRICT-LABEL: test_offset_3: |
| ; CHECK-ARMV7-STRICT: @ %bb.0: @ %entry |
| ; CHECK-ARMV7-STRICT-NEXT: movw r0, :lower16:x |
| ; CHECK-ARMV7-STRICT-NEXT: movw r2, :lower16:y |
| ; CHECK-ARMV7-STRICT-NEXT: movt r0, :upper16:x |
| ; CHECK-ARMV7-STRICT-NEXT: movt r2, :upper16:y |
| ; CHECK-ARMV7-STRICT-NEXT: add r0, r0, #1020 |
| ; CHECK-ARMV7-STRICT-NEXT: add r2, r2, #1020 |
| ; CHECK-ARMV7-STRICT-NEXT: ldrd r0, r1, [r0] |
| ; CHECK-ARMV7-STRICT-NEXT: strd r0, r1, [r2] |
| ; CHECK-ARMV7-STRICT-NEXT: bx lr |
| ; |
| ; CHECK-ARMV6-LABEL: test_offset_3: |
| ; CHECK-ARMV6: @ %bb.0: @ %entry |
| ; CHECK-ARMV6-NEXT: ldr r0, .LCPI6_0 |
| ; CHECK-ARMV6-NEXT: ldr r2, .LCPI6_1 |
| ; CHECK-ARMV6-NEXT: add r0, r0, #1020 |
| ; CHECK-ARMV6-NEXT: add r2, r2, #1020 |
| ; CHECK-ARMV6-NEXT: ldrd r0, r1, [r0] |
| ; CHECK-ARMV6-NEXT: strd r0, r1, [r2] |
| ; CHECK-ARMV6-NEXT: bx lr |
| ; CHECK-ARMV6-NEXT: .p2align 2 |
| ; CHECK-ARMV6-NEXT: @ %bb.1: |
| ; CHECK-ARMV6-NEXT: .LCPI6_0: |
| ; CHECK-ARMV6-NEXT: .long x |
| ; CHECK-ARMV6-NEXT: .LCPI6_1: |
| ; CHECK-ARMV6-NEXT: .long y |
| ; |
| ; CHECK-ARMV6-STRICT-LABEL: test_offset_3: |
| ; CHECK-ARMV6-STRICT: @ %bb.0: @ %entry |
| ; CHECK-ARMV6-STRICT-NEXT: ldr r0, .LCPI6_0 |
| ; CHECK-ARMV6-STRICT-NEXT: ldr r2, .LCPI6_1 |
| ; CHECK-ARMV6-STRICT-NEXT: add r0, r0, #1020 |
| ; CHECK-ARMV6-STRICT-NEXT: add r2, r2, #1020 |
| ; CHECK-ARMV6-STRICT-NEXT: ldrd r0, r1, [r0] |
| ; CHECK-ARMV6-STRICT-NEXT: strd r0, r1, [r2] |
| ; CHECK-ARMV6-STRICT-NEXT: bx lr |
| ; CHECK-ARMV6-STRICT-NEXT: .p2align 2 |
| ; CHECK-ARMV6-STRICT-NEXT: @ %bb.1: |
| ; CHECK-ARMV6-STRICT-NEXT: .LCPI6_0: |
| ; CHECK-ARMV6-STRICT-NEXT: .long x |
| ; CHECK-ARMV6-STRICT-NEXT: .LCPI6_1: |
| ; CHECK-ARMV6-STRICT-NEXT: .long y |
| |
| entry: |
| %0 = load volatile i64, ptr getelementptr (i8, ptr @x, i32 1020), align 8 |
| store volatile i64 %0, ptr getelementptr (i8, ptr @y, i32 1020), align 8 |
| ret void |
| } |
| |
| define void @test_offset_4() { |
| ; CHECK-ARMV5TE-LABEL: test_offset_4: |
| ; CHECK-ARMV5TE: @ %bb.0: @ %entry |
| ; CHECK-ARMV5TE-NEXT: ldr r0, .LCPI7_0 |
| ; CHECK-ARMV5TE-NEXT: ldr r2, .LCPI7_1 |
| ; CHECK-ARMV5TE-NEXT: add r0, r0, #1024 |
| ; CHECK-ARMV5TE-NEXT: add r2, r2, #1024 |
| ; CHECK-ARMV5TE-NEXT: ldrd r0, r1, [r0] |
| ; CHECK-ARMV5TE-NEXT: strd r0, r1, [r2] |
| ; CHECK-ARMV5TE-NEXT: bx lr |
| ; CHECK-ARMV5TE-NEXT: .p2align 2 |
| ; CHECK-ARMV5TE-NEXT: @ %bb.1: |
| ; CHECK-ARMV5TE-NEXT: .LCPI7_0: |
| ; CHECK-ARMV5TE-NEXT: .long x |
| ; CHECK-ARMV5TE-NEXT: .LCPI7_1: |
| ; CHECK-ARMV5TE-NEXT: .long y |
| ; |
| ; CHECK-T2-LABEL: test_offset_4: |
| ; CHECK-T2: @ %bb.0: @ %entry |
| ; CHECK-T2-NEXT: movw r0, :lower16:y |
| ; CHECK-T2-NEXT: movw r1, :lower16:x |
| ; CHECK-T2-NEXT: movt r0, :upper16:y |
| ; CHECK-T2-NEXT: movt r1, :upper16:x |
| ; CHECK-T2-NEXT: add.w r1, r1, #1024 |
| ; CHECK-T2-NEXT: add.w r0, r0, #1024 |
| ; CHECK-T2-NEXT: ldrd r1, r2, [r1] |
| ; CHECK-T2-NEXT: strd r1, r2, [r0] |
| ; CHECK-T2-NEXT: bx lr |
| ; |
| ; CHECK-ARMV4T-LABEL: test_offset_4: |
| ; CHECK-ARMV4T: @ %bb.0: @ %entry |
| ; CHECK-ARMV4T-NEXT: ldr r0, .LCPI7_0 |
| ; CHECK-ARMV4T-NEXT: ldr r2, .LCPI7_1 |
| ; CHECK-ARMV4T-NEXT: ldr r1, [r0, #1024] |
| ; CHECK-ARMV4T-NEXT: ldr r0, [r0, #1028] |
| ; CHECK-ARMV4T-NEXT: str r0, [r2, #1028] |
| ; CHECK-ARMV4T-NEXT: str r1, [r2, #1024] |
| ; CHECK-ARMV4T-NEXT: bx lr |
| ; CHECK-ARMV4T-NEXT: .p2align 2 |
| ; CHECK-ARMV4T-NEXT: @ %bb.1: |
| ; CHECK-ARMV4T-NEXT: .LCPI7_0: |
| ; CHECK-ARMV4T-NEXT: .long x |
| ; CHECK-ARMV4T-NEXT: .LCPI7_1: |
| ; CHECK-ARMV4T-NEXT: .long y |
| ; |
| ; CHECK-ARMV7-LABEL: test_offset_4: |
| ; CHECK-ARMV7: @ %bb.0: @ %entry |
| ; CHECK-ARMV7-NEXT: movw r0, :lower16:x |
| ; CHECK-ARMV7-NEXT: movw r2, :lower16:y |
| ; CHECK-ARMV7-NEXT: movt r0, :upper16:x |
| ; CHECK-ARMV7-NEXT: movt r2, :upper16:y |
| ; CHECK-ARMV7-NEXT: add r0, r0, #1024 |
| ; CHECK-ARMV7-NEXT: add r2, r2, #1024 |
| ; CHECK-ARMV7-NEXT: ldrd r0, r1, [r0] |
| ; CHECK-ARMV7-NEXT: strd r0, r1, [r2] |
| ; CHECK-ARMV7-NEXT: bx lr |
| ; |
| ; CHECK-ARMV7-STRICT-LABEL: test_offset_4: |
| ; CHECK-ARMV7-STRICT: @ %bb.0: @ %entry |
| ; CHECK-ARMV7-STRICT-NEXT: movw r0, :lower16:x |
| ; CHECK-ARMV7-STRICT-NEXT: movw r2, :lower16:y |
| ; CHECK-ARMV7-STRICT-NEXT: movt r0, :upper16:x |
| ; CHECK-ARMV7-STRICT-NEXT: movt r2, :upper16:y |
| ; CHECK-ARMV7-STRICT-NEXT: add r0, r0, #1024 |
| ; CHECK-ARMV7-STRICT-NEXT: add r2, r2, #1024 |
| ; CHECK-ARMV7-STRICT-NEXT: ldrd r0, r1, [r0] |
| ; CHECK-ARMV7-STRICT-NEXT: strd r0, r1, [r2] |
| ; CHECK-ARMV7-STRICT-NEXT: bx lr |
| ; |
| ; CHECK-ARMV6-LABEL: test_offset_4: |
| ; CHECK-ARMV6: @ %bb.0: @ %entry |
| ; CHECK-ARMV6-NEXT: ldr r0, .LCPI7_0 |
| ; CHECK-ARMV6-NEXT: ldr r2, .LCPI7_1 |
| ; CHECK-ARMV6-NEXT: add r0, r0, #1024 |
| ; CHECK-ARMV6-NEXT: add r2, r2, #1024 |
| ; CHECK-ARMV6-NEXT: ldrd r0, r1, [r0] |
| ; CHECK-ARMV6-NEXT: strd r0, r1, [r2] |
| ; CHECK-ARMV6-NEXT: bx lr |
| ; CHECK-ARMV6-NEXT: .p2align 2 |
| ; CHECK-ARMV6-NEXT: @ %bb.1: |
| ; CHECK-ARMV6-NEXT: .LCPI7_0: |
| ; CHECK-ARMV6-NEXT: .long x |
| ; CHECK-ARMV6-NEXT: .LCPI7_1: |
| ; CHECK-ARMV6-NEXT: .long y |
| ; |
| ; CHECK-ARMV6-STRICT-LABEL: test_offset_4: |
| ; CHECK-ARMV6-STRICT: @ %bb.0: @ %entry |
| ; CHECK-ARMV6-STRICT-NEXT: ldr r0, .LCPI7_0 |
| ; CHECK-ARMV6-STRICT-NEXT: ldr r2, .LCPI7_1 |
| ; CHECK-ARMV6-STRICT-NEXT: add r0, r0, #1024 |
| ; CHECK-ARMV6-STRICT-NEXT: add r2, r2, #1024 |
| ; CHECK-ARMV6-STRICT-NEXT: ldrd r0, r1, [r0] |
| ; CHECK-ARMV6-STRICT-NEXT: strd r0, r1, [r2] |
| ; CHECK-ARMV6-STRICT-NEXT: bx lr |
| ; CHECK-ARMV6-STRICT-NEXT: .p2align 2 |
| ; CHECK-ARMV6-STRICT-NEXT: @ %bb.1: |
| ; CHECK-ARMV6-STRICT-NEXT: .LCPI7_0: |
| ; CHECK-ARMV6-STRICT-NEXT: .long x |
| ; CHECK-ARMV6-STRICT-NEXT: .LCPI7_1: |
| ; CHECK-ARMV6-STRICT-NEXT: .long y |
| |
| entry: |
| %0 = load volatile i64, ptr getelementptr (i8, ptr @x, i32 1024), align 8 |
| store volatile i64 %0, ptr getelementptr (i8, ptr @y, i32 1024), align 8 |
| ret void |
| } |
| |
| define i64 @test_stack() { |
| ; CHECK-ARMV5TE-LABEL: test_stack: |
| ; CHECK-ARMV5TE: @ %bb.0: @ %entry |
| ; CHECK-ARMV5TE-NEXT: .pad #80 |
| ; CHECK-ARMV5TE-NEXT: sub sp, sp, #80 |
| ; CHECK-ARMV5TE-NEXT: mov r1, #0 |
| ; CHECK-ARMV5TE-NEXT: mov r0, #1 |
| ; CHECK-ARMV5TE-NEXT: strd r0, r1, [sp, #8] |
| ; CHECK-ARMV5TE-NEXT: ldrd r0, r1, [sp, #8] |
| ; CHECK-ARMV5TE-NEXT: add sp, sp, #80 |
| ; CHECK-ARMV5TE-NEXT: bx lr |
| ; |
| ; CHECK-T2-LABEL: test_stack: |
| ; CHECK-T2: @ %bb.0: @ %entry |
| ; CHECK-T2-NEXT: .pad #80 |
| ; CHECK-T2-NEXT: sub sp, #80 |
| ; CHECK-T2-NEXT: movs r0, #0 |
| ; CHECK-T2-NEXT: movs r1, #1 |
| ; CHECK-T2-NEXT: strd r1, r0, [sp, #8] |
| ; CHECK-T2-NEXT: ldrd r0, r1, [sp, #8] |
| ; CHECK-T2-NEXT: add sp, #80 |
| ; CHECK-T2-NEXT: bx lr |
| ; |
| ; CHECK-ARMV4T-LABEL: test_stack: |
| ; CHECK-ARMV4T: @ %bb.0: @ %entry |
| ; CHECK-ARMV4T-NEXT: .pad #80 |
| ; CHECK-ARMV4T-NEXT: sub sp, sp, #80 |
| ; CHECK-ARMV4T-NEXT: mov r0, #0 |
| ; CHECK-ARMV4T-NEXT: str r0, [sp, #12] |
| ; CHECK-ARMV4T-NEXT: mov r0, #1 |
| ; CHECK-ARMV4T-NEXT: str r0, [sp, #8] |
| ; CHECK-ARMV4T-NEXT: ldr r0, [sp, #8] |
| ; CHECK-ARMV4T-NEXT: ldr r1, [sp, #12] |
| ; CHECK-ARMV4T-NEXT: add sp, sp, #80 |
| ; CHECK-ARMV4T-NEXT: bx lr |
| ; |
| ; CHECK-ARMV7-LABEL: test_stack: |
| ; CHECK-ARMV7: @ %bb.0: @ %entry |
| ; CHECK-ARMV7-NEXT: .pad #80 |
| ; CHECK-ARMV7-NEXT: sub sp, sp, #80 |
| ; CHECK-ARMV7-NEXT: mov r1, #0 |
| ; CHECK-ARMV7-NEXT: mov r0, #1 |
| ; CHECK-ARMV7-NEXT: strd r0, r1, [sp, #8] |
| ; CHECK-ARMV7-NEXT: ldrd r0, r1, [sp, #8] |
| ; CHECK-ARMV7-NEXT: add sp, sp, #80 |
| ; CHECK-ARMV7-NEXT: bx lr |
| ; |
| ; CHECK-ARMV7-STRICT-LABEL: test_stack: |
| ; CHECK-ARMV7-STRICT: @ %bb.0: @ %entry |
| ; CHECK-ARMV7-STRICT-NEXT: .pad #80 |
| ; CHECK-ARMV7-STRICT-NEXT: sub sp, sp, #80 |
| ; CHECK-ARMV7-STRICT-NEXT: mov r1, #0 |
| ; CHECK-ARMV7-STRICT-NEXT: mov r0, #1 |
| ; CHECK-ARMV7-STRICT-NEXT: strd r0, r1, [sp, #8] |
| ; CHECK-ARMV7-STRICT-NEXT: ldrd r0, r1, [sp, #8] |
| ; CHECK-ARMV7-STRICT-NEXT: add sp, sp, #80 |
| ; CHECK-ARMV7-STRICT-NEXT: bx lr |
| ; |
| ; CHECK-ARMV6-LABEL: test_stack: |
| ; CHECK-ARMV6: @ %bb.0: @ %entry |
| ; CHECK-ARMV6-NEXT: .pad #80 |
| ; CHECK-ARMV6-NEXT: sub sp, sp, #80 |
| ; CHECK-ARMV6-NEXT: mov r1, #0 |
| ; CHECK-ARMV6-NEXT: mov r0, #1 |
| ; CHECK-ARMV6-NEXT: strd r0, r1, [sp, #8] |
| ; CHECK-ARMV6-NEXT: ldrd r0, r1, [sp, #8] |
| ; CHECK-ARMV6-NEXT: add sp, sp, #80 |
| ; CHECK-ARMV6-NEXT: bx lr |
| ; |
| ; CHECK-ARMV6-STRICT-LABEL: test_stack: |
| ; CHECK-ARMV6-STRICT: @ %bb.0: @ %entry |
| ; CHECK-ARMV6-STRICT-NEXT: .pad #80 |
| ; CHECK-ARMV6-STRICT-NEXT: sub sp, sp, #80 |
| ; CHECK-ARMV6-STRICT-NEXT: mov r1, #0 |
| ; CHECK-ARMV6-STRICT-NEXT: mov r0, #1 |
| ; CHECK-ARMV6-STRICT-NEXT: strd r0, r1, [sp, #8] |
| ; CHECK-ARMV6-STRICT-NEXT: ldrd r0, r1, [sp, #8] |
| ; CHECK-ARMV6-STRICT-NEXT: add sp, sp, #80 |
| ; CHECK-ARMV6-STRICT-NEXT: bx lr |
| |
| entry: |
| %a = alloca [10 x i64], align 8 |
| %arrayidx = getelementptr inbounds [10 x i64], ptr %a, i32 0, i32 1 |
| store volatile i64 1, ptr %arrayidx, align 8 |
| %arrayidx1 = getelementptr inbounds [10 x i64], ptr %a, i32 0, i32 1 |
| %0 = load volatile i64, ptr %arrayidx1, align 8 |
| ret i64 %0 |
| } |
| |