diff options
| author | gingerBill <ginger.bill.22@gmail.com> | 2016-08-01 00:34:15 +0100 |
|---|---|---|
| committer | gingerBill <ginger.bill.22@gmail.com> | 2016-08-01 00:34:15 +0100 |
| commit | 88e05ad2b25b51ad3f5dd92554ffbfa3eeaa57b9 (patch) | |
| tree | f4aa339987a8aa05a86bfa410503200dfa7d72b7 /src/codegen/print.cpp | |
| parent | 70f6282f41cdd7f500159116c520140364f6739a (diff) | |
Basic Comparisons
Diffstat (limited to 'src/codegen/print.cpp')
| -rw-r--r-- | src/codegen/print.cpp | 76 |
1 files changed, 53 insertions, 23 deletions
diff --git a/src/codegen/print.cpp b/src/codegen/print.cpp index 8e7f33ac9..63b846c46 100644 --- a/src/codegen/print.cpp +++ b/src/codegen/print.cpp @@ -278,33 +278,63 @@ void ssa_print_instruction(gbFile *f, ssaModule *m, ssaValue *value) { ssa_fprintf(f, "%%%d = ", value->id); - if (is_type_float(type)) - ssa_fprintf(f, "f"); - - switch (bo->op.kind) { - case Token_Add: ssa_fprintf(f, "add"); break; - case Token_Sub: ssa_fprintf(f, "sub"); break; - case Token_And: ssa_fprintf(f, "and"); break; - case Token_Or: ssa_fprintf(f, "or"); break; - case Token_Xor: ssa_fprintf(f, "xor"); break; - - case Token_AndNot: GB_PANIC("TODO(bill): print Token_AndNot"); - - case Token_Mul: ssa_fprintf(f, "mul"); break; - - default: { - if (!is_type_float(type)) { - if (is_type_unsigned(type)) - ssa_fprintf(f, "u"); - else - ssa_fprintf(f, "s"); + if (gb_is_between(bo->op.kind, Token__ComparisonBegin+1, Token__ComparisonEnd-1)) { + if (is_type_float(type)) { + ssa_fprintf(f, "fcmp "); + switch (bo->op.kind) { + case Token_CmpEq: ssa_fprintf(f, "oeq"); break; + case Token_NotEq: ssa_fprintf(f, "one"); break; + case Token_Lt: ssa_fprintf(f, "olt"); break; + case Token_Gt: ssa_fprintf(f, "ogt"); break; + case Token_LtEq: ssa_fprintf(f, "ole"); break; + case Token_GtEq: ssa_fprintf(f, "oge"); break; + } + } else { + ssa_fprintf(f, "icmp "); + if (bo->op.kind != Token_CmpEq && + bo->op.kind != Token_NotEq) { + if (is_type_unsigned(type)) { + ssa_fprintf(f, "s"); + } else { + ssa_fprintf(f, "u"); + } + } + switch (bo->op.kind) { + case Token_CmpEq: ssa_fprintf(f, "eq"); break; + case Token_NotEq: ssa_fprintf(f, "ne"); break; + case Token_Lt: ssa_fprintf(f, "lt"); break; + case Token_Gt: ssa_fprintf(f, "gt"); break; + case Token_LtEq: ssa_fprintf(f, "le"); break; + case Token_GtEq: ssa_fprintf(f, "ge"); break; + } } + } else { + if (is_type_float(type)) + ssa_fprintf(f, "f"); switch (bo->op.kind) { - case Token_Quo: ssa_fprintf(f, "div"); break; - case Token_Mod: ssa_fprintf(f, "rem"); break; + case Token_Add: ssa_fprintf(f, "add"); break; + case Token_Sub: ssa_fprintf(f, "sub"); break; + case Token_And: ssa_fprintf(f, "and"); break; + case Token_Or: ssa_fprintf(f, "or"); break; + case Token_Xor: ssa_fprintf(f, "xor"); break; + + case Token_AndNot: GB_PANIC("Token_AndNot Should never be called"); + + case Token_Mul: ssa_fprintf(f, "mul"); break; + + default: { + if (!is_type_float(type)) { + if (is_type_unsigned(type)) ssa_fprintf(f, "u"); + else ssa_fprintf(f, "s"); + } + + switch (bo->op.kind) { + case Token_Quo: ssa_fprintf(f, "div"); break; + case Token_Mod: ssa_fprintf(f, "rem"); break; + } + } break; } - } break; } ssa_fprintf(f, " "); |