--- GNU ARM vocabulary for Lx
-- @module vocabulary_gnu_arm

-- Sources:
-- https://gnu.googlesource.com/binutils-gdb/+/1686e21559a7812ebbc05f57372cc30880768bf7/gas/config/tc-arm.c

local instructions = {
	"adc",
	"adcs",
	"add",
	"adds",
	"addw",
	"adr",
	"adrl",
	"aesd",
	"aese",
	"aesimc",
	"aesmc",
	"and",
	"ands",
	"asr",
	"asrl",
	"asrs",
	"aut",
	"autg",
	"b",
	"bf",
	"bfc",
	"bfcsel",
	"bfi",
	"bfl",
	"bflx",
	"bfx",
	"bic",
	"bics",
	"bkpt",
	"bl",
	"blx",
	"blxns",
	"bti",
	"bx",
	"bxaut",
	"bxj",
	"bxns",
	"cbnz",
	"cbz",
	"cdp",
	"cdp2",
	"cfprctx",
	"cinc",
	"cinv",
	"clrex",
	"clrm",
	"clz",
	"cmn",
	"cmnp",
	"cmns",
	"cmp",
	"cmpp",
	"cmps",
	"cneg",
	"cpprctx",
	"cps",
	"cpsid",
	"cpsie",
	"cpy",
	"crc32b",
	"crc32cb",
	"crc32ch",
	"crc32cw",
	"crc32h",
	"crc32w",
	"csdb",
	"csel",
	"cset",
	"csetm",
	"csinc",
	"csinv",
	"csneg",
	"cx1",
	"cx1a",
	"cx1d",
	"cx1da",
	"cx2",
	"cx2a",
	"cx2d",
	"cx2da",
	"cx3",
	"cx3a",
	"cx3d",
	"cx3da",
	"dbg",
	"dcps1",
	"dcps2",
	"dcps3",
	"dfb",
	"dls",
	"dlstp",
	"dmb",
	"dsb",
	"dvprctx",
	"eor",
	"eors",
	"eret",
	"esb",
	"fabsd",
	"fabss",
	"faddd",
	"fadds",
	"fcmpd",
	"fcmped",
	"fcmpes",
	"fcmpezd",
	"fcmpezs",
	"fcmps",
	"fcmpzd",
	"fcmpzs",
	"fconstd",
	"fconsts",
	"fcpyd",
	"fcpys",
	"fcvtds",
	"fcvtsd",
	"fdivd",
	"fdivs",
	"ffmad",
	"ffmas",
	"ffnmad",
	"ffnmas",
	"fldd",
	"fldmdbd",
	"fldmdbs",
	"fldmdbx",
	"fldmead",
	"fldmeas",
	"fldmeax",
	"fldmfdd",
	"fldmfds",
	"fldmfdx",
	"fldmiad",
	"fldmias",
	"fldmiax",
	"flds",
	"fmacd",
	"fmacs",
	"fmdhr",
	"fmdlr",
	"fmdrr",
	"fmrdh",
	"fmrdl",
	"fmrrd",
	"fmrrs",
	"fmrs",
	"fmrx",
	"fmscd",
	"fmscs",
	"fmsr",
	"fmsrr",
	"fmstat",
	"fmuld",
	"fmuls",
	"fmxr",
	"fnegd",
	"fnegs",
	"fnmacd",
	"fnmacs",
	"fnmscd",
	"fnmscs",
	"fnmuld",
	"fnmuls",
	"fshtod",
	"fshtos",
	"fsitod",
	"fsitos",
	"fsltod",
	"fsltos",
	"fsqrtd",
	"fsqrts",
	"fstd",
	"fstmdbd",
	"fstmdbs",
	"fstmdbx",
	"fstmead",
	"fstmeas",
	"fstmeax",
	"fstmfdd",
	"fstmfds",
	"fstmfdx",
	"fstmiad",
	"fstmias",
	"fstmiax",
	"fsts",
	"fsubd",
	"fsubs",
	"ftoshd",
	"ftoshs",
	"ftosid",
	"ftosis",
	"ftosizd",
	"ftosizs",
	"ftosld",
	"ftosls",
	"ftouhd",
	"ftouhs",
	"ftouid",
	"ftouis",
	"ftouizd",
	"ftouizs",
	"ftould",
	"ftouls",
	"fuhtod",
	"fuhtos",
	"fuitod",
	"fuitos",
	"fultod",
	"fultos",
	"hlt",
	"hvc",
	"isb",
	"it",
	"ite",
	"itee",
	"iteee",
	"iteet",
	"itet",
	"itete",
	"itett",
	"itt",
	"itte",
	"ittee",
	"ittet",
	"ittt",
	"ittte",
	"itttt",
	"lctp",
	"lda",
	"ldab",
	"ldaex",
	"ldaexb",
	"ldaexd",
	"ldaexh",
	"ldah",
	"ldc",
	"ldc2",
	"ldc2l",
	"ldcl",
	"ldm",
	"ldmda",
	"ldmdb",
	"ldmea",
	"ldmed",
	"ldmfa",
	"ldmfd",
	"ldmia",
	"ldmib",
	"ldr",
	"ldrb",
	"ldrbt",
	"ldrd",
	"ldrex",
	"ldrexb",
	"ldrexd",
	"ldrexh",
	"ldrh",
	"ldrht",
	"ldrsb",
	"ldrsbt",
	"ldrsh",
	"ldrsht",
	"ldrt",
	"ldsb",
	"ldsh",
	"le",
	"letp",
	"lsl",
	"lsll",
	"lsls",
	"lsr",
	"lsrl",
	"lsrs",
	"mar",
	"mcr",
	"mcr2",
	"mcrr",
	"mcrr2",
	"mia",
	"miabb",
	"miabt",
	"miaph",
	"miatb",
	"miatt",
	"mla",
	"mlas",
	"mls",
	"mov",
	"movs",
	"movt",
	"movw",
	"mra",
	"mrc",
	"mrc2",
	"mrrc",
	"mrrc2",
	"mrs",
	"msr",
	"mul",
	"muls",
	"mvn",
	"mvns",
	"neg",
	"negs",
	"nop",
	"orn",
	"orns",
	"orr",
	"orrs",
	"pac",
	"pacbti",
	"pacg",
	"pkhbt",
	"pkhtb",
	"pld",
	"pldw",
	"pli",
	"pop",
	"pssbb",
	"push",
	"qadd",
	"qadd16",
	"qadd8",
	"qaddsubx",
	"qasx",
	"qdadd",
	"qdsub",
	"qsax",
	"qsub",
	"qsub16",
	"qsub8",
	"qsubaddx",
	"rbit",
	"rev",
	"rev16",
	"revsh",
	"rfe",
	"rfeda",
	"rfedb",
	"rfeea",
	"rfeed",
	"rfefa",
	"rfefd",
	"rfeia",
	"rfeib",
	"ror",
	"rors",
	"rrx",
	"rrxs",
	"rsb",
	"rsbs",
	"rsc",
	"rscs",
	"sadd16",
	"sadd8",
	"saddsubx",
	"sasx",
	"sb",
	"sbc",
	"sbcs",
	"sbfx",
	"sdiv",
	"sel",
	"setend",
	"setpan",
	"sev",
	"sevl",
	"sg",
	"sha1c",
	"sha1h",
	"sha1m",
	"sha1p",
	"sha1su0",
	"sha1su1",
	"sha256h",
	"sha256h2",
	"sha256su0",
	"sha256su1",
	"shadd16",
	"shadd8",
	"shaddsubx",
	"shasx",
	"shsax",
	"shsub16",
	"shsub8",
	"shsubaddx",
	"smc",
	"smlabb",
	"smlabt",
	"smlad",
	"smladx",
	"smlal",
	"smlalbb",
	"smlalbt",
	"smlald",
	"smlaldx",
	"smlaltb",
	"smlaltt",
	"smlatb",
	"smlatt",
	"smlawb",
	"smlawt",
	"smlsd",
	"smlsdx",
	"smlsld",
	"smlsldx",
	"smmla",
	"smmlar",
	"smmls",
	"smmlsr",
	"smmul",
	"smmulr",
	"smuad",
	"smuadx",
	"smulbb",
	"smulbt",
	"smull",
	"smultb",
	"smultt",
	"smulwb",
	"smulwt",
	"smusd",
	"smusdx",
	"sqrshr",
	"sqrshrl",
	"sqshl",
	"sqshll",
	"srs",
	"srsda",
	"srsdb",
	"srsea",
	"srsed",
	"srsfa",
	"srsfd",
	"srshr",
	"srshrl",
	"srsia",
	"srsib",
	"ssat",
	"ssat16",
	"ssax",
	"ssbb",
	"ssub16",
	"ssub8",
	"ssubaddx",
	"stc",
	"stc2",
	"stc2l",
	"stcl",
	"stl",
	"stlb",
	"stlex",
	"stlexb",
	"stlexd",
	"stlexh",
	"stlh",
	"stm",
	"stmda",
	"stmdb",
	"stmea",
	"stmed",
	"stmfa",
	"stmfd",
	"stmia",
	"stmib",
	"str",
	"strb",
	"strbt",
	"strd",
	"strex",
	"strexb",
	"strexd",
	"strexh",
	"strh",
	"strht",
	"strt",
	"sub",
	"subs",
	"subw",
	"svc",
	"swi",
	"swp",
	"swpb",
	"sxtab",
	"sxtab16",
	"sxtah",
	"sxtb",
	"sxtb16",
	"sxth",
	"tandcb",
	"tandch",
	"tandcw",
	"tbb",
	"tbcstb",
	"tbcsth",
	"tbcstw",
	"tbh",
	"teq",
	"teqp",
	"teqs",
	"textrcb",
	"textrch",
	"textrcw",
	"textrmsb",
	"textrmsh",
	"textrmsw",
	"textrmub",
	"textrmuh",
	"textrmuw",
	"tinsrb",
	"tinsrh",
	"tinsrw",
	"tmcr",
	"tmcrr",
	"tmia",
	"tmiabb",
	"tmiabt",
	"tmiaph",
	"tmiatb",
	"tmiatt",
	"tmovmskb",
	"tmovmskh",
	"tmovmskw",
	"tmrc",
	"tmrrc",
	"torcb",
	"torch",
	"torcw",
	"torvscb",
	"torvsch",
	"torvscw",
	"tst",
	"tstp",
	"tsts",
	"tt",
	"tta",
	"ttat",
	"ttt",
	"uadd16",
	"uadd8",
	"uaddsubx",
	"uasx",
	"ubfx",
	"udf",
	"udiv",
	"uhadd16",
	"uhadd8",
	"uhaddsubx",
	"uhasx",
	"uhsax",
	"uhsub16",
	"uhsub8",
	"uhsubaddx",
	"umaal",
	"umlal",
	"umull",
	"uqadd16",
	"uqadd8",
	"uqaddsubx",
	"uqasx",
	"uqrshl",
	"uqrshll",
	"uqsax",
	"uqshl",
	"uqshll",
	"uqsub16",
	"uqsub8",
	"uqsubaddx",
	"urshr",
	"urshrl",
	"usad8",
	"usada8",
	"usat",
	"usat16",
	"usax",
	"usub16",
	"usub8",
	"usubaddx",
	"uxtab",
	"uxtab16",
	"uxtah",
	"uxtb",
	"uxtb16",
	"uxth",
	"vaba",
	"vabal",
	"vabaq",
	"vabav",
	"vabd",
	"vabdl",
	"vabdq",
	"vabs",
	"vabsq",
	"vacge",
	"vacgeq",
	"vacgt",
	"vacgtq",
	"vacle",
	"vacleq",
	"vaclt",
	"vacltq",
	"vadc",
	"vadci",
	"vadd",
	"vaddhn",
	"vaddl",
	"vaddlv",
	"vaddlva",
	"vaddq",
	"vaddv",
	"vaddva",
	"vaddw",
	"vand",
	"vandq",
	"vbic",
	"vbicq",
	"vbif",
	"vbifq",
	"vbit",
	"vbitq",
	"vbrsr",
	"vbsl",
	"vbslq",
	"vcadd",
	"vceq",
	"vceqq",
	"vcge",
	"vcgeq",
	"vcgt",
	"vcgtq",
	"vcle",
	"vcleq",
	"vcls",
	"vclsq",
	"vclt",
	"vcltq",
	"vclz",
	"vclzq",
	"vcmla",
	"vcmp",
	"vcmpe",
	"vcmul",
	"vcnt",
	"vcntq",
	"vctp",
	"vcvt",
	"vcvta",
	"vcvtb",
	"vcvtm",
	"vcvtn",
	"vcvtp",
	"vcvtq",
	"vcvtr",
	"vcvtt",
	"vcvtz",
	"vcx1",
	"vcx1a",
	"vcx2",
	"vcx2a",
	"vcx3",
	"vcx3a",
	"vddup",
	"vdiv",
	"vdot",
	"vdup",
	"vdupq",
	"vdwdup",
	"veor",
	"veorq",
	"vext",
	"vextq",
	"vfma",
	"vfmab",
	"vfmal",
	"vfmas",
	"vfmat",
	"vfms",
	"vfmsl",
	"vfnma",
	"vfnms",
	"vhadd",
	"vhaddq",
	"vhcadd",
	"vhsub",
	"vhsubq",
	"vidup",
	"vins",
	"viwdup",
	"vjcvt",
	"vld1",
	"vld2",
	"vld20",
	"vld21",
	"vld3",
	"vld4",
	"vld40",
	"vld41",
	"vld42",
	"vld43",
	"vldm",
	"vldmdb",
	"vldmia",
	"vldr",
	"vldrb",
	"vldrd",
	"vldrh",
	"vldrw",
	"vlldm",
	"vlstm",
	"vmax",
	"vmaxa",
	"vmaxav",
	"vmaxnm",
	"vmaxnma",
	"vmaxnmav",
	"vmaxnmv",
	"vmaxq",
	"vmaxv",
	"vmin",
	"vmina",
	"vminav",
	"vminnm",
	"vminnma",
	"vminnmav",
	"vminnmv",
	"vminq",
	"vminv",
	"vmla",
	"vmladav",
	"vmladava",
	"vmladavax",
	"vmladavx",
	"vmlal",
	"vmlaldav",
	"vmlaldava",
	"vmlaldavax",
	"vmlaldavx",
	"vmlalv",
	"vmlalva",
	"vmlaq",
	"vmlas",
	"vmlav",
	"vmlava",
	"vmls",
	"vmlsdav",
	"vmlsdava",
	"vmlsdavax",
	"vmlsdavx",
	"vmlsl",
	"vmlsldav",
	"vmlsldava",
	"vmlsldavax",
	"vmlsldavx",
	"vmlsq",
	"vmmla",
	"vmov",
	"vmovl",
	"vmovlb",
	"vmovlt",
	"vmovn",
	"vmovnb",
	"vmovnt",
	"vmovq",
	"vmovx",
	"vmrs",
	"vmsr",
	"vmul",
	"vmulh",
	"vmull",
	"vmullb",
	"vmullt",
	"vmulq",
	"vmvn",
	"vmvnq",
	"vneg",
	"vnegq",
	"vnmla",
	"vnmls",
	"vnmul",
	"vorn",
	"vornq",
	"vorr",
	"vorrq",
	"vpadal",
	"vpadalq",
	"vpadd",
	"vpaddl",
	"vpaddlq",
	"vpmax",
	"vpmin",
	"vpnot",
	"vpop",
	"vpsel",
	"vpst",
	"vpste",
	"vpstee",
	"vpsteee",
	"vpsteet",
	"vpstet",
	"vpstete",
	"vpstett",
	"vpstt",
	"vpstte",
	"vpsttee",
	"vpsttet",
	"vpsttt",
	"vpsttte",
	"vpstttt",
	"vpt",
	"vpte",
	"vptee",
	"vpteee",
	"vpteet",
	"vptet",
	"vptete",
	"vptett",
	"vptt",
	"vptte",
	"vpttee",
	"vpttet",
	"vpttt",
	"vpttte",
	"vptttt",
	"vpush",
	"vqabs",
	"vqabsq",
	"vqadd",
	"vqaddq",
	"vqdmladh",
	"vqdmladhx",
	"vqdmlah",
	"vqdmlal",
	"vqdmlash",
	"vqdmlsdh",
	"vqdmlsdhx",
	"vqdmlsl",
	"vqdmulh",
	"vqdmulhq",
	"vqdmull",
	"vqdmullb",
	"vqdmullt",
	"vqmovn",
	"vqmovnb",
	"vqmovnt",
	"vqmovun",
	"vqmovunb",
	"vqmovunt",
	"vqneg",
	"vqnegq",
	"vqrdmladh",
	"vqrdmladhx",
	"vqrdmlah",
	"vqrdmlahq",
	"vqrdmlash",
	"vqrdmlsdh",
	"vqrdmlsdhx",
	"vqrdmlsh",
	"vqrdmlshq",
	"vqrdmulh",
	"vqrdmulhq",
	"vqrshl",
	"vqrshlq",
	"vqrshrn",
	"vqrshrnb",
	"vqrshrnt",
	"vqrshrun",
	"vqrshrunb",
	"vqrshrunt",
	"vqshl",
	"vqshlq",
	"vqshlu",
	"vqshluq",
	"vqshrn",
	"vqshrnb",
	"vqshrnt",
	"vqshrun",
	"vqshrunb",
	"vqshrunt",
	"vqsub",
	"vqsubq",
	"vraddhn",
	"vrecpe",
	"vrecpeq",
	"vrecps",
	"vrecpsq",
	"vrev16",
	"vrev16q",
	"vrev32",
	"vrev32q",
	"vrev64",
	"vrev64q",
	"vrhadd",
	"vrhaddq",
	"vrinta",
	"vrintm",
	"vrintn",
	"vrintp",
	"vrintr",
	"vrintx",
	"vrintz",
	"vrmlaldavh",
	"vrmlaldavha",
	"vrmlaldavhax",
	"vrmlaldavhx",
	"vrmlalvh",
	"vrmlalvha",
	"vrmlsldavh",
	"vrmlsldavha",
	"vrmlsldavhax",
	"vrmlsldavhx",
	"vrmulh",
	"vrshl",
	"vrshlq",
	"vrshr",
	"vrshrn",
	"vrshrnb",
	"vrshrnt",
	"vrshrq",
	"vrsqrte",
	"vrsqrteq",
	"vrsqrts",
	"vrsqrtsq",
	"vrsra",
	"vrsraq",
	"vrsubhn",
	"vsbc",
	"vsbci",
	"vscclrm",
	"vsdot",
	"vseleq",
	"vselge",
	"vselgt",
	"vselvs",
	"vshl",
	"vshlc",
	"vshll",
	"vshllb",
	"vshllt",
	"vshlq",
	"vshr",
	"vshrn",
	"vshrnb",
	"vshrnt",
	"vshrq",
	"vsli",
	"vsliq",
	"vsmmla",
	"vsqrt",
	"vsra",
	"vsraq",
	"vsri",
	"vsriq",
	"vst1",
	"vst2",
	"vst20",
	"vst21",
	"vst3",
	"vst4",
	"vst40",
	"vst41",
	"vst42",
	"vst43",
	"vstm",
	"vstmdb",
	"vstmia",
	"vstr",
	"vstrb",
	"vstrd",
	"vstrh",
	"vstrw",
	"vsub",
	"vsubhn",
	"vsubl",
	"vsubq",
	"vsubw",
	"vsudot",
	"vswp",
	"vswpq",
	"vtbl",
	"vtbx",
	"vtrn",
	"vtrnq",
	"vtst",
	"vtstq",
	"vudot",
	"vummla",
	"vusdot",
	"vusmmla",
	"vuzp",
	"vuzpq",
	"vzip",
	"vzipq",
	"wabsb",
	"wabsdiffb",
	"wabsdiffh",
	"wabsdiffw",
	"wabsh",
	"wabsw",
	"waccb",
	"wacch",
	"waccw",
	"waddb",
	"waddbhusl",
	"waddbhusm",
	"waddbss",
	"waddbus",
	"waddh",
	"waddhc",
	"waddhss",
	"waddhus",
	"waddsubhx",
	"waddw",
	"waddwc",
	"waddwss",
	"waddwus",
	"waligni",
	"walignr0",
	"walignr1",
	"walignr2",
	"walignr3",
	"wand",
	"wandn",
	"wavg2b",
	"wavg2br",
	"wavg2h",
	"wavg2hr",
	"wavg4",
	"wavg4r",
	"wcmpeqb",
	"wcmpeqh",
	"wcmpeqw",
	"wcmpgtsb",
	"wcmpgtsh",
	"wcmpgtsw",
	"wcmpgtub",
	"wcmpgtuh",
	"wcmpgtuw",
	"wfe",
	"wfi",
	"wldrb",
	"wldrd",
	"wldrh",
	"wldrw",
	"wls",
	"wlstp",
	"wmacs",
	"wmacsz",
	"wmacu",
	"wmacuz",
	"wmadds",
	"wmaddsn",
	"wmaddsx",
	"wmaddu",
	"wmaddun",
	"wmaddux",
	"wmaxsb",
	"wmaxsh",
	"wmaxsw",
	"wmaxub",
	"wmaxuh",
	"wmaxuw",
	"wmerge",
	"wmiabb",
	"wmiabbn",
	"wmiabt",
	"wmiabtn",
	"wmiatb",
	"wmiatbn",
	"wmiatt",
	"wmiattn",
	"wmiawbb",
	"wmiawbbn",
	"wmiawbt",
	"wmiawbtn",
	"wmiawtb",
	"wmiawtbn",
	"wmiawtt",
	"wmiawttn",
	"wminsb",
	"wminsh",
	"wminsw",
	"wminub",
	"wminuh",
	"wminuw",
	"wmov",
	"wmulsl",
	"wmulsm",
	"wmulsmr",
	"wmulul",
	"wmulum",
	"wmulumr",
	"wmulwl",
	"wmulwsm",
	"wmulwsmr",
	"wmulwum",
	"wmulwumr",
	"wor",
	"wpackdss",
	"wpackdus",
	"wpackhss",
	"wpackhus",
	"wpackwss",
	"wpackwus",
	"wqmiabb",
	"wqmiabbn",
	"wqmiabt",
	"wqmiabtn",
	"wqmiatb",
	"wqmiatbn",
	"wqmiatt",
	"wqmiattn",
	"wqmulm",
	"wqmulmr",
	"wqmulwm",
	"wqmulwmr",
	"wrord",
	"wrordg",
	"wrorh",
	"wrorhg",
	"wrorw",
	"wrorwg",
	"wsadb",
	"wsadbz",
	"wsadh",
	"wsadhz",
	"wshufh",
	"wslld",
	"wslldg",
	"wsllh",
	"wsllhg",
	"wsllw",
	"wsllwg",
	"wsrad",
	"wsradg",
	"wsrah",
	"wsrahg",
	"wsraw",
	"wsrawg",
	"wsrld",
	"wsrldg",
	"wsrlh",
	"wsrlhg",
	"wsrlw",
	"wsrlwg",
	"wstrb",
	"wstrd",
	"wstrh",
	"wstrw",
	"wsubaddhx",
	"wsubb",
	"wsubbss",
	"wsubbus",
	"wsubh",
	"wsubhss",
	"wsubhus",
	"wsubw",
	"wsubwss",
	"wsubwus",
	"wunpckehsb",
	"wunpckehsh",
	"wunpckehsw",
	"wunpckehub",
	"wunpckehuh",
	"wunpckehuw",
	"wunpckelsb",
	"wunpckelsh",
	"wunpckelsw",
	"wunpckelub",
	"wunpckeluh",
	"wunpckeluw",
	"wunpckihb",
	"wunpckihh",
	"wunpckihw",
	"wunpckilb",
	"wunpckilh",
	"wunpckilw",
	"wxor",
	"wzero",
	"yield",
}

local conditional_suffix_instructions = {
	"adc",
	"add",
	"addw",
	"adr",
	"and",
	"asr",
	"asrl",
	"b",
	"bf",
	"bfc",
	"bfi",
	"bfl",
	"bflx",
	"bfx",
	"bic",
	"bl",
	"blx",
	"blxns",
	"bx",
	"bxj",
	"bxns",
	"cdp",
	"cfprctx",
	"clrm",
	"clz",
	"cmn",
	"cmp",
	"cpprctx",
	"cpy",
	"cx1",
	"cx1a",
	"cx1d",
	"cx1da",
	"cx2",
	"cx2a",
	"cx2d",
	"cx2da",
	"cx3",
	"cx3a",
	"cx3d",
	"cx3da",
	"dbg",
	"dvprctx",
	"eor",
	"eret",
	"fabsd",
	"fabss",
	"faddd",
	"fadds",
	"fcmpd",
	"fcmped",
	"fcmpes",
	"fcmpezd",
	"fcmpezs",
	"fcmps",
	"fcmpzd",
	"fcmpzs",
	"fconstd",
	"fconsts",
	"fcpyd",
	"fcpys",
	"fcvtds",
	"fcvtsd",
	"fdivd",
	"fdivs",
	"ffmad",
	"ffmas",
	"ffnmad",
	"ffnmas",
	"fldd",
	"fldmdbd",
	"fldmdbs",
	"fldmdbx",
	"fldmead",
	"fldmeas",
	"fldmeax",
	"fldmfdd",
	"fldmfds",
	"fldmfdx",
	"fldmiad",
	"fldmias",
	"fldmiax",
	"flds",
	"fmacd",
	"fmacs",
	"fmdhr",
	"fmdlr",
	"fmdrr",
	"fmrdh",
	"fmrdl",
	"fmrrd",
	"fmrrs",
	"fmrs",
	"fmrx",
	"fmscd",
	"fmscs",
	"fmsr",
	"fmsrr",
	"fmstat",
	"fmuld",
	"fmuls",
	"fmxr",
	"fnegd",
	"fnegs",
	"fnmacd",
	"fnmacs",
	"fnmscd",
	"fnmscs",
	"fnmuld",
	"fnmuls",
	"fshtod",
	"fshtos",
	"fsitod",
	"fsitos",
	"fsltod",
	"fsltos",
	"fsqrtd",
	"fsqrts",
	"fstd",
	"fstmdbd",
	"fstmdbs",
	"fstmdbx",
	"fstmead",
	"fstmeas",
	"fstmeax",
	"fstmfdd",
	"fstmfds",
	"fstmfdx",
	"fstmiad",
	"fstmias",
	"fstmiax",
	"fsts",
	"fsubd",
	"fsubs",
	"ftoshd",
	"ftoshs",
	"ftosid",
	"ftosis",
	"ftosizd",
	"ftosizs",
	"ftosld",
	"ftosls",
	"ftouhd",
	"ftouhs",
	"ftouid",
	"ftouis",
	"ftouizd",
	"ftouizs",
	"ftould",
	"ftouls",
	"fuhtod",
	"fuhtos",
	"fuitod",
	"fuitos",
	"fultod",
	"fultos",
	"hvc",
	"lda",
	"ldab",
	"ldaex",
	"ldaexb",
	"ldaexd",
	"ldaexh",
	"ldah",
	"ldc",
	"ldm",
	"ldr",
	"ldrex",
	"ldrexb",
	"ldrexd",
	"ldrexh",
	"lsl",
	"lsll",
	"lsr",
	"lsrl",
	"mar",
	"mcr",
	"mcrr",
	"mia",
	"miabb",
	"miabt",
	"miaph",
	"miatb",
	"miatt",
	"mla",
	"mls",
	"mov",
	"movt",
	"movw",
	"mra",
	"mrc",
	"mrrc",
	"mrs",
	"msr",
	"mul",
	"mvn",
	"neg",
	"nop",
	"orn",
	"orns",
	"orr",
	"pkhbt",
	"pkhtb",
	"pop",
	"push",
	"qadd",
	"qadd16",
	"qadd8",
	"qaddsubx",
	"qasx",
	"qdadd",
	"qdsub",
	"qsax",
	"qsub",
	"qsub16",
	"qsub8",
	"qsubaddx",
	"rbit",
	"rev",
	"rev16",
	"revsh",
	"ror",
	"rsb",
	"rsc",
	"sadd16",
	"sadd8",
	"saddsubx",
	"sasx",
	"sbc",
	"sbfx",
	"sdiv",
	"sel",
	"sev",
	"sevl",
	"shadd16",
	"shadd8",
	"shaddsubx",
	"shasx",
	"shsax",
	"shsub16",
	"shsub8",
	"shsubaddx",
	"smc",
	"smlabb",
	"smlabt",
	"smlad",
	"smladx",
	"smlal",
	"smlalbb",
	"smlalbt",
	"smlald",
	"smlaldx",
	"smlaltb",
	"smlaltt",
	"smlatb",
	"smlatt",
	"smlawb",
	"smlawt",
	"smlsd",
	"smlsdx",
	"smlsld",
	"smlsldx",
	"smmla",
	"smmlar",
	"smmls",
	"smmlsr",
	"smmul",
	"smmulr",
	"smuad",
	"smuadx",
	"smulbb",
	"smulbt",
	"smull",
	"smultb",
	"smultt",
	"smulwb",
	"smulwt",
	"smusd",
	"smusdx",
	"sqrshr",
	"sqrshrl",
	"sqshl",
	"sqshll",
	"srshr",
	"srshrl",
	"ssat",
	"ssat16",
	"ssax",
	"ssub16",
	"ssub8",
	"ssubaddx",
	"stc",
	"stl",
	"stlb",
	"stlex",
	"stlexb",
	"stlexd",
	"stlexh",
	"stlh",
	"stm",
	"str",
	"strex",
	"strexb",
	"strexd",
	"strexh",
	"sub",
	"subw",
	"svc",
	"swi",
	"swp",
	"sxtab",
	"sxtab16",
	"sxtah",
	"sxtb",
	"sxtb16",
	"sxth",
	"tandcb",
	"tandch",
	"tandcw",
	"tbb",
	"tbcstb",
	"tbcsth",
	"tbcstw",
	"tbh",
	"teq",
	"textrcb",
	"textrch",
	"textrcw",
	"textrmsb",
	"textrmsh",
	"textrmsw",
	"textrmub",
	"textrmuh",
	"textrmuw",
	"tinsrb",
	"tinsrh",
	"tinsrw",
	"tmcr",
	"tmcrr",
	"tmia",
	"tmiabb",
	"tmiabt",
	"tmiaph",
	"tmiatb",
	"tmiatt",
	"tmovmskb",
	"tmovmskh",
	"tmovmskw",
	"tmrc",
	"tmrrc",
	"torcb",
	"torch",
	"torcw",
	"torvscb",
	"torvsch",
	"torvscw",
	"tst",
	"tt",
	"tta",
	"ttat",
	"ttt",
	"uadd16",
	"uadd8",
	"uaddsubx",
	"uasx",
	"ubfx",
	"udf",
	"udiv",
	"uhadd16",
	"uhadd8",
	"uhaddsubx",
	"uhasx",
	"uhsax",
	"uhsub16",
	"uhsub8",
	"uhsubaddx",
	"umaal",
	"umlal",
	"umull",
	"uqadd16",
	"uqadd8",
	"uqaddsubx",
	"uqasx",
	"uqrshl",
	"uqrshll",
	"uqsax",
	"uqshl",
	"uqshll",
	"uqsub16",
	"uqsub8",
	"uqsubaddx",
	"urshr",
	"urshrl",
	"usad8",
	"usada8",
	"usat",
	"usat16",
	"usax",
	"usub16",
	"usub8",
	"usubaddx",
	"uxtab",
	"uxtab16",
	"uxtah",
	"uxtb",
	"uxtb16",
	"uxth",
	"vabav",
	"vabs",
	"vadc",
	"vadci",
	"vadd",
	"vaddlv",
	"vaddlva",
	"vaddv",
	"vaddva",
	"vbrsr",
	"vcmp",
	"vcmpe",
	"vcmul",
	"vctp",
	"vcvt",
	"vcvtb",
	"vcvtr",
	"vcvtt",
	"vcvtz",
	"vcx1",
	"vcx1a",
	"vcx2",
	"vcx2a",
	"vcx3",
	"vcx3a",
	"vddup",
	"vdiv",
	"vdup",
	"vdupq",
	"vdwdup",
	"vfma",
	"vfmas",
	"vfms",
	"vfnma",
	"vfnms",
	"vhcadd",
	"vidup",
	"vins",
	"viwdup",
	"vjcvt",
	"vld20",
	"vld21",
	"vld40",
	"vld41",
	"vld42",
	"vld43",
	"vldm",
	"vldmdb",
	"vldmia",
	"vldr",
	"vldrb",
	"vldrd",
	"vldrh",
	"vldrw",
	"vlldm",
	"vlstm",
	"vmaxa",
	"vmaxav",
	"vmaxnma",
	"vmaxnmav",
	"vmaxnmv",
	"vmaxv",
	"vmina",
	"vminav",
	"vminnma",
	"vminnmav",
	"vminnmv",
	"vminv",
	"vmla",
	"vmladav",
	"vmladava",
	"vmladavax",
	"vmladavx",
	"vmlaldav",
	"vmlaldava",
	"vmlaldavax",
	"vmlaldavx",
	"vmlalv",
	"vmlalva",
	"vmlas",
	"vmlav",
	"vmlava",
	"vmls",
	"vmlsdav",
	"vmlsdava",
	"vmlsdavax",
	"vmlsdavx",
	"vmlsldav",
	"vmlsldava",
	"vmlsldavax",
	"vmlsldavx",
	"vmov",
	"vmovlb",
	"vmovlt",
	"vmovnb",
	"vmovnt",
	"vmovq",
	"vmovx",
	"vmrs",
	"vmsr",
	"vmul",
	"vmulh",
	"vmullb",
	"vmullt",
	"vneg",
	"vnmla",
	"vnmls",
	"vnmul",
	"vpnot",
	"vpop",
	"vpsel",
	"vpst",
	"vpste",
	"vpstee",
	"vpsteee",
	"vpsteet",
	"vpstet",
	"vpstete",
	"vpstett",
	"vpstt",
	"vpstte",
	"vpsttee",
	"vpsttet",
	"vpsttt",
	"vpsttte",
	"vpstttt",
	"vpt",
	"vpte",
	"vptee",
	"vpteee",
	"vpteet",
	"vptet",
	"vptete",
	"vptett",
	"vptt",
	"vptte",
	"vpttee",
	"vpttet",
	"vpttt",
	"vpttte",
	"vptttt",
	"vpush",
	"vqdmladh",
	"vqdmladhx",
	"vqdmlah",
	"vqdmlash",
	"vqdmlsdh",
	"vqdmlsdhx",
	"vqdmullb",
	"vqdmullt",
	"vqmovnb",
	"vqmovnt",
	"vqmovunb",
	"vqmovunt",
	"vqrdmladh",
	"vqrdmladhx",
	"vqrdmlash",
	"vqrdmlsdh",
	"vqrdmlsdhx",
	"vqrshrnb",
	"vqrshrnt",
	"vqrshrunb",
	"vqrshrunt",
	"vqshrnb",
	"vqshrnt",
	"vqshrunb",
	"vqshrunt",
	"vrintr",
	"vrintx",
	"vrintz",
	"vrmlaldavh",
	"vrmlaldavha",
	"vrmlaldavhax",
	"vrmlaldavhx",
	"vrmlalvh",
	"vrmlalvha",
	"vrmlsldavh",
	"vrmlsldavha",
	"vrmlsldavhax",
	"vrmlsldavhx",
	"vrmulh",
	"vrshrnb",
	"vrshrnt",
	"vsbc",
	"vsbci",
	"vscclrm",
	"vshlc",
	"vshllb",
	"vshllt",
	"vshrnb",
	"vshrnt",
	"vsqrt",
	"vst20",
	"vst21",
	"vst40",
	"vst41",
	"vst42",
	"vst43",
	"vstm",
	"vstmdb",
	"vstmia",
	"vstr",
	"vstrb",
	"vstrd",
	"vstrh",
	"vstrw",
	"vsub",
	"wabsb",
	"wabsdiffb",
	"wabsdiffh",
	"wabsdiffw",
	"wabsh",
	"wabsw",
	"waccb",
	"wacch",
	"waccw",
	"waddb",
	"waddbhusl",
	"waddbhusm",
	"waddbss",
	"waddbus",
	"waddh",
	"waddhc",
	"waddhss",
	"waddhus",
	"waddsubhx",
	"waddw",
	"waddwc",
	"waddwss",
	"waddwus",
	"waligni",
	"walignr0",
	"walignr1",
	"walignr2",
	"walignr3",
	"wand",
	"wandn",
	"wavg2b",
	"wavg2br",
	"wavg2h",
	"wavg2hr",
	"wavg4",
	"wavg4r",
	"wcmpeqb",
	"wcmpeqh",
	"wcmpeqw",
	"wcmpgtsb",
	"wcmpgtsh",
	"wcmpgtsw",
	"wcmpgtub",
	"wcmpgtuh",
	"wcmpgtuw",
	"wfe",
	"wfi",
	"wldrb",
	"wldrd",
	"wldrh",
	"wldrw",
	"wmacs",
	"wmacsz",
	"wmacu",
	"wmacuz",
	"wmadds",
	"wmaddsn",
	"wmaddsx",
	"wmaddu",
	"wmaddun",
	"wmaddux",
	"wmaxsb",
	"wmaxsh",
	"wmaxsw",
	"wmaxub",
	"wmaxuh",
	"wmaxuw",
	"wmerge",
	"wmiabb",
	"wmiabbn",
	"wmiabt",
	"wmiabtn",
	"wmiatb",
	"wmiatbn",
	"wmiatt",
	"wmiattn",
	"wmiawbb",
	"wmiawbbn",
	"wmiawbt",
	"wmiawbtn",
	"wmiawtb",
	"wmiawtbn",
	"wmiawtt",
	"wmiawttn",
	"wminsb",
	"wminsh",
	"wminsw",
	"wminub",
	"wminuh",
	"wminuw",
	"wmov",
	"wmulsl",
	"wmulsm",
	"wmulsmr",
	"wmulul",
	"wmulum",
	"wmulumr",
	"wmulwl",
	"wmulwsm",
	"wmulwsmr",
	"wmulwum",
	"wmulwumr",
	"wor",
	"wpackdss",
	"wpackdus",
	"wpackhss",
	"wpackhus",
	"wpackwss",
	"wpackwus",
	"wqmiabb",
	"wqmiabbn",
	"wqmiabt",
	"wqmiabtn",
	"wqmiatb",
	"wqmiatbn",
	"wqmiatt",
	"wqmiattn",
	"wqmulm",
	"wqmulmr",
	"wqmulwm",
	"wqmulwmr",
	"wrord",
	"wrordg",
	"wrorh",
	"wrorhg",
	"wrorw",
	"wrorwg",
	"wsadb",
	"wsadbz",
	"wsadh",
	"wsadhz",
	"wshufh",
	"wslld",
	"wslldg",
	"wsllh",
	"wsllhg",
	"wsllw",
	"wsllwg",
	"wsrad",
	"wsradg",
	"wsrah",
	"wsrahg",
	"wsraw",
	"wsrawg",
	"wsrld",
	"wsrldg",
	"wsrlh",
	"wsrlhg",
	"wsrlw",
	"wsrlwg",
	"wstrb",
	"wstrd",
	"wstrh",
	"wstrw",
	"wsubaddhx",
	"wsubb",
	"wsubbss",
	"wsubbus",
	"wsubh",
	"wsubhss",
	"wsubhus",
	"wsubw",
	"wsubwss",
	"wsubwus",
	"wunpckehsb",
	"wunpckehsh",
	"wunpckehsw",
	"wunpckehub",
	"wunpckehuh",
	"wunpckehuw",
	"wunpckelsb",
	"wunpckelsh",
	"wunpckelsw",
	"wunpckelub",
	"wunpckeluh",
	"wunpckeluw",
	"wunpckihb",
	"wunpckihh",
	"wunpckihw",
	"wunpckilb",
	"wunpckilh",
	"wunpckilw",
	"wxor",
	"wzero",
	"yield",
}

local conditional_infix_instructions = {
	"adcs",
	"adds",
	"adrl",
	"ands",
	"asrs",
	"bics",
	"cmnp",
	"cmns",
	"cmpp",
	"cmps",
	"eors",
	"ldcl",
	"ldmda",
	"ldmdb",
	"ldmea",
	"ldmed",
	"ldmfa",
	"ldmfd",
	"ldmia",
	"ldmib",
	"ldrb",
	"ldrbt",
	"ldrd",
	"ldrh",
	"ldrht",
	"ldrsb",
	"ldrsbt",
	"ldrsh",
	"ldrsht",
	"ldrt",
	"ldsb",
	"ldsh",
	"lsls",
	"lsrs",
	"mlas",
	"movs",
	"muls",
	"mvns",
	"negs",
	"orrs",
	"rors",
	"rrx",
	"rrxs",
	"rsbs",
	"rscs",
	"sbcs",
	"stcl",
	"stmda",
	"stmdb",
	"stmea",
	"stmed",
	"stmfa",
	"stmfd",
	"stmia",
	"stmib",
	"strb",
	"strbt",
	"strd",
	"strh",
	"strht",
	"strt",
	"subs",
	"swpb",
	"teqp",
	"teqs",
	"tstp",
	"tsts",
}

local conditional_odd_instructions = {
	"smlal",
	"smull",
	"umlal",
	"umull",
}

local condition_codes = {
	"al",
	"cc",
	"cs",
	"eq",
	"ge",
	"gt",
	"hi",
	"hs",
	"le",
	"lo",
	"ls",
	"lt",
	"mi",
	"ne",
	"pl",
	"ul",
	"vc",
	"vs",
}

local registers = {
	"a1",
	"a2",
	"a3",
	"a4",
	"acc0",
	"apsr",
	"basepri",
	"basepri_max",
	"basepri_ns",
	"c0",
	"c1",
	"c10",
	"c11",
	"c12",
	"c13",
	"c14",
	"c15",
	"c2",
	"c3",
	"c4",
	"c5",
	"c6",
	"c7",
	"c8",
	"c9",
	"control",
	"control_ns",
	"cpsr",
	"cr0",
	"cr1",
	"cr10",
	"cr11",
	"cr12",
	"cr13",
	"cr14",
	"cr15",
	"cr2",
	"cr3",
	"cr4",
	"cr5",
	"cr6",
	"cr7",
	"cr8",
	"cr9",
	"d0",
	"d1",
	"d10",
	"d11",
	"d12",
	"d13",
	"d14",
	"d15",
	"d16",
	"d17",
	"d18",
	"d19",
	"d2",
	"d20",
	"d21",
	"d22",
	"d23",
	"d24",
	"d25",
	"d26",
	"d27",
	"d28",
	"d29",
	"d3",
	"d30",
	"d31",
	"d4",
	"d5",
	"d6",
	"d7",
	"d8",
	"d9",
	"eapsr",
	"elr_hyp",
	"epsr",
	"faultmask",
	"faultmask_ns",
	"fp",
	"fpcxt_ns",
	"fpcxt_s",
	"fpcxtns",
	"fpcxts",
	"fpexc",
	"fpinst",
	"fpinst2",
	"fpscr",
	"fpscr_nzcvqc",
	"fpsid",
	"iapsr",
	"iepsr",
	"ip",
	"ipsr",
	"lr",
	"lr_abt",
	"lr_fiq",
	"lr_irq",
	"lr_mon",
	"lr_svc",
	"lr_und",
	"lr_usr",
	"msp",
	"msp_ns",
	"msplim",
	"msplim_ns",
	"mvfr0",
	"mvfr1",
	"mvfr2",
	"p0",
	"p1",
	"p10",
	"p11",
	"p12",
	"p13",
	"p14",
	"p15",
	"p2",
	"p3",
	"p4",
	"p5",
	"p6",
	"p7",
	"p8",
	"p9",
	"pac_key_p_0",
	"pac_key_p_0_ns",
	"pac_key_p_1",
	"pac_key_p_1_ns",
	"pac_key_p_2",
	"pac_key_p_2_ns",
	"pac_key_p_3",
	"pac_key_p_3_ns",
	"pac_key_u_0",
	"pac_key_u_0_ns",
	"pac_key_u_1",
	"pac_key_u_1_ns",
	"pac_key_u_2",
	"pac_key_u_2_ns",
	"pac_key_u_3",
	"pac_key_u_3_ns",
	"pc",
	"primask",
	"primask_ns",
	"psp",
	"psp_ns",
	"psplim",
	"psplim_ns",
	"psr",
	"q0",
	"q1",
	"q10",
	"q11",
	"q12",
	"q13",
	"q14",
	"q15",
	"q2",
	"q3",
	"q4",
	"q5",
	"q6",
	"q7",
	"q8",
	"q9",
	"r0",
	"r1",
	"r10",
	"r10_fiq",
	"r10_usr",
	"r11",
	"r11_fiq",
	"r11_usr",
	"r12",
	"r12_fiq",
	"r12_usr",
	"r13",
	"r14",
	"r15",
	"r2",
	"r3",
	"r4",
	"r5",
	"r6",
	"r7",
	"r8",
	"r8_fiq",
	"r8_usr",
	"r9",
	"r9_fiq",
	"r9_usr",
	"ra_auth_code",
	"s0",
	"s1",
	"s10",
	"s11",
	"s12",
	"s13",
	"s14",
	"s15",
	"s16",
	"s17",
	"s18",
	"s19",
	"s2",
	"s20",
	"s21",
	"s22",
	"s23",
	"s24",
	"s25",
	"s26",
	"s27",
	"s28",
	"s29",
	"s3",
	"s30",
	"s31",
	"s4",
	"s5",
	"s6",
	"s7",
	"s8",
	"s9",
	"sb",
	"sl",
	"sp",
	"sp_abt",
	"sp_fiq",
	"sp_hyp",
	"sp_irq",
	"sp_mon",
	"sp_ns",
	"sp_svc",
	"sp_und",
	"sp_usr",
	"spsr",
	"spsr_abt",
	"spsr_fiq",
	"spsr_hyp",
	"spsr_irq",
	"spsr_mon",
	"spsr_svc",
	"spsr_und",
	"v1",
	"v2",
	"v3",
	"v4",
	"v5",
	"v6",
	"v7",
	"v8",
	"vpr",
	"wcasf",
	"wcgr0",
	"wcgr1",
	"wcgr2",
	"wcgr3",
	"wcid",
	"wcon",
	"wcssf",
	"wr",
	"wr0",
	"wr1",
	"wr10",
	"wr11",
	"wr12",
	"wr13",
	"wr14",
	"wr15",
	"wr2",
	"wr3",
	"wr4",
	"wr5",
	"wr6",
	"wr7",
	"wr8",
	"wr9",
	"xpsr",
	"zr",
}

local directives = {
	".2byte",
	".4byte",
	".8byte",
	".align",
	".arch",
	".arch_extension",
	".arm",
	".asmfunc",
	".bfloat16",
	".cantunwind",
	".code",
	".cpu",
	".dc.d",
	".dc.s",
	".def",
	".dn",
	".double",
	".eabi_attribute",
	".endasmfunc",
	".even",
	".extend",
	".file",
	".float",
	".float16",
	".float16_format",
	".fnend",
	".fnstart",
	".force_thumb",
	".fpu",
	".handlerdata",
	".inst",
	".inst.n",
	".inst.w",
	".ldouble",
	".loc",
	".loc_mark_labels",
	".long",
	".ltorg",
	".movsp",
	".object_arch",
	".packed",
	".pacspval",
	".pad",
	".personality",
	".personalityindex",
	".pool",
	".qn",
	".ref",
	".rel31",
	".req",
	".save",
	".secrel32",
	".setfp",
	".single",
	".syntax",
	".thumb",
	".thumb_func",
	".thumb_set",
	".tlsdescseq",
	".unreq",
	".unwind_raw",
	".vsave",
	".word",
}

local modifiers = {
	"all",
	"asl",
	"asr",
	"c",
	"cf",
	"cfs",
	"cfsx",
	"cfx",
	"cfxs",
	"cs",
	"csf",
	"csfx",
	"csx",
	"csxf",
	"ctl",
	"cx",
	"cxf",
	"cxfs",
	"cxs",
	"cxsf",
	"f",
	"fc",
	"fcs",
	"fcsx",
	"fcx",
	"fcxs",
	"flg",
	"fs",
	"fsc",
	"fscx",
	"fsx",
	"fsxc",
	"fx",
	"fxc",
	"fxcs",
	"fxs",
	"fxsc",
	"ish",
	"ishld",
	"ishst",
	"ld",
	"lsl",
	"lsr",
	"nsh",
	"nshld",
	"nshst",
	"osh",
	"oshld",
	"oshst",
	"ror",
	"rrx",
	"s",
	"sc",
	"scf",
	"scfx",
	"scx",
	"scxf",
	"sf",
	"sfc",
	"sfcx",
	"sfx",
	"sfxc",
	"sh",
	"shst",
	"st",
	"sx",
	"sxc",
	"sxcf",
	"sxf",
	"sxfc",
	"sy",
	"un",
	"unst",
	"uxtw",
	"x",
	"xc",
	"xcf",
	"xcfs",
	"xcs",
	"xcsf",
	"xf",
	"xfc",
	"xfcs",
	"xfs",
	"xfsc",
	"xs",
	"xsc",
	"xscf",
	"xsf",
	"xsfc",
}

--- Add one caseless word to symbol map
-- @param symbols table destination symbol map
-- @param word string reserved word
-- @param token_type string syntax token type
local function add_ci_word(symbols, word, token_type)
	symbols[word] = token_type
	symbols[string.upper(word)] = token_type
end

--- Add one caseless vocabulary group to symbol map
-- @param symbols table destination symbol map
-- @param words table reserved words
-- @param token_type string syntax token type
local function add_ci(symbols, words, token_type)
	for _, word in ipairs(words) do
		add_ci_word(symbols, word, token_type)
	end
end

local symbols = {}

-- Operand names load first so instruction aliases keep instruction role
add_ci(symbols, modifiers, "literal")
add_ci(symbols, registers, "variable")
add_ci(symbols, directives, "keyword")
add_ci(symbols, instructions, "keyword")

-- GNU's opcode table marks only these instructions as accepting trailing conditions
for _, instruction in ipairs(conditional_suffix_instructions) do
	for _, condition in ipairs(condition_codes) do
		add_ci_word(symbols, instruction .. condition, "keyword")
	end
end

-- Flag-setting forms place condition after third mnemonic character
for _, instruction in ipairs(conditional_infix_instructions) do
	for _, condition in ipairs(condition_codes) do
		local conditioned = instruction:sub(1, 3) .. condition .. instruction:sub(4)
		add_ci_word(symbols, conditioned, "keyword")
	end
end

-- Long multiply forms place conditions before trailing 's'
for _, instruction in ipairs(conditional_odd_instructions) do
	add_ci_word(symbols, instruction .. "s", "keyword")
	for _, condition in ipairs(condition_codes) do
		add_ci_word(symbols, instruction .. condition .. "s", "keyword")
	end
end

return symbols
