commit b07998c29e9de4be362348f8e9594b43841f92ed
parent df3145130f30f5a6499f50e5a1111cb58b6ab40c
Author: erai <erai@omiltem.net>
Date: Fri, 31 Jan 2025 21:28:12 +0000
moveabs -> mov (where possible)
Diffstat:
3 files changed, 28 insertions(+), 3 deletions(-)
diff --git a/as.om b/as.om
@@ -546,6 +546,7 @@ func emit_sections(c: *assembler): int {
var s: *section;
var y: *symbol;
var n: int;
+ var here: int;
add_symbol(c, "", nil);
@@ -553,10 +554,15 @@ func emit_sections(c: *assembler): int {
s.start = 0;
s.end = 0;
+ here = c.at;
+
emit_align(c, 4096, OP_NOP);
add_section(c, ".rodata", SHT_PROGBITS);
+ s = find_section(c, ".text");
+ s.end = here;
+
emit_blobs(c, c.blobs);
emit_align(c, 4096, 0);
@@ -760,7 +766,7 @@ func emit_sections(c: *assembler): int {
as_emit(c, n >> 24);
// align
- as_emit(c, 0);
+ as_emit(c, 1);
as_emit(c, 0);
as_emit(c, 0);
as_emit(c, 0);
diff --git a/cc0.c b/cc0.c
@@ -3442,12 +3442,16 @@ unsigned long( my_emit_sections)(struct my_assembler* my_c){
struct my_section* my_s = 0;
struct my_symbol* my_y = 0;
unsigned long my_n = 0;
+ unsigned long my_here = 0;
(my_add_symbol)((my_c),((unsigned char *)""),((void *)0));
(my_s)=((my_find_section)((my_c),((unsigned char *)"")));
((my_s)->my_start)=(0UL);
((my_s)->my_end)=(0UL);
+ (my_here)=((my_c)->my_at);
(my_emit_align)((my_c),(4096UL),(my_OP_NOP));
(my_add_section)((my_c),((unsigned char *)".rodata"),(my_SHT_PROGBITS));
+ (my_s)=((my_find_section)((my_c),((unsigned char *)".text")));
+ ((my_s)->my_end)=(my_here);
(my_emit_blobs)((my_c),((my_c)->my_blobs));
(my_emit_align)((my_c),(4096UL),(0UL));
(my_add_section)((my_c),((unsigned char *)".strtab"),(my_SHT_STRTAB));
@@ -3603,7 +3607,7 @@ unsigned long( my_emit_sections)(struct my_assembler* my_c){
(my_as_emit)((my_c),((unsigned long)(((unsigned long)(my_n))>>((unsigned long)(8UL)))));
(my_as_emit)((my_c),((unsigned long)(((unsigned long)(my_n))>>((unsigned long)(16UL)))));
(my_as_emit)((my_c),((unsigned long)(((unsigned long)(my_n))>>((unsigned long)(24UL)))));
- (my_as_emit)((my_c),(0UL));
+ (my_as_emit)((my_c),(1UL));
(my_as_emit)((my_c),(0UL));
(my_as_emit)((my_c),(0UL));
(my_as_emit)((my_c),(0UL));
@@ -5683,7 +5687,13 @@ void( my_output_irexpr)(struct my_irfunc* my_ic,struct my_irblock* my_b,struct m
} else if ((unsigned long)(((long)(my_kind))==((long)(my_IOP_FUNC)))) {
(my_output_irfuncptr)((my_ic),(my_b),(my_o));
} else if ((unsigned long)(((long)(my_kind))==((long)(my_IOP_CONST)))) {
+ if ((unsigned long)(((long)((my_o)->my_n))==((long)(0UL)))) {
+ (my_as_modrr)(((my_ic)->my_s),(my_OP_XORRM),(my_R_RAX),(my_R_RAX));
+ } else if ((unsigned long)(((unsigned long)(((long)((my_o)->my_n))<((long)((unsigned long)(((unsigned long)((unsigned long)(-(unsigned long)(1UL))))>>((unsigned long)(33UL)))))))&&((unsigned long)(((long)((my_o)->my_n))>=((long)((unsigned long)(((unsigned long)((unsigned long)(-(unsigned long)(1UL))))<<((unsigned long)(31UL))))))))) {
+ (my_as_modri)(((my_ic)->my_s),(my_OP_MOVI),(my_R_RAX),((my_o)->my_n));
+ } else {
(my_as_opri64)(((my_ic)->my_s),(my_OP_MOVABS),(my_R_RAX),((my_o)->my_n));
+ }
} else if ((unsigned long)(((long)(my_kind))==((long)(my_IOP_STR)))) {
(my_output_irstr)((my_ic),(my_b),(my_o));
} else if ((unsigned long)(((long)(my_kind))==((long)(my_IOP_LOAD)))) {
@@ -5950,6 +5960,7 @@ void( my_output_irstmt)(struct my_irfunc* my_ic,struct my_irblock* my_b,struct m
void( my_output_irstr)(struct my_irfunc* my_ic,struct my_irblock* my_b,struct my_irop* my_o){
struct my_label* my_s = 0;
(my_s)=((my_as_blob)(((my_ic)->my_s),((my_o)->my_s),((unsigned long)(((unsigned long)((my_o)->my_slen))+((unsigned long)(1UL))))));
+ (my_reserve)(((my_ic)->my_s),(16UL));
(my_as_modrm)(((my_ic)->my_s),(my_OP_LEA),(my_R_RAX),(my_R_RIP),(0UL),(0UL),(128UL));
(my_addfixup)(((my_ic)->my_s),(my_s));
}
diff --git a/ir.om b/ir.om
@@ -1891,6 +1891,8 @@ func output_irstr(ic: *irfunc, b: *irblock, o: *irop) {
var s: *label;
s = as_blob(ic.s, o.s, o.slen + 1);
+
+ reserve(ic.s, 16);
as_modrm(ic.s, OP_LEA, R_RAX, R_RIP, 0, 0, 128);
addfixup(ic.s, s);
}
@@ -1922,7 +1924,13 @@ func output_irexpr(ic: *irfunc, b: *irblock, o: *irop) {
} else if kind == IOP_FUNC {
output_irfuncptr(ic, b, o);
} else if kind == IOP_CONST {
- as_opri64(ic.s, OP_MOVABS, R_RAX, o.n);
+ if o.n == 0 {
+ as_modrr(ic.s, OP_XORRM, R_RAX, R_RAX);
+ } else if o.n < (-1 >> 33) && o.n >= (-1 << 31) {
+ as_modri(ic.s, OP_MOVI, R_RAX, o.n);
+ } else {
+ as_opri64(ic.s, OP_MOVABS, R_RAX, o.n);
+ }
} else if kind == IOP_STR {
output_irstr(ic, b, o);
} else if kind == IOP_LOAD {