aboutsummaryrefslogtreecommitdiff
path: root/src/llvm_backend_expr.cpp
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2023-09-27 11:38:11 +0100
committergingerBill <bill@gingerbill.org>2023-09-27 11:38:11 +0100
commitacc29fbcebf4459b1c98c54d9cc565d363a4196a (patch)
tree91b4692e0a8c9c3958ed44347ded5a2f40ee157d /src/llvm_backend_expr.cpp
parent94d68c1f225c3699d905388baee15e42ec6e49a0 (diff)
parentfc93ea7aa370d25aab61dab43e885f50978dff50 (diff)
Merge branch 'master' into llvm-17
Diffstat (limited to 'src/llvm_backend_expr.cpp')
-rw-r--r--src/llvm_backend_expr.cpp23
1 files changed, 22 insertions, 1 deletions
diff --git a/src/llvm_backend_expr.cpp b/src/llvm_backend_expr.cpp
index e8569eba9..d6e8843fa 100644
--- a/src/llvm_backend_expr.cpp
+++ b/src/llvm_backend_expr.cpp
@@ -2414,7 +2414,28 @@ gb_internal lbValue lb_emit_comp(lbProcedure *p, TokenKind op_kind, lbValue left
}
if (is_type_string(a)) {
- if (is_type_cstring(a)) {
+ if (is_type_cstring(a) && is_type_cstring(b)) {
+ left = lb_emit_conv(p, left, t_cstring);
+ right = lb_emit_conv(p, right, t_cstring);
+ char const *runtime_procedure = nullptr;
+ switch (op_kind) {
+ case Token_CmpEq: runtime_procedure = "cstring_eq"; break;
+ case Token_NotEq: runtime_procedure = "cstring_ne"; break;
+ case Token_Lt: runtime_procedure = "cstring_lt"; break;
+ case Token_Gt: runtime_procedure = "cstring_gt"; break;
+ case Token_LtEq: runtime_procedure = "cstring_le"; break;
+ case Token_GtEq: runtime_procedure = "cstring_gt"; break;
+ }
+ GB_ASSERT(runtime_procedure != nullptr);
+
+ auto args = array_make<lbValue>(permanent_allocator(), 2);
+ args[0] = left;
+ args[1] = right;
+ return lb_emit_runtime_call(p, runtime_procedure, args);
+ }
+
+
+ if (is_type_cstring(a) ^ is_type_cstring(b)) {
left = lb_emit_conv(p, left, t_string);
right = lb_emit_conv(p, right, t_string);
}