85 lines · cpp
1//===-- PPCPredicates.cpp - PPC Branch Predicate Information --------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8//9// This file implements the PowerPC branch predicates.10//11//===----------------------------------------------------------------------===//12 13#include "PPCPredicates.h"14#include "llvm/Support/ErrorHandling.h"15using namespace llvm;16 17PPC::Predicate PPC::InvertPredicate(PPC::Predicate Opcode) {18 switch (Opcode) {19 case PPC::PRED_EQ: return PPC::PRED_NE;20 case PPC::PRED_NE: return PPC::PRED_EQ;21 case PPC::PRED_LT: return PPC::PRED_GE;22 case PPC::PRED_GE: return PPC::PRED_LT;23 case PPC::PRED_GT: return PPC::PRED_LE;24 case PPC::PRED_LE: return PPC::PRED_GT;25 case PPC::PRED_NU: return PPC::PRED_UN;26 case PPC::PRED_UN: return PPC::PRED_NU;27 case PPC::PRED_EQ_MINUS: return PPC::PRED_NE_PLUS;28 case PPC::PRED_NE_MINUS: return PPC::PRED_EQ_PLUS;29 case PPC::PRED_LT_MINUS: return PPC::PRED_GE_PLUS;30 case PPC::PRED_GE_MINUS: return PPC::PRED_LT_PLUS;31 case PPC::PRED_GT_MINUS: return PPC::PRED_LE_PLUS;32 case PPC::PRED_LE_MINUS: return PPC::PRED_GT_PLUS;33 case PPC::PRED_NU_MINUS: return PPC::PRED_UN_PLUS;34 case PPC::PRED_UN_MINUS: return PPC::PRED_NU_PLUS;35 case PPC::PRED_EQ_PLUS: return PPC::PRED_NE_MINUS;36 case PPC::PRED_NE_PLUS: return PPC::PRED_EQ_MINUS;37 case PPC::PRED_LT_PLUS: return PPC::PRED_GE_MINUS;38 case PPC::PRED_GE_PLUS: return PPC::PRED_LT_MINUS;39 case PPC::PRED_GT_PLUS: return PPC::PRED_LE_MINUS;40 case PPC::PRED_LE_PLUS: return PPC::PRED_GT_MINUS;41 case PPC::PRED_NU_PLUS: return PPC::PRED_UN_MINUS;42 case PPC::PRED_UN_PLUS: return PPC::PRED_NU_MINUS;43 44 // Simple predicates for single condition-register bits.45 case PPC::PRED_BIT_SET: return PPC::PRED_BIT_UNSET;46 case PPC::PRED_BIT_UNSET: return PPC::PRED_BIT_SET;47 }48 llvm_unreachable("Unknown PPC branch opcode!");49}50 51PPC::Predicate PPC::getSwappedPredicate(PPC::Predicate Opcode) {52 switch (Opcode) {53 case PPC::PRED_EQ: return PPC::PRED_EQ;54 case PPC::PRED_NE: return PPC::PRED_NE;55 case PPC::PRED_LT: return PPC::PRED_GT;56 case PPC::PRED_GE: return PPC::PRED_LE;57 case PPC::PRED_GT: return PPC::PRED_LT;58 case PPC::PRED_LE: return PPC::PRED_GE;59 case PPC::PRED_NU: return PPC::PRED_NU;60 case PPC::PRED_UN: return PPC::PRED_UN;61 case PPC::PRED_EQ_MINUS: return PPC::PRED_EQ_MINUS;62 case PPC::PRED_NE_MINUS: return PPC::PRED_NE_MINUS;63 case PPC::PRED_LT_MINUS: return PPC::PRED_GT_MINUS;64 case PPC::PRED_GE_MINUS: return PPC::PRED_LE_MINUS;65 case PPC::PRED_GT_MINUS: return PPC::PRED_LT_MINUS;66 case PPC::PRED_LE_MINUS: return PPC::PRED_GE_MINUS;67 case PPC::PRED_NU_MINUS: return PPC::PRED_NU_MINUS;68 case PPC::PRED_UN_MINUS: return PPC::PRED_UN_MINUS;69 case PPC::PRED_EQ_PLUS: return PPC::PRED_EQ_PLUS;70 case PPC::PRED_NE_PLUS: return PPC::PRED_NE_PLUS;71 case PPC::PRED_LT_PLUS: return PPC::PRED_GT_PLUS;72 case PPC::PRED_GE_PLUS: return PPC::PRED_LE_PLUS;73 case PPC::PRED_GT_PLUS: return PPC::PRED_LT_PLUS;74 case PPC::PRED_LE_PLUS: return PPC::PRED_GE_PLUS;75 case PPC::PRED_NU_PLUS: return PPC::PRED_NU_PLUS;76 case PPC::PRED_UN_PLUS: return PPC::PRED_UN_PLUS;77 78 case PPC::PRED_BIT_SET:79 case PPC::PRED_BIT_UNSET:80 llvm_unreachable("Invalid use of bit predicate code");81 }82 llvm_unreachable("Unknown PPC branch opcode!");83}84 85