os

An operating system
git clone https://erai.gay/code/os/
Log | Files | Refs | README | LICENSE

commit b07998c29e9de4be362348f8e9594b43841f92ed
parent df3145130f30f5a6499f50e5a1111cb58b6ab40c
Author: erai <erai@omiltem.net>
Date:   Fri, 31 Jan 2025 21:28:12 +0000

moveabs -> mov (where possible)

Diffstat:
Mas.om | 8+++++++-
Mcc0.c | 13++++++++++++-
Mir.om | 10+++++++++-
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 {