tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

CodeGenerator-riscv64.h (4964B)


      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_CodeGenerator_riscv64_h
      8 #define jit_riscv64_CodeGenerator_riscv64_h
      9 
     10 #include "jit/riscv64/Assembler-riscv64.h"
     11 #include "jit/riscv64/MacroAssembler-riscv64.h"
     12 #include "jit/shared/CodeGenerator-shared.h"
     13 
     14 namespace js {
     15 namespace jit {
     16 
     17 class CodeGeneratorRiscv64;
     18 class OutOfLineTableSwitch;
     19 
     20 using OutOfLineWasmTruncateCheck =
     21    OutOfLineWasmTruncateCheckBase<CodeGeneratorRiscv64>;
     22 
     23 class CodeGeneratorRiscv64 : public CodeGeneratorShared {
     24  friend class MoveResolverLA;
     25 
     26 protected:
     27  CodeGeneratorRiscv64(MIRGenerator* gen, LIRGraph* graph, MacroAssembler* masm,
     28                       const wasm::CodeMetadata* wasmCodeMeta);
     29 
     30  NonAssertingLabel deoptLabel_;
     31 
     32  Operand ToOperand(const LAllocation& a);
     33  Operand ToOperand(const LAllocation* a);
     34  Operand ToOperand(const LDefinition* def);
     35 
     36  MoveOperand toMoveOperand(LAllocation a) const;
     37 
     38  template <typename T1, typename T2>
     39  void bailoutCmp32(Assembler::Condition c, T1 lhs, T2 rhs,
     40                    LSnapshot* snapshot) {
     41    Label bail;
     42    masm.branch32(c, lhs, rhs, &bail);
     43    bailoutFrom(&bail, snapshot);
     44  }
     45  template <typename T1, typename T2>
     46  void bailoutTest32(Assembler::Condition c, T1 lhs, T2 rhs,
     47                     LSnapshot* snapshot) {
     48    Label bail;
     49    masm.branchTest32(c, lhs, rhs, &bail);
     50    bailoutFrom(&bail, snapshot);
     51  }
     52  template <typename T1, typename T2>
     53  void bailoutCmpPtr(Assembler::Condition c, T1 lhs, T2 rhs,
     54                     LSnapshot* snapshot) {
     55    Label bail;
     56    masm.branchPtr(c, lhs, rhs, &bail);
     57    bailoutFrom(&bail, snapshot);
     58  }
     59  void bailoutIfFalseBool(Register reg, LSnapshot* snapshot) {
     60    Label bail;
     61    UseScratchRegisterScope temps(&masm);
     62    Register scratch = temps.Acquire();
     63    masm.ma_and(scratch, reg, Imm32(0xFF));
     64    masm.ma_b(scratch, scratch, &bail, Assembler::Zero);
     65    bailoutFrom(&bail, snapshot);
     66  }
     67 
     68  void bailoutFrom(Label* label, LSnapshot* snapshot);
     69  void bailout(LSnapshot* snapshot);
     70 
     71  bool generateOutOfLineCode();
     72 
     73  template <typename T>
     74  void branchToBlock(Register lhs, T rhs, MBasicBlock* mir,
     75                     Assembler::Condition cond) {
     76    masm.ma_b(lhs, rhs, skipTrivialBlocks(mir)->lir()->label(), cond);
     77  }
     78  void branchToBlock(FloatFormat fmt, FloatRegister lhs, FloatRegister rhs,
     79                     MBasicBlock* mir, Assembler::DoubleCondition cond);
     80 
     81  // Emits a branch that directs control flow to the true block if |cond| is
     82  // true, and the false block if |cond| is false.
     83  template <typename T>
     84  void emitBranch(Register lhs, T rhs, Assembler::Condition cond,
     85                  MBasicBlock* mirTrue, MBasicBlock* mirFalse) {
     86    if (isNextBlock(mirFalse->lir())) {
     87      branchToBlock(lhs, rhs, mirTrue, cond);
     88    } else {
     89      branchToBlock(lhs, rhs, mirFalse, Assembler::InvertCondition(cond));
     90      jumpToBlock(mirTrue);
     91    }
     92  }
     93 
     94  void emitTableSwitchDispatch(MTableSwitch* mir, Register index,
     95                               Register base);
     96 
     97  template <typename T>
     98  void emitWasmLoad(T* ins);
     99  template <typename T>
    100  void emitWasmStore(T* ins);
    101 
    102  void generateInvalidateEpilogue();
    103 
    104  // Generating a result.
    105  template <typename S, typename T>
    106  void atomicBinopToTypedIntArray(AtomicOp op, Scalar::Type arrayType,
    107                                  const S& value, const T& mem,
    108                                  Register flagTemp, Register outTemp,
    109                                  Register valueTemp, Register offsetTemp,
    110                                  Register maskTemp, AnyRegister output);
    111 
    112  // Generating no result.
    113  template <typename S, typename T>
    114  void atomicBinopToTypedIntArray(AtomicOp op, Scalar::Type arrayType,
    115                                  const S& value, const T& mem,
    116                                  Register flagTemp, Register valueTemp,
    117                                  Register offsetTemp, Register maskTemp);
    118 
    119 public:
    120  // Out of line visitors.
    121  void visitOutOfLineTableSwitch(OutOfLineTableSwitch* ool);
    122  void visitOutOfLineWasmTruncateCheck(OutOfLineWasmTruncateCheck* ool);
    123 
    124 protected:
    125  template <typename T>
    126  void emitWasmLoadI64(T* ins);
    127  template <typename T>
    128  void emitWasmStoreI64(T* ins);
    129 
    130  void emitBigIntPtrDiv(LBigIntPtrDiv* ins, Register dividend, Register divisor,
    131                        Register output);
    132  void emitBigIntPtrMod(LBigIntPtrMod* ins, Register dividend, Register divisor,
    133                        Register output);
    134 
    135  void emitMulI64(Register lhs, int64_t rhs, Register dest);
    136 };
    137 
    138 typedef CodeGeneratorRiscv64 CodeGeneratorSpecific;
    139 
    140 }  // namespace jit
    141 }  // namespace js
    142 
    143 #endif /* jit_riscv64_CodeGenerator_riscv64_h */