34#define DEBUG_TYPE "asm-printer" 
   36#define GET_INSTRUCTION_NAME 
   37#define PRINT_ALIAS_INSTR 
   38#include "AArch64GenAsmWriter.inc" 
   39#define GET_INSTRUCTION_NAME 
   40#define PRINT_ALIAS_INSTR 
   41#include "AArch64GenAsmWriter1.inc" 
   54  if (Opt == 
"no-aliases") {
 
 
   79  unsigned Opcode = 
MI->getOpcode();
 
   81  if (Opcode == AArch64::SYSxt)
 
   87  if (Opcode == AArch64::SYSLxt)
 
   93  if (Opcode == AArch64::SYSPxt || Opcode == AArch64::SYSPxt_XZR)
 
  100  if ((Opcode == AArch64::PRFMroX) || (Opcode == AArch64::PRFMroW)) {
 
  106  if (Opcode == AArch64::SBFMXri || Opcode == AArch64::SBFMWri ||
 
  107      Opcode == AArch64::UBFMXri || Opcode == AArch64::UBFMWri) {
 
  113    bool IsSigned = (Opcode == AArch64::SBFMXri || Opcode == AArch64::SBFMWri);
 
  114    bool Is64Bit = (Opcode == AArch64::SBFMXri || Opcode == AArch64::UBFMXri);
 
  116      const char *AsmMnemonic = 
nullptr;
 
  123          AsmMnemonic = 
"sxtb";
 
  125          AsmMnemonic = 
"uxtb";
 
  129          AsmMnemonic = 
"sxth";
 
  131          AsmMnemonic = 
"uxth";
 
  135        if (Is64Bit && IsSigned)
 
  136          AsmMnemonic = 
"sxtw";
 
  141        O << 
'\t' << AsmMnemonic << 
'\t';
 
  154      const char *AsmMnemonic = 
nullptr;
 
  156      int64_t immr = Op2.
getImm();
 
  157      int64_t imms = Op3.
getImm();
 
  158      if (Opcode == AArch64::UBFMWri && imms != 0x1F && ((imms + 1) == immr)) {
 
  161      } 
else if (Opcode == AArch64::UBFMXri && imms != 0x3f &&
 
  162                 ((imms + 1 == immr))) {
 
  165      } 
else if (Opcode == AArch64::UBFMWri && imms == 0x1f) {
 
  168      } 
else if (Opcode == AArch64::UBFMXri && imms == 0x3f) {
 
  171      } 
else if (Opcode == AArch64::SBFMWri && imms == 0x1f) {
 
  174      } 
else if (Opcode == AArch64::SBFMXri && imms == 0x3f) {
 
  179        O << 
'\t' << AsmMnemonic << 
'\t';
 
  192      O << 
'\t' << (IsSigned ? 
"sbfiz" : 
"ubfiz") << 
'\t';
 
  205    O << 
'\t' << (IsSigned ? 
"sbfx" : 
"ubfx") << 
'\t';
 
  217  if (Opcode == AArch64::BFMXri || Opcode == AArch64::BFMWri) {
 
  220    int ImmR = 
MI->getOperand(3).getImm();
 
  221    int ImmS = 
MI->getOperand(4).getImm();
 
  223    if ((Op2.
getReg() == AArch64::WZR || Op2.
getReg() == AArch64::XZR) &&
 
  224        (ImmR == 0 || ImmS < ImmR) && STI.
hasFeature(AArch64::HasV8_2aOps)) {
 
  226      int BitWidth = Opcode == AArch64::BFMXri ? 64 : 32;
 
  228      int Width = ImmS + 1;
 
  238    } 
else if (ImmS < ImmR) {
 
  240      int BitWidth = Opcode == AArch64::BFMXri ? 64 : 32;
 
  242      int Width = ImmS + 1;
 
  257    int Width = ImmS - ImmR + 1;
 
  274  if ((Opcode == AArch64::MOVZXi || Opcode == AArch64::MOVZWi ||
 
  275       Opcode == AArch64::MOVNXi || Opcode == AArch64::MOVNWi) &&
 
  276      MI->getOperand(1).isExpr()) {
 
  277    if (Opcode == AArch64::MOVZXi || Opcode == AArch64::MOVZWi)
 
  287      MAI.printExpr(O, *
MI->getOperand(1).getExpr());
 
  292  if ((Opcode == AArch64::MOVKXi || Opcode == AArch64::MOVKWi) &&
 
  293      MI->getOperand(2).isExpr()) {
 
  300      MAI.printExpr(O, *
MI->getOperand(2).getExpr());
 
  327  if ((Opcode == AArch64::MOVZXi || Opcode == AArch64::MOVZWi) &&
 
  328      MI->getOperand(1).isImm() && 
MI->getOperand(2).isImm()) {
 
  329    int RegWidth = Opcode == AArch64::MOVZXi ? 64 : 32;
 
  330    int Shift = 
MI->getOperand(2).getImm();
 
  334                                   Opcode == AArch64::MOVZXi ? 64 : 32)) {
 
  335      PrintMovImm(
Value, RegWidth);
 
  340  if ((Opcode == AArch64::MOVNXi || Opcode == AArch64::MOVNWi) &&
 
  341      MI->getOperand(1).isImm() && 
MI->getOperand(2).isImm()) {
 
  342    int RegWidth = Opcode == AArch64::MOVNXi ? 64 : 32;
 
  343    int Shift = 
MI->getOperand(2).getImm();
 
  349      PrintMovImm(
Value, RegWidth);
 
  354  if ((Opcode == AArch64::ORRXri || Opcode == AArch64::ORRWri) &&
 
  355      (
MI->getOperand(1).getReg() == AArch64::XZR ||
 
  356       MI->getOperand(1).getReg() == AArch64::WZR) &&
 
  357      MI->getOperand(2).isImm()) {
 
  358    int RegWidth = Opcode == AArch64::ORRXri ? 64 : 32;
 
  360        MI->getOperand(2).getImm(), RegWidth);
 
  362      PrintMovImm(
Value, RegWidth);
 
  367  if (Opcode == AArch64::SPACE) {
 
  368    O << 
'\t' << 
MAI.getCommentString() << 
" SPACE " 
  369      << 
MI->getOperand(1).getImm();
 
  380      (
MI->getOperand(0).getReg() == AArch64::XZR ||
 
  381       MI->getOperand(0).getReg() == AArch64::WZR)) {
 
  382    printAnnotation(O, 
"acquire semantics dropped since destination is zero");
 
 
  389  case AArch64::TBXv8i8One:
 
  390  case AArch64::TBXv8i8Two:
 
  391  case AArch64::TBXv8i8Three:
 
  392  case AArch64::TBXv8i8Four:
 
  396  case AArch64::TBLv8i8One:
 
  397  case AArch64::TBLv8i8Two:
 
  398  case AArch64::TBLv8i8Three:
 
  399  case AArch64::TBLv8i8Four:
 
  403  case AArch64::TBXv16i8One:
 
  404  case AArch64::TBXv16i8Two:
 
  405  case AArch64::TBXv16i8Three:
 
  406  case AArch64::TBXv16i8Four:
 
  410  case AArch64::TBLv16i8One:
 
  411  case AArch64::TBLv16i8Two:
 
  412  case AArch64::TBLv16i8Three:
 
  413  case AArch64::TBLv16i8Four:
 
 
  432  { AArch64::LD1i8,             
"ld1",  
".b",     1, 
true,  0  },
 
  433  { AArch64::LD1i16,            
"ld1",  
".h",     1, 
true,  0  },
 
  434  { AArch64::LD1i32,            
"ld1",  
".s",     1, 
true,  0  },
 
  435  { AArch64::LD1i64,            
"ld1",  
".d",     1, 
true,  0  },
 
  436  { AArch64::LD1i8_POST,        
"ld1",  
".b",     2, 
true,  1  },
 
  437  { AArch64::LD1i16_POST,       
"ld1",  
".h",     2, 
true,  2  },
 
  438  { AArch64::LD1i32_POST,       
"ld1",  
".s",     2, 
true,  4  },
 
  439  { AArch64::LD1i64_POST,       
"ld1",  
".d",     2, 
true,  8  },
 
  440  { AArch64::LD1Rv16b,          
"ld1r", 
".16b",   0, 
false, 0  },
 
  441  { AArch64::LD1Rv8h,           
"ld1r", 
".8h",    0, 
false, 0  },
 
  442  { AArch64::LD1Rv4s,           
"ld1r", 
".4s",    0, 
false, 0  },
 
  443  { AArch64::LD1Rv2d,           
"ld1r", 
".2d",    0, 
false, 0  },
 
  444  { AArch64::LD1Rv8b,           
"ld1r", 
".8b",    0, 
false, 0  },
 
  445  { AArch64::LD1Rv4h,           
"ld1r", 
".4h",    0, 
false, 0  },
 
  446  { AArch64::LD1Rv2s,           
"ld1r", 
".2s",    0, 
false, 0  },
 
  447  { AArch64::LD1Rv1d,           
"ld1r", 
".1d",    0, 
false, 0  },
 
  448  { AArch64::LD1Rv16b_POST,     
"ld1r", 
".16b",   1, 
false, 1  },
 
  449  { AArch64::LD1Rv8h_POST,      
"ld1r", 
".8h",    1, 
false, 2  },
 
  450  { AArch64::LD1Rv4s_POST,      
"ld1r", 
".4s",    1, 
false, 4  },
 
  451  { AArch64::LD1Rv2d_POST,      
"ld1r", 
".2d",    1, 
false, 8  },
 
  452  { AArch64::LD1Rv8b_POST,      
"ld1r", 
".8b",    1, 
false, 1  },
 
  453  { AArch64::LD1Rv4h_POST,      
"ld1r", 
".4h",    1, 
false, 2  },
 
  454  { AArch64::LD1Rv2s_POST,      
"ld1r", 
".2s",    1, 
false, 4  },
 
  455  { AArch64::LD1Rv1d_POST,      
"ld1r", 
".1d",    1, 
false, 8  },
 
  456  { AArch64::LD1Onev16b,        
"ld1",  
".16b",   0, 
false, 0  },
 
  457  { AArch64::LD1Onev8h,         
"ld1",  
".8h",    0, 
false, 0  },
 
  458  { AArch64::LD1Onev4s,         
"ld1",  
".4s",    0, 
false, 0  },
 
  459  { AArch64::LD1Onev2d,         
"ld1",  
".2d",    0, 
false, 0  },
 
  460  { AArch64::LD1Onev8b,         
"ld1",  
".8b",    0, 
false, 0  },
 
  461  { AArch64::LD1Onev4h,         
"ld1",  
".4h",    0, 
false, 0  },
 
  462  { AArch64::LD1Onev2s,         
"ld1",  
".2s",    0, 
false, 0  },
 
  463  { AArch64::LD1Onev1d,         
"ld1",  
".1d",    0, 
false, 0  },
 
  464  { AArch64::LD1Onev16b_POST,   
"ld1",  
".16b",   1, 
false, 16 },
 
  465  { AArch64::LD1Onev8h_POST,    
"ld1",  
".8h",    1, 
false, 16 },
 
  466  { AArch64::LD1Onev4s_POST,    
"ld1",  
".4s",    1, 
false, 16 },
 
  467  { AArch64::LD1Onev2d_POST,    
"ld1",  
".2d",    1, 
false, 16 },
 
  468  { AArch64::LD1Onev8b_POST,    
"ld1",  
".8b",    1, 
false, 8  },
 
  469  { AArch64::LD1Onev4h_POST,    
"ld1",  
".4h",    1, 
false, 8  },
 
  470  { AArch64::LD1Onev2s_POST,    
"ld1",  
".2s",    1, 
false, 8  },
 
  471  { AArch64::LD1Onev1d_POST,    
"ld1",  
".1d",    1, 
false, 8  },
 
  472  { AArch64::LD1Twov16b,        
"ld1",  
".16b",   0, 
false, 0  },
 
  473  { AArch64::LD1Twov8h,         
"ld1",  
".8h",    0, 
false, 0  },
 
  474  { AArch64::LD1Twov4s,         
"ld1",  
".4s",    0, 
false, 0  },
 
  475  { AArch64::LD1Twov2d,         
"ld1",  
".2d",    0, 
false, 0  },
 
  476  { AArch64::LD1Twov8b,         
"ld1",  
".8b",    0, 
false, 0  },
 
  477  { AArch64::LD1Twov4h,         
"ld1",  
".4h",    0, 
false, 0  },
 
  478  { AArch64::LD1Twov2s,         
"ld1",  
".2s",    0, 
false, 0  },
 
  479  { AArch64::LD1Twov1d,         
"ld1",  
".1d",    0, 
false, 0  },
 
  480  { AArch64::LD1Twov16b_POST,   
"ld1",  
".16b",   1, 
false, 32 },
 
  481  { AArch64::LD1Twov8h_POST,    
"ld1",  
".8h",    1, 
false, 32 },
 
  482  { AArch64::LD1Twov4s_POST,    
"ld1",  
".4s",    1, 
false, 32 },
 
  483  { AArch64::LD1Twov2d_POST,    
"ld1",  
".2d",    1, 
false, 32 },
 
  484  { AArch64::LD1Twov8b_POST,    
"ld1",  
".8b",    1, 
false, 16 },
 
  485  { AArch64::LD1Twov4h_POST,    
"ld1",  
".4h",    1, 
false, 16 },
 
  486  { AArch64::LD1Twov2s_POST,    
"ld1",  
".2s",    1, 
false, 16 },
 
  487  { AArch64::LD1Twov1d_POST,    
"ld1",  
".1d",    1, 
false, 16 },
 
  488  { AArch64::LD1Threev16b,      
"ld1",  
".16b",   0, 
false, 0  },
 
  489  { AArch64::LD1Threev8h,       
"ld1",  
".8h",    0, 
false, 0  },
 
  490  { AArch64::LD1Threev4s,       
"ld1",  
".4s",    0, 
false, 0  },
 
  491  { AArch64::LD1Threev2d,       
"ld1",  
".2d",    0, 
false, 0  },
 
  492  { AArch64::LD1Threev8b,       
"ld1",  
".8b",    0, 
false, 0  },
 
  493  { AArch64::LD1Threev4h,       
"ld1",  
".4h",    0, 
false, 0  },
 
  494  { AArch64::LD1Threev2s,       
"ld1",  
".2s",    0, 
false, 0  },
 
  495  { AArch64::LD1Threev1d,       
"ld1",  
".1d",    0, 
false, 0  },
 
  496  { AArch64::LD1Threev16b_POST, 
"ld1",  
".16b",   1, 
false, 48 },
 
  497  { AArch64::LD1Threev8h_POST,  
"ld1",  
".8h",    1, 
false, 48 },
 
  498  { AArch64::LD1Threev4s_POST,  
"ld1",  
".4s",    1, 
false, 48 },
 
  499  { AArch64::LD1Threev2d_POST,  
"ld1",  
".2d",    1, 
false, 48 },
 
  500  { AArch64::LD1Threev8b_POST,  
"ld1",  
".8b",    1, 
false, 24 },
 
  501  { AArch64::LD1Threev4h_POST,  
"ld1",  
".4h",    1, 
false, 24 },
 
  502  { AArch64::LD1Threev2s_POST,  
"ld1",  
".2s",    1, 
false, 24 },
 
  503  { AArch64::LD1Threev1d_POST,  
"ld1",  
".1d",    1, 
false, 24 },
 
  504  { AArch64::LD1Fourv16b,       
"ld1",  
".16b",   0, 
false, 0  },
 
  505  { AArch64::LD1Fourv8h,        
"ld1",  
".8h",    0, 
false, 0  },
 
  506  { AArch64::LD1Fourv4s,        
"ld1",  
".4s",    0, 
false, 0  },
 
  507  { AArch64::LD1Fourv2d,        
"ld1",  
".2d",    0, 
false, 0  },
 
  508  { AArch64::LD1Fourv8b,        
"ld1",  
".8b",    0, 
false, 0  },
 
  509  { AArch64::LD1Fourv4h,        
"ld1",  
".4h",    0, 
false, 0  },
 
  510  { AArch64::LD1Fourv2s,        
"ld1",  
".2s",    0, 
false, 0  },
 
  511  { AArch64::LD1Fourv1d,        
"ld1",  
".1d",    0, 
false, 0  },
 
  512  { AArch64::LD1Fourv16b_POST,  
"ld1",  
".16b",   1, 
false, 64 },
 
  513  { AArch64::LD1Fourv8h_POST,   
"ld1",  
".8h",    1, 
false, 64 },
 
  514  { AArch64::LD1Fourv4s_POST,   
"ld1",  
".4s",    1, 
false, 64 },
 
  515  { AArch64::LD1Fourv2d_POST,   
"ld1",  
".2d",    1, 
false, 64 },
 
  516  { AArch64::LD1Fourv8b_POST,   
"ld1",  
".8b",    1, 
false, 32 },
 
  517  { AArch64::LD1Fourv4h_POST,   
"ld1",  
".4h",    1, 
false, 32 },
 
  518  { AArch64::LD1Fourv2s_POST,   
"ld1",  
".2s",    1, 
false, 32 },
 
  519  { AArch64::LD1Fourv1d_POST,   
"ld1",  
".1d",    1, 
false, 32 },
 
  520  { AArch64::LD2i8,             
"ld2",  
".b",     1, 
true,  0  },
 
  521  { AArch64::LD2i16,            
"ld2",  
".h",     1, 
true,  0  },
 
  522  { AArch64::LD2i32,            
"ld2",  
".s",     1, 
true,  0  },
 
  523  { AArch64::LD2i64,            
"ld2",  
".d",     1, 
true,  0  },
 
  524  { AArch64::LD2i8_POST,        
"ld2",  
".b",     2, 
true,  2  },
 
  525  { AArch64::LD2i16_POST,       
"ld2",  
".h",     2, 
true,  4  },
 
  526  { AArch64::LD2i32_POST,       
"ld2",  
".s",     2, 
true,  8  },
 
  527  { AArch64::LD2i64_POST,       
"ld2",  
".d",     2, 
true,  16  },
 
  528  { AArch64::LD2Rv16b,          
"ld2r", 
".16b",   0, 
false, 0  },
 
  529  { AArch64::LD2Rv8h,           
"ld2r", 
".8h",    0, 
false, 0  },
 
  530  { AArch64::LD2Rv4s,           
"ld2r", 
".4s",    0, 
false, 0  },
 
  531  { AArch64::LD2Rv2d,           
"ld2r", 
".2d",    0, 
false, 0  },
 
  532  { AArch64::LD2Rv8b,           
"ld2r", 
".8b",    0, 
false, 0  },
 
  533  { AArch64::LD2Rv4h,           
"ld2r", 
".4h",    0, 
false, 0  },
 
  534  { AArch64::LD2Rv2s,           
"ld2r", 
".2s",    0, 
false, 0  },
 
  535  { AArch64::LD2Rv1d,           
"ld2r", 
".1d",    0, 
false, 0  },
 
  536  { AArch64::LD2Rv16b_POST,     
"ld2r", 
".16b",   1, 
false, 2  },
 
  537  { AArch64::LD2Rv8h_POST,      
"ld2r", 
".8h",    1, 
false, 4  },
 
  538  { AArch64::LD2Rv4s_POST,      
"ld2r", 
".4s",    1, 
false, 8  },
 
  539  { AArch64::LD2Rv2d_POST,      
"ld2r", 
".2d",    1, 
false, 16 },
 
  540  { AArch64::LD2Rv8b_POST,      
"ld2r", 
".8b",    1, 
false, 2  },
 
  541  { AArch64::LD2Rv4h_POST,      
"ld2r", 
".4h",    1, 
false, 4  },
 
  542  { AArch64::LD2Rv2s_POST,      
"ld2r", 
".2s",    1, 
false, 8  },
 
  543  { AArch64::LD2Rv1d_POST,      
"ld2r", 
".1d",    1, 
false, 16 },
 
  544  { AArch64::LD2Twov16b,        
"ld2",  
".16b",   0, 
false, 0  },
 
  545  { AArch64::LD2Twov8h,         
"ld2",  
".8h",    0, 
false, 0  },
 
  546  { AArch64::LD2Twov4s,         
"ld2",  
".4s",    0, 
false, 0  },
 
  547  { AArch64::LD2Twov2d,         
"ld2",  
".2d",    0, 
false, 0  },
 
  548  { AArch64::LD2Twov8b,         
"ld2",  
".8b",    0, 
false, 0  },
 
  549  { AArch64::LD2Twov4h,         
"ld2",  
".4h",    0, 
false, 0  },
 
  550  { AArch64::LD2Twov2s,         
"ld2",  
".2s",    0, 
false, 0  },
 
  551  { AArch64::LD2Twov16b_POST,   
"ld2",  
".16b",   1, 
false, 32 },
 
  552  { AArch64::LD2Twov8h_POST,    
"ld2",  
".8h",    1, 
false, 32 },
 
  553  { AArch64::LD2Twov4s_POST,    
"ld2",  
".4s",    1, 
false, 32 },
 
  554  { AArch64::LD2Twov2d_POST,    
"ld2",  
".2d",    1, 
false, 32 },
 
  555  { AArch64::LD2Twov8b_POST,    
"ld2",  
".8b",    1, 
false, 16 },
 
  556  { AArch64::LD2Twov4h_POST,    
"ld2",  
".4h",    1, 
false, 16 },
 
  557  { AArch64::LD2Twov2s_POST,    
"ld2",  
".2s",    1, 
false, 16 },
 
  558  { AArch64::LD3i8,             
"ld3",  
".b",     1, 
true,  0  },
 
  559  { AArch64::LD3i16,            
"ld3",  
".h",     1, 
true,  0  },
 
  560  { AArch64::LD3i32,            
"ld3",  
".s",     1, 
true,  0  },
 
  561  { AArch64::LD3i64,            
"ld3",  
".d",     1, 
true,  0  },
 
  562  { AArch64::LD3i8_POST,        
"ld3",  
".b",     2, 
true,  3  },
 
  563  { AArch64::LD3i16_POST,       
"ld3",  
".h",     2, 
true,  6  },
 
  564  { AArch64::LD3i32_POST,       
"ld3",  
".s",     2, 
true,  12 },
 
  565  { AArch64::LD3i64_POST,       
"ld3",  
".d",     2, 
true,  24 },
 
  566  { AArch64::LD3Rv16b,          
"ld3r", 
".16b",   0, 
false, 0  },
 
  567  { AArch64::LD3Rv8h,           
"ld3r", 
".8h",    0, 
false, 0  },
 
  568  { AArch64::LD3Rv4s,           
"ld3r", 
".4s",    0, 
false, 0  },
 
  569  { AArch64::LD3Rv2d,           
"ld3r", 
".2d",    0, 
false, 0  },
 
  570  { AArch64::LD3Rv8b,           
"ld3r", 
".8b",    0, 
false, 0  },
 
  571  { AArch64::LD3Rv4h,           
"ld3r", 
".4h",    0, 
false, 0  },
 
  572  { AArch64::LD3Rv2s,           
"ld3r", 
".2s",    0, 
false, 0  },
 
  573  { AArch64::LD3Rv1d,           
"ld3r", 
".1d",    0, 
false, 0  },
 
  574  { AArch64::LD3Rv16b_POST,     
"ld3r", 
".16b",   1, 
false, 3  },
 
  575  { AArch64::LD3Rv8h_POST,      
"ld3r", 
".8h",    1, 
false, 6  },
 
  576  { AArch64::LD3Rv4s_POST,      
"ld3r", 
".4s",    1, 
false, 12 },
 
  577  { AArch64::LD3Rv2d_POST,      
"ld3r", 
".2d",    1, 
false, 24 },
 
  578  { AArch64::LD3Rv8b_POST,      
"ld3r", 
".8b",    1, 
false, 3  },
 
  579  { AArch64::LD3Rv4h_POST,      
"ld3r", 
".4h",    1, 
false, 6  },
 
  580  { AArch64::LD3Rv2s_POST,      
"ld3r", 
".2s",    1, 
false, 12 },
 
  581  { AArch64::LD3Rv1d_POST,      
"ld3r", 
".1d",    1, 
false, 24 },
 
  582  { AArch64::LD3Threev16b,      
"ld3",  
".16b",   0, 
false, 0  },
 
  583  { AArch64::LD3Threev8h,       
"ld3",  
".8h",    0, 
false, 0  },
 
  584  { AArch64::LD3Threev4s,       
"ld3",  
".4s",    0, 
false, 0  },
 
  585  { AArch64::LD3Threev2d,       
"ld3",  
".2d",    0, 
false, 0  },
 
  586  { AArch64::LD3Threev8b,       
"ld3",  
".8b",    0, 
false, 0  },
 
  587  { AArch64::LD3Threev4h,       
"ld3",  
".4h",    0, 
false, 0  },
 
  588  { AArch64::LD3Threev2s,       
"ld3",  
".2s",    0, 
false, 0  },
 
  589  { AArch64::LD3Threev16b_POST, 
"ld3",  
".16b",   1, 
false, 48 },
 
  590  { AArch64::LD3Threev8h_POST,  
"ld3",  
".8h",    1, 
false, 48 },
 
  591  { AArch64::LD3Threev4s_POST,  
"ld3",  
".4s",    1, 
false, 48 },
 
  592  { AArch64::LD3Threev2d_POST,  
"ld3",  
".2d",    1, 
false, 48 },
 
  593  { AArch64::LD3Threev8b_POST,  
"ld3",  
".8b",    1, 
false, 24 },
 
  594  { AArch64::LD3Threev4h_POST,  
"ld3",  
".4h",    1, 
false, 24 },
 
  595  { AArch64::LD3Threev2s_POST,  
"ld3",  
".2s",    1, 
false, 24 },
 
  596  { AArch64::LD4i8,             
"ld4",  
".b",     1, 
true,  0  },
 
  597  { AArch64::LD4i16,            
"ld4",  
".h",     1, 
true,  0  },
 
  598  { AArch64::LD4i32,            
"ld4",  
".s",     1, 
true,  0  },
 
  599  { AArch64::LD4i64,            
"ld4",  
".d",     1, 
true,  0  },
 
  600  { AArch64::LD4i8_POST,        
"ld4",  
".b",     2, 
true,  4  },
 
  601  { AArch64::LD4i16_POST,       
"ld4",  
".h",     2, 
true,  8  },
 
  602  { AArch64::LD4i32_POST,       
"ld4",  
".s",     2, 
true,  16 },
 
  603  { AArch64::LD4i64_POST,       
"ld4",  
".d",     2, 
true,  32 },
 
  604  { AArch64::LD4Rv16b,          
"ld4r", 
".16b",   0, 
false, 0  },
 
  605  { AArch64::LD4Rv8h,           
"ld4r", 
".8h",    0, 
false, 0  },
 
  606  { AArch64::LD4Rv4s,           
"ld4r", 
".4s",    0, 
false, 0  },
 
  607  { AArch64::LD4Rv2d,           
"ld4r", 
".2d",    0, 
false, 0  },
 
  608  { AArch64::LD4Rv8b,           
"ld4r", 
".8b",    0, 
false, 0  },
 
  609  { AArch64::LD4Rv4h,           
"ld4r", 
".4h",    0, 
false, 0  },
 
  610  { AArch64::LD4Rv2s,           
"ld4r", 
".2s",    0, 
false, 0  },
 
  611  { AArch64::LD4Rv1d,           
"ld4r", 
".1d",    0, 
false, 0  },
 
  612  { AArch64::LD4Rv16b_POST,     
"ld4r", 
".16b",   1, 
false, 4  },
 
  613  { AArch64::LD4Rv8h_POST,      
"ld4r", 
".8h",    1, 
false, 8  },
 
  614  { AArch64::LD4Rv4s_POST,      
"ld4r", 
".4s",    1, 
false, 16 },
 
  615  { AArch64::LD4Rv2d_POST,      
"ld4r", 
".2d",    1, 
false, 32 },
 
  616  { AArch64::LD4Rv8b_POST,      
"ld4r", 
".8b",    1, 
false, 4  },
 
  617  { AArch64::LD4Rv4h_POST,      
"ld4r", 
".4h",    1, 
false, 8  },
 
  618  { AArch64::LD4Rv2s_POST,      
"ld4r", 
".2s",    1, 
false, 16 },
 
  619  { AArch64::LD4Rv1d_POST,      
"ld4r", 
".1d",    1, 
false, 32 },
 
  620  { AArch64::LD4Fourv16b,       
"ld4",  
".16b",   0, 
false, 0  },
 
  621  { AArch64::LD4Fourv8h,        
"ld4",  
".8h",    0, 
false, 0  },
 
  622  { AArch64::LD4Fourv4s,        
"ld4",  
".4s",    0, 
false, 0  },
 
  623  { AArch64::LD4Fourv2d,        
"ld4",  
".2d",    0, 
false, 0  },
 
  624  { AArch64::LD4Fourv8b,        
"ld4",  
".8b",    0, 
false, 0  },
 
  625  { AArch64::LD4Fourv4h,        
"ld4",  
".4h",    0, 
false, 0  },
 
  626  { AArch64::LD4Fourv2s,        
"ld4",  
".2s",    0, 
false, 0  },
 
  627  { AArch64::LD4Fourv16b_POST,  
"ld4",  
".16b",   1, 
false, 64 },
 
  628  { AArch64::LD4Fourv8h_POST,   
"ld4",  
".8h",    1, 
false, 64 },
 
  629  { AArch64::LD4Fourv4s_POST,   
"ld4",  
".4s",    1, 
false, 64 },
 
  630  { AArch64::LD4Fourv2d_POST,   
"ld4",  
".2d",    1, 
false, 64 },
 
  631  { AArch64::LD4Fourv8b_POST,   
"ld4",  
".8b",    1, 
false, 32 },
 
  632  { AArch64::LD4Fourv4h_POST,   
"ld4",  
".4h",    1, 
false, 32 },
 
  633  { AArch64::LD4Fourv2s_POST,   
"ld4",  
".2s",    1, 
false, 32 },
 
  634  { AArch64::ST1i8,             
"st1",  
".b",     0, 
true,  0  },
 
  635  { AArch64::ST1i16,            
"st1",  
".h",     0, 
true,  0  },
 
  636  { AArch64::ST1i32,            
"st1",  
".s",     0, 
true,  0  },
 
  637  { AArch64::ST1i64,            
"st1",  
".d",     0, 
true,  0  },
 
  638  { AArch64::ST1i8_POST,        
"st1",  
".b",     1, 
true,  1  },
 
  639  { AArch64::ST1i16_POST,       
"st1",  
".h",     1, 
true,  2  },
 
  640  { AArch64::ST1i32_POST,       
"st1",  
".s",     1, 
true,  4  },
 
  641  { AArch64::ST1i64_POST,       
"st1",  
".d",     1, 
true,  8  },
 
  642  { AArch64::ST1Onev16b,        
"st1",  
".16b",   0, 
false, 0  },
 
  643  { AArch64::ST1Onev8h,         
"st1",  
".8h",    0, 
false, 0  },
 
  644  { AArch64::ST1Onev4s,         
"st1",  
".4s",    0, 
false, 0  },
 
  645  { AArch64::ST1Onev2d,         
"st1",  
".2d",    0, 
false, 0  },
 
  646  { AArch64::ST1Onev8b,         
"st1",  
".8b",    0, 
false, 0  },
 
  647  { AArch64::ST1Onev4h,         
"st1",  
".4h",    0, 
false, 0  },
 
  648  { AArch64::ST1Onev2s,         
"st1",  
".2s",    0, 
false, 0  },
 
  649  { AArch64::ST1Onev1d,         
"st1",  
".1d",    0, 
false, 0  },
 
  650  { AArch64::ST1Onev16b_POST,   
"st1",  
".16b",   1, 
false, 16 },
 
  651  { AArch64::ST1Onev8h_POST,    
"st1",  
".8h",    1, 
false, 16 },
 
  652  { AArch64::ST1Onev4s_POST,    
"st1",  
".4s",    1, 
false, 16 },
 
  653  { AArch64::ST1Onev2d_POST,    
"st1",  
".2d",    1, 
false, 16 },
 
  654  { AArch64::ST1Onev8b_POST,    
"st1",  
".8b",    1, 
false, 8  },
 
  655  { AArch64::ST1Onev4h_POST,    
"st1",  
".4h",    1, 
false, 8  },
 
  656  { AArch64::ST1Onev2s_POST,    
"st1",  
".2s",    1, 
false, 8  },
 
  657  { AArch64::ST1Onev1d_POST,    
"st1",  
".1d",    1, 
false, 8  },
 
  658  { AArch64::ST1Twov16b,        
"st1",  
".16b",   0, 
false, 0  },
 
  659  { AArch64::ST1Twov8h,         
"st1",  
".8h",    0, 
false, 0  },
 
  660  { AArch64::ST1Twov4s,         
"st1",  
".4s",    0, 
false, 0  },
 
  661  { AArch64::ST1Twov2d,         
"st1",  
".2d",    0, 
false, 0  },
 
  662  { AArch64::ST1Twov8b,         
"st1",  
".8b",    0, 
false, 0  },
 
  663  { AArch64::ST1Twov4h,         
"st1",  
".4h",    0, 
false, 0  },
 
  664  { AArch64::ST1Twov2s,         
"st1",  
".2s",    0, 
false, 0  },
 
  665  { AArch64::ST1Twov1d,         
"st1",  
".1d",    0, 
false, 0  },
 
  666  { AArch64::ST1Twov16b_POST,   
"st1",  
".16b",   1, 
false, 32 },
 
  667  { AArch64::ST1Twov8h_POST,    
"st1",  
".8h",    1, 
false, 32 },
 
  668  { AArch64::ST1Twov4s_POST,    
"st1",  
".4s",    1, 
false, 32 },
 
  669  { AArch64::ST1Twov2d_POST,    
"st1",  
".2d",    1, 
false, 32 },
 
  670  { AArch64::ST1Twov8b_POST,    
"st1",  
".8b",    1, 
false, 16 },
 
  671  { AArch64::ST1Twov4h_POST,    
"st1",  
".4h",    1, 
false, 16 },
 
  672  { AArch64::ST1Twov2s_POST,    
"st1",  
".2s",    1, 
false, 16 },
 
  673  { AArch64::ST1Twov1d_POST,    
"st1",  
".1d",    1, 
false, 16 },
 
  674  { AArch64::ST1Threev16b,      
"st1",  
".16b",   0, 
false, 0  },
 
  675  { AArch64::ST1Threev8h,       
"st1",  
".8h",    0, 
false, 0  },
 
  676  { AArch64::ST1Threev4s,       
"st1",  
".4s",    0, 
false, 0  },
 
  677  { AArch64::ST1Threev2d,       
"st1",  
".2d",    0, 
false, 0  },
 
  678  { AArch64::ST1Threev8b,       
"st1",  
".8b",    0, 
false, 0  },
 
  679  { AArch64::ST1Threev4h,       
"st1",  
".4h",    0, 
false, 0  },
 
  680  { AArch64::ST1Threev2s,       
"st1",  
".2s",    0, 
false, 0  },
 
  681  { AArch64::ST1Threev1d,       
"st1",  
".1d",    0, 
false, 0  },
 
  682  { AArch64::ST1Threev16b_POST, 
"st1",  
".16b",   1, 
false, 48 },
 
  683  { AArch64::ST1Threev8h_POST,  
"st1",  
".8h",    1, 
false, 48 },
 
  684  { AArch64::ST1Threev4s_POST,  
"st1",  
".4s",    1, 
false, 48 },
 
  685  { AArch64::ST1Threev2d_POST,  
"st1",  
".2d",    1, 
false, 48 },
 
  686  { AArch64::ST1Threev8b_POST,  
"st1",  
".8b",    1, 
false, 24 },
 
  687  { AArch64::ST1Threev4h_POST,  
"st1",  
".4h",    1, 
false, 24 },
 
  688  { AArch64::ST1Threev2s_POST,  
"st1",  
".2s",    1, 
false, 24 },
 
  689  { AArch64::ST1Threev1d_POST,  
"st1",  
".1d",    1, 
false, 24 },
 
  690  { AArch64::ST1Fourv16b,       
"st1",  
".16b",   0, 
false, 0  },
 
  691  { AArch64::ST1Fourv8h,        
"st1",  
".8h",    0, 
false, 0  },
 
  692  { AArch64::ST1Fourv4s,        
"st1",  
".4s",    0, 
false, 0  },
 
  693  { AArch64::ST1Fourv2d,        
"st1",  
".2d",    0, 
false, 0  },
 
  694  { AArch64::ST1Fourv8b,        
"st1",  
".8b",    0, 
false, 0  },
 
  695  { AArch64::ST1Fourv4h,        
"st1",  
".4h",    0, 
false, 0  },
 
  696  { AArch64::ST1Fourv2s,        
"st1",  
".2s",    0, 
false, 0  },
 
  697  { AArch64::ST1Fourv1d,        
"st1",  
".1d",    0, 
false, 0  },
 
  698  { AArch64::ST1Fourv16b_POST,  
"st1",  
".16b",   1, 
false, 64 },
 
  699  { AArch64::ST1Fourv8h_POST,   
"st1",  
".8h",    1, 
false, 64 },
 
  700  { AArch64::ST1Fourv4s_POST,   
"st1",  
".4s",    1, 
false, 64 },
 
  701  { AArch64::ST1Fourv2d_POST,   
"st1",  
".2d",    1, 
false, 64 },
 
  702  { AArch64::ST1Fourv8b_POST,   
"st1",  
".8b",    1, 
false, 32 },
 
  703  { AArch64::ST1Fourv4h_POST,   
"st1",  
".4h",    1, 
false, 32 },
 
  704  { AArch64::ST1Fourv2s_POST,   
"st1",  
".2s",    1, 
false, 32 },
 
  705  { AArch64::ST1Fourv1d_POST,   
"st1",  
".1d",    1, 
false, 32 },
 
  706  { AArch64::ST2i8,             
"st2",  
".b",     0, 
true,  0  },
 
  707  { AArch64::ST2i16,            
"st2",  
".h",     0, 
true,  0  },
 
  708  { AArch64::ST2i32,            
"st2",  
".s",     0, 
true,  0  },
 
  709  { AArch64::ST2i64,            
"st2",  
".d",     0, 
true,  0  },
 
  710  { AArch64::ST2i8_POST,        
"st2",  
".b",     1, 
true,  2  },
 
  711  { AArch64::ST2i16_POST,       
"st2",  
".h",     1, 
true,  4  },
 
  712  { AArch64::ST2i32_POST,       
"st2",  
".s",     1, 
true,  8  },
 
  713  { AArch64::ST2i64_POST,       
"st2",  
".d",     1, 
true,  16 },
 
  714  { AArch64::ST2Twov16b,        
"st2",  
".16b",   0, 
false, 0  },
 
  715  { AArch64::ST2Twov8h,         
"st2",  
".8h",    0, 
false, 0  },
 
  716  { AArch64::ST2Twov4s,         
"st2",  
".4s",    0, 
false, 0  },
 
  717  { AArch64::ST2Twov2d,         
"st2",  
".2d",    0, 
false, 0  },
 
  718  { AArch64::ST2Twov8b,         
"st2",  
".8b",    0, 
false, 0  },
 
  719  { AArch64::ST2Twov4h,         
"st2",  
".4h",    0, 
false, 0  },
 
  720  { AArch64::ST2Twov2s,         
"st2",  
".2s",    0, 
false, 0  },
 
  721  { AArch64::ST2Twov16b_POST,   
"st2",  
".16b",   1, 
false, 32 },
 
  722  { AArch64::ST2Twov8h_POST,    
"st2",  
".8h",    1, 
false, 32 },
 
  723  { AArch64::ST2Twov4s_POST,    
"st2",  
".4s",    1, 
false, 32 },
 
  724  { AArch64::ST2Twov2d_POST,    
"st2",  
".2d",    1, 
false, 32 },
 
  725  { AArch64::ST2Twov8b_POST,    
"st2",  
".8b",    1, 
false, 16 },
 
  726  { AArch64::ST2Twov4h_POST,    
"st2",  
".4h",    1, 
false, 16 },
 
  727  { AArch64::ST2Twov2s_POST,    
"st2",  
".2s",    1, 
false, 16 },
 
  728  { AArch64::ST3i8,             
"st3",  
".b",     0, 
true,  0  },
 
  729  { AArch64::ST3i16,            
"st3",  
".h",     0, 
true,  0  },
 
  730  { AArch64::ST3i32,            
"st3",  
".s",     0, 
true,  0  },
 
  731  { AArch64::ST3i64,            
"st3",  
".d",     0, 
true,  0  },
 
  732  { AArch64::ST3i8_POST,        
"st3",  
".b",     1, 
true,  3  },
 
  733  { AArch64::ST3i16_POST,       
"st3",  
".h",     1, 
true,  6  },
 
  734  { AArch64::ST3i32_POST,       
"st3",  
".s",     1, 
true,  12 },
 
  735  { AArch64::ST3i64_POST,       
"st3",  
".d",     1, 
true,  24 },
 
  736  { AArch64::ST3Threev16b,      
"st3",  
".16b",   0, 
false, 0  },
 
  737  { AArch64::ST3Threev8h,       
"st3",  
".8h",    0, 
false, 0  },
 
  738  { AArch64::ST3Threev4s,       
"st3",  
".4s",    0, 
false, 0  },
 
  739  { AArch64::ST3Threev2d,       
"st3",  
".2d",    0, 
false, 0  },
 
  740  { AArch64::ST3Threev8b,       
"st3",  
".8b",    0, 
false, 0  },
 
  741  { AArch64::ST3Threev4h,       
"st3",  
".4h",    0, 
false, 0  },
 
  742  { AArch64::ST3Threev2s,       
"st3",  
".2s",    0, 
false, 0  },
 
  743  { AArch64::ST3Threev16b_POST, 
"st3",  
".16b",   1, 
false, 48 },
 
  744  { AArch64::ST3Threev8h_POST,  
"st3",  
".8h",    1, 
false, 48 },
 
  745  { AArch64::ST3Threev4s_POST,  
"st3",  
".4s",    1, 
false, 48 },
 
  746  { AArch64::ST3Threev2d_POST,  
"st3",  
".2d",    1, 
false, 48 },
 
  747  { AArch64::ST3Threev8b_POST,  
"st3",  
".8b",    1, 
false, 24 },
 
  748  { AArch64::ST3Threev4h_POST,  
"st3",  
".4h",    1, 
false, 24 },
 
  749  { AArch64::ST3Threev2s_POST,  
"st3",  
".2s",    1, 
false, 24 },
 
  750  { AArch64::ST4i8,             
"st4",  
".b",     0, 
true,  0  },
 
  751  { AArch64::ST4i16,            
"st4",  
".h",     0, 
true,  0  },
 
  752  { AArch64::ST4i32,            
"st4",  
".s",     0, 
true,  0  },
 
  753  { AArch64::ST4i64,            
"st4",  
".d",     0, 
true,  0  },
 
  754  { AArch64::ST4i8_POST,        
"st4",  
".b",     1, 
true,  4  },
 
  755  { AArch64::ST4i16_POST,       
"st4",  
".h",     1, 
true,  8  },
 
  756  { AArch64::ST4i32_POST,       
"st4",  
".s",     1, 
true,  16 },
 
  757  { AArch64::ST4i64_POST,       
"st4",  
".d",     1, 
true,  32 },
 
  758  { AArch64::ST4Fourv16b,       
"st4",  
".16b",   0, 
false, 0  },
 
  759  { AArch64::ST4Fourv8h,        
"st4",  
".8h",    0, 
false, 0  },
 
  760  { AArch64::ST4Fourv4s,        
"st4",  
".4s",    0, 
false, 0  },
 
  761  { AArch64::ST4Fourv2d,        
"st4",  
".2d",    0, 
false, 0  },
 
  762  { AArch64::ST4Fourv8b,        
"st4",  
".8b",    0, 
false, 0  },
 
  763  { AArch64::ST4Fourv4h,        
"st4",  
".4h",    0, 
false, 0  },
 
  764  { AArch64::ST4Fourv2s,        
"st4",  
".2s",    0, 
false, 0  },
 
  765  { AArch64::ST4Fourv16b_POST,  
"st4",  
".16b",   1, 
false, 64 },
 
  766  { AArch64::ST4Fourv8h_POST,   
"st4",  
".8h",    1, 
false, 64 },
 
  767  { AArch64::ST4Fourv4s_POST,   
"st4",  
".4s",    1, 
false, 64 },
 
  768  { AArch64::ST4Fourv2d_POST,   
"st4",  
".2d",    1, 
false, 64 },
 
  769  { AArch64::ST4Fourv8b_POST,   
"st4",  
".8b",    1, 
false, 32 },
 
  770  { AArch64::ST4Fourv4h_POST,   
"st4",  
".4h",    1, 
false, 32 },
 
  771  { AArch64::ST4Fourv2s_POST,   
"st4",  
".2s",    1, 
false, 32 },
 
 
  776    if (
Info.Opcode == Opcode)
 
 
  786  unsigned Opcode = 
MI->getOpcode();
 
  791    O << 
"\t" << (IsTbx ? 
"tbx" : 
"tbl") << Layout << 
'\t';
 
  795    unsigned ListOpNum = IsTbx ? 2 : 1;
 
  799    printRegName(O, 
MI->getOperand(ListOpNum + 1).getReg(), AArch64::vreg);
 
  805    O << 
"\t" << LdStDesc->Mnemonic << LdStDesc->Layout << 
'\t';
 
  809    int OpNum = LdStDesc->ListOperand;
 
  812    if (LdStDesc->HasLane)
 
  813      O << 
'[' << 
MI->getOperand(OpNum++).getImm() << 
']';
 
  822    if (LdStDesc->NaturalOffset != 0) {
 
  824      if (Reg != AArch64::XZR) {
 
  828        assert(LdStDesc->NaturalOffset && 
"no offset on post-inc instruction?");
 
 
  849  unsigned Opcode = 
MI->getOpcode();
 
  852  assert(((Opcode == AArch64::PRFMroX) || (Opcode == AArch64::PRFMroW)) &&
 
  853         "Invalid opcode for RPRFM alias!");
 
  856  unsigned PRFOp = 
MI->getOperand(0).getImm();
 
  857  unsigned Mask = 0x18; 
 
  858  if ((PRFOp & Mask) != Mask)
 
  864  if (
MRI.getRegClass(AArch64::GPR32RegClassID).contains(Rm))
 
  865    Rm = 
MRI.getMatchingSuperReg(Rm, AArch64::sub_32,
 
  866                                 &
MRI.getRegClass(AArch64::GPR64RegClassID));
 
  868  unsigned SignExtend = 
MI->getOperand(3).getImm(); 
 
  869  unsigned Shift = 
MI->getOperand(4).getImm();      
 
  871  assert((SignExtend <= 1) && 
"sign extend should be a single bit!");
 
  872  assert((Shift <= 1) && 
"Shift should be a single bit!");
 
  874  unsigned Option0 = (Opcode == AArch64::PRFMroX) ? 1 : 0;
 
  878      (SignExtend << 5) | (Option0 << 4) | (Shift << 3) | (PRFOp & 0x7);
 
  881  if (
auto RPRFM = AArch64RPRFM::lookupRPRFMByEncoding(RPRFOp))
 
  882    O << RPRFM->Name << 
", ";
 
 
  899  unsigned Opcode = 
MI->getOpcode();
 
  900  assert(Opcode == AArch64::SYSxt && 
"Invalid opcode for SYS alias!");
 
  908  unsigned Op1Val = Op1.
getImm();
 
  909  unsigned CnVal = Cn.
getImm();
 
  910  unsigned CmVal = Cm.
getImm();
 
  911  unsigned Op2Val = Op2.
getImm();
 
  914  Encoding |= CmVal << 3;
 
  915  Encoding |= CnVal << 7;
 
  916  Encoding |= Op1Val << 11;
 
  918  bool NeedsReg = 
false;
 
  919  bool OptionalReg = 
false;
 
  925    default: 
return false;
 
  929          AArch64MLBI::lookupMLBIByEncoding(Encoding);
 
  935      Name = std::string(MLBI->
Name);
 
  940      default: 
return false;
 
  941      case 0: 
goto Search_IC;
 
  942      case 3: 
goto Search_PRCTX;
 
  947      if (Op1Val != 3 || CnVal != 7 || CmVal != 3)
 
  950      const auto Requires =
 
  951          Op2Val == 6 ? AArch64::FeatureSPECRES2 : AArch64::FeaturePredRes;
 
  957      default: 
return false;
 
  958      case 4: Ins = 
"cfp\t"; 
break;
 
  959      case 5: Ins = 
"dvp\t"; 
break;
 
  960      case 6: Ins = 
"cosp\t"; 
break;
 
  961      case 7: Ins = 
"cpp\t"; 
break;
 
  969      const AArch64IC::IC *IC = AArch64IC::lookupICByEncoding(Encoding);
 
  975      Name = std::string(IC->
Name);
 
  979    case 4: 
case 6: 
case 10: 
case 11: 
case 12: 
case 13: 
case 14:
 
  981      const AArch64DC::DC *DC = AArch64DC::lookupDCByEncoding(Encoding);
 
  987      Name = std::string(DC->
Name);
 
  992      const AArch64AT::AT *AT = AArch64AT::lookupATByEncoding(Encoding);
 
  998      Name = std::string(AT->
Name);
 
 1003      const AArch64AT::AT *AT = AArch64AT::lookupATByEncoding(Encoding);
 
 1004      const AArch64DC::DC *DC = AArch64DC::lookupDCByEncoding(Encoding);
 
 1008        Name = std::string(AT->
Name);
 
 1012        Name = std::string(DC->
Name);
 
 1018  } 
else if (CnVal == 8 || CnVal == 9) {
 
 1029    Name = std::string(TLBI->
Name);
 
 1030  } 
else if (CnVal == 12) {
 
 1033      const AArch64GIC::GIC *GIC = AArch64GIC::lookupGICByEncoding(Encoding);
 
 1039      Name = std::string(GIC->
Name);
 
 1042      const AArch64GSB::GSB *GSB = AArch64GSB::lookupGSBByEncoding(Encoding);
 
 1048      Name = std::string(GSB->
Name);
 
 1054  bool NotXZR = Reg != 
"xzr";
 
 1059  if (NotXZR && !NeedsReg && !OptionalReg)
 
 1062  std::string Str = Ins + Name;
 
 1069  if (NeedsReg || (OptionalReg && NotXZR))
 
 
 1079  unsigned Opcode = 
MI->getOpcode();
 
 1080  assert(Opcode == AArch64::SYSLxt && 
"Invalid opcode for SYSL alias!");
 
 1089  unsigned Op1Val = Op1.
getImm();
 
 1090  unsigned CnVal = Cn.
getImm();
 
 1091  unsigned CmVal = Cm.
getImm();
 
 1092  unsigned Op2Val = Op2.
getImm();
 
 1095  Encoding |= CmVal << 3;
 
 1096  Encoding |= CnVal << 7;
 
 1097  Encoding |= Op1Val << 11;
 
 1106          AArch64GICR::lookupGICRByEncoding(Encoding);
 
 1111      Name = std::string(GICR->
Name);
 
 1119  O << 
'\t' << Ins << 
'\t' << Reg.str() << 
", " << Name;
 
 
 1128  unsigned Opcode = 
MI->getOpcode();
 
 1129  assert((Opcode == AArch64::SYSPxt || Opcode == AArch64::SYSPxt_XZR) &&
 
 1130         "Invalid opcode for SYSP alias!");
 
 1138  unsigned Op1Val = Op1.
getImm();
 
 1139  unsigned CnVal = Cn.
getImm();
 
 1140  unsigned CmVal = Cm.
getImm();
 
 1141  unsigned Op2Val = Op2.
getImm();
 
 1144  Encoding |= CmVal << 3;
 
 1145  Encoding |= CnVal << 7;
 
 1146  Encoding |= Op1Val << 11;
 
 1151  if (CnVal == 8 || CnVal == 9) {
 
 1157      Encoding &= ~(1 << 7);
 
 1161        AArch64TLBIP::lookupTLBIPByEncoding(Encoding);
 
 1166    Name = std::string(TLBIP->
Name);
 
 1172  std::string Str = Ins + Name;
 
 1177  if (
MI->getOperand(4).getReg() == AArch64::XZR)
 
 
 1185template <
int EltSize>
 
 1190  assert(RegOp.
isReg() && 
"Unexpected operand type!");
 
 
 1216template <
bool IsVertical>
 
 1221  assert(RegOp.
isReg() && 
"Unexpected operand type!");
 
 1227  O << 
Base << (IsVertical ? 
"v" : 
"h") << 
'.' << Suffix;
 
 
 1234  assert(RegOp.
isReg() && 
"Unexpected operand type!");
 
 
 1243  unsigned svcrop = MO.
getImm();
 
 1244  const auto *SVCR = AArch64SVCR::lookupSVCRByEncoding(svcrop);
 
 1245  assert(SVCR && 
"Unexpected SVCR operand!");
 
 
 1255  } 
else if (
Op.isImm()) {
 
 1258    assert(
Op.isExpr() && 
"unknown operand kind in printOperand");
 
 1259    MAI.printExpr(O, *
Op.getExpr());
 
 
 1284  else if (
Size == 16)
 
 
 1295    if (Reg == AArch64::XZR)
 
 
 1307  assert(
Op.isReg() && 
"Non-register vreg operand!");
 
 
 1315  assert(
Op.isImm() && 
"System instruction C[nm] operands must be immediates!");
 
 1316  O << 
"c" << 
Op.getImm();
 
 
 1324    unsigned Val = (MO.
getImm() & 0xfff);
 
 1325    assert(Val == MO.
getImm() && 
"Add/sub immediate out of range!");
 
 
 1341template <
typename T>
 
 1345  uint64_t Val = 
MI->getOperand(OpNum).getImm();
 
 
 1354  unsigned Val = 
MI->getOperand(OpNum).getImm();
 
 
 1381  unsigned Val = 
MI->getOperand(OpNum).getImm();
 
 1391    if ( ((Dest == AArch64::SP || Src1 == AArch64::SP) &&
 
 1393         ((Dest == AArch64::WSP || Src1 == AArch64::WSP) &&
 
 1395      if (ShiftVal != 0) {
 
 1403  if (ShiftVal != 0) {
 
 
 1410                                            unsigned Width, 
char SrcRegKind,
 
 1413  bool IsLSL = !SignExtend && SrcRegKind == 
'x';
 
 1417    O << (SignExtend ? 
's' : 
'u') << 
"xt" << SrcRegKind;
 
 1419  if (DoShift || IsLSL) {
 
 
 1428  bool SignExtend = 
MI->getOperand(OpNum).getImm();
 
 1429  bool DoShift = 
MI->getOperand(OpNum + 1).getImm();
 
 
 1433template <
bool SignExtend, 
int ExtW
idth, 
char SrcRegKind, 
char Suffix>
 
 1439  if (Suffix == 
's' || Suffix == 
'd')
 
 1442    assert(Suffix == 0 && 
"Unsupported suffix size");
 
 1444  bool DoShift = ExtWidth != 8;
 
 1445  if (SignExtend || DoShift || SrcRegKind == 
'w') {
 
 
 1451template <
int EltSize>
 
 1459  O << 
"pn" << Reg - AArch64::PN0;
 
 
 1508      << 
'#' << 
formatImm(Scale * 
MI->getOperand(OpNum).getImm());
 
 
 1511template <
int Scale, 
int Offset>
 
 1515  unsigned FirstImm = Scale * 
MI->getOperand(OpNum).getImm();
 
 
 1550  unsigned prfop = 
MI->getOperand(OpNum).getImm();
 
 1551  if (
auto PRFM = AArch64RPRFM::lookupRPRFMByEncoding(prfop)) {
 
 
 1559template <
bool IsSVEPrefetch>
 
 1563  unsigned prfop = 
MI->getOperand(OpNum).getImm();
 
 1564  if (IsSVEPrefetch) {
 
 1565    if (
auto PRFM = AArch64SVEPRFM::lookupSVEPRFMByEncoding(prfop)) {
 
 1570    auto PRFM = AArch64PRFM::lookupPRFMByEncoding(prfop);
 
 
 1583  unsigned psbhintop = 
MI->getOperand(OpNum).getImm();
 
 1584  auto PSB = AArch64PSBHint::lookupPSBByEncoding(psbhintop);
 
 
 1594  unsigned btihintop = 
MI->getOperand(OpNum).getImm() ^ 32;
 
 1595  auto BTI = AArch64BTIHint::lookupBTIByEncoding(btihintop);
 
 
 1606  unsigned priorityhint_op = 
MI->getOperand(OpNum).getImm();
 
 1608      AArch64CMHPriorityHint::lookupCMHPriorityHintByEncoding(priorityhint_op);
 
 
 1629    case AArch64::Q0:  
Reg = AArch64::Q1;  
break;
 
 1630    case AArch64::Q1:  
Reg = AArch64::Q2;  
break;
 
 1631    case AArch64::Q2:  
Reg = AArch64::Q3;  
break;
 
 1632    case AArch64::Q3:  
Reg = AArch64::Q4;  
break;
 
 1633    case AArch64::Q4:  
Reg = AArch64::Q5;  
break;
 
 1634    case AArch64::Q5:  
Reg = AArch64::Q6;  
break;
 
 1635    case AArch64::Q6:  
Reg = AArch64::Q7;  
break;
 
 1636    case AArch64::Q7:  
Reg = AArch64::Q8;  
break;
 
 1637    case AArch64::Q8:  
Reg = AArch64::Q9;  
break;
 
 1638    case AArch64::Q9:  
Reg = AArch64::Q10; 
break;
 
 1639    case AArch64::Q10: 
Reg = AArch64::Q11; 
break;
 
 1640    case AArch64::Q11: 
Reg = AArch64::Q12; 
break;
 
 1641    case AArch64::Q12: 
Reg = AArch64::Q13; 
break;
 
 1642    case AArch64::Q13: 
Reg = AArch64::Q14; 
break;
 
 1643    case AArch64::Q14: 
Reg = AArch64::Q15; 
break;
 
 1644    case AArch64::Q15: 
Reg = AArch64::Q16; 
break;
 
 1645    case AArch64::Q16: 
Reg = AArch64::Q17; 
break;
 
 1646    case AArch64::Q17: 
Reg = AArch64::Q18; 
break;
 
 1647    case AArch64::Q18: 
Reg = AArch64::Q19; 
break;
 
 1648    case AArch64::Q19: 
Reg = AArch64::Q20; 
break;
 
 1649    case AArch64::Q20: 
Reg = AArch64::Q21; 
break;
 
 1650    case AArch64::Q21: 
Reg = AArch64::Q22; 
break;
 
 1651    case AArch64::Q22: 
Reg = AArch64::Q23; 
break;
 
 1652    case AArch64::Q23: 
Reg = AArch64::Q24; 
break;
 
 1653    case AArch64::Q24: 
Reg = AArch64::Q25; 
break;
 
 1654    case AArch64::Q25: 
Reg = AArch64::Q26; 
break;
 
 1655    case AArch64::Q26: 
Reg = AArch64::Q27; 
break;
 
 1656    case AArch64::Q27: 
Reg = AArch64::Q28; 
break;
 
 1657    case AArch64::Q28: 
Reg = AArch64::Q29; 
break;
 
 1658    case AArch64::Q29: 
Reg = AArch64::Q30; 
break;
 
 1659    case AArch64::Q30: 
Reg = AArch64::Q31; 
break;
 
 1664    case AArch64::Z0:  
Reg = AArch64::Z1;  
break;
 
 1665    case AArch64::Z1:  
Reg = AArch64::Z2;  
break;
 
 1666    case AArch64::Z2:  
Reg = AArch64::Z3;  
break;
 
 1667    case AArch64::Z3:  
Reg = AArch64::Z4;  
break;
 
 1668    case AArch64::Z4:  
Reg = AArch64::Z5;  
break;
 
 1669    case AArch64::Z5:  
Reg = AArch64::Z6;  
break;
 
 1670    case AArch64::Z6:  
Reg = AArch64::Z7;  
break;
 
 1671    case AArch64::Z7:  
Reg = AArch64::Z8;  
break;
 
 1672    case AArch64::Z8:  
Reg = AArch64::Z9;  
break;
 
 1673    case AArch64::Z9:  
Reg = AArch64::Z10; 
break;
 
 1674    case AArch64::Z10: 
Reg = AArch64::Z11; 
break;
 
 1675    case AArch64::Z11: 
Reg = AArch64::Z12; 
break;
 
 1676    case AArch64::Z12: 
Reg = AArch64::Z13; 
break;
 
 1677    case AArch64::Z13: 
Reg = AArch64::Z14; 
break;
 
 1678    case AArch64::Z14: 
Reg = AArch64::Z15; 
break;
 
 1679    case AArch64::Z15: 
Reg = AArch64::Z16; 
break;
 
 1680    case AArch64::Z16: 
Reg = AArch64::Z17; 
break;
 
 1681    case AArch64::Z17: 
Reg = AArch64::Z18; 
break;
 
 1682    case AArch64::Z18: 
Reg = AArch64::Z19; 
break;
 
 1683    case AArch64::Z19: 
Reg = AArch64::Z20; 
break;
 
 1684    case AArch64::Z20: 
Reg = AArch64::Z21; 
break;
 
 1685    case AArch64::Z21: 
Reg = AArch64::Z22; 
break;
 
 1686    case AArch64::Z22: 
Reg = AArch64::Z23; 
break;
 
 1687    case AArch64::Z23: 
Reg = AArch64::Z24; 
break;
 
 1688    case AArch64::Z24: 
Reg = AArch64::Z25; 
break;
 
 1689    case AArch64::Z25: 
Reg = AArch64::Z26; 
break;
 
 1690    case AArch64::Z26: 
Reg = AArch64::Z27; 
break;
 
 1691    case AArch64::Z27: 
Reg = AArch64::Z28; 
break;
 
 1692    case AArch64::Z28: 
Reg = AArch64::Z29; 
break;
 
 1693    case AArch64::Z29: 
Reg = AArch64::Z30; 
break;
 
 1694    case AArch64::Z30: 
Reg = AArch64::Z31; 
break;
 
 1699    case AArch64::P0:  
Reg = AArch64::P1;  
break;
 
 1700    case AArch64::P1:  
Reg = AArch64::P2;  
break;
 
 1701    case AArch64::P2:  
Reg = AArch64::P3;  
break;
 
 1702    case AArch64::P3:  
Reg = AArch64::P4;  
break;
 
 1703    case AArch64::P4:  
Reg = AArch64::P5;  
break;
 
 1704    case AArch64::P5:  
Reg = AArch64::P6;  
break;
 
 1705    case AArch64::P6:  
Reg = AArch64::P7;  
break;
 
 1706    case AArch64::P7:  
Reg = AArch64::P8;  
break;
 
 1707    case AArch64::P8:  
Reg = AArch64::P9;  
break;
 
 1708    case AArch64::P9:  
Reg = AArch64::P10; 
break;
 
 1709    case AArch64::P10: 
Reg = AArch64::P11; 
break;
 
 1710    case AArch64::P11: 
Reg = AArch64::P12; 
break;
 
 1711    case AArch64::P12: 
Reg = AArch64::P13; 
break;
 
 1712    case AArch64::P13: 
Reg = AArch64::P14; 
break;
 
 1713    case AArch64::P14: 
Reg = AArch64::P15; 
break;
 
 1715    case AArch64::P15: 
Reg = AArch64::P0; 
break;
 
 
 1721template<
unsigned size>
 
 1726  static_assert(
size == 64 || 
size == 32,
 
 1727                "Template parameter must be either 32 or 64");
 
 1730  unsigned Sube = (
size == 32) ? AArch64::sube32 : AArch64::sube64;
 
 1731  unsigned Subo = (
size == 32) ? AArch64::subo32 : AArch64::subo64;
 
 
 1743  unsigned MaxRegs = 8;
 
 1744  unsigned RegMask = 
MI->getOperand(OpNum).getImm();
 
 1746  unsigned NumRegs = 0;
 
 1747  for (
unsigned I = 0; 
I < MaxRegs; ++
I)
 
 1748    if ((RegMask & (1 << 
I)) != 0)
 
 1752  unsigned Printed = 0;
 
 1753  for (
unsigned I = 0; 
I < MaxRegs; ++
I) {
 
 1754    unsigned Reg = RegMask & (1 << 
I);
 
 1758    if (Printed + 1 != NumRegs)
 
 
 1775  unsigned NumRegs = 1;
 
 1776  if (
MRI.getRegClass(AArch64::DDRegClassID).contains(Reg) ||
 
 1777      MRI.getRegClass(AArch64::ZPR2RegClassID).contains(Reg) ||
 
 1778      MRI.getRegClass(AArch64::QQRegClassID).contains(Reg) ||
 
 1779      MRI.getRegClass(AArch64::PPR2RegClassID).contains(Reg) ||
 
 1780      MRI.getRegClass(AArch64::ZPR2StridedRegClassID).contains(Reg))
 
 1782  else if (
MRI.getRegClass(AArch64::DDDRegClassID).contains(Reg) ||
 
 1783           MRI.getRegClass(AArch64::ZPR3RegClassID).contains(Reg) ||
 
 1784           MRI.getRegClass(AArch64::QQQRegClassID).contains(Reg))
 
 1786  else if (
MRI.getRegClass(AArch64::DDDDRegClassID).contains(Reg) ||
 
 1787           MRI.getRegClass(AArch64::ZPR4RegClassID).contains(Reg) ||
 
 1788           MRI.getRegClass(AArch64::QQQQRegClassID).contains(Reg) ||
 
 1789           MRI.getRegClass(AArch64::ZPR4StridedRegClassID).contains(Reg))
 
 1792  unsigned Stride = 1;
 
 1793  if (
MRI.getRegClass(AArch64::ZPR2StridedRegClassID).contains(Reg))
 
 1795  else if (
MRI.getRegClass(AArch64::ZPR4StridedRegClassID).contains(Reg))
 
 1799  if (
MCRegister FirstReg = 
MRI.getSubReg(Reg, AArch64::dsub0))
 
 1801  else if (
MCRegister FirstReg = 
MRI.getSubReg(Reg, AArch64::qsub0))
 
 1803  else if (
MCRegister FirstReg = 
MRI.getSubReg(Reg, AArch64::zsub0))
 
 1805  else if (
MCRegister FirstReg = 
MRI.getSubReg(Reg, AArch64::psub0))
 
 1810  if (
MRI.getRegClass(AArch64::FPR64RegClassID).contains(Reg)) {
 
 1812        MRI.getRegClass(AArch64::FPR128RegClassID);
 
 1813    Reg = 
MRI.getMatchingSuperReg(Reg, AArch64::dsub, &FPR128RC);
 
 1816  if ((
MRI.getRegClass(AArch64::ZPRRegClassID).contains(Reg) ||
 
 1817       MRI.getRegClass(AArch64::PPRRegClassID).contains(Reg)) &&
 
 1818      NumRegs > 1 && Stride == 1 &&
 
 1826      StringRef split_char = NumRegs == 2 ? 
", " : 
" - ";
 
 1832    for (
unsigned i = 0; i < NumRegs;
 
 1835      if (
MRI.getRegClass(AArch64::ZPRRegClassID).contains(Reg) ||
 
 1836          MRI.getRegClass(AArch64::PPRRegClassID).contains(Reg))
 
 1841      if (i + 1 != NumRegs)
 
 
 1856template <
unsigned NumLanes, 
char LaneKind>
 
 1860  if (LaneKind == 0) {
 
 1864  std::string Suffix(
".");
 
 1866    Suffix += 
itostr(NumLanes) + LaneKind;
 
 
 1873template <
unsigned Scale>
 
 1877  O << 
"[" << Scale * 
MI->getOperand(OpNum).getImm() << 
"]";
 
 
 1880template <
unsigned Scale>
 
 1884  O << Scale * 
MI->getOperand(OpNum).getImm();
 
 
 1911  int64_t TargetAddress;
 
 1912  if (BranchTarget && BranchTarget->evaluateAsAbsolute(TargetAddress)) {
 
 1916    MAI.printExpr(O, *
MI->getOperand(OpNum).getExpr());
 
 
 1936    if (
MI->getOpcode() == AArch64::ADRP) {
 
 1949  MAI.printExpr(O, *
MI->getOperand(OpNum).getExpr());
 
 
 1955  unsigned Val = 
MI->getOperand(OpNo).getImm();
 
 1956  unsigned Opcode = 
MI->getOpcode();
 
 1959  if (Opcode == AArch64::ISB) {
 
 1960    auto ISB = AArch64ISB::lookupISBByEncoding(Val);
 
 1961    Name = ISB ? ISB->Name : 
"";
 
 1962  } 
else if (Opcode == AArch64::TSB) {
 
 1963    auto TSB = AArch64TSB::lookupTSBByEncoding(Val);
 
 1964    Name = TSB ? TSB->Name : 
"";
 
 1966    auto DB = AArch64DB::lookupDBByEncoding(Val);
 
 1967    Name = DB ? DB->Name : 
"";
 
 
 1978  unsigned Val = 
MI->getOperand(OpNo).getImm();
 
 1979  assert(
MI->getOpcode() == AArch64::DSBnXS);
 
 1982  auto DB = AArch64DBnXS::lookupDBnXSByEncoding(Val);
 
 1983  Name = DB ? DB->Name : 
"";
 
 
 1993  return (
Read ? 
Reg.Readable : 
Reg.Writeable) &&
 
 
 2003  auto Range = AArch64SysReg::lookupSysRegByEncoding(Val);
 
 
 2015  unsigned Val = 
MI->getOperand(OpNo).getImm();
 
 2020  if (Val == AArch64SysReg::DBGDTRRX_EL0) {
 
 2021    O << 
"DBGDTRRX_EL0";
 
 2026  if (Val == AArch64SysReg::TRCEXTINSELR) {
 
 2027    O << 
"TRCEXTINSELR";
 
 
 2042  unsigned Val = 
MI->getOperand(OpNo).getImm();
 
 2047  if (Val == AArch64SysReg::DBGDTRTX_EL0) {
 
 2048    O << 
"DBGDTRTX_EL0";
 
 2053  if (Val == AArch64SysReg::TRCEXTINSELR) {
 
 2054    O << 
"TRCEXTINSELR";
 
 
 2069  unsigned Val = 
MI->getOperand(OpNo).getImm();
 
 2071  auto PStateImm15 = AArch64PState::lookupPStateImm0_15ByEncoding(Val);
 
 2072  auto PStateImm1 = AArch64PState::lookupPStateImm0_1ByEncoding(Val);
 
 2073  if (PStateImm15 && PStateImm15->haveFeatures(STI.
getFeatureBits()))
 
 2074    O << PStateImm15->Name;
 
 2075  else if (PStateImm1 && PStateImm1->haveFeatures(STI.
getFeatureBits()))
 
 2076    O << PStateImm1->Name;
 
 
 2084  unsigned RawVal = 
MI->getOperand(OpNo).getImm();
 
 
 2089template<
int64_t Angle, 
int64_t Remainder>
 
 2093  unsigned Val = 
MI->getOperand(OpNo).getImm();
 
 
 2100  unsigned Val = 
MI->getOperand(OpNum).getImm();
 
 2101  if (
auto Pat = AArch64SVEPredPattern::lookupSVEPREDPATByEncoding(Val))
 
 
 2111  unsigned Val = 
MI->getOperand(OpNum).getImm();
 
 2116          AArch64SVEVecLenSpecifier::lookupSVEVECLENSPECIFIERByEncoding(Val))
 
 
 2122template <
char suffix>
 
 2143template <
typename T>
 
 2145  std::make_unsigned_t<T> HexValue = 
Value;
 
 
 2161template <
typename T>
 
 2165  unsigned UnscaledVal = 
MI->getOperand(OpNum).getImm();
 
 2166  unsigned Shift = 
MI->getOperand(OpNum + 1).getImm();
 
 2168         "Unexpected shift type!");
 
 2178  if (std::is_signed<T>())
 
 
 2186template <
typename T>
 
 2190  typedef std::make_signed_t<T> SignedT;
 
 2191  typedef std::make_unsigned_t<T> UnsignedT;
 
 2193  uint64_t Val = 
MI->getOperand(OpNum).getImm();
 
 2197  if ((int16_t)PrintVal == (SignedT)PrintVal)
 
 2199  else if ((
uint16_t)PrintVal == PrintVal)
 
 
 2211  case 8:   
Base = AArch64::B0; 
break;
 
 2212  case 16:  
Base = AArch64::H0; 
break;
 
 2213  case 32:  
Base = AArch64::S0; 
break;
 
 2214  case 64:  
Base = AArch64::D0; 
break;
 
 2215  case 128: 
Base = AArch64::Q0; 
break;
 
 
 2223template <
unsigned ImmIs0, 
unsigned ImmIs1>
 
 2227  auto *Imm0Desc = AArch64ExactFPImm::lookupExactFPImmByEnum(ImmIs0);
 
 2228  auto *Imm1Desc = AArch64ExactFPImm::lookupExactFPImmByEnum(ImmIs1);
 
 2229  unsigned Val = 
MI->getOperand(OpNum).getImm();
 
 2231      << 
"#" << (Val ? Imm1Desc->Repr : Imm0Desc->Repr);
 
 
 2252  assert(Reg == AArch64::XZR &&
 
 2253         "MC representation of SyspXzrPair should be XZR");
 
 
 2260  unsigned Op = 
MI->getOperand(OpNum).getImm();
 
 
static MCRegister getNextVectorRegister(MCRegister Reg, unsigned Stride=1)
 
static const AArch64SysReg::SysReg * lookupSysReg(unsigned Val, bool Read, const MCSubtargetInfo &STI)
 
static const LdStNInstrDesc * getLdStNInstrDesc(unsigned Opcode)
 
static const LdStNInstrDesc LdStNInstInfo[]
 
static bool isValidSysReg(const AArch64SysReg::SysReg &Reg, bool Read, const MCSubtargetInfo &STI)
 
static bool isTblTbxInstruction(unsigned Opcode, StringRef &Layout, bool &IsTbx)
 
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
 
Analysis containing CSE Info
 
ConstantRange Range(APInt(BitWidth, Low), APInt(BitWidth, High))
 
void printInst(const MCInst *MI, uint64_t Address, StringRef Annot, const MCSubtargetInfo &STI, raw_ostream &O) override
Print the specified MCInst to the specified raw_ostream.
 
AArch64AppleInstPrinter(const MCAsmInfo &MAI, const MCInstrInfo &MII, const MCRegisterInfo &MRI)
 
static const char * getRegisterName(MCRegister Reg, unsigned AltIdx=AArch64::NoRegAltName)
 
StringRef getRegName(MCRegister Reg) const override
 
void printMRSSystemRegister(const MCInst *MI, unsigned OpNum, const MCSubtargetInfo &STI, raw_ostream &O)
 
void printImm(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI, raw_ostream &O)
 
void printAlignedLabel(const MCInst *MI, uint64_t Address, unsigned OpNum, const MCSubtargetInfo &STI, raw_ostream &O)
 
void printAMIndexedWB(const MCInst *MI, unsigned OpNum, unsigned Scale, raw_ostream &O)
 
void printMatrix(const MCInst *MI, unsigned OpNum, const MCSubtargetInfo &STI, raw_ostream &O)
 
void printAdrAdrpLabel(const MCInst *MI, uint64_t Address, unsigned OpNum, const MCSubtargetInfo &STI, raw_ostream &O)
 
void printPrefetchOp(const MCInst *MI, unsigned OpNum, const MCSubtargetInfo &STI, raw_ostream &O)
 
void printZPRasFPR(const MCInst *MI, unsigned OpNum, const MCSubtargetInfo &STI, raw_ostream &O)
 
virtual void printInstruction(const MCInst *MI, uint64_t Address, const MCSubtargetInfo &STI, raw_ostream &O)
 
void printAMNoIndex(const MCInst *MI, unsigned OpNum, const MCSubtargetInfo &STI, raw_ostream &O)
 
void printUImm12Offset(const MCInst *MI, unsigned OpNum, unsigned Scale, raw_ostream &O)
 
void printSVCROp(const MCInst *MI, unsigned OpNum, const MCSubtargetInfo &STI, raw_ostream &O)
 
AArch64InstPrinter(const MCAsmInfo &MAI, const MCInstrInfo &MII, const MCRegisterInfo &MRI)
 
void printCondCode(const MCInst *MI, unsigned OpNum, const MCSubtargetInfo &STI, raw_ostream &O)
 
void printBarriernXSOption(const MCInst *MI, unsigned OpNum, const MCSubtargetInfo &STI, raw_ostream &O)
 
void printSystemPStateField(const MCInst *MI, unsigned OpNum, const MCSubtargetInfo &STI, raw_ostream &O)
 
void printShifter(const MCInst *MI, unsigned OpNum, const MCSubtargetInfo &STI, raw_ostream &O)
 
void printPSBHintOp(const MCInst *MI, unsigned OpNum, const MCSubtargetInfo &STI, raw_ostream &O)
 
void printCMHPriorityHintOp(const MCInst *MI, unsigned OpNum, const MCSubtargetInfo &STI, raw_ostream &O)
 
void printGPR64x8(const MCInst *MI, unsigned OpNum, const MCSubtargetInfo &STI, raw_ostream &O)
 
void printSIMDType10Operand(const MCInst *MI, unsigned OpNum, const MCSubtargetInfo &STI, raw_ostream &O)
 
virtual StringRef getRegName(MCRegister Reg) const
 
void printMemExtend(const MCInst *MI, unsigned OpNum, raw_ostream &O, char SrcRegKind, unsigned Width)
 
void printMatrixTileVector(const MCInst *MI, unsigned OpNum, const MCSubtargetInfo &STI, raw_ostream &O)
 
bool printSysAlias(const MCInst *MI, const MCSubtargetInfo &STI, raw_ostream &O)
 
void printSysCROperand(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI, raw_ostream &O)
 
bool applyTargetSpecificCLOption(StringRef Opt) override
Customize the printer according to a command line option.
 
void printRPRFMOperand(const MCInst *MI, unsigned OpNum, const MCSubtargetInfo &STI, raw_ostream &O)
 
void printVectorList(const MCInst *MI, unsigned OpNum, const MCSubtargetInfo &STI, raw_ostream &O, StringRef LayoutSuffix)
 
void printImplicitlyTypedVectorList(const MCInst *MI, unsigned OpNum, const MCSubtargetInfo &STI, raw_ostream &O)
Print a list of vector registers where the type suffix is implicit (i.e.
 
void printGPRSeqPairsClassOperand(const MCInst *MI, unsigned OpNum, const MCSubtargetInfo &STI, raw_ostream &O)
 
void printExtendedRegister(const MCInst *MI, unsigned OpNum, const MCSubtargetInfo &STI, raw_ostream &O)
 
bool printRangePrefetchAlias(const MCInst *MI, const MCSubtargetInfo &STI, raw_ostream &O, StringRef Annot)
 
void printMSRSystemRegister(const MCInst *MI, unsigned OpNum, const MCSubtargetInfo &STI, raw_ostream &O)
 
void printSVERegOp(const MCInst *MI, unsigned OpNum, const MCSubtargetInfo &STI, raw_ostream &O)
 
void printPHintOp(const MCInst *MI, unsigned OpNum, const MCSubtargetInfo &STI, raw_ostream &O)
 
void printMatrixTile(const MCInst *MI, unsigned OpNum, const MCSubtargetInfo &STI, raw_ostream &O)
 
void printFPImmOperand(const MCInst *MI, unsigned OpNum, const MCSubtargetInfo &STI, raw_ostream &O)
 
void printMemExtendImpl(bool SignExtend, bool DoShift, unsigned Width, char SrcRegKind, raw_ostream &O)
 
void printSVEVecLenSpecifier(const MCInst *MI, unsigned OpNum, const MCSubtargetInfo &STI, raw_ostream &O)
 
void printBTIHintOp(const MCInst *MI, unsigned OpNum, const MCSubtargetInfo &STI, raw_ostream &O)
 
void printSyspXzrPair(const MCInst *MI, unsigned OpNum, const MCSubtargetInfo &STI, raw_ostream &O)
 
void printArithExtend(const MCInst *MI, unsigned OpNum, const MCSubtargetInfo &STI, raw_ostream &O)
 
void printOperand(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI, raw_ostream &O)
 
virtual bool printAliasInstr(const MCInst *MI, uint64_t Address, const MCSubtargetInfo &STI, raw_ostream &O)
 
void printImmScale(const MCInst *MI, unsigned OpNum, const MCSubtargetInfo &STI, raw_ostream &O)
 
void printSImm(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI, raw_ostream &O)
 
void printAddSubImm(const MCInst *MI, unsigned OpNum, const MCSubtargetInfo &STI, raw_ostream &O)
 
void printImmSVE(T Value, raw_ostream &O)
 
void printShiftedRegister(const MCInst *MI, unsigned OpNum, const MCSubtargetInfo &STI, raw_ostream &O)
 
void printComplexRotationOp(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI, raw_ostream &O)
 
void printGPR64as32(const MCInst *MI, unsigned OpNum, const MCSubtargetInfo &STI, raw_ostream &O)
 
bool printSyspAlias(const MCInst *MI, const MCSubtargetInfo &STI, raw_ostream &O)
 
void printRegName(raw_ostream &OS, MCRegister Reg) override
Print the assembler register name.
 
void printMatrixTileList(const MCInst *MI, unsigned OpNum, const MCSubtargetInfo &STI, raw_ostream &O)
 
void printMatrixIndex(const MCInst *MI, unsigned OpNum, const MCSubtargetInfo &STI, raw_ostream &O)
 
void printImmRangeScale(const MCInst *MI, unsigned OpNum, const MCSubtargetInfo &STI, raw_ostream &O)
 
void printTypedVectorList(const MCInst *MI, unsigned OpNum, const MCSubtargetInfo &STI, raw_ostream &O)
 
void printInst(const MCInst *MI, uint64_t Address, StringRef Annot, const MCSubtargetInfo &STI, raw_ostream &O) override
Print the specified MCInst to the specified raw_ostream.
 
void printLogicalImm(const MCInst *MI, unsigned OpNum, const MCSubtargetInfo &STI, raw_ostream &O)
 
void printSVEPattern(const MCInst *MI, unsigned OpNum, const MCSubtargetInfo &STI, raw_ostream &O)
 
static const char * getRegisterName(MCRegister Reg, unsigned AltIdx=AArch64::NoRegAltName)
 
void printVRegOperand(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI, raw_ostream &O)
 
void printPostIncOperand(const MCInst *MI, unsigned OpNo, unsigned Imm, raw_ostream &O)
 
void printPredicateAsCounter(const MCInst *MI, unsigned OpNum, const MCSubtargetInfo &STI, raw_ostream &O)
 
void printVectorIndex(const MCInst *MI, unsigned OpNum, const MCSubtargetInfo &STI, raw_ostream &O)
 
bool printSyslAlias(const MCInst *MI, const MCSubtargetInfo &STI, raw_ostream &O)
 
void printImm8OptLsl(const MCInst *MI, unsigned OpNum, const MCSubtargetInfo &STI, raw_ostream &O)
 
void printRegWithShiftExtend(const MCInst *MI, unsigned OpNum, const MCSubtargetInfo &STI, raw_ostream &O)
 
void printImmHex(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI, raw_ostream &O)
 
void printInverseCondCode(const MCInst *MI, unsigned OpNum, const MCSubtargetInfo &STI, raw_ostream &O)
 
void printExactFPImm(const MCInst *MI, unsigned OpNum, const MCSubtargetInfo &STI, raw_ostream &O)
 
void printBarrierOption(const MCInst *MI, unsigned OpNum, const MCSubtargetInfo &STI, raw_ostream &O)
 
void printSVELogicalImm(const MCInst *MI, unsigned OpNum, const MCSubtargetInfo &STI, raw_ostream &O)
 
This class is intended to be used as a base class for asm properties and features specific to the tar...
 
WithMarkup markup(raw_ostream &OS, Markup M)
 
format_object< int64_t > formatHex(int64_t Value) const
 
raw_ostream * CommentStream
A stream that comments can be emitted to if desired.
 
bool getPrintImmHex() const
 
bool SymbolizeOperands
If true, symbolize branch target and memory reference operands.
 
format_object< int64_t > formatDec(int64_t Value) const
Utility functions to print decimal/hexadecimal values.
 
const MCRegisterInfo & MRI
 
void printAnnotation(raw_ostream &OS, StringRef Annot)
Utility function for printing annotations.
 
format_object< int64_t > formatImm(int64_t Value) const
Utility function to print immediates in decimal or hex.
 
bool PrintBranchImmAsAddress
If true, a branch immediate (e.g.
 
MCInstPrinter(const MCAsmInfo &mai, const MCInstrInfo &mii, const MCRegisterInfo &mri)
 
bool PrintAliases
True if we prefer aliases (e.g. nop) to raw mnemonics.
 
Instances of this class represent a single low-level machine instruction.
 
Interface to description of machine instruction set.
 
Instances of this class represent operands of the MCInst class.
 
MCRegister getReg() const
Returns the register number.
 
const MCExpr * getExpr() const
 
uint64_t getDFPImm() const
 
MCRegisterClass - Base class of TargetRegisterClass.
 
MCRegisterInfo base class - We assume that the target defines a static array of MCRegisterDesc object...
 
Wrapper class representing physical registers. Should be passed by value.
 
Generic base class for all target subtargets.
 
bool hasFeature(unsigned Feature) const
 
const FeatureBitset & getFeatureBits() const
 
StringRef - Represent a constant reference to a string, i.e.
 
LLVM Value Representation.
 
This class implements an extremely fast bulk output stream that can only output to a stream.
 
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
 
static const char * getCondCodeName(CondCode Code)
 
static CondCode getInvertedCondCode(CondCode Code)
 
const PHint * lookupPHintByEncoding(uint16_t)
 
std::string genericRegisterString(uint32_t Bits)
 
static bool isMOVNMovAlias(uint64_t Value, int Shift, int RegWidth)
 
static uint64_t decodeLogicalImmediate(uint64_t val, unsigned regSize)
decodeLogicalImmediate - Decode a logical immediate value in the form "N:immr:imms" (where the immr a...
 
static unsigned getShiftValue(unsigned Imm)
getShiftValue - Extract the shift value.
 
static bool isAnyMOVWMovAlias(uint64_t Value, int RegWidth)
 
static unsigned getArithShiftValue(unsigned Imm)
getArithShiftValue - get the arithmetic shift value.
 
static float getFPImmFloat(unsigned Imm)
 
static bool isMOVZMovAlias(uint64_t Value, int Shift, int RegWidth)
 
static const char * getShiftExtendName(AArch64_AM::ShiftExtendType ST)
getShiftName - Get the string encoding for the shift type.
 
static uint64_t decodeAdvSIMDModImmType10(uint8_t Imm)
 
static AArch64_AM::ShiftExtendType getArithExtendType(unsigned Imm)
 
static AArch64_AM::ShiftExtendType getShiftType(unsigned Imm)
getShiftType - Extract the shift type.
 
This is an optimization pass for GlobalISel generic memory operations.
 
auto size(R &&Range, std::enable_if_t< std::is_base_of< std::random_access_iterator_tag, typename std::iterator_traits< decltype(Range.begin())>::iterator_category >::value, void > *=nullptr)
Get the size of a range.
 
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
 
OutputIt transform(R &&Range, OutputIt d_first, UnaryFunction F)
Wrapper function around std::transform to apply a function to a range and store the result elsewhere.
 
unsigned Log2_32(uint32_t Value)
Return the floor log base 2 of the specified value, -1 if the value is zero.
 
MachineInstr * getImm(const MachineOperand &MO, const MachineRegisterInfo *MRI)
 
static bool atomicBarrierDroppedOnZero(unsigned Opcode)
 
format_object< Ts... > format(const char *Fmt, const Ts &... Vals)
These are helper functions used to produce formatted output.
 
To bit_cast(const From &from) noexcept
 
DWARFExpression::Operation Op
 
static MCRegister getWRegFromXReg(MCRegister Reg)
 
constexpr unsigned BitWidth
 
constexpr int64_t SignExtend64(uint64_t x)
Sign-extend the number in the bottom B bits of X to a 64-bit integer.
 
constexpr T maskTrailingOnes(unsigned N)
Create a bitmask with the N right-most bits set to 1, and all other bits set to 0.
 
std::string itostr(int64_t X)
 
bool haveFeatures(FeatureBitset ActiveFeatures) const