blob: bf8c05badd83f3b319f22e7a3a2a87c173d51b32 [file] [edit]
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
; RUN: opt -S -mtriple=mips64-mti-linux-gnu -passes='require<libcall-lowering-info>,atomic-expand' %s | FileCheck %s
define <2 x i16> @test_atomicrmw_add_v2i16(ptr %ptr, <2 x i16> %value) {
; CHECK-LABEL: @test_atomicrmw_add_v2i16(
; CHECK-NEXT: fence seq_cst
; CHECK-NEXT: [[TMP1:%.*]] = load atomic <2 x i16>, ptr [[PTR:%.*]] monotonic, align 4
; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]]
; CHECK: atomicrmw.start:
; CHECK-NEXT: [[LOADED:%.*]] = phi <2 x i16> [ [[TMP1]], [[TMP0:%.*]] ], [ [[TMP5:%.*]], [[ATOMICRMW_START]] ]
; CHECK-NEXT: [[NEW:%.*]] = add <2 x i16> [[LOADED]], [[VALUE:%.*]]
; CHECK-NEXT: [[TMP2:%.*]] = bitcast <2 x i16> [[NEW]] to i32
; CHECK-NEXT: [[TMP3:%.*]] = bitcast <2 x i16> [[LOADED]] to i32
; CHECK-NEXT: [[TMP4:%.*]] = cmpxchg ptr [[PTR]], i32 [[TMP3]], i32 [[TMP2]] monotonic monotonic, align 4
; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP4]], 1
; CHECK-NEXT: [[NEWLOADED:%.*]] = extractvalue { i32, i1 } [[TMP4]], 0
; CHECK-NEXT: [[TMP5]] = bitcast i32 [[NEWLOADED]] to <2 x i16>
; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]
; CHECK: atomicrmw.end:
; CHECK-NEXT: fence seq_cst
; CHECK-NEXT: ret <2 x i16> [[TMP5]]
;
%res = atomicrmw add ptr %ptr, <2 x i16> %value seq_cst
ret <2 x i16> %res
}
define <2 x i16> @test_atomicrmw_xchg_v2i16(ptr %ptr, <2 x i16> %value) {
; CHECK-LABEL: @test_atomicrmw_xchg_v2i16(
; CHECK-NEXT: [[TMP1:%.*]] = bitcast <2 x i16> [[VALUE:%.*]] to i32
; CHECK-NEXT: [[TMP2:%.*]] = atomicrmw xchg ptr [[PTR:%.*]], i32 [[TMP1]] monotonic, align 4
; CHECK-NEXT: [[TMP3:%.*]] = bitcast i32 [[TMP2]] to <2 x i16>
; CHECK-NEXT: ret <2 x i16> [[TMP3]]
;
%res = atomicrmw xchg ptr %ptr, <2 x i16> %value monotonic
ret <2 x i16> %res
}
define <2 x half> @test_atomicrmw_xchg_v2f16(ptr %ptr, <2 x half> %value) {
; CHECK-LABEL: @test_atomicrmw_xchg_v2f16(
; CHECK-NEXT: [[TMP1:%.*]] = bitcast <2 x half> [[VALUE:%.*]] to i32
; CHECK-NEXT: [[TMP2:%.*]] = atomicrmw xchg ptr [[PTR:%.*]], i32 [[TMP1]] monotonic, align 4
; CHECK-NEXT: [[TMP3:%.*]] = bitcast i32 [[TMP2]] to <2 x half>
; CHECK-NEXT: ret <2 x half> [[TMP3]]
;
%res = atomicrmw xchg ptr %ptr, <2 x half> %value monotonic
ret <2 x half> %res
}
define <2 x ptr> @test_atomicrmw_xchg_v2p0(ptr %ptr, <2 x ptr> %value) {
; CHECK-LABEL: @test_atomicrmw_xchg_v2p0(
; CHECK-NEXT: [[TMP1:%.*]] = ptrtoint <2 x ptr> [[VALUE:%.*]] to <2 x i64>
; CHECK-NEXT: [[TMP2:%.*]] = bitcast <2 x i64> [[TMP1]] to i128
; CHECK-NEXT: [[TMP3:%.*]] = call i128 @__atomic_exchange_16(ptr [[PTR:%.*]], i128 [[TMP2]], i32 0)
; CHECK-NEXT: [[TMP4:%.*]] = bitcast i128 [[TMP3]] to <2 x i64>
; CHECK-NEXT: [[TMP5:%.*]] = inttoptr <2 x i64> [[TMP4]] to <2 x ptr>
; CHECK-NEXT: ret <2 x ptr> [[TMP5]]
;
%res = atomicrmw xchg ptr %ptr, <2 x ptr> %value monotonic
ret <2 x ptr> %res
}