blob: bac59be5158ea2c2879987fa8d221c463a2b0d14 [file] [log] [blame]
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
; RUN: llc < %s -mtriple=nvptx64 -mcpu=sm_20 | FileCheck -check-prefixes=CHECK,SM60 %s
; RUN: %if ptxas %{ llc < %s -mtriple=nvptx64 -mcpu=sm_20 | %ptxas-verify %}
; RUN: llc < %s -mtriple=nvptx64 -mcpu=sm_70 -mattr=+ptx82 | FileCheck %s -check-prefixes=CHECK,SM70
; RUN: %if ptxas-12.2 %{ llc < %s -mtriple=nvptx64 -mcpu=sm_70 -mattr=+ptx82 | %ptxas-verify -arch=sm_70 %}
; TODO: generate PTX that preserves Concurrent Forward Progress
; for atomic operations to local statespace
; by generating atomic or volatile operations.
; TODO: add weak,atomic,volatile,atomic volatile tests
; for .const and .param statespaces.
; TODO: optimize .sys.shared into .cta.shared or .cluster.shared .
;; generic statespace
; generic
define void @generic_i8(ptr %a) {
; CHECK-LABEL: generic_i8(
; CHECK: {
; CHECK-NEXT: .reg .b16 %rs<3>;
; CHECK-NEXT: .reg .b64 %rd<2>;
; CHECK-EMPTY:
; CHECK-NEXT: // %bb.0:
; CHECK-NEXT: ld.param.b64 %rd1, [generic_i8_param_0];
; CHECK-NEXT: ld.b8 %rs1, [%rd1];
; CHECK-NEXT: add.s16 %rs2, %rs1, 1;
; CHECK-NEXT: st.b8 [%rd1], %rs2;
; CHECK-NEXT: ret;
%a.load = load i8, ptr %a
%a.add = add i8 %a.load, 1
store i8 %a.add, ptr %a
ret void
}
define void @generic_i16(ptr %a) {
; CHECK-LABEL: generic_i16(
; CHECK: {
; CHECK-NEXT: .reg .b16 %rs<3>;
; CHECK-NEXT: .reg .b64 %rd<2>;
; CHECK-EMPTY:
; CHECK-NEXT: // %bb.0:
; CHECK-NEXT: ld.param.b64 %rd1, [generic_i16_param_0];
; CHECK-NEXT: ld.b16 %rs1, [%rd1];
; CHECK-NEXT: add.s16 %rs2, %rs1, 1;
; CHECK-NEXT: st.b16 [%rd1], %rs2;
; CHECK-NEXT: ret;
%a.load = load i16, ptr %a
%a.add = add i16 %a.load, 1
store i16 %a.add, ptr %a
ret void
}
define void @generic_i32(ptr %a) {
; CHECK-LABEL: generic_i32(
; CHECK: {
; CHECK-NEXT: .reg .b32 %r<3>;
; CHECK-NEXT: .reg .b64 %rd<2>;
; CHECK-EMPTY:
; CHECK-NEXT: // %bb.0:
; CHECK-NEXT: ld.param.b64 %rd1, [generic_i32_param_0];
; CHECK-NEXT: ld.b32 %r1, [%rd1];
; CHECK-NEXT: add.s32 %r2, %r1, 1;
; CHECK-NEXT: st.b32 [%rd1], %r2;
; CHECK-NEXT: ret;
%a.load = load i32, ptr %a
%a.add = add i32 %a.load, 1
store i32 %a.add, ptr %a
ret void
}
define void @generic_i64(ptr %a) {
; CHECK-LABEL: generic_i64(
; CHECK: {
; CHECK-NEXT: .reg .b64 %rd<4>;
; CHECK-EMPTY:
; CHECK-NEXT: // %bb.0:
; CHECK-NEXT: ld.param.b64 %rd1, [generic_i64_param_0];
; CHECK-NEXT: ld.b64 %rd2, [%rd1];
; CHECK-NEXT: add.s64 %rd3, %rd2, 1;
; CHECK-NEXT: st.b64 [%rd1], %rd3;
; CHECK-NEXT: ret;
%a.load = load i64, ptr %a
%a.add = add i64 %a.load, 1
store i64 %a.add, ptr %a
ret void
}
define void @generic_float(ptr %a) {
; CHECK-LABEL: generic_float(
; CHECK: {
; CHECK-NEXT: .reg .b32 %r<3>;
; CHECK-NEXT: .reg .b64 %rd<2>;
; CHECK-EMPTY:
; CHECK-NEXT: // %bb.0:
; CHECK-NEXT: ld.param.b64 %rd1, [generic_float_param_0];
; CHECK-NEXT: ld.b32 %r1, [%rd1];
; CHECK-NEXT: add.rn.f32 %r2, %r1, 0f3F800000;
; CHECK-NEXT: st.b32 [%rd1], %r2;
; CHECK-NEXT: ret;
%a.load = load float, ptr %a
%a.add = fadd float %a.load, 1.
store float %a.add, ptr %a
ret void
}
define void @generic_double(ptr %a) {
; CHECK-LABEL: generic_double(
; CHECK: {
; CHECK-NEXT: .reg .b64 %rd<4>;
; CHECK-EMPTY:
; CHECK-NEXT: // %bb.0:
; CHECK-NEXT: ld.param.b64 %rd1, [generic_double_param_0];
; CHECK-NEXT: ld.b64 %rd2, [%rd1];
; CHECK-NEXT: add.rn.f64 %rd3, %rd2, 0d3FF0000000000000;
; CHECK-NEXT: st.b64 [%rd1], %rd3;
; CHECK-NEXT: ret;
%a.load = load double, ptr %a
%a.add = fadd double %a.load, 1.
store double %a.add, ptr %a
ret void
}
; generic_volatile
define void @generic_volatile_i8(ptr %a) {
; CHECK-LABEL: generic_volatile_i8(
; CHECK: {
; CHECK-NEXT: .reg .b16 %rs<3>;
; CHECK-NEXT: .reg .b64 %rd<2>;
; CHECK-EMPTY:
; CHECK-NEXT: // %bb.0:
; CHECK-NEXT: ld.param.b64 %rd1, [generic_volatile_i8_param_0];
; CHECK-NEXT: ld.volatile.b8 %rs1, [%rd1];
; CHECK-NEXT: add.s16 %rs2, %rs1, 1;
; CHECK-NEXT: st.volatile.b8 [%rd1], %rs2;
; CHECK-NEXT: ret;
%a.load = load volatile i8, ptr %a
%a.add = add i8 %a.load, 1
store volatile i8 %a.add, ptr %a
ret void
}
define void @generic_volatile_i16(ptr %a) {
; CHECK-LABEL: generic_volatile_i16(
; CHECK: {
; CHECK-NEXT: .reg .b16 %rs<3>;
; CHECK-NEXT: .reg .b64 %rd<2>;
; CHECK-EMPTY:
; CHECK-NEXT: // %bb.0:
; CHECK-NEXT: ld.param.b64 %rd1, [generic_volatile_i16_param_0];
; CHECK-NEXT: ld.volatile.b16 %rs1, [%rd1];
; CHECK-NEXT: add.s16 %rs2, %rs1, 1;
; CHECK-NEXT: st.volatile.b16 [%rd1], %rs2;
; CHECK-NEXT: ret;
%a.load = load volatile i16, ptr %a
%a.add = add i16 %a.load, 1
store volatile i16 %a.add, ptr %a
ret void
}
define void @generic_volatile_i32(ptr %a) {
; CHECK-LABEL: generic_volatile_i32(
; CHECK: {
; CHECK-NEXT: .reg .b32 %r<3>;
; CHECK-NEXT: .reg .b64 %rd<2>;
; CHECK-EMPTY:
; CHECK-NEXT: // %bb.0:
; CHECK-NEXT: ld.param.b64 %rd1, [generic_volatile_i32_param_0];
; CHECK-NEXT: ld.volatile.b32 %r1, [%rd1];
; CHECK-NEXT: add.s32 %r2, %r1, 1;
; CHECK-NEXT: st.volatile.b32 [%rd1], %r2;
; CHECK-NEXT: ret;
%a.load = load volatile i32, ptr %a
%a.add = add i32 %a.load, 1
store volatile i32 %a.add, ptr %a
ret void
}
define void @generic_volatile_i64(ptr %a) {
; CHECK-LABEL: generic_volatile_i64(
; CHECK: {
; CHECK-NEXT: .reg .b64 %rd<4>;
; CHECK-EMPTY:
; CHECK-NEXT: // %bb.0:
; CHECK-NEXT: ld.param.b64 %rd1, [generic_volatile_i64_param_0];
; CHECK-NEXT: ld.volatile.b64 %rd2, [%rd1];
; CHECK-NEXT: add.s64 %rd3, %rd2, 1;
; CHECK-NEXT: st.volatile.b64 [%rd1], %rd3;
; CHECK-NEXT: ret;
%a.load = load volatile i64, ptr %a
%a.add = add i64 %a.load, 1
store volatile i64 %a.add, ptr %a
ret void
}
define void @generic_volatile_float(ptr %a) {
; CHECK-LABEL: generic_volatile_float(
; CHECK: {
; CHECK-NEXT: .reg .b32 %r<3>;
; CHECK-NEXT: .reg .b64 %rd<2>;
; CHECK-EMPTY:
; CHECK-NEXT: // %bb.0:
; CHECK-NEXT: ld.param.b64 %rd1, [generic_volatile_float_param_0];
; CHECK-NEXT: ld.volatile.b32 %r1, [%rd1];
; CHECK-NEXT: add.rn.f32 %r2, %r1, 0f3F800000;
; CHECK-NEXT: st.volatile.b32 [%rd1], %r2;
; CHECK-NEXT: ret;
%a.load = load volatile float, ptr %a
%a.add = fadd float %a.load, 1.
store volatile float %a.add, ptr %a
ret void
}
define void @generic_volatile_double(ptr %a) {
; CHECK-LABEL: generic_volatile_double(
; CHECK: {
; CHECK-NEXT: .reg .b64 %rd<4>;
; CHECK-EMPTY:
; CHECK-NEXT: // %bb.0:
; CHECK-NEXT: ld.param.b64 %rd1, [generic_volatile_double_param_0];
; CHECK-NEXT: ld.volatile.b64 %rd2, [%rd1];
; CHECK-NEXT: add.rn.f64 %rd3, %rd2, 0d3FF0000000000000;
; CHECK-NEXT: st.volatile.b64 [%rd1], %rd3;
; CHECK-NEXT: ret;
%a.load = load volatile double, ptr %a
%a.add = fadd double %a.load, 1.
store volatile double %a.add, ptr %a
ret void
}
; generic_unordered_sys
define void @generic_unordered_sys_i8(ptr %a) {
; SM60-LABEL: generic_unordered_sys_i8(
; SM60: {
; SM60-NEXT: .reg .b16 %rs<3>;
; SM60-NEXT: .reg .b64 %rd<2>;
; SM60-EMPTY:
; SM60-NEXT: // %bb.0:
; SM60-NEXT: ld.param.b64 %rd1, [generic_unordered_sys_i8_param_0];
; SM60-NEXT: ld.volatile.b8 %rs1, [%rd1];
; SM60-NEXT: add.s16 %rs2, %rs1, 1;
; SM60-NEXT: st.volatile.b8 [%rd1], %rs2;
; SM60-NEXT: ret;
;
; SM70-LABEL: generic_unordered_sys_i8(
; SM70: {
; SM70-NEXT: .reg .b16 %rs<3>;
; SM70-NEXT: .reg .b64 %rd<2>;
; SM70-EMPTY:
; SM70-NEXT: // %bb.0:
; SM70-NEXT: ld.param.b64 %rd1, [generic_unordered_sys_i8_param_0];
; SM70-NEXT: ld.relaxed.sys.b8 %rs1, [%rd1];
; SM70-NEXT: add.s16 %rs2, %rs1, 1;
; SM70-NEXT: st.relaxed.sys.b8 [%rd1], %rs2;
; SM70-NEXT: ret;
%a.load = load atomic i8, ptr %a unordered, align 1
%a.add = add i8 %a.load, 1
store atomic i8 %a.add, ptr %a unordered, align 1
ret void
}
define void @generic_unordered_sys_i16(ptr %a) {
; SM60-LABEL: generic_unordered_sys_i16(
; SM60: {
; SM60-NEXT: .reg .b16 %rs<3>;
; SM60-NEXT: .reg .b64 %rd<2>;
; SM60-EMPTY:
; SM60-NEXT: // %bb.0:
; SM60-NEXT: ld.param.b64 %rd1, [generic_unordered_sys_i16_param_0];
; SM60-NEXT: ld.volatile.b16 %rs1, [%rd1];
; SM60-NEXT: add.s16 %rs2, %rs1, 1;
; SM60-NEXT: st.volatile.b16 [%rd1], %rs2;
; SM60-NEXT: ret;
;
; SM70-LABEL: generic_unordered_sys_i16(
; SM70: {
; SM70-NEXT: .reg .b16 %rs<3>;
; SM70-NEXT: .reg .b64 %rd<2>;
; SM70-EMPTY:
; SM70-NEXT: // %bb.0:
; SM70-NEXT: ld.param.b64 %rd1, [generic_unordered_sys_i16_param_0];
; SM70-NEXT: ld.relaxed.sys.b16 %rs1, [%rd1];
; SM70-NEXT: add.s16 %rs2, %rs1, 1;
; SM70-NEXT: st.relaxed.sys.b16 [%rd1], %rs2;
; SM70-NEXT: ret;
%a.load = load atomic i16, ptr %a unordered, align 2
%a.add = add i16 %a.load, 1
store atomic i16 %a.add, ptr %a unordered, align 2
ret void
}
define void @generic_unordered_sys_i32(ptr %a) {
; SM60-LABEL: generic_unordered_sys_i32(
; SM60: {
; SM60-NEXT: .reg .b32 %r<3>;
; SM60-NEXT: .reg .b64 %rd<2>;
; SM60-EMPTY:
; SM60-NEXT: // %bb.0:
; SM60-NEXT: ld.param.b64 %rd1, [generic_unordered_sys_i32_param_0];
; SM60-NEXT: ld.volatile.b32 %r1, [%rd1];
; SM60-NEXT: add.s32 %r2, %r1, 1;
; SM60-NEXT: st.volatile.b32 [%rd1], %r2;
; SM60-NEXT: ret;
;
; SM70-LABEL: generic_unordered_sys_i32(
; SM70: {
; SM70-NEXT: .reg .b32 %r<3>;
; SM70-NEXT: .reg .b64 %rd<2>;
; SM70-EMPTY:
; SM70-NEXT: // %bb.0:
; SM70-NEXT: ld.param.b64 %rd1, [generic_unordered_sys_i32_param_0];
; SM70-NEXT: ld.relaxed.sys.b32 %r1, [%rd1];
; SM70-NEXT: add.s32 %r2, %r1, 1;
; SM70-NEXT: st.relaxed.sys.b32 [%rd1], %r2;
; SM70-NEXT: ret;
%a.load = load atomic i32, ptr %a unordered, align 4
%a.add = add i32 %a.load, 1
store atomic i32 %a.add, ptr %a unordered, align 4
ret void
}
define void @generic_unordered_sys_i64(ptr %a) {
; SM60-LABEL: generic_unordered_sys_i64(
; SM60: {
; SM60-NEXT: .reg .b64 %rd<4>;
; SM60-EMPTY:
; SM60-NEXT: // %bb.0:
; SM60-NEXT: ld.param.b64 %rd1, [generic_unordered_sys_i64_param_0];
; SM60-NEXT: ld.volatile.b64 %rd2, [%rd1];
; SM60-NEXT: add.s64 %rd3, %rd2, 1;
; SM60-NEXT: st.volatile.b64 [%rd1], %rd3;
; SM60-NEXT: ret;
;
; SM70-LABEL: generic_unordered_sys_i64(
; SM70: {
; SM70-NEXT: .reg .b64 %rd<4>;
; SM70-EMPTY:
; SM70-NEXT: // %bb.0:
; SM70-NEXT: ld.param.b64 %rd1, [generic_unordered_sys_i64_param_0];
; SM70-NEXT: ld.relaxed.sys.b64 %rd2, [%rd1];
; SM70-NEXT: add.s64 %rd3, %rd2, 1;
; SM70-NEXT: st.relaxed.sys.b64 [%rd1], %rd3;
; SM70-NEXT: ret;
%a.load = load atomic i64, ptr %a unordered, align 8
%a.add = add i64 %a.load, 1
store atomic i64 %a.add, ptr %a unordered, align 8
ret void
}
define void @generic_unordered_sys_float(ptr %a) {
; SM60-LABEL: generic_unordered_sys_float(
; SM60: {
; SM60-NEXT: .reg .b32 %r<3>;
; SM60-NEXT: .reg .b64 %rd<2>;
; SM60-EMPTY:
; SM60-NEXT: // %bb.0:
; SM60-NEXT: ld.param.b64 %rd1, [generic_unordered_sys_float_param_0];
; SM60-NEXT: ld.volatile.b32 %r1, [%rd1];
; SM60-NEXT: add.rn.f32 %r2, %r1, 0f3F800000;
; SM60-NEXT: st.volatile.b32 [%rd1], %r2;
; SM60-NEXT: ret;
;
; SM70-LABEL: generic_unordered_sys_float(
; SM70: {
; SM70-NEXT: .reg .b32 %r<3>;
; SM70-NEXT: .reg .b64 %rd<2>;
; SM70-EMPTY:
; SM70-NEXT: // %bb.0:
; SM70-NEXT: ld.param.b64 %rd1, [generic_unordered_sys_float_param_0];
; SM70-NEXT: ld.relaxed.sys.b32 %r1, [%rd1];
; SM70-NEXT: add.rn.f32 %r2, %r1, 0f3F800000;
; SM70-NEXT: st.relaxed.sys.b32 [%rd1], %r2;
; SM70-NEXT: ret;
%a.load = load atomic float, ptr %a unordered, align 4
%a.add = fadd float %a.load, 1.
store atomic float %a.add, ptr %a unordered, align 4
ret void
}
define void @generic_unordered_sys_double(ptr %a) {
; SM60-LABEL: generic_unordered_sys_double(
; SM60: {
; SM60-NEXT: .reg .b64 %rd<4>;
; SM60-EMPTY:
; SM60-NEXT: // %bb.0:
; SM60-NEXT: ld.param.b64 %rd1, [generic_unordered_sys_double_param_0];
; SM60-NEXT: ld.volatile.b64 %rd2, [%rd1];
; SM60-NEXT: add.rn.f64 %rd3, %rd2, 0d3FF0000000000000;
; SM60-NEXT: st.volatile.b64 [%rd1], %rd3;
; SM60-NEXT: ret;
;
; SM70-LABEL: generic_unordered_sys_double(
; SM70: {
; SM70-NEXT: .reg .b64 %rd<4>;
; SM70-EMPTY:
; SM70-NEXT: // %bb.0:
; SM70-NEXT: ld.param.b64 %rd1, [generic_unordered_sys_double_param_0];
; SM70-NEXT: ld.relaxed.sys.b64 %rd2, [%rd1];
; SM70-NEXT: add.rn.f64 %rd3, %rd2, 0d3FF0000000000000;
; SM70-NEXT: st.relaxed.sys.b64 [%rd1], %rd3;
; SM70-NEXT: ret;
%a.load = load atomic double, ptr %a unordered, align 8
%a.add = fadd double %a.load, 1.
store atomic double %a.add, ptr %a unordered, align 8
ret void
}
; generic_unordered_volatile_sys
define void @generic_unordered_volatile_sys_i8(ptr %a) {
; CHECK-LABEL: generic_unordered_volatile_sys_i8(
; CHECK: {
; CHECK-NEXT: .reg .b16 %rs<3>;
; CHECK-NEXT: .reg .b64 %rd<2>;
; CHECK-EMPTY:
; CHECK-NEXT: // %bb.0:
; CHECK-NEXT: ld.param.b64 %rd1, [generic_unordered_volatile_sys_i8_param_0];
; CHECK-NEXT: ld.volatile.b8 %rs1, [%rd1];
; CHECK-NEXT: add.s16 %rs2, %rs1, 1;
; CHECK-NEXT: st.volatile.b8 [%rd1], %rs2;
; CHECK-NEXT: ret;
%a.load = load atomic volatile i8, ptr %a unordered, align 1
%a.add = add i8 %a.load, 1
store atomic volatile i8 %a.add, ptr %a unordered, align 1
ret void
}
define void @generic_unordered_volatile_sys_i16(ptr %a) {
; CHECK-LABEL: generic_unordered_volatile_sys_i16(
; CHECK: {
; CHECK-NEXT: .reg .b16 %rs<3>;
; CHECK-NEXT: .reg .b64 %rd<2>;
; CHECK-EMPTY:
; CHECK-NEXT: // %bb.0:
; CHECK-NEXT: ld.param.b64 %rd1, [generic_unordered_volatile_sys_i16_param_0];
; CHECK-NEXT: ld.volatile.b16 %rs1, [%rd1];
; CHECK-NEXT: add.s16 %rs2, %rs1, 1;
; CHECK-NEXT: st.volatile.b16 [%rd1], %rs2;
; CHECK-NEXT: ret;
%a.load = load atomic volatile i16, ptr %a unordered, align 2
%a.add = add i16 %a.load, 1
store atomic volatile i16 %a.add, ptr %a unordered, align 2
ret void
}
define void @generic_unordered_volatile_sys_i32(ptr %a) {
; CHECK-LABEL: generic_unordered_volatile_sys_i32(
; CHECK: {
; CHECK-NEXT: .reg .b32 %r<3>;
; CHECK-NEXT: .reg .b64 %rd<2>;
; CHECK-EMPTY:
; CHECK-NEXT: // %bb.0:
; CHECK-NEXT: ld.param.b64 %rd1, [generic_unordered_volatile_sys_i32_param_0];
; CHECK-NEXT: ld.volatile.b32 %r1, [%rd1];
; CHECK-NEXT: add.s32 %r2, %r1, 1;
; CHECK-NEXT: st.volatile.b32 [%rd1], %r2;
; CHECK-NEXT: ret;
%a.load = load atomic volatile i32, ptr %a unordered, align 4
%a.add = add i32 %a.load, 1
store atomic volatile i32 %a.add, ptr %a unordered, align 4
ret void
}
define void @generic_unordered_volatile_sys_i64(ptr %a) {
; CHECK-LABEL: generic_unordered_volatile_sys_i64(
; CHECK: {
; CHECK-NEXT: .reg .b64 %rd<4>;
; CHECK-EMPTY:
; CHECK-NEXT: // %bb.0:
; CHECK-NEXT: ld.param.b64 %rd1, [generic_unordered_volatile_sys_i64_param_0];
; CHECK-NEXT: ld.volatile.b64 %rd2, [%rd1];
; CHECK-NEXT: add.s64 %rd3, %rd2, 1;
; CHECK-NEXT: st.volatile.b64 [%rd1], %rd3;
; CHECK-NEXT: ret;
%a.load = load atomic volatile i64, ptr %a unordered, align 8
%a.add = add i64 %a.load, 1
store atomic volatile i64 %a.add, ptr %a unordered, align 8
ret void
}
define void @generic_unordered_volatile_sys_float(ptr %a) {
; CHECK-LABEL: generic_unordered_volatile_sys_float(
; CHECK: {
; CHECK-NEXT: .reg .b32 %r<3>;
; CHECK-NEXT: .reg .b64 %rd<2>;
; CHECK-EMPTY:
; CHECK-NEXT: // %bb.0:
; CHECK-NEXT: ld.param.b64 %rd1, [generic_unordered_volatile_sys_float_param_0];
; CHECK-NEXT: ld.volatile.b32 %r1, [%rd1];
; CHECK-NEXT: add.rn.f32 %r2, %r1, 0f3F800000;
; CHECK-NEXT: st.volatile.b32 [%rd1], %r2;
; CHECK-NEXT: ret;
%a.load = load atomic volatile float, ptr %a unordered, align 4
%a.add = fadd float %a.load, 1.
store atomic volatile float %a.add, ptr %a unordered, align 4
ret void
}
define void @generic_unordered_volatile_sys_double(ptr %a) {
; CHECK-LABEL: generic_unordered_volatile_sys_double(
; CHECK: {
; CHECK-NEXT: .reg .b64 %rd<4>;
; CHECK-EMPTY:
; CHECK-NEXT: // %bb.0:
; CHECK-NEXT: ld.param.b64 %rd1, [generic_unordered_volatile_sys_double_param_0];
; CHECK-NEXT: ld.volatile.b64 %rd2, [%rd1];
; CHECK-NEXT: add.rn.f64 %rd3, %rd2, 0d3FF0000000000000;
; CHECK-NEXT: st.volatile.b64 [%rd1], %rd3;
; CHECK-NEXT: ret;
%a.load = load atomic volatile double, ptr %a unordered, align 8
%a.add = fadd double %a.load, 1.
store atomic volatile double %a.add, ptr %a unordered, align 8
ret void
}
; generic_monotonic_sys
define void @generic_monotonic_sys_i8(ptr %a) {
; SM60-LABEL: generic_monotonic_sys_i8(
; SM60: {
; SM60-NEXT: .reg .b16 %rs<3>;
; SM60-NEXT: .reg .b64 %rd<2>;
; SM60-EMPTY:
; SM60-NEXT: // %bb.0:
; SM60-NEXT: ld.param.b64 %rd1, [generic_monotonic_sys_i8_param_0];
; SM60-NEXT: ld.volatile.b8 %rs1, [%rd1];
; SM60-NEXT: add.s16 %rs2, %rs1, 1;
; SM60-NEXT: st.volatile.b8 [%rd1], %rs2;
; SM60-NEXT: ret;
;
; SM70-LABEL: generic_monotonic_sys_i8(
; SM70: {
; SM70-NEXT: .reg .b16 %rs<3>;
; SM70-NEXT: .reg .b64 %rd<2>;
; SM70-EMPTY:
; SM70-NEXT: // %bb.0:
; SM70-NEXT: ld.param.b64 %rd1, [generic_monotonic_sys_i8_param_0];
; SM70-NEXT: ld.relaxed.sys.b8 %rs1, [%rd1];
; SM70-NEXT: add.s16 %rs2, %rs1, 1;
; SM70-NEXT: st.relaxed.sys.b8 [%rd1], %rs2;
; SM70-NEXT: ret;
%a.load = load atomic i8, ptr %a monotonic, align 1
%a.add = add i8 %a.load, 1
store atomic i8 %a.add, ptr %a monotonic, align 1
ret void
}
define void @generic_monotonic_sys_i16(ptr %a) {
; SM60-LABEL: generic_monotonic_sys_i16(
; SM60: {
; SM60-NEXT: .reg .b16 %rs<3>;
; SM60-NEXT: .reg .b64 %rd<2>;
; SM60-EMPTY:
; SM60-NEXT: // %bb.0:
; SM60-NEXT: ld.param.b64 %rd1, [generic_monotonic_sys_i16_param_0];
; SM60-NEXT: ld.volatile.b16 %rs1, [%rd1];
; SM60-NEXT: add.s16 %rs2, %rs1, 1;
; SM60-NEXT: st.volatile.b16 [%rd1], %rs2;
; SM60-NEXT: ret;
;
; SM70-LABEL: generic_monotonic_sys_i16(
; SM70: {
; SM70-NEXT: .reg .b16 %rs<3>;
; SM70-NEXT: .reg .b64 %rd<2>;
; SM70-EMPTY:
; SM70-NEXT: // %bb.0:
; SM70-NEXT: ld.param.b64 %rd1, [generic_monotonic_sys_i16_param_0];
; SM70-NEXT: ld.relaxed.sys.b16 %rs1, [%rd1];
; SM70-NEXT: add.s16 %rs2, %rs1, 1;
; SM70-NEXT: st.relaxed.sys.b16 [%rd1], %rs2;
; SM70-NEXT: ret;
%a.load = load atomic i16, ptr %a monotonic, align 2
%a.add = add i16 %a.load, 1
store atomic i16 %a.add, ptr %a monotonic, align 2
ret void
}
define void @generic_monotonic_sys_i32(ptr %a) {
; SM60-LABEL: generic_monotonic_sys_i32(
; SM60: {
; SM60-NEXT: .reg .b32 %r<3>;
; SM60-NEXT: .reg .b64 %rd<2>;
; SM60-EMPTY:
; SM60-NEXT: // %bb.0:
; SM60-NEXT: ld.param.b64 %rd1, [generic_monotonic_sys_i32_param_0];
; SM60-NEXT: ld.volatile.b32 %r1, [%rd1];
; SM60-NEXT: add.s32 %r2, %r1, 1;
; SM60-NEXT: st.volatile.b32 [%rd1], %r2;
; SM60-NEXT: ret;
;
; SM70-LABEL: generic_monotonic_sys_i32(
; SM70: {
; SM70-NEXT: .reg .b32 %r<3>;
; SM70-NEXT: .reg .b64 %rd<2>;
; SM70-EMPTY:
; SM70-NEXT: // %bb.0:
; SM70-NEXT: ld.param.b64 %rd1, [generic_monotonic_sys_i32_param_0];
; SM70-NEXT: ld.relaxed.sys.b32 %r1, [%rd1];
; SM70-NEXT: add.s32 %r2, %r1, 1;
; SM70-NEXT: st.relaxed.sys.b32 [%rd1], %r2;
; SM70-NEXT: ret;
%a.load = load atomic i32, ptr %a monotonic, align 4
%a.add = add i32 %a.load, 1
store atomic i32 %a.add, ptr %a monotonic, align 4
ret void
}
define void @generic_monotonic_sys_i64(ptr %a) {
; SM60-LABEL: generic_monotonic_sys_i64(
; SM60: {
; SM60-NEXT: .reg .b64 %rd<4>;
; SM60-EMPTY:
; SM60-NEXT: // %bb.0:
; SM60-NEXT: ld.param.b64 %rd1, [generic_monotonic_sys_i64_param_0];
; SM60-NEXT: ld.volatile.b64 %rd2, [%rd1];
; SM60-NEXT: add.s64 %rd3, %rd2, 1;
; SM60-NEXT: st.volatile.b64 [%rd1], %rd3;
; SM60-NEXT: ret;
;
; SM70-LABEL: generic_monotonic_sys_i64(
; SM70: {
; SM70-NEXT: .reg .b64 %rd<4>;
; SM70-EMPTY:
; SM70-NEXT: // %bb.0:
; SM70-NEXT: ld.param.b64 %rd1, [generic_monotonic_sys_i64_param_0];
; SM70-NEXT: ld.relaxed.sys.b64 %rd2, [%rd1];
; SM70-NEXT: add.s64 %rd3, %rd2, 1;
; SM70-NEXT: st.relaxed.sys.b64 [%rd1], %rd3;
; SM70-NEXT: ret;
%a.load = load atomic i64, ptr %a monotonic, align 8
%a.add = add i64 %a.load, 1
store atomic i64 %a.add, ptr %a monotonic, align 8
ret void
}
define void @generic_monotonic_sys_float(ptr %a) {
; SM60-LABEL: generic_monotonic_sys_float(
; SM60: {
; SM60-NEXT: .reg .b32 %r<3>;
; SM60-NEXT: .reg .b64 %rd<2>;
; SM60-EMPTY:
; SM60-NEXT: // %bb.0:
; SM60-NEXT: ld.param.b64 %rd1, [generic_monotonic_sys_float_param_0];
; SM60-NEXT: ld.volatile.b32 %r1, [%rd1];
; SM60-NEXT: add.rn.f32 %r2, %r1, 0f3F800000;
; SM60-NEXT: st.volatile.b32 [%rd1], %r2;
; SM60-NEXT: ret;
;
; SM70-LABEL: generic_monotonic_sys_float(
; SM70: {
; SM70-NEXT: .reg .b32 %r<3>;
; SM70-NEXT: .reg .b64 %rd<2>;
; SM70-EMPTY:
; SM70-NEXT: // %bb.0:
; SM70-NEXT: ld.param.b64 %rd1, [generic_monotonic_sys_float_param_0];
; SM70-NEXT: ld.relaxed.sys.b32 %r1, [%rd1];
; SM70-NEXT: add.rn.f32 %r2, %r1, 0f3F800000;
; SM70-NEXT: st.relaxed.sys.b32 [%rd1], %r2;
; SM70-NEXT: ret;
%a.load = load atomic float, ptr %a monotonic, align 4
%a.add = fadd float %a.load, 1.
store atomic float %a.add, ptr %a monotonic, align 4
ret void
}
define void @generic_monotonic_sys_double(ptr %a) {
; SM60-LABEL: generic_monotonic_sys_double(
; SM60: {
; SM60-NEXT: .reg .b64 %rd<4>;
; SM60-EMPTY:
; SM60-NEXT: // %bb.0:
; SM60-NEXT: ld.param.b64 %rd1, [generic_monotonic_sys_double_param_0];
; SM60-NEXT: ld.volatile.b64 %rd2, [%rd1];
; SM60-NEXT: add.rn.f64 %rd3, %rd2, 0d3FF0000000000000;
; SM60-NEXT: st.volatile.b64 [%rd1], %rd3;
; SM60-NEXT: ret;
;
; SM70-LABEL: generic_monotonic_sys_double(
; SM70: {
; SM70-NEXT: .reg .b64 %rd<4>;
; SM70-EMPTY:
; SM70-NEXT: // %bb.0:
; SM70-NEXT: ld.param.b64 %rd1, [generic_monotonic_sys_double_param_0];
; SM70-NEXT: ld.relaxed.sys.b64 %rd2, [%rd1];
; SM70-NEXT: add.rn.f64 %rd3, %rd2, 0d3FF0000000000000;
; SM70-NEXT: st.relaxed.sys.b64 [%rd1], %rd3;
; SM70-NEXT: ret;
%a.load = load atomic double, ptr %a monotonic, align 8
%a.add = fadd double %a.load, 1.
store atomic double %a.add, ptr %a monotonic, align 8
ret void
}
; generic_monotonic_volatile_sys
define void @generic_monotonic_volatile_sys_i8(ptr %a) {
; CHECK-LABEL: generic_monotonic_volatile_sys_i8(
; CHECK: {
; CHECK-NEXT: .reg .b16 %rs<3>;
; CHECK-NEXT: .reg .b64 %rd<2>;
; CHECK-EMPTY:
; CHECK-NEXT: // %bb.0:
; CHECK-NEXT: ld.param.b64 %rd1, [generic_monotonic_volatile_sys_i8_param_0];
; CHECK-NEXT: ld.volatile.b8 %rs1, [%rd1];
; CHECK-NEXT: add.s16 %rs2, %rs1, 1;
; CHECK-NEXT: st.volatile.b8 [%rd1], %rs2;
; CHECK-NEXT: ret;
%a.load = load atomic volatile i8, ptr %a monotonic, align 1
%a.add = add i8 %a.load, 1
store atomic volatile i8 %a.add, ptr %a monotonic, align 1
ret void
}
define void @generic_monotonic_volatile_sys_i16(ptr %a) {
; CHECK-LABEL: generic_monotonic_volatile_sys_i16(
; CHECK: {
; CHECK-NEXT: .reg .b16 %rs<3>;
; CHECK-NEXT: .reg .b64 %rd<2>;
; CHECK-EMPTY:
; CHECK-NEXT: // %bb.0:
; CHECK-NEXT: ld.param.b64 %rd1, [generic_monotonic_volatile_sys_i16_param_0];
; CHECK-NEXT: ld.volatile.b16 %rs1, [%rd1];
; CHECK-NEXT: add.s16 %rs2, %rs1, 1;
; CHECK-NEXT: st.volatile.b16 [%rd1], %rs2;
; CHECK-NEXT: ret;
%a.load = load atomic volatile i16, ptr %a monotonic, align 2
%a.add = add i16 %a.load, 1
store atomic volatile i16 %a.add, ptr %a monotonic, align 2
ret void
}
define void @generic_monotonic_volatile_sys_i32(ptr %a) {
; CHECK-LABEL: generic_monotonic_volatile_sys_i32(
; CHECK: {
; CHECK-NEXT: .reg .b32 %r<3>;
; CHECK-NEXT: .reg .b64 %rd<2>;
; CHECK-EMPTY:
; CHECK-NEXT: // %bb.0:
; CHECK-NEXT: ld.param.b64 %rd1, [generic_monotonic_volatile_sys_i32_param_0];
; CHECK-NEXT: ld.volatile.b32 %r1, [%rd1];
; CHECK-NEXT: add.s32 %r2, %r1, 1;
; CHECK-NEXT: st.volatile.b32 [%rd1], %r2;
; CHECK-NEXT: ret;
%a.load = load atomic volatile i32, ptr %a monotonic, align 4
%a.add = add i32 %a.load, 1
store atomic volatile i32 %a.add, ptr %a monotonic, align 4
ret void
}
define void @generic_monotonic_volatile_sys_i64(ptr %a) {
; CHECK-LABEL: generic_monotonic_volatile_sys_i64(
; CHECK: {
; CHECK-NEXT: .reg .b64 %rd<4>;
; CHECK-EMPTY:
; CHECK-NEXT: // %bb.0:
; CHECK-NEXT: ld.param.b64 %rd1, [generic_monotonic_volatile_sys_i64_param_0];
; CHECK-NEXT: ld.volatile.b64 %rd2, [%rd1];
; CHECK-NEXT: add.s64 %rd3, %rd2, 1;
; CHECK-NEXT: st.volatile.b64 [%rd1], %rd3;
; CHECK-NEXT: ret;
%a.load = load atomic volatile i64, ptr %a monotonic, align 8
%a.add = add i64 %a.load, 1
store atomic volatile i64 %a.add, ptr %a monotonic, align 8
ret void
}
define void @generic_monotonic_volatile_sys_float(ptr %a) {
; CHECK-LABEL: generic_monotonic_volatile_sys_float(
; CHECK: {
; CHECK-NEXT: .reg .b32 %r<3>;
; CHECK-NEXT: .reg .b64 %rd<2>;
; CHECK-EMPTY:
; CHECK-NEXT: // %bb.0:
; CHECK-NEXT: ld.param.b64 %rd1, [generic_monotonic_volatile_sys_float_param_0];
; CHECK-NEXT: ld.volatile.b32 %r1, [%rd1];
; CHECK-NEXT: add.rn.f32 %r2, %r1, 0f3F800000;
; CHECK-NEXT: st.volatile.b32 [%rd1], %r2;
; CHECK-NEXT: ret;
%a.load = load atomic volatile float, ptr %a monotonic, align 4
%a.add = fadd float %a.load, 1.
store atomic volatile float %a.add, ptr %a monotonic, align 4
ret void
}
define void @generic_monotonic_volatile_sys_double(ptr %a) {
; CHECK-LABEL: generic_monotonic_volatile_sys_double(
; CHECK: {
; CHECK-NEXT: .reg .b64 %rd<4>;
; CHECK-EMPTY:
; CHECK-NEXT: // %bb.0:
; CHECK-NEXT: ld.param.b64 %rd1, [generic_monotonic_volatile_sys_double_param_0];
; CHECK-NEXT: ld.volatile.b64 %rd2, [%rd1];
; CHECK-NEXT: add.rn.f64 %rd3, %rd2, 0d3FF0000000000000;
; CHECK-NEXT: st.volatile.b64 [%rd1], %rd3;
; CHECK-NEXT: ret;
%a.load = load atomic volatile double, ptr %a monotonic, align 8
%a.add = fadd double %a.load, 1.
store atomic volatile double %a.add, ptr %a monotonic, align 8
ret void
}
;; global statespace
; global
define void @global_i8(ptr addrspace(1) %a) {
; CHECK-LABEL: global_i8(
; CHECK: {
; CHECK-NEXT: .reg .b16 %rs<3>;
; CHECK-NEXT: .reg .b64 %rd<2>;
; CHECK-EMPTY:
; CHECK-NEXT: // %bb.0:
; CHECK-NEXT: ld.param.b64 %rd1, [global_i8_param_0];
; CHECK-NEXT: ld.global.b8 %rs1, [%rd1];
; CHECK-NEXT: add.s16 %rs2, %rs1, 1;
; CHECK-NEXT: st.global.b8 [%rd1], %rs2;
; CHECK-NEXT: ret;
%a.load = load i8, ptr addrspace(1) %a
%a.add = add i8 %a.load, 1
store i8 %a.add, ptr addrspace(1) %a
ret void
}
define void @global_i16(ptr addrspace(1) %a) {
; CHECK-LABEL: global_i16(
; CHECK: {
; CHECK-NEXT: .reg .b16 %rs<3>;
; CHECK-NEXT: .reg .b64 %rd<2>;
; CHECK-EMPTY:
; CHECK-NEXT: // %bb.0:
; CHECK-NEXT: ld.param.b64 %rd1, [global_i16_param_0];
; CHECK-NEXT: ld.global.b16 %rs1, [%rd1];
; CHECK-NEXT: add.s16 %rs2, %rs1, 1;
; CHECK-NEXT: st.global.b16 [%rd1], %rs2;
; CHECK-NEXT: ret;
%a.load = load i16, ptr addrspace(1) %a
%a.add = add i16 %a.load, 1
store i16 %a.add, ptr addrspace(1) %a
ret void
}
define void @global_i32(ptr addrspace(1) %a) {
; CHECK-LABEL: global_i32(
; CHECK: {
; CHECK-NEXT: .reg .b32 %r<3>;
; CHECK-NEXT: .reg .b64 %rd<2>;
; CHECK-EMPTY:
; CHECK-NEXT: // %bb.0:
; CHECK-NEXT: ld.param.b64 %rd1, [global_i32_param_0];
; CHECK-NEXT: ld.global.b32 %r1, [%rd1];
; CHECK-NEXT: add.s32 %r2, %r1, 1;
; CHECK-NEXT: st.global.b32 [%rd1], %r2;
; CHECK-NEXT: ret;
%a.load = load i32, ptr addrspace(1) %a
%a.add = add i32 %a.load, 1
store i32 %a.add, ptr addrspace(1) %a
ret void
}
define void @global_i64(ptr addrspace(1) %a) {
; CHECK-LABEL: global_i64(
; CHECK: {
; CHECK-NEXT: .reg .b64 %rd<4>;
; CHECK-EMPTY:
; CHECK-NEXT: // %bb.0:
; CHECK-NEXT: ld.param.b64 %rd1, [global_i64_param_0];
; CHECK-NEXT: ld.global.b64 %rd2, [%rd1];
; CHECK-NEXT: add.s64 %rd3, %rd2, 1;
; CHECK-NEXT: st.global.b64 [%rd1], %rd3;
; CHECK-NEXT: ret;
%a.load = load i64, ptr addrspace(1) %a
%a.add = add i64 %a.load, 1
store i64 %a.add, ptr addrspace(1) %a
ret void
}
define void @global_float(ptr addrspace(1) %a) {
; CHECK-LABEL: global_float(
; CHECK: {
; CHECK-NEXT: .reg .b32 %r<3>;
; CHECK-NEXT: .reg .b64 %rd<2>;
; CHECK-EMPTY:
; CHECK-NEXT: // %bb.0:
; CHECK-NEXT: ld.param.b64 %rd1, [global_float_param_0];
; CHECK-NEXT: ld.global.b32 %r1, [%rd1];
; CHECK-NEXT: add.rn.f32 %r2, %r1, 0f3F800000;
; CHECK-NEXT: st.global.b32 [%rd1], %r2;
; CHECK-NEXT: ret;
%a.load = load float, ptr addrspace(1) %a
%a.add = fadd float %a.load, 1.
store float %a.add, ptr addrspace(1) %a
ret void
}
define void @global_double(ptr addrspace(1) %a) {
; CHECK-LABEL: global_double(
; CHECK: {
; CHECK-NEXT: .reg .b64 %rd<4>;
; CHECK-EMPTY:
; CHECK-NEXT: // %bb.0:
; CHECK-NEXT: ld.param.b64 %rd1, [global_double_param_0];
; CHECK-NEXT: ld.global.b64 %rd2, [%rd1];
; CHECK-NEXT: add.rn.f64 %rd3, %rd2, 0d3FF0000000000000;
; CHECK-NEXT: st.global.b64 [%rd1], %rd3;
; CHECK-NEXT: ret;
%a.load = load double, ptr addrspace(1) %a
%a.add = fadd double %a.load, 1.
store double %a.add, ptr addrspace(1) %a
ret void
}
; global_volatile
define void @global_volatile_i8(ptr addrspace(1) %a) {
; CHECK-LABEL: global_volatile_i8(
; CHECK: {
; CHECK-NEXT: .reg .b16 %rs<3>;
; CHECK-NEXT: .reg .b64 %rd<2>;
; CHECK-EMPTY:
; CHECK-NEXT: // %bb.0:
; CHECK-NEXT: ld.param.b64 %rd1, [global_volatile_i8_param_0];
; CHECK-NEXT: ld.volatile.global.b8 %rs1, [%rd1];
; CHECK-NEXT: add.s16 %rs2, %rs1, 1;
; CHECK-NEXT: st.volatile.global.b8 [%rd1], %rs2;
; CHECK-NEXT: ret;
%a.load = load volatile i8, ptr addrspace(1) %a
%a.add = add i8 %a.load, 1
store volatile i8 %a.add, ptr addrspace(1) %a
ret void
}
define void @global_volatile_i16(ptr addrspace(1) %a) {
; CHECK-LABEL: global_volatile_i16(
; CHECK: {
; CHECK-NEXT: .reg .b16 %rs<3>;
; CHECK-NEXT: .reg .b64 %rd<2>;
; CHECK-EMPTY:
; CHECK-NEXT: // %bb.0:
; CHECK-NEXT: ld.param.b64 %rd1, [global_volatile_i16_param_0];
; CHECK-NEXT: ld.volatile.global.b16 %rs1, [%rd1];
; CHECK-NEXT: add.s16 %rs2, %rs1, 1;
; CHECK-NEXT: st.volatile.global.b16 [%rd1], %rs2;
; CHECK-NEXT: ret;
%a.load = load volatile i16, ptr addrspace(1) %a
%a.add = add i16 %a.load, 1
store volatile i16 %a.add, ptr addrspace(1) %a
ret void
}
define void @global_volatile_i32(ptr addrspace(1) %a) {
; CHECK-LABEL: global_volatile_i32(
; CHECK: {
; CHECK-NEXT: .reg .b32 %r<3>;
; CHECK-NEXT: .reg .b64 %rd<2>;
; CHECK-EMPTY:
; CHECK-NEXT: // %bb.0:
; CHECK-NEXT: ld.param.b64 %rd1, [global_volatile_i32_param_0];
; CHECK-NEXT: ld.volatile.global.b32 %r1, [%rd1];
; CHECK-NEXT: add.s32 %r2, %r1, 1;
; CHECK-NEXT: st.volatile.global.b32 [%rd1], %r2;
; CHECK-NEXT: ret;
%a.load = load volatile i32, ptr addrspace(1) %a
%a.add = add i32 %a.load, 1
store volatile i32 %a.add, ptr addrspace(1) %a
ret void
}
define void @global_volatile_i64(ptr addrspace(1) %a) {
; CHECK-LABEL: global_volatile_i64(
; CHECK: {
; CHECK-NEXT: .reg .b64 %rd<4>;
; CHECK-EMPTY:
; CHECK-NEXT: // %bb.0:
; CHECK-NEXT: ld.param.b64 %rd1, [global_volatile_i64_param_0];
; CHECK-NEXT: ld.volatile.global.b64 %rd2, [%rd1];
; CHECK-NEXT: add.s64 %rd3, %rd2, 1;
; CHECK-NEXT: st.volatile.global.b64 [%rd1], %rd3;
; CHECK-NEXT: ret;
%a.load = load volatile i64, ptr addrspace(1) %a
%a.add = add i64 %a.load, 1
store volatile i64 %a.add, ptr addrspace(1) %a
ret void
}
define void @global_volatile_float(ptr addrspace(1) %a) {
; CHECK-LABEL: global_volatile_float(
; CHECK: {
; CHECK-NEXT: .reg .b32 %r<3>;
; CHECK-NEXT: .reg .b64 %rd<2>;
; CHECK-EMPTY:
; CHECK-NEXT: // %bb.0:
; CHECK-NEXT: ld.param.b64 %rd1, [global_volatile_float_param_0];
; CHECK-NEXT: ld.volatile.global.b32 %r1, [%rd1];
; CHECK-NEXT: add.rn.f32 %r2, %r1, 0f3F800000;
; CHECK-NEXT: st.volatile.global.b32 [%rd1], %r2;
; CHECK-NEXT: ret;
%a.load = load volatile float, ptr addrspace(1) %a
%a.add = fadd float %a.load, 1.
store volatile float %a.add, ptr addrspace(1) %a
ret void
}
define void @global_volatile_double(ptr addrspace(1) %a) {
; CHECK-LABEL: global_volatile_double(
; CHECK: {
; CHECK-NEXT: .reg .b64 %rd<4>;
; CHECK-EMPTY:
; CHECK-NEXT: // %bb.0:
; CHECK-NEXT: ld.param.b64 %rd1, [global_volatile_double_param_0];
; CHECK-NEXT: ld.volatile.global.b64 %rd2, [%rd1];
; CHECK-NEXT: add.rn.f64 %rd3, %rd2, 0d3FF0000000000000;
; CHECK-NEXT: st.volatile.global.b64 [%rd1], %rd3;
; CHECK-NEXT: ret;
%a.load = load volatile double, ptr addrspace(1) %a
%a.add = fadd double %a.load, 1.
store volatile double %a.add, ptr addrspace(1) %a
ret void
}
; global_unordered_sys
define void @global_unordered_sys_i8(ptr addrspace(1) %a) {
; SM60-LABEL: global_unordered_sys_i8(
; SM60: {
; SM60-NEXT: .reg .b16 %rs<3>;
; SM60-NEXT: .reg .b64 %rd<2>;
; SM60-EMPTY:
; SM60-NEXT: // %bb.0:
; SM60-NEXT: ld.param.b64 %rd1, [global_unordered_sys_i8_param_0];
; SM60-NEXT: ld.volatile.global.b8 %rs1, [%rd1];
; SM60-NEXT: add.s16 %rs2, %rs1, 1;
; SM60-NEXT: st.volatile.global.b8 [%rd1], %rs2;
; SM60-NEXT: ret;
;
; SM70-LABEL: global_unordered_sys_i8(
; SM70: {
; SM70-NEXT: .reg .b16 %rs<3>;
; SM70-NEXT: .reg .b64 %rd<2>;
; SM70-EMPTY:
; SM70-NEXT: // %bb.0:
; SM70-NEXT: ld.param.b64 %rd1, [global_unordered_sys_i8_param_0];
; SM70-NEXT: ld.relaxed.sys.global.b8 %rs1, [%rd1];
; SM70-NEXT: add.s16 %rs2, %rs1, 1;
; SM70-NEXT: st.relaxed.sys.global.b8 [%rd1], %rs2;
; SM70-NEXT: ret;
%a.load = load atomic i8, ptr addrspace(1) %a unordered, align 1
%a.add = add i8 %a.load, 1
store atomic i8 %a.add, ptr addrspace(1) %a unordered, align 1
ret void
}
define void @global_unordered_sys_i16(ptr addrspace(1) %a) {
; SM60-LABEL: global_unordered_sys_i16(
; SM60: {
; SM60-NEXT: .reg .b16 %rs<3>;
; SM60-NEXT: .reg .b64 %rd<2>;
; SM60-EMPTY:
; SM60-NEXT: // %bb.0:
; SM60-NEXT: ld.param.b64 %rd1, [global_unordered_sys_i16_param_0];
; SM60-NEXT: ld.volatile.global.b16 %rs1, [%rd1];
; SM60-NEXT: add.s16 %rs2, %rs1, 1;
; SM60-NEXT: st.volatile.global.b16 [%rd1], %rs2;
; SM60-NEXT: ret;
;
; SM70-LABEL: global_unordered_sys_i16(
; SM70: {
; SM70-NEXT: .reg .b16 %rs<3>;
; SM70-NEXT: .reg .b64 %rd<2>;
; SM70-EMPTY:
; SM70-NEXT: // %bb.0:
; SM70-NEXT: ld.param.b64 %rd1, [global_unordered_sys_i16_param_0];
; SM70-NEXT: ld.relaxed.sys.global.b16 %rs1, [%rd1];
; SM70-NEXT: add.s16 %rs2, %rs1, 1;
; SM70-NEXT: st.relaxed.sys.global.b16 [%rd1], %rs2;
; SM70-NEXT: ret;
%a.load = load atomic i16, ptr addrspace(1) %a unordered, align 2
%a.add = add i16 %a.load, 1
store atomic i16 %a.add, ptr addrspace(1) %a unordered, align 2
ret void
}
define void @global_unordered_sys_i32(ptr addrspace(1) %a) {
; SM60-LABEL: global_unordered_sys_i32(
; SM60: {
; SM60-NEXT: .reg .b32 %r<3>;
; SM60-NEXT: .reg .b64 %rd<2>;
; SM60-EMPTY:
; SM60-NEXT: // %bb.0:
; SM60-NEXT: ld.param.b64 %rd1, [global_unordered_sys_i32_param_0];
; SM60-NEXT: ld.volatile.global.b32 %r1, [%rd1];
; SM60-NEXT: add.s32 %r2, %r1, 1;
; SM60-NEXT: st.volatile.global.b32 [%rd1], %r2;
; SM60-NEXT: ret;
;
; SM70-LABEL: global_unordered_sys_i32(
; SM70: {
; SM70-NEXT: .reg .b32 %r<3>;
; SM70-NEXT: .reg .b64 %rd<2>;
; SM70-EMPTY:
; SM70-NEXT: // %bb.0:
; SM70-NEXT: ld.param.b64 %rd1, [global_unordered_sys_i32_param_0];
; SM70-NEXT: ld.relaxed.sys.global.b32 %r1, [%rd1];
; SM70-NEXT: add.s32 %r2, %r1, 1;
; SM70-NEXT: st.relaxed.sys.global.b32 [%rd1], %r2;
; SM70-NEXT: ret;
%a.load = load atomic i32, ptr addrspace(1) %a unordered, align 4
%a.add = add i32 %a.load, 1
store atomic i32 %a.add, ptr addrspace(1) %a unordered, align 4
ret void
}
define void @global_unordered_sys_i64(ptr addrspace(1) %a) {
; SM60-LABEL: global_unordered_sys_i64(
; SM60: {
; SM60-NEXT: .reg .b64 %rd<4>;
; SM60-EMPTY:
; SM60-NEXT: // %bb.0:
; SM60-NEXT: ld.param.b64 %rd1, [global_unordered_sys_i64_param_0];
; SM60-NEXT: ld.volatile.global.b64 %rd2, [%rd1];
; SM60-NEXT: add.s64 %rd3, %rd2, 1;
; SM60-NEXT: st.volatile.global.b64 [%rd1], %rd3;
; SM60-NEXT: ret;
;
; SM70-LABEL: global_unordered_sys_i64(
; SM70: {
; SM70-NEXT: .reg .b64 %rd<4>;
; SM70-EMPTY:
; SM70-NEXT: // %bb.0:
; SM70-NEXT: ld.param.b64 %rd1, [global_unordered_sys_i64_param_0];
; SM70-NEXT: ld.relaxed.sys.global.b64 %rd2, [%rd1];
; SM70-NEXT: add.s64 %rd3, %rd2, 1;
; SM70-NEXT: st.relaxed.sys.global.b64 [%rd1], %rd3;
; SM70-NEXT: ret;
%a.load = load atomic i64, ptr addrspace(1) %a unordered, align 8
%a.add = add i64 %a.load, 1
store atomic i64 %a.add, ptr addrspace(1) %a unordered, align 8
ret void
}
define void @global_unordered_sys_float(ptr addrspace(1) %a) {
; SM60-LABEL: global_unordered_sys_float(
; SM60: {
; SM60-NEXT: .reg .b32 %r<3>;
; SM60-NEXT: .reg .b64 %rd<2>;
; SM60-EMPTY:
; SM60-NEXT: // %bb.0:
; SM60-NEXT: ld.param.b64 %rd1, [global_unordered_sys_float_param_0];
; SM60-NEXT: ld.volatile.global.b32 %r1, [%rd1];
; SM60-NEXT: add.rn.f32 %r2, %r1, 0f3F800000;
; SM60-NEXT: st.volatile.global.b32 [%rd1], %r2;
; SM60-NEXT: ret;
;
; SM70-LABEL: global_unordered_sys_float(
; SM70: {
; SM70-NEXT: .reg .b32 %r<3>;
; SM70-NEXT: .reg .b64 %rd<2>;
; SM70-EMPTY:
; SM70-NEXT: // %bb.0:
; SM70-NEXT: ld.param.b64 %rd1, [global_unordered_sys_float_param_0];
; SM70-NEXT: ld.relaxed.sys.global.b32 %r1, [%rd1];
; SM70-NEXT: add.rn.f32 %r2, %r1, 0f3F800000;
; SM70-NEXT: st.relaxed.sys.global.b32 [%rd1], %r2;
; SM70-NEXT: ret;
%a.load = load atomic float, ptr addrspace(1) %a unordered, align 4
%a.add = fadd float %a.load, 1.
store atomic float %a.add, ptr addrspace(1) %a unordered, align 4
ret void
}
define void @global_unordered_sys_double(ptr addrspace(1) %a) {
; SM60-LABEL: global_unordered_sys_double(
; SM60: {
; SM60-NEXT: .reg .b64 %rd<4>;
; SM60-EMPTY:
; SM60-NEXT: // %bb.0:
; SM60-NEXT: ld.param.b64 %rd1, [global_unordered_sys_double_param_0];
; SM60-NEXT: ld.volatile.global.b64 %rd2, [%rd1];
; SM60-NEXT: add.rn.f64 %rd3, %rd2, 0d3FF0000000000000;
; SM60-NEXT: st.volatile.global.b64 [%rd1], %rd3;
; SM60-NEXT: ret;
;
; SM70-LABEL: global_unordered_sys_double(
; SM70: {
; SM70-NEXT: .reg .b64 %rd<4>;
; SM70-EMPTY:
; SM70-NEXT: // %bb.0:
; SM70-NEXT: ld.param.b64 %rd1, [global_unordered_sys_double_param_0];
; SM70-NEXT: ld.relaxed.sys.global.b64 %rd2, [%rd1];
; SM70-NEXT: add.rn.f64 %rd3, %rd2, 0d3FF0000000000000;
; SM70-NEXT: st.relaxed.sys.global.b64 [%rd1], %rd3;
; SM70-NEXT: ret;
%a.load = load atomic double, ptr addrspace(1) %a unordered, align 8
%a.add = fadd double %a.load, 1.
store atomic double %a.add, ptr addrspace(1) %a unordered, align 8
ret void
}
; global_unordered_volatile_sys
define void @global_unordered_volatile_sys_i8(ptr addrspace(1) %a) {
; SM60-LABEL: global_unordered_volatile_sys_i8(
; SM60: {
; SM60-NEXT: .reg .b16 %rs<3>;
; SM60-NEXT: .reg .b64 %rd<2>;
; SM60-EMPTY:
; SM60-NEXT: // %bb.0:
; SM60-NEXT: ld.param.b64 %rd1, [global_unordered_volatile_sys_i8_param_0];
; SM60-NEXT: ld.volatile.global.b8 %rs1, [%rd1];
; SM60-NEXT: add.s16 %rs2, %rs1, 1;
; SM60-NEXT: st.volatile.global.b8 [%rd1], %rs2;
; SM60-NEXT: ret;
;
; SM70-LABEL: global_unordered_volatile_sys_i8(
; SM70: {
; SM70-NEXT: .reg .b16 %rs<3>;
; SM70-NEXT: .reg .b64 %rd<2>;
; SM70-EMPTY:
; SM70-NEXT: // %bb.0:
; SM70-NEXT: ld.param.b64 %rd1, [global_unordered_volatile_sys_i8_param_0];
; SM70-NEXT: ld.mmio.relaxed.sys.global.b8 %rs1, [%rd1];
; SM70-NEXT: add.s16 %rs2, %rs1, 1;
; SM70-NEXT: st.mmio.relaxed.sys.global.b8 [%rd1], %rs2;
; SM70-NEXT: ret;
%a.load = load atomic volatile i8, ptr addrspace(1) %a unordered, align 1
%a.add = add i8 %a.load, 1
store atomic volatile i8 %a.add, ptr addrspace(1) %a unordered, align 1
ret void
}
define void @global_unordered_volatile_sys_i16(ptr addrspace(1) %a) {
; SM60-LABEL: global_unordered_volatile_sys_i16(
; SM60: {
; SM60-NEXT: .reg .b16 %rs<3>;
; SM60-NEXT: .reg .b64 %rd<2>;
; SM60-EMPTY:
; SM60-NEXT: // %bb.0:
; SM60-NEXT: ld.param.b64 %rd1, [global_unordered_volatile_sys_i16_param_0];
; SM60-NEXT: ld.volatile.global.b16 %rs1, [%rd1];
; SM60-NEXT: add.s16 %rs2, %rs1, 1;
; SM60-NEXT: st.volatile.global.b16 [%rd1], %rs2;
; SM60-NEXT: ret;
;
; SM70-LABEL: global_unordered_volatile_sys_i16(
; SM70: {
; SM70-NEXT: .reg .b16 %rs<3>;
; SM70-NEXT: .reg .b64 %rd<2>;
; SM70-EMPTY:
; SM70-NEXT: // %bb.0:
; SM70-NEXT: ld.param.b64 %rd1, [global_unordered_volatile_sys_i16_param_0];
; SM70-NEXT: ld.mmio.relaxed.sys.global.b16 %rs1, [%rd1];
; SM70-NEXT: add.s16 %rs2, %rs1, 1;
; SM70-NEXT: st.mmio.relaxed.sys.global.b16 [%rd1], %rs2;
; SM70-NEXT: ret;
%a.load = load atomic volatile i16, ptr addrspace(1) %a unordered, align 2
%a.add = add i16 %a.load, 1
store atomic volatile i16 %a.add, ptr addrspace(1) %a unordered, align 2
ret void
}
define void @global_unordered_volatile_sys_i32(ptr addrspace(1) %a) {
; SM60-LABEL: global_unordered_volatile_sys_i32(
; SM60: {
; SM60-NEXT: .reg .b32 %r<3>;
; SM60-NEXT: .reg .b64 %rd<2>;
; SM60-EMPTY:
; SM60-NEXT: // %bb.0:
; SM60-NEXT: ld.param.b64 %rd1, [global_unordered_volatile_sys_i32_param_0];
; SM60-NEXT: ld.volatile.global.b32 %r1, [%rd1];
; SM60-NEXT: add.s32 %r2, %r1, 1;
; SM60-NEXT: st.volatile.global.b32 [%rd1], %r2;
; SM60-NEXT: ret;
;
; SM70-LABEL: global_unordered_volatile_sys_i32(
; SM70: {
; SM70-NEXT: .reg .b32 %r<3>;
; SM70-NEXT: .reg .b64 %rd<2>;
; SM70-EMPTY:
; SM70-NEXT: // %bb.0:
; SM70-NEXT: ld.param.b64 %rd1, [global_unordered_volatile_sys_i32_param_0];
; SM70-NEXT: ld.mmio.relaxed.sys.global.b32 %r1, [%rd1];
; SM70-NEXT: add.s32 %r2, %r1, 1;
; SM70-NEXT: st.mmio.relaxed.sys.global.b32 [%rd1], %r2;
; SM70-NEXT: ret;
%a.load = load atomic volatile i32, ptr addrspace(1) %a unordered, align 4
%a.add = add i32 %a.load, 1
store atomic volatile i32 %a.add, ptr addrspace(1) %a unordered, align 4
ret void
}
define void @global_unordered_volatile_sys_i64(ptr addrspace(1) %a) {
; SM60-LABEL: global_unordered_volatile_sys_i64(
; SM60: {
; SM60-NEXT: .reg .b64 %rd<4>;
; SM60-EMPTY:
; SM60-NEXT: // %bb.0:
; SM60-NEXT: ld.param.b64 %rd1, [global_unordered_volatile_sys_i64_param_0];
; SM60-NEXT: ld.volatile.global.b64 %rd2, [%rd1];
; SM60-NEXT: add.s64 %rd3, %rd2, 1;
; SM60-NEXT: st.volatile.global.b64 [%rd1], %rd3;
; SM60-NEXT: ret;
;
; SM70-LABEL: global_unordered_volatile_sys_i64(
; SM70: {
; SM70-NEXT: .reg .b64 %rd<4>;
; SM70-EMPTY:
; SM70-NEXT: // %bb.0:
; SM70-NEXT: ld.param.b64 %rd1, [global_unordered_volatile_sys_i64_param_0];
; SM70-NEXT: ld.mmio.relaxed.sys.global.b64 %rd2, [%rd1];
; SM70-NEXT: add.s64 %rd3, %rd2, 1;
; SM70-NEXT: st.mmio.relaxed.sys.global.b64 [%rd1], %rd3;
; SM70-NEXT: ret;
%a.load = load atomic volatile i64, ptr addrspace(1) %a unordered, align 8
%a.add = add i64 %a.load, 1
store atomic volatile i64 %a.add, ptr addrspace(1) %a unordered, align 8
ret void
}
define void @global_unordered_volatile_sys_float(ptr addrspace(1) %a) {
; SM60-LABEL: global_unordered_volatile_sys_float(
; SM60: {
; SM60-NEXT: .reg .b32 %r<3>;
; SM60-NEXT: .reg .b64 %rd<2>;
; SM60-EMPTY:
; SM60-NEXT: // %bb.0:
; SM60-NEXT: ld.param.b64 %rd1, [global_unordered_volatile_sys_float_param_0];
; SM60-NEXT: ld.volatile.global.b32 %r1, [%rd1];
; SM60-NEXT: add.rn.f32 %r2, %r1, 0f3F800000;
; SM60-NEXT: st.volatile.global.b32 [%rd1], %r2;
; SM60-NEXT: ret;
;
; SM70-LABEL: global_unordered_volatile_sys_float(
; SM70: {
; SM70-NEXT: .reg .b32 %r<3>;
; SM70-NEXT: .reg .b64 %rd<2>;
; SM70-EMPTY:
; SM70-NEXT: // %bb.0:
; SM70-NEXT: ld.param.b64 %rd1, [global_unordered_volatile_sys_float_param_0];
; SM70-NEXT: ld.mmio.relaxed.sys.global.b32 %r1, [%rd1];
; SM70-NEXT: add.rn.f32 %r2, %r1, 0f3F800000;
; SM70-NEXT: st.mmio.relaxed.sys.global.b32 [%rd1], %r2;
; SM70-NEXT: ret;
%a.load = load atomic volatile float, ptr addrspace(1) %a unordered, align 4
%a.add = fadd float %a.load, 1.
store atomic volatile float %a.add, ptr addrspace(1) %a unordered, align 4
ret void
}
define void @global_unordered_volatile_sys_double(ptr addrspace(1) %a) {
; SM60-LABEL: global_unordered_volatile_sys_double(
; SM60: {
; SM60-NEXT: .reg .b64 %rd<4>;
; SM60-EMPTY:
; SM60-NEXT: // %bb.0:
; SM60-NEXT: ld.param.b64 %rd1, [global_unordered_volatile_sys_double_param_0];
; SM60-NEXT: ld.volatile.global.b64 %rd2, [%rd1];
; SM60-NEXT: add.rn.f64 %rd3, %rd2, 0d3FF0000000000000;
; SM60-NEXT: st.volatile.global.b64 [%rd1], %rd3;
; SM60-NEXT: ret;
;
; SM70-LABEL: global_unordered_volatile_sys_double(
; SM70: {
; SM70-NEXT: .reg .b64 %rd<4>;
; SM70-EMPTY:
; SM70-NEXT: // %bb.0:
; SM70-NEXT: ld.param.b64 %rd1, [global_unordered_volatile_sys_double_param_0];
; SM70-NEXT: ld.mmio.relaxed.sys.global.b64 %rd2, [%rd1];
; SM70-NEXT: add.rn.f64 %rd3, %rd2, 0d3FF0000000000000;
; SM70-NEXT: st.mmio.relaxed.sys.global.b64 [%rd1], %rd3;
; SM70-NEXT: ret;
%a.load = load atomic volatile double, ptr addrspace(1) %a unordered, align 8
%a.add = fadd double %a.load, 1.
store atomic volatile double %a.add, ptr addrspace(1) %a unordered, align 8
ret void
}
; global_monotonic_sys
define void @global_monotonic_sys_i8(ptr addrspace(1) %a) {
; SM60-LABEL: global_monotonic_sys_i8(
; SM60: {
; SM60-NEXT: .reg .b16 %rs<3>;
; SM60-NEXT: .reg .b64 %rd<2>;
; SM60-EMPTY:
; SM60-NEXT: // %bb.0:
; SM60-NEXT: ld.param.b64 %rd1, [global_monotonic_sys_i8_param_0];
; SM60-NEXT: ld.volatile.global.b8 %rs1, [%rd1];
; SM60-NEXT: add.s16 %rs2, %rs1, 1;
; SM60-NEXT: st.volatile.global.b8 [%rd1], %rs2;
; SM60-NEXT: ret;
;
; SM70-LABEL: global_monotonic_sys_i8(
; SM70: {
; SM70-NEXT: .reg .b16 %rs<3>;
; SM70-NEXT: .reg .b64 %rd<2>;
; SM70-EMPTY:
; SM70-NEXT: // %bb.0:
; SM70-NEXT: ld.param.b64 %rd1, [global_monotonic_sys_i8_param_0];
; SM70-NEXT: ld.relaxed.sys.global.b8 %rs1, [%rd1];
; SM70-NEXT: add.s16 %rs2, %rs1, 1;
; SM70-NEXT: st.relaxed.sys.global.b8 [%rd1], %rs2;
; SM70-NEXT: ret;
%a.load = load atomic i8, ptr addrspace(1) %a monotonic, align 1
%a.add = add i8 %a.load, 1
store atomic i8 %a.add, ptr addrspace(1) %a monotonic, align 1
ret void
}
define void @global_monotonic_sys_i16(ptr addrspace(1) %a) {
; SM60-LABEL: global_monotonic_sys_i16(
; SM60: {
; SM60-NEXT: .reg .b16 %rs<3>;
; SM60-NEXT: .reg .b64 %rd<2>;
; SM60-EMPTY:
; SM60-NEXT: // %bb.0:
; SM60-NEXT: ld.param.b64 %rd1, [global_monotonic_sys_i16_param_0];
; SM60-NEXT: ld.volatile.global.b16 %rs1, [%rd1];
; SM60-NEXT: add.s16 %rs2, %rs1, 1;
; SM60-NEXT: st.volatile.global.b16 [%rd1], %rs2;
; SM60-NEXT: ret;
;
; SM70-LABEL: global_monotonic_sys_i16(
; SM70: {
; SM70-NEXT: .reg .b16 %rs<3>;
; SM70-NEXT: .reg .b64 %rd<2>;
; SM70-EMPTY:
; SM70-NEXT: // %bb.0:
; SM70-NEXT: ld.param.b64 %rd1, [global_monotonic_sys_i16_param_0];
; SM70-NEXT: ld.relaxed.sys.global.b16 %rs1, [%rd1];
; SM70-NEXT: add.s16 %rs2, %rs1, 1;
; SM70-NEXT: st.relaxed.sys.global.b16 [%rd1], %rs2;
; SM70-NEXT: ret;
%a.load = load atomic i16, ptr addrspace(1) %a monotonic, align 2
%a.add = add i16 %a.load, 1
store atomic i16 %a.add, ptr addrspace(1) %a monotonic, align 2
ret void
}
define void @global_monotonic_sys_i32(ptr addrspace(1) %a) {
; SM60-LABEL: global_monotonic_sys_i32(
; SM60: {
; SM60-NEXT: .reg .b32 %r<3>;
; SM60-NEXT: .reg .b64 %rd<2>;
; SM60-EMPTY:
; SM60-NEXT: // %bb.0:
; SM60-NEXT: ld.param.b64 %rd1, [global_monotonic_sys_i32_param_0];
; SM60-NEXT: ld.volatile.global.b32 %r1, [%rd1];
; SM60-NEXT: add.s32 %r2, %r1, 1;
; SM60-NEXT: st.volatile.global.b32 [%rd1], %r2;
; SM60-NEXT: ret;
;
; SM70-LABEL: global_monotonic_sys_i32(
; SM70: {
; SM70-NEXT: .reg .b32 %r<3>;
; SM70-NEXT: .reg .b64 %rd<2>;
; SM70-EMPTY:
; SM70-NEXT: // %bb.0:
; SM70-NEXT: ld.param.b64 %rd1, [global_monotonic_sys_i32_param_0];
; SM70-NEXT: ld.relaxed.sys.global.b32 %r1, [%rd1];
; SM70-NEXT: add.s32 %r2, %r1, 1;
; SM70-NEXT: st.relaxed.sys.global.b32 [%rd1], %r2;
; SM70-NEXT: ret;
%a.load = load atomic i32, ptr addrspace(1) %a monotonic, align 4
%a.add = add i32 %a.load, 1
store atomic i32 %a.add, ptr addrspace(1) %a monotonic, align 4
ret void
}
define void @global_monotonic_sys_i64(ptr addrspace(1) %a) {
; SM60-LABEL: global_monotonic_sys_i64(
; SM60: {
; SM60-NEXT: .reg .b64 %rd<4>;
; SM60-EMPTY:
; SM60-NEXT: // %bb.0:
; SM60-NEXT: ld.param.b64 %rd1, [global_monotonic_sys_i64_param_0];
; SM60-NEXT: ld.volatile.global.b64 %rd2, [%rd1];
; SM60-NEXT: add.s64 %rd3, %rd2, 1;
; SM60-NEXT: st.volatile.global.b64 [%rd1], %rd3;
; SM60-NEXT: ret;
;
; SM70-LABEL: global_monotonic_sys_i64(
; SM70: {
; SM70-NEXT: .reg .b64 %rd<4>;
; SM70-EMPTY:
; SM70-NEXT: // %bb.0:
; SM70-NEXT: ld.param.b64 %rd1, [global_monotonic_sys_i64_param_0];
; SM70-NEXT: ld.relaxed.sys.global.b64 %rd2, [%rd1];
; SM70-NEXT: add.s64 %rd3, %rd2, 1;
; SM70-NEXT: st.relaxed.sys.global.b64 [%rd1], %rd3;
; SM70-NEXT: ret;
%a.load = load atomic i64, ptr addrspace(1) %a monotonic, align 8
%a.add = add i64 %a.load, 1
store atomic i64 %a.add, ptr addrspace(1) %a monotonic, align 8
ret void
}
define void @global_monotonic_sys_float(ptr addrspace(1) %a) {
; SM60-LABEL: global_monotonic_sys_float(
; SM60: {
; SM60-NEXT: .reg .b32 %r<3>;
; SM60-NEXT: .reg .b64 %rd<2>;
; SM60-EMPTY:
; SM60-NEXT: // %bb.0:
; SM60-NEXT: ld.param.b64 %rd1, [global_monotonic_sys_float_param_0];
; SM60-NEXT: ld.volatile.global.b32 %r1, [%rd1];
; SM60-NEXT: add.rn.f32 %r2, %r1, 0f3F800000;
; SM60-NEXT: st.volatile.global.b32 [%rd1], %r2;
; SM60-NEXT: ret;
;
; SM70-LABEL: global_monotonic_sys_float(
; SM70: {
; SM70-NEXT: .reg .b32 %r<3>;
; SM70-NEXT: .reg .b64 %rd<2>;
; SM70-EMPTY:
; SM70-NEXT: // %bb.0:
; SM70-NEXT: ld.param.b64 %rd1, [global_monotonic_sys_float_param_0];
; SM70-NEXT: ld.relaxed.sys.global.b32 %r1, [%rd1];
; SM70-NEXT: add.rn.f32 %r2, %r1, 0f3F800000;
; SM70-NEXT: st.relaxed.sys.global.b32 [%rd1], %r2;
; SM70-NEXT: ret;
%a.load = load atomic float, ptr addrspace(1) %a monotonic, align 4
%a.add = fadd float %a.load, 1.
store atomic float %a.add, ptr addrspace(1) %a monotonic, align 4
ret void
}
define void @global_monotonic_sys_double(ptr addrspace(1) %a) {
; SM60-LABEL: global_monotonic_sys_double(
; SM60: {
; SM60-NEXT: .reg .b64 %rd<4>;
; SM60-EMPTY:
; SM60-NEXT: // %bb.0:
; SM60-NEXT: ld.param.b64 %rd1, [global_monotonic_sys_double_param_0];
; SM60-NEXT: ld.volatile.global.b64 %rd2, [%rd1];
; SM60-NEXT: add.rn.f64 %rd3, %rd2, 0d3FF0000000000000;
; SM60-NEXT: st.volatile.global.b64 [%rd1], %rd3;
; SM60-NEXT: ret;
;
; SM70-LABEL: global_monotonic_sys_double(
; SM70: {
; SM70-NEXT: .reg .b64 %rd<4>;
; SM70-EMPTY:
; SM70-NEXT: // %bb.0:
; SM70-NEXT: ld.param.b64 %rd1, [global_monotonic_sys_double_param_0];
; SM70-NEXT: ld.relaxed.sys.global.b64 %rd2, [%rd1];
; SM70-NEXT: add.rn.f64 %rd3, %rd2, 0d3FF0000000000000;
; SM70-NEXT: st.relaxed.sys.global.b64 [%rd1], %rd3;
; SM70-NEXT: ret;
%a.load = load atomic double, ptr addrspace(1) %a monotonic, align 8
%a.add = fadd double %a.load, 1.
store atomic double %a.add, ptr addrspace(1) %a monotonic, align 8
ret void
}
; global_monotonic_volatile_sys
define void @global_monotonic_volatile_sys_i8(ptr addrspace(1) %a) {
; SM60-LABEL: global_monotonic_volatile_sys_i8(
; SM60: {
; SM60-NEXT: .reg .b16 %rs<3>;
; SM60-NEXT: .reg .b64 %rd<2>;
; SM60-EMPTY:
; SM60-NEXT: // %bb.0:
; SM60-NEXT: ld.param.b64 %rd1, [global_monotonic_volatile_sys_i8_param_0];
; SM60-NEXT: ld.volatile.global.b8 %rs1, [%rd1];
; SM60-NEXT: add.s16 %rs2, %rs1, 1;
; SM60-NEXT: st.volatile.global.b8 [%rd1], %rs2;
; SM60-NEXT: ret;
;
; SM70-LABEL: global_monotonic_volatile_sys_i8(
; SM70: {
; SM70-NEXT: .reg .b16 %rs<3>;
; SM70-NEXT: .reg .b64 %rd<2>;
; SM70-EMPTY:
; SM70-NEXT: // %bb.0:
; SM70-NEXT: ld.param.b64 %rd1, [global_monotonic_volatile_sys_i8_param_0];
; SM70-NEXT: ld.mmio.relaxed.sys.global.b8 %rs1, [%rd1];
; SM70-NEXT: add.s16 %rs2, %rs1, 1;
; SM70-NEXT: st.mmio.relaxed.sys.global.b8 [%rd1], %rs2;
; SM70-NEXT: ret;
%a.load = load atomic volatile i8, ptr addrspace(1) %a monotonic, align 1
%a.add = add i8 %a.load, 1
store atomic volatile i8 %a.add, ptr addrspace(1) %a monotonic, align 1
ret void
}
define void @global_monotonic_volatile_sys_i16(ptr addrspace(1) %a) {
; SM60-LABEL: global_monotonic_volatile_sys_i16(
; SM60: {
; SM60-NEXT: .reg .b16 %rs<3>;
; SM60-NEXT: .reg .b64 %rd<2>;
; SM60-EMPTY:
; SM60-NEXT: // %bb.0:
; SM60-NEXT: ld.param.b64 %rd1, [global_monotonic_volatile_sys_i16_param_0];
; SM60-NEXT: ld.volatile.global.b16 %rs1, [%rd1];
; SM60-NEXT: add.s16 %rs2, %rs1, 1;
; SM60-NEXT: st.volatile.global.b16 [%rd1], %rs2;
; SM60-NEXT: ret;
;
; SM70-LABEL: global_monotonic_volatile_sys_i16(
; SM70: {
; SM70-NEXT: .reg .b16 %rs<3>;
; SM70-NEXT: .reg .b64 %rd<2>;
; SM70-EMPTY:
; SM70-NEXT: // %bb.0:
; SM70-NEXT: ld.param.b64 %rd1, [global_monotonic_volatile_sys_i16_param_0];
; SM70-NEXT: ld.mmio.relaxed.sys.global.b16 %rs1, [%rd1];
; SM70-NEXT: add.s16 %rs2, %rs1, 1;
; SM70-NEXT: st.mmio.relaxed.sys.global.b16 [%rd1], %rs2;
; SM70-NEXT: ret;
%a.load = load atomic volatile i16, ptr addrspace(1) %a monotonic, align 2
%a.add = add i16 %a.load, 1
store atomic volatile i16 %a.add, ptr addrspace(1) %a monotonic, align 2
ret void
}
define void @global_monotonic_volatile_sys_i32(ptr addrspace(1) %a) {
; SM60-LABEL: global_monotonic_volatile_sys_i32(
; SM60: {
; SM60-NEXT: .reg .b32 %r<3>;
; SM60-NEXT: .reg .b64 %rd<2>;
; SM60-EMPTY:
; SM60-NEXT: // %bb.0:
; SM60-NEXT: ld.param.b64 %rd1, [global_monotonic_volatile_sys_i32_param_0];
; SM60-NEXT: ld.volatile.global.b32 %r1, [%rd1];
; SM60-NEXT: add.s32 %r2, %r1, 1;
; SM60-NEXT: st.volatile.global.b32 [%rd1], %r2;
; SM60-NEXT: ret;
;
; SM70-LABEL: global_monotonic_volatile_sys_i32(
; SM70: {
; SM70-NEXT: .reg .b32 %r<3>;
; SM70-NEXT: .reg .b64 %rd<2>;
; SM70-EMPTY:
; SM70-NEXT: // %bb.0:
; SM70-NEXT: ld.param.b64 %rd1, [global_monotonic_volatile_sys_i32_param_0];
; SM70-NEXT: ld.mmio.relaxed.sys.global.b32 %r1, [%rd1];
; SM70-NEXT: add.s32 %r2, %r1, 1;
; SM70-NEXT: st.mmio.relaxed.sys.global.b32 [%rd1], %r2;
; SM70-NEXT: ret;
%a.load = load atomic volatile i32, ptr addrspace(1) %a monotonic, align 4
%a.add = add i32 %a.load, 1
store atomic volatile i32 %a.add, ptr addrspace(1) %a monotonic, align 4
ret void
}
define void @global_monotonic_volatile_sys_i64(ptr addrspace(1) %a) {
; SM60-LABEL: global_monotonic_volatile_sys_i64(
; SM60: {
; SM60-NEXT: .reg .b64 %rd<4>;
; SM60-EMPTY:
; SM60-NEXT: // %bb.0:
; SM60-NEXT: ld.param.b64 %rd1, [global_monotonic_volatile_sys_i64_param_0];
; SM60-NEXT: ld.volatile.global.b64 %rd2, [%rd1];
; SM60-NEXT: add.s64 %rd3, %rd2, 1;
; SM60-NEXT: st.volatile.global.b64 [%rd1], %rd3;
; SM60-NEXT: ret;
;
; SM70-LABEL: global_monotonic_volatile_sys_i64(
; SM70: {
; SM70-NEXT: .reg .b64 %rd<4>;
; SM70-EMPTY:
; SM70-NEXT: // %bb.0:
; SM70-NEXT: ld.param.b64 %rd1, [global_monotonic_volatile_sys_i64_param_0];
; SM70-NEXT: ld.mmio.relaxed.sys.global.b64 %rd2, [%rd1];
; SM70-NEXT: add.s64 %rd3, %rd2, 1;
; SM70-NEXT: st.mmio.relaxed.sys.global.b64 [%rd1], %rd3;
; SM70-NEXT: ret;
%a.load = load atomic volatile i64, ptr addrspace(1) %a monotonic, align 8
%a.add = add i64 %a.load, 1
store atomic volatile i64 %a.add, ptr addrspace(1) %a monotonic, align 8
ret void
}
define void @global_monotonic_volatile_sys_float(ptr addrspace(1) %a) {
; SM60-LABEL: global_monotonic_volatile_sys_float(
; SM60: {
; SM60-NEXT: .reg .b32 %r<3>;
; SM60-NEXT: .reg .b64 %rd<2>;
; SM60-EMPTY:
; SM60-NEXT: // %bb.0:
; SM60-NEXT: ld.param.b64 %rd1, [global_monotonic_volatile_sys_float_param_0];
; SM60-NEXT: ld.volatile.global.b32 %r1, [%rd1];
; SM60-NEXT: add.rn.f32 %r2, %r1, 0f3F800000;
; SM60-NEXT: st.volatile.global.b32 [%rd1], %r2;
; SM60-NEXT: ret;
;
; SM70-LABEL: global_monotonic_volatile_sys_float(
; SM70: {
; SM70-NEXT: .reg .b32 %r<3>;
; SM70-NEXT: .reg .b64 %rd<2>;
; SM70-EMPTY:
; SM70-NEXT: // %bb.0:
; SM70-NEXT: ld.param.b64 %rd1, [global_monotonic_volatile_sys_float_param_0];
; SM70-NEXT: ld.mmio.relaxed.sys.global.b32 %r1, [%rd1];
; SM70-NEXT: add.rn.f32 %r2, %r1, 0f3F800000;
; SM70-NEXT: st.mmio.relaxed.sys.global.b32 [%rd1], %r2;
; SM70-NEXT: ret;
%a.load = load atomic volatile float, ptr addrspace(1) %a monotonic, align 4
%a.add = fadd float %a.load, 1.
store atomic volatile float %a.add, ptr addrspace(1) %a monotonic, align 4
ret void
}
define void @global_monotonic_volatile_sys_double(ptr addrspace(1) %a) {
; SM60-LABEL: global_monotonic_volatile_sys_double(
; SM60: {
; SM60-NEXT: .reg .b64 %rd<4>;
; SM60-EMPTY:
; SM60-NEXT: // %bb.0:
; SM60-NEXT: ld.param.b64 %rd1, [global_monotonic_volatile_sys_double_param_0];
; SM60-NEXT: ld.volatile.global.b64 %rd2, [%rd1];
; SM60-NEXT: add.rn.f64 %rd3, %rd2, 0d3FF0000000000000;
; SM60-NEXT: st.volatile.global.b64 [%rd1], %rd3;
; SM60-NEXT: ret;
;
; SM70-LABEL: global_monotonic_volatile_sys_double(
; SM70: {
; SM70-NEXT: .reg .b64 %rd<4>;
; SM70-EMPTY:
; SM70-NEXT: // %bb.0:
; SM70-NEXT: ld.param.b64 %rd1, [global_monotonic_volatile_sys_double_param_0];
; SM70-NEXT: ld.mmio.relaxed.sys.global.b64 %rd2, [%rd1];
; SM70-NEXT: add.rn.f64 %rd3, %rd2, 0d3FF0000000000000;
; SM70-NEXT: st.mmio.relaxed.sys.global.b64 [%rd1], %rd3;
; SM70-NEXT: ret;
%a.load = load atomic volatile double, ptr addrspace(1) %a monotonic, align 8
%a.add = fadd double %a.load, 1.
store atomic volatile double %a.add, ptr addrspace(1) %a monotonic, align 8
ret void
}
;; shared statespace
; shared
define void @shared_i8(ptr addrspace(3) %a) {
; CHECK-LABEL: shared_i8(
; CHECK: {
; CHECK-NEXT: .reg .b16 %rs<3>;
; CHECK-NEXT: .reg .b64 %rd<2>;
; CHECK-EMPTY:
; CHECK-NEXT: // %bb.0:
; CHECK-NEXT: ld.param.b64 %rd1, [shared_i8_param_0];
; CHECK-NEXT: ld.shared.b8 %rs1, [%rd1];
; CHECK-NEXT: add.s16 %rs2, %rs1, 1;
; CHECK-NEXT: st.shared.b8 [%rd1], %rs2;
; CHECK-NEXT: ret;
%a.load = load i8, ptr addrspace(3) %a
%a.add = add i8 %a.load, 1
store i8 %a.add, ptr addrspace(3) %a
ret void
}
define void @shared_i16(ptr addrspace(3) %a) {
; CHECK-LABEL: shared_i16(
; CHECK: {
; CHECK-NEXT: .reg .b16 %rs<3>;
; CHECK-NEXT: .reg .b64 %rd<2>;
; CHECK-EMPTY:
; CHECK-NEXT: // %bb.0:
; CHECK-NEXT: ld.param.b64 %rd1, [shared_i16_param_0];
; CHECK-NEXT: ld.shared.b16 %rs1, [%rd1];
; CHECK-NEXT: add.s16 %rs2, %rs1, 1;
; CHECK-NEXT: st.shared.b16 [%rd1], %rs2;
; CHECK-NEXT: ret;
%a.load = load i16, ptr addrspace(3) %a
%a.add = add i16 %a.load, 1
store i16 %a.add, ptr addrspace(3) %a
ret void
}
define void @shared_i32(ptr addrspace(3) %a) {
; CHECK-LABEL: shared_i32(
; CHECK: {
; CHECK-NEXT: .reg .b32 %r<3>;
; CHECK-NEXT: .reg .b64 %rd<2>;
; CHECK-EMPTY:
; CHECK-NEXT: // %bb.0:
; CHECK-NEXT: ld.param.b64 %rd1, [shared_i32_param_0];
; CHECK-NEXT: ld.shared.b32 %r1, [%rd1];
; CHECK-NEXT: add.s32 %r2, %r1, 1;
; CHECK-NEXT: st.shared.b32 [%rd1], %r2;
; CHECK-NEXT: ret;
%a.load = load i32, ptr addrspace(3) %a
%a.add = add i32 %a.load, 1
store i32 %a.add, ptr addrspace(3) %a
ret void
}
define void @shared_i64(ptr addrspace(3) %a) {
; CHECK-LABEL: shared_i64(
; CHECK: {
; CHECK-NEXT: .reg .b64 %rd<4>;
; CHECK-EMPTY:
; CHECK-NEXT: // %bb.0:
; CHECK-NEXT: ld.param.b64 %rd1, [shared_i64_param_0];
; CHECK-NEXT: ld.shared.b64 %rd2, [%rd1];
; CHECK-NEXT: add.s64 %rd3, %rd2, 1;
; CHECK-NEXT: st.shared.b64 [%rd1], %rd3;
; CHECK-NEXT: ret;
%a.load = load i64, ptr addrspace(3) %a
%a.add = add i64 %a.load, 1
store i64 %a.add, ptr addrspace(3) %a
ret void
}
define void @shared_float(ptr addrspace(3) %a) {
; CHECK-LABEL: shared_float(
; CHECK: {
; CHECK-NEXT: .reg .b32 %r<3>;
; CHECK-NEXT: .reg .b64 %rd<2>;
; CHECK-EMPTY:
; CHECK-NEXT: // %bb.0:
; CHECK-NEXT: ld.param.b64 %rd1, [shared_float_param_0];
; CHECK-NEXT: ld.shared.b32 %r1, [%rd1];
; CHECK-NEXT: add.rn.f32 %r2, %r1, 0f3F800000;
; CHECK-NEXT: st.shared.b32 [%rd1], %r2;
; CHECK-NEXT: ret;
%a.load = load float, ptr addrspace(3) %a
%a.add = fadd float %a.load, 1.
store float %a.add, ptr addrspace(3) %a
ret void
}
define void @shared_double(ptr addrspace(3) %a) {
; CHECK-LABEL: shared_double(
; CHECK: {
; CHECK-NEXT: .reg .b64 %rd<4>;
; CHECK-EMPTY:
; CHECK-NEXT: // %bb.0:
; CHECK-NEXT: ld.param.b64 %rd1, [shared_double_param_0];
; CHECK-NEXT: ld.shared.b64 %rd2, [%rd1];
; CHECK-NEXT: add.rn.f64 %rd3, %rd2, 0d3FF0000000000000;
; CHECK-NEXT: st.shared.b64 [%rd1], %rd3;
; CHECK-NEXT: ret;
%a.load = load double, ptr addrspace(3) %a
%a.add = fadd double %a.load, 1.
store double %a.add, ptr addrspace(3) %a
ret void
}
; shared_volatile
define void @shared_volatile_i8(ptr addrspace(3) %a) {
; CHECK-LABEL: shared_volatile_i8(
; CHECK: {
; CHECK-NEXT: .reg .b16 %rs<3>;
; CHECK-NEXT: .reg .b64 %rd<2>;
; CHECK-EMPTY:
; CHECK-NEXT: // %bb.0:
; CHECK-NEXT: ld.param.b64 %rd1, [shared_volatile_i8_param_0];
; CHECK-NEXT: ld.volatile.shared.b8 %rs1, [%rd1];
; CHECK-NEXT: add.s16 %rs2, %rs1, 1;
; CHECK-NEXT: st.volatile.shared.b8 [%rd1], %rs2;
; CHECK-NEXT: ret;
%a.load = load volatile i8, ptr addrspace(3) %a
%a.add = add i8 %a.load, 1
store volatile i8 %a.add, ptr addrspace(3) %a
ret void
}
define void @shared_volatile_i16(ptr addrspace(3) %a) {
; CHECK-LABEL: shared_volatile_i16(
; CHECK: {
; CHECK-NEXT: .reg .b16 %rs<3>;
; CHECK-NEXT: .reg .b64 %rd<2>;
; CHECK-EMPTY:
; CHECK-NEXT: // %bb.0:
; CHECK-NEXT: ld.param.b64 %rd1, [shared_volatile_i16_param_0];
; CHECK-NEXT: ld.volatile.shared.b16 %rs1, [%rd1];
; CHECK-NEXT: add.s16 %rs2, %rs1, 1;
; CHECK-NEXT: st.volatile.shared.b16 [%rd1], %rs2;
; CHECK-NEXT: ret;
%a.load = load volatile i16, ptr addrspace(3) %a
%a.add = add i16 %a.load, 1
store volatile i16 %a.add, ptr addrspace(3) %a
ret void
}
define void @shared_volatile_i32(ptr addrspace(3) %a) {
; CHECK-LABEL: shared_volatile_i32(
; CHECK: {
; CHECK-NEXT: .reg .b32 %r<3>;
; CHECK-NEXT: .reg .b64 %rd<2>;
; CHECK-EMPTY:
; CHECK-NEXT: // %bb.0:
; CHECK-NEXT: ld.param.b64 %rd1, [shared_volatile_i32_param_0];
; CHECK-NEXT: ld.volatile.shared.b32 %r1, [%rd1];
; CHECK-NEXT: add.s32 %r2, %r1, 1;
; CHECK-NEXT: st.volatile.shared.b32 [%rd1], %r2;
; CHECK-NEXT: ret;
%a.load = load volatile i32, ptr addrspace(3) %a
%a.add = add i32 %a.load, 1
store volatile i32 %a.add, ptr addrspace(3) %a
ret void
}
define void @shared_volatile_i64(ptr addrspace(3) %a) {
; CHECK-LABEL: shared_volatile_i64(
; CHECK: {
; CHECK-NEXT: .reg .b64 %rd<4>;
; CHECK-EMPTY:
; CHECK-NEXT: // %bb.0:
; CHECK-NEXT: ld.param.b64 %rd1, [shared_volatile_i64_param_0];
; CHECK-NEXT: ld.volatile.shared.b64 %rd2, [%rd1];
; CHECK-NEXT: add.s64 %rd3, %rd2, 1;
; CHECK-NEXT: st.volatile.shared.b64 [%rd1], %rd3;
; CHECK-NEXT: ret;
%a.load = load volatile i64, ptr addrspace(3) %a
%a.add = add i64 %a.load, 1
store volatile i64 %a.add, ptr addrspace(3) %a
ret void
}
define void @shared_volatile_float(ptr addrspace(3) %a) {
; CHECK-LABEL: shared_volatile_float(
; CHECK: {
; CHECK-NEXT: .reg .b32 %r<3>;
; CHECK-NEXT: .reg .b64 %rd<2>;
; CHECK-EMPTY:
; CHECK-NEXT: // %bb.0:
; CHECK-NEXT: ld.param.b64 %rd1, [shared_volatile_float_param_0];
; CHECK-NEXT: ld.volatile.shared.b32 %r1, [%rd1];
; CHECK-NEXT: add.rn.f32 %r2, %r1, 0f3F800000;
; CHECK-NEXT: st.volatile.shared.b32 [%rd1], %r2;
; CHECK-NEXT: ret;
%a.load = load volatile float, ptr addrspace(3) %a
%a.add = fadd float %a.load, 1.
store volatile float %a.add, ptr addrspace(3) %a
ret void
}
define void @shared_volatile_double(ptr addrspace(3) %a) {
; CHECK-LABEL: shared_volatile_double(
; CHECK: {
; CHECK-NEXT: .reg .b64 %rd<4>;
; CHECK-EMPTY:
; CHECK-NEXT: // %bb.0:
; CHECK-NEXT: ld.param.b64 %rd1, [shared_volatile_double_param_0];
; CHECK-NEXT: ld.volatile.shared.b64 %rd2, [%rd1];
; CHECK-NEXT: add.rn.f64 %rd3, %rd2, 0d3FF0000000000000;
; CHECK-NEXT: st.volatile.shared.b64 [%rd1], %rd3;
; CHECK-NEXT: ret;
%a.load = load volatile double, ptr addrspace(3) %a
%a.add = fadd double %a.load, 1.
store volatile double %a.add, ptr addrspace(3) %a
ret void
}
; shared_unordered_sys
define void @shared_unordered_sys_i8(ptr addrspace(3) %a) {
; SM60-LABEL: shared_unordered_sys_i8(
; SM60: {
; SM60-NEXT: .reg .b16 %rs<3>;
; SM60-NEXT: .reg .b64 %rd<2>;
; SM60-EMPTY:
; SM60-NEXT: // %bb.0:
; SM60-NEXT: ld.param.b64 %rd1, [shared_unordered_sys_i8_param_0];
; SM60-NEXT: ld.volatile.shared.b8 %rs1, [%rd1];
; SM60-NEXT: add.s16 %rs2, %rs1, 1;
; SM60-NEXT: st.volatile.shared.b8 [%rd1], %rs2;
; SM60-NEXT: ret;
;
; SM70-LABEL: shared_unordered_sys_i8(
; SM70: {
; SM70-NEXT: .reg .b16 %rs<3>;
; SM70-NEXT: .reg .b64 %rd<2>;
; SM70-EMPTY:
; SM70-NEXT: // %bb.0:
; SM70-NEXT: ld.param.b64 %rd1, [shared_unordered_sys_i8_param_0];
; SM70-NEXT: ld.relaxed.sys.shared.b8 %rs1, [%rd1];
; SM70-NEXT: add.s16 %rs2, %rs1, 1;
; SM70-NEXT: st.relaxed.sys.shared.b8 [%rd1], %rs2;
; SM70-NEXT: ret;
%a.load = load atomic i8, ptr addrspace(3) %a unordered, align 1
%a.add = add i8 %a.load, 1
store atomic i8 %a.add, ptr addrspace(3) %a unordered, align 1
ret void
}
define void @shared_unordered_sys_i16(ptr addrspace(3) %a) {
; SM60-LABEL: shared_unordered_sys_i16(
; SM60: {
; SM60-NEXT: .reg .b16 %rs<3>;
; SM60-NEXT: .reg .b64 %rd<2>;
; SM60-EMPTY:
; SM60-NEXT: // %bb.0:
; SM60-NEXT: ld.param.b64 %rd1, [shared_unordered_sys_i16_param_0];
; SM60-NEXT: ld.volatile.shared.b16 %rs1, [%rd1];
; SM60-NEXT: add.s16 %rs2, %rs1, 1;
; SM60-NEXT: st.volatile.shared.b16 [%rd1], %rs2;
; SM60-NEXT: ret;
;
; SM70-LABEL: shared_unordered_sys_i16(
; SM70: {
; SM70-NEXT: .reg .b16 %rs<3>;
; SM70-NEXT: .reg .b64 %rd<2>;
; SM70-EMPTY:
; SM70-NEXT: // %bb.0:
; SM70-NEXT: ld.param.b64 %rd1, [shared_unordered_sys_i16_param_0];
; SM70-NEXT: ld.relaxed.sys.shared.b16 %rs1, [%rd1];
; SM70-NEXT: add.s16 %rs2, %rs1, 1;
; SM70-NEXT: st.relaxed.sys.shared.b16 [%rd1], %rs2;
; SM70-NEXT: ret;
%a.load = load atomic i16, ptr addrspace(3) %a unordered, align 2
%a.add = add i16 %a.load, 1
store atomic i16 %a.add, ptr addrspace(3) %a unordered, align 2
ret void
}
define void @shared_unordered_sys_i32(ptr addrspace(3) %a) {
; SM60-LABEL: shared_unordered_sys_i32(
; SM60: {
; SM60-NEXT: .reg .b32 %r<3>;
; SM60-NEXT: .reg .b64 %rd<2>;
; SM60-EMPTY:
; SM60-NEXT: // %bb.0:
; SM60-NEXT: ld.param.b64 %rd1, [shared_unordered_sys_i32_param_0];
; SM60-NEXT: ld.volatile.shared.b32 %r1, [%rd1];
; SM60-NEXT: add.s32 %r2, %r1, 1;
; SM60-NEXT: st.volatile.shared.b32 [%rd1], %r2;
; SM60-NEXT: ret;
;
; SM70-LABEL: shared_unordered_sys_i32(
; SM70: {
; SM70-NEXT: .reg .b32 %r<3>;
; SM70-NEXT: .reg .b64 %rd<2>;
; SM70-EMPTY:
; SM70-NEXT: // %bb.0:
; SM70-NEXT: ld.param.b64 %rd1, [shared_unordered_sys_i32_param_0];
; SM70-NEXT: ld.relaxed.sys.shared.b32 %r1, [%rd1];
; SM70-NEXT: add.s32 %r2, %r1, 1;
; SM70-NEXT: st.relaxed.sys.shared.b32 [%rd1], %r2;
; SM70-NEXT: ret;
%a.load = load atomic i32, ptr addrspace(3) %a unordered, align 4
%a.add = add i32 %a.load, 1
store atomic i32 %a.add, ptr addrspace(3) %a unordered, align 4
ret void
}
define void @shared_unordered_sys_i64(ptr addrspace(3) %a) {
; SM60-LABEL: shared_unordered_sys_i64(
; SM60: {
; SM60-NEXT: .reg .b64 %rd<4>;
; SM60-EMPTY:
; SM60-NEXT: // %bb.0:
; SM60-NEXT: ld.param.b64 %rd1, [shared_unordered_sys_i64_param_0];
; SM60-NEXT: ld.volatile.shared.b64 %rd2, [%rd1];
; SM60-NEXT: add.s64 %rd3, %rd2, 1;
; SM60-NEXT: st.volatile.shared.b64 [%rd1], %rd3;
; SM60-NEXT: ret;
;
; SM70-LABEL: shared_unordered_sys_i64(
; SM70: {
; SM70-NEXT: .reg .b64 %rd<4>;
; SM70-EMPTY:
; SM70-NEXT: // %bb.0:
; SM70-NEXT: ld.param.b64 %rd1, [shared_unordered_sys_i64_param_0];
; SM70-NEXT: ld.relaxed.sys.shared.b64 %rd2, [%rd1];
; SM70-NEXT: add.s64 %rd3, %rd2, 1;
; SM70-NEXT: st.relaxed.sys.shared.b64 [%rd1], %rd3;
; SM70-NEXT: ret;
%a.load = load atomic i64, ptr addrspace(3) %a unordered, align 8
%a.add = add i64 %a.load, 1
store atomic i64 %a.add, ptr addrspace(3) %a unordered, align 8
ret void
}
define void @shared_unordered_sys_float(ptr addrspace(3) %a) {
; SM60-LABEL: shared_unordered_sys_float(
; SM60: {
; SM60-NEXT: .reg .b32 %r<3>;
; SM60-NEXT: .reg .b64 %rd<2>;
; SM60-EMPTY:
; SM60-NEXT: // %bb.0:
; SM60-NEXT: ld.param.b64 %rd1, [shared_unordered_sys_float_param_0];
; SM60-NEXT: ld.volatile.shared.b32 %r1, [%rd1];
; SM60-NEXT: add.rn.f32 %r2, %r1, 0f3F800000;
; SM60-NEXT: st.volatile.shared.b32 [%rd1], %r2;
; SM60-NEXT: ret;
;
; SM70-LABEL: shared_unordered_sys_float(
; SM70: {
; SM70-NEXT: .reg .b32 %r<3>;
; SM70-NEXT: .reg .b64 %rd<2>;
; SM70-EMPTY:
; SM70-NEXT: // %bb.0:
; SM70-NEXT: ld.param.b64 %rd1, [shared_unordered_sys_float_param_0];
; SM70-NEXT: ld.relaxed.sys.shared.b32 %r1, [%rd1];
; SM70-NEXT: add.rn.f32 %r2, %r1, 0f3F800000;
; SM70-NEXT: st.relaxed.sys.shared.b32 [%rd1], %r2;
; SM70-NEXT: ret;
%a.load = load atomic float, ptr addrspace(3) %a unordered, align 4
%a.add = fadd float %a.load, 1.
store atomic float %a.add, ptr addrspace(3) %a unordered, align 4
ret void
}
define void @shared_unordered_sys_double(ptr addrspace(3) %a) {
; SM60-LABEL: shared_unordered_sys_double(
; SM60: {
; SM60-NEXT: .reg .b64 %rd<4>;
; SM60-EMPTY:
; SM60-NEXT: // %bb.0:
; SM60-NEXT: ld.param.b64 %rd1, [shared_unordered_sys_double_param_0];
; SM60-NEXT: ld.volatile.shared.b64 %rd2, [%rd1];
; SM60-NEXT: add.rn.f64 %rd3, %rd2, 0d3FF0000000000000;
; SM60-NEXT: st.volatile.shared.b64 [%rd1], %rd3;
; SM60-NEXT: ret;
;
; SM70-LABEL: shared_unordered_sys_double(
; SM70: {
; SM70-NEXT: .reg .b64 %rd<4>;
; SM70-EMPTY:
; SM70-NEXT: // %bb.0:
; SM70-NEXT: ld.param.b64 %rd1, [shared_unordered_sys_double_param_0];
; SM70-NEXT: ld.relaxed.sys.shared.b64 %rd2, [%rd1];
; SM70-NEXT: add.rn.f64 %rd3, %rd2, 0d3FF0000000000000;
; SM70-NEXT: st.relaxed.sys.shared.b64 [%rd1], %rd3;
; SM70-NEXT: ret;
%a.load = load atomic double, ptr addrspace(3) %a unordered, align 8
%a.add = fadd double %a.load, 1.
store atomic double %a.add, ptr addrspace(3) %a unordered, align 8
ret void
}
; shared_unordered_volatile_sys
define void @shared_unordered_volatile_sys_i8(ptr addrspace(3) %a) {
; CHECK-LABEL: shared_unordered_volatile_sys_i8(
; CHECK: {
; CHECK-NEXT: .reg .b16 %rs<3>;
; CHECK-NEXT: .reg .b64 %rd<2>;
; CHECK-EMPTY:
; CHECK-NEXT: // %bb.0:
; CHECK-NEXT: ld.param.b64 %rd1, [shared_unordered_volatile_sys_i8_param_0];
; CHECK-NEXT: ld.volatile.shared.b8 %rs1, [%rd1];
; CHECK-NEXT: add.s16 %rs2, %rs1, 1;
; CHECK-NEXT: st.volatile.shared.b8 [%rd1], %rs2;
; CHECK-NEXT: ret;
%a.load = load atomic volatile i8, ptr addrspace(3) %a unordered, align 1
%a.add = add i8 %a.load, 1
store atomic volatile i8 %a.add, ptr addrspace(3) %a unordered, align 1
ret void
}
define void @shared_unordered_volatile_sys_i16(ptr addrspace(3) %a) {
; CHECK-LABEL: shared_unordered_volatile_sys_i16(
; CHECK: {
; CHECK-NEXT: .reg .b16 %rs<3>;
; CHECK-NEXT: .reg .b64 %rd<2>;
; CHECK-EMPTY:
; CHECK-NEXT: // %bb.0:
; CHECK-NEXT: ld.param.b64 %rd1, [shared_unordered_volatile_sys_i16_param_0];
; CHECK-NEXT: ld.volatile.shared.b16 %rs1, [%rd1];
; CHECK-NEXT: add.s16 %rs2, %rs1, 1;
; CHECK-NEXT: st.volatile.shared.b16 [%rd1], %rs2;
; CHECK-NEXT: ret;
%a.load = load atomic volatile i16, ptr addrspace(3) %a unordered, align 2
%a.add = add i16 %a.load, 1
store atomic volatile i16 %a.add, ptr addrspace(3) %a unordered, align 2
ret void
}
define void @shared_unordered_volatile_sys_i32(ptr addrspace(3) %a) {
; CHECK-LABEL: shared_unordered_volatile_sys_i32(
; CHECK: {
; CHECK-NEXT: .reg .b32 %r<3>;
; CHECK-NEXT: .reg .b64 %rd<2>;
; CHECK-EMPTY:
; CHECK-NEXT: // %bb.0:
; CHECK-NEXT: ld.param.b64 %rd1, [shared_unordered_volatile_sys_i32_param_0];
; CHECK-NEXT: ld.volatile.shared.b32 %r1, [%rd1];
; CHECK-NEXT: add.s32 %r2, %r1, 1;
; CHECK-NEXT: st.volatile.shared.b32 [%rd1], %r2;
; CHECK-NEXT: ret;
%a.load = load atomic volatile i32, ptr addrspace(3) %a unordered, align 4
%a.add = add i32 %a.load, 1
store atomic volatile i32 %a.add, ptr addrspace(3) %a unordered, align 4
ret void
}
define void @shared_unordered_volatile_sys_i64(ptr addrspace(3) %a) {
; CHECK-LABEL: shared_unordered_volatile_sys_i64(
; CHECK: {
; CHECK-NEXT: .reg .b64 %rd<4>;
; CHECK-EMPTY:
; CHECK-NEXT: // %bb.0:
; CHECK-NEXT: ld.param.b64 %rd1, [shared_unordered_volatile_sys_i64_param_0];
; CHECK-NEXT: ld.volatile.shared.b64 %rd2, [%rd1];
; CHECK-NEXT: add.s64 %rd3, %rd2, 1;
; CHECK-NEXT: st.volatile.shared.b64 [%rd1], %rd3;
; CHECK-NEXT: ret;
%a.load = load atomic volatile i64, ptr addrspace(3) %a unordered, align 8
%a.add = add i64 %a.load, 1
store atomic volatile i64 %a.add, ptr addrspace(3) %a unordered, align 8
ret void
}
define void @shared_unordered_volatile_sys_float(ptr addrspace(3) %a) {
; CHECK-LABEL: shared_unordered_volatile_sys_float(
; CHECK: {
; CHECK-NEXT: .reg .b32 %r<3>;
; CHECK-NEXT: .reg .b64 %rd<2>;
; CHECK-EMPTY:
; CHECK-NEXT: // %bb.0:
; CHECK-NEXT: ld.param.b64 %rd1, [shared_unordered_volatile_sys_float_param_0];
; CHECK-NEXT: ld.volatile.shared.b32 %r1, [%rd1];
; CHECK-NEXT: add.rn.f32 %r2, %r1, 0f3F800000;
; CHECK-NEXT: st.volatile.shared.b32 [%rd1], %r2;
; CHECK-NEXT: ret;
%a.load = load atomic volatile float, ptr addrspace(3) %a unordered, align 4
%a.add = fadd float %a.load, 1.
store atomic volatile float %a.add, ptr addrspace(3) %a unordered, align 4
ret void
}
define void @shared_unordered_volatile_sys_double(ptr addrspace(3) %a) {
; CHECK-LABEL: shared_unordered_volatile_sys_double(
; CHECK: {
; CHECK-NEXT: .reg .b64 %rd<4>;
; CHECK-EMPTY:
; CHECK-NEXT: // %bb.0:
; CHECK-NEXT: ld.param.b64 %rd1, [shared_unordered_volatile_sys_double_param_0];
; CHECK-NEXT: ld.volatile.shared.b64 %rd2, [%rd1];
; CHECK-NEXT: add.rn.f64 %rd3, %rd2, 0d3FF0000000000000;
; CHECK-NEXT: st.volatile.shared.b64 [%rd1], %rd3;
; CHECK-NEXT: ret;
%a.load = load atomic volatile double, ptr addrspace(3) %a unordered, align 8
%a.add = fadd double %a.load, 1.
store atomic volatile double %a.add, ptr addrspace(3) %a unordered, align 8
ret void
}
; shared_monotonic_sys
define void @shared_monotonic_sys_i8(ptr addrspace(3) %a) {
; SM60-LABEL: shared_monotonic_sys_i8(
; SM60: {
; SM60-NEXT: .reg .b16 %rs<3>;
; SM60-NEXT: .reg .b64 %rd<2>;
; SM60-EMPTY:
; SM60-NEXT: // %bb.0:
; SM60-NEXT: ld.param.b64 %rd1, [shared_monotonic_sys_i8_param_0];
; SM60-NEXT: ld.volatile.shared.b8 %rs1, [%rd1];
; SM60-NEXT: add.s16 %rs2, %rs1, 1;
; SM60-NEXT: st.volatile.shared.b8 [%rd1], %rs2;
; SM60-NEXT: ret;
;
; SM70-LABEL: shared_monotonic_sys_i8(
; SM70: {
; SM70-NEXT: .reg .b16 %rs<3>;
; SM70-NEXT: .reg .b64 %rd<2>;
; SM70-EMPTY:
; SM70-NEXT: // %bb.0:
; SM70-NEXT: ld.param.b64 %rd1, [shared_monotonic_sys_i8_param_0];
; SM70-NEXT: ld.relaxed.sys.shared.b8 %rs1, [%rd1];
; SM70-NEXT: add.s16 %rs2, %rs1, 1;
; SM70-NEXT: st.relaxed.sys.shared.b8 [%rd1], %rs2;
; SM70-NEXT: ret;
%a.load = load atomic i8, ptr addrspace(3) %a monotonic, align 1
%a.add = add i8 %a.load, 1
store atomic i8 %a.add, ptr addrspace(3) %a monotonic, align 1
ret void
}
define void @shared_monotonic_sys_i16(ptr addrspace(3) %a) {
; SM60-LABEL: shared_monotonic_sys_i16(
; SM60: {
; SM60-NEXT: .reg .b16 %rs<3>;
; SM60-NEXT: .reg .b64 %rd<2>;
; SM60-EMPTY:
; SM60-NEXT: // %bb.0:
; SM60-NEXT: ld.param.b64 %rd1, [shared_monotonic_sys_i16_param_0];
; SM60-NEXT: ld.volatile.shared.b16 %rs1, [%rd1];
; SM60-NEXT: add.s16 %rs2, %rs1, 1;
; SM60-NEXT: st.volatile.shared.b16 [%rd1], %rs2;
; SM60-NEXT: ret;
;
; SM70-LABEL: shared_monotonic_sys_i16(
; SM70: {
; SM70-NEXT: .reg .b16 %rs<3>;
; SM70-NEXT: .reg .b64 %rd<2>;
; SM70-EMPTY:
; SM70-NEXT: // %bb.0:
; SM70-NEXT: ld.param.b64 %rd1, [shared_monotonic_sys_i16_param_0];
; SM70-NEXT: ld.relaxed.sys.shared.b16 %rs1, [%rd1];
; SM70-NEXT: add.s16 %rs2, %rs1, 1;
; SM70-NEXT: st.relaxed.sys.shared.b16 [%rd1], %rs2;
; SM70-NEXT: ret;
%a.load = load atomic i16, ptr addrspace(3) %a monotonic, align 2
%a.add = add i16 %a.load, 1
store atomic i16 %a.add, ptr addrspace(3) %a monotonic, align 2
ret void
}
define void @shared_monotonic_sys_i32(ptr addrspace(3) %a) {
; SM60-LABEL: shared_monotonic_sys_i32(
; SM60: {
; SM60-NEXT: .reg .b32 %r<3>;
; SM60-NEXT: .reg .b64 %rd<2>;
; SM60-EMPTY:
; SM60-NEXT: // %bb.0:
; SM60-NEXT: ld.param.b64 %rd1, [shared_monotonic_sys_i32_param_0];
; SM60-NEXT: ld.volatile.shared.b32 %r1, [%rd1];
; SM60-NEXT: add.s32 %r2, %r1, 1;
; SM60-NEXT: st.volatile.shared.b32 [%rd1], %r2;
; SM60-NEXT: ret;
;
; SM70-LABEL: shared_monotonic_sys_i32(
; SM70: {
; SM70-NEXT: .reg .b32 %r<3>;
; SM70-NEXT: .reg .b64 %rd<2>;
; SM70-EMPTY:
; SM70-NEXT: // %bb.0:
; SM70-NEXT: ld.param.b64 %rd1, [shared_monotonic_sys_i32_param_0];
; SM70-NEXT: ld.relaxed.sys.shared.b32 %r1, [%rd1];
; SM70-NEXT: add.s32 %r2, %r1, 1;
; SM70-NEXT: st.relaxed.sys.shared.b32 [%rd1], %r2;
; SM70-NEXT: ret;
%a.load = load atomic i32, ptr addrspace(3) %a monotonic, align 4
%a.add = add i32 %a.load, 1
store atomic i32 %a.add, ptr addrspace(3) %a monotonic, align 4
ret void
}
define void @shared_monotonic_sys_i64(ptr addrspace(3) %a) {
; SM60-LABEL: shared_monotonic_sys_i64(
; SM60: {
; SM60-NEXT: .reg .b64 %rd<4>;
; SM60-EMPTY:
; SM60-NEXT: // %bb.0:
; SM60-NEXT: ld.param.b64 %rd1, [shared_monotonic_sys_i64_param_0];
; SM60-NEXT: ld.volatile.shared.b64 %rd2, [%rd1];
; SM60-NEXT: add.s64 %rd3, %rd2, 1;
; SM60-NEXT: st.volatile.shared.b64 [%rd1], %rd3;
; SM60-NEXT: ret;
;
; SM70-LABEL: shared_monotonic_sys_i64(
; SM70: {
; SM70-NEXT: .reg .b64 %rd<4>;
; SM70-EMPTY:
; SM70-NEXT: // %bb.0:
; SM70-NEXT: ld.param.b64 %rd1, [shared_monotonic_sys_i64_param_0];
; SM70-NEXT: ld.relaxed.sys.shared.b64 %rd2, [%rd1];
; SM70-NEXT: add.s64 %rd3, %rd2, 1;
; SM70-NEXT: st.relaxed.sys.shared.b64 [%rd1], %rd3;
; SM70-NEXT: ret;
%a.load = load atomic i64, ptr addrspace(3) %a monotonic, align 8
%a.add = add i64 %a.load, 1
store atomic i64 %a.add, ptr addrspace(3) %a monotonic, align 8
ret void
}
define void @shared_monotonic_sys_float(ptr addrspace(3) %a) {
; SM60-LABEL: shared_monotonic_sys_float(
; SM60: {
; SM60-NEXT: .reg .b32 %r<3>;
; SM60-NEXT: .reg .b64 %rd<2>;
; SM60-EMPTY:
; SM60-NEXT: // %bb.0:
; SM60-NEXT: ld.param.b64 %rd1, [shared_monotonic_sys_float_param_0];
; SM60-NEXT: ld.volatile.shared.b32 %r1, [%rd1];
; SM60-NEXT: add.rn.f32 %r2, %r1, 0f3F800000;
; SM60-NEXT: st.volatile.shared.b32 [%rd1], %r2;
; SM60-NEXT: ret;
;
; SM70-LABEL: shared_monotonic_sys_float(
; SM70: {
; SM70-NEXT: .reg .b32 %r<3>;
; SM70-NEXT: .reg .b64 %rd<2>;
; SM70-EMPTY:
; SM70-NEXT: // %bb.0:
; SM70-NEXT: ld.param.b64 %rd1, [shared_monotonic_sys_float_param_0];
; SM70-NEXT: ld.relaxed.sys.shared.b32 %r1, [%rd1];
; SM70-NEXT: add.rn.f32 %r2, %r1, 0f3F800000;
; SM70-NEXT: st.relaxed.sys.shared.b32 [%rd1], %r2;
; SM70-NEXT: ret;
%a.load = load atomic float, ptr addrspace(3) %a monotonic, align 4
%a.add = fadd float %a.load, 1.
store atomic float %a.add, ptr addrspace(3) %a monotonic, align 4
ret void
}
define void @shared_monotonic_sys_double(ptr addrspace(3) %a) {
; SM60-LABEL: shared_monotonic_sys_double(
; SM60: {
; SM60-NEXT: .reg .b64 %rd<4>;
; SM60-EMPTY:
; SM60-NEXT: // %bb.0:
; SM60-NEXT: ld.param.b64 %rd1, [shared_monotonic_sys_double_param_0];
; SM60-NEXT: ld.volatile.shared.b64 %rd2, [%rd1];
; SM60-NEXT: add.rn.f64 %rd3, %rd2, 0d3FF0000000000000;
; SM60-NEXT: st.volatile.shared.b64 [%rd1], %rd3;
; SM60-NEXT: ret;
;
; SM70-LABEL: shared_monotonic_sys_double(
; SM70: {
; SM70-NEXT: .reg .b64 %rd<4>;
; SM70-EMPTY:
; SM70-NEXT: // %bb.0:
; SM70-NEXT: ld.param.b64 %rd1, [shared_monotonic_sys_double_param_0];
; SM70-NEXT: ld.relaxed.sys.shared.b64 %rd2, [%rd1];
; SM70-NEXT: add.rn.f64 %rd3, %rd2, 0d3FF0000000000000;
; SM70-NEXT: st.relaxed.sys.shared.b64 [%rd1], %rd3;
; SM70-NEXT: ret;
%a.load = load atomic double, ptr addrspace(3) %a monotonic, align 8
%a.add = fadd double %a.load, 1.
store atomic double %a.add, ptr addrspace(3) %a monotonic, align 8
ret void
}
; shared_monotonic_volatile_sys
define void @shared_monotonic_volatile_sys_i8(ptr addrspace(3) %a) {
; CHECK-LABEL: shared_monotonic_volatile_sys_i8(
; CHECK: {
; CHECK-NEXT: .reg .b16 %rs<3>;
; CHECK-NEXT: .reg .b64 %rd<2>;
; CHECK-EMPTY:
; CHECK-NEXT: // %bb.0:
; CHECK-NEXT: ld.param.b64 %rd1, [shared_monotonic_volatile_sys_i8_param_0];
; CHECK-NEXT: ld.volatile.shared.b8 %rs1, [%rd1];
; CHECK-NEXT: add.s16 %rs2, %rs1, 1;
; CHECK-NEXT: st.volatile.shared.b8 [%rd1], %rs2;
; CHECK-NEXT: ret;
%a.load = load atomic volatile i8, ptr addrspace(3) %a monotonic, align 1
%a.add = add i8 %a.load, 1
store atomic volatile i8 %a.add, ptr addrspace(3) %a monotonic, align 1
ret void
}
define void @shared_monotonic_volatile_sys_i16(ptr addrspace(3) %a) {
; CHECK-LABEL: shared_monotonic_volatile_sys_i16(
; CHECK: {
; CHECK-NEXT: .reg .b16 %rs<3>;
; CHECK-NEXT: .reg .b64 %rd<2>;
; CHECK-EMPTY:
; CHECK-NEXT: // %bb.0:
; CHECK-NEXT: ld.param.b64 %rd1, [shared_monotonic_volatile_sys_i16_param_0];
; CHECK-NEXT: ld.volatile.shared.b16 %rs1, [%rd1];
; CHECK-NEXT: add.s16 %rs2, %rs1, 1;
; CHECK-NEXT: st.volatile.shared.b16 [%rd1], %rs2;
; CHECK-NEXT: ret;
%a.load = load atomic volatile i16, ptr addrspace(3) %a monotonic, align 2
%a.add = add i16 %a.load, 1
store atomic volatile i16 %a.add, ptr addrspace(3) %a monotonic, align 2
ret void
}
define void @shared_monotonic_volatile_sys_i32(ptr addrspace(3) %a) {
; CHECK-LABEL: shared_monotonic_volatile_sys_i32(
; CHECK: {
; CHECK-NEXT: .reg .b32 %r<3>;
; CHECK-NEXT: .reg .b64 %rd<2>;
; CHECK-EMPTY:
; CHECK-NEXT: // %bb.0:
; CHECK-NEXT: ld.param.b64 %rd1, [shared_monotonic_volatile_sys_i32_param_0];
; CHECK-NEXT: ld.volatile.shared.b32 %r1, [%rd1];
; CHECK-NEXT: add.s32 %r2, %r1, 1;
; CHECK-NEXT: st.volatile.shared.b32 [%rd1], %r2;
; CHECK-NEXT: ret;
%a.load = load atomic volatile i32, ptr addrspace(3) %a monotonic, align 4
%a.add = add i32 %a.load, 1
store atomic volatile i32 %a.add, ptr addrspace(3) %a monotonic, align 4
ret void
}
define void @shared_monotonic_volatile_sys_i64(ptr addrspace(3) %a) {
; CHECK-LABEL: shared_monotonic_volatile_sys_i64(
; CHECK: {
; CHECK-NEXT: .reg .b64 %rd<4>;
; CHECK-EMPTY:
; CHECK-NEXT: // %bb.0:
; CHECK-NEXT: ld.param.b64 %rd1, [shared_monotonic_volatile_sys_i64_param_0];
; CHECK-NEXT: ld.volatile.shared.b64 %rd2, [%rd1];
; CHECK-NEXT: add.s64 %rd3, %rd2, 1;
; CHECK-NEXT: st.volatile.shared.b64 [%rd1], %rd3;
; CHECK-NEXT: ret;
%a.load = load atomic volatile i64, ptr addrspace(3) %a monotonic, align 8
%a.add = add i64 %a.load, 1
store atomic volatile i64 %a.add, ptr addrspace(3) %a monotonic, align 8
ret void
}
define void @shared_monotonic_volatile_sys_float(ptr addrspace(3) %a) {
; CHECK-LABEL: shared_monotonic_volatile_sys_float(
; CHECK: {
; CHECK-NEXT: .reg .b32 %r<3>;
; CHECK-NEXT: .reg .b64 %rd<2>;
; CHECK-EMPTY:
; CHECK-NEXT: // %bb.0:
; CHECK-NEXT: ld.param.b64 %rd1, [shared_monotonic_volatile_sys_float_param_0];
; CHECK-NEXT: ld.volatile.shared.b32 %r1, [%rd1];
; CHECK-NEXT: add.rn.f32 %r2, %r1, 0f3F800000;
; CHECK-NEXT: st.volatile.shared.b32 [%rd1], %r2;
; CHECK-NEXT: ret;
%a.load = load atomic volatile float, ptr addrspace(3) %a monotonic, align 4
%a.add = fadd float %a.load, 1.
store atomic volatile float %a.add, ptr addrspace(3) %a monotonic, align 4
ret void
}
define void @shared_monotonic_volatile_sys_double(ptr addrspace(3) %a) {
; CHECK-LABEL: shared_monotonic_volatile_sys_double(
; CHECK: {
; CHECK-NEXT: .reg .b64 %rd<4>;
; CHECK-EMPTY:
; CHECK-NEXT: // %bb.0:
; CHECK-NEXT: ld.param.b64 %rd1, [shared_monotonic_volatile_sys_double_param_0];
; CHECK-NEXT: ld.volatile.shared.b64 %rd2, [%rd1];
; CHECK-NEXT: add.rn.f64 %rd3, %rd2, 0d3FF0000000000000;
; CHECK-NEXT: st.volatile.shared.b64 [%rd1], %rd3;
; CHECK-NEXT: ret;
%a.load = load atomic volatile double, ptr addrspace(3) %a monotonic, align 8
%a.add = fadd double %a.load, 1.
store atomic volatile double %a.add, ptr addrspace(3) %a monotonic, align 8
ret void
}
;; local statespace
; local
define void @local_i8(ptr addrspace(5) %a) {
; CHECK-LABEL: local_i8(
; CHECK: {
; CHECK-NEXT: .reg .b16 %rs<3>;
; CHECK-NEXT: .reg .b64 %rd<2>;
; CHECK-EMPTY:
; CHECK-NEXT: // %bb.0:
; CHECK-NEXT: ld.param.b64 %rd1, [local_i8_param_0];
; CHECK-NEXT: ld.local.b8 %rs1, [%rd1];
; CHECK-NEXT: add.s16 %rs2, %rs1, 1;
; CHECK-NEXT: st.local.b8 [%rd1], %rs2;
; CHECK-NEXT: ret;
%a.load = load i8, ptr addrspace(5) %a
%a.add = add i8 %a.load, 1
store i8 %a.add, ptr addrspace(5) %a
ret void
}
define void @local_i16(ptr addrspace(5) %a) {
; CHECK-LABEL: local_i16(
; CHECK: {
; CHECK-NEXT: .reg .b16 %rs<3>;
; CHECK-NEXT: .reg .b64 %rd<2>;
; CHECK-EMPTY:
; CHECK-NEXT: // %bb.0:
; CHECK-NEXT: ld.param.b64 %rd1, [local_i16_param_0];
; CHECK-NEXT: ld.local.b16 %rs1, [%rd1];
; CHECK-NEXT: add.s16 %rs2, %rs1, 1;
; CHECK-NEXT: st.local.b16 [%rd1], %rs2;
; CHECK-NEXT: ret;
%a.load = load i16, ptr addrspace(5) %a
%a.add = add i16 %a.load, 1
store i16 %a.add, ptr addrspace(5) %a
ret void
}
define void @local_i32(ptr addrspace(5) %a) {
; CHECK-LABEL: local_i32(
; CHECK: {
; CHECK-NEXT: .reg .b32 %r<3>;
; CHECK-NEXT: .reg .b64 %rd<2>;
; CHECK-EMPTY:
; CHECK-NEXT: // %bb.0:
; CHECK-NEXT: ld.param.b64 %rd1, [local_i32_param_0];
; CHECK-NEXT: ld.local.b32 %r1, [%rd1];
; CHECK-NEXT: add.s32 %r2, %r1, 1;
; CHECK-NEXT: st.local.b32 [%rd1], %r2;
; CHECK-NEXT: ret;
%a.load = load i32, ptr addrspace(5) %a
%a.add = add i32 %a.load, 1
store i32 %a.add, ptr addrspace(5) %a
ret void
}
define void @local_i64(ptr addrspace(5) %a) {
; CHECK-LABEL: local_i64(
; CHECK: {
; CHECK-NEXT: .reg .b64 %rd<4>;
; CHECK-EMPTY:
; CHECK-NEXT: // %bb.0:
; CHECK-NEXT: ld.param.b64 %rd1, [local_i64_param_0];
; CHECK-NEXT: ld.local.b64 %rd2, [%rd1];
; CHECK-NEXT: add.s64 %rd3, %rd2, 1;
; CHECK-NEXT: st.local.b64 [%rd1], %rd3;
; CHECK-NEXT: ret;
%a.load = load i64, ptr addrspace(5) %a
%a.add = add i64 %a.load, 1
store i64 %a.add, ptr addrspace(5) %a
ret void
}
define void @local_float(ptr addrspace(5) %a) {
; CHECK-LABEL: local_float(
; CHECK: {
; CHECK-NEXT: .reg .b32 %r<3>;
; CHECK-NEXT: .reg .b64 %rd<2>;
; CHECK-EMPTY:
; CHECK-NEXT: // %bb.0:
; CHECK-NEXT: ld.param.b64 %rd1, [local_float_param_0];
; CHECK-NEXT: ld.local.b32 %r1, [%rd1];
; CHECK-NEXT: add.rn.f32 %r2, %r1, 0f3F800000;
; CHECK-NEXT: st.local.b32 [%rd1], %r2;
; CHECK-NEXT: ret;
%a.load = load float, ptr addrspace(5) %a
%a.add = fadd float %a.load, 1.
store float %a.add, ptr addrspace(5) %a
ret void
}
define void @local_double(ptr addrspace(5) %a) {
; CHECK-LABEL: local_double(
; CHECK: {
; CHECK-NEXT: .reg .b64 %rd<4>;
; CHECK-EMPTY:
; CHECK-NEXT: // %bb.0:
; CHECK-NEXT: ld.param.b64 %rd1, [local_double_param_0];
; CHECK-NEXT: ld.local.b64 %rd2, [%rd1];
; CHECK-NEXT: add.rn.f64 %rd3, %rd2, 0d3FF0000000000000;
; CHECK-NEXT: st.local.b64 [%rd1], %rd3;
; CHECK-NEXT: ret;
%a.load = load double, ptr addrspace(5) %a
%a.add = fadd double %a.load, 1.
store double %a.add, ptr addrspace(5) %a
ret void
}
; local_volatile
define void @local_volatile_i8(ptr addrspace(5) %a) {
; CHECK-LABEL: local_volatile_i8(
; CHECK: {
; CHECK-NEXT: .reg .b16 %rs<3>;
; CHECK-NEXT: .reg .b64 %rd<2>;
; CHECK-EMPTY:
; CHECK-NEXT: // %bb.0:
; CHECK-NEXT: ld.param.b64 %rd1, [local_volatile_i8_param_0];
; CHECK-NEXT: ld.local.b8 %rs1, [%rd1];
; CHECK-NEXT: add.s16 %rs2, %rs1, 1;
; CHECK-NEXT: st.local.b8 [%rd1], %rs2;
; CHECK-NEXT: ret;
%a.load = load volatile i8, ptr addrspace(5) %a
%a.add = add i8 %a.load, 1
store volatile i8 %a.add, ptr addrspace(5) %a
ret void
}
define void @local_volatile_i16(ptr addrspace(5) %a) {
; CHECK-LABEL: local_volatile_i16(
; CHECK: {
; CHECK-NEXT: .reg .b16 %rs<3>;
; CHECK-NEXT: .reg .b64 %rd<2>;
; CHECK-EMPTY:
; CHECK-NEXT: // %bb.0:
; CHECK-NEXT: ld.param.b64 %rd1, [local_volatile_i16_param_0];
; CHECK-NEXT: ld.local.b16 %rs1, [%rd1];
; CHECK-NEXT: add.s16 %rs2, %rs1, 1;
; CHECK-NEXT: st.local.b16 [%rd1], %rs2;
; CHECK-NEXT: ret;
%a.load = load volatile i16, ptr addrspace(5) %a
%a.add = add i16 %a.load, 1
store volatile i16 %a.add, ptr addrspace(5) %a
ret void
}
define void @local_volatile_i32(ptr addrspace(5) %a) {
; CHECK-LABEL: local_volatile_i32(
; CHECK: {
; CHECK-NEXT: .reg .b32 %r<3>;
; CHECK-NEXT: .reg .b64 %rd<2>;
; CHECK-EMPTY:
; CHECK-NEXT: // %bb.0:
; CHECK-NEXT: ld.param.b64 %rd1, [local_volatile_i32_param_0];
; CHECK-NEXT: ld.local.b32 %r1, [%rd1];
; CHECK-NEXT: add.s32 %r2, %r1, 1;
; CHECK-NEXT: st.local.b32 [%rd1], %r2;
; CHECK-NEXT: ret;
%a.load = load volatile i32, ptr addrspace(5) %a
%a.add = add i32 %a.load, 1
store volatile i32 %a.add, ptr addrspace(5) %a
ret void
}
define void @local_volatile_i64(ptr addrspace(5) %a) {
; CHECK-LABEL: local_volatile_i64(
; CHECK: {
; CHECK-NEXT: .reg .b64 %rd<4>;
; CHECK-EMPTY:
; CHECK-NEXT: // %bb.0:
; CHECK-NEXT: ld.param.b64 %rd1, [local_volatile_i64_param_0];
; CHECK-NEXT: ld.local.b64 %rd2, [%rd1];
; CHECK-NEXT: add.s64 %rd3, %rd2, 1;
; CHECK-NEXT: st.local.b64 [%rd1], %rd3;
; CHECK-NEXT: ret;
%a.load = load volatile i64, ptr addrspace(5) %a
%a.add = add i64 %a.load, 1
store volatile i64 %a.add, ptr addrspace(5) %a
ret void
}
define void @local_volatile_float(ptr addrspace(5) %a) {
; CHECK-LABEL: local_volatile_float(
; CHECK: {
; CHECK-NEXT: .reg .b32 %r<3>;
; CHECK-NEXT: .reg .b64 %rd<2>;
; CHECK-EMPTY:
; CHECK-NEXT: // %bb.0:
; CHECK-NEXT: ld.param.b64 %rd1, [local_volatile_float_param_0];
; CHECK-NEXT: ld.local.b32 %r1, [%rd1];
; CHECK-NEXT: add.rn.f32 %r2, %r1, 0f3F800000;
; CHECK-NEXT: st.local.b32 [%rd1], %r2;
; CHECK-NEXT: ret;
%a.load = load volatile float, ptr addrspace(5) %a
%a.add = fadd float %a.load, 1.
store volatile float %a.add, ptr addrspace(5) %a
ret void
}
define void @local_volatile_double(ptr addrspace(5) %a) {
; CHECK-LABEL: local_volatile_double(
; CHECK: {
; CHECK-NEXT: .reg .b64 %rd<4>;
; CHECK-EMPTY:
; CHECK-NEXT: // %bb.0:
; CHECK-NEXT: ld.param.b64 %rd1, [local_volatile_double_param_0];
; CHECK-NEXT: ld.local.b64 %rd2, [%rd1];
; CHECK-NEXT: add.rn.f64 %rd3, %rd2, 0d3FF0000000000000;
; CHECK-NEXT: st.local.b64 [%rd1], %rd3;
; CHECK-NEXT: ret;
%a.load = load volatile double, ptr addrspace(5) %a
%a.add = fadd double %a.load, 1.
store volatile double %a.add, ptr addrspace(5) %a
ret void
}
; local_unordered_sys
define void @local_unordered_sys_i8(ptr addrspace(5) %a) {
; CHECK-LABEL: local_unordered_sys_i8(
; CHECK: {
; CHECK-NEXT: .reg .b16 %rs<3>;
; CHECK-NEXT: .reg .b64 %rd<2>;
; CHECK-EMPTY:
; CHECK-NEXT: // %bb.0:
; CHECK-NEXT: ld.param.b64 %rd1, [local_unordered_sys_i8_param_0];
; CHECK-NEXT: ld.local.b8 %rs1, [%rd1];
; CHECK-NEXT: add.s16 %rs2, %rs1, 1;
; CHECK-NEXT: st.local.b8 [%rd1], %rs2;
; CHECK-NEXT: ret;
%a.load = load atomic i8, ptr addrspace(5) %a unordered, align 1
%a.add = add i8 %a.load, 1
store atomic i8 %a.add, ptr addrspace(5) %a unordered, align 1
ret void
}
define void @local_unordered_sys_i16(ptr addrspace(5) %a) {
; CHECK-LABEL: local_unordered_sys_i16(
; CHECK: {
; CHECK-NEXT: .reg .b16 %rs<3>;
; CHECK-NEXT: .reg .b64 %rd<2>;
; CHECK-EMPTY:
; CHECK-NEXT: // %bb.0:
; CHECK-NEXT: ld.param.b64 %rd1, [local_unordered_sys_i16_param_0];
; CHECK-NEXT: ld.local.b16 %rs1, [%rd1];
; CHECK-NEXT: add.s16 %rs2, %rs1, 1;
; CHECK-NEXT: st.local.b16 [%rd1], %rs2;
; CHECK-NEXT: ret;
%a.load = load atomic i16, ptr addrspace(5) %a unordered, align 2
%a.add = add i16 %a.load, 1
store atomic i16 %a.add, ptr addrspace(5) %a unordered, align 2
ret void
}
define void @local_unordered_sys_i32(ptr addrspace(5) %a) {
; CHECK-LABEL: local_unordered_sys_i32(
; CHECK: {
; CHECK-NEXT: .reg .b32 %r<3>;
; CHECK-NEXT: .reg .b64 %rd<2>;
; CHECK-EMPTY:
; CHECK-NEXT: // %bb.0:
; CHECK-NEXT: ld.param.b64 %rd1, [local_unordered_sys_i32_param_0];
; CHECK-NEXT: ld.local.b32 %r1, [%rd1];
; CHECK-NEXT: add.s32 %r2, %r1, 1;
; CHECK-NEXT: st.local.b32 [%rd1], %r2;
; CHECK-NEXT: ret;
%a.load = load atomic i32, ptr addrspace(5) %a unordered, align 4
%a.add = add i32 %a.load, 1
store atomic i32 %a.add, ptr addrspace(5) %a unordered, align 4
ret void
}
define void @local_unordered_sys_i64(ptr addrspace(5) %a) {
; CHECK-LABEL: local_unordered_sys_i64(
; CHECK: {
; CHECK-NEXT: .reg .b64 %rd<4>;
; CHECK-EMPTY:
; CHECK-NEXT: // %bb.0:
; CHECK-NEXT: ld.param.b64 %rd1, [local_unordered_sys_i64_param_0];
; CHECK-NEXT: ld.local.b64 %rd2, [%rd1];
; CHECK-NEXT: add.s64 %rd3, %rd2, 1;
; CHECK-NEXT: st.local.b64 [%rd1], %rd3;
; CHECK-NEXT: ret;
%a.load = load atomic i64, ptr addrspace(5) %a unordered, align 8
%a.add = add i64 %a.load, 1
store atomic i64 %a.add, ptr addrspace(5) %a unordered, align 8
ret void
}
define void @local_unordered_sys_float(ptr addrspace(5) %a) {
; CHECK-LABEL: local_unordered_sys_float(
; CHECK: {
; CHECK-NEXT: .reg .b32 %r<3>;
; CHECK-NEXT: .reg .b64 %rd<2>;
; CHECK-EMPTY:
; CHECK-NEXT: // %bb.0:
; CHECK-NEXT: ld.param.b64 %rd1, [local_unordered_sys_float_param_0];
; CHECK-NEXT: ld.local.b32 %r1, [%rd1];
; CHECK-NEXT: add.rn.f32 %r2, %r1, 0f3F800000;
; CHECK-NEXT: st.local.b32 [%rd1], %r2;
; CHECK-NEXT: ret;
%a.load = load atomic float, ptr addrspace(5) %a unordered, align 4
%a.add = fadd float %a.load, 1.
store atomic float %a.add, ptr addrspace(5) %a unordered, align 4
ret void
}
define void @local_unordered_sys_double(ptr addrspace(5) %a) {
; CHECK-LABEL: local_unordered_sys_double(
; CHECK: {
; CHECK-NEXT: .reg .b64 %rd<4>;
; CHECK-EMPTY:
; CHECK-NEXT: // %bb.0:
; CHECK-NEXT: ld.param.b64 %rd1, [local_unordered_sys_double_param_0];
; CHECK-NEXT: ld.local.b64 %rd2, [%rd1];
; CHECK-NEXT: add.rn.f64 %rd3, %rd2, 0d3FF0000000000000;
; CHECK-NEXT: st.local.b64 [%rd1], %rd3;
; CHECK-NEXT: ret;
%a.load = load atomic double, ptr addrspace(5) %a unordered, align 8
%a.add = fadd double %a.load, 1.
store atomic double %a.add, ptr addrspace(5) %a unordered, align 8
ret void
}
; local_unordered_volatile_sys
define void @local_unordered_volatile_sys_i8(ptr addrspace(5) %a) {
; CHECK-LABEL: local_unordered_volatile_sys_i8(
; CHECK: {
; CHECK-NEXT: .reg .b16 %rs<3>;
; CHECK-NEXT: .reg .b64 %rd<2>;
; CHECK-EMPTY:
; CHECK-NEXT: // %bb.0:
; CHECK-NEXT: ld.param.b64 %rd1, [local_unordered_volatile_sys_i8_param_0];
; CHECK-NEXT: ld.local.b8 %rs1, [%rd1];
; CHECK-NEXT: add.s16 %rs2, %rs1, 1;
; CHECK-NEXT: st.local.b8 [%rd1], %rs2;
; CHECK-NEXT: ret;
%a.load = load atomic volatile i8, ptr addrspace(5) %a unordered, align 1
%a.add = add i8 %a.load, 1
store atomic volatile i8 %a.add, ptr addrspace(5) %a unordered, align 1
ret void
}
define void @local_unordered_volatile_sys_i16(ptr addrspace(5) %a) {
; CHECK-LABEL: local_unordered_volatile_sys_i16(
; CHECK: {
; CHECK-NEXT: .reg .b16 %rs<3>;
; CHECK-NEXT: .reg .b64 %rd<2>;
; CHECK-EMPTY:
; CHECK-NEXT: // %bb.0:
; CHECK-NEXT: ld.param.b64 %rd1, [local_unordered_volatile_sys_i16_param_0];
; CHECK-NEXT: ld.local.b16 %rs1, [%rd1];
; CHECK-NEXT: add.s16 %rs2, %rs1, 1;
; CHECK-NEXT: st.local.b16 [%rd1], %rs2;
; CHECK-NEXT: ret;
%a.load = load atomic volatile i16, ptr addrspace(5) %a unordered, align 2
%a.add = add i16 %a.load, 1
store atomic volatile i16 %a.add, ptr addrspace(5) %a unordered, align 2
ret void
}
define void @local_unordered_volatile_sys_i32(ptr addrspace(5) %a) {
; CHECK-LABEL: local_unordered_volatile_sys_i32(
; CHECK: {
; CHECK-NEXT: .reg .b32 %r<3>;
; CHECK-NEXT: .reg .b64 %rd<2>;
; CHECK-EMPTY:
; CHECK-NEXT: // %bb.0:
; CHECK-NEXT: ld.param.b64 %rd1, [local_unordered_volatile_sys_i32_param_0];
; CHECK-NEXT: ld.local.b32 %r1, [%rd1];
; CHECK-NEXT: add.s32 %r2, %r1, 1;
; CHECK-NEXT: st.local.b32 [%rd1], %r2;
; CHECK-NEXT: ret;
%a.load = load atomic volatile i32, ptr addrspace(5) %a unordered, align 4
%a.add = add i32 %a.load, 1
store atomic volatile i32 %a.add, ptr addrspace(5) %a unordered, align 4
ret void
}
define void @local_unordered_volatile_sys_i64(ptr addrspace(5) %a) {
; CHECK-LABEL: local_unordered_volatile_sys_i64(
; CHECK: {
; CHECK-NEXT: .reg .b64 %rd<4>;
; CHECK-EMPTY:
; CHECK-NEXT: // %bb.0:
; CHECK-NEXT: ld.param.b64 %rd1, [local_unordered_volatile_sys_i64_param_0];
; CHECK-NEXT: ld.local.b64 %rd2, [%rd1];
; CHECK-NEXT: add.s64 %rd3, %rd2, 1;
; CHECK-NEXT: st.local.b64 [%rd1], %rd3;
; CHECK-NEXT: ret;
%a.load = load atomic volatile i64, ptr addrspace(5) %a unordered, align 8
%a.add = add i64 %a.load, 1
store atomic volatile i64 %a.add, ptr addrspace(5) %a unordered, align 8
ret void
}
define void @local_unordered_volatile_sys_float(ptr addrspace(5) %a) {
; CHECK-LABEL: local_unordered_volatile_sys_float(
; CHECK: {
; CHECK-NEXT: .reg .b32 %r<3>;
; CHECK-NEXT: .reg .b64 %rd<2>;
; CHECK-EMPTY:
; CHECK-NEXT: // %bb.0:
; CHECK-NEXT: ld.param.b64 %rd1, [local_unordered_volatile_sys_float_param_0];
; CHECK-NEXT: ld.local.b32 %r1, [%rd1];
; CHECK-NEXT: add.rn.f32 %r2, %r1, 0f3F800000;
; CHECK-NEXT: st.local.b32 [%rd1], %r2;
; CHECK-NEXT: ret;
%a.load = load atomic volatile float, ptr addrspace(5) %a unordered, align 4
%a.add = fadd float %a.load, 1.
store atomic volatile float %a.add, ptr addrspace(5) %a unordered, align 4
ret void
}
define void @local_unordered_volatile_sys_double(ptr addrspace(5) %a) {
; CHECK-LABEL: local_unordered_volatile_sys_double(
; CHECK: {
; CHECK-NEXT: .reg .b64 %rd<4>;
; CHECK-EMPTY:
; CHECK-NEXT: // %bb.0:
; CHECK-NEXT: ld.param.b64 %rd1, [local_unordered_volatile_sys_double_param_0];
; CHECK-NEXT: ld.local.b64 %rd2, [%rd1];
; CHECK-NEXT: add.rn.f64 %rd3, %rd2, 0d3FF0000000000000;
; CHECK-NEXT: st.local.b64 [%rd1], %rd3;
; CHECK-NEXT: ret;
%a.load = load atomic volatile double, ptr addrspace(5) %a unordered, align 8
%a.add = fadd double %a.load, 1.
store atomic volatile double %a.add, ptr addrspace(5) %a unordered, align 8
ret void
}
; local_monotonic_sys
define void @local_monotonic_sys_i8(ptr addrspace(5) %a) {
; CHECK-LABEL: local_monotonic_sys_i8(
; CHECK: {
; CHECK-NEXT: .reg .b16 %rs<3>;
; CHECK-NEXT: .reg .b64 %rd<2>;
; CHECK-EMPTY:
; CHECK-NEXT: // %bb.0:
; CHECK-NEXT: ld.param.b64 %rd1, [local_monotonic_sys_i8_param_0];
; CHECK-NEXT: ld.local.b8 %rs1, [%rd1];
; CHECK-NEXT: add.s16 %rs2, %rs1, 1;
; CHECK-NEXT: st.local.b8 [%rd1], %rs2;
; CHECK-NEXT: ret;
%a.load = load atomic i8, ptr addrspace(5) %a monotonic, align 1
%a.add = add i8 %a.load, 1
store atomic i8 %a.add, ptr addrspace(5) %a monotonic, align 1
ret void
}
define void @local_monotonic_sys_i16(ptr addrspace(5) %a) {
; CHECK-LABEL: local_monotonic_sys_i16(
; CHECK: {
; CHECK-NEXT: .reg .b16 %rs<3>;
; CHECK-NEXT: .reg .b64 %rd<2>;
; CHECK-EMPTY:
; CHECK-NEXT: // %bb.0:
; CHECK-NEXT: ld.param.b64 %rd1, [local_monotonic_sys_i16_param_0];
; CHECK-NEXT: ld.local.b16 %rs1, [%rd1];
; CHECK-NEXT: add.s16 %rs2, %rs1, 1;
; CHECK-NEXT: st.local.b16 [%rd1], %rs2;
; CHECK-NEXT: ret;
%a.load = load atomic i16, ptr addrspace(5) %a monotonic, align 2
%a.add = add i16 %a.load, 1
store atomic i16 %a.add, ptr addrspace(5) %a monotonic, align 2
ret void
}
define void @local_monotonic_sys_i32(ptr addrspace(5) %a) {
; CHECK-LABEL: local_monotonic_sys_i32(
; CHECK: {
; CHECK-NEXT: .reg .b32 %r<3>;
; CHECK-NEXT: .reg .b64 %rd<2>;
; CHECK-EMPTY:
; CHECK-NEXT: // %bb.0:
; CHECK-NEXT: ld.param.b64 %rd1, [local_monotonic_sys_i32_param_0];
; CHECK-NEXT: ld.local.b32 %r1, [%rd1];
; CHECK-NEXT: add.s32 %r2, %r1, 1;
; CHECK-NEXT: st.local.b32 [%rd1], %r2;
; CHECK-NEXT: ret;
%a.load = load atomic i32, ptr addrspace(5) %a monotonic, align 4
%a.add = add i32 %a.load, 1
store atomic i32 %a.add, ptr addrspace(5) %a monotonic, align 4
ret void
}
define void @local_monotonic_sys_i64(ptr addrspace(5) %a) {
; CHECK-LABEL: local_monotonic_sys_i64(
; CHECK: {
; CHECK-NEXT: .reg .b64 %rd<4>;
; CHECK-EMPTY:
; CHECK-NEXT: // %bb.0:
; CHECK-NEXT: ld.param.b64 %rd1, [local_monotonic_sys_i64_param_0];
; CHECK-NEXT: ld.local.b64 %rd2, [%rd1];
; CHECK-NEXT: add.s64 %rd3, %rd2, 1;
; CHECK-NEXT: st.local.b64 [%rd1], %rd3;
; CHECK-NEXT: ret;
%a.load = load atomic i64, ptr addrspace(5) %a monotonic, align 8
%a.add = add i64 %a.load, 1
store atomic i64 %a.add, ptr addrspace(5) %a monotonic, align 8
ret void
}
define void @local_monotonic_sys_float(ptr addrspace(5) %a) {
; CHECK-LABEL: local_monotonic_sys_float(
; CHECK: {
; CHECK-NEXT: .reg .b32 %r<3>;
; CHECK-NEXT: .reg .b64 %rd<2>;
; CHECK-EMPTY:
; CHECK-NEXT: // %bb.0:
; CHECK-NEXT: ld.param.b64 %rd1, [local_monotonic_sys_float_param_0];
; CHECK-NEXT: ld.local.b32 %r1, [%rd1];
; CHECK-NEXT: add.rn.f32 %r2, %r1, 0f3F800000;
; CHECK-NEXT: st.local.b32 [%rd1], %r2;
; CHECK-NEXT: ret;
%a.load = load atomic float, ptr addrspace(5) %a monotonic, align 4
%a.add = fadd float %a.load, 1.
store atomic float %a.add, ptr addrspace(5) %a monotonic, align 4
ret void
}
define void @local_monotonic_sys_double(ptr addrspace(5) %a) {
; CHECK-LABEL: local_monotonic_sys_double(
; CHECK: {
; CHECK-NEXT: .reg .b64 %rd<4>;
; CHECK-EMPTY:
; CHECK-NEXT: // %bb.0:
; CHECK-NEXT: ld.param.b64 %rd1, [local_monotonic_sys_double_param_0];
; CHECK-NEXT: ld.local.b64 %rd2, [%rd1];
; CHECK-NEXT: add.rn.f64 %rd3, %rd2, 0d3FF0000000000000;
; CHECK-NEXT: st.local.b64 [%rd1], %rd3;
; CHECK-NEXT: ret;
%a.load = load atomic double, ptr addrspace(5) %a monotonic, align 8
%a.add = fadd double %a.load, 1.
store atomic double %a.add, ptr addrspace(5) %a monotonic, align 8
ret void
}
; local_monotonic_volatile_sys
define void @local_monotonic_volatile_sys_i8(ptr addrspace(5) %a) {
; CHECK-LABEL: local_monotonic_volatile_sys_i8(
; CHECK: {
; CHECK-NEXT: .reg .b16 %rs<3>;
; CHECK-NEXT: .reg .b64 %rd<2>;
; CHECK-EMPTY:
; CHECK-NEXT: // %bb.0:
; CHECK-NEXT: ld.param.b64 %rd1, [local_monotonic_volatile_sys_i8_param_0];
; CHECK-NEXT: ld.local.b8 %rs1, [%rd1];
; CHECK-NEXT: add.s16 %rs2, %rs1, 1;
; CHECK-NEXT: st.local.b8 [%rd1], %rs2;
; CHECK-NEXT: ret;
%a.load = load atomic volatile i8, ptr addrspace(5) %a monotonic, align 1
%a.add = add i8 %a.load, 1
store atomic volatile i8 %a.add, ptr addrspace(5) %a monotonic, align 1
ret void
}
define void @local_monotonic_volatile_sys_i16(ptr addrspace(5) %a) {
; CHECK-LABEL: local_monotonic_volatile_sys_i16(
; CHECK: {
; CHECK-NEXT: .reg .b16 %rs<3>;
; CHECK-NEXT: .reg .b64 %rd<2>;
; CHECK-EMPTY:
; CHECK-NEXT: // %bb.0:
; CHECK-NEXT: ld.param.b64 %rd1, [local_monotonic_volatile_sys_i16_param_0];
; CHECK-NEXT: ld.local.b16 %rs1, [%rd1];
; CHECK-NEXT: add.s16 %rs2, %rs1, 1;
; CHECK-NEXT: st.local.b16 [%rd1], %rs2;
; CHECK-NEXT: ret;
%a.load = load atomic volatile i16, ptr addrspace(5) %a monotonic, align 2
%a.add = add i16 %a.load, 1
store atomic volatile i16 %a.add, ptr addrspace(5) %a monotonic, align 2
ret void
}
define void @local_monotonic_volatile_sys_i32(ptr addrspace(5) %a) {
; CHECK-LABEL: local_monotonic_volatile_sys_i32(
; CHECK: {
; CHECK-NEXT: .reg .b32 %r<3>;
; CHECK-NEXT: .reg .b64 %rd<2>;
; CHECK-EMPTY:
; CHECK-NEXT: // %bb.0:
; CHECK-NEXT: ld.param.b64 %rd1, [local_monotonic_volatile_sys_i32_param_0];
; CHECK-NEXT: ld.local.b32 %r1, [%rd1];
; CHECK-NEXT: add.s32 %r2, %r1, 1;
; CHECK-NEXT: st.local.b32 [%rd1], %r2;
; CHECK-NEXT: ret;
%a.load = load atomic volatile i32, ptr addrspace(5) %a monotonic, align 4
%a.add = add i32 %a.load, 1
store atomic volatile i32 %a.add, ptr addrspace(5) %a monotonic, align 4
ret void
}
define void @local_monotonic_volatile_sys_i64(ptr addrspace(5) %a) {
; CHECK-LABEL: local_monotonic_volatile_sys_i64(
; CHECK: {
; CHECK-NEXT: .reg .b64 %rd<4>;
; CHECK-EMPTY:
; CHECK-NEXT: // %bb.0:
; CHECK-NEXT: ld.param.b64 %rd1, [local_monotonic_volatile_sys_i64_param_0];
; CHECK-NEXT: ld.local.b64 %rd2, [%rd1];
; CHECK-NEXT: add.s64 %rd3, %rd2, 1;
; CHECK-NEXT: st.local.b64 [%rd1], %rd3;
; CHECK-NEXT: ret;
%a.load = load atomic volatile i64, ptr addrspace(5) %a monotonic, align 8
%a.add = add i64 %a.load, 1
store atomic volatile i64 %a.add, ptr addrspace(5) %a monotonic, align 8
ret void
}
define void @local_monotonic_volatile_sys_float(ptr addrspace(5) %a) {
; CHECK-LABEL: local_monotonic_volatile_sys_float(
; CHECK: {
; CHECK-NEXT: .reg .b32 %r<3>;
; CHECK-NEXT: .reg .b64 %rd<2>;
; CHECK-EMPTY:
; CHECK-NEXT: // %bb.0:
; CHECK-NEXT: ld.param.b64 %rd1, [local_monotonic_volatile_sys_float_param_0];
; CHECK-NEXT: ld.local.b32 %r1, [%rd1];
; CHECK-NEXT: add.rn.f32 %r2, %r1, 0f3F800000;
; CHECK-NEXT: st.local.b32 [%rd1], %r2;
; CHECK-NEXT: ret;
%a.load = load atomic volatile float, ptr addrspace(5) %a monotonic, align 4
%a.add = fadd float %a.load, 1.
store atomic volatile float %a.add, ptr addrspace(5) %a monotonic, align 4
ret void
}
define void @local_monotonic_volatile_sys_double(ptr addrspace(5) %a) {
; CHECK-LABEL: local_monotonic_volatile_sys_double(
; CHECK: {
; CHECK-NEXT: .reg .b64 %rd<4>;
; CHECK-EMPTY:
; CHECK-NEXT: // %bb.0:
; CHECK-NEXT: ld.param.b64 %rd1, [local_monotonic_volatile_sys_double_param_0];
; CHECK-NEXT: ld.local.b64 %rd2, [%rd1];
; CHECK-NEXT: add.rn.f64 %rd3, %rd2, 0d3FF0000000000000;
; CHECK-NEXT: st.local.b64 [%rd1], %rd3;
; CHECK-NEXT: ret;
%a.load = load atomic volatile double, ptr addrspace(5) %a monotonic, align 8
%a.add = fadd double %a.load, 1.
store atomic volatile double %a.add, ptr addrspace(5) %a monotonic, align 8
ret void
}