1*61046927SAndroid Build Coastguard Worker#encoding=utf-8 2*61046927SAndroid Build Coastguard Worker 3*61046927SAndroid Build Coastguard Worker# Copyright (C) 2021 Collabora, Ltd. 4*61046927SAndroid Build Coastguard Worker# 5*61046927SAndroid Build Coastguard Worker# Permission is hereby granted, free of charge, to any person obtaining a 6*61046927SAndroid Build Coastguard Worker# copy of this software and associated documentation files (the "Software"), 7*61046927SAndroid Build Coastguard Worker# to deal in the Software without restriction, including without limitation 8*61046927SAndroid Build Coastguard Worker# the rights to use, copy, modify, merge, publish, distribute, sublicense, 9*61046927SAndroid Build Coastguard Worker# and/or sell copies of the Software, and to permit persons to whom the 10*61046927SAndroid Build Coastguard Worker# Software is furnished to do so, subject to the following conditions: 11*61046927SAndroid Build Coastguard Worker# 12*61046927SAndroid Build Coastguard Worker# The above copyright notice and this permission notice (including the next 13*61046927SAndroid Build Coastguard Worker# paragraph) shall be included in all copies or substantial portions of the 14*61046927SAndroid Build Coastguard Worker# Software. 15*61046927SAndroid Build Coastguard Worker# 16*61046927SAndroid Build Coastguard Worker# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17*61046927SAndroid Build Coastguard Worker# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18*61046927SAndroid Build Coastguard Worker# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 19*61046927SAndroid Build Coastguard Worker# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20*61046927SAndroid Build Coastguard Worker# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 21*61046927SAndroid Build Coastguard Worker# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 22*61046927SAndroid Build Coastguard Worker# IN THE SOFTWARE. 23*61046927SAndroid Build Coastguard Worker 24*61046927SAndroid Build Coastguard Workerimport sys 25*61046927SAndroid Build Coastguard Workerfrom valhall import valhall_parse_isa 26*61046927SAndroid Build Coastguard Workerfrom mako.template import Template 27*61046927SAndroid Build Coastguard Workerfrom mako import exceptions 28*61046927SAndroid Build Coastguard Worker 29*61046927SAndroid Build Coastguard Worker(instructions, immediates, enums, typesize, safe_name) = valhall_parse_isa() 30*61046927SAndroid Build Coastguard Worker 31*61046927SAndroid Build Coastguard WorkerSKIP = set([ 32*61046927SAndroid Build Coastguard Worker # Extra conversions 33*61046927SAndroid Build Coastguard Worker "S8_TO_S16", 34*61046927SAndroid Build Coastguard Worker "S8_TO_F16", 35*61046927SAndroid Build Coastguard Worker "U8_TO_U16", 36*61046927SAndroid Build Coastguard Worker "U8_TO_F16", 37*61046927SAndroid Build Coastguard Worker 38*61046927SAndroid Build Coastguard Worker # Saturating multiplies 39*61046927SAndroid Build Coastguard Worker "IMUL.s32", 40*61046927SAndroid Build Coastguard Worker "IMUL.v2s16", 41*61046927SAndroid Build Coastguard Worker "IMUL.v4s8", 42*61046927SAndroid Build Coastguard Worker 43*61046927SAndroid Build Coastguard Worker # 64-bit support 44*61046927SAndroid Build Coastguard Worker "IADD.u64", 45*61046927SAndroid Build Coastguard Worker "IADD.s64", 46*61046927SAndroid Build Coastguard Worker "ISUB.u64", 47*61046927SAndroid Build Coastguard Worker "ISUB.s64", 48*61046927SAndroid Build Coastguard Worker "IMULD.u64", 49*61046927SAndroid Build Coastguard Worker "SHADDX.u64", 50*61046927SAndroid Build Coastguard Worker "SHADDX.s64", 51*61046927SAndroid Build Coastguard Worker "IMULD.u64", 52*61046927SAndroid Build Coastguard Worker "CLPER.s64", 53*61046927SAndroid Build Coastguard Worker "CLPER.u64", 54*61046927SAndroid Build Coastguard Worker "LSHIFT_AND.i64", 55*61046927SAndroid Build Coastguard Worker "RSHIFT_AND.i64", 56*61046927SAndroid Build Coastguard Worker "LSHIFT_OR.i64", 57*61046927SAndroid Build Coastguard Worker "RSHIFT_OR.i64", 58*61046927SAndroid Build Coastguard Worker "LSHIFT_XOR.i64", 59*61046927SAndroid Build Coastguard Worker "RSHIFT_XOR.i64", 60*61046927SAndroid Build Coastguard Worker "ATOM.i64", 61*61046927SAndroid Build Coastguard Worker "ATOM_RETURN.i64", 62*61046927SAndroid Build Coastguard Worker "ATOM1_RETURN.i64", 63*61046927SAndroid Build Coastguard Worker 64*61046927SAndroid Build Coastguard Worker # CLPER widens 65*61046927SAndroid Build Coastguard Worker "CLPER.s32", 66*61046927SAndroid Build Coastguard Worker "CLPER.v2s16", 67*61046927SAndroid Build Coastguard Worker "CLPER.v4s8", 68*61046927SAndroid Build Coastguard Worker "CLPER.v2u16", 69*61046927SAndroid Build Coastguard Worker "CLPER.v4u8", 70*61046927SAndroid Build Coastguard Worker 71*61046927SAndroid Build Coastguard Worker # VAR_TEX 72*61046927SAndroid Build Coastguard Worker "VAR_TEX_SINGLE", 73*61046927SAndroid Build Coastguard Worker "VAR_TEX_GATHER", 74*61046927SAndroid Build Coastguard Worker "VAR_TEX_GRADIENT", 75*61046927SAndroid Build Coastguard Worker "VAR_TEX_DUAL", 76*61046927SAndroid Build Coastguard Worker "VAR_TEX_BUF_SINGLE", 77*61046927SAndroid Build Coastguard Worker "VAR_TEX_BUF_GATHER", 78*61046927SAndroid Build Coastguard Worker "VAR_TEX_BUF_GRADIENT", 79*61046927SAndroid Build Coastguard Worker "VAR_TEX_BUF_DUAL", 80*61046927SAndroid Build Coastguard Worker 81*61046927SAndroid Build Coastguard Worker # Special cased 82*61046927SAndroid Build Coastguard Worker "FMA_RSCALE_N.f32", 83*61046927SAndroid Build Coastguard Worker "FMA_RSCALE_LEFT.f32", 84*61046927SAndroid Build Coastguard Worker "FMA_RSCALE_SCALE16.f32", 85*61046927SAndroid Build Coastguard Worker 86*61046927SAndroid Build Coastguard Worker # Deprecated instruction 87*61046927SAndroid Build Coastguard Worker "NOT_OLD.i32", 88*61046927SAndroid Build Coastguard Worker "NOT_OLD.i64", 89*61046927SAndroid Build Coastguard Worker 90*61046927SAndroid Build Coastguard Worker # TODO 91*61046927SAndroid Build Coastguard Worker "IDP.v4s8", 92*61046927SAndroid Build Coastguard Worker "IDP.v4u8", 93*61046927SAndroid Build Coastguard Worker "FATAN_ASSIST.f32", 94*61046927SAndroid Build Coastguard Worker "SEG_ADD.u64", 95*61046927SAndroid Build Coastguard Worker "TEX_DUAL", 96*61046927SAndroid Build Coastguard Worker ]) 97*61046927SAndroid Build Coastguard Worker 98*61046927SAndroid Build Coastguard Workertemplate = """ 99*61046927SAndroid Build Coastguard Worker#include "valhall.h" 100*61046927SAndroid Build Coastguard Worker#include "bi_opcodes.h" 101*61046927SAndroid Build Coastguard Worker 102*61046927SAndroid Build Coastguard Workerconst uint32_t valhall_immediates[32] = { 103*61046927SAndroid Build Coastguard Worker% for imm in immediates: 104*61046927SAndroid Build Coastguard Worker ${hex(imm)}, 105*61046927SAndroid Build Coastguard Worker% endfor 106*61046927SAndroid Build Coastguard Worker}; 107*61046927SAndroid Build Coastguard Worker 108*61046927SAndroid Build Coastguard Worker<% 109*61046927SAndroid Build Coastguard Workerdef ibool(x): 110*61046927SAndroid Build Coastguard Worker return '1' if x else '0' 111*61046927SAndroid Build Coastguard Worker 112*61046927SAndroid Build Coastguard Workerdef hasmod(x, mod): 113*61046927SAndroid Build Coastguard Worker return ibool(any([x.name == mod for x in op.modifiers])) 114*61046927SAndroid Build Coastguard Worker 115*61046927SAndroid Build Coastguard Worker%> 116*61046927SAndroid Build Coastguard Workerconst struct va_opcode_info 117*61046927SAndroid Build Coastguard Workervalhall_opcodes[BI_NUM_OPCODES] = { 118*61046927SAndroid Build Coastguard Worker% for op in instructions: 119*61046927SAndroid Build Coastguard Worker% if op.name not in skip: 120*61046927SAndroid Build Coastguard Worker<% 121*61046927SAndroid Build Coastguard Worker name = op.name 122*61046927SAndroid Build Coastguard Worker if name == 'BRANCHZ': 123*61046927SAndroid Build Coastguard Worker name = 'BRANCHZ.i16' 124*61046927SAndroid Build Coastguard Worker 125*61046927SAndroid Build Coastguard Worker sr_control = 0 126*61046927SAndroid Build Coastguard Worker 127*61046927SAndroid Build Coastguard Worker if len(op.staging) > 0: 128*61046927SAndroid Build Coastguard Worker sr_control = op.staging[0].encoded_flags >> 6 129*61046927SAndroid Build Coastguard Worker%> 130*61046927SAndroid Build Coastguard Worker [BI_OPCODE_${name.replace('.', '_').upper()}] = { 131*61046927SAndroid Build Coastguard Worker .exact = ${hex(exact(op))}ULL, 132*61046927SAndroid Build Coastguard Worker .srcs = { 133*61046927SAndroid Build Coastguard Worker% for src in ([sr for sr in op.staging if sr.read] + op.srcs): 134*61046927SAndroid Build Coastguard Worker { 135*61046927SAndroid Build Coastguard Worker .absneg = ${ibool(src.absneg)}, 136*61046927SAndroid Build Coastguard Worker .swizzle = ${ibool(src.swizzle)}, 137*61046927SAndroid Build Coastguard Worker .notted = ${ibool(src.notted)}, 138*61046927SAndroid Build Coastguard Worker .widen = ${ibool(src.widen)}, 139*61046927SAndroid Build Coastguard Worker .lanes = ${ibool(src.lanes)}, 140*61046927SAndroid Build Coastguard Worker .halfswizzle = ${ibool(src.halfswizzle)}, 141*61046927SAndroid Build Coastguard Worker .lane = ${ibool(src.lane)}, 142*61046927SAndroid Build Coastguard Worker .combine = ${ibool(src.combine)}, 143*61046927SAndroid Build Coastguard Worker% if src.size in [8, 16, 32, 64]: 144*61046927SAndroid Build Coastguard Worker .size = VA_SIZE_${src.size}, 145*61046927SAndroid Build Coastguard Worker% endif 146*61046927SAndroid Build Coastguard Worker }, 147*61046927SAndroid Build Coastguard Worker% endfor 148*61046927SAndroid Build Coastguard Worker }, 149*61046927SAndroid Build Coastguard Worker .type_size = ${typesize(op.name)}, 150*61046927SAndroid Build Coastguard Worker .has_dest = ${ibool(len(op.dests) > 0)}, 151*61046927SAndroid Build Coastguard Worker .is_signed = ${ibool(op.is_signed)}, 152*61046927SAndroid Build Coastguard Worker .unit = VA_UNIT_${op.unit}, 153*61046927SAndroid Build Coastguard Worker .nr_srcs = ${len(op.srcs)}, 154*61046927SAndroid Build Coastguard Worker .nr_staging_srcs = ${sum([sr.read for sr in op.staging])}, 155*61046927SAndroid Build Coastguard Worker .nr_staging_dests = ${sum([sr.write for sr in op.staging])}, 156*61046927SAndroid Build Coastguard Worker .clamp = ${hasmod(x, 'clamp')}, 157*61046927SAndroid Build Coastguard Worker .saturate = ${hasmod(x, 'saturate')}, 158*61046927SAndroid Build Coastguard Worker .rhadd = ${hasmod(x, 'rhadd')}, 159*61046927SAndroid Build Coastguard Worker .round_mode = ${hasmod(x, 'round_mode')}, 160*61046927SAndroid Build Coastguard Worker .condition = ${hasmod(x, 'condition')}, 161*61046927SAndroid Build Coastguard Worker .result_type = ${hasmod(x, 'result_type')}, 162*61046927SAndroid Build Coastguard Worker .vecsize = ${hasmod(x, 'vector_size')}, 163*61046927SAndroid Build Coastguard Worker .register_format = ${hasmod(x, 'register_format')}, 164*61046927SAndroid Build Coastguard Worker .slot = ${hasmod(x, 'slot')}, 165*61046927SAndroid Build Coastguard Worker .sr_count = ${hasmod(x, 'staging_register_count')}, 166*61046927SAndroid Build Coastguard Worker .sr_write_count = ${hasmod(x, 'staging_register_write_count')}, 167*61046927SAndroid Build Coastguard Worker .sr_control = ${sr_control}, 168*61046927SAndroid Build Coastguard Worker }, 169*61046927SAndroid Build Coastguard Worker% endif 170*61046927SAndroid Build Coastguard Worker% endfor 171*61046927SAndroid Build Coastguard Worker}; 172*61046927SAndroid Build Coastguard Worker""" 173*61046927SAndroid Build Coastguard Worker 174*61046927SAndroid Build Coastguard Worker# Exact value to be ORed in to every opcode 175*61046927SAndroid Build Coastguard Workerdef exact_op(op): 176*61046927SAndroid Build Coastguard Worker return (op.opcode << 48) | (op.opcode2 << op.secondary_shift) 177*61046927SAndroid Build Coastguard Worker 178*61046927SAndroid Build Coastguard Workertry: 179*61046927SAndroid Build Coastguard Worker print(Template(template).render(immediates = immediates, instructions = instructions, skip = SKIP, exact = exact_op, typesize = typesize)) 180*61046927SAndroid Build Coastguard Workerexcept: 181*61046927SAndroid Build Coastguard Worker print(exceptions.text_error_template().render()) 182