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