summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSimon Pilgrim <llvm-dev@redking.me.uk>2017-11-15 17:11:24 +0000
committerSimon Pilgrim <llvm-dev@redking.me.uk>2017-11-15 17:11:24 +0000
commit56415772d681d6a0181bc583fdc6d10d7a519a57 (patch)
tree4d322da01ac9bdd8b3b0afd306acbd0ca890615c
parent572a87c76f1880b473273e3a4464e2fe0cd2539e (diff)
downloadbcm5719-llvm-56415772d681d6a0181bc583fdc6d10d7a519a57.tar.gz
bcm5719-llvm-56415772d681d6a0181bc583fdc6d10d7a519a57.zip
[X86] Add CBW/CDQ/CDQE/CQO/CWD/CWDE to WriteALU schedule class
Some CPUs are already overriding these sign extension instructions but we should be able to use the WriteALU schedule class by default. Differential Revision: https://reviews.llvm.org/D39899 llvm-svn: 318308
-rw-r--r--llvm/lib/Target/X86/X86InstrExtension.td62
-rw-r--r--llvm/lib/Target/X86/X86SchedSandyBridge.td1
-rw-r--r--llvm/test/CodeGen/X86/schedule-x86_64.ll40
3 files changed, 51 insertions, 52 deletions
diff --git a/llvm/lib/Target/X86/X86InstrExtension.td b/llvm/lib/Target/X86/X86InstrExtension.td
index af43d9f5332..bb391fd9c81 100644
--- a/llvm/lib/Target/X86/X86InstrExtension.td
+++ b/llvm/lib/Target/X86/X86InstrExtension.td
@@ -9,38 +9,36 @@
//
// This file describes the sign and zero extension operations.
//
-//===----------------------------------------------------------------------===//
-
-let hasSideEffects = 0 in {
- let Defs = [AX], Uses = [AL] in
- def CBW : I<0x98, RawFrm, (outs), (ins),
- "{cbtw|cbw}", [], IIC_CBW>, OpSize16; // AX = signext(AL)
- let Defs = [EAX], Uses = [AX] in
- def CWDE : I<0x98, RawFrm, (outs), (ins),
- "{cwtl|cwde}", [], IIC_CBW>, OpSize32; // EAX = signext(AX)
-
- let Defs = [AX,DX], Uses = [AX] in
- def CWD : I<0x99, RawFrm, (outs), (ins),
- "{cwtd|cwd}", [], IIC_CBW>, OpSize16; // DX:AX = signext(AX)
- let Defs = [EAX,EDX], Uses = [EAX] in
- def CDQ : I<0x99, RawFrm, (outs), (ins),
- "{cltd|cdq}", [], IIC_CBW>, OpSize32; // EDX:EAX = signext(EAX)
-
-
- let Defs = [RAX], Uses = [EAX] in
- def CDQE : RI<0x98, RawFrm, (outs), (ins),
- "{cltq|cdqe}", [], IIC_CBW>; // RAX = signext(EAX)
-
- let Defs = [RAX,RDX], Uses = [RAX] in
- def CQO : RI<0x99, RawFrm, (outs), (ins),
- "{cqto|cqo}", [], IIC_CBW>; // RDX:RAX = signext(RAX)
-}
-
-
-
-// Sign/Zero extenders
-let hasSideEffects = 0 in {
-def MOVSX16rr8 : I<0xBE, MRMSrcReg, (outs GR16:$dst), (ins GR8:$src),
+//===----------------------------------------------------------------------===//
+
+let hasSideEffects = 0 in {
+ let Defs = [AX], Uses = [AL] in // AX = signext(AL)
+ def CBW : I<0x98, RawFrm, (outs), (ins),
+ "{cbtw|cbw}", [], IIC_CBW>, OpSize16, Sched<[WriteALU]>;
+ let Defs = [EAX], Uses = [AX] in // EAX = signext(AX)
+ def CWDE : I<0x98, RawFrm, (outs), (ins),
+ "{cwtl|cwde}", [], IIC_CBW>, OpSize32, Sched<[WriteALU]>;
+
+ let Defs = [AX,DX], Uses = [AX] in // DX:AX = signext(AX)
+ def CWD : I<0x99, RawFrm, (outs), (ins),
+ "{cwtd|cwd}", [], IIC_CBW>, OpSize16, Sched<[WriteALU]>;
+ let Defs = [EAX,EDX], Uses = [EAX] in // EDX:EAX = signext(EAX)
+ def CDQ : I<0x99, RawFrm, (outs), (ins),
+ "{cltd|cdq}", [], IIC_CBW>, OpSize32, Sched<[WriteALU]>;
+
+
+ let Defs = [RAX], Uses = [EAX] in // RAX = signext(EAX)
+ def CDQE : RI<0x98, RawFrm, (outs), (ins),
+ "{cltq|cdqe}", [], IIC_CBW>, Sched<[WriteALU]>;
+
+ let Defs = [RAX,RDX], Uses = [RAX] in // RDX:RAX = signext(RAX)
+ def CQO : RI<0x99, RawFrm, (outs), (ins),
+ "{cqto|cqo}", [], IIC_CBW>, Sched<[WriteALU]>;
+}
+
+// Sign/Zero extenders
+let hasSideEffects = 0 in {
+def MOVSX16rr8 : I<0xBE, MRMSrcReg, (outs GR16:$dst), (ins GR8:$src),
"movs{bw|x}\t{$src, $dst|$dst, $src}", [], IIC_MOVSX_R16_R8>,
TB, OpSize16, Sched<[WriteALU]>;
let mayLoad = 1 in
diff --git a/llvm/lib/Target/X86/X86SchedSandyBridge.td b/llvm/lib/Target/X86/X86SchedSandyBridge.td
index 593e9b33aac..8f8ea9d8feb 100644
--- a/llvm/lib/Target/X86/X86SchedSandyBridge.td
+++ b/llvm/lib/Target/X86/X86SchedSandyBridge.td
@@ -865,6 +865,7 @@ def SBWriteResGroup15 : SchedWriteRes<[SBPort0,SBPort015]> {
let NumMicroOps = 2;
let ResourceCycles = [1,1];
}
+def: InstRW<[SBWriteResGroup15], (instregex "CWD")>;
def: InstRW<[SBWriteResGroup15], (instregex "FNSTSW16r")>;
def SBWriteResGroup16 : SchedWriteRes<[SBPort1,SBPort05]> {
diff --git a/llvm/test/CodeGen/X86/schedule-x86_64.ll b/llvm/test/CodeGen/X86/schedule-x86_64.ll
index ce8e44bb4bc..cf01a23570f 100644
--- a/llvm/test/CodeGen/X86/schedule-x86_64.ll
+++ b/llvm/test/CodeGen/X86/schedule-x86_64.ll
@@ -755,7 +755,7 @@ define void @test_cbw_cdq_cdqe_cqo_cwd_cwde() optsize {
; GENERIC-NEXT: cltd # sched: [1:0.50]
; GENERIC-NEXT: cltq # sched: [1:0.50]
; GENERIC-NEXT: cqto # sched: [1:0.50]
-; GENERIC-NEXT: cwtd
+; GENERIC-NEXT: cwtd # sched: [2:1.00]
; GENERIC-NEXT: cwtl # sched: [1:0.33]
; GENERIC-NEXT: #NO_APP
; GENERIC-NEXT: retq # sched: [1:1.00]
@@ -775,12 +775,12 @@ define void @test_cbw_cdq_cdqe_cqo_cwd_cwde() optsize {
; SLM-LABEL: test_cbw_cdq_cdqe_cqo_cwd_cwde:
; SLM: # BB#0:
; SLM-NEXT: #APP
-; SLM-NEXT: cbtw
-; SLM-NEXT: cltd
-; SLM-NEXT: cltq
-; SLM-NEXT: cqto
-; SLM-NEXT: cwtd
-; SLM-NEXT: cwtl
+; SLM-NEXT: cbtw # sched: [1:0.50]
+; SLM-NEXT: cltd # sched: [1:0.50]
+; SLM-NEXT: cltq # sched: [1:0.50]
+; SLM-NEXT: cqto # sched: [1:0.50]
+; SLM-NEXT: cwtd # sched: [1:0.50]
+; SLM-NEXT: cwtl # sched: [1:0.50]
; SLM-NEXT: #NO_APP
; SLM-NEXT: retq # sched: [4:1.00]
;
@@ -791,7 +791,7 @@ define void @test_cbw_cdq_cdqe_cqo_cwd_cwde() optsize {
; SANDY-NEXT: cltd # sched: [1:0.50]
; SANDY-NEXT: cltq # sched: [1:0.50]
; SANDY-NEXT: cqto # sched: [1:0.50]
-; SANDY-NEXT: cwtd
+; SANDY-NEXT: cwtd # sched: [2:1.00]
; SANDY-NEXT: cwtl # sched: [1:0.33]
; SANDY-NEXT: #NO_APP
; SANDY-NEXT: retq # sched: [1:1.00]
@@ -847,24 +847,24 @@ define void @test_cbw_cdq_cdqe_cqo_cwd_cwde() optsize {
; BTVER2-LABEL: test_cbw_cdq_cdqe_cqo_cwd_cwde:
; BTVER2: # BB#0:
; BTVER2-NEXT: #APP
-; BTVER2-NEXT: cbtw
-; BTVER2-NEXT: cltd
-; BTVER2-NEXT: cltq
-; BTVER2-NEXT: cqto
-; BTVER2-NEXT: cwtd
-; BTVER2-NEXT: cwtl
+; BTVER2-NEXT: cbtw # sched: [1:0.50]
+; BTVER2-NEXT: cltd # sched: [1:0.50]
+; BTVER2-NEXT: cltq # sched: [1:0.50]
+; BTVER2-NEXT: cqto # sched: [1:0.50]
+; BTVER2-NEXT: cwtd # sched: [1:0.50]
+; BTVER2-NEXT: cwtl # sched: [1:0.50]
; BTVER2-NEXT: #NO_APP
; BTVER2-NEXT: retq # sched: [4:1.00]
;
; ZNVER1-LABEL: test_cbw_cdq_cdqe_cqo_cwd_cwde:
; ZNVER1: # BB#0:
; ZNVER1-NEXT: #APP
-; ZNVER1-NEXT: cbtw
-; ZNVER1-NEXT: cltd
-; ZNVER1-NEXT: cltq
-; ZNVER1-NEXT: cqto
-; ZNVER1-NEXT: cwtd
-; ZNVER1-NEXT: cwtl
+; ZNVER1-NEXT: cbtw # sched: [1:0.25]
+; ZNVER1-NEXT: cltd # sched: [1:0.25]
+; ZNVER1-NEXT: cltq # sched: [1:0.25]
+; ZNVER1-NEXT: cqto # sched: [1:0.25]
+; ZNVER1-NEXT: cwtd # sched: [1:0.25]
+; ZNVER1-NEXT: cwtl # sched: [1:0.25]
; ZNVER1-NEXT: #NO_APP
; ZNVER1-NEXT: retq # sched: [1:0.50]
tail call void asm "cbw \0A\09 cdq \0A\09 cdqe \0A\09 cqo \0A\09 cwd \0A\09 cwde", ""() nounwind
OpenPOWER on IntegriCloud