os

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

commit 98221f3153817e479d4baf6deea9e07d5f5ebd9e
parent 8710ea8e8670aecc85bb03dc078e14f7f02afff8
Author: erai <erai@omiltem.net>
Date:   Fri, 31 Jan 2025 02:36:18 +0000

use ir to generate code

Diffstat:
Mas.om | 19+++++--------------
Mcc0.c | 1956++++++++++++++++++++++---------------------------------------------------------
Mcc1.om | 108+++++++++++++++++++++++++++++++++++++++++++++++--------------------------------
Mcpio.om | 2+-
Mdecl.om | 1+
Mir.om | 621+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++----
Mkernel.om | 2++
Mlib.om | 1+
Mparse2.om | 3+++
Mpeg.om | 2++
Msshd.om | 2+-
Mtype.om | 6+++++-
12 files changed, 1227 insertions(+), 1496 deletions(-)

diff --git a/as.om b/as.om @@ -693,6 +693,7 @@ func emit_kstart(c: *assembler) { fixup_label(c, done); as_modrr(c, OP_XORRM, R_RBP, R_RBP); as_opr(c, OP_PUSHR, R_RBX); + as_modrr(c, OP_MOVE, R_RDI, R_RBX); as_opr(c, OP_PUSHR, R_RBP); } @@ -927,18 +928,6 @@ func emit_neg(c: *assembler) { as_opr(c, OP_PUSHR, R_RAX); } -func emit_syscall(c: *assembler) { - as_modrm(c, OP_LOAD, R_RAX, R_RBP, 0, 0, 16); - as_modrm(c, OP_LOAD, R_RDI, R_RBP, 0, 0, 24); - as_modrm(c, OP_LOAD, R_RSI, R_RBP, 0, 0, 32); - as_modrm(c, OP_LOAD, R_RDX, R_RBP, 0, 0, 40); - as_modrm(c, OP_LOAD, R_R10, R_RBP, 0, 0, 48); - as_modrm(c, OP_LOAD, R_R8, R_RBP, 0, 0, 56); - as_modrm(c, OP_LOAD, R_R9, R_RBP, 0, 0, 64); - as_op(c, OP_SYSCALL); - as_opr(c, OP_PUSHR, R_RAX); -} - func emit_align(c: *assembler, n: int, b: int) { var pad: int; @@ -1549,7 +1538,7 @@ func as_opr(a: *assembler, op: int, r: int) { if r < 0 || r > 15 { die("invalid reg"); } - if op != OP_PUSHR && op != OP_POPR || r > 7 { + if (op != OP_PUSHR && op != OP_POPR) || r > 7 { as_rex(a, op, r, 0, 0); } as_op(a, op + (r & 7)); @@ -1575,7 +1564,9 @@ func as_modrr(a: *assembler, op: int, r: int, b: int) { if r < 0 || r > 15 || b < 0 || b > 15 { die("invalid reg"); } - as_rex(a, op, r, 0, b); + if (op != (OP_ICALLM & 0xffff) && (op & -16) != OP_SETCC) || b >= 8 { + as_rex(a, op, r, 0, b); + } as_op(a, op); as_emit(a, 0xc0 + ((r << 3) & 0x38) + (b & 0x07)); } diff --git a/cc0.c b/cc0.c @@ -85,6 +85,7 @@ struct my_decl { struct my_node* my_func_decl; unsigned long my_func_used; unsigned long my_func_preamble; + struct my_irfunc* my_func_ir; unsigned long my_struct_defined; unsigned long my_struct_size; unsigned long my_struct_layout_done; @@ -124,10 +125,12 @@ struct my_irblock { unsigned long my_done; struct my_irblock* my_out; struct my_irblock* my_alt; + struct my_label* my_label; unsigned long my_mark; }; struct my_irfunc { struct my_compiler* my_c; + struct my_assembler* my_s; struct my_alloc* my_a; unsigned char* my_name; struct my_irloopctx* my_loopctx; @@ -172,6 +175,7 @@ struct my_irvar { struct my_irvar* my_right; struct my_type* my_t; unsigned long my_n; + unsigned long my_offset; unsigned long my_mark; }; struct my_label { @@ -664,7 +668,6 @@ void( my_as_emit)(struct my_assembler* my_a,unsigned long my_b); void( my_as_jmp)(struct my_assembler* my_a,unsigned long my_op,struct my_label* my_l); void( my_as_modm)(struct my_assembler* my_a,unsigned long my_op,unsigned long my_b,unsigned long my_i,unsigned long my_s,unsigned long my_d); void( my_as_modr)(struct my_assembler* my_a,unsigned long my_op,unsigned long my_b); -void( my_as_modra)(struct my_assembler* my_a,unsigned long my_op,unsigned long my_r,unsigned long my_d); void( my_as_modri)(struct my_assembler* my_a,unsigned long my_op,unsigned long my_r,unsigned long my_x); void( my_as_modrm)(struct my_assembler* my_a,unsigned long my_op,unsigned long my_r,unsigned long my_b,unsigned long my_i,unsigned long my_s,unsigned long my_d); void( my_as_modrr)(struct my_assembler* my_a,unsigned long my_op,unsigned long my_r,unsigned long my_b); @@ -682,14 +685,9 @@ unsigned long( my_close)(unsigned long my_fd); void( my_commit)(struct my_peg* my_c); struct my_compiler*( my_comp_setup)(struct my_alloc* my_a); void( my_compile)(struct my_compiler* my_c,struct my_node* my_p); -void( my_compile_expr)(struct my_compiler* my_c,struct my_decl* my_d,struct my_node* my_n,unsigned long my_rhs); -void( my_compile_func)(struct my_compiler* my_c,struct my_decl* my_d); -void( my_compile_include)(struct my_compiler* my_c,struct my_node* my_n); -void( my_compile_stmt)(struct my_compiler* my_c,struct my_decl* my_d,struct my_node* my_n,struct my_label* my_top,struct my_label* my_out); struct my_node*( my_concat_program)(struct my_node* my_a,struct my_node* my_b); struct my_peg_node*( my_construct)(struct my_peg* my_c,unsigned long my_sp); void( my_copypos)(struct my_node* my_n,struct my_peg_node* my_pn); -unsigned long( my_count_args)(struct my_compiler* my_c,struct my_type* my_t); void( my_cshow_context)(struct my_compiler* my_c); void( my_ctranslate)(struct my_compiler* my_c); void( my_ctranslate_expr)(struct my_compiler* my_c,struct my_node* my_n); @@ -712,49 +710,14 @@ void( my_defun)(struct my_compiler* my_c,struct my_node* my_n); void( my_defunion)(struct my_compiler* my_c,struct my_node* my_n); void( my_die)(unsigned char* my_msg); void( my_emit)(struct my_assembler* my_c,unsigned long my_x); -void( my_emit_add)(struct my_assembler* my_c); void( my_emit_align)(struct my_assembler* my_c,unsigned long my_n,unsigned long my_b); -void( my_emit_and)(struct my_assembler* my_c); -void( my_emit_blob)(struct my_assembler* my_c,unsigned char* my_s,unsigned long my_n); void( my_emit_builtin)(struct my_compiler* my_c); -void( my_emit_call)(struct my_assembler* my_c,unsigned long my_n); -void( my_emit_div)(struct my_assembler* my_c); -void( my_emit_eq)(struct my_assembler* my_c); -void( my_emit_ge)(struct my_assembler* my_c); -void( my_emit_gt)(struct my_assembler* my_c); void( my_emit_hook)(struct my_assembler* my_c); -void( my_emit_isr)(struct my_compiler* my_c); -void( my_emit_jmp)(struct my_assembler* my_c,struct my_label* my_l); -void( my_emit_jz)(struct my_assembler* my_c,struct my_label* my_l); void( my_emit_kstart)(struct my_assembler* my_c); -void( my_emit_lcall)(struct my_assembler* my_c,struct my_label* my_l,unsigned long my_n); -void( my_emit_le)(struct my_assembler* my_c); -void( my_emit_lea)(struct my_assembler* my_c,unsigned long my_offset); -void( my_emit_load)(struct my_assembler* my_c,struct my_type* my_t); -void( my_emit_lsh)(struct my_assembler* my_c); -void( my_emit_lt)(struct my_assembler* my_c); -void( my_emit_mod)(struct my_assembler* my_c); -void( my_emit_mul)(struct my_assembler* my_c); -void( my_emit_ne)(struct my_assembler* my_c); -void( my_emit_neg)(struct my_assembler* my_c); -void( my_emit_not)(struct my_assembler* my_c); void( my_emit_num)(struct my_assembler* my_c,unsigned long my_x); -void( my_emit_or)(struct my_assembler* my_c); -void( my_emit_pop)(struct my_assembler* my_c,unsigned long my_n); void( my_emit_preamble)(struct my_assembler* my_c,unsigned long my_n,unsigned long my_pragma); -void( my_emit_ptr)(struct my_assembler* my_c,struct my_label* my_l); -void( my_emit_restorer)(struct my_assembler* my_c); -void( my_emit_ret)(struct my_assembler* my_c); -void( my_emit_rsh)(struct my_assembler* my_c); unsigned long( my_emit_sections)(struct my_assembler* my_c); -void( my_emit_ssr)(struct my_compiler* my_c); -void( my_emit_store)(struct my_assembler* my_c,struct my_type* my_t); -void( my_emit_str)(struct my_assembler* my_c,unsigned char* my_s); unsigned long( my_emit_strtab_str)(struct my_assembler* my_c,unsigned char* my_s); -void( my_emit_sub)(struct my_assembler* my_c); -void( my_emit_syscall)(struct my_assembler* my_c); -void( my_emit_ud)(struct my_assembler* my_c); -void( my_emit_xor)(struct my_assembler* my_c); void( my_enter)(struct my_peg* my_c,unsigned long my_tag); void( my_exit)(unsigned long my_n); struct my_irop*( my_expr_to_ir)(struct my_irfunc* my_ic,struct my_node* my_n); @@ -795,6 +758,7 @@ struct my_irop*( my_ircall)(struct my_irfunc* my_ic,struct my_node* my_n); struct my_irblock*( my_irfind_block)(struct my_irfunc* my_ic,unsigned char* my_name,unsigned long my_make); struct my_irvar**( my_irfind_var)(struct my_irfunc* my_ic,unsigned char* my_name); void( my_irjump)(struct my_irfunc* my_ic,struct my_irblock* my_to,struct my_irblock* my_next); +void( my_irreset)(struct my_irblock* my_b); void( my_irreturn)(struct my_irfunc* my_ic,struct my_irop* my_value); void( my_labels_to_ir)(struct my_irfunc* my_ic,struct my_node* my_n); void( my_layout_struct)(struct my_compiler* my_c,struct my_decl* my_d); @@ -832,6 +796,15 @@ unsigned long( my_open)(unsigned char* my_name,unsigned long my_flags,unsigned l void( my_open_coutput)(struct my_compiler* my_c,unsigned char* my_filename); void( my_open_lines_out)(struct my_compiler* my_c,unsigned char* my_filename); void( my_open_output)(struct my_assembler* my_c,unsigned char* my_filename); +void( my_output_ir)(struct my_compiler* my_c,struct my_decl* my_d); +void( my_output_irargs)(struct my_irfunc* my_ic,struct my_irblock* my_b,struct my_irop* my_o); +void( my_output_irblock)(struct my_irfunc* my_ic,struct my_irblock* my_b); +void( my_output_irexpr)(struct my_irfunc* my_ic,struct my_irblock* my_b,struct my_irop* my_o); +void( my_output_irfuncptr)(struct my_irfunc* my_ic,struct my_irblock* my_b,struct my_irop* my_o); +void( my_output_irretval)(struct my_irfunc* my_ic,struct my_irblock* my_b,struct my_irop* my_o); +void( my_output_irstmt)(struct my_irfunc* my_ic,struct my_irblock* my_b,struct my_irop* my_o); +void( my_output_irstr)(struct my_irfunc* my_ic,struct my_irblock* my_b,struct my_irop* my_o); +void( my_output_irvars)(struct my_irfunc* my_ic); struct my_node*( my_parse)(struct my_parser* my_c,unsigned char* my_filename); unsigned long( my_parse_escape)(unsigned char* my_s,unsigned long* my_i,unsigned long my_n); unsigned long( my_peg_PEG_alternative)(struct my_peg* my_c); @@ -1012,7 +985,6 @@ void( my_typecheck_stmt)(struct my_compiler* my_c,struct my_decl* my_d,struct my unsigned long( my_unescape)(unsigned char* my_s,unsigned long* my_i,unsigned long my_len,unsigned long* my_ok); void( my_unify)(struct my_compiler* my_c,struct my_type* my_a,struct my_type* my_b); unsigned long( my_unlink)(unsigned char* my_name); -void( my_update_place)(struct my_compiler* my_c,struct my_node* my_n); unsigned long( my_write)(unsigned long my_fd,unsigned char* my_buf,unsigned long my_n); void( my_writeout)(struct my_assembler* my_c,struct my_label* my_start,struct my_label* my_kstart); unsigned char*( my_PEG_tag_to_str)(unsigned long my_tag){ @@ -1062,6 +1034,7 @@ unsigned char*( my_PEG_tag_to_str)(unsigned long my_tag){ return (unsigned char *)"sp"; } (my_die)(((unsigned char *)"invalid tag")); + return (void *)0; } unsigned char*( my_P_tag_to_str)(unsigned long my_tag){ if ((unsigned long)(((long)(my_tag))==((long)(my_P_grammar)))) { @@ -1335,6 +1308,7 @@ unsigned char*( my_P_tag_to_str)(unsigned long my_tag){ return (unsigned char *)"sp"; } (my_die)(((unsigned char *)"invalid tag")); + return (void *)0; } void( my__start)(unsigned long my_argc,unsigned char** my_argv,unsigned char** my_envp){ (my_main)((my_argc),(my_argv),(my_envp)); @@ -1475,16 +1449,6 @@ void( my_as_modm)(struct my_assembler* my_a,unsigned long my_op,unsigned long my void( my_as_modr)(struct my_assembler* my_a,unsigned long my_op,unsigned long my_b){ (my_as_modrr)((my_a),((unsigned long)(((unsigned long)(my_op))&((unsigned long)(65535UL)))),((unsigned long)(((unsigned long)(my_op))>>((unsigned long)(16UL)))),(my_b)); } -void( my_as_modra)(struct my_assembler* my_a,unsigned long my_op,unsigned long my_r,unsigned long my_d){ - (my_as_rex)((my_a),(my_op),(my_r),(0UL),(0UL)); - (my_as_op)((my_a),(my_op)); - (my_as_emit)((my_a),((unsigned long)(((unsigned long)((unsigned long)(((unsigned long)((unsigned long)(((unsigned long)(my_r))<<((unsigned long)(3UL)))))&((unsigned long)(56UL)))))+((unsigned long)(my_R_RSP))))); - (my_as_emit)((my_a),((unsigned long)(((unsigned long)((unsigned long)(((unsigned long)(my_R_RSP))<<((unsigned long)(3UL)))))+((unsigned long)(my_R_RBP))))); - (my_as_emit)((my_a),(my_d)); - (my_as_emit)((my_a),((unsigned long)(((unsigned long)(my_d))>>((unsigned long)(8UL))))); - (my_as_emit)((my_a),((unsigned long)(((unsigned long)(my_d))>>((unsigned long)(16UL))))); - (my_as_emit)((my_a),((unsigned long)(((unsigned long)(my_d))>>((unsigned long)(24UL))))); -} void( my_as_modri)(struct my_assembler* my_a,unsigned long my_op,unsigned long my_r,unsigned long my_x){ if ((unsigned long)(((unsigned long)(((long)(my_x))<((long)((unsigned long)(-(unsigned long)((unsigned long)(((unsigned long)(1UL))<<((unsigned long)(31UL)))))))))||((unsigned long)(((long)(my_x))>=((long)((unsigned long)(((unsigned long)(1UL))<<((unsigned long)(31UL))))))))) { (my_die)(((unsigned char *)"immediate too large")); @@ -1606,7 +1570,9 @@ void( my_as_modrr)(struct my_assembler* my_a,unsigned long my_op,unsigned long m if ((unsigned long)(((unsigned long)(((long)(my_r))<((long)(0UL))))||((unsigned long)(((unsigned long)(((long)(my_r))>((long)(15UL))))||((unsigned long)(((unsigned long)(((long)(my_b))<((long)(0UL))))||((unsigned long)(((long)(my_b))>((long)(15UL)))))))))) { (my_die)(((unsigned char *)"invalid reg")); } + if ((unsigned long)(((unsigned long)(((unsigned long)(((long)(my_op))!=((long)((unsigned long)(((unsigned long)(my_OP_ICALLM))&((unsigned long)(65535UL)))))))&&((unsigned long)(((long)((unsigned long)(((unsigned long)(my_op))&((unsigned long)((unsigned long)(-(unsigned long)(16UL)))))))!=((long)(my_OP_SETCC))))))||((unsigned long)(((long)(my_b))>=((long)(8UL)))))) { (my_as_rex)((my_a),(my_op),(my_r),(0UL),(my_b)); + } (my_as_op)((my_a),(my_op)); (my_as_emit)((my_a),((unsigned long)(((unsigned long)((unsigned long)(((unsigned long)(192UL))+((unsigned long)((unsigned long)(((unsigned long)((unsigned long)(((unsigned long)(my_r))<<((unsigned long)(3UL)))))&((unsigned long)(56UL))))))))+((unsigned long)((unsigned long)(((unsigned long)(my_b))&((unsigned long)(7UL)))))))); } @@ -1622,7 +1588,7 @@ void( my_as_opr)(struct my_assembler* my_a,unsigned long my_op,unsigned long my_ if ((unsigned long)(((unsigned long)(((long)(my_r))<((long)(0UL))))||((unsigned long)(((long)(my_r))>((long)(15UL)))))) { (my_die)(((unsigned char *)"invalid reg")); } - if ((unsigned long)(((unsigned long)(((long)(my_op))!=((long)(my_OP_PUSHR))))&&((unsigned long)(((unsigned long)(((long)(my_op))!=((long)(my_OP_POPR))))||((unsigned long)(((long)(my_r))>((long)(7UL)))))))) { + if ((unsigned long)(((unsigned long)(((unsigned long)(((long)(my_op))!=((long)(my_OP_PUSHR))))&&((unsigned long)(((long)(my_op))!=((long)(my_OP_POPR))))))||((unsigned long)(((long)(my_r))>((long)(7UL)))))) { (my_as_rex)((my_a),(my_op),(my_r),(0UL),(0UL)); } (my_as_op)((my_a),((unsigned long)(((unsigned long)(my_op))+((unsigned long)((unsigned long)(((unsigned long)(my_r))&((unsigned long)(7UL)))))))); @@ -1843,351 +1809,20 @@ void( my_compile)(struct my_compiler* my_c,struct my_node* my_p){ if ((unsigned long)(!(my_d))) { break; } - if ((unsigned long)(((my_d)->my_func_used)&&((my_d)->my_func_defined))) { - (my_func_to_ir)((my_c),((my_d)->my_func_def)); - (my_compile_func)((my_c),(my_d)); + if ((unsigned long)(((my_d)->my_func_used)&&((unsigned long)(((my_d)->my_func_defined)&&((my_d)->my_func_def))))) { + ((my_d)->my_func_ir)=((my_func_to_ir)((my_c),((my_d)->my_func_def))); } (my_d)=((my_next_decl)((my_c),(my_d))); } -} -void( my_compile_expr)(struct my_compiler* my_c,struct my_decl* my_d,struct my_node* my_n,unsigned long my_rhs){ - struct my_label* my_no = 0; - struct my_label* my_out = 0; - struct my_decl* my_v = 0; - unsigned long my_kind = 0; - (my_update_place)((my_c),(my_n)); - (my_kind)=((my_n)->my_kind); - if ((unsigned long)(((long)(my_kind))==((long)(my_N_STR)))) { - (my_emit_str)(((my_c)->my_s),((my_n)->my_s)); - } else if ((unsigned long)(((long)(my_kind))==((long)(my_N_NIL)))) { - (my_emit_num)(((my_c)->my_s),(0UL)); - } else if ((unsigned long)(((long)(my_kind))==((long)(my_N_NUM)))) { - (my_emit_num)(((my_c)->my_s),((my_n)->my_n)); - } else if ((unsigned long)(((long)(my_kind))==((long)(my_N_CHAR)))) { - (my_emit_num)(((my_c)->my_s),((my_n)->my_n)); - } else if ((unsigned long)(((long)(my_kind))==((long)(my_N_EXPRLIST)))) { - if ((my_n)->my_b) { - (my_compile_expr)((my_c),(my_d),((my_n)->my_b),(1UL)); - } - (my_compile_expr)((my_c),(my_d),((my_n)->my_a),(1UL)); - } else if ((unsigned long)(((long)(my_kind))==((long)(my_N_CALL)))) { - if ((my_n)->my_b) { - (my_compile_expr)((my_c),(my_d),((my_n)->my_b),(1UL)); - } - if ((unsigned long)(((long)(((my_n)->my_a)->my_kind))==((long)(my_N_IDENT)))) { - (my_v)=((my_find)((my_c),(((my_n)->my_a)->my_s),((void *)0),(0UL))); - if ((unsigned long)((my_v)&&((my_v)->my_enum_defined))) { - (my_cdie)((my_c),((unsigned char *)"type error")); - } - (my_v)=((my_find)((my_c),((my_d)->my_name),(((my_n)->my_a)->my_s),(0UL))); - if ((unsigned long)((my_v)&&((my_v)->my_var_defined))) { - (my_emit_lea)(((my_c)->my_s),((my_v)->my_var_offset)); - (my_emit_load)(((my_c)->my_s),(((my_n)->my_a)->my_t)); - (my_emit_call)(((my_c)->my_s),((my_count_args)((my_c),((((my_n)->my_a)->my_t)->my_arg)))); - } else if ((unsigned long)(!((my_strcmp)((((my_n)->my_a)->my_s),((unsigned char *)"_include"))))) { - (my_v)=((my_find)((my_c),(((my_n)->my_a)->my_s),((void *)0),(0UL))); - (my_compile_include)((my_c),(my_n)); - } else { - (my_v)=((my_find)((my_c),(((my_n)->my_a)->my_s),((void *)0),(0UL))); - (my_emit_lcall)(((my_c)->my_s),((my_v)->my_func_label),((my_count_args)((my_c),((((my_n)->my_a)->my_t)->my_arg)))); - } - } else { - (my_compile_expr)((my_c),(my_d),((my_n)->my_a),(1UL)); - (my_emit_call)(((my_c)->my_s),((my_count_args)((my_c),((((my_n)->my_a)->my_t)->my_arg)))); - } - if ((my_n)->my_b) { - (my_unify)((my_c),((((my_n)->my_a)->my_t)->my_arg),(((my_n)->my_b)->my_t)); - } else { - (my_unify)((my_c),((((my_n)->my_a)->my_t)->my_arg),((void *)0)); - } - } else if ((unsigned long)(((long)(my_kind))==((long)(my_N_DOT)))) { - (my_compile_expr)((my_c),(my_d),((my_n)->my_a),(0UL)); - if ((unsigned long)(((long)((((my_n)->my_a)->my_t)->my_kind))==((long)(my_TY_PTR)))) { - (my_v)=((my_find)((my_c),((((((my_n)->my_a)->my_t)->my_val)->my_st)->my_name),(((my_n)->my_b)->my_s),(0UL))); - (my_emit_load)(((my_c)->my_s),(((my_n)->my_a)->my_t)); - } else { - (my_v)=((my_find)((my_c),(((((my_n)->my_a)->my_t)->my_st)->my_name),(((my_n)->my_b)->my_s),(0UL))); - } - (my_emit_num)(((my_c)->my_s),((my_v)->my_member_offset)); - (my_emit_add)(((my_c)->my_s)); - if (my_rhs) { - (my_emit_load)(((my_c)->my_s),((my_n)->my_t)); - } - } else if ((unsigned long)(((long)(my_kind))==((long)(my_N_IDENT)))) { - (my_v)=((my_find)((my_c),((my_n)->my_s),((void *)0),(0UL))); - if ((unsigned long)((my_v)&&((my_v)->my_enum_defined))) { - (my_emit_num)(((my_c)->my_s),((my_v)->my_enum_value)); - return; - } - (my_v)=((my_find)((my_c),((my_d)->my_name),((my_n)->my_s),(0UL))); - if ((unsigned long)((my_v)&&((my_v)->my_var_defined))) { - (my_emit_lea)(((my_c)->my_s),((my_v)->my_var_offset)); - if (my_rhs) { - (my_emit_load)(((my_c)->my_s),((my_n)->my_t)); - } - return; - } - (my_v)=((my_find)((my_c),((my_n)->my_s),((void *)0),(0UL))); - if ((unsigned long)((my_v)&&((my_v)->my_func_defined))) { - (my_emit_ptr)(((my_c)->my_s),((my_v)->my_func_label)); - return; - } - } else if ((unsigned long)(((long)(my_kind))==((long)(my_N_ASSIGN)))) { - (my_compile_expr)((my_c),(my_d),((my_n)->my_b),(1UL)); - (my_compile_expr)((my_c),(my_d),((my_n)->my_a),(0UL)); - (my_emit_store)(((my_c)->my_s),((my_n)->my_t)); - } else if ((unsigned long)(((long)(my_kind))==((long)(my_N_SIZEOF)))) { - if ((unsigned long)(((long)((((my_n)->my_a)->my_t)->my_kind))==((long)(my_TY_BYTE)))) { - (my_emit_num)(((my_c)->my_s),(1UL)); - } else { - (my_emit_num)(((my_c)->my_s),((my_type_sizeof)((my_c),(((my_n)->my_a)->my_t)))); - } - } else if ((unsigned long)(((long)(my_kind))==((long)(my_N_REF)))) { - (my_compile_expr)((my_c),(my_d),((my_n)->my_a),(0UL)); - } else if ((unsigned long)(((long)(my_kind))==((long)(my_N_DEREF)))) { - (my_compile_expr)((my_c),(my_d),((my_n)->my_a),(1UL)); - if (my_rhs) { - (my_emit_load)(((my_c)->my_s),((my_n)->my_t)); - } - } else if ((unsigned long)(((long)(my_kind))==((long)(my_N_INDEX)))) { - (my_compile_expr)((my_c),(my_d),((my_n)->my_a),(1UL)); - (my_compile_expr)((my_c),(my_d),((my_n)->my_b),(1UL)); - if ((unsigned long)(((long)(((my_n)->my_t)->my_kind))==((long)(my_TY_BYTE)))) { - (my_emit_num)(((my_c)->my_s),(1UL)); - } else { - (my_emit_num)(((my_c)->my_s),((my_type_sizeof)((my_c),((my_n)->my_t)))); - } - (my_emit_mul)(((my_c)->my_s)); - (my_emit_add)(((my_c)->my_s)); - if (my_rhs) { - (my_emit_load)(((my_c)->my_s),((my_n)->my_t)); - } - } else if ((unsigned long)(((long)(my_kind))==((long)(my_N_LT)))) { - (my_compile_expr)((my_c),(my_d),((my_n)->my_b),(1UL)); - (my_compile_expr)((my_c),(my_d),((my_n)->my_a),(1UL)); - (my_emit_lt)(((my_c)->my_s)); - } else if ((unsigned long)(((long)(my_kind))==((long)(my_N_GT)))) { - (my_compile_expr)((my_c),(my_d),((my_n)->my_b),(1UL)); - (my_compile_expr)((my_c),(my_d),((my_n)->my_a),(1UL)); - (my_emit_gt)(((my_c)->my_s)); - } else if ((unsigned long)(((long)(my_kind))==((long)(my_N_LE)))) { - (my_compile_expr)((my_c),(my_d),((my_n)->my_b),(1UL)); - (my_compile_expr)((my_c),(my_d),((my_n)->my_a),(1UL)); - (my_emit_le)(((my_c)->my_s)); - } else if ((unsigned long)(((long)(my_kind))==((long)(my_N_GE)))) { - (my_compile_expr)((my_c),(my_d),((my_n)->my_b),(1UL)); - (my_compile_expr)((my_c),(my_d),((my_n)->my_a),(1UL)); - (my_emit_ge)(((my_c)->my_s)); - } else if ((unsigned long)(((long)(my_kind))==((long)(my_N_EQ)))) { - (my_compile_expr)((my_c),(my_d),((my_n)->my_b),(1UL)); - (my_compile_expr)((my_c),(my_d),((my_n)->my_a),(1UL)); - (my_emit_eq)(((my_c)->my_s)); - } else if ((unsigned long)(((long)(my_kind))==((long)(my_N_NE)))) { - (my_compile_expr)((my_c),(my_d),((my_n)->my_b),(1UL)); - (my_compile_expr)((my_c),(my_d),((my_n)->my_a),(1UL)); - (my_emit_ne)(((my_c)->my_s)); - } else if ((unsigned long)(((long)(my_kind))==((long)(my_N_BNOT)))) { - (my_no)=((my_mklabel)(((my_c)->my_s))); - (my_out)=((my_mklabel)(((my_c)->my_s))); - (my_compile_expr)((my_c),(my_d),((my_n)->my_a),(1UL)); - (my_emit_jz)(((my_c)->my_s),(my_no)); - (my_emit_num)(((my_c)->my_s),(0UL)); - (my_emit_jmp)(((my_c)->my_s),(my_out)); - (my_fixup_label)(((my_c)->my_s),(my_no)); - (my_emit_num)(((my_c)->my_s),(1UL)); - (my_fixup_label)(((my_c)->my_s),(my_out)); - } else if ((unsigned long)(((long)(my_kind))==((long)(my_N_BOR)))) { - (my_no)=((my_mklabel)(((my_c)->my_s))); - (my_out)=((my_mklabel)(((my_c)->my_s))); - (my_compile_expr)((my_c),(my_d),((my_n)->my_a),(1UL)); - (my_emit_jz)(((my_c)->my_s),(my_no)); - (my_emit_num)(((my_c)->my_s),(1UL)); - (my_emit_jmp)(((my_c)->my_s),(my_out)); - (my_fixup_label)(((my_c)->my_s),(my_no)); - (my_no)=((my_mklabel)(((my_c)->my_s))); - (my_compile_expr)((my_c),(my_d),((my_n)->my_b),(1UL)); - (my_emit_jz)(((my_c)->my_s),(my_no)); - (my_emit_num)(((my_c)->my_s),(1UL)); - (my_emit_jmp)(((my_c)->my_s),(my_out)); - (my_fixup_label)(((my_c)->my_s),(my_no)); - (my_emit_num)(((my_c)->my_s),(0UL)); - (my_fixup_label)(((my_c)->my_s),(my_out)); - } else if ((unsigned long)(((long)(my_kind))==((long)(my_N_BAND)))) { - (my_no)=((my_mklabel)(((my_c)->my_s))); - (my_out)=((my_mklabel)(((my_c)->my_s))); - (my_compile_expr)((my_c),(my_d),((my_n)->my_a),(1UL)); - (my_emit_jz)(((my_c)->my_s),(my_no)); - (my_compile_expr)((my_c),(my_d),((my_n)->my_b),(1UL)); - (my_emit_jz)(((my_c)->my_s),(my_no)); - (my_emit_num)(((my_c)->my_s),(1UL)); - (my_emit_jmp)(((my_c)->my_s),(my_out)); - (my_fixup_label)(((my_c)->my_s),(my_no)); - (my_emit_num)(((my_c)->my_s),(0UL)); - (my_fixup_label)(((my_c)->my_s),(my_out)); - } else if ((unsigned long)(((long)(my_kind))==((long)(my_N_POS)))) { - (my_compile_expr)((my_c),(my_d),((my_n)->my_a),(1UL)); - } else if ((unsigned long)(((long)(my_kind))==((long)(my_N_NEG)))) { - (my_compile_expr)((my_c),(my_d),((my_n)->my_a),(1UL)); - (my_emit_neg)(((my_c)->my_s)); - } else if ((unsigned long)(((long)(my_kind))==((long)(my_N_NOT)))) { - (my_compile_expr)((my_c),(my_d),((my_n)->my_a),(1UL)); - (my_emit_not)(((my_c)->my_s)); - } else if ((unsigned long)(((long)(my_kind))==((long)(my_N_ADD)))) { - (my_compile_expr)((my_c),(my_d),((my_n)->my_b),(1UL)); - (my_compile_expr)((my_c),(my_d),((my_n)->my_a),(1UL)); - (my_emit_add)(((my_c)->my_s)); - } else if ((unsigned long)(((long)(my_kind))==((long)(my_N_SUB)))) { - (my_compile_expr)((my_c),(my_d),((my_n)->my_b),(1UL)); - (my_compile_expr)((my_c),(my_d),((my_n)->my_a),(1UL)); - (my_emit_sub)(((my_c)->my_s)); - } else if ((unsigned long)(((long)(my_kind))==((long)(my_N_MUL)))) { - (my_compile_expr)((my_c),(my_d),((my_n)->my_b),(1UL)); - (my_compile_expr)((my_c),(my_d),((my_n)->my_a),(1UL)); - (my_emit_mul)(((my_c)->my_s)); - } else if ((unsigned long)(((long)(my_kind))==((long)(my_N_DIV)))) { - (my_compile_expr)((my_c),(my_d),((my_n)->my_b),(1UL)); - (my_compile_expr)((my_c),(my_d),((my_n)->my_a),(1UL)); - (my_emit_div)(((my_c)->my_s)); - } else if ((unsigned long)(((long)(my_kind))==((long)(my_N_MOD)))) { - (my_compile_expr)((my_c),(my_d),((my_n)->my_b),(1UL)); - (my_compile_expr)((my_c),(my_d),((my_n)->my_a),(1UL)); - (my_emit_mod)(((my_c)->my_s)); - } else if ((unsigned long)(((long)(my_kind))==((long)(my_N_LSH)))) { - (my_compile_expr)((my_c),(my_d),((my_n)->my_b),(1UL)); - (my_compile_expr)((my_c),(my_d),((my_n)->my_a),(1UL)); - (my_emit_lsh)(((my_c)->my_s)); - } else if ((unsigned long)(((long)(my_kind))==((long)(my_N_RSH)))) { - (my_compile_expr)((my_c),(my_d),((my_n)->my_b),(1UL)); - (my_compile_expr)((my_c),(my_d),((my_n)->my_a),(1UL)); - (my_emit_rsh)(((my_c)->my_s)); - } else if ((unsigned long)(((long)(my_kind))==((long)(my_N_AND)))) { - (my_compile_expr)((my_c),(my_d),((my_n)->my_b),(1UL)); - (my_compile_expr)((my_c),(my_d),((my_n)->my_a),(1UL)); - (my_emit_and)(((my_c)->my_s)); - } else if ((unsigned long)(((long)(my_kind))==((long)(my_N_OR)))) { - (my_compile_expr)((my_c),(my_d),((my_n)->my_b),(1UL)); - (my_compile_expr)((my_c),(my_d),((my_n)->my_a),(1UL)); - (my_emit_or)(((my_c)->my_s)); - } else if ((unsigned long)(((long)(my_kind))==((long)(my_N_XOR)))) { - (my_compile_expr)((my_c),(my_d),((my_n)->my_b),(1UL)); - (my_compile_expr)((my_c),(my_d),((my_n)->my_a),(1UL)); - (my_emit_xor)(((my_c)->my_s)); - } else if ((unsigned long)(((long)(my_kind))==((long)(my_N_CAST)))) { - (my_compile_expr)((my_c),(my_d),((my_n)->my_a),(1UL)); - } else { - (my_cdie)((my_c),((unsigned char *)"not an expression")); - } -} -void( my_compile_func)(struct my_compiler* my_c,struct my_decl* my_d){ - unsigned long my_pragma = 0; - if ((unsigned long)(!((my_d)->my_func_def))) { - return; - } - if ((unsigned long)(!((my_strcmp)(((my_d)->my_name),((unsigned char *)"_start"))))) { - (my_pragma)=(1UL); - } else if ((unsigned long)(!((my_strcmp)(((my_d)->my_name),((unsigned char *)"_kstart"))))) { - (my_pragma)=(2UL); - } else { - (my_pragma)=(0UL); - } - (my_fixup_label)(((my_c)->my_s),((my_d)->my_func_label)); - (my_add_symbol)(((my_c)->my_s),((my_d)->my_name),((my_d)->my_func_label)); - (my_emit_preamble)(((my_c)->my_s),((my_d)->my_func_preamble),(my_pragma)); - (my_compile_stmt)((my_c),(my_d),(((my_d)->my_func_def)->my_b),((void *)0),((void *)0)); - (my_emit_num)(((my_c)->my_s),(0UL)); - if (my_pragma) { - (my_emit_ud)(((my_c)->my_s)); - } - (my_emit_ret)(((my_c)->my_s)); -} -void( my_compile_include)(struct my_compiler* my_c,struct my_node* my_n){ - unsigned char* my_blob = 0; - unsigned long my_len = 0; - if ((unsigned long)(((long)((((my_n)->my_b)->my_a)->my_kind))!=((long)(my_N_STR)))) { - (my_die)(((unsigned char *)"non literal include")); - } - (my_blob)=((my_gather_include)((my_c),((((my_n)->my_b)->my_a)->my_s),(&(my_len)))); - (my_as_opr)(((my_c)->my_s),(my_OP_POPR),(my_R_RAX)); - (my_as_opr)(((my_c)->my_s),(my_OP_POPR),(my_R_RDI)); - (my_as_opri64)(((my_c)->my_s),(my_OP_MOVABS),(my_R_RAX),(my_len)); - (my_as_modrm)(((my_c)->my_s),(my_OP_STORE),(my_R_RAX),(my_R_RDI),(0UL),(0UL),(0UL)); - (my_emit_blob)(((my_c)->my_s),(my_blob),(my_len)); - (my_free)(((my_c)->my_a),(my_blob)); -} -void( my_compile_stmt)(struct my_compiler* my_c,struct my_decl* my_d,struct my_node* my_n,struct my_label* my_top,struct my_label* my_out){ - struct my_label* my_no = 0; - struct my_label* my_ifout = 0; - struct my_decl* my_v = 0; - unsigned long my_kind = 0; - if ((unsigned long)(!(my_n))) { - return; - } - (my_update_place)((my_c),(my_n)); - (my_kind)=((my_n)->my_kind); - if ((unsigned long)(((long)(my_kind))==((long)(my_N_CONDLIST)))) { - (my_ifout)=((my_mklabel)(((my_c)->my_s))); - (my_no)=((void *)0); - while (1) { - if (my_no) { - (my_fixup_label)(((my_c)->my_s),(my_no)); - } - if ((unsigned long)(!(my_n))) { - break; - } - (my_no)=((my_mklabel)(((my_c)->my_s))); - if (((my_n)->my_a)->my_a) { - (my_compile_expr)((my_c),(my_d),(((my_n)->my_a)->my_a),(1UL)); - (my_emit_jz)(((my_c)->my_s),(my_no)); - } - (my_compile_stmt)((my_c),(my_d),(((my_n)->my_a)->my_b),(my_top),(my_out)); - (my_emit_jmp)(((my_c)->my_s),(my_ifout)); - (my_n)=((my_n)->my_b); - } - (my_fixup_label)(((my_c)->my_s),(my_ifout)); - } else if ((unsigned long)(((long)(my_kind))==((long)(my_N_STMTLIST)))) { + (my_d)=((my_first_decl)((my_c))); while (1) { - if ((unsigned long)(!(my_n))) { + if ((unsigned long)(!(my_d))) { break; } - (my_compile_stmt)((my_c),(my_d),((my_n)->my_a),(my_top),(my_out)); - (my_n)=((my_n)->my_b); - } - } else if ((unsigned long)(((long)(my_kind))==((long)(my_N_LOOP)))) { - (my_top)=((my_mklabel)(((my_c)->my_s))); - (my_out)=((my_mklabel)(((my_c)->my_s))); - (my_fixup_label)(((my_c)->my_s),(my_top)); - (my_compile_stmt)((my_c),(my_d),((my_n)->my_a),(my_top),(my_out)); - (my_emit_jmp)(((my_c)->my_s),(my_top)); - (my_fixup_label)(((my_c)->my_s),(my_out)); - } else if ((unsigned long)(((long)(my_kind))==((long)(my_N_BREAK)))) { - if ((unsigned long)(!(my_out))) { - (my_cdie)((my_c),((unsigned char *)"break outside loop")); - } - (my_emit_jmp)(((my_c)->my_s),(my_out)); - } else if ((unsigned long)(((long)(my_kind))==((long)(my_N_CONTINUE)))) { - if ((unsigned long)(!(my_top))) { - (my_cdie)((my_c),((unsigned char *)"continue outside loop")); - } - (my_emit_jmp)(((my_c)->my_s),(my_top)); - } else if ((unsigned long)(((long)(my_kind))==((long)(my_N_RETURN)))) { - if ((my_n)->my_a) { - (my_compile_expr)((my_c),(my_d),((my_n)->my_a),(1UL)); - } else { - (my_emit_num)(((my_c)->my_s),(0UL)); - } - (my_emit_ret)(((my_c)->my_s)); - } else if ((unsigned long)(((long)(my_kind))==((long)(my_N_LABEL)))) { - (my_v)=((my_find)((my_c),((my_d)->my_name),(((my_n)->my_a)->my_s),(0UL))); - (my_fixup_label)(((my_c)->my_s),((my_v)->my_goto_label)); - } else if ((unsigned long)(((long)(my_kind))==((long)(my_N_GOTO)))) { - (my_v)=((my_find)((my_c),((my_d)->my_name),(((my_n)->my_a)->my_s),(0UL))); - if ((unsigned long)(((unsigned long)(!(my_v)))||((unsigned long)(!((my_v)->my_goto_defined))))) { - (my_cdie)((my_c),((unsigned char *)"label not defined")); + if ((unsigned long)(((my_d)->my_func_used)&&((unsigned long)(((my_d)->my_func_defined)&&((my_d)->my_func_def))))) { + (my_output_ir)((my_c),(my_d)); } - (my_emit_jmp)(((my_c)->my_s),((my_v)->my_goto_label)); - } else if ((unsigned long)(((long)(my_kind))!=((long)(my_N_VARDECL)))) { - (my_compile_expr)((my_c),(my_d),(my_n),(1UL)); - (my_emit_pop)(((my_c)->my_s),(1UL)); + (my_d)=((my_next_decl)((my_c),(my_d))); } } struct my_node*( my_concat_program)(struct my_node* my_a,struct my_node* my_b){ @@ -2263,18 +1898,6 @@ void( my_copypos)(struct my_node* my_n,struct my_peg_node* my_pn){ ((my_n)->my_lineno)=((my_pn)->my_line); ((my_n)->my_colno)=((my_pn)->my_col); } -unsigned long( my_count_args)(struct my_compiler* my_c,struct my_type* my_t){ - unsigned long my_nargs = 0; - (my_nargs)=(0UL); - while (1) { - if ((unsigned long)(!(my_t))) { - break; - } - (my_t)=((my_t)->my_arg); - (my_nargs)=((unsigned long)(((unsigned long)(my_nargs))+((unsigned long)(1UL)))); - } - return my_nargs; -} void( my_cshow_context)(struct my_compiler* my_c){ (my_fdputs)((2UL),((unsigned char *)"on ")); if ((my_c)->my_filename) { @@ -3065,12 +2688,6 @@ void( my_emit)(struct my_assembler* my_c,unsigned long my_x){ (((my_c)->my_text_end)->my_fill)=((unsigned long)(((unsigned long)(((my_c)->my_text_end)->my_fill))+((unsigned long)(1UL)))); ((my_c)->my_at)=((unsigned long)(((unsigned long)((my_c)->my_at))+((unsigned long)(1UL)))); } -void( my_emit_add)(struct my_assembler* my_c){ - (my_as_opr)((my_c),(my_OP_POPR),(my_R_RAX)); - (my_as_opr)((my_c),(my_OP_POPR),(my_R_RDX)); - (my_as_modrr)((my_c),(my_OP_ADDRM),(my_R_RAX),(my_R_RDX)); - (my_as_opr)((my_c),(my_OP_PUSHR),(my_R_RAX)); -} void( my_emit_align)(struct my_assembler* my_c,unsigned long my_n,unsigned long my_b){ unsigned long my_pad = 0; (my_pad)=((unsigned long)(((unsigned long)((my_c)->my_at))&((unsigned long)((unsigned long)(((unsigned long)(my_n))-((unsigned long)(1UL))))))); @@ -3078,605 +2695,34 @@ void( my_emit_align)(struct my_assembler* my_c,unsigned long my_n,unsigned long return; } while (1) { - if ((unsigned long)(((long)(my_pad))==((long)(my_n)))) { - break; - } - (my_as_emit)((my_c),(my_b)); - (my_pad)=((unsigned long)(((unsigned long)(my_pad))+((unsigned long)(1UL)))); - } -} -void( my_emit_and)(struct my_assembler* my_c){ - (my_as_opr)((my_c),(my_OP_POPR),(my_R_RAX)); - (my_as_opr)((my_c),(my_OP_POPR),(my_R_RDX)); - (my_as_modrr)((my_c),(my_OP_ANDRM),(my_R_RAX),(my_R_RDX)); - (my_as_opr)((my_c),(my_OP_PUSHR),(my_R_RAX)); -} -void( my_emit_blob)(struct my_assembler* my_c,unsigned char* my_s,unsigned long my_n){ - struct my_label* my_a = 0; - struct my_label* my_b = 0; - unsigned long my_i = 0; - (my_a)=((my_mklabel)((my_c))); - (my_b)=((my_mklabel)((my_c))); - (my_as_jmp)((my_c),(my_OP_JMP),(my_b)); - (my_fixup_label)((my_c),(my_a)); - (my_i)=(0UL); - while (1) { - if ((unsigned long)(((long)(my_i))==((long)(my_n)))) { - break; - } - (my_as_emit)((my_c),((unsigned long)(my_s)[my_i])); - (my_i)=((unsigned long)(((unsigned long)(my_i))+((unsigned long)(1UL)))); - } - (my_as_emit)((my_c),(0UL)); - (my_as_op)((my_c),(my_OP_NOP)); - (my_as_op)((my_c),(my_OP_NOP)); - (my_as_op)((my_c),(my_OP_NOP)); - (my_as_op)((my_c),(my_OP_NOP)); - (my_as_op)((my_c),(my_OP_NOP)); - (my_as_op)((my_c),(my_OP_NOP)); - (my_as_op)((my_c),(my_OP_NOP)); - (my_as_op)((my_c),(my_OP_NOP)); - (my_fixup_label)((my_c),(my_b)); - (my_emit_ptr)((my_c),(my_a)); -} -void( my_emit_builtin)(struct my_compiler* my_c){ - struct my_decl* my_d = 0; - (my_d)=((my_find)((my_c),((unsigned char *)"syscall"),((void *)0),(1UL))); - if ((unsigned long)(((my_d)->my_func_defined)&&((unsigned long)(!(((my_d)->my_func_label)->my_fixed))))) { - (my_fixup_label)(((my_c)->my_s),((my_d)->my_func_label)); - (my_add_symbol)(((my_c)->my_s),((my_d)->my_name),((my_d)->my_func_label)); - (my_emit_preamble)(((my_c)->my_s),(0UL),(0UL)); - (my_emit_syscall)(((my_c)->my_s)); - (my_emit_ret)(((my_c)->my_s)); - } - (my_d)=((my_find)((my_c),((unsigned char *)"_restorer"),((void *)0),(1UL))); - if ((unsigned long)(((my_d)->my_func_defined)&&((unsigned long)(!(((my_d)->my_func_label)->my_fixed))))) { - (my_fixup_label)(((my_c)->my_s),((my_d)->my_func_label)); - (my_add_symbol)(((my_c)->my_s),((my_d)->my_name),((my_d)->my_func_label)); - (my_emit_restorer)(((my_c)->my_s)); - } - (my_d)=((my_find)((my_c),((unsigned char *)"_include"),((void *)0),(1UL))); - if ((unsigned long)(((my_d)->my_func_defined)&&((unsigned long)(!(((my_d)->my_func_label)->my_fixed))))) { - (my_fixup_label)(((my_c)->my_s),((my_d)->my_func_label)); - (my_add_symbol)(((my_c)->my_s),((my_d)->my_name),((my_d)->my_func_label)); - (my_emit_preamble)(((my_c)->my_s),(0UL),(0UL)); - (my_as_op)(((my_c)->my_s),(my_OP_UD2)); - (my_as_opr)(((my_c)->my_s),(my_OP_PUSHR),(my_R_RAX)); - (my_emit_ret)(((my_c)->my_s)); - } - (my_d)=((my_find)((my_c),((unsigned char *)"ud2"),((void *)0),(1UL))); - if ((unsigned long)(((my_d)->my_func_defined)&&((unsigned long)(!(((my_d)->my_func_label)->my_fixed))))) { - (my_fixup_label)(((my_c)->my_s),((my_d)->my_func_label)); - (my_add_symbol)(((my_c)->my_s),((my_d)->my_name),((my_d)->my_func_label)); - (my_emit_preamble)(((my_c)->my_s),(0UL),(0UL)); - (my_as_op)(((my_c)->my_s),(my_OP_UD2)); - (my_as_opr)(((my_c)->my_s),(my_OP_PUSHR),(my_R_RAX)); - (my_emit_ret)(((my_c)->my_s)); - } - (my_d)=((my_find)((my_c),((unsigned char *)"cpuid"),((void *)0),(1UL))); - if ((unsigned long)(((my_d)->my_func_defined)&&((unsigned long)(!(((my_d)->my_func_label)->my_fixed))))) { - (my_fixup_label)(((my_c)->my_s),((my_d)->my_func_label)); - (my_add_symbol)(((my_c)->my_s),((my_d)->my_name),((my_d)->my_func_label)); - (my_emit_preamble)(((my_c)->my_s),(0UL),(0UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_LOAD),(my_R_RDI),(my_R_RBP),(0UL),(0UL),(16UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_LOAD),(my_R_RAX),(my_R_RDI),(0UL),(0UL),(0UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_LOAD),(my_R_RDI),(my_R_RBP),(0UL),(0UL),(24UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_LOAD),(my_R_RCX),(my_R_RDI),(0UL),(0UL),(0UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_LOAD),(my_R_RDI),(my_R_RBP),(0UL),(0UL),(32UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_LOAD),(my_R_RDX),(my_R_RDI),(0UL),(0UL),(0UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_LOAD),(my_R_RDI),(my_R_RBP),(0UL),(0UL),(40UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_LOAD),(my_R_RBX),(my_R_RDI),(0UL),(0UL),(0UL)); - (my_as_op)(((my_c)->my_s),(my_OP_CPUID)); - (my_as_modrm)(((my_c)->my_s),(my_OP_LOAD),(my_R_RDI),(my_R_RBP),(0UL),(0UL),(16UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_STORE),(my_R_RAX),(my_R_RDI),(0UL),(0UL),(0UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_LOAD),(my_R_RDI),(my_R_RBP),(0UL),(0UL),(24UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_STORE),(my_R_RCX),(my_R_RDI),(0UL),(0UL),(0UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_LOAD),(my_R_RDI),(my_R_RBP),(0UL),(0UL),(32UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_STORE),(my_R_RDX),(my_R_RDI),(0UL),(0UL),(0UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_LOAD),(my_R_RDI),(my_R_RBP),(0UL),(0UL),(40UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_STORE),(my_R_RBX),(my_R_RDI),(0UL),(0UL),(0UL)); - (my_as_opr)(((my_c)->my_s),(my_OP_PUSHR),(my_R_RAX)); - (my_emit_ret)(((my_c)->my_s)); - } - (my_d)=((my_find)((my_c),((unsigned char *)"inb"),((void *)0),(1UL))); - if ((unsigned long)(((my_d)->my_func_defined)&&((unsigned long)(!(((my_d)->my_func_label)->my_fixed))))) { - (my_fixup_label)(((my_c)->my_s),((my_d)->my_func_label)); - (my_add_symbol)(((my_c)->my_s),((my_d)->my_name),((my_d)->my_func_label)); - (my_emit_preamble)(((my_c)->my_s),(0UL),(0UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_LOAD),(my_R_RDX),(my_R_RBP),(0UL),(0UL),(16UL)); - (my_as_op)(((my_c)->my_s),(my_OP_IN)); - (my_as_opr)(((my_c)->my_s),(my_OP_PUSHR),(my_R_RAX)); - (my_emit_ret)(((my_c)->my_s)); - } - (my_d)=((my_find)((my_c),((unsigned char *)"outb"),((void *)0),(1UL))); - if ((unsigned long)(((my_d)->my_func_defined)&&((unsigned long)(!(((my_d)->my_func_label)->my_fixed))))) { - (my_fixup_label)(((my_c)->my_s),((my_d)->my_func_label)); - (my_add_symbol)(((my_c)->my_s),((my_d)->my_name),((my_d)->my_func_label)); - (my_emit_preamble)(((my_c)->my_s),(0UL),(0UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_LOAD),(my_R_RDX),(my_R_RBP),(0UL),(0UL),(16UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_LOAD),(my_R_RAX),(my_R_RBP),(0UL),(0UL),(24UL)); - (my_as_op)(((my_c)->my_s),(my_OP_OUT)); - (my_as_opr)(((my_c)->my_s),(my_OP_PUSHR),(my_R_RAX)); - (my_emit_ret)(((my_c)->my_s)); - } - (my_d)=((my_find)((my_c),((unsigned char *)"inw"),((void *)0),(1UL))); - if ((unsigned long)(((my_d)->my_func_defined)&&((unsigned long)(!(((my_d)->my_func_label)->my_fixed))))) { - (my_fixup_label)(((my_c)->my_s),((my_d)->my_func_label)); - (my_add_symbol)(((my_c)->my_s),((my_d)->my_name),((my_d)->my_func_label)); - (my_emit_preamble)(((my_c)->my_s),(0UL),(0UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_LOAD),(my_R_RDX),(my_R_RBP),(0UL),(0UL),(16UL)); - (my_as_emit)(((my_c)->my_s),(my_OP_OS)); - (my_as_op)(((my_c)->my_s),(my_OP_IND)); - (my_as_opr)(((my_c)->my_s),(my_OP_PUSHR),(my_R_RAX)); - (my_emit_ret)(((my_c)->my_s)); - } - (my_d)=((my_find)((my_c),((unsigned char *)"outw"),((void *)0),(1UL))); - if ((unsigned long)(((my_d)->my_func_defined)&&((unsigned long)(!(((my_d)->my_func_label)->my_fixed))))) { - (my_fixup_label)(((my_c)->my_s),((my_d)->my_func_label)); - (my_add_symbol)(((my_c)->my_s),((my_d)->my_name),((my_d)->my_func_label)); - (my_emit_preamble)(((my_c)->my_s),(0UL),(0UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_LOAD),(my_R_RDX),(my_R_RBP),(0UL),(0UL),(16UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_LOAD),(my_R_RAX),(my_R_RBP),(0UL),(0UL),(24UL)); - (my_as_emit)(((my_c)->my_s),(my_OP_OS)); - (my_as_op)(((my_c)->my_s),(my_OP_OUTD)); - (my_as_opr)(((my_c)->my_s),(my_OP_PUSHR),(my_R_RAX)); - (my_emit_ret)(((my_c)->my_s)); - } - (my_d)=((my_find)((my_c),((unsigned char *)"ind"),((void *)0),(1UL))); - if ((unsigned long)(((my_d)->my_func_defined)&&((unsigned long)(!(((my_d)->my_func_label)->my_fixed))))) { - (my_fixup_label)(((my_c)->my_s),((my_d)->my_func_label)); - (my_add_symbol)(((my_c)->my_s),((my_d)->my_name),((my_d)->my_func_label)); - (my_emit_preamble)(((my_c)->my_s),(0UL),(0UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_LOAD),(my_R_RDX),(my_R_RBP),(0UL),(0UL),(16UL)); - (my_as_op)(((my_c)->my_s),(my_OP_IND)); - (my_as_opr)(((my_c)->my_s),(my_OP_PUSHR),(my_R_RAX)); - (my_emit_ret)(((my_c)->my_s)); - } - (my_d)=((my_find)((my_c),((unsigned char *)"outd"),((void *)0),(1UL))); - if ((unsigned long)(((my_d)->my_func_defined)&&((unsigned long)(!(((my_d)->my_func_label)->my_fixed))))) { - (my_fixup_label)(((my_c)->my_s),((my_d)->my_func_label)); - (my_add_symbol)(((my_c)->my_s),((my_d)->my_name),((my_d)->my_func_label)); - (my_emit_preamble)(((my_c)->my_s),(0UL),(0UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_LOAD),(my_R_RDX),(my_R_RBP),(0UL),(0UL),(16UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_LOAD),(my_R_RAX),(my_R_RBP),(0UL),(0UL),(24UL)); - (my_as_op)(((my_c)->my_s),(my_OP_OUTD)); - (my_as_opr)(((my_c)->my_s),(my_OP_PUSHR),(my_R_RAX)); - (my_emit_ret)(((my_c)->my_s)); - } - (my_d)=((my_find)((my_c),((unsigned char *)"rdmsr"),((void *)0),(1UL))); - if ((unsigned long)(((my_d)->my_func_defined)&&((unsigned long)(!(((my_d)->my_func_label)->my_fixed))))) { - (my_fixup_label)(((my_c)->my_s),((my_d)->my_func_label)); - (my_add_symbol)(((my_c)->my_s),((my_d)->my_name),((my_d)->my_func_label)); - (my_emit_preamble)(((my_c)->my_s),(0UL),(0UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_LOAD),(my_R_RCX),(my_R_RBP),(0UL),(0UL),(16UL)); - (my_as_op)(((my_c)->my_s),(my_OP_RDMSR)); - (my_as_modri)(((my_c)->my_s),(my_OP_MOVI),(my_R_RCX),(32UL)); - (my_as_modr)(((my_c)->my_s),(my_OP_SHLM),(my_R_RDX)); - (my_as_modrr)(((my_c)->my_s),(my_OP_ORRM),(my_R_RAX),(my_R_RDX)); - (my_as_opr)(((my_c)->my_s),(my_OP_PUSHR),(my_R_RAX)); - (my_emit_ret)(((my_c)->my_s)); - } - (my_d)=((my_find)((my_c),((unsigned char *)"wrmsr"),((void *)0),(1UL))); - if ((unsigned long)(((my_d)->my_func_defined)&&((unsigned long)(!(((my_d)->my_func_label)->my_fixed))))) { - (my_fixup_label)(((my_c)->my_s),((my_d)->my_func_label)); - (my_add_symbol)(((my_c)->my_s),((my_d)->my_name),((my_d)->my_func_label)); - (my_emit_preamble)(((my_c)->my_s),(0UL),(0UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_LOAD),(my_R_RAX),(my_R_RBP),(0UL),(0UL),(24UL)); - (my_as_modrr)(((my_c)->my_s),(my_OP_MOVE),(my_R_RDX),(my_R_RAX)); - (my_as_modri)(((my_c)->my_s),(my_OP_MOVI),(my_R_RCX),(32UL)); - (my_as_modr)(((my_c)->my_s),(my_OP_SHRM),(my_R_RDX)); - (my_as_modrm)(((my_c)->my_s),(my_OP_LOAD),(my_R_RCX),(my_R_RBP),(0UL),(0UL),(16UL)); - (my_as_op)(((my_c)->my_s),(my_OP_WRMSR)); - (my_as_opr)(((my_c)->my_s),(my_OP_PUSHR),(my_R_RAX)); - (my_emit_ret)(((my_c)->my_s)); - } - (my_d)=((my_find)((my_c),((unsigned char *)"rdcr0"),((void *)0),(1UL))); - if ((unsigned long)(((my_d)->my_func_defined)&&((unsigned long)(!(((my_d)->my_func_label)->my_fixed))))) { - (my_fixup_label)(((my_c)->my_s),((my_d)->my_func_label)); - (my_add_symbol)(((my_c)->my_s),((my_d)->my_name),((my_d)->my_func_label)); - (my_emit_preamble)(((my_c)->my_s),(0UL),(0UL)); - (my_as_modrr)(((my_c)->my_s),(my_OP_RDCRR),(my_R_CR0),(my_R_RAX)); - (my_as_opr)(((my_c)->my_s),(my_OP_PUSHR),(my_R_RAX)); - (my_emit_ret)(((my_c)->my_s)); - } - (my_d)=((my_find)((my_c),((unsigned char *)"wrcr0"),((void *)0),(1UL))); - if ((unsigned long)(((my_d)->my_func_defined)&&((unsigned long)(!(((my_d)->my_func_label)->my_fixed))))) { - (my_fixup_label)(((my_c)->my_s),((my_d)->my_func_label)); - (my_add_symbol)(((my_c)->my_s),((my_d)->my_name),((my_d)->my_func_label)); - (my_emit_preamble)(((my_c)->my_s),(0UL),(0UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_LOAD),(my_R_RCX),(my_R_RBP),(0UL),(0UL),(16UL)); - (my_as_modrr)(((my_c)->my_s),(my_OP_WRCRR),(my_R_CR0),(my_R_RAX)); - (my_as_opr)(((my_c)->my_s),(my_OP_PUSHR),(my_R_RAX)); - (my_emit_ret)(((my_c)->my_s)); - } - (my_d)=((my_find)((my_c),((unsigned char *)"rdcr2"),((void *)0),(1UL))); - if ((unsigned long)(((my_d)->my_func_defined)&&((unsigned long)(!(((my_d)->my_func_label)->my_fixed))))) { - (my_fixup_label)(((my_c)->my_s),((my_d)->my_func_label)); - (my_add_symbol)(((my_c)->my_s),((my_d)->my_name),((my_d)->my_func_label)); - (my_emit_preamble)(((my_c)->my_s),(0UL),(0UL)); - (my_as_modrr)(((my_c)->my_s),(my_OP_RDCRR),(my_R_CR2),(my_R_RAX)); - (my_as_opr)(((my_c)->my_s),(my_OP_PUSHR),(my_R_RAX)); - (my_emit_ret)(((my_c)->my_s)); - } - (my_d)=((my_find)((my_c),((unsigned char *)"wrcr2"),((void *)0),(1UL))); - if ((unsigned long)(((my_d)->my_func_defined)&&((unsigned long)(!(((my_d)->my_func_label)->my_fixed))))) { - (my_fixup_label)(((my_c)->my_s),((my_d)->my_func_label)); - (my_add_symbol)(((my_c)->my_s),((my_d)->my_name),((my_d)->my_func_label)); - (my_emit_preamble)(((my_c)->my_s),(0UL),(0UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_LOAD),(my_R_RCX),(my_R_RBP),(0UL),(0UL),(16UL)); - (my_as_modrr)(((my_c)->my_s),(my_OP_WRCRR),(my_R_CR2),(my_R_RAX)); - (my_as_opr)(((my_c)->my_s),(my_OP_PUSHR),(my_R_RAX)); - (my_emit_ret)(((my_c)->my_s)); - } - (my_d)=((my_find)((my_c),((unsigned char *)"rdcr3"),((void *)0),(1UL))); - if ((unsigned long)(((my_d)->my_func_defined)&&((unsigned long)(!(((my_d)->my_func_label)->my_fixed))))) { - (my_fixup_label)(((my_c)->my_s),((my_d)->my_func_label)); - (my_add_symbol)(((my_c)->my_s),((my_d)->my_name),((my_d)->my_func_label)); - (my_emit_preamble)(((my_c)->my_s),(0UL),(0UL)); - (my_as_modrr)(((my_c)->my_s),(my_OP_RDCRR),(my_R_CR3),(my_R_RAX)); - (my_as_opr)(((my_c)->my_s),(my_OP_PUSHR),(my_R_RAX)); - (my_emit_ret)(((my_c)->my_s)); - } - (my_d)=((my_find)((my_c),((unsigned char *)"wrcr3"),((void *)0),(1UL))); - if ((unsigned long)(((my_d)->my_func_defined)&&((unsigned long)(!(((my_d)->my_func_label)->my_fixed))))) { - (my_fixup_label)(((my_c)->my_s),((my_d)->my_func_label)); - (my_add_symbol)(((my_c)->my_s),((my_d)->my_name),((my_d)->my_func_label)); - (my_emit_preamble)(((my_c)->my_s),(0UL),(0UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_LOAD),(my_R_RCX),(my_R_RBP),(0UL),(0UL),(16UL)); - (my_as_modrr)(((my_c)->my_s),(my_OP_WRCRR),(my_R_CR3),(my_R_RAX)); - (my_as_opr)(((my_c)->my_s),(my_OP_PUSHR),(my_R_RAX)); - (my_emit_ret)(((my_c)->my_s)); - } - (my_d)=((my_find)((my_c),((unsigned char *)"rdcr4"),((void *)0),(1UL))); - if ((unsigned long)(((my_d)->my_func_defined)&&((unsigned long)(!(((my_d)->my_func_label)->my_fixed))))) { - (my_fixup_label)(((my_c)->my_s),((my_d)->my_func_label)); - (my_add_symbol)(((my_c)->my_s),((my_d)->my_name),((my_d)->my_func_label)); - (my_emit_preamble)(((my_c)->my_s),(0UL),(0UL)); - (my_as_modrr)(((my_c)->my_s),(my_OP_RDCRR),(my_R_CR4),(my_R_RAX)); - (my_as_opr)(((my_c)->my_s),(my_OP_PUSHR),(my_R_RAX)); - (my_emit_ret)(((my_c)->my_s)); - } - (my_d)=((my_find)((my_c),((unsigned char *)"wrcr4"),((void *)0),(1UL))); - if ((unsigned long)(((my_d)->my_func_defined)&&((unsigned long)(!(((my_d)->my_func_label)->my_fixed))))) { - (my_fixup_label)(((my_c)->my_s),((my_d)->my_func_label)); - (my_add_symbol)(((my_c)->my_s),((my_d)->my_name),((my_d)->my_func_label)); - (my_emit_preamble)(((my_c)->my_s),(0UL),(0UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_LOAD),(my_R_RCX),(my_R_RBP),(0UL),(0UL),(16UL)); - (my_as_modrr)(((my_c)->my_s),(my_OP_WRCRR),(my_R_CR4),(my_R_RAX)); - (my_as_opr)(((my_c)->my_s),(my_OP_PUSHR),(my_R_RAX)); - (my_emit_ret)(((my_c)->my_s)); - } - (my_d)=((my_find)((my_c),((unsigned char *)"lgdt"),((void *)0),(1UL))); - if ((unsigned long)(((my_d)->my_func_defined)&&((unsigned long)(!(((my_d)->my_func_label)->my_fixed))))) { - (my_fixup_label)(((my_c)->my_s),((my_d)->my_func_label)); - (my_add_symbol)(((my_c)->my_s),((my_d)->my_name),((my_d)->my_func_label)); - (my_emit_preamble)(((my_c)->my_s),(0UL),(0UL)); - (my_as_modri)(((my_c)->my_s),(my_OP_SUBI),(my_R_RSP),(16UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_LOAD),(my_R_RAX),(my_R_RBP),(0UL),(0UL),(24UL)); - (my_as_modri)(((my_c)->my_s),(my_OP_SUBI),(my_R_RAX),(1UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_STORE),(my_R_RAX),(my_R_RSP),(0UL),(0UL),(0UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_LOAD),(my_R_RAX),(my_R_RBP),(0UL),(0UL),(16UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_STORE),(my_R_RAX),(my_R_RSP),(0UL),(0UL),(2UL)); - (my_as_modm)(((my_c)->my_s),(my_OP_LGDTM),(my_R_RSP),(0UL),(0UL),(0UL)); - (my_as_modri)(((my_c)->my_s),(my_OP_ADDI),(my_R_RSP),(16UL)); - (my_as_opr)(((my_c)->my_s),(my_OP_PUSHR),(my_R_RAX)); - (my_emit_ret)(((my_c)->my_s)); - } - (my_d)=((my_find)((my_c),((unsigned char *)"lidt"),((void *)0),(1UL))); - if ((unsigned long)(((my_d)->my_func_defined)&&((unsigned long)(!(((my_d)->my_func_label)->my_fixed))))) { - (my_fixup_label)(((my_c)->my_s),((my_d)->my_func_label)); - (my_add_symbol)(((my_c)->my_s),((my_d)->my_name),((my_d)->my_func_label)); - (my_emit_preamble)(((my_c)->my_s),(0UL),(0UL)); - (my_as_modri)(((my_c)->my_s),(my_OP_SUBI),(my_R_RSP),(16UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_LOAD),(my_R_RAX),(my_R_RBP),(0UL),(0UL),(24UL)); - (my_as_modri)(((my_c)->my_s),(my_OP_SUBI),(my_R_RAX),(1UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_STORE),(my_R_RAX),(my_R_RSP),(0UL),(0UL),(0UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_LOAD),(my_R_RAX),(my_R_RBP),(0UL),(0UL),(16UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_STORE),(my_R_RAX),(my_R_RSP),(0UL),(0UL),(2UL)); - (my_as_modm)(((my_c)->my_s),(my_OP_LIDTM),(my_R_RSP),(0UL),(0UL),(0UL)); - (my_as_modri)(((my_c)->my_s),(my_OP_ADDI),(my_R_RSP),(16UL)); - (my_as_opr)(((my_c)->my_s),(my_OP_PUSHR),(my_R_RAX)); - (my_emit_ret)(((my_c)->my_s)); - } - (my_d)=((my_find)((my_c),((unsigned char *)"lldt"),((void *)0),(1UL))); - if ((unsigned long)(((my_d)->my_func_defined)&&((unsigned long)(!(((my_d)->my_func_label)->my_fixed))))) { - (my_fixup_label)(((my_c)->my_s),((my_d)->my_func_label)); - (my_add_symbol)(((my_c)->my_s),((my_d)->my_name),((my_d)->my_func_label)); - (my_emit_preamble)(((my_c)->my_s),(0UL),(0UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_LOAD),(my_R_RAX),(my_R_RBP),(0UL),(0UL),(16UL)); - (my_as_modr)(((my_c)->my_s),(my_OP_LLDTM),(my_R_RAX)); - (my_as_opr)(((my_c)->my_s),(my_OP_PUSHR),(my_R_RAX)); - (my_emit_ret)(((my_c)->my_s)); - } - (my_d)=((my_find)((my_c),((unsigned char *)"ltr"),((void *)0),(1UL))); - if ((unsigned long)(((my_d)->my_func_defined)&&((unsigned long)(!(((my_d)->my_func_label)->my_fixed))))) { - (my_fixup_label)(((my_c)->my_s),((my_d)->my_func_label)); - (my_add_symbol)(((my_c)->my_s),((my_d)->my_name),((my_d)->my_func_label)); - (my_emit_preamble)(((my_c)->my_s),(0UL),(0UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_LOAD),(my_R_RAX),(my_R_RBP),(0UL),(0UL),(16UL)); - (my_as_modr)(((my_c)->my_s),(my_OP_LTRM),(my_R_RAX)); - (my_as_opr)(((my_c)->my_s),(my_OP_PUSHR),(my_R_RAX)); - (my_emit_ret)(((my_c)->my_s)); - } - (my_d)=((my_find)((my_c),((unsigned char *)"lseg"),((void *)0),(1UL))); - if ((unsigned long)(((my_d)->my_func_defined)&&((unsigned long)(!(((my_d)->my_func_label)->my_fixed))))) { - (my_fixup_label)(((my_c)->my_s),((my_d)->my_func_label)); - (my_add_symbol)(((my_c)->my_s),((my_d)->my_name),((my_d)->my_func_label)); - (my_emit_preamble)(((my_c)->my_s),(0UL),(0UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_LOAD),(my_R_RAX),(my_R_RBP),(0UL),(0UL),(24UL)); - (my_as_modrr)(((my_c)->my_s),(my_OP_WRSR),(my_R_ES),(my_R_RAX)); - (my_as_modrr)(((my_c)->my_s),(my_OP_WRSR),(my_R_DS),(my_R_RAX)); - (my_as_modrr)(((my_c)->my_s),(my_OP_WRSR),(my_R_FS),(my_R_RAX)); - (my_as_modrr)(((my_c)->my_s),(my_OP_WRSR),(my_R_GS),(my_R_RAX)); - (my_as_opr)(((my_c)->my_s),(my_OP_PUSHR),(my_R_RAX)); - (my_as_opr)(((my_c)->my_s),(my_OP_PUSHR),(my_R_RBP)); - (my_as_op)(((my_c)->my_s),(my_OP_PUSHF)); - (my_as_modrm)(((my_c)->my_s),(my_OP_LOAD),(my_R_RAX),(my_R_RBP),(0UL),(0UL),(16UL)); - (my_as_opr)(((my_c)->my_s),(my_OP_PUSHR),(my_R_RAX)); - (my_as_op)(((my_c)->my_s),(my_OP_CALL)); - (my_as_emit)(((my_c)->my_s),(5UL)); - (my_as_emit)(((my_c)->my_s),(0UL)); - (my_as_emit)(((my_c)->my_s),(0UL)); - (my_as_emit)(((my_c)->my_s),(0UL)); - (my_as_op)(((my_c)->my_s),(my_OP_JMP)); - (my_as_emit)(((my_c)->my_s),(2UL)); - (my_as_emit)(((my_c)->my_s),(0UL)); - (my_as_emit)(((my_c)->my_s),(0UL)); - (my_as_emit)(((my_c)->my_s),(0UL)); - (my_as_op)(((my_c)->my_s),(my_OP_IRETQ)); - (my_as_opr)(((my_c)->my_s),(my_OP_PUSHR),(my_R_RAX)); - (my_emit_ret)(((my_c)->my_s)); - } - (my_d)=((my_find)((my_c),((unsigned char *)"hlt"),((void *)0),(1UL))); - if ((unsigned long)(((my_d)->my_func_defined)&&((unsigned long)(!(((my_d)->my_func_label)->my_fixed))))) { - (my_fixup_label)(((my_c)->my_s),((my_d)->my_func_label)); - (my_add_symbol)(((my_c)->my_s),((my_d)->my_name),((my_d)->my_func_label)); - (my_emit_preamble)(((my_c)->my_s),(0UL),(0UL)); - (my_as_op)(((my_c)->my_s),(my_OP_HLT)); - (my_as_opr)(((my_c)->my_s),(my_OP_PUSHR),(my_R_RAX)); - (my_emit_ret)(((my_c)->my_s)); - } - (my_d)=((my_find)((my_c),((unsigned char *)"cli"),((void *)0),(1UL))); - if ((unsigned long)(((my_d)->my_func_defined)&&((unsigned long)(!(((my_d)->my_func_label)->my_fixed))))) { - (my_fixup_label)(((my_c)->my_s),((my_d)->my_func_label)); - (my_add_symbol)(((my_c)->my_s),((my_d)->my_name),((my_d)->my_func_label)); - (my_emit_preamble)(((my_c)->my_s),(0UL),(0UL)); - (my_as_op)(((my_c)->my_s),(my_OP_CLI)); - (my_as_opr)(((my_c)->my_s),(my_OP_PUSHR),(my_R_RAX)); - (my_emit_ret)(((my_c)->my_s)); - } - (my_d)=((my_find)((my_c),((unsigned char *)"sti"),((void *)0),(1UL))); - if ((unsigned long)(((my_d)->my_func_defined)&&((unsigned long)(!(((my_d)->my_func_label)->my_fixed))))) { - (my_fixup_label)(((my_c)->my_s),((my_d)->my_func_label)); - (my_add_symbol)(((my_c)->my_s),((my_d)->my_name),((my_d)->my_func_label)); - (my_emit_preamble)(((my_c)->my_s),(0UL),(0UL)); - (my_as_op)(((my_c)->my_s),(my_OP_STI)); - (my_as_opr)(((my_c)->my_s),(my_OP_PUSHR),(my_R_RAX)); - (my_emit_ret)(((my_c)->my_s)); - } - (my_d)=((my_find)((my_c),((unsigned char *)"rdflags"),((void *)0),(1UL))); - if ((unsigned long)(((my_d)->my_func_defined)&&((unsigned long)(!(((my_d)->my_func_label)->my_fixed))))) { - (my_fixup_label)(((my_c)->my_s),((my_d)->my_func_label)); - (my_add_symbol)(((my_c)->my_s),((my_d)->my_name),((my_d)->my_func_label)); - (my_emit_preamble)(((my_c)->my_s),(0UL),(0UL)); - (my_as_op)(((my_c)->my_s),(my_OP_PUSHF)); - (my_emit_ret)(((my_c)->my_s)); - } - (my_d)=((my_find)((my_c),((unsigned char *)"wrflags"),((void *)0),(1UL))); - if ((unsigned long)(((my_d)->my_func_defined)&&((unsigned long)(!(((my_d)->my_func_label)->my_fixed))))) { - (my_fixup_label)(((my_c)->my_s),((my_d)->my_func_label)); - (my_add_symbol)(((my_c)->my_s),((my_d)->my_name),((my_d)->my_func_label)); - (my_emit_preamble)(((my_c)->my_s),(0UL),(0UL)); - (my_as_op)(((my_c)->my_s),(my_OP_PUSHF)); - (my_as_modrm)(((my_c)->my_s),(my_OP_LOAD),(my_R_RAX),(my_R_RBP),(0UL),(0UL),(16UL)); - (my_as_opr)(((my_c)->my_s),(my_OP_PUSHR),(my_R_RAX)); - (my_as_op)(((my_c)->my_s),(my_OP_POPF)); - (my_emit_ret)(((my_c)->my_s)); - } - (my_d)=((my_find)((my_c),((unsigned char *)"wbinvld"),((void *)0),(1UL))); - if ((unsigned long)(((my_d)->my_func_defined)&&((unsigned long)(!(((my_d)->my_func_label)->my_fixed))))) { - (my_fixup_label)(((my_c)->my_s),((my_d)->my_func_label)); - (my_add_symbol)(((my_c)->my_s),((my_d)->my_name),((my_d)->my_func_label)); - (my_emit_preamble)(((my_c)->my_s),(0UL),(0UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_LOAD),(my_R_RAX),(my_R_RBP),(0UL),(0UL),(16UL)); - (my_as_modm)(((my_c)->my_s),(my_OP_WBINVD),(my_R_RAX),(0UL),(0UL),(0UL)); - (my_as_opr)(((my_c)->my_s),(my_OP_PUSHR),(my_R_RAX)); - (my_emit_ret)(((my_c)->my_s)); - } - (my_d)=((my_find)((my_c),((unsigned char *)"invlpg"),((void *)0),(1UL))); - if ((unsigned long)(((my_d)->my_func_defined)&&((unsigned long)(!(((my_d)->my_func_label)->my_fixed))))) { - (my_fixup_label)(((my_c)->my_s),((my_d)->my_func_label)); - (my_add_symbol)(((my_c)->my_s),((my_d)->my_name),((my_d)->my_func_label)); - (my_emit_preamble)(((my_c)->my_s),(0UL),(0UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_LOAD),(my_R_RAX),(my_R_RBP),(0UL),(0UL),(16UL)); - (my_as_modm)(((my_c)->my_s),(my_OP_INVLPGM),(my_R_RAX),(0UL),(0UL),(0UL)); - (my_as_opr)(((my_c)->my_s),(my_OP_PUSHR),(my_R_RAX)); - (my_emit_ret)(((my_c)->my_s)); - } - (my_d)=((my_find)((my_c),((unsigned char *)"_ssr0"),((void *)0),(1UL))); - if ((unsigned long)(((my_d)->my_func_defined)&&((unsigned long)(!(((my_d)->my_func_label)->my_fixed))))) { - (my_fixup_label)(((my_c)->my_s),((my_d)->my_func_label)); - (my_add_symbol)(((my_c)->my_s),((my_d)->my_name),((my_d)->my_func_label)); - (my_emit_ssr)((my_c)); - } - (my_d)=((my_find)((my_c),((unsigned char *)"_isr0"),((void *)0),(1UL))); - if ((unsigned long)(((my_d)->my_func_defined)&&((unsigned long)(!(((my_d)->my_func_label)->my_fixed))))) { - (my_fixup_label)(((my_c)->my_s),((my_d)->my_func_label)); - (my_add_symbol)(((my_c)->my_s),((my_d)->my_name),((my_d)->my_func_label)); - (my_emit_isr)((my_c)); - } - (my_d)=((my_find)((my_c),((unsigned char *)"_rgs"),((void *)0),(1UL))); - if ((unsigned long)(((my_d)->my_func_defined)&&((unsigned long)(!(((my_d)->my_func_label)->my_fixed))))) { - (my_fixup_label)(((my_c)->my_s),((my_d)->my_func_label)); - (my_add_symbol)(((my_c)->my_s),((my_d)->my_name),((my_d)->my_func_label)); - (my_emit_preamble)(((my_c)->my_s),(0UL),(0UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_LOAD),(my_R_RSI),(my_R_RBP),(0UL),(0UL),(16UL)); - (my_as_emit)(((my_c)->my_s),(my_OP_GS)); - (my_as_modrm)(((my_c)->my_s),(my_OP_LOAD),(my_R_RAX),(my_R_RSI),(0UL),(0UL),(0UL)); - (my_as_opr)(((my_c)->my_s),(my_OP_PUSHR),(my_R_RAX)); - (my_emit_ret)(((my_c)->my_s)); - } - (my_d)=((my_find)((my_c),((unsigned char *)"_r32"),((void *)0),(1UL))); - if ((unsigned long)(((my_d)->my_func_defined)&&((unsigned long)(!(((my_d)->my_func_label)->my_fixed))))) { - (my_fixup_label)(((my_c)->my_s),((my_d)->my_func_label)); - (my_add_symbol)(((my_c)->my_s),((my_d)->my_name),((my_d)->my_func_label)); - (my_emit_preamble)(((my_c)->my_s),(0UL),(0UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_LOAD),(my_R_RSI),(my_R_RBP),(0UL),(0UL),(16UL)); - (((my_c)->my_s)->my_bits32)=(1UL); - (my_as_modrm)(((my_c)->my_s),(my_OP_LOAD),(my_R_RAX),(my_R_RSI),(0UL),(0UL),(0UL)); - (((my_c)->my_s)->my_bits32)=(0UL); - (my_as_opr)(((my_c)->my_s),(my_OP_PUSHR),(my_R_RAX)); - (my_emit_ret)(((my_c)->my_s)); - } - (my_d)=((my_find)((my_c),((unsigned char *)"_w32"),((void *)0),(1UL))); - if ((unsigned long)(((my_d)->my_func_defined)&&((unsigned long)(!(((my_d)->my_func_label)->my_fixed))))) { - (my_fixup_label)(((my_c)->my_s),((my_d)->my_func_label)); - (my_add_symbol)(((my_c)->my_s),((my_d)->my_name),((my_d)->my_func_label)); - (my_emit_preamble)(((my_c)->my_s),(0UL),(0UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_LOAD),(my_R_RDI),(my_R_RBP),(0UL),(0UL),(16UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_LOAD),(my_R_RAX),(my_R_RBP),(0UL),(0UL),(24UL)); - (((my_c)->my_s)->my_bits32)=(1UL); - (my_as_modrm)(((my_c)->my_s),(my_OP_STORE),(my_R_RAX),(my_R_RDI),(0UL),(0UL),(0UL)); - (((my_c)->my_s)->my_bits32)=(0UL); - (my_as_opr)(((my_c)->my_s),(my_OP_PUSHR),(my_R_RAX)); - (my_emit_ret)(((my_c)->my_s)); - } - (my_d)=((my_find)((my_c),((unsigned char *)"_r16"),((void *)0),(1UL))); - if ((unsigned long)(((my_d)->my_func_defined)&&((unsigned long)(!(((my_d)->my_func_label)->my_fixed))))) { - (my_fixup_label)(((my_c)->my_s),((my_d)->my_func_label)); - (my_add_symbol)(((my_c)->my_s),((my_d)->my_name),((my_d)->my_func_label)); - (my_emit_preamble)(((my_c)->my_s),(0UL),(0UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_LOAD),(my_R_RSI),(my_R_RBP),(0UL),(0UL),(16UL)); - (my_as_modrr)(((my_c)->my_s),(my_OP_XORRM),(my_R_RAX),(my_R_RAX)); - (((my_c)->my_s)->my_bits32)=(1UL); - (my_as_modrm)(((my_c)->my_s),(my_OP_LOAD16),(my_R_RAX),(my_R_RDI),(0UL),(0UL),(0UL)); - (((my_c)->my_s)->my_bits32)=(0UL); - (my_as_opr)(((my_c)->my_s),(my_OP_PUSHR),(my_R_RAX)); - (my_emit_ret)(((my_c)->my_s)); - } - (my_d)=((my_find)((my_c),((unsigned char *)"_w16"),((void *)0),(1UL))); - if ((unsigned long)(((my_d)->my_func_defined)&&((unsigned long)(!(((my_d)->my_func_label)->my_fixed))))) { - (my_fixup_label)(((my_c)->my_s),((my_d)->my_func_label)); - (my_add_symbol)(((my_c)->my_s),((my_d)->my_name),((my_d)->my_func_label)); - (my_emit_preamble)(((my_c)->my_s),(0UL),(0UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_LOAD),(my_R_RDI),(my_R_RBP),(0UL),(0UL),(16UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_LOAD),(my_R_RAX),(my_R_RBP),(0UL),(0UL),(24UL)); - (((my_c)->my_s)->my_bits32)=(1UL); - (my_as_modrm)(((my_c)->my_s),(my_OP_STORE16),(my_R_RAX),(my_R_RDI),(0UL),(0UL),(0UL)); - (((my_c)->my_s)->my_bits32)=(0UL); - (my_as_opr)(((my_c)->my_s),(my_OP_PUSHR),(my_R_RAX)); - (my_emit_ret)(((my_c)->my_s)); - } - (my_d)=((my_find)((my_c),((unsigned char *)"_rdrand"),((void *)0),(1UL))); + if ((unsigned long)(((long)(my_pad))==((long)(my_n)))) { + break; + } + (my_as_emit)((my_c),(my_b)); + (my_pad)=((unsigned long)(((unsigned long)(my_pad))+((unsigned long)(1UL)))); + } +} +void( my_emit_builtin)(struct my_compiler* my_c){ + struct my_decl* my_d = 0; + (my_d)=((my_find)((my_c),((unsigned char *)"syscall"),((void *)0),(1UL))); if ((unsigned long)(((my_d)->my_func_defined)&&((unsigned long)(!(((my_d)->my_func_label)->my_fixed))))) { (my_fixup_label)(((my_c)->my_s),((my_d)->my_func_label)); (my_add_symbol)(((my_c)->my_s),((my_d)->my_name),((my_d)->my_func_label)); - (my_emit_preamble)(((my_c)->my_s),(0UL),(0UL)); - (my_as_modr)(((my_c)->my_s),(my_OP_RDRAND),(my_R_RAX)); - (my_as_opr)(((my_c)->my_s),(my_OP_PUSHR),(my_R_RAX)); - (my_emit_ret)(((my_c)->my_s)); + (my_as_modrr)(((my_c)->my_s),(my_OP_MOVE),(my_R_RAX),(my_R_RDI)); + (my_as_modrr)(((my_c)->my_s),(my_OP_MOVE),(my_R_RDI),(my_R_RSI)); + (my_as_modrr)(((my_c)->my_s),(my_OP_MOVE),(my_R_RSI),(my_R_RDX)); + (my_as_modrr)(((my_c)->my_s),(my_OP_MOVE),(my_R_RDX),(my_R_RCX)); + (my_as_modrr)(((my_c)->my_s),(my_OP_MOVE),(my_R_R10),(my_R_R8)); + (my_as_modrr)(((my_c)->my_s),(my_OP_MOVE),(my_R_R8),(my_R_R9)); + (my_as_modrm)(((my_c)->my_s),(my_OP_LOAD),(my_R_R9),(my_R_RSP),(0UL),(0UL),(8UL)); + (my_as_op)(((my_c)->my_s),(my_OP_SYSCALL)); + (my_as_op)(((my_c)->my_s),(my_OP_RET)); } - (my_d)=((my_find)((my_c),((unsigned char *)"taskswitch"),((void *)0),(1UL))); + (my_d)=((my_find)((my_c),((unsigned char *)"ud2"),((void *)0),(1UL))); if ((unsigned long)(((my_d)->my_func_defined)&&((unsigned long)(!(((my_d)->my_func_label)->my_fixed))))) { (my_fixup_label)(((my_c)->my_s),((my_d)->my_func_label)); - (my_add_symbol)(((my_c)->my_s),((my_d)->my_name),((my_d)->my_func_label)); - (my_as_opr)(((my_c)->my_s),(my_OP_PUSHR),(my_R_RBP)); - (my_as_op)(((my_c)->my_s),(my_OP_PUSHF)); - (my_as_modrm)(((my_c)->my_s),(my_OP_LOAD),(my_R_RBP),(my_R_RSP),(0UL),(0UL),(24UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_STORE),(my_R_RAX),(my_R_RBP),(0UL),(0UL),(0UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_STORE),(my_R_RCX),(my_R_RBP),(0UL),(0UL),(8UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_STORE),(my_R_RDX),(my_R_RBP),(0UL),(0UL),(16UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_STORE),(my_R_RBX),(my_R_RBP),(0UL),(0UL),(24UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_LEA),(my_R_RAX),(my_R_RSP),(0UL),(0UL),(24UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_STORE),(my_R_RAX),(my_R_RBP),(0UL),(0UL),(32UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_LOAD),(my_R_RAX),(my_R_RSP),(0UL),(0UL),(8UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_STORE),(my_R_RAX),(my_R_RBP),(0UL),(0UL),(40UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_STORE),(my_R_RSI),(my_R_RBP),(0UL),(0UL),(48UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_STORE),(my_R_RDI),(my_R_RBP),(0UL),(0UL),(56UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_STORE),(my_R_R8),(my_R_RBP),(0UL),(0UL),(64UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_STORE),(my_R_R9),(my_R_RBP),(0UL),(0UL),(72UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_STORE),(my_R_R10),(my_R_RBP),(0UL),(0UL),(80UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_STORE),(my_R_R11),(my_R_RBP),(0UL),(0UL),(88UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_STORE),(my_R_R12),(my_R_RBP),(0UL),(0UL),(96UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_STORE),(my_R_R13),(my_R_RBP),(0UL),(0UL),(104UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_STORE),(my_R_R14),(my_R_RBP),(0UL),(0UL),(112UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_STORE),(my_R_R15),(my_R_RBP),(0UL),(0UL),(120UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_LOAD),(my_R_RAX),(my_R_RSP),(0UL),(0UL),(16UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_STORE),(my_R_RAX),(my_R_RBP),(0UL),(0UL),(128UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_LOAD),(my_R_RAX),(my_R_RSP),(0UL),(0UL),(0UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_STORE),(my_R_RAX),(my_R_RBP),(0UL),(0UL),(136UL)); - (my_as_modrr)(((my_c)->my_s),(my_OP_RDSR),(my_R_CS),(my_R_RAX)); - (my_as_modrm)(((my_c)->my_s),(my_OP_STORE),(my_R_RAX),(my_R_RBP),(0UL),(0UL),(144UL)); - (my_as_modrr)(((my_c)->my_s),(my_OP_RDSR),(my_R_SS),(my_R_RAX)); - (my_as_modrm)(((my_c)->my_s),(my_OP_STORE),(my_R_RAX),(my_R_RBP),(0UL),(0UL),(152UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_LOAD),(my_R_RBP),(my_R_RSP),(0UL),(0UL),(32UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_LOAD),(my_R_RCX),(my_R_RBP),(0UL),(0UL),(8UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_LOAD),(my_R_RDX),(my_R_RBP),(0UL),(0UL),(16UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_LOAD),(my_R_RBX),(my_R_RBP),(0UL),(0UL),(24UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_LOAD),(my_R_RSI),(my_R_RBP),(0UL),(0UL),(48UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_LOAD),(my_R_RDI),(my_R_RBP),(0UL),(0UL),(56UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_LOAD),(my_R_R8),(my_R_RBP),(0UL),(0UL),(64UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_LOAD),(my_R_R9),(my_R_RBP),(0UL),(0UL),(72UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_LOAD),(my_R_R10),(my_R_RBP),(0UL),(0UL),(80UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_LOAD),(my_R_R11),(my_R_RBP),(0UL),(0UL),(88UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_LOAD),(my_R_R12),(my_R_RBP),(0UL),(0UL),(96UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_LOAD),(my_R_R13),(my_R_RBP),(0UL),(0UL),(104UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_LOAD),(my_R_R14),(my_R_RBP),(0UL),(0UL),(112UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_LOAD),(my_R_R15),(my_R_RBP),(0UL),(0UL),(120UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_LOAD),(my_R_RAX),(my_R_RBP),(0UL),(0UL),(152UL)); - (my_as_opr)(((my_c)->my_s),(my_OP_PUSHR),(my_R_RAX)); - (my_as_modrm)(((my_c)->my_s),(my_OP_LOAD),(my_R_RAX),(my_R_RBP),(0UL),(0UL),(32UL)); - (my_as_opr)(((my_c)->my_s),(my_OP_PUSHR),(my_R_RAX)); - (my_as_modrm)(((my_c)->my_s),(my_OP_LOAD),(my_R_RAX),(my_R_RBP),(0UL),(0UL),(136UL)); - (my_as_opr)(((my_c)->my_s),(my_OP_PUSHR),(my_R_RAX)); - (my_as_modrm)(((my_c)->my_s),(my_OP_LOAD),(my_R_RAX),(my_R_RBP),(0UL),(0UL),(144UL)); - (my_as_opr)(((my_c)->my_s),(my_OP_PUSHR),(my_R_RAX)); - (my_as_modrm)(((my_c)->my_s),(my_OP_LOAD),(my_R_RAX),(my_R_RBP),(0UL),(0UL),(128UL)); - (my_as_opr)(((my_c)->my_s),(my_OP_PUSHR),(my_R_RAX)); - (my_as_modrm)(((my_c)->my_s),(my_OP_LOAD),(my_R_RAX),(my_R_RBP),(0UL),(0UL),(0UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_LOAD),(my_R_RBP),(my_R_RBP),(0UL),(0UL),(40UL)); - (my_as_op)(((my_c)->my_s),(my_OP_IRETQ)); - } -} -void( my_emit_call)(struct my_assembler* my_c,unsigned long my_n){ - (my_as_opr)((my_c),(my_OP_POPR),(my_R_RAX)); - (my_as_modr)((my_c),(my_OP_ICALLM),(my_R_RAX)); - (my_emit_pop)((my_c),(my_n)); - (my_as_opr)((my_c),(my_OP_PUSHR),(my_R_RAX)); -} -void( my_emit_div)(struct my_assembler* my_c){ - (my_as_opr)((my_c),(my_OP_POPR),(my_R_RAX)); - (my_as_opr)((my_c),(my_OP_POPR),(my_R_RCX)); - (my_as_modrr)((my_c),(my_OP_XORRM),(my_R_RDX),(my_R_RDX)); - (my_as_modrr)((my_c),(my_OP_TESTRM),(my_R_RAX),(my_R_RAX)); - (my_as_modrr)((my_c),((unsigned long)(((unsigned long)(my_OP_SETCC))+((unsigned long)(my_CC_S)))),(0UL),(my_R_RDX)); - (my_as_modr)((my_c),(my_OP_NEGM),(my_R_RDX)); - (my_as_modr)((my_c),(my_OP_IDIVM),(my_R_RCX)); - (my_as_opr)((my_c),(my_OP_PUSHR),(my_R_RAX)); -} -void( my_emit_eq)(struct my_assembler* my_c){ - (my_as_opr)((my_c),(my_OP_POPR),(my_R_RDX)); - (my_as_opr)((my_c),(my_OP_POPR),(my_R_RCX)); - (my_as_modrr)((my_c),(my_OP_XORRM),(my_R_RAX),(my_R_RAX)); - (my_as_modrr)((my_c),(my_OP_CMPRM),(my_R_RDX),(my_R_RCX)); - (my_as_modrr)((my_c),((unsigned long)(((unsigned long)(my_OP_SETCC))+((unsigned long)(my_CC_E)))),(0UL),(my_R_RAX)); - (my_as_opr)((my_c),(my_OP_PUSHR),(my_R_RAX)); -} -void( my_emit_ge)(struct my_assembler* my_c){ - (my_as_opr)((my_c),(my_OP_POPR),(my_R_RDX)); - (my_as_opr)((my_c),(my_OP_POPR),(my_R_RCX)); - (my_as_modrr)((my_c),(my_OP_XORRM),(my_R_RAX),(my_R_RAX)); - (my_as_modrr)((my_c),(my_OP_CMPRM),(my_R_RDX),(my_R_RCX)); - (my_as_modrr)((my_c),((unsigned long)(((unsigned long)(my_OP_SETCC))+((unsigned long)(my_CC_GE)))),(0UL),(my_R_RAX)); - (my_as_opr)((my_c),(my_OP_PUSHR),(my_R_RAX)); -} -void( my_emit_gt)(struct my_assembler* my_c){ - (my_as_opr)((my_c),(my_OP_POPR),(my_R_RDX)); - (my_as_opr)((my_c),(my_OP_POPR),(my_R_RCX)); - (my_as_modrr)((my_c),(my_OP_XORRM),(my_R_RAX),(my_R_RAX)); - (my_as_modrr)((my_c),(my_OP_CMPRM),(my_R_RDX),(my_R_RCX)); - (my_as_modrr)((my_c),((unsigned long)(((unsigned long)(my_OP_SETCC))+((unsigned long)(my_CC_G)))),(0UL),(my_R_RAX)); - (my_as_opr)((my_c),(my_OP_PUSHR),(my_R_RAX)); + (my_as_op)(((my_c)->my_s),(my_OP_UD2)); + } } void( my_emit_hook)(struct my_assembler* my_c){ if ((unsigned long)(!((my_c)->my_lines_out))) { @@ -3697,114 +2743,6 @@ void( my_emit_hook)(struct my_assembler* my_c){ ((my_c)->my_prevlineno)=((my_c)->my_lineno); ((my_c)->my_prevfilename)=((my_c)->my_filename); } -void( my_emit_isr)(struct my_compiler* my_c){ - struct my_decl* my_d = 0; - struct my_label* my_out = 0; - unsigned long my_i = 0; - (my_out)=((my_mklabel)(((my_c)->my_s))); - (my_i)=(0UL); - while (1) { - if ((unsigned long)(((long)(my_i))==((long)(256UL)))) { - break; - } - (my_reserve)(((my_c)->my_s),(16UL)); - if ((unsigned long)(((unsigned long)(((long)(my_i))==((long)(8UL))))||((unsigned long)(((unsigned long)(((long)(my_i))==((long)(10UL))))||((unsigned long)(((unsigned long)(((long)(my_i))==((long)(11UL))))||((unsigned long)(((unsigned long)(((long)(my_i))==((long)(12UL))))||((unsigned long)(((unsigned long)(((long)(my_i))==((long)(13UL))))||((unsigned long)(((unsigned long)(((long)(my_i))==((long)(14UL))))||((unsigned long)(((unsigned long)(((long)(my_i))==((long)(17UL))))||((unsigned long)(((unsigned long)(((long)(my_i))==((long)(21UL))))||((unsigned long)(((unsigned long)(((long)(my_i))==((long)(29UL))))||((unsigned long)(((long)(my_i))==((long)(30UL)))))))))))))))))))))) { - (my_as_emit)(((my_c)->my_s),(144UL)); - (my_as_emit)(((my_c)->my_s),(144UL)); - } else { - (my_as_emit)(((my_c)->my_s),(106UL)); - (my_as_emit)(((my_c)->my_s),(0UL)); - } - (my_as_emit)(((my_c)->my_s),(104UL)); - (my_as_emit)(((my_c)->my_s),(my_i)); - (my_as_emit)(((my_c)->my_s),(0UL)); - (my_as_emit)(((my_c)->my_s),(0UL)); - (my_as_emit)(((my_c)->my_s),(0UL)); - (my_as_emit)(((my_c)->my_s),(233UL)); - (my_as_emit)(((my_c)->my_s),(0UL)); - (my_as_emit)(((my_c)->my_s),(0UL)); - (my_as_emit)(((my_c)->my_s),(0UL)); - (my_as_emit)(((my_c)->my_s),(0UL)); - (my_addfixup)(((my_c)->my_s),(my_out)); - (my_as_emit)(((my_c)->my_s),(144UL)); - (my_as_emit)(((my_c)->my_s),(144UL)); - (my_as_emit)(((my_c)->my_s),(144UL)); - (my_as_emit)(((my_c)->my_s),(144UL)); - (my_i)=((unsigned long)(((unsigned long)(my_i))+((unsigned long)(1UL)))); - } - (my_fixup_label)(((my_c)->my_s),(my_out)); - (my_as_modri)(((my_c)->my_s),(my_OP_SUBI),(my_R_RSP),(176UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_STORE),(my_R_RBP),(my_R_RSP),(0UL),(0UL),(40UL)); - (my_as_modrr)(((my_c)->my_s),(my_OP_MOVE),(my_R_RBP),(my_R_RSP)); - (my_as_opr)(((my_c)->my_s),(my_OP_PUSHR),(my_R_RBP)); - (my_as_modrm)(((my_c)->my_s),(my_OP_STORE),(my_R_RAX),(my_R_RBP),(0UL),(0UL),(0UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_STORE),(my_R_RCX),(my_R_RBP),(0UL),(0UL),(8UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_STORE),(my_R_RDX),(my_R_RBP),(0UL),(0UL),(16UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_STORE),(my_R_RBX),(my_R_RBP),(0UL),(0UL),(24UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_STORE),(my_R_RSI),(my_R_RBP),(0UL),(0UL),(48UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_STORE),(my_R_RDI),(my_R_RBP),(0UL),(0UL),(56UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_STORE),(my_R_R8),(my_R_RBP),(0UL),(0UL),(64UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_STORE),(my_R_R9),(my_R_RBP),(0UL),(0UL),(72UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_STORE),(my_R_R10),(my_R_RBP),(0UL),(0UL),(80UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_STORE),(my_R_R11),(my_R_RBP),(0UL),(0UL),(88UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_STORE),(my_R_R12),(my_R_RBP),(0UL),(0UL),(96UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_STORE),(my_R_R13),(my_R_RBP),(0UL),(0UL),(104UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_STORE),(my_R_R14),(my_R_RBP),(0UL),(0UL),(112UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_STORE),(my_R_R15),(my_R_RBP),(0UL),(0UL),(120UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_LOAD),(my_R_RAX),(my_R_RBP),(0UL),(0UL),((unsigned long)(((unsigned long)(176UL))+((unsigned long)(0UL))))); - (my_as_modrm)(((my_c)->my_s),(my_OP_STORE),(my_R_RAX),(my_R_RBP),(0UL),(0UL),(160UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_LOAD),(my_R_RAX),(my_R_RBP),(0UL),(0UL),((unsigned long)(((unsigned long)(176UL))+((unsigned long)(8UL))))); - (my_as_modrm)(((my_c)->my_s),(my_OP_STORE),(my_R_RAX),(my_R_RBP),(0UL),(0UL),(168UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_LOAD),(my_R_RAX),(my_R_RBP),(0UL),(0UL),((unsigned long)(((unsigned long)(176UL))+((unsigned long)(16UL))))); - (my_as_modrm)(((my_c)->my_s),(my_OP_STORE),(my_R_RAX),(my_R_RBP),(0UL),(0UL),(128UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_LOAD),(my_R_RAX),(my_R_RBP),(0UL),(0UL),((unsigned long)(((unsigned long)(176UL))+((unsigned long)(24UL))))); - (my_as_modrm)(((my_c)->my_s),(my_OP_STORE),(my_R_RAX),(my_R_RBP),(0UL),(0UL),(144UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_LOAD),(my_R_RAX),(my_R_RBP),(0UL),(0UL),((unsigned long)(((unsigned long)(176UL))+((unsigned long)(32UL))))); - (my_as_modrm)(((my_c)->my_s),(my_OP_STORE),(my_R_RAX),(my_R_RBP),(0UL),(0UL),(136UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_LOAD),(my_R_RAX),(my_R_RBP),(0UL),(0UL),((unsigned long)(((unsigned long)(176UL))+((unsigned long)(40UL))))); - (my_as_modrm)(((my_c)->my_s),(my_OP_STORE),(my_R_RAX),(my_R_RBP),(0UL),(0UL),(32UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_LOAD),(my_R_RAX),(my_R_RBP),(0UL),(0UL),((unsigned long)(((unsigned long)(176UL))+((unsigned long)(48UL))))); - (my_as_modrm)(((my_c)->my_s),(my_OP_STORE),(my_R_RAX),(my_R_RBP),(0UL),(0UL),(152UL)); - (my_d)=((my_find)((my_c),((unsigned char *)"_isr"),((void *)0),(1UL))); - if ((unsigned long)(((my_d)->my_func_defined)&&(((my_d)->my_func_label)->my_fixed))) { - (my_as_jmp)(((my_c)->my_s),(my_OP_CALL),((my_d)->my_func_label)); - } - (my_as_modrm)(((my_c)->my_s),(my_OP_LOAD),(my_R_RAX),(my_R_RBP),(0UL),(0UL),(128UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_STORE),(my_R_RAX),(my_R_RBP),(0UL),(0UL),((unsigned long)(((unsigned long)(176UL))+((unsigned long)(16UL))))); - (my_as_modrm)(((my_c)->my_s),(my_OP_LOAD),(my_R_RAX),(my_R_RBP),(0UL),(0UL),(144UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_STORE),(my_R_RAX),(my_R_RBP),(0UL),(0UL),((unsigned long)(((unsigned long)(176UL))+((unsigned long)(24UL))))); - (my_as_modrm)(((my_c)->my_s),(my_OP_LOAD),(my_R_RAX),(my_R_RBP),(0UL),(0UL),(136UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_STORE),(my_R_RAX),(my_R_RBP),(0UL),(0UL),((unsigned long)(((unsigned long)(176UL))+((unsigned long)(32UL))))); - (my_as_modrm)(((my_c)->my_s),(my_OP_LOAD),(my_R_RAX),(my_R_RBP),(0UL),(0UL),(32UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_STORE),(my_R_RAX),(my_R_RBP),(0UL),(0UL),((unsigned long)(((unsigned long)(176UL))+((unsigned long)(40UL))))); - (my_as_modrm)(((my_c)->my_s),(my_OP_LOAD),(my_R_RAX),(my_R_RBP),(0UL),(0UL),(152UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_STORE),(my_R_RAX),(my_R_RBP),(0UL),(0UL),((unsigned long)(((unsigned long)(176UL))+((unsigned long)(48UL))))); - (my_as_modrm)(((my_c)->my_s),(my_OP_LOAD),(my_R_RAX),(my_R_RBP),(0UL),(0UL),(0UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_LOAD),(my_R_RCX),(my_R_RBP),(0UL),(0UL),(8UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_LOAD),(my_R_RDX),(my_R_RBP),(0UL),(0UL),(16UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_LOAD),(my_R_RBX),(my_R_RBP),(0UL),(0UL),(24UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_LOAD),(my_R_RSI),(my_R_RBP),(0UL),(0UL),(48UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_LOAD),(my_R_RDI),(my_R_RBP),(0UL),(0UL),(56UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_LOAD),(my_R_R8),(my_R_RBP),(0UL),(0UL),(64UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_LOAD),(my_R_R9),(my_R_RBP),(0UL),(0UL),(72UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_LOAD),(my_R_R10),(my_R_RBP),(0UL),(0UL),(80UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_LOAD),(my_R_R11),(my_R_RBP),(0UL),(0UL),(88UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_LOAD),(my_R_R12),(my_R_RBP),(0UL),(0UL),(96UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_LOAD),(my_R_R13),(my_R_RBP),(0UL),(0UL),(104UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_LOAD),(my_R_R14),(my_R_RBP),(0UL),(0UL),(112UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_LOAD),(my_R_R15),(my_R_RBP),(0UL),(0UL),(120UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_LOAD),(my_R_RBP),(my_R_RBP),(0UL),(0UL),(40UL)); - (my_as_modri)(((my_c)->my_s),(my_OP_ADDI),(my_R_RSP),((unsigned long)(((unsigned long)(176UL))+((unsigned long)((unsigned long)(((long)(3UL))*((long)(8UL)))))))); - (my_as_op)(((my_c)->my_s),(my_OP_IRETQ)); -} -void( my_emit_jmp)(struct my_assembler* my_c,struct my_label* my_l){ - (my_as_jmp)((my_c),(my_OP_JMP),(my_l)); -} -void( my_emit_jz)(struct my_assembler* my_c,struct my_label* my_l){ - (my_as_opr)((my_c),(my_OP_POPR),(my_R_RAX)); - (my_as_modrr)((my_c),(my_OP_TESTRM),(my_R_RAX),(my_R_RAX)); - (my_as_jmp)((my_c),((unsigned long)(((unsigned long)(my_OP_JCC))+((unsigned long)(my_CC_E)))),(my_l)); -} void( my_emit_kstart)(struct my_assembler* my_c){ struct my_label* my_hang = 0; struct my_label* my_do_iret = 0; @@ -3909,98 +2847,13 @@ void( my_emit_kstart)(struct my_assembler* my_c){ (my_fixup_label)((my_c),(my_done)); (my_as_modrr)((my_c),(my_OP_XORRM),(my_R_RBP),(my_R_RBP)); (my_as_opr)((my_c),(my_OP_PUSHR),(my_R_RBX)); + (my_as_modrr)((my_c),(my_OP_MOVE),(my_R_RDI),(my_R_RBX)); (my_as_opr)((my_c),(my_OP_PUSHR),(my_R_RBP)); } -void( my_emit_lcall)(struct my_assembler* my_c,struct my_label* my_l,unsigned long my_n){ - (my_as_jmp)((my_c),(my_OP_CALL),(my_l)); - (my_emit_pop)((my_c),(my_n)); - (my_as_opr)((my_c),(my_OP_PUSHR),(my_R_RAX)); -} -void( my_emit_le)(struct my_assembler* my_c){ - (my_as_opr)((my_c),(my_OP_POPR),(my_R_RDX)); - (my_as_opr)((my_c),(my_OP_POPR),(my_R_RCX)); - (my_as_modrr)((my_c),(my_OP_XORRM),(my_R_RAX),(my_R_RAX)); - (my_as_modrr)((my_c),(my_OP_CMPRM),(my_R_RDX),(my_R_RCX)); - (my_as_modrr)((my_c),((unsigned long)(((unsigned long)(my_OP_SETCC))+((unsigned long)(my_CC_LE)))),(0UL),(my_R_RAX)); - (my_as_opr)((my_c),(my_OP_PUSHR),(my_R_RAX)); -} -void( my_emit_lea)(struct my_assembler* my_c,unsigned long my_offset){ - (my_as_modrm)((my_c),(my_OP_LEA),(my_R_RAX),(my_R_RBP),(0UL),(0UL),(my_offset)); - (my_as_opr)((my_c),(my_OP_PUSHR),(my_R_RAX)); -} -void( my_emit_load)(struct my_assembler* my_c,struct my_type* my_t){ - (my_as_opr)((my_c),(my_OP_POPR),(my_R_RDI)); - if ((unsigned long)(((long)((my_t)->my_kind))==((long)(my_TY_BYTE)))) { - (my_as_modrr)((my_c),(my_OP_XORRM),(my_R_RAX),(my_R_RAX)); - (my_as_modrm)((my_c),(my_OP_LOADB),(my_R_RAX),(my_R_RDI),(0UL),(0UL),(0UL)); - } else if ((my_type_isprim)((my_t))) { - (my_as_modrm)((my_c),(my_OP_LOAD),(my_R_RAX),(my_R_RDI),(0UL),(0UL),(0UL)); - } else { - (my_die)(((unsigned char *)"invalid load")); - } - (my_as_opr)((my_c),(my_OP_PUSHR),(my_R_RAX)); -} -void( my_emit_lsh)(struct my_assembler* my_c){ - (my_as_opr)((my_c),(my_OP_POPR),(my_R_RAX)); - (my_as_opr)((my_c),(my_OP_POPR),(my_R_RCX)); - (my_as_modr)((my_c),(my_OP_SHLM),(my_R_RAX)); - (my_as_opr)((my_c),(my_OP_PUSHR),(my_R_RAX)); -} -void( my_emit_lt)(struct my_assembler* my_c){ - (my_as_opr)((my_c),(my_OP_POPR),(my_R_RDX)); - (my_as_opr)((my_c),(my_OP_POPR),(my_R_RCX)); - (my_as_modrr)((my_c),(my_OP_XORRM),(my_R_RAX),(my_R_RAX)); - (my_as_modrr)((my_c),(my_OP_CMPRM),(my_R_RDX),(my_R_RCX)); - (my_as_modrr)((my_c),((unsigned long)(((unsigned long)(my_OP_SETCC))+((unsigned long)(my_CC_L)))),(0UL),(my_R_RAX)); - (my_as_opr)((my_c),(my_OP_PUSHR),(my_R_RAX)); -} -void( my_emit_mod)(struct my_assembler* my_c){ - (my_as_opr)((my_c),(my_OP_POPR),(my_R_RAX)); - (my_as_opr)((my_c),(my_OP_POPR),(my_R_RCX)); - (my_as_modrr)((my_c),(my_OP_XORRM),(my_R_RDX),(my_R_RDX)); - (my_as_modrr)((my_c),(my_OP_TESTRM),(my_R_RAX),(my_R_RAX)); - (my_as_modrr)((my_c),((unsigned long)(((unsigned long)(my_OP_SETCC))+((unsigned long)(my_CC_S)))),(0UL),(my_R_RDX)); - (my_as_modr)((my_c),(my_OP_NEGM),(my_R_RDX)); - (my_as_modr)((my_c),(my_OP_IDIVM),(my_R_RCX)); - (my_as_opr)((my_c),(my_OP_PUSHR),(my_R_RDX)); -} -void( my_emit_mul)(struct my_assembler* my_c){ - (my_as_opr)((my_c),(my_OP_POPR),(my_R_RAX)); - (my_as_opr)((my_c),(my_OP_POPR),(my_R_RCX)); - (my_as_modr)((my_c),(my_OP_IMULM),(my_R_RCX)); - (my_as_opr)((my_c),(my_OP_PUSHR),(my_R_RAX)); -} -void( my_emit_ne)(struct my_assembler* my_c){ - (my_as_opr)((my_c),(my_OP_POPR),(my_R_RDX)); - (my_as_opr)((my_c),(my_OP_POPR),(my_R_RCX)); - (my_as_modrr)((my_c),(my_OP_XORRM),(my_R_RAX),(my_R_RAX)); - (my_as_modrr)((my_c),(my_OP_CMPRM),(my_R_RDX),(my_R_RCX)); - (my_as_modrr)((my_c),((unsigned long)(((unsigned long)(my_OP_SETCC))+((unsigned long)(my_CC_NE)))),(0UL),(my_R_RAX)); - (my_as_opr)((my_c),(my_OP_PUSHR),(my_R_RAX)); -} -void( my_emit_neg)(struct my_assembler* my_c){ - (my_as_opr)((my_c),(my_OP_POPR),(my_R_RAX)); - (my_as_modr)((my_c),(my_OP_NEGM),(my_R_RAX)); - (my_as_opr)((my_c),(my_OP_PUSHR),(my_R_RAX)); -} -void( my_emit_not)(struct my_assembler* my_c){ - (my_as_opr)((my_c),(my_OP_POPR),(my_R_RAX)); - (my_as_modr)((my_c),(my_OP_NOTM),(my_R_RAX)); - (my_as_opr)((my_c),(my_OP_PUSHR),(my_R_RAX)); -} void( my_emit_num)(struct my_assembler* my_c,unsigned long my_x){ (my_as_opri64)((my_c),(my_OP_MOVABS),(my_R_RDX),(my_x)); (my_as_opr)((my_c),(my_OP_PUSHR),(my_R_RDX)); } -void( my_emit_or)(struct my_assembler* my_c){ - (my_as_opr)((my_c),(my_OP_POPR),(my_R_RAX)); - (my_as_opr)((my_c),(my_OP_POPR),(my_R_RDX)); - (my_as_modrr)((my_c),(my_OP_ORRM),(my_R_RAX),(my_R_RDX)); - (my_as_opr)((my_c),(my_OP_PUSHR),(my_R_RAX)); -} -void( my_emit_pop)(struct my_assembler* my_c,unsigned long my_n){ - (my_as_modri)((my_c),(my_OP_ADDI),(my_R_RSP),((unsigned long)(((unsigned long)(my_n))<<((unsigned long)(3UL))))); -} void( my_emit_preamble)(struct my_assembler* my_c,unsigned long my_n,unsigned long my_pragma){ unsigned long my_i = 0; if ((unsigned long)(((long)(my_pragma))==((long)(1UL)))) { @@ -4026,28 +2879,6 @@ void( my_emit_preamble)(struct my_assembler* my_c,unsigned long my_n,unsigned lo (my_i)=((unsigned long)(((unsigned long)(my_i))+((unsigned long)(8UL)))); } } -void( my_emit_ptr)(struct my_assembler* my_c,struct my_label* my_l){ - (my_reserve)((my_c),(16UL)); - (my_as_modrm)((my_c),(my_OP_LEA),(my_R_RAX),(my_R_RIP),(0UL),(0UL),(128UL)); - (my_addfixup)((my_c),(my_l)); - (my_as_opr)((my_c),(my_OP_PUSHR),(my_R_RAX)); -} -void( my_emit_restorer)(struct my_assembler* my_c){ - (my_as_modri)((my_c),(my_OP_MOVI),(my_R_RAX),(15UL)); - (my_as_op)((my_c),(my_OP_SYSCALL)); -} -void( my_emit_ret)(struct my_assembler* my_c){ - (my_as_opr)((my_c),(my_OP_POPR),(my_R_RAX)); - (my_as_modrr)((my_c),(my_OP_MOVE),(my_R_RSP),(my_R_RBP)); - (my_as_opr)((my_c),(my_OP_POPR),(my_R_RBP)); - (my_as_op)((my_c),(my_OP_RET)); -} -void( my_emit_rsh)(struct my_assembler* my_c){ - (my_as_opr)((my_c),(my_OP_POPR),(my_R_RAX)); - (my_as_opr)((my_c),(my_OP_POPR),(my_R_RCX)); - (my_as_modr)((my_c),(my_OP_SHRM),(my_R_RAX)); - (my_as_opr)((my_c),(my_OP_PUSHR),(my_R_RAX)); -} unsigned long( my_emit_sections)(struct my_assembler* my_c){ unsigned long my_at = 0; struct my_section* my_s = 0; @@ -4224,129 +3055,6 @@ unsigned long( my_emit_sections)(struct my_assembler* my_c){ } return my_at; } -void( my_emit_ssr)(struct my_compiler* my_c){ - struct my_decl* my_d = 0; - struct my_decl* my_v = 0; - (my_v)=((my_find)((my_c),((unsigned char *)"global"),((unsigned char *)"_save"),(0UL))); - if ((unsigned long)(((unsigned long)(!(my_v)))||((unsigned long)(!((my_v)->my_member_defined))))) { - (my_cdie)((my_c),((unsigned char *)"no _save")); - } - (my_as_emit)(((my_c)->my_s),(my_OP_GS)); - (my_as_modra)(((my_c)->my_s),(my_OP_STORE),(my_R_RSP),((my_v)->my_member_offset)); - (my_v)=((my_find)((my_c),((unsigned char *)"global"),((unsigned char *)"curtask"),(0UL))); - if ((unsigned long)(((unsigned long)(!(my_v)))||((unsigned long)(!((my_v)->my_member_defined))))) { - (my_cdie)((my_c),((unsigned char *)"no global.curtask")); - } - (my_as_emit)(((my_c)->my_s),(my_OP_GS)); - (my_as_modra)(((my_c)->my_s),(my_OP_LOAD),(my_R_RSP),((my_v)->my_member_offset)); - (my_v)=((my_find)((my_c),((unsigned char *)"task"),((unsigned char *)"stack"),(0UL))); - if ((unsigned long)(((unsigned long)(!(my_v)))||((unsigned long)(!((my_v)->my_member_defined))))) { - (my_cdie)((my_c),((unsigned char *)"no task.stack")); - } - (my_as_modrm)(((my_c)->my_s),(my_OP_LOAD),(my_R_RSP),(my_R_RSP),(0UL),(0UL),((my_v)->my_member_offset)); - (my_as_modri)(((my_c)->my_s),(my_OP_ADDI),(my_R_RSP),((unsigned long)(((unsigned long)(4096UL))-((unsigned long)(176UL))))); - (my_as_modrm)(((my_c)->my_s),(my_OP_STORE),(my_R_RAX),(my_R_RSP),(0UL),(0UL),(0UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_STORE),(my_R_RDX),(my_R_RSP),(0UL),(0UL),(16UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_STORE),(my_R_RBX),(my_R_RSP),(0UL),(0UL),(24UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_STORE),(my_R_RBP),(my_R_RSP),(0UL),(0UL),(40UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_STORE),(my_R_RSI),(my_R_RSP),(0UL),(0UL),(48UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_STORE),(my_R_RDI),(my_R_RSP),(0UL),(0UL),(56UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_STORE),(my_R_R8),(my_R_RSP),(0UL),(0UL),(64UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_STORE),(my_R_R9),(my_R_RSP),(0UL),(0UL),(72UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_STORE),(my_R_R10),(my_R_RSP),(0UL),(0UL),(80UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_STORE),(my_R_R12),(my_R_RSP),(0UL),(0UL),(96UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_STORE),(my_R_R13),(my_R_RSP),(0UL),(0UL),(104UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_STORE),(my_R_R14),(my_R_RSP),(0UL),(0UL),(112UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_STORE),(my_R_R15),(my_R_RSP),(0UL),(0UL),(120UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_STORE),(my_R_RCX),(my_R_RSP),(0UL),(0UL),(128UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_STORE),(my_R_R11),(my_R_RSP),(0UL),(0UL),(136UL)); - (my_as_modrr)(((my_c)->my_s),(my_OP_XORRM),(my_R_RAX),(my_R_RAX)); - (my_as_modrm)(((my_c)->my_s),(my_OP_STORE),(my_R_RAX),(my_R_RSP),(0UL),(0UL),(8UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_STORE),(my_R_RAX),(my_R_RSP),(0UL),(0UL),(88UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_STORE),(my_R_RAX),(my_R_RSP),(0UL),(0UL),(160UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_STORE),(my_R_RAX),(my_R_RSP),(0UL),(0UL),(168UL)); - (my_as_modri)(((my_c)->my_s),(my_OP_MOVI),(my_R_RAX),(43UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_STORE),(my_R_RAX),(my_R_RSP),(0UL),(0UL),(144UL)); - (my_as_modri)(((my_c)->my_s),(my_OP_MOVI),(my_R_RAX),(35UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_STORE),(my_R_RAX),(my_R_RSP),(0UL),(0UL),(152UL)); - (my_v)=((my_find)((my_c),((unsigned char *)"global"),((unsigned char *)"_save"),(0UL))); - if ((unsigned long)(((unsigned long)(!(my_v)))||((unsigned long)(!((my_v)->my_member_defined))))) { - (my_cdie)((my_c),((unsigned char *)"no _save")); - } - (my_as_emit)(((my_c)->my_s),(my_OP_GS)); - (my_as_modra)(((my_c)->my_s),(my_OP_LOAD),(my_R_RAX),((my_v)->my_member_offset)); - (my_as_modrm)(((my_c)->my_s),(my_OP_STORE),(my_R_RAX),(my_R_RSP),(0UL),(0UL),(32UL)); - (my_as_modrr)(((my_c)->my_s),(my_OP_MOVE),(my_R_RAX),(my_R_RSP)); - (my_as_modrr)(((my_c)->my_s),(my_OP_XORRM),(my_R_RBP),(my_R_RBP)); - (my_as_opr)(((my_c)->my_s),(my_OP_PUSHR),(my_R_RBP)); - (my_as_opr)(((my_c)->my_s),(my_OP_PUSHR),(my_R_RBP)); - (my_as_modrr)(((my_c)->my_s),(my_OP_MOVE),(my_R_RBP),(my_R_RSP)); - (my_as_opr)(((my_c)->my_s),(my_OP_PUSHR),(my_R_RAX)); - (my_d)=((my_find)((my_c),((unsigned char *)"_ssr"),((void *)0),(1UL))); - if ((unsigned long)(((my_d)->my_func_defined)&&(((my_d)->my_func_label)->my_fixed))) { - (my_as_jmp)(((my_c)->my_s),(my_OP_CALL),((my_d)->my_func_label)); - } - (my_as_op)(((my_c)->my_s),(my_OP_CLI)); - (my_as_modri)(((my_c)->my_s),(my_OP_ADDI),(my_R_RSP),((unsigned long)(((long)(3UL))*((long)(8UL))))); - (my_as_modrm)(((my_c)->my_s),(my_OP_LOAD),(my_R_RAX),(my_R_RSP),(0UL),(0UL),(0UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_LOAD),(my_R_RDX),(my_R_RSP),(0UL),(0UL),(16UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_LOAD),(my_R_RBX),(my_R_RSP),(0UL),(0UL),(24UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_LOAD),(my_R_RBP),(my_R_RSP),(0UL),(0UL),(40UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_LOAD),(my_R_RSI),(my_R_RSP),(0UL),(0UL),(48UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_LOAD),(my_R_RDI),(my_R_RSP),(0UL),(0UL),(56UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_LOAD),(my_R_R8),(my_R_RSP),(0UL),(0UL),(64UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_LOAD),(my_R_R9),(my_R_RSP),(0UL),(0UL),(72UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_LOAD),(my_R_R10),(my_R_RSP),(0UL),(0UL),(80UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_LOAD),(my_R_R12),(my_R_RSP),(0UL),(0UL),(96UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_LOAD),(my_R_R13),(my_R_RSP),(0UL),(0UL),(104UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_LOAD),(my_R_R14),(my_R_RSP),(0UL),(0UL),(112UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_LOAD),(my_R_R15),(my_R_RSP),(0UL),(0UL),(120UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_LOAD),(my_R_RCX),(my_R_RSP),(0UL),(0UL),(128UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_LOAD),(my_R_R11),(my_R_RSP),(0UL),(0UL),(136UL)); - (my_as_modrm)(((my_c)->my_s),(my_OP_LOAD),(my_R_RSP),(my_R_RSP),(0UL),(0UL),(32UL)); - (my_as_rex)(((my_c)->my_s),(my_OP_SYSRET),(0UL),(0UL),(0UL)); - (my_as_op)(((my_c)->my_s),(my_OP_SYSRET)); -} -void( my_emit_store)(struct my_assembler* my_c,struct my_type* my_t){ - (my_as_opr)((my_c),(my_OP_POPR),(my_R_RDI)); - (my_as_opr)((my_c),(my_OP_POPR),(my_R_RAX)); - if ((unsigned long)(((long)((my_t)->my_kind))==((long)(my_TY_BYTE)))) { - (my_as_modrm)((my_c),(my_OP_STOREB),(my_R_RAX),(my_R_RDI),(0UL),(0UL),(0UL)); - } else if ((my_type_isprim)((my_t))) { - (my_as_modrm)((my_c),(my_OP_STORE),(my_R_RAX),(my_R_RDI),(0UL),(0UL),(0UL)); - } else { - (my_die)(((unsigned char *)"invalid store")); - } - (my_as_opr)((my_c),(my_OP_PUSHR),(my_R_RAX)); -} -void( my_emit_str)(struct my_assembler* my_c,unsigned char* my_s){ - struct my_label* my_a = 0; - struct my_label* my_b = 0; - unsigned long my_i = 0; - (my_a)=((my_mklabel)((my_c))); - (my_b)=((my_mklabel)((my_c))); - (my_as_jmp)((my_c),(my_OP_JMP),(my_b)); - (my_fixup_label)((my_c),(my_a)); - (my_i)=(0UL); - while (1) { - if ((unsigned long)(!((my_s)[my_i]))) { - break; - } - (my_as_emit)((my_c),((unsigned long)(my_s)[my_i])); - (my_i)=((unsigned long)(((unsigned long)(my_i))+((unsigned long)(1UL)))); - } - (my_as_emit)((my_c),(0UL)); - (my_as_op)((my_c),(my_OP_NOP)); - (my_as_op)((my_c),(my_OP_NOP)); - (my_as_op)((my_c),(my_OP_NOP)); - (my_as_op)((my_c),(my_OP_NOP)); - (my_as_op)((my_c),(my_OP_NOP)); - (my_as_op)((my_c),(my_OP_NOP)); - (my_as_op)((my_c),(my_OP_NOP)); - (my_as_op)((my_c),(my_OP_NOP)); - (my_fixup_label)((my_c),(my_b)); - (my_emit_ptr)((my_c),(my_a)); -} unsigned long( my_emit_strtab_str)(struct my_assembler* my_c,unsigned char* my_s){ unsigned long my_i = 0; (my_i)=(0UL); @@ -4359,32 +3067,6 @@ unsigned long( my_emit_strtab_str)(struct my_assembler* my_c,unsigned char* my_s } return (unsigned long)(((unsigned long)(my_i))+((unsigned long)(1UL))); } -void( my_emit_sub)(struct my_assembler* my_c){ - (my_as_opr)((my_c),(my_OP_POPR),(my_R_RAX)); - (my_as_opr)((my_c),(my_OP_POPR),(my_R_RDX)); - (my_as_modrr)((my_c),(my_OP_SUBRM),(my_R_RAX),(my_R_RDX)); - (my_as_opr)((my_c),(my_OP_PUSHR),(my_R_RAX)); -} -void( my_emit_syscall)(struct my_assembler* my_c){ - (my_as_modrm)((my_c),(my_OP_LOAD),(my_R_RAX),(my_R_RBP),(0UL),(0UL),(16UL)); - (my_as_modrm)((my_c),(my_OP_LOAD),(my_R_RDI),(my_R_RBP),(0UL),(0UL),(24UL)); - (my_as_modrm)((my_c),(my_OP_LOAD),(my_R_RSI),(my_R_RBP),(0UL),(0UL),(32UL)); - (my_as_modrm)((my_c),(my_OP_LOAD),(my_R_RDX),(my_R_RBP),(0UL),(0UL),(40UL)); - (my_as_modrm)((my_c),(my_OP_LOAD),(my_R_R10),(my_R_RBP),(0UL),(0UL),(48UL)); - (my_as_modrm)((my_c),(my_OP_LOAD),(my_R_R8),(my_R_RBP),(0UL),(0UL),(56UL)); - (my_as_modrm)((my_c),(my_OP_LOAD),(my_R_R9),(my_R_RBP),(0UL),(0UL),(64UL)); - (my_as_op)((my_c),(my_OP_SYSCALL)); - (my_as_opr)((my_c),(my_OP_PUSHR),(my_R_RAX)); -} -void( my_emit_ud)(struct my_assembler* my_c){ - (my_as_op)((my_c),(my_OP_UD2)); -} -void( my_emit_xor)(struct my_assembler* my_c){ - (my_as_opr)((my_c),(my_OP_POPR),(my_R_RAX)); - (my_as_opr)((my_c),(my_OP_POPR),(my_R_RDX)); - (my_as_modrr)((my_c),(my_OP_XORRM),(my_R_RAX),(my_R_RDX)); - (my_as_opr)((my_c),(my_OP_PUSHR),(my_R_RAX)); -} void( my_enter)(struct my_peg* my_c,unsigned long my_tag){ (my_choice)((my_c)); ((my_c)->my_tag)=(my_tag); @@ -4448,10 +3130,11 @@ struct my_irop*( my_expr_to_ir)(struct my_irfunc* my_ic,struct my_node* my_n){ return my_o; } if ((unsigned long)((my_v)&&((my_v)->my_func_defined))) { - (my_mkirfunc)((my_ic),((my_n)->my_s)); + (my_o)=((my_mkirfunc)((my_ic),((my_n)->my_s))); return my_o; } (my_cdie)(((my_ic)->my_c),((unsigned char *)"no such symbol")); + return (void *)0; } else if ((unsigned long)(((long)(my_kind))==((long)(my_N_DOT)))) { if ((unsigned long)(((long)((((my_n)->my_a)->my_t)->my_kind))==((long)(my_TY_PTR)))) { (my_b)=((my_expr_to_ir)((my_ic),((my_n)->my_a))); @@ -4478,7 +3161,11 @@ struct my_irop*( my_expr_to_ir)(struct my_irfunc* my_ic,struct my_node* my_n){ } else if ((unsigned long)(((long)(my_kind))==((long)(my_N_INDEX)))) { (my_a)=((my_expr_to_ir)((my_ic),((my_n)->my_a))); (my_b)=((my_expr_to_ir)((my_ic),((my_n)->my_b))); + if ((unsigned long)(((long)(((my_n)->my_t)->my_kind))==((long)(my_TY_BYTE)))) { + (my_size)=(1UL); + } else { (my_size)=((my_type_sizeof)(((my_ic)->my_c),((my_n)->my_t))); + } (my_c)=((my_mkirconst)((my_ic),(my_size))); (my_d)=((my_mkirop)((my_ic),(my_IOP_MUL),(my_b),(my_c))); (my_e)=((my_mkirop)((my_ic),(my_IOP_ADD),(my_a),(my_d))); @@ -4500,11 +3187,11 @@ struct my_irop*( my_expr_to_ir)(struct my_irfunc* my_ic,struct my_node* my_n){ return my_o; } else if ((unsigned long)(((long)(my_kind))==((long)(my_N_NEG)))) { (my_a)=((my_expr_to_ir)((my_ic),((my_n)->my_a))); - (my_o)=((my_mkirop)((my_ic),(my_IOP_NEG),(my_a),(my_b))); + (my_o)=((my_mkirop)((my_ic),(my_IOP_NEG),(my_a),((void *)0))); return my_o; } else if ((unsigned long)(((long)(my_kind))==((long)(my_N_NOT)))) { (my_a)=((my_expr_to_ir)((my_ic),((my_n)->my_a))); - (my_o)=((my_mkirop)((my_ic),(my_IOP_NOT),(my_a),(my_b))); + (my_o)=((my_mkirop)((my_ic),(my_IOP_NOT),(my_a),((void *)0))); return my_o; } else if ((unsigned long)(((long)(my_kind))==((long)(my_N_BNOT)))) { (my_bool_body)=((my_mkirblock)((my_ic))); @@ -4513,17 +3200,19 @@ struct my_irop*( my_expr_to_ir)(struct my_irfunc* my_ic,struct my_node* my_n){ (my_e)=((my_mkirtmp)((my_ic),((my_n)->my_t))); (my_a)=((my_expr_to_ir)((my_ic),((my_n)->my_a))); (my_irbranch)((my_ic),(my_a),(my_bool_next),(my_bool_body)); - (my_a)=((my_mkirconst)((my_ic),(0UL))); - (my_o)=((my_mkirop)((my_ic),(my_IOP_STORE),(my_e),(my_a))); + (my_a)=((my_mkirop)((my_ic),(my_IOP_REF),(my_e),((void *)0))); + (my_b)=((my_mkirconst)((my_ic),(0UL))); + (my_o)=((my_mkirop)((my_ic),(my_IOP_STORE),(my_a),(my_b))); + ((my_o)->my_t)=((my_n)->my_t); (my_iraddop)((my_ic),(my_o)); (my_irjump)((my_ic),(my_bool_out),(my_bool_next)); - (my_a)=((my_mkirconst)((my_ic),(1UL))); - (my_o)=((my_mkirop)((my_ic),(my_IOP_STORE),(my_e),(my_a))); + (my_a)=((my_mkirop)((my_ic),(my_IOP_REF),(my_e),((void *)0))); + (my_b)=((my_mkirconst)((my_ic),(1UL))); + (my_o)=((my_mkirop)((my_ic),(my_IOP_STORE),(my_a),(my_b))); + ((my_o)->my_t)=((my_n)->my_t); (my_iraddop)((my_ic),(my_o)); (my_irjump)((my_ic),(my_bool_out),(my_bool_out)); - (my_o)=((my_mkirop)((my_ic),(my_IOP_LOAD),(my_e),((void *)0))); - ((my_o)->my_t)=((my_n)->my_t); - return my_o; + return my_e; } else if ((unsigned long)(((long)(my_kind))==((long)(my_N_BOR)))) { (my_bool_body)=((my_mkirblock)((my_ic))); (my_bool_next)=((my_mkirblock)((my_ic))); @@ -4532,24 +3221,28 @@ struct my_irop*( my_expr_to_ir)(struct my_irfunc* my_ic,struct my_node* my_n){ (my_e)=((my_mkirtmp)((my_ic),((my_n)->my_t))); (my_a)=((my_expr_to_ir)((my_ic),((my_n)->my_a))); (my_irbranch)((my_ic),(my_a),(my_bool_next),(my_bool_body)); - (my_a)=((my_mkirconst)((my_ic),(1UL))); - (my_o)=((my_mkirop)((my_ic),(my_IOP_STORE),(my_e),(my_a))); + (my_a)=((my_mkirop)((my_ic),(my_IOP_REF),(my_e),((void *)0))); + (my_b)=((my_mkirconst)((my_ic),(1UL))); + (my_o)=((my_mkirop)((my_ic),(my_IOP_STORE),(my_a),(my_b))); + ((my_o)->my_t)=((my_n)->my_t); (my_iraddop)((my_ic),(my_o)); (my_irjump)((my_ic),(my_bool_out),(my_bool_next)); (my_bool_next)=((my_mkirblock)((my_ic))); (my_a)=((my_expr_to_ir)((my_ic),((my_n)->my_b))); (my_irbranch)((my_ic),(my_a),(my_bool_next),(my_bool_final)); - (my_a)=((my_mkirconst)((my_ic),(1UL))); - (my_o)=((my_mkirop)((my_ic),(my_IOP_STORE),(my_e),(my_a))); + (my_a)=((my_mkirop)((my_ic),(my_IOP_REF),(my_e),((void *)0))); + (my_b)=((my_mkirconst)((my_ic),(1UL))); + (my_o)=((my_mkirop)((my_ic),(my_IOP_STORE),(my_a),(my_b))); + ((my_o)->my_t)=((my_n)->my_t); (my_iraddop)((my_ic),(my_o)); (my_irjump)((my_ic),(my_bool_out),(my_bool_next)); - (my_a)=((my_mkirconst)((my_ic),(0UL))); - (my_o)=((my_mkirop)((my_ic),(my_IOP_STORE),(my_e),(my_a))); + (my_a)=((my_mkirop)((my_ic),(my_IOP_REF),(my_e),((void *)0))); + (my_b)=((my_mkirconst)((my_ic),(0UL))); + (my_o)=((my_mkirop)((my_ic),(my_IOP_STORE),(my_a),(my_b))); + ((my_o)->my_t)=((my_n)->my_t); (my_iraddop)((my_ic),(my_o)); (my_irjump)((my_ic),(my_bool_out),(my_bool_out)); - (my_o)=((my_mkirop)((my_ic),(my_IOP_LOAD),(my_e),((void *)0))); - ((my_o)->my_t)=((my_n)->my_t); - return my_o; + return my_e; } else if ((unsigned long)(((long)(my_kind))==((long)(my_N_BAND)))) { (my_bool_body)=((my_mkirblock)((my_ic))); (my_bool_next)=((my_mkirblock)((my_ic))); @@ -4560,17 +3253,19 @@ struct my_irop*( my_expr_to_ir)(struct my_irfunc* my_ic,struct my_node* my_n){ (my_irbranch)((my_ic),(my_a),(my_bool_next),(my_bool_body)); (my_a)=((my_expr_to_ir)((my_ic),((my_n)->my_b))); (my_irbranch)((my_ic),(my_a),(my_bool_next),(my_bool_final)); - (my_a)=((my_mkirconst)((my_ic),(1UL))); - (my_o)=((my_mkirop)((my_ic),(my_IOP_STORE),(my_e),(my_a))); + (my_a)=((my_mkirop)((my_ic),(my_IOP_REF),(my_e),((void *)0))); + (my_b)=((my_mkirconst)((my_ic),(1UL))); + (my_o)=((my_mkirop)((my_ic),(my_IOP_STORE),(my_a),(my_b))); + ((my_o)->my_t)=((my_n)->my_t); (my_iraddop)((my_ic),(my_o)); (my_irjump)((my_ic),(my_bool_out),(my_bool_next)); - (my_a)=((my_mkirconst)((my_ic),(0UL))); - (my_o)=((my_mkirop)((my_ic),(my_IOP_STORE),(my_e),(my_a))); + (my_a)=((my_mkirop)((my_ic),(my_IOP_REF),(my_e),((void *)0))); + (my_b)=((my_mkirconst)((my_ic),(0UL))); + (my_o)=((my_mkirop)((my_ic),(my_IOP_STORE),(my_a),(my_b))); + ((my_o)->my_t)=((my_n)->my_t); (my_iraddop)((my_ic),(my_o)); (my_irjump)((my_ic),(my_bool_out),(my_bool_out)); - (my_o)=((my_mkirop)((my_ic),(my_IOP_LOAD),(my_e),((void *)0))); - ((my_o)->my_t)=((my_n)->my_t); - return my_o; + return my_e; } else if ((unsigned long)(((long)(my_kind))==((long)(my_N_LT)))) { (my_a)=((my_expr_to_ir)((my_ic),((my_n)->my_a))); (my_b)=((my_expr_to_ir)((my_ic),((my_n)->my_b))); @@ -4653,6 +3348,7 @@ struct my_irop*( my_expr_to_ir)(struct my_irfunc* my_ic,struct my_node* my_n){ return my_o; } else { (my_cdie)(((my_ic)->my_c),((unsigned char *)"unknown expression")); + return (void *)0; } } void( my_fail)(struct my_peg* my_c){ @@ -4810,7 +3506,7 @@ struct my_decl*( my_find)(struct my_compiler* my_c,unsigned char* my_name,unsign if ((unsigned long)(!(my_make))) { return (void *)0; } - (my_d)=((struct my_decl*)(my_alloc)(((my_c)->my_a),(240UL))); + (my_d)=((struct my_decl*)(my_alloc)(((my_c)->my_a),(248UL))); ((my_d)->my_name)=(my_name); ((my_d)->my_member_name)=(my_member_name); ((my_d)->my_p)=(my_p); @@ -5005,9 +3701,10 @@ struct my_irfunc*( my_func_to_ir)(struct my_compiler* my_c,struct my_node* my_n) if ((unsigned long)(!(my_n))) { return (void *)0; } - (my_ic)=((struct my_irfunc*)(my_alloc)(((my_c)->my_a),(112UL))); + (my_ic)=((struct my_irfunc*)(my_alloc)(((my_c)->my_a),(120UL))); ((my_ic)->my_c)=(my_c); ((my_ic)->my_a)=((my_c)->my_a); + ((my_ic)->my_s)=((my_c)->my_s); (my_mkirblock)((my_ic)); ((my_ic)->my_cur)=(((my_ic)->my_blocks)[0UL]); ((my_ic)->my_name)=((((my_n)->my_a)->my_a)->my_s); @@ -5374,6 +4071,17 @@ void( my_irjump)(struct my_irfunc* my_ic,struct my_irblock* my_to,struct my_irbl } ((my_ic)->my_cur)=(my_next); } +void( my_irreset)(struct my_irblock* my_b){ + if ((unsigned long)(!(my_b))) { + return; + } + if ((unsigned long)(!((my_b)->my_mark))) { + return; + } + ((my_b)->my_mark)=(0UL); + (my_irreset)(((my_b)->my_out)); + (my_irreset)(((my_b)->my_alt)); +} void( my_irreturn)(struct my_irfunc* my_ic,struct my_irop* my_value){ struct my_irblock* my_cur = 0; struct my_irop* my_o = 0; @@ -5849,7 +4557,8 @@ struct my_irblock*( my_mkirblock)(struct my_irfunc* my_ic){ } ((my_ic)->my_blocks)=(my_tmp); } - (my_b)=((struct my_irblock*)(my_alloc)(((my_ic)->my_a),(56UL))); + (my_b)=((struct my_irblock*)(my_alloc)(((my_ic)->my_a),(64UL))); + ((my_b)->my_label)=((my_mklabel)(((my_ic)->my_s))); ((my_b)->my_ops)=((void *)0); ((my_b)->my_ops_len)=(0UL); ((my_b)->my_ops_cap)=(0UL); @@ -5917,7 +4626,7 @@ struct my_irvar*( my_mkirvar)(struct my_irfunc* my_ic,unsigned char* my_name,str ((my_ic)->my_vars)=(my_tmp); } (my_i)=((my_ic)->my_vars_len); - (my_v)=((struct my_irvar*)(my_alloc)(((my_ic)->my_a),(48UL))); + (my_v)=((struct my_irvar*)(my_alloc)(((my_ic)->my_a),(56UL))); ((my_v)->my_n)=(my_i); ((my_v)->my_name)=(my_name); ((my_v)->my_t)=(my_t); @@ -6223,6 +4932,439 @@ void( my_open_output)(struct my_assembler* my_c,unsigned char* my_filename){ } ((my_c)->my_out)=((my_fopen)((my_fd),((my_c)->my_a))); } +void( my_output_ir)(struct my_compiler* my_c,struct my_decl* my_d){ + struct my_irfunc* my_ic = 0; + (my_ic)=((my_d)->my_func_ir); + (((my_ic)->my_c)->my_filename)=(((my_d)->my_func_def)->my_filename); + (((my_ic)->my_c)->my_lineno)=(((my_d)->my_func_def)->my_lineno); + (((my_ic)->my_c)->my_colno)=(((my_d)->my_func_def)->my_colno); + (((my_ic)->my_s)->my_filename)=(((my_d)->my_func_def)->my_filename); + (((my_ic)->my_s)->my_lineno)=(((my_d)->my_func_def)->my_lineno); + (my_fixup_label)(((my_c)->my_s),((my_d)->my_func_label)); + (my_add_symbol)(((my_c)->my_s),((my_d)->my_name),((my_d)->my_func_label)); + if ((unsigned long)(((long)((my_strcmp)(((my_d)->my_name),((unsigned char *)"_start"))))==((long)(0UL)))) { + (my_emit_preamble)(((my_c)->my_s),(0UL),(1UL)); + } else if ((unsigned long)(((long)((my_strcmp)(((my_d)->my_name),((unsigned char *)"_kstart"))))==((long)(0UL)))) { + (my_emit_preamble)(((my_c)->my_s),(0UL),(2UL)); + } + (my_as_opr)(((my_ic)->my_s),(my_OP_PUSHR),(my_R_RBP)); + (my_as_modrr)(((my_ic)->my_s),(my_OP_MOVE),(my_R_RBP),(my_R_RSP)); + (my_output_irvars)((my_ic)); + (my_output_irblock)((my_ic),(((my_ic)->my_blocks)[0UL])); + (my_irreset)((((my_ic)->my_blocks)[0UL])); +} +void( my_output_irargs)(struct my_irfunc* my_ic,struct my_irblock* my_b,struct my_irop* my_o){ + unsigned long my_i = 0; + struct my_irop* my_op = 0; + (my_i)=(0UL); + while (1) { + if ((unsigned long)(((long)(my_i))==((long)((my_b)->my_ops_len)))) { + return; + } + (my_op)=(((my_b)->my_ops)[my_i]); + if ((unsigned long)(((long)((my_op)->my_kind))==((long)(my_IOP_ARG)))) { + (my_output_irexpr)((my_ic),(my_b),((my_op)->my_a)); + if ((unsigned long)(((long)((my_op)->my_n))==((long)(0UL)))) { + (my_as_modrr)(((my_ic)->my_s),(my_OP_MOVE),(my_R_RDI),(my_R_RAX)); + } else if ((unsigned long)(((long)((my_op)->my_n))==((long)(1UL)))) { + (my_as_modrr)(((my_ic)->my_s),(my_OP_MOVE),(my_R_RSI),(my_R_RAX)); + } else if ((unsigned long)(((long)((my_op)->my_n))==((long)(2UL)))) { + (my_as_modrr)(((my_ic)->my_s),(my_OP_MOVE),(my_R_RDX),(my_R_RAX)); + } else if ((unsigned long)(((long)((my_op)->my_n))==((long)(3UL)))) { + (my_as_modrr)(((my_ic)->my_s),(my_OP_MOVE),(my_R_RCX),(my_R_RAX)); + } else if ((unsigned long)(((long)((my_op)->my_n))==((long)(4UL)))) { + (my_as_modrr)(((my_ic)->my_s),(my_OP_MOVE),(my_R_R8),(my_R_RAX)); + } else if ((unsigned long)(((long)((my_op)->my_n))==((long)(5UL)))) { + (my_as_modrr)(((my_ic)->my_s),(my_OP_MOVE),(my_R_R9),(my_R_RAX)); + } else { + (my_as_modrm)(((my_ic)->my_s),(my_OP_STORE),(my_R_RAX),(my_R_RSP),(0UL),(0UL),((unsigned long)(((long)((unsigned long)(((unsigned long)((my_op)->my_n))-((unsigned long)(6UL)))))*((long)(8UL))))); + } + } + (my_i)=((unsigned long)(((unsigned long)(my_i))+((unsigned long)(1UL)))); + } +} +void( my_output_irblock)(struct my_irfunc* my_ic,struct my_irblock* my_b){ + struct my_irop* my_op = 0; + unsigned long my_i = 0; + ((my_b)->my_mark)=(1UL); + if ((unsigned long)(!((my_b)->my_done))) { + (my_cdie)(((my_ic)->my_c),((unsigned char *)"no return in function")); + } + (my_fixup_label)(((my_ic)->my_s),((my_b)->my_label)); + (my_i)=(0UL); + while (1) { + if ((unsigned long)(((long)(my_i))==((long)((my_b)->my_ops_len)))) { + break; + } + (my_op)=(((my_b)->my_ops)[my_i]); + (my_output_irstmt)((my_ic),(my_b),(my_op)); + (my_i)=((unsigned long)(((unsigned long)(my_i))+((unsigned long)(1UL)))); + } +} +void( my_output_irexpr)(struct my_irfunc* my_ic,struct my_irblock* my_b,struct my_irop* my_o){ + unsigned long my_kind = 0; + if ((unsigned long)(!(my_o))) { + (my_cdie)(((my_ic)->my_c),((unsigned char *)"no expr")); + } + (my_kind)=((my_o)->my_kind); + if ((unsigned long)(((long)(my_kind))==((long)(my_IOP_VAR)))) { + (my_as_modrm)(((my_ic)->my_s),(my_OP_LOAD),(my_R_RAX),(my_R_RBP),(0UL),(0UL),((((my_ic)->my_vars)[(my_o)->my_n])->my_offset)); + } 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)))) { + (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)))) { + (my_output_irexpr)((my_ic),(my_b),((my_o)->my_a)); + if ((unsigned long)(((long)(((my_o)->my_t)->my_kind))==((long)(my_TY_BYTE)))) { + (my_as_modrr)(((my_ic)->my_s),(my_OP_MOVE),(my_R_RSI),(my_R_RAX)); + (my_as_modrr)(((my_ic)->my_s),(my_OP_XORRM),(my_R_RAX),(my_R_RAX)); + (my_as_modrm)(((my_ic)->my_s),(my_OP_LOADB),(my_R_RAX),(my_R_RSI),(0UL),(0UL),(0UL)); + } else if ((my_type_isprim)(((my_o)->my_t))) { + (my_as_modrm)(((my_ic)->my_s),(my_OP_LOAD),(my_R_RAX),(my_R_RAX),(0UL),(0UL),(0UL)); + } else { + (my_cdie)(((my_ic)->my_c),((unsigned char *)"invalid load")); + } + } else if ((unsigned long)(((long)(my_kind))==((long)(my_IOP_REF)))) { + (my_kind)=(((my_o)->my_a)->my_kind); + if ((unsigned long)(((long)(my_kind))==((long)(my_IOP_LOAD)))) { + (my_output_irexpr)((my_ic),(my_b),(((my_o)->my_a)->my_a)); + } else if ((unsigned long)(((long)(my_kind))==((long)(my_IOP_VAR)))) { + (my_as_modrm)(((my_ic)->my_s),(my_OP_LEA),(my_R_RAX),(my_R_RBP),(0UL),(0UL),((((my_ic)->my_vars)[((my_o)->my_a)->my_n])->my_offset)); + } else { + (my_cdie)(((my_ic)->my_c),((unsigned char *)"invalid ref")); + } + } else if ((unsigned long)(((long)(my_kind))==((long)(my_IOP_NEG)))) { + (my_output_irexpr)((my_ic),(my_b),((my_o)->my_a)); + (my_as_modr)(((my_ic)->my_s),(my_OP_NEGM),(my_R_RAX)); + } else if ((unsigned long)(((long)(my_kind))==((long)(my_IOP_NOT)))) { + (my_output_irexpr)((my_ic),(my_b),((my_o)->my_a)); + (my_as_modr)(((my_ic)->my_s),(my_OP_NOTM),(my_R_RAX)); + } else if ((unsigned long)(((long)(my_kind))==((long)(my_IOP_ADD)))) { + (my_output_irexpr)((my_ic),(my_b),((my_o)->my_b)); + (my_as_opr)(((my_ic)->my_s),(my_OP_PUSHR),(my_R_RAX)); + (my_output_irexpr)((my_ic),(my_b),((my_o)->my_a)); + (my_as_opr)(((my_ic)->my_s),(my_OP_POPR),(my_R_RCX)); + (my_as_modrr)(((my_ic)->my_s),(my_OP_ADDRM),(my_R_RAX),(my_R_RCX)); + } else if ((unsigned long)(((long)(my_kind))==((long)(my_IOP_AND)))) { + (my_output_irexpr)((my_ic),(my_b),((my_o)->my_b)); + (my_as_opr)(((my_ic)->my_s),(my_OP_PUSHR),(my_R_RAX)); + (my_output_irexpr)((my_ic),(my_b),((my_o)->my_a)); + (my_as_opr)(((my_ic)->my_s),(my_OP_POPR),(my_R_RCX)); + (my_as_modrr)(((my_ic)->my_s),(my_OP_ANDRM),(my_R_RAX),(my_R_RCX)); + } else if ((unsigned long)(((long)(my_kind))==((long)(my_IOP_OR)))) { + (my_output_irexpr)((my_ic),(my_b),((my_o)->my_b)); + (my_as_opr)(((my_ic)->my_s),(my_OP_PUSHR),(my_R_RAX)); + (my_output_irexpr)((my_ic),(my_b),((my_o)->my_a)); + (my_as_opr)(((my_ic)->my_s),(my_OP_POPR),(my_R_RCX)); + (my_as_modrr)(((my_ic)->my_s),(my_OP_ORRM),(my_R_RAX),(my_R_RCX)); + } else if ((unsigned long)(((long)(my_kind))==((long)(my_IOP_XOR)))) { + (my_output_irexpr)((my_ic),(my_b),((my_o)->my_b)); + (my_as_opr)(((my_ic)->my_s),(my_OP_PUSHR),(my_R_RAX)); + (my_output_irexpr)((my_ic),(my_b),((my_o)->my_a)); + (my_as_opr)(((my_ic)->my_s),(my_OP_POPR),(my_R_RCX)); + (my_as_modrr)(((my_ic)->my_s),(my_OP_XORRM),(my_R_RAX),(my_R_RCX)); + } else if ((unsigned long)(((long)(my_kind))==((long)(my_IOP_DIV)))) { + (my_output_irexpr)((my_ic),(my_b),((my_o)->my_b)); + (my_as_opr)(((my_ic)->my_s),(my_OP_PUSHR),(my_R_RAX)); + (my_output_irexpr)((my_ic),(my_b),((my_o)->my_a)); + (my_as_opr)(((my_ic)->my_s),(my_OP_POPR),(my_R_RCX)); + (my_as_modrr)(((my_ic)->my_s),(my_OP_XORRM),(my_R_RDX),(my_R_RDX)); + (my_as_modrr)(((my_ic)->my_s),(my_OP_TESTRM),(my_R_RAX),(my_R_RAX)); + (my_as_modrr)(((my_ic)->my_s),((unsigned long)(((unsigned long)(my_OP_SETCC))+((unsigned long)(my_CC_S)))),(0UL),(my_R_RDX)); + (my_as_modr)(((my_ic)->my_s),(my_OP_NEGM),(my_R_RDX)); + (my_as_modr)(((my_ic)->my_s),(my_OP_IDIVM),(my_R_RCX)); + } else if ((unsigned long)(((long)(my_kind))==((long)(my_IOP_MOD)))) { + (my_output_irexpr)((my_ic),(my_b),((my_o)->my_b)); + (my_as_opr)(((my_ic)->my_s),(my_OP_PUSHR),(my_R_RAX)); + (my_output_irexpr)((my_ic),(my_b),((my_o)->my_a)); + (my_as_opr)(((my_ic)->my_s),(my_OP_POPR),(my_R_RCX)); + (my_as_modrr)(((my_ic)->my_s),(my_OP_XORRM),(my_R_RDX),(my_R_RDX)); + (my_as_modrr)(((my_ic)->my_s),(my_OP_TESTRM),(my_R_RAX),(my_R_RAX)); + (my_as_modrr)(((my_ic)->my_s),((unsigned long)(((unsigned long)(my_OP_SETCC))+((unsigned long)(my_CC_S)))),(0UL),(my_R_RDX)); + (my_as_modr)(((my_ic)->my_s),(my_OP_NEGM),(my_R_RDX)); + (my_as_modr)(((my_ic)->my_s),(my_OP_IDIVM),(my_R_RCX)); + (my_as_modrr)(((my_ic)->my_s),(my_OP_MOVE),(my_R_RAX),(my_R_RDX)); + } else if ((unsigned long)(((long)(my_kind))==((long)(my_IOP_LSH)))) { + (my_output_irexpr)((my_ic),(my_b),((my_o)->my_b)); + (my_as_opr)(((my_ic)->my_s),(my_OP_PUSHR),(my_R_RAX)); + (my_output_irexpr)((my_ic),(my_b),((my_o)->my_a)); + (my_as_opr)(((my_ic)->my_s),(my_OP_POPR),(my_R_RCX)); + (my_as_modr)(((my_ic)->my_s),(my_OP_SHLM),(my_R_RAX)); + } else if ((unsigned long)(((long)(my_kind))==((long)(my_IOP_RSH)))) { + (my_output_irexpr)((my_ic),(my_b),((my_o)->my_b)); + (my_as_opr)(((my_ic)->my_s),(my_OP_PUSHR),(my_R_RAX)); + (my_output_irexpr)((my_ic),(my_b),((my_o)->my_a)); + (my_as_opr)(((my_ic)->my_s),(my_OP_POPR),(my_R_RCX)); + (my_as_modr)(((my_ic)->my_s),(my_OP_SHRM),(my_R_RAX)); + } else if ((unsigned long)(((long)(my_kind))==((long)(my_IOP_MUL)))) { + (my_output_irexpr)((my_ic),(my_b),((my_o)->my_b)); + (my_as_opr)(((my_ic)->my_s),(my_OP_PUSHR),(my_R_RAX)); + (my_output_irexpr)((my_ic),(my_b),((my_o)->my_a)); + (my_as_opr)(((my_ic)->my_s),(my_OP_POPR),(my_R_RCX)); + (my_as_modr)(((my_ic)->my_s),(my_OP_IMULM),(my_R_RCX)); + } else if ((unsigned long)(((long)(my_kind))==((long)(my_IOP_SUB)))) { + (my_output_irexpr)((my_ic),(my_b),((my_o)->my_b)); + (my_as_opr)(((my_ic)->my_s),(my_OP_PUSHR),(my_R_RAX)); + (my_output_irexpr)((my_ic),(my_b),((my_o)->my_a)); + (my_as_opr)(((my_ic)->my_s),(my_OP_POPR),(my_R_RCX)); + (my_as_modrr)(((my_ic)->my_s),(my_OP_SUBRM),(my_R_RAX),(my_R_RCX)); + } else if ((unsigned long)(((long)(my_kind))==((long)(my_IOP_EQ)))) { + (my_output_irexpr)((my_ic),(my_b),((my_o)->my_b)); + (my_as_opr)(((my_ic)->my_s),(my_OP_PUSHR),(my_R_RAX)); + (my_output_irexpr)((my_ic),(my_b),((my_o)->my_a)); + (my_as_opr)(((my_ic)->my_s),(my_OP_POPR),(my_R_RCX)); + (my_as_modrr)(((my_ic)->my_s),(my_OP_MOVE),(my_R_RDX),(my_R_RAX)); + (my_as_modrr)(((my_ic)->my_s),(my_OP_XORRM),(my_R_RAX),(my_R_RAX)); + (my_as_modrr)(((my_ic)->my_s),(my_OP_CMPRM),(my_R_RDX),(my_R_RCX)); + (my_as_modrr)(((my_ic)->my_s),((unsigned long)(((unsigned long)(my_OP_SETCC))+((unsigned long)(my_CC_E)))),(0UL),(my_R_RAX)); + } else if ((unsigned long)(((long)(my_kind))==((long)(my_IOP_NE)))) { + (my_output_irexpr)((my_ic),(my_b),((my_o)->my_b)); + (my_as_opr)(((my_ic)->my_s),(my_OP_PUSHR),(my_R_RAX)); + (my_output_irexpr)((my_ic),(my_b),((my_o)->my_a)); + (my_as_opr)(((my_ic)->my_s),(my_OP_POPR),(my_R_RCX)); + (my_as_modrr)(((my_ic)->my_s),(my_OP_MOVE),(my_R_RDX),(my_R_RAX)); + (my_as_modrr)(((my_ic)->my_s),(my_OP_XORRM),(my_R_RAX),(my_R_RAX)); + (my_as_modrr)(((my_ic)->my_s),(my_OP_CMPRM),(my_R_RDX),(my_R_RCX)); + (my_as_modrr)(((my_ic)->my_s),((unsigned long)(((unsigned long)(my_OP_SETCC))+((unsigned long)(my_CC_NE)))),(0UL),(my_R_RAX)); + } else if ((unsigned long)(((long)(my_kind))==((long)(my_IOP_GT)))) { + (my_output_irexpr)((my_ic),(my_b),((my_o)->my_b)); + (my_as_opr)(((my_ic)->my_s),(my_OP_PUSHR),(my_R_RAX)); + (my_output_irexpr)((my_ic),(my_b),((my_o)->my_a)); + (my_as_opr)(((my_ic)->my_s),(my_OP_POPR),(my_R_RCX)); + (my_as_modrr)(((my_ic)->my_s),(my_OP_MOVE),(my_R_RDX),(my_R_RAX)); + (my_as_modrr)(((my_ic)->my_s),(my_OP_XORRM),(my_R_RAX),(my_R_RAX)); + (my_as_modrr)(((my_ic)->my_s),(my_OP_CMPRM),(my_R_RDX),(my_R_RCX)); + (my_as_modrr)(((my_ic)->my_s),((unsigned long)(((unsigned long)(my_OP_SETCC))+((unsigned long)(my_CC_G)))),(0UL),(my_R_RAX)); + } else if ((unsigned long)(((long)(my_kind))==((long)(my_IOP_GE)))) { + (my_output_irexpr)((my_ic),(my_b),((my_o)->my_b)); + (my_as_opr)(((my_ic)->my_s),(my_OP_PUSHR),(my_R_RAX)); + (my_output_irexpr)((my_ic),(my_b),((my_o)->my_a)); + (my_as_opr)(((my_ic)->my_s),(my_OP_POPR),(my_R_RCX)); + (my_as_modrr)(((my_ic)->my_s),(my_OP_MOVE),(my_R_RDX),(my_R_RAX)); + (my_as_modrr)(((my_ic)->my_s),(my_OP_XORRM),(my_R_RAX),(my_R_RAX)); + (my_as_modrr)(((my_ic)->my_s),(my_OP_CMPRM),(my_R_RDX),(my_R_RCX)); + (my_as_modrr)(((my_ic)->my_s),((unsigned long)(((unsigned long)(my_OP_SETCC))+((unsigned long)(my_CC_GE)))),(0UL),(my_R_RAX)); + } else if ((unsigned long)(((long)(my_kind))==((long)(my_IOP_LT)))) { + (my_output_irexpr)((my_ic),(my_b),((my_o)->my_b)); + (my_as_opr)(((my_ic)->my_s),(my_OP_PUSHR),(my_R_RAX)); + (my_output_irexpr)((my_ic),(my_b),((my_o)->my_a)); + (my_as_opr)(((my_ic)->my_s),(my_OP_POPR),(my_R_RCX)); + (my_as_modrr)(((my_ic)->my_s),(my_OP_MOVE),(my_R_RDX),(my_R_RAX)); + (my_as_modrr)(((my_ic)->my_s),(my_OP_XORRM),(my_R_RAX),(my_R_RAX)); + (my_as_modrr)(((my_ic)->my_s),(my_OP_CMPRM),(my_R_RDX),(my_R_RCX)); + (my_as_modrr)(((my_ic)->my_s),((unsigned long)(((unsigned long)(my_OP_SETCC))+((unsigned long)(my_CC_L)))),(0UL),(my_R_RAX)); + } else if ((unsigned long)(((long)(my_kind))==((long)(my_IOP_LE)))) { + (my_output_irexpr)((my_ic),(my_b),((my_o)->my_b)); + (my_as_opr)(((my_ic)->my_s),(my_OP_PUSHR),(my_R_RAX)); + (my_output_irexpr)((my_ic),(my_b),((my_o)->my_a)); + (my_as_opr)(((my_ic)->my_s),(my_OP_POPR),(my_R_RCX)); + (my_as_modrr)(((my_ic)->my_s),(my_OP_MOVE),(my_R_RDX),(my_R_RAX)); + (my_as_modrr)(((my_ic)->my_s),(my_OP_XORRM),(my_R_RAX),(my_R_RAX)); + (my_as_modrr)(((my_ic)->my_s),(my_OP_CMPRM),(my_R_RDX),(my_R_RCX)); + (my_as_modrr)(((my_ic)->my_s),((unsigned long)(((unsigned long)(my_OP_SETCC))+((unsigned long)(my_CC_LE)))),(0UL),(my_R_RAX)); + } else { + (my_cdie)(((my_ic)->my_c),((unsigned char *)"invalid op")); + } +} +void( my_output_irfuncptr)(struct my_irfunc* my_ic,struct my_irblock* my_b,struct my_irop* my_o){ + struct my_decl* my_d = 0; + (my_d)=((my_find)(((my_ic)->my_c),((my_o)->my_s),((void *)0),(0UL))); + if ((unsigned long)(((unsigned long)(!(my_d)))||((unsigned long)(!((my_d)->my_func_defined))))) { + (my_cdie)(((my_ic)->my_c),((unsigned char *)"no such function")); + } + (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_d)->my_func_label)); +} +void( my_output_irretval)(struct my_irfunc* my_ic,struct my_irblock* my_b,struct my_irop* my_o){ + unsigned long my_i = 0; + struct my_irop* my_op = 0; + (my_op)=((void *)0); + (my_i)=(0UL); + while (1) { + if ((unsigned long)(((long)(my_i))==((long)((my_b)->my_ops_len)))) { + return; + } + (my_op)=(((my_b)->my_ops)[my_i]); + if ((unsigned long)(((long)((my_op)->my_kind))==((long)(my_IOP_RETVAL)))) { + break; + } + (my_i)=((unsigned long)(((unsigned long)(my_i))+((unsigned long)(1UL)))); + } + if ((unsigned long)(((long)(((my_op)->my_t)->my_kind))==((long)(my_TY_VOID)))) { + return; + } + (my_as_modrr)(((my_ic)->my_s),(my_OP_MOVE),(my_R_RDI),(my_R_RAX)); + (my_output_irexpr)((my_ic),(my_b),((my_op)->my_a)); + if ((unsigned long)(((long)(((my_op)->my_t)->my_kind))==((long)(my_TY_BYTE)))) { + (my_as_modrm)(((my_ic)->my_s),(my_OP_STOREB),(my_R_RDI),(my_R_RAX),(0UL),(0UL),(0UL)); + } else if ((my_type_isprim)(((my_op)->my_t))) { + (my_as_modrm)(((my_ic)->my_s),(my_OP_STORE),(my_R_RDI),(my_R_RAX),(0UL),(0UL),(0UL)); + } else { + (my_cdie)(((my_ic)->my_c),((unsigned char *)"invalid store")); + } +} +void( my_output_irstmt)(struct my_irfunc* my_ic,struct my_irblock* my_b,struct my_irop* my_o){ + unsigned long my_kind = 0; + (((my_ic)->my_c)->my_filename)=((my_o)->my_filename); + (((my_ic)->my_c)->my_lineno)=((my_o)->my_lineno); + (((my_ic)->my_c)->my_colno)=((my_o)->my_colno); + (((my_ic)->my_s)->my_filename)=((my_o)->my_filename); + (((my_ic)->my_s)->my_lineno)=((my_o)->my_lineno); + (my_kind)=((my_o)->my_kind); + if ((unsigned long)(((long)(my_kind))==((long)(my_IOP_STORE)))) { + (my_output_irexpr)((my_ic),(my_b),((my_o)->my_a)); + (my_as_opr)(((my_ic)->my_s),(my_OP_PUSHR),(my_R_RAX)); + (my_output_irexpr)((my_ic),(my_b),((my_o)->my_b)); + (my_as_opr)(((my_ic)->my_s),(my_OP_POPR),(my_R_RDI)); + if ((unsigned long)(((long)(((my_o)->my_t)->my_kind))==((long)(my_TY_BYTE)))) { + (my_as_modrm)(((my_ic)->my_s),(my_OP_STOREB),(my_R_RAX),(my_R_RDI),(0UL),(0UL),(0UL)); + } else if ((my_type_isprim)(((my_o)->my_t))) { + (my_as_modrm)(((my_ic)->my_s),(my_OP_STORE),(my_R_RAX),(my_R_RDI),(0UL),(0UL),(0UL)); + } else { + (my_cdie)(((my_ic)->my_c),((unsigned char *)"invalid store")); + } + } else if ((unsigned long)(((long)(my_kind))==((long)(my_IOP_RETVAL)))) { + } else if ((unsigned long)(((long)(my_kind))==((long)(my_IOP_ARG)))) { + } else if ((unsigned long)(((long)(my_kind))==((long)(my_IOP_CALL)))) { + if ((unsigned long)(((long)((my_o)->my_n))>((long)(6UL)))) { + (my_as_modri)(((my_ic)->my_s),(my_OP_SUBI),(my_R_RSP),((unsigned long)(((long)((unsigned long)(((unsigned long)((my_o)->my_n))-((unsigned long)(6UL)))))*((long)(8UL))))); + } + (my_output_irargs)((my_ic),(my_b),(my_o)); + (my_output_irexpr)((my_ic),(my_b),((my_o)->my_a)); + (my_as_modr)(((my_ic)->my_s),(my_OP_ICALLM),(my_R_RAX)); + if ((unsigned long)(((long)((my_o)->my_n))>((long)(6UL)))) { + (my_as_modri)(((my_ic)->my_s),(my_OP_ADDI),(my_R_RSP),((unsigned long)(((long)((unsigned long)(((unsigned long)((my_o)->my_n))-((unsigned long)(6UL)))))*((long)(8UL))))); + } + (my_output_irretval)((my_ic),(my_b),(my_o)); + if (((my_b)->my_out)->my_mark) { + (my_as_jmp)(((my_ic)->my_s),(my_OP_JMP),(((my_b)->my_out)->my_label)); + } else { + (my_output_irblock)((my_ic),((my_b)->my_out)); + } + return; + } else if ((unsigned long)(((long)(my_kind))==((long)(my_IOP_JUMP)))) { + if (((my_b)->my_out)->my_mark) { + (my_as_jmp)(((my_ic)->my_s),(my_OP_JMP),(((my_b)->my_out)->my_label)); + } else { + (my_output_irblock)((my_ic),((my_b)->my_out)); + } + return; + } else if ((unsigned long)(((long)(my_kind))==((long)(my_IOP_BRANCH)))) { + (my_output_irexpr)((my_ic),(my_b),((my_o)->my_a)); + (my_as_modrr)(((my_ic)->my_s),(my_OP_TESTRM),(my_R_RAX),(my_R_RAX)); + (my_as_jmp)(((my_ic)->my_s),((unsigned long)(((unsigned long)(my_OP_JCC))+((unsigned long)(my_CC_E)))),(((my_b)->my_alt)->my_label)); + if (((my_b)->my_out)->my_mark) { + (my_as_jmp)(((my_ic)->my_s),((unsigned long)(((unsigned long)(my_OP_JCC))+((unsigned long)(my_CC_NE)))),(((my_b)->my_out)->my_label)); + } else { + (my_output_irblock)((my_ic),((my_b)->my_out)); + } + if ((unsigned long)(!(((my_b)->my_alt)->my_mark))) { + (my_output_irblock)((my_ic),((my_b)->my_alt)); + } + return; + } else if ((unsigned long)(((long)(my_kind))==((long)(my_IOP_RETURN)))) { + if ((my_o)->my_a) { + (my_output_irexpr)((my_ic),(my_b),((my_o)->my_a)); + } + (my_as_modrr)(((my_ic)->my_s),(my_OP_MOVE),(my_R_RSP),(my_R_RBP)); + (my_as_opr)(((my_ic)->my_s),(my_OP_POPR),(my_R_RBP)); + (my_as_op)(((my_ic)->my_s),(my_OP_RET)); + } else { + (my_output_irexpr)((my_ic),(my_b),(my_o)); + } +} +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; + struct my_label* my_out = 0; + unsigned long my_i = 0; + (my_s)=((my_mklabel)(((my_ic)->my_s))); + (my_out)=((my_mklabel)(((my_ic)->my_s))); + (my_as_jmp)(((my_ic)->my_s),(my_OP_JMP),(my_out)); + (my_fixup_label)(((my_ic)->my_s),(my_s)); + (my_i)=(0UL); + while (1) { + if ((unsigned long)(((long)(my_i))==((long)((my_o)->my_slen)))) { + break; + } + (my_as_emit)(((my_ic)->my_s),((unsigned long)((my_o)->my_s)[my_i])); + (my_i)=((unsigned long)(((unsigned long)(my_i))+((unsigned long)(1UL)))); + } + (my_as_emit)(((my_ic)->my_s),(0UL)); + (my_as_op)(((my_ic)->my_s),(my_OP_NOP)); + (my_as_op)(((my_ic)->my_s),(my_OP_NOP)); + (my_as_op)(((my_ic)->my_s),(my_OP_NOP)); + (my_as_op)(((my_ic)->my_s),(my_OP_NOP)); + (my_as_op)(((my_ic)->my_s),(my_OP_NOP)); + (my_as_op)(((my_ic)->my_s),(my_OP_NOP)); + (my_as_op)(((my_ic)->my_s),(my_OP_NOP)); + (my_as_op)(((my_ic)->my_s),(my_OP_NOP)); + (my_fixup_label)(((my_ic)->my_s),(my_out)); + (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)); +} +void( my_output_irvars)(struct my_irfunc* my_ic){ + unsigned long my_offset = 0; + unsigned long my_size = 0; + unsigned long my_i = 0; + struct my_irvar* my_v = 0; + (my_offset)=(0UL); + (my_i)=(0UL); + while (1) { + if ((unsigned long)(((long)(my_i))==((long)((my_ic)->my_vars_len)))) { + break; + } + (my_v)=(((my_ic)->my_vars)[my_i]); + if ((unsigned long)(((my_v)->my_t)&&((unsigned long)(((long)(((my_v)->my_t)->my_kind))!=((long)(my_TY_VOID)))))) { + (my_size)=((my_type_sizeof)(((my_ic)->my_c),((my_v)->my_t))); + } else { + (my_size)=(8UL); + } + (my_size)=((unsigned long)(((unsigned long)((unsigned long)(((unsigned long)(my_size))+((unsigned long)(7UL)))))&((unsigned long)((unsigned long)(-(unsigned long)(8UL)))))); + (my_offset)=((unsigned long)(((unsigned long)(my_offset))+((unsigned long)(my_size)))); + ((my_v)->my_offset)=((unsigned long)(-(unsigned long)(my_offset))); + (my_i)=((unsigned long)(((unsigned long)(my_i))+((unsigned long)(1UL)))); + } + if ((unsigned long)(((long)(my_offset))!=((long)(0UL)))) { + (my_as_modri)(((my_ic)->my_s),(my_OP_SUBI),(my_R_RSP),(my_offset)); + (my_as_modrr)(((my_ic)->my_s),(my_OP_XORRM),(my_R_RAX),(my_R_RAX)); + (my_i)=(0UL); + while (1) { + if ((unsigned long)(((long)(my_i))==((long)(my_offset)))) { + break; + } + (my_i)=((unsigned long)(((unsigned long)(my_i))+((unsigned long)(8UL)))); + (my_as_modrm)(((my_ic)->my_s),(my_OP_STORE),(my_R_RAX),(my_R_RBP),(0UL),(0UL),((unsigned long)(-(unsigned long)(my_i)))); + } + } + (my_i)=(0UL); + while (1) { + if ((unsigned long)(((long)(my_i))==((long)((my_ic)->my_arg_count)))) { + break; + } + (my_v)=(((my_ic)->my_vars)[my_i]); + if ((unsigned long)(((long)(my_i))==((long)(0UL)))) { + (my_as_modrm)(((my_ic)->my_s),(my_OP_STORE),(my_R_RDI),(my_R_RBP),(0UL),(0UL),((my_v)->my_offset)); + } else if ((unsigned long)(((long)(my_i))==((long)(1UL)))) { + (my_as_modrm)(((my_ic)->my_s),(my_OP_STORE),(my_R_RSI),(my_R_RBP),(0UL),(0UL),((my_v)->my_offset)); + } else if ((unsigned long)(((long)(my_i))==((long)(2UL)))) { + (my_as_modrm)(((my_ic)->my_s),(my_OP_STORE),(my_R_RDX),(my_R_RBP),(0UL),(0UL),((my_v)->my_offset)); + } else if ((unsigned long)(((long)(my_i))==((long)(3UL)))) { + (my_as_modrm)(((my_ic)->my_s),(my_OP_STORE),(my_R_RCX),(my_R_RBP),(0UL),(0UL),((my_v)->my_offset)); + } else if ((unsigned long)(((long)(my_i))==((long)(4UL)))) { + (my_as_modrm)(((my_ic)->my_s),(my_OP_STORE),(my_R_R8),(my_R_RBP),(0UL),(0UL),((my_v)->my_offset)); + } else if ((unsigned long)(((long)(my_i))==((long)(5UL)))) { + (my_as_modrm)(((my_ic)->my_s),(my_OP_STORE),(my_R_R9),(my_R_RBP),(0UL),(0UL),((my_v)->my_offset)); + } else { + (my_as_modrm)(((my_ic)->my_s),(my_OP_LOAD),(my_R_RAX),(my_R_RBP),(0UL),(0UL),((unsigned long)(((long)((unsigned long)(((unsigned long)((unsigned long)(((unsigned long)(my_i))-((unsigned long)(6UL)))))+((unsigned long)(2UL)))))*((long)(8UL))))); + (my_as_modrm)(((my_ic)->my_s),(my_OP_STORE),(my_R_RAX),(my_R_RBP),(0UL),(0UL),((my_v)->my_offset)); + } + (my_i)=((unsigned long)(((unsigned long)(my_i))+((unsigned long)(1UL)))); + } +} struct my_node*( my_parse)(struct my_parser* my_c,unsigned char* my_filename){ struct my_file* my_f = 0; unsigned long my_fd = 0; @@ -6285,6 +5427,7 @@ unsigned long( my_parse_escape)(unsigned char* my_s,unsigned long* my_i,unsigned return my_nc; } else { (my_die)(((unsigned char *)"invalid escape")); + return 0UL; } } unsigned long( my_peg_PEG_alternative)(struct my_peg* my_c){ @@ -9420,6 +8563,7 @@ struct my_type*( my_prototype)(struct my_compiler* my_c,struct my_node* my_n){ return (my_mktype1)((my_c),(my_TY_PTR),((my_prototype)((my_c),((my_n)->my_a)))); } else { (my_cdie)((my_c),((unsigned char *)"prototype: invalid type")); + return (void *)0; } } void( my_putchar)(struct my_assembler* my_c,unsigned long my_ch){ @@ -10019,6 +9163,7 @@ struct my_node*( my_reconstruct_primary)(struct my_parser* my_c,struct my_peg_no return (my_reconstruct_expr)((my_c),(my_pn)); } else { (my_die)(((unsigned char *)"invalid primary")); + return (void *)0; } } struct my_node*( my_reconstruct_return)(struct my_parser* my_c,struct my_peg_node* my_pn){ @@ -10098,6 +9243,7 @@ struct my_node*( my_reconstruct_stmt)(struct my_parser* my_c,struct my_peg_node* return (my_reconstruct_compound)((my_c),(my_pn)); } else { (my_die)(((unsigned char *)"invalid stmt")); + return (void *)0; } } struct my_node*( my_reconstruct_str)(struct my_parser* my_c,struct my_peg_node* my_pn){ @@ -10163,6 +9309,7 @@ struct my_node*( my_reconstruct_type)(struct my_parser* my_c,struct my_peg_node* return (my_reconstruct_type)((my_c),(my_pn)); } else { (my_die)(((unsigned char *)"reconstruct_type: invalid type")); + return (void *)0; } } struct my_node*( my_reconstruct_unary)(struct my_parser* my_c,struct my_peg_node* my_pn){ @@ -10720,7 +9867,9 @@ unsigned long( my_type_isprim)(struct my_type* my_t){ unsigned long( my_type_sizeof)(struct my_compiler* my_c,struct my_type* my_t){ unsigned long my_kind = 0; (my_kind)=((my_t)->my_kind); - if ((unsigned long)(((long)(my_kind))==((long)(my_TY_INT)))) { + if ((unsigned long)(((long)(my_kind))==((long)(my_TY_NIL)))) { + return 8UL; + } else if ((unsigned long)(((long)(my_kind))==((long)(my_TY_INT)))) { return 8UL; } else if ((unsigned long)(((long)(my_kind))==((long)(my_TY_BYTE)))) { return 8UL; @@ -10736,6 +9885,7 @@ unsigned long( my_type_sizeof)(struct my_compiler* my_c,struct my_type* my_t){ return ((my_t)->my_st)->my_struct_size; } else { (my_cdie)((my_c),((unsigned char *)"sizeof: invalid type")); + return 0UL; } } void( my_typecheck_expr)(struct my_compiler* my_c,struct my_decl* my_d,struct my_node* my_n,unsigned long my_rhs){ @@ -11296,16 +10446,6 @@ void( my_unify)(struct my_compiler* my_c,struct my_type* my_a,struct my_type* my unsigned long( my_unlink)(unsigned char* my_name){ return (my_syscall)((87UL),((unsigned long)my_name),(0UL),(0UL),(0UL),(0UL),(0UL)); } -void( my_update_place)(struct my_compiler* my_c,struct my_node* my_n){ - if ((unsigned long)(!(my_n))) { - return; - } - ((my_c)->my_filename)=((my_n)->my_filename); - ((my_c)->my_lineno)=((my_n)->my_lineno); - ((my_c)->my_colno)=((my_n)->my_colno); - (((my_c)->my_s)->my_filename)=((my_n)->my_filename); - (((my_c)->my_s)->my_lineno)=((my_n)->my_lineno); -} unsigned long( my_write)(unsigned long my_fd,unsigned char* my_buf,unsigned long my_n){ return (my_syscall)((1UL),(my_fd),((unsigned long)my_buf),(my_n),(0UL),(0UL),(0UL)); } diff --git a/cc1.om b/cc1.om @@ -183,16 +183,29 @@ func compile(c: *compiler, p: *node) { check_usage(c); - // Compile functions + // Translate each function to ir d = first_decl(c); loop { if (!d) { break; } - if d.func_used && d.func_defined { - func_to_ir(c, d.func_def); - compile_func(c, d); + if d.func_used && d.func_defined && d.func_def { + d.func_ir = func_to_ir(c, d.func_def); + } + + d = next_decl(c, d); + } + + // Compile the ir to output + d = first_decl(c); + loop { + if (!d) { + break; + } + + if d.func_used && d.func_defined && d.func_def { + output_ir(c, d); } d = next_decl(c, d); @@ -606,35 +619,6 @@ func layout_union(c: *compiler, d: *decl) { d.struct_layout_done = 1; } -func compile_func(c: *compiler, d: *decl) { - var pragma: int; - - if (!d.func_def) { - return; - } - - if (!strcmp(d.name, "_start")) { - pragma = 1; - } else if (!strcmp(d.name, "_kstart")) { - pragma = 2; - } else { - pragma = 0; - } - - // Compile the function body - fixup_label(c.s, d.func_label); - add_symbol(c.s, d.name, d.func_label); - emit_preamble(c.s, d.func_preamble, pragma); - compile_stmt(c, d, d.func_def.b, nil, nil); - emit_num(c.s, 0); - - if (pragma) { - emit_ud(c.s); - } - - emit_ret(c.s); -} - func typecheck_expr(c: *compiler, d: *decl, n: *node, rhs: int) { var v: *decl; var kind: int; @@ -1988,15 +1972,22 @@ func emit_builtin(c: *compiler) { if (d.func_defined && !d.func_label.fixed) { fixup_label(c.s, d.func_label); add_symbol(c.s, d.name, d.func_label); - emit_preamble(c.s, 0, 0); - emit_syscall(c.s); - emit_ret(c.s); + as_modrr(c.s, OP_MOVE, R_RAX, R_RDI); + as_modrr(c.s, OP_MOVE, R_RDI, R_RSI); + as_modrr(c.s, OP_MOVE, R_RSI, R_RDX); + as_modrr(c.s, OP_MOVE, R_RDX, R_RCX); + as_modrr(c.s, OP_MOVE, R_R10, R_R8); + as_modrr(c.s, OP_MOVE, R_R8, R_R9); + as_modrm(c.s, OP_LOAD, R_R9, R_RSP, 0, 0, 8); + as_op(c.s, OP_SYSCALL); + as_op(c.s, OP_RET); } d = find(c, "_restorer", nil, 1); if (d.func_defined && !d.func_label.fixed) { fixup_label(c.s, d.func_label); add_symbol(c.s, d.name, d.func_label); + as_op(c.s, OP_UD2); emit_restorer(c.s); } @@ -2004,26 +1995,21 @@ func emit_builtin(c: *compiler) { if (d.func_defined && !d.func_label.fixed) { fixup_label(c.s, d.func_label); add_symbol(c.s, d.name, d.func_label); - emit_preamble(c.s, 0, 0); as_op(c.s, OP_UD2); - as_opr(c.s, OP_PUSHR, R_RAX); - emit_ret(c.s); } d = find(c, "ud2", nil, 1); if (d.func_defined && !d.func_label.fixed) { fixup_label(c.s, d.func_label); add_symbol(c.s, d.name, d.func_label); - emit_preamble(c.s, 0, 0); as_op(c.s, OP_UD2); - as_opr(c.s, OP_PUSHR, R_RAX); - emit_ret(c.s); } d = find(c, "cpuid", nil, 1); if (d.func_defined && !d.func_label.fixed) { fixup_label(c.s, d.func_label); add_symbol(c.s, d.name, d.func_label); + as_op(c.s, OP_UD2); emit_preamble(c.s, 0, 0); as_modrm(c.s, OP_LOAD, R_RDI, R_RBP, 0, 0, 16); as_modrm(c.s, OP_LOAD, R_RAX, R_RDI, 0, 0, 0); @@ -2050,6 +2036,7 @@ func emit_builtin(c: *compiler) { if (d.func_defined && !d.func_label.fixed) { fixup_label(c.s, d.func_label); add_symbol(c.s, d.name, d.func_label); + as_op(c.s, OP_UD2); emit_preamble(c.s, 0, 0); as_modrm(c.s, OP_LOAD, R_RDX, R_RBP, 0, 0, 16); as_op(c.s, OP_IN); @@ -2061,6 +2048,7 @@ func emit_builtin(c: *compiler) { if (d.func_defined && !d.func_label.fixed) { fixup_label(c.s, d.func_label); add_symbol(c.s, d.name, d.func_label); + as_op(c.s, OP_UD2); emit_preamble(c.s, 0, 0); as_modrm(c.s, OP_LOAD, R_RDX, R_RBP, 0, 0, 16); as_modrm(c.s, OP_LOAD, R_RAX, R_RBP, 0, 0, 24); @@ -2073,6 +2061,7 @@ func emit_builtin(c: *compiler) { if (d.func_defined && !d.func_label.fixed) { fixup_label(c.s, d.func_label); add_symbol(c.s, d.name, d.func_label); + as_op(c.s, OP_UD2); emit_preamble(c.s, 0, 0); as_modrm(c.s, OP_LOAD, R_RDX, R_RBP, 0, 0, 16); as_emit(c.s, OP_OS); @@ -2085,6 +2074,7 @@ func emit_builtin(c: *compiler) { if (d.func_defined && !d.func_label.fixed) { fixup_label(c.s, d.func_label); add_symbol(c.s, d.name, d.func_label); + as_op(c.s, OP_UD2); emit_preamble(c.s, 0, 0); as_modrm(c.s, OP_LOAD, R_RDX, R_RBP, 0, 0, 16); as_modrm(c.s, OP_LOAD, R_RAX, R_RBP, 0, 0, 24); @@ -2098,6 +2088,7 @@ func emit_builtin(c: *compiler) { if (d.func_defined && !d.func_label.fixed) { fixup_label(c.s, d.func_label); add_symbol(c.s, d.name, d.func_label); + as_op(c.s, OP_UD2); emit_preamble(c.s, 0, 0); as_modrm(c.s, OP_LOAD, R_RDX, R_RBP, 0, 0, 16); as_op(c.s, OP_IND); @@ -2109,6 +2100,7 @@ func emit_builtin(c: *compiler) { if (d.func_defined && !d.func_label.fixed) { fixup_label(c.s, d.func_label); add_symbol(c.s, d.name, d.func_label); + as_op(c.s, OP_UD2); emit_preamble(c.s, 0, 0); as_modrm(c.s, OP_LOAD, R_RDX, R_RBP, 0, 0, 16); as_modrm(c.s, OP_LOAD, R_RAX, R_RBP, 0, 0, 24); @@ -2121,6 +2113,7 @@ func emit_builtin(c: *compiler) { if (d.func_defined && !d.func_label.fixed) { fixup_label(c.s, d.func_label); add_symbol(c.s, d.name, d.func_label); + as_op(c.s, OP_UD2); emit_preamble(c.s, 0, 0); as_modrm(c.s, OP_LOAD, R_RCX, R_RBP, 0, 0, 16); as_op(c.s, OP_RDMSR); @@ -2135,6 +2128,7 @@ func emit_builtin(c: *compiler) { if (d.func_defined && !d.func_label.fixed) { fixup_label(c.s, d.func_label); add_symbol(c.s, d.name, d.func_label); + as_op(c.s, OP_UD2); emit_preamble(c.s, 0, 0); as_modrm(c.s, OP_LOAD, R_RAX, R_RBP, 0, 0, 24); as_modrr(c.s, OP_MOVE, R_RDX, R_RAX); @@ -2150,6 +2144,7 @@ func emit_builtin(c: *compiler) { if (d.func_defined && !d.func_label.fixed) { fixup_label(c.s, d.func_label); add_symbol(c.s, d.name, d.func_label); + as_op(c.s, OP_UD2); emit_preamble(c.s, 0, 0); as_modrr(c.s, OP_RDCRR, R_CR0, R_RAX); as_opr(c.s, OP_PUSHR, R_RAX); @@ -2160,6 +2155,7 @@ func emit_builtin(c: *compiler) { if (d.func_defined && !d.func_label.fixed) { fixup_label(c.s, d.func_label); add_symbol(c.s, d.name, d.func_label); + as_op(c.s, OP_UD2); emit_preamble(c.s, 0, 0); as_modrm(c.s, OP_LOAD, R_RCX, R_RBP, 0, 0, 16); as_modrr(c.s, OP_WRCRR, R_CR0, R_RAX); @@ -2171,6 +2167,7 @@ func emit_builtin(c: *compiler) { if (d.func_defined && !d.func_label.fixed) { fixup_label(c.s, d.func_label); add_symbol(c.s, d.name, d.func_label); + as_op(c.s, OP_UD2); emit_preamble(c.s, 0, 0); as_modrr(c.s, OP_RDCRR, R_CR2, R_RAX); as_opr(c.s, OP_PUSHR, R_RAX); @@ -2181,6 +2178,7 @@ func emit_builtin(c: *compiler) { if (d.func_defined && !d.func_label.fixed) { fixup_label(c.s, d.func_label); add_symbol(c.s, d.name, d.func_label); + as_op(c.s, OP_UD2); emit_preamble(c.s, 0, 0); as_modrm(c.s, OP_LOAD, R_RCX, R_RBP, 0, 0, 16); as_modrr(c.s, OP_WRCRR, R_CR2, R_RAX); @@ -2192,6 +2190,7 @@ func emit_builtin(c: *compiler) { if (d.func_defined && !d.func_label.fixed) { fixup_label(c.s, d.func_label); add_symbol(c.s, d.name, d.func_label); + as_op(c.s, OP_UD2); emit_preamble(c.s, 0, 0); as_modrr(c.s, OP_RDCRR, R_CR3, R_RAX); as_opr(c.s, OP_PUSHR, R_RAX); @@ -2202,6 +2201,7 @@ func emit_builtin(c: *compiler) { if (d.func_defined && !d.func_label.fixed) { fixup_label(c.s, d.func_label); add_symbol(c.s, d.name, d.func_label); + as_op(c.s, OP_UD2); emit_preamble(c.s, 0, 0); as_modrm(c.s, OP_LOAD, R_RCX, R_RBP, 0, 0, 16); as_modrr(c.s, OP_WRCRR, R_CR3, R_RAX); @@ -2213,6 +2213,7 @@ func emit_builtin(c: *compiler) { if (d.func_defined && !d.func_label.fixed) { fixup_label(c.s, d.func_label); add_symbol(c.s, d.name, d.func_label); + as_op(c.s, OP_UD2); emit_preamble(c.s, 0, 0); as_modrr(c.s, OP_RDCRR, R_CR4, R_RAX); as_opr(c.s, OP_PUSHR, R_RAX); @@ -2223,6 +2224,7 @@ func emit_builtin(c: *compiler) { if (d.func_defined && !d.func_label.fixed) { fixup_label(c.s, d.func_label); add_symbol(c.s, d.name, d.func_label); + as_op(c.s, OP_UD2); emit_preamble(c.s, 0, 0); as_modrm(c.s, OP_LOAD, R_RCX, R_RBP, 0, 0, 16); as_modrr(c.s, OP_WRCRR, R_CR4, R_RAX); @@ -2234,6 +2236,7 @@ func emit_builtin(c: *compiler) { if (d.func_defined && !d.func_label.fixed) { fixup_label(c.s, d.func_label); add_symbol(c.s, d.name, d.func_label); + as_op(c.s, OP_UD2); emit_preamble(c.s, 0, 0); as_modri(c.s, OP_SUBI, R_RSP, 16); as_modrm(c.s, OP_LOAD, R_RAX, R_RBP, 0, 0, 24); @@ -2251,6 +2254,7 @@ func emit_builtin(c: *compiler) { if (d.func_defined && !d.func_label.fixed) { fixup_label(c.s, d.func_label); add_symbol(c.s, d.name, d.func_label); + as_op(c.s, OP_UD2); emit_preamble(c.s, 0, 0); as_modri(c.s, OP_SUBI, R_RSP, 16); as_modrm(c.s, OP_LOAD, R_RAX, R_RBP, 0, 0, 24); @@ -2268,6 +2272,7 @@ func emit_builtin(c: *compiler) { if (d.func_defined && !d.func_label.fixed) { fixup_label(c.s, d.func_label); add_symbol(c.s, d.name, d.func_label); + as_op(c.s, OP_UD2); emit_preamble(c.s, 0, 0); as_modrm(c.s, OP_LOAD, R_RAX, R_RBP, 0, 0, 16); as_modr(c.s, OP_LLDTM, R_RAX); @@ -2279,6 +2284,7 @@ func emit_builtin(c: *compiler) { if (d.func_defined && !d.func_label.fixed) { fixup_label(c.s, d.func_label); add_symbol(c.s, d.name, d.func_label); + as_op(c.s, OP_UD2); emit_preamble(c.s, 0, 0); as_modrm(c.s, OP_LOAD, R_RAX, R_RBP, 0, 0, 16); as_modr(c.s, OP_LTRM, R_RAX); @@ -2290,6 +2296,7 @@ func emit_builtin(c: *compiler) { if (d.func_defined && !d.func_label.fixed) { fixup_label(c.s, d.func_label); add_symbol(c.s, d.name, d.func_label); + as_op(c.s, OP_UD2); emit_preamble(c.s, 0, 0); // es ds fs gs as_modrm(c.s, OP_LOAD, R_RAX, R_RBP, 0, 0, 24); @@ -2326,6 +2333,7 @@ func emit_builtin(c: *compiler) { if (d.func_defined && !d.func_label.fixed) { fixup_label(c.s, d.func_label); add_symbol(c.s, d.name, d.func_label); + as_op(c.s, OP_UD2); emit_preamble(c.s, 0, 0); as_op(c.s, OP_HLT); as_opr(c.s, OP_PUSHR, R_RAX); @@ -2336,6 +2344,7 @@ func emit_builtin(c: *compiler) { if (d.func_defined && !d.func_label.fixed) { fixup_label(c.s, d.func_label); add_symbol(c.s, d.name, d.func_label); + as_op(c.s, OP_UD2); emit_preamble(c.s, 0, 0); as_op(c.s, OP_CLI); as_opr(c.s, OP_PUSHR, R_RAX); @@ -2346,6 +2355,7 @@ func emit_builtin(c: *compiler) { if (d.func_defined && !d.func_label.fixed) { fixup_label(c.s, d.func_label); add_symbol(c.s, d.name, d.func_label); + as_op(c.s, OP_UD2); emit_preamble(c.s, 0, 0); as_op(c.s, OP_STI); as_opr(c.s, OP_PUSHR, R_RAX); @@ -2356,6 +2366,7 @@ func emit_builtin(c: *compiler) { if (d.func_defined && !d.func_label.fixed) { fixup_label(c.s, d.func_label); add_symbol(c.s, d.name, d.func_label); + as_op(c.s, OP_UD2); emit_preamble(c.s, 0, 0); as_op(c.s, OP_PUSHF); emit_ret(c.s); @@ -2365,6 +2376,7 @@ func emit_builtin(c: *compiler) { if (d.func_defined && !d.func_label.fixed) { fixup_label(c.s, d.func_label); add_symbol(c.s, d.name, d.func_label); + as_op(c.s, OP_UD2); emit_preamble(c.s, 0, 0); as_op(c.s, OP_PUSHF); as_modrm(c.s, OP_LOAD, R_RAX, R_RBP, 0, 0, 16); @@ -2377,6 +2389,7 @@ func emit_builtin(c: *compiler) { if (d.func_defined && !d.func_label.fixed) { fixup_label(c.s, d.func_label); add_symbol(c.s, d.name, d.func_label); + as_op(c.s, OP_UD2); emit_preamble(c.s, 0, 0); as_modrm(c.s, OP_LOAD, R_RAX, R_RBP, 0, 0, 16); as_modm(c.s, OP_WBINVD, R_RAX, 0, 0, 0); @@ -2388,6 +2401,7 @@ func emit_builtin(c: *compiler) { if (d.func_defined && !d.func_label.fixed) { fixup_label(c.s, d.func_label); add_symbol(c.s, d.name, d.func_label); + as_op(c.s, OP_UD2); emit_preamble(c.s, 0, 0); as_modrm(c.s, OP_LOAD, R_RAX, R_RBP, 0, 0, 16); as_modm(c.s, OP_INVLPGM, R_RAX, 0, 0, 0); @@ -2399,6 +2413,7 @@ func emit_builtin(c: *compiler) { if (d.func_defined && !d.func_label.fixed) { fixup_label(c.s, d.func_label); add_symbol(c.s, d.name, d.func_label); + as_op(c.s, OP_UD2); emit_ssr(c); } @@ -2406,6 +2421,7 @@ func emit_builtin(c: *compiler) { if (d.func_defined && !d.func_label.fixed) { fixup_label(c.s, d.func_label); add_symbol(c.s, d.name, d.func_label); + as_op(c.s, OP_UD2); emit_isr(c); } @@ -2413,6 +2429,7 @@ func emit_builtin(c: *compiler) { if (d.func_defined && !d.func_label.fixed) { fixup_label(c.s, d.func_label); add_symbol(c.s, d.name, d.func_label); + as_op(c.s, OP_UD2); emit_preamble(c.s, 0, 0); as_modrm(c.s, OP_LOAD, R_RSI, R_RBP, 0, 0, 16); as_emit(c.s, OP_GS); @@ -2425,6 +2442,7 @@ func emit_builtin(c: *compiler) { if (d.func_defined && !d.func_label.fixed) { fixup_label(c.s, d.func_label); add_symbol(c.s, d.name, d.func_label); + as_op(c.s, OP_UD2); emit_preamble(c.s, 0, 0); as_modrm(c.s, OP_LOAD, R_RSI, R_RBP, 0, 0, 16); c.s.bits32 = 1; @@ -2438,6 +2456,7 @@ func emit_builtin(c: *compiler) { if (d.func_defined && !d.func_label.fixed) { fixup_label(c.s, d.func_label); add_symbol(c.s, d.name, d.func_label); + as_op(c.s, OP_UD2); emit_preamble(c.s, 0, 0); as_modrm(c.s, OP_LOAD, R_RDI, R_RBP, 0, 0, 16); as_modrm(c.s, OP_LOAD, R_RAX, R_RBP, 0, 0, 24); @@ -2452,6 +2471,7 @@ func emit_builtin(c: *compiler) { if (d.func_defined && !d.func_label.fixed) { fixup_label(c.s, d.func_label); add_symbol(c.s, d.name, d.func_label); + as_op(c.s, OP_UD2); emit_preamble(c.s, 0, 0); as_modrm(c.s, OP_LOAD, R_RSI, R_RBP, 0, 0, 16); as_modrr(c.s, OP_XORRM, R_RAX, R_RAX); @@ -2466,6 +2486,7 @@ func emit_builtin(c: *compiler) { if (d.func_defined && !d.func_label.fixed) { fixup_label(c.s, d.func_label); add_symbol(c.s, d.name, d.func_label); + as_op(c.s, OP_UD2); emit_preamble(c.s, 0, 0); as_modrm(c.s, OP_LOAD, R_RDI, R_RBP, 0, 0, 16); as_modrm(c.s, OP_LOAD, R_RAX, R_RBP, 0, 0, 24); @@ -2480,9 +2501,7 @@ func emit_builtin(c: *compiler) { if (d.func_defined && !d.func_label.fixed) { fixup_label(c.s, d.func_label); add_symbol(c.s, d.name, d.func_label); - emit_preamble(c.s, 0, 0); as_modr(c.s, OP_RDRAND, R_RAX); - as_opr(c.s, OP_PUSHR, R_RAX); emit_ret(c.s); } @@ -2490,6 +2509,7 @@ func emit_builtin(c: *compiler) { if (d.func_defined && !d.func_label.fixed) { fixup_label(c.s, d.func_label); add_symbol(c.s, d.name, d.func_label); + as_op(c.s, OP_UD2); as_opr(c.s, OP_PUSHR, R_RBP); as_op(c.s, OP_PUSHF); diff --git a/cpio.om b/cpio.om @@ -183,7 +183,7 @@ func fputh32(f: *file, x: int) { if x > (-1 >> 32) { fflush(f); - die("too large"); + die("cpio: too large"); } i = 32; diff --git a/decl.om b/decl.om @@ -14,6 +14,7 @@ struct decl { func_decl: *node; func_used: int; func_preamble: int; + func_ir: *irfunc; struct_defined: int; struct_size: int; diff --git a/ir.om b/ir.om @@ -67,6 +67,7 @@ struct irblock { done: int; out: *irblock; alt: *irblock; + label: *label; mark: int; } @@ -89,11 +90,13 @@ struct irvar { right: *irvar; t: *type; n: int; + offset: int; mark: int; } struct irfunc { c: *compiler; + s: *assembler; a: *alloc; name: *byte; loopctx: *irloopctx; @@ -135,6 +138,7 @@ func mkirblock(ic: *irfunc): *irblock { b = alloc(ic.a, sizeof(*b)) as *irblock; + b.label = mklabel(ic.s); b.ops = nil; b.ops_len = 0; b.ops_cap = 0; @@ -491,11 +495,12 @@ func expr_to_ir(ic: *irfunc, n: *node): *irop { // function if v && v.func_defined { - mkirfunc(ic, n.s); + o = mkirfunc(ic, n.s); return o; } cdie(ic.c, "no such symbol"); + return nil; } else if kind == N_DOT { if n.a.t.kind == TY_PTR { b = expr_to_ir(ic, n.a); @@ -522,7 +527,11 @@ func expr_to_ir(ic: *irfunc, n: *node): *irop { } else if kind == N_INDEX { a = expr_to_ir(ic, n.a); b = expr_to_ir(ic, n.b); - size = type_sizeof(ic.c, n.t); + if n.t.kind == TY_BYTE { + size = 1; + } else { + size = type_sizeof(ic.c, n.t); + } c = mkirconst(ic, size); d = mkirop(ic, IOP_MUL, b, c); e = mkirop(ic, IOP_ADD, a, d); @@ -544,11 +553,11 @@ func expr_to_ir(ic: *irfunc, n: *node): *irop { return o; } else if kind == N_NEG { a = expr_to_ir(ic, n.a); - o = mkirop(ic, IOP_NEG, a, b); + o = mkirop(ic, IOP_NEG, a, nil); return o; } else if kind == N_NOT { a = expr_to_ir(ic, n.a); - o = mkirop(ic, IOP_NOT, a, b); + o = mkirop(ic, IOP_NOT, a, nil); return o; } else if kind == N_BNOT { bool_body = mkirblock(ic); @@ -559,19 +568,21 @@ func expr_to_ir(ic: *irfunc, n: *node): *irop { a = expr_to_ir(ic, n.a); irbranch(ic, a, bool_next, bool_body); - a = mkirconst(ic, 0); - o = mkirop(ic, IOP_STORE, e, a); + a = mkirop(ic, IOP_REF, e, nil); + b = mkirconst(ic, 0); + o = mkirop(ic, IOP_STORE, a, b); + o.t = n.t; iraddop(ic, o); irjump(ic, bool_out, bool_next); - a = mkirconst(ic, 1); - o = mkirop(ic, IOP_STORE, e, a); + a = mkirop(ic, IOP_REF, e, nil); + b = mkirconst(ic, 1); + o = mkirop(ic, IOP_STORE, a, b); + o.t = n.t; iraddop(ic, o); irjump(ic, bool_out, bool_out); - o = mkirop(ic, IOP_LOAD, e, nil); - o.t = n.t; - return o; + return e; } else if kind == N_BOR { bool_body = mkirblock(ic); bool_next = mkirblock(ic); @@ -582,8 +593,10 @@ func expr_to_ir(ic: *irfunc, n: *node): *irop { a = expr_to_ir(ic, n.a); irbranch(ic, a, bool_next, bool_body); - a = mkirconst(ic, 1); - o = mkirop(ic, IOP_STORE, e, a); + a = mkirop(ic, IOP_REF, e, nil); + b = mkirconst(ic, 1); + o = mkirop(ic, IOP_STORE, a, b); + o.t = n.t; iraddop(ic, o); irjump(ic, bool_out, bool_next); @@ -592,19 +605,21 @@ func expr_to_ir(ic: *irfunc, n: *node): *irop { a = expr_to_ir(ic, n.b); irbranch(ic, a, bool_next, bool_final); - a = mkirconst(ic, 1); - o = mkirop(ic, IOP_STORE, e, a); + a = mkirop(ic, IOP_REF, e, nil); + b = mkirconst(ic, 1); + o = mkirop(ic, IOP_STORE, a, b); + o.t = n.t; iraddop(ic, o); irjump(ic, bool_out, bool_next); - a = mkirconst(ic, 0); - o = mkirop(ic, IOP_STORE, e, a); + a = mkirop(ic, IOP_REF, e, nil); + b = mkirconst(ic, 0); + o = mkirop(ic, IOP_STORE, a, b); + o.t = n.t; iraddop(ic, o); irjump(ic, bool_out, bool_out); - o = mkirop(ic, IOP_LOAD, e, nil); - o.t = n.t; - return o; + return e; } else if kind == N_BAND { bool_body = mkirblock(ic); bool_next = mkirblock(ic); @@ -618,19 +633,21 @@ func expr_to_ir(ic: *irfunc, n: *node): *irop { a = expr_to_ir(ic, n.b); irbranch(ic, a, bool_next, bool_final); - a = mkirconst(ic, 1); - o = mkirop(ic, IOP_STORE, e, a); + a = mkirop(ic, IOP_REF, e, nil); + b = mkirconst(ic, 1); + o = mkirop(ic, IOP_STORE, a, b); + o.t = n.t; iraddop(ic, o); irjump(ic, bool_out, bool_next); - a = mkirconst(ic, 0); - o = mkirop(ic, IOP_STORE, e, a); + a = mkirop(ic, IOP_REF, e, nil); + b = mkirconst(ic, 0); + o = mkirop(ic, IOP_STORE, a, b); + o.t = n.t; iraddop(ic, o); irjump(ic, bool_out, bool_out); - o = mkirop(ic, IOP_LOAD, e, nil); - o.t = n.t; - return o; + return e; } else if kind == N_LT { a = expr_to_ir(ic, n.a); b = expr_to_ir(ic, n.b); @@ -713,6 +730,7 @@ func expr_to_ir(ic: *irfunc, n: *node): *irop { return o; } else { cdie(ic.c, "unknown expression"); + return nil; } } @@ -1092,6 +1110,7 @@ func func_to_ir(c: *compiler, n: *node): *irfunc { ic.c = c; ic.a = c.a; + ic.s = c.s; mkirblock(ic); @@ -1355,6 +1374,554 @@ func irshow(out: *file, b: *irblock) { irreset(b); } +func output_ir(c: *compiler, d: *decl) { + var ic: *irfunc; + + ic = d.func_ir; + + ic.c.filename = d.func_def.filename; + ic.c.lineno = d.func_def.lineno; + ic.c.colno = d.func_def.colno; + ic.s.filename = d.func_def.filename; + ic.s.lineno = d.func_def.lineno; + + fixup_label(c.s, d.func_label); + add_symbol(c.s, d.name, d.func_label); + + if strcmp(d.name, "_start") == 0 { + emit_preamble(c.s, 0, 1); + } else if strcmp(d.name, "_kstart") == 0 { + emit_preamble(c.s, 0, 2); + } + + //fputc(nil, '\n'); + //fputs(nil, d.name); + //irshow(nil, ic.blocks[0]); + + // Setup the frame + as_opr(ic.s, OP_PUSHR, R_RBP); + as_modrr(ic.s, OP_MOVE, R_RBP, R_RSP); + + // Allocate local variables + output_irvars(ic); + + // Output all blocks + output_irblock(ic, ic.blocks[0]); + + // Clear the marks + irreset(ic.blocks[0]); +} + +func output_irvars(ic: *irfunc) { + var offset: int; + var size: int; + var i: int; + var v: *irvar; + + // Allocate local variables + offset = 0; + i = 0; + loop { + if i == ic.vars_len { + break; + } + + v = ic.vars[i]; + + if v.t && v.t.kind != TY_VOID { + size = type_sizeof(ic.c, v.t); + } else { + size = sizeof(i); + } + + size = (size + 7) & -8; + + offset = offset + size; + + v.offset = -offset; + + i = i + 1; + } + + // Zero initialize local variables + if offset != 0 { + as_modri(ic.s, OP_SUBI, R_RSP, offset); + + as_modrr(ic.s, OP_XORRM, R_RAX, R_RAX); + + i = 0; + loop { + if i == offset { + break; + } + + i = i + 8; + + as_modrm(ic.s, OP_STORE, R_RAX, R_RBP, 0, 0, -i); + } + } + + // Save parameters + i = 0; + loop { + if i == ic.arg_count { + break; + } + + v = ic.vars[i]; + + if i == 0 { + as_modrm(ic.s, OP_STORE, R_RDI, R_RBP, 0, 0, v.offset); + } else if i == 1 { + as_modrm(ic.s, OP_STORE, R_RSI, R_RBP, 0, 0, v.offset); + } else if i == 2 { + as_modrm(ic.s, OP_STORE, R_RDX, R_RBP, 0, 0, v.offset); + } else if i == 3 { + as_modrm(ic.s, OP_STORE, R_RCX, R_RBP, 0, 0, v.offset); + } else if i == 4 { + as_modrm(ic.s, OP_STORE, R_R8, R_RBP, 0, 0, v.offset); + } else if i == 5 { + as_modrm(ic.s, OP_STORE, R_R9, R_RBP, 0, 0, v.offset); + } else { + // Stack argument + as_modrm(ic.s, OP_LOAD, R_RAX, R_RBP, 0, 0, (i - 6 + 2) * sizeof(i)); + as_modrm(ic.s, OP_STORE, R_RAX, R_RBP, 0, 0, v.offset); + } + + i = i + 1; + } +} + +func output_irblock(ic: *irfunc, b: *irblock) { + var op: *irop; + var i: int; + + b.mark = 1; + + if !b.done { + cdie(ic.c, "no return in function"); + } + + fixup_label(ic.s, b.label); + + i = 0; + loop { + if i == b.ops_len { + break; + } + + op = b.ops[i]; + + output_irstmt(ic, b, op); + + i = i + 1; + } +} + +func output_irstmt(ic: *irfunc, b: *irblock, o: *irop) { + var kind: int; + + ic.c.filename = o.filename; + ic.c.lineno = o.lineno; + ic.c.colno = o.colno; + ic.s.filename = o.filename; + ic.s.lineno = o.lineno; + + kind = o.kind; + if kind == IOP_STORE { + // Evaluate the address + output_irexpr(ic, b, o.a); + as_opr(ic.s, OP_PUSHR, R_RAX); + + // Evaluate the value + output_irexpr(ic, b, o.b); + + as_opr(ic.s, OP_POPR, R_RDI); + + // Execute the store + if o.t.kind == TY_BYTE { + as_modrm(ic.s, OP_STOREB, R_RAX, R_RDI, 0, 0, 0); + } else if type_isprim(o.t) { + as_modrm(ic.s, OP_STORE, R_RAX, R_RDI, 0, 0, 0); + } else { + cdie(ic.c, "invalid store"); + } + } else if kind == IOP_RETVAL { + // Do nothing + } else if kind == IOP_ARG { + // Do nothing + } else if kind == IOP_CALL { + // Allocate some space for the arguments + if o.n > 6 { + as_modri(ic.s, OP_SUBI, R_RSP, (o.n - 6) * sizeof(kind)); + } + + // Setup arguments + output_irargs(ic, b, o); + + // Call the function + output_irexpr(ic, b, o.a); + as_modr(ic.s, OP_ICALLM, R_RAX); + + // Release space reserved for the arguments + if o.n > 6 { + as_modri(ic.s, OP_ADDI, R_RSP, (o.n - 6) * sizeof(kind)); + } + + // Save the return value + output_irretval(ic, b, o); + + if b.out.mark { + as_jmp(ic.s, OP_JMP, b.out.label); + } else { + output_irblock(ic, b.out); + } + return; + } else if kind == IOP_JUMP { + if b.out.mark { + // Jump to an already output block + as_jmp(ic.s, OP_JMP, b.out.label); + } else { + // Output a new block + output_irblock(ic, b.out); + } + return; + } else if kind == IOP_BRANCH { + // Evaluate the condition and branch if zero + output_irexpr(ic, b, o.a); + as_modrr(ic.s, OP_TESTRM, R_RAX, R_RAX); + as_jmp(ic.s, OP_JCC + CC_E, b.alt.label); + + // Then jump to the output + if b.out.mark { + as_jmp(ic.s, OP_JCC + CC_NE, b.out.label); + } else { + output_irblock(ic, b.out); + } + + // And if we haven't already, output the alt branch + if !b.alt.mark { + output_irblock(ic, b.alt); + } + + return; + } else if kind == IOP_RETURN { + // Evaluate the return expression and return + if o.a { + output_irexpr(ic, b, o.a); + } + + as_modrr(ic.s, OP_MOVE, R_RSP, R_RBP); + as_opr(ic.s, OP_POPR, R_RBP); + as_op(ic.s, OP_RET); + } else { + // Evaluate and discard the result + output_irexpr(ic, b, o); + } +} + +func output_irargs(ic: *irfunc, b: *irblock, o: *irop) { + var i: int; + var op: *irop; + + i = 0; + loop { + if i == b.ops_len { + return; + } + + op = b.ops[i]; + if op.kind == IOP_ARG { + // Compute the value + output_irexpr(ic, b, op.a); + + if op.n == 0 { + as_modrr(ic.s, OP_MOVE, R_RDI, R_RAX); + } else if op.n == 1 { + as_modrr(ic.s, OP_MOVE, R_RSI, R_RAX); + } else if op.n == 2 { + as_modrr(ic.s, OP_MOVE, R_RDX, R_RAX); + } else if op.n == 3 { + as_modrr(ic.s, OP_MOVE, R_RCX, R_RAX); + } else if op.n == 4 { + as_modrr(ic.s, OP_MOVE, R_R8, R_RAX); + } else if op.n == 5 { + as_modrr(ic.s, OP_MOVE, R_R9, R_RAX); + } else { + // Stack argument + as_modrm(ic.s, OP_STORE, R_RAX, R_RSP, 0, 0, (op.n - 6) * sizeof(i)); + } + } + + i = i + 1; + } +} + +func output_irretval(ic: *irfunc, b: *irblock, o: *irop) { + var i: int; + var op: *irop; + + // Find the retval place + op = nil; + i = 0; + loop { + if i == b.ops_len { + return; + } + + op = b.ops[i]; + if op.kind == IOP_RETVAL { + break; + } + + i = i + 1; + } + + // Do nothing if there was no return value + if op.t.kind == TY_VOID { + return; + } + + // Save the value + as_modrr(ic.s, OP_MOVE, R_RDI, R_RAX); + + // Compute the address + output_irexpr(ic, b, op.a); + + // Execute the store + if op.t.kind == TY_BYTE { + as_modrm(ic.s, OP_STOREB, R_RDI, R_RAX, 0, 0, 0); + } else if type_isprim(op.t) { + as_modrm(ic.s, OP_STORE, R_RDI, R_RAX, 0, 0, 0); + } else { + cdie(ic.c, "invalid store"); + } +} + +func output_irstr(ic: *irfunc, b: *irblock, o: *irop) { + var s: *label; + var out: *label; + var i: int; + + s = mklabel(ic.s); + out = mklabel(ic.s); + + as_jmp(ic.s, OP_JMP, out); + + fixup_label(ic.s, s); + + i = 0; + loop { + if i == o.slen { + break; + } + + as_emit(ic.s, o.s[i] as int); + + i = i + 1; + } + as_emit(ic.s, 0); + + as_op(ic.s, OP_NOP); + as_op(ic.s, OP_NOP); + as_op(ic.s, OP_NOP); + as_op(ic.s, OP_NOP); + as_op(ic.s, OP_NOP); + as_op(ic.s, OP_NOP); + as_op(ic.s, OP_NOP); + as_op(ic.s, OP_NOP); + + fixup_label(ic.s, out); + + reserve(ic.s, 16); + as_modrm(ic.s, OP_LEA, R_RAX, R_RIP, 0, 0, 128); + addfixup(ic.s, s); +} + +func output_irfuncptr(ic: *irfunc, b: *irblock, o: *irop) { + var d: *decl; + + d = find(ic.c, o.s, nil, 0); + + if !d || !d.func_defined { + cdie(ic.c, "no such function"); + } + + reserve(ic.s, 16); + as_modrm(ic.s, OP_LEA, R_RAX, R_RIP, 0, 0, 128); + addfixup(ic.s, d.func_label); +} + +func output_irexpr(ic: *irfunc, b: *irblock, o: *irop) { + var kind: int; + + if !o { + cdie(ic.c, "no expr"); + } + + kind = o.kind; + if kind == IOP_VAR { + as_modrm(ic.s, OP_LOAD, R_RAX, R_RBP, 0, 0, ic.vars[o.n].offset); + } 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); + } else if kind == IOP_STR { + output_irstr(ic, b, o); + } else if kind == IOP_LOAD { + output_irexpr(ic, b, o.a); + if o.t.kind == TY_BYTE { + as_modrr(ic.s, OP_MOVE, R_RSI, R_RAX); + as_modrr(ic.s, OP_XORRM, R_RAX, R_RAX); + as_modrm(ic.s, OP_LOADB, R_RAX, R_RSI, 0, 0, 0); + } else if type_isprim(o.t) { + as_modrm(ic.s, OP_LOAD, R_RAX, R_RAX, 0, 0, 0); + } else { + cdie(ic.c, "invalid load"); + } + } else if kind == IOP_REF { + kind = o.a.kind; + if kind == IOP_LOAD { + output_irexpr(ic, b, o.a.a); + } else if kind == IOP_VAR { + as_modrm(ic.s, OP_LEA, R_RAX, R_RBP, 0, 0, ic.vars[o.a.n].offset); + } else { + cdie(ic.c, "invalid ref"); + } + } else if kind == IOP_NEG { + output_irexpr(ic, b, o.a); + as_modr(ic.s, OP_NEGM, R_RAX); + } else if kind == IOP_NOT { + output_irexpr(ic, b, o.a); + as_modr(ic.s, OP_NOTM, R_RAX); + } else if kind == IOP_ADD { + output_irexpr(ic, b, o.b); + as_opr(ic.s, OP_PUSHR, R_RAX); + output_irexpr(ic, b, o.a); + as_opr(ic.s, OP_POPR, R_RCX); + as_modrr(ic.s, OP_ADDRM, R_RAX, R_RCX); + } else if kind == IOP_AND { + output_irexpr(ic, b, o.b); + as_opr(ic.s, OP_PUSHR, R_RAX); + output_irexpr(ic, b, o.a); + as_opr(ic.s, OP_POPR, R_RCX); + as_modrr(ic.s, OP_ANDRM, R_RAX, R_RCX); + } else if kind == IOP_OR { + output_irexpr(ic, b, o.b); + as_opr(ic.s, OP_PUSHR, R_RAX); + output_irexpr(ic, b, o.a); + as_opr(ic.s, OP_POPR, R_RCX); + as_modrr(ic.s, OP_ORRM, R_RAX, R_RCX); + } else if kind == IOP_XOR { + output_irexpr(ic, b, o.b); + as_opr(ic.s, OP_PUSHR, R_RAX); + output_irexpr(ic, b, o.a); + as_opr(ic.s, OP_POPR, R_RCX); + as_modrr(ic.s, OP_XORRM, R_RAX, R_RCX); + } else if kind == IOP_DIV { + output_irexpr(ic, b, o.b); + as_opr(ic.s, OP_PUSHR, R_RAX); + output_irexpr(ic, b, o.a); + as_opr(ic.s, OP_POPR, R_RCX); + as_modrr(ic.s, OP_XORRM, R_RDX, R_RDX); + as_modrr(ic.s, OP_TESTRM, R_RAX, R_RAX); + as_modrr(ic.s, OP_SETCC + CC_S, 0, R_RDX); + as_modr(ic.s, OP_NEGM, R_RDX); + as_modr(ic.s, OP_IDIVM, R_RCX); + } else if kind == IOP_MOD { + output_irexpr(ic, b, o.b); + as_opr(ic.s, OP_PUSHR, R_RAX); + output_irexpr(ic, b, o.a); + as_opr(ic.s, OP_POPR, R_RCX); + as_modrr(ic.s, OP_XORRM, R_RDX, R_RDX); + as_modrr(ic.s, OP_TESTRM, R_RAX, R_RAX); + as_modrr(ic.s, OP_SETCC + CC_S, 0, R_RDX); + as_modr(ic.s, OP_NEGM, R_RDX); + as_modr(ic.s, OP_IDIVM, R_RCX); + as_modrr(ic.s, OP_MOVE, R_RAX, R_RDX); + } else if kind == IOP_LSH { + output_irexpr(ic, b, o.b); + as_opr(ic.s, OP_PUSHR, R_RAX); + output_irexpr(ic, b, o.a); + as_opr(ic.s, OP_POPR, R_RCX); + as_modr(ic.s, OP_SHLM, R_RAX); + } else if kind == IOP_RSH { + output_irexpr(ic, b, o.b); + as_opr(ic.s, OP_PUSHR, R_RAX); + output_irexpr(ic, b, o.a); + as_opr(ic.s, OP_POPR, R_RCX); + as_modr(ic.s, OP_SHRM, R_RAX); + } else if kind == IOP_MUL { + output_irexpr(ic, b, o.b); + as_opr(ic.s, OP_PUSHR, R_RAX); + output_irexpr(ic, b, o.a); + as_opr(ic.s, OP_POPR, R_RCX); + as_modr(ic.s, OP_IMULM, R_RCX); + } else if kind == IOP_SUB { + output_irexpr(ic, b, o.b); + as_opr(ic.s, OP_PUSHR, R_RAX); + output_irexpr(ic, b, o.a); + as_opr(ic.s, OP_POPR, R_RCX); + as_modrr(ic.s, OP_SUBRM, R_RAX, R_RCX); + } else if kind == IOP_EQ { + output_irexpr(ic, b, o.b); + as_opr(ic.s, OP_PUSHR, R_RAX); + output_irexpr(ic, b, o.a); + as_opr(ic.s, OP_POPR, R_RCX); + as_modrr(ic.s, OP_MOVE, R_RDX, R_RAX); + as_modrr(ic.s, OP_XORRM, R_RAX, R_RAX); + as_modrr(ic.s, OP_CMPRM, R_RDX, R_RCX); + as_modrr(ic.s, OP_SETCC + CC_E, 0, R_RAX); + } else if kind == IOP_NE { + output_irexpr(ic, b, o.b); + as_opr(ic.s, OP_PUSHR, R_RAX); + output_irexpr(ic, b, o.a); + as_opr(ic.s, OP_POPR, R_RCX); + as_modrr(ic.s, OP_MOVE, R_RDX, R_RAX); + as_modrr(ic.s, OP_XORRM, R_RAX, R_RAX); + as_modrr(ic.s, OP_CMPRM, R_RDX, R_RCX); + as_modrr(ic.s, OP_SETCC + CC_NE, 0, R_RAX); + } else if kind == IOP_GT { + output_irexpr(ic, b, o.b); + as_opr(ic.s, OP_PUSHR, R_RAX); + output_irexpr(ic, b, o.a); + as_opr(ic.s, OP_POPR, R_RCX); + as_modrr(ic.s, OP_MOVE, R_RDX, R_RAX); + as_modrr(ic.s, OP_XORRM, R_RAX, R_RAX); + as_modrr(ic.s, OP_CMPRM, R_RDX, R_RCX); + as_modrr(ic.s, OP_SETCC + CC_G, 0, R_RAX); + } else if kind == IOP_GE { + output_irexpr(ic, b, o.b); + as_opr(ic.s, OP_PUSHR, R_RAX); + output_irexpr(ic, b, o.a); + as_opr(ic.s, OP_POPR, R_RCX); + as_modrr(ic.s, OP_MOVE, R_RDX, R_RAX); + as_modrr(ic.s, OP_XORRM, R_RAX, R_RAX); + as_modrr(ic.s, OP_CMPRM, R_RDX, R_RCX); + as_modrr(ic.s, OP_SETCC + CC_GE, 0, R_RAX); + } else if kind == IOP_LT { + output_irexpr(ic, b, o.b); + as_opr(ic.s, OP_PUSHR, R_RAX); + output_irexpr(ic, b, o.a); + as_opr(ic.s, OP_POPR, R_RCX); + as_modrr(ic.s, OP_MOVE, R_RDX, R_RAX); + as_modrr(ic.s, OP_XORRM, R_RAX, R_RAX); + as_modrr(ic.s, OP_CMPRM, R_RDX, R_RCX); + as_modrr(ic.s, OP_SETCC + CC_L, 0, R_RAX); + } else if kind == IOP_LE { + output_irexpr(ic, b, o.b); + as_opr(ic.s, OP_PUSHR, R_RAX); + output_irexpr(ic, b, o.a); + as_opr(ic.s, OP_POPR, R_RCX); + as_modrr(ic.s, OP_MOVE, R_RDX, R_RAX); + as_modrr(ic.s, OP_XORRM, R_RAX, R_RAX); + as_modrr(ic.s, OP_CMPRM, R_RDX, R_RCX); + as_modrr(ic.s, OP_SETCC + CC_LE, 0, R_RAX); + } else { + cdie(ic.c, "invalid op"); + } +} + // line numbers // evaluator // instruction selection diff --git a/kernel.om b/kernel.om @@ -326,6 +326,7 @@ func vtop(v: *byte): int { } kdie("BAD VA"); + return 0; } func acpi_len(p: int): int { @@ -1016,6 +1017,7 @@ func alloc_page(): int { } kdie("OOM"); + return 0; } func direct_map(brk: *int) { diff --git a/lib.om b/lib.om @@ -69,6 +69,7 @@ func fdgetc(fd: int): int { return -1; } else { exit(3); + return 0; } } diff --git a/parse2.om b/parse2.om @@ -231,6 +231,7 @@ func reconstruct_type(c: *parser, pn: *peg_node): *node { return reconstruct_type(c, pn); } else { die("reconstruct_type: invalid type"); + return nil; } } @@ -642,6 +643,7 @@ func reconstruct_primary(c: *parser, pn: *peg_node): *node { return reconstruct_expr(c, pn); } else { die("invalid primary"); + return nil; } } @@ -770,6 +772,7 @@ func reconstruct_stmt(c: *parser, pn: *peg_node): *node { return reconstruct_compound(c, pn); } else { die("invalid stmt"); + return nil; } } diff --git a/peg.om b/peg.om @@ -149,6 +149,7 @@ func parse_escape(s: *byte, i: *int, n: int): int { return nc; } else { die("invalid escape"); + return 0; } } @@ -415,6 +416,7 @@ func translate(c: *peg_compiler, n: *peg_node) { v = v.next; } fputs(c.out, " die(\"invalid tag\");\n"); + fputs(c.out, " return nil;\n"); fputs(c.out, "}\n"); // Generate parsing functions for each rule diff --git a/sshd.om b/sshd.om @@ -1933,7 +1933,7 @@ func _restorer(); func signal(sig: int, handler: func()) { var act: sigaction; - act.handler = (&dosigchld) as int; + act.handler = dosigchld as int; act.flags = 1 << 26; act.restorer = _restorer as int; act.mask = 0; diff --git a/type.om b/type.om @@ -21,7 +21,9 @@ func type_sizeof(c: *compiler, t: *type): int { var kind: int; kind = t.kind; - if (kind == TY_INT) { + if (kind == TY_NIL) { + return 8; + } else if (kind == TY_INT) { return 8; } else if (kind == TY_BYTE) { return 8; @@ -37,6 +39,7 @@ func type_sizeof(c: *compiler, t: *type): int { return t.st.struct_size; } else { cdie(c, "sizeof: invalid type"); + return 0; } } @@ -203,5 +206,6 @@ func prototype(c: *compiler, n: *node): *type { return mktype1(c, TY_PTR, prototype(c, n.a)); } else { cdie(c, "prototype: invalid type"); + return nil; } }