Use nvrtc to compile PTX (resulting PTX not yet used)

pull/2022/head
Jens Steube 5 years ago
parent 4045e60021
commit 9faba41848

@ -18,7 +18,7 @@ DECLSPEC u8 v8a_from_v32_S (const u32 v32)
v.v32 = v32;
return v.v8a;
return v.v8.a;
}
DECLSPEC u8 v8b_from_v32_S (const u32 v32)
@ -27,7 +27,7 @@ DECLSPEC u8 v8b_from_v32_S (const u32 v32)
v.v32 = v32;
return v.v8b;
return v.v8.b;
}
DECLSPEC u8 v8c_from_v32_S (const u32 v32)
@ -36,7 +36,7 @@ DECLSPEC u8 v8c_from_v32_S (const u32 v32)
v.v32 = v32;
return v.v8c;
return v.v8.c;
}
DECLSPEC u8 v8d_from_v32_S (const u32 v32)
@ -45,7 +45,7 @@ DECLSPEC u8 v8d_from_v32_S (const u32 v32)
v.v32 = v32;
return v.v8d;
return v.v8.d;
}
DECLSPEC u16 v16a_from_v32_S (const u32 v32)
@ -54,7 +54,7 @@ DECLSPEC u16 v16a_from_v32_S (const u32 v32)
v.v32 = v32;
return v.v16a;
return v.v16.a;
}
DECLSPEC u16 v16b_from_v32_S (const u32 v32)
@ -63,15 +63,15 @@ DECLSPEC u16 v16b_from_v32_S (const u32 v32)
v.v32 = v32;
return v.v16b;
return v.v16.b;
}
DECLSPEC u32 v32_from_v16ab_S (const u16 v16a, const u16 v16b)
{
vconv32_t v;
v.v16a = v16a;
v.v16b = v16b;
v.v16.a = v16a;
v.v16.b = v16b;
return v.v32;
}
@ -82,7 +82,7 @@ DECLSPEC u32 v32a_from_v64_S (const u64 v64)
v.v64 = v64;
return v.v32a;
return v.v32.a;
}
DECLSPEC u32 v32b_from_v64_S (const u64 v64)
@ -91,15 +91,15 @@ DECLSPEC u32 v32b_from_v64_S (const u64 v64)
v.v64 = v64;
return v.v32b;
return v.v32.b;
}
DECLSPEC u64 v64_from_v32ab_S (const u32 v32a, const u32 v32b)
{
vconv64_t v;
v.v32a = v32a;
v.v32b = v32b;
v.v32.a = v32a;
v.v32.b = v32b;
return v.v64;
}

@ -8,6 +8,7 @@
#include "inc_platform.h"
#ifdef IS_NATIVE
#define SYNC_THREADS()
#endif
#ifdef IS_CUDA
@ -22,6 +23,11 @@ DECLSPEC u32 atomic_inc (u32 *p)
return atomicAdd (p, 1);
}
DECLSPEC u32 atomic_or (u32 *p, u32 val)
{
return atomicOr (p, val);
}
DECLSPEC size_t get_global_id (const u32 dimindx __attribute__((unused)))
{
return blockDim.x * blockIdx.x + threadIdx.x;
@ -38,7 +44,9 @@ DECLSPEC size_t get_local_size (const u32 dimindx __attribute__((unused)))
return blockDim.x;
}
#define SYNC_THREADS() __syncthreads ()
#endif
#ifdef IS_OPENCL
#define SYNC_THREADS() barrier (CLK_LOCAL_MEM_FENCE)
#endif

@ -9,6 +9,7 @@
#ifdef IS_CUDA
DECLSPEC u32 atomic_dec (u32 *p);
DECLSPEC u32 atomic_inc (u32 *p);
DECLSPEC u32 atomic_or (u32 *p, u32 val);
DECLSPEC size_t get_global_id (const u32 dimindx __attribute__((unused)));
DECLSPEC size_t get_local_id (const u32 dimindx __attribute__((unused)));
DECLSPEC size_t get_local_size (const u32 dimindx __attribute__((unused)));

@ -7,7 +7,10 @@
#define _INC_TYPES_H
#ifdef IS_CUDA
typedef unsigned char uchar;
typedef unsigned char uchar;
typedef unsigned short ushort;
typedef unsigned int uint;
typedef unsigned long ulong;
#endif
#ifdef KERNEL_STATIC
@ -62,17 +65,19 @@ typedef union vconv32
struct
{
u16 v16a;
u16 v16b;
};
u16 a;
u16 b;
} v16;
struct
{
u8 v8a;
u8 v8b;
u8 v8c;
u8 v8d;
};
u8 a;
u8 b;
u8 c;
u8 d;
} v8;
} vconv32_t;
@ -82,29 +87,32 @@ typedef union vconv64
struct
{
u32 v32a;
u32 v32b;
};
u32 a;
u32 b;
} v32;
struct
{
u16 v16a;
u16 v16b;
u16 v16c;
u16 v16d;
};
u16 a;
u16 b;
u16 c;
u16 d;
} v16;
struct
{
u8 v8a;
u8 v8b;
u8 v8c;
u8 v8d;
u8 v8e;
u8 v8f;
u8 v8g;
u8 v8h;
};
u8 a;
u8 b;
u8 c;
u8 d;
u8 e;
u8 f;
u8 g;
u8 h;
} v8;
} vconv64_t;

@ -103,15 +103,11 @@
#if defined IS_CPU
#define DECLSPEC inline
#elif defined IS_GPU
#if defined IS_CUDA
#define DECLSPEC __device__
#else
#if defined IS_AMD
#define DECLSPEC inline static
#else
#define DECLSPEC
#endif
#endif
#else
#define DECLSPEC
#endif

@ -22,11 +22,22 @@ static const char CL_VENDOR_MESA[] = "Mesa";
static const char CL_VENDOR_NV[] = "NVIDIA Corporation";
static const char CL_VENDOR_POCL[] = "The pocl project";
int cuda_init (hashcat_ctx_t *hashcat_ctx);
void cuda_close (hashcat_ctx_t *hashcat_ctx);
int cuda_init (hashcat_ctx_t *hashcat_ctx);
void cuda_close (hashcat_ctx_t *hashcat_ctx);
int ocl_init (hashcat_ctx_t *hashcat_ctx);
void ocl_close (hashcat_ctx_t *hashcat_ctx);
int nvrtc_init (hashcat_ctx_t *hashcat_ctx);
void nvrtc_close (hashcat_ctx_t *hashcat_ctx);
int ocl_init (hashcat_ctx_t *hashcat_ctx);
void ocl_close (hashcat_ctx_t *hashcat_ctx);
int hc_nvrtcCreateProgram (hashcat_ctx_t *hashcat_ctx, nvrtcProgram *prog, const char *src, const char *name, int numHeaders, const char * const *headers, const char * const *includeNames);
int hc_nvrtcDestroyProgram (hashcat_ctx_t *hashcat_ctx, nvrtcProgram *prog);
int hc_nvrtcCompileProgram (hashcat_ctx_t *hashcat_ctx, nvrtcProgram prog, int numOptions, const char * const *options);
int hc_nvrtcGetProgramLogSize (hashcat_ctx_t *hashcat_ctx, nvrtcProgram prog, size_t *logSizeRet);
int hc_nvrtcGetProgramLog (hashcat_ctx_t *hashcat_ctx, nvrtcProgram prog, char *log);
int hc_nvrtcGetPTXSize (hashcat_ctx_t *hashcat_ctx, nvrtcProgram prog, size_t *ptxSizeRet);
int hc_nvrtcGetPTX (hashcat_ctx_t *hashcat_ctx, nvrtcProgram prog, char *ptx);
int hc_clBuildProgram (hashcat_ctx_t *hashcat_ctx, cl_program program, cl_uint num_devices, const cl_device_id *device_list, const char *options, void (CL_CALLBACK *pfn_notify) (cl_program program, void *user_data), void *user_data);
int hc_clCreateBuffer (hashcat_ctx_t *hashcat_ctx, cl_context context, cl_mem_flags flags, size_t size, void *host_ptr, cl_mem *mem);

@ -50,15 +50,16 @@ typedef struct _nvrtcProgram *nvrtcProgram;
#define NVRTC_API_CALL NVRTCAPI
typedef nvrtcResult (NVRTC_API_CALL *NVRTC_NVRTCADDNAMEEXPRESSION) (nvrtcProgram, const char *);
typedef nvrtcResult (NVRTC_API_CALL *NVRTC_NVRTCCOMPILEPROGRAM) (nvrtcProgram, int, const char **);
typedef nvrtcResult (NVRTC_API_CALL *NVRTC_NVRTCCREATEPROGRAM) (nvrtcProgram *, const char *, const char *, int, const char **, const char **);
typedef nvrtcResult (NVRTC_API_CALL *NVRTC_NVRTCDESTROYPROGRAM) (nvrtcProgram *);
typedef nvrtcResult (NVRTC_API_CALL *NVRTC_NVRTCGETLOWEREDNAME) (nvrtcProgram, const char *, const char **);
typedef nvrtcResult (NVRTC_API_CALL *NVRTC_NVRTCGETPTX) (nvrtcProgram, char *);
typedef nvrtcResult (NVRTC_API_CALL *NVRTC_NVRTCGETPTXSIZE) (nvrtcProgram, size_t *);
typedef nvrtcResult (NVRTC_API_CALL *NVRTC_NVRTCGETPROGRAMLOG) (nvrtcProgram, char *);
typedef nvrtcResult (NVRTC_API_CALL *NVRTC_NVRTCGETPROGRAMLOGSIZE) (nvrtcProgram, size_t *);
typedef nvrtcResult (NVRTC_API_CALL *NVRTC_NVRTCADDNAMEEXPRESSION) (nvrtcProgram, const char * const);
typedef nvrtcResult (NVRTC_API_CALL *NVRTC_NVRTCCOMPILEPROGRAM) (nvrtcProgram, int, const char * const *);
typedef nvrtcResult (NVRTC_API_CALL *NVRTC_NVRTCCREATEPROGRAM) (nvrtcProgram *, const char *, const char *, int, const char * const *, const char * const *);
typedef nvrtcResult (NVRTC_API_CALL *NVRTC_NVRTCDESTROYPROGRAM) (nvrtcProgram *);
typedef nvrtcResult (NVRTC_API_CALL *NVRTC_NVRTCGETLOWEREDNAME) (nvrtcProgram, const char * const, const char **);
typedef nvrtcResult (NVRTC_API_CALL *NVRTC_NVRTCGETPTX) (nvrtcProgram, char *);
typedef nvrtcResult (NVRTC_API_CALL *NVRTC_NVRTCGETPTXSIZE) (nvrtcProgram, size_t *);
typedef nvrtcResult (NVRTC_API_CALL *NVRTC_NVRTCGETPROGRAMLOG) (nvrtcProgram, char *);
typedef nvrtcResult (NVRTC_API_CALL *NVRTC_NVRTCGETPROGRAMLOGSIZE) (nvrtcProgram, size_t *);
typedef const char * (NVRTC_API_CALL *NVRTC_NVRTCGETERRORSTRING) (nvrtcResult);
typedef struct hc_nvrtc_lib
{
@ -73,9 +74,12 @@ typedef struct hc_nvrtc_lib
NVRTC_NVRTCGETPTXSIZE nvrtcGetPTXSize;
NVRTC_NVRTCGETPROGRAMLOG nvrtcGetProgramLog;
NVRTC_NVRTCGETPROGRAMLOGSIZE nvrtcGetProgramLogSize;
NVRTC_NVRTCGETERRORSTRING nvrtcGetErrorString;
} hc_nvrtc_lib_t;
typedef hc_nvrtc_lib_t NVRTC_PTR;
int nvrtc_make_options_array_from_string (char *string, char **options);
#endif // _EXT_NVRTC_H

@ -587,6 +587,7 @@ int nvrtc_init (hashcat_ctx_t *hashcat_ctx)
HC_LOAD_FUNC (nvrtc, nvrtcGetPTXSize, NVRTC_NVRTCGETPTXSIZE, NVRTC, 1);
HC_LOAD_FUNC (nvrtc, nvrtcGetProgramLog, NVRTC_NVRTCGETPROGRAMLOG, NVRTC, 1);
HC_LOAD_FUNC (nvrtc, nvrtcGetProgramLogSize, NVRTC_NVRTCGETPROGRAMLOGSIZE, NVRTC, 1);
HC_LOAD_FUNC (nvrtc, nvrtcGetErrorString, NVRTC_NVRTCGETERRORSTRING, NVRTC, 1);
return 0;
}
@ -831,6 +832,132 @@ void ocl_close (hashcat_ctx_t *hashcat_ctx)
}
}
int hc_nvrtcCreateProgram (hashcat_ctx_t *hashcat_ctx, nvrtcProgram *prog, const char *src, const char *name, int numHeaders, const char * const *headers, const char * const *includeNames)
{
backend_ctx_t *backend_ctx = hashcat_ctx->backend_ctx;
NVRTC_PTR *nvrtc = backend_ctx->nvrtc;
const nvrtcResult NVRTC_err = nvrtc->nvrtcCreateProgram (prog, src, name, numHeaders, headers, includeNames);
if (NVRTC_err != NVRTC_SUCCESS)
{
event_log_error (hashcat_ctx, "nvrtcCreateProgram(): %s", nvrtc->nvrtcGetErrorString (NVRTC_err));
return -1;
}
return 0;
}
int hc_nvrtcDestroyProgram (hashcat_ctx_t *hashcat_ctx, nvrtcProgram *prog)
{
backend_ctx_t *backend_ctx = hashcat_ctx->backend_ctx;
NVRTC_PTR *nvrtc = backend_ctx->nvrtc;
const nvrtcResult NVRTC_err = nvrtc->nvrtcDestroyProgram (prog);
if (NVRTC_err != NVRTC_SUCCESS)
{
event_log_error (hashcat_ctx, "nvrtcDestroyProgram(): %s", nvrtc->nvrtcGetErrorString (NVRTC_err));
return -1;
}
return 0;
}
int hc_nvrtcCompileProgram (hashcat_ctx_t *hashcat_ctx, nvrtcProgram prog, int numOptions, const char * const *options)
{
backend_ctx_t *backend_ctx = hashcat_ctx->backend_ctx;
NVRTC_PTR *nvrtc = backend_ctx->nvrtc;
const nvrtcResult NVRTC_err = nvrtc->nvrtcCompileProgram (prog, numOptions, options);
if (NVRTC_err != NVRTC_SUCCESS)
{
event_log_error (hashcat_ctx, "nvrtcCompileProgram(): %s", nvrtc->nvrtcGetErrorString (NVRTC_err));
return -1;
}
return 0;
}
int hc_nvrtcGetProgramLogSize (hashcat_ctx_t *hashcat_ctx, nvrtcProgram prog, size_t *logSizeRet)
{
backend_ctx_t *backend_ctx = hashcat_ctx->backend_ctx;
NVRTC_PTR *nvrtc = backend_ctx->nvrtc;
const nvrtcResult NVRTC_err = nvrtc->nvrtcGetProgramLogSize (prog, logSizeRet);
if (NVRTC_err != NVRTC_SUCCESS)
{
event_log_error (hashcat_ctx, "nvrtcGetProgramLogSize(): %s", nvrtc->nvrtcGetErrorString (NVRTC_err));
return -1;
}
return 0;
}
int hc_nvrtcGetProgramLog (hashcat_ctx_t *hashcat_ctx, nvrtcProgram prog, char *log)
{
backend_ctx_t *backend_ctx = hashcat_ctx->backend_ctx;
NVRTC_PTR *nvrtc = backend_ctx->nvrtc;
const nvrtcResult NVRTC_err = nvrtc->nvrtcGetProgramLog (prog, log);
if (NVRTC_err != NVRTC_SUCCESS)
{
event_log_error (hashcat_ctx, "nvrtcGetProgramLog(): %s", nvrtc->nvrtcGetErrorString (NVRTC_err));
return -1;
}
return 0;
}
int hc_nvrtcGetPTXSize (hashcat_ctx_t *hashcat_ctx, nvrtcProgram prog, size_t *ptxSizeRet)
{
backend_ctx_t *backend_ctx = hashcat_ctx->backend_ctx;
NVRTC_PTR *nvrtc = backend_ctx->nvrtc;
const nvrtcResult NVRTC_err = nvrtc->nvrtcGetPTXSize (prog, ptxSizeRet);
if (NVRTC_err != NVRTC_SUCCESS)
{
event_log_error (hashcat_ctx, "nvrtcGetPTXSize(): %s", nvrtc->nvrtcGetErrorString (NVRTC_err));
return -1;
}
return 0;
}
int hc_nvrtcGetPTX (hashcat_ctx_t *hashcat_ctx, nvrtcProgram prog, char *ptx)
{
backend_ctx_t *backend_ctx = hashcat_ctx->backend_ctx;
NVRTC_PTR *nvrtc = backend_ctx->nvrtc;
const nvrtcResult NVRTC_err = nvrtc->nvrtcGetPTX (prog, ptx);
if (NVRTC_err != NVRTC_SUCCESS)
{
event_log_error (hashcat_ctx, "nvrtcGetPTX(): %s", nvrtc->nvrtcGetErrorString (NVRTC_err));
return -1;
}
return 0;
}
int hc_clEnqueueNDRangeKernel (hashcat_ctx_t *hashcat_ctx, cl_command_queue command_queue, cl_kernel kernel, cl_uint work_dim, const size_t *global_work_offset, const size_t *global_work_size, const size_t *local_work_size, cl_uint num_events_in_wait_list, const cl_event *event_wait_list, cl_event *event)
{
backend_ctx_t *backend_ctx = hashcat_ctx->backend_ctx;
@ -3180,7 +3307,6 @@ int backend_ctx_init (hashcat_ctx_t *hashcat_ctx)
ocl_close (hashcat_ctx);
}
/**
* return if both CUDA and OpenCL initialization failed
*/
@ -4911,6 +5037,13 @@ int backend_session_begin (hashcat_ctx_t *hashcat_ctx)
if (vector_width > 16) vector_width = 16;
// CUDA currently support only scalar types
if (backend_ctx->cuda)
{
vector_width = 1;
}
device_param->vector_width = vector_width;
/**
@ -5349,65 +5482,145 @@ int backend_session_begin (hashcat_ctx_t *hashcat_ctx)
if (rc_read_kernel == false) return -1;
CL_rc = hc_clCreateProgramWithSource (hashcat_ctx, device_param->context, 1, (const char **) kernel_sources, NULL, &device_param->program);
if (backend_ctx->nvrtc)
{
nvrtcProgram program;
if (CL_rc == -1) return -1;
const int rc_nvrtcCreateProgram = hc_nvrtcCreateProgram (hashcat_ctx, &program, kernel_sources[0], "main_kernel", 0, NULL, NULL);
CL_rc = hc_clBuildProgram (hashcat_ctx, device_param->program, 1, &device_param->device, build_options_module_buf, NULL, NULL);
if (rc_nvrtcCreateProgram == -1) return -1;
//if (CL_rc == -1) return -1;
char **nvrtc_options = (char **) hccalloc (1 + strlen (build_options_module_buf) + 1, sizeof (char *)); // ...
size_t build_log_size = 0;
nvrtc_options[0] = "--device-as-default-execution-space";
hc_clGetProgramBuildInfo (hashcat_ctx, device_param->program, device_param->device, CL_PROGRAM_BUILD_LOG, 0, NULL, &build_log_size);
char *nvrtc_options_string = hcstrdup (build_options_module_buf);
//if (CL_rc == -1) return -1;
const int num_options = 1 + nvrtc_make_options_array_from_string (nvrtc_options_string, nvrtc_options + 1);
#if defined (DEBUG)
if ((build_log_size > 1) || (CL_rc == -1))
#else
if (CL_rc == -1)
#endif
{
char *build_log = (char *) hcmalloc (build_log_size + 1);
const int rc_nvrtcCompileProgram = hc_nvrtcCompileProgram (hashcat_ctx, program, num_options, (const char * const *) nvrtc_options);
int CL_rc_build = hc_clGetProgramBuildInfo (hashcat_ctx, device_param->program, device_param->device, CL_PROGRAM_BUILD_LOG, build_log_size, build_log, NULL);
size_t build_log_size = 0;
if (CL_rc_build == -1) return -1;
hc_nvrtcGetProgramLogSize (hashcat_ctx, program, &build_log_size);
puts (build_log);
#if defined (DEBUG)
if ((build_log_size > 1) || (rc_nvrtcCompileProgram == -1))
#else
if (rc_nvrtcCompileProgram == -1)
#endif
{
char *build_log = (char *) hcmalloc (build_log_size + 1);
hcfree (build_log);
}
const int rc_nvrtcGetProgramLog = hc_nvrtcGetProgramLog (hashcat_ctx, program, build_log);
if (CL_rc == -1)
{
device_param->skipped_warning = true;
if (rc_nvrtcGetProgramLog == -1) return -1;
event_log_error (hashcat_ctx, "* Device #%u: Kernel %s build failed - proceeding without this device.", device_id + 1, source_file);
puts (build_log);
continue;
hcfree (build_log);
}
if (rc_nvrtcCompileProgram == -1)
{
device_param->skipped_warning = true;
event_log_error (hashcat_ctx, "* Device #%u: Kernel %s build failed - proceeding without this device.", device_id + 1, source_file);
continue;
}
hcfree (nvrtc_options);
hcfree (nvrtc_options_string);
if (cache_disable == false)
{
size_t binary_size;
const int rc_nvrtcGetPTXSize = hc_nvrtcGetPTXSize (hashcat_ctx, program, &binary_size);
if (rc_nvrtcGetPTXSize == -1) return -1;
char *binary = (char *) hcmalloc (binary_size);
const int nvrtcGetPTX = hc_nvrtcGetPTX (hashcat_ctx, program, binary);
if (nvrtcGetPTX == -1) return -1;
const bool rc_write = write_kernel_binary (hashcat_ctx, cached_file, binary, binary_size);
if (rc_write == false) return -1;
hcfree (binary);
}
const int rc_nvrtcDestroyProgram = hc_nvrtcDestroyProgram (hashcat_ctx, &program);
if (rc_nvrtcDestroyProgram == -1) return -1;
}
if (cache_disable == false)
if (1) // later just else
{
size_t binary_size;
CL_rc = hc_clGetProgramInfo (hashcat_ctx, device_param->program, CL_PROGRAM_BINARY_SIZES, sizeof (size_t), &binary_size, NULL);
CL_rc = hc_clCreateProgramWithSource (hashcat_ctx, device_param->context, 1, (const char **) kernel_sources, NULL, &device_param->program);
if (CL_rc == -1) return -1;
char *binary = (char *) hcmalloc (binary_size);
CL_rc = hc_clBuildProgram (hashcat_ctx, device_param->program, 1, &device_param->device, build_options_module_buf, NULL, NULL);
CL_rc = hc_clGetProgramInfo (hashcat_ctx, device_param->program, CL_PROGRAM_BINARIES, sizeof (char *), &binary, NULL);
//if (CL_rc == -1) return -1;
if (CL_rc == -1) return -1;
size_t build_log_size = 0;
hc_clGetProgramBuildInfo (hashcat_ctx, device_param->program, device_param->device, CL_PROGRAM_BUILD_LOG, 0, NULL, &build_log_size);
//if (CL_rc == -1) return -1;
#if defined (DEBUG)
if ((build_log_size > 1) || (CL_rc == -1))
#else
if (CL_rc == -1)
#endif
{
char *build_log = (char *) hcmalloc (build_log_size + 1);
int CL_rc_build = hc_clGetProgramBuildInfo (hashcat_ctx, device_param->program, device_param->device, CL_PROGRAM_BUILD_LOG, build_log_size, build_log, NULL);
if (CL_rc_build == -1) return -1;
puts (build_log);
hcfree (build_log);
}
if (CL_rc == -1)
{
device_param->skipped_warning = true;
event_log_error (hashcat_ctx, "* Device #%u: Kernel %s build failed - proceeding without this device.", device_id + 1, source_file);
continue;
}
if (cache_disable == false)
{
size_t binary_size;
CL_rc = hc_clGetProgramInfo (hashcat_ctx, device_param->program, CL_PROGRAM_BINARY_SIZES, sizeof (size_t), &binary_size, NULL);
if (CL_rc == -1) return -1;
char *binary = (char *) hcmalloc (binary_size);
CL_rc = hc_clGetProgramInfo (hashcat_ctx, device_param->program, CL_PROGRAM_BINARIES, sizeof (char *), &binary, NULL);
if (CL_rc == -1) return -1;
const bool rc_write = write_kernel_binary (hashcat_ctx, cached_file, binary, binary_size);
const bool rc_write = write_kernel_binary (hashcat_ctx, cached_file, binary, binary_size);
if (rc_write == false) return -1;
if (rc_write == false) return -1;
hcfree (binary);
hcfree (binary);
}
}
}
else

@ -845,7 +845,7 @@ u8 v8a_from_v32 (const u32 v32)
v.v32 = v32;
return v.v8a;
return v.v8.a;
}
u8 v8b_from_v32 (const u32 v32)
@ -854,7 +854,7 @@ u8 v8b_from_v32 (const u32 v32)
v.v32 = v32;
return v.v8b;
return v.v8.b;
}
u8 v8c_from_v32 (const u32 v32)
@ -863,7 +863,7 @@ u8 v8c_from_v32 (const u32 v32)
v.v32 = v32;
return v.v8c;
return v.v8.c;
}
u8 v8d_from_v32 (const u32 v32)
@ -872,7 +872,7 @@ u8 v8d_from_v32 (const u32 v32)
v.v32 = v32;
return v.v8d;
return v.v8.d;
}
u16 v16a_from_v32 (const u32 v32)
@ -881,7 +881,7 @@ u16 v16a_from_v32 (const u32 v32)
v.v32 = v32;
return v.v16a;
return v.v16.a;
}
u16 v16b_from_v32 (const u32 v32)
@ -890,15 +890,15 @@ u16 v16b_from_v32 (const u32 v32)
v.v32 = v32;
return v.v16b;
return v.v16.b;
}
u32 v32_from_v16ab (const u16 v16a, const u16 v16b)
{
vconv32_t v;
v.v16a = v16a;
v.v16b = v16b;
v.v16.a = v16a;
v.v16.b = v16b;
return v.v32;
}
@ -909,7 +909,7 @@ u32 v32a_from_v64 (const u64 v64)
v.v64 = v64;
return v.v32a;
return v.v32.a;
}
u32 v32b_from_v64 (const u64 v64)
@ -918,15 +918,15 @@ u32 v32b_from_v64 (const u64 v64)
v.v64 = v64;
return v.v32b;
return v.v32.b;
}
u64 v64_from_v32ab (const u32 v32a, const u32 v32b)
{
vconv64_t v;
v.v32a = v32a;
v.v32b = v32b;
v.v32.a = v32a;
v.v32.b = v32b;
return v.v64;
}

@ -6,3 +6,22 @@
#include "common.h"
#include "types.h"
#include "ext_nvrtc.h"
int nvrtc_make_options_array_from_string (char *string, char **options)
{
char *saveptr = NULL;
char *next = strtok_r (string, " ", &saveptr);
int cnt = 0;
do
{
options[cnt] = next;
cnt++;
} while ((next = strtok_r ((char *) NULL, " ", &saveptr)) != NULL);
return cnt;
}
Loading…
Cancel
Save