x86_64: исправление ошибки; STM32, RVM32I: небольшие оптимизации

This commit is contained in:
AntKrotov committed 2021-01-31 20:09:39 +03:00
1 parent 49df8280ac
commit 27862419ee
9 files changed
+77 -25

No files matched your search

BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
+2 -2
View File
@@ -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
+1 -1
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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);
+1
View File
@@ -24,6 +24,7 @@ CONST
vMajor* = 1;
vMinor* = 49;
Date* = "2021-01-31";
FILE_EXT* = ".ob07";
RTL_NAME* = "RTL";