Register-riscv64.h (9205B)
1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- 2 * vim: set ts=8 sts=2 et sw=2 tw=80: 3 * This Source Code Form is subject to the terms of the Mozilla Public 4 * License, v. 2.0. If a copy of the MPL was not distributed with this 5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 6 7 #ifndef jit_riscv64_Register_riscv64_h 8 #define jit_riscv64_Register_riscv64_h 9 10 #include <stdint.h> 11 12 #include "jit/Registers.h" 13 #include "jit/RegisterSets.h" 14 15 namespace js { 16 namespace jit { 17 18 static constexpr Register zero{Registers::zero}; 19 static constexpr Register ra{Registers::ra}; 20 static constexpr Register tp{Registers::tp}; 21 static constexpr Register sp{Registers::sp}; 22 static constexpr Register gp{Registers::gp}; 23 static constexpr Register a0{Registers::a0}; 24 static constexpr Register a1{Registers::a1}; 25 static constexpr Register a2{Registers::a2}; 26 static constexpr Register a3{Registers::a3}; 27 static constexpr Register a4{Registers::a4}; 28 static constexpr Register a5{Registers::a5}; 29 static constexpr Register a6{Registers::a6}; 30 static constexpr Register a7{Registers::a7}; 31 static constexpr Register t0{Registers::t0}; 32 static constexpr Register t1{Registers::t1}; 33 static constexpr Register t2{Registers::t2}; 34 static constexpr Register t3{Registers::t3}; 35 static constexpr Register t4{Registers::t4}; 36 static constexpr Register t5{Registers::t5}; 37 static constexpr Register t6{Registers::t6}; 38 static constexpr Register fp{Registers::fp}; 39 static constexpr Register s1{Registers::s1}; 40 static constexpr Register s2{Registers::s2}; 41 static constexpr Register s3{Registers::s3}; 42 static constexpr Register s4{Registers::s4}; 43 static constexpr Register s5{Registers::s5}; 44 static constexpr Register s6{Registers::s6}; 45 static constexpr Register s7{Registers::s7}; 46 static constexpr Register s8{Registers::s8}; 47 static constexpr Register s9{Registers::s9}; 48 static constexpr Register s10{Registers::s10}; 49 static constexpr Register s11{Registers::s11}; 50 51 static constexpr FloatRegister ft0{FloatRegisters::f0}; 52 static constexpr FloatRegister ft1{FloatRegisters::f1}; 53 static constexpr FloatRegister ft2{FloatRegisters::f2}; 54 static constexpr FloatRegister ft3{FloatRegisters::f3}; 55 static constexpr FloatRegister ft4{FloatRegisters::f4}; 56 static constexpr FloatRegister ft5{FloatRegisters::f5}; 57 static constexpr FloatRegister ft6{FloatRegisters::f6}; 58 static constexpr FloatRegister ft7{FloatRegisters::f7}; 59 static constexpr FloatRegister fs0{FloatRegisters::f8}; 60 static constexpr FloatRegister fs1{FloatRegisters::f9}; 61 static constexpr FloatRegister fa0{FloatRegisters::f10}; 62 static constexpr FloatRegister fa1{FloatRegisters::f11}; 63 static constexpr FloatRegister fa2{FloatRegisters::f12}; 64 static constexpr FloatRegister fa3{FloatRegisters::f13}; 65 static constexpr FloatRegister fa4{FloatRegisters::f14}; 66 static constexpr FloatRegister fa5{FloatRegisters::f15}; 67 static constexpr FloatRegister fa6{FloatRegisters::f16}; 68 static constexpr FloatRegister fa7{FloatRegisters::f17}; 69 static constexpr FloatRegister fs2{FloatRegisters::f18}; 70 static constexpr FloatRegister fs3{FloatRegisters::f19}; 71 static constexpr FloatRegister fs4{FloatRegisters::f20}; 72 static constexpr FloatRegister fs5{FloatRegisters::f21}; 73 static constexpr FloatRegister fs6{FloatRegisters::f22}; 74 static constexpr FloatRegister fs7{FloatRegisters::f23}; 75 static constexpr FloatRegister fs8{FloatRegisters::f24}; 76 static constexpr FloatRegister fs9{FloatRegisters::f25}; 77 static constexpr FloatRegister fs10{FloatRegisters::f26}; 78 static constexpr FloatRegister fs11{FloatRegisters::f27}; 79 static constexpr FloatRegister ft8{FloatRegisters::f28}; 80 static constexpr FloatRegister ft9{FloatRegisters::f29}; 81 static constexpr FloatRegister ft10{FloatRegisters::f30}; 82 static constexpr FloatRegister ft11{FloatRegisters::f31}; 83 84 static constexpr Register StackPointer{Registers::sp}; 85 static constexpr Register FramePointer{Registers::fp}; 86 static constexpr Register ReturnReg{Registers::a0}; 87 // Scratch register used for runtime call patching. 88 // See MacroAssembler::patchNopToCall and MacroAssembler::PatchWrite_NearCall. 89 static constexpr Register SavedScratchRegister{Registers::s11}; 90 static constexpr Register64 ReturnReg64(ReturnReg); 91 92 static constexpr FloatRegister ReturnFloat32Reg{FloatRegisters::fa0, 93 FloatRegisters::Single}; 94 static constexpr FloatRegister ReturnDoubleReg{FloatRegisters::fa0}; 95 #ifdef ENABLE_WASM_SIMD 96 static constexpr FloatRegister ReturnSimd128Reg{FloatRegisters::invalid_reg}; 97 static constexpr FloatRegister ScratchSimd128Reg{FloatRegisters::invalid_reg}; 98 #endif 99 static constexpr FloatRegister InvalidFloatReg{}; 100 101 static constexpr FloatRegister ScratchFloat32Reg{FloatRegisters::ft10, 102 FloatRegisters::Single}; 103 static constexpr FloatRegister ScratchDoubleReg{FloatRegisters::ft10}; 104 105 static constexpr FloatRegister ScratchFloat32Reg2{FloatRegisters::fs11, 106 FloatRegisters::Single}; 107 static constexpr FloatRegister ScratchDoubleReg2{FloatRegisters::fs11}; 108 109 static constexpr Register OsrFrameReg{Registers::a3}; 110 static constexpr Register PreBarrierReg{Registers::a1}; 111 static constexpr Register InterpreterPCReg{Registers::t0}; 112 static constexpr Register CallTempReg0{Registers::t0}; 113 static constexpr Register CallTempReg1{Registers::t1}; 114 static constexpr Register CallTempReg2{Registers::t2}; 115 static constexpr Register CallTempReg3{Registers::t3}; 116 static constexpr Register CallTempReg4{Registers::a6}; 117 static constexpr Register CallTempReg5{Registers::a7}; 118 static constexpr Register InvalidReg{Registers::invalid_reg}; 119 static constexpr Register CallTempNonArgRegs[] = {t0, t1, t2, t3}; 120 static const uint32_t NumCallTempNonArgRegs = std::size(CallTempNonArgRegs); 121 122 static constexpr Register IntArgReg0{Registers::a0}; 123 static constexpr Register IntArgReg1{Registers::a1}; 124 static constexpr Register IntArgReg2{Registers::a2}; 125 static constexpr Register IntArgReg3{Registers::a3}; 126 static constexpr Register IntArgReg4{Registers::a4}; 127 static constexpr Register IntArgReg5{Registers::a5}; 128 static constexpr Register IntArgReg6{Registers::a6}; 129 static constexpr Register IntArgReg7{Registers::a7}; 130 131 // Registers used by RegExpMatcher and RegExpExecMatch stubs (do not use 132 // JSReturnOperand). 133 static constexpr Register RegExpMatcherRegExpReg = CallTempReg0; 134 static constexpr Register RegExpMatcherStringReg = CallTempReg1; 135 static constexpr Register RegExpMatcherLastIndexReg = CallTempReg2; 136 137 // Registers used by RegExpExecTest stub (do not use ReturnReg). 138 static constexpr Register RegExpExecTestRegExpReg = CallTempReg0; 139 static constexpr Register RegExpExecTestStringReg = CallTempReg1; 140 141 // Registers used by RegExpSearcher stub (do not use ReturnReg). 142 static constexpr Register RegExpSearcherRegExpReg = CallTempReg0; 143 static constexpr Register RegExpSearcherStringReg = CallTempReg1; 144 static constexpr Register RegExpSearcherLastIndexReg = CallTempReg2; 145 146 static constexpr Register JSReturnReg_Type{Registers::a3}; 147 static constexpr Register JSReturnReg_Data{Registers::s2}; 148 static constexpr Register JSReturnReg{Registers::a2}; 149 static constexpr ValueOperand JSReturnOperand = ValueOperand(JSReturnReg); 150 151 // See "ABI special registers" in Assembler-shared.h for more information. 152 static constexpr Register ABINonArgReg0{Registers::t0}; 153 static constexpr Register ABINonArgReg1{Registers::t1}; 154 static constexpr Register ABINonArgReg2{Registers::t2}; 155 static constexpr Register ABINonArgReg3{Registers::t3}; 156 157 // See "ABI special registers" in Assembler-shared.h for more information. 158 static constexpr Register ABINonArgReturnReg0{Registers::t0}; 159 static constexpr Register ABINonArgReturnReg1{Registers::t1}; 160 static constexpr Register ABINonVolatileReg{Registers::s1}; 161 162 // See "ABI special registers" in Assembler-shared.h for more information. 163 static constexpr Register ABINonArgReturnVolatileReg{Registers::t0}; 164 165 // See "ABI special registers" in Assembler-shared.h for more information. 166 // Avoid ft11 which is the scratch register. 167 static constexpr FloatRegister ABINonArgDoubleReg{FloatRegisters::ft11}; 168 169 static constexpr Register WasmTableCallScratchReg0{ABINonArgReg0}; 170 static constexpr Register WasmTableCallScratchReg1{ABINonArgReg1}; 171 static constexpr Register WasmTableCallSigReg{ABINonArgReg2}; 172 static constexpr Register WasmTableCallIndexReg{ABINonArgReg3}; 173 174 // See "ABI special registers" in Assembler-shared.h, and "The WASM ABIs" in 175 // WasmFrame.h for more information. 176 static constexpr Register InstanceReg{Registers::s4}; 177 static constexpr Register HeapReg{Registers::s7}; 178 179 static constexpr Register WasmJitEntryReturnScratch{Registers::t1}; 180 181 static constexpr Register WasmCallRefCallScratchReg0{ABINonArgReg0}; 182 static constexpr Register WasmCallRefCallScratchReg1{ABINonArgReg1}; 183 static constexpr Register WasmCallRefCallScratchReg2{ABINonArgReg2}; 184 static constexpr Register WasmCallRefReg{ABINonArgReg3}; 185 186 static constexpr Register WasmTailCallInstanceScratchReg{ABINonArgReg1}; 187 static constexpr Register WasmTailCallRAScratchReg{ra}; 188 static constexpr Register WasmTailCallFPScratchReg{ABINonArgReg3}; 189 190 } // namespace jit 191 } // namespace js 192 193 #endif // jit_riscv64_Register_riscv64_h