1*61046927SAndroid Build Coastguard Workertemplate = """/* 2*61046927SAndroid Build Coastguard Worker * Copyright 2021 Alyssa Rosenzweig 3*61046927SAndroid Build Coastguard Worker * SPDX-License-Identifier: MIT 4*61046927SAndroid Build Coastguard Worker */ 5*61046927SAndroid Build Coastguard Worker 6*61046927SAndroid Build Coastguard Worker#ifndef _AGX_OPCODES_ 7*61046927SAndroid Build Coastguard Worker#define _AGX_OPCODES_ 8*61046927SAndroid Build Coastguard Worker 9*61046927SAndroid Build Coastguard Worker#include <stdbool.h> 10*61046927SAndroid Build Coastguard Worker#include <stdint.h> 11*61046927SAndroid Build Coastguard Worker#include "util/macros.h" 12*61046927SAndroid Build Coastguard Worker 13*61046927SAndroid Build Coastguard Workerenum agx_schedule_class { 14*61046927SAndroid Build Coastguard Worker AGX_SCHEDULE_CLASS_INVALID, 15*61046927SAndroid Build Coastguard Worker AGX_SCHEDULE_CLASS_NONE, 16*61046927SAndroid Build Coastguard Worker AGX_SCHEDULE_CLASS_LOAD, 17*61046927SAndroid Build Coastguard Worker AGX_SCHEDULE_CLASS_STORE, 18*61046927SAndroid Build Coastguard Worker AGX_SCHEDULE_CLASS_ATOMIC, 19*61046927SAndroid Build Coastguard Worker AGX_SCHEDULE_CLASS_COVERAGE, 20*61046927SAndroid Build Coastguard Worker AGX_SCHEDULE_CLASS_PRELOAD, 21*61046927SAndroid Build Coastguard Worker AGX_SCHEDULE_CLASS_BARRIER, 22*61046927SAndroid Build Coastguard Worker}; 23*61046927SAndroid Build Coastguard Worker 24*61046927SAndroid Build Coastguard Worker/* Listing of opcodes */ 25*61046927SAndroid Build Coastguard Worker 26*61046927SAndroid Build Coastguard Workerenum agx_opcode { 27*61046927SAndroid Build Coastguard Worker% for op in opcodes: 28*61046927SAndroid Build Coastguard Worker AGX_OPCODE_${op.upper()}, 29*61046927SAndroid Build Coastguard Worker% endfor 30*61046927SAndroid Build Coastguard Worker AGX_NUM_OPCODES 31*61046927SAndroid Build Coastguard Worker}; 32*61046927SAndroid Build Coastguard Worker 33*61046927SAndroid Build Coastguard Worker% for name in enums: 34*61046927SAndroid Build Coastguard Workerenum agx_${name} { 35*61046927SAndroid Build Coastguard Worker% for k, v in enums[name].items(): 36*61046927SAndroid Build Coastguard Worker AGX_${name.upper()}_${v.replace('.', '_').upper()} = ${k}, 37*61046927SAndroid Build Coastguard Worker% endfor 38*61046927SAndroid Build Coastguard Worker}; 39*61046927SAndroid Build Coastguard Worker 40*61046927SAndroid Build Coastguard Workerstatic inline const char * 41*61046927SAndroid Build Coastguard Workeragx_${name}_as_str(enum agx_${name} x) 42*61046927SAndroid Build Coastguard Worker{ 43*61046927SAndroid Build Coastguard Worker switch (x) { 44*61046927SAndroid Build Coastguard Worker% for k, v in enums[name].items(): 45*61046927SAndroid Build Coastguard Worker case AGX_${name.upper()}_${v.replace('.', '_').upper()}: return "${v}"; 46*61046927SAndroid Build Coastguard Worker% endfor 47*61046927SAndroid Build Coastguard Worker default: unreachable("Nonexhaustive enum"); 48*61046927SAndroid Build Coastguard Worker } 49*61046927SAndroid Build Coastguard Worker} 50*61046927SAndroid Build Coastguard Worker 51*61046927SAndroid Build Coastguard Worker% endfor 52*61046927SAndroid Build Coastguard Worker 53*61046927SAndroid Build Coastguard Worker/* Runtime accessible info on each defined opcode */ 54*61046927SAndroid Build Coastguard Worker 55*61046927SAndroid Build Coastguard Worker<% assert(len(immediates) < 32); %> 56*61046927SAndroid Build Coastguard Worker 57*61046927SAndroid Build Coastguard Workerenum agx_immediate { 58*61046927SAndroid Build Coastguard Worker% for i, imm in enumerate(immediates): 59*61046927SAndroid Build Coastguard Worker AGX_IMMEDIATE_${imm.upper()} = (1 << ${i}), 60*61046927SAndroid Build Coastguard Worker% endfor 61*61046927SAndroid Build Coastguard Worker}; 62*61046927SAndroid Build Coastguard Worker 63*61046927SAndroid Build Coastguard Workerstruct agx_encoding { 64*61046927SAndroid Build Coastguard Worker uint64_t exact; 65*61046927SAndroid Build Coastguard Worker unsigned length_short : 4; 66*61046927SAndroid Build Coastguard Worker bool extensible : 1; 67*61046927SAndroid Build Coastguard Worker}; 68*61046927SAndroid Build Coastguard Worker 69*61046927SAndroid Build Coastguard Workerstruct agx_opcode_info { 70*61046927SAndroid Build Coastguard Worker const char *name; 71*61046927SAndroid Build Coastguard Worker unsigned nr_srcs; 72*61046927SAndroid Build Coastguard Worker unsigned nr_dests; 73*61046927SAndroid Build Coastguard Worker enum agx_immediate immediates; 74*61046927SAndroid Build Coastguard Worker struct agx_encoding encoding; 75*61046927SAndroid Build Coastguard Worker struct agx_encoding encoding_16; 76*61046927SAndroid Build Coastguard Worker enum agx_schedule_class schedule_class; 77*61046927SAndroid Build Coastguard Worker bool is_float : 1; 78*61046927SAndroid Build Coastguard Worker bool can_eliminate : 1; 79*61046927SAndroid Build Coastguard Worker bool can_reorder : 1; 80*61046927SAndroid Build Coastguard Worker}; 81*61046927SAndroid Build Coastguard Worker 82*61046927SAndroid Build Coastguard Workerextern const struct agx_opcode_info agx_opcodes_info[AGX_NUM_OPCODES]; 83*61046927SAndroid Build Coastguard Worker 84*61046927SAndroid Build Coastguard Worker#endif 85*61046927SAndroid Build Coastguard Worker""" 86*61046927SAndroid Build Coastguard Worker 87*61046927SAndroid Build Coastguard Workerfrom mako.template import Template 88*61046927SAndroid Build Coastguard Workerfrom agx_opcodes import opcodes, immediates, enums 89*61046927SAndroid Build Coastguard Worker 90*61046927SAndroid Build Coastguard Workerprint(Template(template).render(opcodes=opcodes, immediates=immediates, 91*61046927SAndroid Build Coastguard Worker enums=enums)) 92