16namespace interpreter {
39#define DECLARE_INTRINSIC_HELPER(name, lower_case, count) \
40 TNode<Object> name(const InterpreterAssembler::RegListNodePair& args, \
41 TNode<Context> context, int arg_count);
43#undef DECLARE_INTRINSIC_HELPER
58 return generator.InvokeIntrinsic(function_id, context,
args);
61#define __ assembler_->
69#define MAKE_LABEL(name, lower_case, count) \
70 InterpreterAssembler::Label lower_case(assembler_);
74#define LABEL_POINTER(name, lower_case, count) &lower_case,
78#define CASE(name, lower_case, count) \
79 static_cast<int32_t>(IntrinsicsHelper::IntrinsicId::k##name),
83 __ Switch(function_id, &abort, cases, labels,
arraysize(cases));
84#define HANDLE_CASE(name, lower_case, expected_arg_count) \
85 __ BIND(&lower_case); \
87 if (v8_flags.debug_code && expected_arg_count >= 0) { \
88 AbortIfArgCountMismatch(expected_arg_count, args.reg_count()); \
90 TNode<Object> value = name(args, context, expected_arg_count); \
101 __ Abort(AbortReason::kUnexpectedFunctionIDForInvokeIntrinsic);
112 Builtin builtin,
int arg_count) {
115 return __ CallBuiltin(builtin, context,
116 __ LoadRegisterFromRegisterList(
args, 0));
118 return __ CallBuiltin(builtin, context,
119 __ LoadRegisterFromRegisterList(
args, 0),
120 __ LoadRegisterFromRegisterList(
args, 1));
122 return __ CallBuiltin(builtin, context,
123 __ LoadRegisterFromRegisterList(
args, 0),
124 __ LoadRegisterFromRegisterList(
args, 1),
125 __ LoadRegisterFromRegisterList(
args, 2));
139IntrinsicsGenerator::CopyDataPropertiesWithExcludedPropertiesOnStack(
145 __ ChangeInt32ToIntPtr(
args.reg_count()),
__ IntPtrConstant(1));
146 return __ CallBuiltin(
147 Builtin::kCopyDataPropertiesWithExcludedPropertiesOnStack, context,
148 __ LoadRegisterFromRegisterList(
args, 0), excluded_property_count, base);
151TNode<Object> IntrinsicsGenerator::CreateIterResultObject(
152 const InterpreterAssembler::RegListNodePair&
args, TNode<Context> context,
158TNode<Object> IntrinsicsGenerator::CreateAsyncFromSyncIterator(
159 const InterpreterAssembler::RegListNodePair&
args, TNode<Context> context,
161 TNode<JSAny> sync_iterator =
163 return __ CreateAsyncFromSyncIterator(context, sync_iterator);
166TNode<Object> IntrinsicsGenerator::CreateJSGeneratorObject(
167 const InterpreterAssembler::RegListNodePair&
args, TNode<Context> context,
173TNode<Object> IntrinsicsGenerator::GeneratorGetResumeMode(
174 const InterpreterAssembler::RegListNodePair&
args, TNode<Context> context,
176 TNode<JSGeneratorObject> generator =
178 const TNode<Object> value =
179 __ LoadObjectField(generator, JSGeneratorObject::kResumeModeOffset);
184TNode<Object> IntrinsicsGenerator::GeneratorClose(
185 const InterpreterAssembler::RegListNodePair&
args, TNode<Context> context,
187 TNode<JSGeneratorObject> generator =
189 __ StoreObjectFieldNoWriteBarrier(
190 generator, JSGeneratorObject::kContinuationOffset,
195TNode<Object> IntrinsicsGenerator::GetImportMetaObject(
196 const InterpreterAssembler::RegListNodePair&
args, TNode<Context> context,
198 return __ GetImportMetaObject(context);
201TNode<Object> IntrinsicsGenerator::AsyncFunctionAwait(
202 const InterpreterAssembler::RegListNodePair&
args, TNode<Context> context,
208TNode<Object> IntrinsicsGenerator::AsyncFunctionEnter(
209 const InterpreterAssembler::RegListNodePair&
args, TNode<Context> context,
215TNode<Object> IntrinsicsGenerator::AsyncFunctionReject(
216 const InterpreterAssembler::RegListNodePair&
args, TNode<Context> context,
222TNode<Object> IntrinsicsGenerator::AsyncFunctionResolve(
223 const InterpreterAssembler::RegListNodePair&
args, TNode<Context> context,
229TNode<Object> IntrinsicsGenerator::AsyncGeneratorAwait(
230 const InterpreterAssembler::RegListNodePair&
args, TNode<Context> context,
236TNode<Object> IntrinsicsGenerator::AsyncGeneratorReject(
237 const InterpreterAssembler::RegListNodePair&
args, TNode<Context> context,
243TNode<Object> IntrinsicsGenerator::AsyncGeneratorResolve(
244 const InterpreterAssembler::RegListNodePair&
args, TNode<Context> context,
250TNode<Object> IntrinsicsGenerator::AsyncGeneratorYieldWithAwait(
251 const InterpreterAssembler::RegListNodePair&
args, TNode<Context> context,
254 args, context, Builtin::kAsyncGeneratorYieldWithAwait, arg_count);
260 TNode<BoolT> comparison =
__ Word32Equal(actual,
__ Int32Constant(expected));
261 __ GotoIf(comparison, &match);
262 __ Abort(AbortReason::kWrongArgumentCountForInvokeIntrinsic);
#define HANDLE_CASE(op, opcode, name, result)
v8::internal::Factory * factory()
static const int kGeneratorClosed
TNode< Object > InvokeIntrinsic(TNode< Uint32T > function_id, TNode< Context > context, const InterpreterAssembler::RegListNodePair &args)
InterpreterAssembler * assembler_
IntrinsicsGenerator & operator=(const IntrinsicsGenerator &)=delete
IntrinsicsGenerator(InterpreterAssembler *assembler)
IntrinsicsGenerator(const IntrinsicsGenerator &)=delete
TNode< Object > IntrinsicAsBuiltinCall(const InterpreterAssembler::RegListNodePair &args, TNode< Context > context, Builtin name, int arg_count)
void AbortIfArgCountMismatch(int expected, TNode< Word32T > actual)
base::Vector< const DirectHandle< Object > > args
#define LABEL_POINTER(name, lower_case)
#define MAKE_LABEL(name, lower_case)
#define DECLARE_INTRINSIC_HELPER(name, lower_case, count)
#define INTRINSICS_LIST(V)
ZoneVector< RpoNumber > & result
TNode< Oddball > UndefinedConstant(JSGraph *jsgraph)
TNode< Object > GenerateInvokeIntrinsic(InterpreterAssembler *assembler, TNode< Uint32T > function_id, TNode< Context > context, const InterpreterAssembler::RegListNodePair &args)