Skip to content

Commit b4bfbce

Browse files
ripsawridgeCommit Bot
authored andcommitted
[Builtins] Math.abs and Math.imul ported to Torque
This is part of a general move of math builtins away from builtins-math-gen.cc. Change-Id: Ifb6e5d4779bb9e6f69ff7c58d09ca8fc94f4cc66 Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/1914210 Commit-Queue: Michael Stanton <mvstanton@chromium.org> Reviewed-by: Tobias Tebbi <tebbi@chromium.org> Cr-Commit-Position: refs/heads/master@{#64943}
1 parent a5376b7 commit b4bfbce

30 files changed

Lines changed: 179 additions & 212 deletions

src/builtins/array-copywithin.tq

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,14 @@ namespace array {
1717
const length: Number = GetLengthProperty(object);
1818

1919
// 3. Let relativeTarget be ? ToInteger(target).
20-
const relativeTarget: Number = ToInteger_Inline(context, arguments[0]);
20+
const relativeTarget: Number = ToInteger_Inline(arguments[0]);
2121

2222
// 4. If relativeTarget < 0, let to be max((len + relativeTarget), 0);
2323
// else let to be min(relativeTarget, len).
2424
let to: Number = ConvertToRelativeIndex(relativeTarget, length);
2525

2626
// 5. Let relativeStart be ? ToInteger(start).
27-
const relativeStart: Number = ToInteger_Inline(context, arguments[1]);
27+
const relativeStart: Number = ToInteger_Inline(arguments[1]);
2828

2929
// 6. If relativeStart < 0, let from be max((len + relativeStart), 0);
3030
// else let from be min(relativeStart, len).
@@ -34,7 +34,7 @@ namespace array {
3434
// else let relativeEnd be ? ToInteger(end).
3535
let relativeEnd: Number = length;
3636
if (arguments[2] != Undefined) {
37-
relativeEnd = ToInteger_Inline(context, arguments[2]);
37+
relativeEnd = ToInteger_Inline(arguments[2]);
3838
}
3939

4040
// 8. If relativeEnd < 0, let final be max((len + relativeEnd), 0);

src/builtins/array-join.tq

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ namespace array {
7474
} else {
7575
result = Call(context, callable, element, locales, options);
7676
}
77-
return ToString_Inline(context, result);
77+
return ToString_Inline(result);
7878
}
7979
label TypeError {
8080
ThrowTypeError(kCalledNonCallable, prop);
@@ -528,8 +528,7 @@ namespace array {
528528
sepObj: JSAny, locales: JSAny, options: JSAny): JSAny {
529529
// 3. If separator is undefined, let sep be the single-element String ",".
530530
// 4. Else, let sep be ? ToString(separator).
531-
const sep: String =
532-
sepObj == Undefined ? ',' : ToString_Inline(context, sepObj);
531+
const sep: String = sepObj == Undefined ? ',' : ToString_Inline(sepObj);
533532

534533
// If the receiver is not empty and not already being joined, continue with
535534
// the normal join algorithm.

src/builtins/array-lastindexof.tq

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ namespace array {
6464
// else let n be len - 1.
6565
const n: Number = arguments.length < 2 ?
6666
length - 1 :
67-
ToInteger_Inline(context, arguments[1], kTruncateMinusZero);
67+
ToInteger_Inline(arguments[1], kTruncateMinusZero);
6868

6969
// 5. If n >= 0, then.
7070
let k: Number = SmiConstant(0);

src/builtins/array-slice.tq

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,7 @@ namespace array {
143143

144144
// 3. Let relativeStart be ? ToInteger(start).
145145
const start: JSAny = arguments[0];
146-
const relativeStart: Number = ToInteger_Inline(context, start);
146+
const relativeStart: Number = ToInteger_Inline(start);
147147

148148
// 4. If relativeStart < 0, let k be max((len + relativeStart), 0);
149149
// else let k be min(relativeStart, len).
@@ -153,8 +153,7 @@ namespace array {
153153
// 5. If end is undefined, let relativeEnd be len;
154154
// else let relativeEnd be ? ToInteger(end).
155155
const end: JSAny = arguments[1];
156-
const relativeEnd: Number =
157-
end == Undefined ? len : ToInteger_Inline(context, end);
156+
const relativeEnd: Number = end == Undefined ? len : ToInteger_Inline(end);
158157

159158
// 6. If relativeEnd < 0, let final be max((len + relativeEnd), 0);
160159
// else let final be min(relativeEnd, len).

src/builtins/array-splice.tq

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -360,7 +360,7 @@ namespace array {
360360

361361
// 3. Let relativeStart be ? ToInteger(start).
362362
const start: JSAny = arguments[0];
363-
const relativeStart: Number = ToInteger_Inline(context, start);
363+
const relativeStart: Number = ToInteger_Inline(start);
364364

365365
// 4. If relativeStart < 0, let actualStart be max((len + relativeStart),
366366
// 0);
@@ -389,7 +389,7 @@ namespace array {
389389
insertCount = Convert<Smi>(arguments.length) - 2;
390390
// b. Let dc be ? ToInteger(deleteCount).
391391
const deleteCount: JSAny = arguments[1];
392-
const dc: Number = ToInteger_Inline(context, deleteCount);
392+
const dc: Number = ToInteger_Inline(deleteCount);
393393
// c. Let actualDeleteCount be min(max(dc, 0), len - actualStart).
394394
actualDeleteCount = Min(Max(dc, 0), len - actualStart);
395395
}

src/builtins/base.tq

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -460,12 +460,16 @@ extern macro Comment(constexpr string);
460460
extern macro StaticAssert(bool);
461461
extern macro Print(Object);
462462
extern macro DebugBreak();
463-
extern transitioning macro ToInteger_Inline(Context, JSAny): Number;
464-
extern transitioning macro ToInteger_Inline(
465-
Context, JSAny, constexpr ToIntegerTruncationMode): Number;
466-
extern transitioning macro ToLength_Inline(Context, JSAny): Number;
467-
extern transitioning macro ToNumber_Inline(Context, JSAny): Number;
468-
extern transitioning macro ToString_Inline(Context, JSAny): String;
463+
extern transitioning macro ToInteger_Inline(implicit context: Context)(JSAny):
464+
Number;
465+
extern transitioning macro ToInteger_Inline(implicit context: Context)(
466+
JSAny, constexpr ToIntegerTruncationMode): Number;
467+
extern transitioning macro ToLength_Inline(implicit context: Context)(JSAny):
468+
Number;
469+
extern transitioning macro ToNumber_Inline(implicit context: Context)(JSAny):
470+
Number;
471+
extern transitioning macro ToString_Inline(implicit context: Context)(JSAny):
472+
String;
469473
extern transitioning macro ToThisString(implicit context: Context)(
470474
JSAny, String): String;
471475
extern transitioning macro ToThisValue(implicit context: Context)(
@@ -1197,7 +1201,7 @@ macro ChangeSafeIntegerNumberToUintPtr(value: Number):
11971201
transitioning macro ToUintPtr(implicit context: Context)(value: JSAny):
11981202
uintptr labels IfLessThanZero, IfUIntPtrOverflow, IfSafeIntegerOverflow {
11991203
if (value == Undefined) return 0;
1200-
const indexNumber = ToInteger_Inline(context, value, kTruncateMinusZero);
1204+
const indexNumber = ToInteger_Inline(value, kTruncateMinusZero);
12011205
return TryNumberToUintPtr(indexNumber, kModeValueIsAnyNumber)
12021206
otherwise IfLessThanZero, IfUIntPtrOverflow, IfSafeIntegerOverflow;
12031207
}
@@ -1211,7 +1215,7 @@ transitioning macro ToUintPtr(implicit context: Context)(value: JSAny):
12111215
transitioning macro ToIndex(implicit context: Context)(value: JSAny):
12121216
uintptr labels IfRangeError {
12131217
if (value == Undefined) return 0;
1214-
const indexNumber = ToInteger_Inline(context, value, kTruncateMinusZero);
1218+
const indexNumber = ToInteger_Inline(value, kTruncateMinusZero);
12151219
// Less than 0 case, uintptr range overflow and safe integer range overflow
12161220
// imply IfRangeError.
12171221
return TryNumberToUintPtr(indexNumber, kModeValueIsAnyNumber)
@@ -1234,7 +1238,7 @@ transitioning macro GetLengthProperty(implicit context: Context)(o: JSAny):
12341238
}
12351239
}
12361240
label ToLength(length: JSAny) deferred {
1237-
return ToLength_Inline(context, length);
1241+
return ToLength_Inline(length);
12381242
}
12391243
}
12401244

@@ -1282,8 +1286,7 @@ extern macro AllocateSeqTwoByteString(uint32): String;
12821286
@export
12831287
transitioning macro ConvertToRelativeIndex(implicit context: Context)(
12841288
index: JSAny, length: uintptr): uintptr {
1285-
const indexNumber: Number =
1286-
ToInteger_Inline(context, index, kTruncateMinusZero);
1289+
const indexNumber: Number = ToInteger_Inline(index, kTruncateMinusZero);
12871290
return ConvertToRelativeIndex(indexNumber, length);
12881291
}
12891292

@@ -1330,8 +1333,7 @@ macro ConvertToRelativeIndex(indexNumber: Number, length: uintptr): uintptr {
13301333
@export
13311334
transitioning macro ClampToIndexRange(implicit context: Context)(
13321335
index: JSAny, limit: uintptr): uintptr {
1333-
const indexNumber: Number =
1334-
ToInteger_Inline(context, index, kTruncateMinusZero);
1336+
const indexNumber: Number = ToInteger_Inline(index, kTruncateMinusZero);
13351337
return ClampToIndexRange(indexNumber, limit);
13361338
}
13371339

src/builtins/builtins-definitions.h

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -628,14 +628,10 @@ namespace internal {
628628
TFS(MapIteratorToList, kSource) \
629629
\
630630
/* Math */ \
631-
/* ES6 #sec-math.abs */ \
632-
TFJ(MathAbs, 1, kReceiver, kX) \
633631
/* ES6 #sec-math.ceil */ \
634632
TFJ(MathCeil, 1, kReceiver, kX) \
635633
/* ES6 #sec-math.floor */ \
636634
TFJ(MathFloor, 1, kReceiver, kX) \
637-
/* ES6 #sec-math.imul */ \
638-
TFJ(MathImul, 2, kReceiver, kX, kY) \
639635
/* ES6 #sec-math.max */ \
640636
TFJ(MathMax, SharedFunctionInfo::kDontAdaptArgumentsSentinel) \
641637
/* ES6 #sec-math.min */ \

src/builtins/builtins-math-gen.cc

Lines changed: 0 additions & 96 deletions
Original file line numberDiff line numberDiff line change
@@ -16,90 +16,6 @@ namespace internal {
1616
// -----------------------------------------------------------------------------
1717
// ES6 section 20.2.2 Function Properties of the Math Object
1818

19-
// ES6 #sec-math.abs
20-
TF_BUILTIN(MathAbs, CodeStubAssembler) {
21-
TNode<Context> context = CAST(Parameter(Descriptor::kContext));
22-
23-
// We might need to loop once for ToNumber conversion.
24-
TVARIABLE(Object, var_x);
25-
Label loop(this, &var_x);
26-
var_x = CAST(Parameter(Descriptor::kX));
27-
Goto(&loop);
28-
BIND(&loop);
29-
{
30-
// Load the current {x} value.
31-
TNode<Object> x = var_x.value();
32-
33-
// Check if {x} is a Smi or a HeapObject.
34-
Label if_xissmi(this), if_xisnotsmi(this);
35-
Branch(TaggedIsSmi(x), &if_xissmi, &if_xisnotsmi);
36-
37-
BIND(&if_xissmi);
38-
{
39-
TNode<Smi> x_smi = CAST(x);
40-
Label if_overflow(this, Label::kDeferred);
41-
42-
// check if support abs function
43-
if (IsIntPtrAbsWithOverflowSupported()) {
44-
TNode<PairT<IntPtrT, BoolT>> pair =
45-
IntPtrAbsWithOverflow(BitcastTaggedToWordForTagAndSmiBits(x_smi));
46-
TNode<BoolT> overflow = Projection<1>(pair);
47-
GotoIf(overflow, &if_overflow);
48-
49-
// There is a Smi representation for negated {x}.
50-
TNode<IntPtrT> result = Projection<0>(pair);
51-
Return(BitcastWordToTagged(result));
52-
53-
} else {
54-
// Check if {x} is already positive.
55-
Label if_xispositive(this), if_xisnotpositive(this);
56-
BranchIfSmiLessThanOrEqual(SmiConstant(0), x_smi, &if_xispositive,
57-
&if_xisnotpositive);
58-
59-
BIND(&if_xispositive);
60-
{
61-
// Just return the input {x}.
62-
Return(x_smi);
63-
}
64-
65-
BIND(&if_xisnotpositive);
66-
{
67-
// Try to negate the {x} value.
68-
TNode<Smi> result = TrySmiSub(SmiConstant(0), x_smi, &if_overflow);
69-
Return(result);
70-
}
71-
}
72-
73-
BIND(&if_overflow);
74-
{ Return(NumberConstant(0.0 - Smi::kMinValue)); }
75-
}
76-
77-
BIND(&if_xisnotsmi);
78-
{
79-
// Check if {x} is a HeapNumber.
80-
Label if_xisheapnumber(this), if_xisnotheapnumber(this, Label::kDeferred);
81-
TNode<HeapObject> x_heap_object = CAST(x);
82-
Branch(IsHeapNumber(x_heap_object), &if_xisheapnumber,
83-
&if_xisnotheapnumber);
84-
85-
BIND(&if_xisheapnumber);
86-
{
87-
TNode<Float64T> x_value = LoadHeapNumberValue(x_heap_object);
88-
TNode<Float64T> value = Float64Abs(x_value);
89-
TNode<HeapNumber> result = AllocateHeapNumberWithValue(value);
90-
Return(result);
91-
}
92-
93-
BIND(&if_xisnotheapnumber);
94-
{
95-
// Need to convert {x} to a Number first.
96-
var_x = CallBuiltin(Builtins::kNonNumberToNumber, context, x);
97-
Goto(&loop);
98-
}
99-
}
100-
}
101-
}
102-
10319
void MathBuiltinsAssembler::MathRoundingOperation(
10420
TNode<Context> context, TNode<Object> x,
10521
TNode<Float64T> (CodeStubAssembler::*float64op)(SloppyTNode<Float64T>)) {
@@ -180,18 +96,6 @@ TF_BUILTIN(MathFloor, MathBuiltinsAssembler) {
18096
MathRoundingOperation(context, x, &CodeStubAssembler::Float64Floor);
18197
}
18298

183-
// ES6 #sec-math.imul
184-
TF_BUILTIN(MathImul, CodeStubAssembler) {
185-
TNode<Context> context = CAST(Parameter(Descriptor::kContext));
186-
TNode<Object> x = CAST(Parameter(Descriptor::kX));
187-
TNode<Object> y = CAST(Parameter(Descriptor::kY));
188-
TNode<Word32T> x_value = TruncateTaggedToWord32(context, x);
189-
TNode<Word32T> y_value = TruncateTaggedToWord32(context, y);
190-
TNode<Int32T> value = Signed(Int32Mul(x_value, y_value));
191-
TNode<Number> result = ChangeInt32ToTagged(value);
192-
Return(result);
193-
}
194-
19599
TNode<Number> MathBuiltinsAssembler::MathPow(TNode<Context> context,
196100
TNode<Object> base,
197101
TNode<Object> exponent) {

src/builtins/builtins-string.tq

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -66,8 +66,7 @@ namespace string {
6666
const string: String = ToThisString(receiver, methodName);
6767

6868
// 3. Let position be ? ToInteger(pos).
69-
const indexNumber: Number =
70-
ToInteger_Inline(context, position, kTruncateMinusZero);
69+
const indexNumber: Number = ToInteger_Inline(position, kTruncateMinusZero);
7170

7271
// Convert the {position} to a uintptr and check that it's in bounds of
7372
// the {string}.
@@ -153,7 +152,7 @@ namespace string {
153152
// Concatenate all the arguments passed to this builtin.
154153
const length: intptr = Convert<intptr>(arguments.length);
155154
for (let i: intptr = 0; i < length; i++) {
156-
const temp: String = ToString_Inline(context, arguments[i]);
155+
const temp: String = ToString_Inline(arguments[i]);
157156
string = string + temp;
158157
}
159158
return string;
@@ -186,7 +185,7 @@ namespace string {
186185
}
187186
}
188187
// 2. b. Let s be ? ToString(value).
189-
s = ToString_Inline(context, arguments[0]);
188+
s = ToString_Inline(arguments[0]);
190189
}
191190
// 3. If NewTarget is undefined, return s.
192191
if (newTarget == Undefined) {

src/builtins/convert.tq

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,17 @@ Convert<int32, uint31>(i: uint31): int32 {
140140
Convert<int32, intptr>(i: intptr): int32 {
141141
return TruncateIntPtrToInt32(i);
142142
}
143+
Convert<int32, Number>(n: Number): int32 {
144+
typeswitch (n) {
145+
case (s: Smi): {
146+
return Convert<int32>(s);
147+
}
148+
case (h: HeapNumber): {
149+
return TruncateHeapNumberValueToWord32(h);
150+
}
151+
}
152+
}
153+
143154
Convert<Smi, intptr>(i: intptr): Smi {
144155
return SmiTag(i);
145156
}

0 commit comments

Comments
 (0)