From b63d17e2f85cacd3fcc98539e28f31647f974ccf Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Mon, 25 Oct 2021 14:34:22 +0200 Subject: [PATCH] LibJS: Add fast paths for <, >, <=, and >= with Int32 on both sides This gives us a ~5% speed-up on Kraken's ai-astar.js --- Userland/Libraries/LibJS/Runtime/Value.cpp | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/Userland/Libraries/LibJS/Runtime/Value.cpp b/Userland/Libraries/LibJS/Runtime/Value.cpp index 9e7275bb30..129c286387 100644 --- a/Userland/Libraries/LibJS/Runtime/Value.cpp +++ b/Userland/Libraries/LibJS/Runtime/Value.cpp @@ -773,6 +773,9 @@ ThrowCompletionOr Value::get_method(GlobalObject& global_object // 13.10 Relational Operators, https://tc39.es/ecma262/#sec-relational-operators ThrowCompletionOr greater_than(GlobalObject& global_object, Value lhs, Value rhs) { + if (lhs.type() == Value::Type::Int32 && rhs.type() == Value::Type::Int32) + return lhs.as_i32() > rhs.as_i32(); + TriState relation = TRY(is_less_than(global_object, false, lhs, rhs)); if (relation == TriState::Unknown) return Value(false); @@ -782,6 +785,9 @@ ThrowCompletionOr greater_than(GlobalObject& global_object, Value lhs, Va // 13.10 Relational Operators, https://tc39.es/ecma262/#sec-relational-operators ThrowCompletionOr greater_than_equals(GlobalObject& global_object, Value lhs, Value rhs) { + if (lhs.type() == Value::Type::Int32 && rhs.type() == Value::Type::Int32) + return lhs.as_i32() >= rhs.as_i32(); + TriState relation = TRY(is_less_than(global_object, true, lhs, rhs)); if (relation == TriState::Unknown || relation == TriState::True) return Value(false); @@ -791,6 +797,9 @@ ThrowCompletionOr greater_than_equals(GlobalObject& global_object, Value // 13.10 Relational Operators, https://tc39.es/ecma262/#sec-relational-operators ThrowCompletionOr less_than(GlobalObject& global_object, Value lhs, Value rhs) { + if (lhs.type() == Value::Type::Int32 && rhs.type() == Value::Type::Int32) + return lhs.as_i32() < rhs.as_i32(); + TriState relation = TRY(is_less_than(global_object, true, lhs, rhs)); if (relation == TriState::Unknown) return Value(false); @@ -800,6 +809,9 @@ ThrowCompletionOr less_than(GlobalObject& global_object, Value lhs, Value // 13.10 Relational Operators, https://tc39.es/ecma262/#sec-relational-operators ThrowCompletionOr less_than_equals(GlobalObject& global_object, Value lhs, Value rhs) { + if (lhs.type() == Value::Type::Int32 && rhs.type() == Value::Type::Int32) + return lhs.as_i32() <= rhs.as_i32(); + TriState relation = TRY(is_less_than(global_object, false, lhs, rhs)); if (relation == TriState::Unknown || relation == TriState::True) return Value(false);