10b57cec5SDimitry Andric //===-- PPCPredicates.cpp - PPC Branch Predicate Information --------------===// 20b57cec5SDimitry Andric // 30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 60b57cec5SDimitry Andric // 70b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 80b57cec5SDimitry Andric // 90b57cec5SDimitry Andric // This file implements the PowerPC branch predicates. 100b57cec5SDimitry Andric // 110b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 120b57cec5SDimitry Andric 130b57cec5SDimitry Andric #include "PPCPredicates.h" 140b57cec5SDimitry Andric #include "llvm/Support/ErrorHandling.h" 150b57cec5SDimitry Andric using namespace llvm; 160b57cec5SDimitry Andric InvertPredicate(PPC::Predicate Opcode)170b57cec5SDimitry AndricPPC::Predicate PPC::InvertPredicate(PPC::Predicate Opcode) { 180b57cec5SDimitry Andric switch (Opcode) { 190b57cec5SDimitry Andric case PPC::PRED_EQ: return PPC::PRED_NE; 200b57cec5SDimitry Andric case PPC::PRED_NE: return PPC::PRED_EQ; 210b57cec5SDimitry Andric case PPC::PRED_LT: return PPC::PRED_GE; 220b57cec5SDimitry Andric case PPC::PRED_GE: return PPC::PRED_LT; 230b57cec5SDimitry Andric case PPC::PRED_GT: return PPC::PRED_LE; 240b57cec5SDimitry Andric case PPC::PRED_LE: return PPC::PRED_GT; 250b57cec5SDimitry Andric case PPC::PRED_NU: return PPC::PRED_UN; 260b57cec5SDimitry Andric case PPC::PRED_UN: return PPC::PRED_NU; 270b57cec5SDimitry Andric case PPC::PRED_EQ_MINUS: return PPC::PRED_NE_PLUS; 280b57cec5SDimitry Andric case PPC::PRED_NE_MINUS: return PPC::PRED_EQ_PLUS; 290b57cec5SDimitry Andric case PPC::PRED_LT_MINUS: return PPC::PRED_GE_PLUS; 300b57cec5SDimitry Andric case PPC::PRED_GE_MINUS: return PPC::PRED_LT_PLUS; 310b57cec5SDimitry Andric case PPC::PRED_GT_MINUS: return PPC::PRED_LE_PLUS; 320b57cec5SDimitry Andric case PPC::PRED_LE_MINUS: return PPC::PRED_GT_PLUS; 330b57cec5SDimitry Andric case PPC::PRED_NU_MINUS: return PPC::PRED_UN_PLUS; 340b57cec5SDimitry Andric case PPC::PRED_UN_MINUS: return PPC::PRED_NU_PLUS; 350b57cec5SDimitry Andric case PPC::PRED_EQ_PLUS: return PPC::PRED_NE_MINUS; 360b57cec5SDimitry Andric case PPC::PRED_NE_PLUS: return PPC::PRED_EQ_MINUS; 370b57cec5SDimitry Andric case PPC::PRED_LT_PLUS: return PPC::PRED_GE_MINUS; 380b57cec5SDimitry Andric case PPC::PRED_GE_PLUS: return PPC::PRED_LT_MINUS; 390b57cec5SDimitry Andric case PPC::PRED_GT_PLUS: return PPC::PRED_LE_MINUS; 400b57cec5SDimitry Andric case PPC::PRED_LE_PLUS: return PPC::PRED_GT_MINUS; 410b57cec5SDimitry Andric case PPC::PRED_NU_PLUS: return PPC::PRED_UN_MINUS; 420b57cec5SDimitry Andric case PPC::PRED_UN_PLUS: return PPC::PRED_NU_MINUS; 430b57cec5SDimitry Andric 440b57cec5SDimitry Andric // Simple predicates for single condition-register bits. 450b57cec5SDimitry Andric case PPC::PRED_BIT_SET: return PPC::PRED_BIT_UNSET; 460b57cec5SDimitry Andric case PPC::PRED_BIT_UNSET: return PPC::PRED_BIT_SET; 470b57cec5SDimitry Andric } 480b57cec5SDimitry Andric llvm_unreachable("Unknown PPC branch opcode!"); 490b57cec5SDimitry Andric } 500b57cec5SDimitry Andric getSwappedPredicate(PPC::Predicate Opcode)510b57cec5SDimitry AndricPPC::Predicate PPC::getSwappedPredicate(PPC::Predicate Opcode) { 520b57cec5SDimitry Andric switch (Opcode) { 530b57cec5SDimitry Andric case PPC::PRED_EQ: return PPC::PRED_EQ; 540b57cec5SDimitry Andric case PPC::PRED_NE: return PPC::PRED_NE; 550b57cec5SDimitry Andric case PPC::PRED_LT: return PPC::PRED_GT; 560b57cec5SDimitry Andric case PPC::PRED_GE: return PPC::PRED_LE; 570b57cec5SDimitry Andric case PPC::PRED_GT: return PPC::PRED_LT; 580b57cec5SDimitry Andric case PPC::PRED_LE: return PPC::PRED_GE; 590b57cec5SDimitry Andric case PPC::PRED_NU: return PPC::PRED_NU; 600b57cec5SDimitry Andric case PPC::PRED_UN: return PPC::PRED_UN; 610b57cec5SDimitry Andric case PPC::PRED_EQ_MINUS: return PPC::PRED_EQ_MINUS; 620b57cec5SDimitry Andric case PPC::PRED_NE_MINUS: return PPC::PRED_NE_MINUS; 630b57cec5SDimitry Andric case PPC::PRED_LT_MINUS: return PPC::PRED_GT_MINUS; 640b57cec5SDimitry Andric case PPC::PRED_GE_MINUS: return PPC::PRED_LE_MINUS; 650b57cec5SDimitry Andric case PPC::PRED_GT_MINUS: return PPC::PRED_LT_MINUS; 660b57cec5SDimitry Andric case PPC::PRED_LE_MINUS: return PPC::PRED_GE_MINUS; 670b57cec5SDimitry Andric case PPC::PRED_NU_MINUS: return PPC::PRED_NU_MINUS; 680b57cec5SDimitry Andric case PPC::PRED_UN_MINUS: return PPC::PRED_UN_MINUS; 690b57cec5SDimitry Andric case PPC::PRED_EQ_PLUS: return PPC::PRED_EQ_PLUS; 700b57cec5SDimitry Andric case PPC::PRED_NE_PLUS: return PPC::PRED_NE_PLUS; 710b57cec5SDimitry Andric case PPC::PRED_LT_PLUS: return PPC::PRED_GT_PLUS; 720b57cec5SDimitry Andric case PPC::PRED_GE_PLUS: return PPC::PRED_LE_PLUS; 730b57cec5SDimitry Andric case PPC::PRED_GT_PLUS: return PPC::PRED_LT_PLUS; 740b57cec5SDimitry Andric case PPC::PRED_LE_PLUS: return PPC::PRED_GE_PLUS; 750b57cec5SDimitry Andric case PPC::PRED_NU_PLUS: return PPC::PRED_NU_PLUS; 760b57cec5SDimitry Andric case PPC::PRED_UN_PLUS: return PPC::PRED_UN_PLUS; 770b57cec5SDimitry Andric 780b57cec5SDimitry Andric case PPC::PRED_BIT_SET: 790b57cec5SDimitry Andric case PPC::PRED_BIT_UNSET: 800b57cec5SDimitry Andric llvm_unreachable("Invalid use of bit predicate code"); 810b57cec5SDimitry Andric } 820b57cec5SDimitry Andric llvm_unreachable("Unknown PPC branch opcode!"); 830b57cec5SDimitry Andric } 840b57cec5SDimitry Andric 85