Skip to content

Commit 86f1b3b

Browse files
authored
Merge pull request #185 from shattered/_01ed167f
Another round of cheap optimizations.
2 parents a453464 + 2d7ec8a commit 86f1b3b

3 files changed

Lines changed: 20 additions & 29 deletions

File tree

src/cowbe/arch68000.cow.ng

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -415,20 +415,24 @@ gen RETURN() uses all
415415

416416
// --- Miscellaneous --------------------------------------------------------
417417

418-
gen dreg|any|any := CONSTANT():c
418+
gen dreg|any := CONSTANT():c
419419
{
420420
var r := RegCacheFindConstant($c.value as uint32);
421421
if r != 0 then
422422
if (r & $$) != 0 then
423423
return;
424424
end if;
425-
r := FindFirst(r);
426425
E_insn("move.l");
427-
E_reg(r);
426+
E_reg(FindFirst(r));
428427
else
429-
E_insn("move.l");
430-
E_const();
431-
E_i32($c.value);
428+
if $c.value == 0 then
429+
E_insn("sub.l");
430+
E_reg($$);
431+
else
432+
E_insn("move.l");
433+
E_const();
434+
E_i32($c.value);
435+
end if;
432436
end if;
433437
E_comma();
434438
E_reg($$);
@@ -445,9 +449,8 @@ gen areg := ADDRESS():a
445449
if (r & $$) != 0 then
446450
return;
447451
end if;
448-
r := FindFirst(r);
449452
E_insn("move.l");
450-
E_reg(r);
453+
E_reg(FindFirst(r));
451454
else
452455
E_insn("lea");
453456
E_openp();
@@ -617,13 +620,12 @@ gen imm := CONSTANT():c cost 5
617620
if (r & dest) != 0 then
618621
return;
619622
end if;
620-
r := FindFirst(r);
621623
E_insn("move.l");
622-
E_reg(r);
624+
E_reg(FindFirst(r));
623625
E_comma();
624626
E_reg(dest);
625627
else
626-
RegCacheFlushValues();
628+
RegCacheFlushValue(sym, off);
627629

628630
E_insn(insn);
629631
E_openp();

src/cowbe/archpdp11.cow.ng

Lines changed: 6 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -142,12 +142,8 @@
142142
end sub;
143143

144144
sub E_push4(src: RegId) is
145-
E_insn16("MOV");
146-
E_reg(loreg(src));
147-
E(", -(SP)\n");
148-
E_insn16("MOV");
149-
E_reg(hireg(src));
150-
E(", -(SP)\n");
145+
E_push(loreg(src));
146+
E_push(hireg(src));
151147
end sub;
152148

153149
sub E_pop(dest: RegId) is
@@ -158,13 +154,8 @@
158154
end sub;
159155

160156
sub E_pop4(dest: RegId) is
161-
R_flush(dest);
162-
E("\tMOV\t(SP)+, ");
163-
E_reg(hireg(dest));
164-
E_nl();
165-
E("\tMOV\t(SP)+, ");
166-
E_reg(loreg(dest));
167-
E_nl();
157+
E_pop(hireg(dest));
158+
E_pop(loreg(dest));
168159
end sub;
169160

170161
sub E_mov(reg: RegId) is
@@ -606,7 +597,7 @@
606597
E_u8(value);
607598
E_comma();
608599
else
609-
E_insn16("asl");
600+
E_insn("asl", reg);
610601
end if;
611602
E_reg(reg);
612603
E_nl();
@@ -686,8 +677,7 @@
686677
E_nl();
687678
value := value - 8;
688679
end if;
689-
var v := value as uint8;
690-
if v > 0 then
680+
if value > 0 then
691681
while value > 0 loop
692682
E_insn16("CLC");
693683
E_nl();

src/cowbe/archz80.cow.ng

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -649,8 +649,7 @@
649649
return;
650650
elseif cache != 0 then
651651
# The value is already in a register, but not this one.
652-
cache := FindFirst(cache);
653-
ArchEmitMove(cache, reg);
652+
ArchEmitMove(FindFirst(cache), reg);
654653
return;
655654
end if;
656655

0 commit comments

Comments
 (0)