F diff --git a/src/backend/asm/intel/intel_compile.c b/src/backend/asm/intel/intel_compile.c --- a/src/backend/asm/intel/intel_compile.c +++ b/src/backend/asm/intel/intel_compile.c{push_intel_asm_instruction(compile_data,get_intel_asm_simple_instruction(INTEL_ASM_OP_NOP));}- void compile_logical_or_to_intel_asm(struct Compile_Data_Intel_Asm *compile_data)+ void compile_logical_or_to_intel_asm(struct Compile_Data_Intel_Asm *compile_data,struct AST_Binary_Expression *bin){- push_intel_asm_instruction(compile_data,get_intel_asm_simple_instruction(INTEL_ASM_OP_NOP));+ compile_logical_and_or_inner(compile_data,bin,INTEL_ASM_OP_JZ);}void compile_logical_and_to_intel_asm(struct Compile_Data_Intel_Asm *compile_data,struct AST_Binary_Expression *bin){- push_intel_asm_instruction(compile_data,get_intel_asm_simple_instruction(INTEL_ASM_OP_NOP));+ compile_logical_and_or_inner(compile_data,bin,INTEL_ASM_OP_JNZ);}- void compile_logical_not_to_intel_asm(struct Compile_Data_Intel_Asm *compile_data,struct AST_Binary_Expression *bin)+ void compile_logical_not_to_intel_asm(struct Compile_Data_Intel_Asm *compile_data,struct AST_Unary_Expression *unary){- push_intel_asm_instruction(compile_data,get_intel_asm_simple_instruction(INTEL_ASM_OP_NOP));+ enum Intel_Asm_Registers reg;+ compile_ast_to_intel_asm(compile_data,(struct AST*)unary->operand);++ reg=rvalue_to_ax(compile_data,unary->operand->value);++ push_intel_asm_instruction(compile_data,get_intel_asm_binary_instruction(get_intel_asm_register(reg),get_intel_asm_register(reg),INTEL_ASM_OP_TEST));+ push_intel_asm_instruction(compile_data,get_intel_asm_unary_instruction(INTEL_ASM_REGISTER_RAX,INTEL_ASM_OP_SETNE));++ push_intel_asm_instruction(compile_data,intel_asm_get_push(INTEL_ASM_REGISTER_RAX));}- void compile_bitwise_or_to_intel_asm(struct Compile_Data_Intel_Asm *compile_data,struct AST_Unary_Expression *unary)+ void compile_bitwise_or_to_intel_asm(struct Compile_Data_Intel_Asm *compile_data,struct AST_Binary_Expression *bin){- push_intel_asm_instruction(compile_data,get_intel_asm_simple_instruction(INTEL_ASM_OP_NOP));+ compile_simple_bin_inner(compile_data,bin,INTEL_ASM_OP_OR);}void compile_bitwise_and_to_intel_asm(struct Compile_Data_Intel_Asm *compile_data,struct AST_Binary_Expression *bin){- push_intel_asm_instruction(compile_data,get_intel_asm_simple_instruction(INTEL_ASM_OP_NOP));+ compile_simple_bin_inner(compile_data,bin,INTEL_ASM_OP_AND);}void compile_bitwise_xor_to_intel_asm(struct Compile_Data_Intel_Asm *compile_data,struct AST_Binary_Expression *bin){- push_intel_asm_instruction(compile_data,get_intel_asm_simple_instruction(INTEL_ASM_OP_NOP));+ compile_simple_bin_inner(compile_data,bin,INTEL_ASM_OP_XOR);}void compile_bitwise_not_to_intel_asm(struct Compile_Data_Intel_Asm *compile_data,struct AST_Unary_Expression *unary){- push_intel_asm_instruction(compile_data,get_intel_asm_simple_instruction(INTEL_ASM_OP_NOP));+ enum Intel_Asm_Registers reg;+ compile_ast_to_intel_asm(compile_data,(struct AST*)unary->operand);+ reg=rvalue_to_ax(compile_data,unary->operand->value);+ push_intel_asm_instruction(compile_data,get_intel_asm_unary_instruction(get_intel_asm_register(reg),INTEL_ASM_OP_NOT));+ push_intel_asm_instruction(compile_data,intel_asm_get_push(INTEL_ASM_REGISTER_RAX));+}void compile_get_address_to_intel_asm(struct Compile_Data_Intel_Asm *compile_data,struct AST_Unary_Expression *unary){push_intel_asm_instruction(compile_data,get_intel_asm_unary_instruction(get_intel_asm_register(dx),op));push_intel_asm_instruction(compile_data,intel_asm_get_push(INTEL_ASM_REGISTER_RAX));}+ void compile_logical_and_or_inner(struct Compile_Data_Intel_Asm *compile_data,struct AST_Binary_Expression *bin,enum Intel_Asm_Instruction_Type cmp)+ {+ struct Intel_Asm_Label *first_is_true;+ struct Intel_Asm_Label *end;+ enum Intel_Asm_Registers reg;++ end=(struct Intel_Asm_Label*)get_intel_asm_new_unique_label(compile_data);+ first_is_true=(struct Intel_Asm_Label*)get_intel_asm_new_unique_label(compile_data);++ compile_ast_to_intel_asm(compile_data,(struct AST*)bin->left);++ reg=rvalue_to_ax(compile_data,bin->left->value);++ push_intel_asm_instruction(compile_data,get_intel_asm_binary_instruction(+ get_intel_asm_register(reg),+ get_intel_asm_register(reg),+ INTEL_ASM_OP_TEST));++ push_intel_asm_instruction(compile_data,get_intel_asm_jump_instruction(first_is_true,cmp));+ push_intel_asm_instruction(compile_data,get_intel_asm_unary_instruction(+ get_intel_asm_register(INTEL_ASM_REGISTER_AL),+ INTEL_ASM_OP_SETNE));+ push_intel_asm_instruction(compile_data,intel_asm_get_push(INTEL_ASM_REGISTER_RAX));+ push_intel_asm_instruction(compile_data,get_intel_asm_jump_instruction(end,INTEL_ASM_OP_JMP));++ push_intel_asm_instruction(compile_data,(struct Intel_Asm_Instruction*)first_is_true);+++ compile_ast_to_intel_asm(compile_data,(struct AST*)bin->right);+ rvalue_to_ax(compile_data,bin->right->value);+ push_intel_asm_instruction(compile_data,get_intel_asm_binary_instruction(+ get_intel_asm_register(reg),+ get_intel_asm_register(reg),+ INTEL_ASM_OP_TEST));+ push_intel_asm_instruction(compile_data,get_intel_asm_unary_instruction(+ get_intel_asm_register(INTEL_ASM_REGISTER_AL),+ INTEL_ASM_OP_SETNE));+ push_intel_asm_instruction(compile_data,intel_asm_get_push(INTEL_ASM_REGISTER_RAX));++ push_intel_asm_instruction(compile_data,(struct Intel_Asm_Instruction*)end);+ }#endifF diff --git a/src/backend/asm/intel/intel_compile.h b/src/backend/asm/intel/intel_compile.h --- a/src/backend/asm/intel/intel_compile.h +++ b/src/backend/asm/intel/intel_compile.hvoid compile_xor_assign_to_intel_asm(struct Compile_Data_Intel_Asm *compile_data,struct AST_Binary_Expression *bin);void compile_pipe_assign_to_intel_asm(struct Compile_Data_Intel_Asm *compile_data,struct AST_Binary_Expression *bin);void compile_nop_to_intel_asm(struct Compile_Data_Intel_Asm *compile_data,void *dummy);- void compile_logical_or_to_intel_asm(struct Compile_Data_Intel_Asm *compile_data);+ void compile_logical_or_to_intel_asm(struct Compile_Data_Intel_Asm *compile_data,struct AST_Binary_Expression *bin);void compile_logical_and_to_intel_asm(struct Compile_Data_Intel_Asm *compile_data,struct AST_Binary_Expression *bin);- void compile_logical_not_to_intel_asm(struct Compile_Data_Intel_Asm *compile_data,struct AST_Binary_Expression *bin);- void compile_bitwise_or_to_intel_asm(struct Compile_Data_Intel_Asm *compile_data,struct AST_Unary_Expression *unary);+ void compile_logical_not_to_intel_asm(struct Compile_Data_Intel_Asm *compile_data,struct AST_Unary_Expression *unary);+ void compile_bitwise_or_to_intel_asm(struct Compile_Data_Intel_Asm *compile_data,struct AST_Binary_Expression *bin);void compile_bitwise_and_to_intel_asm(struct Compile_Data_Intel_Asm *compile_data,struct AST_Binary_Expression *bin);void compile_bitwise_xor_to_intel_asm(struct Compile_Data_Intel_Asm *compile_data,struct AST_Binary_Expression *bin);void compile_bitwise_not_to_intel_asm(struct Compile_Data_Intel_Asm *compile_data,struct AST_Unary_Expression *unary);void compile_shift_inner(struct Compile_Data_Intel_Asm *compile_data,struct AST_Binary_Expression *bin,enum Intel_Asm_Instruction_Type op);void compile_simple_bin_inner(struct Compile_Data_Intel_Asm *compile_data,struct AST_Binary_Expression *bin,enum Intel_Asm_Instruction_Type op);void compile_mul_div_inner(struct Compile_Data_Intel_Asm *compile_data,struct AST_Binary_Expression *bin,enum Intel_Asm_Instruction_Type op);+ void compile_logical_and_or_inner(struct Compile_Data_Intel_Asm *compile_data,struct AST_Binary_Expression *bin,enum Intel_Asm_Instruction_Type cmp);#endifF diff --git a/src/backend/asm/intel/intel_instruction.c b/src/backend/asm/intel/intel_instruction.c --- a/src/backend/asm/intel/intel_instruction.c +++ b/src/backend/asm/intel/intel_instruction.c[INTEL_ASM_OP_NEG]=(map_entry)save_intel_asm_unary_instruction,[INTEL_ASM_OP_INC]=(map_entry)save_intel_asm_unary_instruction,[INTEL_ASM_OP_DEC]=(map_entry)save_intel_asm_unary_instruction,+ [INTEL_ASM_OP_NOT]=(map_entry)save_intel_asm_unary_instruction,[INTEL_ASM_OP_DEFINE_BYTES]=(map_entry)save_intel_asm_define_bytes,};wonky_assert(map[instruction->type]!=NULL);[INTEL_ASM_OP_NEG]="NEG",[INTEL_ASM_OP_INC]="INC",[INTEL_ASM_OP_DEC]="DEC",+ [INTEL_ASM_OP_NOT]="NOT",};wonky_assert(map[unary->type]!=NULL);fprintf(out,"%s ",map[unary->type]);F diff --git a/src/backend/asm/intel/intel_instruction.hh b/src/backend/asm/intel/intel_instruction.hh --- a/src/backend/asm/intel/intel_instruction.hh +++ b/src/backend/asm/intel/intel_instruction.hhINTEL_ASM_OP_NEG,INTEL_ASM_OP_INC,INTEL_ASM_OP_DEC,+ INTEL_ASM_OP_NOT,INTEL_ASM_OP_DEFINE_BYTES,INTEL_ASM_OP_EXPORT,INTEL_ASM_OP_IMPORT,