1 /* 2 * Copyright (C) 2024 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 // Assembler to produce RV32 instructions (EABI version). Somewhat influenced by V8 assembler. 18 19 #ifndef BERBERIS_ASSEMBLER_RV32E_H_ 20 #define BERBERIS_ASSEMBLER_RV32E_H_ 21 22 #include <type_traits> // std::is_same 23 24 #include "berberis/assembler/rv32.h" 25 26 namespace berberis::rv32e { 27 28 class Assembler : public ::berberis::rv32::Assembler { 29 public: 30 using BaseAssembler = riscv::Assembler<::berberis::rv32::Assembler>; 31 using FinalAssembler = berberis::rv32::Assembler; 32 Assembler(MachineCode * code)33 explicit Assembler(MachineCode* code) : berberis::rv32::Assembler(code) {} 34 35 // Registers available used on “small” CPUs (with 16 general purpose registers) and “big” CPUs (32 36 // general purpose registers). 37 static constexpr Register ra{1}; 38 static constexpr Register sp{2}; 39 static constexpr Register gp{3}; 40 static constexpr Register tp{4}; 41 static constexpr Register t0{5}; 42 static constexpr Register s3{6}; 43 static constexpr Register s4{7}; 44 static constexpr Register s0{8}; 45 static constexpr Register s1{9}; 46 static constexpr Register a0{10}; 47 static constexpr Register a1{11}; 48 static constexpr Register a2{12}; 49 static constexpr Register a3{13}; 50 static constexpr Register s2{14}; 51 static constexpr Register t1{15}; 52 53 // Register only available on “big” CPUs (with 32 gneral purpose registers). 54 static constexpr Register s5{16}; 55 static constexpr Register s6{17}; 56 static constexpr Register s7{18}; 57 static constexpr Register s8{19}; 58 static constexpr Register s9{20}; 59 static constexpr Register s10{21}; 60 static constexpr Register s11{22}; 61 static constexpr Register s12{23}; 62 static constexpr Register s13{24}; 63 static constexpr Register s14{25}; 64 static constexpr Register s15{26}; 65 static constexpr Register s16{27}; 66 static constexpr Register s17{28}; 67 static constexpr Register s18{29}; 68 static constexpr Register s19{30}; 69 static constexpr Register s20{31}; 70 71 private: 72 Assembler() = delete; 73 Assembler(const Assembler&) = delete; 74 Assembler(Assembler&&) = delete; 75 void operator=(const Assembler&) = delete; 76 void operator=(Assembler&&) = delete; 77 }; 78 79 } // namespace berberis::rv32e 80 81 #endif // BERBERIS_ASSEMBLER_RV32E_H_ 82