tor-browser

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

CodeGenerator-loong64.h (4947B)


      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_loong64_CodeGenerator_loong64_h
      8 #define jit_loong64_CodeGenerator_loong64_h
      9 
     10 #include "jit/loong64/Assembler-loong64.h"
     11 #include "jit/shared/CodeGenerator-shared.h"
     12 
     13 namespace js {
     14 namespace jit {
     15 
     16 class CodeGeneratorLOONG64;
     17 class OutOfLineTableSwitch;
     18 
     19 using OutOfLineWasmTruncateCheck =
     20    OutOfLineWasmTruncateCheckBase<CodeGeneratorLOONG64>;
     21 
     22 class CodeGeneratorLOONG64 : public CodeGeneratorShared {
     23  friend class MoveResolverLA;
     24 
     25 protected:
     26  CodeGeneratorLOONG64(MIRGenerator* gen, LIRGraph* graph, MacroAssembler* masm,
     27                       const wasm::CodeMetadata* wasmCodeMeta);
     28 
     29  NonAssertingLabel deoptLabel_;
     30 
     31  Operand ToOperand(const LAllocation& a);
     32  Operand ToOperand(const LAllocation* a);
     33  Operand ToOperand(const LDefinition* def);
     34 
     35  MoveOperand toMoveOperand(LAllocation a) const;
     36 
     37  template <typename T1, typename T2>
     38  void bailoutCmp32(Assembler::Condition c, T1 lhs, T2 rhs,
     39                    LSnapshot* snapshot) {
     40    Label bail;
     41    masm.branch32(c, lhs, rhs, &bail);
     42    bailoutFrom(&bail, snapshot);
     43  }
     44  template <typename T1, typename T2>
     45  void bailoutTest32(Assembler::Condition c, T1 lhs, T2 rhs,
     46                     LSnapshot* snapshot) {
     47    Label bail;
     48    masm.branchTest32(c, lhs, rhs, &bail);
     49    bailoutFrom(&bail, snapshot);
     50  }
     51  template <typename T1, typename T2>
     52  void bailoutCmpPtr(Assembler::Condition c, T1 lhs, T2 rhs,
     53                     LSnapshot* snapshot) {
     54    Label bail;
     55    masm.branchPtr(c, lhs, rhs, &bail);
     56    bailoutFrom(&bail, snapshot);
     57  }
     58  void bailoutIfFalseBool(Register reg, LSnapshot* snapshot) {
     59    Label bail;
     60    UseScratchRegisterScope temps(masm);
     61    Register scratch = temps.Acquire();
     62    masm.ma_and(scratch, reg, Imm32(0xFF));
     63    masm.ma_b(scratch, scratch, &bail, Assembler::Zero);
     64    bailoutFrom(&bail, snapshot);
     65  }
     66 
     67  void bailoutFrom(Label* label, LSnapshot* snapshot);
     68  void bailout(LSnapshot* snapshot);
     69 
     70  bool generateOutOfLineCode();
     71 
     72  template <typename T>
     73  void branchToBlock(Register lhs, T rhs, MBasicBlock* mir,
     74                     Assembler::Condition cond) {
     75    masm.ma_b(lhs, rhs, skipTrivialBlocks(mir)->lir()->label(), cond);
     76  }
     77  void branchToBlock(Assembler::FloatFormat fmt, FloatRegister lhs,
     78                     FloatRegister rhs, MBasicBlock* mir,
     79                     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  void emitBigIntPtrDiv(LBigIntPtrDiv* ins, Register dividend, Register divisor,
    126                        Register output);
    127  void emitBigIntPtrMod(LBigIntPtrMod* ins, Register dividend, Register divisor,
    128                        Register output);
    129 
    130  void emitMulI64(Register lhs, int64_t rhs, Register dest);
    131 
    132  template <typename T>
    133  void emitWasmLoadI64(T* ins);
    134  template <typename T>
    135  void emitWasmStoreI64(T* ins);
    136 };
    137 
    138 typedef CodeGeneratorLOONG64 CodeGeneratorSpecific;
    139 
    140 }  // namespace jit
    141 }  // namespace js
    142 
    143 #endif /* jit_loong64_CodeGenerator_loong64_h */