1*61046927SAndroid Build Coastguard Worker /* 2*61046927SAndroid Build Coastguard Worker * Copyright (c) 2012-2015 Etnaviv Project 3*61046927SAndroid Build Coastguard Worker * 4*61046927SAndroid Build Coastguard Worker * SPDX-License-Identifier: MIT 5*61046927SAndroid Build Coastguard Worker * 6*61046927SAndroid Build Coastguard Worker * Authors: 7*61046927SAndroid Build Coastguard Worker * Wladimir J. van der Laan <[email protected]> 8*61046927SAndroid Build Coastguard Worker */ 9*61046927SAndroid Build Coastguard Worker 10*61046927SAndroid Build Coastguard Worker #pragma once 11*61046927SAndroid Build Coastguard Worker 12*61046927SAndroid Build Coastguard Worker #include <stdbool.h> 13*61046927SAndroid Build Coastguard Worker #include <stdint.h> 14*61046927SAndroid Build Coastguard Worker 15*61046927SAndroid Build Coastguard Worker #include "etnaviv/isa/enums.h" 16*61046927SAndroid Build Coastguard Worker 17*61046927SAndroid Build Coastguard Worker /* Number of source operands per instruction */ 18*61046927SAndroid Build Coastguard Worker #define ETNA_NUM_SRC (3) 19*61046927SAndroid Build Coastguard Worker 20*61046927SAndroid Build Coastguard Worker #define SWIZ_X(x) (((x) & 0x03) << 0) 21*61046927SAndroid Build Coastguard Worker #define SWIZ_Y(y) (((y) & 0x03) << 2) 22*61046927SAndroid Build Coastguard Worker #define SWIZ_Z(z) (((z) & 0x03) << 4) 23*61046927SAndroid Build Coastguard Worker #define SWIZ_W(w) (((w) & 0x03) << 6) 24*61046927SAndroid Build Coastguard Worker 25*61046927SAndroid Build Coastguard Worker /* clang-format off */ 26*61046927SAndroid Build Coastguard Worker /* Broadcast swizzle to all four components */ 27*61046927SAndroid Build Coastguard Worker #define INST_SWIZ_BROADCAST(x) \ 28*61046927SAndroid Build Coastguard Worker (SWIZ_X(x) | SWIZ_Y(x) | SWIZ_Z(x) | SWIZ_W(x)) 29*61046927SAndroid Build Coastguard Worker /* Identity (NOP) swizzle */ 30*61046927SAndroid Build Coastguard Worker #define INST_SWIZ_IDENTITY \ 31*61046927SAndroid Build Coastguard Worker (SWIZ_X(0) | SWIZ_Y(1) | SWIZ_Z(2) | SWIZ_W(3)) 32*61046927SAndroid Build Coastguard Worker /* Fully specified swizzle */ 33*61046927SAndroid Build Coastguard Worker #define INST_SWIZ(x, y, z, w) \ 34*61046927SAndroid Build Coastguard Worker (SWIZ_X(x) | SWIZ_Y(y) | SWIZ_Z(z) | SWIZ_W(w)) 35*61046927SAndroid Build Coastguard Worker #define SWIZZLE(c0, c1, c2, c3) \ 36*61046927SAndroid Build Coastguard Worker INST_SWIZ(ISA_SWIZ_##c0, \ 37*61046927SAndroid Build Coastguard Worker ISA_SWIZ_##c1, \ 38*61046927SAndroid Build Coastguard Worker ISA_SWIZ_##c2, \ 39*61046927SAndroid Build Coastguard Worker ISA_SWIZ_##c3) 40*61046927SAndroid Build Coastguard Worker /* clang-format on */ 41*61046927SAndroid Build Coastguard Worker 42*61046927SAndroid Build Coastguard Worker /*** operands ***/ 43*61046927SAndroid Build Coastguard Worker 44*61046927SAndroid Build Coastguard Worker /* destination operand */ 45*61046927SAndroid Build Coastguard Worker struct etna_inst_dst { 46*61046927SAndroid Build Coastguard Worker unsigned use : 1; /* 0: not in use, 1: in use */ 47*61046927SAndroid Build Coastguard Worker enum isa_reg_addressing_mode amode : 3; 48*61046927SAndroid Build Coastguard Worker unsigned reg : 7; /* register number 0..127 */ 49*61046927SAndroid Build Coastguard Worker enum isa_wrmask write_mask : 4; 50*61046927SAndroid Build Coastguard Worker }; 51*61046927SAndroid Build Coastguard Worker 52*61046927SAndroid Build Coastguard Worker /* texture operand */ 53*61046927SAndroid Build Coastguard Worker struct etna_inst_tex { 54*61046927SAndroid Build Coastguard Worker unsigned id : 5; /* sampler id */ 55*61046927SAndroid Build Coastguard Worker enum isa_reg_addressing_mode amode : 3; 56*61046927SAndroid Build Coastguard Worker unsigned swiz : 8; /* INST_SWIZ */ 57*61046927SAndroid Build Coastguard Worker }; 58*61046927SAndroid Build Coastguard Worker 59*61046927SAndroid Build Coastguard Worker /* source operand */ 60*61046927SAndroid Build Coastguard Worker struct etna_inst_src { 61*61046927SAndroid Build Coastguard Worker unsigned use : 1; /* 0: not in use, 1: in use */ 62*61046927SAndroid Build Coastguard Worker enum isa_reg_group rgroup : 3; 63*61046927SAndroid Build Coastguard Worker union { 64*61046927SAndroid Build Coastguard Worker struct __attribute__((__packed__)) { 65*61046927SAndroid Build Coastguard Worker unsigned reg : 9; /* register or uniform number 0..511 */ 66*61046927SAndroid Build Coastguard Worker unsigned swiz : 8; /* INST_SWIZ */ 67*61046927SAndroid Build Coastguard Worker unsigned neg : 1; /* negate (flip sign) if set */ 68*61046927SAndroid Build Coastguard Worker unsigned abs : 1; /* absolute (remove sign) if set */ 69*61046927SAndroid Build Coastguard Worker enum isa_reg_addressing_mode amode : 3; 70*61046927SAndroid Build Coastguard Worker }; 71*61046927SAndroid Build Coastguard Worker struct __attribute__((__packed__)) { 72*61046927SAndroid Build Coastguard Worker unsigned imm_val : 20; 73*61046927SAndroid Build Coastguard Worker unsigned imm_type : 2; 74*61046927SAndroid Build Coastguard Worker }; 75*61046927SAndroid Build Coastguard Worker }; 76*61046927SAndroid Build Coastguard Worker }; 77*61046927SAndroid Build Coastguard Worker 78*61046927SAndroid Build Coastguard Worker /*** instruction ***/ 79*61046927SAndroid Build Coastguard Worker struct etna_inst { 80*61046927SAndroid Build Coastguard Worker enum isa_opc opcode; 81*61046927SAndroid Build Coastguard Worker enum isa_type type; 82*61046927SAndroid Build Coastguard Worker enum isa_rounding rounding; 83*61046927SAndroid Build Coastguard Worker enum isa_cond cond : 5; 84*61046927SAndroid Build Coastguard Worker unsigned sat : 1; /* saturate result between 0..1 */ 85*61046927SAndroid Build Coastguard Worker enum isa_thread thread : 2; /* select low/high half mediump */ 86*61046927SAndroid Build Coastguard Worker unsigned dst_full : 1; /* write to highp register */ 87*61046927SAndroid Build Coastguard Worker unsigned pmode : 1; 88*61046927SAndroid Build Coastguard Worker unsigned skphp : 1; 89*61046927SAndroid Build Coastguard Worker unsigned denorm : 1; 90*61046927SAndroid Build Coastguard Worker unsigned local : 1; 91*61046927SAndroid Build Coastguard Worker unsigned left_shift : 3; 92*61046927SAndroid Build Coastguard Worker struct etna_inst_dst dst; /* destination operand */ 93*61046927SAndroid Build Coastguard Worker struct etna_inst_tex tex; /* texture operand */ 94*61046927SAndroid Build Coastguard Worker struct etna_inst_src src[ETNA_NUM_SRC]; /* source operand */ 95*61046927SAndroid Build Coastguard Worker unsigned imm; /* takes place of src[2] for BRANCH/CALL */ 96*61046927SAndroid Build Coastguard Worker }; 97*61046927SAndroid Build Coastguard Worker 98*61046927SAndroid Build Coastguard Worker struct etna_asm_result { 99*61046927SAndroid Build Coastguard Worker struct etna_inst *instr; 100*61046927SAndroid Build Coastguard Worker char *error; 101*61046927SAndroid Build Coastguard Worker size_t num_instr; 102*61046927SAndroid Build Coastguard Worker size_t capacity_instr; 103*61046927SAndroid Build Coastguard Worker bool success; 104*61046927SAndroid Build Coastguard Worker }; 105