1428d7b3dSmrg/* 2428d7b3dSmrg Copyright (C) Intel Corp. 2006. All Rights Reserved. 3428d7b3dSmrg Intel funded Tungsten Graphics (http://www.tungstengraphics.com) to 4428d7b3dSmrg develop this 3D driver. 5428d7b3dSmrg 6428d7b3dSmrg Permission is hereby granted, free of charge, to any person obtaining 7428d7b3dSmrg a copy of this software and associated documentation files (the 8428d7b3dSmrg "Software"), to deal in the Software without restriction, including 9428d7b3dSmrg without limitation the rights to use, copy, modify, merge, publish, 10428d7b3dSmrg distribute, sublicense, and/or sell copies of the Software, and to 11428d7b3dSmrg permit persons to whom the Software is furnished to do so, subject to 12428d7b3dSmrg the following conditions: 13428d7b3dSmrg 14428d7b3dSmrg The above copyright notice and this permission notice (including the 15428d7b3dSmrg next paragraph) shall be included in all copies or substantial 16428d7b3dSmrg portions of the Software. 17428d7b3dSmrg 18428d7b3dSmrg THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 19428d7b3dSmrg EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 20428d7b3dSmrg MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 21428d7b3dSmrg IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE 22428d7b3dSmrg LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 23428d7b3dSmrg OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 24428d7b3dSmrg WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 25428d7b3dSmrg 26428d7b3dSmrg **********************************************************************/ 27428d7b3dSmrg/* 28428d7b3dSmrg * Authors: 29428d7b3dSmrg * Keith Whitwell <keith@tungstengraphics.com> 30428d7b3dSmrg */ 31428d7b3dSmrg 32428d7b3dSmrg#ifndef BRW_EU_H 33428d7b3dSmrg#define BRW_EU_H 34428d7b3dSmrg 35428d7b3dSmrg#include <stdbool.h> 36428d7b3dSmrg#include <stdint.h> 37428d7b3dSmrg#include <stdio.h> 38428d7b3dSmrg 39428d7b3dSmrg#include <assert.h> 40428d7b3dSmrg 41428d7b3dSmrg#define BRW_SWIZZLE4(a,b,c,d) (((a)<<0) | ((b)<<2) | ((c)<<4) | ((d)<<6)) 42428d7b3dSmrg#define BRW_GET_SWZ(swz, idx) (((swz) >> ((idx)*2)) & 0x3) 43428d7b3dSmrg 44428d7b3dSmrg#define BRW_SWIZZLE_NOOP BRW_SWIZZLE4(0,1,2,3) 45428d7b3dSmrg#define BRW_SWIZZLE_XYZW BRW_SWIZZLE4(0,1,2,3) 46428d7b3dSmrg#define BRW_SWIZZLE_XXXX BRW_SWIZZLE4(0,0,0,0) 47428d7b3dSmrg#define BRW_SWIZZLE_YYYY BRW_SWIZZLE4(1,1,1,1) 48428d7b3dSmrg#define BRW_SWIZZLE_ZZZZ BRW_SWIZZLE4(2,2,2,2) 49428d7b3dSmrg#define BRW_SWIZZLE_WWWW BRW_SWIZZLE4(3,3,3,3) 50428d7b3dSmrg#define BRW_SWIZZLE_XYXY BRW_SWIZZLE4(0,1,0,1) 51428d7b3dSmrg 52428d7b3dSmrg#define WRITEMASK_X 0x1 53428d7b3dSmrg#define WRITEMASK_Y 0x2 54428d7b3dSmrg#define WRITEMASK_Z 0x4 55428d7b3dSmrg#define WRITEMASK_W 0x8 56428d7b3dSmrg 57428d7b3dSmrg#define WRITEMASK_XY (WRITEMASK_X | WRITEMASK_Y) 58428d7b3dSmrg#define WRITEMASK_XYZ (WRITEMASK_X | WRITEMASK_Y | WRITEMASK_Z) 59428d7b3dSmrg#define WRITEMASK_XYZW (WRITEMASK_X | WRITEMASK_Y | WRITEMASK_Z | WRITEMASK_W) 60428d7b3dSmrg 61428d7b3dSmrg/** Number of general purpose registers (VS, WM, etc) */ 62428d7b3dSmrg#define BRW_MAX_GRF 128 63428d7b3dSmrg 64428d7b3dSmrg/** Number of message register file registers */ 65428d7b3dSmrg#define BRW_MAX_MRF 16 66428d7b3dSmrg 67428d7b3dSmrg 68428d7b3dSmrg#define BRW_ALIGN_1 0 69428d7b3dSmrg#define BRW_ALIGN_16 1 70428d7b3dSmrg 71428d7b3dSmrg#define BRW_ADDRESS_DIRECT 0 72428d7b3dSmrg#define BRW_ADDRESS_REGISTER_INDIRECT_REGISTER 1 73428d7b3dSmrg 74428d7b3dSmrg#define BRW_CHANNEL_X 0 75428d7b3dSmrg#define BRW_CHANNEL_Y 1 76428d7b3dSmrg#define BRW_CHANNEL_Z 2 77428d7b3dSmrg#define BRW_CHANNEL_W 3 78428d7b3dSmrg 79428d7b3dSmrgenum brw_compression { 80428d7b3dSmrg BRW_COMPRESSION_NONE, 81428d7b3dSmrg BRW_COMPRESSION_2NDHALF, 82428d7b3dSmrg BRW_COMPRESSION_COMPRESSED, 83428d7b3dSmrg}; 84428d7b3dSmrg 85428d7b3dSmrg#define GEN6_COMPRESSION_1Q 0 86428d7b3dSmrg#define GEN6_COMPRESSION_2Q 1 87428d7b3dSmrg#define GEN6_COMPRESSION_3Q 2 88428d7b3dSmrg#define GEN6_COMPRESSION_4Q 3 89428d7b3dSmrg#define GEN6_COMPRESSION_1H 0 90428d7b3dSmrg#define GEN6_COMPRESSION_2H 2 91428d7b3dSmrg 92428d7b3dSmrg#define BRW_CONDITIONAL_NONE 0 93428d7b3dSmrg#define BRW_CONDITIONAL_Z 1 94428d7b3dSmrg#define BRW_CONDITIONAL_NZ 2 95428d7b3dSmrg#define BRW_CONDITIONAL_EQ 1 /* Z */ 96428d7b3dSmrg#define BRW_CONDITIONAL_NEQ 2 /* NZ */ 97428d7b3dSmrg#define BRW_CONDITIONAL_G 3 98428d7b3dSmrg#define BRW_CONDITIONAL_GE 4 99428d7b3dSmrg#define BRW_CONDITIONAL_L 5 100428d7b3dSmrg#define BRW_CONDITIONAL_LE 6 101428d7b3dSmrg#define BRW_CONDITIONAL_R 7 102428d7b3dSmrg#define BRW_CONDITIONAL_O 8 103428d7b3dSmrg#define BRW_CONDITIONAL_U 9 104428d7b3dSmrg 105428d7b3dSmrg#define BRW_DEBUG_NONE 0 106428d7b3dSmrg#define BRW_DEBUG_BREAKPOINT 1 107428d7b3dSmrg 108428d7b3dSmrg#define BRW_DEPENDENCY_NORMAL 0 109428d7b3dSmrg#define BRW_DEPENDENCY_NOTCLEARED 1 110428d7b3dSmrg#define BRW_DEPENDENCY_NOTCHECKED 2 111428d7b3dSmrg#define BRW_DEPENDENCY_DISABLE 3 112428d7b3dSmrg 113428d7b3dSmrg#define BRW_EXECUTE_1 0 114428d7b3dSmrg#define BRW_EXECUTE_2 1 115428d7b3dSmrg#define BRW_EXECUTE_4 2 116428d7b3dSmrg#define BRW_EXECUTE_8 3 117428d7b3dSmrg#define BRW_EXECUTE_16 4 118428d7b3dSmrg#define BRW_EXECUTE_32 5 119428d7b3dSmrg 120428d7b3dSmrg#define BRW_HORIZONTAL_STRIDE_0 0 121428d7b3dSmrg#define BRW_HORIZONTAL_STRIDE_1 1 122428d7b3dSmrg#define BRW_HORIZONTAL_STRIDE_2 2 123428d7b3dSmrg#define BRW_HORIZONTAL_STRIDE_4 3 124428d7b3dSmrg 125428d7b3dSmrg#define BRW_INSTRUCTION_NORMAL 0 126428d7b3dSmrg#define BRW_INSTRUCTION_SATURATE 1 127428d7b3dSmrg 128428d7b3dSmrg#define BRW_MASK_ENABLE 0 129428d7b3dSmrg#define BRW_MASK_DISABLE 1 130428d7b3dSmrg 131428d7b3dSmrg/** @{ 132428d7b3dSmrg * 133428d7b3dSmrg * Gen6 has replaced "mask enable/disable" with WECtrl, which is 134428d7b3dSmrg * effectively the same but much simpler to think about. Now, there 135428d7b3dSmrg * are two contributors ANDed together to whether channels are 136428d7b3dSmrg * executed: The predication on the instruction, and the channel write 137428d7b3dSmrg * enable. 138428d7b3dSmrg */ 139428d7b3dSmrg/** 140428d7b3dSmrg * This is the default value. It means that a channel's write enable is set 141428d7b3dSmrg * if the per-channel IP is pointing at this instruction. 142428d7b3dSmrg */ 143428d7b3dSmrg#define BRW_WE_NORMAL 0 144428d7b3dSmrg/** 145428d7b3dSmrg * This is used like BRW_MASK_DISABLE, and causes all channels to have 146428d7b3dSmrg * their write enable set. Note that predication still contributes to 147428d7b3dSmrg * whether the channel actually gets written. 148428d7b3dSmrg */ 149428d7b3dSmrg#define BRW_WE_ALL 1 150428d7b3dSmrg/** @} */ 151428d7b3dSmrg 152428d7b3dSmrgenum opcode { 153428d7b3dSmrg /* These are the actual hardware opcodes. */ 154428d7b3dSmrg BRW_OPCODE_MOV = 1, 155428d7b3dSmrg BRW_OPCODE_SEL = 2, 156428d7b3dSmrg BRW_OPCODE_NOT = 4, 157428d7b3dSmrg BRW_OPCODE_AND = 5, 158428d7b3dSmrg BRW_OPCODE_OR = 6, 159428d7b3dSmrg BRW_OPCODE_XOR = 7, 160428d7b3dSmrg BRW_OPCODE_SHR = 8, 161428d7b3dSmrg BRW_OPCODE_SHL = 9, 162428d7b3dSmrg BRW_OPCODE_RSR = 10, 163428d7b3dSmrg BRW_OPCODE_RSL = 11, 164428d7b3dSmrg BRW_OPCODE_ASR = 12, 165428d7b3dSmrg BRW_OPCODE_CMP = 16, 166428d7b3dSmrg BRW_OPCODE_CMPN = 17, 167428d7b3dSmrg BRW_OPCODE_JMPI = 32, 168428d7b3dSmrg BRW_OPCODE_IF = 34, 169428d7b3dSmrg BRW_OPCODE_IFF = 35, 170428d7b3dSmrg BRW_OPCODE_ELSE = 36, 171428d7b3dSmrg BRW_OPCODE_ENDIF = 37, 172428d7b3dSmrg BRW_OPCODE_DO = 38, 173428d7b3dSmrg BRW_OPCODE_WHILE = 39, 174428d7b3dSmrg BRW_OPCODE_BREAK = 40, 175428d7b3dSmrg BRW_OPCODE_CONTINUE = 41, 176428d7b3dSmrg BRW_OPCODE_HALT = 42, 177428d7b3dSmrg BRW_OPCODE_MSAVE = 44, 178428d7b3dSmrg BRW_OPCODE_MRESTORE = 45, 179428d7b3dSmrg BRW_OPCODE_PUSH = 46, 180428d7b3dSmrg BRW_OPCODE_POP = 47, 181428d7b3dSmrg BRW_OPCODE_WAIT = 48, 182428d7b3dSmrg BRW_OPCODE_SEND = 49, 183428d7b3dSmrg BRW_OPCODE_SENDC = 50, 184428d7b3dSmrg BRW_OPCODE_MATH = 56, 185428d7b3dSmrg BRW_OPCODE_ADD = 64, 186428d7b3dSmrg BRW_OPCODE_MUL = 65, 187428d7b3dSmrg BRW_OPCODE_AVG = 66, 188428d7b3dSmrg BRW_OPCODE_FRC = 67, 189428d7b3dSmrg BRW_OPCODE_RNDU = 68, 190428d7b3dSmrg BRW_OPCODE_RNDD = 69, 191428d7b3dSmrg BRW_OPCODE_RNDE = 70, 192428d7b3dSmrg BRW_OPCODE_RNDZ = 71, 193428d7b3dSmrg BRW_OPCODE_MAC = 72, 194428d7b3dSmrg BRW_OPCODE_MACH = 73, 195428d7b3dSmrg BRW_OPCODE_LZD = 74, 196428d7b3dSmrg BRW_OPCODE_SAD2 = 80, 197428d7b3dSmrg BRW_OPCODE_SADA2 = 81, 198428d7b3dSmrg BRW_OPCODE_DP4 = 84, 199428d7b3dSmrg BRW_OPCODE_DPH = 85, 200428d7b3dSmrg BRW_OPCODE_DP3 = 86, 201428d7b3dSmrg BRW_OPCODE_DP2 = 87, 202428d7b3dSmrg BRW_OPCODE_DPA2 = 88, 203428d7b3dSmrg BRW_OPCODE_LINE = 89, 204428d7b3dSmrg BRW_OPCODE_PLN = 90, 205428d7b3dSmrg BRW_OPCODE_NOP = 126, 206428d7b3dSmrg 207428d7b3dSmrg /* These are compiler backend opcodes that get translated into other 208428d7b3dSmrg * instructions. 209428d7b3dSmrg */ 210428d7b3dSmrg FS_OPCODE_FB_WRITE = 128, 211428d7b3dSmrg SHADER_OPCODE_RCP, 212428d7b3dSmrg SHADER_OPCODE_RSQ, 213428d7b3dSmrg SHADER_OPCODE_SQRT, 214428d7b3dSmrg SHADER_OPCODE_EXP2, 215428d7b3dSmrg SHADER_OPCODE_LOG2, 216428d7b3dSmrg SHADER_OPCODE_POW, 217428d7b3dSmrg SHADER_OPCODE_SIN, 218428d7b3dSmrg SHADER_OPCODE_COS, 219428d7b3dSmrg FS_OPCODE_DDX, 220428d7b3dSmrg FS_OPCODE_DDY, 221428d7b3dSmrg FS_OPCODE_PIXEL_X, 222428d7b3dSmrg FS_OPCODE_PIXEL_Y, 223428d7b3dSmrg FS_OPCODE_CINTERP, 224428d7b3dSmrg FS_OPCODE_LINTERP, 225428d7b3dSmrg FS_OPCODE_TEX, 226428d7b3dSmrg FS_OPCODE_TXB, 227428d7b3dSmrg FS_OPCODE_TXD, 228428d7b3dSmrg FS_OPCODE_TXF, 229428d7b3dSmrg FS_OPCODE_TXL, 230428d7b3dSmrg FS_OPCODE_TXS, 231428d7b3dSmrg FS_OPCODE_DISCARD, 232428d7b3dSmrg FS_OPCODE_SPILL, 233428d7b3dSmrg FS_OPCODE_UNSPILL, 234428d7b3dSmrg FS_OPCODE_PULL_CONSTANT_LOAD, 235428d7b3dSmrg 236428d7b3dSmrg VS_OPCODE_URB_WRITE, 237428d7b3dSmrg VS_OPCODE_SCRATCH_READ, 238428d7b3dSmrg VS_OPCODE_SCRATCH_WRITE, 239428d7b3dSmrg VS_OPCODE_PULL_CONSTANT_LOAD, 240428d7b3dSmrg}; 241428d7b3dSmrg 242428d7b3dSmrg#define BRW_PREDICATE_NONE 0 243428d7b3dSmrg#define BRW_PREDICATE_NORMAL 1 244428d7b3dSmrg#define BRW_PREDICATE_ALIGN1_ANYV 2 245428d7b3dSmrg#define BRW_PREDICATE_ALIGN1_ALLV 3 246428d7b3dSmrg#define BRW_PREDICATE_ALIGN1_ANY2H 4 247428d7b3dSmrg#define BRW_PREDICATE_ALIGN1_ALL2H 5 248428d7b3dSmrg#define BRW_PREDICATE_ALIGN1_ANY4H 6 249428d7b3dSmrg#define BRW_PREDICATE_ALIGN1_ALL4H 7 250428d7b3dSmrg#define BRW_PREDICATE_ALIGN1_ANY8H 8 251428d7b3dSmrg#define BRW_PREDICATE_ALIGN1_ALL8H 9 252428d7b3dSmrg#define BRW_PREDICATE_ALIGN1_ANY16H 10 253428d7b3dSmrg#define BRW_PREDICATE_ALIGN1_ALL16H 11 254428d7b3dSmrg#define BRW_PREDICATE_ALIGN16_REPLICATE_X 2 255428d7b3dSmrg#define BRW_PREDICATE_ALIGN16_REPLICATE_Y 3 256428d7b3dSmrg#define BRW_PREDICATE_ALIGN16_REPLICATE_Z 4 257428d7b3dSmrg#define BRW_PREDICATE_ALIGN16_REPLICATE_W 5 258428d7b3dSmrg#define BRW_PREDICATE_ALIGN16_ANY4H 6 259428d7b3dSmrg#define BRW_PREDICATE_ALIGN16_ALL4H 7 260428d7b3dSmrg 261428d7b3dSmrg#define BRW_ARCHITECTURE_REGISTER_FILE 0 262428d7b3dSmrg#define BRW_GENERAL_REGISTER_FILE 1 263428d7b3dSmrg#define BRW_MESSAGE_REGISTER_FILE 2 264428d7b3dSmrg#define BRW_IMMEDIATE_VALUE 3 265428d7b3dSmrg 266428d7b3dSmrg#define BRW_REGISTER_TYPE_UD 0 267428d7b3dSmrg#define BRW_REGISTER_TYPE_D 1 268428d7b3dSmrg#define BRW_REGISTER_TYPE_UW 2 269428d7b3dSmrg#define BRW_REGISTER_TYPE_W 3 270428d7b3dSmrg#define BRW_REGISTER_TYPE_UB 4 271428d7b3dSmrg#define BRW_REGISTER_TYPE_B 5 272428d7b3dSmrg#define BRW_REGISTER_TYPE_VF 5 /* packed float vector, immediates only? */ 273428d7b3dSmrg#define BRW_REGISTER_TYPE_HF 6 274428d7b3dSmrg#define BRW_REGISTER_TYPE_V 6 /* packed int vector, immediates only, uword dest only */ 275428d7b3dSmrg#define BRW_REGISTER_TYPE_F 7 276428d7b3dSmrg 277428d7b3dSmrg#define BRW_ARF_NULL 0x00 278428d7b3dSmrg#define BRW_ARF_ADDRESS 0x10 279428d7b3dSmrg#define BRW_ARF_ACCUMULATOR 0x20 280428d7b3dSmrg#define BRW_ARF_FLAG 0x30 281428d7b3dSmrg#define BRW_ARF_MASK 0x40 282428d7b3dSmrg#define BRW_ARF_MASK_STACK 0x50 283428d7b3dSmrg#define BRW_ARF_MASK_STACK_DEPTH 0x60 284428d7b3dSmrg#define BRW_ARF_STATE 0x70 285428d7b3dSmrg#define BRW_ARF_CONTROL 0x80 286428d7b3dSmrg#define BRW_ARF_NOTIFICATION_COUNT 0x90 287428d7b3dSmrg#define BRW_ARF_IP 0xA0 288428d7b3dSmrg 289428d7b3dSmrg#define BRW_MRF_COMPR4 (1 << 7) 290428d7b3dSmrg 291428d7b3dSmrg#define BRW_AMASK 0 292428d7b3dSmrg#define BRW_IMASK 1 293428d7b3dSmrg#define BRW_LMASK 2 294428d7b3dSmrg#define BRW_CMASK 3 295428d7b3dSmrg 296428d7b3dSmrg#define BRW_THREAD_NORMAL 0 297428d7b3dSmrg#define BRW_THREAD_ATOMIC 1 298428d7b3dSmrg#define BRW_THREAD_SWITCH 2 299428d7b3dSmrg 300428d7b3dSmrg#define BRW_VERTICAL_STRIDE_0 0 301428d7b3dSmrg#define BRW_VERTICAL_STRIDE_1 1 302428d7b3dSmrg#define BRW_VERTICAL_STRIDE_2 2 303428d7b3dSmrg#define BRW_VERTICAL_STRIDE_4 3 304428d7b3dSmrg#define BRW_VERTICAL_STRIDE_8 4 305428d7b3dSmrg#define BRW_VERTICAL_STRIDE_16 5 306428d7b3dSmrg#define BRW_VERTICAL_STRIDE_32 6 307428d7b3dSmrg#define BRW_VERTICAL_STRIDE_64 7 308428d7b3dSmrg#define BRW_VERTICAL_STRIDE_128 8 309428d7b3dSmrg#define BRW_VERTICAL_STRIDE_256 9 310428d7b3dSmrg#define BRW_VERTICAL_STRIDE_ONE_DIMENSIONAL 0xF 311428d7b3dSmrg 312428d7b3dSmrg#define BRW_WIDTH_1 0 313428d7b3dSmrg#define BRW_WIDTH_2 1 314428d7b3dSmrg#define BRW_WIDTH_4 2 315428d7b3dSmrg#define BRW_WIDTH_8 3 316428d7b3dSmrg#define BRW_WIDTH_16 4 317428d7b3dSmrg 318428d7b3dSmrg#define BRW_STATELESS_BUFFER_BOUNDARY_1K 0 319428d7b3dSmrg#define BRW_STATELESS_BUFFER_BOUNDARY_2K 1 320428d7b3dSmrg#define BRW_STATELESS_BUFFER_BOUNDARY_4K 2 321428d7b3dSmrg#define BRW_STATELESS_BUFFER_BOUNDARY_8K 3 322428d7b3dSmrg#define BRW_STATELESS_BUFFER_BOUNDARY_16K 4 323428d7b3dSmrg#define BRW_STATELESS_BUFFER_BOUNDARY_32K 5 324428d7b3dSmrg#define BRW_STATELESS_BUFFER_BOUNDARY_64K 6 325428d7b3dSmrg#define BRW_STATELESS_BUFFER_BOUNDARY_128K 7 326428d7b3dSmrg#define BRW_STATELESS_BUFFER_BOUNDARY_256K 8 327428d7b3dSmrg#define BRW_STATELESS_BUFFER_BOUNDARY_512K 9 328428d7b3dSmrg#define BRW_STATELESS_BUFFER_BOUNDARY_1M 10 329428d7b3dSmrg#define BRW_STATELESS_BUFFER_BOUNDARY_2M 11 330428d7b3dSmrg 331428d7b3dSmrg#define BRW_POLYGON_FACING_FRONT 0 332428d7b3dSmrg#define BRW_POLYGON_FACING_BACK 1 333428d7b3dSmrg 334428d7b3dSmrg#define BRW_MESSAGE_TARGET_NULL 0 335428d7b3dSmrg#define BRW_MESSAGE_TARGET_MATH 1 /* reserved on GEN6 */ 336428d7b3dSmrg#define BRW_MESSAGE_TARGET_SAMPLER 2 337428d7b3dSmrg#define BRW_MESSAGE_TARGET_GATEWAY 3 338428d7b3dSmrg#define BRW_MESSAGE_TARGET_DATAPORT_READ 4 339428d7b3dSmrg#define BRW_MESSAGE_TARGET_DATAPORT_WRITE 5 340428d7b3dSmrg#define BRW_MESSAGE_TARGET_URB 6 341428d7b3dSmrg#define BRW_MESSAGE_TARGET_THREAD_SPAWNER 7 342428d7b3dSmrg 343428d7b3dSmrg#define GEN6_MESSAGE_TARGET_DP_SAMPLER_CACHE 4 344428d7b3dSmrg#define GEN6_MESSAGE_TARGET_DP_RENDER_CACHE 5 345428d7b3dSmrg#define GEN6_MESSAGE_TARGET_DP_CONST_CACHE 9 346428d7b3dSmrg 347428d7b3dSmrg#define BRW_SAMPLER_RETURN_FORMAT_FLOAT32 0 348428d7b3dSmrg#define BRW_SAMPLER_RETURN_FORMAT_UINT32 2 349428d7b3dSmrg#define BRW_SAMPLER_RETURN_FORMAT_SINT32 3 350428d7b3dSmrg 351428d7b3dSmrg#define BRW_SAMPLER_MESSAGE_SAMPLE 0 352428d7b3dSmrg#define BRW_SAMPLER_MESSAGE_SIMD8_SAMPLE 0 353428d7b3dSmrg#define BRW_SAMPLER_MESSAGE_SIMD16_SAMPLE 0 354428d7b3dSmrg#define BRW_SAMPLER_MESSAGE_SIMD16_SAMPLE_BIAS 0 355428d7b3dSmrg#define BRW_SAMPLER_MESSAGE_SIMD8_KILLPIX 1 356428d7b3dSmrg#define BRW_SAMPLER_MESSAGE_SIMD4X2_SAMPLE_LOD 1 357428d7b3dSmrg#define BRW_SAMPLER_MESSAGE_SIMD16_SAMPLE_LOD 1 358428d7b3dSmrg#define BRW_SAMPLER_MESSAGE_SIMD4X2_SAMPLE_GRADIENTS 2 359428d7b3dSmrg#define BRW_SAMPLER_MESSAGE_SIMD8_SAMPLE_GRADIENTS 2 360428d7b3dSmrg#define BRW_SAMPLER_MESSAGE_SIMD4X2_SAMPLE_COMPARE 0 361428d7b3dSmrg#define BRW_SAMPLER_MESSAGE_SIMD16_SAMPLE_COMPARE 2 362428d7b3dSmrg#define BRW_SAMPLER_MESSAGE_SIMD8_SAMPLE_BIAS_COMPARE 0 363428d7b3dSmrg#define BRW_SAMPLER_MESSAGE_SIMD8_SAMPLE_LOD_COMPARE 1 364428d7b3dSmrg#define BRW_SAMPLER_MESSAGE_SIMD4X2_RESINFO 2 365428d7b3dSmrg#define BRW_SAMPLER_MESSAGE_SIMD16_RESINFO 2 366428d7b3dSmrg#define BRW_SAMPLER_MESSAGE_SIMD4X2_LD 3 367428d7b3dSmrg#define BRW_SAMPLER_MESSAGE_SIMD8_LD 3 368428d7b3dSmrg#define BRW_SAMPLER_MESSAGE_SIMD16_LD 3 369428d7b3dSmrg 370428d7b3dSmrg#define GEN5_SAMPLER_MESSAGE_SAMPLE 0 371428d7b3dSmrg#define GEN5_SAMPLER_MESSAGE_SAMPLE_BIAS 1 372428d7b3dSmrg#define GEN5_SAMPLER_MESSAGE_SAMPLE_LOD 2 373428d7b3dSmrg#define GEN5_SAMPLER_MESSAGE_SAMPLE_COMPARE 3 374428d7b3dSmrg#define GEN5_SAMPLER_MESSAGE_SAMPLE_DERIVS 4 375428d7b3dSmrg#define GEN5_SAMPLER_MESSAGE_SAMPLE_BIAS_COMPARE 5 376428d7b3dSmrg#define GEN5_SAMPLER_MESSAGE_SAMPLE_LOD_COMPARE 6 377428d7b3dSmrg#define GEN5_SAMPLER_MESSAGE_SAMPLE_LD 7 378428d7b3dSmrg#define GEN5_SAMPLER_MESSAGE_SAMPLE_RESINFO 10 379428d7b3dSmrg 380428d7b3dSmrg/* for GEN5 only */ 381428d7b3dSmrg#define BRW_SAMPLER_SIMD_MODE_SIMD4X2 0 382428d7b3dSmrg#define BRW_SAMPLER_SIMD_MODE_SIMD8 1 383428d7b3dSmrg#define BRW_SAMPLER_SIMD_MODE_SIMD16 2 384428d7b3dSmrg#define BRW_SAMPLER_SIMD_MODE_SIMD32_64 3 385428d7b3dSmrg 386428d7b3dSmrg#define BRW_DATAPORT_OWORD_BLOCK_1_OWORDLOW 0 387428d7b3dSmrg#define BRW_DATAPORT_OWORD_BLOCK_1_OWORDHIGH 1 388428d7b3dSmrg#define BRW_DATAPORT_OWORD_BLOCK_2_OWORDS 2 389428d7b3dSmrg#define BRW_DATAPORT_OWORD_BLOCK_4_OWORDS 3 390428d7b3dSmrg#define BRW_DATAPORT_OWORD_BLOCK_8_OWORDS 4 391428d7b3dSmrg 392428d7b3dSmrg#define BRW_DATAPORT_OWORD_DUAL_BLOCK_1OWORD 0 393428d7b3dSmrg#define BRW_DATAPORT_OWORD_DUAL_BLOCK_4OWORDS 2 394428d7b3dSmrg 395428d7b3dSmrg#define BRW_DATAPORT_DWORD_SCATTERED_BLOCK_8DWORDS 2 396428d7b3dSmrg#define BRW_DATAPORT_DWORD_SCATTERED_BLOCK_16DWORDS 3 397428d7b3dSmrg 398428d7b3dSmrg/* This one stays the same across generations. */ 399428d7b3dSmrg#define BRW_DATAPORT_READ_MESSAGE_OWORD_BLOCK_READ 0 400428d7b3dSmrg/* GEN4 */ 401428d7b3dSmrg#define BRW_DATAPORT_READ_MESSAGE_OWORD_DUAL_BLOCK_READ 1 402428d7b3dSmrg#define BRW_DATAPORT_READ_MESSAGE_MEDIA_BLOCK_READ 2 403428d7b3dSmrg#define BRW_DATAPORT_READ_MESSAGE_DWORD_SCATTERED_READ 3 404428d7b3dSmrg/* G45, GEN5 */ 405428d7b3dSmrg#define G45_DATAPORT_READ_MESSAGE_RENDER_UNORM_READ 1 406428d7b3dSmrg#define G45_DATAPORT_READ_MESSAGE_OWORD_DUAL_BLOCK_READ 2 407428d7b3dSmrg#define G45_DATAPORT_READ_MESSAGE_AVC_LOOP_FILTER_READ 3 408428d7b3dSmrg#define G45_DATAPORT_READ_MESSAGE_MEDIA_BLOCK_READ 4 409428d7b3dSmrg#define G45_DATAPORT_READ_MESSAGE_DWORD_SCATTERED_READ 6 410428d7b3dSmrg/* GEN6 */ 411428d7b3dSmrg#define GEN6_DATAPORT_READ_MESSAGE_RENDER_UNORM_READ 1 412428d7b3dSmrg#define GEN6_DATAPORT_READ_MESSAGE_OWORD_DUAL_BLOCK_READ 2 413428d7b3dSmrg#define GEN6_DATAPORT_READ_MESSAGE_MEDIA_BLOCK_READ 4 414428d7b3dSmrg#define GEN6_DATAPORT_READ_MESSAGE_OWORD_UNALIGN_BLOCK_READ 5 415428d7b3dSmrg#define GEN6_DATAPORT_READ_MESSAGE_DWORD_SCATTERED_READ 6 416428d7b3dSmrg 417428d7b3dSmrg#define BRW_DATAPORT_READ_TARGET_DATA_CACHE 0 418428d7b3dSmrg#define BRW_DATAPORT_READ_TARGET_RENDER_CACHE 1 419428d7b3dSmrg#define BRW_DATAPORT_READ_TARGET_SAMPLER_CACHE 2 420428d7b3dSmrg 421428d7b3dSmrg#define BRW_DATAPORT_RENDER_TARGET_WRITE_SIMD16_SINGLE_SOURCE 0 422428d7b3dSmrg#define BRW_DATAPORT_RENDER_TARGET_WRITE_SIMD16_SINGLE_SOURCE_REPLICATED 1 423428d7b3dSmrg#define BRW_DATAPORT_RENDER_TARGET_WRITE_SIMD8_DUAL_SOURCE_SUBSPAN01 2 424428d7b3dSmrg#define BRW_DATAPORT_RENDER_TARGET_WRITE_SIMD8_DUAL_SOURCE_SUBSPAN23 3 425428d7b3dSmrg#define BRW_DATAPORT_RENDER_TARGET_WRITE_SIMD8_SINGLE_SOURCE_SUBSPAN01 4 426428d7b3dSmrg 427428d7b3dSmrg/** 428428d7b3dSmrg * Message target: Shared Function ID for where to SEND a message. 429428d7b3dSmrg * 430428d7b3dSmrg * These are enumerated in the ISA reference under "send - Send Message". 431428d7b3dSmrg * In particular, see the following tables: 432428d7b3dSmrg * - G45 PRM, Volume 4, Table 14-15 "Message Descriptor Definition" 433428d7b3dSmrg * - Sandybridge PRM, Volume 4 Part 2, Table 8-16 "Extended Message Descriptor" 434428d7b3dSmrg * - BSpec, Volume 1a (GPU Overview) / Graphics Processing Engine (GPE) / 435428d7b3dSmrg * Overview / GPE Function IDs 436428d7b3dSmrg */ 437428d7b3dSmrgenum brw_message_target { 438428d7b3dSmrg BRW_SFID_NULL = 0, 439428d7b3dSmrg BRW_SFID_MATH = 1, /* Only valid on Gen4-5 */ 440428d7b3dSmrg BRW_SFID_SAMPLER = 2, 441428d7b3dSmrg BRW_SFID_MESSAGE_GATEWAY = 3, 442428d7b3dSmrg BRW_SFID_DATAPORT_READ = 4, 443428d7b3dSmrg BRW_SFID_DATAPORT_WRITE = 5, 444428d7b3dSmrg BRW_SFID_URB = 6, 445428d7b3dSmrg BRW_SFID_THREAD_SPAWNER = 7, 446428d7b3dSmrg 447428d7b3dSmrg GEN6_SFID_DATAPORT_SAMPLER_CACHE = 4, 448428d7b3dSmrg GEN6_SFID_DATAPORT_RENDER_CACHE = 5, 449428d7b3dSmrg GEN6_SFID_DATAPORT_CONSTANT_CACHE = 9, 450428d7b3dSmrg 451428d7b3dSmrg GEN7_SFID_DATAPORT_DATA_CACHE = 10, 452428d7b3dSmrg}; 453428d7b3dSmrg 454428d7b3dSmrg#define GEN7_MESSAGE_TARGET_DP_DATA_CACHE 10 455428d7b3dSmrg 456428d7b3dSmrg#define BRW_DATAPORT_WRITE_MESSAGE_OWORD_BLOCK_WRITE 0 457428d7b3dSmrg#define BRW_DATAPORT_WRITE_MESSAGE_OWORD_DUAL_BLOCK_WRITE 1 458428d7b3dSmrg#define BRW_DATAPORT_WRITE_MESSAGE_MEDIA_BLOCK_WRITE 2 459428d7b3dSmrg#define BRW_DATAPORT_WRITE_MESSAGE_DWORD_SCATTERED_WRITE 3 460428d7b3dSmrg#define BRW_DATAPORT_WRITE_MESSAGE_RENDER_TARGET_WRITE 4 461428d7b3dSmrg#define BRW_DATAPORT_WRITE_MESSAGE_STREAMED_VERTEX_BUFFER_WRITE 5 462428d7b3dSmrg#define BRW_DATAPORT_WRITE_MESSAGE_FLUSH_RENDER_CACHE 7 463428d7b3dSmrg 464428d7b3dSmrg/* GEN6 */ 465428d7b3dSmrg#define GEN6_DATAPORT_WRITE_MESSAGE_DWORD_ATOMIC_WRITE 7 466428d7b3dSmrg#define GEN6_DATAPORT_WRITE_MESSAGE_OWORD_BLOCK_WRITE 8 467428d7b3dSmrg#define GEN6_DATAPORT_WRITE_MESSAGE_OWORD_DUAL_BLOCK_WRITE 9 468428d7b3dSmrg#define GEN6_DATAPORT_WRITE_MESSAGE_MEDIA_BLOCK_WRITE 10 469428d7b3dSmrg#define GEN6_DATAPORT_WRITE_MESSAGE_DWORD_SCATTERED_WRITE 11 470428d7b3dSmrg#define GEN6_DATAPORT_WRITE_MESSAGE_RENDER_TARGET_WRITE 12 471428d7b3dSmrg#define GEN6_DATAPORT_WRITE_MESSAGE_STREAMED_VB_WRITE 13 472428d7b3dSmrg#define GEN6_DATAPORT_WRITE_MESSAGE_RENDER_TARGET_UNORM_WRITE 14 473428d7b3dSmrg 474428d7b3dSmrg#define BRW_MATH_FUNCTION_INV 1 475428d7b3dSmrg#define BRW_MATH_FUNCTION_LOG 2 476428d7b3dSmrg#define BRW_MATH_FUNCTION_EXP 3 477428d7b3dSmrg#define BRW_MATH_FUNCTION_SQRT 4 478428d7b3dSmrg#define BRW_MATH_FUNCTION_RSQ 5 479428d7b3dSmrg#define BRW_MATH_FUNCTION_SIN 6 /* was 7 */ 480428d7b3dSmrg#define BRW_MATH_FUNCTION_COS 7 /* was 8 */ 481428d7b3dSmrg#define BRW_MATH_FUNCTION_SINCOS 8 /* was 6 */ 482428d7b3dSmrg#define BRW_MATH_FUNCTION_TAN 9 /* gen4 */ 483428d7b3dSmrg#define BRW_MATH_FUNCTION_FDIV 9 /* gen6+ */ 484428d7b3dSmrg#define BRW_MATH_FUNCTION_POW 10 485428d7b3dSmrg#define BRW_MATH_FUNCTION_INT_DIV_QUOTIENT_AND_REMAINDER 11 486428d7b3dSmrg#define BRW_MATH_FUNCTION_INT_DIV_QUOTIENT 12 487428d7b3dSmrg#define BRW_MATH_FUNCTION_INT_DIV_REMAINDER 13 488428d7b3dSmrg 489428d7b3dSmrg#define BRW_MATH_INTEGER_UNSIGNED 0 490428d7b3dSmrg#define BRW_MATH_INTEGER_SIGNED 1 491428d7b3dSmrg 492428d7b3dSmrg#define BRW_MATH_PRECISION_FULL 0 493428d7b3dSmrg#define BRW_MATH_PRECISION_PARTIAL 1 494428d7b3dSmrg 495428d7b3dSmrg#define BRW_MATH_SATURATE_NONE 0 496428d7b3dSmrg#define BRW_MATH_SATURATE_SATURATE 1 497428d7b3dSmrg 498428d7b3dSmrg#define BRW_MATH_DATA_VECTOR 0 499428d7b3dSmrg#define BRW_MATH_DATA_SCALAR 1 500428d7b3dSmrg 501428d7b3dSmrg#define BRW_URB_OPCODE_WRITE 0 502428d7b3dSmrg 503428d7b3dSmrg#define BRW_URB_SWIZZLE_NONE 0 504428d7b3dSmrg#define BRW_URB_SWIZZLE_INTERLEAVE 1 505428d7b3dSmrg#define BRW_URB_SWIZZLE_TRANSPOSE 2 506428d7b3dSmrg 507428d7b3dSmrg#define BRW_SCRATCH_SPACE_SIZE_1K 0 508428d7b3dSmrg#define BRW_SCRATCH_SPACE_SIZE_2K 1 509428d7b3dSmrg#define BRW_SCRATCH_SPACE_SIZE_4K 2 510428d7b3dSmrg#define BRW_SCRATCH_SPACE_SIZE_8K 3 511428d7b3dSmrg#define BRW_SCRATCH_SPACE_SIZE_16K 4 512428d7b3dSmrg#define BRW_SCRATCH_SPACE_SIZE_32K 5 513428d7b3dSmrg#define BRW_SCRATCH_SPACE_SIZE_64K 6 514428d7b3dSmrg#define BRW_SCRATCH_SPACE_SIZE_128K 7 515428d7b3dSmrg#define BRW_SCRATCH_SPACE_SIZE_256K 8 516428d7b3dSmrg#define BRW_SCRATCH_SPACE_SIZE_512K 9 517428d7b3dSmrg#define BRW_SCRATCH_SPACE_SIZE_1M 10 518428d7b3dSmrg#define BRW_SCRATCH_SPACE_SIZE_2M 11 519428d7b3dSmrg 520428d7b3dSmrg#define REG_SIZE (8*4) 521428d7b3dSmrg 522428d7b3dSmrgstruct brw_instruction { 523428d7b3dSmrg struct { 524428d7b3dSmrg unsigned opcode:7; 525428d7b3dSmrg unsigned pad:1; 526428d7b3dSmrg unsigned access_mode:1; 527428d7b3dSmrg unsigned mask_control:1; 528428d7b3dSmrg unsigned dependency_control:2; 529428d7b3dSmrg unsigned compression_control:2; /* gen6: quater control */ 530428d7b3dSmrg unsigned thread_control:2; 531428d7b3dSmrg unsigned predicate_control:4; 532428d7b3dSmrg unsigned predicate_inverse:1; 533428d7b3dSmrg unsigned execution_size:3; 534428d7b3dSmrg /** 535428d7b3dSmrg * Conditional Modifier for most instructions. On Gen6+, this is also 536428d7b3dSmrg * used for the SEND instruction's Message Target/SFID. 537428d7b3dSmrg */ 538428d7b3dSmrg unsigned destreg__conditionalmod:4; 539428d7b3dSmrg unsigned acc_wr_control:1; 540428d7b3dSmrg unsigned cmpt_control:1; 541428d7b3dSmrg unsigned debug_control:1; 542428d7b3dSmrg unsigned saturate:1; 543428d7b3dSmrg } header; 544428d7b3dSmrg 545428d7b3dSmrg union { 546428d7b3dSmrg struct { 547428d7b3dSmrg unsigned dest_reg_file:2; 548428d7b3dSmrg unsigned dest_reg_type:3; 549428d7b3dSmrg unsigned src0_reg_file:2; 550428d7b3dSmrg unsigned src0_reg_type:3; 551428d7b3dSmrg unsigned src1_reg_file:2; 552428d7b3dSmrg unsigned src1_reg_type:3; 553428d7b3dSmrg unsigned pad:1; 554428d7b3dSmrg unsigned dest_subreg_nr:5; 555428d7b3dSmrg unsigned dest_reg_nr:8; 556428d7b3dSmrg unsigned dest_horiz_stride:2; 557428d7b3dSmrg unsigned dest_address_mode:1; 558428d7b3dSmrg } da1; 559428d7b3dSmrg 560428d7b3dSmrg struct { 561428d7b3dSmrg unsigned dest_reg_file:2; 562428d7b3dSmrg unsigned dest_reg_type:3; 563428d7b3dSmrg unsigned src0_reg_file:2; 564428d7b3dSmrg unsigned src0_reg_type:3; 565428d7b3dSmrg unsigned src1_reg_file:2; /* 0x00000c00 */ 566428d7b3dSmrg unsigned src1_reg_type:3; /* 0x00007000 */ 567428d7b3dSmrg unsigned pad:1; 568428d7b3dSmrg int dest_indirect_offset:10; /* offset against the deref'd address reg */ 569428d7b3dSmrg unsigned dest_subreg_nr:3; /* subnr for the address reg a0.x */ 570428d7b3dSmrg unsigned dest_horiz_stride:2; 571428d7b3dSmrg unsigned dest_address_mode:1; 572428d7b3dSmrg } ia1; 573428d7b3dSmrg 574428d7b3dSmrg struct { 575428d7b3dSmrg unsigned dest_reg_file:2; 576428d7b3dSmrg unsigned dest_reg_type:3; 577428d7b3dSmrg unsigned src0_reg_file:2; 578428d7b3dSmrg unsigned src0_reg_type:3; 579428d7b3dSmrg unsigned src1_reg_file:2; 580428d7b3dSmrg unsigned src1_reg_type:3; 581428d7b3dSmrg unsigned pad:1; 582428d7b3dSmrg unsigned dest_writemask:4; 583428d7b3dSmrg unsigned dest_subreg_nr:1; 584428d7b3dSmrg unsigned dest_reg_nr:8; 585428d7b3dSmrg unsigned dest_horiz_stride:2; 586428d7b3dSmrg unsigned dest_address_mode:1; 587428d7b3dSmrg } da16; 588428d7b3dSmrg 589428d7b3dSmrg struct { 590428d7b3dSmrg unsigned dest_reg_file:2; 591428d7b3dSmrg unsigned dest_reg_type:3; 592428d7b3dSmrg unsigned src0_reg_file:2; 593428d7b3dSmrg unsigned src0_reg_type:3; 594428d7b3dSmrg unsigned pad0:6; 595428d7b3dSmrg unsigned dest_writemask:4; 596428d7b3dSmrg int dest_indirect_offset:6; 597428d7b3dSmrg unsigned dest_subreg_nr:3; 598428d7b3dSmrg unsigned dest_horiz_stride:2; 599428d7b3dSmrg unsigned dest_address_mode:1; 600428d7b3dSmrg } ia16; 601428d7b3dSmrg 602428d7b3dSmrg struct { 603428d7b3dSmrg unsigned dest_reg_file:2; 604428d7b3dSmrg unsigned dest_reg_type:3; 605428d7b3dSmrg unsigned src0_reg_file:2; 606428d7b3dSmrg unsigned src0_reg_type:3; 607428d7b3dSmrg unsigned src1_reg_file:2; 608428d7b3dSmrg unsigned src1_reg_type:3; 609428d7b3dSmrg unsigned pad:1; 610428d7b3dSmrg 611428d7b3dSmrg int jump_count:16; 612428d7b3dSmrg } branch_gen6; 613428d7b3dSmrg 614428d7b3dSmrg struct { 615428d7b3dSmrg unsigned dest_reg_file:1; 616428d7b3dSmrg unsigned flag_subreg_num:1; 617428d7b3dSmrg unsigned pad0:2; 618428d7b3dSmrg unsigned src0_abs:1; 619428d7b3dSmrg unsigned src0_negate:1; 620428d7b3dSmrg unsigned src1_abs:1; 621428d7b3dSmrg unsigned src1_negate:1; 622428d7b3dSmrg unsigned src2_abs:1; 623428d7b3dSmrg unsigned src2_negate:1; 624428d7b3dSmrg unsigned pad1:7; 625428d7b3dSmrg unsigned dest_writemask:4; 626428d7b3dSmrg unsigned dest_subreg_nr:3; 627428d7b3dSmrg unsigned dest_reg_nr:8; 628428d7b3dSmrg } da3src; 629428d7b3dSmrg } bits1; 630428d7b3dSmrg 631428d7b3dSmrg 632428d7b3dSmrg union { 633428d7b3dSmrg struct { 634428d7b3dSmrg unsigned src0_subreg_nr:5; 635428d7b3dSmrg unsigned src0_reg_nr:8; 636428d7b3dSmrg unsigned src0_abs:1; 637428d7b3dSmrg unsigned src0_negate:1; 638428d7b3dSmrg unsigned src0_address_mode:1; 639428d7b3dSmrg unsigned src0_horiz_stride:2; 640428d7b3dSmrg unsigned src0_width:3; 641428d7b3dSmrg unsigned src0_vert_stride:4; 642428d7b3dSmrg unsigned flag_subreg_nr:1; 643428d7b3dSmrg unsigned flag_reg_nr:1; 644428d7b3dSmrg unsigned pad:5; 645428d7b3dSmrg } da1; 646428d7b3dSmrg 647428d7b3dSmrg struct { 648428d7b3dSmrg int src0_indirect_offset:10; 649428d7b3dSmrg unsigned src0_subreg_nr:3; 650428d7b3dSmrg unsigned src0_abs:1; 651428d7b3dSmrg unsigned src0_negate:1; 652428d7b3dSmrg unsigned src0_address_mode:1; 653428d7b3dSmrg unsigned src0_horiz_stride:2; 654428d7b3dSmrg unsigned src0_width:3; 655428d7b3dSmrg unsigned src0_vert_stride:4; 656428d7b3dSmrg unsigned flag_subreg_nr:1; 657428d7b3dSmrg unsigned flag_reg_nr:1; 658428d7b3dSmrg unsigned pad:5; 659428d7b3dSmrg } ia1; 660428d7b3dSmrg 661428d7b3dSmrg struct { 662428d7b3dSmrg unsigned src0_swz_x:2; 663428d7b3dSmrg unsigned src0_swz_y:2; 664428d7b3dSmrg unsigned src0_subreg_nr:1; 665428d7b3dSmrg unsigned src0_reg_nr:8; 666428d7b3dSmrg unsigned src0_abs:1; 667428d7b3dSmrg unsigned src0_negate:1; 668428d7b3dSmrg unsigned src0_address_mode:1; 669428d7b3dSmrg unsigned src0_swz_z:2; 670428d7b3dSmrg unsigned src0_swz_w:2; 671428d7b3dSmrg unsigned pad0:1; 672428d7b3dSmrg unsigned src0_vert_stride:4; 673428d7b3dSmrg unsigned flag_subreg_nr:1; 674428d7b3dSmrg unsigned flag_reg_nr:1; 675428d7b3dSmrg unsigned pad1:5; 676428d7b3dSmrg } da16; 677428d7b3dSmrg 678428d7b3dSmrg struct { 679428d7b3dSmrg unsigned src0_swz_x:2; 680428d7b3dSmrg unsigned src0_swz_y:2; 681428d7b3dSmrg int src0_indirect_offset:6; 682428d7b3dSmrg unsigned src0_subreg_nr:3; 683428d7b3dSmrg unsigned src0_abs:1; 684428d7b3dSmrg unsigned src0_negate:1; 685428d7b3dSmrg unsigned src0_address_mode:1; 686428d7b3dSmrg unsigned src0_swz_z:2; 687428d7b3dSmrg unsigned src0_swz_w:2; 688428d7b3dSmrg unsigned pad0:1; 689428d7b3dSmrg unsigned src0_vert_stride:4; 690428d7b3dSmrg unsigned flag_subreg_nr:1; 691428d7b3dSmrg unsigned flag_reg_nr:1; 692428d7b3dSmrg unsigned pad1:5; 693428d7b3dSmrg } ia16; 694428d7b3dSmrg 695428d7b3dSmrg /* Extended Message Descriptor for Ironlake (Gen5) SEND instruction. 696428d7b3dSmrg * 697428d7b3dSmrg * Does not apply to Gen6+. The SFID/message target moved to bits 698428d7b3dSmrg * 27:24 of the header (destreg__conditionalmod); EOT is in bits3. 699428d7b3dSmrg */ 700428d7b3dSmrg struct { 701428d7b3dSmrg unsigned pad:26; 702428d7b3dSmrg unsigned end_of_thread:1; 703428d7b3dSmrg unsigned pad1:1; 704428d7b3dSmrg unsigned sfid:4; 705428d7b3dSmrg } send_gen5; /* for Ironlake only */ 706428d7b3dSmrg 707428d7b3dSmrg struct { 708428d7b3dSmrg unsigned src0_rep_ctrl:1; 709428d7b3dSmrg unsigned src0_swizzle:8; 710428d7b3dSmrg unsigned src0_subreg_nr:3; 711428d7b3dSmrg unsigned src0_reg_nr:8; 712428d7b3dSmrg unsigned pad0:1; 713428d7b3dSmrg unsigned src1_rep_ctrl:1; 714428d7b3dSmrg unsigned src1_swizzle:8; 715428d7b3dSmrg unsigned src1_subreg_nr_low:2; 716428d7b3dSmrg } da3src; 717428d7b3dSmrg } bits2; 718428d7b3dSmrg 719428d7b3dSmrg union { 720428d7b3dSmrg struct { 721428d7b3dSmrg unsigned src1_subreg_nr:5; 722428d7b3dSmrg unsigned src1_reg_nr:8; 723428d7b3dSmrg unsigned src1_abs:1; 724428d7b3dSmrg unsigned src1_negate:1; 725428d7b3dSmrg unsigned src1_address_mode:1; 726428d7b3dSmrg unsigned src1_horiz_stride:2; 727428d7b3dSmrg unsigned src1_width:3; 728428d7b3dSmrg unsigned src1_vert_stride:4; 729428d7b3dSmrg unsigned pad0:7; 730428d7b3dSmrg } da1; 731428d7b3dSmrg 732428d7b3dSmrg struct { 733428d7b3dSmrg unsigned src1_swz_x:2; 734428d7b3dSmrg unsigned src1_swz_y:2; 735428d7b3dSmrg unsigned src1_subreg_nr:1; 736428d7b3dSmrg unsigned src1_reg_nr:8; 737428d7b3dSmrg unsigned src1_abs:1; 738428d7b3dSmrg unsigned src1_negate:1; 739428d7b3dSmrg unsigned src1_address_mode:1; 740428d7b3dSmrg unsigned src1_swz_z:2; 741428d7b3dSmrg unsigned src1_swz_w:2; 742428d7b3dSmrg unsigned pad1:1; 743428d7b3dSmrg unsigned src1_vert_stride:4; 744428d7b3dSmrg unsigned pad2:7; 745428d7b3dSmrg } da16; 746428d7b3dSmrg 747428d7b3dSmrg struct { 748428d7b3dSmrg int src1_indirect_offset:10; 749428d7b3dSmrg unsigned src1_subreg_nr:3; 750428d7b3dSmrg unsigned src1_abs:1; 751428d7b3dSmrg unsigned src1_negate:1; 752428d7b3dSmrg unsigned src1_address_mode:1; 753428d7b3dSmrg unsigned src1_horiz_stride:2; 754428d7b3dSmrg unsigned src1_width:3; 755428d7b3dSmrg unsigned src1_vert_stride:4; 756428d7b3dSmrg unsigned flag_subreg_nr:1; 757428d7b3dSmrg unsigned flag_reg_nr:1; 758428d7b3dSmrg unsigned pad1:5; 759428d7b3dSmrg } ia1; 760428d7b3dSmrg 761428d7b3dSmrg struct { 762428d7b3dSmrg unsigned src1_swz_x:2; 763428d7b3dSmrg unsigned src1_swz_y:2; 764428d7b3dSmrg int src1_indirect_offset:6; 765428d7b3dSmrg unsigned src1_subreg_nr:3; 766428d7b3dSmrg unsigned src1_abs:1; 767428d7b3dSmrg unsigned src1_negate:1; 768428d7b3dSmrg unsigned pad0:1; 769428d7b3dSmrg unsigned src1_swz_z:2; 770428d7b3dSmrg unsigned src1_swz_w:2; 771428d7b3dSmrg unsigned pad1:1; 772428d7b3dSmrg unsigned src1_vert_stride:4; 773428d7b3dSmrg unsigned flag_subreg_nr:1; 774428d7b3dSmrg unsigned flag_reg_nr:1; 775428d7b3dSmrg unsigned pad2:5; 776428d7b3dSmrg } ia16; 777428d7b3dSmrg 778428d7b3dSmrg struct { 779428d7b3dSmrg int jump_count:16; /* note: signed */ 780428d7b3dSmrg unsigned pop_count:4; 781428d7b3dSmrg unsigned pad0:12; 782428d7b3dSmrg } if_else; 783428d7b3dSmrg 784428d7b3dSmrg /* This is also used for gen7 IF/ELSE instructions */ 785428d7b3dSmrg struct { 786428d7b3dSmrg /* Signed jump distance to the ip to jump to if all channels 787428d7b3dSmrg * are disabled after the break or continue. It should point 788428d7b3dSmrg * to the end of the innermost control flow block, as that's 789428d7b3dSmrg * where some channel could get re-enabled. 790428d7b3dSmrg */ 791428d7b3dSmrg int jip:16; 792428d7b3dSmrg 793428d7b3dSmrg /* Signed jump distance to the location to resume execution 794428d7b3dSmrg * of this channel if it's enabled for the break or continue. 795428d7b3dSmrg */ 796428d7b3dSmrg int uip:16; 797428d7b3dSmrg } break_cont; 798428d7b3dSmrg 799428d7b3dSmrg /** 800428d7b3dSmrg * \defgroup SEND instructions / Message Descriptors 801428d7b3dSmrg * 802428d7b3dSmrg * @{ 803428d7b3dSmrg */ 804428d7b3dSmrg 805428d7b3dSmrg /** 806428d7b3dSmrg * Generic Message Descriptor for Gen4 SEND instructions. The structs 807428d7b3dSmrg * below expand function_control to something specific for their 808428d7b3dSmrg * message. Due to struct packing issues, they duplicate these bits. 809428d7b3dSmrg * 810428d7b3dSmrg * See the G45 PRM, Volume 4, Table 14-15. 811428d7b3dSmrg */ 812428d7b3dSmrg struct { 813428d7b3dSmrg unsigned function_control:16; 814428d7b3dSmrg unsigned response_length:4; 815428d7b3dSmrg unsigned msg_length:4; 816428d7b3dSmrg unsigned msg_target:4; 817428d7b3dSmrg unsigned pad1:3; 818428d7b3dSmrg unsigned end_of_thread:1; 819428d7b3dSmrg } generic; 820428d7b3dSmrg 821428d7b3dSmrg /** 822428d7b3dSmrg * Generic Message Descriptor for Gen5-7 SEND instructions. 823428d7b3dSmrg * 824428d7b3dSmrg * See the Sandybridge PRM, Volume 2 Part 2, Table 8-15. (Sadly, most 825428d7b3dSmrg * of the information on the SEND instruction is missing from the public 826428d7b3dSmrg * Ironlake PRM.) 827428d7b3dSmrg * 828428d7b3dSmrg * The table claims that bit 31 is reserved/MBZ on Gen6+, but it lies. 829428d7b3dSmrg * According to the SEND instruction description: 830428d7b3dSmrg * "The MSb of the message description, the EOT field, always comes from 831428d7b3dSmrg * bit 127 of the instruction word"...which is bit 31 of this field. 832428d7b3dSmrg */ 833428d7b3dSmrg struct { 834428d7b3dSmrg unsigned function_control:19; 835428d7b3dSmrg unsigned header_present:1; 836428d7b3dSmrg unsigned response_length:5; 837428d7b3dSmrg unsigned msg_length:4; 838428d7b3dSmrg unsigned pad1:2; 839428d7b3dSmrg unsigned end_of_thread:1; 840428d7b3dSmrg } generic_gen5; 841428d7b3dSmrg 842428d7b3dSmrg /** G45 PRM, Volume 4, Section 6.1.1.1 */ 843428d7b3dSmrg struct { 844428d7b3dSmrg unsigned function:4; 845428d7b3dSmrg unsigned int_type:1; 846428d7b3dSmrg unsigned precision:1; 847428d7b3dSmrg unsigned saturate:1; 848428d7b3dSmrg unsigned data_type:1; 849428d7b3dSmrg unsigned pad0:8; 850428d7b3dSmrg unsigned response_length:4; 851428d7b3dSmrg unsigned msg_length:4; 852428d7b3dSmrg unsigned msg_target:4; 853428d7b3dSmrg unsigned pad1:3; 854428d7b3dSmrg unsigned end_of_thread:1; 855428d7b3dSmrg } math; 856428d7b3dSmrg 857428d7b3dSmrg /** Ironlake PRM, Volume 4 Part 1, Section 6.1.1.1 */ 858428d7b3dSmrg struct { 859428d7b3dSmrg unsigned function:4; 860428d7b3dSmrg unsigned int_type:1; 861428d7b3dSmrg unsigned precision:1; 862428d7b3dSmrg unsigned saturate:1; 863428d7b3dSmrg unsigned data_type:1; 864428d7b3dSmrg unsigned snapshot:1; 865428d7b3dSmrg unsigned pad0:10; 866428d7b3dSmrg unsigned header_present:1; 867428d7b3dSmrg unsigned response_length:5; 868428d7b3dSmrg unsigned msg_length:4; 869428d7b3dSmrg unsigned pad1:2; 870428d7b3dSmrg unsigned end_of_thread:1; 871428d7b3dSmrg } math_gen5; 872428d7b3dSmrg 873428d7b3dSmrg /** G45 PRM, Volume 4, Section 4.8.1.1.1 [DevBW] and [DevCL] */ 874428d7b3dSmrg struct { 875428d7b3dSmrg unsigned binding_table_index:8; 876428d7b3dSmrg unsigned sampler:4; 877428d7b3dSmrg unsigned return_format:2; 878428d7b3dSmrg unsigned msg_type:2; 879428d7b3dSmrg unsigned response_length:4; 880428d7b3dSmrg unsigned msg_length:4; 881428d7b3dSmrg unsigned msg_target:4; 882428d7b3dSmrg unsigned pad1:3; 883428d7b3dSmrg unsigned end_of_thread:1; 884428d7b3dSmrg } sampler; 885428d7b3dSmrg 886428d7b3dSmrg /** G45 PRM, Volume 4, Section 4.8.1.1.2 [DevCTG] */ 887428d7b3dSmrg struct { 888428d7b3dSmrg unsigned binding_table_index:8; 889428d7b3dSmrg unsigned sampler:4; 890428d7b3dSmrg unsigned msg_type:4; 891428d7b3dSmrg unsigned response_length:4; 892428d7b3dSmrg unsigned msg_length:4; 893428d7b3dSmrg unsigned msg_target:4; 894428d7b3dSmrg unsigned pad1:3; 895428d7b3dSmrg unsigned end_of_thread:1; 896428d7b3dSmrg } sampler_g4x; 897428d7b3dSmrg 898428d7b3dSmrg /** Ironlake PRM, Volume 4 Part 1, Section 4.11.1.1.3 */ 899428d7b3dSmrg struct { 900428d7b3dSmrg unsigned binding_table_index:8; 901428d7b3dSmrg unsigned sampler:4; 902428d7b3dSmrg unsigned msg_type:4; 903428d7b3dSmrg unsigned simd_mode:2; 904428d7b3dSmrg unsigned pad0:1; 905428d7b3dSmrg unsigned header_present:1; 906428d7b3dSmrg unsigned response_length:5; 907428d7b3dSmrg unsigned msg_length:4; 908428d7b3dSmrg unsigned pad1:2; 909428d7b3dSmrg unsigned end_of_thread:1; 910428d7b3dSmrg } sampler_gen5; 911428d7b3dSmrg 912428d7b3dSmrg struct { 913428d7b3dSmrg unsigned binding_table_index:8; 914428d7b3dSmrg unsigned sampler:4; 915428d7b3dSmrg unsigned msg_type:5; 916428d7b3dSmrg unsigned simd_mode:2; 917428d7b3dSmrg unsigned header_present:1; 918428d7b3dSmrg unsigned response_length:5; 919428d7b3dSmrg unsigned msg_length:4; 920428d7b3dSmrg unsigned pad1:2; 921428d7b3dSmrg unsigned end_of_thread:1; 922428d7b3dSmrg } sampler_gen7; 923428d7b3dSmrg 924428d7b3dSmrg struct brw_urb_immediate { 925428d7b3dSmrg unsigned opcode:4; 926428d7b3dSmrg unsigned offset:6; 927428d7b3dSmrg unsigned swizzle_control:2; 928428d7b3dSmrg unsigned pad:1; 929428d7b3dSmrg unsigned allocate:1; 930428d7b3dSmrg unsigned used:1; 931428d7b3dSmrg unsigned complete:1; 932428d7b3dSmrg unsigned response_length:4; 933428d7b3dSmrg unsigned msg_length:4; 934428d7b3dSmrg unsigned msg_target:4; 935428d7b3dSmrg unsigned pad1:3; 936428d7b3dSmrg unsigned end_of_thread:1; 937428d7b3dSmrg } urb; 938428d7b3dSmrg 939428d7b3dSmrg struct { 940428d7b3dSmrg unsigned opcode:4; 941428d7b3dSmrg unsigned offset:6; 942428d7b3dSmrg unsigned swizzle_control:2; 943428d7b3dSmrg unsigned pad:1; 944428d7b3dSmrg unsigned allocate:1; 945428d7b3dSmrg unsigned used:1; 946428d7b3dSmrg unsigned complete:1; 947428d7b3dSmrg unsigned pad0:3; 948428d7b3dSmrg unsigned header_present:1; 949428d7b3dSmrg unsigned response_length:5; 950428d7b3dSmrg unsigned msg_length:4; 951428d7b3dSmrg unsigned pad1:2; 952428d7b3dSmrg unsigned end_of_thread:1; 953428d7b3dSmrg } urb_gen5; 954428d7b3dSmrg 955428d7b3dSmrg struct { 956428d7b3dSmrg unsigned opcode:3; 957428d7b3dSmrg unsigned offset:11; 958428d7b3dSmrg unsigned swizzle_control:1; 959428d7b3dSmrg unsigned complete:1; 960428d7b3dSmrg unsigned per_slot_offset:1; 961428d7b3dSmrg unsigned pad0:2; 962428d7b3dSmrg unsigned header_present:1; 963428d7b3dSmrg unsigned response_length:5; 964428d7b3dSmrg unsigned msg_length:4; 965428d7b3dSmrg unsigned pad1:2; 966428d7b3dSmrg unsigned end_of_thread:1; 967428d7b3dSmrg } urb_gen7; 968428d7b3dSmrg 969428d7b3dSmrg /** 965 PRM, Volume 4, Section 5.10.1.1: Message Descriptor */ 970428d7b3dSmrg struct { 971428d7b3dSmrg unsigned binding_table_index:8; 972428d7b3dSmrg unsigned msg_control:4; 973428d7b3dSmrg unsigned msg_type:2; 974428d7b3dSmrg unsigned target_cache:2; 975428d7b3dSmrg unsigned response_length:4; 976428d7b3dSmrg unsigned msg_length:4; 977428d7b3dSmrg unsigned msg_target:4; 978428d7b3dSmrg unsigned pad1:3; 979428d7b3dSmrg unsigned end_of_thread:1; 980428d7b3dSmrg } dp_read; 981428d7b3dSmrg 982428d7b3dSmrg /** G45 PRM, Volume 4, Section 5.10.1.1.2 */ 983428d7b3dSmrg struct { 984428d7b3dSmrg unsigned binding_table_index:8; 985428d7b3dSmrg unsigned msg_control:3; 986428d7b3dSmrg unsigned msg_type:3; 987428d7b3dSmrg unsigned target_cache:2; 988428d7b3dSmrg unsigned response_length:4; 989428d7b3dSmrg unsigned msg_length:4; 990428d7b3dSmrg unsigned msg_target:4; 991428d7b3dSmrg unsigned pad1:3; 992428d7b3dSmrg unsigned end_of_thread:1; 993428d7b3dSmrg } dp_read_g4x; 994428d7b3dSmrg 995428d7b3dSmrg /** Ironlake PRM, Volume 4 Part 1, Section 5.10.2.1.2. */ 996428d7b3dSmrg struct { 997428d7b3dSmrg unsigned binding_table_index:8; 998428d7b3dSmrg unsigned msg_control:3; 999428d7b3dSmrg unsigned msg_type:3; 1000428d7b3dSmrg unsigned target_cache:2; 1001428d7b3dSmrg unsigned pad0:3; 1002428d7b3dSmrg unsigned header_present:1; 1003428d7b3dSmrg unsigned response_length:5; 1004428d7b3dSmrg unsigned msg_length:4; 1005428d7b3dSmrg unsigned pad1:2; 1006428d7b3dSmrg unsigned end_of_thread:1; 1007428d7b3dSmrg } dp_read_gen5; 1008428d7b3dSmrg 1009428d7b3dSmrg /** G45 PRM, Volume 4, Section 5.10.1.1.2. For both Gen4 and G45. */ 1010428d7b3dSmrg struct { 1011428d7b3dSmrg unsigned binding_table_index:8; 1012428d7b3dSmrg unsigned msg_control:3; 1013428d7b3dSmrg unsigned last_render_target:1; 1014428d7b3dSmrg unsigned msg_type:3; 1015428d7b3dSmrg unsigned send_commit_msg:1; 1016428d7b3dSmrg unsigned response_length:4; 1017428d7b3dSmrg unsigned msg_length:4; 1018428d7b3dSmrg unsigned msg_target:4; 1019428d7b3dSmrg unsigned pad1:3; 1020428d7b3dSmrg unsigned end_of_thread:1; 1021428d7b3dSmrg } dp_write; 1022428d7b3dSmrg 1023428d7b3dSmrg /** Ironlake PRM, Volume 4 Part 1, Section 5.10.2.1.2. */ 1024428d7b3dSmrg struct { 1025428d7b3dSmrg unsigned binding_table_index:8; 1026428d7b3dSmrg unsigned msg_control:3; 1027428d7b3dSmrg unsigned last_render_target:1; 1028428d7b3dSmrg unsigned msg_type:3; 1029428d7b3dSmrg unsigned send_commit_msg:1; 1030428d7b3dSmrg unsigned pad0:3; 1031428d7b3dSmrg unsigned header_present:1; 1032428d7b3dSmrg unsigned response_length:5; 1033428d7b3dSmrg unsigned msg_length:4; 1034428d7b3dSmrg unsigned pad1:2; 1035428d7b3dSmrg unsigned end_of_thread:1; 1036428d7b3dSmrg } dp_write_gen5; 1037428d7b3dSmrg 1038428d7b3dSmrg /** 1039428d7b3dSmrg * Message for the Sandybridge Sampler Cache or Constant Cache Data Port. 1040428d7b3dSmrg * 1041428d7b3dSmrg * See the Sandybridge PRM, Volume 4 Part 1, Section 3.9.2.1.1. 1042428d7b3dSmrg **/ 1043428d7b3dSmrg struct { 1044428d7b3dSmrg unsigned binding_table_index:8; 1045428d7b3dSmrg unsigned msg_control:5; 1046428d7b3dSmrg unsigned msg_type:3; 1047428d7b3dSmrg unsigned pad0:3; 1048428d7b3dSmrg unsigned header_present:1; 1049428d7b3dSmrg unsigned response_length:5; 1050428d7b3dSmrg unsigned msg_length:4; 1051428d7b3dSmrg unsigned pad1:2; 1052428d7b3dSmrg unsigned end_of_thread:1; 1053428d7b3dSmrg } gen6_dp_sampler_const_cache; 1054428d7b3dSmrg 1055428d7b3dSmrg /** 1056428d7b3dSmrg * Message for the Sandybridge Render Cache Data Port. 1057428d7b3dSmrg * 1058428d7b3dSmrg * Most fields are defined in the Sandybridge PRM, Volume 4 Part 1, 1059428d7b3dSmrg * Section 3.9.2.1.1: Message Descriptor. 1060428d7b3dSmrg * 1061428d7b3dSmrg * "Slot Group Select" and "Last Render Target" are part of the 1062428d7b3dSmrg * 5-bit message control for Render Target Write messages. See 1063428d7b3dSmrg * Section 3.9.9.2.1 of the same volume. 1064428d7b3dSmrg */ 1065428d7b3dSmrg struct { 1066428d7b3dSmrg unsigned binding_table_index:8; 1067428d7b3dSmrg unsigned msg_control:3; 1068428d7b3dSmrg unsigned slot_group_select:1; 1069428d7b3dSmrg unsigned last_render_target:1; 1070428d7b3dSmrg unsigned msg_type:4; 1071428d7b3dSmrg unsigned send_commit_msg:1; 1072428d7b3dSmrg unsigned pad0:1; 1073428d7b3dSmrg unsigned header_present:1; 1074428d7b3dSmrg unsigned response_length:5; 1075428d7b3dSmrg unsigned msg_length:4; 1076428d7b3dSmrg unsigned pad1:2; 1077428d7b3dSmrg unsigned end_of_thread:1; 1078428d7b3dSmrg } gen6_dp; 1079428d7b3dSmrg 1080428d7b3dSmrg /** 1081428d7b3dSmrg * Message for any of the Gen7 Data Port caches. 1082428d7b3dSmrg * 1083428d7b3dSmrg * Most fields are defined in BSpec volume 5c.2 Data Port / Messages / 1084428d7b3dSmrg * Data Port Messages / Message Descriptor. Once again, "Slot Group 1085428d7b3dSmrg * Select" and "Last Render Target" are part of the 6-bit message 1086428d7b3dSmrg * control for Render Target Writes. 1087428d7b3dSmrg */ 1088428d7b3dSmrg struct { 1089428d7b3dSmrg unsigned binding_table_index:8; 1090428d7b3dSmrg unsigned msg_control:3; 1091428d7b3dSmrg unsigned slot_group_select:1; 1092428d7b3dSmrg unsigned last_render_target:1; 1093428d7b3dSmrg unsigned msg_control_pad:1; 1094428d7b3dSmrg unsigned msg_type:4; 1095428d7b3dSmrg unsigned pad1:1; 1096428d7b3dSmrg unsigned header_present:1; 1097428d7b3dSmrg unsigned response_length:5; 1098428d7b3dSmrg unsigned msg_length:4; 1099428d7b3dSmrg unsigned pad2:2; 1100428d7b3dSmrg unsigned end_of_thread:1; 1101428d7b3dSmrg } gen7_dp; 1102428d7b3dSmrg /** @} */ 1103428d7b3dSmrg 1104428d7b3dSmrg struct { 1105428d7b3dSmrg unsigned src1_subreg_nr_high:1; 1106428d7b3dSmrg unsigned src1_reg_nr:8; 1107428d7b3dSmrg unsigned pad0:1; 1108428d7b3dSmrg unsigned src2_rep_ctrl:1; 1109428d7b3dSmrg unsigned src2_swizzle:8; 1110428d7b3dSmrg unsigned src2_subreg_nr:3; 1111428d7b3dSmrg unsigned src2_reg_nr:8; 1112428d7b3dSmrg unsigned pad1:2; 1113428d7b3dSmrg } da3src; 1114428d7b3dSmrg 1115428d7b3dSmrg int d; 1116428d7b3dSmrg unsigned ud; 1117428d7b3dSmrg float f; 1118428d7b3dSmrg } bits3; 1119428d7b3dSmrg}; 1120428d7b3dSmrg 1121428d7b3dSmrg 1122428d7b3dSmrg/* These aren't hardware structs, just something useful for us to pass around: 1123428d7b3dSmrg * 1124428d7b3dSmrg * Align1 operation has a lot of control over input ranges. Used in 1125428d7b3dSmrg * WM programs to implement shaders decomposed into "channel serial" 1126428d7b3dSmrg * or "structure of array" form: 1127428d7b3dSmrg */ 1128428d7b3dSmrgstruct brw_reg { 1129428d7b3dSmrg unsigned type:4; 1130428d7b3dSmrg unsigned file:2; 1131428d7b3dSmrg unsigned nr:8; 1132428d7b3dSmrg unsigned subnr:5; /* :1 in align16 */ 1133428d7b3dSmrg unsigned negate:1; /* source only */ 1134428d7b3dSmrg unsigned abs:1; /* source only */ 1135428d7b3dSmrg unsigned vstride:4; /* source only */ 1136428d7b3dSmrg unsigned width:3; /* src only, align1 only */ 1137428d7b3dSmrg unsigned hstride:2; /* align1 only */ 1138428d7b3dSmrg unsigned address_mode:1; /* relative addressing, hopefully! */ 1139428d7b3dSmrg unsigned pad0:1; 1140428d7b3dSmrg 1141428d7b3dSmrg union { 1142428d7b3dSmrg struct { 1143428d7b3dSmrg unsigned swizzle:8; /* src only, align16 only */ 1144428d7b3dSmrg unsigned writemask:4; /* dest only, align16 only */ 1145428d7b3dSmrg int indirect_offset:10; /* relative addressing offset */ 1146428d7b3dSmrg unsigned pad1:10; /* two dwords total */ 1147428d7b3dSmrg } bits; 1148428d7b3dSmrg 1149428d7b3dSmrg float f; 1150428d7b3dSmrg int d; 1151428d7b3dSmrg unsigned ud; 1152428d7b3dSmrg } dw1; 1153428d7b3dSmrg}; 1154428d7b3dSmrg 1155428d7b3dSmrgstruct brw_indirect { 1156428d7b3dSmrg unsigned addr_subnr:4; 1157428d7b3dSmrg int addr_offset:10; 1158428d7b3dSmrg unsigned pad:18; 1159428d7b3dSmrg}; 1160428d7b3dSmrg 1161428d7b3dSmrg#define BRW_EU_MAX_INSN_STACK 5 1162428d7b3dSmrg#define BRW_EU_MAX_INSN 10000 1163428d7b3dSmrg 1164428d7b3dSmrgstruct brw_compile { 1165428d7b3dSmrg struct brw_instruction *store; 1166428d7b3dSmrg unsigned nr_insn; 1167428d7b3dSmrg 1168428d7b3dSmrg int gen; 1169428d7b3dSmrg 1170428d7b3dSmrg /* Allow clients to push/pop instruction state: 1171428d7b3dSmrg */ 1172428d7b3dSmrg struct brw_instruction stack[BRW_EU_MAX_INSN_STACK]; 1173428d7b3dSmrg bool compressed_stack[BRW_EU_MAX_INSN_STACK]; 1174428d7b3dSmrg struct brw_instruction *current; 1175428d7b3dSmrg 1176428d7b3dSmrg unsigned flag_value; 1177428d7b3dSmrg bool single_program_flow; 1178428d7b3dSmrg bool compressed; 1179428d7b3dSmrg 1180428d7b3dSmrg /* Control flow stacks: 1181428d7b3dSmrg * - if_stack contains IF and ELSE instructions which must be patched 1182428d7b3dSmrg * (and popped) once the matching ENDIF instruction is encountered. 1183428d7b3dSmrg */ 1184428d7b3dSmrg struct brw_instruction **if_stack; 1185428d7b3dSmrg int if_stack_depth; 1186428d7b3dSmrg int if_stack_array_size; 1187428d7b3dSmrg}; 1188428d7b3dSmrg 1189428d7b3dSmrgstatic inline int type_sz(unsigned type) 1190428d7b3dSmrg{ 1191428d7b3dSmrg switch (type) { 1192428d7b3dSmrg case BRW_REGISTER_TYPE_UD: 1193428d7b3dSmrg case BRW_REGISTER_TYPE_D: 1194428d7b3dSmrg case BRW_REGISTER_TYPE_F: 1195428d7b3dSmrg return 4; 1196428d7b3dSmrg case BRW_REGISTER_TYPE_HF: 1197428d7b3dSmrg case BRW_REGISTER_TYPE_UW: 1198428d7b3dSmrg case BRW_REGISTER_TYPE_W: 1199428d7b3dSmrg return 2; 1200428d7b3dSmrg case BRW_REGISTER_TYPE_UB: 1201428d7b3dSmrg case BRW_REGISTER_TYPE_B: 1202428d7b3dSmrg return 1; 1203428d7b3dSmrg default: 1204428d7b3dSmrg return 0; 1205428d7b3dSmrg } 1206428d7b3dSmrg} 1207428d7b3dSmrg 1208428d7b3dSmrg/** 1209428d7b3dSmrg * Construct a brw_reg. 1210428d7b3dSmrg * \param file one of the BRW_x_REGISTER_FILE values 1211428d7b3dSmrg * \param nr register number/index 1212428d7b3dSmrg * \param subnr register sub number 1213428d7b3dSmrg * \param type one of BRW_REGISTER_TYPE_x 1214428d7b3dSmrg * \param vstride one of BRW_VERTICAL_STRIDE_x 1215428d7b3dSmrg * \param width one of BRW_WIDTH_x 1216428d7b3dSmrg * \param hstride one of BRW_HORIZONTAL_STRIDE_x 1217428d7b3dSmrg * \param swizzle one of BRW_SWIZZLE_x 1218428d7b3dSmrg * \param writemask WRITEMASK_X/Y/Z/W bitfield 1219428d7b3dSmrg */ 1220428d7b3dSmrgstatic inline struct brw_reg brw_reg(unsigned file, 1221428d7b3dSmrg unsigned nr, 1222428d7b3dSmrg unsigned subnr, 1223428d7b3dSmrg unsigned type, 1224428d7b3dSmrg unsigned vstride, 1225428d7b3dSmrg unsigned width, 1226428d7b3dSmrg unsigned hstride, 1227428d7b3dSmrg unsigned swizzle, 1228428d7b3dSmrg unsigned writemask) 1229428d7b3dSmrg{ 1230428d7b3dSmrg struct brw_reg reg; 1231428d7b3dSmrg if (file == BRW_GENERAL_REGISTER_FILE) 1232428d7b3dSmrg assert(nr < BRW_MAX_GRF); 1233428d7b3dSmrg else if (file == BRW_MESSAGE_REGISTER_FILE) 1234428d7b3dSmrg assert((nr & ~(1 << 7)) < BRW_MAX_MRF); 1235428d7b3dSmrg else if (file == BRW_ARCHITECTURE_REGISTER_FILE) 1236428d7b3dSmrg assert(nr <= BRW_ARF_IP); 1237428d7b3dSmrg 1238428d7b3dSmrg reg.type = type; 1239428d7b3dSmrg reg.file = file; 1240428d7b3dSmrg reg.nr = nr; 1241428d7b3dSmrg reg.subnr = subnr * type_sz(type); 1242428d7b3dSmrg reg.negate = 0; 1243428d7b3dSmrg reg.abs = 0; 1244428d7b3dSmrg reg.vstride = vstride; 1245428d7b3dSmrg reg.width = width; 1246428d7b3dSmrg reg.hstride = hstride; 1247428d7b3dSmrg reg.address_mode = BRW_ADDRESS_DIRECT; 1248428d7b3dSmrg reg.pad0 = 0; 1249428d7b3dSmrg 1250428d7b3dSmrg /* Could do better: If the reg is r5.3<0;1,0>, we probably want to 1251428d7b3dSmrg * set swizzle and writemask to W, as the lower bits of subnr will 1252428d7b3dSmrg * be lost when converted to align16. This is probably too much to 1253428d7b3dSmrg * keep track of as you'd want it adjusted by suboffset(), etc. 1254428d7b3dSmrg * Perhaps fix up when converting to align16? 1255428d7b3dSmrg */ 1256428d7b3dSmrg reg.dw1.bits.swizzle = swizzle; 1257428d7b3dSmrg reg.dw1.bits.writemask = writemask; 1258428d7b3dSmrg reg.dw1.bits.indirect_offset = 0; 1259428d7b3dSmrg reg.dw1.bits.pad1 = 0; 1260428d7b3dSmrg return reg; 1261428d7b3dSmrg} 1262428d7b3dSmrg 1263428d7b3dSmrg/** Construct float[16] register */ 1264428d7b3dSmrgstatic inline struct brw_reg brw_vec16_reg(unsigned file, 1265428d7b3dSmrg unsigned nr, 1266428d7b3dSmrg unsigned subnr) 1267428d7b3dSmrg{ 1268428d7b3dSmrg return brw_reg(file, 1269428d7b3dSmrg nr, 1270428d7b3dSmrg subnr, 1271428d7b3dSmrg BRW_REGISTER_TYPE_F, 1272428d7b3dSmrg BRW_VERTICAL_STRIDE_16, 1273428d7b3dSmrg BRW_WIDTH_16, 1274428d7b3dSmrg BRW_HORIZONTAL_STRIDE_1, 1275428d7b3dSmrg BRW_SWIZZLE_XYZW, 1276428d7b3dSmrg WRITEMASK_XYZW); 1277428d7b3dSmrg} 1278428d7b3dSmrg 1279428d7b3dSmrg/** Construct float[8] register */ 1280428d7b3dSmrgstatic inline struct brw_reg brw_vec8_reg(unsigned file, 1281428d7b3dSmrg unsigned nr, 1282428d7b3dSmrg unsigned subnr) 1283428d7b3dSmrg{ 1284428d7b3dSmrg return brw_reg(file, 1285428d7b3dSmrg nr, 1286428d7b3dSmrg subnr, 1287428d7b3dSmrg BRW_REGISTER_TYPE_F, 1288428d7b3dSmrg BRW_VERTICAL_STRIDE_8, 1289428d7b3dSmrg BRW_WIDTH_8, 1290428d7b3dSmrg BRW_HORIZONTAL_STRIDE_1, 1291428d7b3dSmrg BRW_SWIZZLE_XYZW, 1292428d7b3dSmrg WRITEMASK_XYZW); 1293428d7b3dSmrg} 1294428d7b3dSmrg 1295428d7b3dSmrg/** Construct float[4] register */ 1296428d7b3dSmrgstatic inline struct brw_reg brw_vec4_reg(unsigned file, 1297428d7b3dSmrg unsigned nr, 1298428d7b3dSmrg unsigned subnr) 1299428d7b3dSmrg{ 1300428d7b3dSmrg return brw_reg(file, 1301428d7b3dSmrg nr, 1302428d7b3dSmrg subnr, 1303428d7b3dSmrg BRW_REGISTER_TYPE_F, 1304428d7b3dSmrg BRW_VERTICAL_STRIDE_4, 1305428d7b3dSmrg BRW_WIDTH_4, 1306428d7b3dSmrg BRW_HORIZONTAL_STRIDE_1, 1307428d7b3dSmrg BRW_SWIZZLE_XYZW, 1308428d7b3dSmrg WRITEMASK_XYZW); 1309428d7b3dSmrg} 1310428d7b3dSmrg 1311428d7b3dSmrg/** Construct float[2] register */ 1312428d7b3dSmrgstatic inline struct brw_reg brw_vec2_reg(unsigned file, 1313428d7b3dSmrg unsigned nr, 1314428d7b3dSmrg unsigned subnr) 1315428d7b3dSmrg{ 1316428d7b3dSmrg return brw_reg(file, 1317428d7b3dSmrg nr, 1318428d7b3dSmrg subnr, 1319428d7b3dSmrg BRW_REGISTER_TYPE_F, 1320428d7b3dSmrg BRW_VERTICAL_STRIDE_2, 1321428d7b3dSmrg BRW_WIDTH_2, 1322428d7b3dSmrg BRW_HORIZONTAL_STRIDE_1, 1323428d7b3dSmrg BRW_SWIZZLE_XYXY, 1324428d7b3dSmrg WRITEMASK_XY); 1325428d7b3dSmrg} 1326428d7b3dSmrg 1327428d7b3dSmrg/** Construct float[1] register */ 1328428d7b3dSmrgstatic inline struct brw_reg brw_vec1_reg(unsigned file, 1329428d7b3dSmrg unsigned nr, 1330428d7b3dSmrg unsigned subnr) 1331428d7b3dSmrg{ 1332428d7b3dSmrg return brw_reg(file, 1333428d7b3dSmrg nr, 1334428d7b3dSmrg subnr, 1335428d7b3dSmrg BRW_REGISTER_TYPE_F, 1336428d7b3dSmrg BRW_VERTICAL_STRIDE_0, 1337428d7b3dSmrg BRW_WIDTH_1, 1338428d7b3dSmrg BRW_HORIZONTAL_STRIDE_0, 1339428d7b3dSmrg BRW_SWIZZLE_XXXX, 1340428d7b3dSmrg WRITEMASK_X); 1341428d7b3dSmrg} 1342428d7b3dSmrg 1343428d7b3dSmrg 1344428d7b3dSmrgstatic inline struct brw_reg __retype(struct brw_reg reg, 1345428d7b3dSmrg unsigned type) 1346428d7b3dSmrg{ 1347428d7b3dSmrg reg.type = type; 1348428d7b3dSmrg return reg; 1349428d7b3dSmrg} 1350428d7b3dSmrg 1351428d7b3dSmrgstatic inline struct brw_reg __retype_d(struct brw_reg reg) 1352428d7b3dSmrg{ 1353428d7b3dSmrg return __retype(reg, BRW_REGISTER_TYPE_D); 1354428d7b3dSmrg} 1355428d7b3dSmrg 1356428d7b3dSmrgstatic inline struct brw_reg __retype_ud(struct brw_reg reg) 1357428d7b3dSmrg{ 1358428d7b3dSmrg return __retype(reg, BRW_REGISTER_TYPE_UD); 1359428d7b3dSmrg} 1360428d7b3dSmrg 1361428d7b3dSmrgstatic inline struct brw_reg __retype_uw(struct brw_reg reg) 1362428d7b3dSmrg{ 1363428d7b3dSmrg return __retype(reg, BRW_REGISTER_TYPE_UW); 1364428d7b3dSmrg} 1365428d7b3dSmrg 1366428d7b3dSmrgstatic inline struct brw_reg __sechalf(struct brw_reg reg) 1367428d7b3dSmrg{ 1368428d7b3dSmrg if (reg.vstride) 1369428d7b3dSmrg reg.nr++; 1370428d7b3dSmrg return reg; 1371428d7b3dSmrg} 1372428d7b3dSmrg 1373428d7b3dSmrgstatic inline struct brw_reg __suboffset(struct brw_reg reg, 1374428d7b3dSmrg unsigned delta) 1375428d7b3dSmrg{ 1376428d7b3dSmrg reg.subnr += delta * type_sz(reg.type); 1377428d7b3dSmrg return reg; 1378428d7b3dSmrg} 1379428d7b3dSmrg 1380428d7b3dSmrgstatic inline struct brw_reg __offset(struct brw_reg reg, 1381428d7b3dSmrg unsigned delta) 1382428d7b3dSmrg{ 1383428d7b3dSmrg reg.nr += delta; 1384428d7b3dSmrg return reg; 1385428d7b3dSmrg} 1386428d7b3dSmrg 1387428d7b3dSmrgstatic inline struct brw_reg byte_offset(struct brw_reg reg, 1388428d7b3dSmrg unsigned bytes) 1389428d7b3dSmrg{ 1390428d7b3dSmrg unsigned newoffset = reg.nr * REG_SIZE + reg.subnr + bytes; 1391428d7b3dSmrg reg.nr = newoffset / REG_SIZE; 1392428d7b3dSmrg reg.subnr = newoffset % REG_SIZE; 1393428d7b3dSmrg return reg; 1394428d7b3dSmrg} 1395428d7b3dSmrg 1396428d7b3dSmrg 1397428d7b3dSmrg/** Construct unsigned word[16] register */ 1398428d7b3dSmrgstatic inline struct brw_reg brw_uw16_reg(unsigned file, 1399428d7b3dSmrg unsigned nr, 1400428d7b3dSmrg unsigned subnr) 1401428d7b3dSmrg{ 1402428d7b3dSmrg return __suboffset(__retype(brw_vec16_reg(file, nr, 0), BRW_REGISTER_TYPE_UW), subnr); 1403428d7b3dSmrg} 1404428d7b3dSmrg 1405428d7b3dSmrg/** Construct unsigned word[8] register */ 1406428d7b3dSmrgstatic inline struct brw_reg brw_uw8_reg(unsigned file, 1407428d7b3dSmrg unsigned nr, 1408428d7b3dSmrg unsigned subnr) 1409428d7b3dSmrg{ 1410428d7b3dSmrg return __suboffset(__retype(brw_vec8_reg(file, nr, 0), BRW_REGISTER_TYPE_UW), subnr); 1411428d7b3dSmrg} 1412428d7b3dSmrg 1413428d7b3dSmrg/** Construct unsigned word[1] register */ 1414428d7b3dSmrgstatic inline struct brw_reg brw_uw1_reg(unsigned file, 1415428d7b3dSmrg unsigned nr, 1416428d7b3dSmrg unsigned subnr) 1417428d7b3dSmrg{ 1418428d7b3dSmrg return __suboffset(__retype(brw_vec1_reg(file, nr, 0), BRW_REGISTER_TYPE_UW), subnr); 1419428d7b3dSmrg} 1420428d7b3dSmrg 1421428d7b3dSmrgstatic inline struct brw_reg brw_imm_reg(unsigned type) 1422428d7b3dSmrg{ 1423428d7b3dSmrg return brw_reg( BRW_IMMEDIATE_VALUE, 1424428d7b3dSmrg 0, 1425428d7b3dSmrg 0, 1426428d7b3dSmrg type, 1427428d7b3dSmrg BRW_VERTICAL_STRIDE_0, 1428428d7b3dSmrg BRW_WIDTH_1, 1429428d7b3dSmrg BRW_HORIZONTAL_STRIDE_0, 1430428d7b3dSmrg 0, 1431428d7b3dSmrg 0); 1432428d7b3dSmrg} 1433428d7b3dSmrg 1434428d7b3dSmrg/** Construct float immediate register */ 1435428d7b3dSmrgstatic inline struct brw_reg brw_imm_f(float f) 1436428d7b3dSmrg{ 1437428d7b3dSmrg struct brw_reg imm = brw_imm_reg(BRW_REGISTER_TYPE_F); 1438428d7b3dSmrg imm.dw1.f = f; 1439428d7b3dSmrg return imm; 1440428d7b3dSmrg} 1441428d7b3dSmrg 1442428d7b3dSmrg/** Construct integer immediate register */ 1443428d7b3dSmrgstatic inline struct brw_reg brw_imm_d(int d) 1444428d7b3dSmrg{ 1445428d7b3dSmrg struct brw_reg imm = brw_imm_reg(BRW_REGISTER_TYPE_D); 1446428d7b3dSmrg imm.dw1.d = d; 1447428d7b3dSmrg return imm; 1448428d7b3dSmrg} 1449428d7b3dSmrg 1450428d7b3dSmrg/** Construct uint immediate register */ 1451428d7b3dSmrgstatic inline struct brw_reg brw_imm_ud(unsigned ud) 1452428d7b3dSmrg{ 1453428d7b3dSmrg struct brw_reg imm = brw_imm_reg(BRW_REGISTER_TYPE_UD); 1454428d7b3dSmrg imm.dw1.ud = ud; 1455428d7b3dSmrg return imm; 1456428d7b3dSmrg} 1457428d7b3dSmrg 1458428d7b3dSmrg/** Construct ushort immediate register */ 1459428d7b3dSmrgstatic inline struct brw_reg brw_imm_uw(uint16_t uw) 1460428d7b3dSmrg{ 1461428d7b3dSmrg struct brw_reg imm = brw_imm_reg(BRW_REGISTER_TYPE_UW); 1462428d7b3dSmrg imm.dw1.ud = uw | (uw << 16); 1463428d7b3dSmrg return imm; 1464428d7b3dSmrg} 1465428d7b3dSmrg 1466428d7b3dSmrg/** Construct short immediate register */ 1467428d7b3dSmrgstatic inline struct brw_reg brw_imm_w(int16_t w) 1468428d7b3dSmrg{ 1469428d7b3dSmrg struct brw_reg imm = brw_imm_reg(BRW_REGISTER_TYPE_W); 1470428d7b3dSmrg imm.dw1.d = w | (w << 16); 1471428d7b3dSmrg return imm; 1472428d7b3dSmrg} 1473428d7b3dSmrg 1474428d7b3dSmrg/* brw_imm_b and brw_imm_ub aren't supported by hardware - the type 1475428d7b3dSmrg * numbers alias with _V and _VF below: 1476428d7b3dSmrg */ 1477428d7b3dSmrg 1478428d7b3dSmrg/** Construct vector of eight signed half-byte values */ 1479428d7b3dSmrgstatic inline struct brw_reg brw_imm_v(unsigned v) 1480428d7b3dSmrg{ 1481428d7b3dSmrg struct brw_reg imm = brw_imm_reg(BRW_REGISTER_TYPE_V); 1482428d7b3dSmrg imm.vstride = BRW_VERTICAL_STRIDE_0; 1483428d7b3dSmrg imm.width = BRW_WIDTH_8; 1484428d7b3dSmrg imm.hstride = BRW_HORIZONTAL_STRIDE_1; 1485428d7b3dSmrg imm.dw1.ud = v; 1486428d7b3dSmrg return imm; 1487428d7b3dSmrg} 1488428d7b3dSmrg 1489428d7b3dSmrg/** Construct vector of four 8-bit float values */ 1490428d7b3dSmrgstatic inline struct brw_reg brw_imm_vf(unsigned v) 1491428d7b3dSmrg{ 1492428d7b3dSmrg struct brw_reg imm = brw_imm_reg(BRW_REGISTER_TYPE_VF); 1493428d7b3dSmrg imm.vstride = BRW_VERTICAL_STRIDE_0; 1494428d7b3dSmrg imm.width = BRW_WIDTH_4; 1495428d7b3dSmrg imm.hstride = BRW_HORIZONTAL_STRIDE_1; 1496428d7b3dSmrg imm.dw1.ud = v; 1497428d7b3dSmrg return imm; 1498428d7b3dSmrg} 1499428d7b3dSmrg 1500428d7b3dSmrg#define VF_ZERO 0x0 1501428d7b3dSmrg#define VF_ONE 0x30 1502428d7b3dSmrg#define VF_NEG (1<<7) 1503428d7b3dSmrg 1504428d7b3dSmrgstatic inline struct brw_reg brw_imm_vf4(unsigned v0, 1505428d7b3dSmrg unsigned v1, 1506428d7b3dSmrg unsigned v2, 1507428d7b3dSmrg unsigned v3) 1508428d7b3dSmrg{ 1509428d7b3dSmrg struct brw_reg imm = brw_imm_reg(BRW_REGISTER_TYPE_VF); 1510428d7b3dSmrg imm.vstride = BRW_VERTICAL_STRIDE_0; 1511428d7b3dSmrg imm.width = BRW_WIDTH_4; 1512428d7b3dSmrg imm.hstride = BRW_HORIZONTAL_STRIDE_1; 1513428d7b3dSmrg imm.dw1.ud = ((v0 << 0) | 1514428d7b3dSmrg (v1 << 8) | 1515428d7b3dSmrg (v2 << 16) | 1516428d7b3dSmrg (v3 << 24)); 1517428d7b3dSmrg return imm; 1518428d7b3dSmrg} 1519428d7b3dSmrg 1520428d7b3dSmrgstatic inline struct brw_reg brw_address(struct brw_reg reg) 1521428d7b3dSmrg{ 1522428d7b3dSmrg return brw_imm_uw(reg.nr * REG_SIZE + reg.subnr); 1523428d7b3dSmrg} 1524428d7b3dSmrg 1525428d7b3dSmrg/** Construct float[1] general-purpose register */ 1526428d7b3dSmrgstatic inline struct brw_reg brw_vec1_grf(unsigned nr, unsigned subnr) 1527428d7b3dSmrg{ 1528428d7b3dSmrg return brw_vec1_reg(BRW_GENERAL_REGISTER_FILE, nr, subnr); 1529428d7b3dSmrg} 1530428d7b3dSmrg 1531428d7b3dSmrg/** Construct float[2] general-purpose register */ 1532428d7b3dSmrgstatic inline struct brw_reg brw_vec2_grf(unsigned nr, unsigned subnr) 1533428d7b3dSmrg{ 1534428d7b3dSmrg return brw_vec2_reg(BRW_GENERAL_REGISTER_FILE, nr, subnr); 1535428d7b3dSmrg} 1536428d7b3dSmrg 1537428d7b3dSmrg/** Construct float[4] general-purpose register */ 1538428d7b3dSmrgstatic inline struct brw_reg brw_vec4_grf(unsigned nr, unsigned subnr) 1539428d7b3dSmrg{ 1540428d7b3dSmrg return brw_vec4_reg(BRW_GENERAL_REGISTER_FILE, nr, subnr); 1541428d7b3dSmrg} 1542428d7b3dSmrg 1543428d7b3dSmrg/** Construct float[8] general-purpose register */ 1544428d7b3dSmrgstatic inline struct brw_reg brw_vec8_grf(unsigned nr, unsigned subnr) 1545428d7b3dSmrg{ 1546428d7b3dSmrg return brw_vec8_reg(BRW_GENERAL_REGISTER_FILE, nr, subnr); 1547428d7b3dSmrg} 1548428d7b3dSmrg 1549428d7b3dSmrgstatic inline struct brw_reg brw_uw8_grf(unsigned nr, unsigned subnr) 1550428d7b3dSmrg{ 1551428d7b3dSmrg return brw_uw8_reg(BRW_GENERAL_REGISTER_FILE, nr, subnr); 1552428d7b3dSmrg} 1553428d7b3dSmrg 1554428d7b3dSmrgstatic inline struct brw_reg brw_uw16_grf(unsigned nr, unsigned subnr) 1555428d7b3dSmrg{ 1556428d7b3dSmrg return brw_uw16_reg(BRW_GENERAL_REGISTER_FILE, nr, subnr); 1557428d7b3dSmrg} 1558428d7b3dSmrg 1559428d7b3dSmrg/** Construct null register (usually used for setting condition codes) */ 1560428d7b3dSmrgstatic inline struct brw_reg brw_null_reg(void) 1561428d7b3dSmrg{ 1562428d7b3dSmrg return brw_vec8_reg(BRW_ARCHITECTURE_REGISTER_FILE, 1563428d7b3dSmrg BRW_ARF_NULL, 1564428d7b3dSmrg 0); 1565428d7b3dSmrg} 1566428d7b3dSmrg 1567428d7b3dSmrgstatic inline struct brw_reg brw_address_reg(unsigned subnr) 1568428d7b3dSmrg{ 1569428d7b3dSmrg return brw_uw1_reg(BRW_ARCHITECTURE_REGISTER_FILE, 1570428d7b3dSmrg BRW_ARF_ADDRESS, 1571428d7b3dSmrg subnr); 1572428d7b3dSmrg} 1573428d7b3dSmrg 1574428d7b3dSmrg/* If/else instructions break in align16 mode if writemask & swizzle 1575428d7b3dSmrg * aren't xyzw. This goes against the convention for other scalar 1576428d7b3dSmrg * regs: 1577428d7b3dSmrg */ 1578428d7b3dSmrgstatic inline struct brw_reg brw_ip_reg(void) 1579428d7b3dSmrg{ 1580428d7b3dSmrg return brw_reg(BRW_ARCHITECTURE_REGISTER_FILE, 1581428d7b3dSmrg BRW_ARF_IP, 1582428d7b3dSmrg 0, 1583428d7b3dSmrg BRW_REGISTER_TYPE_UD, 1584428d7b3dSmrg BRW_VERTICAL_STRIDE_4, /* ? */ 1585428d7b3dSmrg BRW_WIDTH_1, 1586428d7b3dSmrg BRW_HORIZONTAL_STRIDE_0, 1587428d7b3dSmrg BRW_SWIZZLE_XYZW, /* NOTE! */ 1588428d7b3dSmrg WRITEMASK_XYZW); /* NOTE! */ 1589428d7b3dSmrg} 1590428d7b3dSmrg 1591428d7b3dSmrgstatic inline struct brw_reg brw_acc_reg(void) 1592428d7b3dSmrg{ 1593428d7b3dSmrg return brw_vec8_reg(BRW_ARCHITECTURE_REGISTER_FILE, 1594428d7b3dSmrg BRW_ARF_ACCUMULATOR, 1595428d7b3dSmrg 0); 1596428d7b3dSmrg} 1597428d7b3dSmrg 1598428d7b3dSmrgstatic inline struct brw_reg brw_notification_1_reg(void) 1599428d7b3dSmrg{ 1600428d7b3dSmrg return brw_reg(BRW_ARCHITECTURE_REGISTER_FILE, 1601428d7b3dSmrg BRW_ARF_NOTIFICATION_COUNT, 1602428d7b3dSmrg 1, 1603428d7b3dSmrg BRW_REGISTER_TYPE_UD, 1604428d7b3dSmrg BRW_VERTICAL_STRIDE_0, 1605428d7b3dSmrg BRW_WIDTH_1, 1606428d7b3dSmrg BRW_HORIZONTAL_STRIDE_0, 1607428d7b3dSmrg BRW_SWIZZLE_XXXX, 1608428d7b3dSmrg WRITEMASK_X); 1609428d7b3dSmrg} 1610428d7b3dSmrg 1611428d7b3dSmrgstatic inline struct brw_reg brw_flag_reg(void) 1612428d7b3dSmrg{ 1613428d7b3dSmrg return brw_uw1_reg(BRW_ARCHITECTURE_REGISTER_FILE, 1614428d7b3dSmrg BRW_ARF_FLAG, 1615428d7b3dSmrg 0); 1616428d7b3dSmrg} 1617428d7b3dSmrg 1618428d7b3dSmrgstatic inline struct brw_reg brw_mask_reg(unsigned subnr) 1619428d7b3dSmrg{ 1620428d7b3dSmrg return brw_uw1_reg(BRW_ARCHITECTURE_REGISTER_FILE, 1621428d7b3dSmrg BRW_ARF_MASK, 1622428d7b3dSmrg subnr); 1623428d7b3dSmrg} 1624428d7b3dSmrg 1625428d7b3dSmrgstatic inline struct brw_reg brw_message_reg(unsigned nr) 1626428d7b3dSmrg{ 1627428d7b3dSmrg assert((nr & ~(1 << 7)) < BRW_MAX_MRF); 1628428d7b3dSmrg return brw_vec8_reg(BRW_MESSAGE_REGISTER_FILE, nr, 0); 1629428d7b3dSmrg} 1630428d7b3dSmrg 1631428d7b3dSmrgstatic inline struct brw_reg brw_message4_reg(unsigned nr, 1632428d7b3dSmrg int subnr) 1633428d7b3dSmrg{ 1634428d7b3dSmrg assert((nr & ~(1 << 7)) < BRW_MAX_MRF); 1635428d7b3dSmrg return brw_vec4_reg(BRW_MESSAGE_REGISTER_FILE, nr, subnr); 1636428d7b3dSmrg} 1637428d7b3dSmrg 1638428d7b3dSmrg/* This is almost always called with a numeric constant argument, so 1639428d7b3dSmrg * make things easy to evaluate at compile time: 1640428d7b3dSmrg */ 1641428d7b3dSmrgstatic inline unsigned cvt(unsigned val) 1642428d7b3dSmrg{ 1643428d7b3dSmrg switch (val) { 1644428d7b3dSmrg case 0: return 0; 1645428d7b3dSmrg case 1: return 1; 1646428d7b3dSmrg case 2: return 2; 1647428d7b3dSmrg case 4: return 3; 1648428d7b3dSmrg case 8: return 4; 1649428d7b3dSmrg case 16: return 5; 1650428d7b3dSmrg case 32: return 6; 1651428d7b3dSmrg } 1652428d7b3dSmrg return 0; 1653428d7b3dSmrg} 1654428d7b3dSmrg 1655428d7b3dSmrgstatic inline struct brw_reg __stride(struct brw_reg reg, 1656428d7b3dSmrg unsigned vstride, 1657428d7b3dSmrg unsigned width, 1658428d7b3dSmrg unsigned hstride) 1659428d7b3dSmrg{ 1660428d7b3dSmrg reg.vstride = cvt(vstride); 1661428d7b3dSmrg reg.width = cvt(width) - 1; 1662428d7b3dSmrg reg.hstride = cvt(hstride); 1663428d7b3dSmrg return reg; 1664428d7b3dSmrg} 1665428d7b3dSmrg 1666428d7b3dSmrgstatic inline struct brw_reg vec16(struct brw_reg reg) 1667428d7b3dSmrg{ 1668428d7b3dSmrg return __stride(reg, 16,16,1); 1669428d7b3dSmrg} 1670428d7b3dSmrg 1671428d7b3dSmrgstatic inline struct brw_reg vec8(struct brw_reg reg) 1672428d7b3dSmrg{ 1673428d7b3dSmrg return __stride(reg, 8,8,1); 1674428d7b3dSmrg} 1675428d7b3dSmrg 1676428d7b3dSmrgstatic inline struct brw_reg vec4(struct brw_reg reg) 1677428d7b3dSmrg{ 1678428d7b3dSmrg return __stride(reg, 4,4,1); 1679428d7b3dSmrg} 1680428d7b3dSmrg 1681428d7b3dSmrgstatic inline struct brw_reg vec2(struct brw_reg reg) 1682428d7b3dSmrg{ 1683428d7b3dSmrg return __stride(reg, 2,2,1); 1684428d7b3dSmrg} 1685428d7b3dSmrg 1686428d7b3dSmrgstatic inline struct brw_reg vec1(struct brw_reg reg) 1687428d7b3dSmrg{ 1688428d7b3dSmrg return __stride(reg, 0,1,0); 1689428d7b3dSmrg} 1690428d7b3dSmrg 1691428d7b3dSmrgstatic inline struct brw_reg get_element(struct brw_reg reg, unsigned elt) 1692428d7b3dSmrg{ 1693428d7b3dSmrg return vec1(__suboffset(reg, elt)); 1694428d7b3dSmrg} 1695428d7b3dSmrg 1696428d7b3dSmrgstatic inline struct brw_reg get_element_ud(struct brw_reg reg, unsigned elt) 1697428d7b3dSmrg{ 1698428d7b3dSmrg return vec1(__suboffset(__retype(reg, BRW_REGISTER_TYPE_UD), elt)); 1699428d7b3dSmrg} 1700428d7b3dSmrg 1701428d7b3dSmrgstatic inline struct brw_reg brw_swizzle(struct brw_reg reg, 1702428d7b3dSmrg unsigned x, 1703428d7b3dSmrg unsigned y, 1704428d7b3dSmrg unsigned z, 1705428d7b3dSmrg unsigned w) 1706428d7b3dSmrg{ 1707428d7b3dSmrg assert(reg.file != BRW_IMMEDIATE_VALUE); 1708428d7b3dSmrg 1709428d7b3dSmrg reg.dw1.bits.swizzle = BRW_SWIZZLE4(BRW_GET_SWZ(reg.dw1.bits.swizzle, x), 1710428d7b3dSmrg BRW_GET_SWZ(reg.dw1.bits.swizzle, y), 1711428d7b3dSmrg BRW_GET_SWZ(reg.dw1.bits.swizzle, z), 1712428d7b3dSmrg BRW_GET_SWZ(reg.dw1.bits.swizzle, w)); 1713428d7b3dSmrg return reg; 1714428d7b3dSmrg} 1715428d7b3dSmrg 1716428d7b3dSmrgstatic inline struct brw_reg brw_swizzle1(struct brw_reg reg, 1717428d7b3dSmrg unsigned x) 1718428d7b3dSmrg{ 1719428d7b3dSmrg return brw_swizzle(reg, x, x, x, x); 1720428d7b3dSmrg} 1721428d7b3dSmrg 1722428d7b3dSmrgstatic inline struct brw_reg brw_writemask(struct brw_reg reg, 1723428d7b3dSmrg unsigned mask) 1724428d7b3dSmrg{ 1725428d7b3dSmrg assert(reg.file != BRW_IMMEDIATE_VALUE); 1726428d7b3dSmrg reg.dw1.bits.writemask &= mask; 1727428d7b3dSmrg return reg; 1728428d7b3dSmrg} 1729428d7b3dSmrg 1730428d7b3dSmrgstatic inline struct brw_reg brw_set_writemask(struct brw_reg reg, 1731428d7b3dSmrg unsigned mask) 1732428d7b3dSmrg{ 1733428d7b3dSmrg assert(reg.file != BRW_IMMEDIATE_VALUE); 1734428d7b3dSmrg reg.dw1.bits.writemask = mask; 1735428d7b3dSmrg return reg; 1736428d7b3dSmrg} 1737428d7b3dSmrg 1738428d7b3dSmrgstatic inline struct brw_reg brw_negate(struct brw_reg reg) 1739428d7b3dSmrg{ 1740428d7b3dSmrg reg.negate ^= 1; 1741428d7b3dSmrg return reg; 1742428d7b3dSmrg} 1743428d7b3dSmrg 1744428d7b3dSmrgstatic inline struct brw_reg brw_abs(struct brw_reg reg) 1745428d7b3dSmrg{ 1746428d7b3dSmrg reg.abs = 1; 1747428d7b3dSmrg return reg; 1748428d7b3dSmrg} 1749428d7b3dSmrg 1750428d7b3dSmrg/*********************************************************************** 1751428d7b3dSmrg*/ 1752428d7b3dSmrgstatic inline struct brw_reg brw_vec4_indirect(unsigned subnr, 1753428d7b3dSmrg int offset) 1754428d7b3dSmrg{ 1755428d7b3dSmrg struct brw_reg reg = brw_vec4_grf(0, 0); 1756428d7b3dSmrg reg.subnr = subnr; 1757428d7b3dSmrg reg.address_mode = BRW_ADDRESS_REGISTER_INDIRECT_REGISTER; 1758428d7b3dSmrg reg.dw1.bits.indirect_offset = offset; 1759428d7b3dSmrg return reg; 1760428d7b3dSmrg} 1761428d7b3dSmrg 1762428d7b3dSmrgstatic inline struct brw_reg brw_vec1_indirect(unsigned subnr, 1763428d7b3dSmrg int offset) 1764428d7b3dSmrg{ 1765428d7b3dSmrg struct brw_reg reg = brw_vec1_grf(0, 0); 1766428d7b3dSmrg reg.subnr = subnr; 1767428d7b3dSmrg reg.address_mode = BRW_ADDRESS_REGISTER_INDIRECT_REGISTER; 1768428d7b3dSmrg reg.dw1.bits.indirect_offset = offset; 1769428d7b3dSmrg return reg; 1770428d7b3dSmrg} 1771428d7b3dSmrg 1772428d7b3dSmrgstatic inline struct brw_reg deref_4f(struct brw_indirect ptr, int offset) 1773428d7b3dSmrg{ 1774428d7b3dSmrg return brw_vec4_indirect(ptr.addr_subnr, ptr.addr_offset + offset); 1775428d7b3dSmrg} 1776428d7b3dSmrg 1777428d7b3dSmrgstatic inline struct brw_reg deref_1f(struct brw_indirect ptr, int offset) 1778428d7b3dSmrg{ 1779428d7b3dSmrg return brw_vec1_indirect(ptr.addr_subnr, ptr.addr_offset + offset); 1780428d7b3dSmrg} 1781428d7b3dSmrg 1782428d7b3dSmrgstatic inline struct brw_reg deref_4b(struct brw_indirect ptr, int offset) 1783428d7b3dSmrg{ 1784428d7b3dSmrg return __retype(deref_4f(ptr, offset), BRW_REGISTER_TYPE_B); 1785428d7b3dSmrg} 1786428d7b3dSmrg 1787428d7b3dSmrgstatic inline struct brw_reg deref_1uw(struct brw_indirect ptr, int offset) 1788428d7b3dSmrg{ 1789428d7b3dSmrg return __retype(deref_1f(ptr, offset), BRW_REGISTER_TYPE_UW); 1790428d7b3dSmrg} 1791428d7b3dSmrg 1792428d7b3dSmrgstatic inline struct brw_reg deref_1d(struct brw_indirect ptr, int offset) 1793428d7b3dSmrg{ 1794428d7b3dSmrg return __retype(deref_1f(ptr, offset), BRW_REGISTER_TYPE_D); 1795428d7b3dSmrg} 1796428d7b3dSmrg 1797428d7b3dSmrgstatic inline struct brw_reg deref_1ud(struct brw_indirect ptr, int offset) 1798428d7b3dSmrg{ 1799428d7b3dSmrg return __retype(deref_1f(ptr, offset), BRW_REGISTER_TYPE_UD); 1800428d7b3dSmrg} 1801428d7b3dSmrg 1802428d7b3dSmrgstatic inline struct brw_reg get_addr_reg(struct brw_indirect ptr) 1803428d7b3dSmrg{ 1804428d7b3dSmrg return brw_address_reg(ptr.addr_subnr); 1805428d7b3dSmrg} 1806428d7b3dSmrg 1807428d7b3dSmrgstatic inline struct brw_indirect brw_indirect_offset(struct brw_indirect ptr, int offset) 1808428d7b3dSmrg{ 1809428d7b3dSmrg ptr.addr_offset += offset; 1810428d7b3dSmrg return ptr; 1811428d7b3dSmrg} 1812428d7b3dSmrg 1813428d7b3dSmrgstatic inline struct brw_indirect brw_indirect(unsigned addr_subnr, int offset) 1814428d7b3dSmrg{ 1815428d7b3dSmrg struct brw_indirect ptr; 1816428d7b3dSmrg ptr.addr_subnr = addr_subnr; 1817428d7b3dSmrg ptr.addr_offset = offset; 1818428d7b3dSmrg ptr.pad = 0; 1819428d7b3dSmrg return ptr; 1820428d7b3dSmrg} 1821428d7b3dSmrg 1822428d7b3dSmrg/** Do two brw_regs refer to the same register? */ 1823428d7b3dSmrgstatic inline bool brw_same_reg(struct brw_reg r1, struct brw_reg r2) 1824428d7b3dSmrg{ 1825428d7b3dSmrg return r1.file == r2.file && r1.nr == r2.nr; 1826428d7b3dSmrg} 1827428d7b3dSmrg 1828428d7b3dSmrgstatic inline struct brw_instruction *current_insn( struct brw_compile *p) 1829428d7b3dSmrg{ 1830428d7b3dSmrg return &p->store[p->nr_insn]; 1831428d7b3dSmrg} 1832428d7b3dSmrg 1833428d7b3dSmrgstatic inline void brw_set_predicate_control( struct brw_compile *p, unsigned pc ) 1834428d7b3dSmrg{ 1835428d7b3dSmrg p->current->header.predicate_control = pc; 1836428d7b3dSmrg} 1837428d7b3dSmrg 1838428d7b3dSmrgstatic inline void brw_set_predicate_inverse(struct brw_compile *p, bool predicate_inverse) 1839428d7b3dSmrg{ 1840428d7b3dSmrg p->current->header.predicate_inverse = predicate_inverse; 1841428d7b3dSmrg} 1842428d7b3dSmrg 1843428d7b3dSmrgstatic inline void brw_set_conditionalmod( struct brw_compile *p, unsigned conditional ) 1844428d7b3dSmrg{ 1845428d7b3dSmrg p->current->header.destreg__conditionalmod = conditional; 1846428d7b3dSmrg} 1847428d7b3dSmrg 1848428d7b3dSmrgstatic inline void brw_set_access_mode(struct brw_compile *p, unsigned access_mode) 1849428d7b3dSmrg{ 1850428d7b3dSmrg p->current->header.access_mode = access_mode; 1851428d7b3dSmrg} 1852428d7b3dSmrg 1853428d7b3dSmrgstatic inline void brw_set_mask_control(struct brw_compile *p, unsigned value) 1854428d7b3dSmrg{ 1855428d7b3dSmrg p->current->header.mask_control = value; 1856428d7b3dSmrg} 1857428d7b3dSmrg 1858428d7b3dSmrgstatic inline void brw_set_saturate(struct brw_compile *p, unsigned value) 1859428d7b3dSmrg{ 1860428d7b3dSmrg p->current->header.saturate = value; 1861428d7b3dSmrg} 1862428d7b3dSmrg 1863428d7b3dSmrgstatic inline void brw_set_acc_write_control(struct brw_compile *p, unsigned value) 1864428d7b3dSmrg{ 1865428d7b3dSmrg if (p->gen >= 060) 1866428d7b3dSmrg p->current->header.acc_wr_control = value; 1867428d7b3dSmrg} 1868428d7b3dSmrg 1869428d7b3dSmrgvoid brw_pop_insn_state(struct brw_compile *p); 1870428d7b3dSmrgvoid brw_push_insn_state(struct brw_compile *p); 1871428d7b3dSmrgvoid brw_set_compression_control(struct brw_compile *p, enum brw_compression control); 1872428d7b3dSmrgvoid brw_set_predicate_control_flag_value( struct brw_compile *p, unsigned value ); 1873428d7b3dSmrg 1874428d7b3dSmrgvoid brw_compile_init(struct brw_compile *p, int gen, void *store); 1875428d7b3dSmrg 1876428d7b3dSmrgvoid brw_set_dest(struct brw_compile *p, struct brw_instruction *insn, 1877428d7b3dSmrg struct brw_reg dest); 1878428d7b3dSmrgvoid brw_set_src0(struct brw_compile *p, struct brw_instruction *insn, 1879428d7b3dSmrg struct brw_reg reg); 1880428d7b3dSmrgvoid brw_set_src1(struct brw_compile *p, 1881428d7b3dSmrg struct brw_instruction *insn, 1882428d7b3dSmrg struct brw_reg reg); 1883428d7b3dSmrg 1884428d7b3dSmrgvoid gen6_resolve_implied_move(struct brw_compile *p, 1885428d7b3dSmrg struct brw_reg *src, 1886428d7b3dSmrg unsigned msg_reg_nr); 1887428d7b3dSmrg 1888428d7b3dSmrgstatic inline struct brw_instruction * 1889428d7b3dSmrgbrw_next_insn(struct brw_compile *p, unsigned opcode) 1890428d7b3dSmrg{ 1891428d7b3dSmrg struct brw_instruction *insn; 1892428d7b3dSmrg 1893428d7b3dSmrg assert(p->nr_insn + 1 < BRW_EU_MAX_INSN); 1894428d7b3dSmrg 1895428d7b3dSmrg insn = &p->store[p->nr_insn++]; 1896428d7b3dSmrg *insn = *p->current; 1897428d7b3dSmrg 1898428d7b3dSmrg if (p->current->header.destreg__conditionalmod) { 1899428d7b3dSmrg p->current->header.destreg__conditionalmod = 0; 1900428d7b3dSmrg p->current->header.predicate_control = BRW_PREDICATE_NORMAL; 1901428d7b3dSmrg } 1902428d7b3dSmrg 1903428d7b3dSmrg insn->header.opcode = opcode; 1904428d7b3dSmrg return insn; 1905428d7b3dSmrg} 1906428d7b3dSmrg 1907428d7b3dSmrg/* Helpers for regular instructions: */ 1908428d7b3dSmrg#define ALU1(OP) \ 1909428d7b3dSmrgstatic inline struct brw_instruction *brw_##OP(struct brw_compile *p, \ 1910428d7b3dSmrg struct brw_reg dest, \ 1911428d7b3dSmrg struct brw_reg src0) \ 1912428d7b3dSmrg{ \ 1913428d7b3dSmrg return brw_alu1(p, BRW_OPCODE_##OP, dest, src0); \ 1914428d7b3dSmrg} 1915428d7b3dSmrg 1916428d7b3dSmrg#define ALU2(OP) \ 1917428d7b3dSmrgstatic inline struct brw_instruction *brw_##OP(struct brw_compile *p, \ 1918428d7b3dSmrg struct brw_reg dest, \ 1919428d7b3dSmrg struct brw_reg src0, \ 1920428d7b3dSmrg struct brw_reg src1) \ 1921428d7b3dSmrg{ \ 1922428d7b3dSmrg return brw_alu2(p, BRW_OPCODE_##OP, dest, src0, src1); \ 1923428d7b3dSmrg} 1924428d7b3dSmrg 1925428d7b3dSmrg/* Rounding operations (other than RNDD) require two instructions - the first 1926428d7b3dSmrg * stores a rounded value (possibly the wrong way) in the dest register, but 1927428d7b3dSmrg * also sets a per-channel "increment bit" in the flag register. A predicated 1928428d7b3dSmrg * add of 1.0 fixes dest to contain the desired result. 1929428d7b3dSmrg * 1930428d7b3dSmrg * Sandybridge and later appear to round correctly without an ADD. 1931428d7b3dSmrg */ 1932428d7b3dSmrg#define ROUND(OP) \ 1933428d7b3dSmrgstatic inline void brw_##OP(struct brw_compile *p, \ 1934428d7b3dSmrg struct brw_reg dest, \ 1935428d7b3dSmrg struct brw_reg src) \ 1936428d7b3dSmrg{ \ 1937428d7b3dSmrg struct brw_instruction *rnd, *add; \ 1938428d7b3dSmrg rnd = brw_next_insn(p, BRW_OPCODE_##OP); \ 1939428d7b3dSmrg brw_set_dest(p, rnd, dest); \ 1940428d7b3dSmrg brw_set_src0(p, rnd, src); \ 1941428d7b3dSmrg if (p->gen < 060) { \ 1942428d7b3dSmrg /* turn on round-increments */ \ 1943428d7b3dSmrg rnd->header.destreg__conditionalmod = BRW_CONDITIONAL_R; \ 1944428d7b3dSmrg add = brw_ADD(p, dest, dest, brw_imm_f(1.0f)); \ 1945428d7b3dSmrg add->header.predicate_control = BRW_PREDICATE_NORMAL; \ 1946428d7b3dSmrg } \ 1947428d7b3dSmrg} 1948428d7b3dSmrg 1949428d7b3dSmrgstatic inline struct brw_instruction *brw_alu1(struct brw_compile *p, 1950428d7b3dSmrg unsigned opcode, 1951428d7b3dSmrg struct brw_reg dest, 1952428d7b3dSmrg struct brw_reg src) 1953428d7b3dSmrg{ 1954428d7b3dSmrg struct brw_instruction *insn = brw_next_insn(p, opcode); 1955428d7b3dSmrg brw_set_dest(p, insn, dest); 1956428d7b3dSmrg brw_set_src0(p, insn, src); 1957428d7b3dSmrg return insn; 1958428d7b3dSmrg} 1959428d7b3dSmrg 1960428d7b3dSmrgstatic inline struct brw_instruction *brw_alu2(struct brw_compile *p, 1961428d7b3dSmrg unsigned opcode, 1962428d7b3dSmrg struct brw_reg dest, 1963428d7b3dSmrg struct brw_reg src0, 1964428d7b3dSmrg struct brw_reg src1 ) 1965428d7b3dSmrg{ 1966428d7b3dSmrg struct brw_instruction *insn = brw_next_insn(p, opcode); 1967428d7b3dSmrg brw_set_dest(p, insn, dest); 1968428d7b3dSmrg brw_set_src0(p, insn, src0); 1969428d7b3dSmrg brw_set_src1(p, insn, src1); 1970428d7b3dSmrg return insn; 1971428d7b3dSmrg} 1972428d7b3dSmrg 1973428d7b3dSmrgstatic inline struct brw_instruction *brw_ADD(struct brw_compile *p, 1974428d7b3dSmrg struct brw_reg dest, 1975428d7b3dSmrg struct brw_reg src0, 1976428d7b3dSmrg struct brw_reg src1) 1977428d7b3dSmrg{ 1978428d7b3dSmrg /* 6.2.2: add */ 1979428d7b3dSmrg if (src0.type == BRW_REGISTER_TYPE_F || 1980428d7b3dSmrg (src0.file == BRW_IMMEDIATE_VALUE && 1981428d7b3dSmrg src0.type == BRW_REGISTER_TYPE_VF)) { 1982428d7b3dSmrg assert(src1.type != BRW_REGISTER_TYPE_UD); 1983428d7b3dSmrg assert(src1.type != BRW_REGISTER_TYPE_D); 1984428d7b3dSmrg } 1985428d7b3dSmrg 1986428d7b3dSmrg if (src1.type == BRW_REGISTER_TYPE_F || 1987428d7b3dSmrg (src1.file == BRW_IMMEDIATE_VALUE && 1988428d7b3dSmrg src1.type == BRW_REGISTER_TYPE_VF)) { 1989428d7b3dSmrg assert(src0.type != BRW_REGISTER_TYPE_UD); 1990428d7b3dSmrg assert(src0.type != BRW_REGISTER_TYPE_D); 1991428d7b3dSmrg } 1992428d7b3dSmrg 1993428d7b3dSmrg return brw_alu2(p, BRW_OPCODE_ADD, dest, src0, src1); 1994428d7b3dSmrg} 1995428d7b3dSmrg 1996428d7b3dSmrgstatic inline struct brw_instruction *brw_MUL(struct brw_compile *p, 1997428d7b3dSmrg struct brw_reg dest, 1998428d7b3dSmrg struct brw_reg src0, 1999428d7b3dSmrg struct brw_reg src1) 2000428d7b3dSmrg{ 2001428d7b3dSmrg /* 6.32.38: mul */ 2002428d7b3dSmrg if (src0.type == BRW_REGISTER_TYPE_D || 2003428d7b3dSmrg src0.type == BRW_REGISTER_TYPE_UD || 2004428d7b3dSmrg src1.type == BRW_REGISTER_TYPE_D || 2005428d7b3dSmrg src1.type == BRW_REGISTER_TYPE_UD) { 2006428d7b3dSmrg assert(dest.type != BRW_REGISTER_TYPE_F); 2007428d7b3dSmrg } 2008428d7b3dSmrg 2009428d7b3dSmrg if (src0.type == BRW_REGISTER_TYPE_F || 2010428d7b3dSmrg (src0.file == BRW_IMMEDIATE_VALUE && 2011428d7b3dSmrg src0.type == BRW_REGISTER_TYPE_VF)) { 2012428d7b3dSmrg assert(src1.type != BRW_REGISTER_TYPE_UD); 2013428d7b3dSmrg assert(src1.type != BRW_REGISTER_TYPE_D); 2014428d7b3dSmrg } 2015428d7b3dSmrg 2016428d7b3dSmrg if (src1.type == BRW_REGISTER_TYPE_F || 2017428d7b3dSmrg (src1.file == BRW_IMMEDIATE_VALUE && 2018428d7b3dSmrg src1.type == BRW_REGISTER_TYPE_VF)) { 2019428d7b3dSmrg assert(src0.type != BRW_REGISTER_TYPE_UD); 2020428d7b3dSmrg assert(src0.type != BRW_REGISTER_TYPE_D); 2021428d7b3dSmrg } 2022428d7b3dSmrg 2023428d7b3dSmrg assert(src0.file != BRW_ARCHITECTURE_REGISTER_FILE || 2024428d7b3dSmrg src0.nr != BRW_ARF_ACCUMULATOR); 2025428d7b3dSmrg assert(src1.file != BRW_ARCHITECTURE_REGISTER_FILE || 2026428d7b3dSmrg src1.nr != BRW_ARF_ACCUMULATOR); 2027428d7b3dSmrg 2028428d7b3dSmrg return brw_alu2(p, BRW_OPCODE_MUL, dest, src0, src1); 2029428d7b3dSmrg} 2030428d7b3dSmrg 2031428d7b3dSmrgstatic inline struct brw_instruction *brw_JMPI(struct brw_compile *p, 2032428d7b3dSmrg struct brw_reg dest, 2033428d7b3dSmrg struct brw_reg src0, 2034428d7b3dSmrg struct brw_reg src1) 2035428d7b3dSmrg{ 2036428d7b3dSmrg struct brw_instruction *insn = brw_alu2(p, BRW_OPCODE_JMPI, dest, src0, src1); 2037428d7b3dSmrg 2038428d7b3dSmrg insn->header.execution_size = 1; 2039428d7b3dSmrg insn->header.compression_control = BRW_COMPRESSION_NONE; 2040428d7b3dSmrg insn->header.mask_control = BRW_MASK_DISABLE; 2041428d7b3dSmrg 2042428d7b3dSmrg p->current->header.predicate_control = BRW_PREDICATE_NONE; 2043428d7b3dSmrg 2044428d7b3dSmrg return insn; 2045428d7b3dSmrg} 2046428d7b3dSmrg 2047428d7b3dSmrg 2048428d7b3dSmrgALU1(MOV); 2049428d7b3dSmrgALU2(SEL); 2050428d7b3dSmrgALU1(NOT); 2051428d7b3dSmrgALU2(AND); 2052428d7b3dSmrgALU2(OR); 2053428d7b3dSmrgALU2(XOR); 2054428d7b3dSmrgALU2(SHR); 2055428d7b3dSmrgALU2(SHL); 2056428d7b3dSmrgALU2(RSR); 2057428d7b3dSmrgALU2(RSL); 2058428d7b3dSmrgALU2(ASR); 2059428d7b3dSmrgALU1(FRC); 2060428d7b3dSmrgALU1(RNDD); 2061428d7b3dSmrgALU2(MAC); 2062428d7b3dSmrgALU2(MACH); 2063428d7b3dSmrgALU1(LZD); 2064428d7b3dSmrgALU2(DP4); 2065428d7b3dSmrgALU2(DPH); 2066428d7b3dSmrgALU2(DP3); 2067428d7b3dSmrgALU2(DP2); 2068428d7b3dSmrgALU2(LINE); 2069428d7b3dSmrgALU2(PLN); 2070428d7b3dSmrg 2071428d7b3dSmrgROUND(RNDZ); 2072428d7b3dSmrgROUND(RNDE); 2073428d7b3dSmrg 2074428d7b3dSmrg#undef ALU1 2075428d7b3dSmrg#undef ALU2 2076428d7b3dSmrg#undef ROUND 2077428d7b3dSmrg 2078428d7b3dSmrg/* Helpers for SEND instruction */ 2079428d7b3dSmrgvoid brw_set_dp_read_message(struct brw_compile *p, 2080428d7b3dSmrg struct brw_instruction *insn, 2081428d7b3dSmrg unsigned binding_table_index, 2082428d7b3dSmrg unsigned msg_control, 2083428d7b3dSmrg unsigned msg_type, 2084428d7b3dSmrg unsigned target_cache, 2085428d7b3dSmrg unsigned msg_length, 2086428d7b3dSmrg unsigned response_length); 2087428d7b3dSmrg 2088428d7b3dSmrgvoid brw_set_dp_write_message(struct brw_compile *p, 2089428d7b3dSmrg struct brw_instruction *insn, 2090428d7b3dSmrg unsigned binding_table_index, 2091428d7b3dSmrg unsigned msg_control, 2092428d7b3dSmrg unsigned msg_type, 2093428d7b3dSmrg unsigned msg_length, 2094428d7b3dSmrg bool header_present, 2095428d7b3dSmrg bool last_render_target, 2096428d7b3dSmrg unsigned response_length, 2097428d7b3dSmrg bool end_of_thread, 2098428d7b3dSmrg bool send_commit_msg); 2099428d7b3dSmrg 2100428d7b3dSmrgvoid brw_urb_WRITE(struct brw_compile *p, 2101428d7b3dSmrg struct brw_reg dest, 2102428d7b3dSmrg unsigned msg_reg_nr, 2103428d7b3dSmrg struct brw_reg src0, 2104428d7b3dSmrg bool allocate, 2105428d7b3dSmrg bool used, 2106428d7b3dSmrg unsigned msg_length, 2107428d7b3dSmrg unsigned response_length, 2108428d7b3dSmrg bool eot, 2109428d7b3dSmrg bool writes_complete, 2110428d7b3dSmrg unsigned offset, 2111428d7b3dSmrg unsigned swizzle); 2112428d7b3dSmrg 2113428d7b3dSmrgvoid brw_ff_sync(struct brw_compile *p, 2114428d7b3dSmrg struct brw_reg dest, 2115428d7b3dSmrg unsigned msg_reg_nr, 2116428d7b3dSmrg struct brw_reg src0, 2117428d7b3dSmrg bool allocate, 2118428d7b3dSmrg unsigned response_length, 2119428d7b3dSmrg bool eot); 2120428d7b3dSmrg 2121428d7b3dSmrgvoid brw_fb_WRITE(struct brw_compile *p, 2122428d7b3dSmrg int dispatch_width, 2123428d7b3dSmrg unsigned msg_reg_nr, 2124428d7b3dSmrg struct brw_reg src0, 2125428d7b3dSmrg unsigned msg_control, 2126428d7b3dSmrg unsigned binding_table_index, 2127428d7b3dSmrg unsigned msg_length, 2128428d7b3dSmrg unsigned response_length, 2129428d7b3dSmrg bool eot, 2130428d7b3dSmrg bool header_present); 2131428d7b3dSmrg 2132428d7b3dSmrgvoid brw_SAMPLE(struct brw_compile *p, 2133428d7b3dSmrg struct brw_reg dest, 2134428d7b3dSmrg unsigned msg_reg_nr, 2135428d7b3dSmrg struct brw_reg src0, 2136428d7b3dSmrg unsigned binding_table_index, 2137428d7b3dSmrg unsigned sampler, 2138428d7b3dSmrg unsigned writemask, 2139428d7b3dSmrg unsigned msg_type, 2140428d7b3dSmrg unsigned response_length, 2141428d7b3dSmrg unsigned msg_length, 2142428d7b3dSmrg bool header_present, 2143428d7b3dSmrg unsigned simd_mode); 2144428d7b3dSmrg 2145428d7b3dSmrgvoid brw_math_16(struct brw_compile *p, 2146428d7b3dSmrg struct brw_reg dest, 2147428d7b3dSmrg unsigned function, 2148428d7b3dSmrg unsigned saturate, 2149428d7b3dSmrg unsigned msg_reg_nr, 2150428d7b3dSmrg struct brw_reg src, 2151428d7b3dSmrg unsigned precision); 2152428d7b3dSmrg 2153428d7b3dSmrgvoid brw_math(struct brw_compile *p, 2154428d7b3dSmrg struct brw_reg dest, 2155428d7b3dSmrg unsigned function, 2156428d7b3dSmrg unsigned saturate, 2157428d7b3dSmrg unsigned msg_reg_nr, 2158428d7b3dSmrg struct brw_reg src, 2159428d7b3dSmrg unsigned data_type, 2160428d7b3dSmrg unsigned precision); 2161428d7b3dSmrg 2162428d7b3dSmrgvoid brw_math2(struct brw_compile *p, 2163428d7b3dSmrg struct brw_reg dest, 2164428d7b3dSmrg unsigned function, 2165428d7b3dSmrg struct brw_reg src0, 2166428d7b3dSmrg struct brw_reg src1); 2167428d7b3dSmrg 2168428d7b3dSmrgvoid brw_oword_block_read(struct brw_compile *p, 2169428d7b3dSmrg struct brw_reg dest, 2170428d7b3dSmrg struct brw_reg mrf, 2171428d7b3dSmrg uint32_t offset, 2172428d7b3dSmrg uint32_t bind_table_index); 2173428d7b3dSmrg 2174428d7b3dSmrgvoid brw_oword_block_read_scratch(struct brw_compile *p, 2175428d7b3dSmrg struct brw_reg dest, 2176428d7b3dSmrg struct brw_reg mrf, 2177428d7b3dSmrg int num_regs, 2178428d7b3dSmrg unsigned offset); 2179428d7b3dSmrg 2180428d7b3dSmrgvoid brw_oword_block_write_scratch(struct brw_compile *p, 2181428d7b3dSmrg struct brw_reg mrf, 2182428d7b3dSmrg int num_regs, 2183428d7b3dSmrg unsigned offset); 2184428d7b3dSmrg 2185428d7b3dSmrgvoid brw_dword_scattered_read(struct brw_compile *p, 2186428d7b3dSmrg struct brw_reg dest, 2187428d7b3dSmrg struct brw_reg mrf, 2188428d7b3dSmrg uint32_t bind_table_index); 2189428d7b3dSmrg 2190428d7b3dSmrgvoid brw_dp_READ_4_vs(struct brw_compile *p, 2191428d7b3dSmrg struct brw_reg dest, 2192428d7b3dSmrg unsigned location, 2193428d7b3dSmrg unsigned bind_table_index); 2194428d7b3dSmrg 2195428d7b3dSmrgvoid brw_dp_READ_4_vs_relative(struct brw_compile *p, 2196428d7b3dSmrg struct brw_reg dest, 2197428d7b3dSmrg struct brw_reg addrReg, 2198428d7b3dSmrg unsigned offset, 2199428d7b3dSmrg unsigned bind_table_index); 2200428d7b3dSmrg 2201428d7b3dSmrg/* If/else/endif. Works by manipulating the execution flags on each 2202428d7b3dSmrg * channel. 2203428d7b3dSmrg */ 2204428d7b3dSmrgstruct brw_instruction *brw_IF(struct brw_compile *p, 2205428d7b3dSmrg unsigned execute_size); 2206428d7b3dSmrgstruct brw_instruction *gen6_IF(struct brw_compile *p, uint32_t conditional, 2207428d7b3dSmrg struct brw_reg src0, struct brw_reg src1); 2208428d7b3dSmrg 2209428d7b3dSmrgvoid brw_ELSE(struct brw_compile *p); 2210428d7b3dSmrgvoid brw_ENDIF(struct brw_compile *p); 2211428d7b3dSmrg 2212428d7b3dSmrg/* DO/WHILE loops: 2213428d7b3dSmrg*/ 2214428d7b3dSmrgstruct brw_instruction *brw_DO(struct brw_compile *p, 2215428d7b3dSmrg unsigned execute_size); 2216428d7b3dSmrg 2217428d7b3dSmrgstruct brw_instruction *brw_WHILE(struct brw_compile *p, 2218428d7b3dSmrg struct brw_instruction *patch_insn); 2219428d7b3dSmrg 2220428d7b3dSmrgstruct brw_instruction *brw_BREAK(struct brw_compile *p, int pop_count); 2221428d7b3dSmrgstruct brw_instruction *brw_CONT(struct brw_compile *p, int pop_count); 2222428d7b3dSmrgstruct brw_instruction *gen6_CONT(struct brw_compile *p, 2223428d7b3dSmrg struct brw_instruction *do_insn); 2224428d7b3dSmrg/* Forward jumps: 2225428d7b3dSmrg*/ 2226428d7b3dSmrgvoid brw_land_fwd_jump(struct brw_compile *p, 2227428d7b3dSmrg struct brw_instruction *jmp_insn); 2228428d7b3dSmrg 2229428d7b3dSmrgvoid brw_NOP(struct brw_compile *p); 2230428d7b3dSmrg 2231428d7b3dSmrgvoid brw_WAIT(struct brw_compile *p); 2232428d7b3dSmrg 2233428d7b3dSmrg/* Special case: there is never a destination, execution size will be 2234428d7b3dSmrg * taken from src0: 2235428d7b3dSmrg */ 2236428d7b3dSmrgvoid brw_CMP(struct brw_compile *p, 2237428d7b3dSmrg struct brw_reg dest, 2238428d7b3dSmrg unsigned conditional, 2239428d7b3dSmrg struct brw_reg src0, 2240428d7b3dSmrg struct brw_reg src1); 2241428d7b3dSmrg 2242428d7b3dSmrgstatic inline void brw_math_invert(struct brw_compile *p, 2243428d7b3dSmrg struct brw_reg dst, 2244428d7b3dSmrg struct brw_reg src) 2245428d7b3dSmrg{ 2246428d7b3dSmrg brw_math(p, 2247428d7b3dSmrg dst, 2248428d7b3dSmrg BRW_MATH_FUNCTION_INV, 2249428d7b3dSmrg BRW_MATH_SATURATE_NONE, 2250428d7b3dSmrg 0, 2251428d7b3dSmrg src, 2252428d7b3dSmrg BRW_MATH_PRECISION_FULL, 2253428d7b3dSmrg BRW_MATH_DATA_VECTOR); 2254428d7b3dSmrg} 2255428d7b3dSmrg 2256428d7b3dSmrgvoid brw_set_uip_jip(struct brw_compile *p); 2257428d7b3dSmrg 2258428d7b3dSmrguint32_t brw_swap_cmod(uint32_t cmod); 2259428d7b3dSmrg 2260428d7b3dSmrgvoid brw_disasm(FILE *file, 2261428d7b3dSmrg const struct brw_instruction *inst, 2262428d7b3dSmrg int gen); 2263428d7b3dSmrg 2264428d7b3dSmrg#endif 2265