Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(118)

Unified Diff: src/code-stub-assembler.cc

Issue 2364473006: [stubs] Extract ToInteger to CodeStubAssembler (Closed)
Patch Set: Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/code-stub-assembler.h ('k') | src/code-stubs.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/code-stub-assembler.cc
diff --git a/src/code-stub-assembler.cc b/src/code-stub-assembler.cc
index 005d5e7f2e32f2f4c4b371fcf8798b159b069193..bf1cd8f14202d2fc21f1fac758129ef20a313e93 100644
--- a/src/code-stub-assembler.cc
+++ b/src/code-stub-assembler.cc
@@ -2985,6 +2985,60 @@ Node* CodeStubAssembler::ToNumber(Node* context, Node* input) {
return var_result.value();
}
+Node* CodeStubAssembler::ToInteger(Node* context, Node* input) {
+ // We might need to loop once for ToNumber conversion.
+ Variable var_arg(this, MachineRepresentation::kTagged);
+ Label loop(this, &var_arg), out(this);
+ var_arg.Bind(input);
+ Goto(&loop);
+ Bind(&loop);
+ {
+ // Shared entry points.
+ Label return_zero(this, Label::kDeferred);
+
+ // Load the current {arg} value.
+ Node* arg = var_arg.value();
+
+ // Check if {arg} is a Smi.
+ GotoIf(WordIsSmi(arg), &out);
+
+ // Check if {arg} is a HeapNumber.
+ Label if_argisheapnumber(this),
+ if_argisnotheapnumber(this, Label::kDeferred);
+ Branch(WordEqual(LoadMap(arg), HeapNumberMapConstant()),
+ &if_argisheapnumber, &if_argisnotheapnumber);
+
+ Bind(&if_argisheapnumber);
+ {
+ // Load the floating-point value of {arg}.
+ Node* arg_value = LoadHeapNumberValue(arg);
+
+ // Check if {arg} is NaN.
+ GotoUnless(Float64Equal(arg_value, arg_value), &return_zero);
+
+ // Truncate {arg} towards zero.
+ Node* value = Float64Trunc(arg_value);
+ var_arg.Bind(ChangeFloat64ToTagged(value));
+ Goto(&out);
+ }
+
+ Bind(&if_argisnotheapnumber);
+ {
+ // Need to convert {arg} to a Number first.
+ Callable callable = CodeFactory::NonNumberToNumber(isolate());
+ var_arg.Bind(CallStub(callable, context, arg));
+ Goto(&loop);
+ }
+
+ Bind(&return_zero);
+ var_arg.Bind(SmiConstant(Smi::FromInt(0)));
+ Goto(&out);
+ }
+
+ Bind(&out);
+ return var_arg.value();
+}
+
Node* CodeStubAssembler::BitFieldDecode(Node* word32, uint32_t shift,
uint32_t mask) {
return Word32Shr(Word32And(word32, Int32Constant(mask)),
« no previous file with comments | « src/code-stub-assembler.h ('k') | src/code-stubs.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698