File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff 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();
Original file line number Diff line number Diff line change 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
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
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();
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();
Original file line number Diff line number Diff line change 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
You can’t perform that action at this time.
0 commit comments