; RUN: llc < %s -march=nvptx64 -mcpu=sm_30 | FileCheck %s --check-prefixes=ALL,SM30 ; RUN: llc < %s -march=nvptx64 -mcpu=sm_60 | FileCheck %s --check-prefixes=ALL,SM60 ; RUN: %if ptxas %{ llc < %s -march=nvptx64 -mcpu=sm_30 | %ptxas-verify %} ; RUN: %if ptxas %{ llc < %s -march=nvptx64 -mcpu=sm_60 | %ptxas-verify %} ; CHECK-LABEL: fadd_double define void @fadd_double(ptr %0, double %1) { entry: ; SM30: atom.cas.b64 ; SM60: atom.add.f64 %2 = atomicrmw fadd ptr %0, double %1 monotonic, align 8 ret void } ; CHECK-LABEL: fadd_float define void @fadd_float(ptr %0, float %1) { entry: ; ALL: atom.add.f32 %2 = atomicrmw fadd ptr %0, float %1 monotonic, align 4 ret void } ; CHECK-LABEL: bitwise_i32 define void @bitwise_i32(ptr %0, i32 %1) { entry: ; ALL: atom.and.b32 %2 = atomicrmw and ptr %0, i32 %1 monotonic, align 4 ; ALL: atom.or.b32 %3 = atomicrmw or ptr %0, i32 %1 monotonic, align 4 ; ALL: atom.xor.b32 %4 = atomicrmw xor ptr %0, i32 %1 monotonic, align 4 ; ALL: atom.exch.b32 %5 = atomicrmw xchg ptr %0, i32 %1 monotonic, align 4 ret void } ; CHECK-LABEL: bitwise_i64 define void @bitwise_i64(ptr %0, i64 %1) { entry: ; SM30: atom.cas.b64 ; SM60: atom.and.b64 %2 = atomicrmw and ptr %0, i64 %1 monotonic, align 8 ; SM30: atom.cas.b64 ; SM60: atom.or.b64 %3 = atomicrmw or ptr %0, i64 %1 monotonic, align 8 ; SM30: atom.cas.b64 ; SM60: atom.xor.b64 %4 = atomicrmw xor ptr %0, i64 %1 monotonic, align 8 ; SM30: atom.cas.b64 ; SM60: atom.exch.b64 %5 = atomicrmw xchg ptr %0, i64 %1 monotonic, align 8 ret void } ; CHECK-LABEL: minmax_i32 define void @minmax_i32(ptr %0, i32 %1) { entry: ; ALL: atom.min.s32 %2 = atomicrmw min ptr %0, i32 %1 monotonic, align 4 ; ALL: atom.max.s32 %3 = atomicrmw max ptr %0, i32 %1 monotonic, align 4 ; ALL: atom.min.u32 %4 = atomicrmw umin ptr %0, i32 %1 monotonic, align 4 ; ALL: atom.max.u32 %5 = atomicrmw umax ptr %0, i32 %1 monotonic, align 4 ret void } ; CHECK-LABEL: minmax_i64 define void @minmax_i64(ptr %0, i64 %1) { entry: ; SM30: atom.cas.b64 ; SM60: atom.min.s64 %2 = atomicrmw min ptr %0, i64 %1 monotonic, align 8 ; SM30: atom.cas.b64 ; SM60: atom.max.s64 %3 = atomicrmw max ptr %0, i64 %1 monotonic, align 8 ; SM30: atom.cas.b64 ; SM60: atom.min.u64 %4 = atomicrmw umin ptr %0, i64 %1 monotonic, align 8 ; SM30: atom.cas.b64 ; SM60: atom.max.u64 %5 = atomicrmw umax ptr %0, i64 %1 monotonic, align 8 ret void } ; CHECK-LABEL: bitwise_i8 define void @bitwise_i8(ptr %0, i8 %1) { entry: ; ALL: atom.and.b32 %2 = atomicrmw and ptr %0, i8 %1 monotonic, align 1 ; ALL: atom.or.b32 %3 = atomicrmw or ptr %0, i8 %1 monotonic, align 1 ; ALL: atom.xor.b32 %4 = atomicrmw xor ptr %0, i8 %1 monotonic, align 1 ; ALL: atom.cas.b32 %5 = atomicrmw xchg ptr %0, i8 %1 monotonic, align 1 ret void } ; CHECK-LABEL: minmax_i8 define void @minmax_i8(ptr %0, i8 %1) { entry: ; ALL: atom.cas.b32 %2 = atomicrmw min ptr %0, i8 %1 monotonic, align 1 ; ALL: atom.cas.b32 %3 = atomicrmw max ptr %0, i8 %1 monotonic, align 1 ; ALL: atom.cas.b32 %4 = atomicrmw umin ptr %0, i8 %1 monotonic, align 1 ; ALL: atom.cas.b32 %5 = atomicrmw umax ptr %0, i8 %1 monotonic, align 1 ret void } ; CHECK-LABEL: bitwise_i16 define void @bitwise_i16(ptr %0, i16 %1) { entry: ; ALL: atom.and.b32 %2 = atomicrmw and ptr %0, i16 %1 monotonic, align 2 ; ALL: atom.or.b32 %3 = atomicrmw or ptr %0, i16 %1 monotonic, align 2 ; ALL: atom.xor.b32 %4 = atomicrmw xor ptr %0, i16 %1 monotonic, align 2 ; ALL: atom.cas.b32 %5 = atomicrmw xchg ptr %0, i16 %1 monotonic, align 2 ret void } ; CHECK-LABEL: minmax_i16 define void @minmax_i16(ptr %0, i16 %1) { entry: ; ALL: atom.cas.b32 %2 = atomicrmw min ptr %0, i16 %1 monotonic, align 2 ; ALL: atom.cas.b32 %3 = atomicrmw max ptr %0, i16 %1 monotonic, align 2 ; ALL: atom.cas.b32 %4 = atomicrmw umin ptr %0, i16 %1 monotonic, align 2 ; ALL: atom.cas.b32 %5 = atomicrmw umax ptr %0, i16 %1 monotonic, align 2 ret void } ; TODO: We might still want to test other types, such as i128. Currently the ; backend doesn't support them. Atomic expand only supports expansion to cas of ; the same bitwidth, which means even after expansion, the back end still ; doesn't support the instruction. Here we still put the tests. Remove the ; comment once we have proper support, either from atomic expand or backend. ; define void @bitwise_i128(ptr %0, i128 %1) { ; entry: ; %2 = atomicrmw and ptr %0, i128 %1 monotonic, align 16 ; %3 = atomicrmw or ptr %0, i128 %1 monotonic, align 16 ; %4 = atomicrmw xor ptr %0, i128 %1 monotonic, align 16 ; %5 = atomicrmw xchg ptr %0, i128 %1 monotonic, align 16 ; ret void ; } ; define void @minmax_i128(ptr %0, i128 %1) { ; entry: ; %2 = atomicrmw min ptr %0, i128 %1 monotonic, align 16 ; %3 = atomicrmw max ptr %0, i128 %1 monotonic, align 16 ; %4 = atomicrmw umin ptr %0, i128 %1 monotonic, align 16 ; %5 = atomicrmw umax ptr %0, i128 %1 monotonic, align 16 ; ret void ; }