// Copyright (C) 2012 Zeex
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the "Software"),
// to deal in the Software without restriction, including without limitation
// the rights to use, copy, modify, merge, publish, distribute, sublicense,
// and/or sell copies of the Software, and to permit persons to whom the
// Software is furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
// DEALINGS IN THE SOFTWARE.

#if defined ASM_MACROS_INC
	#endinput
#endif
#define ASM_MACROS_INC

// Only detect ONE space, so you don't need a trailing space on opcodes with no
// parameters. Add a space on the end here incase there wasn't one already.
#define @emit%0\32;%1\10;%3 (asm_emit_haslabel:asm_emit_notlabel:asm_emit_(ctx,%1));

// Detect labels (for jump targets).
#define asm_emit_haslabel:asm_emit_notlabel:asm_emit_(ctx,%1:) AsmEmitLabelStringize AsmEmitLabel:(ctx,%1)
#define asm_emit_notlabel:asm_emit_(ctx,%1) asm_emit_(ctx,%1 )

// Detect jumps to labels, instead of the labels themselves.
#define AsmEmitLabelStringize%0:(ctx,%1\32;%2) asm_emit_%1Label(ctx,%2)
#define AsmEmitLabel:(ctx,%2) (ctx,#%2)

// NOW detect the second space and use it to extract the opcode name.
#define asm_emit_(ctx,%1\32;%2) asm_emit_%1(ctx,%2)

// Finally, detect zero parameters.
#define ctx,) ctx)

// All lower case.
#define asm_emit_add AsmEmitAdd
#define asm_emit_add_c AsmEmitAddC
#define asm_emit_addr_alt AsmEmitAddrAlt
#define asm_emit_addr_pri AsmEmitAddrPri
#define asm_emit_align_alt AsmEmitAlignAlt
#define asm_emit_align_pri AsmEmitAlignPri
#define asm_emit_and AsmEmitAnd
#define asm_emit_bounds AsmEmitBounds
#define asm_emit_break AsmEmitBreak
#define asm_emit_call AsmEmitCall
#define asm_emit_cmps AsmEmitCmps
#define asm_emit_const_alt AsmEmitConstAlt
#define asm_emit_const_pri AsmEmitConstPri
#define asm_emit_dec AsmEmitDec
#define asm_emit_dec_alt AsmEmitDecAlt
#define asm_emit_dec_i AsmEmitDecI
#define asm_emit_dec_pri AsmEmitDecPri
#define asm_emit_dec_s AsmEmitDecS
#define asm_emit_eq AsmEmitEq
#define asm_emit_eq_c_alt AsmEmitEqCAlt
#define asm_emit_eq_c_pri AsmEmitEqCPri
#define asm_emit_fill AsmEmitFill
#define asm_emit_geq AsmEmitGeq
#define asm_emit_grtr AsmEmitGrtr
#define asm_emit_halt AsmEmitHalt
#define asm_emit_heap AsmEmitHeap
#define asm_emit_idxaddr AsmEmitIdxaddr
#define asm_emit_idxaddr_b AsmEmitIdxaddrB
#define asm_emit_inc AsmEmitInc
#define asm_emit_inc_alt AsmEmitIncAlt
#define asm_emit_inc_i AsmEmitIncI
#define asm_emit_inc_pri AsmEmitIncPri
#define asm_emit_inc_s AsmEmitIncS
#define asm_emit_invert AsmEmitInvert
#define asm_emit_jeq AsmEmitJeq
#define asm_emit_jeq_rel AsmEmitJeqRel
#define asm_emit_jgeq AsmEmitJgeq
#define asm_emit_jgeq_rel AsmEmitJgeqRel
#define asm_emit_jgrtr AsmEmitJgrtr
#define asm_emit_jgrtr_rel AsmEmitJgrtrRel
#define asm_emit_jleq AsmEmitJleq
#define asm_emit_jleq_rel AsmEmitJleqRel
#define asm_emit_jless AsmEmitJless
#define asm_emit_jless_rel AsmEmitJlessRel
#define asm_emit_jneq AsmEmitJneq
#define asm_emit_jneq_rel AsmEmitJneqRel
#define asm_emit_jnz AsmEmitJnz
#define asm_emit_jnz_rel AsmEmitJnzRel
#define asm_emit_jsgeq AsmEmitJsgeq
#define asm_emit_jsgeq_rel AsmEmitJsgeqRel
#define asm_emit_jsgrtr AsmEmitJsgrtr
#define asm_emit_jsgrtr_rel AsmEmitJsgrtrRel
#define asm_emit_jsleq AsmEmitJsleq
#define asm_emit_jsleq_rel AsmEmitJsleqRel
#define asm_emit_jsless AsmEmitJsless
#define asm_emit_jsless_rel AsmEmitJslessRel
#define asm_emit_jump AsmEmitJump
#define asm_emit_jump_rel AsmEmitJumpRel
#define asm_emit_jzer AsmEmitJzer
#define asm_emit_jzer_rel AsmEmitJzerRel
#define asm_emit_lctrl AsmEmitLctrl
#define asm_emit_leq AsmEmitLeq
#define asm_emit_less AsmEmitLess
#define asm_emit_lidx AsmEmitLidx
#define asm_emit_lidx_b AsmEmitLidxB
#define asm_emit_load_alt AsmEmitLoadAlt
#define asm_emit_load_i AsmEmitLoadI
#define asm_emit_load_pri AsmEmitLoadPri
#define asm_emit_load_s_alt AsmEmitLoadSAlt
#define asm_emit_load_s_pri AsmEmitLoadSPri
#define asm_emit_lodb_i AsmEmitLodbI
#define asm_emit_lref_alt AsmEmitLrefAlt
#define asm_emit_lref_pri AsmEmitLrefPri
#define asm_emit_lref_s_alt AsmEmitLrefSAlt
#define asm_emit_lref_s_pri AsmEmitLrefSPri
#define asm_emit_move_alt AsmEmitMoveAlt
#define asm_emit_move_pri AsmEmitMovePri
#define asm_emit_movs AsmEmitMovs
#define asm_emit_neg AsmEmitNeg
#define asm_emit_neq AsmEmitNeq
#define asm_emit_nop AsmEmitNop
#define asm_emit_not AsmEmitNot
#define asm_emit_or AsmEmitOr
#define asm_emit_pop_alt AsmEmitPopAlt
#define asm_emit_pop_pri AsmEmitPopPri
#define asm_emit_proc AsmEmitProc
#define asm_emit_push AsmEmitPush
#define asm_emit_push_adr AsmEmitPushAdr
#define asm_emit_push_alt AsmEmitPushAlt
#define asm_emit_push_c AsmEmitPushC
#define asm_emit_push_pri AsmEmitPushPri
#define asm_emit_push_s AsmEmitPushS
#define asm_emit_ret AsmEmitRet
#define asm_emit_retn AsmEmitRetn
#define asm_emit_sctrl AsmEmitSctrl
#define asm_emit_sdiv AsmEmitSdiv
#define asm_emit_sdiv_alt AsmEmitSdivAlt
#define asm_emit_sgeq AsmEmitSgeq
#define asm_emit_sgrtr AsmEmitSgrtr
#define asm_emit_shl AsmEmitShl
#define asm_emit_shl_c_alt AsmEmitShlCAlt
#define asm_emit_shl_c_pri AsmEmitShlCPri
#define asm_emit_shr AsmEmitShr
#define asm_emit_shr_c_alt AsmEmitShrCAlt
#define asm_emit_shr_c_pri AsmEmitShrCPri
#define asm_emit_sign_alt AsmEmitSignAlt
#define asm_emit_sign_pri AsmEmitSignPri
#define asm_emit_sleq AsmEmitSleq
#define asm_emit_sless AsmEmitSless
#define asm_emit_smul AsmEmitSmul
#define asm_emit_smul_c AsmEmitSmulC
#define asm_emit_sref_alt AsmEmitSrefAlt
#define asm_emit_sref_pri AsmEmitSrefPri
#define asm_emit_sref_s_alt AsmEmitSrefSAlt
#define asm_emit_sref_s_pri AsmEmitSrefSPri
#define asm_emit_sshr AsmEmitSshr
#define asm_emit_stack AsmEmitStack
#define asm_emit_stor_alt AsmEmitStorAlt
#define asm_emit_stor_i AsmEmitStorI
#define asm_emit_stor_pri AsmEmitStorPri
#define asm_emit_stor_s_alt AsmEmitStorSAlt
#define asm_emit_stor_s_pri AsmEmitStorSPri
#define asm_emit_strb_i AsmEmitStrbI
#define asm_emit_sub AsmEmitSub
#define asm_emit_sub_alt AsmEmitSubAlt
#define asm_emit_swap_alt AsmEmitSwapAlt
#define asm_emit_swap_pri AsmEmitSwapPri
#define asm_emit_sysreq_c AsmEmitSysreqC
#define asm_emit_sysreq_d AsmEmitSysreqD
#define asm_emit_udiv AsmEmitUdiv
#define asm_emit_udiv_alt AsmEmitUdivAlt
#define asm_emit_umul AsmEmitUmul
#define asm_emit_xchg AsmEmitXchg
#define asm_emit_xor AsmEmitXor
#define asm_emit_zero AsmEmitZero
#define asm_emit_zero_alt AsmEmitZeroAlt
#define asm_emit_zero_pri AsmEmitZeroPri
#define asm_emit_zero_s AsmEmitZeroS
// Custom.
#define asm_emit_sysreq AsmEmitSysreq
#define asm_emit_pop_args AsmEmitPopArgs
#define asm_emit_push_arg AsmEmitPushArg
#define asm_emit_push_num_args AsmEmitPushNumArgs

// All UPPER case.
#define asm_emit_ADD AsmEmitAdd
#define asm_emit_AND AsmEmitAnd
#define asm_emit_BOUNDS AsmEmitBounds
#define asm_emit_BREAK AsmEmitBreak
#define asm_emit_CALL AsmEmitCall
#define asm_emit_CMPS AsmEmitCmps
#define asm_emit_DEC AsmEmitDec
#define asm_emit_EQ AsmEmitEq
#define asm_emit_FILL AsmEmitFill
#define asm_emit_GEQ AsmEmitGeq
#define asm_emit_GRTR AsmEmitGrtr
#define asm_emit_HALT AsmEmitHalt
#define asm_emit_HEAP AsmEmitHeap
#define asm_emit_IDXADDR AsmEmitIdxaddr
#define asm_emit_INC AsmEmitInc
#define asm_emit_INVERT AsmEmitInvert
#define asm_emit_JEQ AsmEmitJeq
#define asm_emit_JGEQ AsmEmitJgeq
#define asm_emit_JGRTR AsmEmitJgrtr
#define asm_emit_JLEQ AsmEmitJleq
#define asm_emit_JLESS AsmEmitJless
#define asm_emit_JNEQ AsmEmitJneq
#define asm_emit_JNZ AsmEmitJnz
#define asm_emit_JSGEQ AsmEmitJsgeq
#define asm_emit_JSGRTR AsmEmitJsgrtr
#define asm_emit_JSLEQ AsmEmitJsleq
#define asm_emit_JSLESS AsmEmitJsless
#define asm_emit_JUMP AsmEmitJump
#define asm_emit_JZER AsmEmitJzer
#define asm_emit_LCTRL AsmEmitLctrl
#define asm_emit_LEQ AsmEmitLeq
#define asm_emit_LESS AsmEmitLess
#define asm_emit_LIDX AsmEmitLidx
#define asm_emit_MOVS AsmEmitMovs
#define asm_emit_NEG AsmEmitNeg
#define asm_emit_NEQ AsmEmitNeq
#define asm_emit_NOP AsmEmitNop
#define asm_emit_NOT AsmEmitNot
#define asm_emit_OR AsmEmitOr
#define asm_emit_PROC AsmEmitProc
#define asm_emit_PUSH AsmEmitPush
#define asm_emit_RET AsmEmitRet
#define asm_emit_RETN AsmEmitRetn
#define asm_emit_SCTRL AsmEmitSctrl
#define asm_emit_SDIV AsmEmitSdiv
#define asm_emit_SGEQ AsmEmitSgeq
#define asm_emit_SGRTR AsmEmitSgrtr
#define asm_emit_SHL AsmEmitShl
#define asm_emit_SHR AsmEmitShr
#define asm_emit_SLEQ AsmEmitSleq
#define asm_emit_SLESS AsmEmitSless
#define asm_emit_SMUL AsmEmitSmul
#define asm_emit_SSHR AsmEmitSshr
#define asm_emit_STACK AsmEmitStack
#define asm_emit_SUB AsmEmitSub
#define asm_emit_UDIV AsmEmitUdiv
#define asm_emit_UMUL AsmEmitUmul
#define asm_emit_XCHG AsmEmitXchg
#define asm_emit_XOR AsmEmitXor
#define asm_emit_ZERO AsmEmitZero
#define asm_emit_SYSREQ AsmEmitSysreq

// All mixed case.
#define asm_emit_Add AsmEmitAdd
#define asm_emit_And AsmEmitAnd
#define asm_emit_Bounds AsmEmitBounds
#define asm_emit_Break AsmEmitBreak
#define asm_emit_Call AsmEmitCall
#define asm_emit_Cmps AsmEmitCmps
#define asm_emit_Dec AsmEmitDec
#define asm_emit_Eq AsmEmitEq
#define asm_emit_Fill AsmEmitFill
#define asm_emit_Geq AsmEmitGeq
#define asm_emit_Grtr AsmEmitGrtr
#define asm_emit_Halt AsmEmitHalt
#define asm_emit_Heap AsmEmitHeap
#define asm_emit_Idxaddr AsmEmitIdxaddr
#define asm_emit_Inc AsmEmitInc
#define asm_emit_Invert AsmEmitInvert
#define asm_emit_Jeq AsmEmitJeq
#define asm_emit_Jgeq AsmEmitJgeq
#define asm_emit_Jgrtr AsmEmitJgrtr
#define asm_emit_Jleq AsmEmitJleq
#define asm_emit_Jless AsmEmitJless
#define asm_emit_Jneq AsmEmitJneq
#define asm_emit_Jnz AsmEmitJnz
#define asm_emit_Jsgeq AsmEmitJsgeq
#define asm_emit_Jsgrtr AsmEmitJsgrtr
#define asm_emit_Jsleq AsmEmitJsleq
#define asm_emit_Jsless AsmEmitJsless
#define asm_emit_Jump AsmEmitJump
#define asm_emit_Jzer AsmEmitJzer
#define asm_emit_Lctrl AsmEmitLctrl
#define asm_emit_Leq AsmEmitLeq
#define asm_emit_Less AsmEmitLess
#define asm_emit_Lidx AsmEmitLidx
#define asm_emit_Movs AsmEmitMovs
#define asm_emit_Neg AsmEmitNeg
#define asm_emit_Neq AsmEmitNeq
#define asm_emit_Nop AsmEmitNop
#define asm_emit_Not AsmEmitNot
#define asm_emit_Or AsmEmitOr
#define asm_emit_Proc AsmEmitProc
#define asm_emit_Push AsmEmitPush
#define asm_emit_Ret AsmEmitRet
#define asm_emit_Retn AsmEmitRetn
#define asm_emit_Sctrl AsmEmitSctrl
#define asm_emit_Sdiv AsmEmitSdiv
#define asm_emit_Sgeq AsmEmitSgeq
#define asm_emit_Sgrtr AsmEmitSgrtr
#define asm_emit_Shl AsmEmitShl
#define asm_emit_Shr AsmEmitShr
#define asm_emit_Sleq AsmEmitSleq
#define asm_emit_Sless AsmEmitSless
#define asm_emit_Smul AsmEmitSmul
#define asm_emit_Sshr AsmEmitSshr
#define asm_emit_Stack AsmEmitStack
#define asm_emit_Sub AsmEmitSub
#define asm_emit_Udiv AsmEmitUdiv
#define asm_emit_Umul AsmEmitUmul
#define asm_emit_Xchg AsmEmitXchg
#define asm_emit_Xor AsmEmitXor
#define asm_emit_Zero AsmEmitZero
#define asm_emit_Sysreq AsmEmitSysreq

// Now detect all the "." variants.
#define AsmEmitAdd.%0(%1) AsmEmitAdd%0(%1)
#define AsmEmitAddc AsmEmitAddC
#define AsmEmitAddr.%0(%1) AsmEmitAddr%0(%1)
#define AsmEmitAddrpri AsmEmitAddrPri
#define AsmEmitAddrPRI AsmEmitAddrPri
#define AsmEmitAddralt AsmEmitAddrAlt
#define AsmEmitAddrALT AsmEmitAddrAlt
#define AsmEmitAlign.%0(%1) AsmEmitAlign%0(%1)
#define AsmEmitAlignpri AsmEmitAlignPri
#define AsmEmitAlignPRI AsmEmitAlignPri
#define AsmEmitAlignalt AsmEmitAlignaAlt
#define AsmEmitAlignALT AsmEmitAlignaAlt
#define AsmEmitCall.%0(%1) AsmEmitCall%0(%1)
#define AsmEmitCallabs AsmEmitCallAbs
#define AsmEmitConst.%0(%1) AsmEmitConst%0(%1)
#define AsmEmitConstpri AsmEmitConstPri
#define AsmEmitConstPRI AsmEmitConstPri
#define AsmEmitConstalt AsmEmitConstAlt
#define AsmEmitConstALT AsmEmitConstAlt
#define AsmEmitDec.%0(%1) AsmEmitDec%0(%1)
#define AsmEmitDecpri AsmEmitDecPri
#define AsmEmitDecPRI AsmEmitDecPri
#define AsmEmitDecalt AsmEmitDecAlt
#define AsmEmitDecALT AsmEmitDecAlt
#define AsmEmitDeci AsmEmitDecI
#define AsmEmitDecs AsmEmitDecS
#define AsmEmitEq.%0(%1) AsmEmitEq%0(%1)
#define AsmEmitEqc AsmEmitEqC
#define AsmEmitEqC.%0(%1) AsmEmitEqC%0(%1)
#define AsmEmitEqCpri AsmEmitEqCPri
#define AsmEmitEqCPRI AsmEmitEqCPri
#define AsmEmitEqCalt AsmEmitEqCAlt
#define AsmEmitEqCALT AsmEmitEqCAlt
#define AsmEmitIdxaddr.%0(%1) AsmEmitIdxaddr%0(%1)
#define AsmEmitIdxaddrb AsmEmitIdxaddrB
#define AsmEmitInc.%0(%1) AsmEmitInc%0(%1)
#define AsmEmitIncpri AsmEmitIncPri
#define AsmEmitIncPRI AsmEmitIncPri
#define AsmEmitIncalt AsmEmitIncAlt
#define AsmEmitIncALT AsmEmitIncAlt
#define AsmEmitInci AsmEmitIncI
#define AsmEmitIncs AsmEmitIncS
#define AsmEmitJeq.%0(%1) AsmEmitJeq%0(%1)
#define AsmEmitJgeq.%0(%1) AsmEmitJgeq%0(%1)
#define AsmEmitJgrtr.%0(%1) AsmEmitJgrtr%0(%1)
#define AsmEmitJleq.%0(%1) AsmEmitJleq%0(%1)
#define AsmEmitJless.%0(%1) AsmEmitJless%0(%1)
#define AsmEmitJneq.%0(%1) AsmEmitJneq%0(%1)
#define AsmEmitJnz.%0(%1) AsmEmitJnz%0(%1)
#define AsmEmitJsgeq.%0(%1) AsmEmitJsgeq%0(%1)
#define AsmEmitJsgrtr.%0(%1) AsmEmitJsgrtr%0(%1)
#define AsmEmitJsleq.%0(%1) AsmEmitJsleq%0(%1)
#define AsmEmitJsless.%0(%1) AsmEmitJsless%0(%1)
#define AsmEmitJump.%0(%1) AsmEmitJump%0(%1)
#define AsmEmitJzer.%0(%1) AsmEmitJzer%0(%1)
#define AsmEmitJeqrel AsmEmitJeqRel
#define AsmEmitJgeqrel AsmEmitJgeqRel
#define AsmEmitJgrtrrel AsmEmitJgrtrRel
#define AsmEmitJleqrel AsmEmitJleqRel
#define AsmEmitJlessrel AsmEmitJlessRel
#define AsmEmitJneqrel AsmEmitJneqRel
#define AsmEmitJnzrel AsmEmitJnzRel
#define AsmEmitJsgeqrel AsmEmitJsgeqRel
#define AsmEmitJsgrtrrel AsmEmitJsgrtrRel
#define AsmEmitJsleqrel AsmEmitJsleqRel
#define AsmEmitJslessrel AsmEmitJslessRel
#define AsmEmitJumprel AsmEmitJumpRel
#define AsmEmitJzerrel AsmEmitJzerRel
#define AsmEmitJeqREL AsmEmitJeqRel
#define AsmEmitJgeqREL AsmEmitJgeqRel
#define AsmEmitJgrtrREL AsmEmitJgrtrRel
#define AsmEmitJleqREL AsmEmitJleqRel
#define AsmEmitJlessREL AsmEmitJlessRel
#define AsmEmitJneqREL AsmEmitJneqRel
#define AsmEmitJnzREL AsmEmitJnzRel
#define AsmEmitJsgeqREL AsmEmitJsgeqRel
#define AsmEmitJsgrtrREL AsmEmitJsgrtrRel
#define AsmEmitJsleqREL AsmEmitJsleqRel
#define AsmEmitJslessREL AsmEmitJslessRel
#define AsmEmitJumpREL AsmEmitJumpRel
#define AsmEmitJzerREL AsmEmitJzerRel
#define AsmEmitLidx.%0(%1) AsmEmitLidx%0(%1)
#define AsmEmitLidxb AsmEmitLidxB
#define AsmEmitLoad.%0(%1) AsmEmitLoad%0(%1)
#define AsmEmitLoadpri AsmEmitLoadPri
#define AsmEmitLoadPRI AsmEmitLoadPri
#define AsmEmitLoadalt AsmEmitLoadAlt
#define AsmEmitLoadALT AsmEmitLoadAlt
#define AsmEmitLoads AsmEmitLoadS
#define AsmEmitLoadS.%0(%1) AsmEmitLoadS%0(%1)
#define AsmEmitLoadSpri AsmEmitLoadSPri
#define AsmEmitLoadSPRI AsmEmitLoadSPri
#define AsmEmitLoadSalt AsmEmitLoadSAlt
#define AsmEmitLoadSALT AsmEmitLoadSAlt
#define AsmEmitLodb.%0(%1) AsmEmitLodb%0(%1)
#define AsmEmitLodbi AsmEmitLodbI
#define AsmEmitLoadi AsmEmitLoadI
#define AsmEmitLref.%0(%1) AsmEmitLref%0(%1)
#define AsmEmitLrefpri AsmEmitLrefPri
#define AsmEmitLrefPRI AsmEmitLrefPri
#define AsmEmitLrefalt AsmEmitLrefAlt
#define AsmEmitLrefALT AsmEmitLrefAlt
#define AsmEmitLrefs AsmEmitLrefS
#define AsmEmitLrefS.%0(%1) AsmEmitLrefS%0(%1)
#define AsmEmitLrefSpri AsmEmitLrefSPri
#define AsmEmitLrefSPRI AsmEmitLrefSPri
#define AsmEmitLrefSalt AsmEmitLrefSAlt
#define AsmEmitLrefSALT AsmEmitLrefSAlt
#define AsmEmitMove.%0(%1) AsmEmitMove%0(%1)
#define AsmEmitMovepri AsmEmitMovePri
#define AsmEmitMovePRI AsmEmitMovePri
#define AsmEmitMovealt AsmEmitMoveAlt
#define AsmEmitMoveALT AsmEmitMoveAlt
#define AsmEmitPop.%0(%1) AsmEmitPop%0(%1)
#define AsmEmitPoppri AsmEmitPopPri
#define AsmEmitPopPRI AsmEmitPopPri
#define AsmEmitPopalt AsmEmitPopAlt
#define AsmEmitPopALT AsmEmitPopAlt
#define AsmEmitPush.%0(%1) AsmEmitPush%0(%1)
#define AsmEmitPushpri AsmEmitPushPri
#define AsmEmitPushPRI AsmEmitPushPri
#define AsmEmitPushalt AsmEmitPushAlt
#define AsmEmitPushALT AsmEmitPushAlt
#define AsmEmitPushadr AsmEmitPushAdr
#define AsmEmitPushADR AsmEmitPushAdr
#define AsmEmitPushc AsmEmitPushC
#define AsmEmitPushs AsmEmitPushS
#define AsmEmitSdiv.%0(%1) AsmEmitSdiv%0(%1)
#define AsmEmitSdivalt AsmEmitSdivAlt
#define AsmEmitSdivALT AsmEmitSdivAlt
#define AsmEmitShl.%0(%1) AsmEmitShl%0(%1)
#define AsmEmitShlc AsmEmitShlC
#define AsmEmitShlC.%0(%1) AsmEmitShlC%0(%1)
#define AsmEmitShlCpri AsmEmitShlCPri
#define AsmEmitShlCPRI AsmEmitShlCPri
#define AsmEmitShlCalt AsmEmitShlCAlt
#define AsmEmitShlCALT AsmEmitShlCAlt
#define AsmEmitShr.%0(%1) AsmEmitShr%0(%1)
#define AsmEmitShrc AsmEmitShrC
#define AsmEmitShrC.%0(%1) AsmEmitShrC%0(%1)
#define AsmEmitShrCpri AsmEmitShrCPri
#define AsmEmitShrCPRI AsmEmitShrCPri
#define AsmEmitShrCalt AsmEmitShrCAlt
#define AsmEmitShrCALT AsmEmitShrCAlt
#define AsmEmitSign.%0(%1) AsmEmitSign%0(%1)
#define AsmEmitSignpri AsmEmitSignPri
#define AsmEmitSignPRI AsmEmitSignPri
#define AsmEmitSignalt AsmEmitSignAlt
#define AsmEmitSignALT AsmEmitSignAlt
#define AsmEmitSmul.%0(%1) AsmEmitSmul%0(%1)
#define AsmEmitSmulc AsmEmitSmulC
#define AsmEmitSref.%0(%1) AsmEmitSref%0(%1)
#define AsmEmitSrefpri AsmEmitSrefPri
#define AsmEmitSrefPRI AsmEmitSrefPri
#define AsmEmitSrefalt AsmEmitSrefAlt
#define AsmEmitSrefALT AsmEmitSrefAlt
#define AsmEmitSrefs AsmEmitSrefS
#define AsmEmitSrefS.%0(%1) AsmEmitSrefS%0(%1)
#define AsmEmitSrefSpri AsmEmitSrefSPri
#define AsmEmitSrefSPRI AsmEmitSrefSPri
#define AsmEmitSrefSalt AsmEmitSrefSAlt
#define AsmEmitSrefSALT AsmEmitSrefSAlt
#define AsmEmitStor.%0(%1) AsmEmitStor%0(%1)
#define AsmEmitStorpri AsmEmitStorPri
#define AsmEmitStorPRI AsmEmitStorPri
#define AsmEmitStoralt AsmEmitStorAlt
#define AsmEmitStorALT AsmEmitStorAlt
#define AsmEmitStori AsmEmitStorI
#define AsmEmitStors AsmEmitStorS
#define AsmEmitStorS.%0(%1) AsmEmitStorS%0(%1)
#define AsmEmitStorSpri AsmEmitStorSPri
#define AsmEmitStorSPRI AsmEmitStorSPri
#define AsmEmitStorSalt AsmEmitStorSAlt
#define AsmEmitStorSALT AsmEmitStorSAlt
#define AsmEmitStrb.%0(%1) AsmEmitStrb%0(%1)
#define AsmEmitStrbi AsmEmitStrbI
#define AsmEmitSub.%0(%1) AsmEmitSub%0(%1)
#define AsmEmitSubalt AsmEmitSubAlt
#define AsmEmitSubALT AsmEmitSubAlt
#define AsmEmitSwap.%0(%1) AsmEmitSwap%0(%1)
#define AsmEmitSwappri AsmEmitSwapPri
#define AsmEmitSwapPRI AsmEmitSwapPri
#define AsmEmitSwapalt AsmEmitSwapAlt
#define AsmEmitSwapALT AsmEmitSwapAlt
#define AsmEmitSysreq.%0(%1) AsmEmitSysreq%0(%1)
#define AsmEmitSysreqc AsmEmitSysreqC
#define AsmEmitSysreqd AsmEmitSysreqD
#define AsmEmitSysreqpri AsmEmitSysreqPri
#define AsmEmitSysreqPRI AsmEmitSysreqPri
#define AsmEmitUdiv.%0(%1) AsmEmitUdiv%0(%1)
#define AsmEmitUdivalt AsmEmitUdivAlt
#define AsmEmitUdivALT AsmEmitUdivAlt
#define AsmEmitZero.%0(%1) AsmEmitZero%0(%1)
#define AsmEmitZeropri AsmEmitZeroPri
#define AsmEmitZeroPRI AsmEmitZeroPri
#define AsmEmitZeroalt AsmEmitZeroAlt
#define AsmEmitZeroALT AsmEmitZeroAlt
#define AsmEmitZeros AsmEmitZeroS
// Custom.
#define AsmEmitPopargs AsmEmitPopArgs
#define AsmEmitPopARGS AsmEmitPopArgs
#define AsmEmitPusharg AsmEmitPushArg
#define AsmEmitPushARG AsmEmitPushArg
#define AsmEmitPushnum AsmEmitPushNum
#define AsmEmitPushNUM AsmEmitPushNum
#define AsmEmitPushNum.%0(%1) AsmEmitPushNum%0(%1)
#define AsmEmitPushNumargs AsmEmitPushNumArgs
#define AsmEmitPushNumARGS AsmEmitPushNumArgs

// Certain OpCodes don't exist, but are the start of others - detect them here.

// Lower-case.
#define asm_emit_addr AsmEmitAddr
#define asm_emit_align AsmEmitAlign
#define asm_emit_const AsmEmitConst
#define asm_emit_load AsmEmitLoad
#define asm_emit_lodb AsmEmitLodb
#define asm_emit_lref AsmEmitLref
#define asm_emit_move AsmEmitMove
#define asm_emit_pop AsmEmitPop
#define asm_emit_sign AsmEmitSign
#define asm_emit_stor AsmEmitStor
#define asm_emit_sref AsmEmitSref
#define asm_emit_strb AsmEmitStrb
#define asm_emit_swap AsmEmitSwap
// Mixed-case.
#define asm_emit_Addr AsmEmitAddr
#define asm_emit_Align AsmEmitAlign
#define asm_emit_Const AsmEmitConst
#define asm_emit_Load AsmEmitLoad
#define asm_emit_Lodb AsmEmitLodb
#define asm_emit_Lref AsmEmitLref
#define asm_emit_Move AsmEmitMove
#define asm_emit_Pop AsmEmitPop
#define asm_emit_Sign AsmEmitSign
#define asm_emit_Stor AsmEmitStor
#define asm_emit_Sref AsmEmitSref
#define asm_emit_Strb AsmEmitStrb
#define asm_emit_Swap AsmEmitSwap
// Upper-case.
#define asm_emit_ADDR AsmEmitAddr
#define asm_emit_ALIGN AsmEmitAlign
#define asm_emit_CONST AsmEmitConst
#define asm_emit_LOAD AsmEmitLoad
#define asm_emit_LODB AsmEmitLodb
#define asm_emit_LREF AsmEmitLref
#define asm_emit_MOVE AsmEmitMove
#define asm_emit_POP AsmEmitPop
#define asm_emit_SIGN AsmEmitSign
#define asm_emit_STOR AsmEmitStor
#define asm_emit_SREF AsmEmitSref
#define asm_emit_STRB AsmEmitStrb
#define asm_emit_SWAP AsmEmitSwap

// Jumps to labels.
#define asm_emit_jeqLabel AsmEmitJeqLabel
#define asm_emit_jeq_labelLabel AsmEmitJeqLabel
#define asm_emit_jgeqLabel AsmEmitJgeqLabel
#define asm_emit_jgeq_labelLabel AsmEmitJgeqLabel
#define asm_emit_jgrtrLabel AsmEmitJgrtrLabel
#define asm_emit_jgrtr_labelLabel AsmEmitJgrtrLabel
#define asm_emit_jleqLabel AsmEmitJleqLabel
#define asm_emit_jleq_labelLabel AsmEmitJleqLabel
#define asm_emit_jlessLabel AsmEmitJlessLabel
#define asm_emit_jless_labelLabel AsmEmitJlessLabel
#define asm_emit_jneqLabel AsmEmitJneqLabel
#define asm_emit_jneq_labelLabel AsmEmitJneqLabel
#define asm_emit_jnzLabel AsmEmitJnzLabel
#define asm_emit_jnz_labelLabel AsmEmitJnzLabel
#define asm_emit_jsgeqLabel AsmEmitJsgeqLabel
#define asm_emit_jsgeq_labelLabel AsmEmitJsgeqLabel
#define asm_emit_jsgrtrLabel AsmEmitJsgrtrLabel
#define asm_emit_jsgrtr_labelLabel AsmEmitJsgrtrLabel
#define asm_emit_jsleqLabel AsmEmitJsleqLabel
#define asm_emit_jsleq_labelLabel AsmEmitJsleqLabel
#define asm_emit_jslessLabel AsmEmitJslessLabel
#define asm_emit_jsless_labelLabel AsmEmitJslessLabel
#define asm_emit_jumpLabel AsmEmitJumpLabel
#define asm_emit_jump_labelLabel AsmEmitJumpLabel
#define asm_emit_jzerLabel AsmEmitJzerLabel
#define asm_emit_jzer_labelLabel AsmEmitJzerLabel

#define asm_emit_jeq_label AsmEmitJeqLabel
#define asm_emit_jgeq_label AsmEmitJgeqLabel
#define asm_emit_jgrtr_label AsmEmitJgrtrLabel
#define asm_emit_jleq_label AsmEmitJleqLabel
#define asm_emit_jless_label AsmEmitJlessLabel
#define asm_emit_jneq_label AsmEmitJneqLabel
#define asm_emit_jnz_label AsmEmitJnzLabel
#define asm_emit_jsgeq_label AsmEmitJsgeqLabel
#define asm_emit_jsgrtr_label AsmEmitJsgrtrLabel
#define asm_emit_jsleq_label AsmEmitJsleqLabel
#define asm_emit_jsless_label AsmEmitJslessLabel
#define asm_emit_jump_label AsmEmitJumpLabel
#define asm_emit_jzer_label AsmEmitJzerLabel

#define asm_emit_JEQLabel AsmEmitJeqLabel
#define asm_emit_JGEQLabel AsmEmitJgeqLabel
#define asm_emit_JGRTRLabel AsmEmitJgrtrLabel
#define asm_emit_JLEQLabel AsmEmitJleqLabel
#define asm_emit_JLESSLabel AsmEmitJlessLabel
#define asm_emit_JNEQLabel AsmEmitJneqLabel
#define asm_emit_JNZLabel AsmEmitJnzLabel
#define asm_emit_JSGEQLabel AsmEmitJsgeqLabel
#define asm_emit_JSGRTRLabel AsmEmitJsgrtrLabel
#define asm_emit_JSLEQLabel AsmEmitJsleqLabel
#define asm_emit_JSLESSLabel AsmEmitJslessLabel
#define asm_emit_JUMPLabel AsmEmitJumpLabel
#define asm_emit_JZERLabel AsmEmitJzerLabel

#define asm_emit_JeqLabel AsmEmitJeqLabel
#define asm_emit_JgeqLabel AsmEmitJgeqLabel
#define asm_emit_JgrtrLabel AsmEmitJgrtrLabel
#define asm_emit_JleqLabel AsmEmitJleqLabel
#define asm_emit_JlessLabel AsmEmitJlessLabel
#define asm_emit_JneqLabel AsmEmitJneqLabel
#define asm_emit_JnzLabel AsmEmitJnzLabel
#define asm_emit_JsgeqLabel AsmEmitJsgeqLabel
#define asm_emit_JsgrtrLabel AsmEmitJsgrtrLabel
#define asm_emit_JsleqLabel AsmEmitJsleqLabel
#define asm_emit_JslessLabel AsmEmitJslessLabel
#define asm_emit_JumpLabel AsmEmitJumpLabel
#define asm_emit_JzerLabel AsmEmitJzerLabel

// Only used when they explicitly typed `@emit JUMP.label x`
#define AsmEmitJeqlabel AsmEmitJeqLabel
#define AsmEmitJgeqlabel AsmEmitJgeqLabel
#define AsmEmitJgrtrlabel AsmEmitJgrtrLabel
#define AsmEmitJleqlabel AsmEmitJleqLabel
#define AsmEmitJlesslabel AsmEmitJlessLabel
#define AsmEmitJneqlabel AsmEmitJneqLabel
#define AsmEmitJnzlabel AsmEmitJnzLabel
#define AsmEmitJsgeqlabel AsmEmitJsgeqLabel
#define AsmEmitJsgrtrlabel AsmEmitJsgrtrLabel
#define AsmEmitJsleqlabel AsmEmitJsleqLabel
#define AsmEmitJslesslabel AsmEmitJslessLabel
#define AsmEmitJumplabel AsmEmitJumpLabel
#define AsmEmitJzerlabel AsmEmitJzerLabel

#define AsmEmitJeqLABEL AsmEmitJeqLabel
#define AsmEmitJgeqLABEL AsmEmitJgeqLabel
#define AsmEmitJgrtrLABEL AsmEmitJgrtrLabel
#define AsmEmitJleqLABEL AsmEmitJleqLabel
#define AsmEmitJlessLABEL AsmEmitJlessLabel
#define AsmEmitJneqLABEL AsmEmitJneqLabel
#define AsmEmitJnzLABEL AsmEmitJnzLabel
#define AsmEmitJsgeqLABEL AsmEmitJsgeqLabel
#define AsmEmitJsgrtrLABEL AsmEmitJsgrtrLabel
#define AsmEmitJsleqLABEL AsmEmitJsleqLabel
#define AsmEmitJslessLABEL AsmEmitJslessLabel
#define AsmEmitJumpLABEL AsmEmitJumpLabel
#define AsmEmitJzerLABEL AsmEmitJzerLabel

// This is required as otherwise:
//   
//   @emit Jump.Label x
//   
// Would not generate the `#x` required, while all other versions would.
#define AsmEmitJeqLabel(ctx,%2) AsmEmitJeqLabelStringize(ctx,#%2)
#define AsmEmitJgeqLabel(ctx,%2) AsmEmitJgeqLabelStringize(ctx,#%2)
#define AsmEmitJgrtrLabel(ctx,%2) AsmEmitJgrtrLabelStringize(ctx,#%2)
#define AsmEmitJleqLabel(ctx,%2) AsmEmitJleqLabelStringize(ctx,#%2)
#define AsmEmitJlessLabel(ctx,%2) AsmEmitJlessLabelStringize(ctx,#%2)
#define AsmEmitJneqLabel(ctx,%2) AsmEmitJneqLabelStringize(ctx,#%2)
#define AsmEmitJnzLabel(ctx,%2) AsmEmitJnzLabelStringize(ctx,#%2)
#define AsmEmitJsgeqLabel(ctx,%2) AsmEmitJsgeqLabelStringize(ctx,#%2)
#define AsmEmitJsgrtrLabel(ctx,%2) AsmEmitJsgrtrLabelStringize(ctx,#%2)
#define AsmEmitJsleqLabel(ctx,%2) AsmEmitJsleqLabelStringize(ctx,#%2)
#define AsmEmitJslessLabel(ctx,%2) AsmEmitJslessLabelStringize(ctx,#%2)
#define AsmEmitJumpLabel(ctx,%2) AsmEmitJumpLabelStringize(ctx,#%2)
#define AsmEmitJzerLabel(ctx,%2) AsmEmitJzerLabelStringize(ctx,#%2)

// Only used when they explicitly typed `@emit JUMP.label x:`
#define AsmEmitJeqlabelLabel AsmEmitJeqLabel
#define AsmEmitJgeqlabelLabel AsmEmitJgeqLabel
#define AsmEmitJgrtrlabelLabel AsmEmitJgrtrLabel
#define AsmEmitJleqlabelLabel AsmEmitJleqLabel
#define AsmEmitJlesslabelLabel AsmEmitJlessLabel
#define AsmEmitJneqlabelLabel AsmEmitJneqLabel
#define AsmEmitJnzlabelLabel AsmEmitJnzLabel
#define AsmEmitJsgeqlabelLabel AsmEmitJsgeqLabel
#define AsmEmitJsgrtrlabelLabel AsmEmitJsgrtrLabel
#define AsmEmitJsleqlabelLabel AsmEmitJsleqLabel
#define AsmEmitJslesslabelLabel AsmEmitJslessLabel
#define AsmEmitJumplabelLabel AsmEmitJumpLabel
#define AsmEmitJzerlabelLabel AsmEmitJzerLabel

#define AsmEmitJeqLABELLabel AsmEmitJeqLabel
#define AsmEmitJgeqLABELLabel AsmEmitJgeqLabel
#define AsmEmitJgrtrLABELLabel AsmEmitJgrtrLabel
#define AsmEmitJleqLABELLabel AsmEmitJleqLabel
#define AsmEmitJlessLABELLabel AsmEmitJlessLabel
#define AsmEmitJneqLABELLabel AsmEmitJneqLabel
#define AsmEmitJnzLABELLabel AsmEmitJnzLabel
#define AsmEmitJsgeqLABELLabel AsmEmitJsgeqLabel
#define AsmEmitJsgrtrLABELLabel AsmEmitJsgrtrLabel
#define AsmEmitJsleqLABELLabel AsmEmitJsleqLabel
#define AsmEmitJslessLABELLabel AsmEmitJslessLabel
#define AsmEmitJumpLABELLabel AsmEmitJumpLabel
#define AsmEmitJzerLABELLabel AsmEmitJzerLabel

#define AsmEmitJeqLabelLabel AsmEmitJeqLabel
#define AsmEmitJgeqLabelLabel AsmEmitJgeqLabel
#define AsmEmitJgrtrLabelLabel AsmEmitJgrtrLabel
#define AsmEmitJleqLabelLabel AsmEmitJleqLabel
#define AsmEmitJlessLabelLabel AsmEmitJlessLabel
#define AsmEmitJneqLabelLabel AsmEmitJneqLabel
#define AsmEmitJnzLabelLabel AsmEmitJnzLabel
#define AsmEmitJsgeqLabelLabel AsmEmitJsgeqLabel
#define AsmEmitJsgrtrLabelLabel AsmEmitJsgrtrLabel
#define AsmEmitJsleqLabelLabel AsmEmitJsleqLabel
#define AsmEmitJslessLabelLabel AsmEmitJslessLabel
#define AsmEmitJumpLabelLabel AsmEmitJumpLabel
#define AsmEmitJzerLabelLabel AsmEmitJzerLabel

// CallLabel macros.
#define asm_emit_callLabel AsmEmitCallLabel
#define asm_emit_call_labelLabel AsmEmitCallLabel
#define asm_emit_call_label AsmEmitCallLabel
#define asm_emit_CALLLabel AsmEmitCallLabel
#define asm_emit_CallLabel AsmEmitCallLabel
#define AsmEmitCalllabel AsmEmitCallLabel
#define AsmEmitCallLABEL AsmEmitCallLabel
#define AsmEmitCalllabelLabel AsmEmitCallLabel
#define AsmEmitCallLABELLabel AsmEmitCallLabel
#define AsmEmitCallLabelLabel AsmEmitCallLabel
#define AsmEmitCallLabel(ctx,%2) AsmEmitCallLabelStringize(ctx,#%2)

// Explicit `@emit Label name`
#define asm_emit_labelLabel(ctx,%2) AsmEmitLabelStringize(ctx,#%2)
#define asm_emit_LABELLabel(ctx,%2) AsmEmitLabelStringize(ctx,#%2)
#define asm_emit_LabelLabel(ctx,%2) AsmEmitLabelStringize(ctx,#%2)
#define asm_emit_label(ctx,%2) AsmEmitLabelStringize(ctx,#%2)
#define asm_emit_LABEL(ctx,%2) AsmEmitLabelStringize(ctx,#%2)
#define asm_emit_Label(ctx,%2) AsmEmitLabelStringize(ctx,#%2)

