14a0dad67867f389e01a5a6c0fe381d210f687c0dArtem Udovichenko/* 24a0dad67867f389e01a5a6c0fe381d210f687c0dArtem Udovichenko * Copyright (C) 2015 The Android Open Source Project 34a0dad67867f389e01a5a6c0fe381d210f687c0dArtem Udovichenko * 44a0dad67867f389e01a5a6c0fe381d210f687c0dArtem Udovichenko * Licensed under the Apache License, Version 2.0 (the "License"); 54a0dad67867f389e01a5a6c0fe381d210f687c0dArtem Udovichenko * you may not use this file except in compliance with the License. 64a0dad67867f389e01a5a6c0fe381d210f687c0dArtem Udovichenko * You may obtain a copy of the License at 74a0dad67867f389e01a5a6c0fe381d210f687c0dArtem Udovichenko * 84a0dad67867f389e01a5a6c0fe381d210f687c0dArtem Udovichenko * http://www.apache.org/licenses/LICENSE-2.0 94a0dad67867f389e01a5a6c0fe381d210f687c0dArtem Udovichenko * 104a0dad67867f389e01a5a6c0fe381d210f687c0dArtem Udovichenko * Unless required by applicable law or agreed to in writing, software 114a0dad67867f389e01a5a6c0fe381d210f687c0dArtem Udovichenko * distributed under the License is distributed on an "AS IS" BASIS, 124a0dad67867f389e01a5a6c0fe381d210f687c0dArtem Udovichenko * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 134a0dad67867f389e01a5a6c0fe381d210f687c0dArtem Udovichenko * See the License for the specific language governing permissions and 144a0dad67867f389e01a5a6c0fe381d210f687c0dArtem Udovichenko * limitations under the License. 154a0dad67867f389e01a5a6c0fe381d210f687c0dArtem Udovichenko */ 164a0dad67867f389e01a5a6c0fe381d210f687c0dArtem Udovichenko 174a0dad67867f389e01a5a6c0fe381d210f687c0dArtem Udovichenko#ifndef ART_COMPILER_OPTIMIZING_NODES_SHARED_H_ 184a0dad67867f389e01a5a6c0fe381d210f687c0dArtem Udovichenko#define ART_COMPILER_OPTIMIZING_NODES_SHARED_H_ 194a0dad67867f389e01a5a6c0fe381d210f687c0dArtem Udovichenko 204a0dad67867f389e01a5a6c0fe381d210f687c0dArtem Udovichenkonamespace art { 214a0dad67867f389e01a5a6c0fe381d210f687c0dArtem Udovichenko 224a0dad67867f389e01a5a6c0fe381d210f687c0dArtem Udovichenkoclass HMultiplyAccumulate : public HExpression<3> { 234a0dad67867f389e01a5a6c0fe381d210f687c0dArtem Udovichenko public: 244a0dad67867f389e01a5a6c0fe381d210f687c0dArtem Udovichenko HMultiplyAccumulate(Primitive::Type type, 254a0dad67867f389e01a5a6c0fe381d210f687c0dArtem Udovichenko InstructionKind op, 264a0dad67867f389e01a5a6c0fe381d210f687c0dArtem Udovichenko HInstruction* accumulator, 274a0dad67867f389e01a5a6c0fe381d210f687c0dArtem Udovichenko HInstruction* mul_left, 284a0dad67867f389e01a5a6c0fe381d210f687c0dArtem Udovichenko HInstruction* mul_right, 294a0dad67867f389e01a5a6c0fe381d210f687c0dArtem Udovichenko uint32_t dex_pc = kNoDexPc) 304a0dad67867f389e01a5a6c0fe381d210f687c0dArtem Udovichenko : HExpression(type, SideEffects::None(), dex_pc), op_kind_(op) { 314a0dad67867f389e01a5a6c0fe381d210f687c0dArtem Udovichenko SetRawInputAt(kInputAccumulatorIndex, accumulator); 324a0dad67867f389e01a5a6c0fe381d210f687c0dArtem Udovichenko SetRawInputAt(kInputMulLeftIndex, mul_left); 334a0dad67867f389e01a5a6c0fe381d210f687c0dArtem Udovichenko SetRawInputAt(kInputMulRightIndex, mul_right); 344a0dad67867f389e01a5a6c0fe381d210f687c0dArtem Udovichenko } 354a0dad67867f389e01a5a6c0fe381d210f687c0dArtem Udovichenko 364a0dad67867f389e01a5a6c0fe381d210f687c0dArtem Udovichenko static constexpr int kInputAccumulatorIndex = 0; 374a0dad67867f389e01a5a6c0fe381d210f687c0dArtem Udovichenko static constexpr int kInputMulLeftIndex = 1; 384a0dad67867f389e01a5a6c0fe381d210f687c0dArtem Udovichenko static constexpr int kInputMulRightIndex = 2; 394a0dad67867f389e01a5a6c0fe381d210f687c0dArtem Udovichenko 404a0dad67867f389e01a5a6c0fe381d210f687c0dArtem Udovichenko bool CanBeMoved() const OVERRIDE { return true; } 414a0dad67867f389e01a5a6c0fe381d210f687c0dArtem Udovichenko bool InstructionDataEquals(HInstruction* other) const OVERRIDE { 424a0dad67867f389e01a5a6c0fe381d210f687c0dArtem Udovichenko return op_kind_ == other->AsMultiplyAccumulate()->op_kind_; 434a0dad67867f389e01a5a6c0fe381d210f687c0dArtem Udovichenko } 444a0dad67867f389e01a5a6c0fe381d210f687c0dArtem Udovichenko 454a0dad67867f389e01a5a6c0fe381d210f687c0dArtem Udovichenko InstructionKind GetOpKind() const { return op_kind_; } 464a0dad67867f389e01a5a6c0fe381d210f687c0dArtem Udovichenko 474a0dad67867f389e01a5a6c0fe381d210f687c0dArtem Udovichenko DECLARE_INSTRUCTION(MultiplyAccumulate); 484a0dad67867f389e01a5a6c0fe381d210f687c0dArtem Udovichenko 494a0dad67867f389e01a5a6c0fe381d210f687c0dArtem Udovichenko private: 504a0dad67867f389e01a5a6c0fe381d210f687c0dArtem Udovichenko // Indicates if this is a MADD or MSUB. 514a0dad67867f389e01a5a6c0fe381d210f687c0dArtem Udovichenko const InstructionKind op_kind_; 524a0dad67867f389e01a5a6c0fe381d210f687c0dArtem Udovichenko 534a0dad67867f389e01a5a6c0fe381d210f687c0dArtem Udovichenko DISALLOW_COPY_AND_ASSIGN(HMultiplyAccumulate); 544a0dad67867f389e01a5a6c0fe381d210f687c0dArtem Udovichenko}; 554a0dad67867f389e01a5a6c0fe381d210f687c0dArtem Udovichenko 567fc6350f6f1ab04b52b9cd7542e0790528296cbeArtem Serovclass HBitwiseNegatedRight : public HBinaryOperation { 577fc6350f6f1ab04b52b9cd7542e0790528296cbeArtem Serov public: 587fc6350f6f1ab04b52b9cd7542e0790528296cbeArtem Serov HBitwiseNegatedRight(Primitive::Type result_type, 597fc6350f6f1ab04b52b9cd7542e0790528296cbeArtem Serov InstructionKind op, 607fc6350f6f1ab04b52b9cd7542e0790528296cbeArtem Serov HInstruction* left, 617fc6350f6f1ab04b52b9cd7542e0790528296cbeArtem Serov HInstruction* right, 627fc6350f6f1ab04b52b9cd7542e0790528296cbeArtem Serov uint32_t dex_pc = kNoDexPc) 637fc6350f6f1ab04b52b9cd7542e0790528296cbeArtem Serov : HBinaryOperation(result_type, left, right, SideEffects::None(), dex_pc), 647fc6350f6f1ab04b52b9cd7542e0790528296cbeArtem Serov op_kind_(op) { 657fc6350f6f1ab04b52b9cd7542e0790528296cbeArtem Serov DCHECK(op == HInstruction::kAnd || op == HInstruction::kOr || op == HInstruction::kXor) << op; 667fc6350f6f1ab04b52b9cd7542e0790528296cbeArtem Serov } 677fc6350f6f1ab04b52b9cd7542e0790528296cbeArtem Serov 687fc6350f6f1ab04b52b9cd7542e0790528296cbeArtem Serov template <typename T, typename U> 697fc6350f6f1ab04b52b9cd7542e0790528296cbeArtem Serov auto Compute(T x, U y) const -> decltype(x & ~y) { 707fc6350f6f1ab04b52b9cd7542e0790528296cbeArtem Serov static_assert(std::is_same<decltype(x & ~y), decltype(x | ~y)>::value && 717fc6350f6f1ab04b52b9cd7542e0790528296cbeArtem Serov std::is_same<decltype(x & ~y), decltype(x ^ ~y)>::value, 727fc6350f6f1ab04b52b9cd7542e0790528296cbeArtem Serov "Inconsistent negated bitwise types"); 737fc6350f6f1ab04b52b9cd7542e0790528296cbeArtem Serov switch (op_kind_) { 747fc6350f6f1ab04b52b9cd7542e0790528296cbeArtem Serov case HInstruction::kAnd: 757fc6350f6f1ab04b52b9cd7542e0790528296cbeArtem Serov return x & ~y; 767fc6350f6f1ab04b52b9cd7542e0790528296cbeArtem Serov case HInstruction::kOr: 777fc6350f6f1ab04b52b9cd7542e0790528296cbeArtem Serov return x | ~y; 787fc6350f6f1ab04b52b9cd7542e0790528296cbeArtem Serov case HInstruction::kXor: 797fc6350f6f1ab04b52b9cd7542e0790528296cbeArtem Serov return x ^ ~y; 807fc6350f6f1ab04b52b9cd7542e0790528296cbeArtem Serov default: 817fc6350f6f1ab04b52b9cd7542e0790528296cbeArtem Serov LOG(FATAL) << "Unreachable"; 827fc6350f6f1ab04b52b9cd7542e0790528296cbeArtem Serov UNREACHABLE(); 837fc6350f6f1ab04b52b9cd7542e0790528296cbeArtem Serov } 847fc6350f6f1ab04b52b9cd7542e0790528296cbeArtem Serov } 857fc6350f6f1ab04b52b9cd7542e0790528296cbeArtem Serov 867fc6350f6f1ab04b52b9cd7542e0790528296cbeArtem Serov HConstant* Evaluate(HIntConstant* x, HIntConstant* y) const OVERRIDE { 877fc6350f6f1ab04b52b9cd7542e0790528296cbeArtem Serov return GetBlock()->GetGraph()->GetIntConstant( 887fc6350f6f1ab04b52b9cd7542e0790528296cbeArtem Serov Compute(x->GetValue(), y->GetValue()), GetDexPc()); 897fc6350f6f1ab04b52b9cd7542e0790528296cbeArtem Serov } 907fc6350f6f1ab04b52b9cd7542e0790528296cbeArtem Serov HConstant* Evaluate(HLongConstant* x, HLongConstant* y) const OVERRIDE { 917fc6350f6f1ab04b52b9cd7542e0790528296cbeArtem Serov return GetBlock()->GetGraph()->GetLongConstant( 927fc6350f6f1ab04b52b9cd7542e0790528296cbeArtem Serov Compute(x->GetValue(), y->GetValue()), GetDexPc()); 937fc6350f6f1ab04b52b9cd7542e0790528296cbeArtem Serov } 947fc6350f6f1ab04b52b9cd7542e0790528296cbeArtem Serov HConstant* Evaluate(HFloatConstant* x ATTRIBUTE_UNUSED, 957fc6350f6f1ab04b52b9cd7542e0790528296cbeArtem Serov HFloatConstant* y ATTRIBUTE_UNUSED) const OVERRIDE { 967fc6350f6f1ab04b52b9cd7542e0790528296cbeArtem Serov LOG(FATAL) << DebugName() << " is not defined for float values"; 977fc6350f6f1ab04b52b9cd7542e0790528296cbeArtem Serov UNREACHABLE(); 987fc6350f6f1ab04b52b9cd7542e0790528296cbeArtem Serov } 997fc6350f6f1ab04b52b9cd7542e0790528296cbeArtem Serov HConstant* Evaluate(HDoubleConstant* x ATTRIBUTE_UNUSED, 1007fc6350f6f1ab04b52b9cd7542e0790528296cbeArtem Serov HDoubleConstant* y ATTRIBUTE_UNUSED) const OVERRIDE { 1017fc6350f6f1ab04b52b9cd7542e0790528296cbeArtem Serov LOG(FATAL) << DebugName() << " is not defined for double values"; 1027fc6350f6f1ab04b52b9cd7542e0790528296cbeArtem Serov UNREACHABLE(); 1037fc6350f6f1ab04b52b9cd7542e0790528296cbeArtem Serov } 1047fc6350f6f1ab04b52b9cd7542e0790528296cbeArtem Serov 1057fc6350f6f1ab04b52b9cd7542e0790528296cbeArtem Serov InstructionKind GetOpKind() const { return op_kind_; } 1067fc6350f6f1ab04b52b9cd7542e0790528296cbeArtem Serov 1077fc6350f6f1ab04b52b9cd7542e0790528296cbeArtem Serov DECLARE_INSTRUCTION(BitwiseNegatedRight); 1087fc6350f6f1ab04b52b9cd7542e0790528296cbeArtem Serov 1097fc6350f6f1ab04b52b9cd7542e0790528296cbeArtem Serov private: 1107fc6350f6f1ab04b52b9cd7542e0790528296cbeArtem Serov // Specifies the bitwise operation, which will be then negated. 1117fc6350f6f1ab04b52b9cd7542e0790528296cbeArtem Serov const InstructionKind op_kind_; 1127fc6350f6f1ab04b52b9cd7542e0790528296cbeArtem Serov 1137fc6350f6f1ab04b52b9cd7542e0790528296cbeArtem Serov DISALLOW_COPY_AND_ASSIGN(HBitwiseNegatedRight); 1147fc6350f6f1ab04b52b9cd7542e0790528296cbeArtem Serov}; 1157fc6350f6f1ab04b52b9cd7542e0790528296cbeArtem Serov 1164a0dad67867f389e01a5a6c0fe381d210f687c0dArtem Udovichenko} // namespace art 1174a0dad67867f389e01a5a6c0fe381d210f687c0dArtem Udovichenko 1184a0dad67867f389e01a5a6c0fe381d210f687c0dArtem Udovichenko#endif // ART_COMPILER_OPTIMIZING_NODES_SHARED_H_ 119