Skip to content

[HIP] Add generic address space impl of __spirv_ocl_frexp for HIP backend #5377

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
Jan 28, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions libclc/amdgcn-amdhsa/libspirv/SOURCES
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ math/log.cl
math/log10.cl
math/log1p.cl
math/logb.cl
math/mangle_common.h
math/modf.cl
math/nextafter.cl
math/pow.cl
Expand Down
135 changes: 79 additions & 56 deletions libclc/amdgcn-amdhsa/libspirv/math/frexp.cl
Original file line number Diff line number Diff line change
Expand Up @@ -6,81 +6,104 @@
//
//===----------------------------------------------------------------------===//

#include "mangle_common.h"
#include <spirv/spirv.h>
#include <utils.h>

double __ocml_frexp_f64(double, int *);
float __ocml_frexp_f32(float, int *);

_CLC_OVERLOAD _CLC_DEF float __clc_spirv_ocl_frexp(float x, private int *ep) {
return __ocml_frexp_f32(x, ep);
}
#define FUNCNAME(IN, OUT) \
__CLC_XCONCAT(__CLC_XCONCAT(_Z17__spirv_ocl_frexp, IN), OUT)
#define VEC_TYPE(T, N) __CLC_XCONCAT(__CLC_XCONCAT(__CLC_XCONCAT(Dv, N), _), T)
#define VEC_FUNCNAME(N, MANGLED_IN_TYPE, MANGLED_PTR, MANGLED_OUT_TYPE) \
FUNCNAME(VEC_TYPE(MANGLED_IN_TYPE, N), \
__CLC_XCONCAT(MANGLED_PTR, VEC_TYPE(MANGLED_OUT_TYPE, N)))

#define MANUALLY_MANGLED_FREXP_IMPL(ADDRSPACE, BUILTIN, ARG1_TYPE, \
MANGLED_ARG1_TYPE, MANGLED_ARG2_TYPE) \
_CLC_DEF ARG1_TYPE FUNCNAME(MANGLED_ARG1_TYPE, MANGLED_ARG2_TYPE)( \
ARG1_TYPE x, __attribute((address_space(ADDRSPACE))) int *ptr) { \
int stack_iptr; \
ARG1_TYPE ret = BUILTIN(x, &stack_iptr); \
*ptr = stack_iptr; \
return ret; \
}

#define __CLC_FREXP(BUILTIN, ARG_TYPE, MANGLED_ARG1_TYPE) \
MANUALLY_MANGLED_FREXP_IMPL(0, BUILTIN, ARG_TYPE, MANGLED_ARG1_TYPE, Pi) \
MANUALLY_MANGLED_FREXP_IMPL(1, BUILTIN, ARG_TYPE, MANGLED_ARG1_TYPE, \
PU3AS1i) \
MANUALLY_MANGLED_FREXP_IMPL(3, BUILTIN, ARG_TYPE, MANGLED_ARG1_TYPE, \
PU3AS3i) \
MANUALLY_MANGLED_FREXP_IMPL(5, BUILTIN, ARG_TYPE, MANGLED_ARG1_TYPE, PU3AS5i)

#define FNAME_GENERIC(N) VEC_FUNCNAME(N, f, P, i)
#define FNAME_GLOBAL(N) VEC_FUNCNAME(N, f, PU3AS1, i)
#define FNAME_LOCAL(N) VEC_FUNCNAME(N, f, PU3AS3, i)
#define FNAME_PRIVATE(N) VEC_FUNCNAME(N, f, PU3AS5, i)

__CLC_FREXP(__ocml_frexp_f32, float, f)
MANUALLY_MANGLED_V_V_VP_VECTORIZE(FUNCNAME(f, Pi), FNAME_GENERIC, float, 0, int)
MANUALLY_MANGLED_V_V_VP_VECTORIZE(FUNCNAME(f, PU3AS1i), FNAME_GLOBAL, float, 1,
int)
MANUALLY_MANGLED_V_V_VP_VECTORIZE(FUNCNAME(f, PU3AS3i), FNAME_LOCAL, float, 3,
int)
MANUALLY_MANGLED_V_V_VP_VECTORIZE(FUNCNAME(f, PU3AS5i), FNAME_PRIVATE, float, 5,
int)

#undef FNAME_GENERIC
#undef FNAME_GLOBAL
#undef FNAME_LOCAL
#undef FNAME_PRIVATE

#ifdef cl_khr_fp64

#pragma OPENCL EXTENSION cl_khr_fp64 : enable

_CLC_OVERLOAD _CLC_DEF double __clc_spirv_ocl_frexp(double x, private int *ep) {
return __ocml_frexp_f64(x, ep);
}
#define FNAME_GENERIC(N) VEC_FUNCNAME(N, d, P, i)
#define FNAME_GLOBAL(N) VEC_FUNCNAME(N, d, PU3AS1, i)
#define FNAME_LOCAL(N) VEC_FUNCNAME(N, d, PU3AS3, i)
#define FNAME_PRIVATE(N) VEC_FUNCNAME(N, d, PU3AS5, i)

__CLC_FREXP(__ocml_frexp_f64, double, d)
MANUALLY_MANGLED_V_V_VP_VECTORIZE(FUNCNAME(d, Pi), FNAME_GENERIC, double, 0,
int)
MANUALLY_MANGLED_V_V_VP_VECTORIZE(FUNCNAME(d, PU3AS1i), FNAME_GLOBAL, double, 1,
int)
MANUALLY_MANGLED_V_V_VP_VECTORIZE(FUNCNAME(d, PU3AS3i), FNAME_LOCAL, double, 3,
int)
MANUALLY_MANGLED_V_V_VP_VECTORIZE(FUNCNAME(d, PU3AS5i), FNAME_PRIVATE, double,
5, int)

#undef FNAME_GENERIC
#undef FNAME_GLOBAL
#undef FNAME_LOCAL
#undef FNAME_PRIVATE

#endif

#ifdef cl_khr_fp16

#pragma OPENCL EXTENSION cl_khr_fp16 : enable

_CLC_OVERLOAD _CLC_DEF half __clc_spirv_ocl_frexp(half x, private int *ep) {
float t = x;
return __ocml_frexp_f32(t, ep);
}
#define FNAME_GENERIC(N) VEC_FUNCNAME(N, Dh, P, i)
#define FNAME_GLOBAL(N) VEC_FUNCNAME(N, Dh, PU3AS1, i)
#define FNAME_LOCAL(N) VEC_FUNCNAME(N, Dh, PU3AS3, i)
#define FNAME_PRIVATE(N) VEC_FUNCNAME(N, Dh, PU3AS5, i)

#endif

#define __CLC_ADDRESS_SPACE private
#define __CLC_GENTYPE float
#include <frexp.inc>
#undef __CLC_GENTYPE
#ifdef cl_khr_fp64
#define __CLC_GENTYPE double
#include <frexp.inc>
#undef __CLC_GENTYPE
#endif
#ifdef cl_khr_fp16
#define __CLC_GENTYPE half
#include <frexp.inc>
#undef __CLC_GENTYPE
#endif
#undef __CLC_ADDRESS_SPACE
__CLC_FREXP(__ocml_frexp_f32, half, Dh)
MANUALLY_MANGLED_V_V_VP_VECTORIZE(FUNCNAME(Dh, Pi), FNAME_GENERIC, half, 0, int)
MANUALLY_MANGLED_V_V_VP_VECTORIZE(FUNCNAME(Dh, PU3AS1i), FNAME_GLOBAL, half, 1,
int)
MANUALLY_MANGLED_V_V_VP_VECTORIZE(FUNCNAME(Dh, PU3AS3i), FNAME_LOCAL, half, 3,
int)
MANUALLY_MANGLED_V_V_VP_VECTORIZE(FUNCNAME(Dh, PU3AS5i), FNAME_PRIVATE, half, 5,
int)

#define __CLC_ADDRESS_SPACE global
#define __CLC_GENTYPE float
#include <frexp.inc>
#undef __CLC_GENTYPE
#ifdef cl_khr_fp64
#define __CLC_GENTYPE double
#include <frexp.inc>
#undef __CLC_GENTYPE
#endif
#ifdef cl_khr_fp16
#define __CLC_GENTYPE half
#include <frexp.inc>
#undef __CLC_GENTYPE
#endif
#undef __CLC_ADDRESS_SPACE
#undef FNAME_GENERIC
#undef FNAME_GLOBAL
#undef FNAME_LOCAL
#undef FNAME_PRIVATE

#define __CLC_ADDRESS_SPACE local
#define __CLC_GENTYPE float
#include <frexp.inc>
#undef __CLC_GENTYPE
#ifdef cl_khr_fp64
#define __CLC_GENTYPE double
#include <frexp.inc>
#undef __CLC_GENTYPE
#endif
#ifdef cl_khr_fp16
#define __CLC_GENTYPE half
#include <frexp.inc>
#undef __CLC_GENTYPE
#endif
#undef __CLC_ADDRESS_SPACE
64 changes: 0 additions & 64 deletions libclc/amdgcn-amdhsa/libspirv/math/frexp.inc

This file was deleted.

70 changes: 70 additions & 0 deletions libclc/amdgcn-amdhsa/libspirv/math/mangle_common.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
#ifndef __MANGLE_COMMON
#define __MANGLE_COMMON

#define MANUALLY_MANGLED_V_V_VP_VECTORIZE(SCALAR_NAME, FUNCTION_MACRO, \
ARG1_TYPE, ADDR_SPACE, ARG2_TYPE) \
_CLC_DEF ARG1_TYPE##2 FUNCTION_MACRO(2)( \
ARG1_TYPE##2 x, \
__attribute__((address_space(ADDR_SPACE))) ARG2_TYPE##2 * y) { \
return (ARG1_TYPE##2)( \
SCALAR_NAME( \
x.x, (__attribute__((address_space(ADDR_SPACE))) ARG2_TYPE *)y), \
SCALAR_NAME( \
x.y, \
(__attribute__((address_space(ADDR_SPACE))) ARG2_TYPE *)y + 1)); \
} \
\
_CLC_DEF ARG1_TYPE##3 FUNCTION_MACRO(3)( \
ARG1_TYPE##3 x, \
__attribute__((address_space(ADDR_SPACE))) ARG2_TYPE##3 * y) { \
return (ARG1_TYPE##3)( \
SCALAR_NAME( \
x.x, (__attribute__((address_space(ADDR_SPACE))) ARG2_TYPE *)y), \
SCALAR_NAME( \
x.y, \
(__attribute__((address_space(ADDR_SPACE))) ARG2_TYPE *)y + 1), \
SCALAR_NAME( \
x.z, \
(__attribute__((address_space(ADDR_SPACE))) ARG2_TYPE *)y + 2)); \
} \
\
_CLC_DEF ARG1_TYPE##4 FUNCTION_MACRO(4)( \
ARG1_TYPE##4 x, \
__attribute__((address_space(ADDR_SPACE))) ARG2_TYPE##4 * y) { \
return (ARG1_TYPE##4)( \
FUNCTION_MACRO(2)(x.lo, (__attribute__((address_space(ADDR_SPACE))) \
ARG2_TYPE##2 *)y), \
FUNCTION_MACRO(2)( \
x.hi, (__attribute__((address_space(ADDR_SPACE))) \
ARG2_TYPE##2 *)((__attribute__((address_space(ADDR_SPACE))) \
ARG2_TYPE *)y + \
2))); \
} \
\
_CLC_DEF ARG1_TYPE##8 FUNCTION_MACRO(8)( \
ARG1_TYPE##8 x, \
__attribute__((address_space(ADDR_SPACE))) ARG2_TYPE##8 * y) { \
return (ARG1_TYPE##8)( \
FUNCTION_MACRO(4)(x.lo, (__attribute__((address_space(ADDR_SPACE))) \
ARG2_TYPE##4 *)y), \
FUNCTION_MACRO(4)( \
x.hi, (__attribute__((address_space(ADDR_SPACE))) \
ARG2_TYPE##4 *)((__attribute__((address_space(ADDR_SPACE))) \
ARG2_TYPE *)y + \
4))); \
} \
\
_CLC_DEF ARG1_TYPE##16 FUNCTION_MACRO(16)( \
ARG1_TYPE##16 x, \
__attribute__((address_space(ADDR_SPACE))) ARG2_TYPE##16 * y) { \
return (ARG1_TYPE##16)( \
FUNCTION_MACRO(8)(x.lo, (__attribute__((address_space(ADDR_SPACE))) \
ARG2_TYPE##8 *)y), \
FUNCTION_MACRO(8)( \
x.hi, (__attribute__((address_space(ADDR_SPACE))) \
ARG2_TYPE##8 *)((__attribute__((address_space(ADDR_SPACE))) \
ARG2_TYPE *)y + \
8))); \
}

#endif // !__MANGLE_COMMON
Loading