aboutsummaryrefslogtreecommitdiff
path: root/src/llvm_backend_expr.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/llvm_backend_expr.cpp')
-rw-r--r--src/llvm_backend_expr.cpp11
1 files changed, 11 insertions, 0 deletions
diff --git a/src/llvm_backend_expr.cpp b/src/llvm_backend_expr.cpp
index 13c6082fb..f922c6359 100644
--- a/src/llvm_backend_expr.cpp
+++ b/src/llvm_backend_expr.cpp
@@ -1153,6 +1153,17 @@ gb_internal LLVMValueRef lb_integer_division(lbProcedure *p, LLVMValueRef lhs, L
return zero;
}
} else {
+ if (!is_signed && lb_sizeof(type) <= 8) {
+ u64 v = cast(u64)LLVMConstIntGetZExtValue(rhs);
+ if (v == 1) {
+ return lhs;
+ } else if (is_power_of_two_u64(v)) {
+ u64 n = floor_log2(v);
+ LLVMValueRef bits = LLVMConstInt(type, n, false);
+ return LLVMBuildLShr(p->builder, lhs, bits, "");
+ }
+ }
+
return call(p->builder, lhs, rhs, "");
}
}