diff --git a/compiler/extern.go b/compiler/extern.go new file mode 100644 index 0000000..34979e0 --- /dev/null +++ b/compiler/extern.go @@ -0,0 +1,1941 @@ +package skc + +import ( + "strings" +) + +func IsValidAssemblyRegister(reg string) bool { + var validRegisters = []string{ + // BYTE registers + "al", "ah", "cl", "ch", "bl", "bh", "spl", "bpl", "sil", "dil", + "r8b", "r9b", "r10b", "r11b", "r12b", "r13b", "r14b", "r15b", + + // WORD registers + "ax", "cx", "dx", "bx", "sp", "bp", "si", "di", + "r8w", "r9w", "r10w", "r11w", "r12w", "r13w", "r14w", "r15w", + + // DWORD registers + "eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi", + "r8d", "r9d", "r10d", "r11d", "r12d", "r13d", "r14d", "r15d", + + // QWORD registers + "rax", "rcx", "rdx", "rbx", "rsp", "rbp", "rsi", "rdi", + "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15", + } + + return Contains(validRegisters, strings.ToLower(reg)) +} + +func IsValidAssemblyInstruction(ins string) bool { + // More: https://www.nasm.us/xdoc/2.16.03/html/nasmdocf.html + var validInstructions = []string{ + "db", + "dw", + "dd", + "dq", + "dt", + "do", + "dy", + "dz", + "resb", + "resw", + "resd", + "resq", + "rest", + "reso", + "resy", + "resz", + "incbin", + "aaa", + "aad", + "aam", + "aas", + "adc", + "add", + "and", + "arpl", + "bb0_reset", + "bb1_reset", + "bound", + "bsf", + "bsr", + "bswap", + "bt", + "btc", + "btr", + "bts", + "call", + "cbw", + "cdq", + "cdqe", + "clc", + "cld", + "cli", + "clts", + "cmc", + "cmp", + "cmpsb", + "cmpsd", + "cmpsq", + "cmpsw", + "cmpxchg", + "cmpxchg486", + "cmpxchg8b", + "cmpxchg16b", + "cpuid", + "cpu_read", + "cpu_write", + "cqo", + "cwd", + "cwde", + "daa", + "das", + "dec", + "div", + "dmint", + "emms", + "enter", + "equ", + "f2xm1", + "fabs", + "fadd", + "faddp", + "fbld", + "fbstp", + "fchs", + "fclex", + "fcmovb", + "fcmovbe", + "fcmove", + "fcmovnb", + "fcmovnbe", + "fcmovne", + "fcmovnu", + "fcmovu", + "fcom", + "fcomi", + "fcomip", + "fcomp", + "fcompp", + "fcos", + "fdecstp", + "fdisi", + "fdiv", + "fdivp", + "fdivr", + "fdivrp", + "femms", + "feni", + "ffree", + "ffreep", + "fiadd", + "ficom", + "ficomp", + "fidiv", + "fidivr", + "fild", + "fimul", + "fincstp", + "finit", + "fist", + "fistp", + "fisttp", + "fisub", + "fisubr", + "fld", + "fld1", + "fldcw", + "fldenv", + "fldl2e", + "fldl2t", + "fldlg2", + "fldln2", + "fldpi", + "fldz", + "fmul", + "fmulp", + "fnclex", + "fndisi", + "fneni", + "fninit", + "fnop", + "fnsave", + "fnstcw", + "fnstenv", + "fnstsw", + "fpatan", + "fprem", + "fprem1", + "fptan", + "frndint", + "frstor", + "fsave", + "fscale", + "fsetpm", + "fsin", + "fsincos", + "fsqrt", + "fst", + "fstcw", + "fstenv", + "fstp", + "fstsw", + "fsub", + "fsubp", + "fsubr", + "fsubrp", + "ftst", + "fucom", + "fucomi", + "fucomip", + "fucomp", + "fucompp", + "fxam", + "fxch", + "fxtract", + "fyl2x", + "fyl2xp1", + "hlt", + "ibts", + "icebp", + "idiv", + "imul", + "in", + "inc", + "insb", + "insd", + "insw", + "int", + "int01", + "int1", + "int03", + "int3", + "into", + "invd", + "invpcid", + "invlpg", + "invlpga", + "iret", + "iretd", + "iretq", + "iretw", + "jcxz", + "jecxz", + "jrcxz", + "jmp", + "jmpe", + "lahf", + "lar", + "lds", + "lea", + "leave", + "les", + "lfence", + "lfs", + "lgdt", + "lgs", + "lidt", + "lldt", + "lmsw", + "loadall", + "loadall286", + "lodsb", + "lodsd", + "lodsq", + "lodsw", + "loop", + "loope", + "loopne", + "loopnz", + "loopz", + "lsl", + "lss", + "ltr", + "mfence", + "monitor", + "monitorx", + "mov", + "movd", + "movq", + "movsb", + "movsd", + "movsq", + "movsw", + "movsx", + "movsxd", + "movzx", + "mul", + "mwait", + "mwaitx", + "neg", + "nop", + "not", + "or", + "out", + "outsb", + "outsd", + "outsw", + "packssdw", + "packsswb", + "packuswb", + "paddb", + "paddd", + "paddsb", + "paddsiw", + "paddsw", + "paddusb", + "paddusw", + "paddw", + "pand", + "pandn", + "pause", + "paveb", + "pavgusb", + "pcmpeqb", + "pcmpeqd", + "pcmpeqw", + "pcmpgtb", + "pcmpgtd", + "pcmpgtw", + "pdistib", + "pf2id", + "pfacc", + "pfadd", + "pfcmpeq", + "pfcmpge", + "pfcmpgt", + "pfmax", + "pfmin", + "pfmul", + "pfrcp", + "pfrcpit1", + "pfrcpit2", + "pfrsqit1", + "pfrsqrt", + "pfsub", + "pfsubr", + "pi2fd", + "pmachriw", + "pmaddwd", + "pmagw", + "pmulhriw", + "pmulhrwa", + "pmulhrwc", + "pmulhw", + "pmullw", + "pmvgezb", + "pmvlzb", + "pmvnzb", + "pmvzb", + "pop", + "popa", + "popad", + "popaw", + "popf", + "popfd", + "popfq", + "popfw", + "por", + "prefetch", + "prefetchw", + "pslld", + "psllq", + "psllw", + "psrad", + "psraw", + "psrld", + "psrlq", + "psrlw", + "psubb", + "psubd", + "psubsb", + "psubsiw", + "psubsw", + "psubusb", + "psubusw", + "psubw", + "punpckhbw", + "punpckhdq", + "punpckhwd", + "punpcklbw", + "punpckldq", + "punpcklwd", + "push", + "pusha", + "pushad", + "pushaw", + "pushf", + "pushfd", + "pushfq", + "pushfw", + "pxor", + "rcl", + "rcr", + "rdshr", + "rdmsr", + "rdpmc", + "rdtsc", + "rdtscp", + "ret", + "retf", + "retn", + "retw", + "retfw", + "retnw", + "retd", + "retfd", + "retnd", + "retq", + "retfq", + "retnq", + "rol", + "ror", + "rdm", + "rsdc", + "rsldt", + "rsm", + "rsts", + "sahf", + "sal", + "salc", + "sar", + "sbb", + "scasb", + "scasd", + "scasq", + "scasw", + "sfence", + "sgdt", + "shl", + "shld", + "shr", + "shrd", + "sidt", + "sldt", + "skinit", + "smi", + "smint", + "smintold", + "smsw", + "stc", + "std", + "sti", + "stosb", + "stosd", + "stosq", + "stosw", + "str", + "sub", + "svdc", + "svldt", + "svts", + "swapgs", + "syscall", + "sysenter", + "sysexit", + "sysret", + "test", + "ud0", + "ud1", + "ud2b", + "ud2", + "ud2a", + "umov", + "verr", + "verw", + "fwait", + "wbinvd", + "wrshr", + "wrmsr", + "xadd", + "xbts", + "xchg", + "xlatb", + "xlat", + "xor", + "cmovcc", + "jcc", + "setcc", + "addps", + "addss", + "andnps", + "andps", + "cmpeqps", + "cmpeqss", + "cmpleps", + "cmpless", + "cmpltps", + "cmpltss", + "cmpneqps", + "cmpneqss", + "cmpnleps", + "cmpnless", + "cmpnltps", + "cmpnltss", + "cmpordps", + "cmpordss", + "cmpunordps", + "cmpunordss", + "cmpps", + "cmpss", + "comiss", + "cvtpi2ps", + "cvtps2pi", + "cvtsi2ss", + "cvtss2si", + "cvttps2pi", + "cvttss2si", + "divps", + "divss", + "ldmxcsr", + "maxps", + "maxss", + "minps", + "minss", + "movaps", + "movhps", + "movlhps", + "movlps", + "movhlps", + "movmskps", + "movntps", + "movss", + "movups", + "mulps", + "mulss", + "orps", + "rcpps", + "rcpss", + "rsqrtps", + "rsqrtss", + "shufps", + "sqrtps", + "sqrtss", + "stmxcsr", + "subps", + "subss", + "ucomiss", + "unpckhps", + "unpcklps", + "xorps", + "fxrstor", + "fxrstor64", + "fxsave", + "fxsave64", + "xgetbv", + "xsetbv", + "xsave", + "xsave64", + "xsavec", + "xsavec64", + "xsaveopt", + "xsaveopt64", + "xsaves", + "xsaves64", + "xrstor", + "xrstor64", + "xrstors", + "xrstors64", + "prefetchnt", + "prefetcht0", + "prefetcht1", + "prefetcht2", + "prefetchit", + "maskmovq", + "movntq", + "pavgb", + "pavgw", + "pextrw", + "pinsrw", + "pmaxsw", + "pmaxub", + "pminsw", + "pminub", + "pmovmskb", + "pmulhuw", + "psadbw", + "pshufw", + "pf2iw", + "pfnacc", + "pfpnacc", + "pi2fw", + "pswapd", + "maskmovdqu", + "clflush", + "movntdq", + "movnti", + "movntpd", + "movdqa", + "movdqu", + "movdq2q", + "movq2dq", + "paddq", + "pmuludq", + "pshufd", + "pshufhw", + "pshuflw", + "pslldq", + "psrldq", + "psubq", + "punpckhqdq", + "punpcklqdq", + "addpd", + "addsd", + "andnpd", + "andpd", + "cmpeqpd", + "cmpeqsd", + "cmplepd", + "cmplesd", + "cmpltpd", + "cmpltsd", + "cmpneqpd", + "cmpneqsd", + "cmpnlepd", + "cmpnlesd", + "cmpnltpd", + "cmpnltsd", + "cmpordpd", + "cmpordsd", + "cmpunordpd", + "cmpunordsd", + "cmppd", + "comisd", + "cvtdq2pd", + "cvtdq2ps", + "cvtpd2dq", + "cvtpd2pi", + "cvtpd2ps", + "cvtpi2pd", + "cvtps2dq", + "cvtps2pd", + "cvtsd2si", + "cvtsd2ss", + "cvtsi2sd", + "cvtss2sd", + "cvttpd2pi", + "cvttpd2dq", + "cvttps2dq", + "cvttsd2si", + "divpd", + "divsd", + "maxpd", + "maxsd", + "minpd", + "minsd", + "movapd", + "movhpd", + "movlpd", + "movmskpd", + "movupd", + "mulpd", + "mulsd", + "orpd", + "shufpd", + "sqrtpd", + "sqrtsd", + "subpd", + "subsd", + "ucomisd", + "unpckhpd", + "unpcklpd", + "xorpd", + "addsubpd", + "addsubps", + "haddpd", + "haddps", + "hsubpd", + "hsubps", + "lddqu", + "movddup", + "movshdup", + "movsldup", + "clgi", + "stgi", + "vmcall", + "vmclear", + "vmfunc", + "vmlaunch", + "vmload", + "vmmcall", + "vmptrld", + "vmptrst", + "vmread", + "vmresume", + "vmrun", + "vmsave", + "vmwrite", + "vmxoff", + "vmxon", + "invept", + "invvpid", + "pvalidate", + "rmpadjust", + "vmgexit", + "pabsb", + "pabsw", + "pabsd", + "palignr", + "phaddw", + "phaddd", + "phaddsw", + "phsubw", + "phsubd", + "phsubsw", + "pmaddubsw", + "pmulhrsw", + "pshufb", + "psignb", + "psignw", + "psignd", + "extrq", + "insertq", + "movntsd", + "movntss", + "lzcnt", + "blendpd", + "blendps", + "blendvpd", + "blendvps", + "dppd", + "dpps", + "extractps", + "insertps", + "movntdqa", + "mpsadbw", + "packusdw", + "pblendvb", + "pblendw", + "pcmpeqq", + "pextrb", + "pextrd", + "pextrq", + "phminposuw", + "pinsrb", + "pinsrd", + "pinsrq", + "pmaxsb", + "pmaxsd", + "pmaxud", + "pmaxuw", + "pminsb", + "pminsd", + "pminud", + "pminuw", + "pmovsxbw", + "pmovsxbd", + "pmovsxbq", + "pmovsxwd", + "pmovsxwq", + "pmovsxdq", + "pmovzxbw", + "pmovzxbd", + "pmovzxbq", + "pmovzxwd", + "pmovzxwq", + "pmovzxdq", + "pmuldq", + "pmulld", + "ptest", + "roundpd", + "roundps", + "roundsd", + "roundss", + "crc32", + "pcmpestri", + "pcmpestrm", + "pcmpistri", + "pcmpistrm", + "pcmpgtq", + "popcnt", + "getsec", + "pfrcpv", + "pfrsqrtv", + "movbe", + "aesenc", + "aesenclast", + "aesdec", + "aesdeclast", + "aesimc", + "aeskeygena", + "vaesenc", + "vaesenclas", + "vaesdec", + "vaesdeclas", + "vaesimc", + "vaeskeygen", + "vaddpd", + "vaddps", + "vaddsd", + "vaddss", + "vaddsubpd", + "vaddsubps", + "vandpd", + "vandps", + "vandnpd", + "vandnps", + "vblendpd", + "vblendps", + "vblendvpd", + "vblendvps", + "vbroadcast", + "vcmpeq_osp", + "vcmpeqpd", + "vcmplt_osp", + "vcmpltpd", + "vcmple_osp", + "vcmplepd", + "vcmpunord_", + "vcmpunordp", + "vcmpneq_uq", + "vcmpneqpd", + "vcmpnlt_us", + "vcmpnltpd", + "vcmpnle_us", + "vcmpnlepd", + "vcmpord_qp", + "vcmpordpd", + "vcmpeq_uqp", + "vcmpnge_us", + "vcmpngepd", + "vcmpngt_us", + "vcmpngtpd", + "vcmpfalse_", + "vcmpfalsep", + "vcmpneq_oq", + "vcmpge_osp", + "vcmpgepd", + "vcmpgt_osp", + "vcmpgtpd", + "vcmptrue_u", + "vcmptruepd", + "vcmplt_oqp", + "vcmple_oqp", + "vcmpneq_us", + "vcmpnlt_uq", + "vcmpnle_uq", + "vcmpord_sp", + "vcmpeq_usp", + "vcmpnge_uq", + "vcmpngt_uq", + "vcmpneq_os", + "vcmpge_oqp", + "vcmpgt_oqp", + "vcmppd", + "vcmpeqps", + "vcmpltps", + "vcmpleps", + "vcmpneqps", + "vcmpnltps", + "vcmpnleps", + "vcmpordps", + "vcmpngeps", + "vcmpngtps", + "vcmpgeps", + "vcmpgtps", + "vcmptrueps", + "vcmpps", + "vcmpeq_oss", + "vcmpeqsd", + "vcmplt_oss", + "vcmpltsd", + "vcmple_oss", + "vcmplesd", + "vcmpunords", + "vcmpneqsd", + "vcmpnltsd", + "vcmpnlesd", + "vcmpord_qs", + "vcmpordsd", + "vcmpeq_uqs", + "vcmpngesd", + "vcmpngtsd", + "vcmpfalses", + "vcmpge_oss", + "vcmpgesd", + "vcmpgt_oss", + "vcmpgtsd", + "vcmptruesd", + "vcmplt_oqs", + "vcmple_oqs", + "vcmpord_ss", + "vcmpeq_uss", + "vcmpge_oqs", + "vcmpgt_oqs", + "vcmpsd", + "vcmpeqss", + "vcmpltss", + "vcmpless", + "vcmpneqss", + "vcmpnltss", + "vcmpnless", + "vcmpordss", + "vcmpngess", + "vcmpngtss", + "vcmpgess", + "vcmpgtss", + "vcmptruess", + "vcmpss", + "vcomisd", + "vcomiss", + "vcvtdq2pd", + "vcvtdq2ps", + "vcvtpd2dq", + "vcvtpd2ps", + "vcvtps2dq", + "vcvtps2pd", + "vcvtsd2si", + "vcvtsd2ss", + "vcvtsi2sd", + "vcvtsi2ss", + "vcvtss2sd", + "vcvtss2si", + "vcvttpd2dq", + "vcvttps2dq", + "vcvttsd2si", + "vcvttss2si", + "vdivpd", + "vdivps", + "vdivsd", + "vdivss", + "vdppd", + "vdpps", + "vextractf1", + "vextractps", + "vhaddpd", + "vhaddps", + "vhsubpd", + "vhsubps", + "vinsertf12", + "vinsertps", + "vlddqu", + "vldqqu", + "vldmxcsr", + "vmaskmovdq", + "vmaskmovps", + "vmaskmovpd", + "vmaxpd", + "vmaxps", + "vmaxsd", + "vmaxss", + "vminpd", + "vminps", + "vminsd", + "vminss", + "vmovapd", + "vmovaps", + "vmovd", + "vmovq", + "vmovddup", + "vmovdqa", + "vmovqqa", + "vmovdqu", + "vmovqqu", + "vmovhlps", + "vmovhpd", + "vmovhps", + "vmovlhps", + "vmovlpd", + "vmovlps", + "vmovmskpd", + "vmovmskps", + "vmovntdq", + "vmovntqq", + "vmovntdqa", + "vmovntpd", + "vmovntps", + "vmovsd", + "vmovshdup", + "vmovsldup", + "vmovss", + "vmovupd", + "vmovups", + "vmpsadbw", + "vmulpd", + "vmulps", + "vmulsd", + "vmulss", + "vorpd", + "vorps", + "vpabsb", + "vpabsw", + "vpabsd", + "vpacksswb", + "vpackssdw", + "vpackuswb", + "vpackusdw", + "vpaddb", + "vpaddw", + "vpaddd", + "vpaddq", + "vpaddsb", + "vpaddsw", + "vpaddusb", + "vpaddusw", + "vpalignr", + "vpand", + "vpandn", + "vpavgb", + "vpavgw", + "vpblendvb", + "vpblendw", + "vpcmpestri", + "vpcmpestrm", + "vpcmpistri", + "vpcmpistrm", + "vpcmpeqb", + "vpcmpeqw", + "vpcmpeqd", + "vpcmpeqq", + "vpcmpgtb", + "vpcmpgtw", + "vpcmpgtd", + "vpcmpgtq", + "vpermilpd", + "vpermilps", + "vperm2f128", + "vpextrb", + "vpextrw", + "vpextrd", + "vpextrq", + "vphaddw", + "vphaddd", + "vphaddsw", + "vphminposu", + "vphsubw", + "vphsubd", + "vphsubsw", + "vpinsrb", + "vpinsrw", + "vpinsrd", + "vpinsrq", + "vpmaddwd", + "vpmaddubsw", + "vpmaxsb", + "vpmaxsw", + "vpmaxsd", + "vpmaxub", + "vpmaxuw", + "vpmaxud", + "vpminsb", + "vpminsw", + "vpminsd", + "vpminub", + "vpminuw", + "vpminud", + "vpmovmskb", + "vpmovsxbw", + "vpmovsxbd", + "vpmovsxbq", + "vpmovsxwd", + "vpmovsxwq", + "vpmovsxdq", + "vpmovzxbw", + "vpmovzxbd", + "vpmovzxbq", + "vpmovzxwd", + "vpmovzxwq", + "vpmovzxdq", + "vpmulhuw", + "vpmulhrsw", + "vpmulhw", + "vpmullw", + "vpmulld", + "vpmuludq", + "vpmuldq", + "vpor", + "vpsadbw", + "vpshufb", + "vpshufd", + "vpshufhw", + "vpshuflw", + "vpsignb", + "vpsignw", + "vpsignd", + "vpslldq", + "vpsrldq", + "vpsllw", + "vpslld", + "vpsllq", + "vpsraw", + "vpsrad", + "vpsrlw", + "vpsrld", + "vpsrlq", + "vptest", + "vpsubb", + "vpsubw", + "vpsubd", + "vpsubq", + "vpsubsb", + "vpsubsw", + "vpsubusb", + "vpsubusw", + "vpunpckhbw", + "vpunpckhwd", + "vpunpckhdq", + "vpunpckhqd", + "vpunpcklbw", + "vpunpcklwd", + "vpunpckldq", + "vpunpcklqd", + "vpxor", + "vrcpps", + "vrcpss", + "vrsqrtps", + "vrsqrtss", + "vroundpd", + "vroundps", + "vroundsd", + "vroundss", + "vshufpd", + "vshufps", + "vsqrtpd", + "vsqrtps", + "vsqrtsd", + "vsqrtss", + "vstmxcsr", + "vsubpd", + "vsubps", + "vsubsd", + "vsubss", + "vtestps", + "vtestpd", + "vucomisd", + "vucomiss", + "vunpckhpd", + "vunpckhps", + "vunpcklpd", + "vunpcklps", + "vxorpd", + "vxorps", + "vzeroall", + "vzeroupper", + "pclmullqlq", + "pclmulhqlq", + "pclmullqhq", + "pclmulhqhq", + "pclmulqdq", + "vpclmullql", + "vpclmulhql", + "vpclmullqh", + "vpclmulhqh", + "vpclmulqdq", + "vfmadd132p", + "vfmadd312p", + "vfmadd213p", + "vfmadd123p", + "vfmadd231p", + "vfmadd321p", + "vfmaddsub1", + "vfmaddsub3", + "vfmaddsub2", + "vfmsub132p", + "vfmsub312p", + "vfmsub213p", + "vfmsub123p", + "vfmsub231p", + "vfmsub321p", + "vfmsubadd1", + "vfmsubadd3", + "vfmsubadd2", + "vfnmadd132", + "vfnmadd312", + "vfnmadd213", + "vfnmadd123", + "vfnmadd231", + "vfnmadd321", + "vfnmsub132", + "vfnmsub312", + "vfnmsub213", + "vfnmsub123", + "vfnmsub231", + "vfnmsub321", + "vfmadd132s", + "vfmadd312s", + "vfmadd213s", + "vfmadd123s", + "vfmadd231s", + "vfmadd321s", + "vfmsub132s", + "vfmsub312s", + "vfmsub213s", + "vfmsub123s", + "vfmsub231s", + "vfmsub321s", + "rdfsbase", + "rdgsbase", + "rdrand", + "wrfsbase", + "wrgsbase", + "vcvtph2ps", + "vcvtps2ph", + "adcx", + "adox", + "rdseed", + "clac", + "stac", + "xstore", + "xcryptecb", + "xcryptcbc", + "xcryptctr", + "xcryptcfb", + "xcryptofb", + "montmul", + "xsha1", + "xsha256", + "llwpcb", + "slwpcb", + "lwpval", + "lwpins", + "vfmaddpd", + "vfmaddps", + "vfmaddsd", + "vfmaddss", + "vfmaddsubp", + "vfmsubaddp", + "vfmsubpd", + "vfmsubps", + "vfmsubsd", + "vfmsubss", + "vfnmaddpd", + "vfnmaddps", + "vfnmaddsd", + "vfnmaddss", + "vfnmsubpd", + "vfnmsubps", + "vfnmsubsd", + "vfnmsubss", + "vfrczpd", + "vfrczps", + "vfrczsd", + "vfrczss", + "vpcmov", + "vpcomb", + "vpcomd", + "vpcomq", + "vpcomub", + "vpcomud", + "vpcomuq", + "vpcomuw", + "vpcomw", + "vphaddbd", + "vphaddbq", + "vphaddbw", + "vphadddq", + "vphaddubd", + "vphaddubq", + "vphaddubw", + "vphaddudq", + "vphadduwd", + "vphadduwq", + "vphaddwd", + "vphaddwq", + "vphsubbw", + "vphsubdq", + "vphsubwd", + "vpmacsdd", + "vpmacsdqh", + "vpmacsdql", + "vpmacssdd", + "vpmacssdqh", + "vpmacssdql", + "vpmacsswd", + "vpmacssww", + "vpmacswd", + "vpmacsww", + "vpmadcsswd", + "vpmadcswd", + "vpperm", + "vprotb", + "vprotd", + "vprotq", + "vprotw", + "vpshab", + "vpshad", + "vpshaq", + "vpshaw", + "vpshlb", + "vpshld", + "vpshlq", + "vpshlw", + "vpblendd", + "vpbroadcas", + "vpermd", + "vpermpd", + "vpermps", + "vpermq", + "vperm2i128", + "vextracti1", + "vinserti12", + "vpmaskmovd", + "vpmaskmovq", + "vpsllvd", + "vpsllvq", + "vpsravd", + "vpsrlvd", + "vpsrlvq", + "vgatherdpd", + "vgatherqpd", + "vgatherdps", + "vgatherqps", + "vpgatherdd", + "vpgatherqd", + "vpgatherdq", + "vpgatherqq", + "xabort", + "xbegin", + "xend", + "xtest", + "andn", + "bextr", + "blci", + "blcic", + "blsi", + "blsic", + "blcfill", + "blsfill", + "blcmsk", + "blsmsk", + "blsr", + "blcs", + "bzhi", + "mulx", + "pdep", + "pext", + "rorx", + "sarx", + "shlx", + "shrx", + "tzcnt", + "tzmsk", + "t1mskc", + "prefetchwt", + "bndmk", + "bndcl", + "bndcu", + "bndcn", + "bndmov", + "bndldx", + "bndstx", + "sha1msg1", + "sha1msg2", + "sha1nexte", + "sha1rnds4", + "sha256msg1", + "sha256msg2", + "sha256rnds", + "vsha512msg", + "vsha512rnd", + "vsm3msg1", + "vsm3msg2", + "vsm3rnds2", + "vsm4key4", + "vsm4rnds4", + "vbcstnebf1", + "vbcstnesh2", + "vcvtneebf1", + "vcvtneeph2", + "vcvtneobf1", + "vcvtneoph2", + "vcvtneps2b", + "vpdpbssd", + "vpdpbssds", + "vpdpbsud", + "vpdpbsuds", + "vpdpbuud", + "vpdpbuuds", + "vpmadd52hu", + "vpmadd52lu", + "kaddb", + "kaddd", + "kaddq", + "kaddw", + "kandb", + "kandd", + "kandnb", + "kandnd", + "kandnq", + "kandnw", + "kandq", + "kandw", + "kmovb", + "kmovd", + "kmovq", + "kmovw", + "knotb", + "knotd", + "knotq", + "knotw", + "korb", + "kord", + "korq", + "korw", + "kortestb", + "kortestd", + "kortestq", + "kortestw", + "kshiftlb", + "kshiftld", + "kshiftlq", + "kshiftlw", + "kshiftrb", + "kshiftrd", + "kshiftrq", + "kshiftrw", + "ktestb", + "ktestd", + "ktestq", + "ktestw", + "kunpckbw", + "kunpckdq", + "kunpckwd", + "kxnorb", + "kxnord", + "kxnorq", + "kxnorw", + "kxorb", + "kxord", + "kxorq", + "kxorw", + "kadd", + "kand", + "kandn", + "kmov", + "knot", + "kor", + "kortest", + "kshiftl", + "kshiftr", + "ktest", + "kunpck", + "kxnor", + "kxor", + "valignd", + "valignq", + "vblendmpd", + "vblendmps", + "vcmpeq_oqp", + "vcmpeq_oqs", + "vcompressp", + "vcvtpd2qq", + "vcvtpd2udq", + "vcvtpd2uqq", + "vcvtps2qq", + "vcvtps2udq", + "vcvtps2uqq", + "vcvtqq2pd", + "vcvtqq2ps", + "vcvtsd2usi", + "vcvtss2usi", + "vcvttpd2qq", + "vcvttpd2ud", + "vcvttpd2uq", + "vcvttps2qq", + "vcvttps2ud", + "vcvttps2uq", + "vcvttsd2us", + "vcvttss2us", + "vcvtudq2pd", + "vcvtudq2ps", + "vcvtuqq2pd", + "vcvtuqq2ps", + "vcvtusi2sd", + "vcvtusi2ss", + "vdbpsadbw", + "vexp2pd", + "vexp2ps", + "vexpandpd", + "vexpandps", + "vextractf3", + "vextractf6", + "vextracti3", + "vextracti6", + "vfixupimmp", + "vfixupimms", + "vfpclasspd", + "vfpclassps", + "vfpclasssd", + "vfpclassss", + "vgatherpf0", + "vgatherpf1", + "vgetexppd", + "vgetexpps", + "vgetexpsd", + "vgetexpss", + "vgetmantpd", + "vgetmantps", + "vgetmantsd", + "vgetmantss", + "vinsertf32", + "vinsertf64", + "vinserti32", + "vinserti64", + "vmovdqa32", + "vmovdqa64", + "vmovdqu16", + "vmovdqu32", + "vmovdqu64", + "vmovdqu8", + "vpabsq", + "vpandd", + "vpandnd", + "vpandnq", + "vpandq", + "vpblendmb", + "vpblendmd", + "vpblendmq", + "vpblendmw", + "vpcmpequb", + "vpcmpequd", + "vpcmpequq", + "vpcmpequw", + "vpcmpgeb", + "vpcmpged", + "vpcmpgeq", + "vpcmpgeub", + "vpcmpgeud", + "vpcmpgeuq", + "vpcmpgeuw", + "vpcmpgew", + "vpcmpgtub", + "vpcmpgtud", + "vpcmpgtuq", + "vpcmpgtuw", + "vpcmpleb", + "vpcmpled", + "vpcmpleq", + "vpcmpleub", + "vpcmpleud", + "vpcmpleuq", + "vpcmpleuw", + "vpcmplew", + "vpcmpltb", + "vpcmpltd", + "vpcmpltq", + "vpcmpltub", + "vpcmpltud", + "vpcmpltuq", + "vpcmpltuw", + "vpcmpltw", + "vpcmpneqb", + "vpcmpneqd", + "vpcmpneqq", + "vpcmpnequb", + "vpcmpnequd", + "vpcmpnequq", + "vpcmpnequw", + "vpcmpneqw", + "vpcmpngtb", + "vpcmpngtd", + "vpcmpngtq", + "vpcmpngtub", + "vpcmpngtud", + "vpcmpngtuq", + "vpcmpngtuw", + "vpcmpngtw", + "vpcmpnleb", + "vpcmpnled", + "vpcmpnleq", + "vpcmpnleub", + "vpcmpnleud", + "vpcmpnleuq", + "vpcmpnleuw", + "vpcmpnlew", + "vpcmpnltb", + "vpcmpnltd", + "vpcmpnltq", + "vpcmpnltub", + "vpcmpnltud", + "vpcmpnltuq", + "vpcmpnltuw", + "vpcmpnltw", + "vpcmpb", + "vpcmpd", + "vpcmpq", + "vpcmpub", + "vpcmpud", + "vpcmpuq", + "vpcmpuw", + "vpcmpw", + "vpcompress", + "vpconflict", + "vpermb", + "vpermi2b", + "vpermi2d", + "vpermi2pd", + "vpermi2ps", + "vpermi2q", + "vpermi2w", + "vpermt2b", + "vpermt2d", + "vpermt2pd", + "vpermt2ps", + "vpermt2q", + "vpermt2w", + "vpermw", + "vpexpandd", + "vpexpandq", + "vplzcntd", + "vplzcntq", + "vpmaxsq", + "vpmaxuq", + "vpminsq", + "vpminuq", + "vpmovb2m", + "vpmovd2m", + "vpmovdb", + "vpmovdw", + "vpmovm2b", + "vpmovm2d", + "vpmovm2q", + "vpmovm2w", + "vpmovq2m", + "vpmovqb", + "vpmovqd", + "vpmovqw", + "vpmovsdb", + "vpmovsdw", + "vpmovsqb", + "vpmovsqd", + "vpmovsqw", + "vpmovswb", + "vpmovusdb", + "vpmovusdw", + "vpmovusqb", + "vpmovusqd", + "vpmovusqw", + "vpmovuswb", + "vpmovw2m", + "vpmovwb", + "vpmullq", + "vpmultishi", + "vpord", + "vporq", + "vprold", + "vprolq", + "vprolvd", + "vprolvq", + "vprord", + "vprorq", + "vprorvd", + "vprorvq", + "vpscatterd", + "vpscatterq", + "vpsllvw", + "vpsraq", + "vpsravq", + "vpsravw", + "vpsrlvw", + "vpternlogd", + "vpternlogq", + "vptestmb", + "vptestmd", + "vptestmq", + "vptestmw", + "vptestnmb", + "vptestnmd", + "vptestnmq", + "vptestnmw", + "vpxord", + "vpxorq", + "vrangepd", + "vrangeps", + "vrangesd", + "vrangess", + "vrcp14pd", + "vrcp14ps", + "vrcp14sd", + "vrcp14ss", + "vrcp28pd", + "vrcp28ps", + "vrcp28sd", + "vrcp28ss", + "vreducepd", + "vreduceps", + "vreducesd", + "vreducess", + "vrndscalep", + "vrndscales", + "vrsqrt14pd", + "vrsqrt14ps", + "vrsqrt14sd", + "vrsqrt14ss", + "vrsqrt28pd", + "vrsqrt28ps", + "vrsqrt28sd", + "vrsqrt28ss", + "vscalefpd", + "vscalefps", + "vscalefsd", + "vscalefss", + "vscatterdp", + "vscatterpf", + "vscatterqp", + "vshuff32x4", + "vshuff64x2", + "vshufi32x4", + "vshufi64x2", + "rdpkru", + "wrpkru", + "rdpid", + "clflushopt", + "clwb", + "pcommit", + "clzero", + "ptwrite", + "cldemote", + "movdiri", + "movdir64b", + "pconfig", + "tpause", + "umonitor", + "umwait", + "wbnoinvd", + "gf2p8affin", + "vgf2p8affi", + "gf2p8mulb", + "vgf2p8mulb", + "vpexpandb", + "vpexpandw", + "vpshldw", + "vpshldd", + "vpshldq", + "vpshldvw", + "vpshldvd", + "vpshldvq", + "vpshrdw", + "vpshrdd", + "vpshrdq", + "vpshrdvw", + "vpshrdvd", + "vpshrdvq", + "vpdpbusd", + "vpdpbusds", + "vpdpwssd", + "vpdpwssds", + "vpopcntb", + "vpopcntw", + "vpopcntd", + "vpopcntq", + "vpshufbitq", + "v4fmaddps", + "v4fnmaddps", + "v4fmaddss", + "v4fnmaddss", + "v4dpwssds", + "v4dpwssd", + "encls", + "enclu", + "enclv", + "clrssbsy", + "endbr32", + "endbr64", + "incsspd", + "incsspq", + "rdsspd", + "rdsspq", + "rstorssp", + "saveprevss", + "setssbsy", + "wrussd", + "wrussq", + "wrssd", + "wrssq", + "enqcmd", + "enqcmds", + "serialize", + "xresldtrk", + "xsusldtrk", + "vcvtne2ps2", + "vdpbf16ps", + "vp2interse", + "ldtilecfg", + "sttilecfg", + "tdpbf16ps", + "tdpbssd", + "tdpbsud", + "tdpbusd", + "tdpbuud", + "tileloadd", + "tileloaddt", + "tilereleas", + "tilestored", + "tilezero", + "vaddph", + "vaddsh", + "vcmpph", + "vcmpsh", + "vcomish", + "vcvtdq2ph", + "vcvtpd2ph", + "vcvtph2dq", + "vcvtph2pd", + "vcvtph2psx", + "vcvtph2qq", + "vcvtph2udq", + "vcvtph2uqq", + "vcvtph2uw", + "vcvtph2w", + "vcvtqq2ph", + "vcvtsd2sh", + "vcvtsh2sd", + "vcvtsh2si", + "vcvtsh2ss", + "vcvtsh2usi", + "vcvtsi2sh", + "vcvtss2sh", + "vcvttph2dq", + "vcvttph2qq", + "vcvttph2ud", + "vcvttph2uq", + "vcvttph2uw", + "vcvttph2w", + "vcvttsh2si", + "vcvttsh2us", + "vcvtudq2ph", + "vcvtuqq2ph", + "vcvtusi2sh", + "vcvtuw2ph", + "vcvtw2ph", + "vdivph", + "vdivsh", + "vfcmaddcph", + "vfmaddcph", + "vfcmaddcsh", + "vfmaddcsh", + "vfcmulcpch", + "vfmulcpch", + "vfcmulcsh", + "vfmulcsh", + "vpmadd132p", + "vpmadd213p", + "vpmadd231p", + "vpmadd132s", + "vpmadd213s", + "vpmadd231s", + "vpnmadd132", + "vpnmadd213", + "vpnmadd231", + "vpmsub132p", + "vpmsub213p", + "vpmsub231p", + "vpmsub132s", + "vpmsub213s", + "vpmsub231s", + "vpnmsub132", + "vpnmsub213", + "vpnmsub231", + "vfpclassph", + "vfpclasssh", + "vgetexpph", + "vgetexpsh", + "vgetmantph", + "vgetmantsh", + "vgetmaxph", + "vgetmaxsh", + "vgetminph", + "vgetminsh", + "vmovsh", + "vmovw", + "vmulph", + "vmulsh", + "vrcpph", + "vrcpsh", + "vreduceph", + "vreducesh", + "vendscalep", + "vendscales", + "vrsqrtph", + "vrsqrtsh", + "vscalefph", + "vscalefsh", + "vsqrtph", + "vsqrtsh", + "vsubph", + "vsubsh", + "vucomish", + "aadd", + "aand", + "axor", + "clui", + "senduipi", + "stui", + "testui", + "uiret", + "cmpccxadd", + "erets", + "eretu", + "lkgs", + "wrmsrns", + "rdmsrlist", + "wrmsrlist", + "hreset", + "hint_nop0", + "hint_nop1", + "hint_nop2", + "hint_nop3", + "hint_nop4", + "hint_nop5", + "hint_nop6", + "hint_nop7", + "hint_nop8", + "hint_nop9", + "hint_nop10", + "hint_nop11", + "hint_nop12", + "hint_nop13", + "hint_nop14", + "hint_nop15", + "hint_nop16", + "hint_nop17", + "hint_nop18", + "hint_nop19", + "hint_nop20", + "hint_nop21", + "hint_nop22", + "hint_nop23", + "hint_nop24", + "hint_nop25", + "hint_nop26", + "hint_nop27", + "hint_nop28", + "hint_nop29", + "hint_nop30", + "hint_nop31", + "hint_nop32", + "hint_nop33", + "hint_nop34", + "hint_nop35", + "hint_nop36", + "hint_nop37", + "hint_nop38", + "hint_nop39", + "hint_nop40", + "hint_nop41", + "hint_nop42", + "hint_nop43", + "hint_nop44", + "hint_nop45", + "hint_nop46", + "hint_nop47", + "hint_nop48", + "hint_nop49", + "hint_nop50", + "hint_nop51", + "hint_nop52", + "hint_nop53", + "hint_nop54", + "hint_nop55", + "hint_nop56", + "hint_nop57", + "hint_nop58", + "hint_nop59", + "hint_nop60", + "hint_nop61", + "hint_nop62", + "hint_nop63", + } + + return Contains(validInstructions, strings.ToLower(ins)) +} diff --git a/compiler/frontend.go b/compiler/frontend.go index 4d60d9c..fc2fa5c 100644 --- a/compiler/frontend.go +++ b/compiler/frontend.go @@ -200,8 +200,8 @@ func newFunction(token Token) { word := parser.previous name := word.value.(string) - function.name = name + if name == "main" { function.called = true for _, f := range TheProgram.chunks { @@ -420,7 +420,6 @@ func addExtern(token Token) { case TOKEN_DTYPE_CHAR: arg = DATA_CHAR case TOKEN_DTYPE_INT: arg = DATA_INT case TOKEN_DTYPE_PTR: arg = DATA_PTR - default: msg := fmt.Sprintf(MsgParseTypeUnknown, t.value) errorAt(&t, msg) @@ -442,7 +441,6 @@ func addExtern(token Token) { case TOKEN_DTYPE_CHAR: arg = DATA_CHAR case TOKEN_DTYPE_INT: arg = DATA_INT case TOKEN_DTYPE_PTR: arg = DATA_PTR - default: msg := fmt.Sprintf(MsgParseTypeUnknown, t.value) errorAt(&t, msg) @@ -465,15 +463,29 @@ func addExtern(token Token) { var val string switch t.typ { - case TOKEN_WORD: val = t.value.(string) + case TOKEN_WORD: + val = t.value.(string) + // TODO: Check for what kind of word this is + // if IsValidAssemblyRegister(val) || IsValidAssemblyInstruction(val) { + // val = word + // } else { + // // TODO: handle word custom + // } + case TOKEN_INT: val = strconv.Itoa(t.value.(int)) } - // TODO: Should be able to expand word - // TODO: Should check for instructions or registers line = append(line, val) + // If current parsed token (parser.previous) is not on the same line than + // the next token, consider it an ASM line and push it over the Extend.value OP, + // then reset the line variable, so we can safely construct the next ASM line. if t.loc.l != nt.loc.l { + // TODO: Should validate line construction here, with a function in extern.go + // The validation should check for the following: + // 1. Validate line[0] is a valid instruction + // 2. Validate the next elements in the array (1, 2, ...) matches the + // rules for the instruction in line[0] value.body = append(value.body, strings.Join(line, " ")) line = make([]string, 0, 0) }