Subversion Repositories Kolibri OS

Compare Revisions

Regard whitespace Rev 7666 → Rev 7667

/programs/develop/oberon07/Compiler.kex
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/programs/develop/oberon07/Source/AMD64.ob07
666,6 → 666,7
reg: INTEGER;
max: INTEGER;
loop: INTEGER;
param2: INTEGER;
 
BEGIN
loop := 1;
730,11 → 731,38
 
|CODE.opCALL, CODE.opCALLP, CODE.opCALLI,
CODE.opWIN64CALL, CODE.opWIN64CALLP, CODE.opWIN64CALLI,
CODE.opSYSVCALL, CODE.opSYSVCALLP, CODE.opSYSVCALLI:
CODE.opSYSVCALL, CODE.opSYSVCALLP, CODE.opSYSVCALLI,
 
CODE.opSAVES, CODE.opRSET, CODE.opRSETR,
CODE.opRSETL, CODE.opRSET1,
CODE.opEQS .. CODE.opGES,
CODE.opEQS2 .. CODE.opGES2,
CODE.opEQSW .. CODE.opGESW,
CODE.opEQSW2 .. CODE.opGESW2,
CODE.opCOPY, CODE.opMOVE, CODE.opCOPYA,
CODE.opCOPYS, CODE.opCOPYS2, CODE.opROT,
CODE.opNEW, CODE.opDISP, CODE.opISREC,
CODE.opIS, CODE.opTYPEGR, CODE.opTYPEGP,
CODE.opCASET, CODE.opDIV,
CODE.opDIVL, CODE.opMOD,
CODE.opMODL, CODE.opLENGTH, CODE.opLENGTHW:
leaf := FALSE
 
|CODE.opDIVR, CODE.opMODR:
param2 := cur.param2;
IF param2 >= 1 THEN
param2 := X86.log2(param2)
ELSIF param2 <= -1 THEN
param2 := X86.log2(-param2)
ELSE
param2 := -1
END;
IF param2 < 0 THEN
leaf := FALSE
END
 
ELSE
 
END;
cur := cur.next(COMMAND)
UNTIL leave OR ~leaf;
1427,6 → 1455,14
PushAll(n)
END
 
|CODE.opACC:
IF (R.top # 0) OR (R.stk[0] # rax) THEN
PushAll(0);
GetRegA;
pop(rax);
DEC(R.pushed)
END
 
|CODE.opJNZ:
UnOp(reg1);
test(reg1);
/programs/develop/oberon07/Source/CODE.ob07
90,7 → 90,9
opWIN64CALL* = 238; opWIN64CALLI* = 239; opWIN64CALLP* = 240; opLOOP* = 241; opENDLOOP* = 242;
opSYSVCALL* = 243; opSYSVCALLI* = 244; opSYSVCALLP* = 245; opSYSVALIGN16* = 246; opWIN64ALIGN16* = 247;
 
opACC* = 248;
 
 
opSADR_PARAM* = 1000; opLOAD64_PARAM* = 1001; opLLOAD64_PARAM* = 1002; opGLOAD64_PARAM* = 1003;
opVADR_PARAM* = 1004; opCONST_PARAM* = 1005; opGLOAD32_PARAM* = 1006; opLLOAD32_PARAM* = 1007;
opLOAD32_PARAM* = 1008;
/programs/develop/oberon07/Source/STATEMENTS.ob07
1861,6 → 1861,7
IF e.obj = eCONST THEN
CODE.AddCmd(CODE.opCONST, ORD(ARITH.getBool(e.value)))
END;
CODE.AddCmd0(CODE.opACC);
CODE.AddJmpCmd(CODE.opJZ, label);
CODE.drop
END
1983,8 → 1984,9
e.obj := eEXPR;
IF e1.obj = eCONST THEN
CODE.AddCmd(CODE.opCONST, ORD(ARITH.getBool(e1.value)))
END;
CODE.AddCmd0(CODE.opACC)
END
END
 
END
END;
2056,6 → 2058,7
IF e.obj = eCONST THEN
CODE.AddCmd(CODE.opCONST, ORD(ARITH.getBool(e.value)))
END;
CODE.AddCmd0(CODE.opACC);
CODE.AddJmpCmd(CODE.opJNZ, label);
CODE.drop
END
2122,8 → 2125,9
e.obj := eEXPR;
IF e1.obj = eCONST THEN
CODE.AddCmd(CODE.opCONST, ORD(ARITH.getBool(e1.value)))
END;
CODE.AddCmd0(CODE.opACC)
END
END
 
END
END;
/programs/develop/oberon07/Source/STRINGS.ob07
1,7 → 1,7
(*
BSD 2-Clause License
 
Copyright (c) 2018, Anton Krotov
Copyright (c) 2018, 2019, Anton Krotov
All rights reserved.
*)
 
255,19 → 255,19
|0C1X..0DFX:
u := LSL(ORD(c) - 0C0H, 6);
IF i + 1 < srclen THEN
u := u + ROR(LSL(ORD(src[i + 1]), 26), 26);
INC(i)
INC(i);
INC(u, ORD(BITS(ORD(src[i])) * {0..5}))
END
 
|0E1X..0EFX:
u := LSL(ORD(c) - 0E0H, 12);
IF i + 1 < srclen THEN
u := u + ROR(LSL(ORD(src[i + 1]), 26), 20);
INC(i)
INC(i);
INC(u, ORD(BITS(ORD(src[i])) * {0..5}) * 64)
END;
IF i + 1 < srclen THEN
u := u + ROR(LSL(ORD(src[i + 1]), 26), 26);
INC(i)
INC(i);
INC(u, ORD(BITS(ORD(src[i])) * {0..5}))
END
(*
|0F1X..0F7X:
/programs/develop/oberon07/Source/X86.ob07
308,6 → 308,12
END setcc;
 
 
PROCEDURE xor (reg1, reg2: INTEGER);
BEGIN
OutByte2(31H, 0C0H + reg2 * 8 + reg1) // xor reg1, reg2
END xor;
 
 
PROCEDURE drop;
BEGIN
REG.Drop(R)
937,7 → 943,7
ELSIF a = -1 THEN
neg(reg1)
ELSIF a = 0 THEN
OutByte2(31H, 0C0H + reg1 * 9) // xor reg1, reg1
xor(reg1, reg1)
ELSE
IF n > 0 THEN
IF a < 0 THEN
1080,7 → 1086,7
reg1 := REG.GetAnyReg(R);
setcc(cc + 16, reg1);
andrc(reg1, 1)
END;
END
 
|CODE.opGT, CODE.opGE, CODE.opLT,
CODE.opLE, CODE.opEQ, CODE.opNE:
1129,6 → 1135,14
END;
andrc(reg1, 1)
 
|CODE.opACC:
IF (R.top # 0) OR (R.stk[0] # eax) THEN
PushAll(0);
GetRegA;
pop(eax);
DEC(R.pushed)
END
 
|CODE.opDROP:
UnOp(reg1);
drop
1344,7 → 1358,7
 
|CODE.opDIVS:
BinOp(reg1, reg2);
OutByte2(31H, 0C0H + reg2 * 8 + reg1); // xor reg1, reg2
xor(reg1, reg2);
drop
 
|CODE.opDIVSC:
1478,7 → 1492,7
BinOp(reg1, reg2);
cmprc(reg1, 32);
OutByte2(72H, 4); // jb L
OutByte2(31H, 0C0H + reg1 * 9); // xor reg1, reg1
xor(reg1, reg1);
jmp(label);
//L:
OutByte3(0FH, 0A3H, 0C0H + reg2 + 8 * reg1); // bt reg2, reg1
1493,7 → 1507,7
reg2 := REG.GetAnyReg(R);
cmprc(reg1, 32);
OutByte2(72H, 4); // jb L
OutByte2(31H, 0C0H + reg1 * 9); // xor reg1, reg1
xor(reg1, reg1);
jmp(label);
//L:
movrc(reg2, param2);
1631,7 → 1645,7
 
IF ABS(a) = 1 THEN
UnOp(reg1);
OutByte2(31H, 0C0H + reg1 * 9) // xor reg1, reg1
xor(reg1, reg1)
ELSE
IF n > 0 THEN
UnOp(reg1);