Define operation codes and associated macros. More...
Go to the source code of this file.
Macros | |
| #define | FETCH_Z() |
| #define | FETCH_B() |
| #define | FETCH_BB() |
| #define | FETCH_BBB() |
| #define | FETCH_BS() |
| #define | FETCH_BSS() |
| #define | FETCH_S() |
| #define | FETCH_W() |
Enumerations | |
| enum | OPCODE { OP_NOP = 0x00 , OP_MOVE = 0x01 , OP_LOADL = 0x02 , OP_LOADI8 = 0x03 , OP_LOADINEG = 0x04 , OP_LOADI__1 = 0x05 , OP_LOADI_0 = 0x06 , OP_LOADI_1 = 0x07 , OP_LOADI_2 = 0x08 , OP_LOADI_3 = 0x09 , OP_LOADI_4 = 0x0A , OP_LOADI_5 = 0x0B , OP_LOADI_6 = 0x0C , OP_LOADI_7 = 0x0D , OP_LOADI16 = 0x0E , OP_LOADI32 = 0x0F , OP_LOADSYM = 0x10 , OP_LOADNIL = 0x11 , OP_LOADSELF = 0x12 , OP_LOADTRUE = 0x13 , OP_LOADFALSE = 0x14 , OP_GETGV = 0x15 , OP_SETGV = 0x16 , OP_GETSV = 0x17 , OP_SETSV = 0x18 , OP_GETIV = 0x19 , OP_SETIV = 0x1A , OP_GETCV = 0x1B , OP_SETCV = 0x1C , OP_GETCONST = 0x1D , OP_SETCONST = 0x1E , OP_GETMCNST = 0x1F , OP_SETMCNST = 0x20 , OP_GETUPVAR = 0x21 , OP_SETUPVAR = 0x22 , OP_GETIDX = 0x23 , OP_GETIDX0 = 0x24 , OP_SETIDX = 0x25 , OP_JMP = 0x26 , OP_JMPIF = 0x27 , OP_JMPNOT = 0x28 , OP_JMPNIL = 0x29 , OP_JMPUW = 0x2A , OP_EXCEPT = 0x2B , OP_RESCUE = 0x2C , OP_RAISEIF = 0x2D , OP_MATCHERR = 0x2E , OP_SSEND = 0x2F , OP_SSEND0 = 0x30 , OP_SSENDB = 0x31 , OP_SEND = 0x32 , OP_SEND0 = 0x33 , OP_SENDB = 0x34 , OP_CALL = 0x35 , OP_BLKCALL = 0x36 , OP_SUPER = 0x37 , OP_ARGARY = 0x38 , OP_ENTER = 0x39 , OP_KEY_P = 0x3A , OP_KEYEND = 0x3B , OP_KARG = 0x3C , OP_RETURN = 0x3D , OP_RETURN_BLK = 0x3E , OP_RETSELF = 0x3F , OP_RETNIL = 0x40 , OP_RETTRUE = 0x41 , OP_RETFALSE = 0x42 , OP_BREAK = 0x43 , OP_BLKPUSH = 0x44 , OP_ADD = 0x45 , OP_ADDI = 0x46 , OP_SUB = 0x47 , OP_SUBI = 0x48 , OP_ADDILV = 0x49 , OP_SUBILV = 0x4A , OP_MUL = 0x4B , OP_DIV = 0x4C , OP_EQ = 0x4D , OP_LT = 0x4E , OP_LE = 0x4F , OP_GT = 0x50 , OP_GE = 0x51 , OP_ARRAY = 0x52 , OP_ARRAY2 = 0x53 , OP_ARYCAT = 0x54 , OP_ARYPUSH = 0x55 , OP_ARYSPLAT = 0x56 , OP_AREF = 0x57 , OP_ASET = 0x58 , OP_APOST = 0x59 , OP_INTERN = 0x5A , OP_SYMBOL = 0x5B , OP_STRING = 0x5C , OP_STRCAT = 0x5D , OP_HASH = 0x5E , OP_HASHADD = 0x5F , OP_HASHCAT = 0x60 , OP_LAMBDA = 0x61 , OP_BLOCK = 0x62 , OP_METHOD = 0x63 , OP_RANGE_INC = 0x64 , OP_RANGE_EXC = 0x65 , OP_OCLASS = 0x66 , OP_CLASS = 0x67 , OP_MODULE = 0x68 , OP_EXEC = 0x69 , OP_DEF = 0x6A , OP_TDEF = 0x6B , OP_SDEF = 0x6C , OP_ALIAS = 0x6D , OP_UNDEF = 0x6E , OP_SCLASS = 0x6F , OP_TCLASS = 0x70 , OP_DEBUG = 0x71 , OP_ERR = 0x72 , OP_EXT1 = 0x73 , OP_EXT2 = 0x74 , OP_EXT3 = 0x75 , OP_STOP = 0x76 } |
| Operation codes. More... | |
Define operation codes and associated macros.
Copyright (C) 2015- Kyushu Institute of Technology. Copyright (C) 2015-2026 Shimane IT Open-Innovation Center. Copyright (C) 2026- Shimane Institute for Industrial Technology. This file is distributed under BSD 3-Clause License.
Definition in file opcode.h.
| #define FETCH_B | ( | ) |
| #define FETCH_BB | ( | ) |
| #define FETCH_BBB | ( | ) |
| #define FETCH_BS | ( | ) |
| #define FETCH_BSS | ( | ) |
| #define FETCH_S | ( | ) |
| #define FETCH_W | ( | ) |
| enum OPCODE |
Operation codes.
operand types: Z: no operand B: 8bit (a) BB: 8+8bit (a,b) BBB: 8+8+8bit (a,b,c) BS: 8+16bit (a,b) BSS: 8+16+16bit (a,b,c) S: 16bit (a) W: 24bit (a)
| Enumerator | |
|---|---|
| OP_NOP | Z no operation. |
| OP_MOVE | BB R[a] = R[b]. |
| OP_LOADL | BB R[a] = Pool[b]. |
| OP_LOADI8 | BB R[a] = mrb_int(b). |
| OP_LOADINEG | BB R[a] = mrb_int(-b). |
| OP_LOADI__1 | B R[a] = mrb_int(-1). |
| OP_LOADI_0 | B R[a] = mrb_int(0). |
| OP_LOADI_1 | B R[a] = mrb_int(1). |
| OP_LOADI_2 | B R[a] = mrb_int(2). |
| OP_LOADI_3 | B R[a] = mrb_int(3). |
| OP_LOADI_4 | B R[a] = mrb_int(4). |
| OP_LOADI_5 | B R[a] = mrb_int(5). |
| OP_LOADI_6 | B R[a] = mrb_int(6). |
| OP_LOADI_7 | B R[a] = mrb_int(7). |
| OP_LOADI16 | BS R[a] = mrb_int(b). |
| OP_LOADI32 | BSS R[a] = mrb_int((b<<16)+c). |
| OP_LOADSYM | BB R[a] = Syms[b]. |
| OP_LOADNIL | B R[a] = nil. |
| OP_LOADSELF | B R[a] = self. |
| OP_LOADTRUE | B R[a] = true. |
| OP_LOADFALSE | B R[a] = false. |
| OP_GETGV | BB R[a] = getglobal(Syms[b]). |
| OP_SETGV | BB setglobal(Syms[b], R[a]). |
| OP_GETSV | BB R[a] = Special[Syms[b]]. |
| OP_SETSV | BB Special[Syms[b]] = R[a]. |
| OP_GETIV | BB R[a] = ivget(Syms[b]). |
| OP_SETIV | BB ivset(Syms[b],R[a]). |
| OP_GETCV | BB R[a] = cvget(Syms[b]). |
| OP_SETCV | BB cvset(Syms[b],R[a]). |
| OP_GETCONST | BB R[a] = constget(Syms[b]). |
| OP_SETCONST | BB constset(Syms[b],R[a]). |
| OP_GETMCNST | BB R[a] = R[a]::Syms[b]. |
| OP_SETMCNST | BB R[a+1]::Syms[b] = R[a]. |
| OP_GETUPVAR | BBB R[a] = uvget(b,c). |
| OP_SETUPVAR | BBB uvset(b,c,R[a]). |
| OP_GETIDX | B R[a] = R[a][R[a+1]]. |
| OP_GETIDX0 | BB R[a] = R[b][0]; a+1 for method call. |
| OP_SETIDX | B R[a][R[a+1]] = R[a+2]. |
| OP_JMP | S pc+=a. |
| OP_JMPIF | BS if R[a] pc+=b. |
| OP_JMPNOT | BS if !R[a] pc+=b. |
| OP_JMPNIL | BS if R[a]==nil pc+=b. |
| OP_JMPUW | S unwind_and_jump_to(a). |
| OP_EXCEPT | B R[a] = exc. |
| OP_RESCUE | BB R[b] = R[a].isa?(R[b]). |
| OP_RAISEIF | B raise(R[a]) if R[a]. |
| OP_MATCHERR | B raise NoMatchingPatternError unless R[a]. |
| OP_SSEND | BBB R[a] = self.send(Syms[b],R[a+1]..,R[a+n+1]:R[a+n+2]..) (c=n|k<<4). |
| OP_SSEND0 | BB R[a] = self.send(Syms[b]) (no args). |
| OP_SSENDB | BBB R[a] = self.send(Syms[b],R[a+1]..,R[a+n+1]:R[a+n+2]..,&R[a+n+2k+1]). |
| OP_SEND | BBB R[a] = R[a].send(Syms[b],R[a+1]..,R[a+n+1]:R[a+n+2]..) (c=n|k<<4). |
| OP_SEND0 | BB R[a] = R[a].send(Syms[b]) (no args). |
| OP_SENDB | BBB R[a] = R[a].send(Syms[b],R[a+1]..,R[a+n+1]:R[a+n+2]..,&R[a+n+2k+1]). |
| OP_CALL | Z self.call(*, **, &) (But overlay the current call frame; tailcall). |
| OP_BLKCALL | BB R[a] = R[a].call(R[a+1],... ,R[a+b]); direct block call. |
| OP_SUPER | BB R[a] = super(R[a+1],... ,R[a+b+1]). |
| OP_ARGARY | BS R[a] = argument array (16=m5:r1:m5:d1:lv4). |
| OP_ENTER | W arg setup according to flags (24=n1:m5:o5:r1:m5:k5:d1:b1). |
| OP_KEY_P | BB R[a] = kdict.key?(Syms[b]). |
| OP_KEYEND | Z raise unless kdict.empty? |
| OP_KARG | BB R[a] = kdict[Syms[b]]; kdict.delete(Syms[b]). |
| OP_RETURN | B return R[a] (normal). |
| OP_RETURN_BLK | B return R[a] (in-block return). |
| OP_RETSELF | Z return self. |
| OP_RETNIL | Z return nil. |
| OP_RETTRUE | Z return true. |
| OP_RETFALSE | Z return false. |
| OP_BREAK | B break R[a]. |
| OP_BLKPUSH | BS R[a] = block (16=m5:r1:m5:d1:lv4). |
| OP_ADD | B R[a] = R[a]+R[a+1]. |
| OP_ADDI | BB R[a] = R[a]+mrb_int(b). |
| OP_SUB | B R[a] = R[a]-R[a+1]. |
| OP_SUBI | BB R[a] = R[a]-mrb_int(b). |
| OP_ADDILV | BBB R[a] = R[a]+mrb_int(c); R[b],R[b+1] for method call. |
| OP_SUBILV | BBB R[a] = R[a]-mrb_int(c); R[b],R[b+1] for method call. |
| OP_MUL | B R[a] = R[a]*R[a+1]. |
| OP_DIV | B R[a] = R[a]/R[a+1]. |
| OP_EQ | B R[a] = R[a]==R[a+1]. |
| OP_LT | B R[a] = R[a]<R[a+1]. |
| OP_LE | B R[a] = R[a]<=R[a+1]. |
| OP_GT | B R[a] = R[a]>R[a+1]. |
| OP_GE | B R[a] = R[a]>=R[a+1]. |
| OP_ARRAY | BB R[a] = ary_new(R[a],R[a+1]..R[a+b]). |
| OP_ARRAY2 | BBB R[a] = ary_new(R[b],R[b+1]..R[b+c]). |
| OP_ARYCAT | B ary_cat(R[a],R[a+1]). |
| OP_ARYPUSH | BB ary_push(R[a],R[a+1]..R[a+b]). |
| OP_ARYSPLAT | B R[a] = ary_splat(R[a]). |
| OP_AREF | BBB R[a] = R[b][c]. |
| OP_ASET | BBB R[b][c] = R[a]. |
| OP_APOST | BBB *R[a],R[a+1]..R[a+c] = R[a][b..]. |
| OP_INTERN | B R[a] = intern(R[a]). |
| OP_SYMBOL | BB R[a] = intern(Pool[b]). |
| OP_STRING | BB R[a] = str_dup(Pool[b]). |
| OP_STRCAT | B str_cat(R[a],R[a+1]). |
| OP_HASH | BB R[a] = hash_new(R[a],R[a+1]..R[a+b*2-1]). |
| OP_HASHADD | BB hash_push(R[a],R[a+1]..R[a+b*2]). |
| OP_HASHCAT | B R[a] = hash_cat(R[a],R[a+1]). |
| OP_LAMBDA | BB R[a] = lambda(Irep[b],L_LAMBDA). |
| OP_BLOCK | BB R[a] = lambda(Irep[b],L_BLOCK). |
| OP_METHOD | BB R[a] = lambda(Irep[b],L_METHOD). |
| OP_RANGE_INC | B R[a] = range_new(R[a],R[a+1],FALSE). |
| OP_RANGE_EXC | B R[a] = range_new(R[a],R[a+1],TRUE). |
| OP_OCLASS | B R[a] = ::Object. |
| OP_CLASS | BB R[a] = newclass(R[a],Syms[b],R[a+1]). |
| OP_MODULE | BB R[a] = newmodule(R[a],Syms[b]). |
| OP_EXEC | BB R[a] = blockexec(R[a],Irep[b]). |
| OP_DEF | BB R[a].newmethod(Syms[b],R[a+1]); R[a] = Syms[b]. |
| OP_TDEF | BBB target_class.newmethod(Syms[b],Irep[c]); R[a] = Syms[b]. |
| OP_SDEF | BBB R[a].singleton_class.newmethod(Syms[b],Irep[c]); R[a] = Syms[b]. |
| OP_ALIAS | BB alias_method(target_class,Syms[a],Syms[b]). |
| OP_UNDEF | B undef_method(target_class,Syms[a]). |
| OP_SCLASS | B R[a] = R[a].singleton_class. |
| OP_TCLASS | B R[a] = target_class. |
| OP_DEBUG | BBB print a,b,c. |
| OP_ERR | B raise(LocalJumpError, Pool[a]). |
| OP_EXT1 | Z make 1st operand (a) 16bit. |
| OP_EXT2 | Z make 2nd operand (b) 16bit. |
| OP_EXT3 | Z make 1st and 2nd operands 16bit. |
| OP_STOP | Z stop VM. |