2019-01-03 Tom de Vries <tdevries@suse.de>
+ * config/nvptx/nvptx.c (MACH_VECTOR_LENGTH, MACH_MAX_WORKERS): Define.
+ (init_axis_dim, nvptx_mach_max_workers, nvptx_mach_vector_length): New
+ function.
+ * config/nvptx/nvptx.h (struct machine_function): Add axis_dims.
+
+2019-01-03 Tom de Vries <tdevries@suse.de>
+
* config/nvptx/nvptx.c (struct offload_attrs): New.
(populate_offload_attrs): New function. Factor mask extraction out of
nvptx_reorg. Add extraction of dimensions.
int vector_length;
};
+/* Define entries for cfun->machine->axis_dim. */
+
+#define MACH_VECTOR_LENGTH 0
+#define MACH_MAX_WORKERS 1
+
+static void populate_offload_attrs (offload_attrs *oa);
+
+static void
+init_axis_dim (void)
+{
+ offload_attrs oa;
+ int max_workers;
+
+ populate_offload_attrs (&oa);
+
+ if (oa.num_workers == 0)
+ max_workers = PTX_CTA_SIZE / oa.vector_length;
+ else
+ max_workers = oa.num_workers;
+
+ cfun->machine->axis_dim[MACH_VECTOR_LENGTH] = oa.vector_length;
+ cfun->machine->axis_dim[MACH_MAX_WORKERS] = max_workers;
+ cfun->machine->axis_dim_init_p = true;
+}
+
+static int ATTRIBUTE_UNUSED
+nvptx_mach_max_workers ()
+{
+ if (!cfun->machine->axis_dim_init_p)
+ init_axis_dim ();
+ return cfun->machine->axis_dim[MACH_MAX_WORKERS];
+}
+
+static int ATTRIBUTE_UNUSED
+nvptx_mach_vector_length ()
+{
+ if (!cfun->machine->axis_dim_init_p)
+ init_axis_dim ();
+ return cfun->machine->axis_dim[MACH_VECTOR_LENGTH];
+}
+
/* Loop structure of the function. The entire function is described as
a NULL loop. */
int return_mode; /* Return mode of current fn.
(machine_mode not defined yet.) */
rtx axis_predicate[2]; /* Neutering predicates. */
+ int axis_dim[2]; /* Maximum number of threads on each axis, dim[0] is
+ vector_length, dim[1] is num_workers. */
+ bool axis_dim_init_p;
rtx unisimt_master; /* 'Master lane index' for -muniform-simt. */
rtx unisimt_predicate; /* Predicate for -muniform-simt. */
rtx unisimt_location; /* Mask location for -muniform-simt. */