diff options
| author | gingerBill <bill@gingerbill.org> | 2019-05-28 20:27:45 +0100 |
|---|---|---|
| committer | gingerBill <bill@gingerbill.org> | 2019-05-28 20:27:45 +0100 |
| commit | 3d2279fba0b322bd8d82bb43cb21f6f6f00515c5 (patch) | |
| tree | 3b318dd18172a89f4c424b5fa610347c0851aa2b /src/ir_print.cpp | |
| parent | 2b080dbbc269f2cf9bf4bcc1b67d760c9c02d93f (diff) | |
Support 128-bit integers `i128` `u128`
Diffstat (limited to 'src/ir_print.cpp')
| -rw-r--r-- | src/ir_print.cpp | 95 |
1 files changed, 61 insertions, 34 deletions
diff --git a/src/ir_print.cpp b/src/ir_print.cpp index 46bcfc139..b008fa682 100644 --- a/src/ir_print.cpp +++ b/src/ir_print.cpp @@ -75,21 +75,39 @@ void ir_write_u64(irFileBuffer *f, u64 i) { ir_write_string(f, str); } void ir_write_big_int(irFileBuffer *f, BigInt const &x, Type *type, bool swap_endian) { - i64 i = 0; - if (x.neg) { - i = big_int_to_i64(&x); + if (x.len == 2) { + gbAllocator a = heap_allocator(); // TODO(bill): Change this allocator + u64 words[2] = {}; + BigInt y = x; + if (swap_endian) { + gb_memmove(words, y.d.words, 16); + u8 *bytes = cast(u8 *)words; + for (isize i = 0; i < 8; i++) { + bytes[i] = bytes[16-i]; // byte swap + } + y.d.words = words; + } + + String s = big_int_to_string(a, &y, 10); + ir_write_string(f, s); + gb_free(a, s.text); } else { - i = cast(i64)big_int_to_u64(&x); - } - if (swap_endian) { - i64 size = type_size_of(type); - switch (size) { - case 2: i = cast(i64)cast(i16)gb_endian_swap16(cast(u16)cast(i16)i); break; - case 4: i = cast(i64)cast(i32)gb_endian_swap32(cast(u32)cast(i32)i); break; - case 8: i = cast(i64)gb_endian_swap64(cast(u64)i); break; + i64 i = 0; + if (x.neg) { + i = big_int_to_i64(&x); + } else { + i = cast(i64)big_int_to_u64(&x); + } + if (swap_endian) { + i64 size = type_size_of(type); + switch (size) { + case 2: i = cast(i64)cast(i16)gb_endian_swap16(cast(u16)cast(i16)i); break; + case 4: i = cast(i64)cast(i32)gb_endian_swap32(cast(u32)cast(i32)i); break; + case 8: i = cast(i64)gb_endian_swap64(cast(u64)i); break; + } } + ir_write_i64(f, i); } - ir_write_i64(f, i); } void ir_file_write(irFileBuffer *f, void *data, isize len) { @@ -359,28 +377,34 @@ void ir_print_type(irFileBuffer *f, irModule *m, Type *t, bool in_struct) { case Basic_b32: ir_write_str_lit(f, "i32"); return; case Basic_b64: ir_write_str_lit(f, "i64"); return; - case Basic_i8: ir_write_str_lit(f, "i8"); return; - case Basic_u8: ir_write_str_lit(f, "i8"); return; - case Basic_i16: ir_write_str_lit(f, "i16"); return; - case Basic_u16: ir_write_str_lit(f, "i16"); return; - case Basic_i32: ir_write_str_lit(f, "i32"); return; - case Basic_u32: ir_write_str_lit(f, "i32"); return; - case Basic_i64: ir_write_str_lit(f, "i64"); return; - case Basic_u64: ir_write_str_lit(f, "i64"); return; - - case Basic_i16le: ir_write_str_lit(f, "i16"); return; - case Basic_u16le: ir_write_str_lit(f, "i16"); return; - case Basic_i32le: ir_write_str_lit(f, "i32"); return; - case Basic_u32le: ir_write_str_lit(f, "i32"); return; - case Basic_i64le: ir_write_str_lit(f, "i64"); return; - case Basic_u64le: ir_write_str_lit(f, "i64"); return; - - case Basic_i16be: ir_write_str_lit(f, "i16"); return; - case Basic_u16be: ir_write_str_lit(f, "i16"); return; - case Basic_i32be: ir_write_str_lit(f, "i32"); return; - case Basic_u32be: ir_write_str_lit(f, "i32"); return; - case Basic_i64be: ir_write_str_lit(f, "i64"); return; - case Basic_u64be: ir_write_str_lit(f, "i64"); return; + case Basic_i8: ir_write_str_lit(f, "i8"); return; + case Basic_u8: ir_write_str_lit(f, "i8"); return; + case Basic_i16: ir_write_str_lit(f, "i16"); return; + case Basic_u16: ir_write_str_lit(f, "i16"); return; + case Basic_i32: ir_write_str_lit(f, "i32"); return; + case Basic_u32: ir_write_str_lit(f, "i32"); return; + case Basic_i64: ir_write_str_lit(f, "i64"); return; + case Basic_u64: ir_write_str_lit(f, "i64"); return; + case Basic_i128: ir_write_str_lit(f, "i128"); return; + case Basic_u128: ir_write_str_lit(f, "i128"); return; + + case Basic_i16le: ir_write_str_lit(f, "i16"); return; + case Basic_u16le: ir_write_str_lit(f, "i16"); return; + case Basic_i32le: ir_write_str_lit(f, "i32"); return; + case Basic_u32le: ir_write_str_lit(f, "i32"); return; + case Basic_i64le: ir_write_str_lit(f, "i64"); return; + case Basic_u64le: ir_write_str_lit(f, "i64"); return; + case Basic_i128le: ir_write_str_lit(f, "i128"); return; + case Basic_u128le: ir_write_str_lit(f, "i128"); return; + + case Basic_i16be: ir_write_str_lit(f, "i16"); return; + case Basic_u16be: ir_write_str_lit(f, "i16"); return; + case Basic_i32be: ir_write_str_lit(f, "i32"); return; + case Basic_u32be: ir_write_str_lit(f, "i32"); return; + case Basic_i64be: ir_write_str_lit(f, "i64"); return; + case Basic_u64be: ir_write_str_lit(f, "i64"); return; + case Basic_i128be: ir_write_str_lit(f, "i128"); return; + case Basic_u128be: ir_write_str_lit(f, "i128"); return; case Basic_rune: ir_write_str_lit(f, "i32"); return; @@ -2209,6 +2233,9 @@ void print_llvm_ir(irGen *ir) { if (map_get(&m->members, hash_string(str_lit("llvm.bswap.i64"))) == nullptr) { ir_write_str_lit(f, "declare i64 @llvm.bswap.i64(i64) \n"); } + if (map_get(&m->members, hash_string(str_lit("llvm.bswap.i128"))) == nullptr) { + ir_write_str_lit(f, "declare i128 @llvm.bswap.i128(i128) \n"); + } ir_write_byte(f, '\n'); |