aboutsummaryrefslogtreecommitdiff
path: root/src/llvm_backend_expr.cpp
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2024-11-04 12:35:17 +0000
committergingerBill <bill@gingerbill.org>2024-11-04 12:35:17 +0000
commit31ea10490fe2e951a3ec451127ac5f2217e35f23 (patch)
treee72977807c0e80039b9a68c9a1499946b388f1fb /src/llvm_backend_expr.cpp
parentaa36ae01cf4e4d665fb190b9f00237dfad9d21ee (diff)
Fix `auto_cast` matrix bug
Diffstat (limited to 'src/llvm_backend_expr.cpp')
-rw-r--r--src/llvm_backend_expr.cpp13
1 files changed, 12 insertions, 1 deletions
diff --git a/src/llvm_backend_expr.cpp b/src/llvm_backend_expr.cpp
index b5f6437a4..8ad44035d 100644
--- a/src/llvm_backend_expr.cpp
+++ b/src/llvm_backend_expr.cpp
@@ -2363,12 +2363,23 @@ gb_internal lbValue lb_emit_conv(lbProcedure *p, lbValue value, Type *t) {
GB_ASSERT(src->kind == Type_Matrix);
lbAddr v = lb_add_local_generated(p, t, true);
- if (is_matrix_square(dst) && is_matrix_square(dst)) {
+ if (dst->Matrix.row_count == src->Matrix.row_count &&
+ dst->Matrix.column_count == src->Matrix.column_count) {
+ for (i64 j = 0; j < dst->Matrix.column_count; j++) {
+ for (i64 i = 0; i < dst->Matrix.row_count; i++) {
+ lbValue d = lb_emit_matrix_epi(p, v.addr, i, j);
+ lbValue s = lb_emit_matrix_ev(p, value, i, j);
+ s = lb_emit_conv(p, s, dst->Matrix.elem);
+ lb_emit_store(p, d, s);
+ }
+ }
+ } else if (is_matrix_square(dst) && is_matrix_square(dst)) {
for (i64 j = 0; j < dst->Matrix.column_count; j++) {
for (i64 i = 0; i < dst->Matrix.row_count; i++) {
if (i < src->Matrix.row_count && j < src->Matrix.column_count) {
lbValue d = lb_emit_matrix_epi(p, v.addr, i, j);
lbValue s = lb_emit_matrix_ev(p, value, i, j);
+ s = lb_emit_conv(p, s, dst->Matrix.elem);
lb_emit_store(p, d, s);
} else if (i == j) {
lbValue d = lb_emit_matrix_epi(p, v.addr, i, j);