mirror of
https://github.com/AntKrotov/oberon-07-compiler.git
synced 2026-10-05 09:45:47 +00:00
x86_64: исправление ошибки; STM32, RVM32I: небольшие оптимизации
This commit is contained in:
1 parent
49df8280ac
commit
27862419ee
9 files changed
+77
-25
No files matched your search
Binary file not shown.
+2
-2
@@ -1498,8 +1498,7 @@ BEGIN
|
||||
|
||||
|IL.opPUSHT:
|
||||
UnOp(reg1);
|
||||
reg2 := GetAnyReg();
|
||||
movrm(reg2, reg1, -8)
|
||||
movrm(GetAnyReg(), reg1, -8)
|
||||
|
||||
|IL.opISREC:
|
||||
PushAll(2);
|
||||
@@ -1710,6 +1709,7 @@ BEGIN
|
||||
END
|
||||
END
|
||||
ELSIF isLong(param2) THEN
|
||||
UnOp(reg1);
|
||||
addrc(reg1, param2)
|
||||
END
|
||||
|
||||
|
||||
@@ -201,7 +201,7 @@ BEGIN
|
||||
|
||||
C.Ln;
|
||||
C.String("Akron Oberon Compiler v"); C.Int(UTILS.vMajor); C.String("."); C.Int2(UTILS.vMinor);
|
||||
C.String(" ("); C.Int(UTILS.bit_depth); C.StringLn("-bit) 2021-01-29");
|
||||
C.String(" ("); C.Int(UTILS.bit_depth); C.StringLn("-bit) " + UTILS.Date);
|
||||
C.StringLn("Copyright (c) 2018-2021, Anton Krotov");
|
||||
|
||||
IF inname = "" THEN
|
||||
|
||||
+21
-3
@@ -1,7 +1,7 @@
|
||||
(*
|
||||
BSD 2-Clause License
|
||||
|
||||
Copyright (c) 2018-2020, Anton Krotov
|
||||
Copyright (c) 2018-2021, Anton Krotov
|
||||
All rights reserved.
|
||||
*)
|
||||
|
||||
@@ -493,14 +493,32 @@ BEGIN
|
||||
set(cur, opGADR_SAVEC, param2)
|
||||
|
||||
ELSIF (nov.opcode = opMULC) & (old_opcode = opMULC) THEN
|
||||
cur.param2 := param2 * cur.param2
|
||||
cur.param2 := cur.param2 * param2
|
||||
|
||||
ELSIF (nov.opcode = opADDC) & (old_opcode = opADDC) THEN
|
||||
cur.param2 := param2 + cur.param2
|
||||
INC(cur.param2, param2)
|
||||
|
||||
ELSE
|
||||
old_opcode := -1
|
||||
END
|
||||
|
||||
ELSIF CPU IN {TARGETS.cpuTHUMB, TARGETS.cpuRVM32I} THEN
|
||||
|
||||
old_opcode := cur.opcode;
|
||||
param2 := nov.param2;
|
||||
|
||||
IF (old_opcode = opLADR) & (nov.opcode = opSAVE) THEN
|
||||
cur.opcode := opLADR_SAVE
|
||||
ELSIF (old_opcode = opLADR) & (nov.opcode = opINCC) THEN
|
||||
set(cur, opLADR_INCC, param2)
|
||||
ELSIF (nov.opcode = opMULC) & (old_opcode = opMULC) THEN
|
||||
cur.param2 := cur.param2 * param2
|
||||
ELSIF (nov.opcode = opADDC) & (old_opcode = opADDC) THEN
|
||||
INC(cur.param2, param2)
|
||||
ELSE
|
||||
old_opcode := -1
|
||||
END
|
||||
|
||||
ELSE
|
||||
old_opcode := -1
|
||||
END;
|
||||
|
||||
+13
-4
@@ -916,10 +916,7 @@ BEGIN
|
||||
|
||||
|IL.opPUSHT:
|
||||
UnOp(r1);
|
||||
r2 := GetAnyReg();
|
||||
mov(r2, r1);
|
||||
subrc(r2, 4);
|
||||
ldr32(r2, r2)
|
||||
Emit(opLDW, r1 * 256 + GetAnyReg(), -4)
|
||||
|
||||
|IL.opGET, IL.opGETC:
|
||||
IF opcode = IL.opGET THEN
|
||||
@@ -1203,6 +1200,18 @@ BEGIN
|
||||
|IL.opCODE:
|
||||
OutInt(param2)
|
||||
|
||||
|IL.opLADR_SAVE:
|
||||
UnOp(r1);
|
||||
Emit(opSTW, BP * 256 + r1, param2 * 4);
|
||||
drop
|
||||
|
||||
|IL.opLADR_INCC:
|
||||
r1 := GetAnyReg();
|
||||
Emit(opLDW, BP * 256 + r1, param1 * 4);
|
||||
Emit(opADDC, r1, param2);
|
||||
Emit(opSTW, BP * 256 + r1, param1 * 4);
|
||||
drop
|
||||
|
||||
END;
|
||||
|
||||
cmd := cmd.next(IL.COMMAND)
|
||||
|
||||
+6
-10
@@ -1913,10 +1913,8 @@ VAR
|
||||
label := IL.NewLabel()
|
||||
END;
|
||||
|
||||
IF e.obj = eCONST THEN
|
||||
IF isBoolean(e) THEN
|
||||
IL.Const(ORD(ARITH.getBool(e.value)))
|
||||
END
|
||||
IF (e.obj = eCONST) & isBoolean(e) THEN
|
||||
IL.Const(ORD(ARITH.getBool(e.value)))
|
||||
END;
|
||||
IL.AndOrOpt(label)
|
||||
END
|
||||
@@ -2033,7 +2031,7 @@ VAR
|
||||
|SCAN.lxAND:
|
||||
PARS.check(isBoolean(e) & isBoolean(e1), pos, 37);
|
||||
|
||||
IF (e.obj = eCONST) & (e1.obj = eCONST) THEN
|
||||
IF (e.obj = eCONST) & (e1.obj = eCONST) & parser.constexp THEN
|
||||
ARITH.opBoolean(e.value, e1.value, "&")
|
||||
ELSE
|
||||
e.obj := eEXPR;
|
||||
@@ -2120,10 +2118,8 @@ VAR
|
||||
label := IL.NewLabel()
|
||||
END;
|
||||
|
||||
IF e.obj = eCONST THEN
|
||||
IF isBoolean(e) THEN
|
||||
IL.Const(ORD(ARITH.getBool(e.value)))
|
||||
END
|
||||
IF (e.obj = eCONST) & isBoolean(e) THEN
|
||||
IL.Const(ORD(ARITH.getBool(e.value)))
|
||||
END;
|
||||
IL.not;
|
||||
IL.AndOrOpt(label)
|
||||
@@ -2207,7 +2203,7 @@ VAR
|
||||
|SCAN.lxOR:
|
||||
PARS.check(isBoolean(e) & isBoolean(e1), pos, 37);
|
||||
|
||||
IF (e.obj = eCONST) & (e1.obj = eCONST) THEN
|
||||
IF (e.obj = eCONST) & (e1.obj = eCONST) & parser.constexp THEN
|
||||
ARITH.opBoolean(e.value, e1.value, "|")
|
||||
ELSE
|
||||
e.obj := eEXPR;
|
||||
|
||||
+33
-5
@@ -935,11 +935,7 @@ BEGIN
|
||||
SubImm8(r, -n)
|
||||
END
|
||||
ELSIF (_THUMB2 IN Target.InstrSet) & (-4095 <= n) & (n <= 4095) THEN
|
||||
IF n > 0 THEN
|
||||
AddSubImm12(r, n, FALSE)
|
||||
ELSE
|
||||
AddSubImm12(r, -n, TRUE)
|
||||
END
|
||||
AddSubImm12(r, ABS(n), n < 0)
|
||||
ELSE
|
||||
r2 := GetAnyReg();
|
||||
ASSERT(r2 # r);
|
||||
@@ -1211,6 +1207,38 @@ BEGIN
|
||||
reloc(r1, BIN.RBSS + pic, param2);
|
||||
Ldr8(r1, r1)
|
||||
|
||||
|IL.opLADR_SAVE:
|
||||
UnOp(r1);
|
||||
n := LocalOffset(param2);
|
||||
IF n <= 255 THEN
|
||||
gen11(FALSE, r1, n) (* str r1, [sp, n*4] *)
|
||||
ELSE
|
||||
LocAdr(param2);
|
||||
BinOp(r1, r2);
|
||||
Str32(r1, r2);
|
||||
drop
|
||||
END;
|
||||
drop
|
||||
|
||||
|IL.opLADR_INCC:
|
||||
n := LocalOffset(param1);
|
||||
IF n <= 255 THEN
|
||||
r1 := GetAnyReg();
|
||||
LdrSp(r1, n);
|
||||
AddConst(r1, param2);
|
||||
gen11(FALSE, r1, n) (* str r1, [sp, n*4] *)
|
||||
ELSE
|
||||
LocAdr(param1);
|
||||
r1 := GetAnyReg();
|
||||
BinOp(r2, r1);
|
||||
Ldr32(r1, r2);
|
||||
AddConst(r1, param2);
|
||||
BinOp(r2, r1);
|
||||
Str32(r1, r2);
|
||||
drop
|
||||
END;
|
||||
drop
|
||||
|
||||
|IL.opLLOAD32, IL.opVADR, IL.opVLOAD32:
|
||||
r1 := GetAnyReg();
|
||||
n := LocalOffset(param2);
|
||||
|
||||
@@ -24,6 +24,7 @@ CONST
|
||||
|
||||
vMajor* = 1;
|
||||
vMinor* = 49;
|
||||
Date* = "2021-01-31";
|
||||
|
||||
FILE_EXT* = ".ob07";
|
||||
RTL_NAME* = "RTL";
|
||||
|
||||
Reference in new issue
Block a user