1*61046927SAndroid Build Coastguard Worker# Copyright (C) 2020 Collabora, Ltd. 2*61046927SAndroid Build Coastguard Worker# 3*61046927SAndroid Build Coastguard Worker# Permission is hereby granted, free of charge, to any person obtaining a 4*61046927SAndroid Build Coastguard Worker# copy of this software and associated documentation files (the "Software"), 5*61046927SAndroid Build Coastguard Worker# to deal in the Software without restriction, including without limitation 6*61046927SAndroid Build Coastguard Worker# the rights to use, copy, modify, merge, publish, distribute, sublicense, 7*61046927SAndroid Build Coastguard Worker# and/or sell copies of the Software, and to permit persons to whom the 8*61046927SAndroid Build Coastguard Worker# Software is furnished to do so, subject to the following conditions: 9*61046927SAndroid Build Coastguard Worker# 10*61046927SAndroid Build Coastguard Worker# The above copyright notice and this permission notice (including the next 11*61046927SAndroid Build Coastguard Worker# paragraph) shall be included in all copies or substantial portions of the 12*61046927SAndroid Build Coastguard Worker# Software. 13*61046927SAndroid Build Coastguard Worker# 14*61046927SAndroid Build Coastguard Worker# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15*61046927SAndroid Build Coastguard Worker# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16*61046927SAndroid Build Coastguard Worker# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 17*61046927SAndroid Build Coastguard Worker# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 18*61046927SAndroid Build Coastguard Worker# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 19*61046927SAndroid Build Coastguard Worker# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 20*61046927SAndroid Build Coastguard Worker# IN THE SOFTWARE. 21*61046927SAndroid Build Coastguard Worker 22*61046927SAndroid Build Coastguard WorkerTEMPLATE = """ 23*61046927SAndroid Build Coastguard Worker#ifndef _BI_OPCODES_H_ 24*61046927SAndroid Build Coastguard Worker#define _BI_OPCODES_H_ 25*61046927SAndroid Build Coastguard Worker 26*61046927SAndroid Build Coastguard Worker#include "bifrost.h" 27*61046927SAndroid Build Coastguard Worker 28*61046927SAndroid Build Coastguard Worker% for mod in sorted(modifiers): 29*61046927SAndroid Build Coastguard Worker% if len(modifiers[mod]) > 2: # otherwise just boolean 30*61046927SAndroid Build Coastguard Workerenum bi_${mod.lower()} { 31*61046927SAndroid Build Coastguard Worker% for i, state in enumerate(modifiers[mod]): 32*61046927SAndroid Build Coastguard Worker% if state != "reserved": 33*61046927SAndroid Build Coastguard Worker BI_${mod.upper()}_${state.upper()} = ${i}, 34*61046927SAndroid Build Coastguard Worker% endif 35*61046927SAndroid Build Coastguard Worker% endfor 36*61046927SAndroid Build Coastguard Worker}; 37*61046927SAndroid Build Coastguard Worker 38*61046927SAndroid Build Coastguard Worker% endif 39*61046927SAndroid Build Coastguard Worker% endfor 40*61046927SAndroid Build Coastguard Workerenum bi_opcode { 41*61046927SAndroid Build Coastguard Worker% for opcode in sorted(mnemonics): 42*61046927SAndroid Build Coastguard Worker BI_OPCODE_${opcode.replace('.', '_').upper()}, 43*61046927SAndroid Build Coastguard Worker% endfor 44*61046927SAndroid Build Coastguard Worker BI_NUM_OPCODES 45*61046927SAndroid Build Coastguard Worker}; 46*61046927SAndroid Build Coastguard Worker 47*61046927SAndroid Build Coastguard Worker/* Number of staging registers accessed, note this fits into 3-bits */ 48*61046927SAndroid Build Coastguard Worker 49*61046927SAndroid Build Coastguard Workerenum bi_sr_count { 50*61046927SAndroid Build Coastguard Worker /* fixed counts */ 51*61046927SAndroid Build Coastguard Worker BI_SR_COUNT_0 = 0, 52*61046927SAndroid Build Coastguard Worker BI_SR_COUNT_1 = 1, 53*61046927SAndroid Build Coastguard Worker BI_SR_COUNT_2 = 2, 54*61046927SAndroid Build Coastguard Worker BI_SR_COUNT_3 = 3, 55*61046927SAndroid Build Coastguard Worker BI_SR_COUNT_4 = 4, 56*61046927SAndroid Build Coastguard Worker 57*61046927SAndroid Build Coastguard Worker /* derived from register_format and vecsize */ 58*61046927SAndroid Build Coastguard Worker BI_SR_COUNT_FORMAT = 5, 59*61046927SAndroid Build Coastguard Worker 60*61046927SAndroid Build Coastguard Worker /* equal to vecsize alone */ 61*61046927SAndroid Build Coastguard Worker BI_SR_COUNT_VECSIZE = 6, 62*61046927SAndroid Build Coastguard Worker 63*61046927SAndroid Build Coastguard Worker /* specified directly as the sr_count immediate */ 64*61046927SAndroid Build Coastguard Worker BI_SR_COUNT_SR_COUNT = 7 65*61046927SAndroid Build Coastguard Worker}; 66*61046927SAndroid Build Coastguard Worker 67*61046927SAndroid Build Coastguard Workerenum bi_size { 68*61046927SAndroid Build Coastguard Worker BI_SIZE_8 = 0, 69*61046927SAndroid Build Coastguard Worker BI_SIZE_16, 70*61046927SAndroid Build Coastguard Worker BI_SIZE_24, 71*61046927SAndroid Build Coastguard Worker BI_SIZE_32, 72*61046927SAndroid Build Coastguard Worker BI_SIZE_48, 73*61046927SAndroid Build Coastguard Worker BI_SIZE_64, 74*61046927SAndroid Build Coastguard Worker BI_SIZE_96, 75*61046927SAndroid Build Coastguard Worker BI_SIZE_128, 76*61046927SAndroid Build Coastguard Worker}; 77*61046927SAndroid Build Coastguard Worker 78*61046927SAndroid Build Coastguard Worker/* Description of an opcode in the IR */ 79*61046927SAndroid Build Coastguard Workerstruct bi_op_props { 80*61046927SAndroid Build Coastguard Worker const char *name; 81*61046927SAndroid Build Coastguard Worker 82*61046927SAndroid Build Coastguard Worker enum bifrost_message_type message : 4; 83*61046927SAndroid Build Coastguard Worker enum bi_size size : 3; 84*61046927SAndroid Build Coastguard Worker enum bi_sr_count sr_count : 3; 85*61046927SAndroid Build Coastguard Worker bool sr_read : 1; 86*61046927SAndroid Build Coastguard Worker bool sr_write : 1; 87*61046927SAndroid Build Coastguard Worker bool last : 1; 88*61046927SAndroid Build Coastguard Worker bool branch : 1; 89*61046927SAndroid Build Coastguard Worker bool table : 1; 90*61046927SAndroid Build Coastguard Worker bool fma : 1; 91*61046927SAndroid Build Coastguard Worker bool add : 1; 92*61046927SAndroid Build Coastguard Worker 93*61046927SAndroid Build Coastguard Worker /* Supported propagable modifiers */ 94*61046927SAndroid Build Coastguard Worker bool clamp : 1; 95*61046927SAndroid Build Coastguard Worker bool not_result : 1; 96*61046927SAndroid Build Coastguard Worker unsigned abs : 3; 97*61046927SAndroid Build Coastguard Worker unsigned neg : 3; 98*61046927SAndroid Build Coastguard Worker bool not_mod : 1; 99*61046927SAndroid Build Coastguard Worker}; 100*61046927SAndroid Build Coastguard Worker 101*61046927SAndroid Build Coastguard Worker/* Generated in bi_opcodes.c.py */ 102*61046927SAndroid Build Coastguard Workerextern struct bi_op_props bi_opcode_props[BI_NUM_OPCODES]; 103*61046927SAndroid Build Coastguard Worker 104*61046927SAndroid Build Coastguard Worker#endif 105*61046927SAndroid Build Coastguard Worker""" 106*61046927SAndroid Build Coastguard Worker 107*61046927SAndroid Build Coastguard Workerimport sys 108*61046927SAndroid Build Coastguard Workerfrom bifrost_isa import * 109*61046927SAndroid Build Coastguard Workerfrom mako.template import Template 110*61046927SAndroid Build Coastguard Worker 111*61046927SAndroid Build Coastguard Workerinstructions = {} 112*61046927SAndroid Build Coastguard Workerfor arg in sys.argv[1:]: 113*61046927SAndroid Build Coastguard Worker new_instructions = parse_instructions(arg, include_pseudo = True) 114*61046927SAndroid Build Coastguard Worker instructions.update(new_instructions) 115*61046927SAndroid Build Coastguard Worker 116*61046927SAndroid Build Coastguard Workerir_instructions = partition_mnemonics(instructions) 117*61046927SAndroid Build Coastguard Workermodifier_lists = order_modifiers(ir_instructions) 118*61046927SAndroid Build Coastguard Worker 119*61046927SAndroid Build Coastguard Worker# Generate sorted list of mnemonics without regard to unit 120*61046927SAndroid Build Coastguard Workermnemonics = set(x[1:] for x in instructions.keys()) 121*61046927SAndroid Build Coastguard Worker 122*61046927SAndroid Build Coastguard Workerprint(Template(COPYRIGHT + TEMPLATE).render(mnemonics = mnemonics, modifiers = modifier_lists)) 123