]> granicus.if.org Git - llvm/commitdiff
[MCA] Add support for printing immedate values as hex. Also enable lexing of masm...
authorAndrea Di Biagio <Andrea_DiBiagio@sn.scee.net>
Fri, 2 Aug 2019 10:38:25 +0000 (10:38 +0000)
committerAndrea Di Biagio <Andrea_DiBiagio@sn.scee.net>
Fri, 2 Aug 2019 10:38:25 +0000 (10:38 +0000)
This patch adds a new llvm-mca flag named -print-imm-hex.

By default, the instruction printer prints immediate operands as decimals. Flag
-print-imm-hex enables the instruction printer to print those operands in hex.

This patch also adds support for MASM binary and hex literal numbers (example
0FFh, 101b).
Added tests to verify the behavior of the new flag. Tests also verify that masm
numeric literal operands are now recognized.

Differential Revision: https://reviews.llvm.org/D65588

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@367671 91177308-0d34-0410-b5e6-96231b3b80d8

docs/CommandGuide/llvm-mca.rst
test/tools/llvm-mca/X86/print-imm-hex-1.s [new file with mode: 0644]
test/tools/llvm-mca/X86/print-imm-hex-2.s [new file with mode: 0644]
tools/llvm-mca/CodeRegionGenerator.cpp
tools/llvm-mca/llvm-mca.cpp

index a02103337dcb2f1aaf4b8dc655c11de4aabf8960..c8b11fc6ed22e9e1b7fbeeeae725d90c8f3b5672 100644 (file)
@@ -92,6 +92,11 @@ option specifies "``-``", then the output will also be sent to standard output.
  the AT&T (vic. Intel) assembly format for the code printed out by the tool in
  the analysis report.
 
+.. option:: -print-imm-hex
+
+ Prefer hex format for numeric literals in the output assembly printed as part
+ of the report.
+
 .. option:: -dispatch=<width>
 
  Specify a different dispatch width for the processor. The dispatch width
diff --git a/test/tools/llvm-mca/X86/print-imm-hex-1.s b/test/tools/llvm-mca/X86/print-imm-hex-1.s
new file mode 100644 (file)
index 0000000..26ba26f
--- /dev/null
@@ -0,0 +1,30 @@
+# NOTE: Assertions have been autogenerated by utils/update_mca_test_checks.py
+# RUN: llvm-mca -mtriple=x86_64-unknown-unknown -mcpu=btver2 -all-views=false -instruction-info < %s | FileCheck %s --check-prefixes=ALL,DEFAULT
+# RUN: llvm-mca -mtriple=x86_64-unknown-unknown -mcpu=btver2 -all-views=false -instruction-info -print-imm-hex=false < %s | FileCheck %s --check-prefixes=ALL,DEFAULT
+# RUN: llvm-mca -mtriple=x86_64-unknown-unknown -mcpu=btver2 -all-views=false -instruction-info -print-imm-hex < %s | FileCheck %s --check-prefixes=ALL,HEX
+# RUN: llvm-mca -mtriple=x86_64-unknown-unknown -mcpu=btver2 -all-views=false -instruction-info -print-imm-hex=true < %s | FileCheck %s --check-prefixes=ALL,HEX
+
+  shl $5,    %eax
+  shl $0x5,  %eax
+  shl $5h,   %eax
+  shl $101b, %eax
+
+# ALL:          Instruction Info:
+# ALL-NEXT:     [1]: #uOps
+# ALL-NEXT:     [2]: Latency
+# ALL-NEXT:     [3]: RThroughput
+# ALL-NEXT:     [4]: MayLoad
+# ALL-NEXT:     [5]: MayStore
+# ALL-NEXT:     [6]: HasSideEffects (U)
+
+# ALL:          [1]    [2]    [3]    [4]    [5]    [6]    Instructions:
+
+# DEFAULT-NEXT:  1      1     0.50                        shll $5, %eax
+# DEFAULT-NEXT:  1      1     0.50                        shll $5, %eax
+# DEFAULT-NEXT:  1      1     0.50                        shll $5, %eax
+# DEFAULT-NEXT:  1      1     0.50                        shll $5, %eax
+
+# HEX-NEXT:      1      1     0.50                        shll $0x5, %eax
+# HEX-NEXT:      1      1     0.50                        shll $0x5, %eax
+# HEX-NEXT:      1      1     0.50                        shll $0x5, %eax
+# HEX-NEXT:      1      1     0.50                        shll $0x5, %eax
diff --git a/test/tools/llvm-mca/X86/print-imm-hex-2.s b/test/tools/llvm-mca/X86/print-imm-hex-2.s
new file mode 100644 (file)
index 0000000..35d8f1d
--- /dev/null
@@ -0,0 +1,39 @@
+# NOTE: Assertions have been autogenerated by utils/update_mca_test_checks.py
+# RUN: llvm-mca -mtriple=x86_64-unknown-unknown -mcpu=btver2 -all-views=false -instruction-info < %s | FileCheck %s --check-prefix=DEFAULT
+# RUN: llvm-mca -mtriple=x86_64-unknown-unknown -mcpu=btver2 -all-views=false -instruction-info -print-imm-hex=false < %s | FileCheck %s --check-prefix=DEFAULT
+# RUN: llvm-mca -mtriple=x86_64-unknown-unknown -mcpu=btver2 -all-views=false -instruction-info -print-imm-hex < %s | FileCheck %s --check-prefix=HEX
+# RUN: llvm-mca -mtriple=x86_64-unknown-unknown -mcpu=btver2 -all-views=false -instruction-info -print-imm-hex=true < %s | FileCheck %s --check-prefix=HEX
+
+  .intel_syntax noprefix
+  shl eax, 8
+  shl eax, 0x8
+  shl eax, 8h
+  shl eax, 1000b
+
+# DEFAULT:      Instruction Info:
+# DEFAULT-NEXT: [1]: #uOps
+# DEFAULT-NEXT: [2]: Latency
+# DEFAULT-NEXT: [3]: RThroughput
+# DEFAULT-NEXT: [4]: MayLoad
+# DEFAULT-NEXT: [5]: MayStore
+# DEFAULT-NEXT: [6]: HasSideEffects (U)
+
+# HEX:          Instruction Info:
+# HEX-NEXT:     [1]: #uOps
+# HEX-NEXT:     [2]: Latency
+# HEX-NEXT:     [3]: RThroughput
+# HEX-NEXT:     [4]: MayLoad
+# HEX-NEXT:     [5]: MayStore
+# HEX-NEXT:     [6]: HasSideEffects (U)
+
+# DEFAULT:      [1]    [2]    [3]    [4]    [5]    [6]    Instructions:
+# DEFAULT-NEXT:  1      1     0.50                        shl  eax, 8
+# DEFAULT-NEXT:  1      1     0.50                        shl  eax, 8
+# DEFAULT-NEXT:  1      1     0.50                        shl  eax, 8
+# DEFAULT-NEXT:  1      1     0.50                        shl  eax, 8
+
+# HEX:          [1]    [2]    [3]    [4]    [5]    [6]    Instructions:
+# HEX-NEXT:      1      1     0.50                        shl  eax, 0x8
+# HEX-NEXT:      1      1     0.50                        shl  eax, 0x8
+# HEX-NEXT:      1      1     0.50                        shl  eax, 0x8
+# HEX-NEXT:      1      1     0.50                        shl  eax, 0x8
index c793169e64e09b1fba7203bc316954771faada33..8ddcd2f4abe21749d9e5ec556efa421f6a7f294d 100644 (file)
@@ -118,6 +118,8 @@ Expected<const CodeRegions &> AsmCodeRegionGenerator::parseCodeRegions() {
   MCAsmLexer &Lexer = Parser->getLexer();
   MCACommentConsumer CC(Regions);
   Lexer.setCommentConsumer(&CC);
+  // Enable support for MASM literal numbers (example: 05h, 101b).
+  Lexer.setLexMasmIntegers(true);
 
   std::unique_ptr<MCTargetAsmParser> TAP(
       TheTarget.createMCAsmParser(STI, *Parser, MCII, Opts));
index b3590b5910ec9e68f2de1b4be43461bc77381562..05c118e5ef7c1f9a7cdcb3c196bf1e59a8cc9bd7 100644 (file)
@@ -88,6 +88,10 @@ static cl::opt<int>
                      cl::desc("Syntax variant to use for output printing"),
                      cl::cat(ToolOptions), cl::init(-1));
 
+static cl::opt<bool>
+    PrintImmHex("print-imm-hex", cl::cat(ToolOptions), cl::init(false),
+                cl::desc("Prefer hex format when printing immediate values"));
+
 static cl::opt<unsigned> Iterations("iterations",
                                     cl::desc("Number of iterations to run"),
                                     cl::cat(ToolOptions), cl::init(0));
@@ -396,6 +400,9 @@ int main(int argc, char **argv) {
     return 1;
   }
 
+  // Set the display preference for hex vs. decimal immediates.
+  IP->setPrintImmHex(PrintImmHex);
+
   std::unique_ptr<ToolOutputFile> TOF = std::move(*OF);
 
   const MCSchedModel &SM = STI->getSchedModel();