10#pragma optimize("gst", on)
11#pragma auto_inline(on)
13#pragma GCC optimize("O3,inline")
22#define PROFILING_ENABLED 0
107#define FOLLOWED_BY(x) x
109#define ANY_CHAR R"((?:.|\n))"
110#define WHITESPACE R"((?:[ \t]++))"
111#define NEWLINE R"([\n])"
112#define WS_OR_NL R"((?:)" WHITESPACE "|" NEWLINE R"()+)"
113#define SEPARATOR R"([\s,\=\+\-\*\/\:\~\[\]])"
116 "AAA|AAD|AAM|AAS|ADC|ADCX|ADD|ADDPD|ADDPS|ADDSD|ADDSS|ADDSUBPD|ADDSUBPS|" \
117 "ADOX|AESDEC|AESDECLAST|AESENC|AESENCLAST|AESIMC|AESKEYGENASSIST|AND|ANDN|" \
118 "ANDNPD|ANDNPS|ANDPD|ANDPS|ARPL|BEXTR|BLENDPD|BLENDPS|BLENDVPD|BLENDVPS|" \
119 "BLSI|BLSMSK|BLSR|BNDCL|BNDCN|BNDCU|BNDLDX|BNDMK|BNDMOV|BNDSTX|BOUND|BSF|" \
120 "BSR|BSWAP|BT|BTC|BTR|BTS|BZHI|CALL|CBW|CDQ|CDQE|CLAC|CLC|CLD|CLDEMOTE|" \
121 "CLFLUSH|CLFLUSHOPT|CLI|CLTS|CLWB|CMC|CMOVcc|CMP|CMPPD|CMPPS|CMPS|CMPSB|" \
122 "CMPSD|CMPSQ|CMPSS|CMPSW|CMPXCHG|CMPXCHG16B|CMPXCHG8B|COMISD|COMISS|CPUID|" \
123 "CQO|CRC32|CVTDQ2PD|CVTDQ2PS|CVTPD2DQ|CVTPD2PI|CVTPD2PS|CVTPI2PD|CVTPI2PS|" \
124 "CVTPS2DQ|CVTPS2PD|CVTPS2PI|CVTSD2SI|CVTSD2SS|CVTSI2SD|CVTSI2SS|CVTSS2SD|" \
125 "CVTSS2SI|CVTTPD2DQ|CVTTPD2PI|CVTTPS2DQ|CVTTPS2PI|CVTTSD2SI|CVTTSS2SI|CWD|" \
126 "CWDE|DAA|DAS|DEC|DIV|DIVPD|DIVPS|DIVSD|DIVSS|DPPD|DPPS|EMMS|ENTER|" \
127 "EXTRACTPS|F2XM1|FABS|FADD|FADDP|FBLD|FBSTP|FCHS|FCLEX|FCMOVcc|FCOM|FCOMI|" \
128 "FCOMIP|FCOMP|FCOMPP|FCOS|FDECSTP|FDIV|FDIVP|FDIVR|FDIVRP|FFREE|FIADD|" \
129 "FICOM|FICOMP|FIDIV|FIDIVR|FILD|FIMUL|FINCSTP|FINIT|FIST|FISTP|FISTTP|" \
130 "FISUB|FISUBR|FLD|FLD1|FLDCW|FLDENV|FLDL2E|FLDL2T|FLDLG2|FLDLN2|FLDPI|" \
131 "FLDZ|FMUL|FMULP|FNCLEX|FNINIT|FNOP|FNSAVE|FNSTCW|FNSTENV|FNSTSW|FPATAN|" \
132 "FPREM|FPREM1|FPTAN|FRNDINT|FRSTOR|FSAVE|FSCALE|FSIN|FSINCOS|FSQRT|FST|" \
133 "FSTCW|FSTENV|FSTP|FSTSW|FSUB|FSUBP|FSUBR|FSUBRP|FTST|FUCOM|FUCOMI|" \
134 "FUCOMIP|FUCOMP|FUCOMPP|FWAIT|FXAM|FXCH|FXRSTOR|FXSAVE|FXTRACT|FYL2X|" \
135 "FYL2XP1|GF2P8AFFINEINVQB|GF2P8AFFINEQB|GF2P8MULB|HADDPD|HADDPS|HLT|" \
136 "HSUBPD|HSUBPS|IDIV|IMUL|IN|INC|INS|INSB|INSD|INSERTPS|INSW|INT|INT1|INT3|" \
137 "INTO|INVD|INVLPG|INVPCID|IRET|IRETD|JMP|Jcc|KADDB|KADDD|KADDQ|KADDW|" \
138 "KANDB|KANDD|KANDNB|KANDND|KANDNQ|KANDNW|KANDQ|KANDW|KMOVB|KMOVD|KMOVQ|" \
139 "KMOVW|KNOTB|KNOTD|KNOTQ|KNOTW|KORB|KORD|KORQ|KORTESTB|KORTESTD|KORTESTQ|" \
140 "KORTESTW|KORW|KSHIFTLB|KSHIFTLD|KSHIFTLQ|KSHIFTLW|KSHIFTRB|KSHIFTRD|" \
141 "KSHIFTRQ|KSHIFTRW|KTESTB|KTESTD|KTESTQ|KTESTW|KUNPCKBW|KUNPCKDQ|KUNPCKWD|" \
142 "KXNORB|KXNORD|KXNORQ|KXNORW|KXORB|KXORD|KXORQ|KXORW|LAHF|LAR|LDDQU|" \
143 "LDMXCSR|LDS|LEA|LEAVE|LES|LFENCE|LFS|LGDT|LGS|LIDT|LLDT|LMSW|LOCK|LODS|" \
144 "LODSB|LODSD|LODSQ|LODSW|LOOP|LOOPcc|LSL|LSS|LTR|LZCNT|MASKMOVDQU|MASKMOVQ|" \
145 "MAXPD|MAXPS|MAXSD|MAXSS|MFENCE|MINPD|MINPS|MINSD|MINSS|MONITOR|MOV|MOVAPD|" \
146 "MOVAPS|MOVBE|MOVD|MOVDDUP|MOVDIR64B|MOVDIRI|MOVDQ2Q|MOVDQA|MOVDQU|MOVHLPS|" \
147 "MOVHPD|MOVHPS|MOVLHPS|MOVLPD|MOVLPS|MOVMSKPD|MOVMSKPS|MOVNTDQ|MOVNTDQA|" \
148 "MOVNTI|MOVNTPD|MOVNTPS|MOVNTQ|MOVQ|MOVQ2DQ|MOVS|MOVSB|MOVSD|MOVSHDUP|" \
149 "MOVSLDUP|MOVSQ|MOVSS|MOVSW|MOVSX|MOVSXD|MOVUPD|MOVUPS|MOVZX|MPSADBW|MUL|" \
150 "MULPD|MULPS|MULSD|MULSS|MULX|MWAIT|NEG|NOP|NOT|OR|ORPD|ORPS|OUT|OUTS|" \
151 "OUTSB|OUTSD|OUTSW|PABSB|PABSD|PABSQ|PABSW|PACKSSDW|PACKSSWB|PACKUSDW|" \
152 "PACKUSWB|PADDB|PADDD|PADDQ|PADDSB|PADDSW|PADDUSB|PADDUSW|PADDW|PALIGNR|" \
153 "PAND|PANDN|PAUSE|PAVGB|PAVGW|PBLENDVB|PBLENDW|PCLMULQDQ|PCMPEQB|PCMPEQD|" \
154 "PCMPEQQ|PCMPEQW|PCMPESTRI|PCMPESTRM|PCMPGTB|PCMPGTD|PCMPGTQ|PCMPGTW|" \
155 "PCMPISTRI|PCMPISTRM|PDEP|PEXT|PEXTRB|PEXTRD|PEXTRQ|PEXTRW|PHADDD|PHADDSW|" \
156 "PHADDW|PHMINPOSUW|PHSUBD|PHSUBSW|PHSUBW|PINSRB|PINSRD|PINSRQ|PINSRW|" \
157 "PMADDUBSW|PMADDWD|PMAXSB|PMAXSD|PMAXSQ|PMAXSW|PMAXUB|PMAXUD|PMAXUQ|PMAXUW|" \
158 "PMINSB|PMINSD|PMINSQ|PMINSW|PMINUB|PMINUD|PMINUQ|PMINUW|PMOVMSKB|PMOVSX|" \
159 "PMOVZX|PMULDQ|PMULHRSW|PMULHUW|PMULHW|PMULLD|PMULLQ|PMULLW|PMULUDQ|POP|" \
160 "POPA|POPAD|POPCNT|POPF|POPFD|POPFQ|POR|PREFETCHW|PREFETCHh|PSADBW|PSHUFB|" \
161 "PSHUFD|PSHUFHW|PSHUFLW|PSHUFW|PSIGNB|PSIGND|PSIGNW|PSLLD|PSLLDQ|PSLLQ|" \
162 "PSLLW|PSRAD|PSRAQ|PSRAW|PSRLD|PSRLDQ|PSRLQ|PSRLW|PSUBB|PSUBD|PSUBQ|PSUBSB|" \
163 "PSUBSW|PSUBUSB|PSUBUSW|PSUBW|PTEST|PTWRITE|PUNPCKHBW|PUNPCKHDQ|PUNPCKHQDQ|" \
164 "PUNPCKHWD|PUNPCKLBW|PUNPCKLDQ|PUNPCKLQDQ|PUNPCKLWD|PUSH|PUSHA|PUSHAD|" \
165 "PUSHF|PUSHFD|PUSHFQ|PXOR|RCL|RCPPS|RCPSS|RCR|RDFSBASE|RDGSBASE|RDMSR|" \
166 "RDPID|RDPKRU|RDPMC|RDRAND|RDSEED|RDTSC|RDTSCP|REP|REPE|REPNE|REPNZ|REPZ|" \
167 "RET|ROL|ROR|RORX|ROUNDPD|ROUNDPS|ROUNDSD|ROUNDSS|RSM|RSQRTPS|RSQRTSS|SAHF|" \
168 "SAL|SAR|SARX|SBB|SCAS|SCASB|SCASD|SCASW|SETcc|SFENCE|SGDT|SHA1MSG1|" \
169 "SHA1MSG2|SHA1NEXTE|SHA1RNDS4|SHA256MSG1|SHA256MSG2|SHA256RNDS2|SHL|SHLD|" \
170 "SHLX|SHR|SHRD|SHRX|SHUFPD|SHUFPS|SIDT|SLDT|SMSW|SQRTPD|SQRTPS|SQRTSD|" \
171 "SQRTSS|STAC|STC|STD|STI|STMXCSR|STOS|STOSB|STOSD|STOSQ|STOSW|STR|SUB|" \
172 "SUBPD|SUBPS|SUBSD|SUBSS|SWAPGS|SYSCALL|SYSENTER|SYSEXIT|SYSRET|TEST|" \
173 "TPAUSE|TZCNT|UCOMISD|UCOMISS|UD|UMONITOR|UMWAIT|UNPCKHPD|UNPCKHPS|" \
174 "UNPCKLPD|UNPCKLPS|VALIGND|VALIGNQ|VBLENDMPD|VBLENDMPS|VBROADCAST|" \
175 "VCOMPRESSPD|VCOMPRESSPS|VCVTPD2QQ|VCVTPD2UDQ|VCVTPD2UQQ|VCVTPH2PS|" \
176 "VCVTPS2PH|VCVTPS2QQ|VCVTPS2UDQ|VCVTPS2UQQ|VCVTQQ2PD|VCVTQQ2PS|VCVTSD2USI|" \
177 "VCVTSS2USI|VCVTTPD2QQ|VCVTTPD2UDQ|VCVTTPD2UQQ|VCVTTPS2QQ|VCVTTPS2UDQ|" \
178 "VCVTTPS2UQQ|VCVTTSD2USI|VCVTTSS2USI|VCVTUDQ2PD|VCVTUDQ2PS|VCVTUQQ2PD|" \
179 "VCVTUQQ2PS|VCVTUSI2SD|VCVTUSI2SS|VDBPSADBW|VERR|VERW|VEXPANDPD|VEXPANDPS|" \
180 "VEXTRACTF128|VEXTRACTF32x4|VEXTRACTF32x8|VEXTRACTF64x2|VEXTRACTF64x4|" \
181 "VEXTRACTI128|VEXTRACTI32x4|VEXTRACTI32x8|VEXTRACTI64x2|VEXTRACTI64x4|" \
182 "VFIXUPIMMPD|VFIXUPIMMPS|VFIXUPIMMSD|VFIXUPIMMSS|VFMADD132PD|VFMADD132PS|" \
183 "VFMADD132SD|VFMADD132SS|VFMADD213PD|VFMADD213PS|VFMADD213SD|VFMADD213SS|" \
184 "VFMADD231PD|VFMADD231PS|VFMADD231SD|VFMADD231SS|VFMADDSUB132PD|" \
185 "VFMADDSUB132PS|VFMADDSUB213PD|VFMADDSUB213PS|VFMADDSUB231PD|" \
186 "VFMADDSUB231PS|VFMSUB132PD|VFMSUB132PS|VFMSUB132SD|VFMSUB132SS|" \
187 "VFMSUB213PD|VFMSUB213PS|VFMSUB213SD|VFMSUB213SS|VFMSUB231PD|VFMSUB231PS|" \
188 "VFMSUB231SD|VFMSUB231SS|VFMSUBADD132PD|VFMSUBADD132PS|VFMSUBADD213PD|" \
189 "VFMSUBADD213PS|VFMSUBADD231PD|VFMSUBADD231PS|VFNMADD132PD|VFNMADD132PS|" \
190 "VFNMADD132SD|VFNMADD132SS|VFNMADD213PD|VFNMADD213PS|VFNMADD213SD|" \
191 "VFNMADD213SS|VFNMADD231PD|VFNMADD231PS|VFNMADD231SD|VFNMADD231SS|" \
192 "VFNMSUB132PD|VFNMSUB132PS|VFNMSUB132SD|VFNMSUB132SS|VFNMSUB213PD|" \
193 "VFNMSUB213PS|VFNMSUB213SD|VFNMSUB213SS|VFNMSUB231PD|VFNMSUB231PS|" \
194 "VFNMSUB231SD|VFNMSUB231SS|VFPCLASSPD|VFPCLASSPS|VFPCLASSSD|VFPCLASSSS|" \
195 "VGATHERDPD|VGATHERDPS|VGATHERQPD|VGATHERQPS|VGETEXPPD|VGETEXPPS|VGETEXPSD|" \
196 "VGETEXPSS|VGETMANTPD|VGETMANTPS|VGETMANTSD|VGETMANTSS|VINSERTF128|" \
197 "VINSERTF32x4|VINSERTF32x8|VINSERTF64x2|VINSERTF64x4|VINSERTI128|" \
198 "VINSERTI32x4|VINSERTI32x8|VINSERTI64x2|VINSERTI64x4|VMASKMOV|VMOVDQA32|" \
199 "VMOVDQA64|VMOVDQU16|VMOVDQU32|VMOVDQU64|VMOVDQU8|VPBLENDD|VPBLENDMB|" \
200 "VPBLENDMD|VPBLENDMQ|VPBLENDMW|VPBROADCAST|VPBROADCASTB|VPBROADCASTD|" \
201 "VPBROADCASTM|VPBROADCASTQ|VPBROADCASTW|VPCMPB|VPCMPD|VPCMPQ|VPCMPUB|" \
202 "VPCMPUD|VPCMPUQ|VPCMPUW|VPCMPW|VPCOMPRESSD|VPCOMPRESSQ|VPCONFLICTD|" \
203 "VPCONFLICTQ|VPERM2F128|VPERM2I128|VPERMB|VPERMD|VPERMI2B|VPERMI2D|" \
204 "VPERMI2PD|VPERMI2PS|VPERMI2Q|VPERMI2W|VPERMILPD|VPERMILPS|VPERMPD|VPERMPS|" \
205 "VPERMQ|VPERMT2B|VPERMT2D|VPERMT2PD|VPERMT2PS|VPERMT2Q|VPERMT2W|VPERMW|" \
206 "VPEXPANDD|VPEXPANDQ|VPGATHERDD|VPGATHERDQ|VPGATHERQD|VPGATHERQQ|VPLZCNTD|" \
207 "VPLZCNTQ|VPMADD52HUQ|VPMADD52LUQ|VPMASKMOV|VPMOVB2M|VPMOVD2M|VPMOVDB|" \
208 "VPMOVDW|VPMOVM2B|VPMOVM2D|VPMOVM2Q|VPMOVM2W|VPMOVQ2M|VPMOVQB|VPMOVQD|" \
209 "VPMOVQW|VPMOVSDB|VPMOVSDW|VPMOVSQB|VPMOVSQD|VPMOVSQW|VPMOVSWB|VPMOVUSDB|" \
210 "VPMOVUSDW|VPMOVUSQB|VPMOVUSQD|VPMOVUSQW|VPMOVUSWB|VPMOVW2M|VPMOVWB|" \
211 "VPMULTISHIFTQB|VPROLD|VPROLQ|VPROLVD|VPROLVQ|VPRORD|VPRORQ|VPRORVD|" \
212 "VPRORVQ|VPSCATTERDD|VPSCATTERDQ|VPSCATTERQD|VPSCATTERQQ|VPSLLVD|VPSLLVQ|" \
213 "VPSLLVW|VPSRAVD|VPSRAVQ|VPSRAVW|VPSRLVD|VPSRLVQ|VPSRLVW|VPTERNLOGD|" \
214 "VPTERNLOGQ|VPTESTMB|VPTESTMD|VPTESTMQ|VPTESTMW|VPTESTNMB|VPTESTNMD|" \
215 "VPTESTNMQ|VPTESTNMW|VRANGEPD|VRANGEPS|VRANGESD|VRANGESS|VRCP14PD|VRCP14PS|" \
216 "VRCP14SD|VRCP14SS|VREDUCEPD|VREDUCEPS|VREDUCESD|VREDUCESS|VRNDSCALEPD|" \
217 "VRNDSCALEPS|VRNDSCALESD|VRNDSCALESS|VRSQRT14PD|VRSQRT14PS|VRSQRT14SD|" \
218 "VRSQRT14SS|VSCALEFPD|VSCALEFPS|VSCALEFSD|VSCALEFSS|VSCATTERDPD|" \
219 "VSCATTERDPS|VSCATTERQPD|VSCATTERQPS|VSHUFF32x4|VSHUFF64x2|VSHUFI32x4|" \
220 "VSHUFI64x2|VTESTPD|VTESTPS|VZEROALL|VZEROUPPER|WAIT|WBINVD|WRFSBASE|" \
221 "WRGSBASE|WRMSR|WRPKRU|XABORT|XACQUIRE|XADD|XBEGIN|XCHG|XEND|XGETBV|XLAT|" \
222 "XLATB|XOR|XORPD|XORPS|XRELEASE|XRSTOR|XRSTORS|XSAVE|XSAVEC|XSAVEOPT|" \
223 "XSAVES|XSETBV|XTEST"
228 { TOKEN_TYPE::WhiteSpace, R
"(([ \t]+))" },
229 { TOKEN_TYPE::NewLine, R"((\n))" },
230 { TOKEN_TYPE::Comment, R"((;.*\n))" },
231 { TOKEN_TYPE::HexNumber, R"(([0-9][0-9a-f]*h))" FOLLOWED_BY(R"([\s\n\+\-\*\/,=!\]\(\)])") },
232 { TOKEN_TYPE::DecNumber, R"(([0-9]+))" FOLLOWED_BY(R"([\s\n\+\-\*\/,=!\]\(\)])") },
233 { TOKEN_TYPE::String, R"((\".*\"))" },
235 { TOKEN_TYPE::BraceOpen, R"((\())"},
236 { TOKEN_TYPE::BraceClose, R"((\)))"},
237 { TOKEN_TYPE::MemRefStart, R"((\[))"},
238 { TOKEN_TYPE::MemRefEnd, R"((\]))"},
239 { TOKEN_TYPE::Colon, R"((\:))"},
240 { TOKEN_TYPE::Operator, R"(([,\+\-\*\/\:]))"},
241 { TOKEN_TYPE::StringDef, R"((<.+>))" },
243 { TOKEN_TYPE::KW_include, R"((include))" FOLLOWED_BY(R"([\s])") },
244 { TOKEN_TYPE::KW_const, R"((\.const))" FOLLOWED_BY(R"([\s])") },
245 { TOKEN_TYPE::KW_code, R"((\.code))" FOLLOWED_BY(R"([\s])") },
246 { TOKEN_TYPE::KW_endprolog, R"((\.endprolog))" FOLLOWED_BY(R"([\s])") },
247 { TOKEN_TYPE::KW_ALIGN, R"((ALIGN))" FOLLOWED_BY(R"([\s])") },
248 { TOKEN_TYPE::KW_EXTERN, R"((EXTERN))" FOLLOWED_BY(R"([\s])") },
249 { TOKEN_TYPE::KW_EXTERN, R"((EXTRN))" FOLLOWED_BY(R"([\s])") },
250 { TOKEN_TYPE::KW_PUBLIC, R"((PUBLIC))" FOLLOWED_BY(R"([\s])") },
251 { TOKEN_TYPE::KW_ENDM, R"((ENDM))" FOLLOWED_BY(R"([\s\;])") },
252 { TOKEN_TYPE::KW_END, R"((END))" FOLLOWED_BY(R"([\s])") },
253 { TOKEN_TYPE::KW_if, R"((if))" FOLLOWED_BY(R"([\s])") },
254 { TOKEN_TYPE::KW_ifdef, R"((ifdef))" FOLLOWED_BY(R"([\s])")},
255 { TOKEN_TYPE::KW_ifndef, R"((ifndef))" FOLLOWED_BY(R"([\s])")},
256 { TOKEN_TYPE::KW_else, R"((else))" FOLLOWED_BY(R"([\s])")},
257 { TOKEN_TYPE::KW_endif, R"((endif))" FOLLOWED_BY(R"([\s])")},
259 { TOKEN_TYPE::KW_allocstack, R"((.allocstack))" FOLLOWED_BY(R"([\s])") },
260 { TOKEN_TYPE::KW_savereg, R"((.savereg))" FOLLOWED_BY(R"([\s])") },
261 { TOKEN_TYPE::KW_savexmm128, R"((.savexmm128))" FOLLOWED_BY(R"([\s])") },
263 { TOKEN_TYPE::KW_DB, R"((DB))" FOLLOWED_BY(R"([\s])") },
264 { TOKEN_TYPE::KW_DW, R"((DW))" FOLLOWED_BY(R"([\s])") },
265 { TOKEN_TYPE::KW_DD, R"((DD))" FOLLOWED_BY(R"([\s])") },
266 { TOKEN_TYPE::KW_DQ, R"((DQ))" FOLLOWED_BY(R"([\s])") },
267 { TOKEN_TYPE::KW_EQU, R"((EQU))" FOLLOWED_BY(R"([\s])") },
268 { TOKEN_TYPE::KW_TEXTEQU, R"((TEXTEQU))" FOLLOWED_BY(R"([\s])") },
269 { TOKEN_TYPE::KW_MACRO, R"((MACRO))" FOLLOWED_BY(R"([\s\;])") },
270 { TOKEN_TYPE::KW_PROC, R"((PROC))" FOLLOWED_BY(R"([\s\;])") },
271 { TOKEN_TYPE::KW_FRAME, R"((FRAME))" FOLLOWED_BY(R"([\s\;])") },
272 { TOKEN_TYPE::KW_ENDP, R"((ENDP))" FOLLOWED_BY(R"([\s\;])") },
273 { TOKEN_TYPE::KW_RECORD, R"((RECORD))" FOLLOWED_BY(R"([\s\;])") },
274 { TOKEN_TYPE::KW_MASK, R"((MASK))" FOLLOWED_BY(R"([\s\;])")},
275 { TOKEN_TYPE::KW_ERRDEF, R"((\.ERRDEF))" FOLLOWED_BY(R"([\s\;])")},
277 { TOKEN_TYPE::Filename, R"(([a-z_][a-z0-9_]*\.inc))" FOLLOWED_BY(R"([\s])") },
279 { TOKEN_TYPE::Reg8, R"((al|ah|bl|bh|cl|ch|dl|dh|sil|dil|bpl|spl|r8b|r9b|r10b|r11b|r12b|r13b|r14b|r15b))" FOLLOWED_BY(R"([\s\,])") },
280 { TOKEN_TYPE::Reg16, R"((ax|bx|cx|dx|si|di|bp|sp|r8w|r9w|r10w|r11w|r12w|r13w|r14w|r15w))" FOLLOWED_BY(R"([\s\,])") },
281 { TOKEN_TYPE::Reg32, R"((eax|ebx|ecx|edx|esi|edi|ebp|esp|r8d|r9d|r10d|r11d|r12d|r13d|r14d|r15d))" FOLLOWED_BY(R"([\s\,])") },
282 { TOKEN_TYPE::Reg64, R"((rax|rbx|rcx|rdx|rsi|rdi|rbp|rsp|r8|r9|r10|r11|r12|r13|r14|r15))" FOLLOWED_BY(R"([\s\,])") },
283 { TOKEN_TYPE::RegXmm, R"((xmm0|xmm1|xmm2|xmm3|xmm4|xmm5|xmm6|xmm7|xmm8|xmm9|xmm10|xmm11|xmm12|xmm13|xmm14|xmm15))" FOLLOWED_BY(R"([\s\,])") },
284 { TOKEN_TYPE::BYTE_PTR, R"((BYTE[\s]+PTR))" FOLLOWED_BY(R"([\s\[])") },
285 { TOKEN_TYPE::WORD_PTR, R"((WORD[\s]+PTR))" FOLLOWED_BY(R"([\s\[])") },
286 { TOKEN_TYPE::DWORD_PTR, R"((DWORD[\s]+PTR))" FOLLOWED_BY(R"([\s\[])") },
287 { TOKEN_TYPE::QWORD_PTR, R"((QWORD[\s]+PTR))" FOLLOWED_BY(R"([\s\[])") },
288 { TOKEN_TYPE::XMMWORD_PTR, R"((XMMWORD[\s]+PTR))" FOLLOWED_BY(R"([\s\[])") },
342 if (identifier.Name == tok.
str())
354 size_t sz =
a.size();
357 for (
unsigned int i = 0;
i < sz; ++
i)
371 {
"and",
"&"}, {
"or",
"|"}, {
"shl",
"<<"}, {
"shr",
">>"}, {
"not",
"~"},
372 {
"eq",
"=="}, {
"ne",
"!="}, {
"lt",
"<"}, {
"le",
"<="}, {
"gt",
">"}, {
"ge",
">="},
375 for (
const auto&
entry : operators)
387 if (tok.type() !=
type)
389 throw "Not white space after identifier!\n";
398 if (
type != TOKEN_TYPE::WhiteSpace)
400 throw "Not white space after identifier!\n";
409 if ((
type != TOKEN_TYPE::WhiteSpace) &&
410 (
type != TOKEN_TYPE::NewLine))
412 throw "Not white space after identifier!\n";
420 for (
string &
s :
list)
437 case TOKEN_TYPE::Comment:
441 case TOKEN_TYPE::DecNumber:
443 unsigned long long num = stoull(tok.
str(),
nullptr, 10);
448 case TOKEN_TYPE::HexNumber:
455 case TOKEN_TYPE::Identifier:
464 case TOKEN_TYPE::BYTE_PTR:
465 case TOKEN_TYPE::WORD_PTR:
466 case TOKEN_TYPE::DWORD_PTR:
467 case TOKEN_TYPE::QWORD_PTR:
468 case TOKEN_TYPE::XMMWORD_PTR:
471 case TOKEN_TYPE::Reg8:
472 case TOKEN_TYPE::Reg16:
473 case TOKEN_TYPE::Reg32:
474 case TOKEN_TYPE::Reg64:
475 case TOKEN_TYPE::RegXmm:
476 case TOKEN_TYPE::Instruction:
478 case TOKEN_TYPE::WhiteSpace:
479 case TOKEN_TYPE::NewLine:
480 case TOKEN_TYPE::Operator:
498 if ((tok.
type() == TOKEN_TYPE::NewLine) ||
499 (tok.
type() == TOKEN_TYPE::Comment))
516 case TOKEN_TYPE::NewLine:
517 case TOKEN_TYPE::Comment:
520 case TOKEN_TYPE::KW_MASK:
525 case TOKEN_TYPE::Instruction:
530 throw "Invalid expression";
537 case TOKEN_TYPE::Operator:
538 if (tok.
str() ==
",")
545 case TOKEN_TYPE::Identifier:
560 case TOKEN_TYPE::WhiteSpace:
561 case TOKEN_TYPE::BraceOpen:
562 case TOKEN_TYPE::BraceClose:
563 case TOKEN_TYPE::DecNumber:
564 case TOKEN_TYPE::HexNumber:
582 if ((tok.
type() == TOKEN_TYPE::DecNumber) ||
583 (tok.
type() == TOKEN_TYPE::HexNumber))
595 if (tok.
type() == TOKEN_TYPE::MemRefEnd)
605 throw "Failed to translate memory ref";
613 return ((tok.
type() == TOKEN_TYPE::DecNumber) ||
614 (tok.
type() == TOKEN_TYPE::HexNumber));
622 (tokens[
index].type() == TOKEN_TYPE::WhiteSpace))
635 if ((operatorIndex == tokens.
size()) ||
636 (tokens[operatorIndex].type() != TOKEN_TYPE::Operator) ||
637 ((tokens[operatorIndex].str() !=
"+") &&
638 (tokens[operatorIndex].str() !=
"-")))
644 if ((numberIndex == tokens.
size()) ||
650 while (
index <= numberIndex)
662 case TOKEN_TYPE::BYTE_PTR:
663 case TOKEN_TYPE::WORD_PTR:
664 case TOKEN_TYPE::DWORD_PTR:
665 case TOKEN_TYPE::QWORD_PTR:
666 case TOKEN_TYPE::XMMWORD_PTR:
670 if (tokens[
index].
type() == TOKEN_TYPE::WhiteSpace)
681 case TOKEN_TYPE::MemRefStart:
684 case TOKEN_TYPE::NewLine:
685 case TOKEN_TYPE::Comment:
688 case TOKEN_TYPE::Operator:
689 if (tok.
str() ==
",")
693 case TOKEN_TYPE::Identifier:
716 const char* inst_list[] = {
717 "jmp",
"call",
"ja",
"jae",
"jb",
"jbe",
"jc",
"jcxz",
"je",
"jecxz",
"jg",
"jge",
718 "jl",
"jle",
"jna",
"jnae",
"jnb",
"jnbe",
"jnc",
"jne",
"jng",
"jnge",
"jnl",
"jnle",
719 "jno",
"jnp",
"jns",
"jnz",
"jo",
"jp",
"jpe",
"jpo",
"jrcxz",
"js",
"jz",
"loop",
"loope",
720 "loopne",
"loopnz",
"loopz"
723 for (
const char* inst : inst_list)
749 if (tokens[
index].
type() == TOKEN_TYPE::WhiteSpace)
758 case TOKEN_TYPE::Comment:
759 case TOKEN_TYPE::NewLine:
763 case TOKEN_TYPE::WhiteSpace:
764 case TOKEN_TYPE::Operator:
782 case TOKEN_TYPE::DecNumber:
783 case TOKEN_TYPE::HexNumber:
784 case TOKEN_TYPE::String:
785 case TOKEN_TYPE::WhiteSpace:
789 throw "Failed to translate item";
801 if (tokens[
index].
type() == TOKEN_TYPE::WhiteSpace)
807 if ((tokens[
index].
type() == TOKEN_TYPE::Comment) ||
808 (tokens[
index].
type() == TOKEN_TYPE::NewLine))
814 if ((tokens[
index].
type() != TOKEN_TYPE::Operator) ||
817 throw "Unexpected end of list";
821 if (tokens[
index].
type() == TOKEN_TYPE::WhiteSpace)
827 throw "Failed to translate list";
836 string directive,
need, have =
"";
840 case TOKEN_TYPE::KW_DB:
844 case TOKEN_TYPE::KW_DW:
845 directive =
".short";
848 case TOKEN_TYPE::KW_DD:
852 case TOKEN_TYPE::KW_DQ:
876 else if (have !=
need)
891 if (tokens[
index].
type() == TOKEN_TYPE::WhiteSpace)
897 if ((tokens[
index].
type() == TOKEN_TYPE::Comment) ||
898 (tokens[
index].
type() == TOKEN_TYPE::NewLine))
904 if ((tokens[
index].
type() != TOKEN_TYPE::Operator) ||
907 throw "Unexpected end of list";
912 if (tokens[
index].
type() == TOKEN_TYPE::WhiteSpace)
918 throw "Failed to translate list";
935 unsigned int bits, bitpos = 0;
936 unsigned long long oldmask = 0,
mask = 0;
944 if (tokens[
index].
type() == TOKEN_TYPE::WhiteSpace)
951 throw "Unexpected token";
954 if (tokens[
index].
type() == TOKEN_TYPE::WhiteSpace)
960 if ((tok_bits.
type() != TOKEN_TYPE::DecNumber) &&
961 (tok_bits.
type() != TOKEN_TYPE::HexNumber))
963 throw "Unexpected token";
966 bits = stoi(tok_bits.
str(),
nullptr, 0);
968 printf(
"%s = %u\n", tok_member.
str().c_str(), bitpos);
970 oldmask = (1ULL << bitpos) - 1;
972 mask = (1ULL << bitpos) - 1 - oldmask;
973 printf(
"MASK_%s = 0x%llx\n", tok_member.
str().c_str(),
mask);
975 if (tokens[
index].
type() == TOKEN_TYPE::WhiteSpace)
980 if ((tokens[
index].
type() == TOKEN_TYPE::NewLine) ||
981 (tokens[
index].
type() == TOKEN_TYPE::Comment))
988 throw "unexpected token";
992 if (tokens[
index].
type() == TOKEN_TYPE::WhiteSpace)
997 if ((tokens[
index].
type() == TOKEN_TYPE::NewLine) ||
998 (tokens[
index].
type() == TOKEN_TYPE::Comment))
1003 if (tokens[
index].
type() == TOKEN_TYPE::WhiteSpace)
1019 if ((tok.
type() == TOKEN_TYPE::NewLine) ||
1020 (tok.
type() == TOKEN_TYPE::Comment))
1025 if (tok.
type() == TOKEN_TYPE::KW_FRAME)
1027 frameEndIndex =
index + 1;
1043 if (tok1.
type() == TOKEN_TYPE::Colon)
1045 if (tok.
str() ==
"@@")
1060 switch (tok2.
type())
1062 case TOKEN_TYPE::KW_MACRO:
1063 throw "Cannot have a nested macro!";
1065 case TOKEN_TYPE::KW_DB:
1066 case TOKEN_TYPE::KW_DW:
1067 case TOKEN_TYPE::KW_DD:
1068 case TOKEN_TYPE::KW_DQ:
1069 printf(
"%s:%s", tok.
str().c_str(), tok1.
str().c_str());
1073 case TOKEN_TYPE::KW_EQU:
1075 printf(
"#define %s ", tok.
str().c_str());
1079 case TOKEN_TYPE::KW_TEXTEQU:
1084 string textdef = tok4.
str();
1090 case TOKEN_TYPE::KW_PROC:
1095 size_t frameEndIndex;
1102 printf(
"\n.seh_proc %s\n", tok.
str().c_str());
1104 printf(
"\n.cfi_startproc\n");
1106 index = frameEndIndex;
1112 case TOKEN_TYPE::KW_ENDP:
1114 bool hasFrame =
false;
1133 case TOKEN_TYPE::KW_RECORD:
1155 case TOKEN_TYPE::WhiteSpace:
1156 case TOKEN_TYPE::NewLine:
1157 case TOKEN_TYPE::Comment:
1160 case TOKEN_TYPE::Identifier:
1163 case TOKEN_TYPE::KW_ALIGN:
1167 case TOKEN_TYPE::KW_allocstack:
1171 case TOKEN_TYPE::KW_code:
1181 printf(
".intel_syntax noprefix\n");
1188 case TOKEN_TYPE::KW_const:
1189 printf(
".section .rdata");
1193 case TOKEN_TYPE::KW_DB:
1194 case TOKEN_TYPE::KW_DW:
1195 case TOKEN_TYPE::KW_DD:
1196 case TOKEN_TYPE::KW_DQ:
1199 case TOKEN_TYPE::KW_END:
1201 return tokens.
size();
1203 case TOKEN_TYPE::KW_endprolog:
1204 printf(
".seh_endprologue");
1208 case TOKEN_TYPE::KW_EXTERN:
1217 case TOKEN_TYPE::KW_if:
1221 case TOKEN_TYPE::KW_ifdef:
1222 case TOKEN_TYPE::KW_ifndef:
1223 case TOKEN_TYPE::KW_else:
1224 case TOKEN_TYPE::KW_endif:
1228 case TOKEN_TYPE::KW_include:
1233 printf(
"#include \"%s.h\"", tok2.
str().c_str());
1238 case TOKEN_TYPE::KW_PUBLIC:
1242 case TOKEN_TYPE::KW_savereg:
1246 case TOKEN_TYPE::KW_savexmm128:
1250 case TOKEN_TYPE::Instruction:
1254 case TOKEN_TYPE::KW_ERRDEF:
1259 throw "failed to translate construct";
1263 if (tokens[
index].
type() == TOKEN_TYPE::WhiteSpace)
1270 if ((
end.type() != TOKEN_TYPE::Comment) &&
1271 (
end.type() != TOKEN_TYPE::NewLine))
1273 throw "unexpected tokens";
1293 case TOKEN_TYPE::NewLine:
1294 case TOKEN_TYPE::Comment:
1298 case TOKEN_TYPE::Identifier:
1304 case TOKEN_TYPE::WhiteSpace:
1305 case TOKEN_TYPE::Operator:
1319 case TOKEN_TYPE::KW_ENDM:
1328 throw "Failed to translate macro";
1342 if ((tokens[
index].
type() == TOKEN_TYPE::Identifier) &&
1343 (tokens[
index + 1].
type() == TOKEN_TYPE::WhiteSpace) &&
1344 (tokens[
index + 2].
type() == TOKEN_TYPE::KW_MACRO))
1363#if PROFILING_ENABLED
1391#if PROFILING_ENABLED
void add_mem_id(Token &tok)
size_t translate_list(TokenList &tokens, size_t index, const vector< string > ¯o_params)
size_t translate_data_def(TokenList &tokens, size_t index, const vector< string > ¯o_params)
size_t translate_construct(TokenList &tokens, size_t index, const vector< string > ¯o_params)
static void add_identifier(Token &tok, IDTYPE type)
size_t translate_item(TokenList &tokens, size_t index, const vector< string > ¯o_params)
vector< TOKEN_DEF > g_TokenList
void translate(TokenList &tokens)
size_t translate_token(TokenList &tokens, size_t index, const vector< string > ¯o_params)
Token get_ws_or_nl(Token &&tok)
static bool find_proc_frame(TokenList &tokens, size_t index, size_t &frameEndIndex)
static bool is_number_token(const Token &tok)
static size_t translate_rip_relative_offset(TokenList &tokens, size_t index, const vector< string > ¯o_params)
static bool is_jmp_or_call(const Token &tok)
bool is_mem_id(Token &tok)
vector< bool > g_proc_frame_stack
int fake_printf(const char *format,...)
size_t complete_line(TokenList &tokens, size_t index, const vector< string > ¯o_params)
unsigned int g_label_number
bool is_string_in_list(vector< string > list, string str)
static bool g_intel_syntax_emitted
size_t translate_expression(TokenList &tokens, size_t index, const vector< string > ¯o_params)
Token get_expected_token(Token &&tok, TOKEN_TYPE type)
vector< IDENTIFIER > g_identifiers
bool iequals(const string &a, const string &b)
Token get_ws(Token &&tok)
const char * get_expression_operator(const string &op)
size_t translate_identifier_construct(TokenList &tokens, size_t index, const vector< string > ¯o_params)
size_t translate_construct_one_param(string translated, TokenList &tokens, size_t index, const vector< string > ¯o_params)
size_t translate_record(TokenList &tokens, size_t index, const vector< string > ¯o_params)
size_t translate_macro(TokenList &tokens, size_t index)
size_t translate_instruction(TokenList &tokens, size_t index, const vector< string > ¯o_params)
size_t translate_mem_ref(TokenList &tokens, size_t index, const vector< string > ¯o_params)
size_t translate_instruction_param(TokenList &tokens, size_t index, const vector< string > ¯o_params)
_Self substr(size_type __pos=0, size_type __n=npos) const
const _CharT * c_str() const
int WINAPIV fprintf(FILE *file, const char *format,...)
GLuint GLuint GLsizei GLenum type
GLboolean GLboolean GLboolean b
GLenum GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * bits
GLboolean GLboolean GLboolean GLboolean a
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
static unsigned int number
static UINT PSTR DWORD UINT * need
static void skip_whitespace()
void push_back(const _Tp &__x=_STLP_DEFAULT_CONSTRUCTED(_Tp))