aboutsummaryrefslogtreecommitdiff
path: root/src/ir_print.cpp
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2019-05-28 20:27:45 +0100
committergingerBill <bill@gingerbill.org>2019-05-28 20:27:45 +0100
commit3d2279fba0b322bd8d82bb43cb21f6f6f00515c5 (patch)
tree3b318dd18172a89f4c424b5fa610347c0851aa2b /src/ir_print.cpp
parent2b080dbbc269f2cf9bf4bcc1b67d760c9c02d93f (diff)
Support 128-bit integers `i128` `u128`
Diffstat (limited to 'src/ir_print.cpp')
-rw-r--r--src/ir_print.cpp95
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');