aboutsummaryrefslogtreecommitdiff
path: root/src/llvm_backend_stmt.cpp
diff options
context:
space:
mode:
authorBarinzaya <barinzaya@gmail.com>2025-03-02 09:54:54 -0500
committerBarinzaya <barinzaya@gmail.com>2025-03-02 16:24:18 -0500
commitef83f2115a3a9853fe1b00caf9f1d921fb934aa2 (patch)
tree6dbb1f7b7fcc971d10de9e3139de68ead984e55c /src/llvm_backend_stmt.cpp
parent36d5e094198f0601a543f0a0362d9e918f25980f (diff)
Implemented `#reverse` for `for in bit_set`.
Diffstat (limited to 'src/llvm_backend_stmt.cpp')
-rw-r--r--src/llvm_backend_stmt.cpp11
1 files changed, 10 insertions, 1 deletions
diff --git a/src/llvm_backend_stmt.cpp b/src/llvm_backend_stmt.cpp
index 86e9b8347..4fcb136b0 100644
--- a/src/llvm_backend_stmt.cpp
+++ b/src/llvm_backend_stmt.cpp
@@ -1119,6 +1119,10 @@ gb_internal void lb_build_range_stmt(lbProcedure *p, AstRangeStmt *rs, Scope *sc
lbValue all_mask = lb_const_value(p->module, mask, exact_bit_set_all_set_mask(et));
lbValue initial_mask = lb_emit_arith(p, Token_And, the_set, all_mask, mask);
+ if (rs->reverse) {
+ initial_mask = lb_emit_reverse_bits(p, initial_mask, mask);
+ }
+
lbAddr remaining = lb_add_local_generated(p, mask, false);
lb_addr_store(p, remaining, initial_mask);
@@ -1136,7 +1140,12 @@ gb_internal void lb_build_range_stmt(lbProcedure *p, AstRangeStmt *rs, Scope *sc
lb_start_block(p, body);
val = lb_emit_count_trailing_zeros(p, remaining_val, mask);
val = lb_emit_conv(p, val, elem);
- val = lb_emit_arith(p, Token_Add, val, lb_const_int(m, elem, et->BitSet.lower), elem);
+
+ if (rs->reverse) {
+ val = lb_emit_arith(p, Token_Sub, lb_const_int(m, elem, et->BitSet.lower + 8*type_size_of(mask) - 1), val, elem);
+ } else {
+ val = lb_emit_arith(p, Token_Add, val, lb_const_int(m, elem, et->BitSet.lower), elem);
+ }
lbValue reduce_val = lb_emit_arith(p, Token_Sub, remaining_val, lb_const_int(m, mask, 1), mask);
remaining_val = lb_emit_arith(p, Token_And, remaining_val, reduce_val, mask);