| %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} |