/* * INSN.H * * (c)Copyright 2015, Matthew Dillon, All Rights Reserved. See the * COPYRIGHT file at the base of the distribution. */ /* * Control bits determine capabilities and restrictions. */ #define INSNF_ALIGN 0x00001000 /* size ext is for alignment */ #define INSNF_SSIZE 0x00002000 /* type sizes can be different */ #define INSNF_U0 0x00004000 /* implied instruction */ #define INSNF_U1 0x00008000 /* unary 1-op */ #define INSNF_U2 0x00010000 /* unary 2-op */ #define INSNF_CAST 0x00020000 /* operand size differences ok */ #define INSNF_B2 0x00040000 /* binary 2-op */ #define INSNF_B3 0x00080000 /* binary 3-op */ #define INSNF_LEAS 0x00100000 /* data1 is lea */ #define INSNF_LEAM 0x00200000 /* data2 is lea */ #define INSNF_LEAD 0x00400000 /* data3 is lea */ #define INSNF_BOOLD 0x00800000 /* destination operand is BOOL */ #define INSNF_LABELD 0x01000000 /* destination operand is a label */ #define INSNF_UNSIZED 0x02000000 /* unsized opcode */ #define INSNF_FLOAT 0x04000000 /* FP unit involved */ #define INSNF_PTRS 0x08000000 /* source must be a raw pointer */ #define INSNF_DISCARDS 0x10000000 /* discard src ok if dest not used */ #define INSNF_PTRD 0x20000000 /* destination must be a raw pointer */ #define INSNF_COND 0x40000000 /* label or boolean arg3 */ #define INSNF_INSN 0x80000000U /* used by RAS only, must be bit 31 */ /* * Instructions (12 bits | flags) * * Note that some instruction codes are repeated with different flags. */ #define INSN_LABEL (0x0000) /* used by RAS only */ #define INSN_MOVE (0x0001 | INSNF_DISCARDS) #define INSN_ADD (0x0002) #define INSN_SUB (0x0003) #define INSN_AND (0x0004) #define INSN_OR (0x0005) #define INSN_XOR (0x0006) #define INSN_NOT (0x0007 | INSNF_SSIZE) #define INSN_COM (0x0008) #define INSN_NEG (0x0009) #define INSN_POS (0x000A) #define INSN_ASL (0x000B | INSNF_SSIZE) #define INSN_ASR (0x000C | INSNF_SSIZE) #define INSN_LSR (0x000D | INSNF_SSIZE) #define INSN_ADDC (0x000E) #define INSN_SUBC (0x000F) #define INSN_MULU (0x0010) #define INSN_MULS (0x0011) #define INSN_DIVU (0x0012) #define INSN_DIVS (0x0013) #define INSN_MODU (0x0014) #define INSN_MODS (0x0015) #define INSN_INC (0x0016) #define INSN_DEC (0x0017) /* * CMP (note mask 0x0F00 indicates condition, DO NOT CHANGE) */ #define INSN_CMP_EQ (0x001F | INSNF_COND) #define INSN_CMP_NE (0x011F | INSNF_COND) #define INSN_CMP_UGT (0x021F | INSNF_COND) #define INSN_CMP_UGE (0x031F | INSNF_COND) #define INSN_CMP_ULT (0x041F | INSNF_COND) #define INSN_CMP_ULE (0x051F | INSNF_COND) #define INSN_CMP_SGT (0x061F | INSNF_COND) #define INSN_CMP_SGE (0x071F | INSNF_COND) #define INSN_CMP_SLT (0x081F | INSNF_COND) #define INSN_CMP_SLE (0x091F | INSNF_COND) /* * Special (C-style) pointer handling insns. Typically passed &CVoidPtrType * (do not pass the fat PointerType!), and can be used to add/sub integers * of different sizes to the pointer. */ #define INSN_MOVEA (0x0020 | INSNF_SSIZE | INSNF_PTRD | INSNF_DISCARDS) #define INSN_ADDA (0x0021 | INSNF_SSIZE | INSNF_PTRD) #define INSN_SUBA (0x0022 | INSNF_SSIZE | INSNF_PTRD) #define INSN_ADDAU (0x0023 | INSNF_SSIZE | INSNF_PTRD) #define INSN_SUBAU (0x0024 | INSNF_SSIZE | INSNF_PTRD) #define INSN_SUBAA (0x0025 | INSNF_SSIZE | INSNF_PTRD) #define INSN_LEA (0x0026 | INSNF_LEAS | INSNF_PTRD | INSNF_DISCARDS) /* * NOTE: BZERO uses the passed-in destination type alignment for optimizations. */ #define INSN_BCOPY (0x0028 | INSNF_ALIGN | INSNF_LEAM | INSNF_LEAD) #define INSN_BZERO (0x0029 | INSNF_ALIGN | INSNF_LEAD) #define INSN_CMPTYPE (0x002A | INSNF_COND | INSNF_LEAS | INSNF_LEAM) #define INSN_TSCHED (0x002B) /* * CMPA (note mask 0x0F00 indicates condition, DO NOT CHANGE) */ #define INSN_CMPA_EQ (0x002F | INSNF_COND) #define INSN_CMPA_NE (0x012F | INSNF_COND) #define INSN_CMPA_UGT (0x022F | INSNF_COND) #define INSN_CMPA_UGE (0x032F | INSNF_COND) #define INSN_CMPA_ULT (0x042F | INSNF_COND) #define INSN_CMPA_ULE (0x052F | INSNF_COND) #define INSN_CMPA_SGT (0x062F | INSNF_COND) #define INSN_CMPA_SGE (0x072F | INSNF_COND) #define INSN_CMPA_SLT (0x082F | INSNF_COND) #define INSN_CMPA_SLE (0x092F | INSNF_COND) /* * Casts - signed/unsigned/pointer specification is for source. * * CAST* [s/u]integer<->integer * CASTP pointer -> integer */ #define INSN_CASTU (0x0030 | INSNF_CAST | INSNF_SSIZE) #define INSN_CASTS (0x0031 | INSNF_CAST | INSNF_SSIZE) #define INSN_CASTP (0x0032 | INSNF_CAST | INSNF_SSIZE | INSNF_PTRS) /* * PointerStor, LValueStor, and RefStor handling. * * * These work on PointerStor's, typically operating on * s_Info or s_Info->in_RefStor. * * PCOPY Copy a PointerStor, does not adjust refs/locks or Info. * PCHECK Bounds-check a PointerStor using ps->s_Info->in_* * BCHECK Bounds-check an array using an index and extent * * PGET[H] ++Refs,Lock * PPUT[H] Unlock,--Refs * PREF ++refs * PREL --refs * PLOCK[H] Lock (no change to refs) * PUNLOCK[H] Unlock (no change to refs) * * PATOM Atomize (make s_Info unique) and extract s_Info, * derefs original info, replacement info will have * one ref. * * PIGET[H] PGET but extracts, ++Refs,Lock, and returns s_Info * * IGET[H] These work directly on PointerInfo's * IPUT[H] ... * IREF ... * IREL ... * ILOCK[H] ... * IUNLOCK[H] ... * IATOM Allocate a new PointerInfo structure using an old one * as as template. The old info is not dereferenced. The * new info has one reference and a ref is added to the RefStor. * * STKIGET[H] ++Refs,Lock the stack, return its PointerInfo * STKIREF ++Refs the stack, return its PointerInfo * SRSGET (implied) ++Refs,Lock the stack * SRSPUT (implied) UnLock,--Refs the stack */ #define INSN_PCOPY (0x0040 | INSNF_LEAS | INSNF_LEAD) #define INSN_PCHECK (0x0041 | INSNF_PTRS | INSNF_LEAD) #define INSN_PGET (0x0042 | INSNF_LEAS) #define INSN_PGETH (0x0142 | INSNF_LEAS) #define INSN_PPUT (0x0043 | INSNF_LEAS) #define INSN_PPUTH (0x0143 | INSNF_LEAS) #define INSN_PREF (0x0044 | INSNF_LEAS) #define INSN_PREL (0x0045 | INSNF_LEAS) #define INSN_PLOCK (0x0046 | INSNF_LEAS) #define INSN_PLOCKH (0x0146 | INSNF_LEAS) #define INSN_PUNLOCK (0x0047 | INSNF_LEAS) #define INSN_PUNLOCKH (0x0147 | INSNF_LEAS) #define INSN_PATOM (0x0048 | INSNF_LEAS | INSNF_PTRD) #define INSN_PIGET (0x0049 | INSNF_LEAS | INSNF_PTRD) #define INSN_PIGETH (0x0149 | INSNF_LEAS | INSNF_PTRD) /* 4A-4F avail */ #define INSN_IGET (0x0050 | INSNF_PTRS) #define INSN_IGETH (0x0150 | INSNF_PTRS) #define INSN_IPUT (0x0051 | INSNF_PTRS) #define INSN_IPUTH (0x0151 | INSNF_PTRS) #define INSN_IREF (0x0052 | INSNF_PTRS) #define INSN_IREL (0x0053 | INSNF_PTRS) #define INSN_ILOCK (0x0054 | INSNF_PTRS) #define INSN_ILOCKH (0x0154 | INSNF_PTRS) #define INSN_IUNLOCK (0x0055 | INSNF_PTRS) #define INSN_IUNLOCKH (0x0155 | INSNF_PTRS) #define INSN_INEW (0x0056 | INSNF_PTRD) #define INSN_IATOM (0x0057 | INSNF_PTRS | INSNF_PTRD) #define INSN_LVALLOC (0x0058 | INSNF_LEAS | INSNF_LEAM | INSNF_BOOLD) #define INSN_STKIGET (0x0059 | INSNF_PTRD) #define INSN_STKIGETH (0x0159 | INSNF_PTRD) #define INSN_STKIREF (0x005A | INSNF_PTRD) #define INSN_SRSGET (0x005B) #define INSN_SRSGETH (0x015B) #define INSN_SRSPUT (0x005C) #define INSN_SRSPUTH (0x015C) #define INSN_BCHECK (0x005D) #define INSN_BND_TRAP (0x005F) /* * CALL target,argea,retea * * CALL/TCALL/LCALL - Native Rune calls * QCALL - System call * RCALL - RunTime_*() call */ #define INSN_CALL (0x0061 | INSNF_LEAS | INSNF_LEAM | INSNF_LEAD | \ INSNF_UNSIZED) #define INSN_TCALL (0x0062 | INSNF_LEAS | INSNF_LEAM | INSNF_LEAD | \ INSNF_UNSIZED) #define INSN_LCALL (0x0063 | INSNF_LEAS | INSNF_LEAM | INSNF_LEAD | \ INSNF_UNSIZED) #define INSN_QCALL (0x0064 | INSNF_LEAS | INSNF_LEAM | INSNF_LEAD | \ INSNF_UNSIZED) #define INSN_RET (0x0067) #define INSN_LINK (0x0068) #define INSN_DET (0x0069) #define INSN_RCALL (0x006A | INSNF_LEAS | INSNF_LEAM | INSNF_LEAD | \ INSNF_UNSIZED) /* * TEST_EQ - Test if equals zero (If B3, test (a & b)) * TEST_NE - Test if not equals zero (If B3, test (a & b)) * * (note mask 0x0F00 indicates condition, DO NOT CHANGE) */ #define INSN_JMP (0x007E | INSNF_COND | INSNF_LABELD) #define INSN_TEST_EQ (0x007F | INSNF_COND) #define INSN_TEST_NE (0x017F | INSNF_COND) #define INSN_FMOVE (0x0080 | INSNF_FLOAT) #define INSN_FADD (0x0081 | INSNF_FLOAT) #define INSN_FSUB (0x0082 | INSNF_FLOAT) #define INSN_FMUL (0x0083 | INSNF_FLOAT) #define INSN_FDIV (0x0084 | INSNF_FLOAT) #define INSN_FINC (0x0090 | INSNF_FLOAT) #define INSN_FDEC (0x0091 | INSNF_FLOAT) #define INSN_FNEG (0x0092 | INSNF_FLOAT) #define INSN_FPOS (0x0093 | INSNF_FLOAT) #define INSN_FNOT (0x0094 | INSNF_FLOAT | INSNF_SSIZE) /* * *ITOF [s/u]integer to float * FTOI* float to [s/u]integer * CASTF float to float * * NOTE: INSNF_FLOAT is not set for UITOF or SITOF, we use the flag as a hint * for $immediate value computation and the source is an integer. */ #define INSN_UITOF (0x0096 | INSNF_CAST | INSNF_SSIZE) #define INSN_SITOF (0x0097 | INSNF_CAST | INSNF_SSIZE) #define INSN_FTOUI (0x0098 | INSNF_CAST | INSNF_FLOAT | INSNF_SSIZE) #define INSN_FTOSI (0x0099 | INSNF_CAST | INSNF_FLOAT | INSNF_SSIZE) #define INSN_CASTF (0x009A | INSNF_CAST | INSNF_FLOAT | INSNF_SSIZE) #define INSN_FCMP_UEQ (0x009F | INSNF_COND | INSNF_FLOAT) #define INSN_FCMP_UGT (0x029F | INSNF_COND | INSNF_FLOAT) #define INSN_FCMP_UGE (0x039F | INSNF_COND | INSNF_FLOAT) #define INSN_FCMP_ULT (0x049F | INSNF_COND | INSNF_FLOAT) #define INSN_FCMP_ULE (0x059F | INSNF_COND | INSNF_FLOAT) #define INSN_FCMP_UNE (0x019F | INSNF_COND | INSNF_FLOAT)