1*61046927SAndroid Build Coastguard Worker /* 2*61046927SAndroid Build Coastguard Worker * Copyright © 2022 Imagination Technologies Ltd. 3*61046927SAndroid Build Coastguard Worker * 4*61046927SAndroid Build Coastguard Worker * Permission is hereby granted, free of charge, to any person obtaining a copy 5*61046927SAndroid Build Coastguard Worker * of this software and associated documentation files (the "Software"), to deal 6*61046927SAndroid Build Coastguard Worker * in the Software without restriction, including without limitation the rights 7*61046927SAndroid Build Coastguard Worker * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 8*61046927SAndroid Build Coastguard Worker * copies of the Software, and to permit persons to whom the Software is 9*61046927SAndroid Build Coastguard Worker * furnished to do so, subject to the following conditions: 10*61046927SAndroid Build Coastguard Worker * 11*61046927SAndroid Build Coastguard Worker * The above copyright notice and this permission notice (including the next 12*61046927SAndroid Build Coastguard Worker * paragraph) shall be included in all copies or substantial portions of the 13*61046927SAndroid Build Coastguard Worker * Software. 14*61046927SAndroid Build Coastguard Worker * 15*61046927SAndroid Build Coastguard Worker * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16*61046927SAndroid Build Coastguard Worker * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17*61046927SAndroid Build Coastguard Worker * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18*61046927SAndroid Build Coastguard Worker * AUTHORS OR COPYRIGHT HOLDERS LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19*61046927SAndroid Build Coastguard Worker * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20*61046927SAndroid Build Coastguard Worker * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21*61046927SAndroid Build Coastguard Worker * SOFTWARE. 22*61046927SAndroid Build Coastguard Worker */ 23*61046927SAndroid Build Coastguard Worker 24*61046927SAndroid Build Coastguard Worker #ifndef ROGUE_ISA_H 25*61046927SAndroid Build Coastguard Worker #define ROGUE_ISA_H 26*61046927SAndroid Build Coastguard Worker 27*61046927SAndroid Build Coastguard Worker /** 28*61046927SAndroid Build Coastguard Worker * \file rogue_isa.h 29*61046927SAndroid Build Coastguard Worker * 30*61046927SAndroid Build Coastguard Worker * \brief Contains hardware ISA definitions and encodings. 31*61046927SAndroid Build Coastguard Worker */ 32*61046927SAndroid Build Coastguard Worker 33*61046927SAndroid Build Coastguard Worker /* Source/destination encodings. */ 34*61046927SAndroid Build Coastguard Worker 35*61046927SAndroid Build Coastguard Worker /* Internal source selector. */ 36*61046927SAndroid Build Coastguard Worker typedef struct rogue_iss_encoding { 37*61046927SAndroid Build Coastguard Worker unsigned is1 : 1; 38*61046927SAndroid Build Coastguard Worker unsigned is2 : 1; 39*61046927SAndroid Build Coastguard Worker unsigned is3 : 2; 40*61046927SAndroid Build Coastguard Worker unsigned is4 : 2; 41*61046927SAndroid Build Coastguard Worker unsigned is5 : 2; 42*61046927SAndroid Build Coastguard Worker } PACKED rogue_iss_encoding; 43*61046927SAndroid Build Coastguard Worker static_assert(sizeof(rogue_iss_encoding) == 1, 44*61046927SAndroid Build Coastguard Worker "sizeof(rogue_iss_encoding) != 1"); 45*61046927SAndroid Build Coastguard Worker 46*61046927SAndroid Build Coastguard Worker typedef struct rogue_dbN { 47*61046927SAndroid Build Coastguard Worker union { 48*61046927SAndroid Build Coastguard Worker struct { 49*61046927SAndroid Build Coastguard Worker unsigned _0 : 1; 50*61046927SAndroid Build Coastguard Worker unsigned _2_1 : 2; 51*61046927SAndroid Build Coastguard Worker unsigned : 5; 52*61046927SAndroid Build Coastguard Worker } PACKED; 53*61046927SAndroid Build Coastguard Worker 54*61046927SAndroid Build Coastguard Worker uint8_t _; 55*61046927SAndroid Build Coastguard Worker } PACKED; 56*61046927SAndroid Build Coastguard Worker } PACKED rogue_dbN; 57*61046927SAndroid Build Coastguard Worker static_assert(sizeof(rogue_dbN) == 1, "sizeof(rogue_dbN) != 1"); 58*61046927SAndroid Build Coastguard Worker 59*61046927SAndroid Build Coastguard Worker typedef struct rogue_dN { 60*61046927SAndroid Build Coastguard Worker union { 61*61046927SAndroid Build Coastguard Worker struct { 62*61046927SAndroid Build Coastguard Worker unsigned _5_0 : 6; 63*61046927SAndroid Build Coastguard Worker unsigned _7_6 : 2; 64*61046927SAndroid Build Coastguard Worker unsigned _10_8 : 3; 65*61046927SAndroid Build Coastguard Worker unsigned : 5; 66*61046927SAndroid Build Coastguard Worker } PACKED; 67*61046927SAndroid Build Coastguard Worker 68*61046927SAndroid Build Coastguard Worker uint8_t _; 69*61046927SAndroid Build Coastguard Worker } PACKED; 70*61046927SAndroid Build Coastguard Worker } PACKED rogue_dN; 71*61046927SAndroid Build Coastguard Worker static_assert(sizeof(rogue_dN) == 2, "sizeof(rogue_dN) != 2"); 72*61046927SAndroid Build Coastguard Worker 73*61046927SAndroid Build Coastguard Worker typedef struct rogue_db0 { 74*61046927SAndroid Build Coastguard Worker union { 75*61046927SAndroid Build Coastguard Worker struct { 76*61046927SAndroid Build Coastguard Worker unsigned _0 : 1; 77*61046927SAndroid Build Coastguard Worker unsigned _2_1 : 2; 78*61046927SAndroid Build Coastguard Worker unsigned : 5; 79*61046927SAndroid Build Coastguard Worker } PACKED; 80*61046927SAndroid Build Coastguard Worker 81*61046927SAndroid Build Coastguard Worker uint8_t _; 82*61046927SAndroid Build Coastguard Worker } PACKED; 83*61046927SAndroid Build Coastguard Worker } PACKED rogue_db0; 84*61046927SAndroid Build Coastguard Worker static_assert(sizeof(rogue_db0) == 1, "sizeof(rogue_db0) != 1"); 85*61046927SAndroid Build Coastguard Worker 86*61046927SAndroid Build Coastguard Worker typedef struct rogue_db1 { 87*61046927SAndroid Build Coastguard Worker union { 88*61046927SAndroid Build Coastguard Worker struct { 89*61046927SAndroid Build Coastguard Worker unsigned _0 : 1; 90*61046927SAndroid Build Coastguard Worker unsigned _2_1 : 2; 91*61046927SAndroid Build Coastguard Worker unsigned : 5; 92*61046927SAndroid Build Coastguard Worker } PACKED; 93*61046927SAndroid Build Coastguard Worker 94*61046927SAndroid Build Coastguard Worker uint8_t _; 95*61046927SAndroid Build Coastguard Worker } PACKED; 96*61046927SAndroid Build Coastguard Worker } PACKED rogue_db1; 97*61046927SAndroid Build Coastguard Worker static_assert(sizeof(rogue_db0) == 1, "sizeof(rogue_db0) != 1"); 98*61046927SAndroid Build Coastguard Worker 99*61046927SAndroid Build Coastguard Worker typedef struct rogue_d0 { 100*61046927SAndroid Build Coastguard Worker union { 101*61046927SAndroid Build Coastguard Worker struct { 102*61046927SAndroid Build Coastguard Worker unsigned _6_0 : 7; 103*61046927SAndroid Build Coastguard Worker unsigned _7 : 1; 104*61046927SAndroid Build Coastguard Worker unsigned _10_8 : 3; 105*61046927SAndroid Build Coastguard Worker unsigned : 5; 106*61046927SAndroid Build Coastguard Worker } PACKED; 107*61046927SAndroid Build Coastguard Worker 108*61046927SAndroid Build Coastguard Worker uint16_t _; 109*61046927SAndroid Build Coastguard Worker } PACKED; 110*61046927SAndroid Build Coastguard Worker } PACKED rogue_d0; 111*61046927SAndroid Build Coastguard Worker static_assert(sizeof(rogue_d0) == 2, "sizeof(rogue_d0) != 2"); 112*61046927SAndroid Build Coastguard Worker 113*61046927SAndroid Build Coastguard Worker typedef struct rogue_d1 { 114*61046927SAndroid Build Coastguard Worker union { 115*61046927SAndroid Build Coastguard Worker struct { 116*61046927SAndroid Build Coastguard Worker unsigned _5_0 : 6; 117*61046927SAndroid Build Coastguard Worker unsigned _7_6 : 2; 118*61046927SAndroid Build Coastguard Worker unsigned _10_8 : 3; 119*61046927SAndroid Build Coastguard Worker unsigned : 5; 120*61046927SAndroid Build Coastguard Worker } PACKED; 121*61046927SAndroid Build Coastguard Worker 122*61046927SAndroid Build Coastguard Worker uint16_t _; 123*61046927SAndroid Build Coastguard Worker } PACKED; 124*61046927SAndroid Build Coastguard Worker } PACKED rogue_d1; 125*61046927SAndroid Build Coastguard Worker static_assert(sizeof(rogue_d1) == 2, "sizeof(rogue_d1) != 2"); 126*61046927SAndroid Build Coastguard Worker 127*61046927SAndroid Build Coastguard Worker typedef struct rogue_dest_map_encoding { 128*61046927SAndroid Build Coastguard Worker /* Byte 0 */ 129*61046927SAndroid Build Coastguard Worker union { 130*61046927SAndroid Build Coastguard Worker struct { 131*61046927SAndroid Build Coastguard Worker unsigned dN_5_0 : 6; 132*61046927SAndroid Build Coastguard Worker unsigned dbN_0 : 1; 133*61046927SAndroid Build Coastguard Worker unsigned ext0 : 1; 134*61046927SAndroid Build Coastguard Worker } PACKED; 135*61046927SAndroid Build Coastguard Worker 136*61046927SAndroid Build Coastguard Worker struct { 137*61046927SAndroid Build Coastguard Worker unsigned d0_6_0 : 7; 138*61046927SAndroid Build Coastguard Worker unsigned db0_0 : 1; 139*61046927SAndroid Build Coastguard Worker } PACKED; 140*61046927SAndroid Build Coastguard Worker }; 141*61046927SAndroid Build Coastguard Worker 142*61046927SAndroid Build Coastguard Worker /* Byte 1 */ 143*61046927SAndroid Build Coastguard Worker union { 144*61046927SAndroid Build Coastguard Worker struct { 145*61046927SAndroid Build Coastguard Worker unsigned dN_7_6 : 2; 146*61046927SAndroid Build Coastguard Worker unsigned dbN_2_1 : 2; 147*61046927SAndroid Build Coastguard Worker unsigned dN_10_8 : 3; 148*61046927SAndroid Build Coastguard Worker unsigned rsvd1 : 1; 149*61046927SAndroid Build Coastguard Worker } PACKED; 150*61046927SAndroid Build Coastguard Worker 151*61046927SAndroid Build Coastguard Worker struct { 152*61046927SAndroid Build Coastguard Worker unsigned d1_5_0 : 6; 153*61046927SAndroid Build Coastguard Worker unsigned db1_0 : 1; 154*61046927SAndroid Build Coastguard Worker unsigned ext1 : 1; 155*61046927SAndroid Build Coastguard Worker } PACKED; 156*61046927SAndroid Build Coastguard Worker }; 157*61046927SAndroid Build Coastguard Worker 158*61046927SAndroid Build Coastguard Worker /* Byte 2 */ 159*61046927SAndroid Build Coastguard Worker struct { 160*61046927SAndroid Build Coastguard Worker unsigned d0_7 : 1; 161*61046927SAndroid Build Coastguard Worker unsigned db0_2_1 : 2; 162*61046927SAndroid Build Coastguard Worker unsigned d1_7_6 : 2; 163*61046927SAndroid Build Coastguard Worker unsigned db1_2_1 : 2; 164*61046927SAndroid Build Coastguard Worker unsigned ext2 : 1; 165*61046927SAndroid Build Coastguard Worker } PACKED; 166*61046927SAndroid Build Coastguard Worker 167*61046927SAndroid Build Coastguard Worker /* Byte 3 */ 168*61046927SAndroid Build Coastguard Worker struct { 169*61046927SAndroid Build Coastguard Worker unsigned d0_10_8 : 3; 170*61046927SAndroid Build Coastguard Worker unsigned d1_10_8 : 3; 171*61046927SAndroid Build Coastguard Worker unsigned rsvd3 : 2; 172*61046927SAndroid Build Coastguard Worker } PACKED; 173*61046927SAndroid Build Coastguard Worker } PACKED rogue_dest_map_encoding; 174*61046927SAndroid Build Coastguard Worker static_assert(sizeof(rogue_dest_map_encoding) == 4, 175*61046927SAndroid Build Coastguard Worker "sizeof(rogue_dest_map_encoding) != 4"); 176*61046927SAndroid Build Coastguard Worker 177*61046927SAndroid Build Coastguard Worker /****************/ 178*61046927SAndroid Build Coastguard Worker 179*61046927SAndroid Build Coastguard Worker typedef struct rogue_source_map_encoding { 180*61046927SAndroid Build Coastguard Worker /* Byte 0 */ 181*61046927SAndroid Build Coastguard Worker struct { 182*61046927SAndroid Build Coastguard Worker unsigned sA_5_0 : 6; 183*61046927SAndroid Build Coastguard Worker unsigned sbA_0 : 1; 184*61046927SAndroid Build Coastguard Worker unsigned ext0 : 1; 185*61046927SAndroid Build Coastguard Worker } PACKED; 186*61046927SAndroid Build Coastguard Worker 187*61046927SAndroid Build Coastguard Worker /* Byte 1 */ 188*61046927SAndroid Build Coastguard Worker union { 189*61046927SAndroid Build Coastguard Worker struct { 190*61046927SAndroid Build Coastguard Worker unsigned sA_7_6 : 2; 191*61046927SAndroid Build Coastguard Worker unsigned sbA_2_1 : 2; 192*61046927SAndroid Build Coastguard Worker unsigned mux_1_0 : 2; 193*61046927SAndroid Build Coastguard Worker unsigned : 2; 194*61046927SAndroid Build Coastguard Worker } PACKED sA_1; 195*61046927SAndroid Build Coastguard Worker 196*61046927SAndroid Build Coastguard Worker struct { 197*61046927SAndroid Build Coastguard Worker unsigned sB_4_0 : 5; 198*61046927SAndroid Build Coastguard Worker unsigned sbB_0 : 1; 199*61046927SAndroid Build Coastguard Worker unsigned ext1 : 1; 200*61046927SAndroid Build Coastguard Worker unsigned sel : 1; 201*61046927SAndroid Build Coastguard Worker } PACKED; 202*61046927SAndroid Build Coastguard Worker } PACKED; 203*61046927SAndroid Build Coastguard Worker 204*61046927SAndroid Build Coastguard Worker /* Byte 2 */ 205*61046927SAndroid Build Coastguard Worker union { 206*61046927SAndroid Build Coastguard Worker /* Common def. */ 207*61046927SAndroid Build Coastguard Worker struct sA_sC_10_8 { 208*61046927SAndroid Build Coastguard Worker unsigned sA_10_8 : 3; 209*61046927SAndroid Build Coastguard Worker unsigned sC_10_8 : 3; 210*61046927SAndroid Build Coastguard Worker unsigned rsvd5 : 2; 211*61046927SAndroid Build Coastguard Worker } PACKED sA_2; 212*61046927SAndroid Build Coastguard Worker 213*61046927SAndroid Build Coastguard Worker struct { 214*61046927SAndroid Build Coastguard Worker unsigned sB_6_5 : 2; 215*61046927SAndroid Build Coastguard Worker unsigned sA_6 : 1; 216*61046927SAndroid Build Coastguard Worker unsigned sbB_1 : 1; 217*61046927SAndroid Build Coastguard Worker unsigned sbA_1 : 1; 218*61046927SAndroid Build Coastguard Worker unsigned mux_1_0 : 2; 219*61046927SAndroid Build Coastguard Worker unsigned ext2 : 1; 220*61046927SAndroid Build Coastguard Worker } PACKED; 221*61046927SAndroid Build Coastguard Worker 222*61046927SAndroid Build Coastguard Worker struct { 223*61046927SAndroid Build Coastguard Worker unsigned : 3; 224*61046927SAndroid Build Coastguard Worker unsigned rsvd2 : 5; 225*61046927SAndroid Build Coastguard Worker } PACKED; 226*61046927SAndroid Build Coastguard Worker } PACKED; 227*61046927SAndroid Build Coastguard Worker 228*61046927SAndroid Build Coastguard Worker /* Byte 3 */ 229*61046927SAndroid Build Coastguard Worker union { 230*61046927SAndroid Build Coastguard Worker /* Common def. */ 231*61046927SAndroid Build Coastguard Worker struct sB_sC_mux2 { 232*61046927SAndroid Build Coastguard Worker union { 233*61046927SAndroid Build Coastguard Worker struct { 234*61046927SAndroid Build Coastguard Worker unsigned sB_7 : 1; 235*61046927SAndroid Build Coastguard Worker unsigned sA_7 : 1; 236*61046927SAndroid Build Coastguard Worker unsigned rsvd3 : 1; 237*61046927SAndroid Build Coastguard Worker unsigned sbA_2 : 1; 238*61046927SAndroid Build Coastguard Worker unsigned mux_2 : 1; 239*61046927SAndroid Build Coastguard Worker unsigned sA_10_8 : 3; 240*61046927SAndroid Build Coastguard Worker } PACKED; 241*61046927SAndroid Build Coastguard Worker 242*61046927SAndroid Build Coastguard Worker struct { 243*61046927SAndroid Build Coastguard Worker unsigned : 2; 244*61046927SAndroid Build Coastguard Worker unsigned ext4 : 1; 245*61046927SAndroid Build Coastguard Worker unsigned : 2; 246*61046927SAndroid Build Coastguard Worker unsigned sC_7_6 : 2; 247*61046927SAndroid Build Coastguard Worker unsigned sbC_2 : 1; 248*61046927SAndroid Build Coastguard Worker } PACKED; 249*61046927SAndroid Build Coastguard Worker } PACKED; 250*61046927SAndroid Build Coastguard Worker } PACKED sB_3; 251*61046927SAndroid Build Coastguard Worker 252*61046927SAndroid Build Coastguard Worker struct { 253*61046927SAndroid Build Coastguard Worker unsigned sC_5_0 : 6; 254*61046927SAndroid Build Coastguard Worker unsigned sbC_1_0 : 2; 255*61046927SAndroid Build Coastguard Worker } PACKED; 256*61046927SAndroid Build Coastguard Worker } PACKED; 257*61046927SAndroid Build Coastguard Worker 258*61046927SAndroid Build Coastguard Worker /* Byte 4 */ 259*61046927SAndroid Build Coastguard Worker struct sB_sC_mux2 sC_4; 260*61046927SAndroid Build Coastguard Worker 261*61046927SAndroid Build Coastguard Worker /* Byte 5 */ 262*61046927SAndroid Build Coastguard Worker struct sA_sC_10_8 sC_5; 263*61046927SAndroid Build Coastguard Worker } PACKED rogue_source_map_encoding; 264*61046927SAndroid Build Coastguard Worker static_assert(sizeof(rogue_source_map_encoding) == 6, 265*61046927SAndroid Build Coastguard Worker "sizeof(rogue_source_map_encoding) == 6"); 266*61046927SAndroid Build Coastguard Worker 267*61046927SAndroid Build Coastguard Worker typedef struct rogue_sbA { 268*61046927SAndroid Build Coastguard Worker union { 269*61046927SAndroid Build Coastguard Worker struct { 270*61046927SAndroid Build Coastguard Worker unsigned _0 : 1; 271*61046927SAndroid Build Coastguard Worker unsigned _2_1 : 2; 272*61046927SAndroid Build Coastguard Worker unsigned : 5; 273*61046927SAndroid Build Coastguard Worker } PACKED; 274*61046927SAndroid Build Coastguard Worker 275*61046927SAndroid Build Coastguard Worker struct { 276*61046927SAndroid Build Coastguard Worker unsigned : 1; 277*61046927SAndroid Build Coastguard Worker unsigned _1 : 1; 278*61046927SAndroid Build Coastguard Worker unsigned _2 : 1; 279*61046927SAndroid Build Coastguard Worker unsigned : 5; 280*61046927SAndroid Build Coastguard Worker } PACKED; 281*61046927SAndroid Build Coastguard Worker 282*61046927SAndroid Build Coastguard Worker uint8_t _; 283*61046927SAndroid Build Coastguard Worker } PACKED; 284*61046927SAndroid Build Coastguard Worker } PACKED rogue_sbA; 285*61046927SAndroid Build Coastguard Worker static_assert(sizeof(rogue_sbA) == 1, "sizeof(rogue_sbA) != 1"); 286*61046927SAndroid Build Coastguard Worker 287*61046927SAndroid Build Coastguard Worker typedef struct rogue_sA { 288*61046927SAndroid Build Coastguard Worker union { 289*61046927SAndroid Build Coastguard Worker struct { 290*61046927SAndroid Build Coastguard Worker unsigned _5_0 : 6; 291*61046927SAndroid Build Coastguard Worker unsigned _7_6 : 2; 292*61046927SAndroid Build Coastguard Worker unsigned _10_8 : 3; 293*61046927SAndroid Build Coastguard Worker unsigned : 5; 294*61046927SAndroid Build Coastguard Worker } PACKED; 295*61046927SAndroid Build Coastguard Worker 296*61046927SAndroid Build Coastguard Worker struct { 297*61046927SAndroid Build Coastguard Worker unsigned : 6; 298*61046927SAndroid Build Coastguard Worker unsigned _6 : 1; 299*61046927SAndroid Build Coastguard Worker unsigned _7 : 1; 300*61046927SAndroid Build Coastguard Worker unsigned : 8; 301*61046927SAndroid Build Coastguard Worker } PACKED; 302*61046927SAndroid Build Coastguard Worker 303*61046927SAndroid Build Coastguard Worker uint16_t _; 304*61046927SAndroid Build Coastguard Worker } PACKED; 305*61046927SAndroid Build Coastguard Worker } PACKED rogue_sA; 306*61046927SAndroid Build Coastguard Worker static_assert(sizeof(rogue_sA) == 2, "sizeof(rogue_sA) != 2"); 307*61046927SAndroid Build Coastguard Worker 308*61046927SAndroid Build Coastguard Worker typedef struct rogue_sbB { 309*61046927SAndroid Build Coastguard Worker union { 310*61046927SAndroid Build Coastguard Worker struct { 311*61046927SAndroid Build Coastguard Worker unsigned _0 : 1; 312*61046927SAndroid Build Coastguard Worker unsigned _1 : 1; 313*61046927SAndroid Build Coastguard Worker unsigned : 6; 314*61046927SAndroid Build Coastguard Worker } PACKED; 315*61046927SAndroid Build Coastguard Worker 316*61046927SAndroid Build Coastguard Worker uint8_t _; 317*61046927SAndroid Build Coastguard Worker } PACKED; 318*61046927SAndroid Build Coastguard Worker } PACKED rogue_sbB; 319*61046927SAndroid Build Coastguard Worker static_assert(sizeof(rogue_sbB) == 1, "sizeof(rogue_sbB) != 1"); 320*61046927SAndroid Build Coastguard Worker 321*61046927SAndroid Build Coastguard Worker typedef struct rogue_sB { 322*61046927SAndroid Build Coastguard Worker union { 323*61046927SAndroid Build Coastguard Worker struct { 324*61046927SAndroid Build Coastguard Worker unsigned _4_0 : 5; 325*61046927SAndroid Build Coastguard Worker unsigned _6_5 : 2; 326*61046927SAndroid Build Coastguard Worker unsigned _7 : 1; 327*61046927SAndroid Build Coastguard Worker unsigned : 8; 328*61046927SAndroid Build Coastguard Worker } PACKED; 329*61046927SAndroid Build Coastguard Worker 330*61046927SAndroid Build Coastguard Worker uint16_t _; 331*61046927SAndroid Build Coastguard Worker } PACKED; 332*61046927SAndroid Build Coastguard Worker } PACKED rogue_sB; 333*61046927SAndroid Build Coastguard Worker static_assert(sizeof(rogue_sB) == 2, "sizeof(rogue_sB) != 2"); 334*61046927SAndroid Build Coastguard Worker 335*61046927SAndroid Build Coastguard Worker typedef struct rogue_sbC { 336*61046927SAndroid Build Coastguard Worker union { 337*61046927SAndroid Build Coastguard Worker struct { 338*61046927SAndroid Build Coastguard Worker unsigned _1_0 : 2; 339*61046927SAndroid Build Coastguard Worker unsigned _2 : 1; 340*61046927SAndroid Build Coastguard Worker unsigned : 5; 341*61046927SAndroid Build Coastguard Worker } PACKED; 342*61046927SAndroid Build Coastguard Worker 343*61046927SAndroid Build Coastguard Worker uint8_t _; 344*61046927SAndroid Build Coastguard Worker } PACKED; 345*61046927SAndroid Build Coastguard Worker } PACKED rogue_sbC; 346*61046927SAndroid Build Coastguard Worker static_assert(sizeof(rogue_sbC) == 1, "sizeof(rogue_sbC) != 1"); 347*61046927SAndroid Build Coastguard Worker 348*61046927SAndroid Build Coastguard Worker typedef struct rogue_sC { 349*61046927SAndroid Build Coastguard Worker union { 350*61046927SAndroid Build Coastguard Worker struct { 351*61046927SAndroid Build Coastguard Worker unsigned _5_0 : 6; 352*61046927SAndroid Build Coastguard Worker unsigned _7_6 : 2; 353*61046927SAndroid Build Coastguard Worker unsigned _10_8 : 3; 354*61046927SAndroid Build Coastguard Worker unsigned : 5; 355*61046927SAndroid Build Coastguard Worker } PACKED; 356*61046927SAndroid Build Coastguard Worker 357*61046927SAndroid Build Coastguard Worker uint16_t _; 358*61046927SAndroid Build Coastguard Worker } PACKED; 359*61046927SAndroid Build Coastguard Worker } PACKED rogue_sC; 360*61046927SAndroid Build Coastguard Worker static_assert(sizeof(rogue_sC) == 2, "sizeof(rogue_sC) != 2"); 361*61046927SAndroid Build Coastguard Worker 362*61046927SAndroid Build Coastguard Worker typedef struct rogue_mux { 363*61046927SAndroid Build Coastguard Worker union { 364*61046927SAndroid Build Coastguard Worker struct { 365*61046927SAndroid Build Coastguard Worker unsigned _1_0 : 2; 366*61046927SAndroid Build Coastguard Worker unsigned _2 : 1; 367*61046927SAndroid Build Coastguard Worker unsigned : 5; 368*61046927SAndroid Build Coastguard Worker } PACKED; 369*61046927SAndroid Build Coastguard Worker 370*61046927SAndroid Build Coastguard Worker uint8_t _; 371*61046927SAndroid Build Coastguard Worker } PACKED; 372*61046927SAndroid Build Coastguard Worker } PACKED rogue_mux; 373*61046927SAndroid Build Coastguard Worker static_assert(sizeof(rogue_mux) == 1, "sizeof(rogue_mux) != 1"); 374*61046927SAndroid Build Coastguard Worker 375*61046927SAndroid Build Coastguard Worker typedef struct rogue_idx_offset { 376*61046927SAndroid Build Coastguard Worker union { 377*61046927SAndroid Build Coastguard Worker struct { 378*61046927SAndroid Build Coastguard Worker unsigned bank : 3; 379*61046927SAndroid Build Coastguard Worker unsigned offset : 8; 380*61046927SAndroid Build Coastguard Worker unsigned : 5; 381*61046927SAndroid Build Coastguard Worker } PACKED; 382*61046927SAndroid Build Coastguard Worker 383*61046927SAndroid Build Coastguard Worker uint16_t _; 384*61046927SAndroid Build Coastguard Worker } PACKED; 385*61046927SAndroid Build Coastguard Worker } PACKED rogue_idx_offset; 386*61046927SAndroid Build Coastguard Worker static_assert(sizeof(rogue_idx_offset) == 2, "sizeof(rogue_idx_offset) != 2"); 387*61046927SAndroid Build Coastguard Worker 388*61046927SAndroid Build Coastguard Worker typedef struct rogue_idx_dim_offset { 389*61046927SAndroid Build Coastguard Worker union { 390*61046927SAndroid Build Coastguard Worker struct { 391*61046927SAndroid Build Coastguard Worker unsigned bank : 3; 392*61046927SAndroid Build Coastguard Worker unsigned dim_offset : 5; 393*61046927SAndroid Build Coastguard Worker unsigned : 8; 394*61046927SAndroid Build Coastguard Worker } PACKED; 395*61046927SAndroid Build Coastguard Worker 396*61046927SAndroid Build Coastguard Worker uint16_t _; 397*61046927SAndroid Build Coastguard Worker } PACKED; 398*61046927SAndroid Build Coastguard Worker } PACKED rogue_idx_dim_offset; 399*61046927SAndroid Build Coastguard Worker static_assert(sizeof(rogue_idx_dim_offset) == 2, 400*61046927SAndroid Build Coastguard Worker "sizeof(rogue_idx_dim_offset) != 2"); 401*61046927SAndroid Build Coastguard Worker 402*61046927SAndroid Build Coastguard Worker enum reg_bank { 403*61046927SAndroid Build Coastguard Worker BANK_SPECIAL = 0b000, 404*61046927SAndroid Build Coastguard Worker BANK_TEMP = 0b001, 405*61046927SAndroid Build Coastguard Worker BANK_VTXIN = 0b010, 406*61046927SAndroid Build Coastguard Worker BANK_COEFF = 0b011, 407*61046927SAndroid Build Coastguard Worker BANK_SHARED = 0b100, 408*61046927SAndroid Build Coastguard Worker BANK_COEFF_ALT = 0b101, 409*61046927SAndroid Build Coastguard Worker BANK_IDX0 = 0b110, 410*61046927SAndroid Build Coastguard Worker BANK_IDX1 = 0b111, 411*61046927SAndroid Build Coastguard Worker }; 412*61046927SAndroid Build Coastguard Worker 413*61046927SAndroid Build Coastguard Worker enum idx_bank { 414*61046927SAndroid Build Coastguard Worker IDX_BANK_TEMP = 0b000, 415*61046927SAndroid Build Coastguard Worker IDX_BANK_VTXIN = 0b001, 416*61046927SAndroid Build Coastguard Worker IDX_BANK_COEFF = 0b010, 417*61046927SAndroid Build Coastguard Worker IDX_BANK_SHARED = 0b011, 418*61046927SAndroid Build Coastguard Worker IDX_BANK_DC = 0b100, 419*61046927SAndroid Build Coastguard Worker IDX_BANK_IDX = 0b101, 420*61046927SAndroid Build Coastguard Worker IDX_BANK_COEFF_ALT = 0b110, 421*61046927SAndroid Build Coastguard Worker IDX_BANK_PIXOUT = 0b111, 422*61046927SAndroid Build Coastguard Worker }; 423*61046927SAndroid Build Coastguard Worker 424*61046927SAndroid Build Coastguard Worker enum is0 { 425*61046927SAndroid Build Coastguard Worker IS0_S0 = 0b000, 426*61046927SAndroid Build Coastguard Worker IS0_S3 = 0b001, 427*61046927SAndroid Build Coastguard Worker IS0_S4 = 0b010, 428*61046927SAndroid Build Coastguard Worker IS0_S5 = 0b011, 429*61046927SAndroid Build Coastguard Worker IS0_S1 = 0b100, 430*61046927SAndroid Build Coastguard Worker IS0_S2 = 0b101, 431*61046927SAndroid Build Coastguard Worker }; 432*61046927SAndroid Build Coastguard Worker 433*61046927SAndroid Build Coastguard Worker enum is1 { 434*61046927SAndroid Build Coastguard Worker IS1_FT0 = 0b0, 435*61046927SAndroid Build Coastguard Worker IS1_FTE = 0b1, 436*61046927SAndroid Build Coastguard Worker }; 437*61046927SAndroid Build Coastguard Worker 438*61046927SAndroid Build Coastguard Worker enum is2 { 439*61046927SAndroid Build Coastguard Worker IS2_FT1 = 0b0, 440*61046927SAndroid Build Coastguard Worker IS2_FTE = 0b1, 441*61046927SAndroid Build Coastguard Worker }; 442*61046927SAndroid Build Coastguard Worker 443*61046927SAndroid Build Coastguard Worker enum is3 { 444*61046927SAndroid Build Coastguard Worker IS3_FT0 = 0b00, 445*61046927SAndroid Build Coastguard Worker IS3_FT1 = 0b01, 446*61046927SAndroid Build Coastguard Worker IS3_S2 = 0b10, 447*61046927SAndroid Build Coastguard Worker IS3_FTE = 0b11, 448*61046927SAndroid Build Coastguard Worker }; 449*61046927SAndroid Build Coastguard Worker 450*61046927SAndroid Build Coastguard Worker enum is4 { 451*61046927SAndroid Build Coastguard Worker IS4_FT0 = 0b00, 452*61046927SAndroid Build Coastguard Worker IS4_FT1 = 0b01, 453*61046927SAndroid Build Coastguard Worker IS4_FT2 = 0b10, 454*61046927SAndroid Build Coastguard Worker IS4_FTE = 0b11, 455*61046927SAndroid Build Coastguard Worker }; 456*61046927SAndroid Build Coastguard Worker 457*61046927SAndroid Build Coastguard Worker enum is5 { 458*61046927SAndroid Build Coastguard Worker IS5_FT0 = 0b00, 459*61046927SAndroid Build Coastguard Worker IS5_FT1 = 0b01, 460*61046927SAndroid Build Coastguard Worker IS5_FT2 = 0b10, 461*61046927SAndroid Build Coastguard Worker IS5_FTE = 0b11, 462*61046927SAndroid Build Coastguard Worker }; 463*61046927SAndroid Build Coastguard Worker 464*61046927SAndroid Build Coastguard Worker /* Single source instructions. */ 465*61046927SAndroid Build Coastguard Worker 466*61046927SAndroid Build Coastguard Worker typedef struct rogue_single_pck_encoding { 467*61046927SAndroid Build Coastguard Worker /* Byte 1 */ 468*61046927SAndroid Build Coastguard Worker union { 469*61046927SAndroid Build Coastguard Worker struct { 470*61046927SAndroid Build Coastguard Worker union { 471*61046927SAndroid Build Coastguard Worker struct { 472*61046927SAndroid Build Coastguard Worker unsigned format : 5; 473*61046927SAndroid Build Coastguard Worker unsigned scale : 1; 474*61046927SAndroid Build Coastguard Worker unsigned elem : 2; 475*61046927SAndroid Build Coastguard Worker } PACKED; 476*61046927SAndroid Build Coastguard Worker 477*61046927SAndroid Build Coastguard Worker struct { 478*61046927SAndroid Build Coastguard Worker unsigned : 5; 479*61046927SAndroid Build Coastguard Worker unsigned rtz : 1; 480*61046927SAndroid Build Coastguard Worker unsigned : 2; 481*61046927SAndroid Build Coastguard Worker } PACKED; 482*61046927SAndroid Build Coastguard Worker } PACKED; 483*61046927SAndroid Build Coastguard Worker } PACKED upck; 484*61046927SAndroid Build Coastguard Worker 485*61046927SAndroid Build Coastguard Worker struct { 486*61046927SAndroid Build Coastguard Worker unsigned format : 5; 487*61046927SAndroid Build Coastguard Worker unsigned scale : 1; 488*61046927SAndroid Build Coastguard Worker unsigned rtz : 1; 489*61046927SAndroid Build Coastguard Worker unsigned prog : 1; 490*61046927SAndroid Build Coastguard Worker } PACKED pck; 491*61046927SAndroid Build Coastguard Worker } PACKED; 492*61046927SAndroid Build Coastguard Worker } PACKED rogue_single_pck_encoding; 493*61046927SAndroid Build Coastguard Worker static_assert(sizeof(rogue_single_pck_encoding) == 1, 494*61046927SAndroid Build Coastguard Worker "sizeof(rogue_single_pck_encoding) != 1"); 495*61046927SAndroid Build Coastguard Worker 496*61046927SAndroid Build Coastguard Worker enum pck_fmt { 497*61046927SAndroid Build Coastguard Worker PCK_FMT_U8888 = 0b00000, 498*61046927SAndroid Build Coastguard Worker PCK_FMT_S8888 = 0b00001, 499*61046927SAndroid Build Coastguard Worker PCK_FMT_O8888 = 0b00010, 500*61046927SAndroid Build Coastguard Worker PCK_FMT_U1616 = 0b00011, 501*61046927SAndroid Build Coastguard Worker PCK_FMT_S1616 = 0b00100, 502*61046927SAndroid Build Coastguard Worker PCK_FMT_O1616 = 0b00101, 503*61046927SAndroid Build Coastguard Worker PCK_FMT_U32 = 0b00110, 504*61046927SAndroid Build Coastguard Worker PCK_FMT_S32 = 0b00111, 505*61046927SAndroid Build Coastguard Worker PCK_FMT_U1010102 = 0b01000, 506*61046927SAndroid Build Coastguard Worker PCK_FMT_S1010102 = 0b01001, 507*61046927SAndroid Build Coastguard Worker PCK_FMT_U111110 = 0b01010, 508*61046927SAndroid Build Coastguard Worker PCK_FMT_S111110 = 0b01011, 509*61046927SAndroid Build Coastguard Worker PCK_FMT_F111110 = 0b01100, 510*61046927SAndroid Build Coastguard Worker PCK_FMT_F16F16 = 0b01110, 511*61046927SAndroid Build Coastguard Worker PCK_FMT_F32 = 0b01111, 512*61046927SAndroid Build Coastguard Worker PCK_FMT_COV = 0b10000, 513*61046927SAndroid Build Coastguard Worker PCK_FMT_U565U565 = 0b10001, 514*61046927SAndroid Build Coastguard Worker PCK_FMT_D24S8 = 0b10010, 515*61046927SAndroid Build Coastguard Worker PCK_FMT_S8D24 = 0b10011, 516*61046927SAndroid Build Coastguard Worker PCK_FMT_F32_MASK = 0b10100, 517*61046927SAndroid Build Coastguard Worker PCK_FMT_2F10F10F10 = 0b10101, 518*61046927SAndroid Build Coastguard Worker PCK_FMT_S8888OGL = 0b10110, 519*61046927SAndroid Build Coastguard Worker PCK_FMT_S1616OGL = 0b10111, 520*61046927SAndroid Build Coastguard Worker PCK_FMT_ZERO = 0b11110, 521*61046927SAndroid Build Coastguard Worker PCK_FMT_ONE = 0b11111, 522*61046927SAndroid Build Coastguard Worker }; 523*61046927SAndroid Build Coastguard Worker 524*61046927SAndroid Build Coastguard Worker typedef struct rogue_single_mbyp_encoding { 525*61046927SAndroid Build Coastguard Worker /* Byte 1 */ 526*61046927SAndroid Build Coastguard Worker struct { 527*61046927SAndroid Build Coastguard Worker unsigned s0abs : 1; 528*61046927SAndroid Build Coastguard Worker unsigned s0neg : 1; 529*61046927SAndroid Build Coastguard Worker unsigned : 6; 530*61046927SAndroid Build Coastguard Worker } PACKED; 531*61046927SAndroid Build Coastguard Worker } PACKED rogue_single_mbyp_encoding; 532*61046927SAndroid Build Coastguard Worker static_assert(sizeof(rogue_single_mbyp_encoding) == 1, 533*61046927SAndroid Build Coastguard Worker "sizeof(rogue_single_mbyp_encoding) != 1"); 534*61046927SAndroid Build Coastguard Worker 535*61046927SAndroid Build Coastguard Worker enum snglop { 536*61046927SAndroid Build Coastguard Worker SNGLOP_RCP = 0b0000, 537*61046927SAndroid Build Coastguard Worker SNGLOP_RSQ = 0b0001, 538*61046927SAndroid Build Coastguard Worker SNGLOP_LOG = 0b0010, 539*61046927SAndroid Build Coastguard Worker SNGLOP_EXP = 0b0011, 540*61046927SAndroid Build Coastguard Worker SNGLOP_F16SOP = 0b0100, 541*61046927SAndroid Build Coastguard Worker SNGLOP_LOGCN = 0b0101, 542*61046927SAndroid Build Coastguard Worker SNGLOP_GAMMA = 0b0110, 543*61046927SAndroid Build Coastguard Worker SNGLOP_BYP = 0b0111, 544*61046927SAndroid Build Coastguard Worker SNGLOP_DSX = 0b1000, 545*61046927SAndroid Build Coastguard Worker SNGLOP_DSY = 0b1001, 546*61046927SAndroid Build Coastguard Worker SNGLOP_DSXF = 0b1010, 547*61046927SAndroid Build Coastguard Worker SNGLOP_DSYF = 0b1011, 548*61046927SAndroid Build Coastguard Worker SNGLOP_PCK = 0b1100, 549*61046927SAndroid Build Coastguard Worker SNGLOP_RED = 0b1101, 550*61046927SAndroid Build Coastguard Worker SNGLOP_SINC = 0b1110, 551*61046927SAndroid Build Coastguard Worker SNGLOP_ARCTANC = 0b1111, 552*61046927SAndroid Build Coastguard Worker }; 553*61046927SAndroid Build Coastguard Worker 554*61046927SAndroid Build Coastguard Worker typedef struct rogue_alu_single_encoding { 555*61046927SAndroid Build Coastguard Worker /* Byte 0 */ 556*61046927SAndroid Build Coastguard Worker struct { 557*61046927SAndroid Build Coastguard Worker unsigned snglop : 4; 558*61046927SAndroid Build Coastguard Worker unsigned ext0 : 1; 559*61046927SAndroid Build Coastguard Worker unsigned : 3; 560*61046927SAndroid Build Coastguard Worker } PACKED; 561*61046927SAndroid Build Coastguard Worker 562*61046927SAndroid Build Coastguard Worker /* Byte 1+ */ 563*61046927SAndroid Build Coastguard Worker union { 564*61046927SAndroid Build Coastguard Worker rogue_single_mbyp_encoding mbyp; 565*61046927SAndroid Build Coastguard Worker rogue_single_pck_encoding pck; 566*61046927SAndroid Build Coastguard Worker } PACKED; 567*61046927SAndroid Build Coastguard Worker } PACKED rogue_alu_single_encoding; 568*61046927SAndroid Build Coastguard Worker static_assert(sizeof(rogue_alu_single_encoding) == 2, 569*61046927SAndroid Build Coastguard Worker "sizeof(rogue_alu_single_encoding) != 2"); 570*61046927SAndroid Build Coastguard Worker 571*61046927SAndroid Build Coastguard Worker typedef struct rogue_alu_fmad_encoding { 572*61046927SAndroid Build Coastguard Worker /* Byte 0 */ 573*61046927SAndroid Build Coastguard Worker struct { 574*61046927SAndroid Build Coastguard Worker unsigned sat : 1; 575*61046927SAndroid Build Coastguard Worker unsigned s2neg : 1; 576*61046927SAndroid Build Coastguard Worker unsigned s0abs : 1; 577*61046927SAndroid Build Coastguard Worker unsigned s0neg : 1; 578*61046927SAndroid Build Coastguard Worker unsigned ext : 1; 579*61046927SAndroid Build Coastguard Worker unsigned : 3; 580*61046927SAndroid Build Coastguard Worker } PACKED; 581*61046927SAndroid Build Coastguard Worker 582*61046927SAndroid Build Coastguard Worker /* Byte 1 */ 583*61046927SAndroid Build Coastguard Worker struct { 584*61046927SAndroid Build Coastguard Worker unsigned s2abs : 1; 585*61046927SAndroid Build Coastguard Worker unsigned s2flr : 1; 586*61046927SAndroid Build Coastguard Worker unsigned s1neg : 1; 587*61046927SAndroid Build Coastguard Worker unsigned s1abs : 1; 588*61046927SAndroid Build Coastguard Worker unsigned lp : 1; 589*61046927SAndroid Build Coastguard Worker unsigned : 3; 590*61046927SAndroid Build Coastguard Worker } PACKED; 591*61046927SAndroid Build Coastguard Worker } PACKED rogue_alu_fmad_encoding; 592*61046927SAndroid Build Coastguard Worker static_assert(sizeof(rogue_alu_fmad_encoding) == 2, 593*61046927SAndroid Build Coastguard Worker "sizeof(rogue_alu_fmad_encoding) != 2"); 594*61046927SAndroid Build Coastguard Worker 595*61046927SAndroid Build Coastguard Worker typedef struct rogue_alu_fdual_encoding { 596*61046927SAndroid Build Coastguard Worker /* Byte 0 */ 597*61046927SAndroid Build Coastguard Worker struct { 598*61046927SAndroid Build Coastguard Worker unsigned s0flr : 1; 599*61046927SAndroid Build Coastguard Worker unsigned s1abs : 1; 600*61046927SAndroid Build Coastguard Worker unsigned s0abs : 1; 601*61046927SAndroid Build Coastguard Worker unsigned s0neg : 1; 602*61046927SAndroid Build Coastguard Worker unsigned sat : 1; 603*61046927SAndroid Build Coastguard Worker unsigned lp : 1; 604*61046927SAndroid Build Coastguard Worker unsigned : 2; 605*61046927SAndroid Build Coastguard Worker } PACKED; 606*61046927SAndroid Build Coastguard Worker } PACKED rogue_alu_fdual_encoding; 607*61046927SAndroid Build Coastguard Worker static_assert(sizeof(rogue_alu_fdual_encoding) == 1, 608*61046927SAndroid Build Coastguard Worker "sizeof(rogue_alu_fdual_encoding) != 1"); 609*61046927SAndroid Build Coastguard Worker 610*61046927SAndroid Build Coastguard Worker typedef struct rogue_alu_tst_encoding { 611*61046927SAndroid Build Coastguard Worker /* Byte 0 */ 612*61046927SAndroid Build Coastguard Worker struct { 613*61046927SAndroid Build Coastguard Worker unsigned pwen : 1; 614*61046927SAndroid Build Coastguard Worker unsigned tstop_2_0 : 3; 615*61046927SAndroid Build Coastguard Worker unsigned ext : 1; 616*61046927SAndroid Build Coastguard Worker unsigned : 3; 617*61046927SAndroid Build Coastguard Worker } PACKED; 618*61046927SAndroid Build Coastguard Worker 619*61046927SAndroid Build Coastguard Worker /* Byte 1 */ 620*61046927SAndroid Build Coastguard Worker struct { 621*61046927SAndroid Build Coastguard Worker unsigned tstop_3 : 1; 622*61046927SAndroid Build Coastguard Worker unsigned : 1; 623*61046927SAndroid Build Coastguard Worker unsigned elem : 2; 624*61046927SAndroid Build Coastguard Worker unsigned p2end : 1; 625*61046927SAndroid Build Coastguard Worker unsigned type : 3; 626*61046927SAndroid Build Coastguard Worker } PACKED; 627*61046927SAndroid Build Coastguard Worker } PACKED rogue_alu_tst_encoding; 628*61046927SAndroid Build Coastguard Worker static_assert(sizeof(rogue_alu_tst_encoding) == 2, 629*61046927SAndroid Build Coastguard Worker "sizeof(rogue_alu_tst_encoding) != 2"); 630*61046927SAndroid Build Coastguard Worker 631*61046927SAndroid Build Coastguard Worker typedef struct rogue_tstop { 632*61046927SAndroid Build Coastguard Worker union { 633*61046927SAndroid Build Coastguard Worker struct { 634*61046927SAndroid Build Coastguard Worker unsigned _2_0 : 3; 635*61046927SAndroid Build Coastguard Worker unsigned _3 : 1; 636*61046927SAndroid Build Coastguard Worker unsigned : 4; 637*61046927SAndroid Build Coastguard Worker } PACKED; 638*61046927SAndroid Build Coastguard Worker 639*61046927SAndroid Build Coastguard Worker uint8_t _; 640*61046927SAndroid Build Coastguard Worker } PACKED; 641*61046927SAndroid Build Coastguard Worker } PACKED rogue_tstop; 642*61046927SAndroid Build Coastguard Worker static_assert(sizeof(rogue_tstop) == 1, "sizeof(rogue_tstop) != 1"); 643*61046927SAndroid Build Coastguard Worker 644*61046927SAndroid Build Coastguard Worker enum tstop { 645*61046927SAndroid Build Coastguard Worker TSTOP_Z = 0b0000, 646*61046927SAndroid Build Coastguard Worker TSTOP_GZ = 0b0001, 647*61046927SAndroid Build Coastguard Worker TSTOP_GEZ = 0b0010, 648*61046927SAndroid Build Coastguard Worker TSTOP_C = 0b0011, 649*61046927SAndroid Build Coastguard Worker TSTOP_E = 0b0100, 650*61046927SAndroid Build Coastguard Worker TSTOP_G = 0b0101, 651*61046927SAndroid Build Coastguard Worker TSTOP_GE = 0b0110, 652*61046927SAndroid Build Coastguard Worker TSTOP_NE = 0b0111, 653*61046927SAndroid Build Coastguard Worker TSTOP_L = 0b1000, 654*61046927SAndroid Build Coastguard Worker TSTOP_LE = 0b1001, 655*61046927SAndroid Build Coastguard Worker }; 656*61046927SAndroid Build Coastguard Worker 657*61046927SAndroid Build Coastguard Worker enum tsttype { 658*61046927SAndroid Build Coastguard Worker TSTTYPE_F32 = 0b000, 659*61046927SAndroid Build Coastguard Worker TSTTYPE_U16 = 0b001, 660*61046927SAndroid Build Coastguard Worker TSTTYPE_S16 = 0b010, 661*61046927SAndroid Build Coastguard Worker TSTTYPE_U8 = 0b011, 662*61046927SAndroid Build Coastguard Worker TSTTYPE_S8 = 0b100, 663*61046927SAndroid Build Coastguard Worker TSTTYPE_U32 = 0b101, 664*61046927SAndroid Build Coastguard Worker TSTTYPE_S32 = 0b110, 665*61046927SAndroid Build Coastguard Worker }; 666*61046927SAndroid Build Coastguard Worker 667*61046927SAndroid Build Coastguard Worker enum tstelem { 668*61046927SAndroid Build Coastguard Worker TST_E0 = 0b00, 669*61046927SAndroid Build Coastguard Worker TST_E1 = 0b01, 670*61046927SAndroid Build Coastguard Worker TST_E2 = 0b10, 671*61046927SAndroid Build Coastguard Worker TST_E3 = 0b11, 672*61046927SAndroid Build Coastguard Worker }; 673*61046927SAndroid Build Coastguard Worker 674*61046927SAndroid Build Coastguard Worker typedef struct rogue_alu_movc_encoding { 675*61046927SAndroid Build Coastguard Worker /* Byte 0 */ 676*61046927SAndroid Build Coastguard Worker struct { 677*61046927SAndroid Build Coastguard Worker unsigned movw0 : 2; 678*61046927SAndroid Build Coastguard Worker unsigned movw1 : 2; 679*61046927SAndroid Build Coastguard Worker unsigned ext : 1; 680*61046927SAndroid Build Coastguard Worker unsigned : 3; 681*61046927SAndroid Build Coastguard Worker } PACKED; 682*61046927SAndroid Build Coastguard Worker 683*61046927SAndroid Build Coastguard Worker /* Byte 1 */ 684*61046927SAndroid Build Coastguard Worker struct { 685*61046927SAndroid Build Coastguard Worker unsigned p2end : 1; 686*61046927SAndroid Build Coastguard Worker unsigned aw : 1; 687*61046927SAndroid Build Coastguard Worker unsigned maskw0 : 4; 688*61046927SAndroid Build Coastguard Worker unsigned : 2; 689*61046927SAndroid Build Coastguard Worker } PACKED; 690*61046927SAndroid Build Coastguard Worker } PACKED rogue_alu_movc_encoding; 691*61046927SAndroid Build Coastguard Worker static_assert(sizeof(rogue_alu_movc_encoding) == 2, 692*61046927SAndroid Build Coastguard Worker "sizeof(rogue_alu_movc_encoding) != 2"); 693*61046927SAndroid Build Coastguard Worker 694*61046927SAndroid Build Coastguard Worker enum movw { 695*61046927SAndroid Build Coastguard Worker MOVW_FT0 = 0b00, 696*61046927SAndroid Build Coastguard Worker MOVW_FT1 = 0b01, 697*61046927SAndroid Build Coastguard Worker MOVW_FT2 = 0b10, 698*61046927SAndroid Build Coastguard Worker MOVW_FTE = 0b11, 699*61046927SAndroid Build Coastguard Worker }; 700*61046927SAndroid Build Coastguard Worker 701*61046927SAndroid Build Coastguard Worker enum maskw0 { 702*61046927SAndroid Build Coastguard Worker MASKW0_E0 = 0b0001, 703*61046927SAndroid Build Coastguard Worker MASKW0_E1 = 0b0010, 704*61046927SAndroid Build Coastguard Worker MASKW0_E2 = 0b0100, 705*61046927SAndroid Build Coastguard Worker MASKW0_E3 = 0b1000, 706*61046927SAndroid Build Coastguard Worker MASKW0_EALL = 0b1111, 707*61046927SAndroid Build Coastguard Worker }; 708*61046927SAndroid Build Coastguard Worker 709*61046927SAndroid Build Coastguard Worker typedef struct rogue_alu_int32_64_encoding { 710*61046927SAndroid Build Coastguard Worker /* Byte 0 */ 711*61046927SAndroid Build Coastguard Worker struct { 712*61046927SAndroid Build Coastguard Worker unsigned int32_64_op : 2; 713*61046927SAndroid Build Coastguard Worker unsigned s2neg : 1; 714*61046927SAndroid Build Coastguard Worker unsigned s : 1; 715*61046927SAndroid Build Coastguard Worker unsigned ext : 1; 716*61046927SAndroid Build Coastguard Worker unsigned : 3; 717*61046927SAndroid Build Coastguard Worker } PACKED; 718*61046927SAndroid Build Coastguard Worker 719*61046927SAndroid Build Coastguard Worker /* Byte 1 */ 720*61046927SAndroid Build Coastguard Worker struct { 721*61046927SAndroid Build Coastguard Worker unsigned s2abs : 1; 722*61046927SAndroid Build Coastguard Worker unsigned s1abs : 1; 723*61046927SAndroid Build Coastguard Worker unsigned s0abs : 1; 724*61046927SAndroid Build Coastguard Worker unsigned : 1; 725*61046927SAndroid Build Coastguard Worker unsigned s0neg : 1; 726*61046927SAndroid Build Coastguard Worker unsigned s1neg : 1; 727*61046927SAndroid Build Coastguard Worker unsigned cin : 1; 728*61046927SAndroid Build Coastguard Worker unsigned : 1; 729*61046927SAndroid Build Coastguard Worker } PACKED; 730*61046927SAndroid Build Coastguard Worker } PACKED rogue_alu_int32_64_encoding; 731*61046927SAndroid Build Coastguard Worker static_assert(sizeof(rogue_alu_int32_64_encoding) == 2, 732*61046927SAndroid Build Coastguard Worker "sizeof(rogue_alu_int32_64_encoding) != 2"); 733*61046927SAndroid Build Coastguard Worker 734*61046927SAndroid Build Coastguard Worker enum int32_64_op { 735*61046927SAndroid Build Coastguard Worker INT32_64_OP_ADD6432 = 0b00, 736*61046927SAndroid Build Coastguard Worker /* No multiply or extension, only valid when s=0. */ 737*61046927SAndroid Build Coastguard Worker INT32_64_OP_ADD64_NMX = 0b01, 738*61046927SAndroid Build Coastguard Worker INT32_64_OP_MADD32 = 0b10, 739*61046927SAndroid Build Coastguard Worker INT32_64_OP_MADD64 = 0b11, 740*61046927SAndroid Build Coastguard Worker }; 741*61046927SAndroid Build Coastguard Worker typedef struct rogue_alu_instr_encoding { 742*61046927SAndroid Build Coastguard Worker union { 743*61046927SAndroid Build Coastguard Worker /* Byte 0 */ 744*61046927SAndroid Build Coastguard Worker struct { 745*61046927SAndroid Build Coastguard Worker unsigned : 5; 746*61046927SAndroid Build Coastguard Worker unsigned op : 3; 747*61046927SAndroid Build Coastguard Worker } PACKED; 748*61046927SAndroid Build Coastguard Worker 749*61046927SAndroid Build Coastguard Worker /* Bytes 1+ */ 750*61046927SAndroid Build Coastguard Worker rogue_alu_single_encoding sngl; 751*61046927SAndroid Build Coastguard Worker rogue_alu_fdual_encoding fadd; 752*61046927SAndroid Build Coastguard Worker rogue_alu_fdual_encoding fmul; 753*61046927SAndroid Build Coastguard Worker rogue_alu_fmad_encoding fmad; 754*61046927SAndroid Build Coastguard Worker rogue_alu_tst_encoding tst; 755*61046927SAndroid Build Coastguard Worker rogue_alu_movc_encoding movc; 756*61046927SAndroid Build Coastguard Worker rogue_alu_int32_64_encoding int32_64; 757*61046927SAndroid Build Coastguard Worker } PACKED; 758*61046927SAndroid Build Coastguard Worker } PACKED rogue_alu_instr_encoding; 759*61046927SAndroid Build Coastguard Worker static_assert(sizeof(rogue_alu_instr_encoding) == 2, 760*61046927SAndroid Build Coastguard Worker "sizeof(rogue_alu_instr_encoding) != 2"); 761*61046927SAndroid Build Coastguard Worker 762*61046927SAndroid Build Coastguard Worker enum aluop { 763*61046927SAndroid Build Coastguard Worker ALUOP_FADD = 0b000, /** Phase 0, 1. */ 764*61046927SAndroid Build Coastguard Worker ALUOP_FMUL = 0b010, /** Phase 0, 1. */ 765*61046927SAndroid Build Coastguard Worker ALUOP_SNGL = 0b100, /** Phase 0, 1, 2. */ 766*61046927SAndroid Build Coastguard Worker ALUOP_INT8_16 = 0b101, /** Phase 0. */ 767*61046927SAndroid Build Coastguard Worker ALUOP_FMAD = 0b110, /** Phase 0, 1. */ 768*61046927SAndroid Build Coastguard Worker ALUOP_MOVC = 0b110, /** Phase 2. */ 769*61046927SAndroid Build Coastguard Worker ALUOP_INT32_64 = 0b111, /** Phase 0. */ 770*61046927SAndroid Build Coastguard Worker ALUOP_TST = 0b111, /** Phase 2. */ 771*61046927SAndroid Build Coastguard Worker }; 772*61046927SAndroid Build Coastguard Worker 773*61046927SAndroid Build Coastguard Worker /* Backend instructions. */ 774*61046927SAndroid Build Coastguard Worker 775*61046927SAndroid Build Coastguard Worker typedef struct rogue_backend_emitpix_encoding { 776*61046927SAndroid Build Coastguard Worker /* Byte 0 */ 777*61046927SAndroid Build Coastguard Worker struct { 778*61046927SAndroid Build Coastguard Worker unsigned : 1; 779*61046927SAndroid Build Coastguard Worker unsigned freep : 1; 780*61046927SAndroid Build Coastguard Worker unsigned : 6; 781*61046927SAndroid Build Coastguard Worker } PACKED; 782*61046927SAndroid Build Coastguard Worker } PACKED rogue_backend_emitpix_encoding; 783*61046927SAndroid Build Coastguard Worker static_assert(sizeof(rogue_backend_emitpix_encoding) == 1, 784*61046927SAndroid Build Coastguard Worker "sizeof(rogue_backend_emitpix_encoding) != 1"); 785*61046927SAndroid Build Coastguard Worker 786*61046927SAndroid Build Coastguard Worker typedef struct rogue_backend_fitr_encoding { 787*61046927SAndroid Build Coastguard Worker /* Byte 0 */ 788*61046927SAndroid Build Coastguard Worker struct { 789*61046927SAndroid Build Coastguard Worker unsigned mode : 2; 790*61046927SAndroid Build Coastguard Worker unsigned : 1; 791*61046927SAndroid Build Coastguard Worker unsigned drc : 1; 792*61046927SAndroid Build Coastguard Worker unsigned p : 1; 793*61046927SAndroid Build Coastguard Worker unsigned : 3; 794*61046927SAndroid Build Coastguard Worker } PACKED; 795*61046927SAndroid Build Coastguard Worker 796*61046927SAndroid Build Coastguard Worker /* Byte 1 */ 797*61046927SAndroid Build Coastguard Worker struct { 798*61046927SAndroid Build Coastguard Worker unsigned count : 4; 799*61046927SAndroid Build Coastguard Worker unsigned sat : 1; 800*61046927SAndroid Build Coastguard Worker unsigned : 3; 801*61046927SAndroid Build Coastguard Worker } PACKED; 802*61046927SAndroid Build Coastguard Worker } PACKED rogue_backend_fitr_encoding; 803*61046927SAndroid Build Coastguard Worker static_assert(sizeof(rogue_backend_fitr_encoding) == 2, 804*61046927SAndroid Build Coastguard Worker "sizeof(rogue_backend_fitr_encoding) != 2"); 805*61046927SAndroid Build Coastguard Worker 806*61046927SAndroid Build Coastguard Worker enum fitr_mode { 807*61046927SAndroid Build Coastguard Worker FITR_MODE_PIXEL = 0b00, 808*61046927SAndroid Build Coastguard Worker FITR_MODE_SAMPLE = 0b01, 809*61046927SAndroid Build Coastguard Worker FITR_MODE_CENTROID = 0b10, 810*61046927SAndroid Build Coastguard Worker }; 811*61046927SAndroid Build Coastguard Worker 812*61046927SAndroid Build Coastguard Worker typedef struct rogue_backend_uvsw_encoding { 813*61046927SAndroid Build Coastguard Worker /* Byte 0 */ 814*61046927SAndroid Build Coastguard Worker struct { 815*61046927SAndroid Build Coastguard Worker unsigned writeop : 3; 816*61046927SAndroid Build Coastguard Worker unsigned imm : 1; 817*61046927SAndroid Build Coastguard Worker unsigned dsel : 1; 818*61046927SAndroid Build Coastguard Worker unsigned : 3; 819*61046927SAndroid Build Coastguard Worker } PACKED; 820*61046927SAndroid Build Coastguard Worker 821*61046927SAndroid Build Coastguard Worker /* Byte 1 */ 822*61046927SAndroid Build Coastguard Worker union { 823*61046927SAndroid Build Coastguard Worker struct { 824*61046927SAndroid Build Coastguard Worker unsigned srcsel : 3; 825*61046927SAndroid Build Coastguard Worker unsigned : 5; 826*61046927SAndroid Build Coastguard Worker } PACKED src; 827*61046927SAndroid Build Coastguard Worker 828*61046927SAndroid Build Coastguard Worker struct { 829*61046927SAndroid Build Coastguard Worker unsigned imm_addr : 8; 830*61046927SAndroid Build Coastguard Worker } PACKED imm_src; 831*61046927SAndroid Build Coastguard Worker 832*61046927SAndroid Build Coastguard Worker struct { 833*61046927SAndroid Build Coastguard Worker unsigned streamid : 2; 834*61046927SAndroid Build Coastguard Worker unsigned : 6; 835*61046927SAndroid Build Coastguard Worker } PACKED stream_src; 836*61046927SAndroid Build Coastguard Worker } PACKED; 837*61046927SAndroid Build Coastguard Worker } PACKED rogue_backend_uvsw_encoding; 838*61046927SAndroid Build Coastguard Worker static_assert(sizeof(rogue_backend_uvsw_encoding) == 2, 839*61046927SAndroid Build Coastguard Worker "sizeof(rogue_backend_uvsw_encoding) != 2"); 840*61046927SAndroid Build Coastguard Worker 841*61046927SAndroid Build Coastguard Worker enum uvsw_writeop { 842*61046927SAndroid Build Coastguard Worker UVSW_WRITEOP_WRITE = 0b000, 843*61046927SAndroid Build Coastguard Worker UVSW_WRITEOP_EMIT = 0b001, 844*61046927SAndroid Build Coastguard Worker UVSW_WRITEOP_CUT = 0b010, 845*61046927SAndroid Build Coastguard Worker UVSW_WRITEOP_EMIT_CUT = 0b011, 846*61046927SAndroid Build Coastguard Worker UVSW_WRITEOP_END = 0b100, 847*61046927SAndroid Build Coastguard Worker UVSW_WRITEOP_EMIT_END = 0b101, 848*61046927SAndroid Build Coastguard Worker UVSW_WRITEOP_WRITE_EMIT_END = 0b110, 849*61046927SAndroid Build Coastguard Worker }; 850*61046927SAndroid Build Coastguard Worker 851*61046927SAndroid Build Coastguard Worker typedef struct rogue_burstlen { 852*61046927SAndroid Build Coastguard Worker union { 853*61046927SAndroid Build Coastguard Worker struct { 854*61046927SAndroid Build Coastguard Worker unsigned _2_0 : 3; 855*61046927SAndroid Build Coastguard Worker unsigned _3 : 1; 856*61046927SAndroid Build Coastguard Worker unsigned : 4; 857*61046927SAndroid Build Coastguard Worker } PACKED; 858*61046927SAndroid Build Coastguard Worker 859*61046927SAndroid Build Coastguard Worker uint8_t _; 860*61046927SAndroid Build Coastguard Worker } PACKED; 861*61046927SAndroid Build Coastguard Worker } PACKED rogue_burstlen; 862*61046927SAndroid Build Coastguard Worker static_assert(sizeof(rogue_burstlen) == 1, "sizeof(rogue_burstlen) != 1"); 863*61046927SAndroid Build Coastguard Worker 864*61046927SAndroid Build Coastguard Worker typedef struct rogue_backend_dma_ld_encoding { 865*61046927SAndroid Build Coastguard Worker /* Byte 0 */ 866*61046927SAndroid Build Coastguard Worker struct { 867*61046927SAndroid Build Coastguard Worker unsigned : 3; 868*61046927SAndroid Build Coastguard Worker unsigned drc : 1; 869*61046927SAndroid Build Coastguard Worker unsigned ext : 1; 870*61046927SAndroid Build Coastguard Worker unsigned : 3; 871*61046927SAndroid Build Coastguard Worker } PACKED; 872*61046927SAndroid Build Coastguard Worker 873*61046927SAndroid Build Coastguard Worker /* Byte 1 */ 874*61046927SAndroid Build Coastguard Worker union { 875*61046927SAndroid Build Coastguard Worker struct { 876*61046927SAndroid Build Coastguard Worker unsigned cachemode : 2; 877*61046927SAndroid Build Coastguard Worker unsigned burstlen_2_0 : 3; 878*61046927SAndroid Build Coastguard Worker unsigned srcseladd : 3; 879*61046927SAndroid Build Coastguard Worker } PACKED; 880*61046927SAndroid Build Coastguard Worker 881*61046927SAndroid Build Coastguard Worker struct { 882*61046927SAndroid Build Coastguard Worker unsigned : 2; 883*61046927SAndroid Build Coastguard Worker unsigned srcselbl : 3; 884*61046927SAndroid Build Coastguard Worker unsigned : 3; 885*61046927SAndroid Build Coastguard Worker } PACKED; 886*61046927SAndroid Build Coastguard Worker } PACKED; 887*61046927SAndroid Build Coastguard Worker 888*61046927SAndroid Build Coastguard Worker /* Byte 2 */ 889*61046927SAndroid Build Coastguard Worker struct { 890*61046927SAndroid Build Coastguard Worker unsigned burstlen_3 : 1; 891*61046927SAndroid Build Coastguard Worker unsigned slccachemode : 2; 892*61046927SAndroid Build Coastguard Worker unsigned notimmbl : 1; /* N.B. default is 1 if ext = 0. */ 893*61046927SAndroid Build Coastguard Worker unsigned : 4; 894*61046927SAndroid Build Coastguard Worker } PACKED; 895*61046927SAndroid Build Coastguard Worker } PACKED rogue_backend_dma_ld_encoding; 896*61046927SAndroid Build Coastguard Worker static_assert(sizeof(rogue_backend_dma_ld_encoding) == 3, 897*61046927SAndroid Build Coastguard Worker "sizeof(rogue_backend_dma_ld_encoding) != 3"); 898*61046927SAndroid Build Coastguard Worker 899*61046927SAndroid Build Coastguard Worker enum cachemode_ld { 900*61046927SAndroid Build Coastguard Worker CACHEMODE_LD_NORMAL = 0b00, 901*61046927SAndroid Build Coastguard Worker CACHEMODE_LD_BYPASS = 0b01, 902*61046927SAndroid Build Coastguard Worker CACHEMODE_LD_FORCE_LINE_FILL = 0b10, 903*61046927SAndroid Build Coastguard Worker }; 904*61046927SAndroid Build Coastguard Worker 905*61046927SAndroid Build Coastguard Worker typedef struct rogue_backend_dma_st_encoding { 906*61046927SAndroid Build Coastguard Worker /* Byte 0 */ 907*61046927SAndroid Build Coastguard Worker struct { 908*61046927SAndroid Build Coastguard Worker unsigned : 3; 909*61046927SAndroid Build Coastguard Worker unsigned drc : 1; 910*61046927SAndroid Build Coastguard Worker unsigned immbl : 1; 911*61046927SAndroid Build Coastguard Worker unsigned : 3; 912*61046927SAndroid Build Coastguard Worker } PACKED; 913*61046927SAndroid Build Coastguard Worker 914*61046927SAndroid Build Coastguard Worker /* Byte 1 */ 915*61046927SAndroid Build Coastguard Worker union { 916*61046927SAndroid Build Coastguard Worker struct { 917*61046927SAndroid Build Coastguard Worker unsigned cachemode : 2; 918*61046927SAndroid Build Coastguard Worker unsigned burstlen_2_0 : 3; 919*61046927SAndroid Build Coastguard Worker unsigned srcseladd : 3; 920*61046927SAndroid Build Coastguard Worker } PACKED; 921*61046927SAndroid Build Coastguard Worker 922*61046927SAndroid Build Coastguard Worker struct { 923*61046927SAndroid Build Coastguard Worker unsigned : 2; 924*61046927SAndroid Build Coastguard Worker unsigned srcselbl : 3; 925*61046927SAndroid Build Coastguard Worker unsigned : 3; 926*61046927SAndroid Build Coastguard Worker } PACKED; 927*61046927SAndroid Build Coastguard Worker } PACKED; 928*61046927SAndroid Build Coastguard Worker 929*61046927SAndroid Build Coastguard Worker /* Byte 2 */ 930*61046927SAndroid Build Coastguard Worker struct { 931*61046927SAndroid Build Coastguard Worker unsigned burstlen_3 : 1; 932*61046927SAndroid Build Coastguard Worker unsigned : 1; 933*61046927SAndroid Build Coastguard Worker unsigned dsize : 2; 934*61046927SAndroid Build Coastguard Worker unsigned srcseldata : 3; 935*61046927SAndroid Build Coastguard Worker unsigned ext : 1; 936*61046927SAndroid Build Coastguard Worker } PACKED; 937*61046927SAndroid Build Coastguard Worker 938*61046927SAndroid Build Coastguard Worker /* Byte 3 */ 939*61046927SAndroid Build Coastguard Worker struct { 940*61046927SAndroid Build Coastguard Worker unsigned srcmask : 3; 941*61046927SAndroid Build Coastguard Worker unsigned slccachemode : 2; 942*61046927SAndroid Build Coastguard Worker unsigned nottiled : 1; /* N.B. default is 1 if ext = 0. */ 943*61046927SAndroid Build Coastguard Worker unsigned : 2; 944*61046927SAndroid Build Coastguard Worker } PACKED; 945*61046927SAndroid Build Coastguard Worker } PACKED rogue_backend_dma_st_encoding; 946*61046927SAndroid Build Coastguard Worker static_assert(sizeof(rogue_backend_dma_st_encoding) == 4, 947*61046927SAndroid Build Coastguard Worker "sizeof(rogue_backend_dma_st_encoding) != 4"); 948*61046927SAndroid Build Coastguard Worker 949*61046927SAndroid Build Coastguard Worker enum dsize { 950*61046927SAndroid Build Coastguard Worker DSIZE_8 = 0b00, 951*61046927SAndroid Build Coastguard Worker DSIZE_16 = 0b01, 952*61046927SAndroid Build Coastguard Worker DSIZE_BURSTLEN = 0b10, 953*61046927SAndroid Build Coastguard Worker }; 954*61046927SAndroid Build Coastguard Worker 955*61046927SAndroid Build Coastguard Worker enum cachemode_st { 956*61046927SAndroid Build Coastguard Worker CACHEMODE_ST_WRITE_THROUGH = 0b00, 957*61046927SAndroid Build Coastguard Worker CACHEMODE_ST_WRITE_BACK = 0b01, 958*61046927SAndroid Build Coastguard Worker CACHEMODE_ST_WRITE_BACK_LAZY = 0b10, 959*61046927SAndroid Build Coastguard Worker }; 960*61046927SAndroid Build Coastguard Worker 961*61046927SAndroid Build Coastguard Worker enum slccachemode { 962*61046927SAndroid Build Coastguard Worker SLCCACHEMODE_BYPASS = 0b00, 963*61046927SAndroid Build Coastguard Worker SLCCACHEMODE_WRITE_BACK = 0b01, 964*61046927SAndroid Build Coastguard Worker SLCCACHEMODE_WRITE_THROUGH = 0b10, 965*61046927SAndroid Build Coastguard Worker SLCCACHEMODE_CACHED_READS = 0b11, 966*61046927SAndroid Build Coastguard Worker }; 967*61046927SAndroid Build Coastguard Worker 968*61046927SAndroid Build Coastguard Worker typedef struct rogue_backend_dma_smp_encoding { 969*61046927SAndroid Build Coastguard Worker /* Byte 0 */ 970*61046927SAndroid Build Coastguard Worker struct { 971*61046927SAndroid Build Coastguard Worker unsigned : 3; 972*61046927SAndroid Build Coastguard Worker unsigned drc : 1; 973*61046927SAndroid Build Coastguard Worker unsigned fcnorm : 1; 974*61046927SAndroid Build Coastguard Worker unsigned : 3; 975*61046927SAndroid Build Coastguard Worker } PACKED; 976*61046927SAndroid Build Coastguard Worker 977*61046927SAndroid Build Coastguard Worker /* Byte 1 */ 978*61046927SAndroid Build Coastguard Worker struct { 979*61046927SAndroid Build Coastguard Worker unsigned lodm : 2; 980*61046927SAndroid Build Coastguard Worker unsigned chan : 2; 981*61046927SAndroid Build Coastguard Worker unsigned exta : 1; 982*61046927SAndroid Build Coastguard Worker unsigned dmn : 2; 983*61046927SAndroid Build Coastguard Worker unsigned extb : 1; 984*61046927SAndroid Build Coastguard Worker } PACKED; 985*61046927SAndroid Build Coastguard Worker 986*61046927SAndroid Build Coastguard Worker /* Byte 2 */ 987*61046927SAndroid Build Coastguard Worker struct { 988*61046927SAndroid Build Coastguard Worker unsigned tao : 1; 989*61046927SAndroid Build Coastguard Worker unsigned soo : 1; 990*61046927SAndroid Build Coastguard Worker unsigned sno : 1; 991*61046927SAndroid Build Coastguard Worker unsigned nncoords : 1; 992*61046927SAndroid Build Coastguard Worker unsigned sbmode : 2; 993*61046927SAndroid Build Coastguard Worker unsigned proj : 1; 994*61046927SAndroid Build Coastguard Worker unsigned pplod : 1; 995*61046927SAndroid Build Coastguard Worker } PACKED; 996*61046927SAndroid Build Coastguard Worker 997*61046927SAndroid Build Coastguard Worker /* Byte 3 */ 998*61046927SAndroid Build Coastguard Worker struct { 999*61046927SAndroid Build Coastguard Worker unsigned w : 1; 1000*61046927SAndroid Build Coastguard Worker unsigned cachemode : 2; 1001*61046927SAndroid Build Coastguard Worker unsigned swap : 1; 1002*61046927SAndroid Build Coastguard Worker unsigned f16 : 1; 1003*61046927SAndroid Build Coastguard Worker unsigned slccachemode : 2; 1004*61046927SAndroid Build Coastguard Worker unsigned extc : 1; 1005*61046927SAndroid Build Coastguard Worker } PACKED; 1006*61046927SAndroid Build Coastguard Worker 1007*61046927SAndroid Build Coastguard Worker /* Byte 4 */ 1008*61046927SAndroid Build Coastguard Worker struct { 1009*61046927SAndroid Build Coastguard Worker unsigned array : 1; 1010*61046927SAndroid Build Coastguard Worker unsigned : 7; 1011*61046927SAndroid Build Coastguard Worker } PACKED; 1012*61046927SAndroid Build Coastguard Worker } PACKED rogue_backend_dma_smp_encoding; 1013*61046927SAndroid Build Coastguard Worker static_assert(sizeof(rogue_backend_dma_smp_encoding) == 5, 1014*61046927SAndroid Build Coastguard Worker "sizeof(rogue_backend_dma_smp_encoding) != 5"); 1015*61046927SAndroid Build Coastguard Worker 1016*61046927SAndroid Build Coastguard Worker enum fcnorm { 1017*61046927SAndroid Build Coastguard Worker FCNORM_INT_NOCONVFP = 0, 1018*61046927SAndroid Build Coastguard Worker FCNORM_FIXED_CONVFP = 1, 1019*61046927SAndroid Build Coastguard Worker }; 1020*61046927SAndroid Build Coastguard Worker 1021*61046927SAndroid Build Coastguard Worker enum lodm { 1022*61046927SAndroid Build Coastguard Worker LODM_NORMAL = 0b00, 1023*61046927SAndroid Build Coastguard Worker LODM_BIAS = 0b01, 1024*61046927SAndroid Build Coastguard Worker LODM_REPLACE = 0b10, 1025*61046927SAndroid Build Coastguard Worker LODM_GRADIENTS = 0b11, 1026*61046927SAndroid Build Coastguard Worker }; 1027*61046927SAndroid Build Coastguard Worker 1028*61046927SAndroid Build Coastguard Worker enum smpchan { 1029*61046927SAndroid Build Coastguard Worker SMPCHAN_1 = 0b00, 1030*61046927SAndroid Build Coastguard Worker SMPCHAN_2 = 0b01, 1031*61046927SAndroid Build Coastguard Worker SMPCHAN_3 = 0b10, 1032*61046927SAndroid Build Coastguard Worker SMPCHAN_4 = 0b11, 1033*61046927SAndroid Build Coastguard Worker }; 1034*61046927SAndroid Build Coastguard Worker 1035*61046927SAndroid Build Coastguard Worker enum dmn { 1036*61046927SAndroid Build Coastguard Worker DMN_1D = 0b01, 1037*61046927SAndroid Build Coastguard Worker DMN_2D = 0b10, 1038*61046927SAndroid Build Coastguard Worker DMN_3D = 0b11, 1039*61046927SAndroid Build Coastguard Worker }; 1040*61046927SAndroid Build Coastguard Worker 1041*61046927SAndroid Build Coastguard Worker enum sbmode { 1042*61046927SAndroid Build Coastguard Worker SBMODE_NONE = 0b00, 1043*61046927SAndroid Build Coastguard Worker SBMODE_DATA = 0b01, 1044*61046927SAndroid Build Coastguard Worker SBMODE_INFO = 0b10, 1045*61046927SAndroid Build Coastguard Worker SBMODE_BOTH = 0b11, 1046*61046927SAndroid Build Coastguard Worker }; 1047*61046927SAndroid Build Coastguard Worker 1048*61046927SAndroid Build Coastguard Worker typedef struct rogue_backend_dma_idf_encoding { 1049*61046927SAndroid Build Coastguard Worker /* Byte 0 */ 1050*61046927SAndroid Build Coastguard Worker struct { 1051*61046927SAndroid Build Coastguard Worker unsigned : 3; 1052*61046927SAndroid Build Coastguard Worker unsigned drc : 1; 1053*61046927SAndroid Build Coastguard Worker unsigned : 4; 1054*61046927SAndroid Build Coastguard Worker } PACKED; 1055*61046927SAndroid Build Coastguard Worker 1056*61046927SAndroid Build Coastguard Worker /* Byte 1 */ 1057*61046927SAndroid Build Coastguard Worker struct { 1058*61046927SAndroid Build Coastguard Worker unsigned srcseladd : 3; 1059*61046927SAndroid Build Coastguard Worker unsigned : 5; 1060*61046927SAndroid Build Coastguard Worker } PACKED; 1061*61046927SAndroid Build Coastguard Worker } PACKED rogue_backend_dma_idf_encoding; 1062*61046927SAndroid Build Coastguard Worker static_assert(sizeof(rogue_backend_dma_idf_encoding) == 2, 1063*61046927SAndroid Build Coastguard Worker "sizeof(rogue_backend_dma_idf_encoding) != 2"); 1064*61046927SAndroid Build Coastguard Worker 1065*61046927SAndroid Build Coastguard Worker typedef struct rogue_backend_dma_encoding { 1066*61046927SAndroid Build Coastguard Worker union { 1067*61046927SAndroid Build Coastguard Worker /* Byte 0 */ 1068*61046927SAndroid Build Coastguard Worker struct { 1069*61046927SAndroid Build Coastguard Worker unsigned dmaop : 3; 1070*61046927SAndroid Build Coastguard Worker unsigned : 5; 1071*61046927SAndroid Build Coastguard Worker } PACKED; 1072*61046927SAndroid Build Coastguard Worker 1073*61046927SAndroid Build Coastguard Worker rogue_backend_dma_smp_encoding smp; 1074*61046927SAndroid Build Coastguard Worker rogue_backend_dma_idf_encoding idf; 1075*61046927SAndroid Build Coastguard Worker rogue_backend_dma_ld_encoding ld; 1076*61046927SAndroid Build Coastguard Worker rogue_backend_dma_st_encoding st; 1077*61046927SAndroid Build Coastguard Worker } PACKED; 1078*61046927SAndroid Build Coastguard Worker } PACKED rogue_backend_dma_encoding; 1079*61046927SAndroid Build Coastguard Worker static_assert(sizeof(rogue_backend_dma_encoding) == 5, 1080*61046927SAndroid Build Coastguard Worker "sizeof(rogue_backend_dma_encoding) != 5"); 1081*61046927SAndroid Build Coastguard Worker 1082*61046927SAndroid Build Coastguard Worker enum dmaop { 1083*61046927SAndroid Build Coastguard Worker DMAOP_IDF = 0b000, 1084*61046927SAndroid Build Coastguard Worker DMAOP_LD = 0b001, 1085*61046927SAndroid Build Coastguard Worker DMAOP_ST = 0b010, 1086*61046927SAndroid Build Coastguard Worker DMAOP_SMP = 0b100, 1087*61046927SAndroid Build Coastguard Worker DMAOP_ATOMIC = 0b101, 1088*61046927SAndroid Build Coastguard Worker }; 1089*61046927SAndroid Build Coastguard Worker 1090*61046927SAndroid Build Coastguard Worker typedef struct rogue_backend_instr_encoding { 1091*61046927SAndroid Build Coastguard Worker union { 1092*61046927SAndroid Build Coastguard Worker /* Byte 0 */ 1093*61046927SAndroid Build Coastguard Worker struct { 1094*61046927SAndroid Build Coastguard Worker unsigned : 5; 1095*61046927SAndroid Build Coastguard Worker unsigned op : 3; 1096*61046927SAndroid Build Coastguard Worker } PACKED; 1097*61046927SAndroid Build Coastguard Worker 1098*61046927SAndroid Build Coastguard Worker rogue_backend_uvsw_encoding uvsw; 1099*61046927SAndroid Build Coastguard Worker rogue_backend_fitr_encoding fitr; 1100*61046927SAndroid Build Coastguard Worker rogue_backend_emitpix_encoding emitpix; 1101*61046927SAndroid Build Coastguard Worker rogue_backend_dma_encoding dma; 1102*61046927SAndroid Build Coastguard Worker } PACKED; 1103*61046927SAndroid Build Coastguard Worker } PACKED rogue_backend_instr_encoding; 1104*61046927SAndroid Build Coastguard Worker static_assert(sizeof(rogue_backend_instr_encoding) == 5, 1105*61046927SAndroid Build Coastguard Worker "sizeof(rogue_backend_instr_encoding) != 5"); 1106*61046927SAndroid Build Coastguard Worker 1107*61046927SAndroid Build Coastguard Worker enum backendop { 1108*61046927SAndroid Build Coastguard Worker BACKENDOP_UVSW = 0b000, 1109*61046927SAndroid Build Coastguard Worker BACKENDOP_MSK = 0b001, 1110*61046927SAndroid Build Coastguard Worker BACKENDOP_PHAS = 0b010, 1111*61046927SAndroid Build Coastguard Worker BACKENDOP_SETL = 0b011, 1112*61046927SAndroid Build Coastguard Worker BACKENDOP_VISTEST = 0b100, 1113*61046927SAndroid Build Coastguard Worker BACKENDOP_FITR = 0b101, 1114*61046927SAndroid Build Coastguard Worker BACKENDOP_EMIT = 0b110, 1115*61046927SAndroid Build Coastguard Worker BACKENDOP_DMA = 0b111, 1116*61046927SAndroid Build Coastguard Worker }; 1117*61046927SAndroid Build Coastguard Worker 1118*61046927SAndroid Build Coastguard Worker /* Branch */ 1119*61046927SAndroid Build Coastguard Worker typedef struct rogue_ctrl_ba_encoding { 1120*61046927SAndroid Build Coastguard Worker /* Byte 0 */ 1121*61046927SAndroid Build Coastguard Worker struct { 1122*61046927SAndroid Build Coastguard Worker unsigned : 1; 1123*61046927SAndroid Build Coastguard Worker unsigned abs : 1; 1124*61046927SAndroid Build Coastguard Worker unsigned allp : 1; 1125*61046927SAndroid Build Coastguard Worker unsigned anyp : 1; 1126*61046927SAndroid Build Coastguard Worker unsigned link : 1; 1127*61046927SAndroid Build Coastguard Worker unsigned : 3; 1128*61046927SAndroid Build Coastguard Worker } PACKED; 1129*61046927SAndroid Build Coastguard Worker 1130*61046927SAndroid Build Coastguard Worker /* Byte 1 */ 1131*61046927SAndroid Build Coastguard Worker struct { 1132*61046927SAndroid Build Coastguard Worker unsigned : 1; 1133*61046927SAndroid Build Coastguard Worker unsigned offset_7_1 : 7; 1134*61046927SAndroid Build Coastguard Worker } PACKED; 1135*61046927SAndroid Build Coastguard Worker 1136*61046927SAndroid Build Coastguard Worker /* Byte 2 */ 1137*61046927SAndroid Build Coastguard Worker struct { 1138*61046927SAndroid Build Coastguard Worker unsigned offset_15_8 : 8; 1139*61046927SAndroid Build Coastguard Worker } PACKED; 1140*61046927SAndroid Build Coastguard Worker 1141*61046927SAndroid Build Coastguard Worker /* Byte 3 */ 1142*61046927SAndroid Build Coastguard Worker struct { 1143*61046927SAndroid Build Coastguard Worker unsigned offset_23_16 : 8; 1144*61046927SAndroid Build Coastguard Worker } PACKED; 1145*61046927SAndroid Build Coastguard Worker 1146*61046927SAndroid Build Coastguard Worker /* Byte 4 */ 1147*61046927SAndroid Build Coastguard Worker struct { 1148*61046927SAndroid Build Coastguard Worker unsigned offset_31_24 : 8; 1149*61046927SAndroid Build Coastguard Worker } PACKED; 1150*61046927SAndroid Build Coastguard Worker } PACKED rogue_ctrl_ba_encoding; 1151*61046927SAndroid Build Coastguard Worker static_assert(sizeof(rogue_ctrl_ba_encoding) == 5, 1152*61046927SAndroid Build Coastguard Worker "sizeof(rogue_ctrl_ba_encoding) != 5"); 1153*61046927SAndroid Build Coastguard Worker 1154*61046927SAndroid Build Coastguard Worker typedef struct rogue_offset32 { 1155*61046927SAndroid Build Coastguard Worker union { 1156*61046927SAndroid Build Coastguard Worker struct { 1157*61046927SAndroid Build Coastguard Worker struct { 1158*61046927SAndroid Build Coastguard Worker unsigned : 1; 1159*61046927SAndroid Build Coastguard Worker unsigned _7_1 : 7; 1160*61046927SAndroid Build Coastguard Worker } PACKED; 1161*61046927SAndroid Build Coastguard Worker 1162*61046927SAndroid Build Coastguard Worker struct { 1163*61046927SAndroid Build Coastguard Worker unsigned _15_8 : 8; 1164*61046927SAndroid Build Coastguard Worker } PACKED; 1165*61046927SAndroid Build Coastguard Worker 1166*61046927SAndroid Build Coastguard Worker struct { 1167*61046927SAndroid Build Coastguard Worker unsigned _23_16 : 8; 1168*61046927SAndroid Build Coastguard Worker } PACKED; 1169*61046927SAndroid Build Coastguard Worker 1170*61046927SAndroid Build Coastguard Worker struct { 1171*61046927SAndroid Build Coastguard Worker unsigned _31_24 : 8; 1172*61046927SAndroid Build Coastguard Worker } PACKED; 1173*61046927SAndroid Build Coastguard Worker } PACKED; 1174*61046927SAndroid Build Coastguard Worker 1175*61046927SAndroid Build Coastguard Worker uint32_t _; 1176*61046927SAndroid Build Coastguard Worker } PACKED; 1177*61046927SAndroid Build Coastguard Worker } PACKED rogue_offset32; 1178*61046927SAndroid Build Coastguard Worker static_assert(sizeof(rogue_offset32) == 4, "sizeof(rogue_offset32) != 4"); 1179*61046927SAndroid Build Coastguard Worker 1180*61046927SAndroid Build Coastguard Worker /* NOP */ 1181*61046927SAndroid Build Coastguard Worker typedef struct rogue_ctrl_nop_encoding { 1182*61046927SAndroid Build Coastguard Worker /* Byte 0 */ 1183*61046927SAndroid Build Coastguard Worker struct { 1184*61046927SAndroid Build Coastguard Worker unsigned : 8; 1185*61046927SAndroid Build Coastguard Worker } PACKED; 1186*61046927SAndroid Build Coastguard Worker } PACKED rogue_ctrl_nop_encoding; 1187*61046927SAndroid Build Coastguard Worker static_assert(sizeof(rogue_ctrl_nop_encoding) == 1, 1188*61046927SAndroid Build Coastguard Worker "sizeof(rogue_ctrl_nop_encoding) != 1"); 1189*61046927SAndroid Build Coastguard Worker 1190*61046927SAndroid Build Coastguard Worker /* Common for all control instructions. */ 1191*61046927SAndroid Build Coastguard Worker typedef struct rogue_ctrl_instr_encoding { 1192*61046927SAndroid Build Coastguard Worker union { 1193*61046927SAndroid Build Coastguard Worker /* Bytes 0+ */ 1194*61046927SAndroid Build Coastguard Worker rogue_ctrl_ba_encoding ba; 1195*61046927SAndroid Build Coastguard Worker rogue_ctrl_nop_encoding nop; 1196*61046927SAndroid Build Coastguard Worker } PACKED; 1197*61046927SAndroid Build Coastguard Worker } PACKED rogue_ctrl_instr_encoding; 1198*61046927SAndroid Build Coastguard Worker static_assert(sizeof(rogue_ctrl_instr_encoding) == 5, 1199*61046927SAndroid Build Coastguard Worker "sizeof(rogue_ctrl_instr_encoding) != 5"); 1200*61046927SAndroid Build Coastguard Worker 1201*61046927SAndroid Build Coastguard Worker enum ctrlop { 1202*61046927SAndroid Build Coastguard Worker CTRLOP_BA = 0b0000, 1203*61046927SAndroid Build Coastguard Worker CTRLOP_LAPC = 0b0001, 1204*61046927SAndroid Build Coastguard Worker CTRLOP_SAVL = 0b0010, 1205*61046927SAndroid Build Coastguard Worker CTRLOP_CND = 0b0011, 1206*61046927SAndroid Build Coastguard Worker CTRLOP_WOP = 0b0100, 1207*61046927SAndroid Build Coastguard Worker CTRLOP_WDF = 0b0101, 1208*61046927SAndroid Build Coastguard Worker CTRLOP_MUTEX = 0b0110, 1209*61046927SAndroid Build Coastguard Worker CTRLOP_NOP = 0b0111, 1210*61046927SAndroid Build Coastguard Worker CTRLOP_ITRSMP = 0b1000, 1211*61046927SAndroid Build Coastguard Worker CTRLOP_UNIQ = 0b1001, 1212*61046927SAndroid Build Coastguard Worker CTRLOP_FETCH = 0b1010, 1213*61046927SAndroid Build Coastguard Worker CTRLOP_SBO = 0b1011, 1214*61046927SAndroid Build Coastguard Worker }; 1215*61046927SAndroid Build Coastguard Worker 1216*61046927SAndroid Build Coastguard Worker /* Bitwise phase 0: logical */ 1217*61046927SAndroid Build Coastguard Worker typedef struct rogue_bitwise_ph0_encoding { 1218*61046927SAndroid Build Coastguard Worker /* Byte 0 */ 1219*61046927SAndroid Build Coastguard Worker struct { 1220*61046927SAndroid Build Coastguard Worker unsigned bm : 1; 1221*61046927SAndroid Build Coastguard Worker unsigned cnt_byp : 1; 1222*61046927SAndroid Build Coastguard Worker unsigned shft : 2; 1223*61046927SAndroid Build Coastguard Worker unsigned ext : 1; 1224*61046927SAndroid Build Coastguard Worker unsigned cnt : 1; 1225*61046927SAndroid Build Coastguard Worker unsigned csrc : 1; 1226*61046927SAndroid Build Coastguard Worker unsigned : 1; 1227*61046927SAndroid Build Coastguard Worker } PACKED; 1228*61046927SAndroid Build Coastguard Worker 1229*61046927SAndroid Build Coastguard Worker /* Byte 1 */ 1230*61046927SAndroid Build Coastguard Worker struct { 1231*61046927SAndroid Build Coastguard Worker unsigned imm_7_0 : 8; 1232*61046927SAndroid Build Coastguard Worker } PACKED; 1233*61046927SAndroid Build Coastguard Worker 1234*61046927SAndroid Build Coastguard Worker /* Byte 2 */ 1235*61046927SAndroid Build Coastguard Worker struct { 1236*61046927SAndroid Build Coastguard Worker unsigned imm_15_8 : 8; 1237*61046927SAndroid Build Coastguard Worker } PACKED; 1238*61046927SAndroid Build Coastguard Worker 1239*61046927SAndroid Build Coastguard Worker /* Byte 3 */ 1240*61046927SAndroid Build Coastguard Worker struct { 1241*61046927SAndroid Build Coastguard Worker unsigned imm_23_16 : 8; 1242*61046927SAndroid Build Coastguard Worker } PACKED; 1243*61046927SAndroid Build Coastguard Worker 1244*61046927SAndroid Build Coastguard Worker /* Byte 4 */ 1245*61046927SAndroid Build Coastguard Worker struct { 1246*61046927SAndroid Build Coastguard Worker unsigned imm_31_24 : 8; 1247*61046927SAndroid Build Coastguard Worker } PACKED; 1248*61046927SAndroid Build Coastguard Worker } PACKED rogue_bitwise_ph0_encoding; 1249*61046927SAndroid Build Coastguard Worker static_assert(sizeof(rogue_bitwise_ph0_encoding) == 5, 1250*61046927SAndroid Build Coastguard Worker "sizeof(rogue_bitwise_ph0_encoding) != 5"); 1251*61046927SAndroid Build Coastguard Worker 1252*61046927SAndroid Build Coastguard Worker enum shft1 { 1253*61046927SAndroid Build Coastguard Worker SHFT1_BYP = 0b00, 1254*61046927SAndroid Build Coastguard Worker SHFT1_SHFL = 0b01, 1255*61046927SAndroid Build Coastguard Worker SHFT1_REV = 0b10, 1256*61046927SAndroid Build Coastguard Worker SHFT1_LSL = 0b11, 1257*61046927SAndroid Build Coastguard Worker }; 1258*61046927SAndroid Build Coastguard Worker 1259*61046927SAndroid Build Coastguard Worker enum cnt { 1260*61046927SAndroid Build Coastguard Worker CNT_CBS = 0b0, 1261*61046927SAndroid Build Coastguard Worker CNT_FTB = 0b1, 1262*61046927SAndroid Build Coastguard Worker }; 1263*61046927SAndroid Build Coastguard Worker 1264*61046927SAndroid Build Coastguard Worker enum csrc { 1265*61046927SAndroid Build Coastguard Worker CNT_S2 = 0b0, 1266*61046927SAndroid Build Coastguard Worker CNT_FT2 = 0b1, 1267*61046927SAndroid Build Coastguard Worker }; 1268*61046927SAndroid Build Coastguard Worker 1269*61046927SAndroid Build Coastguard Worker typedef struct rogue_imm32 { 1270*61046927SAndroid Build Coastguard Worker union { 1271*61046927SAndroid Build Coastguard Worker struct { 1272*61046927SAndroid Build Coastguard Worker struct { 1273*61046927SAndroid Build Coastguard Worker unsigned _7_0 : 8; 1274*61046927SAndroid Build Coastguard Worker } PACKED; 1275*61046927SAndroid Build Coastguard Worker 1276*61046927SAndroid Build Coastguard Worker struct { 1277*61046927SAndroid Build Coastguard Worker unsigned _15_8 : 8; 1278*61046927SAndroid Build Coastguard Worker } PACKED; 1279*61046927SAndroid Build Coastguard Worker 1280*61046927SAndroid Build Coastguard Worker struct { 1281*61046927SAndroid Build Coastguard Worker unsigned _23_16 : 8; 1282*61046927SAndroid Build Coastguard Worker } PACKED; 1283*61046927SAndroid Build Coastguard Worker 1284*61046927SAndroid Build Coastguard Worker struct { 1285*61046927SAndroid Build Coastguard Worker unsigned _31_24 : 8; 1286*61046927SAndroid Build Coastguard Worker } PACKED; 1287*61046927SAndroid Build Coastguard Worker } PACKED; 1288*61046927SAndroid Build Coastguard Worker 1289*61046927SAndroid Build Coastguard Worker uint32_t _; 1290*61046927SAndroid Build Coastguard Worker } PACKED; 1291*61046927SAndroid Build Coastguard Worker } PACKED rogue_imm32; 1292*61046927SAndroid Build Coastguard Worker static_assert(sizeof(rogue_imm32) == 4, "sizeof(rogue_imm32) != 4"); 1293*61046927SAndroid Build Coastguard Worker 1294*61046927SAndroid Build Coastguard Worker /* Bitwise phase 1: logical */ 1295*61046927SAndroid Build Coastguard Worker typedef struct rogue_bitwise_ph1_encoding { 1296*61046927SAndroid Build Coastguard Worker /* Byte 0 */ 1297*61046927SAndroid Build Coastguard Worker struct { 1298*61046927SAndroid Build Coastguard Worker unsigned op : 3; 1299*61046927SAndroid Build Coastguard Worker unsigned mska : 1; 1300*61046927SAndroid Build Coastguard Worker unsigned : 1; 1301*61046927SAndroid Build Coastguard Worker unsigned mskb : 1; 1302*61046927SAndroid Build Coastguard Worker unsigned : 2; 1303*61046927SAndroid Build Coastguard Worker } PACKED; 1304*61046927SAndroid Build Coastguard Worker } PACKED rogue_bitwise_ph1_encoding; 1305*61046927SAndroid Build Coastguard Worker static_assert(sizeof(rogue_bitwise_ph1_encoding) == 1, 1306*61046927SAndroid Build Coastguard Worker "sizeof(rogue_bitwise_ph1_encoding) != 1"); 1307*61046927SAndroid Build Coastguard Worker 1308*61046927SAndroid Build Coastguard Worker enum ph1op { 1309*61046927SAndroid Build Coastguard Worker PH1OP_OR = 0b000, 1310*61046927SAndroid Build Coastguard Worker PH1OP_AND = 0b001, 1311*61046927SAndroid Build Coastguard Worker PH1OP_XOR = 0b010, 1312*61046927SAndroid Build Coastguard Worker PH1OP_NOR = 0b100, 1313*61046927SAndroid Build Coastguard Worker PH1OP_NAND = 0b101, 1314*61046927SAndroid Build Coastguard Worker PH1OP_XNOR = 0b110, 1315*61046927SAndroid Build Coastguard Worker PH1OP_BYP = 0b111, 1316*61046927SAndroid Build Coastguard Worker }; 1317*61046927SAndroid Build Coastguard Worker 1318*61046927SAndroid Build Coastguard Worker /* Bitwise phase 2: shift2/test */ 1319*61046927SAndroid Build Coastguard Worker typedef struct rogue_bitwise_ph2_encoding { 1320*61046927SAndroid Build Coastguard Worker /* Byte 0 */ 1321*61046927SAndroid Build Coastguard Worker struct { 1322*61046927SAndroid Build Coastguard Worker unsigned shft : 3; 1323*61046927SAndroid Build Coastguard Worker unsigned top : 1; 1324*61046927SAndroid Build Coastguard Worker unsigned tsrc : 1; 1325*61046927SAndroid Build Coastguard Worker unsigned pwen : 1; 1326*61046927SAndroid Build Coastguard Worker unsigned : 2; 1327*61046927SAndroid Build Coastguard Worker } PACKED; 1328*61046927SAndroid Build Coastguard Worker } PACKED rogue_bitwise_ph2_encoding; 1329*61046927SAndroid Build Coastguard Worker static_assert(sizeof(rogue_bitwise_ph2_encoding) == 1, 1330*61046927SAndroid Build Coastguard Worker "sizeof(rogue_bitwise_ph2_encoding) != 1"); 1331*61046927SAndroid Build Coastguard Worker 1332*61046927SAndroid Build Coastguard Worker enum shft2 { 1333*61046927SAndroid Build Coastguard Worker SHFT2_LSL = 0b000, 1334*61046927SAndroid Build Coastguard Worker SHFT2_SHR = 0b001, 1335*61046927SAndroid Build Coastguard Worker SHFT2_ROL = 0b010, 1336*61046927SAndroid Build Coastguard Worker SHFT2_CPS = 0b011, 1337*61046927SAndroid Build Coastguard Worker SHFT2_ASR_TWB = 0b100, 1338*61046927SAndroid Build Coastguard Worker SHFT2_ASR_PWB = 0b101, 1339*61046927SAndroid Build Coastguard Worker SHFT2_ASR_MTB = 0b110, 1340*61046927SAndroid Build Coastguard Worker SHFT2_ASR_FTB = 0b111, 1341*61046927SAndroid Build Coastguard Worker }; 1342*61046927SAndroid Build Coastguard Worker 1343*61046927SAndroid Build Coastguard Worker enum top { 1344*61046927SAndroid Build Coastguard Worker TOP_TZ = 0b0, 1345*61046927SAndroid Build Coastguard Worker TOP_TNZ = 0b1, 1346*61046927SAndroid Build Coastguard Worker }; 1347*61046927SAndroid Build Coastguard Worker 1348*61046927SAndroid Build Coastguard Worker enum tsrc { 1349*61046927SAndroid Build Coastguard Worker TSRC_FT5 = 0b0, 1350*61046927SAndroid Build Coastguard Worker TSRC_FT3 = 0b1, 1351*61046927SAndroid Build Coastguard Worker }; 1352*61046927SAndroid Build Coastguard Worker 1353*61046927SAndroid Build Coastguard Worker /* Common for all bitwise instructions. */ 1354*61046927SAndroid Build Coastguard Worker typedef struct rogue_bitwise_instr_encoding { 1355*61046927SAndroid Build Coastguard Worker union { 1356*61046927SAndroid Build Coastguard Worker /* Bytes 0+ */ 1357*61046927SAndroid Build Coastguard Worker struct { 1358*61046927SAndroid Build Coastguard Worker unsigned : 6; 1359*61046927SAndroid Build Coastguard Worker unsigned phase1 : 1; 1360*61046927SAndroid Build Coastguard Worker unsigned phase0 : 1; 1361*61046927SAndroid Build Coastguard Worker } PACKED; 1362*61046927SAndroid Build Coastguard Worker 1363*61046927SAndroid Build Coastguard Worker rogue_bitwise_ph0_encoding ph0; 1364*61046927SAndroid Build Coastguard Worker rogue_bitwise_ph1_encoding ph1; 1365*61046927SAndroid Build Coastguard Worker rogue_bitwise_ph2_encoding ph2; 1366*61046927SAndroid Build Coastguard Worker } PACKED; 1367*61046927SAndroid Build Coastguard Worker } PACKED rogue_bitwise_instr_encoding; 1368*61046927SAndroid Build Coastguard Worker static_assert(sizeof(rogue_bitwise_instr_encoding) == 5, 1369*61046927SAndroid Build Coastguard Worker "sizeof(rogue_bitwise_instr_encoding) != 5"); 1370*61046927SAndroid Build Coastguard Worker 1371*61046927SAndroid Build Coastguard Worker typedef struct rogue_instr_group_header_encoding { 1372*61046927SAndroid Build Coastguard Worker /* Byte 0 */ 1373*61046927SAndroid Build Coastguard Worker struct { 1374*61046927SAndroid Build Coastguard Worker unsigned length : 4; 1375*61046927SAndroid Build Coastguard Worker unsigned da : 4; 1376*61046927SAndroid Build Coastguard Worker } PACKED; 1377*61046927SAndroid Build Coastguard Worker 1378*61046927SAndroid Build Coastguard Worker /* Byte 1 */ 1379*61046927SAndroid Build Coastguard Worker union { 1380*61046927SAndroid Build Coastguard Worker struct { 1381*61046927SAndroid Build Coastguard Worker unsigned cc : 1; 1382*61046927SAndroid Build Coastguard Worker unsigned w0p : 1; 1383*61046927SAndroid Build Coastguard Worker unsigned w1p : 1; 1384*61046927SAndroid Build Coastguard Worker unsigned olchk : 1; 1385*61046927SAndroid Build Coastguard Worker unsigned oporg : 3; 1386*61046927SAndroid Build Coastguard Worker unsigned ext : 1; 1387*61046927SAndroid Build Coastguard Worker } PACKED; 1388*61046927SAndroid Build Coastguard Worker 1389*61046927SAndroid Build Coastguard Worker struct { 1390*61046927SAndroid Build Coastguard Worker unsigned : 4; 1391*61046927SAndroid Build Coastguard Worker unsigned opcnt : 3; 1392*61046927SAndroid Build Coastguard Worker unsigned : 1; 1393*61046927SAndroid Build Coastguard Worker } PACKED; 1394*61046927SAndroid Build Coastguard Worker } PACKED; 1395*61046927SAndroid Build Coastguard Worker 1396*61046927SAndroid Build Coastguard Worker /* Byte 2 */ 1397*61046927SAndroid Build Coastguard Worker union { 1398*61046927SAndroid Build Coastguard Worker struct { 1399*61046927SAndroid Build Coastguard Worker unsigned ccext : 1; 1400*61046927SAndroid Build Coastguard Worker unsigned rpt : 2; 1401*61046927SAndroid Build Coastguard Worker unsigned atom : 1; 1402*61046927SAndroid Build Coastguard Worker unsigned : 1; 1403*61046927SAndroid Build Coastguard Worker unsigned alutype : 2; 1404*61046927SAndroid Build Coastguard Worker unsigned end : 1; 1405*61046927SAndroid Build Coastguard Worker } PACKED; 1406*61046927SAndroid Build Coastguard Worker 1407*61046927SAndroid Build Coastguard Worker struct { 1408*61046927SAndroid Build Coastguard Worker unsigned : 1; 1409*61046927SAndroid Build Coastguard Worker unsigned ctrlop : 4; 1410*61046927SAndroid Build Coastguard Worker unsigned : 2; 1411*61046927SAndroid Build Coastguard Worker unsigned miscctl : 1; 1412*61046927SAndroid Build Coastguard Worker } PACKED; 1413*61046927SAndroid Build Coastguard Worker } PACKED; 1414*61046927SAndroid Build Coastguard Worker } PACKED rogue_instr_group_header_encoding; 1415*61046927SAndroid Build Coastguard Worker static_assert(sizeof(rogue_instr_group_header_encoding) == 3, 1416*61046927SAndroid Build Coastguard Worker "sizeof(rogue_instr_group_header_encoding) != 3"); 1417*61046927SAndroid Build Coastguard Worker 1418*61046927SAndroid Build Coastguard Worker enum oporg { 1419*61046927SAndroid Build Coastguard Worker OPORG_P0 = 0b000, 1420*61046927SAndroid Build Coastguard Worker OPORG_P2 = 0b001, 1421*61046927SAndroid Build Coastguard Worker OPORG_BE = 0b010, 1422*61046927SAndroid Build Coastguard Worker OPORG_P0_P1 = 0b011, 1423*61046927SAndroid Build Coastguard Worker OPORG_P0_P2 = 0b100, 1424*61046927SAndroid Build Coastguard Worker OPORG_P0_P1_P2 = 0b101, 1425*61046927SAndroid Build Coastguard Worker OPORG_P0_P2_BE = 0b110, 1426*61046927SAndroid Build Coastguard Worker OPORG_P0_P1_P2_BE = 0b111, 1427*61046927SAndroid Build Coastguard Worker }; 1428*61046927SAndroid Build Coastguard Worker 1429*61046927SAndroid Build Coastguard Worker enum opcnt { 1430*61046927SAndroid Build Coastguard Worker OPCNT_P0 = 0b001, 1431*61046927SAndroid Build Coastguard Worker OPCNT_P1 = 0b010, 1432*61046927SAndroid Build Coastguard Worker OPCNT_P2 = 0b100, 1433*61046927SAndroid Build Coastguard Worker }; 1434*61046927SAndroid Build Coastguard Worker 1435*61046927SAndroid Build Coastguard Worker enum alutype { 1436*61046927SAndroid Build Coastguard Worker ALUTYPE_MAIN = 0b00, 1437*61046927SAndroid Build Coastguard Worker ALUTYPE_BITWISE = 0b10, 1438*61046927SAndroid Build Coastguard Worker ALUTYPE_CONTROL = 0b11, 1439*61046927SAndroid Build Coastguard Worker }; 1440*61046927SAndroid Build Coastguard Worker 1441*61046927SAndroid Build Coastguard Worker enum cc { 1442*61046927SAndroid Build Coastguard Worker CC_PE_TRUE = 0b00, 1443*61046927SAndroid Build Coastguard Worker CC_P0_TRUE = 0b01, 1444*61046927SAndroid Build Coastguard Worker CC_PE_ANY = 0b10, 1445*61046927SAndroid Build Coastguard Worker CC_P0_FALSE = 0b11, 1446*61046927SAndroid Build Coastguard Worker }; 1447*61046927SAndroid Build Coastguard Worker 1448*61046927SAndroid Build Coastguard Worker typedef struct rogue_cc { 1449*61046927SAndroid Build Coastguard Worker union { 1450*61046927SAndroid Build Coastguard Worker struct { 1451*61046927SAndroid Build Coastguard Worker unsigned cc : 1; 1452*61046927SAndroid Build Coastguard Worker unsigned ccext : 1; 1453*61046927SAndroid Build Coastguard Worker unsigned : 6; 1454*61046927SAndroid Build Coastguard Worker } PACKED; 1455*61046927SAndroid Build Coastguard Worker 1456*61046927SAndroid Build Coastguard Worker uint8_t _; 1457*61046927SAndroid Build Coastguard Worker } PACKED; 1458*61046927SAndroid Build Coastguard Worker } PACKED rogue_cc; 1459*61046927SAndroid Build Coastguard Worker static_assert(sizeof(rogue_cc) == 1, "sizeof(rogue_cc) != 1"); 1460*61046927SAndroid Build Coastguard Worker 1461*61046927SAndroid Build Coastguard Worker #endif /* ROGUE_ISA_H */ 1462