| ; 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 |
| } |