summaryrefslogtreecommitdiff
path: root/gcc/brig/brigfrontend/brig-control-handler.cc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/brig/brigfrontend/brig-control-handler.cc')
-rw-r--r--gcc/brig/brigfrontend/brig-control-handler.cc108
1 files changed, 108 insertions, 0 deletions
diff --git a/gcc/brig/brigfrontend/brig-control-handler.cc b/gcc/brig/brigfrontend/brig-control-handler.cc
new file mode 100644
index 00000000000..2e4f5e36a77
--- /dev/null
+++ b/gcc/brig/brigfrontend/brig-control-handler.cc
@@ -0,0 +1,108 @@
+/* brig-control-handler.cc -- brig control directive handling
+ Copyright (C) 2016 Free Software Foundation, Inc.
+ Contributed by Pekka Jaaskelainen <pekka.jaaskelainen@parmance.com>
+ for General Processor Tech.
+
+This file is part of GCC.
+
+GCC is free software; you can redistribute it and/or modify it under
+the terms of the GNU General Public License as published by the Free
+Software Foundation; either version 3, or (at your option) any later
+version.
+
+GCC is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with GCC; see the file COPYING3. If not see
+<http://www.gnu.org/licenses/>. */
+
+#include "brig-code-entry-handler.h"
+#include "diagnostic.h"
+#include "print-tree.h"
+
+size_t
+brig_directive_control_handler::operator () (const BrigBase *base)
+{
+ const BrigDirectiveControl *inst = (const BrigDirectiveControl *) base;
+ const BrigData *operand_entries
+ = m_parent.get_brig_data_entry (inst->operands);
+
+ /* Parse the constant integer operands. */
+ std::vector<tree> operands;
+ for (size_t i = 0; i < operand_entries->byteCount / 4; ++i)
+ {
+ uint32_t operand_offset
+ = ((const uint32_t *) &operand_entries->bytes)[i];
+ const BrigBase *operand_data
+ = m_parent.get_brig_operand_entry (operand_offset);
+
+ tree operand_type
+ = (inst->control == BRIG_CONTROL_REQUIREDGRIDSIZE
+ || inst->control == BRIG_CONTROL_MAXFLATGRIDSIZE) ?
+ uint64_type_node : uint32_type_node;
+ operands.push_back
+ (build_tree_operand (*(const BrigInstBase*)inst, *operand_data,
+ operand_type));
+ }
+
+ switch (inst->control)
+ {
+ case BRIG_CONTROL_MAXDYNAMICGROUPSIZE:
+ {
+ m_parent.m_cf->m_descriptor.max_dynamic_group_size
+ = int_constant_value (operands.at (0));
+ break;
+ }
+ case BRIG_CONTROL_MAXFLATGRIDSIZE:
+ {
+ m_parent.m_cf->m_descriptor.max_flat_grid_size
+ = int_constant_value (operands.at (0));
+ break;
+ }
+ case BRIG_CONTROL_MAXFLATWORKGROUPSIZE:
+ {
+ m_parent.m_cf->m_descriptor.max_flat_workgroup_size
+ = int_constant_value (operands.at (0));
+ break;
+ }
+ case BRIG_CONTROL_REQUIREDDIM:
+ {
+ m_parent.m_cf->m_descriptor.required_dim
+ = int_constant_value (operands.at (0));
+ break;
+ }
+ case BRIG_CONTROL_REQUIREDGRIDSIZE:
+ {
+ m_parent.m_cf->m_descriptor.required_grid_size[0]
+ = int_constant_value (operands.at (0));
+ m_parent.m_cf->m_descriptor.required_grid_size[1]
+ = int_constant_value (operands.at (1));
+ m_parent.m_cf->m_descriptor.required_grid_size[2]
+ = int_constant_value (operands.at (2));
+ break;
+ }
+ case BRIG_CONTROL_REQUIREDWORKGROUPSIZE:
+ {
+ m_parent.m_cf->m_descriptor.required_workgroup_size[0]
+ = int_constant_value (operands.at (0));
+ m_parent.m_cf->m_descriptor.required_workgroup_size[1]
+ = int_constant_value (operands.at (1));
+ m_parent.m_cf->m_descriptor.required_workgroup_size[2]
+ = int_constant_value (operands.at (2));
+ break;
+ }
+ case BRIG_CONTROL_REQUIRENOPARTIALWORKGROUPS:
+ /* Performance hint only, ignored for now. */
+ break;
+ case BRIG_CONTROL_ENABLEBREAKEXCEPTIONS:
+ case BRIG_CONTROL_ENABLEDETECTEXCEPTIONS:
+ /* Unimplemented. */
+ break;
+ default:
+ sorry ("Unsupported control directive %x.\n", inst->control);
+ }
+ return base->byteCount;
+}