mirror of
https://github.com/Ed94/Odin.git
synced 2026-08-05 23:28:48 +00:00
Fix conversion from float to quaternion
This commit is contained in:
@@ -103,10 +103,10 @@ max :: proc{max_single, max_double, max_triple}
|
|||||||
abs :: proc(a: $T) -> (out: T) where IS_NUMERIC(ELEM_TYPE(T)) {
|
abs :: proc(a: $T) -> (out: T) where IS_NUMERIC(ELEM_TYPE(T)) {
|
||||||
when IS_ARRAY(T) {
|
when IS_ARRAY(T) {
|
||||||
for i in 0..<len(T) {
|
for i in 0..<len(T) {
|
||||||
out[i] = builtin.abs(a[i])
|
out[i] = auto_cast builtin.abs(a[i])
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
out = builtin.abs(a)
|
out = auto_cast builtin.abs(a)
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -650,6 +650,13 @@ i64 check_distance_between_types(CheckerContext *c, Operand *operand, Type *type
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (is_type_complex_or_quaternion(dst)) {
|
||||||
|
Type *elem = base_complex_elem_type(dst);
|
||||||
|
if (are_types_identical(elem, base_type(src))) {
|
||||||
|
return 5;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (is_type_array(dst)) {
|
if (is_type_array(dst)) {
|
||||||
Type *elem = base_array_type(dst);
|
Type *elem = base_array_type(dst);
|
||||||
i64 distance = check_distance_between_types(c, operand, elem);
|
i64 distance = check_distance_between_types(c, operand, elem);
|
||||||
|
|||||||
@@ -1655,26 +1655,10 @@ lbValue lb_emit_conv(lbProcedure *p, lbValue value, Type *t) {
|
|||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (is_type_float(src) && is_type_complex(dst)) {
|
|
||||||
Type *ft = base_complex_elem_type(dst);
|
|
||||||
lbAddr gen = lb_add_local_generated(p, dst, false);
|
|
||||||
lbValue gp = lb_addr_get_ptr(p, gen);
|
|
||||||
lbValue real = lb_emit_conv(p, value, ft);
|
|
||||||
lb_emit_store(p, lb_emit_struct_ep(p, gp, 0), real);
|
|
||||||
return lb_addr_load(p, gen);
|
|
||||||
}
|
|
||||||
if (is_type_float(src) && is_type_quaternion(dst)) {
|
|
||||||
Type *ft = base_complex_elem_type(dst);
|
|
||||||
lbAddr gen = lb_add_local_generated(p, dst, false);
|
|
||||||
lbValue gp = lb_addr_get_ptr(p, gen);
|
|
||||||
lbValue real = lb_emit_conv(p, value, ft);
|
|
||||||
lb_emit_store(p, lb_emit_struct_ep(p, gp, 0), real);
|
|
||||||
return lb_addr_load(p, gen);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (is_type_complex(src) && is_type_complex(dst)) {
|
if (is_type_complex(src) && is_type_complex(dst)) {
|
||||||
Type *ft = base_complex_elem_type(dst);
|
Type *ft = base_complex_elem_type(dst);
|
||||||
lbAddr gen = lb_add_local_generated(p, dst, false);
|
lbAddr gen = lb_add_local_generated(p, t, false);
|
||||||
lbValue gp = lb_addr_get_ptr(p, gen);
|
lbValue gp = lb_addr_get_ptr(p, gen);
|
||||||
lbValue real = lb_emit_conv(p, lb_emit_struct_ev(p, value, 0), ft);
|
lbValue real = lb_emit_conv(p, lb_emit_struct_ev(p, value, 0), ft);
|
||||||
lbValue imag = lb_emit_conv(p, lb_emit_struct_ev(p, value, 1), ft);
|
lbValue imag = lb_emit_conv(p, lb_emit_struct_ev(p, value, 1), ft);
|
||||||
@@ -1686,7 +1670,7 @@ lbValue lb_emit_conv(lbProcedure *p, lbValue value, Type *t) {
|
|||||||
if (is_type_quaternion(src) && is_type_quaternion(dst)) {
|
if (is_type_quaternion(src) && is_type_quaternion(dst)) {
|
||||||
// @QuaternionLayout
|
// @QuaternionLayout
|
||||||
Type *ft = base_complex_elem_type(dst);
|
Type *ft = base_complex_elem_type(dst);
|
||||||
lbAddr gen = lb_add_local_generated(p, dst, false);
|
lbAddr gen = lb_add_local_generated(p, t, false);
|
||||||
lbValue gp = lb_addr_get_ptr(p, gen);
|
lbValue gp = lb_addr_get_ptr(p, gen);
|
||||||
lbValue q0 = lb_emit_conv(p, lb_emit_struct_ev(p, value, 0), ft);
|
lbValue q0 = lb_emit_conv(p, lb_emit_struct_ev(p, value, 0), ft);
|
||||||
lbValue q1 = lb_emit_conv(p, lb_emit_struct_ev(p, value, 1), ft);
|
lbValue q1 = lb_emit_conv(p, lb_emit_struct_ev(p, value, 1), ft);
|
||||||
@@ -1701,7 +1685,7 @@ lbValue lb_emit_conv(lbProcedure *p, lbValue value, Type *t) {
|
|||||||
|
|
||||||
if (is_type_integer(src) && is_type_complex(dst)) {
|
if (is_type_integer(src) && is_type_complex(dst)) {
|
||||||
Type *ft = base_complex_elem_type(dst);
|
Type *ft = base_complex_elem_type(dst);
|
||||||
lbAddr gen = lb_add_local_generated(p, dst, true);
|
lbAddr gen = lb_add_local_generated(p, t, true);
|
||||||
lbValue gp = lb_addr_get_ptr(p, gen);
|
lbValue gp = lb_addr_get_ptr(p, gen);
|
||||||
lbValue real = lb_emit_conv(p, value, ft);
|
lbValue real = lb_emit_conv(p, value, ft);
|
||||||
lb_emit_store(p, lb_emit_struct_ep(p, gp, 0), real);
|
lb_emit_store(p, lb_emit_struct_ep(p, gp, 0), real);
|
||||||
@@ -1709,7 +1693,7 @@ lbValue lb_emit_conv(lbProcedure *p, lbValue value, Type *t) {
|
|||||||
}
|
}
|
||||||
if (is_type_float(src) && is_type_complex(dst)) {
|
if (is_type_float(src) && is_type_complex(dst)) {
|
||||||
Type *ft = base_complex_elem_type(dst);
|
Type *ft = base_complex_elem_type(dst);
|
||||||
lbAddr gen = lb_add_local_generated(p, dst, true);
|
lbAddr gen = lb_add_local_generated(p, t, true);
|
||||||
lbValue gp = lb_addr_get_ptr(p, gen);
|
lbValue gp = lb_addr_get_ptr(p, gen);
|
||||||
lbValue real = lb_emit_conv(p, value, ft);
|
lbValue real = lb_emit_conv(p, value, ft);
|
||||||
lb_emit_store(p, lb_emit_struct_ep(p, gp, 0), real);
|
lb_emit_store(p, lb_emit_struct_ep(p, gp, 0), real);
|
||||||
@@ -1719,7 +1703,7 @@ lbValue lb_emit_conv(lbProcedure *p, lbValue value, Type *t) {
|
|||||||
|
|
||||||
if (is_type_integer(src) && is_type_quaternion(dst)) {
|
if (is_type_integer(src) && is_type_quaternion(dst)) {
|
||||||
Type *ft = base_complex_elem_type(dst);
|
Type *ft = base_complex_elem_type(dst);
|
||||||
lbAddr gen = lb_add_local_generated(p, dst, true);
|
lbAddr gen = lb_add_local_generated(p, t, true);
|
||||||
lbValue gp = lb_addr_get_ptr(p, gen);
|
lbValue gp = lb_addr_get_ptr(p, gen);
|
||||||
lbValue real = lb_emit_conv(p, value, ft);
|
lbValue real = lb_emit_conv(p, value, ft);
|
||||||
// @QuaternionLayout
|
// @QuaternionLayout
|
||||||
@@ -1728,7 +1712,7 @@ lbValue lb_emit_conv(lbProcedure *p, lbValue value, Type *t) {
|
|||||||
}
|
}
|
||||||
if (is_type_float(src) && is_type_quaternion(dst)) {
|
if (is_type_float(src) && is_type_quaternion(dst)) {
|
||||||
Type *ft = base_complex_elem_type(dst);
|
Type *ft = base_complex_elem_type(dst);
|
||||||
lbAddr gen = lb_add_local_generated(p, dst, true);
|
lbAddr gen = lb_add_local_generated(p, t, true);
|
||||||
lbValue gp = lb_addr_get_ptr(p, gen);
|
lbValue gp = lb_addr_get_ptr(p, gen);
|
||||||
lbValue real = lb_emit_conv(p, value, ft);
|
lbValue real = lb_emit_conv(p, value, ft);
|
||||||
// @QuaternionLayout
|
// @QuaternionLayout
|
||||||
@@ -1737,7 +1721,7 @@ lbValue lb_emit_conv(lbProcedure *p, lbValue value, Type *t) {
|
|||||||
}
|
}
|
||||||
if (is_type_complex(src) && is_type_quaternion(dst)) {
|
if (is_type_complex(src) && is_type_quaternion(dst)) {
|
||||||
Type *ft = base_complex_elem_type(dst);
|
Type *ft = base_complex_elem_type(dst);
|
||||||
lbAddr gen = lb_add_local_generated(p, dst, true);
|
lbAddr gen = lb_add_local_generated(p, t, true);
|
||||||
lbValue gp = lb_addr_get_ptr(p, gen);
|
lbValue gp = lb_addr_get_ptr(p, gen);
|
||||||
lbValue real = lb_emit_conv(p, lb_emit_struct_ev(p, value, 0), ft);
|
lbValue real = lb_emit_conv(p, lb_emit_struct_ev(p, value, 0), ft);
|
||||||
lbValue imag = lb_emit_conv(p, lb_emit_struct_ev(p, value, 1), ft);
|
lbValue imag = lb_emit_conv(p, lb_emit_struct_ev(p, value, 1), ft);
|
||||||
|
|||||||
Reference in New Issue
Block a user