commit 98221f3153817e479d4baf6deea9e07d5f5ebd9e
parent 8710ea8e8670aecc85bb03dc078e14f7f02afff8
Author: erai <erai@omiltem.net>
Date: Fri, 31 Jan 2025 02:36:18 +0000
use ir to generate code
Diffstat:
M | as.om | | | 19 | +++++-------------- |
M | cc0.c | | | 1956 | ++++++++++++++++++++++--------------------------------------------------------- |
M | cc1.om | | | 108 | +++++++++++++++++++++++++++++++++++++++++++++++-------------------------------- |
M | cpio.om | | | 2 | +- |
M | decl.om | | | 1 | + |
M | ir.om | | | 621 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---- |
M | kernel.om | | | 2 | ++ |
M | lib.om | | | 1 | + |
M | parse2.om | | | 3 | +++ |
M | peg.om | | | 2 | ++ |
M | sshd.om | | | 2 | +- |
M | type.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;
}
}