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\[])") },
325 size_t sz =
a.size();
328 for (
unsigned int i = 0;
i < sz; ++
i)
337 if (tok.type() !=
type)
339 throw "Not white space after identifier!\n";
348 if (
type != TOKEN_TYPE::WhiteSpace)
350 throw "Not white space after identifier!\n";
359 if ((
type != TOKEN_TYPE::WhiteSpace) &&
360 (
type != TOKEN_TYPE::NewLine))
362 throw "Not white space after identifier!\n";
370 for (
string &
s :
list)
387 case TOKEN_TYPE::Comment:
391 case TOKEN_TYPE::DecNumber:
393 unsigned long long num = stoull(tok.
str(),
nullptr, 10);
398 case TOKEN_TYPE::HexNumber:
405 case TOKEN_TYPE::Identifier:
414 case TOKEN_TYPE::BYTE_PTR:
415 case TOKEN_TYPE::WORD_PTR:
416 case TOKEN_TYPE::DWORD_PTR:
417 case TOKEN_TYPE::QWORD_PTR:
418 case TOKEN_TYPE::XMMWORD_PTR:
421 case TOKEN_TYPE::Reg8:
422 case TOKEN_TYPE::Reg16:
423 case TOKEN_TYPE::Reg32:
424 case TOKEN_TYPE::Reg64:
425 case TOKEN_TYPE::RegXmm:
426 case TOKEN_TYPE::Instruction:
428 case TOKEN_TYPE::WhiteSpace:
429 case TOKEN_TYPE::NewLine:
430 case TOKEN_TYPE::Operator:
448 if ((tok.
type() == TOKEN_TYPE::NewLine) ||
449 (tok.
type() == TOKEN_TYPE::Comment))
466 case TOKEN_TYPE::NewLine:
467 case TOKEN_TYPE::Comment:
470 case TOKEN_TYPE::KW_MASK:
475 case TOKEN_TYPE::Instruction:
498 throw "Invalid expression";
502 case TOKEN_TYPE::Operator:
503 if (tok.
str() ==
",")
507 case TOKEN_TYPE::WhiteSpace:
508 case TOKEN_TYPE::BraceOpen:
509 case TOKEN_TYPE::BraceClose:
510 case TOKEN_TYPE::DecNumber:
511 case TOKEN_TYPE::HexNumber:
512 case TOKEN_TYPE::Identifier:
530 if ((tok.
type() == TOKEN_TYPE::DecNumber) ||
531 (tok.
type() == TOKEN_TYPE::HexNumber))
543 if (tok.
type() == TOKEN_TYPE::MemRefEnd)
553 throw "Failed to translate memory ref";
561 case TOKEN_TYPE::BYTE_PTR:
562 case TOKEN_TYPE::WORD_PTR:
563 case TOKEN_TYPE::DWORD_PTR:
564 case TOKEN_TYPE::QWORD_PTR:
565 case TOKEN_TYPE::XMMWORD_PTR:
569 if (tokens[
index].
type() == TOKEN_TYPE::WhiteSpace)
580 case TOKEN_TYPE::MemRefStart:
583 case TOKEN_TYPE::NewLine:
584 case TOKEN_TYPE::Comment:
587 case TOKEN_TYPE::Operator:
588 if (tok.
str() ==
",")
591 case TOKEN_TYPE::Identifier:
616 if (tokens[
index].
type() == TOKEN_TYPE::WhiteSpace)
625 case TOKEN_TYPE::Comment:
626 case TOKEN_TYPE::NewLine:
629 case TOKEN_TYPE::WhiteSpace:
630 case TOKEN_TYPE::Operator:
647 case TOKEN_TYPE::DecNumber:
648 case TOKEN_TYPE::HexNumber:
649 case TOKEN_TYPE::String:
650 case TOKEN_TYPE::WhiteSpace:
654 throw "Failed to translate item";
666 if (tokens[
index].
type() == TOKEN_TYPE::WhiteSpace)
672 if ((tokens[
index].
type() == TOKEN_TYPE::Comment) ||
673 (tokens[
index].
type() == TOKEN_TYPE::NewLine))
679 if ((tokens[
index].
type() != TOKEN_TYPE::Operator) ||
682 throw "Unexpected end of list";
686 if (tokens[
index].
type() == TOKEN_TYPE::WhiteSpace)
692 throw "Failed to translate list";
701 string directive,
need, have =
"";
705 case TOKEN_TYPE::KW_DB:
709 case TOKEN_TYPE::KW_DW:
710 directive =
".short";
713 case TOKEN_TYPE::KW_DD:
717 case TOKEN_TYPE::KW_DQ:
741 else if (have !=
need)
756 if (tokens[
index].
type() == TOKEN_TYPE::WhiteSpace)
762 if ((tokens[
index].
type() == TOKEN_TYPE::Comment) ||
763 (tokens[
index].
type() == TOKEN_TYPE::NewLine))
769 if ((tokens[
index].
type() != TOKEN_TYPE::Operator) ||
772 throw "Unexpected end of list";
777 if (tokens[
index].
type() == TOKEN_TYPE::WhiteSpace)
783 throw "Failed to translate list";
800 unsigned int bits, bitpos = 0;
801 unsigned long long oldmask = 0,
mask = 0;
809 if (tokens[
index].
type() == TOKEN_TYPE::WhiteSpace)
816 throw "Unexpected token";
819 if (tokens[
index].
type() == TOKEN_TYPE::WhiteSpace)
825 if ((tok_bits.
type() != TOKEN_TYPE::DecNumber) &&
826 (tok_bits.
type() != TOKEN_TYPE::HexNumber))
828 throw "Unexpected token";
831 bits = stoi(tok_bits.
str(),
nullptr, 0);
833 printf(
"%s = %u\n", tok_member.
str().c_str(), bitpos);
835 oldmask = (1ULL << bitpos) - 1;
837 mask = (1ULL << bitpos) - 1 - oldmask;
838 printf(
"MASK_%s = 0x%llx\n", tok_member.
str().c_str(),
mask);
840 if (tokens[
index].
type() == TOKEN_TYPE::WhiteSpace)
845 if ((tokens[
index].
type() == TOKEN_TYPE::NewLine) ||
846 (tokens[
index].
type() == TOKEN_TYPE::Comment))
853 throw "unexpected token";
857 if (tokens[
index].
type() == TOKEN_TYPE::WhiteSpace)
862 if ((tokens[
index].
type() == TOKEN_TYPE::NewLine) ||
863 (tokens[
index].
type() == TOKEN_TYPE::Comment))
868 if (tokens[
index].
type() == TOKEN_TYPE::WhiteSpace)
883 if (tok1.
type() == TOKEN_TYPE::Colon)
885 if (tok.
str() ==
"@@")
901 case TOKEN_TYPE::KW_MACRO:
902 throw "Cannot have a nested macro!";
904 case TOKEN_TYPE::KW_DB:
905 case TOKEN_TYPE::KW_DW:
906 case TOKEN_TYPE::KW_DD:
907 case TOKEN_TYPE::KW_DQ:
912 case TOKEN_TYPE::KW_EQU:
914 printf(
"#define %s ", tok.
str().c_str());
917 case TOKEN_TYPE::KW_TEXTEQU:
922 string textdef = tok4.
str();
927 case TOKEN_TYPE::KW_PROC:
933 if ((tokens[
index].
type() == TOKEN_TYPE::WhiteSpace) &&
934 (tokens[
index + 1].
type() == TOKEN_TYPE::KW_FRAME))
937 printf(
"\n.seh_proc %s\n", tok.
str().c_str());
939 printf(
"\n.cfi_startproc\n");
946 case TOKEN_TYPE::KW_ENDP:
948 printf(
".seh_endproc\n.endfunc");
953 case TOKEN_TYPE::KW_RECORD:
973 case TOKEN_TYPE::WhiteSpace:
974 case TOKEN_TYPE::NewLine:
975 case TOKEN_TYPE::Comment:
978 case TOKEN_TYPE::Identifier:
981 case TOKEN_TYPE::KW_ALIGN:
985 case TOKEN_TYPE::KW_allocstack:
989 case TOKEN_TYPE::KW_code:
995 printf(
" .intel_syntax noprefix");
999 case TOKEN_TYPE::KW_const:
1000 printf(
".section .rdata");
1004 case TOKEN_TYPE::KW_DB:
1005 case TOKEN_TYPE::KW_DW:
1006 case TOKEN_TYPE::KW_DD:
1007 case TOKEN_TYPE::KW_DQ:
1010 case TOKEN_TYPE::KW_END:
1012 return tokens.
size();
1014 case TOKEN_TYPE::KW_endprolog:
1015 printf(
".seh_endprologue");
1019 case TOKEN_TYPE::KW_EXTERN:
1028 case TOKEN_TYPE::KW_if:
1029 case TOKEN_TYPE::KW_ifdef:
1030 case TOKEN_TYPE::KW_ifndef:
1031 case TOKEN_TYPE::KW_else:
1032 case TOKEN_TYPE::KW_endif:
1037 case TOKEN_TYPE::KW_include:
1042 printf(
"#include \"%s.h\"", tok2.
str().c_str());
1047 case TOKEN_TYPE::KW_PUBLIC:
1051 case TOKEN_TYPE::KW_savereg:
1055 case TOKEN_TYPE::KW_savexmm128:
1059 case TOKEN_TYPE::Instruction:
1063 case TOKEN_TYPE::KW_ERRDEF:
1068 throw "failed to translate construct";
1072 if (tokens[
index].
type() == TOKEN_TYPE::WhiteSpace)
1079 if ((
end.type() != TOKEN_TYPE::Comment) &&
1080 (
end.type() != TOKEN_TYPE::NewLine))
1082 throw "unexpected tokens";
1102 case TOKEN_TYPE::NewLine:
1103 case TOKEN_TYPE::Comment:
1107 case TOKEN_TYPE::Identifier:
1113 case TOKEN_TYPE::WhiteSpace:
1114 case TOKEN_TYPE::Operator:
1128 case TOKEN_TYPE::KW_ENDM:
1137 throw "Failed to translate macro";
1151 if ((tokens[
index].
type() == TOKEN_TYPE::Identifier) &&
1152 (tokens[
index + 1].
type() == TOKEN_TYPE::WhiteSpace) &&
1153 (tokens[
index + 2].
type() == TOKEN_TYPE::KW_MACRO))
1172#if PROFILING_ENABLED
1200#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)
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)
bool is_mem_id(Token &tok)
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)
vector< string > g_identifiers
size_t translate_expression(TokenList &tokens, size_t index, const vector< string > ¯o_params)
Token get_expected_token(Token &&tok, TOKEN_TYPE type)
bool iequals(const string &a, const string &b)
Token get_ws(Token &&tok)
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
GLuint GLuint GLsizei GLenum type
GLint GLint GLsizei GLsizei GLsizei GLint GLenum format
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
_Check_return_opt_ _CRTIMP int __cdecl fprintf(_Inout_ FILE *_File, _In_z_ _Printf_format_string_ const char *_Format,...)
static unsigned int number
static UINT PSTR DWORD UINT * need
void push_back(const _Tp &__x=_STLP_DEFAULT_CONSTRUCTED(_Tp))