aboutsummaryrefslogtreecommitdiff
path: root/src/llvm_backend_expr.cpp
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2024-08-30 10:52:11 +0100
committergingerBill <bill@gingerbill.org>2024-08-30 10:52:11 +0100
commit9197a126fcb7042ede78c26178314342e23c58b6 (patch)
tree5395157bb2a60e18afbc488a503801697fa881b3 /src/llvm_backend_expr.cpp
parent38ea276231cba6860ac013ffb338b96afb6cd2fa (diff)
Use XOR directly rather than `(~x) & mask`
Diffstat (limited to 'src/llvm_backend_expr.cpp')
-rw-r--r--src/llvm_backend_expr.cpp5
1 files changed, 3 insertions, 2 deletions
diff --git a/src/llvm_backend_expr.cpp b/src/llvm_backend_expr.cpp
index b10b7745a..f6b9934ef 100644
--- a/src/llvm_backend_expr.cpp
+++ b/src/llvm_backend_expr.cpp
@@ -182,11 +182,12 @@ gb_internal lbValue lb_emit_unary_arith(lbProcedure *p, TokenKind op, lbValue x,
if (op == Token_Xor) {
lbValue cmp = {};
cmp.type = x.type;
- cmp.value = LLVMBuildNot(p->builder, x.value, "");
if (is_type_bit_set(x.type)) {
ExactValue ev_mask = exact_bit_set_all_set_mask(x.type);
lbValue mask = lb_const_value(p->module, x.type, ev_mask);
- cmp.value = LLVMBuildAnd(p->builder, cmp.value, mask.value, "");
+ cmp.value = LLVMBuildXor(p->builder, x.value, mask.value, "");
+ } else {
+ cmp.value = LLVMBuildNot(p->builder, x.value, "");
}
return lb_emit_conv(p, cmp, type);
}