Monero
jit_compiler_a64.hpp
Go to the documentation of this file.
1 /*
2 Copyright (c) 2018-2019, tevador <tevador@gmail.com>
3 Copyright (c) 2019, SChernykh <https://github.com/SChernykh>
4 
5 All rights reserved.
6 
7 Redistribution and use in source and binary forms, with or without
8 modification, are permitted provided that the following conditions are met:
9  * Redistributions of source code must retain the above copyright
10  notice, this list of conditions and the following disclaimer.
11  * Redistributions in binary form must reproduce the above copyright
12  notice, this list of conditions and the following disclaimer in the
13  documentation and/or other materials provided with the distribution.
14  * Neither the name of the copyright holder nor the
15  names of its contributors may be used to endorse or promote products
16  derived from this software without specific prior written permission.
17 
18 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
19 ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
20 WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
21 DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
22 FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23 DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
24 SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
25 CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
26 OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27 OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 */
29 
30 #pragma once
31 
32 #include <cstdint>
33 #include <vector>
34 #include <stdexcept>
35 #include "common.hpp"
37 
38 namespace randomx {
39 
40  class Program;
41  struct ProgramConfiguration;
42  class SuperscalarProgram;
43  class Instruction;
44 
46 
48  public:
51 
54 
55  template<size_t N>
56  void generateSuperscalarHash(SuperscalarProgram(&programs)[N], std::vector<uint64_t> &);
57 
59 
60  ProgramFunc* getProgramFunc() { return reinterpret_cast<ProgramFunc*>(code); }
62  uint8_t* getCode() { return code; }
63  size_t getCodeSize();
64 
65  void enableWriting();
66  void enableExecution();
67  void enableAll();
68 
69  private:
75 
76  static void emit32(uint32_t val, uint8_t* code, uint32_t& codePos)
77  {
78  *(uint32_t*)(code + codePos) = val;
79  codePos += sizeof(val);
80  }
81 
82  static void emit64(uint64_t val, uint8_t* code, uint32_t& codePos)
83  {
84  memcpy(code + codePos, &val, sizeof(val));
85  codePos += sizeof(val);
86  }
87 
88  void emitMovImmediate(uint32_t dst, uint32_t imm, uint8_t* code, uint32_t& codePos);
89  void emitAddImmediate(uint32_t dst, uint32_t src, uint32_t imm, uint8_t* code, uint32_t& codePos);
90 
91  template<uint32_t tmp_reg>
92  void emitMemLoad(uint32_t dst, uint32_t src, Instruction& instr, uint8_t* code, uint32_t& codePos);
93 
94  template<uint32_t tmp_reg_fp>
95  void emitMemLoadFP(uint32_t src, Instruction& instr, uint8_t* code, uint32_t& codePos);
96 
98  void h_IADD_M(Instruction&, uint32_t&);
99  void h_ISUB_R(Instruction&, uint32_t&);
100  void h_ISUB_M(Instruction&, uint32_t&);
101  void h_IMUL_R(Instruction&, uint32_t&);
102  void h_IMUL_M(Instruction&, uint32_t&);
103  void h_IMULH_R(Instruction&, uint32_t&);
104  void h_IMULH_M(Instruction&, uint32_t&);
108  void h_INEG_R(Instruction&, uint32_t&);
109  void h_IXOR_R(Instruction&, uint32_t&);
110  void h_IXOR_M(Instruction&, uint32_t&);
111  void h_IROR_R(Instruction&, uint32_t&);
112  void h_IROL_R(Instruction&, uint32_t&);
113  void h_ISWAP_R(Instruction&, uint32_t&);
114  void h_FSWAP_R(Instruction&, uint32_t&);
115  void h_FADD_R(Instruction&, uint32_t&);
116  void h_FADD_M(Instruction&, uint32_t&);
117  void h_FSUB_R(Instruction&, uint32_t&);
118  void h_FSUB_M(Instruction&, uint32_t&);
119  void h_FSCAL_R(Instruction&, uint32_t&);
120  void h_FMUL_R(Instruction&, uint32_t&);
121  void h_FDIV_M(Instruction&, uint32_t&);
122  void h_FSQRT_R(Instruction&, uint32_t&);
123  void h_CBRANCH(Instruction&, uint32_t&);
124  void h_CFROUND(Instruction&, uint32_t&);
125  void h_ISTORE(Instruction&, uint32_t&);
126  void h_NOP(Instruction&, uint32_t&);
127  };
128 }
void generateDatasetInitCode()
Definition: jit_compiler_a64.hpp:58
uint32_t num32bitLiterals
Definition: jit_compiler_a64.hpp:74
Definition: allocator.cpp:35
void() ProgramFunc(RegisterFile &, MemoryRegisters &, uint8_t *, uint64_t)
Definition: common.hpp:188
void() DatasetInitFunc(randomx_cache *cache, uint8_t *dataset, uint32_t startBlock, uint32_t endBlock)
Definition: common.hpp:189
void h_IXOR_R(Instruction &, uint32_t &)
Definition: jit_compiler_a64.cpp:735
void generateSuperscalarHash(SuperscalarProgram(&programs)[N], std::vector< uint64_t > &)
Definition: jit_compiler_a64.cpp:235
static void emit32(uint32_t val, uint8_t *code, uint32_t &codePos)
Definition: jit_compiler_a64.hpp:76
void generateProgram(Program &, ProgramConfiguration &)
Definition: jit_compiler_a64.cpp:126
void h_INEG_R(Instruction &, uint32_t &)
Definition: jit_compiler_a64.cpp:725
void h_ISTORE(Instruction &, uint32_t &)
Definition: jit_compiler_a64.cpp:995
void h_IADD_RS(Instruction &, uint32_t &)
Definition: jit_compiler_a64.cpp:515
void h_FSUB_M(Instruction &, uint32_t &)
Definition: jit_compiler_a64.cpp:886
Definition: instruction.hpp:75
Definition: superscalar_program.hpp:37
void h_ISMULH_R(Instruction &, uint32_t &)
Definition: jit_compiler_a64.cpp:656
void h_IMULH_R(Instruction &, uint32_t &)
Definition: jit_compiler_a64.cpp:625
void emitMovImmediate(uint32_t dst, uint32_t imm, uint8_t *code, uint32_t &codePos)
Definition: jit_compiler_a64.cpp:364
JitCompilerA64()
Definition: jit_compiler_a64.cpp:91
void h_IMUL_RCP(Instruction &, uint32_t &)
Definition: jit_compiler_a64.cpp:687
void emitMemLoad(uint32_t dst, uint32_t src, Instruction &instr, uint8_t *code, uint32_t &codePos)
Definition: jit_compiler_a64.cpp:448
uint32_t reg_changed_offset[8]
Definition: jit_compiler_a64.hpp:71
unsigned char uint8_t
Definition: stdint.h:124
uint8_t * code
Definition: jit_compiler_a64.hpp:72
static InstructionGeneratorA64 engine[256]
Definition: jit_compiler_a64.hpp:70
Definition: program.hpp:39
void h_FDIV_M(Instruction &, uint32_t &)
Definition: jit_compiler_a64.cpp:916
unsigned int uint32_t
Definition: stdint.h:126
void h_FMUL_R(Instruction &, uint32_t &)
Definition: jit_compiler_a64.cpp:908
void h_FADD_M(Instruction &, uint32_t &)
Definition: jit_compiler_a64.cpp:863
void h_IMUL_M(Instruction &, uint32_t &)
Definition: jit_compiler_a64.cpp:608
Definition: program.hpp:44
void h_ISUB_M(Instruction &, uint32_t &)
Definition: jit_compiler_a64.cpp:571
unsigned __int64 uint64_t
Definition: stdint.h:136
void enableAll()
Definition: jit_compiler_a64.cpp:121
void h_FSWAP_R(Instruction &, uint32_t &)
Definition: jit_compiler_a64.cpp:838
void h_CFROUND(Instruction &, uint32_t &)
Definition: jit_compiler_a64.cpp:971
~JitCompilerA64()
Definition: jit_compiler_a64.cpp:106
void h_IXOR_M(Instruction &, uint32_t &)
Definition: jit_compiler_a64.cpp:755
uint32_t literalPos
Definition: jit_compiler_a64.hpp:73
void h_IADD_M(Instruction &, uint32_t &)
Definition: jit_compiler_a64.cpp:533
void h_FSQRT_R(Instruction &, uint32_t &)
Definition: jit_compiler_a64.cpp:937
void h_IMULH_M(Instruction &, uint32_t &)
Definition: jit_compiler_a64.cpp:639
void h_IROR_R(Instruction &, uint32_t &)
Definition: jit_compiler_a64.cpp:772
Definition: jit_compiler_a64.hpp:47
void enableWriting()
Definition: jit_compiler_a64.cpp:111
void h_ISMULH_M(Instruction &, uint32_t &)
Definition: jit_compiler_a64.cpp:670
DatasetInitFunc * getDatasetInitFunc()
Definition: jit_compiler_a64.cpp:354
uint8_t * getCode()
Definition: jit_compiler_a64.hpp:62
size_t getCodeSize()
Definition: jit_compiler_a64.cpp:359
void(JitCompilerA64::* InstructionGeneratorA64)(Instruction &, uint32_t &)
Definition: jit_compiler_a64.hpp:45
void h_CBRANCH(Instruction &, uint32_t &)
Definition: jit_compiler_a64.cpp:944
void * memcpy(void *a, const void *b, size_t c)
Definition: glibc_compat.cpp:16
void generateProgramLight(Program &, ProgramConfiguration &, uint32_t)
Definition: jit_compiler_a64.cpp:177
void enableExecution()
Definition: jit_compiler_a64.cpp:116
void h_FSCAL_R(Instruction &, uint32_t &)
Definition: jit_compiler_a64.cpp:901
void h_FADD_R(Instruction &, uint32_t &)
Definition: jit_compiler_a64.cpp:855
void emitMemLoadFP(uint32_t src, Instruction &instr, uint8_t *code, uint32_t &codePos)
Definition: jit_compiler_a64.cpp:481
static void emit64(uint64_t val, uint8_t *code, uint32_t &codePos)
Definition: jit_compiler_a64.hpp:82
void h_ISUB_R(Instruction &, uint32_t &)
Definition: jit_compiler_a64.cpp:550
ProgramFunc * getProgramFunc()
Definition: jit_compiler_a64.hpp:60
void h_NOP(Instruction &, uint32_t &)
Definition: jit_compiler_a64.cpp:1025
void h_IROL_R(Instruction &, uint32_t &)
Definition: jit_compiler_a64.cpp:791
void emitAddImmediate(uint32_t dst, uint32_t src, uint32_t imm, uint8_t *code, uint32_t &codePos)
Definition: jit_compiler_a64.cpp:412
void h_FSUB_R(Instruction &, uint32_t &)
Definition: jit_compiler_a64.cpp:878
void h_IMUL_R(Instruction &, uint32_t &)
Definition: jit_compiler_a64.cpp:588
void h_ISWAP_R(Instruction &, uint32_t &)
Definition: jit_compiler_a64.cpp:818