Created
January 19, 2022 07:58
-
-
Save maleadt/44966c96fa389b857910ccd3a4286bf6 to your computer and use it in GitHub Desktop.
ANTLR grammar for PTX
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
Copyright 2010 Ken Domino | |
Licensed under the Apache License, Version 2.0 (the "License"); | |
you may not use this file except in compliance with the License. | |
You may obtain a copy of the License at | |
http://www.apache.org/licenses/LICENSE-2.0 | |
Unless required by applicable law or agreed to in writing, software | |
distributed under the License is distributed on an "AS IS" BASIS, | |
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
See the License for the specific language governing permissions and | |
limitations under the License. | |
This is an Antlr v3 grammar for Nvidia's CUDA | |
(Compute Unified Device Architecture) PTX (Parallel Thread Execution) | |
assembly language, version 2.1 (April 21, 2010). A description | |
(informal) can be found in the CUDA SDK (see | |
http://www.nvidia.com/object/cuda_home_new.html and | |
http://developer.nvidia.com/object/cuda_3_1_downloads.html). | |
Aug 26, 2010 -- This version of the grammar specifies little more | |
than the context-free grammar, and a simple tree construction. | |
Additional work must be done to accept valid PTX assembly language. | |
*/ | |
grammar Ptx; | |
options { | |
backtrack=true; | |
output=AST; | |
language=C; | |
} | |
tokens { | |
COMMENT; | |
KI_ABS; | |
KI_ADD; | |
KI_ADDC; | |
KI_AND; | |
KI_ATOM; | |
KI_BAR; | |
KI_BFE; | |
KI_BFI; | |
KI_BFIND; | |
KI_BRA; | |
KI_BREV; | |
KI_BRKPT; | |
KI_CALL; | |
KI_CLZ; | |
KI_CNOT; | |
KI_COPYSIGN; | |
KI_COS; | |
KI_CVT; | |
KI_CVTA; | |
KI_DIV; | |
KI_EX2; | |
KI_EXIT; | |
KI_FMA; | |
KI_ISSPACEP; | |
KI_LD; | |
KI_LDU; | |
KI_LG2; | |
KI_MAD24; | |
KI_MAD; | |
KI_MAX; | |
KI_MEMBAR; | |
KI_MIN; | |
KI_MOV; | |
KI_MUL24; | |
KI_MUL; | |
KI_NEG; | |
KI_NOT; | |
KI_OR; | |
KI_PMEVENT; | |
KI_POPC; | |
KI_PREFETCH; | |
KI_PREFETCHU; | |
KI_PRMT; | |
KI_RCP; | |
KI_RED; | |
KI_REM; | |
KI_RET; | |
KI_RSQRT; | |
KI_SAD; | |
KI_SELP; | |
KI_SET; | |
KI_SETP; | |
KI_SHL; | |
KI_SHR; | |
KI_SIN; | |
KI_SLCT; | |
KI_SQRT; | |
KI_ST; | |
KI_SUB; | |
KI_SUBC; | |
KI_SULD; | |
KI_SUQ; | |
KI_SURED; | |
KI_SUST; | |
KI_TESTP; | |
KI_TEX; | |
KI_TRAP; | |
KI_TXQ; | |
KI_VABSDIFF; | |
KI_VADD; | |
KI_VMAD; | |
KI_VMAX; | |
KI_VMIN; | |
KI_VOTE; | |
KI_VSET; | |
KI_VSHL; | |
KI_VSHR; | |
KI_VSUB; | |
KI_XOR; | |
K_1D; | |
K_2D; | |
K_3D; | |
K_A; | |
K_ADD; | |
K_ADDR_MODE_0; | |
K_ADDR_MODE_1; | |
K_ADDR_MODE_2; | |
K_ADDRESS_SIZE; | |
K_ALIGN; | |
K_ALL; | |
K_AND; | |
K_ANY; | |
K_APPROX; | |
K_ARRIVE; | |
K_B16; | |
K_B32; | |
K_B4E; | |
K_B64; | |
K_B8; | |
K_B; | |
K_B; | |
K_BALLOT; | |
K_BRANCHTARGETS; | |
K_CA; | |
K_CALLPROTOTYPE; | |
K_CALLTARGETS; | |
K_CAS; | |
K_CC; | |
K_CG; | |
K_CHANNEL_DATA; | |
K_CHANNEL_DATA_TYPE; | |
K_CHANNEL_ORDER; | |
K_CLAMP; | |
K_CONST; | |
K_CS; | |
K_CTA; | |
K_CV; | |
K_DEC; | |
K_DEPTH; | |
K_DWARF; | |
K_ECL; | |
K_ECR; | |
K_ENTRY; | |
K_EQ; | |
K_EQU; | |
K_EXCH; | |
K_EXTERN; | |
K_F16; | |
K_F32; | |
K_F4E; | |
K_F64; | |
K_FILE; | |
K_FILTER_MODE; | |
K_FINITE; | |
K_FTZ; | |
K_FULL; | |
K_FUNC; | |
K_G; | |
K_GE; | |
K_GEU; | |
K_GL; | |
K_GLOBAL; | |
K_GT; | |
K_GTU; | |
K_HEIGHT; | |
K_HI; | |
K_HS; | |
K_INC; | |
K_INFINITE; | |
K_L1; | |
K_L2; | |
K_LE; | |
K_LEU; | |
K_LO; | |
K_LOC; | |
K_LOCAL; | |
K_LS; | |
K_LT; | |
K_LTU; | |
K_LU; | |
K_MAX; | |
K_MAXNCTAPERSM; | |
K_MAXNREG; | |
K_MAXNTID; | |
K_MIN; | |
K_MINNCTAPERSM; | |
K_NAN; | |
K_NE; | |
K_NEU; | |
K_NORMAL; | |
K_NORMALIZED_COORDS; | |
K_NOTANUMBER; | |
K_NOUNROLL; | |
K_NS; | |
K_NUM; | |
K_NUMBER; | |
K_OC; | |
K_OR; | |
K_P; | |
K_PARAM; | |
K_POPC; | |
K_PRAGMA; | |
K_PRED; | |
K_R; | |
K_RC16; | |
K_RC8; | |
K_RCP; | |
K_RED; | |
K_REG; | |
K_REQNTID; | |
K_RM; | |
K_RMI; | |
K_RN; | |
K_RNI; | |
K_RP; | |
K_RPI; | |
K_RZ; | |
K_RZI; | |
K_S16; | |
K_S32; | |
K_S64; | |
K_S8; | |
K_SAMPLERREF; | |
K_SAT; | |
K_SECTION; | |
K_SHARED; | |
K_SHIFTAMT; | |
K_SREG; | |
K_SUBNORMAL; | |
K_SURFREF; | |
K_SYNC; | |
K_SYS; | |
K_TARGET; | |
K_TEX; | |
K_TEXREF; | |
K_TO; | |
K_TRAP; | |
K_U16; | |
K_U32; | |
K_U64; | |
K_U8; | |
K_UNI; | |
K_V2; | |
K_V4; | |
K_VB; | |
K_VERSION; | |
K_VISIBLE; | |
K_VOLATILE; | |
K_W; | |
K_WB; | |
K_WIDE; | |
K_WIDTH; | |
K_WT; | |
K_X; | |
K_XOR; | |
K_Y; | |
K_Z; | |
K_ZERO; | |
LINE_COMMENT; | |
T_AND; | |
T_ANDAND; | |
T_AT; | |
T_CB; | |
T_CC; | |
T_COLON; | |
T_COMMA; | |
T_CP; | |
T_DEC_LITERAL; | |
T_DOT; | |
T_ELLIPSIS; | |
T_EQ; | |
T_EQEQ; | |
T_FLT_LITERAL; | |
T_GE; | |
T_GT; | |
T_GTGT; | |
T_HEX_LITERAL; | |
T_LE; | |
T_LT; | |
T_LTLT; | |
T_MINUS; | |
T_NOT; | |
T_NOTEQ; | |
T_OB; | |
T_OC; | |
T_OCT_LITERAL; | |
T_OP; | |
T_OR; | |
T_OROR; | |
T_PERCENT; | |
T_PLUS; | |
T_QUESTION; | |
T_SEMICOLON; | |
T_SLASH; | |
T_STAR; | |
T_STRING; | |
T_TILDE; | |
T_UNDERSCORE; | |
T_WORD; | |
T_XOR; | |
U_4BYTE; | |
U_BYTE; | |
U_DEBUG_ABBREV; | |
U_DEBUG_INFO; | |
U_DEBUG_LINE; | |
U_DEBUG_LOC; | |
U_DEBUG_PUBNAMES; | |
U_DEBUG_RANGES; | |
WS; | |
TREE_OPR; | |
TREE_TYPE; | |
TREE_EMPTY; | |
TREE_LABEL; | |
TREE_INST; | |
TREE_BLOCK; | |
TREE_DEBUG; | |
TREE_PRED; | |
TREE_FUNC; | |
TREE_ENTRY; | |
TREE_VAR; | |
TREE_SPACE; | |
TREE_VECTOR_TYPE; | |
TREE_PARAM_LIST; | |
TREE_PARAM; | |
TREE_PERF; | |
TREE_ARRAY; | |
TREE_PAR_REGISTER; | |
TREE_ALIGN; | |
TREE_IRND; | |
TREE_FRND; | |
TREE_CAST; | |
TREE_CONSTANT_EXPR; | |
TREE_EXTERN; | |
} | |
@members | |
{ | |
} | |
prog | |
: version target address_size? statement+ EOF | |
; | |
//////////////////////////////////////////////////////////////////////////////////////////////////// | |
// | |
// Individual statements and directives of a PTX assembly language file. | |
// | |
//////////////////////////////////////////////////////////////////////////////////////////////////// | |
version | |
: K_VERSION^ float_ | |
; | |
target | |
: K_TARGET^ target_list | |
; | |
address_size | |
: K_ADDRESS_SIZE^ integer | |
; | |
target_list | |
: T_WORD (T_COMMA T_WORD)* | |
; | |
statement | |
: label_decl | |
| semicolon_terminated_statement | |
| unterminated_statement | |
; | |
label_decl | |
: | |
i=T_WORD | |
T_COLON -> ^( TREE_LABEL $i ) | |
; | |
/************************************************************************************** | |
** | |
** PTX has a bizarre mix of semicolon-terminated and -untermininated statements. | |
** This requires a bit of messiness in the grammar. | |
** | |
***************************************************************************************/ | |
semicolon_terminated_statement | |
: ( | |
semicolon_terminated_directive | |
| instruction | |
| linking_directive | |
) | |
T_SEMICOLON! | |
| pragma | |
; | |
unterminated_statement | |
: unterminated_directive | |
; | |
semicolon_terminated_directive | |
: control_flow_directive | |
| identifier_decl | |
; | |
unterminated_directive | |
: entry | |
| func ( T_SEMICOLON! )? | |
| debugging_directive | |
| T_OC statement+ T_CC -> ^( TREE_BLOCK statement+ ) | |
; | |
entry | |
: | |
a=entry_aux -> ^( TREE_ENTRY $a ) | |
; | |
entry_aux | |
: | |
(K_VISIBLE | K_EXTERN )? | |
K_ENTRY kernel_name ( T_OP entry_param_list? T_CP )? performance_tuning_directives? entry_body | |
-> | |
kernel_name ^( TREE_PARAM_LIST entry_param_list? ) ^( TREE_PERF performance_tuning_directives? ) entry_body | |
; | |
kernel_name | |
: T_WORD | |
; | |
entry_param_list | |
: entry_param ( T_COMMA! entry_param)* | |
; | |
entry_param | |
: entry_space align? entry_param_type T_WORD array_spec? | |
-> | |
^( TREE_PARAM T_WORD entry_param_type align? array_spec? ) | |
; | |
entry_space | |
: K_PARAM! | |
; | |
align | |
: K_ALIGN b=byte_count | |
-> | |
^( TREE_ALIGN $b ) | |
; | |
byte_count | |
: base_10_integer | base_8_integer | base_16_integer | |
; | |
entry_param_type | |
: fundamental_type | |
| opaque_type | |
; | |
entry_body | |
: | |
T_OC statement* T_CC | |
-> | |
^( TREE_BLOCK statement* ) | |
; | |
fundamental_type | |
: | |
a=fundamental_type_aux -> ^( TREE_TYPE $a ) | |
; | |
fundamental_type_aux | |
: K_S8 | |
| K_S16 | |
| K_S32 | |
| K_S64 | |
| K_U8 | |
| K_U16 | |
| K_U32 | |
| K_U64 | |
| K_F16 | |
| K_F32 | |
| K_F64 | |
| K_B8 | |
| K_B16 | |
| K_B32 | |
| K_B64 | |
| K_PRED | |
; | |
vector_type | |
: | |
v=vector_type_aux | |
f=fundamental_type | |
-> ^( TREE_VECTOR_TYPE $v ) $f | |
; | |
vector_type_aux | |
: | |
( K_V4 | K_V2 ) | |
; | |
opaque_type | |
: | |
a=opaque_type_aux -> ^( TREE_TYPE $a ) | |
; | |
opaque_type_aux | |
: K_TEXREF | |
| K_SAMPLERREF | |
| K_SURFREF | |
; | |
func | |
: a=func_aux -> ^( TREE_FUNC $a ) | |
; | |
func_aux | |
: | |
(K_VISIBLE | K_EXTERN )? | |
K_FUNC! | |
( T_OP func_ret_list? T_CP )? | |
func_name | |
( T_OP func_param_list? T_CP )? | |
func_body? | |
; | |
func_name | |
: T_WORD | |
; | |
func_ret_list | |
: func_ret ( T_COMMA! func_ret )* | |
; | |
func_ret | |
: func_ret_space align? func_ret_type T_WORD array_spec? | |
; | |
func_ret_space | |
: K_PARAM | |
| K_REG | |
; | |
func_ret_type | |
: fundamental_type | |
; | |
func_param_list | |
: func_param ( T_COMMA! func_param )* ( T_ELLIPSIS )? | |
; | |
func_param | |
: func_param_space align? func_param_type T_WORD array_spec? | |
; | |
func_param_space | |
: K_PARAM | |
| K_REG | |
; | |
func_param_type | |
: fundamental_type | |
; | |
func_body | |
: T_OC statement* T_CC | |
; | |
control_flow_directive | |
: branch_targets | |
| call_prototype | |
| call_targets | |
; | |
branch_targets | |
: label_decl K_BRANCHTARGETS list_of_labels T_SEMICOLON | |
; | |
list_of_labels | |
: opr ( T_COMMA! opr )* | |
; | |
call_targets | |
: label_decl K_CALLTARGETS list_of_labels | |
; | |
call_prototype | |
: label_decl K_CALLPROTOTYPE ( T_OP call_param_list? T_CP)? T_UNDERSCORE ( T_OP call_param_list? T_CP )? | |
; | |
call_param_list | |
: call_param ( T_COMMA! call_param )* | |
; | |
call_param | |
: call_param_space align? call_param_type T_UNDERSCORE array_spec? | |
; | |
call_param_space | |
: K_PARAM | |
| K_REG | |
; | |
call_param_type | |
: fundamental_type | |
; | |
performance_tuning_directives | |
: ( performance_tuning_directive )+ | |
; | |
performance_tuning_directive | |
: maxnreg | |
| maxntid | |
| reqntid | |
| minnctapersm | |
| maxnctapersm | |
| pragma | |
; | |
maxnreg | |
: K_MAXNREG integer | |
; | |
maxntid | |
: K_MAXNTID integer ( T_COMMA integer ( T_COMMA integer )? )? | |
; | |
reqntid | |
: K_REQNTID integer ( T_COMMA integer ( T_COMMA integer )? )? | |
; | |
minnctapersm | |
: K_MINNCTAPERSM integer | |
; | |
maxnctapersm | |
: K_MINNCTAPERSM integer | |
; | |
pragma | |
: K_PRAGMA list_of_strings T_SEMICOLON! | |
; | |
list_of_strings | |
: K_NOUNROLL | |
; | |
debugging_directive | |
: dwarf | |
| file | |
| section | |
| loc | |
; | |
dwarf | |
: a=K_DWARF -> ^( TREE_DEBUG $a ) | |
; | |
file | |
: a=K_FILE b=integer c=T_STRING (T_COMMA integer)* -> ^( TREE_DEBUG $a $b $c ) | |
; | |
section | |
: a=K_SECTION | |
section_name | |
T_OC | |
data_declarator_list* | |
T_CC | |
-> ^( TREE_DEBUG $a ) // not complete. | |
; | |
section_name | |
: T_WORD | U_DEBUG_ABBREV | U_DEBUG_INFO | U_DEBUG_LINE | (U_DEBUG_LOC (T_PLUS integer)?) | U_DEBUG_PUBNAMES | U_DEBUG_RANGES | |
; | |
data_declarator_list | |
: type | |
(integer | T_WORD | U_DEBUG_ABBREV | U_DEBUG_INFO | U_DEBUG_LINE | (U_DEBUG_LOC (T_PLUS integer)?) | U_DEBUG_PUBNAMES | U_DEBUG_RANGES) | |
; | |
loc | |
: a=K_LOC b=integer c=integer d=integer -> ^( TREE_DEBUG $a $b $c $d) | |
; | |
linking_directive | |
: extern_ | |
| visible | |
; | |
extern_ | |
: | |
K_EXTERN | |
i=identifier_decl | |
-> ^( TREE_EXTERN $i ) | |
; | |
visible | |
: K_VISIBLE identifier_decl | |
; | |
identifier_decl | |
: | |
a=identifier_decl_aux -> ^( TREE_VAR $a ) | |
; | |
identifier_decl_aux | |
: state_space_specifier align? variable_declarator_list | |
| global_space_specifier align? variable_declarator_list_with_initializer | |
| const_space_specifier align? variable_declarator_list_with_initializer | |
; | |
variable_declarator_list | |
: type variable_declarator ( T_COMMA variable_declarator )* | |
; | |
variable_declarator_list_with_initializer | |
: type variable_declarator_with_initializer ( T_COMMA variable_declarator_with_initializer )* | |
; | |
variable_declarator | |
: id_or_opcode | |
( | |
array_spec | |
| parameterized_register_spec | |
) | |
; | |
array_spec | |
: | |
i=array_spec_aux -> ^( TREE_ARRAY $i ) | |
| | |
; | |
array_spec_aux | |
: | |
( T_OB integer? T_CB )+ | |
; | |
parameterized_register_spec | |
: | |
/// Parameterized register names 1.4 spec, page 28. Only a constant is allow. | |
( T_LT integer T_GT )? | |
-> ^( TREE_PAR_REGISTER integer ) | |
; | |
id_or_opcode | |
: T_WORD | |
| opcode | |
; | |
opcode | |
: KI_ABS | |
| KI_ADD | |
| KI_ADDC | |
| KI_AND | |
| KI_ATOM | |
| KI_BAR | |
| KI_BFE | |
| KI_BFI | |
| KI_BFIND | |
| KI_BRA | |
| KI_BREV | |
| KI_BRKPT | |
| KI_CALL | |
| KI_CLZ | |
| KI_CNOT | |
| KI_COPYSIGN | |
| KI_COS | |
| KI_CVT | |
| KI_CVTA | |
| KI_DIV | |
| KI_EX2 | |
| KI_EXIT | |
| KI_FMA | |
| KI_ISSPACEP | |
| KI_LD | |
| KI_LDU | |
| KI_LG2 | |
| KI_MAD | |
| KI_MAD24 | |
| KI_MAX | |
| KI_MEMBAR | |
| KI_MIN | |
| KI_MOV | |
| KI_MUL | |
| KI_MUL24 | |
| KI_NEG | |
| KI_NOT | |
| KI_OR | |
| KI_PMEVENT | |
| KI_POPC | |
| KI_PREFETCH | |
| KI_PREFETCHU | |
| KI_PRMT | |
| KI_RCP | |
| KI_RED | |
| KI_REM | |
| KI_RET | |
| KI_RSQRT | |
| KI_SAD | |
| KI_SELP | |
| KI_SET | |
| KI_SETP | |
| KI_SHL | |
| KI_SHR | |
| KI_SIN | |
| KI_SLCT | |
| KI_SQRT | |
| KI_ST | |
| KI_SUB | |
| KI_SUBC | |
| KI_SULD | |
| KI_SURED | |
| KI_SUST | |
| KI_SUQ | |
| KI_TESTP | |
| KI_TEX | |
| KI_TXQ | |
| KI_TRAP | |
| KI_VABSDIFF | |
| KI_VADD | |
| KI_VMAD | |
| KI_VMAX | |
| KI_VMIN | |
| KI_VSET | |
| KI_VSHL | |
| KI_VSHR | |
| KI_VSUB | |
| KI_VOTE | |
| KI_XOR | |
; | |
variable_declarator_with_initializer | |
: id_or_opcode | |
( | |
( | |
array_spec | |
variable_equal_initializer | |
) | | |
/// Parameterized register names 1.4 spec, page 28. Only a constant is allow. | |
( T_LT integer T_GT ) | |
) | |
; | |
variable_equal_initializer | |
: | |
( T_EQ^ variable_initializer )? | |
; | |
variable_initializer | |
: ( aggregate_initializer | constant_expression | id_or_opcode ) | |
; | |
aggregate_initializer | |
: T_OC! | |
(variable_initializer | |
(T_COMMA! variable_initializer | |
)* | |
)? | |
T_CC! | |
; | |
type | |
: fundamental_type | |
| vector_type | |
| opaque_type | |
; | |
id | |
: opr | |
| array_spec | |
; | |
state_space_specifier | |
: | |
a=state_space_specifier_aux -> ^( TREE_SPACE $a ) | |
; | |
state_space_specifier_aux | |
: align | |
| local | |
| param | |
| reg | |
| shared | |
| sreg | |
| tex | |
; | |
global_space_specifier | |
: a=global -> ^( TREE_SPACE $a ) | |
; | |
const_space_specifier | |
: a=const_ -> ^( TREE_SPACE $a ) | |
; | |
const_ | |
: K_CONST | |
; | |
global | |
: K_GLOBAL | |
; | |
local | |
: K_LOCAL | |
; | |
param | |
: K_PARAM | |
; | |
reg | |
: K_REG | |
; | |
shared | |
: K_SHARED | |
; | |
sreg | |
: K_SREG | |
; | |
tex | |
: K_TEX | |
; | |
//////////////////////////////////////////////////////////////////////////////////////////////////// | |
// | |
// PTX Instruction set. | |
// | |
// Each instruction is complicated by the fact that each has different type qualifiers (the stuff | |
// after the instruction name), and operands. In order to construct the tree, Antlr requires | |
// a lot of auxiliary rules to be added, instead of tree variables for subrules, e.g., | |
// | |
// i_abs | |
// : i=KI_ABS | |
// t=( | |
// ( | |
// K_S16 | K_S32 | K_S64 | |
// ) | | |
// ( | |
// K_FTZ? K_F32 | |
// ) | | |
// ( | |
// K_F64 | |
// ) | |
// ) | |
// o=( | |
// opr_register | |
// T_COMMA | |
// opr_register_or_constant | |
// ) | |
// -> ^($i ^(TREE_TYPE $t) ^(TREE_OPR $o)) | |
// ; | |
// | |
//////////////////////////////////////////////////////////////////////////////////////////////////// | |
instruction | |
: | |
a=instruction_aux -> ^( TREE_INST $a ) | |
; | |
instruction_aux | |
: predicate? | |
( | |
i_abs | |
| i_add | |
| i_addc | |
| i_and | |
| i_atom | |
| i_bar | |
| i_bfe | |
| i_bfi | |
| i_bfind | |
| i_bra | |
| i_brev | |
| i_brkpt | |
| i_call | |
| i_clz | |
| i_cnot | |
| i_copysign | |
| i_cos | |
| i_cvt | |
| i_cvta | |
| i_div | |
| i_ex2 | |
| i_exit | |
| i_fma | |
| i_isspacep | |
| i_ld | |
| i_ldu | |
| i_lg2 | |
| i_mad | |
| i_mad24 | |
| i_max | |
| i_membar | |
| i_min | |
| i_mov | |
| i_mul | |
| i_mul24 | |
| i_neg | |
| i_not | |
| i_or | |
| i_pmevent | |
| i_popc | |
| i_prefetch | |
| i_prefetchu | |
| i_prmt | |
| i_rcp | |
| i_red | |
| i_rem | |
| i_ret | |
| i_rsqrt | |
| i_sad | |
| i_selp | |
| i_set | |
| i_setp | |
| i_shl | |
| i_shr | |
| i_sin | |
| i_slct | |
| i_sqrt | |
| i_st | |
| i_sub | |
| i_subc | |
| i_suld | |
| i_sured | |
| i_sust | |
| i_suq | |
| i_testp | |
| i_tex | |
| i_txq | |
| i_trap | |
| i_vabsdiff | |
| i_vadd | |
| i_vmad | |
| i_vmax | |
| i_vmin | |
| i_vset | |
| i_vshl | |
| i_vshr | |
| i_vsub | |
| i_vote | |
| i_xor | |
) | |
; | |
predicate | |
: T_AT T_NOT? T_WORD -> ^( TREE_PRED T_NOT? T_WORD ) | |
; | |
i_abs | |
: | |
i=KI_ABS | |
t=i_abs_type | |
o=i_abs_opr | |
-> $i ^(TREE_TYPE $t) $o | |
; | |
i_abs_type | |
: | |
( | |
( | |
K_S16 | K_S32 | K_S64 | |
) | | |
( | |
K_FTZ? K_F32 | |
) | | |
( | |
K_F64 | |
) | |
) | |
; | |
i_abs_opr | |
: | |
( | |
opr_register | |
T_COMMA! | |
opr_register_or_constant | |
) | |
; | |
i_add | |
: | |
i=KI_ADD | |
t=i_add_type | |
o=i_add_opr | |
-> $i ^(TREE_TYPE $t) $o | |
; | |
i_add_type: | |
( | |
( | |
( ( K_SAT K_S32 ) | ( K_U16 | K_U32 | K_U64 | K_S16 | K_S32 | K_S64) ) | | |
( K_CC ( K_S32 | K_U32 ) ) | |
) | | |
( | |
( K_RN | K_RZ | K_RM | K_RP )? K_FTZ? K_SAT? K_F32 | |
) | | |
( ( K_RN | K_RZ | K_RM | K_RP )? K_F64 ) | |
) | |
; | |
i_add_opr | |
: | |
opr_register | |
T_COMMA! | |
opr_register_or_constant2 | |
; | |
i_addc | |
: | |
i=KI_ADDC | |
t=i_addc_type | |
o=i_addc_opr | |
-> $i ^(TREE_TYPE $t) $o | |
; | |
i_addc_type: | |
( | |
( | |
K_CC? ( K_S32 | K_U32 | K_S16 | K_U16 | K_U64 ) | |
) | |
) | |
; | |
i_addc_opr | |
: | |
opr_register | |
T_COMMA! | |
opr_register_or_constant2 | |
; | |
i_and | |
: | |
i=KI_AND | |
t=i_and_type | |
o=i_and_opr | |
-> $i ^(TREE_TYPE $t) $o | |
; | |
i_and_type: | |
( | |
K_PRED | K_B16 | K_B32 | K_B64 | |
) | |
; | |
i_and_opr | |
: | |
opr3 | |
; | |
i_atom | |
: | |
i=KI_ATOM | |
t=i_atom_type | |
o=i_atom_opr | |
-> $i ^(TREE_TYPE $t) $o | |
; | |
i_atom_type | |
: | |
( | |
( | |
( K_GLOBAL | K_SHARED )? | |
( K_AND | K_OR | K_XOR | K_CAS | K_EXCH | K_ADD | K_INC | K_DEC | K_MIN | K_MAX ) | |
( K_B32 | K_B64 | K_U32 | K_U64 | K_S32 | K_F32 ) | |
) | |
) | |
; | |
i_atom_opr | |
: | |
opr T_COMMA! T_OB! opr T_CB! T_COMMA! opr ( T_COMMA! opr )? | |
; | |
i_bar | |
: i_bar1 | |
| i_bar2 | |
| i_bar3 | |
| i_bar4 | |
; | |
i_bar1 | |
: | |
i=KI_BAR | |
t=i_bar1_type | |
o=i_bar1_opr | |
-> $i ^(TREE_TYPE $t) $o | |
; | |
i_bar1_type | |
: | |
K_SYNC | |
; | |
i_bar1_opr | |
: | |
opr ( T_COMMA! opr )? | |
; | |
i_bar2 | |
: | |
i=KI_BAR | |
t=i_bar2_type | |
o=i_bar2_opr | |
-> $i ^(TREE_TYPE $t) $o | |
; | |
i_bar2_type | |
: | |
K_ARRIVE | |
; | |
i_bar2_opr | |
: | |
opr2 | |
; | |
i_bar3 | |
: | |
i=KI_BAR | |
t=i_bar3_type | |
o=i_bar3_opr | |
-> $i ^(TREE_TYPE $t) $o | |
; | |
i_bar3_type | |
: | |
( | |
K_RED | |
K_POPC | |
K_U32 | |
) | |
; | |
i_bar3_opr | |
: | |
opr T_COMMA! opr | |
( T_COMMA! opr )? | |
T_COMMA! T_NOT? opr | |
; | |
i_bar4 | |
: | |
i=KI_BAR | |
t=i_bar4_type | |
o=i_bar4_opr | |
-> $i ^(TREE_TYPE $t) $o | |
; | |
i_bar4_type | |
: | |
( | |
K_RED | |
( K_AND | K_OR ) | |
K_PRED | |
) | |
; | |
i_bar4_opr | |
: | |
opr T_COMMA! opr | |
( T_COMMA! opr )? | |
T_COMMA! T_NOT? opr | |
; | |
i_bfe | |
: | |
i=KI_BFE | |
t=i_bfe_type | |
o=i_bfe_opr | |
-> $i ^(TREE_TYPE $t) $o | |
; | |
i_bfe_type | |
: | |
( K_S32 | K_U32 | K_S64 | K_U64 ) | |
; | |
i_bfe_opr | |
: | |
opr_register | |
T_COMMA! | |
opr_register_or_constant3 | |
; | |
i_bfi | |
: | |
i=KI_BFI | |
t=i_bfi_type | |
o=i_bfi_opr | |
-> $i ^(TREE_TYPE $t) $o | |
; | |
i_bfi_type | |
: | |
( K_B32 | K_B64 ) | |
; | |
i_bfi_opr | |
: | |
opr_register | |
T_COMMA! | |
opr_register_or_constant4 | |
; | |
i_bfind | |
: | |
i=KI_BFIND | |
t=i_bfind_type | |
o=i_bfind_opr | |
-> $i ^(TREE_TYPE $t) $o | |
; | |
i_bfind_type | |
: | |
( K_SHIFTAMT )? ( K_S32 | K_U32 | K_S64 | K_U64 ) | |
; | |
i_bfind_opr | |
: | |
opr_register | |
T_COMMA! | |
opr_register_or_constant | |
; | |
i_bra | |
: | |
KI_BRA | |
i_bra_type | |
i_bra_opr | |
; | |
i_bra_type | |
: | |
( K_UNI -> ^(TREE_TYPE K_UNI) | |
| | |
) | |
; | |
i_bra_opr | |
: | |
( | |
opr_label | |
| opr_register T_COMMA! opr_label | |
) | |
; | |
i_brev | |
: | |
i=KI_BREV | |
t=i_brev_type | |
o=i_brev_opr | |
-> $i ^(TREE_TYPE $t) $o | |
; | |
i_brev_type | |
: | |
( K_B32 | K_B64 ) | |
; | |
i_brev_opr | |
: | |
opr_register | |
T_COMMA! | |
opr_register_or_constant | |
; | |
i_brkpt | |
: | |
i=KI_BRKPT | |
-> $i | |
; | |
i_call | |
: | |
KI_CALL | |
i_call_type | |
( T_OP! opr ( T_COMMA! opr )* T_CP! T_COMMA! )? | |
func_name | |
( T_COMMA! T_OP! opr ( T_COMMA! opr )* T_CP! )? | |
( T_COMMA! flist | T_COMMA! fproto )? | |
; | |
i_call_type | |
: | |
t=K_UNI -> ^(TREE_TYPE $t) | |
| | |
; | |
flist | |
: T_WORD | |
; | |
fproto | |
: T_WORD | |
; | |
i_clz | |
: | |
i=KI_CLZ | |
t=i_clz_type | |
o=i_clz_opr | |
-> $i ^(TREE_TYPE $t) $o | |
; | |
i_clz_type | |
: | |
( K_B32 | K_B64 ) | |
; | |
i_clz_opr | |
: | |
opr_register | |
T_COMMA! | |
opr_register_or_constant | |
; | |
i_cnot | |
: | |
i=KI_CNOT | |
t=i_cnot_type | |
o=i_cnot_opr | |
-> $i ^(TREE_TYPE $t) $o | |
; | |
i_cnot_type | |
: | |
( | |
K_B16 | K_B32 | K_B64 | |
) | |
; | |
i_cnot_opr | |
: | |
opr2 | |
; | |
i_copysign | |
: | |
i=KI_COPYSIGN | |
t=i_copysign_type | |
o=i_copysign_opr | |
-> $i ^(TREE_TYPE $t) $o | |
; | |
i_copysign_type | |
: | |
( K_F32 | K_F64 ) | |
; | |
i_copysign_opr | |
: | |
opr_register | |
T_COMMA! | |
opr_register | |
T_COMMA! | |
opr_register | |
; | |
i_cos | |
: | |
i=KI_COS | |
t=i_cos_type | |
o=i_cos_opr | |
-> $i ^(TREE_TYPE $t) $o | |
; | |
i_cos_type | |
: | |
K_APPROX K_FTZ? K_F32 | |
; | |
i_cos_opr | |
: | |
opr2 | |
; | |
i_cvt | |
: | |
i=KI_CVT | |
t=i_cvt_type | |
o=i_cvt_opr | |
-> $i ^(TREE_TYPE $t) $o | |
; | |
i_cvt_type | |
: | |
( | |
( | |
( i_cvt_irnd | i_cvt_frnd ) | |
K_FTZ? | |
K_SAT? | |
( K_U8 | K_U16 | K_U32 | K_U64 | K_S8 | K_S16 | K_S32 | K_S64 | K_F16 | K_F32 | K_F64 ) | |
( K_U8 | K_U16 | K_U32 | K_U64 | K_S8 | K_S16 | K_S32 | K_S64 | K_F16 | K_F32 | K_F64 ) | |
( i_cvt_irnd | i_cvt_frnd ) | |
K_FTZ? | |
K_SAT? | |
) | |
) | |
; | |
i_cvt_irnd | |
: | |
i=i_cvt_irnd_aux -> ^( TREE_IRND $i ) | |
| | |
; | |
i_cvt_irnd_aux | |
: | |
( K_RNI | K_RZI | K_RMI | K_RPI ) | |
; | |
i_cvt_frnd | |
: | |
i=i_cvt_frnd_aux -> ^( TREE_FRND $i ) | |
| | |
; | |
i_cvt_frnd_aux | |
: | |
( K_RN | K_RZ | K_RM | K_RP ) | |
; | |
i_cvt_opr | |
: | |
opr2 | |
; | |
i_cvta | |
: | |
i=KI_CVTA | |
t=i_cvta_type | |
o=i_cvta_opr | |
-> $i ^(TREE_TYPE $t) $o | |
; | |
i_cvta_type | |
: | |
K_TO? | |
( K_GLOBAL | K_LOCAL | K_SHARED | K_CONST ) | |
( K_U32 | K_U64 ) | |
; | |
i_cvta_opr | |
: | |
opr T_COMMA! opr ( T_PLUS integer )? | |
; | |
i_div | |
: | |
i=KI_DIV | |
t=i_div_type | |
o=i_div_opr | |
-> $i ^(TREE_TYPE $t) $o | |
; | |
i_div_type | |
: | |
( | |
( | |
K_U16 | K_U32 | K_U64 | K_S16 | K_S32 | K_S64 | |
) | | |
( | |
K_APPROX K_FTZ? K_F32 | |
) | | |
( | |
K_FULL K_FTZ? K_F32 | |
) | | |
( | |
( K_RN | K_RZ | K_RM | K_RP ) K_FTZ? K_F32 | |
) | | |
( | |
( K_RN | K_RZ | K_RM | K_RP ) K_F64 | |
) | |
) | |
; | |
i_div_opr | |
: | |
opr_register | |
T_COMMA! | |
opr_register_or_constant2 | |
; | |
i_ex2 | |
: | |
i=KI_EX2 | |
t=i_ex2_type | |
o=i_ex2_opr | |
-> $i ^(TREE_TYPE $t) $o | |
; | |
i_ex2_type | |
: | |
K_APPROX K_FTZ? K_F32 | |
; | |
i_ex2_opr | |
: | |
opr2 | |
; | |
i_exit | |
: | |
i=KI_EXIT | |
-> $i | |
; | |
i_fma | |
: | |
i=KI_FMA | |
t=i_fma_type | |
o=i_fma_opr | |
-> $i ^(TREE_TYPE $t) $o | |
; | |
i_fma_type | |
: | |
( K_RN | K_RZ | K_RM | K_RP ) | |
K_FTZ? | |
K_SAT? | |
K_F32 | |
; | |
i_fma_opr | |
: | |
opr4 | |
; | |
i_isspacep | |
: | |
i=KI_ISSPACEP | |
t=i_isspacep_type | |
o=i_isspacep_opr | |
-> $i ^(TREE_TYPE $t) $o | |
; | |
i_isspacep_type | |
: | |
( K_GLOBAL | K_LOCAL | K_SHARED ) | |
; | |
i_isspacep_opr | |
: | |
opr2 | |
; | |
i_ld | |
: | |
i=KI_LD | |
t=i_ld_type | |
o=i_ld_opr | |
-> $i ^(TREE_TYPE $t) $o | |
; | |
i_ld_type | |
: | |
( | |
( | |
( K_CONST | K_GLOBAL | K_LOCAL | K_PARAM | K_SHARED )? | |
( K_CA | K_CG | K_CS | K_LU | K_CV )? | |
( K_B8 | K_B16 | K_B32 | K_B64 | K_U8 | K_U16 | K_U32 | K_U64 | K_S8 | K_S16 | K_S32 | K_S64 | K_F32 | K_F64 ) | |
) | | |
( | |
( K_CONST | K_GLOBAL | K_LOCAL | K_PARAM | K_SHARED )? | |
( K_CA | K_CG | K_CS | K_LU | K_CV )? | |
( K_V2 | K_V4 ) | |
( K_B8 | K_B16 | K_B32 | K_B64 | K_U8 | K_U16 | K_U32 | K_U64 | K_S8 | K_S16 | K_S32 | K_S64 | K_F32 | K_F64 ) | |
) | | |
( | |
K_VOLATILE | |
( K_CONST | K_GLOBAL | K_LOCAL | K_PARAM | K_SHARED )? | |
( K_B8 | K_B16 | K_B32 | K_B64 | K_U8 | K_U16 | K_U32 | K_U64 | K_S8 | K_S16 | K_S32 | K_S64 | K_F32 | K_F64 ) | |
) | | |
( | |
K_VOLATILE | |
( K_CONST | K_GLOBAL | K_LOCAL | K_PARAM | K_SHARED )? | |
( K_V2 | K_V4 ) | |
( K_B8 | K_B16 | K_B32 | K_B64 | K_U8 | K_U16 | K_U32 | K_U64 | K_S8 | K_S16 | K_S32 | K_S64 | K_F32 | K_F64 ) | |
) | |
) | |
; | |
i_ld_opr | |
: opr T_COMMA! T_OB! opr T_CB! | |
; | |
i_ldu | |
: | |
i=KI_LDU | |
t=i_ldu_type | |
o=i_ldu_opr | |
-> $i ^(TREE_TYPE $t) $o | |
; | |
i_ldu_type | |
: | |
( | |
( | |
( K_GLOBAL )? | |
( K_B8 | K_B16 | K_B32 | K_B64 | K_U8 | K_U16 | K_U32 | K_U64 | K_S8 | K_S16 | K_S32 | K_S64 | K_F32 | K_F64 ) | |
) | | |
( | |
( K_GLOBAL )? | |
( K_V2 | K_V4 ) | |
( K_B8 | K_B16 | K_B32 | K_B64 | K_U8 | K_U16 | K_U32 | K_U64 | K_S8 | K_S16 | K_S32 | K_S64 | K_F32 | K_F64 ) | |
) | |
) | |
; | |
i_ldu_opr | |
: | |
opr T_COMMA! T_OB! opr T_CB! | |
; | |
i_lg2 | |
: | |
i=KI_LG2 | |
t=i_lg2_type | |
o=i_lg2_opr | |
-> $i ^(TREE_TYPE $t) $o | |
; | |
i_lg2_type | |
: | |
K_APPROX K_FTZ? K_F32 | |
; | |
i_lg2_opr | |
: | |
opr2 | |
; | |
i_mad | |
: | |
i=KI_MAD | |
t=i_mad_type | |
o=i_mad_opr | |
-> $i ^(TREE_TYPE $t) $o | |
; | |
i_mad_type | |
: | |
( | |
( | |
( K_HI | K_LO | K_WIDE ) | |
( K_U16 | K_U32 | K_U64 | K_S16 | K_S32 | K_S64 ) | |
) | | |
( K_HI K_SAT K_S32 ) | | |
( | |
K_FTZ? | |
K_SAT? | |
K_F32 | |
) | | |
( | |
( K_RN | K_RZ | K_RM | K_RP) | |
K_FTZ? | |
K_SAT? | |
K_F32 | |
) | | |
( | |
( K_RN | K_RZ | K_RM | K_RP) | |
K_F64 | |
) | |
) | |
; | |
i_mad_opr | |
: | |
opr_register | |
T_COMMA! | |
opr_register_or_constant3 | |
; | |
i_mad24 | |
: | |
i=KI_MAD24 | |
t=i_mad24_type | |
o=i_mad24_opr | |
-> $i ^(TREE_TYPE $t) $o | |
; | |
i_mad24_type | |
: | |
( | |
( | |
( K_HI | K_LO ) | |
( K_U32 | K_S32 ) | |
) | | |
( | |
K_HI K_SAT K_S32 | |
) | |
) | |
; | |
i_mad24_opr | |
: | |
opr_register | |
T_COMMA! | |
opr_register_or_constant3 | |
; | |
i_max | |
: | |
i=KI_MAX | |
t=i_max_type | |
o=i_max_opr | |
-> $i ^(TREE_TYPE $t) $o | |
; | |
i_max_type | |
: | |
( | |
( | |
K_U16 | K_U32 | K_U64 | K_S16 | K_S32 | K_S64 | |
) | | |
( | |
K_FTZ? K_F32 | |
) | | |
( | |
K_F64 | |
) | |
) | |
; | |
i_max_opr | |
: | |
opr_register | |
T_COMMA! | |
opr_register_or_constant2 | |
; | |
i_membar | |
: | |
i=KI_MEMBAR | |
t=i_membar_type | |
-> $i ^(TREE_TYPE $t) | |
; | |
i_membar_type | |
: | |
( K_CTA | K_GL | K_SYS ) | |
; | |
i_min | |
: | |
i=KI_MIN | |
t=i_min_type | |
o=i_min_opr | |
-> $i ^(TREE_TYPE $t) $o | |
; | |
i_min_type | |
: | |
( | |
( | |
K_U16 | K_U32 | K_U64 | K_S16 | K_S32 | K_S64 | |
) | | |
( | |
K_FTZ? K_F32 | |
) | | |
( | |
K_F64 | |
) | |
) | |
; | |
i_min_opr | |
: | |
opr_register | |
T_COMMA! | |
opr_register_or_constant2 | |
; | |
i_mov | |
: | |
i=KI_MOV | |
t=i_mov_type | |
o=i_mov_opr | |
-> $i ^(TREE_TYPE $t) $o | |
; | |
i_mov_type | |
: | |
( | |
K_PRED | K_B16 | K_B32 | K_B64 | K_U16 | K_U32 | K_U64 | K_S16 | K_S32 | K_S64 | K_F32 | K_F64 | |
) | |
; | |
i_mov_opr | |
: | |
opr2 | |
; | |
i_mul | |
: | |
i=KI_MUL | |
t=i_mul_type | |
o=i_mul_opr | |
-> $i ^(TREE_TYPE $t) $o | |
; | |
i_mul_type | |
: | |
( | |
( | |
( K_HI | K_LO | K_WIDE )? ( K_U16 | K_U32 | K_U64 | K_S16 | K_S32 | K_S64 ) | |
) | | |
( | |
( K_RN | K_RZ | K_RM | K_RP )? K_FTZ? K_SAT? K_F32 | |
) | | |
( | |
( K_RN | K_RZ | K_RM | K_RP )? K_F64 | |
) | |
) | |
; | |
i_mul_opr | |
: | |
opr_register | |
T_COMMA! | |
opr_register_or_constant2 | |
; | |
i_mul24 | |
: | |
i=KI_MUL24 | |
t=i_mul24_type | |
o=i_mul24_opr | |
-> $i ^(TREE_TYPE $t) $o | |
; | |
i_mul24_type | |
: | |
( ( K_HI | K_LO ) ( K_U32 | K_S32 ) ) | |
; | |
i_mul24_opr | |
: | |
opr_register | |
T_COMMA! | |
opr_register_or_constant2 | |
; | |
i_neg | |
: | |
i=KI_NEG | |
t=i_neg_type | |
o=i_neg_opr | |
-> $i ^(TREE_TYPE $t) $o | |
; | |
i_neg_type | |
: | |
( | |
( | |
K_S16 | K_S32 | K_S64 | |
) | | |
( | |
K_FTZ? K_F32 | |
) | | |
( | |
K_F64 | |
) | |
) | |
; | |
i_neg_opr | |
: | |
opr_register | |
T_COMMA! | |
opr_register_or_constant | |
; | |
i_not | |
: | |
i=KI_NOT | |
t=i_not_type | |
o=i_not_opr | |
-> $i ^(TREE_TYPE $t) $o | |
; | |
i_not_type | |
: | |
( | |
K_PRED | K_B16 | K_B32 | K_B64 | |
) | |
; | |
i_not_opr | |
: | |
opr2 | |
; | |
i_or | |
: | |
i=KI_OR | |
t=i_or_type | |
o=i_or_opr | |
-> $i ^(TREE_TYPE $t) $o | |
; | |
i_or_type | |
: | |
( | |
K_PRED | K_B16 | K_B32 | K_B64 | |
) | |
; | |
i_or_opr | |
: | |
opr3 | |
; | |
i_pmevent | |
: | |
i=KI_PMEVENT | |
o=i_pmevent_opr | |
-> $i $o | |
; | |
i_pmevent_opr | |
: | |
opr | |
; | |
i_popc | |
: | |
i=KI_POPC | |
t=i_popc_type | |
o=i_popc_opr | |
-> $i ^(TREE_TYPE $t) $o | |
; | |
i_popc_type | |
: | |
( K_B32 | K_B64 ) | |
; | |
i_popc_opr | |
: | |
opr_register | |
T_COMMA! | |
opr_register_or_constant | |
; | |
i_prefetch | |
: | |
i=KI_PREFETCH | |
t=i_prefetch_type | |
o=i_prefetch_opr | |
-> $i ^(TREE_TYPE $t) $o | |
; | |
i_prefetch_type | |
: | |
( | |
( | |
( K_GLOBAL | K_LOCAL )? | |
( K_L1 | K_L2 ) | |
) | |
) | |
; | |
i_prefetch_opr | |
: | |
T_OB opr T_CB | |
; | |
i_prefetchu | |
: | |
i=KI_PREFETCHU | |
t=i_prefetchu_type | |
o=i_prefetchu_opr | |
-> $i ^(TREE_TYPE $t) $o | |
; | |
i_prefetchu_type | |
: | |
K_L1 | |
; | |
i_prefetchu_opr | |
: | |
T_OB opr T_CB | |
; | |
i_prmt | |
: | |
i=KI_PRMT | |
t=i_prmt_type | |
o=i_prmt_opr | |
-> $i ^(TREE_TYPE $t) $o | |
; | |
i_prmt_type | |
: | |
K_B32 | |
( K_F4E | K_B4E | K_RC8 | K_ECL | K_ECR | K_RC16 )? | |
; | |
i_prmt_opr | |
: | |
opr_register | |
T_COMMA! | |
opr_register | |
T_COMMA! | |
opr_register | |
T_COMMA! | |
opr_register | |
; | |
i_rcp | |
: | |
i=KI_RCP | |
t=i_rcp_type | |
o=i_rcp_opr | |
-> $i ^(TREE_TYPE $t) $o | |
; | |
i_rcp_type | |
: | |
( | |
( | |
K_APPROX K_FTZ? K_F32 K_FTZ? | |
) | | |
( | |
( K_RN | K_RZ | K_RM | K_RP ) | |
K_FTZ? | |
K_F32 | |
) | | |
( | |
( K_RN | K_RZ | K_RM | K_RP ) | |
K_F64 | |
) | | |
( | |
K_APPROX K_FTZ K_F64 | |
) | |
) | |
; | |
i_rcp_opr | |
: | |
opr2 | |
; | |
i_red | |
: | |
i=KI_RED | |
t=i_red_type | |
o=i_red_opr | |
-> $i ^(TREE_TYPE $t) $o | |
; | |
i_red_type | |
: | |
( K_GLOBAL | K_SHARED )? | |
( K_AND | K_OR | K_XOR | K_ADD | K_INC | K_DEC | K_MIN | K_MAX ) | |
( K_B32 | K_B64 | K_U32 | K_U64 | K_S32 | K_F32 ) | |
; | |
i_red_opr | |
: | |
T_OB! opr T_CB! T_COMMA! opr | |
; | |
i_rem | |
: | |
i=KI_REM | |
t=i_rem_type | |
o=i_rem_opr | |
-> $i ^(TREE_TYPE $t) $o | |
; | |
i_rem_type | |
: | |
( K_U16 | K_U32 | K_U64 | K_S16 | K_S32 | K_S64 ) | |
; | |
i_rem_opr | |
: | |
opr_register | |
T_COMMA! | |
opr_register_or_constant2 | |
; | |
i_ret | |
: | |
i=KI_RET | |
t=i_ret_type | |
-> $i ^(TREE_TYPE $t) | |
; | |
i_ret_type | |
: K_UNI | |
| -> TREE_EMPTY | |
; | |
i_rsqrt | |
: | |
i=KI_RSQRT | |
t=i_rsqrt_type | |
o=i_rsqrt_opr | |
-> $i ^(TREE_TYPE $t) $o | |
; | |
i_rsqrt_type | |
: | |
( | |
( | |
K_APPROX K_FTZ? K_F32 | |
) | | |
( | |
K_APPROX K_F64 | |
) | |
) | |
; | |
i_rsqrt_opr | |
: | |
opr2 | |
; | |
i_sad | |
: | |
i=KI_SAD | |
t=i_sad_type | |
o=i_sad_opr | |
-> $i ^(TREE_TYPE $t) $o | |
; | |
i_sad_type | |
: | |
( K_U16 | K_U32 | K_U64 | K_S16 | K_S32 | K_S64 ) | |
; | |
i_sad_opr | |
: | |
opr_register | |
T_COMMA! | |
opr_register_or_constant3 | |
; | |
i_selp | |
: | |
i=KI_SELP | |
t=i_selp_type | |
o=i_selp_opr | |
-> $i ^(TREE_TYPE $t) $o | |
; | |
i_selp_type | |
: | |
( K_B16 | K_B32 | K_B64 | K_U16 | K_U32 | K_U64 | K_S16 | K_S32 | K_S64 | K_F32 | K_F64 ) | |
; | |
i_selp_opr | |
: | |
opr4 | |
; | |
i_set | |
: i_set1 | |
| i_set2 | |
; | |
i_set1 | |
: | |
i=KI_SET | |
t=i_set1_type | |
o=i_set1_opr | |
-> $i ^(TREE_TYPE $t) $o | |
; | |
i_set1_type | |
: | |
( | |
( | |
( K_EQ | K_NE | K_LT | K_LE | K_GT | K_GE | K_LO | K_LS | K_HI | K_HS | |
| K_EQU | K_NEU | K_LTU | K_LEU | K_GTU | K_GEU | K_NUM | K_NAN ) | |
K_FTZ? | |
( K_U32 | K_S32 | K_F32 ) | |
( K_B16 | K_B32 | K_B64 | K_U16 | K_U32 | K_U64 | K_S16 | K_S32 | K_S64 | K_F32 | K_F64 ) | |
) | |
) | |
; | |
i_set1_opr | |
: | |
opr3 | |
; | |
i_set2 | |
: | |
i=KI_SET | |
t=i_set2_type | |
o=i_set2_opr | |
-> $i ^(TREE_TYPE $t) $o | |
; | |
i_set2_type | |
: | |
( | |
( | |
( K_EQ | K_NE | K_LT | K_LE | K_GT | K_GE | K_LO | K_LS | K_HI | K_HS | |
| K_EQU | K_NEU | K_LTU | K_LEU | K_GTU | K_GEU | K_NUM | K_NAN ) | |
( K_AND | K_OR | K_XOR ) | |
K_FTZ? | |
( K_U32 | K_S32 | K_F32 ) | |
( K_B16 | K_B32 | K_B64 | K_U16 | K_U32 | K_U64 | K_S16 | K_S32 | K_S64 | K_F32 | K_F64 ) | |
) | |
) | |
; | |
i_set2_opr | |
: | |
opr T_COMMA opr T_COMMA opr T_COMMA T_NOT? opr | |
; | |
i_setp | |
: i_setp1 | |
| i_setp2 | |
; | |
i_setp1 | |
: | |
i=KI_SETP | |
t=i_setp1_type | |
o=i_setp1_opr | |
-> $i ^(TREE_TYPE $t) $o | |
; | |
i_setp1_type | |
: | |
( | |
( | |
( K_EQ | K_NE | K_LT | K_LE | K_GT | K_GE | K_LO | K_LS | K_HI | K_HS | |
| K_EQU | K_NEU | K_LTU | K_LEU | K_GTU | K_GEU | K_NUM | K_NAN ) | |
K_FTZ? | |
( K_B16 | K_B32 | K_B64 | K_U16 | K_U32 | K_U64 | K_S16 | K_S32 | K_S64 | K_F32 | K_F64 ) | |
) | |
) | |
; | |
i_setp1_opr | |
: | |
opr3 | |
; | |
i_setp2 | |
: | |
i=KI_SETP | |
t=i_setp2_type | |
o=i_setp2_opr | |
-> $i ^(TREE_TYPE $t) $o | |
; | |
i_setp2_type | |
: | |
( | |
( | |
( K_EQ | K_NE | K_LT | K_LE | K_GT | K_GE | K_LO | K_LS | K_HI | K_HS | |
| K_EQU | K_NEU | K_LTU | K_LEU | K_GTU | K_GEU | K_NUM | K_NAN ) | |
( K_AND | K_OR | K_XOR ) | |
K_FTZ? | |
( K_B16 | K_B32 | K_B64 | K_U16 | K_U32 | K_U64 | K_S16 | K_S32 | K_S64 | K_F32 | K_F64 ) | |
) | |
) | |
; | |
i_setp2_opr | |
: | |
opr T_COMMA! opr T_COMMA! opr T_COMMA! T_NOT? opr | |
; | |
i_shl | |
: | |
i=KI_SHL | |
t=i_shl_type | |
o=i_shl_opr | |
-> $i ^(TREE_TYPE $t) $o | |
; | |
i_shl_type | |
: | |
( | |
K_B16 | K_B32 | K_B64 | |
) | |
; | |
i_shl_opr | |
: | |
opr3 | |
; | |
i_shr | |
: | |
i=KI_SHR | |
t=i_shr_type | |
o=i_shr_opr | |
-> $i ^(TREE_TYPE $t) $o | |
; | |
i_shr_type | |
: | |
( | |
K_B16 | K_B32 | K_B64 | | |
K_U16 | K_U32 | K_U64 | | |
K_S16 | K_S32 | K_S64 | |
) | |
; | |
i_shr_opr | |
: | |
opr3 | |
; | |
i_sin | |
: | |
i=KI_SIN | |
t=i_sin_type | |
o=i_sin_opr | |
-> $i ^(TREE_TYPE $t) $o | |
; | |
i_sin_type | |
: | |
K_APPROX K_FTZ? K_F32 | |
; | |
i_sin_opr | |
: | |
opr2 | |
; | |
i_slct | |
: | |
i=KI_SLCT | |
t=i_slct_type | |
o=i_slct_opr | |
-> $i ^(TREE_TYPE $t) $o | |
; | |
i_slct_type | |
: | |
( | |
( | |
( K_B16 | K_B32 | K_B64 | K_U16 | K_U32 | K_U64 | K_S16 | K_S32 | K_S64 | K_F32 | K_F64 ) | |
K_S32 | |
) | | |
( | |
K_FTZ? | |
( K_B16 | K_B32 | K_B64 | K_U16 | K_U32 | K_U64 | K_S16 | K_S32 | K_S64 | K_F32 | K_F64 ) | |
K_F32 | |
) | |
) | |
; | |
i_slct_opr | |
: | |
opr4 | |
; | |
i_sqrt | |
: | |
i=KI_SQRT | |
t=i_sqrt_type | |
o=i_sqrt_opr | |
-> $i ^(TREE_TYPE $t) $o | |
; | |
i_sqrt_type | |
: | |
( | |
( | |
K_APPROX K_FTZ? K_F32 | |
) | | |
( | |
( K_RN | K_RZ | K_RM | K_RP ) | |
K_FTZ? | |
K_F32 | |
) | | |
( | |
( K_RN | K_RZ | K_RM | K_RP ) | |
K_F64 | |
) | |
) | |
; | |
i_sqrt_opr | |
: | |
opr2 | |
; | |
i_st | |
: | |
i=KI_ST | |
t=i_st_type | |
o=i_st_opr | |
-> $i ^(TREE_TYPE $t) $o | |
; | |
i_st_type | |
: | |
( | |
( | |
( K_GLOBAL | K_LOCAL | K_SHARED | K_PARAM )? | |
( K_WB | K_CG | K_CS | K_WT )? | |
( K_V2 | K_V4 )? | |
( K_B8 | K_B16 | K_B32 | K_B64 | K_U8 | K_U16 | K_U32 | K_U64 | K_S8 | K_S16 | K_S32 | K_S64 | K_F32 | K_F64 ) | |
) | | |
( | |
K_VOLATILE | |
( K_CONST | K_GLOBAL | K_LOCAL | K_PARAM | K_SHARED )? | |
( K_B8 | K_B16 | K_B32 | K_B64 | K_U8 | K_U16 | K_U32 | K_U64 | K_S8 | K_S16 | K_S32 | K_S64 | K_F32 | K_F64 ) | |
) | | |
( | |
K_VOLATILE | |
( K_CONST | K_GLOBAL | K_LOCAL | K_PARAM | K_SHARED )? | |
( K_V2 | K_V4 ) | |
( K_B8 | K_B16 | K_B32 | K_B64 | K_U8 | K_U16 | K_U32 | K_U64 | K_S8 | K_S16 | K_S32 | K_S64 | K_F32 | K_F64 ) | |
) | |
) | |
; | |
i_st_opr | |
: | |
T_OB! opr T_CB! T_COMMA! opr | |
; | |
i_sub | |
: | |
i=KI_SUB | |
t=i_sub_type | |
o=i_sub_opr | |
-> $i ^(TREE_TYPE $t) $o | |
; | |
i_sub_type | |
: | |
( | |
( | |
( ( K_SAT K_S32 ) | ( K_U16 | K_U32 | K_U64 | K_S16 | K_S32 | K_S64) ) | | |
( K_CC ( K_S32 | K_U32 ) ) | |
) | | |
( | |
( K_RN | K_RZ | K_RM | K_RP )? K_FTZ? K_SAT? K_F32 | |
) | | |
( ( K_RN | K_RZ | K_RM | K_RP )? K_F64 ) | |
) | |
; | |
i_sub_opr | |
: | |
opr_register | |
T_COMMA! | |
opr_register_or_constant2 | |
; | |
i_subc | |
: | |
i=KI_SUBC | |
t=i_subc_type | |
o=i_subc_opr | |
-> $i ^(TREE_TYPE $t) $o | |
; | |
i_subc_type | |
: | |
( | |
( ( K_SAT K_S32 ) | ( K_U16 | K_U32 | K_U64 | K_S16 | K_S32 | K_S64) ) | | |
( K_CC ( K_S32 | K_U32 ) ) | |
) | |
; | |
i_subc_opr | |
: | |
opr_register | |
T_COMMA! | |
opr_register_or_constant2 | |
; | |
i_suld | |
: | |
i=KI_SULD | |
t=i_suld_type | |
o=i_suld_opr | |
-> $i ^(TREE_TYPE $t) $o | |
; | |
i_suld_type | |
: | |
( | |
( | |
K_B | |
( K_1D | K_2D | K_3D ) | |
( K_CA | K_CG | K_CS | K_CV )? | |
( K_V2 | K_V4 )? | |
( K_B8 | K_B16 | K_B32 | K_B64 ) | |
( K_TRAP | K_CLAMP | K_ZERO ) | |
) | | |
( | |
K_P | |
( K_1D | K_2D | K_3D ) | |
( K_CA | K_CG | K_CS | K_CV )? | |
( K_V2 | K_V4 )? | |
( K_B32 | K_U32 | K_S32 | K_F32 ) | |
( K_TRAP | K_CLAMP | K_ZERO ) | |
) | |
) | |
; | |
i_suld_opr | |
: | |
opr T_COMMA! T_OB! opr T_COMMA! opr T_CB! | |
; | |
i_sured | |
: | |
i=KI_SURED | |
t=i_sured_type | |
o=i_sured_opr | |
-> $i ^(TREE_TYPE $t) $o | |
; | |
i_sured_type | |
: | |
( | |
( | |
K_B | |
( K_1D | K_2D | K_3D ) | |
( K_CA | K_CG | K_CS | K_CV )? | |
( K_V2 | K_V4 )? | |
( K_B8 | K_B16 | K_B32 | K_B64 ) | |
( K_TRAP | K_CLAMP | K_ZERO ) | |
) | | |
( | |
K_P | |
( K_1D | K_2D | K_3D ) | |
( K_CA | K_CG | K_CS | K_CV )? | |
( K_V2 | K_V4 )? | |
( K_B32 | K_U32 | K_S32 | K_F32 ) | |
( K_TRAP | K_CLAMP | K_ZERO ) | |
) | |
) | |
; | |
i_sured_opr | |
: | |
T_OB! opr T_COMMA! opr T_CB! T_COMMA! opr | |
; | |
i_sust | |
: | |
i=KI_SUST | |
t=i_sust_type | |
o=i_sust_opr | |
-> $i ^(TREE_TYPE $t) $o | |
; | |
i_sust_type | |
: | |
( | |
( | |
K_B | |
( K_1D | K_2D | K_3D ) | |
( K_CA | K_CG | K_CS | K_CV )? | |
( K_V2 | K_V4 )? | |
( K_B8 | K_B16 | K_B32 | K_B64 ) | |
( K_TRAP | K_CLAMP | K_ZERO ) | |
) | | |
( | |
K_P | |
( K_1D | K_2D | K_3D ) | |
( K_CA | K_CG | K_CS | K_CV )? | |
( K_V2 | K_V4 )? | |
( K_B32 | K_U32 | K_S32 | K_F32 ) | |
( K_TRAP | K_CLAMP | K_ZERO ) | |
) | |
) | |
; | |
i_sust_opr | |
: | |
T_OB! opr T_COMMA! opr T_CB! T_COMMA! opr | |
; | |
i_suq | |
: | |
i=KI_SUQ | |
t=i_suq_type | |
o=i_suq_opr | |
-> $i ^(TREE_TYPE $t) $o | |
; | |
i_suq_type | |
: | |
( K_WIDTH | K_HEIGHT | K_DEPTH ) | |
K_B32 | |
; | |
i_suq_opr | |
: | |
opr T_COMMA! T_OB! opr T_CB! | |
; | |
i_testp | |
: | |
i=KI_TESTP | |
t=i_testp_type | |
o=i_testp_opr | |
-> $i ^(TREE_TYPE $t) $o | |
; | |
i_testp_type | |
: | |
( K_FINITE | K_INFINITE | K_NUMBER | K_NOTANUMBER | K_NORMAL | K_SUBNORMAL ) | |
( K_F32 | K_F64 ) | |
; | |
i_testp_opr | |
: | |
opr_register | |
T_COMMA! | |
opr_register | |
; | |
i_tex | |
: | |
i=KI_TEX | |
t=i_tex_type | |
o=i_tex_opr | |
-> $i ^(TREE_TYPE $t) $o | |
; | |
i_tex_type | |
: | |
( | |
( | |
( K_1D | K_2D | K_3D ) | |
K_V4 | |
( K_U32 | K_S32 | K_F32 ) | |
( K_S32 | K_F32 ) | |
) | |
) | |
; | |
i_tex_opr | |
: | |
opr T_COMMA! T_OB! opr T_COMMA! opr ( T_COMMA! opr )? T_CB! | |
; | |
i_txq | |
: | |
i=KI_TXQ | |
t=i_txq_type | |
o=i_txq_opr | |
-> $i ^(TREE_TYPE $t) $o | |
; | |
i_txq_type | |
: | |
( | |
( | |
( K_WIDTH | K_HEIGHT | K_DEPTH | K_CHANNEL_DATA_TYPE | K_CHANNEL_ORDER | K_NORMALIZED_COORDS ) | |
) | | |
( | |
( K_FILTER_MODE | K_ADDR_MODE_0 | K_ADDR_MODE_1 | K_ADDR_MODE_2 ) | |
) | |
) | |
K_B32 | |
; | |
i_txq_opr | |
: | |
opr T_COMMA! T_OB! opr T_CB! | |
; | |
i_trap | |
: | |
i=KI_TRAP | |
-> $i | |
; | |
i_vabsdiff | |
: | |
i=KI_VABSDIFF | |
-> $i | |
; | |
i_vadd | |
: | |
i=KI_VADD | |
-> $i | |
; | |
i_vmad | |
: | |
i=KI_VMAD | |
-> $i | |
; | |
i_vmax | |
: | |
i=KI_VMAX | |
-> $i | |
; | |
i_vmin | |
: | |
i=KI_VMIN | |
-> $i | |
; | |
i_vset | |
: | |
i=KI_VSET | |
-> $i | |
; | |
i_vshl | |
: | |
i=KI_VSHL | |
-> $i | |
; | |
i_vshr | |
: | |
i=KI_VSHR | |
-> $i | |
; | |
i_vsub | |
: | |
i=KI_VSUB | |
-> $i | |
; | |
i_vote | |
: | |
i=KI_VOTE | |
t=i_vote_type | |
o=i_vote_opr | |
-> $i ^(TREE_TYPE $t) $o | |
; | |
i_vote_type | |
: | |
( | |
( | |
( K_ALL | K_ANY | K_UNI ) | |
K_PRED | |
) | | |
( | |
K_BALLOT | |
K_B32 | |
) | |
) | |
; | |
i_vote_opr | |
: | |
opr T_COMMA! T_NOT!? opr | |
; | |
i_xor | |
: | |
i=KI_XOR | |
t=i_xor_type | |
o=i_xor_opr | |
-> $i ^(TREE_TYPE $t) $o | |
; | |
i_xor_type | |
: | |
( | |
K_PRED | K_B16 | K_B32 | K_B64 | |
) | |
; | |
i_xor_opr | |
: | |
opr3 | |
; | |
//////////////////////////////////////////////////////////////////////////////////////////////////// | |
// | |
// Restricted operands. | |
// | |
//////////////////////////////////////////////////////////////////////////////////////////////////// | |
opr_register | |
: a=id_or_opcode | |
-> | |
^( TREE_OPR $a ) | |
; | |
opr_register_or_constant | |
: a=id_or_opcode -> ^( TREE_OPR $a ) | |
| b=constant_expression -> ^( TREE_OPR $b ) | |
; | |
opr_register_or_constant2 | |
: opr_register_or_constant T_COMMA! opr_register_or_constant | |
; | |
opr_register_or_constant3 | |
: opr_register_or_constant T_COMMA! opr_register_or_constant T_COMMA! opr_register_or_constant | |
; | |
opr_register_or_constant4 | |
: opr_register_or_constant T_COMMA! opr_register_or_constant T_COMMA! opr_register_or_constant T_COMMA! opr_register_or_constant | |
; | |
opr_register_or_constant5 | |
: opr_register_or_constant T_COMMA! opr_register_or_constant T_COMMA! opr_register_or_constant T_COMMA! opr_register_or_constant T_COMMA! opr_register_or_constant | |
; | |
opr_label | |
: a=T_WORD | |
-> | |
^( TREE_OPR $a ) | |
; | |
//////////////////////////////////////////////////////////////////////////////////////////////////// | |
// | |
// General operands, including aggregate data. | |
// | |
//////////////////////////////////////////////////////////////////////////////////////////////////// | |
opr | |
: | |
a=opr_aux | |
-> | |
^( TREE_OPR $a ) | |
; | |
// This probably needs a lot of work... | |
opr_aux | |
: ( | |
( | |
( id_or_opcode ( K_X | K_Y | K_Z | K_W | K_A | K_R | K_G | K_B )? | |
| constant_expression ) | |
( T_PLUS constant_expression )? | |
( T_LT opr T_GT )? | |
) | | |
( // aggregate | |
T_OC! | |
(id_or_opcode | T_UNDERSCORE) | |
( T_COMMA! (id_or_opcode | T_UNDERSCORE))* | |
T_CC! | |
) | | |
T_UNDERSCORE | |
) | |
; | |
opr2 | |
: opr T_COMMA! opr | |
; | |
opr3 | |
: opr T_COMMA! opr T_COMMA! opr | |
; | |
opr4 | |
: opr T_COMMA! opr T_COMMA! opr T_COMMA! opr | |
; | |
opr5 | |
: opr T_COMMA! opr T_COMMA! opr T_COMMA! opr T_COMMA! opr | |
; | |
//////////////////////////////////////////////////////////////////////////////////////////////////// | |
// | |
// Constant literal expressions. | |
// | |
//////////////////////////////////////////////////////////////////////////////////////////////////// | |
constant_expression | |
: | |
e=constant_expression_aux | |
-> | |
^( TREE_CONSTANT_EXPR $e ) | |
; | |
constant_expression_aux | |
: | |
conditional_expression | |
; | |
conditional_expression | |
: conditional_or_expression | |
( T_QUESTION^ constant_expression_aux T_COLON conditional_expression | |
)? | |
; | |
conditional_or_expression | |
: conditional_and_expression | |
( T_OROR^ conditional_and_expression | |
)* | |
; | |
conditional_and_expression | |
: inclusive_or_expression | |
( T_ANDAND^ inclusive_or_expression | |
)* | |
; | |
inclusive_or_expression | |
: exclusive_or_expression | |
( T_OR^ exclusive_or_expression | |
)* | |
; | |
exclusive_or_expression | |
: and_expression | |
( T_XOR^ and_expression | |
)* | |
; | |
and_expression | |
: equality_expression | |
( T_AND^ equality_expression | |
)* | |
; | |
equality_expression | |
: relational_expression | |
( | |
( T_EQEQ^ | |
| T_NOTEQ^ | |
) | |
relational_expression | |
)* | |
; | |
relational_expression | |
: shift_expression | |
(relational_op^ shift_expression | |
)* | |
; | |
relational_op | |
: T_LE | |
| T_GE | |
| T_LT | |
| T_GT | |
; | |
shift_expression | |
: additive_expression | |
(shift_op^ additive_expression | |
)* | |
; | |
shift_op | |
: T_LTLT | |
| T_GTGT | |
; | |
additive_expression | |
: multiplicative_expression | |
( | |
( T_PLUS^ | |
| T_MINUS^ | |
) | |
multiplicative_expression | |
)* | |
; | |
multiplicative_expression | |
: | |
unary_expression | |
( | |
( T_STAR^ | |
| T_SLASH^ | |
| T_PERCENT^ | |
) | |
unary_expression | |
)* | |
; | |
unary_expression | |
: T_PLUS^ unary_expression | |
| T_MINUS^ unary_expression | |
| unary_expression_not_plus_minus | |
; | |
unary_expression_not_plus_minus | |
: T_TILDE^ unary_expression | |
| T_NOT^ unary_expression | |
| cast_expression | |
| primary | |
; | |
cast_expression | |
: | |
e=cast_expression_aux | |
-> | |
^( TREE_CAST $e ) | |
; | |
cast_expression_aux | |
: | |
T_OP (K_S64 | K_U64) T_CP unary_expression | |
; | |
primary | |
: par_expression | |
| integer | |
| float_ | |
; | |
par_expression | |
: T_OP! constant_expression_aux T_CP! | |
; | |
integer | |
: base_10_integer | |
| base_8_integer | |
| base_16_integer | |
; | |
float_ | |
: T_FLT_LITERAL | |
; | |
base_10_integer | |
: T_DEC_LITERAL | |
; | |
base_8_integer | |
: T_OCT_LITERAL | |
; | |
base_16_integer | |
: T_HEX_LITERAL | |
; | |
KI_ABS: ('abs' WS) => 'abs'; | |
KI_ADD: ('add' WS) => 'add'; | |
KI_ADDC: ('addc' WS) => 'addc'; | |
KI_AND: ('and' WS) => 'and'; | |
KI_ATOM: ('atom' WS) => 'atom'; | |
KI_BAR: ('bar' WS) => 'bar'; | |
KI_BFE: ('bfe' WS) => 'bfe'; | |
KI_BFI: ('bfi' WS) => 'bfi'; | |
KI_BFIND: ('bfind' WS) => 'bfind'; | |
KI_BRA: ('bra' WS) => 'bra'; | |
KI_BREV: ('brev' WS) => 'brev'; | |
KI_BRKPT: ('brkpt' WS) => 'brkpt'; | |
KI_CALL: ('call' WS) => 'call'; | |
KI_CLZ: ('clz' WS) => 'clz'; | |
KI_CNOT: ('cnot' WS) => 'cnot'; | |
KI_COPYSIGN: ('copysign' WS) => 'copysign'; | |
KI_COS: ('cos' WS) => 'cos'; | |
KI_CVT: ('cvt' WS) => 'cvt'; | |
KI_CVTA: ('cvta' WS) => 'cvta'; | |
KI_DIV: ('div' WS) => 'div'; | |
KI_EX2: ('ex2' WS) => 'ex2'; | |
KI_EXIT: ('exit' WS) => 'exit'; | |
KI_FMA: ('fma' WS) => 'fma'; | |
KI_ISSPACEP: ('isspacep' WS) => 'isspacep'; | |
KI_LD: ('ld' WS) => 'ld'; | |
KI_LDU: ('ldu' WS) => 'ldu'; | |
KI_LG2: ('lg2' WS) => 'lg2'; | |
KI_MAD24: ('mad24' WS) => 'mad24'; | |
KI_MAD: ('mad' WS) => 'mad'; | |
KI_MAX: ('max' WS) => 'max'; | |
KI_MEMBAR: ('membar' WS) => 'membar'; | |
KI_MIN: ('min' WS) => 'min'; | |
KI_MOV: ('mov' WS) => 'mov'; | |
KI_MUL24: ('mul24' WS) => 'mul24'; | |
KI_MUL: ('mul' WS) => 'mul'; | |
KI_NEG: ('neg' WS) => 'neg'; | |
KI_NOT: ('not' WS) => 'not'; | |
KI_OR: ('or' WS) => 'or'; | |
KI_PMEVENT: ('pmevent' WS) => 'pmevent'; | |
KI_POPC: ('popc' WS) => 'popc'; | |
KI_PREFETCH: ('prefetch' WS) => 'prefetch'; | |
KI_PREFETCHU: ('prefetchu' WS) => 'prefetchu'; | |
KI_PRMT: ('prmt' WS) => 'prmt'; | |
KI_RCP: ('rcp' WS) => 'rcp'; | |
KI_RED: ('red' WS) => 'red'; | |
KI_REM: ('rem' WS) => 'rem'; | |
KI_RET: ('ret' WS) => 'ret'; | |
KI_RSQRT: ('rsqrt' WS) => 'rsqrt'; | |
KI_SAD: ('sad' WS) => 'sad'; | |
KI_SELP: ('selp' WS) => 'selp'; | |
KI_SETP: ('setp' WS) => 'setp'; | |
// Note order after SETP | |
KI_SET: ('set' WS) => 'set'; | |
KI_SHL: ('shl' WS) => 'shl'; | |
KI_SHR: ('shr' WS) => 'shr'; | |
KI_SIN: ('sin' WS) => 'sin'; | |
KI_SLCT: ('slct' WS) => 'slct'; | |
KI_SQRT: ('sqrt' WS) => 'sqrt'; | |
KI_ST: ('st' WS) => 'st'; | |
KI_SUB: ('sub' WS) => 'sub'; | |
KI_SUBC: ('subc' WS) => 'subc'; | |
KI_SULD: ('suld' WS) => 'suld'; | |
KI_SUQ: ('suq' WS) => 'suq'; | |
KI_SURED: ('sured' WS) => 'sured'; | |
KI_SUST: ('sust' WS) => 'sust'; | |
KI_TESTP: ('testp' WS) => 'testp'; | |
KI_TEX: ('tex' WS) => 'tex'; | |
KI_TRAP: ('trap' WS) => 'trap'; | |
KI_TXQ: ('txq' WS) => 'txq'; | |
KI_VABSDIFF: ('vabsdiff' WS) => 'vabsdiff'; | |
KI_VADD: ('vadd' WS) => 'vadd'; | |
KI_VMAD: ('vmad' WS) => 'vmad'; | |
KI_VMAX: ('vmax' WS) => 'vmax'; | |
KI_VMIN: ('vmin' WS) => 'vmin'; | |
KI_VOTE: ('vote' WS) => 'vote'; | |
KI_VSET: ('vset' WS) => 'vset'; | |
KI_VSHL: ('vshl' WS) => 'vshl'; | |
KI_VSHR: ('vshr' WS) => 'vshr'; | |
KI_VSUB: ('vsub' WS) => 'vsub'; | |
KI_XOR: ('xor' WS) => 'xor'; | |
T_QUESTION: '?'; | |
T_OROR: '||'; | |
T_ANDAND: '&&'; | |
T_OR: '|'; | |
T_XOR: '^'; | |
T_AND: '&'; | |
T_EQEQ: '=='; | |
T_LE: '<='; | |
T_GE: '>='; | |
T_LTLT: '<<'; | |
T_GTGT: '>>'; | |
T_STAR: '*'; | |
T_TILDE: '~'; | |
T_FLT_LITERAL: ( '0' ('f' | 'F' | 'd' | 'D') ('0' .. '9' | 'a' .. 'f' | 'A' .. 'F' )+ | '.' ('0' .. '9')+ | ('0' .. '9')+ '.' | ('0' .. '9')+ '.' ('0' .. '9')+ ); | |
T_HEX_LITERAL: '0' ('x' | 'X') ('0' .. '9' | 'a' .. 'f' | 'A' .. 'F' )+ 'U'?; | |
T_OCT_LITERAL: '0' ('0' .. '7' )+ 'U'?; | |
T_DEC_LITERAL: ('0' .. '9') ( '0' .. '9')* 'U'?; | |
K_3D: '.3d'; | |
K_2D: '.2d'; | |
K_1D: '.1d'; | |
U_DEBUG_ABBREV: '.debug_abbrev'; | |
U_DEBUG_INFO: '.debug_info'; | |
U_DEBUG_LINE: '.debug_line'; | |
U_DEBUG_LOC: '.debug_loc'; | |
U_DEBUG_PUBNAMES: '.debug_pubnames'; | |
U_DEBUG_RANGES: '.debug_ranges'; | |
U_BYTE: '.byte'; | |
U_4BYTE: '.4byte'; | |
T_EQ: '='; | |
T_SEMICOLON: ';'; | |
T_PLUS: '+'; | |
T_OP: '('; | |
T_OC: '{'; | |
T_OB: '['; | |
T_NOTEQ: '!='; | |
T_NOT: '!'; | |
T_MINUS: '-'; | |
T_GT: '>'; | |
T_LT: '<'; | |
T_ELLIPSIS: '...'; | |
T_CP: ')'; | |
T_COMMA:','; | |
T_COLON: ':'; | |
T_CC: '}'; | |
T_CB: ']'; | |
LINE_COMMENT: '//' (options {greedy=false;} : .)* ('\n' | '\r') {$channel=HIDDEN;}; | |
K_ZERO: '.zero'; | |
K_XOR: '.xor'; | |
K_WT: '.wt'; | |
K_WIDTH: '.width'; | |
K_WIDE: '.wide'; | |
K_WB: '.wb'; | |
K_VOLATILE: '.volatile'; | |
K_VISIBLE: '.visible'; | |
K_VERSION: '.version'; | |
K_VB: '.vb'; | |
K_V4: '.v4'; | |
K_V2: '.v2'; | |
K_UNI: '.uni'; | |
K_U8: '.u8'; | |
K_U64: '.u64'; | |
K_U32: '.u32'; | |
K_U16: '.u16'; | |
K_TRAP: '.trap'; | |
K_TO: '.to'; | |
K_TEXREF: '.texref'; | |
K_TEX: '.tex'; | |
K_TARGET: '.target'; | |
K_SYS: '.sys'; | |
K_SYNC: '.sync'; | |
K_SURFREF: '.surfref'; | |
K_SUBNORMAL: '.subnormal'; | |
K_SREG: '.sreg'; | |
K_SHIFTAMT: '.shiftamt'; | |
K_SHARED: '.shared'; | |
K_SECTION: '.section'; | |
K_SAT: '.sat'; | |
K_SAMPLERREF: '.samplerref'; | |
K_S8: '.s8'; | |
K_S64: '.s64'; | |
K_S32: '.s32'; | |
K_S16: '.s16'; | |
K_RZI: '.rzi'; | |
K_RZ: '.rz'; | |
K_RPI: '.rpi'; | |
K_RP: '.rp'; | |
K_RNI: '.rni'; | |
K_RN: '.rn'; | |
K_RMI: '.rmi'; | |
K_RM: '.rm'; | |
K_REQNTID: '.reqntid'; | |
K_REG: '.reg'; | |
K_RED: '.red'; | |
K_RCP: '.rcp'; | |
K_RC8: '.rc8'; | |
K_RC16: '.rc16'; | |
K_PRED: '.pred'; | |
K_PRAGMA: '.pragma'; | |
K_POPC: '.popc'; | |
K_PARAM: '.param'; | |
K_P: '.p'; | |
K_OR: '.or'; | |
K_OC: '.oc'; | |
K_NUMBER: '.number'; | |
K_NUM: '.num'; | |
K_NS: '.ns'; | |
K_NOUNROLL: '"nounroll"'; | |
T_STRING: '"' ( ~('"') )* '"'; | |
K_NOTANUMBER: '.notanumber'; | |
K_NORMALIZED_COORDS: '.normalized_coords'; | |
K_NORMAL: '.normal'; | |
K_NEU: '.neu'; | |
K_NE: '.ne'; | |
K_NAN: '.nan'; | |
K_MINNCTAPERSM: '.minnctapersm'; | |
K_MIN: '.min'; | |
K_MAXNTID: '.maxntid'; | |
K_MAXNREG: '.maxnreg'; | |
K_MAXNCTAPERSM: '.maxnctapersm'; | |
K_MAX: '.max'; | |
K_LU: '.lu'; | |
K_LTU: '.ltu'; | |
K_LT: '.lt'; | |
K_LS: '.ls'; | |
K_LOCAL: '.local'; | |
K_LOC: '.loc'; | |
K_LO: '.lo'; | |
K_LEU: '.leu'; | |
K_LE: '.le'; | |
K_L2: '.L2'; | |
K_L1: '.L1'; | |
K_INFINITE: '.infinite'; | |
K_INC: '.inc'; | |
K_HS: '.hs'; | |
K_HI: '.hi'; | |
K_HEIGHT: '.height'; | |
K_GTU: '.gtu'; | |
K_GT: '.gt'; | |
K_GLOBAL: '.global'; | |
K_GL: '.gl'; | |
K_GEU: '.geu'; | |
K_GE: '.ge'; | |
K_FUNC: '.func'; | |
K_FULL: '.full'; | |
K_FTZ: '.ftz'; | |
K_FINITE: '.finite'; | |
K_FILTER_MODE: '.filter_mode'; | |
K_FILE: '.file'; | |
K_F64: '.f64'; | |
K_F4E: '.f4e'; | |
K_F32: '.f32'; | |
K_F16: '.f16'; | |
K_EXTERN: '.extern'; | |
K_EXCH: '.exch'; | |
K_EQU: '.equ'; | |
K_EQ: '.eq'; | |
K_ENTRY: '.entry'; | |
K_ECR: '.ecr'; | |
K_ECL: '.ecl'; | |
K_DWARF: '@@DWARF' ( options {greedy=false;} : . )* ('\n' | '\r'); | |
K_DEPTH: '.depth'; | |
K_DEC: '.dec'; | |
K_CV: '.cv'; | |
K_CTA: '.cta'; | |
K_CS: '.cs'; | |
K_CONST: '.const'; | |
K_CLAMP: '.clamp'; | |
K_CHANNEL_ORDER: '.channel_order'; | |
K_CHANNEL_DATA_TYPE: '.channel_data_type'; | |
K_CHANNEL_DATA: '.channel_data'; | |
K_CG: '.cg'; | |
K_CC: '.cc'; | |
K_CAS: '.cas'; | |
K_CALLTARGETS: '.calltargets'; | |
K_CALLPROTOTYPE: '.callprototype'; | |
K_CA: '.ca'; | |
K_BRANCHTARGETS: '.branchtargets'; | |
K_BALLOT: '.ballot'; | |
K_B8: '.b8'; | |
K_B64: '.b64'; | |
K_B4E: '.b4e'; | |
K_B32: '.b32'; | |
K_B16: '.b16'; | |
K_ARRIVE: '.arrive'; | |
K_APPROX: '.approx'; | |
K_ANY: '.any'; | |
K_AND: '.and'; | |
K_ALL: '.all'; | |
K_ALIGN: '.align'; | |
K_ADDR_MODE_2: '.addr_mode_2'; | |
K_ADDR_MODE_1: '.addr_mode_1'; | |
K_ADDR_MODE_0: '.addr_mode_0'; | |
K_ADDRESS_SIZE: '.address_size'; | |
K_ADD: '.add'; | |
K_X: '.x'; | |
K_Y: '.y'; | |
K_Z: '.z'; | |
K_W: '.w'; | |
K_A: '.a'; | |
K_R: '.r'; | |
K_G: '.g'; | |
K_B: '.b'; | |
COMMENT: '/*' ( options {greedy=false;} : . )* '*/' {$channel=HIDDEN;} ; | |
WS: (' '| '\t' | '\r' | '\n')+ { $channel = HIDDEN; }; | |
T_WORD: (('a'..'z' | 'A'..'Z' ) FollowSym*) | (('_' | '%' | '$' ) FollowSym+ ); | |
T_UNDERSCORE: ( '_' WS )=> '_'; | |
T_AT: '@'; | |
T_PERCENT: '%'; | |
T_SLASH: '/'; | |
T_DOT: '.'; | |
fragment | |
EscapeSequence | |
: '\\' ('b' | 't' | 'n' | 'f' | 'r' | '\"' | '\'' | '\\') | |
| OctalEscape | |
; | |
fragment | |
OctalEscape | |
: '\\' ('0'..'3') ('0'..'7') ('0'..'7') | |
| '\\' ('0'..'7') ('0'..'7') | |
| '\\' ('0'..'7') | |
; | |
fragment | |
FollowSym | |
: ( 'a'..'z' | 'A'..'Z' | '0'..'9' | '_' | '$' ) | |
; | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment