V8 API Reference, 7.2.502.16 (for Deno 0.2.4)
code-stubs-s390.cc
1 // Copyright 2014 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #if V8_TARGET_ARCH_S390
6 
7 #include "src/api-arguments-inl.h"
8 #include "src/assembler-inl.h"
9 #include "src/base/bits.h"
10 #include "src/bootstrapper.h"
11 #include "src/code-stubs.h"
12 #include "src/frame-constants.h"
13 #include "src/frames.h"
14 #include "src/ic/ic.h"
15 #include "src/ic/stub-cache.h"
16 #include "src/isolate.h"
17 #include "src/macro-assembler.h"
18 #include "src/objects/api-callbacks.h"
19 #include "src/regexp/jsregexp.h"
20 #include "src/regexp/regexp-macro-assembler.h"
21 #include "src/runtime/runtime.h"
22 
23 #include "src/s390/code-stubs-s390.h" // Cannot be the first include.
24 
25 namespace v8 {
26 namespace internal {
27 
28 #define __ ACCESS_MASM(masm)
29 
30 void JSEntryStub::Generate(MacroAssembler* masm) {
31  // r2: code entry
32  // r3: function
33  // r4: receiver
34  // r5: argc
35  // r6: argv
36 
37  Label invoke, handler_entry, exit;
38 
39  {
40  NoRootArrayScope no_root_array(masm);
41 
42 // saving floating point registers
43 #if V8_TARGET_ARCH_S390X
44  // 64bit ABI requires f8 to f15 be saved
45  __ lay(sp, MemOperand(sp, -8 * kDoubleSize));
46  __ std(d8, MemOperand(sp));
47  __ std(d9, MemOperand(sp, 1 * kDoubleSize));
48  __ std(d10, MemOperand(sp, 2 * kDoubleSize));
49  __ std(d11, MemOperand(sp, 3 * kDoubleSize));
50  __ std(d12, MemOperand(sp, 4 * kDoubleSize));
51  __ std(d13, MemOperand(sp, 5 * kDoubleSize));
52  __ std(d14, MemOperand(sp, 6 * kDoubleSize));
53  __ std(d15, MemOperand(sp, 7 * kDoubleSize));
54 #else
55  // 31bit ABI requires you to store f4 and f6:
56  // http://refspecs.linuxbase.org/ELF/zSeries/lzsabi0_s390.html#AEN417
57  __ lay(sp, MemOperand(sp, -2 * kDoubleSize));
58  __ std(d4, MemOperand(sp));
59  __ std(d6, MemOperand(sp, kDoubleSize));
60 #endif
61 
62  // zLinux ABI
63  // Incoming parameters:
64  // r2: code entry
65  // r3: function
66  // r4: receiver
67  // r5: argc
68  // r6: argv
69  // Requires us to save the callee-preserved registers r6-r13
70  // General convention is to also save r14 (return addr) and
71  // sp/r15 as well in a single STM/STMG
72  __ lay(sp, MemOperand(sp, -10 * kPointerSize));
73  __ StoreMultipleP(r6, sp, MemOperand(sp, 0));
74 
75  // Set up the reserved register for 0.0.
76  // __ LoadDoubleLiteral(kDoubleRegZero, 0.0, r0);
77 
78  // Push a frame with special values setup to mark it as an entry frame.
79  // Bad FP (-1)
80  // SMI Marker
81  // SMI Marker
82  // kCEntryFPAddress
83  // Frame type
84  __ lay(sp, MemOperand(sp, -5 * kPointerSize));
85 
86  // Push a bad frame pointer to fail if it is used.
87  __ LoadImmP(r10, Operand(-1));
88 
89  StackFrame::Type marker = type();
90  __ Load(r9, Operand(StackFrame::TypeToMarker(marker)));
91  __ Load(r8, Operand(StackFrame::TypeToMarker(marker)));
92  // Save copies of the top frame descriptor on the stack.
93  __ mov(r7, Operand(ExternalReference::Create(
94  IsolateAddressId::kCEntryFPAddress, isolate())));
95  __ LoadP(r7, MemOperand(r7));
96  __ StoreMultipleP(r7, r10, MemOperand(sp, kPointerSize));
97  // Set up frame pointer for the frame to be pushed.
98  // Need to add kPointerSize, because sp has one extra
99  // frame already for the frame type being pushed later.
100  __ lay(fp, MemOperand(
101  sp, -EntryFrameConstants::kCallerFPOffset + kPointerSize));
102 
103  __ InitializeRootRegister();
104  }
105 
106  // If this is the outermost JS call, set js_entry_sp value.
107  Label non_outermost_js;
108  ExternalReference js_entry_sp =
109  ExternalReference::Create(IsolateAddressId::kJSEntrySPAddress, isolate());
110  __ mov(r7, Operand(js_entry_sp));
111  __ LoadAndTestP(r8, MemOperand(r7));
112  __ bne(&non_outermost_js, Label::kNear);
113  __ StoreP(fp, MemOperand(r7));
114  __ Load(ip, Operand(StackFrame::OUTERMOST_JSENTRY_FRAME));
115  Label cont;
116  __ b(&cont, Label::kNear);
117  __ bind(&non_outermost_js);
118  __ Load(ip, Operand(StackFrame::INNER_JSENTRY_FRAME));
119 
120  __ bind(&cont);
121  __ StoreP(ip, MemOperand(sp)); // frame-type
122 
123  // Jump to a faked try block that does the invoke, with a faked catch
124  // block that sets the pending exception.
125  __ b(&invoke, Label::kNear);
126 
127  __ bind(&handler_entry);
128  handler_offset_ = handler_entry.pos();
129  // Caught exception: Store result (exception) in the pending exception
130  // field in the JSEnv and return a failure sentinel. Coming in here the
131  // fp will be invalid because the PushStackHandler below sets it to 0 to
132  // signal the existence of the JSEntry frame.
133  __ mov(ip, Operand(ExternalReference::Create(
134  IsolateAddressId::kPendingExceptionAddress, isolate())));
135 
136  __ StoreP(r2, MemOperand(ip));
137  __ LoadRoot(r2, RootIndex::kException);
138  __ b(&exit, Label::kNear);
139 
140  // Invoke: Link this frame into the handler chain.
141  __ bind(&invoke);
142  // Must preserve r2-r6.
143  __ PushStackHandler();
144  // If an exception not caught by another handler occurs, this handler
145  // returns control to the code after the b(&invoke) above, which
146  // restores all kCalleeSaved registers (including cp and fp) to their
147  // saved values before returning a failure to C.
148 
149  // Invoke the function by calling through JS entry trampoline builtin.
150  // Notice that we cannot store a reference to the trampoline code directly in
151  // this stub, because runtime stubs are not traversed when doing GC.
152 
153  // Expected registers by Builtins::JSEntryTrampoline
154  // r2: code entry
155  // r3: function
156  // r4: receiver
157  // r5: argc
158  // r6: argv
159  __ Call(EntryTrampoline(), RelocInfo::CODE_TARGET);
160 
161  // Unlink this frame from the handler chain.
162  __ PopStackHandler();
163  __ bind(&exit); // r2 holds result
164 
165  // Check if the current stack frame is marked as the outermost JS frame.
166  Label non_outermost_js_2;
167  __ pop(r7);
168  __ CmpP(r7, Operand(StackFrame::OUTERMOST_JSENTRY_FRAME));
169  __ bne(&non_outermost_js_2, Label::kNear);
170  __ mov(r8, Operand::Zero());
171  __ mov(r7, Operand(js_entry_sp));
172  __ StoreP(r8, MemOperand(r7));
173  __ bind(&non_outermost_js_2);
174 
175  // Restore the top frame descriptors from the stack.
176  __ pop(r5);
177  __ mov(ip, Operand(ExternalReference::Create(
178  IsolateAddressId::kCEntryFPAddress, isolate())));
179  __ StoreP(r5, MemOperand(ip));
180 
181  // Reset the stack to the callee saved registers.
182  __ lay(sp, MemOperand(sp, -EntryFrameConstants::kCallerFPOffset));
183 
184  // Reload callee-saved preserved regs, return address reg (r14) and sp
185  __ LoadMultipleP(r6, sp, MemOperand(sp, 0));
186  __ la(sp, MemOperand(sp, 10 * kPointerSize));
187 
188 // saving floating point registers
189 #if V8_TARGET_ARCH_S390X
190  // 64bit ABI requires f8 to f15 be saved
191  __ ld(d8, MemOperand(sp));
192  __ ld(d9, MemOperand(sp, 1 * kDoubleSize));
193  __ ld(d10, MemOperand(sp, 2 * kDoubleSize));
194  __ ld(d11, MemOperand(sp, 3 * kDoubleSize));
195  __ ld(d12, MemOperand(sp, 4 * kDoubleSize));
196  __ ld(d13, MemOperand(sp, 5 * kDoubleSize));
197  __ ld(d14, MemOperand(sp, 6 * kDoubleSize));
198  __ ld(d15, MemOperand(sp, 7 * kDoubleSize));
199  __ la(sp, MemOperand(sp, 8 * kDoubleSize));
200 #else
201  // 31bit ABI requires you to store f4 and f6:
202  // http://refspecs.linuxbase.org/ELF/zSeries/lzsabi0_s390.html#AEN417
203  __ ld(d4, MemOperand(sp));
204  __ ld(d6, MemOperand(sp, kDoubleSize));
205  __ la(sp, MemOperand(sp, 2 * kDoubleSize));
206 #endif
207 
208  __ b(r14);
209 }
210 
211 // This stub is paired with DirectCEntryStub::GenerateCall
212 void DirectCEntryStub::Generate(MacroAssembler* masm) {
213  __ CleanseP(r14);
214 
215  __ b(ip); // Callee will return to R14 directly
216 }
217 
218 void DirectCEntryStub::GenerateCall(MacroAssembler* masm, Register target) {
219  if (FLAG_embedded_builtins) {
220  if (masm->root_array_available() &&
221  isolate()->ShouldLoadConstantsFromRootList()) {
222  // This is basically an inlined version of Call(Handle<Code>) that loads
223  // the code object into lr instead of ip.
224  __ Move(ip, target);
225  __ IndirectLoadConstant(r1, GetCode());
226  __ AddP(r1, r1, Operand(Code::kHeaderSize - kHeapObjectTag));
227  __ Call(r1);
228  return;
229  }
230  }
231 #if ABI_USES_FUNCTION_DESCRIPTORS && !defined(USE_SIMULATOR)
232  // Native AIX/S390X Linux use a function descriptor.
233  __ LoadP(ToRegister(ABI_TOC_REGISTER), MemOperand(target, kPointerSize));
234  __ LoadP(target, MemOperand(target, 0)); // Instruction address
235 #else
236  // ip needs to be set for DirectCEentryStub::Generate, and also
237  // for ABI_CALL_VIA_IP.
238  __ Move(ip, target);
239 #endif
240 
241  __ call(GetCode(), RelocInfo::CODE_TARGET); // Call the stub.
242 }
243 
244 static int AddressOffset(ExternalReference ref0, ExternalReference ref1) {
245  return ref0.address() - ref1.address();
246 }
247 
248 // Calls an API function. Allocates HandleScope, extracts returned value
249 // from handle and propagates exceptions. Restores context. stack_space
250 // - space to be unwound on exit (includes the call JS arguments space and
251 // the additional space allocated for the fast call).
252 static void CallApiFunctionAndReturn(MacroAssembler* masm,
253  Register function_address,
254  ExternalReference thunk_ref,
255  int stack_space,
256  MemOperand* stack_space_operand,
257  MemOperand return_value_operand) {
258  Isolate* isolate = masm->isolate();
259  ExternalReference next_address =
260  ExternalReference::handle_scope_next_address(isolate);
261  const int kNextOffset = 0;
262  const int kLimitOffset = AddressOffset(
263  ExternalReference::handle_scope_limit_address(isolate), next_address);
264  const int kLevelOffset = AddressOffset(
265  ExternalReference::handle_scope_level_address(isolate), next_address);
266 
267  // Additional parameter is the address of the actual callback.
268  DCHECK(function_address == r3 || function_address == r4);
269  Register scratch = r5;
270 
271  __ Move(scratch, ExternalReference::is_profiling_address(isolate));
272  __ LoadlB(scratch, MemOperand(scratch, 0));
273  __ CmpP(scratch, Operand::Zero());
274 
275  Label profiler_disabled;
276  Label end_profiler_check;
277  __ beq(&profiler_disabled, Label::kNear);
278  __ Move(scratch, thunk_ref);
279  __ b(&end_profiler_check, Label::kNear);
280  __ bind(&profiler_disabled);
281  __ LoadRR(scratch, function_address);
282  __ bind(&end_profiler_check);
283 
284  // Allocate HandleScope in callee-save registers.
285  // r9 - next_address
286  // r6 - next_address->kNextOffset
287  // r7 - next_address->kLimitOffset
288  // r8 - next_address->kLevelOffset
289  __ Move(r9, next_address);
290  __ LoadP(r6, MemOperand(r9, kNextOffset));
291  __ LoadP(r7, MemOperand(r9, kLimitOffset));
292  __ LoadlW(r8, MemOperand(r9, kLevelOffset));
293  __ AddP(r8, Operand(1));
294  __ StoreW(r8, MemOperand(r9, kLevelOffset));
295 
296  if (FLAG_log_timer_events) {
297  FrameScope frame(masm, StackFrame::MANUAL);
298  __ PushSafepointRegisters();
299  __ PrepareCallCFunction(1, r2);
300  __ Move(r2, ExternalReference::isolate_address(isolate));
301  __ CallCFunction(ExternalReference::log_enter_external_function(), 1);
302  __ PopSafepointRegisters();
303  }
304 
305  // Native call returns to the DirectCEntry stub which redirects to the
306  // return address pushed on stack (could have moved after GC).
307  // DirectCEntry stub itself is generated early and never moves.
308  DirectCEntryStub stub(isolate);
309  stub.GenerateCall(masm, scratch);
310 
311  if (FLAG_log_timer_events) {
312  FrameScope frame(masm, StackFrame::MANUAL);
313  __ PushSafepointRegisters();
314  __ PrepareCallCFunction(1, r2);
315  __ Move(r2, ExternalReference::isolate_address(isolate));
316  __ CallCFunction(ExternalReference::log_leave_external_function(), 1);
317  __ PopSafepointRegisters();
318  }
319 
320  Label promote_scheduled_exception;
321  Label delete_allocated_handles;
322  Label leave_exit_frame;
323  Label return_value_loaded;
324 
325  // load value from ReturnValue
326  __ LoadP(r2, return_value_operand);
327  __ bind(&return_value_loaded);
328  // No more valid handles (the result handle was the last one). Restore
329  // previous handle scope.
330  __ StoreP(r6, MemOperand(r9, kNextOffset));
331  if (__ emit_debug_code()) {
332  __ LoadlW(r3, MemOperand(r9, kLevelOffset));
333  __ CmpP(r3, r8);
334  __ Check(eq, AbortReason::kUnexpectedLevelAfterReturnFromApiCall);
335  }
336  __ SubP(r8, Operand(1));
337  __ StoreW(r8, MemOperand(r9, kLevelOffset));
338  __ CmpP(r7, MemOperand(r9, kLimitOffset));
339  __ bne(&delete_allocated_handles, Label::kNear);
340 
341  // Leave the API exit frame.
342  __ bind(&leave_exit_frame);
343  // LeaveExitFrame expects unwind space to be in a register.
344  if (stack_space_operand != nullptr) {
345  __ l(r6, *stack_space_operand);
346  } else {
347  __ mov(r6, Operand(stack_space));
348  }
349  __ LeaveExitFrame(false, r6, stack_space_operand != nullptr);
350 
351  // Check if the function scheduled an exception.
352  __ Move(r7, ExternalReference::scheduled_exception_address(isolate));
353  __ LoadP(r7, MemOperand(r7));
354  __ CompareRoot(r7, RootIndex::kTheHoleValue);
355  __ bne(&promote_scheduled_exception, Label::kNear);
356 
357  __ b(r14);
358 
359  // Re-throw by promoting a scheduled exception.
360  __ bind(&promote_scheduled_exception);
361  __ TailCallRuntime(Runtime::kPromoteScheduledException);
362 
363  // HandleScope limit has changed. Delete allocated extensions.
364  __ bind(&delete_allocated_handles);
365  __ StoreP(r7, MemOperand(r9, kLimitOffset));
366  __ LoadRR(r6, r2);
367  __ PrepareCallCFunction(1, r7);
368  __ Move(r2, ExternalReference::isolate_address(isolate));
369  __ CallCFunction(ExternalReference::delete_handle_scope_extensions(), 1);
370  __ LoadRR(r2, r6);
371  __ b(&leave_exit_frame, Label::kNear);
372 }
373 
374 void CallApiCallbackStub::Generate(MacroAssembler* masm) {
375  // ----------- S t a t e -------------
376  // -- r6 : call_data
377  // -- r4 : holder
378  // -- r3 : api_function_address
379  // -- cp : context
380  // --
381  // -- sp[0] : last argument
382  // -- ...
383  // -- sp[(argc - 1) * 4] : first argument
384  // -- sp[argc * 4] : receiver
385  // -----------------------------------
386 
387  Register call_data = r6;
388  Register holder = r4;
389  Register api_function_address = r3;
390 
391  typedef FunctionCallbackArguments FCA;
392 
393  STATIC_ASSERT(FCA::kArgsLength == 6);
394  STATIC_ASSERT(FCA::kNewTargetIndex == 5);
395  STATIC_ASSERT(FCA::kDataIndex == 4);
396  STATIC_ASSERT(FCA::kReturnValueOffset == 3);
397  STATIC_ASSERT(FCA::kReturnValueDefaultValueIndex == 2);
398  STATIC_ASSERT(FCA::kIsolateIndex == 1);
399  STATIC_ASSERT(FCA::kHolderIndex == 0);
400 
401  // new target
402  __ PushRoot(RootIndex::kUndefinedValue);
403 
404  // call data
405  __ push(call_data);
406 
407  Register scratch = call_data;
408  __ LoadRoot(scratch, RootIndex::kUndefinedValue);
409  // return value
410  __ push(scratch);
411  // return value default
412  __ push(scratch);
413  // isolate
414  __ Move(scratch, ExternalReference::isolate_address(masm->isolate()));
415  __ push(scratch);
416  // holder
417  __ push(holder);
418 
419  // Prepare arguments.
420  __ LoadRR(scratch, sp);
421 
422  // Allocate the v8::Arguments structure in the arguments' space since
423  // it's not controlled by GC.
424  // S390 LINUX ABI:
425  //
426  // Create 4 extra slots on stack:
427  // [0] space for DirectCEntryStub's LR save
428  // [1-3] FunctionCallbackInfo
429  const int kApiStackSpace = 4;
430  const int kFunctionCallbackInfoOffset =
431  (kStackFrameExtraParamSlot + 1) * kPointerSize;
432 
433  FrameScope frame_scope(masm, StackFrame::MANUAL);
434  __ EnterExitFrame(false, kApiStackSpace);
435 
436  DCHECK(api_function_address != r2 && scratch != r2);
437  // r2 = FunctionCallbackInfo&
438  // Arguments is after the return address.
439  __ AddP(r2, sp, Operand(kFunctionCallbackInfoOffset));
440  // FunctionCallbackInfo::implicit_args_
441  __ StoreP(scratch, MemOperand(r2, 0 * kPointerSize));
442  // FunctionCallbackInfo::values_
443  __ AddP(ip, scratch, Operand((FCA::kArgsLength - 1 + argc()) * kPointerSize));
444  __ StoreP(ip, MemOperand(r2, 1 * kPointerSize));
445  // FunctionCallbackInfo::length_ = argc
446  __ LoadImmP(ip, Operand(argc()));
447  __ StoreW(ip, MemOperand(r2, 2 * kPointerSize));
448 
449  ExternalReference thunk_ref = ExternalReference::invoke_function_callback();
450 
451  AllowExternalCallThatCantCauseGC scope(masm);
452  // Stores return the first js argument
453  int return_value_offset = 2 + FCA::kReturnValueOffset;
454  MemOperand return_value_operand(fp, return_value_offset * kPointerSize);
455  const int stack_space = argc() + FCA::kArgsLength + 1;
456  MemOperand* stack_space_operand = nullptr;
457  CallApiFunctionAndReturn(masm, api_function_address, thunk_ref, stack_space,
458  stack_space_operand, return_value_operand);
459 }
460 
461 void CallApiGetterStub::Generate(MacroAssembler* masm) {
462  int arg0Slot = 0;
463  int accessorInfoSlot = 0;
464  int apiStackSpace = 0;
465  // Build v8::PropertyCallbackInfo::args_ array on the stack and push property
466  // name below the exit frame to make GC aware of them.
467  STATIC_ASSERT(PropertyCallbackArguments::kShouldThrowOnErrorIndex == 0);
468  STATIC_ASSERT(PropertyCallbackArguments::kHolderIndex == 1);
469  STATIC_ASSERT(PropertyCallbackArguments::kIsolateIndex == 2);
470  STATIC_ASSERT(PropertyCallbackArguments::kReturnValueDefaultValueIndex == 3);
471  STATIC_ASSERT(PropertyCallbackArguments::kReturnValueOffset == 4);
472  STATIC_ASSERT(PropertyCallbackArguments::kDataIndex == 5);
473  STATIC_ASSERT(PropertyCallbackArguments::kThisIndex == 6);
474  STATIC_ASSERT(PropertyCallbackArguments::kArgsLength == 7);
475 
476  Register receiver = ApiGetterDescriptor::ReceiverRegister();
477  Register holder = ApiGetterDescriptor::HolderRegister();
478  Register callback = ApiGetterDescriptor::CallbackRegister();
479  Register scratch = r6;
480  DCHECK(!AreAliased(receiver, holder, callback, scratch));
481 
482  Register api_function_address = r4;
483 
484  __ push(receiver);
485  // Push data from AccessorInfo.
486  __ LoadP(scratch, FieldMemOperand(callback, AccessorInfo::kDataOffset));
487  __ push(scratch);
488  __ LoadRoot(scratch, RootIndex::kUndefinedValue);
489  __ Push(scratch, scratch);
490  __ Move(scratch, ExternalReference::isolate_address(isolate()));
491  __ Push(scratch, holder);
492  __ Push(Smi::zero()); // should_throw_on_error -> false
493  __ LoadP(scratch, FieldMemOperand(callback, AccessorInfo::kNameOffset));
494  __ push(scratch);
495 
496  // v8::PropertyCallbackInfo::args_ array and name handle.
497  const int kStackUnwindSpace = PropertyCallbackArguments::kArgsLength + 1;
498 
499  // Load address of v8::PropertyAccessorInfo::args_ array and name handle.
500  __ LoadRR(r2, sp); // r2 = Handle<Name>
501  __ AddP(r3, r2, Operand(1 * kPointerSize)); // r3 = v8::PCI::args_
502 
503  // If ABI passes Handles (pointer-sized struct) in a register:
504  //
505  // Create 2 extra slots on stack:
506  // [0] space for DirectCEntryStub's LR save
507  // [1] AccessorInfo&
508  //
509  // Otherwise:
510  //
511  // Create 3 extra slots on stack:
512  // [0] space for DirectCEntryStub's LR save
513  // [1] copy of Handle (first arg)
514  // [2] AccessorInfo&
515  if (ABI_PASSES_HANDLES_IN_REGS) {
516  accessorInfoSlot = kStackFrameExtraParamSlot + 1;
517  apiStackSpace = 2;
518  } else {
519  arg0Slot = kStackFrameExtraParamSlot + 1;
520  accessorInfoSlot = arg0Slot + 1;
521  apiStackSpace = 3;
522  }
523 
524  FrameScope frame_scope(masm, StackFrame::MANUAL);
525  __ EnterExitFrame(false, apiStackSpace);
526 
527  if (!ABI_PASSES_HANDLES_IN_REGS) {
528  // pass 1st arg by reference
529  __ StoreP(r2, MemOperand(sp, arg0Slot * kPointerSize));
530  __ AddP(r2, sp, Operand(arg0Slot * kPointerSize));
531  }
532 
533  // Create v8::PropertyCallbackInfo object on the stack and initialize
534  // it's args_ field.
535  __ StoreP(r3, MemOperand(sp, accessorInfoSlot * kPointerSize));
536  __ AddP(r3, sp, Operand(accessorInfoSlot * kPointerSize));
537  // r3 = v8::PropertyCallbackInfo&
538 
539  ExternalReference thunk_ref =
540  ExternalReference::invoke_accessor_getter_callback();
541 
542  __ LoadP(scratch, FieldMemOperand(callback, AccessorInfo::kJsGetterOffset));
543  __ LoadP(api_function_address,
544  FieldMemOperand(scratch, Foreign::kForeignAddressOffset));
545 
546  // +3 is to skip prolog, return address and name handle.
547  MemOperand return_value_operand(
548  fp, (PropertyCallbackArguments::kReturnValueOffset + 3) * kPointerSize);
549  CallApiFunctionAndReturn(masm, api_function_address, thunk_ref,
550  kStackUnwindSpace, nullptr, return_value_operand);
551 }
552 
553 #undef __
554 
555 } // namespace internal
556 } // namespace v8
557 
558 #endif // V8_TARGET_ARCH_S390
STL namespace.
Definition: libplatform.h:13