Skip to content

Instantly share code, notes, and snippets.

@exjam
Created May 9, 2017 13:02
Show Gist options
  • Save exjam/19d70b9227172c4b5cdb043e54b7fd57 to your computer and use it in GitHub Desktop.
Save exjam/19d70b9227172c4b5cdb043e54b7fd57 to your computer and use it in GitHub Desktop.
Program <- _ (Instructions _)* _ EndOfProgram
Instructions <- CfInst / CfExpInst / TexClause / AluClause
CfInst <- (InstCount _ CfOpcode _ CfInstPropertiesOpt _)
CfExpInst <- (InstCount _ ExpOpcode ':' _ ExpTarget _ ',' _ VecGpr _ CfInstPropertiesOpt _)
TexClause <- (InstCount _ TexClauseInstType _ ':' _ CfInstPropertiesOpt _) TexInst*
AluClause <- (InstCount _ AluClauseInstType _ ':' _ CfInstPropertiesOpt _) AluInst*
EndOfProgram <- 'END_OF_PROGRAM'
Number <- < [0-9]+ >
HexNumber <- < '0x' [0-9A-Fa-f]+ >
Float <- $< '-'? [0-9]+ ('.' [0-9]+ )? 'f'? >
InstCount <- Number
VecGpr <- 'R' Number FourCompSwizzleOpt?
ConstantFile <- 'C' Number
ConstantCache <- 'KC' [0-1] '[' Number ']'
DstRel <- '[AR' [xyzwXYZW] ']' / '[AL]'
PreviousScalar <- 'PS' Number
PreviousVector <- 'PV' Number
OneCompSwizzleOpt <- '.' [xyzwXYZW]
FourCompSwizzleOpt <- '.' [xyzwXYZW01_]+
Literal <- HexNumber / Float / '(' _ HexNumber _ ',' _ Float _ ')'
WriteMask <- [_]+
Negate <- [-]
AluClauseInstType <- 'ALU_PUSH_BEFORE' / 'ALU_POP_AFTER' / 'ALU_POP2_AFTER'
/ 'ALU_EXT' / 'ALU_CONTINUE' / 'ALU_BREAK' / 'ALU_ELSE_AFTER' / 'ALU'
TexClauseInstType <- 'TEX_ACK' / 'TEX'
VtxClauseInstType <- 'VTX' / 'VTX_TC' / 'VTX_ACK' / 'VTX_TC_ACK'
CfOpcode <- 'NOP' / 'LOOP_START_NO_AL' / 'LOOP_START_DX10' / 'LOOP_START'
/ 'LOOP_END' / 'LOOP_CONTINUE' / 'LOOP_BREAK' / 'JUMP' / 'PUSH_ELSE' / 'PUSH'
/ 'ELSE' / 'POP_PUSH_ELSE' / 'POP_PUSH' / 'POP_JUMP' / 'POP' / 'CALL_FS'
/ 'CALL' / 'RETURN' / 'EMIT_CUT_VERTEX' / 'EMIT_VERTEX' / 'CUT_VERTEX'
/ 'KILL' / 'WAIT_ACK' / 'END_PROGRAM'
CfInstPropertiesOpt <- (CfInstProperty _)*
CfInstProperty <- ADDR / CNT / 'USES_WATERFALL' / 'WHOLE_QUAD_MODE' / 'WHOLE_QUAD' / 'NO_BARRIER' / 'VALID_PIX' / POP_CNT / ELEM_SIZE / BURSTCNT / KCACHE
KCACHE <- 'KCACHE' Number '(CB' Number ':' Number '-' Number ')'
BURSTCNT <- 'BURSTCNT(' Number ')'
ELEM_SIZE <- 'ELEM_SIZE(' Number ')'
POP_CNT <- 'POP_CNT(' Number ')'
ADDR <- 'ADDR(' Number ')'
CNT <- 'CNT(' Number ')'
ExpOpcode <- 'EXP_DONE' / 'EXP'
ExpTarget <- ('PIX' / 'POS' / 'PARAM') Number
TexInst <- _ InstCount _ TexOpcode _ TexDestReg _ ',' _ TexSrcReg _ ',' _ TexResourceId _ ',' _ TexSamplerId _ TexPropertiesOpt _
TexOpcode <- 'VTX_FETCH' / 'VTX_SEMANTIC' / 'MEM' / 'LD' / 'GET_TEXTURE_INFO'
/ 'GET_SAMPLE_INFO' / 'GET_COMP_TEX_LOD' / 'GET_GRADIENTS_H' / 'GET_GRADIENTS_V'
/ 'GET_LERP' / 'KEEP_GRADIENTS' / 'SET_GRADIENTS_H' / 'SET_GRADIENTS_V' / 'PASS'
/ 'SET_CUBEMAP_INDEX' / 'FETCH4' / 'SAMPLE_C_G_LZ' / 'SAMPLE_C_G_LB'
/ 'SAMPLE_C_G_L' / 'SAMPLE_C_G' / 'SAMPLE_C_LZ' / 'SAMPLE_C_LB' / 'SAMPLE_C_L'
/ 'SAMPLE_C' / 'SAMPLE_G_LZ' / 'SAMPLE_G_LB' / 'SAMPLE_G_L' / 'SAMPLE_G'
/ 'SAMPLE_LZ' / 'SAMPLE_LB' / 'SAMPLE_L' / 'SAMPLE' / 'SET_TEXTURE_OFFSETS'
/ 'GATHER4_C_O' / 'GATHER4_O' / 'GATHER4_C' / 'GATHER4' / 'GET_BUFFER_RESINFO'
TexDestReg <- VecGpr
TexSrcReg <- VecGpr
TexResourceId <- 't' Number
TexSamplerId <- 's' Number
TexPropertiesOpt <- (TexProperty _)*
TexProperty <- 'WHOLE_QUAD' / 'BC_FRAC_MODE' / NORM / XOFFSET / YOFFSET / ZOFFSET / LOD
NORM <- 'NORM(' [xyzwXYZW]+ ')'
LOD <- 'LOD(' Float ')'
XOFFSET <- 'XOFFSET(' Float ')'
YOFFSET <- 'YOFFSET(' Float ')'
ZOFFSET <- 'ZOFFSET(' Float ')'
AluInst <- _ InstCount _ ([xyzwt] ':' _ AluScalar _)+ _
AluScalar <- AluScalar3 / AluScalar2 / AluScalar1 / AluScalar0
AluScalar0 <- AluOpcode0 AluOutputModifier? _ AluDst _ AluPropertiesOpt
AluScalar1 <- AluOpcode1 AluOutputModifier? _ AluDst _ ',' _ AluSrc _ AluPropertiesOpt
AluScalar2 <- AluOpcode2 AluOutputModifier? _ AluDst _ ',' _ AluSrc _ ',' _ AluSrc _ AluPropertiesOpt
AluScalar3 <- AluOpcode3 _ AluDst _ ',' _ AluSrc _ ',' _ AluSrc _ ',' _ AluSrc _ AluPropertiesOpt
AluOpcode0 <- 'NOP' / 'SET_MODE' / 'SET_CF_IDX0' / 'SET_CF_IDX1'
AluOpcode1 <- 'FLT64_TO_FLT32' / 'FLT32_TO_FLT64' / 'FREXP_64' / 'FRACT'
/ 'TRUNC' / 'CEIL' / 'RNDNE' / 'FLOOR' / 'MOVA_FLOOR' / 'MOVA_INT' / 'MOVA'
/ 'MOV' / 'EXP_IEEE' / 'LOG_CLAMPED' / 'LOG_IEEE'
/ 'RECIP_CLAMPED' / 'RECIP_IEEE' / 'RECIP_UINT' / 'RECIP_INT' / 'RECIP_FF'
/ 'RECIPSQRT_CLAMPED' / 'RECIPSQRT_IEEE' / 'RECIPSQRT_FF'
/ 'SQRT_IEEE' / 'FLT_TO_INT' / 'INT_TO_FLT'
/ 'UINT_TO_FLT' / 'FLT_TO_UINT' / 'SIN' / 'COS'/ 'FRACT_64'
/ 'SQRT_e' / 'EXP_e' / 'LOG_e' / 'RSQ_e' / 'RCP_e' / 'LOG_sat'
AluOpcode2 <- 'MULHI_INT24' / 'MULLO_INT' / 'MULHI_INT' / 'MULLO_UINT'
/ 'MULHI_UINT' / 'MUL_INT24' / 'MUL_IEEE' / 'MUL_e' / 'MUL_64' / 'MUL'
/ 'MAX_DX10' / 'MAX_UINT' / 'MAX_INT' / 'MAX' / 'MIN_DX10' / 'MIN_UINT'
/ 'MIN_INT' / 'MIN' / 'SETE' / 'SETGT' / 'SETGE' / 'SETNE' / 'SETE_DX10'
/ 'SETGT_DX10' / 'SETGE_DX10' / 'SETNE_DX10' / 'ADD_INT' / 'ADD_64' / 'ADD'
/ 'PRED_SETGT_PUSH_INT' / 'PRED_SETGT_PUSH' / 'PRED_SETGT_UINT'
/ 'PRED_SETGT_INT' / 'PRED_SETGT_64' / 'PRED_SETGT' / 'PRED_SETGE_PUSH_INT'
/ 'PRED_SETGE_PUSH' / 'PRED_SETGE_UINT' / 'PRED_SETGE_INT' / 'PRED_SETGE_64'
/ 'PRED_SETGE' / 'PRED_SETE_PUSH_INT' / 'PRED_SETE_INT' / 'PRED_SETE_PUSH'
/ 'PRED_SETE_64' / 'PRED_SETE' / 'PRED_SETNE_PUSH_INT' / 'PRED_SETNE_PUSH'
/ 'PRED_SETNE_INT' / 'PRED_SETNE' / 'PRED_SETLT_PUSH_INT'
/ 'PRED_SETLE_PUSH_INT' / 'PRED_SET_INV' / 'PRED_SET_POP' / 'PRED_SET_CLR'
/ 'PRED_SET_RESTORE' / 'KILLE' / 'KILLGT' / 'KILLGE' / 'KILLNE' / 'AND_INT'
/ 'OR_INT' / 'XOR_INT' / 'NOT_INT' / 'SUB_INT' / 'SETE_INT' / 'SETGT_INT'
/ 'SETGE_INT' / 'SETNE_INT' / 'SETGT_UINT' / 'SETGE_UINT' / 'KILLGT_UINT'
/ 'KILLGE_UINT' / 'KILLE_INT' / 'KILLGT_INT' / 'KILLGE_INT' / 'KILLNE_INT'
/ 'DOT4_IEEE' / 'DOT4_e' / 'DOT4' / 'CUBE' / 'MAX4' / 'GROUP_BARRIER'
/ 'GROUP_SEQ_BEGIN' / 'GROUP_SEQ_END' / 'SET_LDS_SIZE' / 'MOVA_GPR_INT'
/ 'ASHR_INT' / 'LSHR_INT' / 'LSHL_INT' / 'LDEXP_64'
/ 'PREDGT'
AluOpcode3 <- 'BFE_UINT' / 'BFE_INT' / 'BFI_INT' / 'FMA' / 'MULADD_64_D2'
/ 'MULADD_64_M4' / 'MULADD_64_M2' / 'MULADD_64' / 'MUL_LIT_D2' / 'MUL_LIT_M4'
/ 'MUL_LIT_M2' / 'MUL_LIT' / 'MULADD_IEEE_D2' / 'MULADD_IEEE_M4'
/ 'MULADD_IEEE_M2' / 'MULADD_IEEE' / 'MULADD_D2' / 'MULADD_M4' / 'MULADD_M2'
/ 'MULADD_e' / 'MULADD' / 'CNDGE_INT' / 'CNDGE' / 'CNDGT_INT' / 'CNDGT' / 'CNDE_INT' / 'CNDE'
AluOutputModifier <- '*2' / '*4' / '/2' / '/4'
AluDst <- VecGpr / WriteMask
AluSrc <- Negate? (AluAbsSrcValue / AluSrcValue) DstRel? OneCompSwizzleOpt?
AluAbsSrcValue <- '|' _ AluSrcValue _ '|'
AluSrcValue <- VecGpr / ConstantCache / ConstantFile / Literal / PreviousScalar / PreviousVector
AluPropertiesOpt <- (AluProperty _)*
AluProperty <- BANK_SWIZZLE / UPDATE_EXEC_MASK / 'UPDATE_PRED' / 'FOG_MERGE' / 'CLAMP'
UPDATE_EXEC_MASK <- 'UPDATE_EXEC_MASK' _ ('(' ('DEACTIVATE' / 'BREAK' / 'CONTINUE' / 'KILL') ')')?
BANK_SWIZZLE <- 'SCL_210' / 'SCL_122' / 'SCL_212' / 'SCL_221' /
'VEC_012' / 'VEC_021' / 'VEC_120' / 'VEC_102' / 'VEC_201' / 'VEC_210'
~_ <- [ \t\r\n]*
~__ <- ![a-z0-9_] _
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment