Reduct  v4.0.5-1-g4851deb
A functional and immutable language.
Loading...
Searching...
No Matches
opcode.h File Reference

Bytecode opcodes and properties. More...

#include <reduct/defs.h>
#include <stdint.h>
Include dependency graph for opcode.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Data Structures

struct  reduct_opcode_info_t
 Opcode information structure. More...
 

Macros

#define REDUCT_OPCODE_BASE(_op)   ((_op) & ~REDUCT_OPCODE_MODE_CONST)
 Get the base form of the opcode without the constant bit set.
 
#define REDUCT_OPCODE_GET_NAME(_op)   (reductOpcodeTable[REDUCT_OPCODE_BASE(_op)].name)
 Get the name of an opcode.
 
#define REDUCT_OPCODE_GET_LAYOUT(_op)   (reductOpcodeTable[REDUCT_OPCODE_BASE(_op)].layout)
 Get the layout of an opcode.
 
#define REDUCT_OPCODE_IS_COMPARE(_op)    (REDUCT_OPCODE_BASE(_op) >= REDUCT_OPCODE_EQ && REDUCT_OPCODE_BASE(_op) <= REDUCT_OPCODE_GE)
 Check if an opcode is a comparison instruction.
 
#define REDUCT_OPCODE_TO_SKIP(_op)
 Get the skip version of a comparison opcode.
 
#define REDUCT_OPCODE_INVERT_SKIP(_op)
 Invert a skip comparison opcode (e.g. JEQ <-> JNEQ).
 
#define REDUCT_OPCODE_TO_RECUR(_op)
 Get the recursive version of a call opcode.
 
#define REDUCT_OPCODE_TO_TAIL(_op)
 Get the tail version of a call or return opcode.
 
#define REDUCT_OPCODE_HAS_TARGET(_op)   (reductOpcodeTable[REDUCT_OPCODE_BASE(_op)].flags & REDUCT_OPCODE_FLAG_HAS_TARGET)
 Check if an opcode modifies its target register (A).
 
#define REDUCT_OPCODE_IS_RECUR(_op)   (reductOpcodeTable[REDUCT_OPCODE_BASE(_op)].flags & REDUCT_OPCODE_FLAG_IS_RECUR)
 Check if an opcode is a recursive call.
 
#define REDUCT_OPCODE_IS_JUMP(_op)   (reductOpcodeTable[REDUCT_OPCODE_BASE(_op)].flags & REDUCT_OPCODE_FLAG_IS_JUMP)
 Check if an opcode is a jump instruction.
 
#define REDUCT_OPCODE_HAS_CONST(_op)   (reductOpcodeTable[REDUCT_OPCODE_BASE(_op)].flags & REDUCT_OPCODE_FLAG_HAS_CONST)
 Check if an opcode uses the C operand and has both a constant and register version.
 
#define REDUCT_OPCODE_READS_A(_op)   (reductOpcodeTable[REDUCT_OPCODE_BASE(_op)].flags & REDUCT_OPCODE_FLAG_READ_A)
 Check if an opcode reads from register A.
 
#define REDUCT_OPCODE_READS_B(_op)   (reductOpcodeTable[REDUCT_OPCODE_BASE(_op)].flags & REDUCT_OPCODE_FLAG_READ_B)
 Check if an opcode reads from register B.
 
#define REDUCT_OPCODE_READS_C(_op)   (reductOpcodeTable[REDUCT_OPCODE_BASE(_op)].flags & REDUCT_OPCODE_FLAG_READ_C)
 Check if an opcode reads from register/constant C.
 
#define REDUCT_OPCODE_READS_RANGE(_op)    (reductOpcodeTable[REDUCT_OPCODE_BASE(_op)].flags & REDUCT_OPCODE_FLAG_READ_RANGE)
 Check if an opcode reads a range of registers starting at A.
 
#define REDUCT_OPCODE_IS_COMMUTATIVE(_op)    (reductOpcodeTable[REDUCT_OPCODE_BASE(_op)].flags & REDUCT_OPCODE_FLAG_IS_COMMUTATIVE)
 Check if an opcode is commutative.
 
#define REDUCT_OPCODE_IS_SKIP(_op)   (reductOpcodeTable[REDUCT_OPCODE_BASE(_op)].flags & REDUCT_OPCODE_FLAG_IS_SKIP)
 Check if an opcode is a skip instruction.
 
#define REDUCT_OPCODE_IS_BRANCH(_op)    (reductOpcodeTable[REDUCT_OPCODE_BASE(_op)].flags & (REDUCT_OPCODE_FLAG_IS_SKIP | REDUCT_OPCODE_FLAG_IS_JUMP))
 Check if an opcode is a skip or jump instruction.
 
#define REDUCT_OPCODE_IS_CALL(_op)   (reductOpcodeTable[REDUCT_OPCODE_BASE(_op)].flags & REDUCT_OPCODE_FLAG_IS_CALL)
 Check if an opcode is a function call.
 
#define REDUCT_OPCODE_IS_TERMINATOR(_op)    (reductOpcodeTable[REDUCT_OPCODE_BASE(_op)].flags & REDUCT_OPCODE_FLAG_IS_TERMINATOR)
 Check if an opcode is a terminator.
 
#define REDUCT_OPCODE_IS_BINARY(_op)
 Check if an opcode is a binary operation (reads B and C).
 
#define REDUCT_OPCODE_IS_TERNARY(_op)
 Check if an opcode is a ternary operation (reads A, B and C).
 
#define REDUCT_OPCODE_IS_UNARY(_op)
 Check if an opcode is a unary operation (reads C only).
 
#define REDUCT_OPCODE_IS_FORK(_op)   (reductOpcodeTable[REDUCT_OPCODE_BASE(_op)].flags & REDUCT_OPCODE_FLAG_IS_FORK)
 Check if an opcode is a fork instruction.
 

Enumerations

enum  reduct_opcode_mode_t { REDUCT_OPCODE_MODE_REG = 0 , REDUCT_OPCODE_MODE_CONST = 1 << 7 }
 Opcode mode enumeration. More...
 
enum  reduct_opcode_layout_t {
  REDUCT_LAYOUT_ABC , REDUCT_LAYOUT_AB , REDUCT_LAYOUT_AC , REDUCT_LAYOUT_C ,
  REDUCT_LAYOUT_SAX , REDUCT_LAYOUT_SAXC , REDUCT_LAYOUT_ABC_RANGE , REDUCT_LAYOUT_AB_RANGE ,
  REDUCT_LAYOUT_NONE
}
 Opcode operand layouts. More...
 
enum  reduct_opcode_t {
  REDUCT_OPCODE_NOP = 0x10 , REDUCT_OPCODE_MOV , REDUCT_OPCODE_LIST , REDUCT_OPCODE_CLOSURE ,
  REDUCT_OPCODE_CAPTURE , REDUCT_OPCODE_JMP , REDUCT_OPCODE_JMPF , REDUCT_OPCODE_JMPT ,
  REDUCT_OPCODE_CALL , REDUCT_OPCODE_RET , REDUCT_OPCODE_TAILCALL , REDUCT_OPCODE_RECUR ,
  REDUCT_OPCODE_TAILRECUR , REDUCT_OPCODE_EQ , REDUCT_OPCODE_NEQ , REDUCT_OPCODE_LT ,
  REDUCT_OPCODE_LE , REDUCT_OPCODE_GT , REDUCT_OPCODE_GE , REDUCT_OPCODE_ADD ,
  REDUCT_OPCODE_SUB , REDUCT_OPCODE_MUL , REDUCT_OPCODE_DIV , REDUCT_OPCODE_MOD ,
  REDUCT_OPCODE_BAND , REDUCT_OPCODE_BOR , REDUCT_OPCODE_BXOR , REDUCT_OPCODE_BNOT ,
  REDUCT_OPCODE_SHL , REDUCT_OPCODE_SHR , REDUCT_OPCODE_JEQ , REDUCT_OPCODE_JNEQ ,
  REDUCT_OPCODE_JLT , REDUCT_OPCODE_JLE , REDUCT_OPCODE_JGT , REDUCT_OPCODE_JGE ,
  REDUCT_OPCODE_LEN , REDUCT_OPCODE_NTH2 , REDUCT_OPCODE_NTH3 , REDUCT_OPCODE_RANGE1 ,
  REDUCT_OPCODE_RANGE2 , REDUCT_OPCODE_RANGE3 , REDUCT_OPCODE_REPEAT , REDUCT_OPCODE_FORK ,
  REDUCT_OPCODE_JOIN , REDUCT_OPCODE_CONCAT , REDUCT_OPCODE_APPEND , REDUCT_OPCODE_PREPEND ,
  REDUCT_OPCODE_FIRST , REDUCT_OPCODE_LAST , REDUCT_OPCODE_REST , REDUCT_OPCODE_INIT ,
  REDUCT_OPCODE_MOV_CONST = REDUCT_OPCODE_MOV | REDUCT_OPCODE_MODE_CONST , REDUCT_OPCODE_CALL_CONST = REDUCT_OPCODE_CALL | REDUCT_OPCODE_MODE_CONST , REDUCT_OPCODE_RET_CONST = REDUCT_OPCODE_RET | REDUCT_OPCODE_MODE_CONST , REDUCT_OPCODE_CAPTURE_CONST = REDUCT_OPCODE_CAPTURE | REDUCT_OPCODE_MODE_CONST ,
  REDUCT_OPCODE_TAILCALL_CONST = REDUCT_OPCODE_TAILCALL | REDUCT_OPCODE_MODE_CONST , REDUCT_OPCODE_EQ_CONST = REDUCT_OPCODE_EQ | REDUCT_OPCODE_MODE_CONST , REDUCT_OPCODE_NEQ_CONST = REDUCT_OPCODE_NEQ | REDUCT_OPCODE_MODE_CONST , REDUCT_OPCODE_LT_CONST = REDUCT_OPCODE_LT | REDUCT_OPCODE_MODE_CONST ,
  REDUCT_OPCODE_LE_CONST = REDUCT_OPCODE_LE | REDUCT_OPCODE_MODE_CONST , REDUCT_OPCODE_GT_CONST = REDUCT_OPCODE_GT | REDUCT_OPCODE_MODE_CONST , REDUCT_OPCODE_GE_CONST = REDUCT_OPCODE_GE | REDUCT_OPCODE_MODE_CONST , REDUCT_OPCODE_ADD_CONST = REDUCT_OPCODE_ADD | REDUCT_OPCODE_MODE_CONST ,
  REDUCT_OPCODE_SUB_CONST = REDUCT_OPCODE_SUB | REDUCT_OPCODE_MODE_CONST , REDUCT_OPCODE_MUL_CONST = REDUCT_OPCODE_MUL | REDUCT_OPCODE_MODE_CONST , REDUCT_OPCODE_DIV_CONST = REDUCT_OPCODE_DIV | REDUCT_OPCODE_MODE_CONST , REDUCT_OPCODE_MOD_CONST = REDUCT_OPCODE_MOD | REDUCT_OPCODE_MODE_CONST ,
  REDUCT_OPCODE_BAND_CONST = REDUCT_OPCODE_BAND | REDUCT_OPCODE_MODE_CONST , REDUCT_OPCODE_BOR_CONST = REDUCT_OPCODE_BOR | REDUCT_OPCODE_MODE_CONST , REDUCT_OPCODE_BXOR_CONST = REDUCT_OPCODE_BXOR | REDUCT_OPCODE_MODE_CONST , REDUCT_OPCODE_BNOT_CONST = REDUCT_OPCODE_BNOT | REDUCT_OPCODE_MODE_CONST ,
  REDUCT_OPCODE_SHL_CONST = REDUCT_OPCODE_SHL | REDUCT_OPCODE_MODE_CONST , REDUCT_OPCODE_SHR_CONST = REDUCT_OPCODE_SHR | REDUCT_OPCODE_MODE_CONST , REDUCT_OPCODE_JEQ_CONST = REDUCT_OPCODE_JEQ | REDUCT_OPCODE_MODE_CONST , REDUCT_OPCODE_JNEQ_CONST = REDUCT_OPCODE_JNEQ | REDUCT_OPCODE_MODE_CONST ,
  REDUCT_OPCODE_JLT_CONST = REDUCT_OPCODE_JLT | REDUCT_OPCODE_MODE_CONST , REDUCT_OPCODE_JLE_CONST = REDUCT_OPCODE_JLE | REDUCT_OPCODE_MODE_CONST , REDUCT_OPCODE_JGT_CONST = REDUCT_OPCODE_JGT | REDUCT_OPCODE_MODE_CONST , REDUCT_OPCODE_JGE_CONST = REDUCT_OPCODE_JGE | REDUCT_OPCODE_MODE_CONST ,
  REDUCT_OPCODE_LEN_CONST = REDUCT_OPCODE_LEN | REDUCT_OPCODE_MODE_CONST , REDUCT_OPCODE_NTH2_CONST = REDUCT_OPCODE_NTH2 | REDUCT_OPCODE_MODE_CONST , REDUCT_OPCODE_NTH3_CONST = REDUCT_OPCODE_NTH3 | REDUCT_OPCODE_MODE_CONST , REDUCT_OPCODE_RANGE1_CONST = REDUCT_OPCODE_RANGE1 | REDUCT_OPCODE_MODE_CONST ,
  REDUCT_OPCODE_RANGE2_CONST = REDUCT_OPCODE_RANGE2 | REDUCT_OPCODE_MODE_CONST , REDUCT_OPCODE_RANGE3_CONST = REDUCT_OPCODE_RANGE3 | REDUCT_OPCODE_MODE_CONST , REDUCT_OPCODE_REPEAT_CONST = REDUCT_OPCODE_REPEAT | REDUCT_OPCODE_MODE_CONST , REDUCT_OPCODE_FORK_CONST = REDUCT_OPCODE_FORK | REDUCT_OPCODE_MODE_CONST ,
  REDUCT_OPCODE_JOIN_CONST = REDUCT_OPCODE_JOIN | REDUCT_OPCODE_MODE_CONST , REDUCT_OPCODE_FIRST_CONST = REDUCT_OPCODE_FIRST | REDUCT_OPCODE_MODE_CONST , REDUCT_OPCODE_LAST_CONST = REDUCT_OPCODE_LAST | REDUCT_OPCODE_MODE_CONST , REDUCT_OPCODE_REST_CONST = REDUCT_OPCODE_REST | REDUCT_OPCODE_MODE_CONST ,
  REDUCT_OPCODE_INIT_CONST = REDUCT_OPCODE_INIT | REDUCT_OPCODE_MODE_CONST
}
 Opcode enumeration. More...
 
enum  reduct_opcode_flags_t {
  REDUCT_OPCODE_FLAG_HAS_TARGET = (1 << 0) , REDUCT_OPCODE_FLAG_IS_JUMP = (1 << 1) , REDUCT_OPCODE_FLAG_HAS_CONST = (1 << 2) , REDUCT_OPCODE_FLAG_READ_A = (1 << 3) ,
  REDUCT_OPCODE_FLAG_READ_B = (1 << 4) , REDUCT_OPCODE_FLAG_READ_C = (1 << 5) , REDUCT_OPCODE_FLAG_READ_RANGE = (1 << 6) , REDUCT_OPCODE_FLAG_IS_COMMUTATIVE = (1 << 7) ,
  REDUCT_OPCODE_FLAG_IS_SKIP = (1 << 8) , REDUCT_OPCODE_FLAG_IS_CALL = (1 << 9) , REDUCT_OPCODE_FLAG_IS_TERMINATOR = (1 << 10) , REDUCT_OPCODE_FLAG_IS_RECUR = (1 << 11) ,
  REDUCT_OPCODE_FLAG_IS_FORK = (1 << 12)
}
 Opcode flags. More...
 

Variables

REDUCT_API const reduct_opcode_info_t reductOpcodeTable [128]
 Opcode information and flags table.
 

Detailed Description

Bytecode opcodes and properties.

Definition in file opcode.h.