[llvm] r320321 - [X86][X87] Add missing x87 scheduler tests

Simon Pilgrim via llvm-commits llvm-commits at lists.llvm.org
Sun Dec 10 10:53:15 PST 2017


Author: rksimon
Date: Sun Dec 10 10:53:15 2017
New Revision: 320321

URL: http://llvm.org/viewvc/llvm-project?rev=320321&view=rev
Log:
[X86][X87] Add missing x87 scheduler tests

Split off some 'n' instruction versions to make it clearer when WAIT is being inserted

Modified:
    llvm/trunk/test/CodeGen/X86/x87-schedule.ll

Modified: llvm/trunk/test/CodeGen/X86/x87-schedule.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/x87-schedule.ll?rev=320321&r1=320320&r2=320321&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/X86/x87-schedule.ll (original)
+++ llvm/trunk/test/CodeGen/X86/x87-schedule.ll Sun Dec 10 10:53:15 2017
@@ -407,8 +407,99 @@ define void @test_faddp_fiadd(i16 *%a0,
   ret void
 }
 
-; TODO - test_fbld
-; TODO - test_fbstp
+define void @test_fbld_fbstp(i8* %a0) optsize {
+; GENERIC-LABEL: test_fbld_fbstp:
+; GENERIC:       # %bb.0:
+; GENERIC-NEXT:    movl {{[0-9]+}}(%esp), %eax
+; GENERIC-NEXT:    #APP
+; GENERIC-NEXT:    fbld (%eax)
+; GENERIC-NEXT:    fbstp (%eax)
+; GENERIC-NEXT:    #NO_APP
+; GENERIC-NEXT:    retl
+;
+; ATOM-LABEL: test_fbld_fbstp:
+; ATOM:       # %bb.0:
+; ATOM-NEXT:    movl {{[0-9]+}}(%esp), %eax # sched: [1:1.00]
+; ATOM-NEXT:    #APP
+; ATOM-NEXT:    fbld (%eax)
+; ATOM-NEXT:    fbstp (%eax)
+; ATOM-NEXT:    #NO_APP
+; ATOM-NEXT:    retl # sched: [79:39.50]
+;
+; SLM-LABEL: test_fbld_fbstp:
+; SLM:       # %bb.0:
+; SLM-NEXT:    movl {{[0-9]+}}(%esp), %eax # sched: [3:1.00]
+; SLM-NEXT:    #APP
+; SLM-NEXT:    fbld (%eax) # sched: [100:1.00]
+; SLM-NEXT:    fbstp (%eax) # sched: [100:1.00]
+; SLM-NEXT:    #NO_APP
+; SLM-NEXT:    retl # sched: [4:1.00]
+;
+; SANDY-LABEL: test_fbld_fbstp:
+; SANDY:       # %bb.0:
+; SANDY-NEXT:    movl {{[0-9]+}}(%esp), %eax # sched: [5:0.50]
+; SANDY-NEXT:    #APP
+; SANDY-NEXT:    fbld (%eax) # sched: [100:0.33]
+; SANDY-NEXT:    fbstp (%eax) # sched: [100:0.33]
+; SANDY-NEXT:    #NO_APP
+; SANDY-NEXT:    retl # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_fbld_fbstp:
+; HASWELL:       # %bb.0:
+; HASWELL-NEXT:    movl {{[0-9]+}}(%esp), %eax # sched: [5:0.50]
+; HASWELL-NEXT:    #APP
+; HASWELL-NEXT:    fbld (%eax) # sched: [47:?]
+; HASWELL-NEXT:    fbstp (%eax) # sched: [1:1.00]
+; HASWELL-NEXT:    #NO_APP
+; HASWELL-NEXT:    retl # sched: [7:1.00]
+;
+; BROADWELL-LABEL: test_fbld_fbstp:
+; BROADWELL:       # %bb.0:
+; BROADWELL-NEXT:    movl {{[0-9]+}}(%esp), %eax # sched: [5:0.50]
+; BROADWELL-NEXT:    #APP
+; BROADWELL-NEXT:    fbld (%eax) # sched: [100:0.25]
+; BROADWELL-NEXT:    fbstp (%eax) # sched: [1:1.00]
+; BROADWELL-NEXT:    #NO_APP
+; BROADWELL-NEXT:    retl # sched: [6:0.50]
+;
+; SKYLAKE-LABEL: test_fbld_fbstp:
+; SKYLAKE:       # %bb.0:
+; SKYLAKE-NEXT:    movl {{[0-9]+}}(%esp), %eax # sched: [5:0.50]
+; SKYLAKE-NEXT:    #APP
+; SKYLAKE-NEXT:    fbld (%eax) # sched: [100:0.25]
+; SKYLAKE-NEXT:    fbstp (%eax) # sched: [1:1.00]
+; SKYLAKE-NEXT:    #NO_APP
+; SKYLAKE-NEXT:    retl # sched: [6:0.50]
+;
+; SKX-LABEL: test_fbld_fbstp:
+; SKX:       # %bb.0:
+; SKX-NEXT:    movl {{[0-9]+}}(%esp), %eax # sched: [5:0.50]
+; SKX-NEXT:    #APP
+; SKX-NEXT:    fbld (%eax) # sched: [100:0.25]
+; SKX-NEXT:    fbstp (%eax) # sched: [1:1.00]
+; SKX-NEXT:    #NO_APP
+; SKX-NEXT:    retl # sched: [6:0.50]
+;
+; BTVER2-LABEL: test_fbld_fbstp:
+; BTVER2:       # %bb.0:
+; BTVER2-NEXT:    movl {{[0-9]+}}(%esp), %eax # sched: [5:1.00]
+; BTVER2-NEXT:    #APP
+; BTVER2-NEXT:    fbld (%eax) # sched: [100:0.17]
+; BTVER2-NEXT:    fbstp (%eax) # sched: [100:0.17]
+; BTVER2-NEXT:    #NO_APP
+; BTVER2-NEXT:    retl # sched: [4:1.00]
+;
+; ZNVER1-LABEL: test_fbld_fbstp:
+; ZNVER1:       # %bb.0:
+; ZNVER1-NEXT:    movl {{[0-9]+}}(%esp), %eax # sched: [8:0.50]
+; ZNVER1-NEXT:    #APP
+; ZNVER1-NEXT:    fbld (%eax) # sched: [100:?]
+; ZNVER1-NEXT:    fbstp (%eax) # sched: [100:?]
+; ZNVER1-NEXT:    #NO_APP
+; ZNVER1-NEXT:    retl # sched: [1:0.50]
+  tail call void asm sideeffect "fbld $0 \0A\09 fbstp $0", "*m"(i8 *%a0) nounwind
+  ret void
+}
 
 define void @test_fchs() optsize {
 ; GENERIC-LABEL: test_fchs:
@@ -484,97 +575,161 @@ define void @test_fchs() optsize {
   ret void
 }
 
-define void @test_fclex_fnclex() optsize {
-; GENERIC-LABEL: test_fclex_fnclex:
+define void @test_fclex() optsize {
+; GENERIC-LABEL: test_fclex:
 ; GENERIC:       # %bb.0:
 ; GENERIC-NEXT:    #APP
 ; GENERIC-NEXT:    wait
 ; GENERIC-NEXT:    fnclex
-; GENERIC-NEXT:    fnclex
 ; GENERIC-NEXT:    #NO_APP
 ; GENERIC-NEXT:    retl
 ;
-; ATOM-LABEL: test_fclex_fnclex:
+; ATOM-LABEL: test_fclex:
 ; ATOM:       # %bb.0:
 ; ATOM-NEXT:    #APP
 ; ATOM-NEXT:    wait # sched: [1:0.50]
 ; ATOM-NEXT:    fnclex # sched: [25:12.50]
-; ATOM-NEXT:    fnclex # sched: [25:12.50]
 ; ATOM-NEXT:    #NO_APP
 ; ATOM-NEXT:    retl # sched: [79:39.50]
 ;
-; SLM-LABEL: test_fclex_fnclex:
+; SLM-LABEL: test_fclex:
 ; SLM:       # %bb.0:
 ; SLM-NEXT:    #APP
 ; SLM-NEXT:    wait # sched: [100:1.00]
 ; SLM-NEXT:    fnclex # sched: [100:1.00]
-; SLM-NEXT:    fnclex # sched: [100:1.00]
 ; SLM-NEXT:    #NO_APP
 ; SLM-NEXT:    retl # sched: [4:1.00]
 ;
-; SANDY-LABEL: test_fclex_fnclex:
+; SANDY-LABEL: test_fclex:
 ; SANDY:       # %bb.0:
 ; SANDY-NEXT:    #APP
 ; SANDY-NEXT:    wait # sched: [100:0.33]
 ; SANDY-NEXT:    fnclex # sched: [100:0.33]
-; SANDY-NEXT:    fnclex # sched: [100:0.33]
 ; SANDY-NEXT:    #NO_APP
 ; SANDY-NEXT:    retl # sched: [5:1.00]
 ;
-; HASWELL-LABEL: test_fclex_fnclex:
+; HASWELL-LABEL: test_fclex:
 ; HASWELL:       # %bb.0:
 ; HASWELL-NEXT:    #APP
 ; HASWELL-NEXT:    wait # sched: [1:0.50]
 ; HASWELL-NEXT:    fnclex # sched: [1:1.25]
-; HASWELL-NEXT:    fnclex # sched: [1:1.25]
 ; HASWELL-NEXT:    #NO_APP
 ; HASWELL-NEXT:    retl # sched: [7:1.00]
 ;
-; BROADWELL-LABEL: test_fclex_fnclex:
+; BROADWELL-LABEL: test_fclex:
 ; BROADWELL:       # %bb.0:
 ; BROADWELL-NEXT:    #APP
 ; BROADWELL-NEXT:    wait # sched: [2:0.50]
 ; BROADWELL-NEXT:    fnclex # sched: [4:1.00]
-; BROADWELL-NEXT:    fnclex # sched: [4:1.00]
 ; BROADWELL-NEXT:    #NO_APP
 ; BROADWELL-NEXT:    retl # sched: [6:0.50]
 ;
-; SKYLAKE-LABEL: test_fclex_fnclex:
+; SKYLAKE-LABEL: test_fclex:
 ; SKYLAKE:       # %bb.0:
 ; SKYLAKE-NEXT:    #APP
 ; SKYLAKE-NEXT:    wait # sched: [2:0.50]
 ; SKYLAKE-NEXT:    fnclex # sched: [4:1.00]
-; SKYLAKE-NEXT:    fnclex # sched: [4:1.00]
 ; SKYLAKE-NEXT:    #NO_APP
 ; SKYLAKE-NEXT:    retl # sched: [6:0.50]
 ;
-; SKX-LABEL: test_fclex_fnclex:
+; SKX-LABEL: test_fclex:
 ; SKX:       # %bb.0:
 ; SKX-NEXT:    #APP
 ; SKX-NEXT:    wait # sched: [2:0.50]
 ; SKX-NEXT:    fnclex # sched: [4:1.00]
-; SKX-NEXT:    fnclex # sched: [4:1.00]
 ; SKX-NEXT:    #NO_APP
 ; SKX-NEXT:    retl # sched: [6:0.50]
 ;
-; BTVER2-LABEL: test_fclex_fnclex:
+; BTVER2-LABEL: test_fclex:
 ; BTVER2:       # %bb.0:
 ; BTVER2-NEXT:    #APP
 ; BTVER2-NEXT:    wait # sched: [100:0.17]
 ; BTVER2-NEXT:    fnclex # sched: [100:0.17]
-; BTVER2-NEXT:    fnclex # sched: [100:0.17]
 ; BTVER2-NEXT:    #NO_APP
 ; BTVER2-NEXT:    retl # sched: [4:1.00]
 ;
-; ZNVER1-LABEL: test_fclex_fnclex:
+; ZNVER1-LABEL: test_fclex:
 ; ZNVER1:       # %bb.0:
 ; ZNVER1-NEXT:    #APP
 ; ZNVER1-NEXT:    wait # sched: [1:1.00]
 ; ZNVER1-NEXT:    fnclex # sched: [100:?]
+; ZNVER1-NEXT:    #NO_APP
+; ZNVER1-NEXT:    retl # sched: [1:0.50]
+  tail call void asm sideeffect "fclex", ""() nounwind
+  ret void
+}
+
+define void @test_fnclex() optsize {
+; GENERIC-LABEL: test_fnclex:
+; GENERIC:       # %bb.0:
+; GENERIC-NEXT:    #APP
+; GENERIC-NEXT:    fnclex
+; GENERIC-NEXT:    #NO_APP
+; GENERIC-NEXT:    retl
+;
+; ATOM-LABEL: test_fnclex:
+; ATOM:       # %bb.0:
+; ATOM-NEXT:    #APP
+; ATOM-NEXT:    fnclex # sched: [25:12.50]
+; ATOM-NEXT:    #NO_APP
+; ATOM-NEXT:    retl # sched: [79:39.50]
+;
+; SLM-LABEL: test_fnclex:
+; SLM:       # %bb.0:
+; SLM-NEXT:    #APP
+; SLM-NEXT:    fnclex # sched: [100:1.00]
+; SLM-NEXT:    #NO_APP
+; SLM-NEXT:    retl # sched: [4:1.00]
+;
+; SANDY-LABEL: test_fnclex:
+; SANDY:       # %bb.0:
+; SANDY-NEXT:    #APP
+; SANDY-NEXT:    fnclex # sched: [100:0.33]
+; SANDY-NEXT:    #NO_APP
+; SANDY-NEXT:    retl # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_fnclex:
+; HASWELL:       # %bb.0:
+; HASWELL-NEXT:    #APP
+; HASWELL-NEXT:    fnclex # sched: [1:1.25]
+; HASWELL-NEXT:    #NO_APP
+; HASWELL-NEXT:    retl # sched: [7:1.00]
+;
+; BROADWELL-LABEL: test_fnclex:
+; BROADWELL:       # %bb.0:
+; BROADWELL-NEXT:    #APP
+; BROADWELL-NEXT:    fnclex # sched: [4:1.00]
+; BROADWELL-NEXT:    #NO_APP
+; BROADWELL-NEXT:    retl # sched: [6:0.50]
+;
+; SKYLAKE-LABEL: test_fnclex:
+; SKYLAKE:       # %bb.0:
+; SKYLAKE-NEXT:    #APP
+; SKYLAKE-NEXT:    fnclex # sched: [4:1.00]
+; SKYLAKE-NEXT:    #NO_APP
+; SKYLAKE-NEXT:    retl # sched: [6:0.50]
+;
+; SKX-LABEL: test_fnclex:
+; SKX:       # %bb.0:
+; SKX-NEXT:    #APP
+; SKX-NEXT:    fnclex # sched: [4:1.00]
+; SKX-NEXT:    #NO_APP
+; SKX-NEXT:    retl # sched: [6:0.50]
+;
+; BTVER2-LABEL: test_fnclex:
+; BTVER2:       # %bb.0:
+; BTVER2-NEXT:    #APP
+; BTVER2-NEXT:    fnclex # sched: [100:0.17]
+; BTVER2-NEXT:    #NO_APP
+; BTVER2-NEXT:    retl # sched: [4:1.00]
+;
+; ZNVER1-LABEL: test_fnclex:
+; ZNVER1:       # %bb.0:
+; ZNVER1-NEXT:    #APP
 ; ZNVER1-NEXT:    fnclex # sched: [100:?]
 ; ZNVER1-NEXT:    #NO_APP
 ; ZNVER1-NEXT:    retl # sched: [1:0.50]
-  tail call void asm sideeffect "fclex \0A\09 fnclex", ""() nounwind
+  tail call void asm sideeffect "fnclex", ""() nounwind
   ret void
 }
 
@@ -2104,290 +2259,747 @@ define void @test_fincstp() optsize {
   ret void
 }
 
-define void @test_finit_fninit() optsize {
-; GENERIC-LABEL: test_finit_fninit:
+define void @test_finit() optsize {
+; GENERIC-LABEL: test_finit:
 ; GENERIC:       # %bb.0:
 ; GENERIC-NEXT:    #APP
 ; GENERIC-NEXT:    wait
 ; GENERIC-NEXT:    fninit
-; GENERIC-NEXT:    fninit
 ; GENERIC-NEXT:    #NO_APP
 ; GENERIC-NEXT:    retl
 ;
-; ATOM-LABEL: test_finit_fninit:
+; ATOM-LABEL: test_finit:
 ; ATOM:       # %bb.0:
 ; ATOM-NEXT:    #APP
 ; ATOM-NEXT:    wait # sched: [1:0.50]
 ; ATOM-NEXT:    fninit # sched: [63:31.50]
-; ATOM-NEXT:    fninit # sched: [63:31.50]
 ; ATOM-NEXT:    #NO_APP
 ; ATOM-NEXT:    retl # sched: [79:39.50]
 ;
-; SLM-LABEL: test_finit_fninit:
+; SLM-LABEL: test_finit:
 ; SLM:       # %bb.0:
 ; SLM-NEXT:    #APP
 ; SLM-NEXT:    wait # sched: [100:1.00]
 ; SLM-NEXT:    fninit # sched: [100:1.00]
-; SLM-NEXT:    fninit # sched: [100:1.00]
 ; SLM-NEXT:    #NO_APP
 ; SLM-NEXT:    retl # sched: [4:1.00]
 ;
-; SANDY-LABEL: test_finit_fninit:
+; SANDY-LABEL: test_finit:
 ; SANDY:       # %bb.0:
 ; SANDY-NEXT:    #APP
 ; SANDY-NEXT:    wait # sched: [100:0.33]
 ; SANDY-NEXT:    fninit # sched: [5:1.33]
-; SANDY-NEXT:    fninit # sched: [5:1.33]
 ; SANDY-NEXT:    #NO_APP
 ; SANDY-NEXT:    retl # sched: [5:1.00]
 ;
-; HASWELL-LABEL: test_finit_fninit:
+; HASWELL-LABEL: test_finit:
 ; HASWELL:       # %bb.0:
 ; HASWELL-NEXT:    #APP
 ; HASWELL-NEXT:    wait # sched: [1:0.50]
 ; HASWELL-NEXT:    fninit # sched: [1:?]
-; HASWELL-NEXT:    fninit # sched: [1:?]
 ; HASWELL-NEXT:    #NO_APP
 ; HASWELL-NEXT:    retl # sched: [7:1.00]
 ;
-; BROADWELL-LABEL: test_finit_fninit:
+; BROADWELL-LABEL: test_finit:
 ; BROADWELL:       # %bb.0:
 ; BROADWELL-NEXT:    #APP
 ; BROADWELL-NEXT:    wait # sched: [2:0.50]
 ; BROADWELL-NEXT:    fninit # sched: [75:6.00]
-; BROADWELL-NEXT:    fninit # sched: [75:6.00]
 ; BROADWELL-NEXT:    #NO_APP
 ; BROADWELL-NEXT:    retl # sched: [6:0.50]
 ;
-; SKYLAKE-LABEL: test_finit_fninit:
+; SKYLAKE-LABEL: test_finit:
 ; SKYLAKE:       # %bb.0:
 ; SKYLAKE-NEXT:    #APP
 ; SKYLAKE-NEXT:    wait # sched: [2:0.50]
 ; SKYLAKE-NEXT:    fninit # sched: [75:6.00]
-; SKYLAKE-NEXT:    fninit # sched: [75:6.00]
 ; SKYLAKE-NEXT:    #NO_APP
 ; SKYLAKE-NEXT:    retl # sched: [6:0.50]
 ;
-; SKX-LABEL: test_finit_fninit:
+; SKX-LABEL: test_finit:
 ; SKX:       # %bb.0:
 ; SKX-NEXT:    #APP
 ; SKX-NEXT:    wait # sched: [2:0.50]
 ; SKX-NEXT:    fninit # sched: [75:6.00]
-; SKX-NEXT:    fninit # sched: [75:6.00]
 ; SKX-NEXT:    #NO_APP
 ; SKX-NEXT:    retl # sched: [6:0.50]
 ;
-; BTVER2-LABEL: test_finit_fninit:
+; BTVER2-LABEL: test_finit:
 ; BTVER2:       # %bb.0:
 ; BTVER2-NEXT:    #APP
 ; BTVER2-NEXT:    wait # sched: [100:0.17]
 ; BTVER2-NEXT:    fninit # sched: [100:0.17]
-; BTVER2-NEXT:    fninit # sched: [100:0.17]
 ; BTVER2-NEXT:    #NO_APP
 ; BTVER2-NEXT:    retl # sched: [4:1.00]
 ;
-; ZNVER1-LABEL: test_finit_fninit:
+; ZNVER1-LABEL: test_finit:
 ; ZNVER1:       # %bb.0:
 ; ZNVER1-NEXT:    #APP
 ; ZNVER1-NEXT:    wait # sched: [1:1.00]
 ; ZNVER1-NEXT:    fninit # sched: [100:?]
-; ZNVER1-NEXT:    fninit # sched: [100:?]
 ; ZNVER1-NEXT:    #NO_APP
 ; ZNVER1-NEXT:    retl # sched: [1:0.50]
-  tail call void asm sideeffect "finit \0A\09 fninit", ""() nounwind
+  tail call void asm sideeffect "finit", ""() nounwind
   ret void
 }
 
-; TODO - test_fist
-; TODO - test_fistp
-; TODO - test_fisttp
-
-; TODO - test_fld
-
-; TODO - test_fldcw
-; TODO - test_fldenv
-
-define void @test_fld1_fldl2e_fldl2t_fldlg2_fldln2_fldpi_fldz() optsize {
-; GENERIC-LABEL: test_fld1_fldl2e_fldl2t_fldlg2_fldln2_fldpi_fldz:
+define void @test_fninit() optsize {
+; GENERIC-LABEL: test_fninit:
 ; GENERIC:       # %bb.0:
 ; GENERIC-NEXT:    #APP
-; GENERIC-NEXT:    fld1
-; GENERIC-NEXT:    fldl2e
-; GENERIC-NEXT:    fldl2t
-; GENERIC-NEXT:    fldln2
-; GENERIC-NEXT:    fldpi
-; GENERIC-NEXT:    fldz
+; GENERIC-NEXT:    fninit
 ; GENERIC-NEXT:    #NO_APP
 ; GENERIC-NEXT:    retl
 ;
-; ATOM-LABEL: test_fld1_fldl2e_fldl2t_fldlg2_fldln2_fldpi_fldz:
+; ATOM-LABEL: test_fninit:
 ; ATOM:       # %bb.0:
 ; ATOM-NEXT:    #APP
-; ATOM-NEXT:    fld1 # sched: [6:3.00]
-; ATOM-NEXT:    fldl2e # sched: [10:5.00]
-; ATOM-NEXT:    fldl2t # sched: [10:5.00]
-; ATOM-NEXT:    fldln2 # sched: [10:5.00]
-; ATOM-NEXT:    fldpi # sched: [10:5.00]
-; ATOM-NEXT:    fldz # sched: [1:0.50]
+; ATOM-NEXT:    fninit # sched: [63:31.50]
 ; ATOM-NEXT:    #NO_APP
 ; ATOM-NEXT:    retl # sched: [79:39.50]
 ;
-; SLM-LABEL: test_fld1_fldl2e_fldl2t_fldlg2_fldln2_fldpi_fldz:
+; SLM-LABEL: test_fninit:
 ; SLM:       # %bb.0:
 ; SLM-NEXT:    #APP
-; SLM-NEXT:    fld1 # sched: [1:?]
-; SLM-NEXT:    fldl2e # sched: [100:1.00]
-; SLM-NEXT:    fldl2t # sched: [100:1.00]
-; SLM-NEXT:    fldln2 # sched: [100:1.00]
-; SLM-NEXT:    fldpi # sched: [100:1.00]
-; SLM-NEXT:    fldz # sched: [1:?]
+; SLM-NEXT:    fninit # sched: [100:1.00]
 ; SLM-NEXT:    #NO_APP
 ; SLM-NEXT:    retl # sched: [4:1.00]
 ;
-; SANDY-LABEL: test_fld1_fldl2e_fldl2t_fldlg2_fldln2_fldpi_fldz:
+; SANDY-LABEL: test_fninit:
 ; SANDY:       # %bb.0:
 ; SANDY-NEXT:    #APP
-; SANDY-NEXT:    fld1 # sched: [1:?]
-; SANDY-NEXT:    fldl2e # sched: [100:0.33]
-; SANDY-NEXT:    fldl2t # sched: [100:0.33]
-; SANDY-NEXT:    fldln2 # sched: [100:0.33]
-; SANDY-NEXT:    fldpi # sched: [100:0.33]
-; SANDY-NEXT:    fldz # sched: [1:?]
+; SANDY-NEXT:    fninit # sched: [5:1.33]
 ; SANDY-NEXT:    #NO_APP
 ; SANDY-NEXT:    retl # sched: [5:1.00]
 ;
-; HASWELL-LABEL: test_fld1_fldl2e_fldl2t_fldlg2_fldln2_fldpi_fldz:
+; HASWELL-LABEL: test_fninit:
 ; HASWELL:       # %bb.0:
 ; HASWELL-NEXT:    #APP
-; HASWELL-NEXT:    fld1 # sched: [1:?]
-; HASWELL-NEXT:    fldl2e # sched: [100:0.25]
-; HASWELL-NEXT:    fldl2t # sched: [100:0.25]
-; HASWELL-NEXT:    fldln2 # sched: [100:0.25]
-; HASWELL-NEXT:    fldpi # sched: [1:0.50]
-; HASWELL-NEXT:    fldz # sched: [1:0.50]
+; HASWELL-NEXT:    fninit # sched: [1:?]
 ; HASWELL-NEXT:    #NO_APP
 ; HASWELL-NEXT:    retl # sched: [7:1.00]
 ;
-; BROADWELL-LABEL: test_fld1_fldl2e_fldl2t_fldlg2_fldln2_fldpi_fldz:
+; BROADWELL-LABEL: test_fninit:
 ; BROADWELL:       # %bb.0:
 ; BROADWELL-NEXT:    #APP
-; BROADWELL-NEXT:    fld1 # sched: [1:?]
-; BROADWELL-NEXT:    fldl2e # sched: [100:0.25]
-; BROADWELL-NEXT:    fldl2t # sched: [100:0.25]
-; BROADWELL-NEXT:    fldln2 # sched: [100:0.25]
-; BROADWELL-NEXT:    fldpi # sched: [100:0.25]
-; BROADWELL-NEXT:    fldz # sched: [1:?]
+; BROADWELL-NEXT:    fninit # sched: [75:6.00]
 ; BROADWELL-NEXT:    #NO_APP
 ; BROADWELL-NEXT:    retl # sched: [6:0.50]
 ;
-; SKYLAKE-LABEL: test_fld1_fldl2e_fldl2t_fldlg2_fldln2_fldpi_fldz:
+; SKYLAKE-LABEL: test_fninit:
 ; SKYLAKE:       # %bb.0:
 ; SKYLAKE-NEXT:    #APP
-; SKYLAKE-NEXT:    fld1 # sched: [1:?]
-; SKYLAKE-NEXT:    fldl2e # sched: [100:0.25]
-; SKYLAKE-NEXT:    fldl2t # sched: [100:0.25]
-; SKYLAKE-NEXT:    fldln2 # sched: [100:0.25]
-; SKYLAKE-NEXT:    fldpi # sched: [100:0.25]
-; SKYLAKE-NEXT:    fldz # sched: [1:?]
+; SKYLAKE-NEXT:    fninit # sched: [75:6.00]
 ; SKYLAKE-NEXT:    #NO_APP
 ; SKYLAKE-NEXT:    retl # sched: [6:0.50]
 ;
-; SKX-LABEL: test_fld1_fldl2e_fldl2t_fldlg2_fldln2_fldpi_fldz:
+; SKX-LABEL: test_fninit:
 ; SKX:       # %bb.0:
 ; SKX-NEXT:    #APP
-; SKX-NEXT:    fld1 # sched: [1:?]
-; SKX-NEXT:    fldl2e # sched: [100:0.25]
-; SKX-NEXT:    fldl2t # sched: [100:0.25]
-; SKX-NEXT:    fldln2 # sched: [100:0.25]
-; SKX-NEXT:    fldpi # sched: [100:0.25]
-; SKX-NEXT:    fldz # sched: [1:?]
+; SKX-NEXT:    fninit # sched: [75:6.00]
 ; SKX-NEXT:    #NO_APP
 ; SKX-NEXT:    retl # sched: [6:0.50]
 ;
-; BTVER2-LABEL: test_fld1_fldl2e_fldl2t_fldlg2_fldln2_fldpi_fldz:
+; BTVER2-LABEL: test_fninit:
 ; BTVER2:       # %bb.0:
 ; BTVER2-NEXT:    #APP
-; BTVER2-NEXT:    fld1 # sched: [1:?]
-; BTVER2-NEXT:    fldl2e # sched: [100:0.17]
-; BTVER2-NEXT:    fldl2t # sched: [100:0.17]
-; BTVER2-NEXT:    fldln2 # sched: [100:0.17]
-; BTVER2-NEXT:    fldpi # sched: [100:0.17]
-; BTVER2-NEXT:    fldz # sched: [1:?]
+; BTVER2-NEXT:    fninit # sched: [100:0.17]
 ; BTVER2-NEXT:    #NO_APP
 ; BTVER2-NEXT:    retl # sched: [4:1.00]
 ;
-; ZNVER1-LABEL: test_fld1_fldl2e_fldl2t_fldlg2_fldln2_fldpi_fldz:
+; ZNVER1-LABEL: test_fninit:
 ; ZNVER1:       # %bb.0:
 ; ZNVER1-NEXT:    #APP
-; ZNVER1-NEXT:    fld1 # sched: [11:1.00]
-; ZNVER1-NEXT:    fldl2e # sched: [100:?]
-; ZNVER1-NEXT:    fldl2t # sched: [100:?]
-; ZNVER1-NEXT:    fldln2 # sched: [100:?]
-; ZNVER1-NEXT:    fldpi # sched: [11:1.00]
-; ZNVER1-NEXT:    fldz # sched: [8:0.50]
+; ZNVER1-NEXT:    fninit # sched: [100:?]
 ; ZNVER1-NEXT:    #NO_APP
 ; ZNVER1-NEXT:    retl # sched: [1:0.50]
-  tail call void asm sideeffect "fld1 \0A\09 fldl2e \0A\09 fldl2t \0A\09 fldln2 \0A\09 fldpi \0A\09 fldz", ""() nounwind
+  tail call void asm sideeffect "fninit", ""() nounwind
   ret void
 }
 
-define void @test_fmul(float *%a0, double *%a1) optsize {
-; GENERIC-LABEL: test_fmul:
+define void @test_fist_fistp_fisttp(i16* %a0, i32* %a1, i64 *%a2) optsize {
+; GENERIC-LABEL: test_fist_fistp_fisttp:
 ; GENERIC:       # %bb.0:
 ; GENERIC-NEXT:    movl {{[0-9]+}}(%esp), %eax
 ; GENERIC-NEXT:    movl {{[0-9]+}}(%esp), %ecx
+; GENERIC-NEXT:    movl {{[0-9]+}}(%esp), %edx
 ; GENERIC-NEXT:    #APP
-; GENERIC-NEXT:    fmul %st(0), %st(1)
-; GENERIC-NEXT:    fmul %st(2)
-; GENERIC-NEXT:    fmuls (%ecx)
-; GENERIC-NEXT:    fmull (%eax)
+; GENERIC-NEXT:    fists (%edx)
+; GENERIC-NEXT:    fistl (%ecx)
+; GENERIC-NEXT:    fistps (%edx)
+; GENERIC-NEXT:    fistpl (%ecx)
+; GENERIC-NEXT:    fistpll (%eax)
+; GENERIC-NEXT:    fisttps (%edx)
+; GENERIC-NEXT:    fisttpl (%ecx)
+; GENERIC-NEXT:    fisttpll (%eax)
 ; GENERIC-NEXT:    #NO_APP
 ; GENERIC-NEXT:    retl
 ;
-; ATOM-LABEL: test_fmul:
+; ATOM-LABEL: test_fist_fistp_fisttp:
 ; ATOM:       # %bb.0:
 ; ATOM-NEXT:    movl {{[0-9]+}}(%esp), %eax # sched: [1:1.00]
 ; ATOM-NEXT:    movl {{[0-9]+}}(%esp), %ecx # sched: [1:1.00]
+; ATOM-NEXT:    movl {{[0-9]+}}(%esp), %edx # sched: [1:1.00]
 ; ATOM-NEXT:    #APP
-; ATOM-NEXT:    fmul %st(0), %st(1)
-; ATOM-NEXT:    fmul %st(2)
-; ATOM-NEXT:    fmuls (%ecx)
-; ATOM-NEXT:    fmull (%eax)
+; ATOM-NEXT:    fists (%edx) # sched: [6:3.00]
+; ATOM-NEXT:    fistl (%ecx) # sched: [6:3.00]
+; ATOM-NEXT:    fistps (%edx) # sched: [6:3.00]
+; ATOM-NEXT:    fistpl (%ecx) # sched: [6:3.00]
+; ATOM-NEXT:    fistpll (%eax) # sched: [6:3.00]
+; ATOM-NEXT:    fisttps (%edx) # sched: [2:1.00]
+; ATOM-NEXT:    fisttpl (%ecx) # sched: [2:1.00]
+; ATOM-NEXT:    fisttpll (%eax) # sched: [2:1.00]
 ; ATOM-NEXT:    #NO_APP
 ; ATOM-NEXT:    retl # sched: [79:39.50]
 ;
-; SLM-LABEL: test_fmul:
+; SLM-LABEL: test_fist_fistp_fisttp:
 ; SLM:       # %bb.0:
 ; SLM-NEXT:    movl {{[0-9]+}}(%esp), %eax # sched: [3:1.00]
 ; SLM-NEXT:    movl {{[0-9]+}}(%esp), %ecx # sched: [3:1.00]
+; SLM-NEXT:    movl {{[0-9]+}}(%esp), %edx # sched: [3:1.00]
 ; SLM-NEXT:    #APP
-; SLM-NEXT:    fmul %st(0), %st(1) # sched: [5:2.00]
-; SLM-NEXT:    fmul %st(2) # sched: [5:2.00]
-; SLM-NEXT:    fmuls (%ecx) # sched: [8:2.00]
-; SLM-NEXT:    fmull (%eax) # sched: [8:2.00]
+; SLM-NEXT:    fists (%edx) # sched: [1:1.00]
+; SLM-NEXT:    fistl (%ecx) # sched: [1:1.00]
+; SLM-NEXT:    fistps (%edx) # sched: [1:1.00]
+; SLM-NEXT:    fistpl (%ecx) # sched: [1:1.00]
+; SLM-NEXT:    fistpll (%eax) # sched: [1:1.00]
+; SLM-NEXT:    fisttps (%edx) # sched: [1:1.00]
+; SLM-NEXT:    fisttpl (%ecx) # sched: [1:1.00]
+; SLM-NEXT:    fisttpll (%eax) # sched: [1:1.00]
 ; SLM-NEXT:    #NO_APP
 ; SLM-NEXT:    retl # sched: [4:1.00]
 ;
-; SANDY-LABEL: test_fmul:
+; SANDY-LABEL: test_fist_fistp_fisttp:
 ; SANDY:       # %bb.0:
 ; SANDY-NEXT:    movl {{[0-9]+}}(%esp), %eax # sched: [5:0.50]
 ; SANDY-NEXT:    movl {{[0-9]+}}(%esp), %ecx # sched: [5:0.50]
+; SANDY-NEXT:    movl {{[0-9]+}}(%esp), %edx # sched: [5:0.50]
 ; SANDY-NEXT:    #APP
-; SANDY-NEXT:    fmul %st(0), %st(1) # sched: [5:1.00]
-; SANDY-NEXT:    fmul %st(2) # sched: [5:1.00]
-; SANDY-NEXT:    fmuls (%ecx) # sched: [12:1.00]
-; SANDY-NEXT:    fmull (%eax) # sched: [12:1.00]
+; SANDY-NEXT:    fists (%edx) # sched: [9:1.00]
+; SANDY-NEXT:    fistl (%ecx) # sched: [9:1.00]
+; SANDY-NEXT:    fistps (%edx) # sched: [9:1.00]
+; SANDY-NEXT:    fistpl (%ecx) # sched: [9:1.00]
+; SANDY-NEXT:    fistpll (%eax) # sched: [9:1.00]
+; SANDY-NEXT:    fisttps (%edx) # sched: [5:1.00]
+; SANDY-NEXT:    fisttpl (%ecx) # sched: [5:1.00]
+; SANDY-NEXT:    fisttpll (%eax) # sched: [5:1.00]
 ; SANDY-NEXT:    #NO_APP
 ; SANDY-NEXT:    retl # sched: [5:1.00]
 ;
-; HASWELL-LABEL: test_fmul:
+; HASWELL-LABEL: test_fist_fistp_fisttp:
 ; HASWELL:       # %bb.0:
 ; HASWELL-NEXT:    movl {{[0-9]+}}(%esp), %eax # sched: [5:0.50]
 ; HASWELL-NEXT:    movl {{[0-9]+}}(%esp), %ecx # sched: [5:0.50]
+; HASWELL-NEXT:    movl {{[0-9]+}}(%esp), %edx # sched: [5:0.50]
 ; HASWELL-NEXT:    #APP
-; HASWELL-NEXT:    fmul %st(0), %st(1) # sched: [5:1.00]
-; HASWELL-NEXT:    fmul %st(2) # sched: [5:1.00]
-; HASWELL-NEXT:    fmuls (%ecx) # sched: [12:1.00]
+; HASWELL-NEXT:    fists (%edx) # sched: [4:1.00]
+; HASWELL-NEXT:    fistl (%ecx) # sched: [4:1.00]
+; HASWELL-NEXT:    fistps (%edx) # sched: [4:1.00]
+; HASWELL-NEXT:    fistpl (%ecx) # sched: [4:1.00]
+; HASWELL-NEXT:    fistpll (%eax) # sched: [4:1.00]
+; HASWELL-NEXT:    fisttps (%edx) # sched: [4:1.00]
+; HASWELL-NEXT:    fisttpl (%ecx) # sched: [4:1.00]
+; HASWELL-NEXT:    fisttpll (%eax) # sched: [4:1.00]
+; HASWELL-NEXT:    #NO_APP
+; HASWELL-NEXT:    retl # sched: [7:1.00]
+;
+; BROADWELL-LABEL: test_fist_fistp_fisttp:
+; BROADWELL:       # %bb.0:
+; BROADWELL-NEXT:    movl {{[0-9]+}}(%esp), %eax # sched: [5:0.50]
+; BROADWELL-NEXT:    movl {{[0-9]+}}(%esp), %ecx # sched: [5:0.50]
+; BROADWELL-NEXT:    movl {{[0-9]+}}(%esp), %edx # sched: [5:0.50]
+; BROADWELL-NEXT:    #APP
+; BROADWELL-NEXT:    fists (%edx) # sched: [4:1.00]
+; BROADWELL-NEXT:    fistl (%ecx) # sched: [4:1.00]
+; BROADWELL-NEXT:    fistps (%edx) # sched: [4:1.00]
+; BROADWELL-NEXT:    fistpl (%ecx) # sched: [4:1.00]
+; BROADWELL-NEXT:    fistpll (%eax) # sched: [4:1.00]
+; BROADWELL-NEXT:    fisttps (%edx) # sched: [4:1.00]
+; BROADWELL-NEXT:    fisttpl (%ecx) # sched: [4:1.00]
+; BROADWELL-NEXT:    fisttpll (%eax) # sched: [4:1.00]
+; BROADWELL-NEXT:    #NO_APP
+; BROADWELL-NEXT:    retl # sched: [6:0.50]
+;
+; SKYLAKE-LABEL: test_fist_fistp_fisttp:
+; SKYLAKE:       # %bb.0:
+; SKYLAKE-NEXT:    movl {{[0-9]+}}(%esp), %eax # sched: [5:0.50]
+; SKYLAKE-NEXT:    movl {{[0-9]+}}(%esp), %ecx # sched: [5:0.50]
+; SKYLAKE-NEXT:    movl {{[0-9]+}}(%esp), %edx # sched: [5:0.50]
+; SKYLAKE-NEXT:    #APP
+; SKYLAKE-NEXT:    fists (%edx) # sched: [4:1.00]
+; SKYLAKE-NEXT:    fistl (%ecx) # sched: [4:1.00]
+; SKYLAKE-NEXT:    fistps (%edx) # sched: [4:1.00]
+; SKYLAKE-NEXT:    fistpl (%ecx) # sched: [4:1.00]
+; SKYLAKE-NEXT:    fistpll (%eax) # sched: [4:1.00]
+; SKYLAKE-NEXT:    fisttps (%edx) # sched: [4:1.00]
+; SKYLAKE-NEXT:    fisttpl (%ecx) # sched: [4:1.00]
+; SKYLAKE-NEXT:    fisttpll (%eax) # sched: [4:1.00]
+; SKYLAKE-NEXT:    #NO_APP
+; SKYLAKE-NEXT:    retl # sched: [6:0.50]
+;
+; SKX-LABEL: test_fist_fistp_fisttp:
+; SKX:       # %bb.0:
+; SKX-NEXT:    movl {{[0-9]+}}(%esp), %eax # sched: [5:0.50]
+; SKX-NEXT:    movl {{[0-9]+}}(%esp), %ecx # sched: [5:0.50]
+; SKX-NEXT:    movl {{[0-9]+}}(%esp), %edx # sched: [5:0.50]
+; SKX-NEXT:    #APP
+; SKX-NEXT:    fists (%edx) # sched: [4:1.00]
+; SKX-NEXT:    fistl (%ecx) # sched: [4:1.00]
+; SKX-NEXT:    fistps (%edx) # sched: [4:1.00]
+; SKX-NEXT:    fistpl (%ecx) # sched: [4:1.00]
+; SKX-NEXT:    fistpll (%eax) # sched: [4:1.00]
+; SKX-NEXT:    fisttps (%edx) # sched: [4:1.00]
+; SKX-NEXT:    fisttpl (%ecx) # sched: [4:1.00]
+; SKX-NEXT:    fisttpll (%eax) # sched: [4:1.00]
+; SKX-NEXT:    #NO_APP
+; SKX-NEXT:    retl # sched: [6:0.50]
+;
+; BTVER2-LABEL: test_fist_fistp_fisttp:
+; BTVER2:       # %bb.0:
+; BTVER2-NEXT:    movl {{[0-9]+}}(%esp), %eax # sched: [5:1.00]
+; BTVER2-NEXT:    movl {{[0-9]+}}(%esp), %ecx # sched: [5:1.00]
+; BTVER2-NEXT:    movl {{[0-9]+}}(%esp), %edx # sched: [5:1.00]
+; BTVER2-NEXT:    #APP
+; BTVER2-NEXT:    fists (%edx) # sched: [1:1.00]
+; BTVER2-NEXT:    fistl (%ecx) # sched: [1:1.00]
+; BTVER2-NEXT:    fistps (%edx) # sched: [1:1.00]
+; BTVER2-NEXT:    fistpl (%ecx) # sched: [1:1.00]
+; BTVER2-NEXT:    fistpll (%eax) # sched: [1:1.00]
+; BTVER2-NEXT:    fisttps (%edx) # sched: [1:1.00]
+; BTVER2-NEXT:    fisttpl (%ecx) # sched: [1:1.00]
+; BTVER2-NEXT:    fisttpll (%eax) # sched: [1:1.00]
+; BTVER2-NEXT:    #NO_APP
+; BTVER2-NEXT:    retl # sched: [4:1.00]
+;
+; ZNVER1-LABEL: test_fist_fistp_fisttp:
+; ZNVER1:       # %bb.0:
+; ZNVER1-NEXT:    movl {{[0-9]+}}(%esp), %eax # sched: [8:0.50]
+; ZNVER1-NEXT:    movl {{[0-9]+}}(%esp), %ecx # sched: [8:0.50]
+; ZNVER1-NEXT:    movl {{[0-9]+}}(%esp), %edx # sched: [8:0.50]
+; ZNVER1-NEXT:    #APP
+; ZNVER1-NEXT:    fists (%edx) # sched: [12:0.50]
+; ZNVER1-NEXT:    fistl (%ecx) # sched: [12:0.50]
+; ZNVER1-NEXT:    fistps (%edx) # sched: [12:0.50]
+; ZNVER1-NEXT:    fistpl (%ecx) # sched: [12:0.50]
+; ZNVER1-NEXT:    fistpll (%eax) # sched: [1:0.50]
+; ZNVER1-NEXT:    fisttps (%edx) # sched: [1:0.50]
+; ZNVER1-NEXT:    fisttpl (%ecx) # sched: [1:0.50]
+; ZNVER1-NEXT:    fisttpll (%eax) # sched: [1:0.50]
+; ZNVER1-NEXT:    #NO_APP
+; ZNVER1-NEXT:    retl # sched: [1:0.50]
+  tail call void asm sideeffect "fists $0 \0A\09 fistl $1 \0A\09 fistps $0 \0A\09 fistpl $1 \0A\09 fistpll $2 \0A\09 fisttps $0 \0A\09 fisttpl $1 \0A\09 fisttpll $2", "*m,*m,*m"(i16* %a0, i32* %a1, i64 *%a2) nounwind
+  ret void
+}
+
+define void @test_fld(i16* %a0, i32* %a1, i64 *%a2) optsize {
+; GENERIC-LABEL: test_fld:
+; GENERIC:       # %bb.0:
+; GENERIC-NEXT:    movl {{[0-9]+}}(%esp), %eax
+; GENERIC-NEXT:    movl {{[0-9]+}}(%esp), %ecx
+; GENERIC-NEXT:    movl {{[0-9]+}}(%esp), %edx
+; GENERIC-NEXT:    #APP
+; GENERIC-NEXT:    fld %st(0)
+; GENERIC-NEXT:    flds (%edx)
+; GENERIC-NEXT:    fldl (%ecx)
+; GENERIC-NEXT:    fldt (%eax)
+; GENERIC-NEXT:    #NO_APP
+; GENERIC-NEXT:    retl
+;
+; ATOM-LABEL: test_fld:
+; ATOM:       # %bb.0:
+; ATOM-NEXT:    movl {{[0-9]+}}(%esp), %eax # sched: [1:1.00]
+; ATOM-NEXT:    movl {{[0-9]+}}(%esp), %ecx # sched: [1:1.00]
+; ATOM-NEXT:    movl {{[0-9]+}}(%esp), %edx # sched: [1:1.00]
+; ATOM-NEXT:    #APP
+; ATOM-NEXT:    fld %st(0) # sched: [1:1.00]
+; ATOM-NEXT:    flds (%edx) # sched: [1:1.00]
+; ATOM-NEXT:    fldl (%ecx) # sched: [1:1.00]
+; ATOM-NEXT:    fldt (%eax) # sched: [4:2.00]
+; ATOM-NEXT:    #NO_APP
+; ATOM-NEXT:    retl # sched: [79:39.50]
+;
+; SLM-LABEL: test_fld:
+; SLM:       # %bb.0:
+; SLM-NEXT:    movl {{[0-9]+}}(%esp), %eax # sched: [3:1.00]
+; SLM-NEXT:    movl {{[0-9]+}}(%esp), %ecx # sched: [3:1.00]
+; SLM-NEXT:    movl {{[0-9]+}}(%esp), %edx # sched: [3:1.00]
+; SLM-NEXT:    #APP
+; SLM-NEXT:    fld %st(0) # sched: [1:0.50]
+; SLM-NEXT:    flds (%edx) # sched: [3:1.00]
+; SLM-NEXT:    fldl (%ecx) # sched: [3:1.00]
+; SLM-NEXT:    fldt (%eax) # sched: [3:1.00]
+; SLM-NEXT:    #NO_APP
+; SLM-NEXT:    retl # sched: [4:1.00]
+;
+; SANDY-LABEL: test_fld:
+; SANDY:       # %bb.0:
+; SANDY-NEXT:    movl {{[0-9]+}}(%esp), %eax # sched: [5:0.50]
+; SANDY-NEXT:    movl {{[0-9]+}}(%esp), %ecx # sched: [5:0.50]
+; SANDY-NEXT:    movl {{[0-9]+}}(%esp), %edx # sched: [5:0.50]
+; SANDY-NEXT:    #APP
+; SANDY-NEXT:    fld %st(0) # sched: [1:1.00]
+; SANDY-NEXT:    flds (%edx) # sched: [9:1.00]
+; SANDY-NEXT:    fldl (%ecx) # sched: [9:1.00]
+; SANDY-NEXT:    fldt (%eax) # sched: [9:1.00]
+; SANDY-NEXT:    #NO_APP
+; SANDY-NEXT:    retl # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_fld:
+; HASWELL:       # %bb.0:
+; HASWELL-NEXT:    movl {{[0-9]+}}(%esp), %eax # sched: [5:0.50]
+; HASWELL-NEXT:    movl {{[0-9]+}}(%esp), %ecx # sched: [5:0.50]
+; HASWELL-NEXT:    movl {{[0-9]+}}(%esp), %edx # sched: [5:0.50]
+; HASWELL-NEXT:    #APP
+; HASWELL-NEXT:    fld %st(0) # sched: [1:0.50]
+; HASWELL-NEXT:    flds (%edx) # sched: [7:0.50]
+; HASWELL-NEXT:    fldl (%ecx) # sched: [7:0.50]
+; HASWELL-NEXT:    fldt (%eax) # sched: [7:0.50]
+; HASWELL-NEXT:    #NO_APP
+; HASWELL-NEXT:    retl # sched: [7:1.00]
+;
+; BROADWELL-LABEL: test_fld:
+; BROADWELL:       # %bb.0:
+; BROADWELL-NEXT:    movl {{[0-9]+}}(%esp), %eax # sched: [5:0.50]
+; BROADWELL-NEXT:    movl {{[0-9]+}}(%esp), %ecx # sched: [5:0.50]
+; BROADWELL-NEXT:    movl {{[0-9]+}}(%esp), %edx # sched: [5:0.50]
+; BROADWELL-NEXT:    #APP
+; BROADWELL-NEXT:    fld %st(0) # sched: [1:0.25]
+; BROADWELL-NEXT:    flds (%edx) # sched: [6:0.50]
+; BROADWELL-NEXT:    fldl (%ecx) # sched: [6:0.50]
+; BROADWELL-NEXT:    fldt (%eax) # sched: [6:0.50]
+; BROADWELL-NEXT:    #NO_APP
+; BROADWELL-NEXT:    retl # sched: [6:0.50]
+;
+; SKYLAKE-LABEL: test_fld:
+; SKYLAKE:       # %bb.0:
+; SKYLAKE-NEXT:    movl {{[0-9]+}}(%esp), %eax # sched: [5:0.50]
+; SKYLAKE-NEXT:    movl {{[0-9]+}}(%esp), %ecx # sched: [5:0.50]
+; SKYLAKE-NEXT:    movl {{[0-9]+}}(%esp), %edx # sched: [5:0.50]
+; SKYLAKE-NEXT:    #APP
+; SKYLAKE-NEXT:    fld %st(0) # sched: [1:0.25]
+; SKYLAKE-NEXT:    flds (%edx) # sched: [7:0.50]
+; SKYLAKE-NEXT:    fldl (%ecx) # sched: [7:0.50]
+; SKYLAKE-NEXT:    fldt (%eax) # sched: [7:0.50]
+; SKYLAKE-NEXT:    #NO_APP
+; SKYLAKE-NEXT:    retl # sched: [6:0.50]
+;
+; SKX-LABEL: test_fld:
+; SKX:       # %bb.0:
+; SKX-NEXT:    movl {{[0-9]+}}(%esp), %eax # sched: [5:0.50]
+; SKX-NEXT:    movl {{[0-9]+}}(%esp), %ecx # sched: [5:0.50]
+; SKX-NEXT:    movl {{[0-9]+}}(%esp), %edx # sched: [5:0.50]
+; SKX-NEXT:    #APP
+; SKX-NEXT:    fld %st(0) # sched: [1:0.25]
+; SKX-NEXT:    flds (%edx) # sched: [7:0.50]
+; SKX-NEXT:    fldl (%ecx) # sched: [7:0.50]
+; SKX-NEXT:    fldt (%eax) # sched: [7:0.50]
+; SKX-NEXT:    #NO_APP
+; SKX-NEXT:    retl # sched: [6:0.50]
+;
+; BTVER2-LABEL: test_fld:
+; BTVER2:       # %bb.0:
+; BTVER2-NEXT:    movl {{[0-9]+}}(%esp), %eax # sched: [5:1.00]
+; BTVER2-NEXT:    movl {{[0-9]+}}(%esp), %ecx # sched: [5:1.00]
+; BTVER2-NEXT:    movl {{[0-9]+}}(%esp), %edx # sched: [5:1.00]
+; BTVER2-NEXT:    #APP
+; BTVER2-NEXT:    fld %st(0) # sched: [1:0.50]
+; BTVER2-NEXT:    flds (%edx) # sched: [5:1.00]
+; BTVER2-NEXT:    fldl (%ecx) # sched: [5:1.00]
+; BTVER2-NEXT:    fldt (%eax) # sched: [5:1.00]
+; BTVER2-NEXT:    #NO_APP
+; BTVER2-NEXT:    retl # sched: [4:1.00]
+;
+; ZNVER1-LABEL: test_fld:
+; ZNVER1:       # %bb.0:
+; ZNVER1-NEXT:    movl {{[0-9]+}}(%esp), %eax # sched: [8:0.50]
+; ZNVER1-NEXT:    movl {{[0-9]+}}(%esp), %ecx # sched: [8:0.50]
+; ZNVER1-NEXT:    movl {{[0-9]+}}(%esp), %edx # sched: [8:0.50]
+; ZNVER1-NEXT:    #APP
+; ZNVER1-NEXT:    fld %st(0) # sched: [1:0.50]
+; ZNVER1-NEXT:    flds (%edx) # sched: [8:0.50]
+; ZNVER1-NEXT:    fldl (%ecx) # sched: [8:0.50]
+; ZNVER1-NEXT:    fldt (%eax) # sched: [1:0.50]
+; ZNVER1-NEXT:    #NO_APP
+; ZNVER1-NEXT:    retl # sched: [1:0.50]
+  tail call void asm sideeffect "fld %st(0) \0A\09 flds $0 \0A\09 fldl $1 \0A\09 fldt $2", "*m,*m,*m"(i16* %a0, i32* %a1, i64 *%a2) nounwind
+  ret void
+}
+
+define void @test_fldcw_fldenv(i8* %a0) optsize {
+; GENERIC-LABEL: test_fldcw_fldenv:
+; GENERIC:       # %bb.0:
+; GENERIC-NEXT:    movl {{[0-9]+}}(%esp), %eax
+; GENERIC-NEXT:    #APP
+; GENERIC-NEXT:    fldcw (%eax)
+; GENERIC-NEXT:    fldenv (%eax)
+; GENERIC-NEXT:    #NO_APP
+; GENERIC-NEXT:    retl
+;
+; ATOM-LABEL: test_fldcw_fldenv:
+; ATOM:       # %bb.0:
+; ATOM-NEXT:    movl {{[0-9]+}}(%esp), %eax # sched: [1:1.00]
+; ATOM-NEXT:    #APP
+; ATOM-NEXT:    fldcw (%eax) # sched: [5:2.50]
+; ATOM-NEXT:    fldenv (%eax)
+; ATOM-NEXT:    #NO_APP
+; ATOM-NEXT:    retl # sched: [79:39.50]
+;
+; SLM-LABEL: test_fldcw_fldenv:
+; SLM:       # %bb.0:
+; SLM-NEXT:    movl {{[0-9]+}}(%esp), %eax # sched: [3:1.00]
+; SLM-NEXT:    #APP
+; SLM-NEXT:    fldcw (%eax) # sched: [3:1.00]
+; SLM-NEXT:    fldenv (%eax) # sched: [100:1.00]
+; SLM-NEXT:    #NO_APP
+; SLM-NEXT:    retl # sched: [4:1.00]
+;
+; SANDY-LABEL: test_fldcw_fldenv:
+; SANDY:       # %bb.0:
+; SANDY-NEXT:    movl {{[0-9]+}}(%esp), %eax # sched: [5:0.50]
+; SANDY-NEXT:    #APP
+; SANDY-NEXT:    fldcw (%eax) # sched: [8:2.00]
+; SANDY-NEXT:    fldenv (%eax) # sched: [100:0.33]
+; SANDY-NEXT:    #NO_APP
+; SANDY-NEXT:    retl # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_fldcw_fldenv:
+; HASWELL:       # %bb.0:
+; HASWELL-NEXT:    movl {{[0-9]+}}(%esp), %eax # sched: [5:0.50]
+; HASWELL-NEXT:    #APP
+; HASWELL-NEXT:    fldcw (%eax) # sched: [7:1.00]
+; HASWELL-NEXT:    fldenv (%eax) # sched: [61:14.00]
+; HASWELL-NEXT:    #NO_APP
+; HASWELL-NEXT:    retl # sched: [7:1.00]
+;
+; BROADWELL-LABEL: test_fldcw_fldenv:
+; BROADWELL:       # %bb.0:
+; BROADWELL-NEXT:    movl {{[0-9]+}}(%esp), %eax # sched: [5:0.50]
+; BROADWELL-NEXT:    #APP
+; BROADWELL-NEXT:    fldcw (%eax) # sched: [7:1.00]
+; BROADWELL-NEXT:    fldenv (%eax) # sched: [60:14.00]
+; BROADWELL-NEXT:    #NO_APP
+; BROADWELL-NEXT:    retl # sched: [6:0.50]
+;
+; SKYLAKE-LABEL: test_fldcw_fldenv:
+; SKYLAKE:       # %bb.0:
+; SKYLAKE-NEXT:    movl {{[0-9]+}}(%esp), %eax # sched: [5:0.50]
+; SKYLAKE-NEXT:    #APP
+; SKYLAKE-NEXT:    fldcw (%eax) # sched: [7:1.00]
+; SKYLAKE-NEXT:    fldenv (%eax) # sched: [62:14.00]
+; SKYLAKE-NEXT:    #NO_APP
+; SKYLAKE-NEXT:    retl # sched: [6:0.50]
+;
+; SKX-LABEL: test_fldcw_fldenv:
+; SKX:       # %bb.0:
+; SKX-NEXT:    movl {{[0-9]+}}(%esp), %eax # sched: [5:0.50]
+; SKX-NEXT:    #APP
+; SKX-NEXT:    fldcw (%eax) # sched: [7:1.00]
+; SKX-NEXT:    fldenv (%eax) # sched: [62:14.00]
+; SKX-NEXT:    #NO_APP
+; SKX-NEXT:    retl # sched: [6:0.50]
+;
+; BTVER2-LABEL: test_fldcw_fldenv:
+; BTVER2:       # %bb.0:
+; BTVER2-NEXT:    movl {{[0-9]+}}(%esp), %eax # sched: [5:1.00]
+; BTVER2-NEXT:    #APP
+; BTVER2-NEXT:    fldcw (%eax) # sched: [5:1.00]
+; BTVER2-NEXT:    fldenv (%eax) # sched: [100:0.17]
+; BTVER2-NEXT:    #NO_APP
+; BTVER2-NEXT:    retl # sched: [4:1.00]
+;
+; ZNVER1-LABEL: test_fldcw_fldenv:
+; ZNVER1:       # %bb.0:
+; ZNVER1-NEXT:    movl {{[0-9]+}}(%esp), %eax # sched: [8:0.50]
+; ZNVER1-NEXT:    #APP
+; ZNVER1-NEXT:    fldcw (%eax) # sched: [100:?]
+; ZNVER1-NEXT:    fldenv (%eax) # sched: [100:?]
+; ZNVER1-NEXT:    #NO_APP
+; ZNVER1-NEXT:    retl # sched: [1:0.50]
+  tail call void asm sideeffect "fldcw $0 \0A\09 fldenv $0", "*m"(i8* %a0) nounwind
+  ret void
+}
+
+define void @test_fld1_fldl2e_fldl2t_fldlg2_fldln2_fldpi_fldz() optsize {
+; GENERIC-LABEL: test_fld1_fldl2e_fldl2t_fldlg2_fldln2_fldpi_fldz:
+; GENERIC:       # %bb.0:
+; GENERIC-NEXT:    #APP
+; GENERIC-NEXT:    fld1
+; GENERIC-NEXT:    fldl2e
+; GENERIC-NEXT:    fldl2t
+; GENERIC-NEXT:    fldln2
+; GENERIC-NEXT:    fldpi
+; GENERIC-NEXT:    fldz
+; GENERIC-NEXT:    #NO_APP
+; GENERIC-NEXT:    retl
+;
+; ATOM-LABEL: test_fld1_fldl2e_fldl2t_fldlg2_fldln2_fldpi_fldz:
+; ATOM:       # %bb.0:
+; ATOM-NEXT:    #APP
+; ATOM-NEXT:    fld1 # sched: [6:3.00]
+; ATOM-NEXT:    fldl2e # sched: [10:5.00]
+; ATOM-NEXT:    fldl2t # sched: [10:5.00]
+; ATOM-NEXT:    fldln2 # sched: [10:5.00]
+; ATOM-NEXT:    fldpi # sched: [10:5.00]
+; ATOM-NEXT:    fldz # sched: [1:0.50]
+; ATOM-NEXT:    #NO_APP
+; ATOM-NEXT:    retl # sched: [79:39.50]
+;
+; SLM-LABEL: test_fld1_fldl2e_fldl2t_fldlg2_fldln2_fldpi_fldz:
+; SLM:       # %bb.0:
+; SLM-NEXT:    #APP
+; SLM-NEXT:    fld1 # sched: [1:?]
+; SLM-NEXT:    fldl2e # sched: [100:1.00]
+; SLM-NEXT:    fldl2t # sched: [100:1.00]
+; SLM-NEXT:    fldln2 # sched: [100:1.00]
+; SLM-NEXT:    fldpi # sched: [100:1.00]
+; SLM-NEXT:    fldz # sched: [1:?]
+; SLM-NEXT:    #NO_APP
+; SLM-NEXT:    retl # sched: [4:1.00]
+;
+; SANDY-LABEL: test_fld1_fldl2e_fldl2t_fldlg2_fldln2_fldpi_fldz:
+; SANDY:       # %bb.0:
+; SANDY-NEXT:    #APP
+; SANDY-NEXT:    fld1 # sched: [1:?]
+; SANDY-NEXT:    fldl2e # sched: [100:0.33]
+; SANDY-NEXT:    fldl2t # sched: [100:0.33]
+; SANDY-NEXT:    fldln2 # sched: [100:0.33]
+; SANDY-NEXT:    fldpi # sched: [100:0.33]
+; SANDY-NEXT:    fldz # sched: [1:?]
+; SANDY-NEXT:    #NO_APP
+; SANDY-NEXT:    retl # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_fld1_fldl2e_fldl2t_fldlg2_fldln2_fldpi_fldz:
+; HASWELL:       # %bb.0:
+; HASWELL-NEXT:    #APP
+; HASWELL-NEXT:    fld1 # sched: [1:?]
+; HASWELL-NEXT:    fldl2e # sched: [100:0.25]
+; HASWELL-NEXT:    fldl2t # sched: [100:0.25]
+; HASWELL-NEXT:    fldln2 # sched: [100:0.25]
+; HASWELL-NEXT:    fldpi # sched: [1:0.50]
+; HASWELL-NEXT:    fldz # sched: [1:0.50]
+; HASWELL-NEXT:    #NO_APP
+; HASWELL-NEXT:    retl # sched: [7:1.00]
+;
+; BROADWELL-LABEL: test_fld1_fldl2e_fldl2t_fldlg2_fldln2_fldpi_fldz:
+; BROADWELL:       # %bb.0:
+; BROADWELL-NEXT:    #APP
+; BROADWELL-NEXT:    fld1 # sched: [1:?]
+; BROADWELL-NEXT:    fldl2e # sched: [100:0.25]
+; BROADWELL-NEXT:    fldl2t # sched: [100:0.25]
+; BROADWELL-NEXT:    fldln2 # sched: [100:0.25]
+; BROADWELL-NEXT:    fldpi # sched: [100:0.25]
+; BROADWELL-NEXT:    fldz # sched: [1:?]
+; BROADWELL-NEXT:    #NO_APP
+; BROADWELL-NEXT:    retl # sched: [6:0.50]
+;
+; SKYLAKE-LABEL: test_fld1_fldl2e_fldl2t_fldlg2_fldln2_fldpi_fldz:
+; SKYLAKE:       # %bb.0:
+; SKYLAKE-NEXT:    #APP
+; SKYLAKE-NEXT:    fld1 # sched: [1:?]
+; SKYLAKE-NEXT:    fldl2e # sched: [100:0.25]
+; SKYLAKE-NEXT:    fldl2t # sched: [100:0.25]
+; SKYLAKE-NEXT:    fldln2 # sched: [100:0.25]
+; SKYLAKE-NEXT:    fldpi # sched: [100:0.25]
+; SKYLAKE-NEXT:    fldz # sched: [1:?]
+; SKYLAKE-NEXT:    #NO_APP
+; SKYLAKE-NEXT:    retl # sched: [6:0.50]
+;
+; SKX-LABEL: test_fld1_fldl2e_fldl2t_fldlg2_fldln2_fldpi_fldz:
+; SKX:       # %bb.0:
+; SKX-NEXT:    #APP
+; SKX-NEXT:    fld1 # sched: [1:?]
+; SKX-NEXT:    fldl2e # sched: [100:0.25]
+; SKX-NEXT:    fldl2t # sched: [100:0.25]
+; SKX-NEXT:    fldln2 # sched: [100:0.25]
+; SKX-NEXT:    fldpi # sched: [100:0.25]
+; SKX-NEXT:    fldz # sched: [1:?]
+; SKX-NEXT:    #NO_APP
+; SKX-NEXT:    retl # sched: [6:0.50]
+;
+; BTVER2-LABEL: test_fld1_fldl2e_fldl2t_fldlg2_fldln2_fldpi_fldz:
+; BTVER2:       # %bb.0:
+; BTVER2-NEXT:    #APP
+; BTVER2-NEXT:    fld1 # sched: [1:?]
+; BTVER2-NEXT:    fldl2e # sched: [100:0.17]
+; BTVER2-NEXT:    fldl2t # sched: [100:0.17]
+; BTVER2-NEXT:    fldln2 # sched: [100:0.17]
+; BTVER2-NEXT:    fldpi # sched: [100:0.17]
+; BTVER2-NEXT:    fldz # sched: [1:?]
+; BTVER2-NEXT:    #NO_APP
+; BTVER2-NEXT:    retl # sched: [4:1.00]
+;
+; ZNVER1-LABEL: test_fld1_fldl2e_fldl2t_fldlg2_fldln2_fldpi_fldz:
+; ZNVER1:       # %bb.0:
+; ZNVER1-NEXT:    #APP
+; ZNVER1-NEXT:    fld1 # sched: [11:1.00]
+; ZNVER1-NEXT:    fldl2e # sched: [100:?]
+; ZNVER1-NEXT:    fldl2t # sched: [100:?]
+; ZNVER1-NEXT:    fldln2 # sched: [100:?]
+; ZNVER1-NEXT:    fldpi # sched: [11:1.00]
+; ZNVER1-NEXT:    fldz # sched: [8:0.50]
+; ZNVER1-NEXT:    #NO_APP
+; ZNVER1-NEXT:    retl # sched: [1:0.50]
+  tail call void asm sideeffect "fld1 \0A\09 fldl2e \0A\09 fldl2t \0A\09 fldln2 \0A\09 fldpi \0A\09 fldz", ""() nounwind
+  ret void
+}
+
+define void @test_fmul(float *%a0, double *%a1) optsize {
+; GENERIC-LABEL: test_fmul:
+; GENERIC:       # %bb.0:
+; GENERIC-NEXT:    movl {{[0-9]+}}(%esp), %eax
+; GENERIC-NEXT:    movl {{[0-9]+}}(%esp), %ecx
+; GENERIC-NEXT:    #APP
+; GENERIC-NEXT:    fmul %st(0), %st(1)
+; GENERIC-NEXT:    fmul %st(2)
+; GENERIC-NEXT:    fmuls (%ecx)
+; GENERIC-NEXT:    fmull (%eax)
+; GENERIC-NEXT:    #NO_APP
+; GENERIC-NEXT:    retl
+;
+; ATOM-LABEL: test_fmul:
+; ATOM:       # %bb.0:
+; ATOM-NEXT:    movl {{[0-9]+}}(%esp), %eax # sched: [1:1.00]
+; ATOM-NEXT:    movl {{[0-9]+}}(%esp), %ecx # sched: [1:1.00]
+; ATOM-NEXT:    #APP
+; ATOM-NEXT:    fmul %st(0), %st(1)
+; ATOM-NEXT:    fmul %st(2)
+; ATOM-NEXT:    fmuls (%ecx)
+; ATOM-NEXT:    fmull (%eax)
+; ATOM-NEXT:    #NO_APP
+; ATOM-NEXT:    retl # sched: [79:39.50]
+;
+; SLM-LABEL: test_fmul:
+; SLM:       # %bb.0:
+; SLM-NEXT:    movl {{[0-9]+}}(%esp), %eax # sched: [3:1.00]
+; SLM-NEXT:    movl {{[0-9]+}}(%esp), %ecx # sched: [3:1.00]
+; SLM-NEXT:    #APP
+; SLM-NEXT:    fmul %st(0), %st(1) # sched: [5:2.00]
+; SLM-NEXT:    fmul %st(2) # sched: [5:2.00]
+; SLM-NEXT:    fmuls (%ecx) # sched: [8:2.00]
+; SLM-NEXT:    fmull (%eax) # sched: [8:2.00]
+; SLM-NEXT:    #NO_APP
+; SLM-NEXT:    retl # sched: [4:1.00]
+;
+; SANDY-LABEL: test_fmul:
+; SANDY:       # %bb.0:
+; SANDY-NEXT:    movl {{[0-9]+}}(%esp), %eax # sched: [5:0.50]
+; SANDY-NEXT:    movl {{[0-9]+}}(%esp), %ecx # sched: [5:0.50]
+; SANDY-NEXT:    #APP
+; SANDY-NEXT:    fmul %st(0), %st(1) # sched: [5:1.00]
+; SANDY-NEXT:    fmul %st(2) # sched: [5:1.00]
+; SANDY-NEXT:    fmuls (%ecx) # sched: [12:1.00]
+; SANDY-NEXT:    fmull (%eax) # sched: [12:1.00]
+; SANDY-NEXT:    #NO_APP
+; SANDY-NEXT:    retl # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_fmul:
+; HASWELL:       # %bb.0:
+; HASWELL-NEXT:    movl {{[0-9]+}}(%esp), %eax # sched: [5:0.50]
+; HASWELL-NEXT:    movl {{[0-9]+}}(%esp), %ecx # sched: [5:0.50]
+; HASWELL-NEXT:    #APP
+; HASWELL-NEXT:    fmul %st(0), %st(1) # sched: [5:1.00]
+; HASWELL-NEXT:    fmul %st(2) # sched: [5:1.00]
+; HASWELL-NEXT:    fmuls (%ecx) # sched: [12:1.00]
 ; HASWELL-NEXT:    fmull (%eax) # sched: [12:1.00]
 ; HASWELL-NEXT:    #NO_APP
 ; HASWELL-NEXT:    retl # sched: [7:1.00]
@@ -2910,59 +3522,317 @@ define void @test_frndint() optsize {
 ; SANDY-LABEL: test_frndint:
 ; SANDY:       # %bb.0:
 ; SANDY-NEXT:    #APP
-; SANDY-NEXT:    frndint # sched: [100:0.33]
+; SANDY-NEXT:    frndint # sched: [100:0.33]
+; SANDY-NEXT:    #NO_APP
+; SANDY-NEXT:    retl # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_frndint:
+; HASWELL:       # %bb.0:
+; HASWELL-NEXT:    #APP
+; HASWELL-NEXT:    frndint # sched: [11:?]
+; HASWELL-NEXT:    #NO_APP
+; HASWELL-NEXT:    retl # sched: [7:1.00]
+;
+; BROADWELL-LABEL: test_frndint:
+; BROADWELL:       # %bb.0:
+; BROADWELL-NEXT:    #APP
+; BROADWELL-NEXT:    frndint # sched: [100:0.25]
+; BROADWELL-NEXT:    #NO_APP
+; BROADWELL-NEXT:    retl # sched: [6:0.50]
+;
+; SKYLAKE-LABEL: test_frndint:
+; SKYLAKE:       # %bb.0:
+; SKYLAKE-NEXT:    #APP
+; SKYLAKE-NEXT:    frndint # sched: [100:0.25]
+; SKYLAKE-NEXT:    #NO_APP
+; SKYLAKE-NEXT:    retl # sched: [6:0.50]
+;
+; SKX-LABEL: test_frndint:
+; SKX:       # %bb.0:
+; SKX-NEXT:    #APP
+; SKX-NEXT:    frndint # sched: [100:0.25]
+; SKX-NEXT:    #NO_APP
+; SKX-NEXT:    retl # sched: [6:0.50]
+;
+; BTVER2-LABEL: test_frndint:
+; BTVER2:       # %bb.0:
+; BTVER2-NEXT:    #APP
+; BTVER2-NEXT:    frndint # sched: [100:0.17]
+; BTVER2-NEXT:    #NO_APP
+; BTVER2-NEXT:    retl # sched: [4:1.00]
+;
+; ZNVER1-LABEL: test_frndint:
+; ZNVER1:       # %bb.0:
+; ZNVER1-NEXT:    #APP
+; ZNVER1-NEXT:    frndint # sched: [100:?]
+; ZNVER1-NEXT:    #NO_APP
+; ZNVER1-NEXT:    retl # sched: [1:0.50]
+  tail call void asm sideeffect "frndint", ""() nounwind
+  ret void
+}
+
+define void @test_frstor(i8* %a0) optsize {
+; GENERIC-LABEL: test_frstor:
+; GENERIC:       # %bb.0:
+; GENERIC-NEXT:    movl {{[0-9]+}}(%esp), %eax
+; GENERIC-NEXT:    #APP
+; GENERIC-NEXT:    frstor (%eax)
+; GENERIC-NEXT:    #NO_APP
+; GENERIC-NEXT:    retl
+;
+; ATOM-LABEL: test_frstor:
+; ATOM:       # %bb.0:
+; ATOM-NEXT:    movl {{[0-9]+}}(%esp), %eax # sched: [1:1.00]
+; ATOM-NEXT:    #APP
+; ATOM-NEXT:    frstor (%eax)
+; ATOM-NEXT:    #NO_APP
+; ATOM-NEXT:    retl # sched: [79:39.50]
+;
+; SLM-LABEL: test_frstor:
+; SLM:       # %bb.0:
+; SLM-NEXT:    movl {{[0-9]+}}(%esp), %eax # sched: [3:1.00]
+; SLM-NEXT:    #APP
+; SLM-NEXT:    frstor (%eax) # sched: [100:1.00]
+; SLM-NEXT:    #NO_APP
+; SLM-NEXT:    retl # sched: [4:1.00]
+;
+; SANDY-LABEL: test_frstor:
+; SANDY:       # %bb.0:
+; SANDY-NEXT:    movl {{[0-9]+}}(%esp), %eax # sched: [5:0.50]
+; SANDY-NEXT:    #APP
+; SANDY-NEXT:    frstor (%eax) # sched: [100:0.33]
+; SANDY-NEXT:    #NO_APP
+; SANDY-NEXT:    retl # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_frstor:
+; HASWELL:       # %bb.0:
+; HASWELL-NEXT:    movl {{[0-9]+}}(%esp), %eax # sched: [5:0.50]
+; HASWELL-NEXT:    #APP
+; HASWELL-NEXT:    frstor (%eax) # sched: [1:?]
+; HASWELL-NEXT:    #NO_APP
+; HASWELL-NEXT:    retl # sched: [7:1.00]
+;
+; BROADWELL-LABEL: test_frstor:
+; BROADWELL:       # %bb.0:
+; BROADWELL-NEXT:    movl {{[0-9]+}}(%esp), %eax # sched: [5:0.50]
+; BROADWELL-NEXT:    #APP
+; BROADWELL-NEXT:    frstor (%eax) # sched: [100:0.25]
+; BROADWELL-NEXT:    #NO_APP
+; BROADWELL-NEXT:    retl # sched: [6:0.50]
+;
+; SKYLAKE-LABEL: test_frstor:
+; SKYLAKE:       # %bb.0:
+; SKYLAKE-NEXT:    movl {{[0-9]+}}(%esp), %eax # sched: [5:0.50]
+; SKYLAKE-NEXT:    #APP
+; SKYLAKE-NEXT:    frstor (%eax) # sched: [100:0.25]
+; SKYLAKE-NEXT:    #NO_APP
+; SKYLAKE-NEXT:    retl # sched: [6:0.50]
+;
+; SKX-LABEL: test_frstor:
+; SKX:       # %bb.0:
+; SKX-NEXT:    movl {{[0-9]+}}(%esp), %eax # sched: [5:0.50]
+; SKX-NEXT:    #APP
+; SKX-NEXT:    frstor (%eax) # sched: [100:0.25]
+; SKX-NEXT:    #NO_APP
+; SKX-NEXT:    retl # sched: [6:0.50]
+;
+; BTVER2-LABEL: test_frstor:
+; BTVER2:       # %bb.0:
+; BTVER2-NEXT:    movl {{[0-9]+}}(%esp), %eax # sched: [5:1.00]
+; BTVER2-NEXT:    #APP
+; BTVER2-NEXT:    frstor (%eax) # sched: [100:0.17]
+; BTVER2-NEXT:    #NO_APP
+; BTVER2-NEXT:    retl # sched: [4:1.00]
+;
+; ZNVER1-LABEL: test_frstor:
+; ZNVER1:       # %bb.0:
+; ZNVER1-NEXT:    movl {{[0-9]+}}(%esp), %eax # sched: [8:0.50]
+; ZNVER1-NEXT:    #APP
+; ZNVER1-NEXT:    frstor (%eax) # sched: [100:?]
+; ZNVER1-NEXT:    #NO_APP
+; ZNVER1-NEXT:    retl # sched: [1:0.50]
+  tail call void asm sideeffect "frstor $0", "*m"(i8* %a0) nounwind
+  ret void
+}
+
+define void @test_fsave(i8* %a0) optsize {
+; GENERIC-LABEL: test_fsave:
+; GENERIC:       # %bb.0:
+; GENERIC-NEXT:    movl {{[0-9]+}}(%esp), %eax
+; GENERIC-NEXT:    #APP
+; GENERIC-NEXT:    wait
+; GENERIC-NEXT:    fnsave (%eax)
+; GENERIC-NEXT:    #NO_APP
+; GENERIC-NEXT:    retl
+;
+; ATOM-LABEL: test_fsave:
+; ATOM:       # %bb.0:
+; ATOM-NEXT:    movl {{[0-9]+}}(%esp), %eax # sched: [1:1.00]
+; ATOM-NEXT:    #APP
+; ATOM-NEXT:    wait # sched: [1:0.50]
+; ATOM-NEXT:    fnsave (%eax)
+; ATOM-NEXT:    #NO_APP
+; ATOM-NEXT:    retl # sched: [79:39.50]
+;
+; SLM-LABEL: test_fsave:
+; SLM:       # %bb.0:
+; SLM-NEXT:    movl {{[0-9]+}}(%esp), %eax # sched: [3:1.00]
+; SLM-NEXT:    #APP
+; SLM-NEXT:    wait # sched: [100:1.00]
+; SLM-NEXT:    fnsave (%eax) # sched: [100:1.00]
+; SLM-NEXT:    #NO_APP
+; SLM-NEXT:    retl # sched: [4:1.00]
+;
+; SANDY-LABEL: test_fsave:
+; SANDY:       # %bb.0:
+; SANDY-NEXT:    movl {{[0-9]+}}(%esp), %eax # sched: [5:0.50]
+; SANDY-NEXT:    #APP
+; SANDY-NEXT:    wait # sched: [100:0.33]
+; SANDY-NEXT:    fnsave (%eax) # sched: [100:0.33]
+; SANDY-NEXT:    #NO_APP
+; SANDY-NEXT:    retl # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_fsave:
+; HASWELL:       # %bb.0:
+; HASWELL-NEXT:    movl {{[0-9]+}}(%esp), %eax # sched: [5:0.50]
+; HASWELL-NEXT:    #APP
+; HASWELL-NEXT:    wait # sched: [1:0.50]
+; HASWELL-NEXT:    fnsave (%eax) # sched: [1:?]
+; HASWELL-NEXT:    #NO_APP
+; HASWELL-NEXT:    retl # sched: [7:1.00]
+;
+; BROADWELL-LABEL: test_fsave:
+; BROADWELL:       # %bb.0:
+; BROADWELL-NEXT:    movl {{[0-9]+}}(%esp), %eax # sched: [5:0.50]
+; BROADWELL-NEXT:    #APP
+; BROADWELL-NEXT:    wait # sched: [2:0.50]
+; BROADWELL-NEXT:    fnsave (%eax) # sched: [100:0.25]
+; BROADWELL-NEXT:    #NO_APP
+; BROADWELL-NEXT:    retl # sched: [6:0.50]
+;
+; SKYLAKE-LABEL: test_fsave:
+; SKYLAKE:       # %bb.0:
+; SKYLAKE-NEXT:    movl {{[0-9]+}}(%esp), %eax # sched: [5:0.50]
+; SKYLAKE-NEXT:    #APP
+; SKYLAKE-NEXT:    wait # sched: [2:0.50]
+; SKYLAKE-NEXT:    fnsave (%eax) # sched: [100:0.25]
+; SKYLAKE-NEXT:    #NO_APP
+; SKYLAKE-NEXT:    retl # sched: [6:0.50]
+;
+; SKX-LABEL: test_fsave:
+; SKX:       # %bb.0:
+; SKX-NEXT:    movl {{[0-9]+}}(%esp), %eax # sched: [5:0.50]
+; SKX-NEXT:    #APP
+; SKX-NEXT:    wait # sched: [2:0.50]
+; SKX-NEXT:    fnsave (%eax) # sched: [100:0.25]
+; SKX-NEXT:    #NO_APP
+; SKX-NEXT:    retl # sched: [6:0.50]
+;
+; BTVER2-LABEL: test_fsave:
+; BTVER2:       # %bb.0:
+; BTVER2-NEXT:    movl {{[0-9]+}}(%esp), %eax # sched: [5:1.00]
+; BTVER2-NEXT:    #APP
+; BTVER2-NEXT:    wait # sched: [100:0.17]
+; BTVER2-NEXT:    fnsave (%eax) # sched: [100:0.17]
+; BTVER2-NEXT:    #NO_APP
+; BTVER2-NEXT:    retl # sched: [4:1.00]
+;
+; ZNVER1-LABEL: test_fsave:
+; ZNVER1:       # %bb.0:
+; ZNVER1-NEXT:    movl {{[0-9]+}}(%esp), %eax # sched: [8:0.50]
+; ZNVER1-NEXT:    #APP
+; ZNVER1-NEXT:    wait # sched: [1:1.00]
+; ZNVER1-NEXT:    fnsave (%eax) # sched: [100:?]
+; ZNVER1-NEXT:    #NO_APP
+; ZNVER1-NEXT:    retl # sched: [1:0.50]
+  tail call void asm sideeffect "fsave $0", "*m"(i8* %a0) nounwind
+  ret void
+}
+
+define void @test_fnsave(i8* %a0) optsize {
+; GENERIC-LABEL: test_fnsave:
+; GENERIC:       # %bb.0:
+; GENERIC-NEXT:    movl {{[0-9]+}}(%esp), %eax
+; GENERIC-NEXT:    #APP
+; GENERIC-NEXT:    fnsave (%eax)
+; GENERIC-NEXT:    #NO_APP
+; GENERIC-NEXT:    retl
+;
+; ATOM-LABEL: test_fnsave:
+; ATOM:       # %bb.0:
+; ATOM-NEXT:    movl {{[0-9]+}}(%esp), %eax # sched: [1:1.00]
+; ATOM-NEXT:    #APP
+; ATOM-NEXT:    fnsave (%eax)
+; ATOM-NEXT:    #NO_APP
+; ATOM-NEXT:    retl # sched: [79:39.50]
+;
+; SLM-LABEL: test_fnsave:
+; SLM:       # %bb.0:
+; SLM-NEXT:    movl {{[0-9]+}}(%esp), %eax # sched: [3:1.00]
+; SLM-NEXT:    #APP
+; SLM-NEXT:    fnsave (%eax) # sched: [100:1.00]
+; SLM-NEXT:    #NO_APP
+; SLM-NEXT:    retl # sched: [4:1.00]
+;
+; SANDY-LABEL: test_fnsave:
+; SANDY:       # %bb.0:
+; SANDY-NEXT:    movl {{[0-9]+}}(%esp), %eax # sched: [5:0.50]
+; SANDY-NEXT:    #APP
+; SANDY-NEXT:    fnsave (%eax) # sched: [100:0.33]
 ; SANDY-NEXT:    #NO_APP
 ; SANDY-NEXT:    retl # sched: [5:1.00]
 ;
-; HASWELL-LABEL: test_frndint:
+; HASWELL-LABEL: test_fnsave:
 ; HASWELL:       # %bb.0:
+; HASWELL-NEXT:    movl {{[0-9]+}}(%esp), %eax # sched: [5:0.50]
 ; HASWELL-NEXT:    #APP
-; HASWELL-NEXT:    frndint # sched: [11:?]
+; HASWELL-NEXT:    fnsave (%eax) # sched: [1:?]
 ; HASWELL-NEXT:    #NO_APP
 ; HASWELL-NEXT:    retl # sched: [7:1.00]
 ;
-; BROADWELL-LABEL: test_frndint:
+; BROADWELL-LABEL: test_fnsave:
 ; BROADWELL:       # %bb.0:
+; BROADWELL-NEXT:    movl {{[0-9]+}}(%esp), %eax # sched: [5:0.50]
 ; BROADWELL-NEXT:    #APP
-; BROADWELL-NEXT:    frndint # sched: [100:0.25]
+; BROADWELL-NEXT:    fnsave (%eax) # sched: [100:0.25]
 ; BROADWELL-NEXT:    #NO_APP
 ; BROADWELL-NEXT:    retl # sched: [6:0.50]
 ;
-; SKYLAKE-LABEL: test_frndint:
+; SKYLAKE-LABEL: test_fnsave:
 ; SKYLAKE:       # %bb.0:
+; SKYLAKE-NEXT:    movl {{[0-9]+}}(%esp), %eax # sched: [5:0.50]
 ; SKYLAKE-NEXT:    #APP
-; SKYLAKE-NEXT:    frndint # sched: [100:0.25]
+; SKYLAKE-NEXT:    fnsave (%eax) # sched: [100:0.25]
 ; SKYLAKE-NEXT:    #NO_APP
 ; SKYLAKE-NEXT:    retl # sched: [6:0.50]
 ;
-; SKX-LABEL: test_frndint:
+; SKX-LABEL: test_fnsave:
 ; SKX:       # %bb.0:
+; SKX-NEXT:    movl {{[0-9]+}}(%esp), %eax # sched: [5:0.50]
 ; SKX-NEXT:    #APP
-; SKX-NEXT:    frndint # sched: [100:0.25]
+; SKX-NEXT:    fnsave (%eax) # sched: [100:0.25]
 ; SKX-NEXT:    #NO_APP
 ; SKX-NEXT:    retl # sched: [6:0.50]
 ;
-; BTVER2-LABEL: test_frndint:
+; BTVER2-LABEL: test_fnsave:
 ; BTVER2:       # %bb.0:
+; BTVER2-NEXT:    movl {{[0-9]+}}(%esp), %eax # sched: [5:1.00]
 ; BTVER2-NEXT:    #APP
-; BTVER2-NEXT:    frndint # sched: [100:0.17]
+; BTVER2-NEXT:    fnsave (%eax) # sched: [100:0.17]
 ; BTVER2-NEXT:    #NO_APP
 ; BTVER2-NEXT:    retl # sched: [4:1.00]
 ;
-; ZNVER1-LABEL: test_frndint:
+; ZNVER1-LABEL: test_fnsave:
 ; ZNVER1:       # %bb.0:
+; ZNVER1-NEXT:    movl {{[0-9]+}}(%esp), %eax # sched: [8:0.50]
 ; ZNVER1-NEXT:    #APP
-; ZNVER1-NEXT:    frndint # sched: [100:?]
+; ZNVER1-NEXT:    fnsave (%eax) # sched: [100:?]
 ; ZNVER1-NEXT:    #NO_APP
 ; ZNVER1-NEXT:    retl # sched: [1:0.50]
-  tail call void asm sideeffect "frndint", ""() nounwind
+  tail call void asm sideeffect "fnsave $0", "*m"(i8* %a0) nounwind
   ret void
 }
 
-; TODO - test_frstor
-; TODO - test_fsave
-; TODO - test_fnsave
-
 define void @test_fscale() optsize {
 ; GENERIC-LABEL: test_fscale:
 ; GENERIC:       # %bb.0:
@@ -3259,17 +4129,407 @@ define void @test_fsqrt() optsize {
   ret void
 }
 
-; TODO - test_fst
-; TODO - test_fstp
-
-; TODO - test_fstcw
-; TODO - test_fnstcw
+define void @test_fst_fstp(i16* %a0, i32* %a1, i64 *%a2) optsize {
+; GENERIC-LABEL: test_fst_fstp:
+; GENERIC:       # %bb.0:
+; GENERIC-NEXT:    movl {{[0-9]+}}(%esp), %eax
+; GENERIC-NEXT:    movl {{[0-9]+}}(%esp), %ecx
+; GENERIC-NEXT:    movl {{[0-9]+}}(%esp), %edx
+; GENERIC-NEXT:    #APP
+; GENERIC-NEXT:    fst %st(0)
+; GENERIC-NEXT:    fsts (%edx)
+; GENERIC-NEXT:    fstl (%ecx)
+; GENERIC-NEXT:    fstp %st(0)
+; GENERIC-NEXT:    fstpl (%edx)
+; GENERIC-NEXT:    fstpl (%ecx)
+; GENERIC-NEXT:    fstpt (%eax)
+; GENERIC-NEXT:    #NO_APP
+; GENERIC-NEXT:    retl
+;
+; ATOM-LABEL: test_fst_fstp:
+; ATOM:       # %bb.0:
+; ATOM-NEXT:    movl {{[0-9]+}}(%esp), %eax # sched: [1:1.00]
+; ATOM-NEXT:    movl {{[0-9]+}}(%esp), %ecx # sched: [1:1.00]
+; ATOM-NEXT:    movl {{[0-9]+}}(%esp), %edx # sched: [1:1.00]
+; ATOM-NEXT:    #APP
+; ATOM-NEXT:    fst %st(0) # sched: [2:1.00]
+; ATOM-NEXT:    fsts (%edx) # sched: [2:1.00]
+; ATOM-NEXT:    fstl (%ecx) # sched: [2:1.00]
+; ATOM-NEXT:    fstp %st(0) # sched: [2:1.00]
+; ATOM-NEXT:    fstpl (%edx) # sched: [2:1.00]
+; ATOM-NEXT:    fstpl (%ecx) # sched: [2:1.00]
+; ATOM-NEXT:    fstpt (%eax) # sched: [5:2.50]
+; ATOM-NEXT:    #NO_APP
+; ATOM-NEXT:    retl # sched: [79:39.50]
+;
+; SLM-LABEL: test_fst_fstp:
+; SLM:       # %bb.0:
+; SLM-NEXT:    movl {{[0-9]+}}(%esp), %eax # sched: [3:1.00]
+; SLM-NEXT:    movl {{[0-9]+}}(%esp), %ecx # sched: [3:1.00]
+; SLM-NEXT:    movl {{[0-9]+}}(%esp), %edx # sched: [3:1.00]
+; SLM-NEXT:    #APP
+; SLM-NEXT:    fst %st(0) # sched: [1:0.50]
+; SLM-NEXT:    fsts (%edx) # sched: [1:1.00]
+; SLM-NEXT:    fstl (%ecx) # sched: [1:1.00]
+; SLM-NEXT:    fstp %st(0) # sched: [1:0.50]
+; SLM-NEXT:    fstpl (%edx) # sched: [1:1.00]
+; SLM-NEXT:    fstpl (%ecx) # sched: [1:1.00]
+; SLM-NEXT:    fstpt (%eax) # sched: [1:1.00]
+; SLM-NEXT:    #NO_APP
+; SLM-NEXT:    retl # sched: [4:1.00]
+;
+; SANDY-LABEL: test_fst_fstp:
+; SANDY:       # %bb.0:
+; SANDY-NEXT:    movl {{[0-9]+}}(%esp), %eax # sched: [5:0.50]
+; SANDY-NEXT:    movl {{[0-9]+}}(%esp), %ecx # sched: [5:0.50]
+; SANDY-NEXT:    movl {{[0-9]+}}(%esp), %edx # sched: [5:0.50]
+; SANDY-NEXT:    #APP
+; SANDY-NEXT:    fst %st(0) # sched: [1:1.00]
+; SANDY-NEXT:    fsts (%edx) # sched: [6:1.00]
+; SANDY-NEXT:    fstl (%ecx) # sched: [6:1.00]
+; SANDY-NEXT:    fstp %st(0) # sched: [1:1.00]
+; SANDY-NEXT:    fstpl (%edx) # sched: [6:1.00]
+; SANDY-NEXT:    fstpl (%ecx) # sched: [6:1.00]
+; SANDY-NEXT:    fstpt (%eax) # sched: [6:1.00]
+; SANDY-NEXT:    #NO_APP
+; SANDY-NEXT:    retl # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_fst_fstp:
+; HASWELL:       # %bb.0:
+; HASWELL-NEXT:    movl {{[0-9]+}}(%esp), %eax # sched: [5:0.50]
+; HASWELL-NEXT:    movl {{[0-9]+}}(%esp), %ecx # sched: [5:0.50]
+; HASWELL-NEXT:    movl {{[0-9]+}}(%esp), %edx # sched: [5:0.50]
+; HASWELL-NEXT:    #APP
+; HASWELL-NEXT:    fst %st(0) # sched: [1:0.50]
+; HASWELL-NEXT:    fsts (%edx) # sched: [1:1.00]
+; HASWELL-NEXT:    fstl (%ecx) # sched: [1:1.00]
+; HASWELL-NEXT:    fstp %st(0) # sched: [1:0.50]
+; HASWELL-NEXT:    fstpl (%edx) # sched: [1:1.00]
+; HASWELL-NEXT:    fstpl (%ecx) # sched: [1:1.00]
+; HASWELL-NEXT:    fstpt (%eax) # sched: [1:1.00]
+; HASWELL-NEXT:    #NO_APP
+; HASWELL-NEXT:    retl # sched: [7:1.00]
+;
+; BROADWELL-LABEL: test_fst_fstp:
+; BROADWELL:       # %bb.0:
+; BROADWELL-NEXT:    movl {{[0-9]+}}(%esp), %eax # sched: [5:0.50]
+; BROADWELL-NEXT:    movl {{[0-9]+}}(%esp), %ecx # sched: [5:0.50]
+; BROADWELL-NEXT:    movl {{[0-9]+}}(%esp), %edx # sched: [5:0.50]
+; BROADWELL-NEXT:    #APP
+; BROADWELL-NEXT:    fst %st(0) # sched: [1:0.25]
+; BROADWELL-NEXT:    fsts (%edx) # sched: [1:1.00]
+; BROADWELL-NEXT:    fstl (%ecx) # sched: [1:1.00]
+; BROADWELL-NEXT:    fstp %st(0) # sched: [1:0.25]
+; BROADWELL-NEXT:    fstpl (%edx) # sched: [1:1.00]
+; BROADWELL-NEXT:    fstpl (%ecx) # sched: [1:1.00]
+; BROADWELL-NEXT:    fstpt (%eax) # sched: [1:1.00]
+; BROADWELL-NEXT:    #NO_APP
+; BROADWELL-NEXT:    retl # sched: [6:0.50]
+;
+; SKYLAKE-LABEL: test_fst_fstp:
+; SKYLAKE:       # %bb.0:
+; SKYLAKE-NEXT:    movl {{[0-9]+}}(%esp), %eax # sched: [5:0.50]
+; SKYLAKE-NEXT:    movl {{[0-9]+}}(%esp), %ecx # sched: [5:0.50]
+; SKYLAKE-NEXT:    movl {{[0-9]+}}(%esp), %edx # sched: [5:0.50]
+; SKYLAKE-NEXT:    #APP
+; SKYLAKE-NEXT:    fst %st(0) # sched: [1:0.25]
+; SKYLAKE-NEXT:    fsts (%edx) # sched: [1:1.00]
+; SKYLAKE-NEXT:    fstl (%ecx) # sched: [1:1.00]
+; SKYLAKE-NEXT:    fstp %st(0) # sched: [1:0.25]
+; SKYLAKE-NEXT:    fstpl (%edx) # sched: [1:1.00]
+; SKYLAKE-NEXT:    fstpl (%ecx) # sched: [1:1.00]
+; SKYLAKE-NEXT:    fstpt (%eax) # sched: [1:1.00]
+; SKYLAKE-NEXT:    #NO_APP
+; SKYLAKE-NEXT:    retl # sched: [6:0.50]
+;
+; SKX-LABEL: test_fst_fstp:
+; SKX:       # %bb.0:
+; SKX-NEXT:    movl {{[0-9]+}}(%esp), %eax # sched: [5:0.50]
+; SKX-NEXT:    movl {{[0-9]+}}(%esp), %ecx # sched: [5:0.50]
+; SKX-NEXT:    movl {{[0-9]+}}(%esp), %edx # sched: [5:0.50]
+; SKX-NEXT:    #APP
+; SKX-NEXT:    fst %st(0) # sched: [1:0.25]
+; SKX-NEXT:    fsts (%edx) # sched: [1:1.00]
+; SKX-NEXT:    fstl (%ecx) # sched: [1:1.00]
+; SKX-NEXT:    fstp %st(0) # sched: [1:0.25]
+; SKX-NEXT:    fstpl (%edx) # sched: [1:1.00]
+; SKX-NEXT:    fstpl (%ecx) # sched: [1:1.00]
+; SKX-NEXT:    fstpt (%eax) # sched: [1:1.00]
+; SKX-NEXT:    #NO_APP
+; SKX-NEXT:    retl # sched: [6:0.50]
+;
+; BTVER2-LABEL: test_fst_fstp:
+; BTVER2:       # %bb.0:
+; BTVER2-NEXT:    movl {{[0-9]+}}(%esp), %eax # sched: [5:1.00]
+; BTVER2-NEXT:    movl {{[0-9]+}}(%esp), %ecx # sched: [5:1.00]
+; BTVER2-NEXT:    movl {{[0-9]+}}(%esp), %edx # sched: [5:1.00]
+; BTVER2-NEXT:    #APP
+; BTVER2-NEXT:    fst %st(0) # sched: [1:0.50]
+; BTVER2-NEXT:    fsts (%edx) # sched: [1:1.00]
+; BTVER2-NEXT:    fstl (%ecx) # sched: [1:1.00]
+; BTVER2-NEXT:    fstp %st(0) # sched: [1:0.50]
+; BTVER2-NEXT:    fstpl (%edx) # sched: [1:1.00]
+; BTVER2-NEXT:    fstpl (%ecx) # sched: [1:1.00]
+; BTVER2-NEXT:    fstpt (%eax) # sched: [1:1.00]
+; BTVER2-NEXT:    #NO_APP
+; BTVER2-NEXT:    retl # sched: [4:1.00]
+;
+; ZNVER1-LABEL: test_fst_fstp:
+; ZNVER1:       # %bb.0:
+; ZNVER1-NEXT:    movl {{[0-9]+}}(%esp), %eax # sched: [8:0.50]
+; ZNVER1-NEXT:    movl {{[0-9]+}}(%esp), %ecx # sched: [8:0.50]
+; ZNVER1-NEXT:    movl {{[0-9]+}}(%esp), %edx # sched: [8:0.50]
+; ZNVER1-NEXT:    #APP
+; ZNVER1-NEXT:    fst %st(0) # sched: [5:0.50]
+; ZNVER1-NEXT:    fsts (%edx) # sched: [1:0.50]
+; ZNVER1-NEXT:    fstl (%ecx) # sched: [1:0.50]
+; ZNVER1-NEXT:    fstp %st(0) # sched: [5:0.50]
+; ZNVER1-NEXT:    fstpl (%edx) # sched: [1:0.50]
+; ZNVER1-NEXT:    fstpl (%ecx) # sched: [1:0.50]
+; ZNVER1-NEXT:    fstpt (%eax) # sched: [5:0.50]
+; ZNVER1-NEXT:    #NO_APP
+; ZNVER1-NEXT:    retl # sched: [1:0.50]
+  tail call void asm sideeffect "fst %st(0) \0A\09 fsts $0 \0A\09 fstl $1 \0A\09 fstp %st(0) \0A\09 fstpl $0 \0A\09 fstpl $1 \0A\09 fstpt $2", "*m,*m,*m"(i16* %a0, i32* %a1, i64 *%a2) nounwind
+  ret void
+}
 
-; TODO - test_fstenv
-; TODO - test_fnstenv
+define void @test_fstcw_fstenv_fstsw(i8* %a0) optsize {
+; GENERIC-LABEL: test_fstcw_fstenv_fstsw:
+; GENERIC:       # %bb.0:
+; GENERIC-NEXT:    movl {{[0-9]+}}(%esp), %eax
+; GENERIC-NEXT:    #APP
+; GENERIC-NEXT:    wait
+; GENERIC-NEXT:    fnstcw (%eax)
+; GENERIC-NEXT:    wait
+; GENERIC-NEXT:    fnstenv (%eax)
+; GENERIC-NEXT:    wait
+; GENERIC-NEXT:    fnstsw (%eax)
+; GENERIC-NEXT:    #NO_APP
+; GENERIC-NEXT:    retl
+;
+; ATOM-LABEL: test_fstcw_fstenv_fstsw:
+; ATOM:       # %bb.0:
+; ATOM-NEXT:    movl {{[0-9]+}}(%esp), %eax # sched: [1:1.00]
+; ATOM-NEXT:    #APP
+; ATOM-NEXT:    wait # sched: [1:0.50]
+; ATOM-NEXT:    fnstcw (%eax) # sched: [8:4.00]
+; ATOM-NEXT:    wait # sched: [1:0.50]
+; ATOM-NEXT:    fnstenv (%eax)
+; ATOM-NEXT:    wait # sched: [1:0.50]
+; ATOM-NEXT:    fnstsw (%eax)
+; ATOM-NEXT:    #NO_APP
+; ATOM-NEXT:    retl # sched: [79:39.50]
+;
+; SLM-LABEL: test_fstcw_fstenv_fstsw:
+; SLM:       # %bb.0:
+; SLM-NEXT:    movl {{[0-9]+}}(%esp), %eax # sched: [3:1.00]
+; SLM-NEXT:    #APP
+; SLM-NEXT:    wait # sched: [100:1.00]
+; SLM-NEXT:    fnstcw (%eax) # sched: [1:0.50]
+; SLM-NEXT:    wait # sched: [100:1.00]
+; SLM-NEXT:    fnstenv (%eax) # sched: [100:1.00]
+; SLM-NEXT:    wait # sched: [100:1.00]
+; SLM-NEXT:    fnstsw (%eax) # sched: [100:1.00]
+; SLM-NEXT:    #NO_APP
+; SLM-NEXT:    retl # sched: [4:1.00]
+;
+; SANDY-LABEL: test_fstcw_fstenv_fstsw:
+; SANDY:       # %bb.0:
+; SANDY-NEXT:    movl {{[0-9]+}}(%esp), %eax # sched: [5:0.50]
+; SANDY-NEXT:    #APP
+; SANDY-NEXT:    wait # sched: [100:0.33]
+; SANDY-NEXT:    fnstcw (%eax) # sched: [7:1.00]
+; SANDY-NEXT:    wait # sched: [100:0.33]
+; SANDY-NEXT:    fnstenv (%eax) # sched: [100:0.33]
+; SANDY-NEXT:    wait # sched: [100:0.33]
+; SANDY-NEXT:    fnstsw (%eax) # sched: [7:1.00]
+; SANDY-NEXT:    #NO_APP
+; SANDY-NEXT:    retl # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_fstcw_fstenv_fstsw:
+; HASWELL:       # %bb.0:
+; HASWELL-NEXT:    movl {{[0-9]+}}(%esp), %eax # sched: [5:0.50]
+; HASWELL-NEXT:    #APP
+; HASWELL-NEXT:    wait # sched: [1:0.50]
+; HASWELL-NEXT:    fnstcw (%eax) # sched: [2:1.00]
+; HASWELL-NEXT:    wait # sched: [1:0.50]
+; HASWELL-NEXT:    fnstenv (%eax) # sched: [115:19.50]
+; HASWELL-NEXT:    wait # sched: [1:0.50]
+; HASWELL-NEXT:    fnstsw (%eax) # sched: [4:1.00]
+; HASWELL-NEXT:    #NO_APP
+; HASWELL-NEXT:    retl # sched: [7:1.00]
+;
+; BROADWELL-LABEL: test_fstcw_fstenv_fstsw:
+; BROADWELL:       # %bb.0:
+; BROADWELL-NEXT:    movl {{[0-9]+}}(%esp), %eax # sched: [5:0.50]
+; BROADWELL-NEXT:    #APP
+; BROADWELL-NEXT:    wait # sched: [2:0.50]
+; BROADWELL-NEXT:    fnstcw (%eax) # sched: [2:1.00]
+; BROADWELL-NEXT:    wait # sched: [2:0.50]
+; BROADWELL-NEXT:    fnstenv (%eax) # sched: [115:19.50]
+; BROADWELL-NEXT:    wait # sched: [2:0.50]
+; BROADWELL-NEXT:    fnstsw (%eax) # sched: [4:1.00]
+; BROADWELL-NEXT:    #NO_APP
+; BROADWELL-NEXT:    retl # sched: [6:0.50]
+;
+; SKYLAKE-LABEL: test_fstcw_fstenv_fstsw:
+; SKYLAKE:       # %bb.0:
+; SKYLAKE-NEXT:    movl {{[0-9]+}}(%esp), %eax # sched: [5:0.50]
+; SKYLAKE-NEXT:    #APP
+; SKYLAKE-NEXT:    wait # sched: [2:0.50]
+; SKYLAKE-NEXT:    fnstcw (%eax) # sched: [2:1.00]
+; SKYLAKE-NEXT:    wait # sched: [2:0.50]
+; SKYLAKE-NEXT:    fnstenv (%eax) # sched: [106:19.50]
+; SKYLAKE-NEXT:    wait # sched: [2:0.50]
+; SKYLAKE-NEXT:    fnstsw (%eax) # sched: [3:1.00]
+; SKYLAKE-NEXT:    #NO_APP
+; SKYLAKE-NEXT:    retl # sched: [6:0.50]
+;
+; SKX-LABEL: test_fstcw_fstenv_fstsw:
+; SKX:       # %bb.0:
+; SKX-NEXT:    movl {{[0-9]+}}(%esp), %eax # sched: [5:0.50]
+; SKX-NEXT:    #APP
+; SKX-NEXT:    wait # sched: [2:0.50]
+; SKX-NEXT:    fnstcw (%eax) # sched: [2:1.00]
+; SKX-NEXT:    wait # sched: [2:0.50]
+; SKX-NEXT:    fnstenv (%eax) # sched: [106:19.50]
+; SKX-NEXT:    wait # sched: [2:0.50]
+; SKX-NEXT:    fnstsw (%eax) # sched: [3:1.00]
+; SKX-NEXT:    #NO_APP
+; SKX-NEXT:    retl # sched: [6:0.50]
+;
+; BTVER2-LABEL: test_fstcw_fstenv_fstsw:
+; BTVER2:       # %bb.0:
+; BTVER2-NEXT:    movl {{[0-9]+}}(%esp), %eax # sched: [5:1.00]
+; BTVER2-NEXT:    #APP
+; BTVER2-NEXT:    wait # sched: [100:0.17]
+; BTVER2-NEXT:    fnstcw (%eax) # sched: [1:0.50]
+; BTVER2-NEXT:    wait # sched: [100:0.17]
+; BTVER2-NEXT:    fnstenv (%eax) # sched: [100:0.17]
+; BTVER2-NEXT:    wait # sched: [100:0.17]
+; BTVER2-NEXT:    fnstsw (%eax) # sched: [100:0.17]
+; BTVER2-NEXT:    #NO_APP
+; BTVER2-NEXT:    retl # sched: [4:1.00]
+;
+; ZNVER1-LABEL: test_fstcw_fstenv_fstsw:
+; ZNVER1:       # %bb.0:
+; ZNVER1-NEXT:    movl {{[0-9]+}}(%esp), %eax # sched: [8:0.50]
+; ZNVER1-NEXT:    #APP
+; ZNVER1-NEXT:    wait # sched: [1:1.00]
+; ZNVER1-NEXT:    fnstcw (%eax) # sched: [100:?]
+; ZNVER1-NEXT:    wait # sched: [1:1.00]
+; ZNVER1-NEXT:    fnstenv (%eax) # sched: [100:?]
+; ZNVER1-NEXT:    wait # sched: [1:1.00]
+; ZNVER1-NEXT:    fnstsw (%eax) # sched: [100:?]
+; ZNVER1-NEXT:    #NO_APP
+; ZNVER1-NEXT:    retl # sched: [1:0.50]
+  tail call void asm sideeffect "fstcw $0 \0A\09 fstenv $0 \0A\09 fstsw $0", "*m"(i8* %a0) nounwind
+  ret void
+}
 
-; TODO - test_fstsw
-; TODO - test_fnstsw
+define void @test_fnstcw_fnstenv_fnstsw(i8* %a0) optsize {
+; GENERIC-LABEL: test_fnstcw_fnstenv_fnstsw:
+; GENERIC:       # %bb.0:
+; GENERIC-NEXT:    movl {{[0-9]+}}(%esp), %eax
+; GENERIC-NEXT:    #APP
+; GENERIC-NEXT:    fnstcw (%eax)
+; GENERIC-NEXT:    fnstenv (%eax)
+; GENERIC-NEXT:    fnstsw (%eax)
+; GENERIC-NEXT:    #NO_APP
+; GENERIC-NEXT:    retl
+;
+; ATOM-LABEL: test_fnstcw_fnstenv_fnstsw:
+; ATOM:       # %bb.0:
+; ATOM-NEXT:    movl {{[0-9]+}}(%esp), %eax # sched: [1:1.00]
+; ATOM-NEXT:    #APP
+; ATOM-NEXT:    fnstcw (%eax) # sched: [8:4.00]
+; ATOM-NEXT:    fnstenv (%eax)
+; ATOM-NEXT:    fnstsw (%eax)
+; ATOM-NEXT:    #NO_APP
+; ATOM-NEXT:    retl # sched: [79:39.50]
+;
+; SLM-LABEL: test_fnstcw_fnstenv_fnstsw:
+; SLM:       # %bb.0:
+; SLM-NEXT:    movl {{[0-9]+}}(%esp), %eax # sched: [3:1.00]
+; SLM-NEXT:    #APP
+; SLM-NEXT:    fnstcw (%eax) # sched: [1:0.50]
+; SLM-NEXT:    fnstenv (%eax) # sched: [100:1.00]
+; SLM-NEXT:    fnstsw (%eax) # sched: [100:1.00]
+; SLM-NEXT:    #NO_APP
+; SLM-NEXT:    retl # sched: [4:1.00]
+;
+; SANDY-LABEL: test_fnstcw_fnstenv_fnstsw:
+; SANDY:       # %bb.0:
+; SANDY-NEXT:    movl {{[0-9]+}}(%esp), %eax # sched: [5:0.50]
+; SANDY-NEXT:    #APP
+; SANDY-NEXT:    fnstcw (%eax) # sched: [7:1.00]
+; SANDY-NEXT:    fnstenv (%eax) # sched: [100:0.33]
+; SANDY-NEXT:    fnstsw (%eax) # sched: [7:1.00]
+; SANDY-NEXT:    #NO_APP
+; SANDY-NEXT:    retl # sched: [5:1.00]
+;
+; HASWELL-LABEL: test_fnstcw_fnstenv_fnstsw:
+; HASWELL:       # %bb.0:
+; HASWELL-NEXT:    movl {{[0-9]+}}(%esp), %eax # sched: [5:0.50]
+; HASWELL-NEXT:    #APP
+; HASWELL-NEXT:    fnstcw (%eax) # sched: [2:1.00]
+; HASWELL-NEXT:    fnstenv (%eax) # sched: [115:19.50]
+; HASWELL-NEXT:    fnstsw (%eax) # sched: [4:1.00]
+; HASWELL-NEXT:    #NO_APP
+; HASWELL-NEXT:    retl # sched: [7:1.00]
+;
+; BROADWELL-LABEL: test_fnstcw_fnstenv_fnstsw:
+; BROADWELL:       # %bb.0:
+; BROADWELL-NEXT:    movl {{[0-9]+}}(%esp), %eax # sched: [5:0.50]
+; BROADWELL-NEXT:    #APP
+; BROADWELL-NEXT:    fnstcw (%eax) # sched: [2:1.00]
+; BROADWELL-NEXT:    fnstenv (%eax) # sched: [115:19.50]
+; BROADWELL-NEXT:    fnstsw (%eax) # sched: [4:1.00]
+; BROADWELL-NEXT:    #NO_APP
+; BROADWELL-NEXT:    retl # sched: [6:0.50]
+;
+; SKYLAKE-LABEL: test_fnstcw_fnstenv_fnstsw:
+; SKYLAKE:       # %bb.0:
+; SKYLAKE-NEXT:    movl {{[0-9]+}}(%esp), %eax # sched: [5:0.50]
+; SKYLAKE-NEXT:    #APP
+; SKYLAKE-NEXT:    fnstcw (%eax) # sched: [2:1.00]
+; SKYLAKE-NEXT:    fnstenv (%eax) # sched: [106:19.50]
+; SKYLAKE-NEXT:    fnstsw (%eax) # sched: [3:1.00]
+; SKYLAKE-NEXT:    #NO_APP
+; SKYLAKE-NEXT:    retl # sched: [6:0.50]
+;
+; SKX-LABEL: test_fnstcw_fnstenv_fnstsw:
+; SKX:       # %bb.0:
+; SKX-NEXT:    movl {{[0-9]+}}(%esp), %eax # sched: [5:0.50]
+; SKX-NEXT:    #APP
+; SKX-NEXT:    fnstcw (%eax) # sched: [2:1.00]
+; SKX-NEXT:    fnstenv (%eax) # sched: [106:19.50]
+; SKX-NEXT:    fnstsw (%eax) # sched: [3:1.00]
+; SKX-NEXT:    #NO_APP
+; SKX-NEXT:    retl # sched: [6:0.50]
+;
+; BTVER2-LABEL: test_fnstcw_fnstenv_fnstsw:
+; BTVER2:       # %bb.0:
+; BTVER2-NEXT:    movl {{[0-9]+}}(%esp), %eax # sched: [5:1.00]
+; BTVER2-NEXT:    #APP
+; BTVER2-NEXT:    fnstcw (%eax) # sched: [1:0.50]
+; BTVER2-NEXT:    fnstenv (%eax) # sched: [100:0.17]
+; BTVER2-NEXT:    fnstsw (%eax) # sched: [100:0.17]
+; BTVER2-NEXT:    #NO_APP
+; BTVER2-NEXT:    retl # sched: [4:1.00]
+;
+; ZNVER1-LABEL: test_fnstcw_fnstenv_fnstsw:
+; ZNVER1:       # %bb.0:
+; ZNVER1-NEXT:    movl {{[0-9]+}}(%esp), %eax # sched: [8:0.50]
+; ZNVER1-NEXT:    #APP
+; ZNVER1-NEXT:    fnstcw (%eax) # sched: [100:?]
+; ZNVER1-NEXT:    fnstenv (%eax) # sched: [100:?]
+; ZNVER1-NEXT:    fnstsw (%eax) # sched: [100:?]
+; ZNVER1-NEXT:    #NO_APP
+; ZNVER1-NEXT:    retl # sched: [1:0.50]
+  tail call void asm sideeffect "fnstcw $0 \0A\09 fnstenv $0 \0A\09 fnstsw $0", "*m"(i8* %a0) nounwind
+  ret void
+}
 
 define void @test_fsub(float *%a0, double *%a1) optsize {
 ; GENERIC-LABEL: test_fsub:




More information about the llvm-commits mailing list