139 lines · c
1//===- X86ModRMFilters.h - Disassembler ModR/M filterss ---------*- C++ -*-===//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 is part of the X86 Disassembler Emitter.10// It contains ModR/M filters that determine which values of the ModR/M byte11// are valid for a partiuclar instruction.12// Documentation for the disassembler emitter in general can be found in13// X86DisassemblerEmitter.h.14//15//===----------------------------------------------------------------------===//16 17#ifndef LLVM_UTILS_TABLEGEN_X86MODRMFILTERS_H18#define LLVM_UTILS_TABLEGEN_X86MODRMFILTERS_H19 20#include <cstdint>21 22namespace llvm::X86Disassembler {23 24/// ModRMFilter - Abstract base class for clases that recognize patterns in25/// ModR/M bytes.26class ModRMFilter {27 virtual void anchor();28 29public:30 /// Destructor - Override as necessary.31 virtual ~ModRMFilter() = default;32 33 /// isDumb - Indicates whether this filter returns the same value for34 /// any value of the ModR/M byte.35 ///36 /// @result - True if the filter returns the same value for any ModR/M37 /// byte; false if not.38 virtual bool isDumb() const { return false; }39 40 /// accepts - Indicates whether the filter accepts a particular ModR/M41 /// byte value.42 ///43 /// @result - True if the filter accepts the ModR/M byte; false if not.44 virtual bool accepts(uint8_t modRM) const = 0;45};46 47/// DumbFilter - Accepts any ModR/M byte. Used for instructions that do not48/// require a ModR/M byte or instructions where the entire ModR/M byte is used49/// for operands.50class DumbFilter : public ModRMFilter {51 void anchor() override;52 53public:54 bool isDumb() const override { return true; }55 56 bool accepts(uint8_t modRM) const override { return true; }57};58 59/// ModFilter - Filters based on the mod bits [bits 7-6] of the ModR/M byte.60/// Some instructions are classified based on whether they are 11 or anything61/// else. This filter performs that classification.62class ModFilter : public ModRMFilter {63 void anchor() override;64 bool R;65 66public:67 /// Constructor68 ///69 /// \param r True if the mod bits of the ModR/M byte must be 11; false70 /// otherwise. The name r derives from the fact that the mod71 /// bits indicate whether the R/M bits [bits 2-0] signify a72 /// register or a memory operand.73 ModFilter(bool r) : R(r) {}74 75 bool accepts(uint8_t modRM) const override {76 return (R == ((modRM & 0xc0) == 0xc0));77 }78};79 80/// ExtendedFilter - Extended opcodes are classified based on the value of the81/// mod field [bits 7-6] and the value of the nnn field [bits 5-3].82class ExtendedFilter : public ModRMFilter {83 void anchor() override;84 bool R;85 uint8_t NNN;86 87public:88 /// Constructor89 ///90 /// \param r True if the mod field must be set to 11; false otherwise.91 /// The name is explained at ModFilter.92 /// \param nnn The required value of the nnn field.93 ExtendedFilter(bool r, uint8_t nnn) : R(r), NNN(nnn) {}94 95 bool accepts(uint8_t modRM) const override {96 return (97 ((R && ((modRM & 0xc0) == 0xc0)) || (!R && ((modRM & 0xc0) != 0xc0))) &&98 (((modRM & 0x38) >> 3) == NNN));99 }100};101 102/// ExtendedRMFilter - Extended opcodes are classified based on the value of the103/// mod field [bits 7-6] and the value of the nnn field [bits 2-0].104class ExtendedRMFilter : public ModRMFilter {105 void anchor() override;106 bool R;107 uint8_t NNN;108 109public:110 /// Constructor111 ///112 /// \param r True if the mod field must be set to 11; false otherwise.113 /// The name is explained at ModFilter.114 /// \param nnn The required value of the nnn field.115 ExtendedRMFilter(bool r, uint8_t nnn) : R(r), NNN(nnn) {}116 117 bool accepts(uint8_t modRM) const override {118 return ((R && ((modRM & 0xc0) == 0xc0)) && ((modRM & 0x7) == NNN));119 }120};121/// ExactFilter - The occasional extended opcode (such as VMCALL or MONITOR)122/// requires the ModR/M byte to have a specific value.123class ExactFilter : public ModRMFilter {124 void anchor() override;125 uint8_t ModRM;126 127public:128 /// Constructor129 ///130 /// \param modRM The required value of the full ModR/M byte.131 ExactFilter(uint8_t modRM) : ModRM(modRM) {}132 133 bool accepts(uint8_t modRM) const override { return (ModRM == modRM); }134};135 136} // namespace llvm::X86Disassembler137 138#endif139