[ORC] Add std::tuple support to SimplePackedSerialization.
[llvm-project.git] / llvm / test / Transforms / AtomicExpand / AArch64 / expand-atomicrmw-xchg-fp.ll
blob065878223e6a7fd8a116b539219c542b05c25ba3
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2 ; RUN: opt -O1 -S -mtriple=aarch64-- -atomic-expand %s | FileCheck %s
3 ; RUN: opt -O1 -S -mtriple=aarch64-- -mattr=+outline-atomics -atomic-expand %s | FileCheck %s --check-prefix=OUTLINE-ATOMICS
5 define void @atomic_swap_f16(half* %ptr, half %val) nounwind {
6 ; CHECK-LABEL: @atomic_swap_f16(
7 ; CHECK-NEXT:    [[TMP1:%.*]] = bitcast half* [[PTR:%.*]] to i16*
8 ; CHECK-NEXT:    [[TMP2:%.*]] = bitcast half [[VAL:%.*]] to i16
9 ; CHECK-NEXT:    br label [[ATOMICRMW_START:%.*]]
10 ; CHECK:       atomicrmw.start:
11 ; CHECK-NEXT:    [[TMP3:%.*]] = call i64 @llvm.aarch64.ldaxr.p0i16(i16* [[TMP1]])
12 ; CHECK-NEXT:    [[TMP4:%.*]] = trunc i64 [[TMP3]] to i16
13 ; CHECK-NEXT:    [[TMP5:%.*]] = zext i16 [[TMP2]] to i64
14 ; CHECK-NEXT:    [[TMP6:%.*]] = call i32 @llvm.aarch64.stxr.p0i16(i64 [[TMP5]], i16* [[TMP1]])
15 ; CHECK-NEXT:    [[TRYAGAIN:%.*]] = icmp ne i32 [[TMP6]], 0
16 ; CHECK-NEXT:    br i1 [[TRYAGAIN]], label [[ATOMICRMW_START]], label [[ATOMICRMW_END:%.*]]
17 ; CHECK:       atomicrmw.end:
18 ; CHECK-NEXT:    [[TMP7:%.*]] = bitcast i16 [[TMP4]] to half
19 ; CHECK-NEXT:    ret void
21 ; OUTLINE-ATOMICS-LABEL: @atomic_swap_f16(
22 ; OUTLINE-ATOMICS-NEXT:    [[TMP1:%.*]] = bitcast half* [[PTR:%.*]] to i16*
23 ; OUTLINE-ATOMICS-NEXT:    [[TMP2:%.*]] = bitcast half [[VAL:%.*]] to i16
24 ; OUTLINE-ATOMICS-NEXT:    [[TMP3:%.*]] = atomicrmw xchg i16* [[TMP1]], i16 [[TMP2]] acquire, align 2
25 ; OUTLINE-ATOMICS-NEXT:    [[TMP4:%.*]] = bitcast i16 [[TMP3]] to half
26 ; OUTLINE-ATOMICS-NEXT:    ret void
28   %t1 = atomicrmw xchg half* %ptr, half %val acquire
29   ret void
32 define void @atomic_swap_f32(float* %ptr, float %val) nounwind {
33 ; CHECK-LABEL: @atomic_swap_f32(
34 ; CHECK-NEXT:    [[TMP1:%.*]] = bitcast float* [[PTR:%.*]] to i32*
35 ; CHECK-NEXT:    [[TMP2:%.*]] = bitcast float [[VAL:%.*]] to i32
36 ; CHECK-NEXT:    br label [[ATOMICRMW_START:%.*]]
37 ; CHECK:       atomicrmw.start:
38 ; CHECK-NEXT:    [[TMP3:%.*]] = call i64 @llvm.aarch64.ldaxr.p0i32(i32* [[TMP1]])
39 ; CHECK-NEXT:    [[TMP4:%.*]] = trunc i64 [[TMP3]] to i32
40 ; CHECK-NEXT:    [[TMP5:%.*]] = zext i32 [[TMP2]] to i64
41 ; CHECK-NEXT:    [[TMP6:%.*]] = call i32 @llvm.aarch64.stxr.p0i32(i64 [[TMP5]], i32* [[TMP1]])
42 ; CHECK-NEXT:    [[TRYAGAIN:%.*]] = icmp ne i32 [[TMP6]], 0
43 ; CHECK-NEXT:    br i1 [[TRYAGAIN]], label [[ATOMICRMW_START]], label [[ATOMICRMW_END:%.*]]
44 ; CHECK:       atomicrmw.end:
45 ; CHECK-NEXT:    [[TMP7:%.*]] = bitcast i32 [[TMP4]] to float
46 ; CHECK-NEXT:    ret void
48 ; OUTLINE-ATOMICS-LABEL: @atomic_swap_f32(
49 ; OUTLINE-ATOMICS-NEXT:    [[TMP1:%.*]] = bitcast float* [[PTR:%.*]] to i32*
50 ; OUTLINE-ATOMICS-NEXT:    [[TMP2:%.*]] = bitcast float [[VAL:%.*]] to i32
51 ; OUTLINE-ATOMICS-NEXT:    [[TMP3:%.*]] = atomicrmw xchg i32* [[TMP1]], i32 [[TMP2]] acquire, align 4
52 ; OUTLINE-ATOMICS-NEXT:    [[TMP4:%.*]] = bitcast i32 [[TMP3]] to float
53 ; OUTLINE-ATOMICS-NEXT:    ret void
55   %t1 = atomicrmw xchg float* %ptr, float %val acquire
56   ret void
59 define void @atomic_swap_f64(double* %ptr, double %val) nounwind {
60 ; CHECK-LABEL: @atomic_swap_f64(
61 ; CHECK-NEXT:    [[TMP1:%.*]] = bitcast double* [[PTR:%.*]] to i64*
62 ; CHECK-NEXT:    [[TMP2:%.*]] = bitcast double [[VAL:%.*]] to i64
63 ; CHECK-NEXT:    br label [[ATOMICRMW_START:%.*]]
64 ; CHECK:       atomicrmw.start:
65 ; CHECK-NEXT:    [[TMP3:%.*]] = call i64 @llvm.aarch64.ldaxr.p0i64(i64* [[TMP1]])
66 ; CHECK-NEXT:    [[TMP4:%.*]] = call i32 @llvm.aarch64.stxr.p0i64(i64 [[TMP2]], i64* [[TMP1]])
67 ; CHECK-NEXT:    [[TRYAGAIN:%.*]] = icmp ne i32 [[TMP4]], 0
68 ; CHECK-NEXT:    br i1 [[TRYAGAIN]], label [[ATOMICRMW_START]], label [[ATOMICRMW_END:%.*]]
69 ; CHECK:       atomicrmw.end:
70 ; CHECK-NEXT:    [[TMP5:%.*]] = bitcast i64 [[TMP3]] to double
71 ; CHECK-NEXT:    ret void
73 ; OUTLINE-ATOMICS-LABEL: @atomic_swap_f64(
74 ; OUTLINE-ATOMICS-NEXT:    [[TMP1:%.*]] = bitcast double* [[PTR:%.*]] to i64*
75 ; OUTLINE-ATOMICS-NEXT:    [[TMP2:%.*]] = bitcast double [[VAL:%.*]] to i64
76 ; OUTLINE-ATOMICS-NEXT:    [[TMP3:%.*]] = atomicrmw xchg i64* [[TMP1]], i64 [[TMP2]] acquire, align 8
77 ; OUTLINE-ATOMICS-NEXT:    [[TMP4:%.*]] = bitcast i64 [[TMP3]] to double
78 ; OUTLINE-ATOMICS-NEXT:    ret void
80   %t1 = atomicrmw xchg double* %ptr, double %val acquire
81   ret void