forked from OSchip/llvm-project
195 lines
5.8 KiB
LLVM
195 lines
5.8 KiB
LLVM
; RUN: llc -mtriple=aarch64-linux-gnu -mattr=+v8.4a %s -o - | FileCheck %s
|
|
; RUN: llc -mtriple=aarch64-linux-gnu -mattr=+lse2 %s -o - | FileCheck %s
|
|
|
|
define void @test_atomic_load(i128* %addr) {
|
|
; CHECK-LABEL: test_atomic_load:
|
|
|
|
; CHECK: ldp [[LO:x[0-9]+]], [[HI:x[0-9]+]], [x0]
|
|
; CHECK: stp [[LO]], [[HI]], [x0]
|
|
%res.0 = load atomic i128, i128* %addr monotonic, align 16
|
|
store i128 %res.0, i128* %addr
|
|
|
|
; CHECK: ldp [[LO:x[0-9]+]], [[HI:x[0-9]+]], [x0]
|
|
; CHECK: stp [[LO]], [[HI]], [x0]
|
|
%res.1 = load atomic i128, i128* %addr unordered, align 16
|
|
store i128 %res.1, i128* %addr
|
|
|
|
; CHECK: ldp [[LO:x[0-9]+]], [[HI:x[0-9]+]], [x0]
|
|
; CHECK: dmb ish
|
|
; CHECK: stp [[LO]], [[HI]], [x0]
|
|
%res.2 = load atomic i128, i128* %addr acquire, align 16
|
|
store i128 %res.2, i128* %addr
|
|
|
|
; CHECK: ldp [[LO:x[0-9]+]], [[HI:x[0-9]+]], [x0]
|
|
; CHECK: dmb ish
|
|
; CHECK: stp [[LO]], [[HI]], [x0]
|
|
%res.3 = load atomic i128, i128* %addr seq_cst, align 16
|
|
store i128 %res.3, i128* %addr
|
|
|
|
|
|
%addr8 = bitcast i128* %addr to i8*
|
|
|
|
; CHECK: ldp [[LO:x[0-9]+]], [[HI:x[0-9]+]], [x0, #32]
|
|
; CHECK-DAG: stp [[LO]], [[HI]], [x0]
|
|
%addr8.1 = getelementptr i8, i8* %addr8, i32 32
|
|
%addr128.1 = bitcast i8* %addr8.1 to i128*
|
|
%res.5 = load atomic i128, i128* %addr128.1 monotonic, align 16
|
|
store i128 %res.5, i128* %addr
|
|
|
|
; CHECK: ldp [[LO:x[0-9]+]], [[HI:x[0-9]+]], [x0, #504]
|
|
; CHECK: stp [[LO]], [[HI]], [x0]
|
|
%addr8.2 = getelementptr i8, i8* %addr8, i32 504
|
|
%addr128.2 = bitcast i8* %addr8.2 to i128*
|
|
%res.6 = load atomic i128, i128* %addr128.2 monotonic, align 16
|
|
store i128 %res.6, i128* %addr
|
|
|
|
; CHECK: ldp [[LO:x[0-9]+]], [[HI:x[0-9]+]], [x0, #-512]
|
|
; CHECK: stp [[LO]], [[HI]], [x0]
|
|
%addr8.3 = getelementptr i8, i8* %addr8, i32 -512
|
|
%addr128.3 = bitcast i8* %addr8.3 to i128*
|
|
%res.7 = load atomic i128, i128* %addr128.3 monotonic, align 16
|
|
store i128 %res.7, i128* %addr
|
|
|
|
ret void
|
|
}
|
|
|
|
define void @test_libcall_load(i128* %addr) {
|
|
; CHECK-LABEL: test_libcall_load:
|
|
; CHECK: bl __atomic_load
|
|
%res.8 = load atomic i128, i128* %addr unordered, align 8
|
|
store i128 %res.8, i128* %addr
|
|
|
|
ret void
|
|
}
|
|
|
|
define void @test_nonfolded_load1(i128* %addr) {
|
|
; CHECK-LABEL: test_nonfolded_load1:
|
|
%addr8 = bitcast i128* %addr to i8*
|
|
|
|
; CHECK: add x[[ADDR:[0-9]+]], x0, #4
|
|
; CHECK: ldp [[LO:x[0-9]+]], [[HI:x[0-9]+]], [x[[ADDR]]]
|
|
; CHECK: stp [[LO]], [[HI]], [x0]
|
|
%addr8.1 = getelementptr i8, i8* %addr8, i32 4
|
|
%addr128.1 = bitcast i8* %addr8.1 to i128*
|
|
%res.1 = load atomic i128, i128* %addr128.1 monotonic, align 16
|
|
store i128 %res.1, i128* %addr
|
|
|
|
ret void
|
|
}
|
|
|
|
define void @test_nonfolded_load2(i128* %addr) {
|
|
; CHECK-LABEL: test_nonfolded_load2:
|
|
%addr8 = bitcast i128* %addr to i8*
|
|
|
|
; CHECK: add x[[ADDR:[0-9]+]], x0, #512
|
|
; CHECK: ldp [[LO:x[0-9]+]], [[HI:x[0-9]+]], [x[[ADDR]]]
|
|
; CHECK: stp [[LO]], [[HI]], [x0]
|
|
%addr8.1 = getelementptr i8, i8* %addr8, i32 512
|
|
%addr128.1 = bitcast i8* %addr8.1 to i128*
|
|
%res.1 = load atomic i128, i128* %addr128.1 monotonic, align 16
|
|
store i128 %res.1, i128* %addr
|
|
|
|
ret void
|
|
}
|
|
|
|
define void @test_nonfolded_load3(i128* %addr) {
|
|
; CHECK-LABEL: test_nonfolded_load3:
|
|
%addr8 = bitcast i128* %addr to i8*
|
|
|
|
; CHECK: sub x[[ADDR:[0-9]+]], x0, #520
|
|
; CHECK: ldp [[LO:x[0-9]+]], [[HI:x[0-9]+]], [x[[ADDR]]]
|
|
; CHECK: stp [[LO]], [[HI]], [x0]
|
|
%addr8.1 = getelementptr i8, i8* %addr8, i32 -520
|
|
%addr128.1 = bitcast i8* %addr8.1 to i128*
|
|
%res.1 = load atomic i128, i128* %addr128.1 monotonic, align 16
|
|
store i128 %res.1, i128* %addr
|
|
|
|
ret void
|
|
}
|
|
|
|
define void @test_atomic_store(i128* %addr, i128 %val) {
|
|
; CHECK-LABEL: test_atomic_store:
|
|
|
|
; CHECK: stp x2, x3, [x0]
|
|
store atomic i128 %val, i128* %addr monotonic, align 16
|
|
|
|
; CHECK: stp x2, x3, [x0]
|
|
store atomic i128 %val, i128* %addr unordered, align 16
|
|
|
|
; CHECK: dmb ish
|
|
; CHECK: stp x2, x3, [x0]
|
|
store atomic i128 %val, i128* %addr release, align 16
|
|
|
|
; CHECK: dmb ish
|
|
; CHECK: stp x2, x3, [x0]
|
|
; CHECK: dmb ish
|
|
store atomic i128 %val, i128* %addr seq_cst, align 16
|
|
|
|
|
|
%addr8 = bitcast i128* %addr to i8*
|
|
|
|
; CHECK: stp x2, x3, [x0, #8]
|
|
%addr8.1 = getelementptr i8, i8* %addr8, i32 8
|
|
%addr128.1 = bitcast i8* %addr8.1 to i128*
|
|
store atomic i128 %val, i128* %addr128.1 monotonic, align 16
|
|
|
|
; CHECK: stp x2, x3, [x0, #504]
|
|
%addr8.2 = getelementptr i8, i8* %addr8, i32 504
|
|
%addr128.2 = bitcast i8* %addr8.2 to i128*
|
|
store atomic i128 %val, i128* %addr128.2 monotonic, align 16
|
|
|
|
; CHECK: stp x2, x3, [x0, #-512]
|
|
%addr8.3 = getelementptr i8, i8* %addr8, i32 -512
|
|
%addr128.3 = bitcast i8* %addr8.3 to i128*
|
|
store atomic i128 %val, i128* %addr128.3 monotonic, align 16
|
|
|
|
ret void
|
|
}
|
|
|
|
define void @test_libcall_store(i128* %addr, i128 %val) {
|
|
; CHECK-LABEL: test_libcall_store:
|
|
; CHECK: bl __atomic_store
|
|
store atomic i128 %val, i128* %addr unordered, align 8
|
|
|
|
ret void
|
|
}
|
|
|
|
define void @test_nonfolded_store1(i128* %addr, i128 %val) {
|
|
; CHECK-LABEL: test_nonfolded_store1:
|
|
%addr8 = bitcast i128* %addr to i8*
|
|
|
|
; CHECK: add x[[ADDR:[0-9]+]], x0, #4
|
|
; CHECK: stp x2, x3, [x[[ADDR]]]
|
|
%addr8.1 = getelementptr i8, i8* %addr8, i32 4
|
|
%addr128.1 = bitcast i8* %addr8.1 to i128*
|
|
store atomic i128 %val, i128* %addr128.1 monotonic, align 16
|
|
|
|
ret void
|
|
}
|
|
|
|
define void @test_nonfolded_store2(i128* %addr, i128 %val) {
|
|
; CHECK-LABEL: test_nonfolded_store2:
|
|
%addr8 = bitcast i128* %addr to i8*
|
|
|
|
; CHECK: add x[[ADDR:[0-9]+]], x0, #512
|
|
; CHECK: stp x2, x3, [x[[ADDR]]]
|
|
%addr8.1 = getelementptr i8, i8* %addr8, i32 512
|
|
%addr128.1 = bitcast i8* %addr8.1 to i128*
|
|
store atomic i128 %val, i128* %addr128.1 monotonic, align 16
|
|
|
|
ret void
|
|
}
|
|
|
|
define void @test_nonfolded_store3(i128* %addr, i128 %val) {
|
|
; CHECK-LABEL: test_nonfolded_store3:
|
|
%addr8 = bitcast i128* %addr to i8*
|
|
|
|
; CHECK: sub x[[ADDR:[0-9]+]], x0, #520
|
|
; CHECK: stp x2, x3, [x[[ADDR]]]
|
|
%addr8.1 = getelementptr i8, i8* %addr8, i32 -520
|
|
%addr128.1 = bitcast i8* %addr8.1 to i128*
|
|
store atomic i128 %val, i128* %addr128.1 monotonic, align 16
|
|
|
|
ret void
|
|
}
|