diff options
| author | Ginger Bill <bill@gingerbill.org> | 2017-06-07 22:09:16 +0100 |
|---|---|---|
| committer | Ginger Bill <bill@gingerbill.org> | 2017-06-07 22:09:16 +0100 |
| commit | 574b82c0c7e266bcd1bc16ee709d32936625cf46 (patch) | |
| tree | 2490104e638424a41d86d37395aefc99a00e5451 /src | |
| parent | f60c772c11154d16c12d30a7f19c2c2e07068642 (diff) | |
v0.3.0
Diffstat (limited to 'src')
| -rw-r--r-- | src/build_settings.c | 2 | ||||
| -rw-r--r-- | src/check_expr.c | 8 | ||||
| -rw-r--r-- | src/integer128.c | 26 | ||||
| -rw-r--r-- | src/ir.c | 1 |
4 files changed, 23 insertions, 14 deletions
diff --git a/src/build_settings.c b/src/build_settings.c index 1a6b8fdf5..0ba38e30f 100644 --- a/src/build_settings.c +++ b/src/build_settings.c @@ -263,7 +263,7 @@ String get_fullpath_core(gbAllocator a, String path) { void init_build_context(void) { BuildContext *bc = &build_context; bc->ODIN_VENDOR = str_lit("odin"); - bc->ODIN_VERSION = str_lit("0.2.1"); + bc->ODIN_VERSION = str_lit("0.3.0"); bc->ODIN_ROOT = odin_root_dir(); #if defined(GB_SYSTEM_WINDOWS) diff --git a/src/check_expr.c b/src/check_expr.c index 75d38f4fc..1ed7378e5 100644 --- a/src/check_expr.c +++ b/src/check_expr.c @@ -2643,6 +2643,14 @@ bool check_is_castable_to(Checker *c, Operand *operand, Type *y) { return true; } + if (is_type_bit_field_value(src) && is_type_integer(dst)) { + return true; + } + + if (is_type_bit_field_value(src) && is_type_boolean(dst)) { + return src->BitFieldValue.bits == 1; + } + // Cast between pointers if (is_type_pointer(src) && is_type_pointer(dst)) { Type *s = base_type(type_deref(src)); diff --git a/src/integer128.c b/src/integer128.c index ed05a1471..6cce03143 100644 --- a/src/integer128.c +++ b/src/integer128.c @@ -554,28 +554,28 @@ i128 i128_mul(i128 a, i128 b) { return res; } -void i128_divide(i128 num, i128 den, i128 *quo, i128 *rem) { +void i128_divide(i128 a, i128 b, i128 *quo, i128 *rem) { // TODO(bill): Which one is correct?! -#if 0 - i128 s = i128_shr(den, 127); - den = i128_sub(i128_xor(den, s), s); - s = i128_shr(num, 127); - den = i128_sub(i128_xor(num, s), s); +#if 1 + i128 s = i128_shr(b, 127); + b = i128_sub(i128_xor(b, s), s); + s = i128_shr(a, 127); + b = i128_sub(i128_xor(a, s), s); u128 n, r = {0}; - u128_divide(*cast(u128 *)&num, *cast(u128 *)&den, &n, &r); + u128_divide(*cast(u128 *)&a, *cast(u128 *)&b, &n, &r); i128 ni = *cast(i128 *)&n; i128 ri = *cast(i128 *)&r; - if (quo) *quo = i128_sub(i128_xor(ni, s), s); - if (rem) *rem = i128_sub(i128_xor(ri, s), s); + if (quo) *quo = i128_sub(i128_xor(ri, s), s); + if (rem) *rem = i128_sub(i128_xor(ni, s), s); #else - if (i128_eq(den, I128_ZERO)) { - if (quo) *quo = i128_from_u64(num.lo/den.lo); + if (i128_eq(b, I128_ZERO)) { + if (quo) *quo = i128_from_u64(a.lo/b.lo); if (rem) *rem = I128_ZERO; } else { - i128 n = num; - i128 d = den; + i128 n = a; + i128 d = b; i128 x = I128_ONE; i128 r = I128_ZERO; @@ -3060,6 +3060,7 @@ bool ir_is_type_aggregate(Type *t) { case Type_Tuple: case Type_DynamicArray: case Type_Map: + case Type_BitField: return true; case Type_Named: |