mirror of
https://github.com/AntKrotov/oberon-07-compiler.git
synced 2026-10-05 09:45:47 +00:00
RVM32I: сокращение системы команд
This commit is contained in:
1 parent
94e6484c8a
commit
049d48faa9
5 files changed
+128
-135
No files matched your search
Binary file not shown.
+103
-77
@@ -29,22 +29,22 @@ CONST
|
||||
|
||||
GPRs = {0 .. 2} + {5 .. numGPRs + 1};
|
||||
|
||||
opSTOP = 0; opRET = 1; opENTER = 2; opNEG = 3; opNOT = 4; opABS = 5;
|
||||
opSTOP = 0; opRET = 1; opENTER = 2; opNEG = 3; opNOT = 4; opNOP = 5;
|
||||
opXCHG = 6; opLDB = 7; opLDH = 8; opLDW = 9; opPUSH = 10; opPUSHC = 11;
|
||||
opPOP = 12; opLABEL = 13; opLEA = 14; opLLA = 15; opJNA = 16; opJGA = 17;
|
||||
opJLA = 18; opJMP = 19; opCALL = 20; opCALLI = 21;
|
||||
opPOP = 12; opLABEL = 13; opLEA = 14; opLLA = 15; (* 16, 17, 18 *)
|
||||
opJMP = 19; opCALL = 20; opCALLI = 21;
|
||||
|
||||
opMOV = 22; opMUL = 24; opADD = 26; opSUB = 28; opDIV = 30; opMOD = 32;
|
||||
opSTB = 34; opSTH = 36; opSTW = 38; opINCL = 40; opEXCL = 42;
|
||||
opIN = 44; opAND = 46; opOR = 48; opXOR = 50; opASR = 52; opLSR = 54;
|
||||
opLSL = 56; opROR = 58; opMIN = 60; opMAX = 62; opCMP = 64;
|
||||
opSTB = 34; opSTH = 36; opSTW = 38; (* 40, 42, 44 *)
|
||||
opAND = 46; opOR = 48; opXOR = 50; opASR = 52; opLSR = 54;
|
||||
opLSL = 56; opROR = 58; (* 60, 62 *) opCMP = 64;
|
||||
|
||||
opMOVC = 23; opMULC = 25; opADDC = 27; opSUBC = 29; opDIVC = 31; opMODC = 33;
|
||||
opSTBC = 35; opSTHC = 37; opSTWC = 39; opINCLC = 41; opEXCLC = 43;
|
||||
opINC = 45; opANDC = 47; opORC = 49; opXORC = 51; opASRC = 53; opLSRC = 55;
|
||||
opLSLC = 57; opRORC = 59; opMINC = 61; opMAXC = 63; opCMPC = 65;
|
||||
opSTBC = 35; opSTHC = 37; opSTWC = 39; (* 41, 43, 45 *)
|
||||
opANDC = 47; opORC = 49; opXORC = 51; opASRC = 53; opLSRC = 55;
|
||||
opLSLC = 57; opRORC = 59; (* 61, 63 *) opCMPC = 65;
|
||||
|
||||
opSYSCALL = 67; opJBT = 68; opADDRC = 69;
|
||||
opBIT = 66; opSYSCALL = 67; opJBT = 68; opADDRC = 69;
|
||||
|
||||
opJEQ = 70; opJNE = 71; opJLT = 72; opJGE = 73; opJGT = 74; opJLE = 75;
|
||||
opSEQ = 76; opSNE = 77; opSLT = 78; opSGE = 79; opSGT = 80; opSLE = 81;
|
||||
@@ -257,11 +257,37 @@ BEGIN
|
||||
END jcc;
|
||||
|
||||
|
||||
PROCEDURE shift1 (op, param: INTEGER);
|
||||
VAR
|
||||
r1, r2: INTEGER;
|
||||
|
||||
BEGIN
|
||||
r2 := GetAnyReg();
|
||||
Emit(opMOVC, r2, param);
|
||||
BinOp(r1, r2);
|
||||
Emit(op, r2, r1);
|
||||
mov(r1, r2);
|
||||
drop
|
||||
END shift1;
|
||||
|
||||
|
||||
PROCEDURE shift (op: INTEGER);
|
||||
VAR
|
||||
r1, r2: INTEGER;
|
||||
|
||||
BEGIN
|
||||
BinOp(r1, r2);
|
||||
Emit(op, r1, r2);
|
||||
drop
|
||||
END shift;
|
||||
|
||||
|
||||
PROCEDURE translate;
|
||||
VAR
|
||||
cmd, next: IL.COMMAND;
|
||||
opcode, param1, param2: INTEGER;
|
||||
r1, r2, r3: INTEGER;
|
||||
label: INTEGER;
|
||||
|
||||
BEGIN
|
||||
cmd := IL.codes.commands.first(IL.COMMAND);
|
||||
@@ -651,56 +677,28 @@ BEGIN
|
||||
Emit(opNOT, r1, 0)
|
||||
|
||||
|IL.opASR:
|
||||
BinOp(r1, r2);
|
||||
Emit(opASR, r1, r2);
|
||||
drop
|
||||
shift(opASR)
|
||||
|
||||
|IL.opLSL:
|
||||
BinOp(r1, r2);
|
||||
Emit(opLSL, r1, r2);
|
||||
drop
|
||||
shift(opLSL)
|
||||
|
||||
|IL.opROR:
|
||||
BinOp(r1, r2);
|
||||
Emit(opROR, r1, r2);
|
||||
drop
|
||||
shift(opROR)
|
||||
|
||||
|IL.opLSR:
|
||||
BinOp(r1, r2);
|
||||
Emit(opLSR, r1, r2);
|
||||
drop
|
||||
shift(opLSR)
|
||||
|
||||
|IL.opASR1:
|
||||
r2 := GetAnyReg();
|
||||
Emit(opMOVC, r2, param2);
|
||||
BinOp(r1, r2);
|
||||
Emit(opASR, r2, r1);
|
||||
mov(r1, r2);
|
||||
drop
|
||||
shift1(opASR, param2)
|
||||
|
||||
|IL.opLSL1:
|
||||
r2 := GetAnyReg();
|
||||
Emit(opMOVC, r2, param2);
|
||||
BinOp(r1, r2);
|
||||
Emit(opLSL, r2, r1);
|
||||
mov(r1, r2);
|
||||
drop
|
||||
shift1(opLSL, param2)
|
||||
|
||||
|IL.opROR1:
|
||||
r2 := GetAnyReg();
|
||||
Emit(opMOVC, r2, param2);
|
||||
BinOp(r1, r2);
|
||||
Emit(opROR, r2, r1);
|
||||
mov(r1, r2);
|
||||
drop
|
||||
shift1(opROR, param2)
|
||||
|
||||
|IL.opLSR1:
|
||||
r2 := GetAnyReg();
|
||||
Emit(opMOVC, r2, param2);
|
||||
BinOp(r1, r2);
|
||||
Emit(opLSR, r2, r1);
|
||||
mov(r1, r2);
|
||||
drop
|
||||
shift1(opLSR, param2)
|
||||
|
||||
|IL.opASR2:
|
||||
UnOp(r1);
|
||||
@@ -728,7 +726,11 @@ BEGIN
|
||||
|
||||
|IL.opABS:
|
||||
UnOp(r1);
|
||||
Emit(opABS, r1, 0)
|
||||
Emit(opCMPC, r1, 0);
|
||||
label := IL.NewLabel();
|
||||
Emit(opJGE, label, 0);
|
||||
Emit(opNEG, r1, 0);
|
||||
Emit(opLABEL, label, 0)
|
||||
|
||||
|IL.opLEN:
|
||||
UnOp(r1);
|
||||
@@ -761,17 +763,20 @@ BEGIN
|
||||
|IL.opENDSW:
|
||||
|
||||
|IL.opCASEL:
|
||||
Emit(opJLA, param1, param2)
|
||||
Emit(opCMPC, ACC, param1);
|
||||
Emit(opJLT, param2, 0)
|
||||
|
||||
|IL.opCASER:
|
||||
Emit(opJGA, param1, param2)
|
||||
Emit(opCMPC, ACC, param1);
|
||||
Emit(opJGT, param2, 0)
|
||||
|
||||
|IL.opCASELR:
|
||||
Emit(opCMPC, ACC, param1);
|
||||
IF param2 = cmd.param3 THEN
|
||||
Emit(opJNA, param1, param2)
|
||||
Emit(opJNE, param2, 0)
|
||||
ELSE
|
||||
Emit(opJLA, param1, param2);
|
||||
Emit(opJGA, param1, cmd.param3)
|
||||
Emit(opJLT, param2, 0);
|
||||
Emit(opJGT, cmd.param3, 0)
|
||||
END
|
||||
|
||||
|IL.opSBOOL:
|
||||
@@ -838,21 +843,31 @@ BEGIN
|
||||
|
||||
|IL.opINCL, IL.opEXCL:
|
||||
BinOp(r2, r1);
|
||||
Emit(opBIT, r2, r2);
|
||||
r3 := GetAnyReg();
|
||||
ldr32(r3, r1);
|
||||
IF opcode = IL.opINCL THEN
|
||||
Emit(opINCL, r1, r2)
|
||||
Emit(opOR, r3, r2)
|
||||
ELSE
|
||||
Emit(opEXCL, r1, r2)
|
||||
Emit(opNOT, r2, 0);
|
||||
Emit(opAND, r3, r2)
|
||||
END;
|
||||
str32(r1, r3);
|
||||
drop;
|
||||
drop;
|
||||
drop
|
||||
|
||||
|IL.opINCLC, IL.opEXCLC:
|
||||
UnOp(r1);
|
||||
r2 := GetAnyReg();
|
||||
ldr32(r2, r1);
|
||||
IF opcode = IL.opINCLC THEN
|
||||
Emit(opINCLC, r1, param2)
|
||||
Emit(opORC, r2, ORD({param2}))
|
||||
ELSE
|
||||
Emit(opEXCLC, r1, param2)
|
||||
Emit(opANDC, r2, ORD(-{param2}))
|
||||
END;
|
||||
str32(r1, r2);
|
||||
drop;
|
||||
drop
|
||||
|
||||
|IL.opEQB, IL.opNEB:
|
||||
@@ -942,40 +957,51 @@ BEGIN
|
||||
Emit(opCMPC, r1, 0);
|
||||
Emit(opSNE, r1, 0)
|
||||
|
||||
|IL.opMIN:
|
||||
|IL.opMIN, IL.opMAX:
|
||||
BinOp(r1, r2);
|
||||
Emit(opMIN, r1, r2);
|
||||
Emit(opCMP, r1, r2);
|
||||
label := IL.NewLabel();
|
||||
IF opcode = IL.opMIN THEN
|
||||
Emit(opJLE, label, 0)
|
||||
ELSE
|
||||
Emit(opJGE, label, 0)
|
||||
END;
|
||||
Emit(opMOV, r1, r2);
|
||||
Emit(opLABEL, label, 0);
|
||||
drop
|
||||
|
||||
|IL.opMAX:
|
||||
BinOp(r1, r2);
|
||||
Emit(opMAX, r1, r2);
|
||||
drop
|
||||
|
||||
|IL.opMINC:
|
||||
|IL.opMINC, IL.opMAXC:
|
||||
UnOp(r1);
|
||||
Emit(opMINC, r1, param2)
|
||||
|
||||
|IL.opMAXC:
|
||||
UnOp(r1);
|
||||
Emit(opMAXC, r1, param2)
|
||||
Emit(opCMPC, r1, param2);
|
||||
label := IL.NewLabel();
|
||||
IF opcode = IL.opMINC THEN
|
||||
Emit(opJLE, label, 0)
|
||||
ELSE
|
||||
Emit(opJGE, label, 0)
|
||||
END;
|
||||
Emit(opMOVC, r1, param2);
|
||||
Emit(opLABEL, label, 0)
|
||||
|
||||
|IL.opIN:
|
||||
BinOp(r1, r2);
|
||||
Emit(opIN, r1, r2);
|
||||
Emit(opBIT, r1, r1);
|
||||
Emit(opAND, r1, r2);
|
||||
Emit(opCMPC, r1, 0);
|
||||
Emit(opSNE, r1, 0);
|
||||
drop
|
||||
|
||||
|IL.opINL:
|
||||
r1 := GetAnyReg();
|
||||
movrc(r1, param2);
|
||||
BinOp(r2, r1);
|
||||
Emit(opIN, r1, r2);
|
||||
mov(r2, r1);
|
||||
drop
|
||||
UnOp(r1);
|
||||
Emit(opANDC, r1, ORD({param2}));
|
||||
Emit(opCMPC, r1, 0);
|
||||
Emit(opSNE, r1, 0)
|
||||
|
||||
|IL.opINR:
|
||||
UnOp(r1);
|
||||
Emit(opINC, r1, param2)
|
||||
Emit(opBIT, r1, r1);
|
||||
Emit(opANDC, r1, param2);
|
||||
Emit(opCMPC, r1, 0);
|
||||
Emit(opSNE, r1, 0)
|
||||
|
||||
|IL.opERR:
|
||||
CallRTL(IL._error, 4)
|
||||
|
||||
+14
-38
@@ -22,22 +22,22 @@ IMPORT SYSTEM, File, Args, Out, API, HOST;
|
||||
|
||||
CONST
|
||||
|
||||
opSTOP = 0; opRET = 1; opENTER = 2; opNEG = 3; opNOT = 4; opABS = 5;
|
||||
opSTOP = 0; opRET = 1; opENTER = 2; opNEG = 3; opNOT = 4; opNOP = 5;
|
||||
opXCHG = 6; opLDB = 7; opLDH = 8; opLDW = 9; opPUSH = 10; opPUSHC = 11;
|
||||
opPOP = 12; opLABEL = 13; opLEA = 14; opLLA = 15; opJNA = 16; opJGA = 17;
|
||||
opJLA = 18; opJMP = 19; opCALL = 20; opCALLI = 21;
|
||||
opPOP = 12; opLABEL = 13; opLEA = 14; opLLA = 15; (* 16, 17, 18 *)
|
||||
opJMP = 19; opCALL = 20; opCALLI = 21;
|
||||
|
||||
opMOV = 22; opMUL = 24; opADD = 26; opSUB = 28; opDIV = 30; opMOD = 32;
|
||||
opSTB = 34; opSTH = 36; opSTW = 38; opINCL = 40; opEXCL = 42;
|
||||
opIN = 44; opAND = 46; opOR = 48; opXOR = 50; opASR = 52; opLSR = 54;
|
||||
opLSL = 56; opROR = 58; opMIN = 60; opMAX = 62; opCMP = 64;
|
||||
opSTB = 34; opSTH = 36; opSTW = 38; (* 40, 42, 44 *)
|
||||
opAND = 46; opOR = 48; opXOR = 50; opASR = 52; opLSR = 54;
|
||||
opLSL = 56; opROR = 58; (* 60, 62 *) opCMP = 64;
|
||||
|
||||
opMOVC = 23; opMULC = 25; opADDC = 27; opSUBC = 29; opDIVC = 31; opMODC = 33;
|
||||
opSTBC = 35; opSTHC = 37; opSTWC = 39; opINCLC = 41; opEXCLC = 43;
|
||||
opINC = 45; opANDC = 47; opORC = 49; opXORC = 51; opASRC = 53; opLSRC = 55;
|
||||
opLSLC = 57; opRORC = 59; opMINC = 61; opMAXC = 63; opCMPC = 65;
|
||||
opSTBC = 35; opSTHC = 37; opSTWC = 39; (* 41, 43, 45 *)
|
||||
opANDC = 47; opORC = 49; opXORC = 51; opASRC = 53; opLSRC = 55;
|
||||
opLSLC = 57; opRORC = 59; (* 61, 63 *) opCMPC = 65;
|
||||
|
||||
opSYSCALL = 67; opJBT = 68; opADDRC = 69;
|
||||
opBIT = 66; opSYSCALL = 67; opJBT = 68; opADDRC = 69;
|
||||
|
||||
opJEQ = 70; opJNE = 71; opJLT = 72; opJGE = 73; opJGT = 74; opJLE = 75;
|
||||
opSEQ = 76; opSNE = 77; opSLT = 78; opSGE = 79; opSGT = 80; opSLE = 81;
|
||||
@@ -163,7 +163,7 @@ BEGIN
|
||||
|opPOP: SYSTEM.GET32(R[SP], R[param1]); INC(R[SP], 4)
|
||||
|opNEG: R[param1] := -R[param1]
|
||||
|opNOT: R[param1] := ORD(-BITS(R[param1]))
|
||||
|opABS: R[param1] := ABS(R[param1])
|
||||
|opNOP:
|
||||
|opXCHG: i := R[param1]; R[param1] := R[param2]; R[param2] := i
|
||||
|opLDB: i := param1 MOD 256; SYSTEM.GET8(R[param1 DIV 256] + param2, R[i]); R[i] := R[i] MOD 256
|
||||
|opLDH: i := param1 MOD 256; SYSTEM.GET16(R[param1 DIV 256] + param2, R[i]); R[i] := R[i] MOD 65536
|
||||
@@ -171,9 +171,6 @@ BEGIN
|
||||
|opPUSH: DEC(R[SP], 4); SYSTEM.PUT32(R[SP], R[param1])
|
||||
|opPUSHC: DEC(R[SP], 4); SYSTEM.PUT32(R[SP], param1)
|
||||
|opLLA: SYSTEM.GET32(SYSTEM.ADR(Labels[param2]), R[param1])
|
||||
|opJGA: IF R[ACC] > param1 THEN cmd := Labels[param2] END
|
||||
|opJLA: IF R[ACC] < param1 THEN cmd := Labels[param2] END
|
||||
|opJNA: IF R[ACC] # param1 THEN cmd := Labels[param2] END
|
||||
|opJMP: cmd := Labels[param1]
|
||||
|opCALL: DEC(R[SP], 4); SYSTEM.PUT(R[SP], cmd); cmd := Labels[param1]
|
||||
|opCALLI: DEC(R[SP], 4); SYSTEM.PUT(R[SP], cmd); SYSTEM.GET(SYSTEM.ADR(R[param1]), cmd)
|
||||
@@ -195,12 +192,6 @@ BEGIN
|
||||
|opSTBC: SYSTEM.PUT8(R[param1], param2)
|
||||
|opSTHC: SYSTEM.PUT16(R[param1], param2)
|
||||
|opSTWC: SYSTEM.PUT32(R[param1], param2)
|
||||
|opINCL: SYSTEM.GET32(R[param1], i); SYSTEM.PUT32(R[param1], ORD(BITS(i) + {R[param2]}))
|
||||
|opINCLC: SYSTEM.GET32(R[param1], i); SYSTEM.PUT32(R[param1], ORD(BITS(i) + {param2}))
|
||||
|opEXCL: SYSTEM.GET32(R[param1], i); SYSTEM.PUT32(R[param1], ORD(BITS(i) - {R[param2]}))
|
||||
|opEXCLC: SYSTEM.GET32(R[param1], i); SYSTEM.PUT32(R[param1], ORD(BITS(i) - {param2}))
|
||||
|opIN: R[param1] := ORD(R[param1] IN BITS(R[param2]))
|
||||
|opINC: R[param1] := ORD(R[param1] IN BITS(param2))
|
||||
|opAND: R[param1] := ORD(BITS(R[param1]) * BITS(R[param2]))
|
||||
|opANDC: R[param1] := ORD(BITS(R[param1]) * BITS(param2))
|
||||
|opOR: R[param1] := ORD(BITS(R[param1]) + BITS(R[param2]))
|
||||
@@ -215,10 +206,6 @@ BEGIN
|
||||
|opLSLC: R[param1] := LSL(R[param1], param2)
|
||||
|opROR: R[param1] := ROR(R[param1], R[param2])
|
||||
|opRORC: R[param1] := ROR(R[param1], param2)
|
||||
|opMIN: R[param1] := MIN(R[param1], R[param2])
|
||||
|opMINC: R[param1] := MIN(R[param1], param2)
|
||||
|opMAX: R[param1] := MAX(R[param1], R[param2])
|
||||
|opMAXC: R[param1] := MAX(R[param1], param2)
|
||||
|opLEA: R[param1 MOD 256] := Sections[param1 DIV 256] + param2
|
||||
(*|opLABEL:*)
|
||||
|opSYSCALL: syscall(R[param1])
|
||||
@@ -238,6 +225,7 @@ BEGIN
|
||||
|opSGT: R[param1] := ORD(~fl & ~fe)
|
||||
|opSGE: R[param1] := ORD(~fl)
|
||||
|opJBT: IF fb THEN cmd := Labels[param1] END
|
||||
|opBIT: R[param1] := ORD({R[param2]})
|
||||
END;
|
||||
cmd := cmd.next
|
||||
END
|
||||
@@ -379,7 +367,7 @@ BEGIN
|
||||
|opPOP: String("POP "); Reg(param1)
|
||||
|opNEG: String("NEG "); Reg(param1)
|
||||
|opNOT: String("NOT "); Reg(param1)
|
||||
|opABS: String("ABS "); Reg(param1)
|
||||
|opNOP: String("NOP")
|
||||
|opXCHG: String("XCHG "); Reg2(param1, param2)
|
||||
|opLDB: String("LDB "); Reg(param1 MOD 256); String(", ["); Reg(param1 DIV 256); String(" + "); Hex(param2); String("]")
|
||||
|opLDH: String("LDH "); Reg(param1 MOD 256); String(", ["); Reg(param1 DIV 256); String(" + "); Hex(param2); String("]")
|
||||
@@ -387,9 +375,6 @@ BEGIN
|
||||
|opPUSH: String("PUSH "); Reg(param1)
|
||||
|opPUSHC: String("PUSH "); Hex(param1)
|
||||
|opLLA: String("LLA "); RegL(param1, param2)
|
||||
|opJGA: String("JGA "); Hex(param1); String(", L"); Hex(param2)
|
||||
|opJLA: String("JLA "); Hex(param1); String(", L"); Hex(param2)
|
||||
|opJNA: String("JNA "); Hex(param1); String(", L"); Hex(param2)
|
||||
|opJMP: String("JMP L"); Hex(param1)
|
||||
|opCALL: String("CALL L"); Hex(param1)
|
||||
|opCALLI: String("CALL "); Reg(param1)
|
||||
@@ -411,12 +396,6 @@ BEGIN
|
||||
|opSTBC: String("STB ["); Reg(param1); String("], "); Hex(param2)
|
||||
|opSTHC: String("STH ["); Reg(param1); String("], "); Hex(param2)
|
||||
|opSTWC: String("STW ["); Reg(param1); String("], "); Hex(param2)
|
||||
|opINCL: String("INCL "); Reg2(param1, param2)
|
||||
|opINCLC: String("INCL "); RegC(param1, param2)
|
||||
|opEXCL: String("EXCL "); Reg2(param1, param2)
|
||||
|opEXCLC: String("EXCL "); RegC(param1, param2)
|
||||
|opIN: String("IN "); Reg2(param1, param2)
|
||||
|opINC: String("IN "); RegC(param1, param2)
|
||||
|opAND: String("AND "); Reg2(param1, param2)
|
||||
|opANDC: String("AND "); RegC(param1, param2)
|
||||
|opOR: String("OR "); Reg2(param1, param2)
|
||||
@@ -431,10 +410,6 @@ BEGIN
|
||||
|opLSLC: String("LSL "); RegC(param1, param2)
|
||||
|opROR: String("ROR "); Reg2(param1, param2)
|
||||
|opRORC: String("ROR "); RegC(param1, param2)
|
||||
|opMIN: String("MIN "); Reg2(param1, param2)
|
||||
|opMINC: String("MIN "); RegC(param1, param2)
|
||||
|opMAX: String("MAX "); Reg2(param1, param2)
|
||||
|opMAXC: String("MAX "); RegC(param1, param2)
|
||||
|opLEA: String("LEA "); Reg(param1 MOD 256); String(", "); String(Names[param1 DIV 256]); String(" + "); Hex(param2)
|
||||
|opADDRC: String("ADD "); Reg(param1 MOD 256); String(", "); Reg(param1 DIV 256); String(", "); Hex(param2)
|
||||
|opLABEL: String("L"); Hex(param1); String(":")
|
||||
@@ -454,6 +429,7 @@ BEGIN
|
||||
|opSGT: String("SGT "); Reg(param1)
|
||||
|opSGE: String("SGE "); Reg(param1)
|
||||
|opJBT: String("JBT L"); Hex(param1)
|
||||
|opBIT: String("BIT "); Reg2(param1, param2)
|
||||
END;
|
||||
Ln;
|
||||
cmd := cmd.next
|
||||
|
||||
+11
-20
@@ -93,10 +93,10 @@
|
||||
ENTER imm 2 imm 0 push BP; BP := SP; WHILE imm > 0 DO push 0; DEC(imm) END
|
||||
NEG Rn 3 n 0 Rn := -Rn
|
||||
NOT Rn 4 n 0 Rn := ORD(-BITS(Rn))
|
||||
ABS Rn 5 n 0 Rn := ABS(Rn)
|
||||
NOP 5 0 0 нет операции
|
||||
XCHG Rn, Rm 6 n m temp := Rn; Rn := Rm; Rm := temp
|
||||
LDB Rn, [Rm + imm] 7 m*256 + n imm Rn := BytePtr(Rm + imm)^
|
||||
LDH Rn, [Rm + imm] 8 m*256 + n imm Rn := Card16Ptr(Rm + imm)^
|
||||
LDB Rn, [Rm + imm] 7 m*256 + n imm Rn := UInt8Ptr(Rm + imm)^
|
||||
LDH Rn, [Rm + imm] 8 m*256 + n imm Rn := UInt16Ptr(Rm + imm)^
|
||||
LDW Rn, [Rm + imm] 9 m*256 + n imm Rn := Int32Ptr(Rm + imm)^
|
||||
PUSH Rn 10 n 0 DEC(SP, 4); Int32Ptr(SP)^ := Rn
|
||||
PUSH imm 11 imm 0 DEC(SP, 4); Int32Ptr(SP)^ := imm
|
||||
@@ -108,9 +108,7 @@
|
||||
LEA Rn, HEAP + imm 14 n + 300H imm Rn := imm + address(HEAP)
|
||||
LEA Rn, STACK + imm 14 n + 400H imm Rn := imm + address(STACK)
|
||||
LLA Rn, L#hex 15 n hex Rn := address(L#hex)
|
||||
JNA imm, L#hex 16 imm hex IF R0 # imm THEN goto L#hex
|
||||
JGA imm, L#hex 17 imm hex IF R0 > imm THEN goto L#hex
|
||||
JLA imm, L#hex 18 imm hex IF R0 < imm THEN goto L#hex
|
||||
|
||||
JMP L#hex 19 hex 0 goto L#hex
|
||||
CALL L#hex 20 hex 0 push PC; goto L#hex
|
||||
CALL Rn 21 n 0 push PC; goto Rn
|
||||
@@ -126,18 +124,13 @@
|
||||
DIV Rn, imm 31 n imm Rn := Rn DIV imm
|
||||
MOD Rn, Rm 32 n m Rn := Rn MOD Rm
|
||||
MOD Rn, imm 33 n imm Rn := Rn MOD imm
|
||||
STB [Rn + imm], Rm 34 n*256 + m imm BytePtr(Rn + imm)^ := Rm MOD 256
|
||||
STB [Rn], imm 35 n imm BytePtr(Rn)^ := imm MOD 256
|
||||
STH [Rn + imm], Rm 36 n*256 + m imm Card16Ptr(Rn + imm)^ := Rm MOD 65536
|
||||
STH [Rn], imm 37 n imm Card16Ptr(Rn)^ := imm MOD 65536
|
||||
STB [Rn + imm], Rm 34 n*256 + m imm UInt8Ptr(Rn + imm)^ := Rm MOD 256
|
||||
STB [Rn], imm 35 n imm UInt8Ptr(Rn)^ := imm MOD 256
|
||||
STH [Rn + imm], Rm 36 n*256 + m imm UInt16Ptr(Rn + imm)^ := Rm MOD 65536
|
||||
STH [Rn], imm 37 n imm UInt16Ptr(Rn)^ := imm MOD 65536
|
||||
STW [Rn + imm], Rm 38 n*256 + m imm Int32Ptr(Rn + imm)^ := Rm
|
||||
STW [Rn], imm 39 n imm Int32Ptr(Rn)^ := imm
|
||||
INCL Rn, Rm 40 n m Int32Ptr(Rn)^ := ORD(BITS(Int32Ptr(Rn)^) + {Rm})
|
||||
INCL Rn, imm 41 n imm Int32Ptr(Rn)^ := ORD(BITS(Int32Ptr(Rn)^) + {imm})
|
||||
EXCL Rn, Rm 42 n m Int32Ptr(Rn)^ := ORD(BITS(Int32Ptr(Rn)^) - {Rm})
|
||||
EXCL Rn, imm 43 n imm Int32Ptr(Rn)^ := ORD(BITS(Int32Ptr(Rn)^) - {imm})
|
||||
IN Rn, Rm 44 n m Rn := ORD(Rn IN Rm)
|
||||
IN Rn, imm 45 n imm Rn := ORD(Rn IN imm)
|
||||
|
||||
AND Rn, Rm 46 n m Rn := ORD(BITS(Rn) * BITS(Rm))
|
||||
AND Rn, imm 47 n imm Rn := ORD(BITS(Rn) * BITS(imm))
|
||||
OR Rn, Rm 48 n m Rn := ORD(BITS(Rn) + BITS(Rm))
|
||||
@@ -152,12 +145,10 @@
|
||||
LSL Rn, imm 57 n imm Rn := LSL(Rn, imm)
|
||||
ROR Rn, Rm 58 n m Rn := ROR(Rn, Rm)
|
||||
ROR Rn, imm 59 n imm Rn := ROR(Rn, imm)
|
||||
MIN Rn, Rm 60 n m IF Rm < Rn THEN Rn := Rm
|
||||
MIN Rn, imm 61 n imm IF imm < Rn THEN Rn := imm
|
||||
MAX Rn, Rm 62 n m IF Rm > Rn THEN Rn := Rm
|
||||
MAX Rn, imm 63 n imm IF imm > Rn THEN Rn := imm
|
||||
|
||||
CMP Rn, Rm 64 n m сравнить Rn и Rm
|
||||
CMP Rn, imm 65 n imm сравнить Rn и imm
|
||||
BIT Rn, Rm 66 n m Rn := ORD({Rm})
|
||||
SYSCALL Rn 67 n 0 системный вызов; Rn содержит адрес параметров
|
||||
JBT L#hex 68 hex 0 перейти на метку L#hex, если "ниже"
|
||||
ADD Rn, Rm, imm 69 m*256 + n imm Rn := Rm + imm
|
||||
|
||||
Reference in new issue
Block a user