133 lines
3.6 KiB
ArmAsm
133 lines
3.6 KiB
ArmAsm
%def header():
|
|
/*
|
|
* Copyright (C) 2023 The Android Open Source Project
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
/*
|
|
* This is a #include, not a %include, because we want the C pre-processor
|
|
* to expand the macros into assembler assignment statements.
|
|
*/
|
|
#include "asm_support.h"
|
|
#include "arch/riscv64/asm_support_riscv64.S"
|
|
|
|
// An assembly entry that has a OatQuickMethodHeader prefix.
|
|
.macro OAT_ENTRY name, end
|
|
.type \name, @function
|
|
.hidden \name
|
|
.global \name
|
|
.balign 16
|
|
// Padding of 3 * 4 bytes to get 16 bytes alignment of code entry.
|
|
.4byte 0, 0, 0
|
|
// OatQuickMethodHeader `data_` field. Note that the top two bits must be clear.
|
|
.4byte (\end - \name)
|
|
\name:
|
|
.endm
|
|
|
|
.macro SIZE name
|
|
.size \name, .-\name
|
|
.endm
|
|
|
|
// Similar to ENTRY but without the CFI directives.
|
|
.macro NAME_START name
|
|
.type \name, @function
|
|
.hidden \name // Hide this as a global symbol, so we do not incur plt calls.
|
|
.global \name
|
|
/* XXX Cache alignment for function entry */
|
|
.balign 16
|
|
\name:
|
|
.endm
|
|
|
|
.macro NAME_END name
|
|
SIZE \name
|
|
.endm
|
|
|
|
%def entry():
|
|
/*
|
|
* ArtMethod entry point.
|
|
*
|
|
* On entry:
|
|
* XXX ArtMethod* callee
|
|
* rest method parameters
|
|
*/
|
|
|
|
OAT_ENTRY ExecuteNterpWithClinitImpl, EndExecuteNterpWithClinitImpl
|
|
// For simplicity, we don't do a read barrier here, but instead rely
|
|
// on art_quick_resolution_trampoline to always have a suspend point before
|
|
// calling back here.
|
|
unimp
|
|
EndExecuteNterpWithClinitImpl:
|
|
|
|
OAT_ENTRY ExecuteNterpImpl, EndExecuteNterpImpl
|
|
.cfi_startproc
|
|
unimp
|
|
|
|
%def fetch_from_thread_cache(dest_reg, miss_label):
|
|
|
|
%def footer():
|
|
/*
|
|
* ===========================================================================
|
|
* Common subroutines and data
|
|
* ===========================================================================
|
|
*/
|
|
|
|
.text
|
|
.align 2
|
|
|
|
|
|
// Enclose all code below in a symbol (which gets printed in backtraces).
|
|
NAME_START nterp_helper
|
|
// This is the logical end of ExecuteNterpImpl, where the frame info applies.
|
|
// EndExecuteNterpImpl includes the methods below as we want the runtime to
|
|
// see them as part of the Nterp PCs.
|
|
.cfi_endproc
|
|
NAME_END nterp_helper
|
|
|
|
// This is the end of PCs contained by the OatQuickMethodHeader created for the interpreter
|
|
// entry point.
|
|
.type EndExecuteNterpImpl, @function
|
|
.hidden EndExecuteNterpImpl
|
|
.global EndExecuteNterpImpl
|
|
EndExecuteNterpImpl:
|
|
|
|
// gen_mterp.py will inline the following definitions
|
|
// within [ExecuteNterpImpl, EndExecuteNterpImpl).
|
|
%def instruction_start():
|
|
.type artNterpAsmInstructionStart, @function
|
|
.hidden artNterpAsmInstructionStart
|
|
.global artNterpAsmInstructionStart
|
|
artNterpAsmInstructionStart = .L_op_nop
|
|
.text
|
|
|
|
%def instruction_end():
|
|
.type artNterpAsmInstructionEnd, @function
|
|
.hidden artNterpAsmInstructionEnd
|
|
.global artNterpAsmInstructionEnd
|
|
artNterpAsmInstructionEnd:
|
|
unimp
|
|
|
|
%def opcode_pre():
|
|
% pass
|
|
%def opcode_name_prefix():
|
|
% return "nterp_"
|
|
%def opcode_start():
|
|
NAME_START nterp_${opcode}
|
|
%def opcode_end():
|
|
NAME_END nterp_${opcode}
|
|
unimp
|
|
%def opcode_slow_path_start(name):
|
|
NAME_START ${name}
|
|
%def opcode_slow_path_end(name):
|
|
NAME_END ${name}
|