// REQUIRES: nvptx-registered-target
// REQUIRES: x86-registered-target

// RUN: %clang_cc1 "-aux-triple" "x86_64-unknown-linux-gnu" "-triple" "nvptx64-nvidia-cuda" \
// RUN:    -fcuda-is-device "-aux-target-cpu" "x86-64" -S -o - %s | FileCheck %s

#include "Inputs/cuda.h"

// CHECK-LABEL: .visible .func _Z8test_argPDF16bDF16b(
// CHECK:        .param .b64 _Z8test_argPDF16bDF16b_param_0,
// CHECK:        .param .b16 _Z8test_argPDF16bDF16b_param_1
//
__device__ void test_arg(__bf16 *out, __bf16 in) {
// CHECK:         ld.param.b16    %{{h.*}}, [_Z8test_argPDF16bDF16b_param_1];
  __bf16 bf16 = in;
  *out = bf16;
// CHECK:         st.b16
// CHECK:         ret;
}


// CHECK-LABEL: .visible .func (.param .b32 func_retval0) _Z8test_retDF16b(
// CHECK:         .param .b16 _Z8test_retDF16b_param_0
__device__ __bf16 test_ret( __bf16 in) {
// CHECK:        ld.param.b16    %h{{.*}}, [_Z8test_retDF16b_param_0];
  return in;
// CHECK:        st.param.b16    [func_retval0+0], %h
// CHECK:        ret;
}

// CHECK-LABEL: .visible .func  (.param .b32 func_retval0) _Z9test_callDF16b(
// CHECK:        .param .b16 _Z9test_callDF16b_param_0
__device__ __bf16 test_call( __bf16 in) {
// CHECK:        ld.param.b16    %h{{.*}}, [_Z9test_callDF16b_param_0];
// CHECK:        st.param.b16    [param0+0], %h2;
// CHECK:        .param .b32 retval0;
// CHECK:        call.uni (retval0),
// CHECK-NEXT:   _Z8test_retDF16b,
// CHECK-NEXT:   (
// CHECK-NEXT:   param0
// CHECK-NEXT    );
// CHECK:        ld.param.b16    %h{{.*}}, [retval0+0];
  return test_ret(in);
// CHECK:        st.param.b16    [func_retval0+0], %h
// CHECK:        ret;
}
