17ec681f3Smrg
27ec681f3Smrgtemplate = """\
37ec681f3Smrg/*
47ec681f3Smrg * Copyright (c) 2018 Valve Corporation
57ec681f3Smrg *
67ec681f3Smrg * Permission is hereby granted, free of charge, to any person obtaining a
77ec681f3Smrg * copy of this software and associated documentation files (the "Software"),
87ec681f3Smrg * to deal in the Software without restriction, including without limitation
97ec681f3Smrg * the rights to use, copy, modify, merge, publish, distribute, sublicense,
107ec681f3Smrg * and/or sell copies of the Software, and to permit persons to whom the
117ec681f3Smrg * Software is furnished to do so, subject to the following conditions:
127ec681f3Smrg *
137ec681f3Smrg * The above copyright notice and this permission notice (including the next
147ec681f3Smrg * paragraph) shall be included in all copies or substantial portions of the
157ec681f3Smrg * Software.
167ec681f3Smrg *
177ec681f3Smrg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
187ec681f3Smrg * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
197ec681f3Smrg * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
207ec681f3Smrg * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
217ec681f3Smrg * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
227ec681f3Smrg * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
237ec681f3Smrg * IN THE SOFTWARE.
247ec681f3Smrg *
257ec681f3Smrg * This file was generated by aco_opcodes_cpp.py
267ec681f3Smrg */
277ec681f3Smrg
287ec681f3Smrg#include "aco_ir.h"
297ec681f3Smrg
307ec681f3Smrgnamespace aco {
317ec681f3Smrg
327ec681f3Smrg<%
337ec681f3Smrgopcode_names = sorted(opcodes.keys())
347ec681f3Smrgcan_use_input_modifiers = "".join([opcodes[name].input_mod for name in reversed(opcode_names)])
357ec681f3Smrgcan_use_output_modifiers = "".join([opcodes[name].output_mod for name in reversed(opcode_names)])
367ec681f3Smrgis_atomic = "".join([opcodes[name].is_atomic for name in reversed(opcode_names)])
377ec681f3Smrg%>
387ec681f3Smrg
397ec681f3Smrgextern const aco::Info instr_info = {
407ec681f3Smrg   .opcode_gfx7 = {
417ec681f3Smrg      % for name in opcode_names:
427ec681f3Smrg      ${opcodes[name].opcode_gfx7},
437ec681f3Smrg      % endfor
447ec681f3Smrg   },
457ec681f3Smrg   .opcode_gfx9 = {
467ec681f3Smrg      % for name in opcode_names:
477ec681f3Smrg      ${opcodes[name].opcode_gfx9},
487ec681f3Smrg      % endfor
497ec681f3Smrg   },
507ec681f3Smrg   .opcode_gfx10 = {
517ec681f3Smrg      % for name in opcode_names:
527ec681f3Smrg      ${opcodes[name].opcode_gfx10},
537ec681f3Smrg      % endfor
547ec681f3Smrg   },
557ec681f3Smrg   .can_use_input_modifiers = std::bitset<${len(opcode_names)}>("${can_use_input_modifiers}"),
567ec681f3Smrg   .can_use_output_modifiers = std::bitset<${len(opcode_names)}>("${can_use_output_modifiers}"),
577ec681f3Smrg   .is_atomic = std::bitset<${len(opcode_names)}>("${is_atomic}"),
587ec681f3Smrg   .name = {
597ec681f3Smrg      % for name in opcode_names:
607ec681f3Smrg      "${name}",
617ec681f3Smrg      % endfor
627ec681f3Smrg   },
637ec681f3Smrg   .format = {
647ec681f3Smrg      % for name in opcode_names:
657ec681f3Smrg      aco::Format::${str(opcodes[name].format.name)},
667ec681f3Smrg      % endfor
677ec681f3Smrg   },
687ec681f3Smrg   .operand_size = {
697ec681f3Smrg      % for name in opcode_names:
707ec681f3Smrg      ${opcodes[name].operand_size},
717ec681f3Smrg      % endfor
727ec681f3Smrg   },
737ec681f3Smrg   .classes = {
747ec681f3Smrg      % for name in opcode_names:
757ec681f3Smrg      (instr_class)${opcodes[name].cls.value},
767ec681f3Smrg      % endfor
777ec681f3Smrg   },
787ec681f3Smrg};
797ec681f3Smrg
807ec681f3Smrg}
817ec681f3Smrg"""
827ec681f3Smrg
837ec681f3Smrgfrom aco_opcodes import opcodes
847ec681f3Smrgfrom mako.template import Template
857ec681f3Smrg
867ec681f3Smrgprint(Template(template).render(opcodes=opcodes))
87