1*795d594fSAndroid Build Coastguard Worker /* 2*795d594fSAndroid Build Coastguard Worker * Copyright (C) 2024 The Android Open Source Project 3*795d594fSAndroid Build Coastguard Worker * 4*795d594fSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*795d594fSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*795d594fSAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*795d594fSAndroid Build Coastguard Worker * 8*795d594fSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*795d594fSAndroid Build Coastguard Worker * 10*795d594fSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*795d594fSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*795d594fSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*795d594fSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*795d594fSAndroid Build Coastguard Worker * limitations under the License. 15*795d594fSAndroid Build Coastguard Worker */ 16*795d594fSAndroid Build Coastguard Worker 17*795d594fSAndroid Build Coastguard Worker #ifndef ART_COMPILER_OPTIMIZING_NODES_RISCV64_H_ 18*795d594fSAndroid Build Coastguard Worker #define ART_COMPILER_OPTIMIZING_NODES_RISCV64_H_ 19*795d594fSAndroid Build Coastguard Worker 20*795d594fSAndroid Build Coastguard Worker namespace art HIDDEN { 21*795d594fSAndroid Build Coastguard Worker 22*795d594fSAndroid Build Coastguard Worker class HRiscv64ShiftAdd final : public HBinaryOperation { 23*795d594fSAndroid Build Coastguard Worker public: 24*795d594fSAndroid Build Coastguard Worker HRiscv64ShiftAdd(HInstruction* left, 25*795d594fSAndroid Build Coastguard Worker HInstruction* right, 26*795d594fSAndroid Build Coastguard Worker uint32_t distance, 27*795d594fSAndroid Build Coastguard Worker uint32_t dex_pc = kNoDexPc) HBinaryOperation(kRiscv64ShiftAdd,DataType::Type::kInt64,left,right,SideEffects::None (),dex_pc)28*795d594fSAndroid Build Coastguard Worker : HBinaryOperation( 29*795d594fSAndroid Build Coastguard Worker kRiscv64ShiftAdd, DataType::Type::kInt64, left, right, SideEffects::None(), dex_pc) { 30*795d594fSAndroid Build Coastguard Worker DCHECK_GE(distance, 1u); 31*795d594fSAndroid Build Coastguard Worker DCHECK_LE(distance, 3u); 32*795d594fSAndroid Build Coastguard Worker 33*795d594fSAndroid Build Coastguard Worker SetPackedField<DistanceField>(distance); 34*795d594fSAndroid Build Coastguard Worker } 35*795d594fSAndroid Build Coastguard Worker GetDistance()36*795d594fSAndroid Build Coastguard Worker uint32_t GetDistance() const { return GetPackedField<DistanceField>(); } 37*795d594fSAndroid Build Coastguard Worker IsCommutative()38*795d594fSAndroid Build Coastguard Worker bool IsCommutative() const override { return false; } InstructionDataEquals(const HInstruction * other)39*795d594fSAndroid Build Coastguard Worker bool InstructionDataEquals(const HInstruction* other) const override { 40*795d594fSAndroid Build Coastguard Worker return GetPackedFields() == other->AsRiscv64ShiftAdd()->GetPackedFields(); 41*795d594fSAndroid Build Coastguard Worker } 42*795d594fSAndroid Build Coastguard Worker Evaluate(HLongConstant * x,HLongConstant * y)43*795d594fSAndroid Build Coastguard Worker HConstant* Evaluate(HLongConstant* x, HLongConstant* y) const override { 44*795d594fSAndroid Build Coastguard Worker const int64_t value = y->GetValue() + (x->GetValue() << GetDistance()); 45*795d594fSAndroid Build Coastguard Worker return GetBlock()->GetGraph()->GetLongConstant(value); 46*795d594fSAndroid Build Coastguard Worker } 47*795d594fSAndroid Build Coastguard Worker 48*795d594fSAndroid Build Coastguard Worker DECLARE_INSTRUCTION(Riscv64ShiftAdd); 49*795d594fSAndroid Build Coastguard Worker 50*795d594fSAndroid Build Coastguard Worker protected: 51*795d594fSAndroid Build Coastguard Worker DEFAULT_COPY_CONSTRUCTOR(Riscv64ShiftAdd); 52*795d594fSAndroid Build Coastguard Worker 53*795d594fSAndroid Build Coastguard Worker private: 54*795d594fSAndroid Build Coastguard Worker static constexpr size_t kFieldDistance = kNumberOfGenericPackedBits; 55*795d594fSAndroid Build Coastguard Worker static constexpr size_t kFieldDistanceSize = MinimumBitsToStore(3u); 56*795d594fSAndroid Build Coastguard Worker static constexpr size_t kNumberOfRiscv64ShiftAddPackedBits = 57*795d594fSAndroid Build Coastguard Worker kFieldDistance + kFieldDistanceSize; 58*795d594fSAndroid Build Coastguard Worker static_assert(kNumberOfRiscv64ShiftAddPackedBits <= kMaxNumberOfPackedBits, 59*795d594fSAndroid Build Coastguard Worker "Too many packed fields."); 60*795d594fSAndroid Build Coastguard Worker using DistanceField = BitField<uint32_t, kFieldDistance, kFieldDistanceSize>; 61*795d594fSAndroid Build Coastguard Worker }; 62*795d594fSAndroid Build Coastguard Worker 63*795d594fSAndroid Build Coastguard Worker } // namespace art 64*795d594fSAndroid Build Coastguard Worker 65*795d594fSAndroid Build Coastguard Worker #endif // ART_COMPILER_OPTIMIZING_NODES_RISCV64_H_ 66