1%def header(): 2/* 3 * Copyright (C) 2023 The Android Open Source Project 4 * 5 * Licensed under the Apache License, Version 2.0 (the "License"); 6 * you may not use this file except in compliance with the License. 7 * You may obtain a copy of the License at 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 */ 17 18/* 19 * This is a #include, not a %include, because we want the C pre-processor 20 * to expand the macros into assembler assignment statements. 21 */ 22#include "asm_support.h" 23#include "arch/riscv64/asm_support_riscv64.S" 24 25// An assembly entry that has a OatQuickMethodHeader prefix. 26.macro OAT_ENTRY name, end 27 .type \name, @function 28 .hidden \name 29 .global \name 30 .balign 16 31 // Padding of 3 * 4 bytes to get 16 bytes alignment of code entry. 32 .4byte 0, 0, 0 33 // OatQuickMethodHeader `data_` field. Note that the top two bits must be clear. 34 .4byte (\end - \name) 35\name: 36.endm 37 38.macro SIZE name 39 .size \name, .-\name 40.endm 41 42// Similar to ENTRY but without the CFI directives. 43.macro NAME_START name 44 .type \name, @function 45 .hidden \name // Hide this as a global symbol, so we do not incur plt calls. 46 .global \name 47 /* XXX Cache alignment for function entry */ 48 .balign 16 49\name: 50.endm 51 52.macro NAME_END name 53 SIZE \name 54.endm 55 56%def entry(): 57/* 58 * ArtMethod entry point. 59 * 60 * On entry: 61 * XXX ArtMethod* callee 62 * rest method parameters 63 */ 64 65OAT_ENTRY ExecuteNterpWithClinitImpl, EndExecuteNterpWithClinitImpl 66 // For simplicity, we don't do a read barrier here, but instead rely 67 // on art_quick_resolution_trampoline to always have a suspend point before 68 // calling back here. 69 unimp 70EndExecuteNterpWithClinitImpl: 71 72OAT_ENTRY ExecuteNterpImpl, EndExecuteNterpImpl 73 .cfi_startproc 74 unimp 75 76%def fetch_from_thread_cache(dest_reg, miss_label): 77 78%def footer(): 79/* 80 * =========================================================================== 81 * Common subroutines and data 82 * =========================================================================== 83 */ 84 85 .text 86 .align 2 87 88 89// Enclose all code below in a symbol (which gets printed in backtraces). 90NAME_START nterp_helper 91// This is the logical end of ExecuteNterpImpl, where the frame info applies. 92// EndExecuteNterpImpl includes the methods below as we want the runtime to 93// see them as part of the Nterp PCs. 94.cfi_endproc 95NAME_END nterp_helper 96 97// This is the end of PCs contained by the OatQuickMethodHeader created for the interpreter 98// entry point. 99 .type EndExecuteNterpImpl, @function 100 .hidden EndExecuteNterpImpl 101 .global EndExecuteNterpImpl 102EndExecuteNterpImpl: 103 104// gen_mterp.py will inline the following definitions 105// within [ExecuteNterpImpl, EndExecuteNterpImpl). 106%def instruction_start(): 107 .type artNterpAsmInstructionStart, @function 108 .hidden artNterpAsmInstructionStart 109 .global artNterpAsmInstructionStart 110artNterpAsmInstructionStart = .L_op_nop 111 .text 112 113%def instruction_end(): 114 .type artNterpAsmInstructionEnd, @function 115 .hidden artNterpAsmInstructionEnd 116 .global artNterpAsmInstructionEnd 117artNterpAsmInstructionEnd: 118 unimp 119 120%def opcode_pre(): 121% pass 122%def opcode_name_prefix(): 123% return "nterp_" 124%def opcode_start(): 125 NAME_START nterp_${opcode} 126%def opcode_end(): 127 NAME_END nterp_${opcode} 128 unimp 129%def opcode_slow_path_start(name): 130 NAME_START ${name} 131%def opcode_slow_path_end(name): 132 NAME_END ${name} 133