mirror of
https://github.com/Ed94/Odin.git
synced 2026-06-20 04:35:00 -07:00
Support 128-bit integers i128 u128
This commit is contained in:
+60
-33
@@ -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);
|
||||
} 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;
|
||||
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 {
|
||||
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_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_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_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');
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user