8#include "torque-generated/src/objects/oddball-tq-csa.h"
17class UnaryOpAssemblerImpl final :
public CodeStubAssembler {
19 explicit UnaryOpAssemblerImpl(compiler::CodeAssemblerState* state)
20 : CodeStubAssembler(state) {}
22 TNode<Object> BitwiseNot(TNode<Context> context, TNode<Object> value,
24 TNode<HeapObject> maybe_feedback_vector,
33 Label if_number(
this), if_bigint(
this, Label::kDeferred), out(
this);
34 LazyNode<HeapObject> get_vector = [&]() {
return maybe_feedback_vector; };
35 FeedbackValues feedback = {&var_feedback, &get_vector, &slot,
36 update_feedback_mode};
37 TaggedToWord32OrBigIntWithFeedback(context, value, &if_number, &var_word32,
38 &if_bigint,
nullptr, &var_bigint,
44 ChangeInt32ToTagged(
Signed(Word32BitwiseNot(var_word32.value())));
45 TNode<Smi> result_type = SelectSmiConstant(
48 UpdateFeedback(SmiOr(result_type, var_feedback.value()),
49 maybe_feedback_vector, slot, update_feedback_mode);
55 maybe_feedback_vector, slot, update_feedback_mode);
57 CallRuntime(Runtime::kBigIntUnaryOp, context, var_bigint.value(),
58 SmiConstant(Operation::kBitwiseNot));
62 return var_result.value();
65 TNode<Object> Decrement(TNode<Context> context, TNode<Object> value,
67 TNode<HeapObject> maybe_feedback_vector,
69 return IncrementOrDecrement<Operation::kDecrement>(
70 context, value, slot, maybe_feedback_vector, update_feedback_mode);
73 TNode<Object> Increment(TNode<Context> context, TNode<Object> value,
75 TNode<HeapObject> maybe_feedback_vector,
77 return IncrementOrDecrement<Operation::kIncrement>(
78 context, value, slot, maybe_feedback_vector, update_feedback_mode);
81 TNode<Object>
Negate(TNode<Context> context, TNode<Object> value,
83 TNode<HeapObject> maybe_feedback_vector,
89 Label if_zero(
this), if_min_smi(
this),
end(
this);
91 GotoIf(SmiEqual(smi_value, SmiConstant(0)), &if_zero);
94 GotoIf(SmiEqual(smi_value, SmiConstant(
Smi::kMinValue)), &if_min_smi);
98 var_result = SmiSub(SmiConstant(0), smi_value);
103 var_result = MinusZeroConstant();
107 *var_float = SmiToFloat64(smi_value);
111 return var_result.value();
113 FloatOperation float_op = [=,
this](TNode<Float64T> float_value) {
114 return Float64Neg(float_value);
116 BigIntOperation bigint_op = [=,
this](TNode<Context>
context,
117 TNode<HeapObject> bigint_value) {
118 return CAST(CallRuntime(Runtime::kBigIntUnaryOp, context, bigint_value,
119 SmiConstant(Operation::kNegate)));
121 return UnaryOpWithFeedback(context, value, slot, maybe_feedback_vector,
122 smi_op, float_op, bigint_op,
123 update_feedback_mode);
127 using SmiOperation = std::function<TNode<Number>(
130 using FloatOperation =
131 std::function<TNode<Float64T>(TNode<Float64T> )>;
132 using BigIntOperation = std::function<TNode<HeapObject>(
133 TNode<Context> , TNode<HeapObject> )>;
135 TNode<Object> UnaryOpWithFeedback(TNode<Context> context, TNode<Object> value,
136 TNode<UintPtrT> slot,
137 TNode<HeapObject> maybe_feedback_vector,
138 const SmiOperation& smi_op,
139 const FloatOperation& float_op,
140 const BigIntOperation& bigint_op,
147 Label
start(
this, {&var_value, &var_feedback}),
end(
this);
148 Label do_float_op(
this, &var_float_value);
149 Label if_exception(
this, Label::kDeferred);
154 Label if_smi(
this), if_heapnumber(
this), if_oddball(
this);
155 Label if_bigint(
this, Label::kDeferred);
156 Label if_other(
this, Label::kDeferred);
157 value = var_value.value();
158 GotoIf(TaggedIsSmi(value), &if_smi);
160 TNode<HeapObject> value_heap_object =
CAST(value);
161 TNode<Map> map = LoadMap(value_heap_object);
162 GotoIf(IsHeapNumberMap(map), &if_heapnumber);
163 TNode<Uint16T> instance_type = LoadMapInstanceType(map);
164 GotoIf(IsBigIntInstanceType(instance_type), &if_bigint);
165 Branch(InstanceTypeEqual(instance_type, ODDBALL_TYPE), &if_oddball,
171 smi_op(
CAST(value), &var_feedback, &do_float_op, &var_float_value);
175 BIND(&if_heapnumber);
177 var_float_value = LoadHeapNumberValue(value_heap_object);
183 var_result = bigint_op(context, value_heap_object);
193 CSA_DCHECK(
this, SmiEqual(var_feedback.value(),
195 OverwriteFeedback(&var_feedback,
197 var_value = LoadOddballToNumber(
CAST(value_heap_object));
206 CSA_DCHECK(
this, SmiEqual(var_feedback.value(),
210 ScopedExceptionHandler
handler(
this, &if_exception, &var_exception);
211 var_value = CallBuiltin(Builtin::kNonNumberToNumeric, context,
220 UpdateFeedback(var_feedback.value(), maybe_feedback_vector, slot,
221 update_feedback_mode);
222 CallRuntime(Runtime::kReThrow, context, var_exception.value());
230 AllocateHeapNumberWithValue(float_op(var_float_value.value()));
235 UpdateFeedback(var_feedback.value(), maybe_feedback_vector, slot,
236 update_feedback_mode);
237 return var_result.value();
240 template <Operation kOperation>
241 TNode<Object> IncrementOrDecrement(TNode<Context> context,
242 TNode<Object> value, TNode<UintPtrT> slot,
243 TNode<HeapObject> maybe_feedback_vector,
245 static_assert(
kOperation == Operation::kIncrement ||
247 static constexpr int kAddValue =
248 (
kOperation == Operation::kIncrement) ? 1 : -1;
250 SmiOperation smi_op = [=,
this](TNode<Smi> smi_value,
254 Label if_overflow(
this), out(
this);
256 TrySmiAdd(smi_value, SmiConstant(kAddValue), &if_overflow);
261 *var_float = SmiToFloat64(smi_value);
267 FloatOperation float_op = [=,
this](TNode<Float64T> float_value) {
268 return Float64Add(float_value, Float64Constant(kAddValue));
270 BigIntOperation bigint_op = [=,
this](TNode<Context>
context,
271 TNode<HeapObject> bigint_value) {
272 return CAST(CallRuntime(Runtime::kBigIntUnaryOp, context, bigint_value,
275 return UnaryOpWithFeedback(context, value, slot, maybe_feedback_vector,
276 smi_op, float_op, bigint_op,
277 update_feedback_mode);
287 UnaryOpAssemblerImpl
a(
state_);
288 return a.BitwiseNot(context, value, slot, maybe_feedback_vector,
289 update_feedback_mode);
296 UnaryOpAssemblerImpl
a(
state_);
297 return a.Decrement(context, value, slot, maybe_feedback_vector,
298 update_feedback_mode);
305 UnaryOpAssemblerImpl
a(
state_);
306 return a.Increment(context, value, slot, maybe_feedback_vector,
307 update_feedback_mode);
314 UnaryOpAssemblerImpl
a(
state_);
315 return a.Negate(context, value, slot, maybe_feedback_vector,
316 update_feedback_mode);
#define CSA_DCHECK(csa,...)
static constexpr int kMinValue
TNode< Object > Generate_IncrementWithFeedback(TNode< Context > context, TNode< Object > value, TNode< UintPtrT > slot, TNode< HeapObject > maybe_feedback_vector, UpdateFeedbackMode update_feedback_mode)
TNode< Object > Generate_DecrementWithFeedback(TNode< Context > context, TNode< Object > value, TNode< UintPtrT > slot, TNode< HeapObject > maybe_feedback_vector, UpdateFeedbackMode update_feedback_mode)
compiler::CodeAssemblerState *const state_
TNode< Object > Generate_NegateWithFeedback(TNode< Context > context, TNode< Object > value, TNode< UintPtrT > slot, TNode< HeapObject > maybe_feedback_vector, UpdateFeedbackMode update_feedback_mode)
TNode< Object > Generate_BitwiseNotWithFeedback(TNode< Context > context, TNode< Object > value, TNode< UintPtrT > slot, TNode< HeapObject > maybe_feedback_vector, UpdateFeedbackMode update_feedback_mode)
std::optional< TNode< JSArray > > a
ZoneVector< RpoNumber > & result
constexpr std::make_signed_t< T > Signed(T value)
TNode< Float64T > Float64Add(TNode< Float64T > a, TNode< Float64T > b)
constexpr Condition Negate(Condition cond)
compiler::TypedCodeAssemblerVariable< T > TVariable
Union< Smi, HeapNumber > Number