10#pragma optimize("gst", on)
11#pragma auto_inline(on)
13#pragma GCC optimize("O3,inline")
24#define _stricmp strcasecmp
27#define PROFILING_ENABLED 0
115#define FOLLOWED_BY(x) x
117#define ANY_CHAR R"((?:.|\n))"
118#define WHITESPACE R"((?:[ \t]++))"
119#define NEWLINE R"([\n])"
120#define WS_OR_NL R"((?:)" WHITESPACE "|" NEWLINE R"()+)"
121#define SEPARATOR R"([\s,\=\+\-\*\/\:\~\[\]])"
124 "REX|REXW|REXR|REXX|REXB|LOCK|REP|REPE|REPZ|REPNE|REPNZ"
127 "AAA|AAD|AAM|AAS|ADC|ADCX|ADD|ADDPD|ADDPS|ADDSD|ADDSS|ADDSUBPD|ADDSUBPS|" \
128 "ADOX|AESDEC|AESDECLAST|AESENC|AESENCLAST|AESIMC|AESKEYGENASSIST|AND|ANDN|" \
129 "ANDNPD|ANDNPS|ANDPD|ANDPS|ARPL|BEXTR|BLENDPD|BLENDPS|BLENDVPD|BLENDVPS|" \
130 "BLSI|BLSMSK|BLSR|BNDCL|BNDCN|BNDCU|BNDLDX|BNDMK|BNDMOV|BNDSTX|BOUND|BSF|" \
131 "BSR|BSWAP|BT|BTC|BTR|BTS|BZHI|CALL|CBW|CDQ|CDQE|CLAC|CLC|CLD|CLDEMOTE|" \
132 "CLFLUSH|CLFLUSHOPT|CLI|CLTS|CLWB|CMC|CMOVcc|CMP|CMPPD|CMPPS|CMPS|CMPSB|" \
133 "CMPSD|CMPSQ|CMPSS|CMPSW|CMPXCHG|CMPXCHG16B|CMPXCHG8B|COMISD|COMISS|CPUID|" \
134 "CQO|CRC32|CVTDQ2PD|CVTDQ2PS|CVTPD2DQ|CVTPD2PI|CVTPD2PS|CVTPI2PD|CVTPI2PS|" \
135 "CVTPS2DQ|CVTPS2PD|CVTPS2PI|CVTSD2SI|CVTSD2SS|CVTSI2SD|CVTSI2SS|CVTSS2SD|" \
136 "CVTSS2SI|CVTTPD2DQ|CVTTPD2PI|CVTTPS2DQ|CVTTPS2PI|CVTTSD2SI|CVTTSS2SI|CWD|" \
137 "CWDE|DAA|DAS|DEC|DIV|DIVPD|DIVPS|DIVSD|DIVSS|DPPD|DPPS|EMMS|ENTER|" \
138 "EXTRACTPS|F2XM1|FABS|FADD|FADDP|FBLD|FBSTP|FCHS|FCLEX|FCMOVcc|FCOM|FCOMI|" \
139 "FCOMIP|FCOMP|FCOMPP|FCOS|FDECSTP|FDIV|FDIVP|FDIVR|FDIVRP|FFREE|FIADD|" \
140 "FICOM|FICOMP|FIDIV|FIDIVR|FILD|FIMUL|FINCSTP|FINIT|FIST|FISTP|FISTTP|" \
141 "FISUB|FISUBR|FLD|FLD1|FLDCW|FLDENV|FLDL2E|FLDL2T|FLDLG2|FLDLN2|FLDPI|" \
142 "FLDZ|FMUL|FMULP|FNCLEX|FNINIT|FNOP|FNSAVE|FNSTCW|FNSTENV|FNSTSW|FPATAN|" \
143 "FPREM|FPREM1|FPTAN|FRNDINT|FRSTOR|FSAVE|FSCALE|FSIN|FSINCOS|FSQRT|FST|" \
144 "FSTCW|FSTENV|FSTP|FSTSW|FSUB|FSUBP|FSUBR|FSUBRP|FTST|FUCOM|FUCOMI|" \
145 "FUCOMIP|FUCOMP|FUCOMPP|FWAIT|FXAM|FXCH|FXRSTOR|FXSAVE|FXTRACT|FYL2X|" \
146 "FYL2XP1|GF2P8AFFINEINVQB|GF2P8AFFINEQB|GF2P8MULB|HADDPD|HADDPS|HLT|" \
147 "HSUBPD|HSUBPS|IDIV|IMUL|IN|INC|INS|INSB|INSD|INSERTPS|INSW|INT|INT1|INT3|" \
148 "INTO|INVD|INVLPG|INVPCID|IRET|IRETD|JMP|Jcc|KADDB|KADDD|KADDQ|KADDW|" \
149 "KANDB|KANDD|KANDNB|KANDND|KANDNQ|KANDNW|KANDQ|KANDW|KMOVB|KMOVD|KMOVQ|" \
150 "KMOVW|KNOTB|KNOTD|KNOTQ|KNOTW|KORB|KORD|KORQ|KORTESTB|KORTESTD|KORTESTQ|" \
151 "KORTESTW|KORW|KSHIFTLB|KSHIFTLD|KSHIFTLQ|KSHIFTLW|KSHIFTRB|KSHIFTRD|" \
152 "KSHIFTRQ|KSHIFTRW|KTESTB|KTESTD|KTESTQ|KTESTW|KUNPCKBW|KUNPCKDQ|KUNPCKWD|" \
153 "KXNORB|KXNORD|KXNORQ|KXNORW|KXORB|KXORD|KXORQ|KXORW|LAHF|LAR|LDDQU|" \
154 "LDMXCSR|LDS|LEA|LEAVE|LES|LFENCE|LFS|LGDT|LGS|LIDT|LLDT|LMSW|LODS|" \
155 "LODSB|LODSD|LODSQ|LODSW|LOOP|LOOPcc|LSL|LSS|LTR|LZCNT|MASKMOVDQU|MASKMOVQ|" \
156 "MAXPD|MAXPS|MAXSD|MAXSS|MFENCE|MINPD|MINPS|MINSD|MINSS|MONITOR|MOV|MOVAPD|" \
157 "MOVAPS|MOVBE|MOVD|MOVDDUP|MOVDIR64B|MOVDIRI|MOVDQ2Q|MOVDQA|MOVDQU|MOVHLPS|" \
158 "MOVHPD|MOVHPS|MOVLHPS|MOVLPD|MOVLPS|MOVMSKPD|MOVMSKPS|MOVNTDQ|MOVNTDQA|" \
159 "MOVNTI|MOVNTPD|MOVNTPS|MOVNTQ|MOVQ|MOVQ2DQ|MOVS|MOVSB|MOVSD|MOVSHDUP|" \
160 "MOVSLDUP|MOVSQ|MOVSS|MOVSW|MOVSX|MOVSXD|MOVUPD|MOVUPS|MOVZX|MPSADBW|MUL|" \
161 "MULPD|MULPS|MULSD|MULSS|MULX|MWAIT|NEG|NOP|NOT|OR|ORPD|ORPS|OUT|OUTS|" \
162 "OUTSB|OUTSD|OUTSW|PABSB|PABSD|PABSQ|PABSW|PACKSSDW|PACKSSWB|PACKUSDW|" \
163 "PACKUSWB|PADDB|PADDD|PADDQ|PADDSB|PADDSW|PADDUSB|PADDUSW|PADDW|PALIGNR|" \
164 "PAND|PANDN|PAUSE|PAVGB|PAVGW|PBLENDVB|PBLENDW|PCLMULQDQ|PCMPEQB|PCMPEQD|" \
165 "PCMPEQQ|PCMPEQW|PCMPESTRI|PCMPESTRM|PCMPGTB|PCMPGTD|PCMPGTQ|PCMPGTW|" \
166 "PCMPISTRI|PCMPISTRM|PDEP|PEXT|PEXTRB|PEXTRD|PEXTRQ|PEXTRW|PHADDD|PHADDSW|" \
167 "PHADDW|PHMINPOSUW|PHSUBD|PHSUBSW|PHSUBW|PINSRB|PINSRD|PINSRQ|PINSRW|" \
168 "PMADDUBSW|PMADDWD|PMAXSB|PMAXSD|PMAXSQ|PMAXSW|PMAXUB|PMAXUD|PMAXUQ|PMAXUW|" \
169 "PMINSB|PMINSD|PMINSQ|PMINSW|PMINUB|PMINUD|PMINUQ|PMINUW|PMOVMSKB|PMOVSX|" \
170 "PMOVZX|PMULDQ|PMULHRSW|PMULHUW|PMULHW|PMULLD|PMULLQ|PMULLW|PMULUDQ|POP|" \
171 "POPA|POPAD|POPCNT|POPF|POPFD|POPFQ|POR|PREFETCHW|PREFETCHh|PSADBW|PSHUFB|" \
172 "PSHUFD|PSHUFHW|PSHUFLW|PSHUFW|PSIGNB|PSIGND|PSIGNW|PSLLD|PSLLDQ|PSLLQ|" \
173 "PSLLW|PSRAD|PSRAQ|PSRAW|PSRLD|PSRLDQ|PSRLQ|PSRLW|PSUBB|PSUBD|PSUBQ|PSUBSB|" \
174 "PSUBSW|PSUBUSB|PSUBUSW|PSUBW|PTEST|PTWRITE|PUNPCKHBW|PUNPCKHDQ|PUNPCKHQDQ|" \
175 "PUNPCKHWD|PUNPCKLBW|PUNPCKLDQ|PUNPCKLQDQ|PUNPCKLWD|PUSH|PUSHA|PUSHAD|" \
176 "PUSHF|PUSHFD|PUSHFQ|PXOR|RCL|RCPPS|RCPSS|RCR|RDFSBASE|RDGSBASE|RDMSR|" \
177 "RDPID|RDPKRU|RDPMC|RDRAND|RDSEED|RDTSC|RDTSCP|" \
178 "RET|ROL|ROR|RORX|ROUNDPD|ROUNDPS|ROUNDSD|ROUNDSS|RSM|RSQRTPS|RSQRTSS|SAHF|" \
179 "SAL|SAR|SARX|SBB|SCAS|SCASB|SCASD|SCASW|SETcc|SFENCE|SGDT|SHA1MSG1|" \
180 "SHA1MSG2|SHA1NEXTE|SHA1RNDS4|SHA256MSG1|SHA256MSG2|SHA256RNDS2|SHL|SHLD|" \
181 "SHLX|SHR|SHRD|SHRX|SHUFPD|SHUFPS|SIDT|SLDT|SMSW|SQRTPD|SQRTPS|SQRTSD|" \
182 "SQRTSS|STAC|STC|STD|STI|STMXCSR|STOS|STOSB|STOSD|STOSQ|STOSW|STR|SUB|" \
183 "SUBPD|SUBPS|SUBSD|SUBSS|SWAPGS|SYSCALL|SYSENTER|SYSEXIT|SYSRET|TEST|" \
184 "TPAUSE|TZCNT|UCOMISD|UCOMISS|UD|UMONITOR|UMWAIT|UNPCKHPD|UNPCKHPS|" \
185 "UNPCKLPD|UNPCKLPS|VALIGND|VALIGNQ|VBLENDMPD|VBLENDMPS|VBROADCAST|" \
186 "VCOMPRESSPD|VCOMPRESSPS|VCVTPD2QQ|VCVTPD2UDQ|VCVTPD2UQQ|VCVTPH2PS|" \
187 "VCVTPS2PH|VCVTPS2QQ|VCVTPS2UDQ|VCVTPS2UQQ|VCVTQQ2PD|VCVTQQ2PS|VCVTSD2USI|" \
188 "VCVTSS2USI|VCVTTPD2QQ|VCVTTPD2UDQ|VCVTTPD2UQQ|VCVTTPS2QQ|VCVTTPS2UDQ|" \
189 "VCVTTPS2UQQ|VCVTTSD2USI|VCVTTSS2USI|VCVTUDQ2PD|VCVTUDQ2PS|VCVTUQQ2PD|" \
190 "VCVTUQQ2PS|VCVTUSI2SD|VCVTUSI2SS|VDBPSADBW|VERR|VERW|VEXPANDPD|VEXPANDPS|" \
191 "VEXTRACTF128|VEXTRACTF32x4|VEXTRACTF32x8|VEXTRACTF64x2|VEXTRACTF64x4|" \
192 "VEXTRACTI128|VEXTRACTI32x4|VEXTRACTI32x8|VEXTRACTI64x2|VEXTRACTI64x4|" \
193 "VFIXUPIMMPD|VFIXUPIMMPS|VFIXUPIMMSD|VFIXUPIMMSS|VFMADD132PD|VFMADD132PS|" \
194 "VFMADD132SD|VFMADD132SS|VFMADD213PD|VFMADD213PS|VFMADD213SD|VFMADD213SS|" \
195 "VFMADD231PD|VFMADD231PS|VFMADD231SD|VFMADD231SS|VFMADDSUB132PD|" \
196 "VFMADDSUB132PS|VFMADDSUB213PD|VFMADDSUB213PS|VFMADDSUB231PD|" \
197 "VFMADDSUB231PS|VFMSUB132PD|VFMSUB132PS|VFMSUB132SD|VFMSUB132SS|" \
198 "VFMSUB213PD|VFMSUB213PS|VFMSUB213SD|VFMSUB213SS|VFMSUB231PD|VFMSUB231PS|" \
199 "VFMSUB231SD|VFMSUB231SS|VFMSUBADD132PD|VFMSUBADD132PS|VFMSUBADD213PD|" \
200 "VFMSUBADD213PS|VFMSUBADD231PD|VFMSUBADD231PS|VFNMADD132PD|VFNMADD132PS|" \
201 "VFNMADD132SD|VFNMADD132SS|VFNMADD213PD|VFNMADD213PS|VFNMADD213SD|" \
202 "VFNMADD213SS|VFNMADD231PD|VFNMADD231PS|VFNMADD231SD|VFNMADD231SS|" \
203 "VFNMSUB132PD|VFNMSUB132PS|VFNMSUB132SD|VFNMSUB132SS|VFNMSUB213PD|" \
204 "VFNMSUB213PS|VFNMSUB213SD|VFNMSUB213SS|VFNMSUB231PD|VFNMSUB231PS|" \
205 "VFNMSUB231SD|VFNMSUB231SS|VFPCLASSPD|VFPCLASSPS|VFPCLASSSD|VFPCLASSSS|" \
206 "VGATHERDPD|VGATHERDPS|VGATHERQPD|VGATHERQPS|VGETEXPPD|VGETEXPPS|VGETEXPSD|" \
207 "VGETEXPSS|VGETMANTPD|VGETMANTPS|VGETMANTSD|VGETMANTSS|VINSERTF128|" \
208 "VINSERTF32x4|VINSERTF32x8|VINSERTF64x2|VINSERTF64x4|VINSERTI128|" \
209 "VINSERTI32x4|VINSERTI32x8|VINSERTI64x2|VINSERTI64x4|VMASKMOV|VMOVDQA32|" \
210 "VMOVDQA64|VMOVDQU16|VMOVDQU32|VMOVDQU64|VMOVDQU8|VPBLENDD|VPBLENDMB|" \
211 "VPBLENDMD|VPBLENDMQ|VPBLENDMW|VPBROADCAST|VPBROADCASTB|VPBROADCASTD|" \
212 "VPBROADCASTM|VPBROADCASTQ|VPBROADCASTW|VPCMPB|VPCMPD|VPCMPQ|VPCMPUB|" \
213 "VPCMPUD|VPCMPUQ|VPCMPUW|VPCMPW|VPCOMPRESSD|VPCOMPRESSQ|VPCONFLICTD|" \
214 "VPCONFLICTQ|VPERM2F128|VPERM2I128|VPERMB|VPERMD|VPERMI2B|VPERMI2D|" \
215 "VPERMI2PD|VPERMI2PS|VPERMI2Q|VPERMI2W|VPERMILPD|VPERMILPS|VPERMPD|VPERMPS|" \
216 "VPERMQ|VPERMT2B|VPERMT2D|VPERMT2PD|VPERMT2PS|VPERMT2Q|VPERMT2W|VPERMW|" \
217 "VPEXPANDD|VPEXPANDQ|VPGATHERDD|VPGATHERDQ|VPGATHERQD|VPGATHERQQ|VPLZCNTD|" \
218 "VPLZCNTQ|VPMADD52HUQ|VPMADD52LUQ|VPMASKMOV|VPMOVB2M|VPMOVD2M|VPMOVDB|" \
219 "VPMOVDW|VPMOVM2B|VPMOVM2D|VPMOVM2Q|VPMOVM2W|VPMOVQ2M|VPMOVQB|VPMOVQD|" \
220 "VPMOVQW|VPMOVSDB|VPMOVSDW|VPMOVSQB|VPMOVSQD|VPMOVSQW|VPMOVSWB|VPMOVUSDB|" \
221 "VPMOVUSDW|VPMOVUSQB|VPMOVUSQD|VPMOVUSQW|VPMOVUSWB|VPMOVW2M|VPMOVWB|" \
222 "VPMULTISHIFTQB|VPROLD|VPROLQ|VPROLVD|VPROLVQ|VPRORD|VPRORQ|VPRORVD|" \
223 "VPRORVQ|VPSCATTERDD|VPSCATTERDQ|VPSCATTERQD|VPSCATTERQQ|VPSLLVD|VPSLLVQ|" \
224 "VPSLLVW|VPSRAVD|VPSRAVQ|VPSRAVW|VPSRLVD|VPSRLVQ|VPSRLVW|VPTERNLOGD|" \
225 "VPTERNLOGQ|VPTESTMB|VPTESTMD|VPTESTMQ|VPTESTMW|VPTESTNMB|VPTESTNMD|" \
226 "VPTESTNMQ|VPTESTNMW|VRANGEPD|VRANGEPS|VRANGESD|VRANGESS|VRCP14PD|VRCP14PS|" \
227 "VRCP14SD|VRCP14SS|VREDUCEPD|VREDUCEPS|VREDUCESD|VREDUCESS|VRNDSCALEPD|" \
228 "VRNDSCALEPS|VRNDSCALESD|VRNDSCALESS|VRSQRT14PD|VRSQRT14PS|VRSQRT14SD|" \
229 "VRSQRT14SS|VSCALEFPD|VSCALEFPS|VSCALEFSD|VSCALEFSS|VSCATTERDPD|" \
230 "VSCATTERDPS|VSCATTERQPD|VSCATTERQPS|VSHUFF32x4|VSHUFF64x2|VSHUFI32x4|" \
231 "VSHUFI64x2|VTESTPD|VTESTPS|VZEROALL|VZEROUPPER|WAIT|WBINVD|WRFSBASE|" \
232 "WRGSBASE|WRMSR|WRPKRU|XABORT|XACQUIRE|XADD|XBEGIN|XCHG|XEND|XGETBV|XLAT|" \
233 "XLATB|XOR|XORPD|XORPS|XRELEASE|XRSTOR|XRSTORS|XSAVE|XSAVEC|XSAVEOPT|" \
234 "XSAVES|XSETBV|XTEST"
239 { TOKEN_TYPE::WhiteSpace, R
"(([ \t]+))" },
240 { TOKEN_TYPE::NewLine, R"((\n))" },
241 { TOKEN_TYPE::Comment, R"((;.*\n))" },
242 { TOKEN_TYPE::HexNumber, R"(([0-9][0-9a-f]*h))" FOLLOWED_BY(R"([\s\n\+\-\*\/,=!\]\(\)])") },
243 { TOKEN_TYPE::DecNumber, R"(([0-9]+))" FOLLOWED_BY(R"([\s\n\+\-\*\/,=!\]\(\)])") },
244 { TOKEN_TYPE::String, R"((\".*\"))" },
246 { TOKEN_TYPE::BraceOpen, R"((\())"},
247 { TOKEN_TYPE::BraceClose, R"((\)))"},
248 { TOKEN_TYPE::MemRefStart, R"((\[))"},
249 { TOKEN_TYPE::MemRefEnd, R"((\]))"},
250 { TOKEN_TYPE::Colon, R"((\:))"},
251 { TOKEN_TYPE::Operator, R"(([,\+\-\*\/\:]))"},
252 { TOKEN_TYPE::StringDef, R"((<.+>))" },
254 { TOKEN_TYPE::KW_include, R"((include))" FOLLOWED_BY(R"([\s])") },
255 { TOKEN_TYPE::KW_option, R"((option))" FOLLOWED_BY(R"([\s])") },
256 { TOKEN_TYPE::KW_model, R"((\.model))" FOLLOWED_BY(R"([\s])") },
257 { TOKEN_TYPE::KW_const, R"((\.const))" FOLLOWED_BY(R"([\s])") },
258 { TOKEN_TYPE::KW_code, R"((\.code))" FOLLOWED_BY(R"([\s])") },
259 { TOKEN_TYPE::KW_endprolog, R"((\.endprolog))" FOLLOWED_BY(R"([\s])") },
260 { TOKEN_TYPE::KW_ALIGN, R"((ALIGN))" FOLLOWED_BY(R"([\s])") },
261 { TOKEN_TYPE::KW_EXTERN, R"((EXTERN))" FOLLOWED_BY(R"([\s])") },
262 { TOKEN_TYPE::KW_EXTERN, R"((EXTRN))" FOLLOWED_BY(R"([\s])") },
263 { TOKEN_TYPE::KW_PUBLIC, R"((PUBLIC))" FOLLOWED_BY(R"([\s])") },
264 { TOKEN_TYPE::KW_ENDM, R"((ENDM))" FOLLOWED_BY(R"([\s\;])") },
265 { TOKEN_TYPE::KW_END, R"((END))" FOLLOWED_BY(R"([\s])") },
266 { TOKEN_TYPE::KW_if, R"((if))" FOLLOWED_BY(R"([\s])") },
267 { TOKEN_TYPE::KW_ifdef, R"((ifdef))" FOLLOWED_BY(R"([\s])")},
268 { TOKEN_TYPE::KW_ifndef, R"((ifndef))" FOLLOWED_BY(R"([\s])")},
269 { TOKEN_TYPE::KW_else, R"((else))" FOLLOWED_BY(R"([\s])")},
270 { TOKEN_TYPE::KW_endif, R"((endif))" FOLLOWED_BY(R"([\s])")},
272 { TOKEN_TYPE::KW_allocstack, R"((.allocstack))" FOLLOWED_BY(R"([\s])") },
273 { TOKEN_TYPE::KW_savereg, R"((.savereg))" FOLLOWED_BY(R"([\s])") },
274 { TOKEN_TYPE::KW_savexmm128, R"((.savexmm128))" FOLLOWED_BY(R"([\s])") },
276 { TOKEN_TYPE::KW_DB, R"((DB))" FOLLOWED_BY(R"([\s])") },
277 { TOKEN_TYPE::KW_DW, R"((DW))" FOLLOWED_BY(R"([\s])") },
278 { TOKEN_TYPE::KW_DD, R"((DD))" FOLLOWED_BY(R"([\s])") },
279 { TOKEN_TYPE::KW_DQ, R"((DQ))" FOLLOWED_BY(R"([\s])") },
280 { TOKEN_TYPE::KW_EQU, R"((EQU))" FOLLOWED_BY(R"([\s])") },
281 { TOKEN_TYPE::KW_TEXTEQU, R"((TEXTEQU))" FOLLOWED_BY(R"([\s])") },
282 { TOKEN_TYPE::KW_MACRO, R"((MACRO))" FOLLOWED_BY(R"([\s\;])") },
283 { TOKEN_TYPE::KW_PROC, R"((PROC))" FOLLOWED_BY(R"([\s\;])") },
284 { TOKEN_TYPE::KW_FRAME, R"((FRAME))" FOLLOWED_BY(R"([\s\;])") },
285 { TOKEN_TYPE::KW_ENDP, R"((ENDP))" FOLLOWED_BY(R"([\s\;])") },
286 { TOKEN_TYPE::KW_RECORD, R"((RECORD))" FOLLOWED_BY(R"([\s\;])") },
287 { TOKEN_TYPE::KW_MASK, R"((MASK))" FOLLOWED_BY(R"([\s\;])")},
288 { TOKEN_TYPE::KW_ERRDEF, R"((\.ERRDEF))" FOLLOWED_BY(R"([\s\;])")},
290 { TOKEN_TYPE::Filename, R"(([a-z_][a-z0-9_]*\.inc))" FOLLOWED_BY(R"([\s])") },
293 { 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\,])") },
294 { TOKEN_TYPE::Reg16, R"((ax|bx|cx|dx|si|di|bp|sp|r8w|r9w|r10w|r11w|r12w|r13w|r14w|r15w))" FOLLOWED_BY(R"([\s\,])") },
295 { TOKEN_TYPE::Reg32, R"((eax|ebx|ecx|edx|esi|edi|ebp|esp|r8d|r9d|r10d|r11d|r12d|r13d|r14d|r15d))" FOLLOWED_BY(R"([\s\,])") },
296 { TOKEN_TYPE::Reg64, R"((rax|rbx|rcx|rdx|rsi|rdi|rbp|rsp|r8|r9|r10|r11|r12|r13|r14|r15))" FOLLOWED_BY(R"([\s\,])") },
297 { TOKEN_TYPE::RegXmm, R"((xmm0|xmm1|xmm2|xmm3|xmm4|xmm5|xmm6|xmm7|xmm8|xmm9|xmm10|xmm11|xmm12|xmm13|xmm14|xmm15))" FOLLOWED_BY(R"([\s\,])") },
298 { TOKEN_TYPE::BYTE_PTR, R"((BYTE[\s]+PTR))" FOLLOWED_BY(R"([\s\[])") },
299 { TOKEN_TYPE::WORD_PTR, R"((WORD[\s]+PTR))" FOLLOWED_BY(R"([\s\[])") },
300 { TOKEN_TYPE::DWORD_PTR, R"((DWORD[\s]+PTR))" FOLLOWED_BY(R"([\s\[])") },
301 { TOKEN_TYPE::QWORD_PTR, R"((QWORD[\s]+PTR))" FOLLOWED_BY(R"([\s\[])") },
302 { TOKEN_TYPE::XMMWORD_PTR, R"((XMMWORD[\s]+PTR))" FOLLOWED_BY(R"([\s\[])") },
356 if (identifier.Name == tok.
str())
368 size_t sz =
a.size();
371 for (
unsigned int i = 0;
i < sz; ++
i)
385 {
"and",
"&"}, {
"or",
"|"}, {
"shl",
"<<"}, {
"shr",
">>"}, {
"not",
"~"},
386 {
"eq",
"=="}, {
"ne",
"!="}, {
"lt",
"<"}, {
"le",
"<="}, {
"gt",
">"}, {
"ge",
">="},
389 for (
const auto&
entry : operators)
401 if (tok.type() !=
type)
403 throw "Not white space after identifier!\n";
412 if (
type != TOKEN_TYPE::WhiteSpace)
414 throw "Not white space after identifier!\n";
423 if ((
type != TOKEN_TYPE::WhiteSpace) &&
424 (
type != TOKEN_TYPE::NewLine))
426 throw "Not white space after identifier!\n";
434 for (
string &
s :
list)
451 case TOKEN_TYPE::Comment:
455 case TOKEN_TYPE::DecNumber:
457 unsigned long long num = stoull(tok.
str(),
nullptr, 10);
462 case TOKEN_TYPE::HexNumber:
469 case TOKEN_TYPE::Identifier:
478 case TOKEN_TYPE::BYTE_PTR:
479 case TOKEN_TYPE::WORD_PTR:
480 case TOKEN_TYPE::DWORD_PTR:
481 case TOKEN_TYPE::QWORD_PTR:
482 case TOKEN_TYPE::XMMWORD_PTR:
485 case TOKEN_TYPE::Reg8:
486 case TOKEN_TYPE::Reg16:
487 case TOKEN_TYPE::Reg32:
488 case TOKEN_TYPE::Reg64:
489 case TOKEN_TYPE::RegXmm:
490 case TOKEN_TYPE::Instruction:
492 case TOKEN_TYPE::WhiteSpace:
493 case TOKEN_TYPE::NewLine:
494 case TOKEN_TYPE::Operator:
512 if ((tok.
type() == TOKEN_TYPE::NewLine) ||
513 (tok.
type() == TOKEN_TYPE::Comment))
530 case TOKEN_TYPE::NewLine:
531 case TOKEN_TYPE::Comment:
534 case TOKEN_TYPE::KW_MASK:
539 case TOKEN_TYPE::Instruction:
544 throw "Invalid expression";
551 case TOKEN_TYPE::Operator:
552 if (tok.
str() ==
",")
559 case TOKEN_TYPE::Identifier:
574 case TOKEN_TYPE::WhiteSpace:
575 case TOKEN_TYPE::BraceOpen:
576 case TOKEN_TYPE::BraceClose:
577 case TOKEN_TYPE::DecNumber:
578 case TOKEN_TYPE::HexNumber:
596 if ((tok.
type() == TOKEN_TYPE::DecNumber) ||
597 (tok.
type() == TOKEN_TYPE::HexNumber))
609 if (tok.
type() == TOKEN_TYPE::MemRefEnd)
619 throw "Failed to translate memory ref";
627 return ((tok.
type() == TOKEN_TYPE::DecNumber) ||
628 (tok.
type() == TOKEN_TYPE::HexNumber));
636 (tokens[
index].type() == TOKEN_TYPE::WhiteSpace))
649 if ((operatorIndex == tokens.
size()) ||
650 (tokens[operatorIndex].type() != TOKEN_TYPE::Operator) ||
651 ((tokens[operatorIndex].str() !=
"+") &&
652 (tokens[operatorIndex].str() !=
"-")))
658 if ((numberIndex == tokens.
size()) ||
664 while (
index <= numberIndex)
676 case TOKEN_TYPE::BYTE_PTR:
677 case TOKEN_TYPE::WORD_PTR:
678 case TOKEN_TYPE::DWORD_PTR:
679 case TOKEN_TYPE::QWORD_PTR:
680 case TOKEN_TYPE::XMMWORD_PTR:
684 if (tokens[
index].
type() == TOKEN_TYPE::WhiteSpace)
695 case TOKEN_TYPE::MemRefStart:
698 case TOKEN_TYPE::NewLine:
699 case TOKEN_TYPE::Comment:
702 case TOKEN_TYPE::Operator:
703 if (tok.
str() ==
",")
707 case TOKEN_TYPE::Identifier:
730 const char* inst_list[] = {
731 "jmp",
"call",
"ja",
"jae",
"jb",
"jbe",
"jc",
"jcxz",
"je",
"jecxz",
"jg",
"jge",
732 "jl",
"jle",
"jna",
"jnae",
"jnb",
"jnbe",
"jnc",
"jne",
"jng",
"jnge",
"jnl",
"jnle",
733 "jno",
"jnp",
"jns",
"jnz",
"jo",
"jp",
"jpe",
"jpo",
"jrcxz",
"js",
"jz",
"loop",
"loope",
734 "loopne",
"loopnz",
"loopz"
737 for (
const char* inst : inst_list)
763 if (tokens[
index].
type() == TOKEN_TYPE::WhiteSpace)
772 case TOKEN_TYPE::Comment:
773 case TOKEN_TYPE::NewLine:
777 case TOKEN_TYPE::WhiteSpace:
778 case TOKEN_TYPE::Operator:
796 case TOKEN_TYPE::DecNumber:
797 case TOKEN_TYPE::HexNumber:
798 case TOKEN_TYPE::String:
799 case TOKEN_TYPE::WhiteSpace:
803 throw "Failed to translate item";
815 if (tokens[
index].
type() == TOKEN_TYPE::WhiteSpace)
821 if ((tokens[
index].
type() == TOKEN_TYPE::Comment) ||
822 (tokens[
index].
type() == TOKEN_TYPE::NewLine))
828 if ((tokens[
index].
type() != TOKEN_TYPE::Operator) ||
831 throw "Unexpected end of list";
835 if (tokens[
index].
type() == TOKEN_TYPE::WhiteSpace)
841 throw "Failed to translate list";
850 string directive,
need, have =
"";
854 case TOKEN_TYPE::KW_DB:
858 case TOKEN_TYPE::KW_DW:
859 directive =
".short";
862 case TOKEN_TYPE::KW_DD:
866 case TOKEN_TYPE::KW_DQ:
890 else if (have !=
need)
902 if (tokens[
index].
type() == TOKEN_TYPE::Identifier)
914 if (tokens[
index].
type() == TOKEN_TYPE::WhiteSpace)
920 if ((tokens[
index].
type() == TOKEN_TYPE::Comment) ||
921 (tokens[
index].
type() == TOKEN_TYPE::NewLine))
927 if ((tokens[
index].
type() != TOKEN_TYPE::Operator) ||
930 throw "Unexpected end of list";
935 if (tokens[
index].
type() == TOKEN_TYPE::WhiteSpace)
941 if ((tokens[
index].
type() == TOKEN_TYPE::NewLine) ||
942 (tokens[
index].
type() == TOKEN_TYPE::Comment))
945 if (tokens[
index].
type() == TOKEN_TYPE::WhiteSpace)
953 throw "Failed to translate list";
970 unsigned int bits, bitpos = 0;
971 unsigned long long oldmask = 0,
mask = 0;
979 if (tokens[
index].
type() == TOKEN_TYPE::WhiteSpace)
986 throw "Unexpected token";
989 if (tokens[
index].
type() == TOKEN_TYPE::WhiteSpace)
995 if ((tok_bits.
type() != TOKEN_TYPE::DecNumber) &&
996 (tok_bits.
type() != TOKEN_TYPE::HexNumber))
998 throw "Unexpected token";
1001 bits = stoi(tok_bits.
str(),
nullptr, 0);
1003 printf(
"%s = %u\n", tok_member.
str().c_str(), bitpos);
1005 oldmask = (1ULL << bitpos) - 1;
1007 mask = (1ULL << bitpos) - 1 - oldmask;
1008 printf(
"MASK_%s = 0x%llx\n", tok_member.
str().c_str(),
mask);
1010 if (tokens[
index].
type() == TOKEN_TYPE::WhiteSpace)
1015 if ((tokens[
index].
type() == TOKEN_TYPE::NewLine) ||
1016 (tokens[
index].
type() == TOKEN_TYPE::Comment))
1023 throw "unexpected token";
1027 if (tokens[
index].
type() == TOKEN_TYPE::WhiteSpace)
1032 if ((tokens[
index].
type() == TOKEN_TYPE::NewLine) ||
1033 (tokens[
index].
type() == TOKEN_TYPE::Comment))
1038 if (tokens[
index].
type() == TOKEN_TYPE::WhiteSpace)
1054 if ((tok.
type() == TOKEN_TYPE::NewLine) ||
1055 (tok.
type() == TOKEN_TYPE::Comment))
1060 if (tok.
type() == TOKEN_TYPE::KW_FRAME)
1062 frameEndIndex =
index + 1;
1078 if (tok1.
type() == TOKEN_TYPE::Colon)
1080 if (tok.
str() ==
"@@")
1095 switch (tok2.
type())
1097 case TOKEN_TYPE::KW_MACRO:
1098 throw "Cannot have a nested macro!";
1100 case TOKEN_TYPE::KW_DB:
1101 case TOKEN_TYPE::KW_DW:
1102 case TOKEN_TYPE::KW_DD:
1103 case TOKEN_TYPE::KW_DQ:
1104 printf(
"%s:%s", tok.
str().c_str(), tok1.
str().c_str());
1108 case TOKEN_TYPE::KW_EQU:
1110 printf(
"#define %s ", tok.
str().c_str());
1114 case TOKEN_TYPE::KW_TEXTEQU:
1119 string textdef = tok4.
str();
1125 case TOKEN_TYPE::KW_PROC:
1130 size_t frameEndIndex;
1137 printf(
"\n.seh_proc %s\n", tok.
str().c_str());
1139 printf(
"\n.cfi_startproc\n");
1141 index = frameEndIndex;
1147 case TOKEN_TYPE::KW_ENDP:
1149 bool hasFrame =
false;
1168 case TOKEN_TYPE::KW_RECORD:
1190 case TOKEN_TYPE::WhiteSpace:
1191 case TOKEN_TYPE::NewLine:
1192 case TOKEN_TYPE::Comment:
1195 case TOKEN_TYPE::Identifier:
1198 case TOKEN_TYPE::KW_ALIGN:
1202 case TOKEN_TYPE::KW_allocstack:
1206 case TOKEN_TYPE::KW_code:
1216 printf(
".intel_syntax noprefix\n");
1223 case TOKEN_TYPE::KW_const:
1224 printf(
".section .rdata");
1228 case TOKEN_TYPE::KW_DB:
1229 case TOKEN_TYPE::KW_DW:
1230 case TOKEN_TYPE::KW_DD:
1231 case TOKEN_TYPE::KW_DQ:
1234 case TOKEN_TYPE::KW_END:
1236 return tokens.
size();
1238 case TOKEN_TYPE::KW_endprolog:
1239 printf(
".seh_endprologue");
1243 case TOKEN_TYPE::KW_EXTERN:
1252 case TOKEN_TYPE::KW_if:
1256 case TOKEN_TYPE::KW_ifdef:
1257 case TOKEN_TYPE::KW_ifndef:
1258 case TOKEN_TYPE::KW_else:
1259 case TOKEN_TYPE::KW_endif:
1263 case TOKEN_TYPE::KW_include:
1268 printf(
"#include \"%s.h\"", tok2.
str().c_str());
1273 case TOKEN_TYPE::KW_option:
1284 case TOKEN_TYPE::KW_model:
1293 throw "Invalid model";
1299 if (tokens[
index].
type() == TOKEN_TYPE::WhiteSpace)
1305 if (tokens[
index].
type() == TOKEN_TYPE::Operator &&
1309 throw "Invalid model";
1315 case TOKEN_TYPE::KW_PUBLIC:
1319 case TOKEN_TYPE::KW_savereg:
1323 case TOKEN_TYPE::KW_savexmm128:
1327 case TOKEN_TYPE::InstPrefix:
1336 case TOKEN_TYPE::Instruction:
1340 case TOKEN_TYPE::KW_ERRDEF:
1345 throw "failed to translate construct";
1349 if (tokens[
index].
type() == TOKEN_TYPE::WhiteSpace)
1356 if ((
end.type() != TOKEN_TYPE::Comment) &&
1357 (
end.type() != TOKEN_TYPE::NewLine))
1359 throw "unexpected tokens";
1379 case TOKEN_TYPE::NewLine:
1380 case TOKEN_TYPE::Comment:
1384 case TOKEN_TYPE::Identifier:
1390 case TOKEN_TYPE::WhiteSpace:
1391 case TOKEN_TYPE::Operator:
1405 case TOKEN_TYPE::KW_ENDM:
1414 throw "Failed to translate macro";
1428 if ((tokens[
index].
type() == TOKEN_TYPE::Identifier) &&
1429 (tokens[
index + 1].
type() == TOKEN_TYPE::WhiteSpace) &&
1430 (tokens[
index + 2].
type() == TOKEN_TYPE::KW_MACRO))
1449#if PROFILING_ENABLED
1477#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))