<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:DengXian;
        panose-1:2 1 6 0 3 1 1 1 1 1;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:"\@DengXian";
        panose-1:2 1 6 0 3 1 1 1 1 1;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
span.EmailStyle18
        {mso-style-type:personal-reply;
        font-family:"Calibri",sans-serif;
        color:#1F497D;
        font-weight:normal;
        font-style:normal;
        text-decoration:none none;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-family:"Calibri",sans-serif;}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="EN-US" link="blue" vlink="purple" style="word-wrap:break-word">
<div class="WordSection1">
<p class="MsoNormal"><span style="color:#1F497D">Got it, thanks! I just wanted to make a distinction to previous commits.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">Thanks<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">Phoebe<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D"><o:p> </o:p></span></p>
<div style="border:none;border-top:solid #E1E1E1 1.0pt;padding:3.0pt 0in 0in 0in">
<p class="MsoNormal"><b>From:</b> Craig Topper <craig.topper@gmail.com> <br>
<b>Sent:</b> Saturday, June 18, 2022 5:12 AM<br>
<b>To:</b> Wang, Phoebe <phoebe.wang@intel.com>; Phoebe Wang <llvmlistbot@llvm.org><br>
<b>Cc:</b> llvm-commits <llvm-commits@lists.llvm.org><br>
<b>Subject:</b> Re: [llvm] 655ba9c - Reland "Reland "Reland "Reland "[X86][RFC] Enable `_Float16` type support on X86 following the psABI""""<o:p></o:p></p>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<p class="MsoNormal">These commit names are getting a little out of control. Saying Reland 4 times doesn't add any value other than highlighting how many times it has been reverted.<br clear="all">
<o:p></o:p></p>
<div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">~Craig<o:p></o:p></p>
</div>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<div>
<p class="MsoNormal">On Fri, Jun 17, 2022 at 6:34 AM Phoebe Wang via llvm-commits <<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a>> wrote:<o:p></o:p></p>
</div>
<blockquote style="border:none;border-left:solid #CCCCCC 1.0pt;padding:0in 0in 0in 6.0pt;margin-left:4.8pt;margin-right:0in">
<p class="MsoNormal"><br>
Author: Phoebe Wang<br>
Date: 2022-06-17T21:34:05+08:00<br>
New Revision: 655ba9c8a1d22075443711cc749f0b032e07adee<br>
<br>
URL: <a href="https://github.com/llvm/llvm-project/commit/655ba9c8a1d22075443711cc749f0b032e07adee" target="_blank">
https://github.com/llvm/llvm-project/commit/655ba9c8a1d22075443711cc749f0b032e07adee</a><br>
DIFF: <a href="https://github.com/llvm/llvm-project/commit/655ba9c8a1d22075443711cc749f0b032e07adee.diff" target="_blank">
https://github.com/llvm/llvm-project/commit/655ba9c8a1d22075443711cc749f0b032e07adee.diff</a><br>
<br>
LOG: Reland "Reland "Reland "Reland "[X86][RFC] Enable `_Float16` type support on X86 following the psABI""""<br>
<br>
This resolves problems reported in commit 1a20252978c76cf2518aa45b175a9e5d6d36c4f0.<br>
1. Promote to float lowering for nodes XINT_TO_FP<br>
2. Bail out f16 from shuffle combine due to vector type is not legal in the version<br>
<br>
Added: <br>
<br>
<br>
Modified: <br>
    llvm/docs/ReleaseNotes.rst<br>
    llvm/lib/Target/X86/X86FastISel.cpp<br>
    llvm/lib/Target/X86/X86ISelLowering.cpp<br>
    llvm/lib/Target/X86/X86ISelLowering.h<br>
    llvm/lib/Target/X86/X86InstrAVX512.td<br>
    llvm/lib/Target/X86/X86InstrCompiler.td<br>
    llvm/lib/Target/X86/X86InstrInfo.cpp<br>
    llvm/lib/Target/X86/X86InstrSSE.td<br>
    llvm/lib/Target/X86/X86InstrVecCompiler.td<br>
    llvm/lib/Target/X86/X86InstructionSelector.cpp<br>
    llvm/lib/Target/X86/X86RegisterInfo.td<br>
    llvm/test/Analysis/CostModel/X86/fptoi_sat.ll<br>
    llvm/test/CodeGen/MIR/X86/inline-asm-registers.mir<br>
    llvm/test/CodeGen/X86/atomic-non-integer.ll<br>
    llvm/test/CodeGen/X86/avx512-insert-extract.ll<br>
    llvm/test/CodeGen/X86/avx512-masked_memop-16-8.ll<br>
    llvm/test/CodeGen/X86/avx512fp16-fp-logic.ll<br>
    llvm/test/CodeGen/X86/callbr-asm-bb-exports.ll<br>
    llvm/test/CodeGen/X86/cvt16-2.ll<br>
    llvm/test/CodeGen/X86/cvt16.ll<br>
    llvm/test/CodeGen/X86/fastmath-float-half-conversion.ll<br>
    llvm/test/CodeGen/X86/fmf-flags.ll<br>
    llvm/test/CodeGen/X86/fp-round.ll<br>
    llvm/test/CodeGen/X86/fp-roundeven.ll<br>
    llvm/test/CodeGen/X86/fp128-cast-strict.ll<br>
    llvm/test/CodeGen/X86/fpclamptosat.ll<br>
    llvm/test/CodeGen/X86/fpclamptosat_vec.ll<br>
    llvm/test/CodeGen/X86/fptosi-sat-scalar.ll<br>
    llvm/test/CodeGen/X86/fptosi-sat-vector-128.ll<br>
    llvm/test/CodeGen/X86/fptoui-sat-scalar.ll<br>
    llvm/test/CodeGen/X86/fptoui-sat-vector-128.ll<br>
    llvm/test/CodeGen/X86/freeze.ll<br>
    llvm/test/CodeGen/X86/frem.ll<br>
    llvm/test/CodeGen/X86/half-constrained.ll<br>
    llvm/test/CodeGen/X86/half.ll<br>
    llvm/test/CodeGen/X86/pr31088.ll<br>
    llvm/test/CodeGen/X86/pr38533.ll<br>
    llvm/test/CodeGen/X86/pr47000.ll<br>
    llvm/test/CodeGen/X86/scheduler-asm-moves.mir<br>
    llvm/test/CodeGen/X86/shuffle-extract-subvector.ll<br>
    llvm/test/CodeGen/X86/stack-folding-fp-avx512fp16-fma.ll<br>
    llvm/test/CodeGen/X86/stack-folding-fp-avx512fp16.ll<br>
    llvm/test/CodeGen/X86/statepoint-invoke-ra-enter-at-end.mir<br>
    llvm/test/CodeGen/X86/vec_fp_to_int.ll<br>
    llvm/test/CodeGen/X86/vector-half-conversions.ll<br>
    llvm/test/CodeGen/X86/vector-reduce-fmax-nnan.ll<br>
    llvm/test/CodeGen/X86/vector-reduce-fmin-nnan.ll<br>
    llvm/test/MC/X86/x86_64-asm-match.s<br>
    mlir/test/Integration/Dialect/SparseTensor/CPU/dense_output_f16.mlir<br>
    mlir/test/Integration/Dialect/SparseTensor/CPU/sparse_sum_f16.mlir<br>
<br>
Removed: <br>
<br>
<br>
<br>
################################################################################<br>
diff  --git a/llvm/docs/ReleaseNotes.rst b/llvm/docs/ReleaseNotes.rst<br>
index d2813bb869736..392395a17b966 100644<br>
--- a/llvm/docs/ReleaseNotes.rst<br>
+++ b/llvm/docs/ReleaseNotes.rst<br>
@@ -138,7 +138,7 @@ Changes to the WebAssembly Backend<br>
 Changes to the X86 Backend<br>
 --------------------------<br>
<br>
-* ...<br>
+* Support ``half`` type on SSE2 and above targets.<br>
<br>
 Changes to the OCaml bindings<br>
 -----------------------------<br>
<br>
diff  --git a/llvm/lib/Target/X86/X86FastISel.cpp b/llvm/lib/Target/X86/X86FastISel.cpp<br>
index 8698cd9c4eb03..f2c362eeaa485 100644<br>
--- a/llvm/lib/Target/X86/X86FastISel.cpp<br>
+++ b/llvm/lib/Target/X86/X86FastISel.cpp<br>
@@ -148,8 +148,7 @@ class X86FastISel final : public FastISel {<br>
   /// computed in an SSE register, not on the X87 floating point stack.<br>
   bool isScalarFPTypeInSSEReg(EVT VT) const {<br>
     return (VT == MVT::f64 && Subtarget->hasSSE2()) ||<br>
-           (VT == MVT::f32 && Subtarget->hasSSE1()) ||<br>
-           (VT == MVT::f16 && Subtarget->hasFP16());<br>
+           (VT == MVT::f32 && Subtarget->hasSSE1()) || VT == MVT::f16;<br>
   }<br>
<br>
   bool isTypeLegal(Type *Ty, MVT &VT, bool AllowI1 = false);<br>
@@ -2281,12 +2280,13 @@ bool X86FastISel::X86FastEmitPseudoSelect(MVT RetVT, const Instruction *I) {<br>
   default: return false;<br>
   case MVT::i8:  Opc = X86::CMOV_GR8;   break;<br>
   case MVT::i16: Opc = X86::CMOV_GR16;  break;<br>
-  case MVT::f16: Opc = X86::CMOV_FR16X; break;<br>
   case MVT::i32: Opc = X86::CMOV_GR32;  break;<br>
-  case MVT::f32: Opc = Subtarget->hasAVX512() ? X86::CMOV_FR32X<br>
-                                              : X86::CMOV_FR32; break;<br>
-  case MVT::f64: Opc = Subtarget->hasAVX512() ? X86::CMOV_FR64X<br>
-                                              : X86::CMOV_FR64; break;<br>
+  case MVT::f16:<br>
+    Opc = Subtarget->hasAVX512() ? X86::CMOV_FR16X : X86::CMOV_FR16; break;<br>
+  case MVT::f32:<br>
+    Opc = Subtarget->hasAVX512() ? X86::CMOV_FR32X : X86::CMOV_FR32; break;<br>
+  case MVT::f64:<br>
+    Opc = Subtarget->hasAVX512() ? X86::CMOV_FR64X : X86::CMOV_FR64; break;<br>
   }<br>
<br>
   const Value *Cond = I->getOperand(0);<br>
@@ -3903,6 +3903,9 @@ unsigned X86FastISel::fastMaterializeFloatZero(const ConstantFP *CF) {<br>
   unsigned Opc = 0;<br>
   switch (VT.SimpleTy) {<br>
   default: return 0;<br>
+  case MVT::f16:<br>
+    Opc = HasAVX512 ? X86::AVX512_FsFLD0SH : X86::FsFLD0SH;<br>
+    break;<br>
   case MVT::f32:<br>
     Opc = HasAVX512 ? X86::AVX512_FsFLD0SS<br>
           : HasSSE1 ? X86::FsFLD0SS<br>
<br>
diff  --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp<br>
index 406f3f78a9ce8..17f64d3d39b39 100644<br>
--- a/llvm/lib/Target/X86/X86ISelLowering.cpp<br>
+++ b/llvm/lib/Target/X86/X86ISelLowering.cpp<br>
@@ -553,9 +553,13 @@ X86TargetLowering::X86TargetLowering(const X86TargetMachine &TM,<br>
   setOperationAction(ISD::GC_TRANSITION_START, MVT::Other, Custom);<br>
   setOperationAction(ISD::GC_TRANSITION_END, MVT::Other, Custom);<br>
<br>
+  setOperationAction(ISD::STRICT_FP_EXTEND, MVT::f64, Legal);<br>
+<br>
   if (!Subtarget.useSoftFloat() && Subtarget.hasSSE2()) {<br>
-    // f32 and f64 use SSE.<br>
+    // f16, f32 and f64 use SSE.<br>
     // Set up the FP register classes.<br>
+    addRegisterClass(MVT::f16, Subtarget.hasAVX512() ? &X86::FR16XRegClass<br>
+                                                     : &X86::FR16RegClass);<br>
     addRegisterClass(MVT::f32, Subtarget.hasAVX512() ? &X86::FR32XRegClass<br>
                                                      : &X86::FR32RegClass);<br>
     addRegisterClass(MVT::f64, Subtarget.hasAVX512() ? &X86::FR64XRegClass<br>
@@ -587,6 +591,49 @@ X86TargetLowering::X86TargetLowering(const X86TargetMachine &TM,<br>
       setOperationAction(ISD::FSINCOS, VT, Expand);<br>
     }<br>
<br>
+    // Half type will be promoted by default.<br>
+    setOperationAction(ISD::FABS, MVT::f16, Promote);<br>
+    setOperationAction(ISD::FNEG, MVT::f16, Promote);<br>
+    setOperationAction(ISD::FCOPYSIGN, MVT::f16, Promote);<br>
+    setOperationAction(ISD::FADD, MVT::f16, Promote);<br>
+    setOperationAction(ISD::FSUB, MVT::f16, Promote);<br>
+    setOperationAction(ISD::FMUL, MVT::f16, Promote);<br>
+    setOperationAction(ISD::FDIV, MVT::f16, Promote);<br>
+    setOperationAction(ISD::FREM, MVT::f16, Promote);<br>
+    setOperationAction(ISD::FMA, MVT::f16, Promote);<br>
+    setOperationAction(ISD::FMINNUM, MVT::f16, Promote);<br>
+    setOperationAction(ISD::FMAXNUM, MVT::f16, Promote);<br>
+    setOperationAction(ISD::FMINIMUM, MVT::f16, Promote);<br>
+    setOperationAction(ISD::FMAXIMUM, MVT::f16, Promote);<br>
+    setOperationAction(ISD::FSIN, MVT::f16, Promote);<br>
+    setOperationAction(ISD::FCOS, MVT::f16, Promote);<br>
+    setOperationAction(ISD::FSINCOS, MVT::f16, Promote);<br>
+    setOperationAction(ISD::FSQRT, MVT::f16, Promote);<br>
+    setOperationAction(ISD::FPOW, MVT::f16, Promote);<br>
+    setOperationAction(ISD::FLOG, MVT::f16, Promote);<br>
+    setOperationAction(ISD::FLOG2, MVT::f16, Promote);<br>
+    setOperationAction(ISD::FLOG10, MVT::f16, Promote);<br>
+    setOperationAction(ISD::FEXP, MVT::f16, Promote);<br>
+    setOperationAction(ISD::FEXP2, MVT::f16, Promote);<br>
+    setOperationAction(ISD::FCEIL, MVT::f16, Promote);<br>
+    setOperationAction(ISD::FFLOOR, MVT::f16, Promote);<br>
+    setOperationAction(ISD::FNEARBYINT, MVT::f16, Promote);<br>
+    setOperationAction(ISD::FRINT, MVT::f16, Promote);<br>
+    setOperationAction(ISD::BR_CC, MVT::f16, Promote);<br>
+    setOperationAction(ISD::SETCC, MVT::f16, Promote);<br>
+    setOperationAction(ISD::SELECT, MVT::f16, Custom);<br>
+    setOperationAction(ISD::SELECT_CC, MVT::f16, Promote);<br>
+    setOperationAction(ISD::FROUND, MVT::f16, Promote);<br>
+    setOperationAction(ISD::FROUNDEVEN, MVT::f16, Promote);<br>
+    setOperationAction(ISD::FTRUNC, MVT::f16, Promote);<br>
+    setOperationAction(ISD::FP_ROUND, MVT::f16, LibCall);<br>
+    setOperationAction(ISD::FP_EXTEND, MVT::f32, LibCall);<br>
+    setOperationAction(ISD::FP_EXTEND, MVT::f64, Custom);<br>
+    setOperationAction(ISD::STRICT_FP_EXTEND, MVT::f64, Custom);<br>
+<br>
+    setLibcallName(RTLIB::FPROUND_F32_F16, "__truncsfhf2");<br>
+    setLibcallName(RTLIB::FPEXT_F16_F32, "__extendhfsf2");<br>
+<br>
     // Lower this to MOVMSK plus an AND.<br>
     setOperationAction(ISD::FGETSIGN, MVT::i64, Custom);<br>
     setOperationAction(ISD::FGETSIGN, MVT::i32, Custom);<br>
@@ -661,6 +708,10 @@ X86TargetLowering::X86TargetLowering(const X86TargetMachine &TM,<br>
     } else // SSE immediates.<br>
       addLegalFPImmediate(APFloat(+0.0)); // xorpd<br>
   }<br>
+  // Support fp16 0 immediate.<br>
+  if (isTypeLegal(MVT::f16))<br>
+    addLegalFPImmediate(APFloat::getZero(APFloat::IEEEhalf()));<br>
+<br>
   // Handle constrained floating-point operations of scalar.<br>
   setOperationAction(ISD::STRICT_FADD,      MVT::f32, Legal);<br>
   setOperationAction(ISD::STRICT_FADD,      MVT::f64, Legal);<br>
@@ -670,7 +721,6 @@ X86TargetLowering::X86TargetLowering(const X86TargetMachine &TM,<br>
   setOperationAction(ISD::STRICT_FMUL,      MVT::f64, Legal);<br>
   setOperationAction(ISD::STRICT_FDIV,      MVT::f32, Legal);<br>
   setOperationAction(ISD::STRICT_FDIV,      MVT::f64, Legal);<br>
-  setOperationAction(ISD::STRICT_FP_EXTEND, MVT::f64, Legal);<br>
   setOperationAction(ISD::STRICT_FP_ROUND,  MVT::f32, Legal);<br>
   setOperationAction(ISD::STRICT_FP_ROUND,  MVT::f64, Legal);<br>
   setOperationAction(ISD::STRICT_FSQRT,     MVT::f32, Legal);<br>
@@ -722,7 +772,12 @@ X86TargetLowering::X86TargetLowering(const X86TargetMachine &TM,<br>
     setOperationAction(ISD::STRICT_FMUL     , MVT::f80, Legal);<br>
     setOperationAction(ISD::STRICT_FDIV     , MVT::f80, Legal);<br>
     setOperationAction(ISD::STRICT_FSQRT    , MVT::f80, Legal);<br>
-    setOperationAction(ISD::STRICT_FP_EXTEND, MVT::f80, Legal);<br>
+    if (isTypeLegal(MVT::f16)) {<br>
+      setOperationAction(ISD::FP_EXTEND, MVT::f80, Custom);<br>
+      setOperationAction(ISD::STRICT_FP_EXTEND, MVT::f80, Custom);<br>
+    } else {<br>
+      setOperationAction(ISD::STRICT_FP_EXTEND, MVT::f80, Legal);<br>
+    }<br>
     // FIXME: When the target is 64-bit, STRICT_FP_ROUND will be overwritten<br>
     // as Custom.<br>
     setOperationAction(ISD::STRICT_FP_ROUND, MVT::f80, Legal);<br>
@@ -1445,6 +1500,13 @@ X86TargetLowering::X86TargetLowering(const X86TargetMachine &TM,<br>
     }<br>
   }<br>
<br>
+  if (!Subtarget.useSoftFloat() && Subtarget.hasF16C()) {<br>
+    setOperationAction(ISD::FP_ROUND,             MVT::f16,    Custom);<br>
+    setOperationAction(ISD::STRICT_FP_ROUND,      MVT::f16,    Custom);<br>
+    setOperationAction(ISD::FP_EXTEND,            MVT::f32,    Custom);<br>
+    setOperationAction(ISD::STRICT_FP_EXTEND,     MVT::f32,    Custom);<br>
+  }<br>
+<br>
   // This block controls legalization of the mask vector sizes that are<br>
   // available with AVX512. 512-bit vectors are in a separate block controlled<br>
   // by useAVX512Regs.<br>
@@ -1973,10 +2035,6 @@ X86TargetLowering::X86TargetLowering(const X86TargetMachine &TM,<br>
     setOperationAction(ISD::FP_ROUND,             MVT::f16, Custom);<br>
     setOperationAction(ISD::STRICT_FP_ROUND,      MVT::f16, Custom);<br>
     setOperationAction(ISD::STRICT_FP_EXTEND,     MVT::f32, Legal);<br>
-    if (isTypeLegal(MVT::f80)) {<br>
-      setOperationAction(ISD::FP_EXTEND,          MVT::f80, Custom);<br>
-      setOperationAction(ISD::STRICT_FP_EXTEND,   MVT::f80, Custom);<br>
-    }<br>
<br>
     setCondCodeAction(ISD::SETOEQ, MVT::f16, Expand);<br>
     setCondCodeAction(ISD::SETUNE, MVT::f16, Expand);<br>
@@ -2062,9 +2120,6 @@ X86TargetLowering::X86TargetLowering(const X86TargetMachine &TM,<br>
       setOperationAction(ISD::LOAD,  MVT::v4f16, Custom);<br>
       setOperationAction(ISD::STORE, MVT::v4f16, Custom);<br>
     }<br>
-<br>
-    // Support fp16 0 immediate<br>
-    addLegalFPImmediate(APFloat::getZero(APFloat::IEEEhalf()));<br>
   }<br>
<br>
   if (!Subtarget.useSoftFloat() && Subtarget.hasVLX()) {<br>
@@ -3914,7 +3969,7 @@ SDValue X86TargetLowering::LowerFormalArguments(<br>
         else if (Is64Bit && RegVT == MVT::i64)<br>
           RC = &X86::GR64RegClass;<br>
         else if (RegVT == MVT::f16)<br>
-          RC = &X86::FR16XRegClass;<br>
+          RC = Subtarget.hasAVX512() ? &X86::FR16XRegClass : &X86::FR16RegClass;<br>
         else if (RegVT == MVT::f32)<br>
           RC = Subtarget.hasAVX512() ? &X86::FR32XRegClass : &X86::FR32RegClass;<br>
         else if (RegVT == MVT::f64)<br>
@@ -5669,8 +5724,7 @@ bool X86TargetLowering::isCheapToSpeculateCtlz() const {<br>
 }<br>
<br>
 bool X86TargetLowering::hasBitPreservingFPLogic(EVT VT) const {<br>
-  return VT == MVT::f32 || VT == MVT::f64 || VT.isVector() ||<br>
-         (VT == MVT::f16 && Subtarget.hasFP16());<br>
+  return VT == MVT::f32 || VT == MVT::f64 || VT.isVector();<br>
 }<br>
<br>
 bool X86TargetLowering::ShouldShrinkFPConstant(EVT VT) const {<br>
@@ -5682,8 +5736,7 @@ bool X86TargetLowering::ShouldShrinkFPConstant(EVT VT) const {<br>
<br>
 bool X86TargetLowering::isScalarFPTypeInSSEReg(EVT VT) const {<br>
   return (VT == MVT::f64 && Subtarget.hasSSE2()) ||<br>
-         (VT == MVT::f32 && Subtarget.hasSSE1()) ||<br>
-         (VT == MVT::f16 && Subtarget.hasFP16());<br>
+         (VT == MVT::f32 && Subtarget.hasSSE1()) || VT == MVT::f16;<br>
 }<br>
<br>
 bool X86TargetLowering::isLoadBitCastBeneficial(EVT LoadVT, EVT BitcastVT,<br>
@@ -20740,6 +20793,35 @@ static SDValue lowerINT_TO_FP_vXi64(SDValue Op, SelectionDAG &DAG,<br>
   return Cvt;<br>
 }<br>
<br>
+template<typename T><br>
+static bool isSoftFP16(T VT, const X86Subtarget &Subtarget) {<br>
+  return VT == MVT::f16 && !Subtarget.hasFP16();<br>
+}<br>
+<br>
+template<typename T><br>
+bool X86TargetLowering::isSoftFP16(T VT) const {<br>
+  return ::isSoftFP16(VT, Subtarget);<br>
+}<br>
+<br>
+static SDValue promoteXINT_TO_FP(SDValue Op, SelectionDAG &DAG) {<br>
+  bool IsStrict = Op->isStrictFPOpcode();<br>
+  SDValue Src = Op.getOperand(IsStrict ? 1 : 0);<br>
+  SDValue Chain = IsStrict ? Op->getOperand(0) : DAG.getEntryNode();<br>
+  MVT VT = Op.getSimpleValueType();<br>
+  MVT NVT = VT.isVector() ? VT.changeVectorElementType(MVT::f32) : MVT::f32;<br>
+  SDLoc dl(Op);<br>
+<br>
+  SDValue Rnd = DAG.getIntPtrConstant(0, dl);<br>
+  if (IsStrict)<br>
+    return DAG.getNode(<br>
+        ISD::STRICT_FP_ROUND, dl, {VT, MVT::Other},<br>
+        {Chain,<br>
+         DAG.getNode(Op.getOpcode(), dl, {NVT, MVT::Other}, {Chain, Src}),<br>
+         Rnd});<br>
+  return DAG.getNode(ISD::FP_ROUND, dl, VT,<br>
+                     DAG.getNode(Op.getOpcode(), dl, NVT, Src), Rnd);<br>
+}<br>
+<br>
 SDValue X86TargetLowering::LowerSINT_TO_FP(SDValue Op,<br>
                                            SelectionDAG &DAG) const {<br>
   bool IsStrict = Op->isStrictFPOpcode();<br>
@@ -20750,6 +20832,9 @@ SDValue X86TargetLowering::LowerSINT_TO_FP(SDValue Op,<br>
   MVT VT = Op.getSimpleValueType();<br>
   SDLoc dl(Op);<br>
<br>
+  if (isSoftFP16(VT))<br>
+    return promoteXINT_TO_FP(Op, DAG);<br>
+<br>
   if (Subtarget.isTargetWin64() && SrcVT == MVT::i128)<br>
     return LowerWin64_INT128_TO_FP(Op, DAG);<br>
<br>
@@ -21246,9 +21331,13 @@ SDValue X86TargetLowering::LowerUINT_TO_FP(SDValue Op,<br>
   MVT DstVT = Op->getSimpleValueType(0);<br>
   SDValue Chain = IsStrict ? Op.getOperand(0) : DAG.getEntryNode();<br>
<br>
+  // Bail out when we don't have native conversion instructions.<br>
   if (DstVT == MVT::f128)<br>
     return SDValue();<br>
<br>
+  if (isSoftFP16(DstVT))<br>
+    return promoteXINT_TO_FP(Op, DAG);<br>
+<br>
   if (DstVT.isVector())<br>
     return lowerUINT_TO_FP_vec(Op, DAG, Subtarget);<br>
<br>
@@ -22069,6 +22158,16 @@ SDValue X86TargetLowering::LowerFP_TO_INT(SDValue Op, SelectionDAG &DAG) const {<br>
   SDLoc dl(Op);<br>
<br>
   SDValue Res;<br>
+  if (isSoftFP16(SrcVT)) {<br>
+    MVT NVT = VT.isVector() ? VT.changeVectorElementType(MVT::f32) : MVT::f32;<br>
+    if (IsStrict)<br>
+      return DAG.getNode(Op.getOpcode(), dl, {VT, MVT::Other},<br>
+                         {Chain, DAG.getNode(ISD::STRICT_FP_EXTEND, dl,<br>
+                                             {NVT, MVT::Other}, {Chain, Src})});<br>
+    return DAG.getNode(Op.getOpcode(), dl, VT,<br>
+                       DAG.getNode(ISD::FP_EXTEND, dl, NVT, Src));<br>
+  }<br>
+<br>
   if (VT.isVector()) {<br>
     if (VT == MVT::v2i1 && SrcVT == MVT::v2f64) {<br>
       MVT ResVT = MVT::v4i32;<br>
@@ -22406,6 +22505,9 @@ SDValue X86TargetLowering::LowerLRINT_LLRINT(SDValue Op,<br>
   SDValue Src = Op.getOperand(0);<br>
   MVT SrcVT = Src.getSimpleValueType();<br>
<br>
+  if (SrcVT == MVT::f16)<br>
+    return SDValue();<br>
+<br>
   // If the source is in an SSE register, the node is Legal.<br>
   if (isScalarFPTypeInSSEReg(SrcVT))<br>
     return Op;<br>
@@ -22477,7 +22579,7 @@ X86TargetLowering::LowerFP_TO_INT_SAT(SDValue Op, SelectionDAG &DAG) const {<br>
<br>
   // This code is only for floats and doubles. Fall back to generic code for<br>
   // anything else.<br>
-  if (!isScalarFPTypeInSSEReg(SrcVT))<br>
+  if (!isScalarFPTypeInSSEReg(SrcVT) || isSoftFP16(SrcVT))<br>
     return SDValue();<br>
<br>
   EVT SatVT = cast<VTSDNode>(Node->getOperand(1))->getVT();<br>
@@ -22612,28 +22714,54 @@ SDValue X86TargetLowering::LowerFP_EXTEND(SDValue Op, SelectionDAG &DAG) const {<br>
<br>
   SDLoc DL(Op);<br>
   MVT VT = Op.getSimpleValueType();<br>
+  SDValue Chain = IsStrict ? Op.getOperand(0) : SDValue();<br>
   SDValue In = Op.getOperand(IsStrict ? 1 : 0);<br>
   MVT SVT = In.getSimpleValueType();<br>
<br>
-  if (VT == MVT::f128)<br>
+  if (VT == MVT::f128 || (SVT == MVT::f16 && VT == MVT::f80))<br>
     return SDValue();<br>
<br>
-  if (VT == MVT::f80) {<br>
-    if (SVT == MVT::f16) {<br>
-      assert(Subtarget.hasFP16() && "Unexpected features!");<br>
-      RTLIB::Libcall LC = RTLIB::getFPEXT(SVT, VT);<br>
-      MakeLibCallOptions CallOptions;<br>
-      std::pair<SDValue, SDValue> Tmp =<br>
-          makeLibCall(DAG, LC, VT, In, CallOptions, DL,<br>
-                      IsStrict ? Op.getOperand(0) : SDValue());<br>
+  if (SVT == MVT::f16) {<br>
+    if (Subtarget.hasFP16())<br>
+      return Op;<br>
+<br>
+    if (VT != MVT::f32) {<br>
       if (IsStrict)<br>
-        return DAG.getMergeValues({Tmp.first, Tmp.second}, DL);<br>
-      else<br>
-        return Tmp.first;<br>
+        return DAG.getNode(<br>
+            ISD::STRICT_FP_EXTEND, DL, {VT, MVT::Other},<br>
+            {Chain, DAG.getNode(ISD::STRICT_FP_EXTEND, DL,<br>
+                                {MVT::f32, MVT::Other}, {Chain, In})});<br>
+<br>
+      return DAG.getNode(ISD::FP_EXTEND, DL, VT,<br>
+                         DAG.getNode(ISD::FP_EXTEND, DL, MVT::f32, In));<br>
     }<br>
-    return Op;<br>
+<br>
+    if (!Subtarget.hasF16C())<br>
+      return SDValue();<br>
+<br>
+    In = DAG.getBitcast(MVT::i16, In);<br>
+    In = DAG.getNode(ISD::INSERT_VECTOR_ELT, DL, MVT::v8i16,<br>
+                     getZeroVector(MVT::v8i16, Subtarget, DAG, DL), In,<br>
+                     DAG.getIntPtrConstant(0, DL));<br>
+    SDValue Res;<br>
+    if (IsStrict) {<br>
+      Res = DAG.getNode(X86ISD::STRICT_CVTPH2PS, DL, {MVT::v4f32, MVT::Other},<br>
+                        {Chain, In});<br>
+      Chain = Res.getValue(1);<br>
+    } else {<br>
+      Res = DAG.getNode(X86ISD::CVTPH2PS, DL, MVT::v4f32, In,<br>
+                        DAG.getTargetConstant(4, DL, MVT::i32));<br>
+    }<br>
+    Res = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, DL, MVT::f32, Res,<br>
+                      DAG.getIntPtrConstant(0, DL));<br>
+    if (IsStrict)<br>
+      return DAG.getMergeValues({Res, Chain}, DL);<br>
+    return Res;<br>
   }<br>
<br>
+  if (!SVT.isVector())<br>
+    return Op;<br>
+<br>
   if (SVT.getVectorElementType() == MVT::f16) {<br>
     assert(Subtarget.hasFP16() && Subtarget.hasVLX() && "Unexpected features!");<br>
     if (SVT == MVT::v2f16)<br>
@@ -22659,15 +22787,65 @@ SDValue X86TargetLowering::LowerFP_EXTEND(SDValue Op, SelectionDAG &DAG) const {<br>
<br>
 SDValue X86TargetLowering::LowerFP_ROUND(SDValue Op, SelectionDAG &DAG) const {<br>
   bool IsStrict = Op->isStrictFPOpcode();<br>
+<br>
+  SDLoc DL(Op);<br>
+  SDValue Chain = IsStrict ? Op.getOperand(0) : SDValue();<br>
   SDValue In = Op.getOperand(IsStrict ? 1 : 0);<br>
+  SDValue Op2 = Op.getOperand(IsStrict ? 2 : 1);<br>
   MVT VT = Op.getSimpleValueType();<br>
   MVT SVT = In.getSimpleValueType();<br>
<br>
-  // It's legal except when f128 is involved or we're converting f80->f16.<br>
-  if (SVT != MVT::f128 && !(VT == MVT::f16 && SVT == MVT::f80))<br>
-    return Op;<br>
+  if (SVT == MVT::f128 || (VT == MVT::f16 && SVT == MVT::f80))<br>
+    return SDValue();<br>
<br>
-  return SDValue();<br>
+  if (VT == MVT::f16) {<br>
+    if (Subtarget.hasFP16())<br>
+      return Op;<br>
+<br>
+    if (SVT != MVT::f32) {<br>
+      if (IsStrict)<br>
+        return DAG.getNode(<br>
+            ISD::STRICT_FP_ROUND, DL, {VT, MVT::Other},<br>
+            {Chain,<br>
+             DAG.getNode(ISD::STRICT_FP_ROUND, DL, {MVT::f32, MVT::Other},<br>
+                         {Chain, In, Op2}),<br>
+             Op2});<br>
+<br>
+      return DAG.getNode(ISD::FP_ROUND, DL, VT,<br>
+                         DAG.getNode(ISD::FP_ROUND, DL, MVT::f32, In, Op2),<br>
+                         Op2);<br>
+    }<br>
+<br>
+    if (!Subtarget.hasF16C())<br>
+      return SDValue();<br>
+<br>
+    SDValue Res;<br>
+    SDValue Rnd = DAG.getTargetConstant(X86::STATIC_ROUNDING::CUR_DIRECTION, DL,<br>
+                                        MVT::i32);<br>
+    if (IsStrict) {<br>
+      Res = DAG.getNode(ISD::INSERT_VECTOR_ELT, DL, MVT::v4f32,<br>
+                        DAG.getConstantFP(0, DL, MVT::v4f32), In,<br>
+                        DAG.getIntPtrConstant(0, DL));<br>
+      Res = DAG.getNode(X86ISD::STRICT_CVTPS2PH, DL, {MVT::v8i16, MVT::Other},<br>
+                        {Chain, Res, Rnd});<br>
+      Chain = Res.getValue(1);<br>
+    } else {<br>
+      // FIXME: Should we use zeros for upper elements for non-strict?<br>
+      Res = DAG.getNode(ISD::SCALAR_TO_VECTOR, DL, MVT::v4f32, In);<br>
+      Res = DAG.getNode(X86ISD::CVTPS2PH, DL, MVT::v8i16, Res, Rnd);<br>
+    }<br>
+<br>
+    Res = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, DL, MVT::i16, Res,<br>
+                      DAG.getIntPtrConstant(0, DL));<br>
+    Res = DAG.getBitcast(MVT::f16, Res);<br>
+<br>
+    if (IsStrict)<br>
+      return DAG.getMergeValues({Res, Chain}, DL);<br>
+<br>
+    return Res;<br>
+  }<br>
+<br>
+  return Op;<br>
 }<br>
<br>
 static SDValue LowerFP16_TO_FP(SDValue Op, SelectionDAG &DAG) {<br>
@@ -24690,6 +24868,11 @@ SDValue X86TargetLowering::LowerSELECT(SDValue Op, SelectionDAG &DAG) const {<br>
   MVT VT = Op1.getSimpleValueType();<br>
   SDValue CC;<br>
<br>
+  if (isSoftFP16(VT))<br>
+    return DAG.getBitcast(MVT::f16, DAG.getNode(ISD::SELECT, DL, MVT::i16, Cond,<br>
+                                                DAG.getBitcast(MVT::i16, Op1),<br>
+                                                DAG.getBitcast(MVT::i16, Op2)));<br>
+<br>
   // Lower FP selects into a CMP/AND/ANDN/OR sequence when the necessary SSE ops<br>
   // are available or VBLENDV if AVX is available.<br>
   // Otherwise FP cmovs get lowered into a less efficient branch sequence later.<br>
@@ -24754,7 +24937,8 @@ SDValue X86TargetLowering::LowerSELECT(SDValue Op, SelectionDAG &DAG) const {<br>
     return DAG.getNode(X86ISD::SELECTS, DL, VT, Cmp, Op1, Op2);<br>
   }<br>
<br>
-  if (Cond.getOpcode() == ISD::SETCC) {<br>
+  if (Cond.getOpcode() == ISD::SETCC &&<br>
+      !isSoftFP16(Cond.getOperand(0).getSimpleValueType())) {<br>
     if (SDValue NewCond = LowerSETCC(Cond, DAG)) {<br>
       Cond = NewCond;<br>
       // If the condition was updated, it's possible that the operands of the<br>
@@ -25429,8 +25613,10 @@ SDValue X86TargetLowering::LowerBRCOND(SDValue Op, SelectionDAG &DAG) const {<br>
   SDValue Dest  = Op.getOperand(2);<br>
   SDLoc dl(Op);<br>
<br>
+  // Bail out when we don't have native compare instructions.<br>
   if (Cond.getOpcode() == ISD::SETCC &&<br>
-      Cond.getOperand(0).getValueType() != MVT::f128) {<br>
+      Cond.getOperand(0).getValueType() != MVT::f128 &&<br>
+      !isSoftFP16(Cond.getOperand(0).getValueType())) {<br>
     SDValue LHS = Cond.getOperand(0);<br>
     SDValue RHS = Cond.getOperand(1);<br>
     ISD::CondCode CC = cast<CondCodeSDNode>(Cond.getOperand(2))->get();<br>
@@ -34152,6 +34338,7 @@ static bool checkAndUpdateEFLAGSKill(MachineBasicBlock::iterator SelectItr,<br>
 // conditional jump around it.<br>
 static bool isCMOVPseudo(MachineInstr &MI) {<br>
   switch (MI.getOpcode()) {<br>
+  case X86::CMOV_FR16:<br>
   case X86::CMOV_FR16X:<br>
   case X86::CMOV_FR32:<br>
   case X86::CMOV_FR32X:<br>
@@ -35827,6 +36014,8 @@ X86TargetLowering::EmitInstrWithCustomInserter(MachineInstr &MI,<br>
   case X86::TLSCall_32:<br>
   case X86::TLSCall_64:<br>
     return EmitLoweredTLSCall(MI, BB);<br>
+  case X86::CMOV_FR16:<br>
+  case X86::CMOV_FR16X:<br>
   case X86::CMOV_FR32:<br>
   case X86::CMOV_FR32X:<br>
   case X86::CMOV_FR64:<br>
@@ -39360,6 +39549,11 @@ static SDValue combineTargetShuffle(SDValue N, SelectionDAG &DAG,<br>
   SmallVector<int, 4> Mask;<br>
   unsigned Opcode = N.getOpcode();<br>
<br>
+  // FIXME: Remove this after we support vector FP16<br>
+  if (isSoftFP16(peekThroughBitcasts(N.getOperand(0)).getSimpleValueType(),<br>
+                 Subtarget))<br>
+    return SDValue();<br>
+<br>
   if (SDValue R = combineCommutableSHUFP(N, VT, DL, DAG))<br>
     return R;<br>
<br>
@@ -44101,7 +44295,7 @@ static SDValue combineSelect(SDNode *N, SelectionDAG &DAG,<br>
   // ignored in unsafe-math mode).<br>
   // We also try to create v2f32 min/max nodes, which we later widen to v4f32.<br>
   if (Cond.getOpcode() == ISD::SETCC && VT.isFloatingPoint() &&<br>
-      VT != MVT::f80 && VT != MVT::f128 &&<br>
+      VT != MVT::f80 && VT != MVT::f128 && !isSoftFP16(VT, Subtarget) &&<br>
       (TLI.isTypeLegal(VT) || VT == MVT::v2f32) &&<br>
       (Subtarget.hasSSE2() ||<br>
        (Subtarget.hasSSE1() && VT.getScalarType() == MVT::f32))) {<br>
<br>
diff  --git a/llvm/lib/Target/X86/X86ISelLowering.h b/llvm/lib/Target/X86/X86ISelLowering.h<br>
index cd0e4a348f48b..7f2f2a4c76aef 100644<br>
--- a/llvm/lib/Target/X86/X86ISelLowering.h<br>
+++ b/llvm/lib/Target/X86/X86ISelLowering.h<br>
@@ -1640,6 +1640,8 @@ namespace llvm {<br>
<br>
     bool needsCmpXchgNb(Type *MemType) const;<br>
<br>
+    template<typename T> bool isSoftFP16(T VT) const;<br>
+<br>
     void SetupEntryBlockForSjLj(MachineInstr &MI, MachineBasicBlock *MBB,<br>
                                 MachineBasicBlock *DispatchBB, int FI) const;<br>
<br>
<br>
diff  --git a/llvm/lib/Target/X86/X86InstrAVX512.td b/llvm/lib/Target/X86/X86InstrAVX512.td<br>
index 918d11008d20c..48da7b3ac8827 100644<br>
--- a/llvm/lib/Target/X86/X86InstrAVX512.td<br>
+++ b/llvm/lib/Target/X86/X86InstrAVX512.td<br>
@@ -476,6 +476,7 @@ let Predicates = [HasAVX512] in {<br>
 def : Pat<(v64i8 immAllZerosV), (AVX512_512_SET0)>;<br>
 def : Pat<(v32i16 immAllZerosV), (AVX512_512_SET0)>;<br>
 def : Pat<(v8i64 immAllZerosV), (AVX512_512_SET0)>;<br>
+def : Pat<(v32f16 immAllZerosV), (AVX512_512_SET0)>;<br>
 def : Pat<(v16f32 immAllZerosV), (AVX512_512_SET0)>;<br>
 def : Pat<(v8f64 immAllZerosV), (AVX512_512_SET0)>;<br>
 }<br>
@@ -508,25 +509,23 @@ let Predicates = [HasAVX512] in {<br>
 def : Pat<(v8i16 immAllZerosV), (AVX512_128_SET0)>;<br>
 def : Pat<(v16i8 immAllZerosV), (AVX512_128_SET0)>;<br>
 def : Pat<(v2i64 immAllZerosV), (AVX512_128_SET0)>;<br>
+def : Pat<(v8f16 immAllZerosV), (AVX512_128_SET0)>;<br>
 def : Pat<(v4f32 immAllZerosV), (AVX512_128_SET0)>;<br>
 def : Pat<(v2f64 immAllZerosV), (AVX512_128_SET0)>;<br>
 def : Pat<(v32i8 immAllZerosV), (AVX512_256_SET0)>;<br>
 def : Pat<(v16i16 immAllZerosV), (AVX512_256_SET0)>;<br>
 def : Pat<(v4i64 immAllZerosV), (AVX512_256_SET0)>;<br>
+def : Pat<(v16f16 immAllZerosV), (AVX512_256_SET0)>;<br>
 def : Pat<(v8f32 immAllZerosV), (AVX512_256_SET0)>;<br>
 def : Pat<(v4f64 immAllZerosV), (AVX512_256_SET0)>;<br>
 }<br>
<br>
-let Predicates = [HasFP16] in {<br>
-def : Pat<(v8f16 immAllZerosV), (AVX512_128_SET0)>;<br>
-def : Pat<(v16f16 immAllZerosV), (AVX512_256_SET0)>;<br>
-def : Pat<(v32f16 immAllZerosV), (AVX512_512_SET0)>;<br>
-}<br>
-<br>
 // Alias instructions that map fld0 to xorps for sse or vxorps for avx.<br>
 // This is expanded by ExpandPostRAPseudos.<br>
 let isReMaterializable = 1, isAsCheapAsAMove = 1, canFoldAsLoad = 1,<br>
     isPseudo = 1, SchedRW = [WriteZero], Predicates = [HasAVX512] in {<br>
+  def AVX512_FsFLD0SH : I<0, Pseudo, (outs FR16X:$dst), (ins), "",<br>
+                          [(set FR16X:$dst, fp16imm0)]>;<br>
   def AVX512_FsFLD0SS : I<0, Pseudo, (outs FR32X:$dst), (ins), "",<br>
                           [(set FR32X:$dst, fp32imm0)]>;<br>
   def AVX512_FsFLD0SD : I<0, Pseudo, (outs FR64X:$dst), (ins), "",<br>
@@ -535,12 +534,6 @@ let isReMaterializable = 1, isAsCheapAsAMove = 1, canFoldAsLoad = 1,<br>
                             [(set VR128X:$dst, fp128imm0)]>;<br>
 }<br>
<br>
-let isReMaterializable = 1, isAsCheapAsAMove = 1, canFoldAsLoad = 1,<br>
-    isPseudo = 1, SchedRW = [WriteZero], Predicates = [HasFP16] in {<br>
-  def AVX512_FsFLD0SH : I<0, Pseudo, (outs FR16X:$dst), (ins), "",<br>
-                          [(set FR16X:$dst, fp16imm0)]>;<br>
-}<br>
-<br>
 //===----------------------------------------------------------------------===//<br>
 // AVX-512 - VECTOR INSERT<br>
 //<br>
@@ -678,21 +671,21 @@ defm : vinsert_for_size_lowering<"VINSERTI32x4Z256", v8i16x_info, v16i16x_info,<br>
 defm : vinsert_for_size_lowering<"VINSERTI32x4Z256", v16i8x_info, v32i8x_info,<br>
               vinsert128_insert, INSERT_get_vinsert128_imm, [HasVLX]>;<br>
 defm : vinsert_for_size_lowering<"VINSERTF32x4Z256", v8f16x_info, v16f16x_info,<br>
-              vinsert128_insert, INSERT_get_vinsert128_imm, [HasFP16, HasVLX]>;<br>
+              vinsert128_insert, INSERT_get_vinsert128_imm, [HasVLX]>;<br>
 // Codegen pattern with the alternative types insert VEC128 into VEC512<br>
 defm : vinsert_for_size_lowering<"VINSERTI32x4Z", v8i16x_info, v32i16_info,<br>
               vinsert128_insert, INSERT_get_vinsert128_imm, [HasAVX512]>;<br>
 defm : vinsert_for_size_lowering<"VINSERTI32x4Z", v16i8x_info, v64i8_info,<br>
                vinsert128_insert, INSERT_get_vinsert128_imm, [HasAVX512]>;<br>
 defm : vinsert_for_size_lowering<"VINSERTF32x4Z", v8f16x_info, v32f16_info,<br>
-              vinsert128_insert, INSERT_get_vinsert128_imm, [HasFP16]>;<br>
+              vinsert128_insert, INSERT_get_vinsert128_imm, [HasAVX512]>;<br>
 // Codegen pattern with the alternative types insert VEC256 into VEC512<br>
 defm : vinsert_for_size_lowering<"VINSERTI64x4Z", v16i16x_info, v32i16_info,<br>
               vinsert256_insert, INSERT_get_vinsert256_imm, [HasAVX512]>;<br>
 defm : vinsert_for_size_lowering<"VINSERTI64x4Z", v32i8x_info, v64i8_info,<br>
               vinsert256_insert, INSERT_get_vinsert256_imm, [HasAVX512]>;<br>
 defm : vinsert_for_size_lowering<"VINSERTF64x4Z", v16f16x_info, v32f16_info,<br>
-              vinsert256_insert, INSERT_get_vinsert256_imm, [HasFP16]>;<br>
+              vinsert256_insert, INSERT_get_vinsert256_imm, [HasAVX512]>;<br>
<br>
<br>
 multiclass vinsert_for_mask_cast<string InstrStr, X86VectorVTInfo From,<br>
@@ -979,7 +972,7 @@ defm : vextract_for_size_lowering<"VEXTRACTI32x4Z256", v16i16x_info, v8i16x_info<br>
 defm : vextract_for_size_lowering<"VEXTRACTI32x4Z256", v32i8x_info, v16i8x_info,<br>
           vextract128_extract, EXTRACT_get_vextract128_imm, [HasVLX]>;<br>
 defm : vextract_for_size_lowering<"VEXTRACTF32x4Z256", v16f16x_info, v8f16x_info,<br>
-          vextract128_extract, EXTRACT_get_vextract128_imm, [HasFP16, HasVLX]>;<br>
+          vextract128_extract, EXTRACT_get_vextract128_imm, [HasVLX]>;<br>
<br>
 // Codegen pattern with the alternative types extract VEC128 from VEC512<br>
 defm : vextract_for_size_lowering<"VEXTRACTI32x4Z", v32i16_info, v8i16x_info,<br>
@@ -987,14 +980,14 @@ defm : vextract_for_size_lowering<"VEXTRACTI32x4Z", v32i16_info, v8i16x_info,<br>
 defm : vextract_for_size_lowering<"VEXTRACTI32x4Z", v64i8_info, v16i8x_info,<br>
                  vextract128_extract, EXTRACT_get_vextract128_imm, [HasAVX512]>;<br>
 defm : vextract_for_size_lowering<"VEXTRACTF32x4Z", v32f16_info, v8f16x_info,<br>
-                 vextract128_extract, EXTRACT_get_vextract128_imm, [HasFP16]>;<br>
+                 vextract128_extract, EXTRACT_get_vextract128_imm, [HasAVX512]>;<br>
 // Codegen pattern with the alternative types extract VEC256 from VEC512<br>
 defm : vextract_for_size_lowering<"VEXTRACTI64x4Z", v32i16_info, v16i16x_info,<br>
                  vextract256_extract, EXTRACT_get_vextract256_imm, [HasAVX512]>;<br>
 defm : vextract_for_size_lowering<"VEXTRACTI64x4Z", v64i8_info, v32i8x_info,<br>
                  vextract256_extract, EXTRACT_get_vextract256_imm, [HasAVX512]>;<br>
 defm : vextract_for_size_lowering<"VEXTRACTF64x4Z", v32f16_info, v16f16x_info,<br>
-                 vextract256_extract, EXTRACT_get_vextract256_imm, [HasFP16]>;<br>
+                 vextract256_extract, EXTRACT_get_vextract256_imm, [HasAVX512]>;<br>
<br>
<br>
 // A 128-bit extract from bits [255:128] of a 512-bit vector should use a<br>
@@ -1020,6 +1013,10 @@ def : Pat<(v8i16 (extract_subvector (v32i16 VR512:$src), (iPTR 8))),<br>
           (v8i16 (VEXTRACTI128rr<br>
                   (v16i16 (EXTRACT_SUBREG (v32i16 VR512:$src), sub_ymm)),<br>
                   (iPTR 1)))>;<br>
+def : Pat<(v8f16 (extract_subvector (v32f16 VR512:$src), (iPTR 8))),<br>
+          (v8f16 (VEXTRACTF128rr<br>
+                  (v16f16 (EXTRACT_SUBREG (v32f16 VR512:$src), sub_ymm)),<br>
+                  (iPTR 1)))>;<br>
 def : Pat<(v16i8 (extract_subvector (v64i8 VR512:$src), (iPTR 16))),<br>
           (v16i8 (VEXTRACTI128rr<br>
                   (v32i8 (EXTRACT_SUBREG (v64i8 VR512:$src), sub_ymm)),<br>
@@ -1049,18 +1046,16 @@ def : Pat<(v8i16 (extract_subvector (v32i16 VR512:$src), (iPTR 8))),<br>
           (v8i16 (VEXTRACTI32x4Z256rr<br>
                   (v16i16 (EXTRACT_SUBREG (v32i16 VR512:$src), sub_ymm)),<br>
                   (iPTR 1)))>;<br>
+def : Pat<(v8f16 (extract_subvector (v32f16 VR512:$src), (iPTR 8))),<br>
+          (v8f16 (VEXTRACTF32x4Z256rr<br>
+                  (v16f16 (EXTRACT_SUBREG (v32f16 VR512:$src), sub_ymm)),<br>
+                  (iPTR 1)))>;<br>
 def : Pat<(v16i8 (extract_subvector (v64i8 VR512:$src), (iPTR 16))),<br>
           (v16i8 (VEXTRACTI32x4Z256rr<br>
                   (v32i8 (EXTRACT_SUBREG (v64i8 VR512:$src), sub_ymm)),<br>
                   (iPTR 1)))>;<br>
 }<br>
<br>
-let Predicates = [HasFP16, HasVLX] in<br>
-def : Pat<(v8f16 (extract_subvector (v32f16 VR512:$src), (iPTR 8))),<br>
-          (v8f16 (VEXTRACTF32x4Z256rr<br>
-                  (v16f16 (EXTRACT_SUBREG (v32f16 VR512:$src), sub_ymm)),<br>
-                  (iPTR 1)))>;<br>
-<br>
<br>
 // Additional patterns for handling a bitcast between the vselect and the<br>
 // extract_subvector.<br>
@@ -1478,7 +1473,7 @@ multiclass avx512_subvec_broadcast_rm_dq<bits<8> opc, string OpcodeStr,<br>
                            Sched<[SchedWriteShuffle.YMM.Folded]>,<br>
                            AVX5128IBase, EVEX;<br>
 }<br>
-let Predicates = [HasFP16] in {<br>
+let Predicates = [HasBWI] in {<br>
   def : Pat<(v32f16 (X86VBroadcastld16 addr:$src)),<br>
             (VPBROADCASTWZrm addr:$src)>;<br>
<br>
@@ -1487,7 +1482,7 @@ let Predicates = [HasFP16] in {<br>
   def : Pat<(v32f16 (X86VBroadcast (f16 FR16X:$src))),<br>
             (VPBROADCASTWZrr (COPY_TO_REGCLASS FR16X:$src, VR128X))>;<br>
 }<br>
-let Predicates = [HasVLX, HasFP16] in {<br>
+let Predicates = [HasVLX, HasBWI] in {<br>
   def : Pat<(v8f16 (X86VBroadcastld16 addr:$src)),<br>
             (VPBROADCASTWZ128rm addr:$src)>;<br>
   def : Pat<(v16f16 (X86VBroadcastld16 addr:$src)),<br>
@@ -3763,6 +3758,9 @@ let Predicates = [HasBWI, NoVLX] in {<br>
<br>
   defm : mask_move_lowering<"VMOVDQU16Z", v8i16x_info, v32i16_info>;<br>
   defm : mask_move_lowering<"VMOVDQU16Z", v16i16x_info, v32i16_info>;<br>
+<br>
+  defm : mask_move_lowering<"VMOVDQU16Z", v8f16x_info, v32f16_info>;<br>
+  defm : mask_move_lowering<"VMOVDQU16Z", v16f16x_info, v32f16_info>;<br>
 }<br>
<br>
 let Predicates = [HasAVX512] in {<br>
@@ -3852,7 +3850,7 @@ let Predicates = [HasVLX] in {<br>
   def : Pat<(store (v32i8 VR256X:$src), addr:$dst),<br>
             (VMOVDQU64Z256mr addr:$dst, VR256X:$src)>;<br>
 }<br>
-let Predicates = [HasFP16] in {<br>
+let Predicates = [HasBWI] in {<br>
   def : Pat<(v32f16 (vselect VK32WM:$mask, (v32f16 VR512:$src1), (v32f16 VR512:$src0))),<br>
             (VMOVDQU16Zrrk VR512:$src0, VK32WM:$mask, VR512:$src1)>;<br>
   def : Pat<(v32f16 (vselect VK32WM:$mask, (v32f16 VR512:$src1), v32f16_info.ImmAllZerosV)),<br>
@@ -3887,7 +3885,7 @@ let Predicates = [HasFP16] in {<br>
   def : Pat<(masked_store (v32f16 VR512:$src), addr:$dst, VK32WM:$mask),<br>
             (VMOVDQU16Zmrk addr:$dst, VK32WM:$mask, VR512:$src)>;<br>
 }<br>
-let Predicates = [HasFP16, HasVLX] in {<br>
+let Predicates = [HasBWI, HasVLX] in {<br>
   def : Pat<(v16f16 (vselect VK16WM:$mask, (v16f16 VR256X:$src1), (v16f16 VR256X:$src0))),<br>
             (VMOVDQU16Z256rrk VR256X:$src0, VK16WM:$mask, VR256X:$src1)>;<br>
   def : Pat<(v16f16 (vselect VK16WM:$mask, (v16f16 VR256X:$src1), v16f16x_info.ImmAllZerosV)),<br>
@@ -4099,14 +4097,14 @@ def : Pat<(f64 (bitconvert VK64:$src)),<br>
 //===----------------------------------------------------------------------===//<br>
<br>
 multiclass avx512_move_scalar<string asm, SDNode OpNode, PatFrag vzload_frag,<br>
-                              X86VectorVTInfo _,<br>
-                              list<Predicate> prd = [HasAVX512, OptForSize]> {<br>
-  let Predicates = prd in<br>
+                              X86VectorVTInfo _, Predicate prd = HasAVX512> {<br>
+  let Predicates = !if (!eq (prd, HasFP16), [HasFP16], [prd, OptForSize]) in<br>
   def rr : AVX512PI<0x10, MRMSrcReg, (outs _.RC:$dst),<br>
              (ins _.RC:$src1, _.RC:$src2),<br>
              !strconcat(asm, "\t{$src2, $src1, $dst|$dst, $src1, $src2}"),<br>
              [(set _.RC:$dst, (_.VT (OpNode _.RC:$src1, _.RC:$src2)))],<br>
              _.ExeDomain>, EVEX_4V, Sched<[SchedWriteFShuffle.XMM]>;<br>
+  let Predicates = [prd] in {<br>
   def rrkz : AVX512PI<0x10, MRMSrcReg, (outs _.RC:$dst),<br>
               (ins _.KRCWM:$mask, _.RC:$src1, _.RC:$src2),<br>
               !strconcat(asm, "\t{$src2, $src1, $dst {${mask}} {z}|",<br>
@@ -4159,6 +4157,7 @@ multiclass avx512_move_scalar<string asm, SDNode OpNode, PatFrag vzload_frag,<br>
               !strconcat(asm, "\t{$src, $dst {${mask}}|$dst {${mask}}, $src}"),<br>
               [], _.ExeDomain>, EVEX, EVEX_K, Sched<[WriteFStore]>,<br>
               NotMemoryFoldable;<br>
+  }<br>
 }<br>
<br>
 defm VMOVSSZ : avx512_move_scalar<"vmovss", X86Movss, X86vzload32, f32x_info>,<br>
@@ -4168,7 +4167,7 @@ defm VMOVSDZ : avx512_move_scalar<"vmovsd", X86Movsd, X86vzload64, f64x_info>,<br>
                                   VEX_LIG, XD, VEX_W, EVEX_CD8<64, CD8VT1>;<br>
<br>
 defm VMOVSHZ : avx512_move_scalar<"vmovsh", X86Movsh, X86vzload16, f16x_info,<br>
-                                  [HasFP16]>,<br>
+                                  HasFP16>,<br>
                                   VEX_LIG, T_MAP5XS, EVEX_CD8<16, CD8VT1>;<br>
<br>
 multiclass avx512_move_scalar_lowering<string InstrStr, SDNode OpNode,<br>
@@ -4338,14 +4337,9 @@ def : Pat<(_.info128.VT (masked_load addr:$srcAddr, Mask128,<br>
                       addr:$srcAddr)>;<br>
 }<br>
<br>
-defm : avx512_move_scalar_lowering<"VMOVSHZ", X86Movsh, fp16imm0, v8f16x_info>;<br>
 defm : avx512_move_scalar_lowering<"VMOVSSZ", X86Movss, fp32imm0, v4f32x_info>;<br>
 defm : avx512_move_scalar_lowering<"VMOVSDZ", X86Movsd, fp64imm0, v2f64x_info>;<br>
<br>
-defm : avx512_store_scalar_lowering<"VMOVSHZ", avx512vl_f16_info,<br>
-                   (v32i1 (bitconvert (and GR32:$mask, (i32 1)))), GR32>;<br>
-defm : avx512_store_scalar_lowering_subreg<"VMOVSHZ", avx512vl_f16_info,<br>
-                   (v32i1 (bitconvert (and GR32:$mask, (i32 1)))), GR32, sub_32bit>;<br>
 defm : avx512_store_scalar_lowering<"VMOVSSZ", avx512vl_f32_info,<br>
                    (v16i1 (bitconvert (i16 (trunc (and GR32:$mask, (i32 1)))))), GR32>;<br>
 defm : avx512_store_scalar_lowering_subreg<"VMOVSSZ", avx512vl_f32_info,<br>
@@ -4353,6 +4347,12 @@ defm : avx512_store_scalar_lowering_subreg<"VMOVSSZ", avx512vl_f32_info,<br>
 defm : avx512_store_scalar_lowering_subreg<"VMOVSDZ", avx512vl_f64_info,<br>
                    (v8i1 (bitconvert (i8 (and GR8:$mask, (i8 1))))), GR8, sub_8bit>;<br>
<br>
+let Predicates = [HasFP16] in {<br>
+defm : avx512_move_scalar_lowering<"VMOVSHZ", X86Movsh, fp16imm0, v8f16x_info>;<br>
+defm : avx512_store_scalar_lowering<"VMOVSHZ", avx512vl_f16_info,<br>
+                   (v32i1 (bitconvert (and GR32:$mask, (i32 1)))), GR32>;<br>
+defm : avx512_store_scalar_lowering_subreg<"VMOVSHZ", avx512vl_f16_info,<br>
+                   (v32i1 (bitconvert (and GR32:$mask, (i32 1)))), GR32, sub_32bit>;<br>
 defm : avx512_store_scalar_lowering_subreg2<"VMOVSHZ", avx512vl_f16_info,<br>
                    (v32i1 (insert_subvector<br>
                            (v32i1 immAllZerosV),<br>
@@ -4360,6 +4360,30 @@ defm : avx512_store_scalar_lowering_subreg2<"VMOVSHZ", avx512vl_f16_info,<br>
                            (iPTR 0))),<br>
                    (v8i1 (bitconvert (and GR8:$mask, (i8 1)))),<br>
                    GR8, sub_8bit>;<br>
+<br>
+defm : avx512_load_scalar_lowering<"VMOVSHZ", avx512vl_f16_info,<br>
+                   (v32i1 (bitconvert (and GR32:$mask, (i32 1)))), GR32>;<br>
+defm : avx512_load_scalar_lowering_subreg<"VMOVSHZ", avx512vl_f16_info,<br>
+                   (v32i1 (bitconvert (and GR32:$mask, (i32 1)))), GR32, sub_32bit>;<br>
+defm : avx512_load_scalar_lowering_subreg2<"VMOVSHZ", avx512vl_f16_info,<br>
+                   (v32i1 (insert_subvector<br>
+                           (v32i1 immAllZerosV),<br>
+                           (v8i1 (bitconvert (and GR8:$mask, (i8 1)))),<br>
+                           (iPTR 0))),<br>
+                   (v8i1 (bitconvert (and GR8:$mask, (i8 1)))),<br>
+                   GR8, sub_8bit>;<br>
+<br>
+def : Pat<(f16 (X86selects VK1WM:$mask, (f16 FR16X:$src1), (f16 FR16X:$src2))),<br>
+          (COPY_TO_REGCLASS (v8f16 (VMOVSHZrrk<br>
+           (v8f16 (COPY_TO_REGCLASS FR16X:$src2, VR128X)),<br>
+           VK1WM:$mask, (v8f16 (IMPLICIT_DEF)),<br>
+           (v8f16 (COPY_TO_REGCLASS FR16X:$src1, VR128X)))), FR16X)>;<br>
+<br>
+def : Pat<(f16 (X86selects VK1WM:$mask, (f16 FR16X:$src1), fp16imm0)),<br>
+          (COPY_TO_REGCLASS (v8f16 (VMOVSHZrrkz VK1WM:$mask, (v8f16 (IMPLICIT_DEF)),<br>
+           (v8f16 (COPY_TO_REGCLASS FR16X:$src1, VR128X)))), FR16X)>;<br>
+}<br>
+<br>
 defm : avx512_store_scalar_lowering_subreg2<"VMOVSSZ", avx512vl_f32_info,<br>
                    (v16i1 (insert_subvector<br>
                            (v16i1 immAllZerosV),<br>
@@ -4385,10 +4409,6 @@ defm : avx512_store_scalar_lowering_subreg2<"VMOVSDZ", avx512vl_f64_info,<br>
                           (v8i1 (bitconvert (i8 (and GR8:$mask, (i8 1))))),<br>
                           (iPTR 0))), GR8, sub_8bit>;<br>
<br>
-defm : avx512_load_scalar_lowering<"VMOVSHZ", avx512vl_f16_info,<br>
-                   (v32i1 (bitconvert (and GR32:$mask, (i32 1)))), GR32>;<br>
-defm : avx512_load_scalar_lowering_subreg<"VMOVSHZ", avx512vl_f16_info,<br>
-                   (v32i1 (bitconvert (and GR32:$mask, (i32 1)))), GR32, sub_32bit>;<br>
 defm : avx512_load_scalar_lowering<"VMOVSSZ", avx512vl_f32_info,<br>
                    (v16i1 (bitconvert (i16 (trunc (and GR32:$mask, (i32 1)))))), GR32>;<br>
 defm : avx512_load_scalar_lowering_subreg<"VMOVSSZ", avx512vl_f32_info,<br>
@@ -4396,13 +4416,6 @@ defm : avx512_load_scalar_lowering_subreg<"VMOVSSZ", avx512vl_f32_info,<br>
 defm : avx512_load_scalar_lowering_subreg<"VMOVSDZ", avx512vl_f64_info,<br>
                    (v8i1 (bitconvert (i8 (and GR8:$mask, (i8 1))))), GR8, sub_8bit>;<br>
<br>
-defm : avx512_load_scalar_lowering_subreg2<"VMOVSHZ", avx512vl_f16_info,<br>
-                   (v32i1 (insert_subvector<br>
-                           (v32i1 immAllZerosV),<br>
-                           (v8i1 (bitconvert (and GR8:$mask, (i8 1)))),<br>
-                           (iPTR 0))),<br>
-                   (v8i1 (bitconvert (and GR8:$mask, (i8 1)))),<br>
-                   GR8, sub_8bit>;<br>
 defm : avx512_load_scalar_lowering_subreg2<"VMOVSSZ", avx512vl_f32_info,<br>
                    (v16i1 (insert_subvector<br>
                            (v16i1 immAllZerosV),<br>
@@ -4428,16 +4441,6 @@ defm : avx512_load_scalar_lowering_subreg2<"VMOVSDZ", avx512vl_f64_info,<br>
                           (v8i1 (bitconvert (i8 (and GR8:$mask, (i8 1))))),<br>
                           (iPTR 0))), GR8, sub_8bit>;<br>
<br>
-def : Pat<(f16 (X86selects VK1WM:$mask, (f16 FR16X:$src1), (f16 FR16X:$src2))),<br>
-          (COPY_TO_REGCLASS (v8f16 (VMOVSHZrrk<br>
-           (v8f16 (COPY_TO_REGCLASS FR16X:$src2, VR128X)),<br>
-           VK1WM:$mask, (v8f16 (IMPLICIT_DEF)),<br>
-           (v8f16 (COPY_TO_REGCLASS FR16X:$src1, VR128X)))), FR16X)>;<br>
-<br>
-def : Pat<(f16 (X86selects VK1WM:$mask, (f16 FR16X:$src1), fp16imm0)),<br>
-          (COPY_TO_REGCLASS (v8f16 (VMOVSHZrrkz VK1WM:$mask, (v8f16 (IMPLICIT_DEF)),<br>
-           (v8f16 (COPY_TO_REGCLASS FR16X:$src1, VR128X)))), FR16X)>;<br>
-<br>
 def : Pat<(f32 (X86selects VK1WM:$mask, (f32 FR32X:$src1), (f32 FR32X:$src2))),<br>
           (COPY_TO_REGCLASS (v4f32 (VMOVSSZrrk<br>
            (v4f32 (COPY_TO_REGCLASS FR32X:$src2, VR128X)),<br>
@@ -11651,6 +11654,14 @@ defm VPINSRWZ : avx512_insert_elt_bw<0xC4, "vpinsrw", X86pinsrw, v8i16x_info,<br>
 defm VPINSRDZ : avx512_insert_elt_dq<0x22, "vpinsrd", v4i32x_info, GR32>;<br>
 defm VPINSRQZ : avx512_insert_elt_dq<0x22, "vpinsrq", v2i64x_info, GR64>, VEX_W;<br>
<br>
+// Always select FP16 instructions if available.<br>
+let Predicates = [HasBWI], AddedComplexity = -10 in {<br>
+  def : Pat<(f16 (load addr:$src)), (COPY_TO_REGCLASS (VPINSRWZrm (v8i16 (IMPLICIT_DEF)), addr:$src, 0), FR16X)>;<br>
+  def : Pat<(store f16:$src, addr:$dst), (VPEXTRWZmr addr:$dst, (v8i16 (COPY_TO_REGCLASS FR16:$src, VR128)), 0)>;<br>
+  def : Pat<(i16 (bitconvert f16:$src)), (EXTRACT_SUBREG (VPEXTRWZrr (v8i16 (COPY_TO_REGCLASS FR16X:$src, VR128X)), 0), sub_16bit)>;<br>
+  def : Pat<(f16 (bitconvert i16:$src)), (COPY_TO_REGCLASS (VPINSRWZrr (v8i16 (IMPLICIT_DEF)), (INSERT_SUBREG (IMPLICIT_DEF), GR16:$src, sub_16bit), 0), FR16X)>;<br>
+}<br>
+<br>
 //===----------------------------------------------------------------------===//<br>
 // VSHUFPS - VSHUFPD Operations<br>
 //===----------------------------------------------------------------------===//<br>
@@ -12988,7 +12999,6 @@ def : Pat<(i16 (bitconvert FR16X:$src)),<br>
                 sub_16bit))>;<br>
 def : Pat<(i16 (extractelt (v8i16 VR128X:$src), (iPTR 0))),<br>
           (i16 (EXTRACT_SUBREG (VMOVSH2Wrr VR128X:$src), sub_16bit))>;<br>
-}<br>
<br>
 // Allow "vmovw" to use GR64<br>
 let hasSideEffects = 0 in {<br>
@@ -12997,6 +13007,7 @@ let hasSideEffects = 0 in {<br>
   def VMOVSHtoW64rr : AVX512<0x7E, MRMDestReg, (outs GR64:$dst), (ins VR128X:$src),<br>
                      "vmovw\t{$src, $dst|$dst, $src}", []>, T_MAP5PD, EVEX, VEX_W, Sched<[WriteVecMoveToGpr]>;<br>
 }<br>
+}<br>
<br>
 // Convert 16-bit float to i16/u16<br>
 multiclass avx512_cvtph2w<bits<8> opc, string OpcodeStr, SDPatternOperator OpNode,<br>
<br>
diff  --git a/llvm/lib/Target/X86/X86InstrCompiler.td b/llvm/lib/Target/X86/X86InstrCompiler.td<br>
index 39f27312c8ce0..a55b95960aa6e 100644<br>
--- a/llvm/lib/Target/X86/X86InstrCompiler.td<br>
+++ b/llvm/lib/Target/X86/X86InstrCompiler.td<br>
@@ -562,12 +562,14 @@ let usesCustomInserter = 1, hasNoSchedulingInfo = 1, Uses = [EFLAGS] in {<br>
   let Predicates = [HasMMX] in<br>
     defm _VR64   : CMOVrr_PSEUDO<VR64, x86mmx>;<br>
<br>
-  defm _FR16X    : CMOVrr_PSEUDO<FR16X, f16>;<br>
   let Predicates = [HasSSE1,NoAVX512] in<br>
     defm _FR32   : CMOVrr_PSEUDO<FR32, f32>;<br>
-  let Predicates = [HasSSE2,NoAVX512] in<br>
+  let Predicates = [HasSSE2,NoAVX512] in {<br>
+    defm _FR16   : CMOVrr_PSEUDO<FR16, f16>;<br>
     defm _FR64   : CMOVrr_PSEUDO<FR64, f64>;<br>
+  }<br>
   let Predicates = [HasAVX512] in {<br>
+    defm _FR16X  : CMOVrr_PSEUDO<FR16X, f16>;<br>
     defm _FR32X  : CMOVrr_PSEUDO<FR32X, f32>;<br>
     defm _FR64X  : CMOVrr_PSEUDO<FR64X, f64>;<br>
   }<br>
<br>
diff  --git a/llvm/lib/Target/X86/X86InstrInfo.cpp b/llvm/lib/Target/X86/X86InstrInfo.cpp<br>
index e0674f9d42f8c..f2101ea4c0522 100644<br>
--- a/llvm/lib/Target/X86/X86InstrInfo.cpp<br>
+++ b/llvm/lib/Target/X86/X86InstrInfo.cpp<br>
@@ -765,6 +765,7 @@ bool X86InstrInfo::isReallyTriviallyReMaterializable(const MachineInstr &MI,<br>
   case X86::AVX_SET0:<br>
   case X86::FsFLD0SD:<br>
   case X86::FsFLD0SS:<br>
+  case X86::FsFLD0SH:<br>
   case X86::FsFLD0F128:<br>
   case X86::KSET0D:<br>
   case X86::KSET0Q:<br>
@@ -3583,10 +3584,6 @@ static unsigned getLoadStoreRegOpcode(Register Reg,<br>
   case 2:<br>
     if (X86::VK16RegClass.hasSubClassEq(RC))<br>
       return load ? X86::KMOVWkm : X86::KMOVWmk;<br>
-    if (X86::FR16XRegClass.hasSubClassEq(RC)) {<br>
-      assert(STI.hasFP16());<br>
-      return load ? X86::VMOVSHZrm_alt : X86::VMOVSHZmr;<br>
-    }<br>
     assert(X86::GR16RegClass.hasSubClassEq(RC) && "Unknown 2-byte regclass");<br>
     return load ? X86::MOV16rm : X86::MOV16mr;<br>
   case 4:<br>
@@ -3614,6 +3611,10 @@ static unsigned getLoadStoreRegOpcode(Register Reg,<br>
         X86::VK8PAIRRegClass.hasSubClassEq(RC) ||<br>
         X86::VK16PAIRRegClass.hasSubClassEq(RC))<br>
       return load ? X86::MASKPAIR16LOAD : X86::MASKPAIR16STORE;<br>
+    if ((X86::FR16RegClass.hasSubClassEq(RC) ||<br>
+         X86::FR16XRegClass.hasSubClassEq(RC)) &&<br>
+        STI.hasFP16())<br>
+      return load ? X86::VMOVSHZrm_alt : X86::VMOVSHZmr;<br>
     llvm_unreachable("Unknown 4-byte regclass");<br>
   case 8:<br>
     if (X86::GR64RegClass.hasSubClassEq(RC))<br>
@@ -3853,12 +3854,12 @@ void X86InstrInfo::storeRegToStackSlot(MachineBasicBlock &MBB,<br>
                                        const TargetRegisterInfo *TRI) const {<br>
   const MachineFunction &MF = *MBB.getParent();<br>
   const MachineFrameInfo &MFI = MF.getFrameInfo();<br>
+  MachineRegisterInfo &RegInfo = MBB.getParent()->getRegInfo();<br>
   assert(MFI.getObjectSize(FrameIdx) >= TRI->getSpillSize(*RC) &&<br>
          "Stack slot too small for store");<br>
   if (RC->getID() == X86::TILERegClassID) {<br>
     unsigned Opc = X86::TILESTORED;<br>
     // tilestored %tmm, (%sp, %idx)<br>
-    MachineRegisterInfo &RegInfo = MBB.getParent()->getRegInfo();<br>
     Register VirtReg = RegInfo.createVirtualRegister(&X86::GR64_NOSPRegClass);<br>
     BuildMI(MBB, MI, DebugLoc(), get(X86::MOV64ri), VirtReg).addImm(64);<br>
     MachineInstr *NewMI =<br>
@@ -3867,6 +3868,14 @@ void X86InstrInfo::storeRegToStackSlot(MachineBasicBlock &MBB,<br>
     MachineOperand &MO = NewMI->getOperand(2);<br>
     MO.setReg(VirtReg);<br>
     MO.setIsKill(true);<br>
+  } else if ((RC->getID() == X86::FR16RegClassID ||<br>
+              RC->getID() == X86::FR16XRegClassID) &&<br>
+             !Subtarget.hasFP16()) {<br>
+    unsigned Opc = Subtarget.hasAVX512() ? X86::VMOVSSZmr<br>
+                   : Subtarget.hasAVX()  ? X86::VMOVSSmr<br>
+                                         : X86::MOVSSmr;<br>
+    addFrameReference(BuildMI(MBB, MI, DebugLoc(), get(Opc)), FrameIdx)<br>
+        .addReg(SrcReg, getKillRegState(isKill));<br>
   } else {<br>
     unsigned Alignment = std::max<uint32_t>(TRI->getSpillSize(*RC), 16);<br>
     bool isAligned =<br>
@@ -3895,6 +3904,14 @@ void X86InstrInfo::loadRegFromStackSlot(MachineBasicBlock &MBB,<br>
     MachineOperand &MO = NewMI->getOperand(3);<br>
     MO.setReg(VirtReg);<br>
     MO.setIsKill(true);<br>
+  } else if ((RC->getID() == X86::FR16RegClassID ||<br>
+              RC->getID() == X86::FR16XRegClassID) &&<br>
+             !Subtarget.hasFP16()) {<br>
+    unsigned Opc = Subtarget.hasAVX512() ? X86::VMOVSSZrm<br>
+                   : Subtarget.hasAVX()  ? X86::VMOVSSrm<br>
+                                         : X86::MOVSSrm;<br>
+    addFrameReference(BuildMI(MBB, MI, DebugLoc(), get(Opc), DestReg),<br>
+                      FrameIdx);<br>
   } else {<br>
     const MachineFunction &MF = *MBB.getParent();<br>
     const MachineFrameInfo &MFI = MF.getFrameInfo();<br>
@@ -4870,6 +4887,7 @@ bool X86InstrInfo::expandPostRAPseudo(MachineInstr &MI) const {<br>
   case X86::V_SET0:<br>
   case X86::FsFLD0SS:<br>
   case X86::FsFLD0SD:<br>
+  case X86::FsFLD0SH:<br>
   case X86::FsFLD0F128:<br>
     return Expand2AddrUndef(MIB, get(HasAVX ? X86::VXORPSrr : X86::XORPSrr));<br>
   case X86::AVX_SET0: {<br>
@@ -6605,6 +6623,7 @@ MachineInstr *X86InstrInfo::foldMemoryOperandImpl(<br>
     case X86::AVX512_FsFLD0SS:<br>
       Alignment = Align(4);<br>
       break;<br>
+    case X86::FsFLD0SH:<br>
     case X86::AVX512_FsFLD0SH:<br>
       Alignment = Align(2);<br>
       break;<br>
@@ -6643,6 +6662,7 @@ MachineInstr *X86InstrInfo::foldMemoryOperandImpl(<br>
   case X86::AVX512_256_SET0:<br>
   case X86::AVX512_512_SET0:<br>
   case X86::AVX512_512_SETALLONES:<br>
+  case X86::FsFLD0SH:<br>
   case X86::AVX512_FsFLD0SH:<br>
   case X86::FsFLD0SD:<br>
   case X86::AVX512_FsFLD0SD:<br>
@@ -6682,7 +6702,7 @@ MachineInstr *X86InstrInfo::foldMemoryOperandImpl(<br>
       Ty = Type::getDoubleTy(MF.getFunction().getContext());<br>
     else if (Opc == X86::FsFLD0F128 || Opc == X86::AVX512_FsFLD0F128)<br>
       Ty = Type::getFP128Ty(MF.getFunction().getContext());<br>
-    else if (Opc == X86::AVX512_FsFLD0SH)<br>
+    else if (Opc == X86::FsFLD0SH || Opc == X86::AVX512_FsFLD0SH)<br>
       Ty = Type::getHalfTy(MF.getFunction().getContext());<br>
     else if (Opc == X86::AVX512_512_SET0 || Opc == X86::AVX512_512_SETALLONES)<br>
       Ty = FixedVectorType::get(Type::getInt32Ty(MF.getFunction().getContext()),<br>
<br>
diff  --git a/llvm/lib/Target/X86/X86InstrSSE.td b/llvm/lib/Target/X86/X86InstrSSE.td<br>
index 69181c44bc488..06cb280e860a7 100644<br>
--- a/llvm/lib/Target/X86/X86InstrSSE.td<br>
+++ b/llvm/lib/Target/X86/X86InstrSSE.td<br>
@@ -112,6 +112,8 @@ multiclass sse12_fp_packed_logical_rm<bits<8> opc, RegisterClass RC, Domain d,<br>
 // This is expanded by ExpandPostRAPseudos.<br>
 let isReMaterializable = 1, isAsCheapAsAMove = 1, canFoldAsLoad = 1,<br>
     isPseudo = 1, SchedRW = [WriteZero] in {<br>
+  def FsFLD0SH : I<0, Pseudo, (outs FR16:$dst), (ins), "",<br>
+                   [(set FR16:$dst, fp16imm0)]>, Requires<[HasSSE2, NoAVX512]>;<br>
   def FsFLD0SS : I<0, Pseudo, (outs FR32:$dst), (ins), "",<br>
                    [(set FR32:$dst, fp32imm0)]>, Requires<[HasSSE1, NoAVX512]>;<br>
   def FsFLD0SD : I<0, Pseudo, (outs FR64:$dst), (ins), "",<br>
@@ -3965,6 +3967,20 @@ defm PINSRW : sse2_pinsrw, PD;<br>
<br>
 } // ExeDomain = SSEPackedInt<br>
<br>
+// Always select FP16 instructions if available.<br>
+let Predicates = [UseSSE2], AddedComplexity = -10 in {<br>
+  def : Pat<(f16 (load addr:$src)), (COPY_TO_REGCLASS (PINSRWrm (v8i16 (IMPLICIT_DEF)), addr:$src, 0), FR16)>;<br>
+  def : Pat<(store f16:$src, addr:$dst), (MOV16mr addr:$dst, (EXTRACT_SUBREG (PEXTRWrr (v8i16 (COPY_TO_REGCLASS FR16:$src, VR128)), 0), sub_16bit))>;<br>
+  def : Pat<(i16 (bitconvert f16:$src)), (EXTRACT_SUBREG (PEXTRWrr (v8i16 (COPY_TO_REGCLASS FR16:$src, VR128)), 0), sub_16bit)>;<br>
+  def : Pat<(f16 (bitconvert i16:$src)), (COPY_TO_REGCLASS (PINSRWrr (v8i16 (IMPLICIT_DEF)), (INSERT_SUBREG (IMPLICIT_DEF), GR16:$src, sub_16bit), 0), FR16)>;<br>
+}<br>
+<br>
+let Predicates = [HasAVX, NoBWI] in {<br>
+  def : Pat<(f16 (load addr:$src)), (COPY_TO_REGCLASS (VPINSRWrm (v8i16 (IMPLICIT_DEF)), addr:$src, 0), FR16)>;<br>
+  def : Pat<(i16 (bitconvert f16:$src)), (EXTRACT_SUBREG (VPEXTRWrr (v8i16 (COPY_TO_REGCLASS FR16:$src, VR128)), 0), sub_16bit)>;<br>
+  def : Pat<(f16 (bitconvert i16:$src)), (COPY_TO_REGCLASS (VPINSRWrr (v8i16 (IMPLICIT_DEF)), (INSERT_SUBREG (IMPLICIT_DEF), GR16:$src, sub_16bit), 0), FR16)>;<br>
+}<br>
+<br>
 //===---------------------------------------------------------------------===//<br>
 // SSE2 - Packed Mask Creation<br>
 //===---------------------------------------------------------------------===//<br>
@@ -5193,6 +5209,12 @@ let Predicates = [HasAVX, NoBWI] in<br>
<br>
 defm PEXTRW      : SS41I_extract16<0x15, "pextrw">;<br>
<br>
+let Predicates = [UseSSE41] in<br>
+  def : Pat<(store f16:$src, addr:$dst), (PEXTRWmr addr:$dst, (v8i16 (COPY_TO_REGCLASS FR16:$src, VR128)), 0)>;<br>
+<br>
+let Predicates = [HasAVX, NoBWI] in<br>
+  def : Pat<(store f16:$src, addr:$dst), (VPEXTRWmr addr:$dst, (v8i16 (COPY_TO_REGCLASS FR16:$src, VR128)), 0)>;<br>
+<br>
<br>
 /// SS41I_extract32 - SSE 4.1 extract 32 bits to int reg or memory destination<br>
 multiclass SS41I_extract32<bits<8> opc, string OpcodeStr> {<br>
@@ -7575,6 +7597,21 @@ let Predicates = [HasAVX2, NoVLX_Or_NoBWI] in {<br>
         (VPBROADCASTWYrr (VMOVDI2PDIrr<br>
                           (i32 (INSERT_SUBREG (i32 (IMPLICIT_DEF)),<br>
                                               GR16:$src, sub_16bit))))>;<br>
+<br>
+  def : Pat<(v8f16 (X86VBroadcastld16 addr:$src)),<br>
+            (VPBROADCASTWrm addr:$src)>;<br>
+  def : Pat<(v16f16 (X86VBroadcastld16 addr:$src)),<br>
+            (VPBROADCASTWYrm addr:$src)>;<br>
+<br>
+  def : Pat<(v8f16 (X86VBroadcast (v8f16 VR128:$src))),<br>
+            (VPBROADCASTWrr VR128:$src)>;<br>
+  def : Pat<(v16f16 (X86VBroadcast (v8f16 VR128:$src))),<br>
+            (VPBROADCASTWYrr VR128:$src)>;<br>
+<br>
+  def : Pat<(v8f16 (X86VBroadcast (f16 FR16:$src))),<br>
+            (VPBROADCASTWrr (COPY_TO_REGCLASS FR16:$src, VR128))>;<br>
+  def : Pat<(v16f16 (X86VBroadcast (f16 FR16:$src))),<br>
+            (VPBROADCASTWYrr (COPY_TO_REGCLASS FR16:$src, VR128))>;<br>
 }<br>
 let Predicates = [HasAVX2, NoVLX] in {<br>
   def : Pat<(v4i32 (X86VBroadcast GR32:$src)),<br>
<br>
diff  --git a/llvm/lib/Target/X86/X86InstrVecCompiler.td b/llvm/lib/Target/X86/X86InstrVecCompiler.td<br>
index 2429aa113fb19..e6ecbb6521003 100644<br>
--- a/llvm/lib/Target/X86/X86InstrVecCompiler.td<br>
+++ b/llvm/lib/Target/X86/X86InstrVecCompiler.td<br>
@@ -17,6 +17,8 @@<br>
<br>
 let Predicates = [NoAVX512] in {<br>
   // A vector extract of the first f32/f64 position is a subregister copy<br>
+  def : Pat<(f16 (extractelt (v8f16 VR128:$src), (iPTR 0))),<br>
+            (COPY_TO_REGCLASS (v8f16 VR128:$src), FR16)>;<br>
   def : Pat<(f32 (extractelt (v4f32 VR128:$src), (iPTR 0))),<br>
             (COPY_TO_REGCLASS (v4f32 VR128:$src), FR32)>;<br>
   def : Pat<(f64 (extractelt (v2f64 VR128:$src), (iPTR 0))),<br>
@@ -34,8 +36,8 @@ let Predicates = [HasAVX512] in {<br>
 }<br>
<br>
 let Predicates = [NoVLX] in {<br>
-  def : Pat<(v8f16 (scalar_to_vector FR16X:$src)),<br>
-            (COPY_TO_REGCLASS FR16X:$src, VR128)>;<br>
+  def : Pat<(v8f16 (scalar_to_vector FR16:$src)),<br>
+            (COPY_TO_REGCLASS FR16:$src, VR128)>;<br>
   // Implicitly promote a 32-bit scalar to a vector.<br>
   def : Pat<(v4f32 (scalar_to_vector FR32:$src)),<br>
             (COPY_TO_REGCLASS FR32:$src, VR128)>;<br>
<br>
diff  --git a/llvm/lib/Target/X86/X86InstructionSelector.cpp b/llvm/lib/Target/X86/X86InstructionSelector.cpp<br>
index fb13d93dd1d44..ff701159b95ea 100644<br>
--- a/llvm/lib/Target/X86/X86InstructionSelector.cpp<br>
+++ b/llvm/lib/Target/X86/X86InstructionSelector.cpp<br>
@@ -179,6 +179,8 @@ X86InstructionSelector::getRegClass(LLT Ty, const RegisterBank &RB) const {<br>
       return &X86::GR64RegClass;<br>
   }<br>
   if (RB.getID() == X86::VECRRegBankID) {<br>
+    if (Ty.getSizeInBits() == 16)<br>
+      return STI.hasAVX512() ? &X86::FR16XRegClass : &X86::FR16RegClass;<br>
     if (Ty.getSizeInBits() == 32)<br>
       return STI.hasAVX512() ? &X86::FR32XRegClass : &X86::FR32RegClass;<br>
     if (Ty.getSizeInBits() == 64)<br>
<br>
diff  --git a/llvm/lib/Target/X86/X86RegisterInfo.td b/llvm/lib/Target/X86/X86RegisterInfo.td<br>
index 6362386c8a494..6dc51e37d3c2f 100644<br>
--- a/llvm/lib/Target/X86/X86RegisterInfo.td<br>
+++ b/llvm/lib/Target/X86/X86RegisterInfo.td<br>
@@ -537,6 +537,8 @@ def FR32 : RegisterClass<"X86", [f32], 32, (sequence "XMM%u", 0, 15)>;<br>
<br>
 def FR64 : RegisterClass<"X86", [f64], 64, (add FR32)>;<br>
<br>
+def FR16 : RegisterClass<"X86", [f16], 16, (add FR32)> {let Size = 32;}<br>
+<br>
<br>
 // FIXME: This sets up the floating point register files as though they are f64<br>
 // values, though they really are f80 values.  This will cause us to spill<br>
@@ -599,7 +601,7 @@ def FR32X : RegisterClass<"X86", [f32], 32, (sequence "XMM%u", 0, 31)>;<br>
<br>
 def FR64X : RegisterClass<"X86", [f64], 64, (add FR32X)>;<br>
<br>
-def FR16X : RegisterClass<"X86", [f16], 16, (add FR32X)>;<br>
+def FR16X : RegisterClass<"X86", [f16], 16, (add FR32X)> {let Size = 32;}<br>
<br>
 // Extended VR128 and VR256 for AVX-512 instructions<br>
 def VR128X : RegisterClass<"X86", [v4f32, v2f64, v8f16, v16i8, v8i16, v4i32, v2i64, f128],<br>
<br>
diff  --git a/llvm/test/Analysis/CostModel/X86/fptoi_sat.ll b/llvm/test/Analysis/CostModel/X86/fptoi_sat.ll<br>
index c83d1fb430d2a..7f81abaabc566 100644<br>
--- a/llvm/test/Analysis/CostModel/X86/fptoi_sat.ll<br>
+++ b/llvm/test/Analysis/CostModel/X86/fptoi_sat.ll<br>
@@ -847,228 +847,228 @@ define void @casts() {<br>
<br>
 define void @fp16() {<br>
 ; SSE2-LABEL: 'fp16'<br>
-; SSE2-NEXT:  Cost Model: Found an estimated cost of 11 for instruction: %f16s1 = call i1 @llvm.fptosi.sat.i1.f16(half undef)<br>
-; SSE2-NEXT:  Cost Model: Found an estimated cost of 9 for instruction: %f16u1 = call i1 @llvm.fptoui.sat.i1.f16(half undef)<br>
-; SSE2-NEXT:  Cost Model: Found an estimated cost of 14 for instruction: %f16s8 = call i8 @llvm.fptosi.sat.i8.f16(half undef)<br>
-; SSE2-NEXT:  Cost Model: Found an estimated cost of 12 for instruction: %f16u8 = call i8 @llvm.fptoui.sat.i8.f16(half undef)<br>
-; SSE2-NEXT:  Cost Model: Found an estimated cost of 14 for instruction: %f16s16 = call i16 @llvm.fptosi.sat.i16.f16(half undef)<br>
-; SSE2-NEXT:  Cost Model: Found an estimated cost of 12 for instruction: %f16u16 = call i16 @llvm.fptoui.sat.i16.f16(half undef)<br>
-; SSE2-NEXT:  Cost Model: Found an estimated cost of 14 for instruction: %f16s32 = call i32 @llvm.fptosi.sat.i32.f16(half undef)<br>
-; SSE2-NEXT:  Cost Model: Found an estimated cost of 12 for instruction: %f16u32 = call i32 @llvm.fptoui.sat.i32.f16(half undef)<br>
-; SSE2-NEXT:  Cost Model: Found an estimated cost of 14 for instruction: %f16s64 = call i64 @llvm.fptosi.sat.i64.f16(half undef)<br>
-; SSE2-NEXT:  Cost Model: Found an estimated cost of 12 for instruction: %f16u64 = call i64 @llvm.fptoui.sat.i64.f16(half undef)<br>
-; SSE2-NEXT:  Cost Model: Found an estimated cost of 23 for instruction: %v2f16s1 = call <2 x i1> @llvm.fptosi.sat.v2i1.v2f16(<2 x half> undef)<br>
-; SSE2-NEXT:  Cost Model: Found an estimated cost of 19 for instruction: %v2f16u1 = call <2 x i1> @llvm.fptoui.sat.v2i1.v2f16(<2 x half> undef)<br>
-; SSE2-NEXT:  Cost Model: Found an estimated cost of 32 for instruction: %v2f16s8 = call <2 x i8> @llvm.fptosi.sat.v2i8.v2f16(<2 x half> undef)<br>
-; SSE2-NEXT:  Cost Model: Found an estimated cost of 28 for instruction: %v2f16u8 = call <2 x i8> @llvm.fptoui.sat.v2i8.v2f16(<2 x half> undef)<br>
-; SSE2-NEXT:  Cost Model: Found an estimated cost of 30 for instruction: %v2f16s16 = call <2 x i16> @llvm.fptosi.sat.v2i16.v2f16(<2 x half> undef)<br>
-; SSE2-NEXT:  Cost Model: Found an estimated cost of 26 for instruction: %v2f16u16 = call <2 x i16> @llvm.fptoui.sat.v2i16.v2f16(<2 x half> undef)<br>
-; SSE2-NEXT:  Cost Model: Found an estimated cost of 29 for instruction: %v2f16s32 = call <2 x i32> @llvm.fptosi.sat.v2i32.v2f16(<2 x half> undef)<br>
-; SSE2-NEXT:  Cost Model: Found an estimated cost of 25 for instruction: %v2f16u32 = call <2 x i32> @llvm.fptoui.sat.v2i32.v2f16(<2 x half> undef)<br>
-; SSE2-NEXT:  Cost Model: Found an estimated cost of 29 for instruction: %v2f16s64 = call <2 x i64> @llvm.fptosi.sat.v2i64.v2f16(<2 x half> undef)<br>
-; SSE2-NEXT:  Cost Model: Found an estimated cost of 25 for instruction: %v2f16u64 = call <2 x i64> @llvm.fptoui.sat.v2i64.v2f16(<2 x half> undef)<br>
-; SSE2-NEXT:  Cost Model: Found an estimated cost of 45 for instruction: %v4f16s1 = call <4 x i1> @llvm.fptosi.sat.v4i1.v4f16(<4 x half> undef)<br>
-; SSE2-NEXT:  Cost Model: Found an estimated cost of 39 for instruction: %v4f16u1 = call <4 x i1> @llvm.fptoui.sat.v4i1.v4f16(<4 x half> undef)<br>
-; SSE2-NEXT:  Cost Model: Found an estimated cost of 60 for instruction: %v4f16s8 = call <4 x i8> @llvm.fptosi.sat.v4i8.v4f16(<4 x half> undef)<br>
-; SSE2-NEXT:  Cost Model: Found an estimated cost of 54 for instruction: %v4f16u8 = call <4 x i8> @llvm.fptoui.sat.v4i8.v4f16(<4 x half> undef)<br>
-; SSE2-NEXT:  Cost Model: Found an estimated cost of 60 for instruction: %v4f16s16 = call <4 x i16> @llvm.fptosi.sat.v4i16.v4f16(<4 x half> undef)<br>
-; SSE2-NEXT:  Cost Model: Found an estimated cost of 54 for instruction: %v4f16u16 = call <4 x i16> @llvm.fptoui.sat.v4i16.v4f16(<4 x half> undef)<br>
-; SSE2-NEXT:  Cost Model: Found an estimated cost of 57 for instruction: %v4f16s32 = call <4 x i32> @llvm.fptosi.sat.v4i32.v4f16(<4 x half> undef)<br>
-; SSE2-NEXT:  Cost Model: Found an estimated cost of 51 for instruction: %v4f16u32 = call <4 x i32> @llvm.fptoui.sat.v4i32.v4f16(<4 x half> undef)<br>
-; SSE2-NEXT:  Cost Model: Found an estimated cost of 58 for instruction: %v4f16s64 = call <4 x i64> @llvm.fptosi.sat.v4i64.v4f16(<4 x half> undef)<br>
-; SSE2-NEXT:  Cost Model: Found an estimated cost of 50 for instruction: %v4f16u64 = call <4 x i64> @llvm.fptoui.sat.v4i64.v4f16(<4 x half> undef)<br>
-; SSE2-NEXT:  Cost Model: Found an estimated cost of 89 for instruction: %v8f16s1 = call <8 x i1> @llvm.fptosi.sat.v8i1.v8f16(<8 x half> undef)<br>
-; SSE2-NEXT:  Cost Model: Found an estimated cost of 79 for instruction: %v8f16u1 = call <8 x i1> @llvm.fptoui.sat.v8i1.v8f16(<8 x half> undef)<br>
-; SSE2-NEXT:  Cost Model: Found an estimated cost of 118 for instruction: %v8f16s8 = call <8 x i8> @llvm.fptosi.sat.v8i8.v8f16(<8 x half> undef)<br>
-; SSE2-NEXT:  Cost Model: Found an estimated cost of 108 for instruction: %v8f16u8 = call <8 x i8> @llvm.fptoui.sat.v8i8.v8f16(<8 x half> undef)<br>
-; SSE2-NEXT:  Cost Model: Found an estimated cost of 117 for instruction: %v8f16s16 = call <8 x i16> @llvm.fptosi.sat.v8i16.v8f16(<8 x half> undef)<br>
-; SSE2-NEXT:  Cost Model: Found an estimated cost of 107 for instruction: %v8f16u16 = call <8 x i16> @llvm.fptoui.sat.v8i16.v8f16(<8 x half> undef)<br>
-; SSE2-NEXT:  Cost Model: Found an estimated cost of 114 for instruction: %v8f16s32 = call <8 x i32> @llvm.fptosi.sat.v8i32.v8f16(<8 x half> undef)<br>
-; SSE2-NEXT:  Cost Model: Found an estimated cost of 102 for instruction: %v8f16u32 = call <8 x i32> @llvm.fptoui.sat.v8i32.v8f16(<8 x half> undef)<br>
-; SSE2-NEXT:  Cost Model: Found an estimated cost of 116 for instruction: %v8f16s64 = call <8 x i64> @llvm.fptosi.sat.v8i64.v8f16(<8 x half> undef)<br>
-; SSE2-NEXT:  Cost Model: Found an estimated cost of 100 for instruction: %v8f16u64 = call <8 x i64> @llvm.fptoui.sat.v8i64.v8f16(<8 x half> undef)<br>
-; SSE2-NEXT:  Cost Model: Found an estimated cost of 177 for instruction: %v16f16s1 = call <16 x i1> @llvm.fptosi.sat.v16i1.v16f16(<16 x half> undef)<br>
-; SSE2-NEXT:  Cost Model: Found an estimated cost of 159 for instruction: %v16f16u1 = call <16 x i1> @llvm.fptoui.sat.v16i1.v16f16(<16 x half> undef)<br>
-; SSE2-NEXT:  Cost Model: Found an estimated cost of 229 for instruction: %v16f16s8 = call <16 x i8> @llvm.fptosi.sat.v16i8.v16f16(<16 x half> undef)<br>
-; SSE2-NEXT:  Cost Model: Found an estimated cost of 211 for instruction: %v16f16u8 = call <16 x i8> @llvm.fptoui.sat.v16i8.v16f16(<16 x half> undef)<br>
-; SSE2-NEXT:  Cost Model: Found an estimated cost of 234 for instruction: %v16f16s16 = call <16 x i16> @llvm.fptosi.sat.v16i16.v16f16(<16 x half> undef)<br>
-; SSE2-NEXT:  Cost Model: Found an estimated cost of 214 for instruction: %v16f16u16 = call <16 x i16> @llvm.fptoui.sat.v16i16.v16f16(<16 x half> undef)<br>
-; SSE2-NEXT:  Cost Model: Found an estimated cost of 228 for instruction: %v16f16s32 = call <16 x i32> @llvm.fptosi.sat.v16i32.v16f16(<16 x half> undef)<br>
-; SSE2-NEXT:  Cost Model: Found an estimated cost of 204 for instruction: %v16f16u32 = call <16 x i32> @llvm.fptoui.sat.v16i32.v16f16(<16 x half> undef)<br>
-; SSE2-NEXT:  Cost Model: Found an estimated cost of 232 for instruction: %v16f16s64 = call <16 x i64> @llvm.fptosi.sat.v16i64.v16f16(<16 x half> undef)<br>
-; SSE2-NEXT:  Cost Model: Found an estimated cost of 200 for instruction: %v16f16u64 = call <16 x i64> @llvm.fptoui.sat.v16i64.v16f16(<16 x half> undef)<br>
+; SSE2-NEXT:  Cost Model: Found an estimated cost of 5 for instruction: %f16s1 = call i1 @llvm.fptosi.sat.i1.f16(half undef)<br>
+; SSE2-NEXT:  Cost Model: Found an estimated cost of 3 for instruction: %f16u1 = call i1 @llvm.fptoui.sat.i1.f16(half undef)<br>
+; SSE2-NEXT:  Cost Model: Found an estimated cost of 5 for instruction: %f16s8 = call i8 @llvm.fptosi.sat.i8.f16(half undef)<br>
+; SSE2-NEXT:  Cost Model: Found an estimated cost of 3 for instruction: %f16u8 = call i8 @llvm.fptoui.sat.i8.f16(half undef)<br>
+; SSE2-NEXT:  Cost Model: Found an estimated cost of 5 for instruction: %f16s16 = call i16 @llvm.fptosi.sat.i16.f16(half undef)<br>
+; SSE2-NEXT:  Cost Model: Found an estimated cost of 3 for instruction: %f16u16 = call i16 @llvm.fptoui.sat.i16.f16(half undef)<br>
+; SSE2-NEXT:  Cost Model: Found an estimated cost of 5 for instruction: %f16s32 = call i32 @llvm.fptosi.sat.i32.f16(half undef)<br>
+; SSE2-NEXT:  Cost Model: Found an estimated cost of 3 for instruction: %f16u32 = call i32 @llvm.fptoui.sat.i32.f16(half undef)<br>
+; SSE2-NEXT:  Cost Model: Found an estimated cost of 5 for instruction: %f16s64 = call i64 @llvm.fptosi.sat.i64.f16(half undef)<br>
+; SSE2-NEXT:  Cost Model: Found an estimated cost of 3 for instruction: %f16u64 = call i64 @llvm.fptoui.sat.i64.f16(half undef)<br>
+; SSE2-NEXT:  Cost Model: Found an estimated cost of 15 for instruction: %v2f16s1 = call <2 x i1> @llvm.fptosi.sat.v2i1.v2f16(<2 x half> undef)<br>
+; SSE2-NEXT:  Cost Model: Found an estimated cost of 11 for instruction: %v2f16u1 = call <2 x i1> @llvm.fptoui.sat.v2i1.v2f16(<2 x half> undef)<br>
+; SSE2-NEXT:  Cost Model: Found an estimated cost of 18 for instruction: %v2f16s8 = call <2 x i8> @llvm.fptosi.sat.v2i8.v2f16(<2 x half> undef)<br>
+; SSE2-NEXT:  Cost Model: Found an estimated cost of 14 for instruction: %v2f16u8 = call <2 x i8> @llvm.fptoui.sat.v2i8.v2f16(<2 x half> undef)<br>
+; SSE2-NEXT:  Cost Model: Found an estimated cost of 16 for instruction: %v2f16s16 = call <2 x i16> @llvm.fptosi.sat.v2i16.v2f16(<2 x half> undef)<br>
+; SSE2-NEXT:  Cost Model: Found an estimated cost of 12 for instruction: %v2f16u16 = call <2 x i16> @llvm.fptoui.sat.v2i16.v2f16(<2 x half> undef)<br>
+; SSE2-NEXT:  Cost Model: Found an estimated cost of 15 for instruction: %v2f16s32 = call <2 x i32> @llvm.fptosi.sat.v2i32.v2f16(<2 x half> undef)<br>
+; SSE2-NEXT:  Cost Model: Found an estimated cost of 11 for instruction: %v2f16u32 = call <2 x i32> @llvm.fptoui.sat.v2i32.v2f16(<2 x half> undef)<br>
+; SSE2-NEXT:  Cost Model: Found an estimated cost of 15 for instruction: %v2f16s64 = call <2 x i64> @llvm.fptosi.sat.v2i64.v2f16(<2 x half> undef)<br>
+; SSE2-NEXT:  Cost Model: Found an estimated cost of 11 for instruction: %v2f16u64 = call <2 x i64> @llvm.fptoui.sat.v2i64.v2f16(<2 x half> undef)<br>
+; SSE2-NEXT:  Cost Model: Found an estimated cost of 29 for instruction: %v4f16s1 = call <4 x i1> @llvm.fptosi.sat.v4i1.v4f16(<4 x half> undef)<br>
+; SSE2-NEXT:  Cost Model: Found an estimated cost of 23 for instruction: %v4f16u1 = call <4 x i1> @llvm.fptoui.sat.v4i1.v4f16(<4 x half> undef)<br>
+; SSE2-NEXT:  Cost Model: Found an estimated cost of 32 for instruction: %v4f16s8 = call <4 x i8> @llvm.fptosi.sat.v4i8.v4f16(<4 x half> undef)<br>
+; SSE2-NEXT:  Cost Model: Found an estimated cost of 26 for instruction: %v4f16u8 = call <4 x i8> @llvm.fptoui.sat.v4i8.v4f16(<4 x half> undef)<br>
+; SSE2-NEXT:  Cost Model: Found an estimated cost of 32 for instruction: %v4f16s16 = call <4 x i16> @llvm.fptosi.sat.v4i16.v4f16(<4 x half> undef)<br>
+; SSE2-NEXT:  Cost Model: Found an estimated cost of 26 for instruction: %v4f16u16 = call <4 x i16> @llvm.fptoui.sat.v4i16.v4f16(<4 x half> undef)<br>
+; SSE2-NEXT:  Cost Model: Found an estimated cost of 29 for instruction: %v4f16s32 = call <4 x i32> @llvm.fptosi.sat.v4i32.v4f16(<4 x half> undef)<br>
+; SSE2-NEXT:  Cost Model: Found an estimated cost of 23 for instruction: %v4f16u32 = call <4 x i32> @llvm.fptoui.sat.v4i32.v4f16(<4 x half> undef)<br>
+; SSE2-NEXT:  Cost Model: Found an estimated cost of 30 for instruction: %v4f16s64 = call <4 x i64> @llvm.fptosi.sat.v4i64.v4f16(<4 x half> undef)<br>
+; SSE2-NEXT:  Cost Model: Found an estimated cost of 22 for instruction: %v4f16u64 = call <4 x i64> @llvm.fptoui.sat.v4i64.v4f16(<4 x half> undef)<br>
+; SSE2-NEXT:  Cost Model: Found an estimated cost of 57 for instruction: %v8f16s1 = call <8 x i1> @llvm.fptosi.sat.v8i1.v8f16(<8 x half> undef)<br>
+; SSE2-NEXT:  Cost Model: Found an estimated cost of 47 for instruction: %v8f16u1 = call <8 x i1> @llvm.fptoui.sat.v8i1.v8f16(<8 x half> undef)<br>
+; SSE2-NEXT:  Cost Model: Found an estimated cost of 62 for instruction: %v8f16s8 = call <8 x i8> @llvm.fptosi.sat.v8i8.v8f16(<8 x half> undef)<br>
+; SSE2-NEXT:  Cost Model: Found an estimated cost of 52 for instruction: %v8f16u8 = call <8 x i8> @llvm.fptoui.sat.v8i8.v8f16(<8 x half> undef)<br>
+; SSE2-NEXT:  Cost Model: Found an estimated cost of 61 for instruction: %v8f16s16 = call <8 x i16> @llvm.fptosi.sat.v8i16.v8f16(<8 x half> undef)<br>
+; SSE2-NEXT:  Cost Model: Found an estimated cost of 51 for instruction: %v8f16u16 = call <8 x i16> @llvm.fptoui.sat.v8i16.v8f16(<8 x half> undef)<br>
+; SSE2-NEXT:  Cost Model: Found an estimated cost of 58 for instruction: %v8f16s32 = call <8 x i32> @llvm.fptosi.sat.v8i32.v8f16(<8 x half> undef)<br>
+; SSE2-NEXT:  Cost Model: Found an estimated cost of 46 for instruction: %v8f16u32 = call <8 x i32> @llvm.fptoui.sat.v8i32.v8f16(<8 x half> undef)<br>
+; SSE2-NEXT:  Cost Model: Found an estimated cost of 60 for instruction: %v8f16s64 = call <8 x i64> @llvm.fptosi.sat.v8i64.v8f16(<8 x half> undef)<br>
+; SSE2-NEXT:  Cost Model: Found an estimated cost of 44 for instruction: %v8f16u64 = call <8 x i64> @llvm.fptoui.sat.v8i64.v8f16(<8 x half> undef)<br>
+; SSE2-NEXT:  Cost Model: Found an estimated cost of 113 for instruction: %v16f16s1 = call <16 x i1> @llvm.fptosi.sat.v16i1.v16f16(<16 x half> undef)<br>
+; SSE2-NEXT:  Cost Model: Found an estimated cost of 95 for instruction: %v16f16u1 = call <16 x i1> @llvm.fptoui.sat.v16i1.v16f16(<16 x half> undef)<br>
+; SSE2-NEXT:  Cost Model: Found an estimated cost of 117 for instruction: %v16f16s8 = call <16 x i8> @llvm.fptosi.sat.v16i8.v16f16(<16 x half> undef)<br>
+; SSE2-NEXT:  Cost Model: Found an estimated cost of 99 for instruction: %v16f16u8 = call <16 x i8> @llvm.fptoui.sat.v16i8.v16f16(<16 x half> undef)<br>
+; SSE2-NEXT:  Cost Model: Found an estimated cost of 122 for instruction: %v16f16s16 = call <16 x i16> @llvm.fptosi.sat.v16i16.v16f16(<16 x half> undef)<br>
+; SSE2-NEXT:  Cost Model: Found an estimated cost of 102 for instruction: %v16f16u16 = call <16 x i16> @llvm.fptoui.sat.v16i16.v16f16(<16 x half> undef)<br>
+; SSE2-NEXT:  Cost Model: Found an estimated cost of 116 for instruction: %v16f16s32 = call <16 x i32> @llvm.fptosi.sat.v16i32.v16f16(<16 x half> undef)<br>
+; SSE2-NEXT:  Cost Model: Found an estimated cost of 92 for instruction: %v16f16u32 = call <16 x i32> @llvm.fptoui.sat.v16i32.v16f16(<16 x half> undef)<br>
+; SSE2-NEXT:  Cost Model: Found an estimated cost of 120 for instruction: %v16f16s64 = call <16 x i64> @llvm.fptosi.sat.v16i64.v16f16(<16 x half> undef)<br>
+; SSE2-NEXT:  Cost Model: Found an estimated cost of 88 for instruction: %v16f16u64 = call <16 x i64> @llvm.fptoui.sat.v16i64.v16f16(<16 x half> undef)<br>
 ; SSE2-NEXT:  Cost Model: Found an estimated cost of 0 for instruction: ret void<br>
 ;<br>
 ; SSE42-LABEL: 'fp16'<br>
-; SSE42-NEXT:  Cost Model: Found an estimated cost of 11 for instruction: %f16s1 = call i1 @llvm.fptosi.sat.i1.f16(half undef)<br>
-; SSE42-NEXT:  Cost Model: Found an estimated cost of 9 for instruction: %f16u1 = call i1 @llvm.fptoui.sat.i1.f16(half undef)<br>
-; SSE42-NEXT:  Cost Model: Found an estimated cost of 11 for instruction: %f16s8 = call i8 @llvm.fptosi.sat.i8.f16(half undef)<br>
-; SSE42-NEXT:  Cost Model: Found an estimated cost of 9 for instruction: %f16u8 = call i8 @llvm.fptoui.sat.i8.f16(half undef)<br>
-; SSE42-NEXT:  Cost Model: Found an estimated cost of 11 for instruction: %f16s16 = call i16 @llvm.fptosi.sat.i16.f16(half undef)<br>
-; SSE42-NEXT:  Cost Model: Found an estimated cost of 9 for instruction: %f16u16 = call i16 @llvm.fptoui.sat.i16.f16(half undef)<br>
-; SSE42-NEXT:  Cost Model: Found an estimated cost of 11 for instruction: %f16s32 = call i32 @llvm.fptosi.sat.i32.f16(half undef)<br>
-; SSE42-NEXT:  Cost Model: Found an estimated cost of 9 for instruction: %f16u32 = call i32 @llvm.fptoui.sat.i32.f16(half undef)<br>
-; SSE42-NEXT:  Cost Model: Found an estimated cost of 11 for instruction: %f16s64 = call i64 @llvm.fptosi.sat.i64.f16(half undef)<br>
-; SSE42-NEXT:  Cost Model: Found an estimated cost of 12 for instruction: %f16u64 = call i64 @llvm.fptoui.sat.i64.f16(half undef)<br>
-; SSE42-NEXT:  Cost Model: Found an estimated cost of 23 for instruction: %v2f16s1 = call <2 x i1> @llvm.fptosi.sat.v2i1.v2f16(<2 x half> undef)<br>
-; SSE42-NEXT:  Cost Model: Found an estimated cost of 19 for instruction: %v2f16u1 = call <2 x i1> @llvm.fptoui.sat.v2i1.v2f16(<2 x half> undef)<br>
-; SSE42-NEXT:  Cost Model: Found an estimated cost of 25 for instruction: %v2f16s8 = call <2 x i8> @llvm.fptosi.sat.v2i8.v2f16(<2 x half> undef)<br>
-; SSE42-NEXT:  Cost Model: Found an estimated cost of 21 for instruction: %v2f16u8 = call <2 x i8> @llvm.fptoui.sat.v2i8.v2f16(<2 x half> undef)<br>
-; SSE42-NEXT:  Cost Model: Found an estimated cost of 24 for instruction: %v2f16s16 = call <2 x i16> @llvm.fptosi.sat.v2i16.v2f16(<2 x half> undef)<br>
-; SSE42-NEXT:  Cost Model: Found an estimated cost of 20 for instruction: %v2f16u16 = call <2 x i16> @llvm.fptoui.sat.v2i16.v2f16(<2 x half> undef)<br>
-; SSE42-NEXT:  Cost Model: Found an estimated cost of 23 for instruction: %v2f16s32 = call <2 x i32> @llvm.fptosi.sat.v2i32.v2f16(<2 x half> undef)<br>
-; SSE42-NEXT:  Cost Model: Found an estimated cost of 19 for instruction: %v2f16u32 = call <2 x i32> @llvm.fptoui.sat.v2i32.v2f16(<2 x half> undef)<br>
-; SSE42-NEXT:  Cost Model: Found an estimated cost of 23 for instruction: %v2f16s64 = call <2 x i64> @llvm.fptosi.sat.v2i64.v2f16(<2 x half> undef)<br>
-; SSE42-NEXT:  Cost Model: Found an estimated cost of 25 for instruction: %v2f16u64 = call <2 x i64> @llvm.fptoui.sat.v2i64.v2f16(<2 x half> undef)<br>
-; SSE42-NEXT:  Cost Model: Found an estimated cost of 45 for instruction: %v4f16s1 = call <4 x i1> @llvm.fptosi.sat.v4i1.v4f16(<4 x half> undef)<br>
-; SSE42-NEXT:  Cost Model: Found an estimated cost of 39 for instruction: %v4f16u1 = call <4 x i1> @llvm.fptoui.sat.v4i1.v4f16(<4 x half> undef)<br>
-; SSE42-NEXT:  Cost Model: Found an estimated cost of 47 for instruction: %v4f16s8 = call <4 x i8> @llvm.fptosi.sat.v4i8.v4f16(<4 x half> undef)<br>
-; SSE42-NEXT:  Cost Model: Found an estimated cost of 41 for instruction: %v4f16u8 = call <4 x i8> @llvm.fptoui.sat.v4i8.v4f16(<4 x half> undef)<br>
-; SSE42-NEXT:  Cost Model: Found an estimated cost of 47 for instruction: %v4f16s16 = call <4 x i16> @llvm.fptosi.sat.v4i16.v4f16(<4 x half> undef)<br>
-; SSE42-NEXT:  Cost Model: Found an estimated cost of 41 for instruction: %v4f16u16 = call <4 x i16> @llvm.fptoui.sat.v4i16.v4f16(<4 x half> undef)<br>
-; SSE42-NEXT:  Cost Model: Found an estimated cost of 45 for instruction: %v4f16s32 = call <4 x i32> @llvm.fptosi.sat.v4i32.v4f16(<4 x half> undef)<br>
-; SSE42-NEXT:  Cost Model: Found an estimated cost of 39 for instruction: %v4f16u32 = call <4 x i32> @llvm.fptoui.sat.v4i32.v4f16(<4 x half> undef)<br>
-; SSE42-NEXT:  Cost Model: Found an estimated cost of 46 for instruction: %v4f16s64 = call <4 x i64> @llvm.fptosi.sat.v4i64.v4f16(<4 x half> undef)<br>
-; SSE42-NEXT:  Cost Model: Found an estimated cost of 50 for instruction: %v4f16u64 = call <4 x i64> @llvm.fptoui.sat.v4i64.v4f16(<4 x half> undef)<br>
-; SSE42-NEXT:  Cost Model: Found an estimated cost of 89 for instruction: %v8f16s1 = call <8 x i1> @llvm.fptosi.sat.v8i1.v8f16(<8 x half> undef)<br>
-; SSE42-NEXT:  Cost Model: Found an estimated cost of 79 for instruction: %v8f16u1 = call <8 x i1> @llvm.fptoui.sat.v8i1.v8f16(<8 x half> undef)<br>
-; SSE42-NEXT:  Cost Model: Found an estimated cost of 92 for instruction: %v8f16s8 = call <8 x i8> @llvm.fptosi.sat.v8i8.v8f16(<8 x half> undef)<br>
-; SSE42-NEXT:  Cost Model: Found an estimated cost of 82 for instruction: %v8f16u8 = call <8 x i8> @llvm.fptoui.sat.v8i8.v8f16(<8 x half> undef)<br>
-; SSE42-NEXT:  Cost Model: Found an estimated cost of 93 for instruction: %v8f16s16 = call <8 x i16> @llvm.fptosi.sat.v8i16.v8f16(<8 x half> undef)<br>
-; SSE42-NEXT:  Cost Model: Found an estimated cost of 83 for instruction: %v8f16u16 = call <8 x i16> @llvm.fptoui.sat.v8i16.v8f16(<8 x half> undef)<br>
-; SSE42-NEXT:  Cost Model: Found an estimated cost of 90 for instruction: %v8f16s32 = call <8 x i32> @llvm.fptosi.sat.v8i32.v8f16(<8 x half> undef)<br>
-; SSE42-NEXT:  Cost Model: Found an estimated cost of 78 for instruction: %v8f16u32 = call <8 x i32> @llvm.fptoui.sat.v8i32.v8f16(<8 x half> undef)<br>
-; SSE42-NEXT:  Cost Model: Found an estimated cost of 92 for instruction: %v8f16s64 = call <8 x i64> @llvm.fptosi.sat.v8i64.v8f16(<8 x half> undef)<br>
-; SSE42-NEXT:  Cost Model: Found an estimated cost of 100 for instruction: %v8f16u64 = call <8 x i64> @llvm.fptoui.sat.v8i64.v8f16(<8 x half> undef)<br>
-; SSE42-NEXT:  Cost Model: Found an estimated cost of 177 for instruction: %v16f16s1 = call <16 x i1> @llvm.fptosi.sat.v16i1.v16f16(<16 x half> undef)<br>
-; SSE42-NEXT:  Cost Model: Found an estimated cost of 159 for instruction: %v16f16u1 = call <16 x i1> @llvm.fptoui.sat.v16i1.v16f16(<16 x half> undef)<br>
-; SSE42-NEXT:  Cost Model: Found an estimated cost of 181 for instruction: %v16f16s8 = call <16 x i8> @llvm.fptosi.sat.v16i8.v16f16(<16 x half> undef)<br>
-; SSE42-NEXT:  Cost Model: Found an estimated cost of 163 for instruction: %v16f16u8 = call <16 x i8> @llvm.fptoui.sat.v16i8.v16f16(<16 x half> undef)<br>
-; SSE42-NEXT:  Cost Model: Found an estimated cost of 186 for instruction: %v16f16s16 = call <16 x i16> @llvm.fptosi.sat.v16i16.v16f16(<16 x half> undef)<br>
-; SSE42-NEXT:  Cost Model: Found an estimated cost of 166 for instruction: %v16f16u16 = call <16 x i16> @llvm.fptoui.sat.v16i16.v16f16(<16 x half> undef)<br>
-; SSE42-NEXT:  Cost Model: Found an estimated cost of 180 for instruction: %v16f16s32 = call <16 x i32> @llvm.fptosi.sat.v16i32.v16f16(<16 x half> undef)<br>
-; SSE42-NEXT:  Cost Model: Found an estimated cost of 156 for instruction: %v16f16u32 = call <16 x i32> @llvm.fptoui.sat.v16i32.v16f16(<16 x half> undef)<br>
-; SSE42-NEXT:  Cost Model: Found an estimated cost of 184 for instruction: %v16f16s64 = call <16 x i64> @llvm.fptosi.sat.v16i64.v16f16(<16 x half> undef)<br>
-; SSE42-NEXT:  Cost Model: Found an estimated cost of 200 for instruction: %v16f16u64 = call <16 x i64> @llvm.fptoui.sat.v16i64.v16f16(<16 x half> undef)<br>
+; SSE42-NEXT:  Cost Model: Found an estimated cost of 5 for instruction: %f16s1 = call i1 @llvm.fptosi.sat.i1.f16(half undef)<br>
+; SSE42-NEXT:  Cost Model: Found an estimated cost of 3 for instruction: %f16u1 = call i1 @llvm.fptoui.sat.i1.f16(half undef)<br>
+; SSE42-NEXT:  Cost Model: Found an estimated cost of 5 for instruction: %f16s8 = call i8 @llvm.fptosi.sat.i8.f16(half undef)<br>
+; SSE42-NEXT:  Cost Model: Found an estimated cost of 3 for instruction: %f16u8 = call i8 @llvm.fptoui.sat.i8.f16(half undef)<br>
+; SSE42-NEXT:  Cost Model: Found an estimated cost of 5 for instruction: %f16s16 = call i16 @llvm.fptosi.sat.i16.f16(half undef)<br>
+; SSE42-NEXT:  Cost Model: Found an estimated cost of 3 for instruction: %f16u16 = call i16 @llvm.fptoui.sat.i16.f16(half undef)<br>
+; SSE42-NEXT:  Cost Model: Found an estimated cost of 5 for instruction: %f16s32 = call i32 @llvm.fptosi.sat.i32.f16(half undef)<br>
+; SSE42-NEXT:  Cost Model: Found an estimated cost of 3 for instruction: %f16u32 = call i32 @llvm.fptoui.sat.i32.f16(half undef)<br>
+; SSE42-NEXT:  Cost Model: Found an estimated cost of 5 for instruction: %f16s64 = call i64 @llvm.fptosi.sat.i64.f16(half undef)<br>
+; SSE42-NEXT:  Cost Model: Found an estimated cost of 3 for instruction: %f16u64 = call i64 @llvm.fptoui.sat.i64.f16(half undef)<br>
+; SSE42-NEXT:  Cost Model: Found an estimated cost of 15 for instruction: %v2f16s1 = call <2 x i1> @llvm.fptosi.sat.v2i1.v2f16(<2 x half> undef)<br>
+; SSE42-NEXT:  Cost Model: Found an estimated cost of 11 for instruction: %v2f16u1 = call <2 x i1> @llvm.fptoui.sat.v2i1.v2f16(<2 x half> undef)<br>
+; SSE42-NEXT:  Cost Model: Found an estimated cost of 17 for instruction: %v2f16s8 = call <2 x i8> @llvm.fptosi.sat.v2i8.v2f16(<2 x half> undef)<br>
+; SSE42-NEXT:  Cost Model: Found an estimated cost of 13 for instruction: %v2f16u8 = call <2 x i8> @llvm.fptoui.sat.v2i8.v2f16(<2 x half> undef)<br>
+; SSE42-NEXT:  Cost Model: Found an estimated cost of 16 for instruction: %v2f16s16 = call <2 x i16> @llvm.fptosi.sat.v2i16.v2f16(<2 x half> undef)<br>
+; SSE42-NEXT:  Cost Model: Found an estimated cost of 12 for instruction: %v2f16u16 = call <2 x i16> @llvm.fptoui.sat.v2i16.v2f16(<2 x half> undef)<br>
+; SSE42-NEXT:  Cost Model: Found an estimated cost of 15 for instruction: %v2f16s32 = call <2 x i32> @llvm.fptosi.sat.v2i32.v2f16(<2 x half> undef)<br>
+; SSE42-NEXT:  Cost Model: Found an estimated cost of 11 for instruction: %v2f16u32 = call <2 x i32> @llvm.fptoui.sat.v2i32.v2f16(<2 x half> undef)<br>
+; SSE42-NEXT:  Cost Model: Found an estimated cost of 15 for instruction: %v2f16s64 = call <2 x i64> @llvm.fptosi.sat.v2i64.v2f16(<2 x half> undef)<br>
+; SSE42-NEXT:  Cost Model: Found an estimated cost of 11 for instruction: %v2f16u64 = call <2 x i64> @llvm.fptoui.sat.v2i64.v2f16(<2 x half> undef)<br>
+; SSE42-NEXT:  Cost Model: Found an estimated cost of 29 for instruction: %v4f16s1 = call <4 x i1> @llvm.fptosi.sat.v4i1.v4f16(<4 x half> undef)<br>
+; SSE42-NEXT:  Cost Model: Found an estimated cost of 23 for instruction: %v4f16u1 = call <4 x i1> @llvm.fptoui.sat.v4i1.v4f16(<4 x half> undef)<br>
+; SSE42-NEXT:  Cost Model: Found an estimated cost of 31 for instruction: %v4f16s8 = call <4 x i8> @llvm.fptosi.sat.v4i8.v4f16(<4 x half> undef)<br>
+; SSE42-NEXT:  Cost Model: Found an estimated cost of 25 for instruction: %v4f16u8 = call <4 x i8> @llvm.fptoui.sat.v4i8.v4f16(<4 x half> undef)<br>
+; SSE42-NEXT:  Cost Model: Found an estimated cost of 31 for instruction: %v4f16s16 = call <4 x i16> @llvm.fptosi.sat.v4i16.v4f16(<4 x half> undef)<br>
+; SSE42-NEXT:  Cost Model: Found an estimated cost of 25 for instruction: %v4f16u16 = call <4 x i16> @llvm.fptoui.sat.v4i16.v4f16(<4 x half> undef)<br>
+; SSE42-NEXT:  Cost Model: Found an estimated cost of 29 for instruction: %v4f16s32 = call <4 x i32> @llvm.fptosi.sat.v4i32.v4f16(<4 x half> undef)<br>
+; SSE42-NEXT:  Cost Model: Found an estimated cost of 23 for instruction: %v4f16u32 = call <4 x i32> @llvm.fptoui.sat.v4i32.v4f16(<4 x half> undef)<br>
+; SSE42-NEXT:  Cost Model: Found an estimated cost of 30 for instruction: %v4f16s64 = call <4 x i64> @llvm.fptosi.sat.v4i64.v4f16(<4 x half> undef)<br>
+; SSE42-NEXT:  Cost Model: Found an estimated cost of 22 for instruction: %v4f16u64 = call <4 x i64> @llvm.fptoui.sat.v4i64.v4f16(<4 x half> undef)<br>
+; SSE42-NEXT:  Cost Model: Found an estimated cost of 57 for instruction: %v8f16s1 = call <8 x i1> @llvm.fptosi.sat.v8i1.v8f16(<8 x half> undef)<br>
+; SSE42-NEXT:  Cost Model: Found an estimated cost of 47 for instruction: %v8f16u1 = call <8 x i1> @llvm.fptoui.sat.v8i1.v8f16(<8 x half> undef)<br>
+; SSE42-NEXT:  Cost Model: Found an estimated cost of 60 for instruction: %v8f16s8 = call <8 x i8> @llvm.fptosi.sat.v8i8.v8f16(<8 x half> undef)<br>
+; SSE42-NEXT:  Cost Model: Found an estimated cost of 50 for instruction: %v8f16u8 = call <8 x i8> @llvm.fptoui.sat.v8i8.v8f16(<8 x half> undef)<br>
+; SSE42-NEXT:  Cost Model: Found an estimated cost of 61 for instruction: %v8f16s16 = call <8 x i16> @llvm.fptosi.sat.v8i16.v8f16(<8 x half> undef)<br>
+; SSE42-NEXT:  Cost Model: Found an estimated cost of 51 for instruction: %v8f16u16 = call <8 x i16> @llvm.fptoui.sat.v8i16.v8f16(<8 x half> undef)<br>
+; SSE42-NEXT:  Cost Model: Found an estimated cost of 58 for instruction: %v8f16s32 = call <8 x i32> @llvm.fptosi.sat.v8i32.v8f16(<8 x half> undef)<br>
+; SSE42-NEXT:  Cost Model: Found an estimated cost of 46 for instruction: %v8f16u32 = call <8 x i32> @llvm.fptoui.sat.v8i32.v8f16(<8 x half> undef)<br>
+; SSE42-NEXT:  Cost Model: Found an estimated cost of 60 for instruction: %v8f16s64 = call <8 x i64> @llvm.fptosi.sat.v8i64.v8f16(<8 x half> undef)<br>
+; SSE42-NEXT:  Cost Model: Found an estimated cost of 44 for instruction: %v8f16u64 = call <8 x i64> @llvm.fptoui.sat.v8i64.v8f16(<8 x half> undef)<br>
+; SSE42-NEXT:  Cost Model: Found an estimated cost of 113 for instruction: %v16f16s1 = call <16 x i1> @llvm.fptosi.sat.v16i1.v16f16(<16 x half> undef)<br>
+; SSE42-NEXT:  Cost Model: Found an estimated cost of 95 for instruction: %v16f16u1 = call <16 x i1> @llvm.fptoui.sat.v16i1.v16f16(<16 x half> undef)<br>
+; SSE42-NEXT:  Cost Model: Found an estimated cost of 117 for instruction: %v16f16s8 = call <16 x i8> @llvm.fptosi.sat.v16i8.v16f16(<16 x half> undef)<br>
+; SSE42-NEXT:  Cost Model: Found an estimated cost of 99 for instruction: %v16f16u8 = call <16 x i8> @llvm.fptoui.sat.v16i8.v16f16(<16 x half> undef)<br>
+; SSE42-NEXT:  Cost Model: Found an estimated cost of 122 for instruction: %v16f16s16 = call <16 x i16> @llvm.fptosi.sat.v16i16.v16f16(<16 x half> undef)<br>
+; SSE42-NEXT:  Cost Model: Found an estimated cost of 102 for instruction: %v16f16u16 = call <16 x i16> @llvm.fptoui.sat.v16i16.v16f16(<16 x half> undef)<br>
+; SSE42-NEXT:  Cost Model: Found an estimated cost of 116 for instruction: %v16f16s32 = call <16 x i32> @llvm.fptosi.sat.v16i32.v16f16(<16 x half> undef)<br>
+; SSE42-NEXT:  Cost Model: Found an estimated cost of 92 for instruction: %v16f16u32 = call <16 x i32> @llvm.fptoui.sat.v16i32.v16f16(<16 x half> undef)<br>
+; SSE42-NEXT:  Cost Model: Found an estimated cost of 120 for instruction: %v16f16s64 = call <16 x i64> @llvm.fptosi.sat.v16i64.v16f16(<16 x half> undef)<br>
+; SSE42-NEXT:  Cost Model: Found an estimated cost of 88 for instruction: %v16f16u64 = call <16 x i64> @llvm.fptoui.sat.v16i64.v16f16(<16 x half> undef)<br>
 ; SSE42-NEXT:  Cost Model: Found an estimated cost of 0 for instruction: ret void<br>
 ;<br>
 ; AVX1-LABEL: 'fp16'<br>
-; AVX1-NEXT:  Cost Model: Found an estimated cost of 9 for instruction: %f16s1 = call i1 @llvm.fptosi.sat.i1.f16(half undef)<br>
-; AVX1-NEXT:  Cost Model: Found an estimated cost of 7 for instruction: %f16u1 = call i1 @llvm.fptoui.sat.i1.f16(half undef)<br>
-; AVX1-NEXT:  Cost Model: Found an estimated cost of 9 for instruction: %f16s8 = call i8 @llvm.fptosi.sat.i8.f16(half undef)<br>
-; AVX1-NEXT:  Cost Model: Found an estimated cost of 7 for instruction: %f16u8 = call i8 @llvm.fptoui.sat.i8.f16(half undef)<br>
-; AVX1-NEXT:  Cost Model: Found an estimated cost of 9 for instruction: %f16s16 = call i16 @llvm.fptosi.sat.i16.f16(half undef)<br>
-; AVX1-NEXT:  Cost Model: Found an estimated cost of 7 for instruction: %f16u16 = call i16 @llvm.fptoui.sat.i16.f16(half undef)<br>
-; AVX1-NEXT:  Cost Model: Found an estimated cost of 9 for instruction: %f16s32 = call i32 @llvm.fptosi.sat.i32.f16(half undef)<br>
-; AVX1-NEXT:  Cost Model: Found an estimated cost of 7 for instruction: %f16u32 = call i32 @llvm.fptoui.sat.i32.f16(half undef)<br>
-; AVX1-NEXT:  Cost Model: Found an estimated cost of 9 for instruction: %f16s64 = call i64 @llvm.fptosi.sat.i64.f16(half undef)<br>
-; AVX1-NEXT:  Cost Model: Found an estimated cost of 10 for instruction: %f16u64 = call i64 @llvm.fptoui.sat.i64.f16(half undef)<br>
-; AVX1-NEXT:  Cost Model: Found an estimated cost of 19 for instruction: %v2f16s1 = call <2 x i1> @llvm.fptosi.sat.v2i1.v2f16(<2 x half> undef)<br>
-; AVX1-NEXT:  Cost Model: Found an estimated cost of 15 for instruction: %v2f16u1 = call <2 x i1> @llvm.fptoui.sat.v2i1.v2f16(<2 x half> undef)<br>
-; AVX1-NEXT:  Cost Model: Found an estimated cost of 21 for instruction: %v2f16s8 = call <2 x i8> @llvm.fptosi.sat.v2i8.v2f16(<2 x half> undef)<br>
-; AVX1-NEXT:  Cost Model: Found an estimated cost of 17 for instruction: %v2f16u8 = call <2 x i8> @llvm.fptoui.sat.v2i8.v2f16(<2 x half> undef)<br>
-; AVX1-NEXT:  Cost Model: Found an estimated cost of 20 for instruction: %v2f16s16 = call <2 x i16> @llvm.fptosi.sat.v2i16.v2f16(<2 x half> undef)<br>
-; AVX1-NEXT:  Cost Model: Found an estimated cost of 16 for instruction: %v2f16u16 = call <2 x i16> @llvm.fptoui.sat.v2i16.v2f16(<2 x half> undef)<br>
-; AVX1-NEXT:  Cost Model: Found an estimated cost of 19 for instruction: %v2f16s32 = call <2 x i32> @llvm.fptosi.sat.v2i32.v2f16(<2 x half> undef)<br>
-; AVX1-NEXT:  Cost Model: Found an estimated cost of 15 for instruction: %v2f16u32 = call <2 x i32> @llvm.fptoui.sat.v2i32.v2f16(<2 x half> undef)<br>
-; AVX1-NEXT:  Cost Model: Found an estimated cost of 19 for instruction: %v2f16s64 = call <2 x i64> @llvm.fptosi.sat.v2i64.v2f16(<2 x half> undef)<br>
-; AVX1-NEXT:  Cost Model: Found an estimated cost of 21 for instruction: %v2f16u64 = call <2 x i64> @llvm.fptoui.sat.v2i64.v2f16(<2 x half> undef)<br>
-; AVX1-NEXT:  Cost Model: Found an estimated cost of 37 for instruction: %v4f16s1 = call <4 x i1> @llvm.fptosi.sat.v4i1.v4f16(<4 x half> undef)<br>
-; AVX1-NEXT:  Cost Model: Found an estimated cost of 31 for instruction: %v4f16u1 = call <4 x i1> @llvm.fptoui.sat.v4i1.v4f16(<4 x half> undef)<br>
-; AVX1-NEXT:  Cost Model: Found an estimated cost of 39 for instruction: %v4f16s8 = call <4 x i8> @llvm.fptosi.sat.v4i8.v4f16(<4 x half> undef)<br>
-; AVX1-NEXT:  Cost Model: Found an estimated cost of 33 for instruction: %v4f16u8 = call <4 x i8> @llvm.fptoui.sat.v4i8.v4f16(<4 x half> undef)<br>
-; AVX1-NEXT:  Cost Model: Found an estimated cost of 39 for instruction: %v4f16s16 = call <4 x i16> @llvm.fptosi.sat.v4i16.v4f16(<4 x half> undef)<br>
-; AVX1-NEXT:  Cost Model: Found an estimated cost of 33 for instruction: %v4f16u16 = call <4 x i16> @llvm.fptoui.sat.v4i16.v4f16(<4 x half> undef)<br>
-; AVX1-NEXT:  Cost Model: Found an estimated cost of 37 for instruction: %v4f16s32 = call <4 x i32> @llvm.fptosi.sat.v4i32.v4f16(<4 x half> undef)<br>
-; AVX1-NEXT:  Cost Model: Found an estimated cost of 31 for instruction: %v4f16u32 = call <4 x i32> @llvm.fptoui.sat.v4i32.v4f16(<4 x half> undef)<br>
-; AVX1-NEXT:  Cost Model: Found an estimated cost of 38 for instruction: %v4f16s64 = call <4 x i64> @llvm.fptosi.sat.v4i64.v4f16(<4 x half> undef)<br>
-; AVX1-NEXT:  Cost Model: Found an estimated cost of 43 for instruction: %v4f16u64 = call <4 x i64> @llvm.fptoui.sat.v4i64.v4f16(<4 x half> undef)<br>
-; AVX1-NEXT:  Cost Model: Found an estimated cost of 73 for instruction: %v8f16s1 = call <8 x i1> @llvm.fptosi.sat.v8i1.v8f16(<8 x half> undef)<br>
-; AVX1-NEXT:  Cost Model: Found an estimated cost of 63 for instruction: %v8f16u1 = call <8 x i1> @llvm.fptoui.sat.v8i1.v8f16(<8 x half> undef)<br>
-; AVX1-NEXT:  Cost Model: Found an estimated cost of 78 for instruction: %v8f16s8 = call <8 x i8> @llvm.fptosi.sat.v8i8.v8f16(<8 x half> undef)<br>
-; AVX1-NEXT:  Cost Model: Found an estimated cost of 68 for instruction: %v8f16u8 = call <8 x i8> @llvm.fptoui.sat.v8i8.v8f16(<8 x half> undef)<br>
-; AVX1-NEXT:  Cost Model: Found an estimated cost of 78 for instruction: %v8f16s16 = call <8 x i16> @llvm.fptosi.sat.v8i16.v8f16(<8 x half> undef)<br>
-; AVX1-NEXT:  Cost Model: Found an estimated cost of 68 for instruction: %v8f16u16 = call <8 x i16> @llvm.fptoui.sat.v8i16.v8f16(<8 x half> undef)<br>
-; AVX1-NEXT:  Cost Model: Found an estimated cost of 74 for instruction: %v8f16s32 = call <8 x i32> @llvm.fptosi.sat.v8i32.v8f16(<8 x half> undef)<br>
-; AVX1-NEXT:  Cost Model: Found an estimated cost of 63 for instruction: %v8f16u32 = call <8 x i32> @llvm.fptoui.sat.v8i32.v8f16(<8 x half> undef)<br>
-; AVX1-NEXT:  Cost Model: Found an estimated cost of 76 for instruction: %v8f16s64 = call <8 x i64> @llvm.fptosi.sat.v8i64.v8f16(<8 x half> undef)<br>
-; AVX1-NEXT:  Cost Model: Found an estimated cost of 86 for instruction: %v8f16u64 = call <8 x i64> @llvm.fptoui.sat.v8i64.v8f16(<8 x half> undef)<br>
-; AVX1-NEXT:  Cost Model: Found an estimated cost of 145 for instruction: %v16f16s1 = call <16 x i1> @llvm.fptosi.sat.v16i1.v16f16(<16 x half> undef)<br>
-; AVX1-NEXT:  Cost Model: Found an estimated cost of 127 for instruction: %v16f16u1 = call <16 x i1> @llvm.fptoui.sat.v16i1.v16f16(<16 x half> undef)<br>
-; AVX1-NEXT:  Cost Model: Found an estimated cost of 150 for instruction: %v16f16s8 = call <16 x i8> @llvm.fptosi.sat.v16i8.v16f16(<16 x half> undef)<br>
-; AVX1-NEXT:  Cost Model: Found an estimated cost of 132 for instruction: %v16f16u8 = call <16 x i8> @llvm.fptoui.sat.v16i8.v16f16(<16 x half> undef)<br>
-; AVX1-NEXT:  Cost Model: Found an estimated cost of 151 for instruction: %v16f16s16 = call <16 x i16> @llvm.fptosi.sat.v16i16.v16f16(<16 x half> undef)<br>
-; AVX1-NEXT:  Cost Model: Found an estimated cost of 132 for instruction: %v16f16u16 = call <16 x i16> @llvm.fptoui.sat.v16i16.v16f16(<16 x half> undef)<br>
-; AVX1-NEXT:  Cost Model: Found an estimated cost of 148 for instruction: %v16f16s32 = call <16 x i32> @llvm.fptosi.sat.v16i32.v16f16(<16 x half> undef)<br>
-; AVX1-NEXT:  Cost Model: Found an estimated cost of 126 for instruction: %v16f16u32 = call <16 x i32> @llvm.fptoui.sat.v16i32.v16f16(<16 x half> undef)<br>
-; AVX1-NEXT:  Cost Model: Found an estimated cost of 152 for instruction: %v16f16s64 = call <16 x i64> @llvm.fptosi.sat.v16i64.v16f16(<16 x half> undef)<br>
-; AVX1-NEXT:  Cost Model: Found an estimated cost of 172 for instruction: %v16f16u64 = call <16 x i64> @llvm.fptoui.sat.v16i64.v16f16(<16 x half> undef)<br>
+; AVX1-NEXT:  Cost Model: Found an estimated cost of 5 for instruction: %f16s1 = call i1 @llvm.fptosi.sat.i1.f16(half undef)<br>
+; AVX1-NEXT:  Cost Model: Found an estimated cost of 3 for instruction: %f16u1 = call i1 @llvm.fptoui.sat.i1.f16(half undef)<br>
+; AVX1-NEXT:  Cost Model: Found an estimated cost of 5 for instruction: %f16s8 = call i8 @llvm.fptosi.sat.i8.f16(half undef)<br>
+; AVX1-NEXT:  Cost Model: Found an estimated cost of 3 for instruction: %f16u8 = call i8 @llvm.fptoui.sat.i8.f16(half undef)<br>
+; AVX1-NEXT:  Cost Model: Found an estimated cost of 5 for instruction: %f16s16 = call i16 @llvm.fptosi.sat.i16.f16(half undef)<br>
+; AVX1-NEXT:  Cost Model: Found an estimated cost of 3 for instruction: %f16u16 = call i16 @llvm.fptoui.sat.i16.f16(half undef)<br>
+; AVX1-NEXT:  Cost Model: Found an estimated cost of 5 for instruction: %f16s32 = call i32 @llvm.fptosi.sat.i32.f16(half undef)<br>
+; AVX1-NEXT:  Cost Model: Found an estimated cost of 3 for instruction: %f16u32 = call i32 @llvm.fptoui.sat.i32.f16(half undef)<br>
+; AVX1-NEXT:  Cost Model: Found an estimated cost of 5 for instruction: %f16s64 = call i64 @llvm.fptosi.sat.i64.f16(half undef)<br>
+; AVX1-NEXT:  Cost Model: Found an estimated cost of 3 for instruction: %f16u64 = call i64 @llvm.fptoui.sat.i64.f16(half undef)<br>
+; AVX1-NEXT:  Cost Model: Found an estimated cost of 15 for instruction: %v2f16s1 = call <2 x i1> @llvm.fptosi.sat.v2i1.v2f16(<2 x half> undef)<br>
+; AVX1-NEXT:  Cost Model: Found an estimated cost of 11 for instruction: %v2f16u1 = call <2 x i1> @llvm.fptoui.sat.v2i1.v2f16(<2 x half> undef)<br>
+; AVX1-NEXT:  Cost Model: Found an estimated cost of 17 for instruction: %v2f16s8 = call <2 x i8> @llvm.fptosi.sat.v2i8.v2f16(<2 x half> undef)<br>
+; AVX1-NEXT:  Cost Model: Found an estimated cost of 13 for instruction: %v2f16u8 = call <2 x i8> @llvm.fptoui.sat.v2i8.v2f16(<2 x half> undef)<br>
+; AVX1-NEXT:  Cost Model: Found an estimated cost of 16 for instruction: %v2f16s16 = call <2 x i16> @llvm.fptosi.sat.v2i16.v2f16(<2 x half> undef)<br>
+; AVX1-NEXT:  Cost Model: Found an estimated cost of 12 for instruction: %v2f16u16 = call <2 x i16> @llvm.fptoui.sat.v2i16.v2f16(<2 x half> undef)<br>
+; AVX1-NEXT:  Cost Model: Found an estimated cost of 15 for instruction: %v2f16s32 = call <2 x i32> @llvm.fptosi.sat.v2i32.v2f16(<2 x half> undef)<br>
+; AVX1-NEXT:  Cost Model: Found an estimated cost of 11 for instruction: %v2f16u32 = call <2 x i32> @llvm.fptoui.sat.v2i32.v2f16(<2 x half> undef)<br>
+; AVX1-NEXT:  Cost Model: Found an estimated cost of 15 for instruction: %v2f16s64 = call <2 x i64> @llvm.fptosi.sat.v2i64.v2f16(<2 x half> undef)<br>
+; AVX1-NEXT:  Cost Model: Found an estimated cost of 11 for instruction: %v2f16u64 = call <2 x i64> @llvm.fptoui.sat.v2i64.v2f16(<2 x half> undef)<br>
+; AVX1-NEXT:  Cost Model: Found an estimated cost of 29 for instruction: %v4f16s1 = call <4 x i1> @llvm.fptosi.sat.v4i1.v4f16(<4 x half> undef)<br>
+; AVX1-NEXT:  Cost Model: Found an estimated cost of 23 for instruction: %v4f16u1 = call <4 x i1> @llvm.fptoui.sat.v4i1.v4f16(<4 x half> undef)<br>
+; AVX1-NEXT:  Cost Model: Found an estimated cost of 31 for instruction: %v4f16s8 = call <4 x i8> @llvm.fptosi.sat.v4i8.v4f16(<4 x half> undef)<br>
+; AVX1-NEXT:  Cost Model: Found an estimated cost of 25 for instruction: %v4f16u8 = call <4 x i8> @llvm.fptoui.sat.v4i8.v4f16(<4 x half> undef)<br>
+; AVX1-NEXT:  Cost Model: Found an estimated cost of 31 for instruction: %v4f16s16 = call <4 x i16> @llvm.fptosi.sat.v4i16.v4f16(<4 x half> undef)<br>
+; AVX1-NEXT:  Cost Model: Found an estimated cost of 25 for instruction: %v4f16u16 = call <4 x i16> @llvm.fptoui.sat.v4i16.v4f16(<4 x half> undef)<br>
+; AVX1-NEXT:  Cost Model: Found an estimated cost of 29 for instruction: %v4f16s32 = call <4 x i32> @llvm.fptosi.sat.v4i32.v4f16(<4 x half> undef)<br>
+; AVX1-NEXT:  Cost Model: Found an estimated cost of 23 for instruction: %v4f16u32 = call <4 x i32> @llvm.fptoui.sat.v4i32.v4f16(<4 x half> undef)<br>
+; AVX1-NEXT:  Cost Model: Found an estimated cost of 30 for instruction: %v4f16s64 = call <4 x i64> @llvm.fptosi.sat.v4i64.v4f16(<4 x half> undef)<br>
+; AVX1-NEXT:  Cost Model: Found an estimated cost of 23 for instruction: %v4f16u64 = call <4 x i64> @llvm.fptoui.sat.v4i64.v4f16(<4 x half> undef)<br>
+; AVX1-NEXT:  Cost Model: Found an estimated cost of 57 for instruction: %v8f16s1 = call <8 x i1> @llvm.fptosi.sat.v8i1.v8f16(<8 x half> undef)<br>
+; AVX1-NEXT:  Cost Model: Found an estimated cost of 47 for instruction: %v8f16u1 = call <8 x i1> @llvm.fptoui.sat.v8i1.v8f16(<8 x half> undef)<br>
+; AVX1-NEXT:  Cost Model: Found an estimated cost of 62 for instruction: %v8f16s8 = call <8 x i8> @llvm.fptosi.sat.v8i8.v8f16(<8 x half> undef)<br>
+; AVX1-NEXT:  Cost Model: Found an estimated cost of 52 for instruction: %v8f16u8 = call <8 x i8> @llvm.fptoui.sat.v8i8.v8f16(<8 x half> undef)<br>
+; AVX1-NEXT:  Cost Model: Found an estimated cost of 62 for instruction: %v8f16s16 = call <8 x i16> @llvm.fptosi.sat.v8i16.v8f16(<8 x half> undef)<br>
+; AVX1-NEXT:  Cost Model: Found an estimated cost of 52 for instruction: %v8f16u16 = call <8 x i16> @llvm.fptoui.sat.v8i16.v8f16(<8 x half> undef)<br>
+; AVX1-NEXT:  Cost Model: Found an estimated cost of 58 for instruction: %v8f16s32 = call <8 x i32> @llvm.fptosi.sat.v8i32.v8f16(<8 x half> undef)<br>
+; AVX1-NEXT:  Cost Model: Found an estimated cost of 47 for instruction: %v8f16u32 = call <8 x i32> @llvm.fptoui.sat.v8i32.v8f16(<8 x half> undef)<br>
+; AVX1-NEXT:  Cost Model: Found an estimated cost of 60 for instruction: %v8f16s64 = call <8 x i64> @llvm.fptosi.sat.v8i64.v8f16(<8 x half> undef)<br>
+; AVX1-NEXT:  Cost Model: Found an estimated cost of 46 for instruction: %v8f16u64 = call <8 x i64> @llvm.fptoui.sat.v8i64.v8f16(<8 x half> undef)<br>
+; AVX1-NEXT:  Cost Model: Found an estimated cost of 113 for instruction: %v16f16s1 = call <16 x i1> @llvm.fptosi.sat.v16i1.v16f16(<16 x half> undef)<br>
+; AVX1-NEXT:  Cost Model: Found an estimated cost of 95 for instruction: %v16f16u1 = call <16 x i1> @llvm.fptoui.sat.v16i1.v16f16(<16 x half> undef)<br>
+; AVX1-NEXT:  Cost Model: Found an estimated cost of 118 for instruction: %v16f16s8 = call <16 x i8> @llvm.fptosi.sat.v16i8.v16f16(<16 x half> undef)<br>
+; AVX1-NEXT:  Cost Model: Found an estimated cost of 100 for instruction: %v16f16u8 = call <16 x i8> @llvm.fptoui.sat.v16i8.v16f16(<16 x half> undef)<br>
+; AVX1-NEXT:  Cost Model: Found an estimated cost of 119 for instruction: %v16f16s16 = call <16 x i16> @llvm.fptosi.sat.v16i16.v16f16(<16 x half> undef)<br>
+; AVX1-NEXT:  Cost Model: Found an estimated cost of 100 for instruction: %v16f16u16 = call <16 x i16> @llvm.fptoui.sat.v16i16.v16f16(<16 x half> undef)<br>
+; AVX1-NEXT:  Cost Model: Found an estimated cost of 116 for instruction: %v16f16s32 = call <16 x i32> @llvm.fptosi.sat.v16i32.v16f16(<16 x half> undef)<br>
+; AVX1-NEXT:  Cost Model: Found an estimated cost of 94 for instruction: %v16f16u32 = call <16 x i32> @llvm.fptoui.sat.v16i32.v16f16(<16 x half> undef)<br>
+; AVX1-NEXT:  Cost Model: Found an estimated cost of 120 for instruction: %v16f16s64 = call <16 x i64> @llvm.fptosi.sat.v16i64.v16f16(<16 x half> undef)<br>
+; AVX1-NEXT:  Cost Model: Found an estimated cost of 92 for instruction: %v16f16u64 = call <16 x i64> @llvm.fptoui.sat.v16i64.v16f16(<16 x half> undef)<br>
 ; AVX1-NEXT:  Cost Model: Found an estimated cost of 0 for instruction: ret void<br>
 ;<br>
 ; AVX2-LABEL: 'fp16'<br>
-; AVX2-NEXT:  Cost Model: Found an estimated cost of 9 for instruction: %f16s1 = call i1 @llvm.fptosi.sat.i1.f16(half undef)<br>
-; AVX2-NEXT:  Cost Model: Found an estimated cost of 7 for instruction: %f16u1 = call i1 @llvm.fptoui.sat.i1.f16(half undef)<br>
-; AVX2-NEXT:  Cost Model: Found an estimated cost of 9 for instruction: %f16s8 = call i8 @llvm.fptosi.sat.i8.f16(half undef)<br>
-; AVX2-NEXT:  Cost Model: Found an estimated cost of 7 for instruction: %f16u8 = call i8 @llvm.fptoui.sat.i8.f16(half undef)<br>
-; AVX2-NEXT:  Cost Model: Found an estimated cost of 9 for instruction: %f16s16 = call i16 @llvm.fptosi.sat.i16.f16(half undef)<br>
-; AVX2-NEXT:  Cost Model: Found an estimated cost of 7 for instruction: %f16u16 = call i16 @llvm.fptoui.sat.i16.f16(half undef)<br>
-; AVX2-NEXT:  Cost Model: Found an estimated cost of 9 for instruction: %f16s32 = call i32 @llvm.fptosi.sat.i32.f16(half undef)<br>
-; AVX2-NEXT:  Cost Model: Found an estimated cost of 7 for instruction: %f16u32 = call i32 @llvm.fptoui.sat.i32.f16(half undef)<br>
-; AVX2-NEXT:  Cost Model: Found an estimated cost of 9 for instruction: %f16s64 = call i64 @llvm.fptosi.sat.i64.f16(half undef)<br>
-; AVX2-NEXT:  Cost Model: Found an estimated cost of 9 for instruction: %f16u64 = call i64 @llvm.fptoui.sat.i64.f16(half undef)<br>
-; AVX2-NEXT:  Cost Model: Found an estimated cost of 19 for instruction: %v2f16s1 = call <2 x i1> @llvm.fptosi.sat.v2i1.v2f16(<2 x half> undef)<br>
-; AVX2-NEXT:  Cost Model: Found an estimated cost of 15 for instruction: %v2f16u1 = call <2 x i1> @llvm.fptoui.sat.v2i1.v2f16(<2 x half> undef)<br>
-; AVX2-NEXT:  Cost Model: Found an estimated cost of 20 for instruction: %v2f16s8 = call <2 x i8> @llvm.fptosi.sat.v2i8.v2f16(<2 x half> undef)<br>
-; AVX2-NEXT:  Cost Model: Found an estimated cost of 16 for instruction: %v2f16u8 = call <2 x i8> @llvm.fptoui.sat.v2i8.v2f16(<2 x half> undef)<br>
-; AVX2-NEXT:  Cost Model: Found an estimated cost of 20 for instruction: %v2f16s16 = call <2 x i16> @llvm.fptosi.sat.v2i16.v2f16(<2 x half> undef)<br>
-; AVX2-NEXT:  Cost Model: Found an estimated cost of 16 for instruction: %v2f16u16 = call <2 x i16> @llvm.fptoui.sat.v2i16.v2f16(<2 x half> undef)<br>
-; AVX2-NEXT:  Cost Model: Found an estimated cost of 19 for instruction: %v2f16s32 = call <2 x i32> @llvm.fptosi.sat.v2i32.v2f16(<2 x half> undef)<br>
-; AVX2-NEXT:  Cost Model: Found an estimated cost of 15 for instruction: %v2f16u32 = call <2 x i32> @llvm.fptoui.sat.v2i32.v2f16(<2 x half> undef)<br>
-; AVX2-NEXT:  Cost Model: Found an estimated cost of 19 for instruction: %v2f16s64 = call <2 x i64> @llvm.fptosi.sat.v2i64.v2f16(<2 x half> undef)<br>
-; AVX2-NEXT:  Cost Model: Found an estimated cost of 19 for instruction: %v2f16u64 = call <2 x i64> @llvm.fptoui.sat.v2i64.v2f16(<2 x half> undef)<br>
-; AVX2-NEXT:  Cost Model: Found an estimated cost of 37 for instruction: %v4f16s1 = call <4 x i1> @llvm.fptosi.sat.v4i1.v4f16(<4 x half> undef)<br>
-; AVX2-NEXT:  Cost Model: Found an estimated cost of 31 for instruction: %v4f16u1 = call <4 x i1> @llvm.fptoui.sat.v4i1.v4f16(<4 x half> undef)<br>
-; AVX2-NEXT:  Cost Model: Found an estimated cost of 38 for instruction: %v4f16s8 = call <4 x i8> @llvm.fptosi.sat.v4i8.v4f16(<4 x half> undef)<br>
-; AVX2-NEXT:  Cost Model: Found an estimated cost of 32 for instruction: %v4f16u8 = call <4 x i8> @llvm.fptoui.sat.v4i8.v4f16(<4 x half> undef)<br>
-; AVX2-NEXT:  Cost Model: Found an estimated cost of 38 for instruction: %v4f16s16 = call <4 x i16> @llvm.fptosi.sat.v4i16.v4f16(<4 x half> undef)<br>
-; AVX2-NEXT:  Cost Model: Found an estimated cost of 32 for instruction: %v4f16u16 = call <4 x i16> @llvm.fptoui.sat.v4i16.v4f16(<4 x half> undef)<br>
-; AVX2-NEXT:  Cost Model: Found an estimated cost of 37 for instruction: %v4f16s32 = call <4 x i32> @llvm.fptosi.sat.v4i32.v4f16(<4 x half> undef)<br>
-; AVX2-NEXT:  Cost Model: Found an estimated cost of 31 for instruction: %v4f16u32 = call <4 x i32> @llvm.fptoui.sat.v4i32.v4f16(<4 x half> undef)<br>
-; AVX2-NEXT:  Cost Model: Found an estimated cost of 37 for instruction: %v4f16s64 = call <4 x i64> @llvm.fptosi.sat.v4i64.v4f16(<4 x half> undef)<br>
-; AVX2-NEXT:  Cost Model: Found an estimated cost of 39 for instruction: %v4f16u64 = call <4 x i64> @llvm.fptoui.sat.v4i64.v4f16(<4 x half> undef)<br>
-; AVX2-NEXT:  Cost Model: Found an estimated cost of 73 for instruction: %v8f16s1 = call <8 x i1> @llvm.fptosi.sat.v8i1.v8f16(<8 x half> undef)<br>
-; AVX2-NEXT:  Cost Model: Found an estimated cost of 63 for instruction: %v8f16u1 = call <8 x i1> @llvm.fptoui.sat.v8i1.v8f16(<8 x half> undef)<br>
-; AVX2-NEXT:  Cost Model: Found an estimated cost of 77 for instruction: %v8f16s8 = call <8 x i8> @llvm.fptosi.sat.v8i8.v8f16(<8 x half> undef)<br>
-; AVX2-NEXT:  Cost Model: Found an estimated cost of 67 for instruction: %v8f16u8 = call <8 x i8> @llvm.fptoui.sat.v8i8.v8f16(<8 x half> undef)<br>
-; AVX2-NEXT:  Cost Model: Found an estimated cost of 75 for instruction: %v8f16s16 = call <8 x i16> @llvm.fptosi.sat.v8i16.v8f16(<8 x half> undef)<br>
-; AVX2-NEXT:  Cost Model: Found an estimated cost of 65 for instruction: %v8f16u16 = call <8 x i16> @llvm.fptoui.sat.v8i16.v8f16(<8 x half> undef)<br>
-; AVX2-NEXT:  Cost Model: Found an estimated cost of 73 for instruction: %v8f16s32 = call <8 x i32> @llvm.fptosi.sat.v8i32.v8f16(<8 x half> undef)<br>
-; AVX2-NEXT:  Cost Model: Found an estimated cost of 63 for instruction: %v8f16u32 = call <8 x i32> @llvm.fptoui.sat.v8i32.v8f16(<8 x half> undef)<br>
-; AVX2-NEXT:  Cost Model: Found an estimated cost of 74 for instruction: %v8f16s64 = call <8 x i64> @llvm.fptosi.sat.v8i64.v8f16(<8 x half> undef)<br>
-; AVX2-NEXT:  Cost Model: Found an estimated cost of 78 for instruction: %v8f16u64 = call <8 x i64> @llvm.fptoui.sat.v8i64.v8f16(<8 x half> undef)<br>
-; AVX2-NEXT:  Cost Model: Found an estimated cost of 145 for instruction: %v16f16s1 = call <16 x i1> @llvm.fptosi.sat.v16i1.v16f16(<16 x half> undef)<br>
-; AVX2-NEXT:  Cost Model: Found an estimated cost of 127 for instruction: %v16f16u1 = call <16 x i1> @llvm.fptoui.sat.v16i1.v16f16(<16 x half> undef)<br>
-; AVX2-NEXT:  Cost Model: Found an estimated cost of 148 for instruction: %v16f16s8 = call <16 x i8> @llvm.fptosi.sat.v16i8.v16f16(<16 x half> undef)<br>
-; AVX2-NEXT:  Cost Model: Found an estimated cost of 130 for instruction: %v16f16u8 = call <16 x i8> @llvm.fptoui.sat.v16i8.v16f16(<16 x half> undef)<br>
-; AVX2-NEXT:  Cost Model: Found an estimated cost of 148 for instruction: %v16f16s16 = call <16 x i16> @llvm.fptosi.sat.v16i16.v16f16(<16 x half> undef)<br>
-; AVX2-NEXT:  Cost Model: Found an estimated cost of 130 for instruction: %v16f16u16 = call <16 x i16> @llvm.fptoui.sat.v16i16.v16f16(<16 x half> undef)<br>
-; AVX2-NEXT:  Cost Model: Found an estimated cost of 146 for instruction: %v16f16s32 = call <16 x i32> @llvm.fptosi.sat.v16i32.v16f16(<16 x half> undef)<br>
-; AVX2-NEXT:  Cost Model: Found an estimated cost of 126 for instruction: %v16f16u32 = call <16 x i32> @llvm.fptoui.sat.v16i32.v16f16(<16 x half> undef)<br>
-; AVX2-NEXT:  Cost Model: Found an estimated cost of 148 for instruction: %v16f16s64 = call <16 x i64> @llvm.fptosi.sat.v16i64.v16f16(<16 x half> undef)<br>
-; AVX2-NEXT:  Cost Model: Found an estimated cost of 156 for instruction: %v16f16u64 = call <16 x i64> @llvm.fptoui.sat.v16i64.v16f16(<16 x half> undef)<br>
+; AVX2-NEXT:  Cost Model: Found an estimated cost of 5 for instruction: %f16s1 = call i1 @llvm.fptosi.sat.i1.f16(half undef)<br>
+; AVX2-NEXT:  Cost Model: Found an estimated cost of 3 for instruction: %f16u1 = call i1 @llvm.fptoui.sat.i1.f16(half undef)<br>
+; AVX2-NEXT:  Cost Model: Found an estimated cost of 5 for instruction: %f16s8 = call i8 @llvm.fptosi.sat.i8.f16(half undef)<br>
+; AVX2-NEXT:  Cost Model: Found an estimated cost of 3 for instruction: %f16u8 = call i8 @llvm.fptoui.sat.i8.f16(half undef)<br>
+; AVX2-NEXT:  Cost Model: Found an estimated cost of 5 for instruction: %f16s16 = call i16 @llvm.fptosi.sat.i16.f16(half undef)<br>
+; AVX2-NEXT:  Cost Model: Found an estimated cost of 3 for instruction: %f16u16 = call i16 @llvm.fptoui.sat.i16.f16(half undef)<br>
+; AVX2-NEXT:  Cost Model: Found an estimated cost of 5 for instruction: %f16s32 = call i32 @llvm.fptosi.sat.i32.f16(half undef)<br>
+; AVX2-NEXT:  Cost Model: Found an estimated cost of 3 for instruction: %f16u32 = call i32 @llvm.fptoui.sat.i32.f16(half undef)<br>
+; AVX2-NEXT:  Cost Model: Found an estimated cost of 5 for instruction: %f16s64 = call i64 @llvm.fptosi.sat.i64.f16(half undef)<br>
+; AVX2-NEXT:  Cost Model: Found an estimated cost of 3 for instruction: %f16u64 = call i64 @llvm.fptoui.sat.i64.f16(half undef)<br>
+; AVX2-NEXT:  Cost Model: Found an estimated cost of 15 for instruction: %v2f16s1 = call <2 x i1> @llvm.fptosi.sat.v2i1.v2f16(<2 x half> undef)<br>
+; AVX2-NEXT:  Cost Model: Found an estimated cost of 11 for instruction: %v2f16u1 = call <2 x i1> @llvm.fptoui.sat.v2i1.v2f16(<2 x half> undef)<br>
+; AVX2-NEXT:  Cost Model: Found an estimated cost of 16 for instruction: %v2f16s8 = call <2 x i8> @llvm.fptosi.sat.v2i8.v2f16(<2 x half> undef)<br>
+; AVX2-NEXT:  Cost Model: Found an estimated cost of 12 for instruction: %v2f16u8 = call <2 x i8> @llvm.fptoui.sat.v2i8.v2f16(<2 x half> undef)<br>
+; AVX2-NEXT:  Cost Model: Found an estimated cost of 16 for instruction: %v2f16s16 = call <2 x i16> @llvm.fptosi.sat.v2i16.v2f16(<2 x half> undef)<br>
+; AVX2-NEXT:  Cost Model: Found an estimated cost of 12 for instruction: %v2f16u16 = call <2 x i16> @llvm.fptoui.sat.v2i16.v2f16(<2 x half> undef)<br>
+; AVX2-NEXT:  Cost Model: Found an estimated cost of 15 for instruction: %v2f16s32 = call <2 x i32> @llvm.fptosi.sat.v2i32.v2f16(<2 x half> undef)<br>
+; AVX2-NEXT:  Cost Model: Found an estimated cost of 11 for instruction: %v2f16u32 = call <2 x i32> @llvm.fptoui.sat.v2i32.v2f16(<2 x half> undef)<br>
+; AVX2-NEXT:  Cost Model: Found an estimated cost of 15 for instruction: %v2f16s64 = call <2 x i64> @llvm.fptosi.sat.v2i64.v2f16(<2 x half> undef)<br>
+; AVX2-NEXT:  Cost Model: Found an estimated cost of 11 for instruction: %v2f16u64 = call <2 x i64> @llvm.fptoui.sat.v2i64.v2f16(<2 x half> undef)<br>
+; AVX2-NEXT:  Cost Model: Found an estimated cost of 29 for instruction: %v4f16s1 = call <4 x i1> @llvm.fptosi.sat.v4i1.v4f16(<4 x half> undef)<br>
+; AVX2-NEXT:  Cost Model: Found an estimated cost of 23 for instruction: %v4f16u1 = call <4 x i1> @llvm.fptoui.sat.v4i1.v4f16(<4 x half> undef)<br>
+; AVX2-NEXT:  Cost Model: Found an estimated cost of 30 for instruction: %v4f16s8 = call <4 x i8> @llvm.fptosi.sat.v4i8.v4f16(<4 x half> undef)<br>
+; AVX2-NEXT:  Cost Model: Found an estimated cost of 24 for instruction: %v4f16u8 = call <4 x i8> @llvm.fptoui.sat.v4i8.v4f16(<4 x half> undef)<br>
+; AVX2-NEXT:  Cost Model: Found an estimated cost of 30 for instruction: %v4f16s16 = call <4 x i16> @llvm.fptosi.sat.v4i16.v4f16(<4 x half> undef)<br>
+; AVX2-NEXT:  Cost Model: Found an estimated cost of 24 for instruction: %v4f16u16 = call <4 x i16> @llvm.fptoui.sat.v4i16.v4f16(<4 x half> undef)<br>
+; AVX2-NEXT:  Cost Model: Found an estimated cost of 29 for instruction: %v4f16s32 = call <4 x i32> @llvm.fptosi.sat.v4i32.v4f16(<4 x half> undef)<br>
+; AVX2-NEXT:  Cost Model: Found an estimated cost of 23 for instruction: %v4f16u32 = call <4 x i32> @llvm.fptoui.sat.v4i32.v4f16(<4 x half> undef)<br>
+; AVX2-NEXT:  Cost Model: Found an estimated cost of 29 for instruction: %v4f16s64 = call <4 x i64> @llvm.fptosi.sat.v4i64.v4f16(<4 x half> undef)<br>
+; AVX2-NEXT:  Cost Model: Found an estimated cost of 23 for instruction: %v4f16u64 = call <4 x i64> @llvm.fptoui.sat.v4i64.v4f16(<4 x half> undef)<br>
+; AVX2-NEXT:  Cost Model: Found an estimated cost of 57 for instruction: %v8f16s1 = call <8 x i1> @llvm.fptosi.sat.v8i1.v8f16(<8 x half> undef)<br>
+; AVX2-NEXT:  Cost Model: Found an estimated cost of 47 for instruction: %v8f16u1 = call <8 x i1> @llvm.fptoui.sat.v8i1.v8f16(<8 x half> undef)<br>
+; AVX2-NEXT:  Cost Model: Found an estimated cost of 61 for instruction: %v8f16s8 = call <8 x i8> @llvm.fptosi.sat.v8i8.v8f16(<8 x half> undef)<br>
+; AVX2-NEXT:  Cost Model: Found an estimated cost of 51 for instruction: %v8f16u8 = call <8 x i8> @llvm.fptoui.sat.v8i8.v8f16(<8 x half> undef)<br>
+; AVX2-NEXT:  Cost Model: Found an estimated cost of 59 for instruction: %v8f16s16 = call <8 x i16> @llvm.fptosi.sat.v8i16.v8f16(<8 x half> undef)<br>
+; AVX2-NEXT:  Cost Model: Found an estimated cost of 49 for instruction: %v8f16u16 = call <8 x i16> @llvm.fptoui.sat.v8i16.v8f16(<8 x half> undef)<br>
+; AVX2-NEXT:  Cost Model: Found an estimated cost of 57 for instruction: %v8f16s32 = call <8 x i32> @llvm.fptosi.sat.v8i32.v8f16(<8 x half> undef)<br>
+; AVX2-NEXT:  Cost Model: Found an estimated cost of 47 for instruction: %v8f16u32 = call <8 x i32> @llvm.fptoui.sat.v8i32.v8f16(<8 x half> undef)<br>
+; AVX2-NEXT:  Cost Model: Found an estimated cost of 58 for instruction: %v8f16s64 = call <8 x i64> @llvm.fptosi.sat.v8i64.v8f16(<8 x half> undef)<br>
+; AVX2-NEXT:  Cost Model: Found an estimated cost of 46 for instruction: %v8f16u64 = call <8 x i64> @llvm.fptoui.sat.v8i64.v8f16(<8 x half> undef)<br>
+; AVX2-NEXT:  Cost Model: Found an estimated cost of 113 for instruction: %v16f16s1 = call <16 x i1> @llvm.fptosi.sat.v16i1.v16f16(<16 x half> undef)<br>
+; AVX2-NEXT:  Cost Model: Found an estimated cost of 95 for instruction: %v16f16u1 = call <16 x i1> @llvm.fptoui.sat.v16i1.v16f16(<16 x half> undef)<br>
+; AVX2-NEXT:  Cost Model: Found an estimated cost of 116 for instruction: %v16f16s8 = call <16 x i8> @llvm.fptosi.sat.v16i8.v16f16(<16 x half> undef)<br>
+; AVX2-NEXT:  Cost Model: Found an estimated cost of 98 for instruction: %v16f16u8 = call <16 x i8> @llvm.fptoui.sat.v16i8.v16f16(<16 x half> undef)<br>
+; AVX2-NEXT:  Cost Model: Found an estimated cost of 116 for instruction: %v16f16s16 = call <16 x i16> @llvm.fptosi.sat.v16i16.v16f16(<16 x half> undef)<br>
+; AVX2-NEXT:  Cost Model: Found an estimated cost of 98 for instruction: %v16f16u16 = call <16 x i16> @llvm.fptoui.sat.v16i16.v16f16(<16 x half> undef)<br>
+; AVX2-NEXT:  Cost Model: Found an estimated cost of 114 for instruction: %v16f16s32 = call <16 x i32> @llvm.fptosi.sat.v16i32.v16f16(<16 x half> undef)<br>
+; AVX2-NEXT:  Cost Model: Found an estimated cost of 94 for instruction: %v16f16u32 = call <16 x i32> @llvm.fptoui.sat.v16i32.v16f16(<16 x half> undef)<br>
+; AVX2-NEXT:  Cost Model: Found an estimated cost of 116 for instruction: %v16f16s64 = call <16 x i64> @llvm.fptosi.sat.v16i64.v16f16(<16 x half> undef)<br>
+; AVX2-NEXT:  Cost Model: Found an estimated cost of 92 for instruction: %v16f16u64 = call <16 x i64> @llvm.fptoui.sat.v16i64.v16f16(<16 x half> undef)<br>
 ; AVX2-NEXT:  Cost Model: Found an estimated cost of 0 for instruction: ret void<br>
 ;<br>
 ; AVX512-LABEL: 'fp16'<br>
-; AVX512-NEXT:  Cost Model: Found an estimated cost of 7 for instruction: %f16s1 = call i1 @llvm.fptosi.sat.i1.f16(half undef)<br>
-; AVX512-NEXT:  Cost Model: Found an estimated cost of 5 for instruction: %f16u1 = call i1 @llvm.fptoui.sat.i1.f16(half undef)<br>
-; AVX512-NEXT:  Cost Model: Found an estimated cost of 7 for instruction: %f16s8 = call i8 @llvm.fptosi.sat.i8.f16(half undef)<br>
-; AVX512-NEXT:  Cost Model: Found an estimated cost of 5 for instruction: %f16u8 = call i8 @llvm.fptoui.sat.i8.f16(half undef)<br>
-; AVX512-NEXT:  Cost Model: Found an estimated cost of 7 for instruction: %f16s16 = call i16 @llvm.fptosi.sat.i16.f16(half undef)<br>
-; AVX512-NEXT:  Cost Model: Found an estimated cost of 5 for instruction: %f16u16 = call i16 @llvm.fptoui.sat.i16.f16(half undef)<br>
-; AVX512-NEXT:  Cost Model: Found an estimated cost of 7 for instruction: %f16s32 = call i32 @llvm.fptosi.sat.i32.f16(half undef)<br>
-; AVX512-NEXT:  Cost Model: Found an estimated cost of 5 for instruction: %f16u32 = call i32 @llvm.fptoui.sat.i32.f16(half undef)<br>
-; AVX512-NEXT:  Cost Model: Found an estimated cost of 7 for instruction: %f16s64 = call i64 @llvm.fptosi.sat.i64.f16(half undef)<br>
-; AVX512-NEXT:  Cost Model: Found an estimated cost of 5 for instruction: %f16u64 = call i64 @llvm.fptoui.sat.i64.f16(half undef)<br>
+; AVX512-NEXT:  Cost Model: Found an estimated cost of 5 for instruction: %f16s1 = call i1 @llvm.fptosi.sat.i1.f16(half undef)<br>
+; AVX512-NEXT:  Cost Model: Found an estimated cost of 3 for instruction: %f16u1 = call i1 @llvm.fptoui.sat.i1.f16(half undef)<br>
+; AVX512-NEXT:  Cost Model: Found an estimated cost of 5 for instruction: %f16s8 = call i8 @llvm.fptosi.sat.i8.f16(half undef)<br>
+; AVX512-NEXT:  Cost Model: Found an estimated cost of 3 for instruction: %f16u8 = call i8 @llvm.fptoui.sat.i8.f16(half undef)<br>
+; AVX512-NEXT:  Cost Model: Found an estimated cost of 5 for instruction: %f16s16 = call i16 @llvm.fptosi.sat.i16.f16(half undef)<br>
+; AVX512-NEXT:  Cost Model: Found an estimated cost of 3 for instruction: %f16u16 = call i16 @llvm.fptoui.sat.i16.f16(half undef)<br>
+; AVX512-NEXT:  Cost Model: Found an estimated cost of 5 for instruction: %f16s32 = call i32 @llvm.fptosi.sat.i32.f16(half undef)<br>
+; AVX512-NEXT:  Cost Model: Found an estimated cost of 3 for instruction: %f16u32 = call i32 @llvm.fptoui.sat.i32.f16(half undef)<br>
+; AVX512-NEXT:  Cost Model: Found an estimated cost of 5 for instruction: %f16s64 = call i64 @llvm.fptosi.sat.i64.f16(half undef)<br>
+; AVX512-NEXT:  Cost Model: Found an estimated cost of 3 for instruction: %f16u64 = call i64 @llvm.fptoui.sat.i64.f16(half undef)<br>
 ; AVX512-NEXT:  Cost Model: Found an estimated cost of 21 for instruction: %v2f16s1 = call <2 x i1> @llvm.fptosi.sat.v2i1.v2f16(<2 x half> undef)<br>
 ; AVX512-NEXT:  Cost Model: Found an estimated cost of 15 for instruction: %v2f16u1 = call <2 x i1> @llvm.fptoui.sat.v2i1.v2f16(<2 x half> undef)<br>
 ; AVX512-NEXT:  Cost Model: Found an estimated cost of 16 for instruction: %v2f16s8 = call <2 x i8> @llvm.fptosi.sat.v2i8.v2f16(<2 x half> undef)<br>
@@ -1112,56 +1112,56 @@ define void @fp16() {<br>
 ; AVX512-NEXT:  Cost Model: Found an estimated cost of 0 for instruction: ret void<br>
 ;<br>
 ; SLM-LABEL: 'fp16'<br>
-; SLM-NEXT:  Cost Model: Found an estimated cost of 11 for instruction: %f16s1 = call i1 @llvm.fptosi.sat.i1.f16(half undef)<br>
-; SLM-NEXT:  Cost Model: Found an estimated cost of 9 for instruction: %f16u1 = call i1 @llvm.fptoui.sat.i1.f16(half undef)<br>
-; SLM-NEXT:  Cost Model: Found an estimated cost of 11 for instruction: %f16s8 = call i8 @llvm.fptosi.sat.i8.f16(half undef)<br>
-; SLM-NEXT:  Cost Model: Found an estimated cost of 9 for instruction: %f16u8 = call i8 @llvm.fptoui.sat.i8.f16(half undef)<br>
-; SLM-NEXT:  Cost Model: Found an estimated cost of 11 for instruction: %f16s16 = call i16 @llvm.fptosi.sat.i16.f16(half undef)<br>
-; SLM-NEXT:  Cost Model: Found an estimated cost of 9 for instruction: %f16u16 = call i16 @llvm.fptoui.sat.i16.f16(half undef)<br>
-; SLM-NEXT:  Cost Model: Found an estimated cost of 11 for instruction: %f16s32 = call i32 @llvm.fptosi.sat.i32.f16(half undef)<br>
-; SLM-NEXT:  Cost Model: Found an estimated cost of 9 for instruction: %f16u32 = call i32 @llvm.fptoui.sat.i32.f16(half undef)<br>
-; SLM-NEXT:  Cost Model: Found an estimated cost of 11 for instruction: %f16s64 = call i64 @llvm.fptosi.sat.i64.f16(half undef)<br>
-; SLM-NEXT:  Cost Model: Found an estimated cost of 12 for instruction: %f16u64 = call i64 @llvm.fptoui.sat.i64.f16(half undef)<br>
-; SLM-NEXT:  Cost Model: Found an estimated cost of 23 for instruction: %v2f16s1 = call <2 x i1> @llvm.fptosi.sat.v2i1.v2f16(<2 x half> undef)<br>
-; SLM-NEXT:  Cost Model: Found an estimated cost of 19 for instruction: %v2f16u1 = call <2 x i1> @llvm.fptoui.sat.v2i1.v2f16(<2 x half> undef)<br>
-; SLM-NEXT:  Cost Model: Found an estimated cost of 25 for instruction: %v2f16s8 = call <2 x i8> @llvm.fptosi.sat.v2i8.v2f16(<2 x half> undef)<br>
-; SLM-NEXT:  Cost Model: Found an estimated cost of 21 for instruction: %v2f16u8 = call <2 x i8> @llvm.fptoui.sat.v2i8.v2f16(<2 x half> undef)<br>
-; SLM-NEXT:  Cost Model: Found an estimated cost of 24 for instruction: %v2f16s16 = call <2 x i16> @llvm.fptosi.sat.v2i16.v2f16(<2 x half> undef)<br>
-; SLM-NEXT:  Cost Model: Found an estimated cost of 20 for instruction: %v2f16u16 = call <2 x i16> @llvm.fptoui.sat.v2i16.v2f16(<2 x half> undef)<br>
-; SLM-NEXT:  Cost Model: Found an estimated cost of 23 for instruction: %v2f16s32 = call <2 x i32> @llvm.fptosi.sat.v2i32.v2f16(<2 x half> undef)<br>
-; SLM-NEXT:  Cost Model: Found an estimated cost of 19 for instruction: %v2f16u32 = call <2 x i32> @llvm.fptoui.sat.v2i32.v2f16(<2 x half> undef)<br>
-; SLM-NEXT:  Cost Model: Found an estimated cost of 23 for instruction: %v2f16s64 = call <2 x i64> @llvm.fptosi.sat.v2i64.v2f16(<2 x half> undef)<br>
-; SLM-NEXT:  Cost Model: Found an estimated cost of 25 for instruction: %v2f16u64 = call <2 x i64> @llvm.fptoui.sat.v2i64.v2f16(<2 x half> undef)<br>
-; SLM-NEXT:  Cost Model: Found an estimated cost of 45 for instruction: %v4f16s1 = call <4 x i1> @llvm.fptosi.sat.v4i1.v4f16(<4 x half> undef)<br>
-; SLM-NEXT:  Cost Model: Found an estimated cost of 39 for instruction: %v4f16u1 = call <4 x i1> @llvm.fptoui.sat.v4i1.v4f16(<4 x half> undef)<br>
-; SLM-NEXT:  Cost Model: Found an estimated cost of 47 for instruction: %v4f16s8 = call <4 x i8> @llvm.fptosi.sat.v4i8.v4f16(<4 x half> undef)<br>
-; SLM-NEXT:  Cost Model: Found an estimated cost of 41 for instruction: %v4f16u8 = call <4 x i8> @llvm.fptoui.sat.v4i8.v4f16(<4 x half> undef)<br>
-; SLM-NEXT:  Cost Model: Found an estimated cost of 47 for instruction: %v4f16s16 = call <4 x i16> @llvm.fptosi.sat.v4i16.v4f16(<4 x half> undef)<br>
-; SLM-NEXT:  Cost Model: Found an estimated cost of 41 for instruction: %v4f16u16 = call <4 x i16> @llvm.fptoui.sat.v4i16.v4f16(<4 x half> undef)<br>
-; SLM-NEXT:  Cost Model: Found an estimated cost of 45 for instruction: %v4f16s32 = call <4 x i32> @llvm.fptosi.sat.v4i32.v4f16(<4 x half> undef)<br>
-; SLM-NEXT:  Cost Model: Found an estimated cost of 39 for instruction: %v4f16u32 = call <4 x i32> @llvm.fptoui.sat.v4i32.v4f16(<4 x half> undef)<br>
-; SLM-NEXT:  Cost Model: Found an estimated cost of 46 for instruction: %v4f16s64 = call <4 x i64> @llvm.fptosi.sat.v4i64.v4f16(<4 x half> undef)<br>
-; SLM-NEXT:  Cost Model: Found an estimated cost of 50 for instruction: %v4f16u64 = call <4 x i64> @llvm.fptoui.sat.v4i64.v4f16(<4 x half> undef)<br>
-; SLM-NEXT:  Cost Model: Found an estimated cost of 89 for instruction: %v8f16s1 = call <8 x i1> @llvm.fptosi.sat.v8i1.v8f16(<8 x half> undef)<br>
-; SLM-NEXT:  Cost Model: Found an estimated cost of 79 for instruction: %v8f16u1 = call <8 x i1> @llvm.fptoui.sat.v8i1.v8f16(<8 x half> undef)<br>
-; SLM-NEXT:  Cost Model: Found an estimated cost of 92 for instruction: %v8f16s8 = call <8 x i8> @llvm.fptosi.sat.v8i8.v8f16(<8 x half> undef)<br>
-; SLM-NEXT:  Cost Model: Found an estimated cost of 82 for instruction: %v8f16u8 = call <8 x i8> @llvm.fptoui.sat.v8i8.v8f16(<8 x half> undef)<br>
-; SLM-NEXT:  Cost Model: Found an estimated cost of 93 for instruction: %v8f16s16 = call <8 x i16> @llvm.fptosi.sat.v8i16.v8f16(<8 x half> undef)<br>
-; SLM-NEXT:  Cost Model: Found an estimated cost of 83 for instruction: %v8f16u16 = call <8 x i16> @llvm.fptoui.sat.v8i16.v8f16(<8 x half> undef)<br>
-; SLM-NEXT:  Cost Model: Found an estimated cost of 90 for instruction: %v8f16s32 = call <8 x i32> @llvm.fptosi.sat.v8i32.v8f16(<8 x half> undef)<br>
-; SLM-NEXT:  Cost Model: Found an estimated cost of 78 for instruction: %v8f16u32 = call <8 x i32> @llvm.fptoui.sat.v8i32.v8f16(<8 x half> undef)<br>
-; SLM-NEXT:  Cost Model: Found an estimated cost of 92 for instruction: %v8f16s64 = call <8 x i64> @llvm.fptosi.sat.v8i64.v8f16(<8 x half> undef)<br>
-; SLM-NEXT:  Cost Model: Found an estimated cost of 100 for instruction: %v8f16u64 = call <8 x i64> @llvm.fptoui.sat.v8i64.v8f16(<8 x half> undef)<br>
-; SLM-NEXT:  Cost Model: Found an estimated cost of 177 for instruction: %v16f16s1 = call <16 x i1> @llvm.fptosi.sat.v16i1.v16f16(<16 x half> undef)<br>
-; SLM-NEXT:  Cost Model: Found an estimated cost of 159 for instruction: %v16f16u1 = call <16 x i1> @llvm.fptoui.sat.v16i1.v16f16(<16 x half> undef)<br>
-; SLM-NEXT:  Cost Model: Found an estimated cost of 181 for instruction: %v16f16s8 = call <16 x i8> @llvm.fptosi.sat.v16i8.v16f16(<16 x half> undef)<br>
-; SLM-NEXT:  Cost Model: Found an estimated cost of 163 for instruction: %v16f16u8 = call <16 x i8> @llvm.fptoui.sat.v16i8.v16f16(<16 x half> undef)<br>
-; SLM-NEXT:  Cost Model: Found an estimated cost of 186 for instruction: %v16f16s16 = call <16 x i16> @llvm.fptosi.sat.v16i16.v16f16(<16 x half> undef)<br>
-; SLM-NEXT:  Cost Model: Found an estimated cost of 166 for instruction: %v16f16u16 = call <16 x i16> @llvm.fptoui.sat.v16i16.v16f16(<16 x half> undef)<br>
-; SLM-NEXT:  Cost Model: Found an estimated cost of 180 for instruction: %v16f16s32 = call <16 x i32> @llvm.fptosi.sat.v16i32.v16f16(<16 x half> undef)<br>
-; SLM-NEXT:  Cost Model: Found an estimated cost of 156 for instruction: %v16f16u32 = call <16 x i32> @llvm.fptoui.sat.v16i32.v16f16(<16 x half> undef)<br>
-; SLM-NEXT:  Cost Model: Found an estimated cost of 184 for instruction: %v16f16s64 = call <16 x i64> @llvm.fptosi.sat.v16i64.v16f16(<16 x half> undef)<br>
-; SLM-NEXT:  Cost Model: Found an estimated cost of 200 for instruction: %v16f16u64 = call <16 x i64> @llvm.fptoui.sat.v16i64.v16f16(<16 x half> undef)<br>
+; SLM-NEXT:  Cost Model: Found an estimated cost of 5 for instruction: %f16s1 = call i1 @llvm.fptosi.sat.i1.f16(half undef)<br>
+; SLM-NEXT:  Cost Model: Found an estimated cost of 3 for instruction: %f16u1 = call i1 @llvm.fptoui.sat.i1.f16(half undef)<br>
+; SLM-NEXT:  Cost Model: Found an estimated cost of 5 for instruction: %f16s8 = call i8 @llvm.fptosi.sat.i8.f16(half undef)<br>
+; SLM-NEXT:  Cost Model: Found an estimated cost of 3 for instruction: %f16u8 = call i8 @llvm.fptoui.sat.i8.f16(half undef)<br>
+; SLM-NEXT:  Cost Model: Found an estimated cost of 5 for instruction: %f16s16 = call i16 @llvm.fptosi.sat.i16.f16(half undef)<br>
+; SLM-NEXT:  Cost Model: Found an estimated cost of 3 for instruction: %f16u16 = call i16 @llvm.fptoui.sat.i16.f16(half undef)<br>
+; SLM-NEXT:  Cost Model: Found an estimated cost of 5 for instruction: %f16s32 = call i32 @llvm.fptosi.sat.i32.f16(half undef)<br>
+; SLM-NEXT:  Cost Model: Found an estimated cost of 3 for instruction: %f16u32 = call i32 @llvm.fptoui.sat.i32.f16(half undef)<br>
+; SLM-NEXT:  Cost Model: Found an estimated cost of 5 for instruction: %f16s64 = call i64 @llvm.fptosi.sat.i64.f16(half undef)<br>
+; SLM-NEXT:  Cost Model: Found an estimated cost of 3 for instruction: %f16u64 = call i64 @llvm.fptoui.sat.i64.f16(half undef)<br>
+; SLM-NEXT:  Cost Model: Found an estimated cost of 15 for instruction: %v2f16s1 = call <2 x i1> @llvm.fptosi.sat.v2i1.v2f16(<2 x half> undef)<br>
+; SLM-NEXT:  Cost Model: Found an estimated cost of 11 for instruction: %v2f16u1 = call <2 x i1> @llvm.fptoui.sat.v2i1.v2f16(<2 x half> undef)<br>
+; SLM-NEXT:  Cost Model: Found an estimated cost of 17 for instruction: %v2f16s8 = call <2 x i8> @llvm.fptosi.sat.v2i8.v2f16(<2 x half> undef)<br>
+; SLM-NEXT:  Cost Model: Found an estimated cost of 13 for instruction: %v2f16u8 = call <2 x i8> @llvm.fptoui.sat.v2i8.v2f16(<2 x half> undef)<br>
+; SLM-NEXT:  Cost Model: Found an estimated cost of 16 for instruction: %v2f16s16 = call <2 x i16> @llvm.fptosi.sat.v2i16.v2f16(<2 x half> undef)<br>
+; SLM-NEXT:  Cost Model: Found an estimated cost of 12 for instruction: %v2f16u16 = call <2 x i16> @llvm.fptoui.sat.v2i16.v2f16(<2 x half> undef)<br>
+; SLM-NEXT:  Cost Model: Found an estimated cost of 15 for instruction: %v2f16s32 = call <2 x i32> @llvm.fptosi.sat.v2i32.v2f16(<2 x half> undef)<br>
+; SLM-NEXT:  Cost Model: Found an estimated cost of 11 for instruction: %v2f16u32 = call <2 x i32> @llvm.fptoui.sat.v2i32.v2f16(<2 x half> undef)<br>
+; SLM-NEXT:  Cost Model: Found an estimated cost of 15 for instruction: %v2f16s64 = call <2 x i64> @llvm.fptosi.sat.v2i64.v2f16(<2 x half> undef)<br>
+; SLM-NEXT:  Cost Model: Found an estimated cost of 11 for instruction: %v2f16u64 = call <2 x i64> @llvm.fptoui.sat.v2i64.v2f16(<2 x half> undef)<br>
+; SLM-NEXT:  Cost Model: Found an estimated cost of 29 for instruction: %v4f16s1 = call <4 x i1> @llvm.fptosi.sat.v4i1.v4f16(<4 x half> undef)<br>
+; SLM-NEXT:  Cost Model: Found an estimated cost of 23 for instruction: %v4f16u1 = call <4 x i1> @llvm.fptoui.sat.v4i1.v4f16(<4 x half> undef)<br>
+; SLM-NEXT:  Cost Model: Found an estimated cost of 31 for instruction: %v4f16s8 = call <4 x i8> @llvm.fptosi.sat.v4i8.v4f16(<4 x half> undef)<br>
+; SLM-NEXT:  Cost Model: Found an estimated cost of 25 for instruction: %v4f16u8 = call <4 x i8> @llvm.fptoui.sat.v4i8.v4f16(<4 x half> undef)<br>
+; SLM-NEXT:  Cost Model: Found an estimated cost of 31 for instruction: %v4f16s16 = call <4 x i16> @llvm.fptosi.sat.v4i16.v4f16(<4 x half> undef)<br>
+; SLM-NEXT:  Cost Model: Found an estimated cost of 25 for instruction: %v4f16u16 = call <4 x i16> @llvm.fptoui.sat.v4i16.v4f16(<4 x half> undef)<br>
+; SLM-NEXT:  Cost Model: Found an estimated cost of 29 for instruction: %v4f16s32 = call <4 x i32> @llvm.fptosi.sat.v4i32.v4f16(<4 x half> undef)<br>
+; SLM-NEXT:  Cost Model: Found an estimated cost of 23 for instruction: %v4f16u32 = call <4 x i32> @llvm.fptoui.sat.v4i32.v4f16(<4 x half> undef)<br>
+; SLM-NEXT:  Cost Model: Found an estimated cost of 30 for instruction: %v4f16s64 = call <4 x i64> @llvm.fptosi.sat.v4i64.v4f16(<4 x half> undef)<br>
+; SLM-NEXT:  Cost Model: Found an estimated cost of 22 for instruction: %v4f16u64 = call <4 x i64> @llvm.fptoui.sat.v4i64.v4f16(<4 x half> undef)<br>
+; SLM-NEXT:  Cost Model: Found an estimated cost of 57 for instruction: %v8f16s1 = call <8 x i1> @llvm.fptosi.sat.v8i1.v8f16(<8 x half> undef)<br>
+; SLM-NEXT:  Cost Model: Found an estimated cost of 47 for instruction: %v8f16u1 = call <8 x i1> @llvm.fptoui.sat.v8i1.v8f16(<8 x half> undef)<br>
+; SLM-NEXT:  Cost Model: Found an estimated cost of 60 for instruction: %v8f16s8 = call <8 x i8> @llvm.fptosi.sat.v8i8.v8f16(<8 x half> undef)<br>
+; SLM-NEXT:  Cost Model: Found an estimated cost of 50 for instruction: %v8f16u8 = call <8 x i8> @llvm.fptoui.sat.v8i8.v8f16(<8 x half> undef)<br>
+; SLM-NEXT:  Cost Model: Found an estimated cost of 61 for instruction: %v8f16s16 = call <8 x i16> @llvm.fptosi.sat.v8i16.v8f16(<8 x half> undef)<br>
+; SLM-NEXT:  Cost Model: Found an estimated cost of 51 for instruction: %v8f16u16 = call <8 x i16> @llvm.fptoui.sat.v8i16.v8f16(<8 x half> undef)<br>
+; SLM-NEXT:  Cost Model: Found an estimated cost of 58 for instruction: %v8f16s32 = call <8 x i32> @llvm.fptosi.sat.v8i32.v8f16(<8 x half> undef)<br>
+; SLM-NEXT:  Cost Model: Found an estimated cost of 46 for instruction: %v8f16u32 = call <8 x i32> @llvm.fptoui.sat.v8i32.v8f16(<8 x half> undef)<br>
+; SLM-NEXT:  Cost Model: Found an estimated cost of 60 for instruction: %v8f16s64 = call <8 x i64> @llvm.fptosi.sat.v8i64.v8f16(<8 x half> undef)<br>
+; SLM-NEXT:  Cost Model: Found an estimated cost of 44 for instruction: %v8f16u64 = call <8 x i64> @llvm.fptoui.sat.v8i64.v8f16(<8 x half> undef)<br>
+; SLM-NEXT:  Cost Model: Found an estimated cost of 113 for instruction: %v16f16s1 = call <16 x i1> @llvm.fptosi.sat.v16i1.v16f16(<16 x half> undef)<br>
+; SLM-NEXT:  Cost Model: Found an estimated cost of 95 for instruction: %v16f16u1 = call <16 x i1> @llvm.fptoui.sat.v16i1.v16f16(<16 x half> undef)<br>
+; SLM-NEXT:  Cost Model: Found an estimated cost of 117 for instruction: %v16f16s8 = call <16 x i8> @llvm.fptosi.sat.v16i8.v16f16(<16 x half> undef)<br>
+; SLM-NEXT:  Cost Model: Found an estimated cost of 99 for instruction: %v16f16u8 = call <16 x i8> @llvm.fptoui.sat.v16i8.v16f16(<16 x half> undef)<br>
+; SLM-NEXT:  Cost Model: Found an estimated cost of 122 for instruction: %v16f16s16 = call <16 x i16> @llvm.fptosi.sat.v16i16.v16f16(<16 x half> undef)<br>
+; SLM-NEXT:  Cost Model: Found an estimated cost of 102 for instruction: %v16f16u16 = call <16 x i16> @llvm.fptoui.sat.v16i16.v16f16(<16 x half> undef)<br>
+; SLM-NEXT:  Cost Model: Found an estimated cost of 116 for instruction: %v16f16s32 = call <16 x i32> @llvm.fptosi.sat.v16i32.v16f16(<16 x half> undef)<br>
+; SLM-NEXT:  Cost Model: Found an estimated cost of 92 for instruction: %v16f16u32 = call <16 x i32> @llvm.fptoui.sat.v16i32.v16f16(<16 x half> undef)<br>
+; SLM-NEXT:  Cost Model: Found an estimated cost of 120 for instruction: %v16f16s64 = call <16 x i64> @llvm.fptosi.sat.v16i64.v16f16(<16 x half> undef)<br>
+; SLM-NEXT:  Cost Model: Found an estimated cost of 88 for instruction: %v16f16u64 = call <16 x i64> @llvm.fptoui.sat.v16i64.v16f16(<16 x half> undef)<br>
 ; SLM-NEXT:  Cost Model: Found an estimated cost of 0 for instruction: ret void<br>
 ;<br>
   %f16s1 = call i1 @llvm.fptosi.sat.i1.f16(half undef)<br>
<br>
diff  --git a/llvm/test/CodeGen/MIR/X86/inline-asm-registers.mir b/llvm/test/CodeGen/MIR/X86/inline-asm-registers.mir<br>
index 44705cbcfac48..0202103c8ff4d 100644<br>
--- a/llvm/test/CodeGen/MIR/X86/inline-asm-registers.mir<br>
+++ b/llvm/test/CodeGen/MIR/X86/inline-asm-registers.mir<br>
@@ -28,8 +28,8 @@ body: |<br>
     liveins: $rdi, $rsi<br>
<br>
   ; CHECK-LABEL: name: test<br>
-  ; CHECK: INLINEASM &foo, 0 /* attdialect */, 4390922 /* regdef:GR64 */, def $rsi, 4390922 /* regdef:GR64 */, def dead $rdi,<br>
-    INLINEASM &foo, 0, 4390922, def $rsi, 4390922, def dead $rdi, 2147549193, killed $rdi, 2147483657, killed $rsi, 12, implicit-def dead early-clobber $eflags<br>
+  ; CHECK: INLINEASM &foo, 0 /* attdialect */, 4456458 /* regdef:GR64 */, def $rsi, 4456458 /* regdef:GR64 */, def dead $rdi,<br>
+    INLINEASM &foo, 0, 4456458, def $rsi, 4456458, def dead $rdi, 2147549193, killed $rdi, 2147483657, killed $rsi, 12, implicit-def dead early-clobber $eflags<br>
     $rax = MOV64rr killed $rsi<br>
     RET64 killed $rax<br>
 ...<br>
@@ -45,8 +45,8 @@ body: |<br>
<br>
   ; Verify that the register ties are preserved.<br>
   ; CHECK-LABEL: name: test2<br>
-  ; CHECK: INLINEASM &foo, 0 /* attdialect */, 4390922 /* regdef:GR64 */, def $rsi, 4390922 /* regdef:GR64 */, def dead $rdi, 2147549193 /* reguse tiedto:$1 */, killed $rdi(tied-def 5), 2147483657 /* reguse tiedto:$0 */, killed $rsi(tied-def 3), 12 /* clobber
 */, implicit-def dead early-clobber $eflags<br>
-    INLINEASM &foo, 0, 4390922, def $rsi, 4390922, def dead $rdi, 2147549193, killed $rdi(tied-def 5), 2147483657, killed $rsi(tied-def 3), 12, implicit-def dead early-clobber $eflags<br>
+  ; CHECK: INLINEASM &foo, 0 /* attdialect */, 4456458 /* regdef:GR64 */, def $rsi, 4456458 /* regdef:GR64 */, def dead $rdi, 2147549193 /* reguse tiedto:$1 */, killed $rdi(tied-def 5), 2147483657 /* reguse tiedto:$0 */, killed $rsi(tied-def 3), 12 /* clobber
 */, implicit-def dead early-clobber $eflags<br>
+    INLINEASM &foo, 0, 4456458, def $rsi, 4456458, def dead $rdi, 2147549193, killed $rdi(tied-def 5), 2147483657, killed $rsi(tied-def 3), 12, implicit-def dead early-clobber $eflags<br>
     $rax = MOV64rr killed $rsi<br>
     RET64 killed $rax<br>
 ...<br>
<br>
diff  --git a/llvm/test/CodeGen/X86/atomic-non-integer.ll b/llvm/test/CodeGen/X86/atomic-non-integer.ll<br>
index a320a551ffa27..fa0f65c4a8ae0 100644<br>
--- a/llvm/test/CodeGen/X86/atomic-non-integer.ll<br>
+++ b/llvm/test/CodeGen/X86/atomic-non-integer.ll<br>
@@ -4,9 +4,9 @@<br>
 ; RUN: llc < %s -mtriple=i386-linux-generic -verify-machineinstrs -mattr=avx | FileCheck %s --check-prefixes=X86,X86-AVX<br>
 ; RUN: llc < %s -mtriple=i386-linux-generic -verify-machineinstrs -mattr=avx512f | FileCheck %s --check-prefixes=X86,X86-AVX<br>
 ; RUN: llc < %s -mtriple=i386-linux-generic -verify-machineinstrs | FileCheck %s --check-prefixes=X86,X86-NOSSE<br>
-; RUN: llc < %s -mtriple=x86_64-linux-generic -verify-machineinstrs -mattr=sse2 | FileCheck %s --check-prefixes=X64,X64-SSE<br>
-; RUN: llc < %s -mtriple=x86_64-linux-generic -verify-machineinstrs -mattr=avx | FileCheck %s --check-prefixes=X64,X64-AVX<br>
-; RUN: llc < %s -mtriple=x86_64-linux-generic -verify-machineinstrs -mattr=avx512f | FileCheck %s --check-prefixes=X64,X64-AVX<br>
+; RUN: llc < %s -mtriple=x86_64-linux-generic -verify-machineinstrs -mattr=sse2 | FileCheck %s --check-prefixes=X64-SSE<br>
+; RUN: llc < %s -mtriple=x86_64-linux-generic -verify-machineinstrs -mattr=avx | FileCheck %s --check-prefixes=X64-AVX<br>
+; RUN: llc < %s -mtriple=x86_64-linux-generic -verify-machineinstrs -mattr=avx512f | FileCheck %s --check-prefixes=X64-AVX<br>
<br>
 ; Note: This test is testing that the lowering for atomics matches what we<br>
 ; currently emit for non-atomics + the atomic restriction.  The presence of<br>
@@ -16,17 +16,45 @@<br>
 ;  and their calling convention which remain unresolved.)<br>
<br>
 define void @store_half(half* %fptr, half %v) {<br>
-; X86-LABEL: store_half:<br>
-; X86:       # %bb.0:<br>
-; X86-NEXT:    movzwl {{[0-9]+}}(%esp), %eax<br>
-; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx<br>
-; X86-NEXT:    movw %ax, (%ecx)<br>
-; X86-NEXT:    retl<br>
+; X86-SSE1-LABEL: store_half:<br>
+; X86-SSE1:       # %bb.0:<br>
+; X86-SSE1-NEXT:    movzwl {{[0-9]+}}(%esp), %eax<br>
+; X86-SSE1-NEXT:    movl {{[0-9]+}}(%esp), %ecx<br>
+; X86-SSE1-NEXT:    movw %ax, (%ecx)<br>
+; X86-SSE1-NEXT:    retl<br>
+;<br>
+; X86-SSE2-LABEL: store_half:<br>
+; X86-SSE2:       # %bb.0:<br>
+; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax<br>
+; X86-SSE2-NEXT:    movzwl {{[0-9]+}}(%esp), %ecx<br>
+; X86-SSE2-NEXT:    movw %cx, (%eax)<br>
+; X86-SSE2-NEXT:    retl<br>
 ;<br>
-; X64-LABEL: store_half:<br>
-; X64:       # %bb.0:<br>
-; X64-NEXT:    movw %si, (%rdi)<br>
-; X64-NEXT:    retq<br>
+; X86-AVX-LABEL: store_half:<br>
+; X86-AVX:       # %bb.0:<br>
+; X86-AVX-NEXT:    movl {{[0-9]+}}(%esp), %eax<br>
+; X86-AVX-NEXT:    movzwl {{[0-9]+}}(%esp), %ecx<br>
+; X86-AVX-NEXT:    movw %cx, (%eax)<br>
+; X86-AVX-NEXT:    retl<br>
+;<br>
+; X86-NOSSE-LABEL: store_half:<br>
+; X86-NOSSE:       # %bb.0:<br>
+; X86-NOSSE-NEXT:    movzwl {{[0-9]+}}(%esp), %eax<br>
+; X86-NOSSE-NEXT:    movl {{[0-9]+}}(%esp), %ecx<br>
+; X86-NOSSE-NEXT:    movw %ax, (%ecx)<br>
+; X86-NOSSE-NEXT:    retl<br>
+;<br>
+; X64-SSE-LABEL: store_half:<br>
+; X64-SSE:       # %bb.0:<br>
+; X64-SSE-NEXT:    pextrw $0, %xmm0, %eax<br>
+; X64-SSE-NEXT:    movw %ax, (%rdi)<br>
+; X64-SSE-NEXT:    retq<br>
+;<br>
+; X64-AVX-LABEL: store_half:<br>
+; X64-AVX:       # %bb.0:<br>
+; X64-AVX-NEXT:    vpextrw $0, %xmm0, %eax<br>
+; X64-AVX-NEXT:    movw %ax, (%rdi)<br>
+; X64-AVX-NEXT:    retq<br>
   store atomic half %v, half* %fptr unordered, align 2<br>
   ret void<br>
 }<br>
@@ -193,16 +221,43 @@ define void @store_fp128(fp128* %fptr, fp128 %v) {<br>
 }<br>
<br>
 define half @load_half(half* %fptr) {<br>
-; X86-LABEL: load_half:<br>
-; X86:       # %bb.0:<br>
-; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax<br>
-; X86-NEXT:    movzwl (%eax), %eax<br>
-; X86-NEXT:    retl<br>
+; X86-SSE1-LABEL: load_half:<br>
+; X86-SSE1:       # %bb.0:<br>
+; X86-SSE1-NEXT:    movl {{[0-9]+}}(%esp), %eax<br>
+; X86-SSE1-NEXT:    movzwl (%eax), %eax<br>
+; X86-SSE1-NEXT:    retl<br>
+;<br>
+; X86-SSE2-LABEL: load_half:<br>
+; X86-SSE2:       # %bb.0:<br>
+; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax<br>
+; X86-SSE2-NEXT:    movzwl (%eax), %eax<br>
+; X86-SSE2-NEXT:    pinsrw $0, %eax, %xmm0<br>
+; X86-SSE2-NEXT:    retl<br>
+;<br>
+; X86-AVX-LABEL: load_half:<br>
+; X86-AVX:       # %bb.0:<br>
+; X86-AVX-NEXT:    movl {{[0-9]+}}(%esp), %eax<br>
+; X86-AVX-NEXT:    movzwl (%eax), %eax<br>
+; X86-AVX-NEXT:    vpinsrw $0, %eax, %xmm0, %xmm0<br>
+; X86-AVX-NEXT:    retl<br>
+;<br>
+; X86-NOSSE-LABEL: load_half:<br>
+; X86-NOSSE:       # %bb.0:<br>
+; X86-NOSSE-NEXT:    movl {{[0-9]+}}(%esp), %eax<br>
+; X86-NOSSE-NEXT:    movzwl (%eax), %eax<br>
+; X86-NOSSE-NEXT:    retl<br>
 ;<br>
-; X64-LABEL: load_half:<br>
-; X64:       # %bb.0:<br>
-; X64-NEXT:    movzwl (%rdi), %eax<br>
-; X64-NEXT:    retq<br>
+; X64-SSE-LABEL: load_half:<br>
+; X64-SSE:       # %bb.0:<br>
+; X64-SSE-NEXT:    movzwl (%rdi), %eax<br>
+; X64-SSE-NEXT:    pinsrw $0, %eax, %xmm0<br>
+; X64-SSE-NEXT:    retq<br>
+;<br>
+; X64-AVX-LABEL: load_half:<br>
+; X64-AVX:       # %bb.0:<br>
+; X64-AVX-NEXT:    movzwl (%rdi), %eax<br>
+; X64-AVX-NEXT:    vpinsrw $0, %eax, %xmm0, %xmm0<br>
+; X64-AVX-NEXT:    retq<br>
   %v = load atomic half, half* %fptr unordered, align 2<br>
   ret half %v<br>
 }<br>
<br>
diff  --git a/llvm/test/CodeGen/X86/avx512-insert-extract.ll b/llvm/test/CodeGen/X86/avx512-insert-extract.ll<br>
index d307be240a29c..0323af4aca34f 100644<br>
--- a/llvm/test/CodeGen/X86/avx512-insert-extract.ll<br>
+++ b/llvm/test/CodeGen/X86/avx512-insert-extract.ll<br>
@@ -2254,22 +2254,19 @@ define void @test_concat_v2i1(<2 x half>* %arg, <2 x half>* %arg1, <2 x half>* %<br>
 ; KNL-NEXT:    korw %k2, %k1, %k1<br>
 ; KNL-NEXT:    kandw %k1, %k0, %k0<br>
 ; KNL-NEXT:    kshiftrw $1, %k0, %k1<br>
-; KNL-NEXT:    kmovw %k1, %ecx<br>
-; KNL-NEXT:    xorl %eax, %eax<br>
-; KNL-NEXT:    testb $1, %cl<br>
-; KNL-NEXT:    movl $0, %ecx<br>
+; KNL-NEXT:    kmovw %k1, %edi<br>
+; KNL-NEXT:    movzwl 2(%rsi), %eax<br>
+; KNL-NEXT:    xorl %ecx, %ecx<br>
+; KNL-NEXT:    testb $1, %dil<br>
+; KNL-NEXT:    cmovel %ecx, %eax<br>
+; KNL-NEXT:    kmovw %k0, %edi<br>
+; KNL-NEXT:    testb $1, %dil<br>
 ; KNL-NEXT:    je LBB85_2<br>
 ; KNL-NEXT:  ## %bb.1:<br>
-; KNL-NEXT:    movzwl 2(%rsi), %ecx<br>
+; KNL-NEXT:    movl (%rsi), %ecx<br>
 ; KNL-NEXT:  LBB85_2:<br>
-; KNL-NEXT:    kmovw %k0, %edi<br>
-; KNL-NEXT:    testb $1, %dil<br>
-; KNL-NEXT:    je LBB85_4<br>
-; KNL-NEXT:  ## %bb.3:<br>
-; KNL-NEXT:    movzwl (%rsi), %eax<br>
-; KNL-NEXT:  LBB85_4:<br>
-; KNL-NEXT:    movw %ax, (%rdx)<br>
-; KNL-NEXT:    movw %cx, 2(%rdx)<br>
+; KNL-NEXT:    movw %cx, (%rdx)<br>
+; KNL-NEXT:    movw %ax, 2(%rdx)<br>
 ; KNL-NEXT:    retq<br>
 ;<br>
 ; SKX-LABEL: test_concat_v2i1:<br>
@@ -2304,22 +2301,19 @@ define void @test_concat_v2i1(<2 x half>* %arg, <2 x half>* %arg1, <2 x half>* %<br>
 ; SKX-NEXT:    korw %k1, %k2, %k1<br>
 ; SKX-NEXT:    kandw %k1, %k0, %k0<br>
 ; SKX-NEXT:    kshiftrb $1, %k0, %k1<br>
-; SKX-NEXT:    kmovd %k1, %ecx<br>
-; SKX-NEXT:    xorl %eax, %eax<br>
-; SKX-NEXT:    testb $1, %cl<br>
-; SKX-NEXT:    movl $0, %ecx<br>
+; SKX-NEXT:    kmovd %k1, %edi<br>
+; SKX-NEXT:    movzwl 2(%rsi), %eax<br>
+; SKX-NEXT:    xorl %ecx, %ecx<br>
+; SKX-NEXT:    testb $1, %dil<br>
+; SKX-NEXT:    cmovel %ecx, %eax<br>
+; SKX-NEXT:    kmovd %k0, %edi<br>
+; SKX-NEXT:    testb $1, %dil<br>
 ; SKX-NEXT:    je LBB85_2<br>
 ; SKX-NEXT:  ## %bb.1:<br>
-; SKX-NEXT:    movzwl 2(%rsi), %ecx<br>
+; SKX-NEXT:    movl (%rsi), %ecx<br>
 ; SKX-NEXT:  LBB85_2:<br>
-; SKX-NEXT:    kmovd %k0, %edi<br>
-; SKX-NEXT:    testb $1, %dil<br>
-; SKX-NEXT:    je LBB85_4<br>
-; SKX-NEXT:  ## %bb.3:<br>
-; SKX-NEXT:    movzwl (%rsi), %eax<br>
-; SKX-NEXT:  LBB85_4:<br>
-; SKX-NEXT:    movw %ax, (%rdx)<br>
-; SKX-NEXT:    movw %cx, 2(%rdx)<br>
+; SKX-NEXT:    movw %cx, (%rdx)<br>
+; SKX-NEXT:    movw %ax, 2(%rdx)<br>
 ; SKX-NEXT:    retq<br>
   %tmp = load <2 x half>, <2 x half>* %arg, align 8<br>
   %tmp3 = fcmp fast olt <2 x half> %tmp, <half 0xH4600, half 0xH4600><br>
<br>
diff  --git a/llvm/test/CodeGen/X86/avx512-masked_memop-16-8.ll b/llvm/test/CodeGen/X86/avx512-masked_memop-16-8.ll<br>
index 0a7c4e0aa36aa..fbaff4aa34f33 100644<br>
--- a/llvm/test/CodeGen/X86/avx512-masked_memop-16-8.ll<br>
+++ b/llvm/test/CodeGen/X86/avx512-masked_memop-16-8.ll<br>
@@ -153,206 +153,156 @@ define void @test_mask_store_32xi16(<32 x i1> %mask, <32 x i16>* %addr, <32 x i1<br>
 declare void @llvm.masked.store.v32i16.p0v32i16(<32 x i16>, <32 x i16>*, i32, <32 x i1>)<br>
<br>
 ; Make sure we scalarize masked loads of f16.<br>
-define <16 x half> @test_mask_load_16xf16(<16 x i1> %mask, <16 x half>* %addr, <16 x half> %val) {<br>
+define <16 x half> @test_mask_load_16xf16(<16 x i1> %mask, <16 x half>* %addr) {<br>
 ; CHECK-LABEL: test_mask_load_16xf16:<br>
 ; CHECK:       ## %bb.0:<br>
-; CHECK-NEXT:    pushq %rbp<br>
-; CHECK-NEXT:    .cfi_def_cfa_offset 16<br>
-; CHECK-NEXT:    pushq %r15<br>
-; CHECK-NEXT:    .cfi_def_cfa_offset 24<br>
-; CHECK-NEXT:    pushq %r14<br>
-; CHECK-NEXT:    .cfi_def_cfa_offset 32<br>
-; CHECK-NEXT:    pushq %r13<br>
-; CHECK-NEXT:    .cfi_def_cfa_offset 40<br>
-; CHECK-NEXT:    pushq %r12<br>
-; CHECK-NEXT:    .cfi_def_cfa_offset 48<br>
-; CHECK-NEXT:    pushq %rbx<br>
-; CHECK-NEXT:    .cfi_def_cfa_offset 56<br>
-; CHECK-NEXT:    .cfi_offset %rbx, -56<br>
-; CHECK-NEXT:    .cfi_offset %r12, -48<br>
-; CHECK-NEXT:    .cfi_offset %r13, -40<br>
-; CHECK-NEXT:    .cfi_offset %r14, -32<br>
-; CHECK-NEXT:    .cfi_offset %r15, -24<br>
-; CHECK-NEXT:    .cfi_offset %rbp, -16<br>
 ; CHECK-NEXT:    movq %rdi, %rax<br>
 ; CHECK-NEXT:    vpsllw $7, %xmm0, %xmm0<br>
-; CHECK-NEXT:    vpmovmskb %xmm0, %r11d<br>
-; CHECK-NEXT:    testb $1, %r11b<br>
+; CHECK-NEXT:    vpmovmskb %xmm0, %ecx<br>
+; CHECK-NEXT:    testb $1, %cl<br>
 ; CHECK-NEXT:    je LBB12_1<br>
 ; CHECK-NEXT:  ## %bb.2: ## %cond.load<br>
-; CHECK-NEXT:    movzwl (%rsi), %ecx<br>
-; CHECK-NEXT:    movl %ecx, {{[-0-9]+}}(%r{{[sb]}}p) ## 4-byte Spill<br>
+; CHECK-NEXT:    vpinsrw $0, (%rsi), %xmm0, %xmm8<br>
 ; CHECK-NEXT:    jmp LBB12_3<br>
 ; CHECK-NEXT:  LBB12_1:<br>
-; CHECK-NEXT:    movl $0, {{[-0-9]+}}(%r{{[sb]}}p) ## 4-byte Folded Spill<br>
+; CHECK-NEXT:    vpxor %xmm8, %xmm8, %xmm8<br>
 ; CHECK-NEXT:  LBB12_3: ## %else<br>
-; CHECK-NEXT:    xorl %edi, %edi<br>
-; CHECK-NEXT:    movl $0, {{[-0-9]+}}(%r{{[sb]}}p) ## 4-byte Folded Spill<br>
-; CHECK-NEXT:    movl %edi, %ecx<br>
-; CHECK-NEXT:    testb $2, %r11b<br>
+; CHECK-NEXT:    vpxor %xmm2, %xmm2, %xmm2<br>
+; CHECK-NEXT:    vpxor %xmm9, %xmm9, %xmm9<br>
+; CHECK-NEXT:    vmovdqa %xmm2, %xmm10<br>
+; CHECK-NEXT:    vmovdqa %xmm2, %xmm4<br>
+; CHECK-NEXT:    vmovdqa %xmm2, %xmm5<br>
+; CHECK-NEXT:    vmovdqa %xmm2, %xmm6<br>
+; CHECK-NEXT:    vmovdqa %xmm2, %xmm7<br>
+; CHECK-NEXT:    vmovdqa %xmm2, %xmm1<br>
+; CHECK-NEXT:    vmovdqa %xmm2, %xmm0<br>
+; CHECK-NEXT:    vmovdqa %xmm2, %xmm3<br>
+; CHECK-NEXT:    vmovdqa %xmm2, %xmm11<br>
+; CHECK-NEXT:    vmovdqa %xmm2, %xmm12<br>
+; CHECK-NEXT:    vmovdqa %xmm2, %xmm13<br>
+; CHECK-NEXT:    vmovdqa %xmm2, %xmm14<br>
+; CHECK-NEXT:    testb $2, %cl<br>
 ; CHECK-NEXT:    je LBB12_4<br>
 ; CHECK-NEXT:  ## %bb.5: ## %cond.load1<br>
-; CHECK-NEXT:    movw %di, {{[-0-9]+}}(%r{{[sb]}}p) ## 2-byte Spill<br>
-; CHECK-NEXT:    movl %edi, %r12d<br>
-; CHECK-NEXT:    movl %edi, %ebx<br>
-; CHECK-NEXT:    movl %edi, %ebp<br>
-; CHECK-NEXT:    movl %edi, %r13d<br>
-; CHECK-NEXT:    movl %edi, %r14d<br>
-; CHECK-NEXT:    movl %edi, %r8d<br>
-; CHECK-NEXT:    movl %edi, %r9d<br>
-; CHECK-NEXT:    movl %edi, %r10d<br>
-; CHECK-NEXT:    movl %edi, %r15d<br>
-; CHECK-NEXT:    movl %edi, %edx<br>
-; CHECK-NEXT:    movw %di, {{[-0-9]+}}(%r{{[sb]}}p) ## 2-byte Spill<br>
-; CHECK-NEXT:    movw %di, {{[-0-9]+}}(%r{{[sb]}}p) ## 2-byte Spill<br>
-; CHECK-NEXT:    movzwl 2(%rsi), %edi<br>
-; CHECK-NEXT:    ## kill: def $di killed $di def $edi<br>
-; CHECK-NEXT:    testb $4, %r11b<br>
+; CHECK-NEXT:    vmovdqa %xmm2, %xmm15<br>
+; CHECK-NEXT:    vpinsrw $0, 2(%rsi), %xmm0, %xmm2<br>
+; CHECK-NEXT:    testb $4, %cl<br>
 ; CHECK-NEXT:    jne LBB12_7<br>
 ; CHECK-NEXT:    jmp LBB12_8<br>
 ; CHECK-NEXT:  LBB12_4:<br>
-; CHECK-NEXT:    movw %di, {{[-0-9]+}}(%r{{[sb]}}p) ## 2-byte Spill<br>
-; CHECK-NEXT:    movl %edi, %r12d<br>
-; CHECK-NEXT:    movl %edi, %ebx<br>
-; CHECK-NEXT:    movl %edi, %ebp<br>
-; CHECK-NEXT:    movl %edi, %r13d<br>
-; CHECK-NEXT:    movl %edi, %r14d<br>
-; CHECK-NEXT:    movl %edi, %r8d<br>
-; CHECK-NEXT:    movl %edi, %r9d<br>
-; CHECK-NEXT:    movl %edi, %r10d<br>
-; CHECK-NEXT:    movl %edi, %r15d<br>
-; CHECK-NEXT:    movl %edi, %edx<br>
-; CHECK-NEXT:    movw %di, {{[-0-9]+}}(%r{{[sb]}}p) ## 2-byte Spill<br>
-; CHECK-NEXT:    movw %di, {{[-0-9]+}}(%r{{[sb]}}p) ## 2-byte Spill<br>
-; CHECK-NEXT:    testb $4, %r11b<br>
+; CHECK-NEXT:    vmovdqa %xmm2, %xmm15<br>
+; CHECK-NEXT:    testb $4, %cl<br>
 ; CHECK-NEXT:    je LBB12_8<br>
 ; CHECK-NEXT:  LBB12_7: ## %cond.load4<br>
-; CHECK-NEXT:    movzwl 4(%rsi), %ecx<br>
-; CHECK-NEXT:    movw %cx, {{[-0-9]+}}(%r{{[sb]}}p) ## 2-byte Spill<br>
+; CHECK-NEXT:    vpinsrw $0, 4(%rsi), %xmm0, %xmm10<br>
 ; CHECK-NEXT:  LBB12_8: ## %else5<br>
-; CHECK-NEXT:    testb $8, %r11b<br>
+; CHECK-NEXT:    testb $8, %cl<br>
 ; CHECK-NEXT:    jne LBB12_9<br>
 ; CHECK-NEXT:  ## %bb.10: ## %else8<br>
-; CHECK-NEXT:    testb $16, %r11b<br>
+; CHECK-NEXT:    testb $16, %cl<br>
 ; CHECK-NEXT:    jne LBB12_11<br>
 ; CHECK-NEXT:  LBB12_12: ## %else11<br>
-; CHECK-NEXT:    testb $32, %r11b<br>
+; CHECK-NEXT:    testb $32, %cl<br>
 ; CHECK-NEXT:    jne LBB12_13<br>
 ; CHECK-NEXT:  LBB12_14: ## %else14<br>
-; CHECK-NEXT:    testb $64, %r11b<br>
+; CHECK-NEXT:    testb $64, %cl<br>
 ; CHECK-NEXT:    jne LBB12_15<br>
 ; CHECK-NEXT:  LBB12_16: ## %else17<br>
-; CHECK-NEXT:    testb $-128, %r11b<br>
+; CHECK-NEXT:    testb $-128, %cl<br>
 ; CHECK-NEXT:    jne LBB12_17<br>
 ; CHECK-NEXT:  LBB12_18: ## %else20<br>
-; CHECK-NEXT:    testl $256, %r11d ## imm = 0x100<br>
+; CHECK-NEXT:    testl $256, %ecx ## imm = 0x100<br>
 ; CHECK-NEXT:    jne LBB12_19<br>
 ; CHECK-NEXT:  LBB12_20: ## %else23<br>
-; CHECK-NEXT:    testl $512, %r11d ## imm = 0x200<br>
+; CHECK-NEXT:    testl $512, %ecx ## imm = 0x200<br>
 ; CHECK-NEXT:    jne LBB12_21<br>
 ; CHECK-NEXT:  LBB12_22: ## %else26<br>
-; CHECK-NEXT:    testl $1024, %r11d ## imm = 0x400<br>
+; CHECK-NEXT:    testl $1024, %ecx ## imm = 0x400<br>
 ; CHECK-NEXT:    jne LBB12_23<br>
 ; CHECK-NEXT:  LBB12_24: ## %else29<br>
-; CHECK-NEXT:    testl $2048, %r11d ## imm = 0x800<br>
+; CHECK-NEXT:    testl $2048, %ecx ## imm = 0x800<br>
 ; CHECK-NEXT:    jne LBB12_25<br>
 ; CHECK-NEXT:  LBB12_26: ## %else32<br>
-; CHECK-NEXT:    testl $4096, %r11d ## imm = 0x1000<br>
-; CHECK-NEXT:    je LBB12_28<br>
-; CHECK-NEXT:  LBB12_27: ## %cond.load34<br>
-; CHECK-NEXT:    movzwl 24(%rsi), %edx<br>
+; CHECK-NEXT:    testl $4096, %ecx ## imm = 0x1000<br>
+; CHECK-NEXT:    jne LBB12_27<br>
 ; CHECK-NEXT:  LBB12_28: ## %else35<br>
-; CHECK-NEXT:    movw %dx, {{[-0-9]+}}(%r{{[sb]}}p) ## 2-byte Spill<br>
-; CHECK-NEXT:    testl $8192, %r11d ## imm = 0x2000<br>
+; CHECK-NEXT:    testl $8192, %ecx ## imm = 0x2000<br>
 ; CHECK-NEXT:    jne LBB12_29<br>
-; CHECK-NEXT:  ## %bb.30: ## %else38<br>
-; CHECK-NEXT:    testl $16384, %r11d ## imm = 0x4000<br>
+; CHECK-NEXT:  LBB12_30: ## %else38<br>
+; CHECK-NEXT:    testl $16384, %ecx ## imm = 0x4000<br>
 ; CHECK-NEXT:    jne LBB12_31<br>
 ; CHECK-NEXT:  LBB12_32: ## %else41<br>
-; CHECK-NEXT:    testl $32768, %r11d ## imm = 0x8000<br>
-; CHECK-NEXT:    je LBB12_33<br>
-; CHECK-NEXT:  LBB12_34: ## %cond.load43<br>
-; CHECK-NEXT:    movzwl {{[-0-9]+}}(%r{{[sb]}}p), %ecx ## 2-byte Folded Reload<br>
-; CHECK-NEXT:    movzwl 30(%rsi), %esi<br>
-; CHECK-NEXT:    jmp LBB12_35<br>
+; CHECK-NEXT:    testl $32768, %ecx ## imm = 0x8000<br>
+; CHECK-NEXT:    je LBB12_34<br>
+; CHECK-NEXT:  LBB12_33: ## %cond.load43<br>
+; CHECK-NEXT:    vpinsrw $0, 30(%rsi), %xmm0, %xmm9<br>
+; CHECK-NEXT:  LBB12_34: ## %else44<br>
+; CHECK-NEXT:    vpextrw $0, %xmm8, (%rax)<br>
+; CHECK-NEXT:    vpextrw $0, %xmm2, 2(%rax)<br>
+; CHECK-NEXT:    vpextrw $0, %xmm10, 4(%rax)<br>
+; CHECK-NEXT:    vpextrw $0, %xmm4, 6(%rax)<br>
+; CHECK-NEXT:    vpextrw $0, %xmm5, 8(%rax)<br>
+; CHECK-NEXT:    vpextrw $0, %xmm6, 10(%rax)<br>
+; CHECK-NEXT:    vpextrw $0, %xmm7, 12(%rax)<br>
+; CHECK-NEXT:    vpextrw $0, %xmm1, 14(%rax)<br>
+; CHECK-NEXT:    vpextrw $0, %xmm0, 16(%rax)<br>
+; CHECK-NEXT:    vpextrw $0, %xmm3, 18(%rax)<br>
+; CHECK-NEXT:    vpextrw $0, %xmm11, 20(%rax)<br>
+; CHECK-NEXT:    vpextrw $0, %xmm12, 22(%rax)<br>
+; CHECK-NEXT:    vpextrw $0, %xmm13, 24(%rax)<br>
+; CHECK-NEXT:    vpextrw $0, %xmm14, 26(%rax)<br>
+; CHECK-NEXT:    vpextrw $0, %xmm15, 28(%rax)<br>
+; CHECK-NEXT:    vpextrw $0, %xmm9, 30(%rax)<br>
+; CHECK-NEXT:    retq<br>
 ; CHECK-NEXT:  LBB12_9: ## %cond.load7<br>
-; CHECK-NEXT:    movzwl 6(%rsi), %r12d<br>
-; CHECK-NEXT:    testb $16, %r11b<br>
+; CHECK-NEXT:    vpinsrw $0, 6(%rsi), %xmm0, %xmm4<br>
+; CHECK-NEXT:    testb $16, %cl<br>
 ; CHECK-NEXT:    je LBB12_12<br>
 ; CHECK-NEXT:  LBB12_11: ## %cond.load10<br>
-; CHECK-NEXT:    movzwl 8(%rsi), %ebx<br>
-; CHECK-NEXT:    testb $32, %r11b<br>
+; CHECK-NEXT:    vpinsrw $0, 8(%rsi), %xmm0, %xmm5<br>
+; CHECK-NEXT:    testb $32, %cl<br>
 ; CHECK-NEXT:    je LBB12_14<br>
 ; CHECK-NEXT:  LBB12_13: ## %cond.load13<br>
-; CHECK-NEXT:    movzwl 10(%rsi), %ebp<br>
-; CHECK-NEXT:    testb $64, %r11b<br>
+; CHECK-NEXT:    vpinsrw $0, 10(%rsi), %xmm0, %xmm6<br>
+; CHECK-NEXT:    testb $64, %cl<br>
 ; CHECK-NEXT:    je LBB12_16<br>
 ; CHECK-NEXT:  LBB12_15: ## %cond.load16<br>
-; CHECK-NEXT:    movzwl 12(%rsi), %r13d<br>
-; CHECK-NEXT:    testb $-128, %r11b<br>
+; CHECK-NEXT:    vpinsrw $0, 12(%rsi), %xmm0, %xmm7<br>
+; CHECK-NEXT:    testb $-128, %cl<br>
 ; CHECK-NEXT:    je LBB12_18<br>
 ; CHECK-NEXT:  LBB12_17: ## %cond.load19<br>
-; CHECK-NEXT:    movzwl 14(%rsi), %r14d<br>
-; CHECK-NEXT:    testl $256, %r11d ## imm = 0x100<br>
+; CHECK-NEXT:    vpinsrw $0, 14(%rsi), %xmm0, %xmm1<br>
+; CHECK-NEXT:    testl $256, %ecx ## imm = 0x100<br>
 ; CHECK-NEXT:    je LBB12_20<br>
 ; CHECK-NEXT:  LBB12_19: ## %cond.load22<br>
-; CHECK-NEXT:    movzwl 16(%rsi), %r8d<br>
-; CHECK-NEXT:    testl $512, %r11d ## imm = 0x200<br>
+; CHECK-NEXT:    vpinsrw $0, 16(%rsi), %xmm0, %xmm0<br>
+; CHECK-NEXT:    testl $512, %ecx ## imm = 0x200<br>
 ; CHECK-NEXT:    je LBB12_22<br>
 ; CHECK-NEXT:  LBB12_21: ## %cond.load25<br>
-; CHECK-NEXT:    movzwl 18(%rsi), %r9d<br>
-; CHECK-NEXT:    testl $1024, %r11d ## imm = 0x400<br>
+; CHECK-NEXT:    vpinsrw $0, 18(%rsi), %xmm0, %xmm3<br>
+; CHECK-NEXT:    testl $1024, %ecx ## imm = 0x400<br>
 ; CHECK-NEXT:    je LBB12_24<br>
 ; CHECK-NEXT:  LBB12_23: ## %cond.load28<br>
-; CHECK-NEXT:    movzwl 20(%rsi), %r10d<br>
-; CHECK-NEXT:    testl $2048, %r11d ## imm = 0x800<br>
+; CHECK-NEXT:    vpinsrw $0, 20(%rsi), %xmm0, %xmm11<br>
+; CHECK-NEXT:    testl $2048, %ecx ## imm = 0x800<br>
 ; CHECK-NEXT:    je LBB12_26<br>
 ; CHECK-NEXT:  LBB12_25: ## %cond.load31<br>
-; CHECK-NEXT:    movzwl 22(%rsi), %r15d<br>
-; CHECK-NEXT:    testl $4096, %r11d ## imm = 0x1000<br>
-; CHECK-NEXT:    jne LBB12_27<br>
-; CHECK-NEXT:    jmp LBB12_28<br>
+; CHECK-NEXT:    vpinsrw $0, 22(%rsi), %xmm0, %xmm12<br>
+; CHECK-NEXT:    testl $4096, %ecx ## imm = 0x1000<br>
+; CHECK-NEXT:    je LBB12_28<br>
+; CHECK-NEXT:  LBB12_27: ## %cond.load34<br>
+; CHECK-NEXT:    vpinsrw $0, 24(%rsi), %xmm0, %xmm13<br>
+; CHECK-NEXT:    testl $8192, %ecx ## imm = 0x2000<br>
+; CHECK-NEXT:    je LBB12_30<br>
 ; CHECK-NEXT:  LBB12_29: ## %cond.load37<br>
-; CHECK-NEXT:    movzwl 26(%rsi), %ecx<br>
-; CHECK-NEXT:    movw %cx, {{[-0-9]+}}(%r{{[sb]}}p) ## 2-byte Spill<br>
-; CHECK-NEXT:    testl $16384, %r11d ## imm = 0x4000<br>
+; CHECK-NEXT:    vpinsrw $0, 26(%rsi), %xmm0, %xmm14<br>
+; CHECK-NEXT:    testl $16384, %ecx ## imm = 0x4000<br>
 ; CHECK-NEXT:    je LBB12_32<br>
 ; CHECK-NEXT:  LBB12_31: ## %cond.load40<br>
-; CHECK-NEXT:    movzwl 28(%rsi), %ecx<br>
-; CHECK-NEXT:    movw %cx, {{[-0-9]+}}(%r{{[sb]}}p) ## 2-byte Spill<br>
-; CHECK-NEXT:    testl $32768, %r11d ## imm = 0x8000<br>
-; CHECK-NEXT:    jne LBB12_34<br>
-; CHECK-NEXT:  LBB12_33:<br>
-; CHECK-NEXT:    movzwl {{[-0-9]+}}(%r{{[sb]}}p), %ecx ## 2-byte Folded Reload<br>
-; CHECK-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %esi ## 4-byte Reload<br>
-; CHECK-NEXT:  LBB12_35: ## %else44<br>
-; CHECK-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %edx ## 4-byte Reload<br>
-; CHECK-NEXT:    movw %dx, (%rax)<br>
-; CHECK-NEXT:    movw %di, 2(%rax)<br>
-; CHECK-NEXT:    movw %cx, 4(%rax)<br>
-; CHECK-NEXT:    movw %r12w, 6(%rax)<br>
-; CHECK-NEXT:    movw %bx, 8(%rax)<br>
-; CHECK-NEXT:    movw %bp, 10(%rax)<br>
-; CHECK-NEXT:    movw %r13w, 12(%rax)<br>
-; CHECK-NEXT:    movw %r14w, 14(%rax)<br>
-; CHECK-NEXT:    movw %r8w, 16(%rax)<br>
-; CHECK-NEXT:    movw %r9w, 18(%rax)<br>
-; CHECK-NEXT:    movw %r10w, 20(%rax)<br>
-; CHECK-NEXT:    movw %r15w, 22(%rax)<br>
-; CHECK-NEXT:    movzwl {{[-0-9]+}}(%r{{[sb]}}p), %ecx ## 2-byte Folded Reload<br>
-; CHECK-NEXT:    movw %cx, 24(%rax)<br>
-; CHECK-NEXT:    movzwl {{[-0-9]+}}(%r{{[sb]}}p), %ecx ## 2-byte Folded Reload<br>
-; CHECK-NEXT:    movw %cx, 26(%rax)<br>
-; CHECK-NEXT:    movzwl {{[-0-9]+}}(%r{{[sb]}}p), %ecx ## 2-byte Folded Reload<br>
-; CHECK-NEXT:    movw %cx, 28(%rax)<br>
-; CHECK-NEXT:    movw %si, 30(%rax)<br>
-; CHECK-NEXT:    popq %rbx<br>
-; CHECK-NEXT:    popq %r12<br>
-; CHECK-NEXT:    popq %r13<br>
-; CHECK-NEXT:    popq %r14<br>
-; CHECK-NEXT:    popq %r15<br>
-; CHECK-NEXT:    popq %rbp<br>
-; CHECK-NEXT:    retq<br>
+; CHECK-NEXT:    vpinsrw $0, 28(%rsi), %xmm0, %xmm15<br>
+; CHECK-NEXT:    testl $32768, %ecx ## imm = 0x8000<br>
+; CHECK-NEXT:    jne LBB12_33<br>
+; CHECK-NEXT:    jmp LBB12_34<br>
   %res = call <16 x half> @llvm.masked.load.v16f16(<16 x half>* %addr, i32 4, <16 x i1>%mask, <16 x half> zeroinitializer)<br>
   ret <16 x half> %res<br>
 }<br>
@@ -414,78 +364,76 @@ define void @test_mask_store_16xf16(<16 x i1> %mask, <16 x half>* %addr, <16 x h<br>
 ; CHECK-NEXT:  LBB13_32: ## %else30<br>
 ; CHECK-NEXT:    retq<br>
 ; CHECK-NEXT:  LBB13_1: ## %cond.store<br>
-; CHECK-NEXT:    movw %si, (%rdi)<br>
+; CHECK-NEXT:    vpextrw $0, %xmm1, (%rdi)<br>
 ; CHECK-NEXT:    testb $2, %al<br>
 ; CHECK-NEXT:    je LBB13_4<br>
 ; CHECK-NEXT:  LBB13_3: ## %cond.store1<br>
-; CHECK-NEXT:    movw %dx, 2(%rdi)<br>
+; CHECK-NEXT:    vpextrw $0, %xmm2, 2(%rdi)<br>
 ; CHECK-NEXT:    testb $4, %al<br>
 ; CHECK-NEXT:    je LBB13_6<br>
 ; CHECK-NEXT:  LBB13_5: ## %cond.store3<br>
-; CHECK-NEXT:    movw %cx, 4(%rdi)<br>
+; CHECK-NEXT:    vpextrw $0, %xmm3, 4(%rdi)<br>
 ; CHECK-NEXT:    testb $8, %al<br>
 ; CHECK-NEXT:    je LBB13_8<br>
 ; CHECK-NEXT:  LBB13_7: ## %cond.store5<br>
-; CHECK-NEXT:    movw %r8w, 6(%rdi)<br>
+; CHECK-NEXT:    vpextrw $0, %xmm4, 6(%rdi)<br>
 ; CHECK-NEXT:    testb $16, %al<br>
 ; CHECK-NEXT:    je LBB13_10<br>
 ; CHECK-NEXT:  LBB13_9: ## %cond.store7<br>
-; CHECK-NEXT:    movw %r9w, 8(%rdi)<br>
+; CHECK-NEXT:    vpextrw $0, %xmm5, 8(%rdi)<br>
 ; CHECK-NEXT:    testb $32, %al<br>
 ; CHECK-NEXT:    je LBB13_12<br>
 ; CHECK-NEXT:  LBB13_11: ## %cond.store9<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%rsp), %ecx<br>
-; CHECK-NEXT:    movw %cx, 10(%rdi)<br>
+; CHECK-NEXT:    vpextrw $0, %xmm6, 10(%rdi)<br>
 ; CHECK-NEXT:    testb $64, %al<br>
 ; CHECK-NEXT:    je LBB13_14<br>
 ; CHECK-NEXT:  LBB13_13: ## %cond.store11<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%rsp), %ecx<br>
-; CHECK-NEXT:    movw %cx, 12(%rdi)<br>
+; CHECK-NEXT:    vpextrw $0, %xmm7, 12(%rdi)<br>
 ; CHECK-NEXT:    testb $-128, %al<br>
 ; CHECK-NEXT:    je LBB13_16<br>
 ; CHECK-NEXT:  LBB13_15: ## %cond.store13<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%rsp), %ecx<br>
-; CHECK-NEXT:    movw %cx, 14(%rdi)<br>
+; CHECK-NEXT:    vpinsrw $0, {{[0-9]+}}(%rsp), %xmm0, %xmm0<br>
+; CHECK-NEXT:    vpextrw $0, %xmm0, 14(%rdi)<br>
 ; CHECK-NEXT:    testl $256, %eax ## imm = 0x100<br>
 ; CHECK-NEXT:    je LBB13_18<br>
 ; CHECK-NEXT:  LBB13_17: ## %cond.store15<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%rsp), %ecx<br>
-; CHECK-NEXT:    movw %cx, 16(%rdi)<br>
+; CHECK-NEXT:    vpinsrw $0, {{[0-9]+}}(%rsp), %xmm0, %xmm0<br>
+; CHECK-NEXT:    vpextrw $0, %xmm0, 16(%rdi)<br>
 ; CHECK-NEXT:    testl $512, %eax ## imm = 0x200<br>
 ; CHECK-NEXT:    je LBB13_20<br>
 ; CHECK-NEXT:  LBB13_19: ## %cond.store17<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%rsp), %ecx<br>
-; CHECK-NEXT:    movw %cx, 18(%rdi)<br>
+; CHECK-NEXT:    vpinsrw $0, {{[0-9]+}}(%rsp), %xmm0, %xmm0<br>
+; CHECK-NEXT:    vpextrw $0, %xmm0, 18(%rdi)<br>
 ; CHECK-NEXT:    testl $1024, %eax ## imm = 0x400<br>
 ; CHECK-NEXT:    je LBB13_22<br>
 ; CHECK-NEXT:  LBB13_21: ## %cond.store19<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%rsp), %ecx<br>
-; CHECK-NEXT:    movw %cx, 20(%rdi)<br>
+; CHECK-NEXT:    vpinsrw $0, {{[0-9]+}}(%rsp), %xmm0, %xmm0<br>
+; CHECK-NEXT:    vpextrw $0, %xmm0, 20(%rdi)<br>
 ; CHECK-NEXT:    testl $2048, %eax ## imm = 0x800<br>
 ; CHECK-NEXT:    je LBB13_24<br>
 ; CHECK-NEXT:  LBB13_23: ## %cond.store21<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%rsp), %ecx<br>
-; CHECK-NEXT:    movw %cx, 22(%rdi)<br>
+; CHECK-NEXT:    vpinsrw $0, {{[0-9]+}}(%rsp), %xmm0, %xmm0<br>
+; CHECK-NEXT:    vpextrw $0, %xmm0, 22(%rdi)<br>
 ; CHECK-NEXT:    testl $4096, %eax ## imm = 0x1000<br>
 ; CHECK-NEXT:    je LBB13_26<br>
 ; CHECK-NEXT:  LBB13_25: ## %cond.store23<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%rsp), %ecx<br>
-; CHECK-NEXT:    movw %cx, 24(%rdi)<br>
+; CHECK-NEXT:    vpinsrw $0, {{[0-9]+}}(%rsp), %xmm0, %xmm0<br>
+; CHECK-NEXT:    vpextrw $0, %xmm0, 24(%rdi)<br>
 ; CHECK-NEXT:    testl $8192, %eax ## imm = 0x2000<br>
 ; CHECK-NEXT:    je LBB13_28<br>
 ; CHECK-NEXT:  LBB13_27: ## %cond.store25<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%rsp), %ecx<br>
-; CHECK-NEXT:    movw %cx, 26(%rdi)<br>
+; CHECK-NEXT:    vpinsrw $0, {{[0-9]+}}(%rsp), %xmm0, %xmm0<br>
+; CHECK-NEXT:    vpextrw $0, %xmm0, 26(%rdi)<br>
 ; CHECK-NEXT:    testl $16384, %eax ## imm = 0x4000<br>
 ; CHECK-NEXT:    je LBB13_30<br>
 ; CHECK-NEXT:  LBB13_29: ## %cond.store27<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%rsp), %ecx<br>
-; CHECK-NEXT:    movw %cx, 28(%rdi)<br>
+; CHECK-NEXT:    vpinsrw $0, {{[0-9]+}}(%rsp), %xmm0, %xmm0<br>
+; CHECK-NEXT:    vpextrw $0, %xmm0, 28(%rdi)<br>
 ; CHECK-NEXT:    testl $32768, %eax ## imm = 0x8000<br>
 ; CHECK-NEXT:    je LBB13_32<br>
 ; CHECK-NEXT:  LBB13_31: ## %cond.store29<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%rsp), %eax<br>
-; CHECK-NEXT:    movw %ax, 30(%rdi)<br>
+; CHECK-NEXT:    vpinsrw $0, {{[0-9]+}}(%rsp), %xmm0, %xmm0<br>
+; CHECK-NEXT:    vpextrw $0, %xmm0, 30(%rdi)<br>
 ; CHECK-NEXT:    retq<br>
   call void @llvm.masked.store.v16f16.p0v16f16(<16 x half> %val, <16 x half>* %addr, i32 4, <16 x i1>%mask)<br>
   ret void<br>
<br>
diff  --git a/llvm/test/CodeGen/X86/avx512fp16-fp-logic.ll b/llvm/test/CodeGen/X86/avx512fp16-fp-logic.ll<br>
index e2ea8974f6551..3b8d6edf04d33 100644<br>
--- a/llvm/test/CodeGen/X86/avx512fp16-fp-logic.ll<br>
+++ b/llvm/test/CodeGen/X86/avx512fp16-fp-logic.ll<br>
@@ -211,8 +211,8 @@ define half @movmsk(half %x) {<br>
 define half @bitcast_fabs(half %x) {<br>
 ; CHECK-LABEL: bitcast_fabs:<br>
 ; CHECK:       # %bb.0:<br>
-; CHECK-NEXT:    vpbroadcastw {{.*#+}} xmm1 = [NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN]<br>
-; CHECK-NEXT:    vpand %xmm1, %xmm0, %xmm0<br>
+; CHECK-NEXT:    vmovsh {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1<br>
+; CHECK-NEXT:    vandps %xmm1, %xmm0, %xmm0<br>
 ; CHECK-NEXT:    retq<br>
   %bc1 = bitcast half %x to i16<br>
   %and = and i16 %bc1, 32767<br>
@@ -223,8 +223,8 @@ define half @bitcast_fabs(half %x) {<br>
 define half @bitcast_fneg(half %x) {<br>
 ; CHECK-LABEL: bitcast_fneg:<br>
 ; CHECK:       # %bb.0:<br>
-; CHECK-NEXT:    vpbroadcastw {{.*#+}} xmm1 = [-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0]<br>
-; CHECK-NEXT:    vpxor %xmm1, %xmm0, %xmm0<br>
+; CHECK-NEXT:    vmovsh {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1<br>
+; CHECK-NEXT:    vxorps %xmm1, %xmm0, %xmm0<br>
 ; CHECK-NEXT:    retq<br>
   %bc1 = bitcast half %x to i16<br>
   %xor = xor i16 %bc1, 32768<br>
@@ -285,8 +285,8 @@ define half @fsub_bitcast_fneg(half %x, half %y) {<br>
 define half @nabs(half %a) {<br>
 ; CHECK-LABEL: nabs:<br>
 ; CHECK:       # %bb.0:<br>
-; CHECK-NEXT:    vpbroadcastw {{.*#+}} xmm1 = [-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0]<br>
-; CHECK-NEXT:    vpor %xmm1, %xmm0, %xmm0<br>
+; CHECK-NEXT:    vmovsh {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1<br>
+; CHECK-NEXT:    vorps %xmm1, %xmm0, %xmm0<br>
 ; CHECK-NEXT:    retq<br>
   %conv = bitcast half %a to i16<br>
   %and = or i16 %conv, -32768<br>
<br>
diff  --git a/llvm/test/CodeGen/X86/callbr-asm-bb-exports.ll b/llvm/test/CodeGen/X86/callbr-asm-bb-exports.ll<br>
index 4f703d42fdf5f..dd58c7bde3c55 100644<br>
--- a/llvm/test/CodeGen/X86/callbr-asm-bb-exports.ll<br>
+++ b/llvm/test/CodeGen/X86/callbr-asm-bb-exports.ll<br>
@@ -17,7 +17,7 @@<br>
 ; CHECK-NEXT: t2: i32,ch = CopyFromReg t0, Register:i32 %2<br>
 ; CHECK-NEXT: t8: i32 = add t2, Constant:i32<4><br>
 ; CHECK-NEXT: t22: ch,glue = CopyToReg t17, Register:i32 %5, t8<br>
-; CHECK-NEXT: t30: ch,glue = inlineasm_br t22, TargetExternalSymbol:i64'xorl $0, $0; jmp ${1:l}', MDNode:ch<null>, TargetConstant:i64<8>, TargetConstant:i32<2293769>, Register:i32 %5, TargetConstant:i64<13>, TargetBlockAddress:i64<@test, %fail> 0, TargetConstant:i32<12>,
 Register:i32 $df, TargetConstant:i32<12>, Register:i16 $fpsw, TargetConstant:i32<12>, Register:i32 $eflags, t22:1<br>
+; CHECK-NEXT: t30: ch,glue = inlineasm_br t22, TargetExternalSymbol:i64'xorl $0, $0; jmp ${1:l}', MDNode:ch<null>, TargetConstant:i64<8>, TargetConstant:i32<2359305>, Register:i32 %5, TargetConstant:i64<13>, TargetBlockAddress:i64<@test, %fail> 0, TargetConstant:i32<12>,
 Register:i32 $df, TargetConstant:i32<12>, Register:i16 $fpsw, TargetConstant:i32<12>, Register:i32 $eflags, t22:1<br>
<br>
 define i32 @test(i32 %a, i32 %b, i32 %c) {<br>
 entry:<br>
<br>
diff  --git a/llvm/test/CodeGen/X86/cvt16-2.ll b/llvm/test/CodeGen/X86/cvt16-2.ll<br>
index 67111e838cab8..74b55bc2b8313 100644<br>
--- a/llvm/test/CodeGen/X86/cvt16-2.ll<br>
+++ b/llvm/test/CodeGen/X86/cvt16-2.ll<br>
@@ -9,7 +9,8 @@ define void @test1(float %src, i16* %dest) {<br>
 ; LIBCALL-NEXT:    .cfi_def_cfa_offset 16<br>
 ; LIBCALL-NEXT:    .cfi_offset %rbx, -16<br>
 ; LIBCALL-NEXT:    movq %rdi, %rbx<br>
-; LIBCALL-NEXT:    callq __gnu_f2h_ieee@PLT<br>
+; LIBCALL-NEXT:    callq __truncsfhf2@PLT<br>
+; LIBCALL-NEXT:    pextrw $0, %xmm0, %eax<br>
 ; LIBCALL-NEXT:    movw %ax, (%rbx)<br>
 ; LIBCALL-NEXT:    popq %rbx<br>
 ; LIBCALL-NEXT:    .cfi_def_cfa_offset 8<br>
@@ -28,8 +29,8 @@ define void @test1(float %src, i16* %dest) {<br>
 define float @test2(i16* nocapture %src) {<br>
 ; LIBCALL-LABEL: test2:<br>
 ; LIBCALL:       # %bb.0:<br>
-; LIBCALL-NEXT:    movzwl (%rdi), %edi<br>
-; LIBCALL-NEXT:    jmp __gnu_h2f_ieee@PLT # TAILCALL<br>
+; LIBCALL-NEXT:    pinsrw $0, (%rdi), %xmm0<br>
+; LIBCALL-NEXT:    jmp __extendhfsf2@PLT # TAILCALL<br>
 ;<br>
 ; FP16-LABEL: test2:<br>
 ; FP16:       # %bb.0:<br>
@@ -46,11 +47,10 @@ define float @test3(float %src) nounwind uwtable readnone {<br>
 ; LIBCALL:       # %bb.0:<br>
 ; LIBCALL-NEXT:    pushq %rax<br>
 ; LIBCALL-NEXT:    .cfi_def_cfa_offset 16<br>
-; LIBCALL-NEXT:    callq __gnu_f2h_ieee@PLT<br>
-; LIBCALL-NEXT:    movzwl %ax, %edi<br>
+; LIBCALL-NEXT:    callq __truncsfhf2@PLT<br>
 ; LIBCALL-NEXT:    popq %rax<br>
 ; LIBCALL-NEXT:    .cfi_def_cfa_offset 8<br>
-; LIBCALL-NEXT:    jmp __gnu_h2f_ieee@PLT # TAILCALL<br>
+; LIBCALL-NEXT:    jmp __extendhfsf2@PLT # TAILCALL<br>
 ;<br>
 ; FP16-LABEL: test3:<br>
 ; FP16:       # %bb.0:<br>
@@ -68,8 +68,8 @@ define double @test4(i16* nocapture %src) {<br>
 ; LIBCALL:       # %bb.0:<br>
 ; LIBCALL-NEXT:    pushq %rax<br>
 ; LIBCALL-NEXT:    .cfi_def_cfa_offset 16<br>
-; LIBCALL-NEXT:    movzwl (%rdi), %edi<br>
-; LIBCALL-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; LIBCALL-NEXT:    pinsrw $0, (%rdi), %xmm0<br>
+; LIBCALL-NEXT:    callq __extendhfsf2@PLT<br>
 ; LIBCALL-NEXT:    cvtss2sd %xmm0, %xmm0<br>
 ; LIBCALL-NEXT:    popq %rax<br>
 ; LIBCALL-NEXT:    .cfi_def_cfa_offset 8<br>
@@ -88,7 +88,14 @@ define double @test4(i16* nocapture %src) {<br>
 define i16 @test5(double %src) {<br>
 ; LIBCALL-LABEL: test5:<br>
 ; LIBCALL:       # %bb.0:<br>
-; LIBCALL-NEXT:    jmp __truncdfhf2@PLT # TAILCALL<br>
+; LIBCALL-NEXT:    pushq %rax<br>
+; LIBCALL-NEXT:    .cfi_def_cfa_offset 16<br>
+; LIBCALL-NEXT:    callq __truncdfhf2@PLT<br>
+; LIBCALL-NEXT:    pextrw $0, %xmm0, %eax<br>
+; LIBCALL-NEXT:    # kill: def $ax killed $ax killed $eax<br>
+; LIBCALL-NEXT:    popq %rcx<br>
+; LIBCALL-NEXT:    .cfi_def_cfa_offset 8<br>
+; LIBCALL-NEXT:    retq<br>
 ;<br>
 ; FP16-LABEL: test5:<br>
 ; FP16:       # %bb.0:<br>
@@ -106,10 +113,8 @@ define x86_fp80 @test6(i16* nocapture %src) {<br>
 ; LIBCALL:       # %bb.0:<br>
 ; LIBCALL-NEXT:    pushq %rax<br>
 ; LIBCALL-NEXT:    .cfi_def_cfa_offset 16<br>
-; LIBCALL-NEXT:    movzwl (%rdi), %edi<br>
-; LIBCALL-NEXT:    callq __gnu_h2f_ieee@PLT<br>
-; LIBCALL-NEXT:    movss %xmm0, {{[0-9]+}}(%rsp)<br>
-; LIBCALL-NEXT:    flds {{[0-9]+}}(%rsp)<br>
+; LIBCALL-NEXT:    pinsrw $0, (%rdi), %xmm0<br>
+; LIBCALL-NEXT:    callq __extendhfxf2@PLT<br>
 ; LIBCALL-NEXT:    popq %rax<br>
 ; LIBCALL-NEXT:    .cfi_def_cfa_offset 8<br>
 ; LIBCALL-NEXT:    retq<br>
@@ -131,7 +136,16 @@ define x86_fp80 @test6(i16* nocapture %src) {<br>
 define i16 @test7(x86_fp80 %src) {<br>
 ; LIBCALL-LABEL: test7:<br>
 ; LIBCALL:       # %bb.0:<br>
-; LIBCALL-NEXT:    jmp __truncxfhf2@PLT # TAILCALL<br>
+; LIBCALL-NEXT:    subq $24, %rsp<br>
+; LIBCALL-NEXT:    .cfi_def_cfa_offset 32<br>
+; LIBCALL-NEXT:    fldt {{[0-9]+}}(%rsp)<br>
+; LIBCALL-NEXT:    fstpt (%rsp)<br>
+; LIBCALL-NEXT:    callq __truncxfhf2@PLT<br>
+; LIBCALL-NEXT:    pextrw $0, %xmm0, %eax<br>
+; LIBCALL-NEXT:    # kill: def $ax killed $ax killed $eax<br>
+; LIBCALL-NEXT:    addq $24, %rsp<br>
+; LIBCALL-NEXT:    .cfi_def_cfa_offset 8<br>
+; LIBCALL-NEXT:    retq<br>
 ;<br>
 ; FP16-LABEL: test7:<br>
 ; FP16:       # %bb.0:<br>
<br>
diff  --git a/llvm/test/CodeGen/X86/cvt16.ll b/llvm/test/CodeGen/X86/cvt16.ll<br>
index 035e3323478f2..d06cac38ff305 100644<br>
--- a/llvm/test/CodeGen/X86/cvt16.ll<br>
+++ b/llvm/test/CodeGen/X86/cvt16.ll<br>
@@ -28,8 +28,8 @@ define void @test1(float %src, i16* %dest) {<br>
 ; LIBCALL-NEXT:    .cfi_def_cfa_offset 16<br>
 ; LIBCALL-NEXT:    .cfi_offset %rbx, -16<br>
 ; LIBCALL-NEXT:    movq %rdi, %rbx<br>
-; LIBCALL-NEXT:    callq __gnu_f2h_ieee@PLT<br>
-; LIBCALL-NEXT:    movw %ax, (%rbx)<br>
+; LIBCALL-NEXT:    callq __truncsfhf2@PLT<br>
+; LIBCALL-NEXT:    pextrw $0, %xmm0, (%rbx)<br>
 ; LIBCALL-NEXT:    popq %rbx<br>
 ; LIBCALL-NEXT:    .cfi_def_cfa_offset 8<br>
 ; LIBCALL-NEXT:    retq<br>
@@ -37,7 +37,8 @@ define void @test1(float %src, i16* %dest) {<br>
 ; F16C-LABEL: test1:<br>
 ; F16C:       # %bb.0:<br>
 ; F16C-NEXT:    vcvtps2ph $4, %xmm0, %xmm0<br>
-; F16C-NEXT:    vpextrw $0, %xmm0, (%rdi)<br>
+; F16C-NEXT:    vmovd %xmm0, %eax<br>
+; F16C-NEXT:    movw %ax, (%rdi)<br>
 ; F16C-NEXT:    retq<br>
 ;<br>
 ; SOFTFLOAT-LABEL: test1:<br>
@@ -59,8 +60,8 @@ define void @test1(float %src, i16* %dest) {<br>
 define float @test2(i16* nocapture %src) {<br>
 ; LIBCALL-LABEL: test2:<br>
 ; LIBCALL:       # %bb.0:<br>
-; LIBCALL-NEXT:    movzwl (%rdi), %edi<br>
-; LIBCALL-NEXT:    jmp __gnu_h2f_ieee@PLT # TAILCALL<br>
+; LIBCALL-NEXT:    pinsrw $0, (%rdi), %xmm0<br>
+; LIBCALL-NEXT:    jmp __extendhfsf2@PLT # TAILCALL<br>
 ;<br>
 ; F16C-LABEL: test2:<br>
 ; F16C:       # %bb.0:<br>
@@ -88,15 +89,17 @@ define float @test3(float %src) nounwind uwtable readnone {<br>
 ; LIBCALL:       # %bb.0:<br>
 ; LIBCALL-NEXT:    pushq %rax<br>
 ; LIBCALL-NEXT:    .cfi_def_cfa_offset 16<br>
-; LIBCALL-NEXT:    callq __gnu_f2h_ieee@PLT<br>
-; LIBCALL-NEXT:    movzwl %ax, %edi<br>
+; LIBCALL-NEXT:    callq __truncsfhf2@PLT<br>
 ; LIBCALL-NEXT:    popq %rax<br>
 ; LIBCALL-NEXT:    .cfi_def_cfa_offset 8<br>
-; LIBCALL-NEXT:    jmp __gnu_h2f_ieee@PLT # TAILCALL<br>
+; LIBCALL-NEXT:    jmp __extendhfsf2@PLT # TAILCALL<br>
 ;<br>
 ; F16C-LABEL: test3:<br>
 ; F16C:       # %bb.0:<br>
 ; F16C-NEXT:    vcvtps2ph $4, %xmm0, %xmm0<br>
+; F16C-NEXT:    vmovd %xmm0, %eax<br>
+; F16C-NEXT:    movzwl %ax, %eax<br>
+; F16C-NEXT:    vmovd %eax, %xmm0<br>
 ; F16C-NEXT:    vcvtph2ps %xmm0, %xmm0<br>
 ; F16C-NEXT:    retq<br>
 ;<br>
@@ -120,8 +123,8 @@ define double @test4(i16* nocapture %src) {<br>
 ; LIBCALL:       # %bb.0:<br>
 ; LIBCALL-NEXT:    pushq %rax<br>
 ; LIBCALL-NEXT:    .cfi_def_cfa_offset 16<br>
-; LIBCALL-NEXT:    movzwl (%rdi), %edi<br>
-; LIBCALL-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; LIBCALL-NEXT:    pinsrw $0, (%rdi), %xmm0<br>
+; LIBCALL-NEXT:    callq __extendhfsf2@PLT<br>
 ; LIBCALL-NEXT:    cvtss2sd %xmm0, %xmm0<br>
 ; LIBCALL-NEXT:    popq %rax<br>
 ; LIBCALL-NEXT:    .cfi_def_cfa_offset 8<br>
@@ -154,11 +157,22 @@ define double @test4(i16* nocapture %src) {<br>
 define i16 @test5(double %src) {<br>
 ; LIBCALL-LABEL: test5:<br>
 ; LIBCALL:       # %bb.0:<br>
-; LIBCALL-NEXT:    jmp __truncdfhf2@PLT # TAILCALL<br>
+; LIBCALL-NEXT:    pushq %rax<br>
+; LIBCALL-NEXT:    .cfi_def_cfa_offset 16<br>
+; LIBCALL-NEXT:    callq __truncdfhf2@PLT<br>
+; LIBCALL-NEXT:    pextrw $0, %xmm0, %eax<br>
+; LIBCALL-NEXT:    # kill: def $ax killed $ax killed $eax<br>
+; LIBCALL-NEXT:    popq %rcx<br>
+; LIBCALL-NEXT:    .cfi_def_cfa_offset 8<br>
+; LIBCALL-NEXT:    retq<br>
 ;<br>
 ; F16C-LABEL: test5:<br>
 ; F16C:       # %bb.0:<br>
-; F16C-NEXT:    jmp __truncdfhf2@PLT # TAILCALL<br>
+; F16C-NEXT:    vcvtsd2ss %xmm0, %xmm0, %xmm0<br>
+; F16C-NEXT:    vcvtps2ph $4, %xmm0, %xmm0<br>
+; F16C-NEXT:    vmovd %xmm0, %eax<br>
+; F16C-NEXT:    # kill: def $ax killed $ax killed $eax<br>
+; F16C-NEXT:    retq<br>
 ;<br>
 ; SOFTFLOAT-LABEL: test5:<br>
 ; SOFTFLOAT:       # %bb.0:<br>
<br>
diff  --git a/llvm/test/CodeGen/X86/fastmath-float-half-conversion.ll b/llvm/test/CodeGen/X86/fastmath-float-half-conversion.ll<br>
index 362fe73073f02..2b3891a6fee8f 100644<br>
--- a/llvm/test/CodeGen/X86/fastmath-float-half-conversion.ll<br>
+++ b/llvm/test/CodeGen/X86/fastmath-float-half-conversion.ll<br>
@@ -16,6 +16,8 @@ define zeroext i16 @test1_fast(double %d) #0 {<br>
 ; AVX-NEXT:    pushq %rax<br>
 ; AVX-NEXT:    .cfi_def_cfa_offset 16<br>
 ; AVX-NEXT:    callq __truncdfhf2@PLT<br>
+; AVX-NEXT:    vpextrw $0, %xmm0, %eax<br>
+; AVX-NEXT:    # kill: def $ax killed $ax killed $eax<br>
 ; AVX-NEXT:    popq %rcx<br>
 ; AVX-NEXT:    .cfi_def_cfa_offset 8<br>
 ; AVX-NEXT:    retq<br>
@@ -25,40 +27,42 @@ entry:<br>
 }<br>
<br>
 define zeroext i16 @test2_fast(x86_fp80 %d) #0 {<br>
-; F16C-LABEL: test2_fast:<br>
+; ALL-LABEL: test2_fast:<br>
+; ALL:       # %bb.0: # %entry<br>
+; ALL-NEXT:    subq $24, %rsp<br>
+; ALL-NEXT:    .cfi_def_cfa_offset 32<br>
+; ALL-NEXT:    fldt {{[0-9]+}}(%rsp)<br>
+; ALL-NEXT:    fstpt (%rsp)<br>
+; ALL-NEXT:    callq __truncxfhf2@PLT<br>
+; ALL-NEXT:    vpextrw $0, %xmm0, %eax<br>
+; ALL-NEXT:    # kill: def $ax killed $ax killed $eax<br>
+; ALL-NEXT:    addq $24, %rsp<br>
+; ALL-NEXT:    .cfi_def_cfa_offset 8<br>
+; ALL-NEXT:    retq<br>
+entry:<br>
+  %0 = tail call i16 @llvm.convert.to.fp16.f80(x86_fp80 %d)<br>
+  ret i16 %0<br>
+}<br>
+<br>
+define zeroext i16 @test1(double %d) #1 {<br>
+; F16C-LABEL: test1:<br>
 ; F16C:       # %bb.0: # %entry<br>
-; F16C-NEXT:    fldt {{[0-9]+}}(%rsp)<br>
-; F16C-NEXT:    fstps -{{[0-9]+}}(%rsp)<br>
-; F16C-NEXT:    vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero<br>
+; F16C-NEXT:    vcvtsd2ss %xmm0, %xmm0, %xmm0<br>
 ; F16C-NEXT:    vcvtps2ph $4, %xmm0, %xmm0<br>
 ; F16C-NEXT:    vmovd %xmm0, %eax<br>
 ; F16C-NEXT:    # kill: def $ax killed $ax killed $eax<br>
 ; F16C-NEXT:    retq<br>
 ;<br>
-; AVX-LABEL: test2_fast:<br>
+; AVX-LABEL: test1:<br>
 ; AVX:       # %bb.0: # %entry<br>
-; AVX-NEXT:    subq $24, %rsp<br>
-; AVX-NEXT:    .cfi_def_cfa_offset 32<br>
-; AVX-NEXT:    fldt {{[0-9]+}}(%rsp)<br>
-; AVX-NEXT:    fstpt (%rsp)<br>
-; AVX-NEXT:    callq __truncxfhf2@PLT<br>
-; AVX-NEXT:    addq $24, %rsp<br>
+; AVX-NEXT:    pushq %rax<br>
+; AVX-NEXT:    .cfi_def_cfa_offset 16<br>
+; AVX-NEXT:    callq __truncdfhf2@PLT<br>
+; AVX-NEXT:    vpextrw $0, %xmm0, %eax<br>
+; AVX-NEXT:    # kill: def $ax killed $ax killed $eax<br>
+; AVX-NEXT:    popq %rcx<br>
 ; AVX-NEXT:    .cfi_def_cfa_offset 8<br>
 ; AVX-NEXT:    retq<br>
-entry:<br>
-  %0 = tail call i16 @llvm.convert.to.fp16.f80(x86_fp80 %d)<br>
-  ret i16 %0<br>
-}<br>
-<br>
-define zeroext i16 @test1(double %d) #1 {<br>
-; ALL-LABEL: test1:<br>
-; ALL:       # %bb.0: # %entry<br>
-; ALL-NEXT:    pushq %rax<br>
-; ALL-NEXT:    .cfi_def_cfa_offset 16<br>
-; ALL-NEXT:    callq __truncdfhf2@PLT<br>
-; ALL-NEXT:    popq %rcx<br>
-; ALL-NEXT:    .cfi_def_cfa_offset 8<br>
-; ALL-NEXT:    retq<br>
 entry:<br>
   %0 = tail call i16 @llvm.convert.to.fp16.f64(double %d)<br>
   ret i16 %0<br>
@@ -72,6 +76,8 @@ define zeroext i16 @test2(x86_fp80 %d) #1 {<br>
 ; ALL-NEXT:    fldt {{[0-9]+}}(%rsp)<br>
 ; ALL-NEXT:    fstpt (%rsp)<br>
 ; ALL-NEXT:    callq __truncxfhf2@PLT<br>
+; ALL-NEXT:    vpextrw $0, %xmm0, %eax<br>
+; ALL-NEXT:    # kill: def $ax killed $ax killed $eax<br>
 ; ALL-NEXT:    addq $24, %rsp<br>
 ; ALL-NEXT:    .cfi_def_cfa_offset 8<br>
 ; ALL-NEXT:    retq<br>
<br>
diff  --git a/llvm/test/CodeGen/X86/fmf-flags.ll b/llvm/test/CodeGen/X86/fmf-flags.ll<br>
index 102a162b44824..e4195d6bd4fb9 100644<br>
--- a/llvm/test/CodeGen/X86/fmf-flags.ll<br>
+++ b/llvm/test/CodeGen/X86/fmf-flags.ll<br>
@@ -111,14 +111,12 @@ define dso_local float @div_arcp_by_const(half %x) {<br>
 ; X64:       # %bb.0:<br>
 ; X64-NEXT:    pushq %rax<br>
 ; X64-NEXT:    .cfi_def_cfa_offset 16<br>
-; X64-NEXT:    movzwl %di, %edi<br>
-; X64-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; X64-NEXT:    callq __extendhfsf2@PLT<br>
 ; X64-NEXT:    mulss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
-; X64-NEXT:    callq __gnu_f2h_ieee@PLT<br>
-; X64-NEXT:    movzwl %ax, %edi<br>
+; X64-NEXT:    callq __truncsfhf2@PLT<br>
 ; X64-NEXT:    popq %rax<br>
 ; X64-NEXT:    .cfi_def_cfa_offset 8<br>
-; X64-NEXT:    jmp __gnu_h2f_ieee@PLT # TAILCALL<br>
+; X64-NEXT:    jmp __extendhfsf2@PLT # TAILCALL<br>
 ;<br>
 ; X86-LABEL: div_arcp_by_const:<br>
 ; X86:       # %bb.0:<br>
<br>
diff  --git a/llvm/test/CodeGen/X86/fp-round.ll b/llvm/test/CodeGen/X86/fp-round.ll<br>
index 7bcbdb2f40ea5..9218996071ba2 100644<br>
--- a/llvm/test/CodeGen/X86/fp-round.ll<br>
+++ b/llvm/test/CodeGen/X86/fp-round.ll<br>
@@ -10,18 +10,16 @@ define half @round_f16(half %h) {<br>
 ; SSE2:       ## %bb.0: ## %entry<br>
 ; SSE2-NEXT:    pushq %rax<br>
 ; SSE2-NEXT:    .cfi_def_cfa_offset 16<br>
-; SSE2-NEXT:    movzwl %di, %edi<br>
 ; SSE2-NEXT:    callq ___extendhfsf2<br>
 ; SSE2-NEXT:    callq _roundf<br>
 ; SSE2-NEXT:    callq ___truncsfhf2<br>
-; SSE2-NEXT:    popq %rcx<br>
+; SSE2-NEXT:    popq %rax<br>
 ; SSE2-NEXT:    retq<br>
 ;<br>
 ; SSE41-LABEL: round_f16:<br>
 ; SSE41:       ## %bb.0: ## %entry<br>
 ; SSE41-NEXT:    pushq %rax<br>
 ; SSE41-NEXT:    .cfi_def_cfa_offset 16<br>
-; SSE41-NEXT:    movzwl %di, %edi<br>
 ; SSE41-NEXT:    callq ___extendhfsf2<br>
 ; SSE41-NEXT:    movaps {{.*#+}} xmm1 = [-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0]<br>
 ; SSE41-NEXT:    andps %xmm0, %xmm1<br>
@@ -30,14 +28,13 @@ define half @round_f16(half %h) {<br>
 ; SSE41-NEXT:    xorps %xmm0, %xmm0<br>
 ; SSE41-NEXT:    roundss $11, %xmm1, %xmm0<br>
 ; SSE41-NEXT:    callq ___truncsfhf2<br>
-; SSE41-NEXT:    popq %rcx<br>
+; SSE41-NEXT:    popq %rax<br>
 ; SSE41-NEXT:    retq<br>
 ;<br>
 ; AVX1-LABEL: round_f16:<br>
 ; AVX1:       ## %bb.0: ## %entry<br>
 ; AVX1-NEXT:    pushq %rax<br>
 ; AVX1-NEXT:    .cfi_def_cfa_offset 16<br>
-; AVX1-NEXT:    movzwl %di, %edi<br>
 ; AVX1-NEXT:    callq ___extendhfsf2<br>
 ; AVX1-NEXT:    vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1<br>
 ; AVX1-NEXT:    vbroadcastss {{.*#+}} xmm2 = [4.9999997E-1,4.9999997E-1,4.9999997E-1,4.9999997E-1]<br>
@@ -45,12 +42,13 @@ define half @round_f16(half %h) {<br>
 ; AVX1-NEXT:    vaddss %xmm1, %xmm0, %xmm0<br>
 ; AVX1-NEXT:    vroundss $11, %xmm0, %xmm0, %xmm0<br>
 ; AVX1-NEXT:    callq ___truncsfhf2<br>
-; AVX1-NEXT:    popq %rcx<br>
+; AVX1-NEXT:    popq %rax<br>
 ; AVX1-NEXT:    retq<br>
 ;<br>
 ; AVX512F-LABEL: round_f16:<br>
 ; AVX512F:       ## %bb.0: ## %entry<br>
-; AVX512F-NEXT:    movzwl %di, %eax<br>
+; AVX512F-NEXT:    vpextrw $0, %xmm0, %eax<br>
+; AVX512F-NEXT:    movzwl %ax, %eax<br>
 ; AVX512F-NEXT:    vmovd %eax, %xmm0<br>
 ; AVX512F-NEXT:    vcvtph2ps %xmm0, %xmm0<br>
 ; AVX512F-NEXT:    vpbroadcastd {{.*#+}} xmm1 = [4.9999997E-1,4.9999997E-1,4.9999997E-1,4.9999997E-1]<br>
@@ -59,7 +57,7 @@ define half @round_f16(half %h) {<br>
 ; AVX512F-NEXT:    vroundss $11, %xmm0, %xmm0, %xmm0<br>
 ; AVX512F-NEXT:    vcvtps2ph $4, %xmm0, %xmm0<br>
 ; AVX512F-NEXT:    vmovd %xmm0, %eax<br>
-; AVX512F-NEXT:    ## kill: def $ax killed $ax killed $eax<br>
+; AVX512F-NEXT:    vpinsrw $0, %eax, %xmm0, %xmm0<br>
 ; AVX512F-NEXT:    retq<br>
 ;<br>
 ; AVX512FP16-LABEL: round_f16:<br>
<br>
diff  --git a/llvm/test/CodeGen/X86/fp-roundeven.ll b/llvm/test/CodeGen/X86/fp-roundeven.ll<br>
index 6757f3825ba58..6e087a383b1d1 100644<br>
--- a/llvm/test/CodeGen/X86/fp-roundeven.ll<br>
+++ b/llvm/test/CodeGen/X86/fp-roundeven.ll<br>
@@ -10,44 +10,42 @@ define half @roundeven_f16(half %h) {<br>
 ; SSE2:       ## %bb.0: ## %entry<br>
 ; SSE2-NEXT:    pushq %rax<br>
 ; SSE2-NEXT:    .cfi_def_cfa_offset 16<br>
-; SSE2-NEXT:    movzwl %di, %edi<br>
 ; SSE2-NEXT:    callq ___extendhfsf2<br>
 ; SSE2-NEXT:    callq _roundevenf<br>
 ; SSE2-NEXT:    callq ___truncsfhf2<br>
-; SSE2-NEXT:    popq %rcx<br>
+; SSE2-NEXT:    popq %rax<br>
 ; SSE2-NEXT:    retq<br>
 ;<br>
 ; SSE41-LABEL: roundeven_f16:<br>
 ; SSE41:       ## %bb.0: ## %entry<br>
 ; SSE41-NEXT:    pushq %rax<br>
 ; SSE41-NEXT:    .cfi_def_cfa_offset 16<br>
-; SSE41-NEXT:    movzwl %di, %edi<br>
 ; SSE41-NEXT:    callq ___extendhfsf2<br>
 ; SSE41-NEXT:    roundss $8, %xmm0, %xmm0<br>
 ; SSE41-NEXT:    callq ___truncsfhf2<br>
-; SSE41-NEXT:    popq %rcx<br>
+; SSE41-NEXT:    popq %rax<br>
 ; SSE41-NEXT:    retq<br>
 ;<br>
 ; AVX1-LABEL: roundeven_f16:<br>
 ; AVX1:       ## %bb.0: ## %entry<br>
 ; AVX1-NEXT:    pushq %rax<br>
 ; AVX1-NEXT:    .cfi_def_cfa_offset 16<br>
-; AVX1-NEXT:    movzwl %di, %edi<br>
 ; AVX1-NEXT:    callq ___extendhfsf2<br>
 ; AVX1-NEXT:    vroundss $8, %xmm0, %xmm0, %xmm0<br>
 ; AVX1-NEXT:    callq ___truncsfhf2<br>
-; AVX1-NEXT:    popq %rcx<br>
+; AVX1-NEXT:    popq %rax<br>
 ; AVX1-NEXT:    retq<br>
 ;<br>
 ; AVX512F-LABEL: roundeven_f16:<br>
 ; AVX512F:       ## %bb.0: ## %entry<br>
-; AVX512F-NEXT:    movzwl %di, %eax<br>
+; AVX512F-NEXT:    vpextrw $0, %xmm0, %eax<br>
+; AVX512F-NEXT:    movzwl %ax, %eax<br>
 ; AVX512F-NEXT:    vmovd %eax, %xmm0<br>
 ; AVX512F-NEXT:    vcvtph2ps %xmm0, %xmm0<br>
 ; AVX512F-NEXT:    vroundss $8, %xmm0, %xmm0, %xmm0<br>
 ; AVX512F-NEXT:    vcvtps2ph $4, %xmm0, %xmm0<br>
 ; AVX512F-NEXT:    vmovd %xmm0, %eax<br>
-; AVX512F-NEXT:    ## kill: def $ax killed $ax killed $eax<br>
+; AVX512F-NEXT:    vpinsrw $0, %eax, %xmm0, %xmm0<br>
 ; AVX512F-NEXT:    retq<br>
 ;<br>
 ; AVX512FP16-LABEL: roundeven_f16:<br>
<br>
diff  --git a/llvm/test/CodeGen/X86/fp128-cast-strict.ll b/llvm/test/CodeGen/X86/fp128-cast-strict.ll<br>
index dd05e643f8df0..37ce1cc567576 100644<br>
--- a/llvm/test/CodeGen/X86/fp128-cast-strict.ll<br>
+++ b/llvm/test/CodeGen/X86/fp128-cast-strict.ll<br>
@@ -19,10 +19,9 @@ define dso_local void @TestFPExtF16_F128() nounwind strictfp {<br>
 ; X64-SSE-LABEL: TestFPExtF16_F128:<br>
 ; X64-SSE:       # %bb.0: # %entry<br>
 ; X64-SSE-NEXT:    pushq %rax<br>
-; X64-SSE-NEXT:    movzwl vf16(%rip), %edi<br>
-; X64-SSE-NEXT:    callq __gnu_h2f_ieee@PLT<br>
-; X64-SSE-NEXT:    callq __extendsftf2@PLT<br>
-; X64-SSE-NEXT:    movaps %xmm0, vf128(%rip)<br>
+; X64-SSE-NEXT:    pinsrw $0, vf16(%rip), %xmm0<br>
+; X64-SSE-NEXT:    callq __extendhftf2@PLT<br>
+; X64-SSE-NEXT:    movdqa %xmm0, vf128(%rip)<br>
 ; X64-SSE-NEXT:    popq %rax<br>
 ; X64-SSE-NEXT:    retq<br>
 ;<br>
@@ -218,8 +217,9 @@ define dso_local void @TestFPTruncF128_F16() nounwind strictfp {<br>
 ; X64-SSE-LABEL: TestFPTruncF128_F16:<br>
 ; X64-SSE:       # %bb.0: # %entry<br>
 ; X64-SSE-NEXT:    pushq %rax<br>
-; X64-SSE-NEXT:    movaps vf128(%rip), %xmm0<br>
+; X64-SSE-NEXT:    movdqa vf128(%rip), %xmm0<br>
 ; X64-SSE-NEXT:    callq __trunctfhf2@PLT<br>
+; X64-SSE-NEXT:    pextrw $0, %xmm0, %eax<br>
 ; X64-SSE-NEXT:    movw %ax, vf16(%rip)<br>
 ; X64-SSE-NEXT:    popq %rax<br>
 ; X64-SSE-NEXT:    retq<br>
<br>
diff  --git a/llvm/test/CodeGen/X86/fpclamptosat.ll b/llvm/test/CodeGen/X86/fpclamptosat.ll<br>
index 111611b34b06a..6237790763124 100644<br>
--- a/llvm/test/CodeGen/X86/fpclamptosat.ll<br>
+++ b/llvm/test/CodeGen/X86/fpclamptosat.ll<br>
@@ -139,15 +139,17 @@ define i32 @stest_f16i32(half %x) {<br>
 ; CHECK:       # %bb.0: # %entry<br>
 ; CHECK-NEXT:    pushq %rax<br>
 ; CHECK-NEXT:    .cfi_def_cfa_offset 16<br>
-; CHECK-NEXT:    movzwl %di, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %eax<br>
 ; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
-; CHECK-NEXT:    movl $2147483647, %ecx # imm = 0x7FFFFFFF<br>
-; CHECK-NEXT:    cmovbel %eax, %ecx<br>
+; CHECK-NEXT:    movl $-2147483648, %ecx # imm = 0x80000000<br>
+; CHECK-NEXT:    cmovael %eax, %ecx<br>
+; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
+; CHECK-NEXT:    movl $2147483647, %edx # imm = 0x7FFFFFFF<br>
+; CHECK-NEXT:    cmovbel %ecx, %edx<br>
 ; CHECK-NEXT:    xorl %eax, %eax<br>
 ; CHECK-NEXT:    ucomiss %xmm0, %xmm0<br>
-; CHECK-NEXT:    cmovnpl %ecx, %eax<br>
+; CHECK-NEXT:    cmovnpl %edx, %eax<br>
 ; CHECK-NEXT:    popq %rcx<br>
 ; CHECK-NEXT:    .cfi_def_cfa_offset 8<br>
 ; CHECK-NEXT:    retq<br>
@@ -166,8 +168,7 @@ define i32 @utesth_f16i32(half %x) {<br>
 ; CHECK:       # %bb.0: # %entry<br>
 ; CHECK-NEXT:    pushq %rax<br>
 ; CHECK-NEXT:    .cfi_def_cfa_offset 16<br>
-; CHECK-NEXT:    movzwl %di, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %rax<br>
 ; CHECK-NEXT:    movq %rax, %rcx<br>
 ; CHECK-NEXT:    sarq $63, %rcx<br>
@@ -195,8 +196,7 @@ define i32 @ustest_f16i32(half %x) {<br>
 ; CHECK:       # %bb.0: # %entry<br>
 ; CHECK-NEXT:    pushq %rax<br>
 ; CHECK-NEXT:    .cfi_def_cfa_offset 16<br>
-; CHECK-NEXT:    movzwl %di, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %rcx<br>
 ; CHECK-NEXT:    movl $4294967295, %eax # imm = 0xFFFFFFFF<br>
 ; CHECK-NEXT:    cmpq %rax, %rcx<br>
@@ -343,13 +343,17 @@ define i16 @stest_f16i16(half %x) {<br>
 ; CHECK:       # %bb.0: # %entry<br>
 ; CHECK-NEXT:    pushq %rax<br>
 ; CHECK-NEXT:    .cfi_def_cfa_offset 16<br>
-; CHECK-NEXT:    movzwl %di, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
-; CHECK-NEXT:    movss {{.*#+}} xmm1 = mem[0],zero,zero,zero<br>
-; CHECK-NEXT:    maxss %xmm0, %xmm1<br>
-; CHECK-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero<br>
-; CHECK-NEXT:    minss %xmm1, %xmm0<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %eax<br>
+; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
+; CHECK-NEXT:    movl $32768, %ecx # imm = 0x8000<br>
+; CHECK-NEXT:    cmovael %eax, %ecx<br>
+; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
+; CHECK-NEXT:    movl $32767, %edx # imm = 0x7FFF<br>
+; CHECK-NEXT:    cmovbel %ecx, %edx<br>
+; CHECK-NEXT:    xorl %eax, %eax<br>
+; CHECK-NEXT:    ucomiss %xmm0, %xmm0<br>
+; CHECK-NEXT:    cmovnpl %edx, %eax<br>
 ; CHECK-NEXT:    # kill: def $ax killed $ax killed $eax<br>
 ; CHECK-NEXT:    popq %rcx<br>
 ; CHECK-NEXT:    .cfi_def_cfa_offset 8<br>
@@ -369,8 +373,7 @@ define i16 @utesth_f16i16(half %x) {<br>
 ; CHECK:       # %bb.0: # %entry<br>
 ; CHECK-NEXT:    pushq %rax<br>
 ; CHECK-NEXT:    .cfi_def_cfa_offset 16<br>
-; CHECK-NEXT:    movzwl %di, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %rcx<br>
 ; CHECK-NEXT:    cmpl $65535, %ecx # imm = 0xFFFF<br>
 ; CHECK-NEXT:    movl $65535, %eax # imm = 0xFFFF<br>
@@ -392,8 +395,7 @@ define i16 @ustest_f16i16(half %x) {<br>
 ; CHECK:       # %bb.0: # %entry<br>
 ; CHECK-NEXT:    pushq %rax<br>
 ; CHECK-NEXT:    .cfi_def_cfa_offset 16<br>
-; CHECK-NEXT:    movzwl %di, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %eax<br>
 ; CHECK-NEXT:    cmpl $65535, %eax # imm = 0xFFFF<br>
 ; CHECK-NEXT:    movl $65535, %ecx # imm = 0xFFFF<br>
@@ -562,15 +564,17 @@ define i64 @stest_f16i64(half %x) {<br>
 ; CHECK:       # %bb.0: # %entry<br>
 ; CHECK-NEXT:    pushq %rax<br>
 ; CHECK-NEXT:    .cfi_def_cfa_offset 16<br>
-; CHECK-NEXT:    movzwl %di, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %rax<br>
 ; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
-; CHECK-NEXT:    movabsq $9223372036854775807, %rcx # imm = 0x7FFFFFFFFFFFFFFF<br>
-; CHECK-NEXT:    cmovbeq %rax, %rcx<br>
+; CHECK-NEXT:    movabsq $-9223372036854775808, %rcx # imm = 0x8000000000000000<br>
+; CHECK-NEXT:    cmovaeq %rax, %rcx<br>
+; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
+; CHECK-NEXT:    movabsq $9223372036854775807, %rdx # imm = 0x7FFFFFFFFFFFFFFF<br>
+; CHECK-NEXT:    cmovbeq %rcx, %rdx<br>
 ; CHECK-NEXT:    xorl %eax, %eax<br>
 ; CHECK-NEXT:    ucomiss %xmm0, %xmm0<br>
-; CHECK-NEXT:    cmovnpq %rcx, %rax<br>
+; CHECK-NEXT:    cmovnpq %rdx, %rax<br>
 ; CHECK-NEXT:    popq %rcx<br>
 ; CHECK-NEXT:    .cfi_def_cfa_offset 8<br>
 ; CHECK-NEXT:    retq<br>
@@ -589,9 +593,7 @@ define i64 @utesth_f16i64(half %x) {<br>
 ; CHECK:       # %bb.0: # %entry<br>
 ; CHECK-NEXT:    pushq %rax<br>
 ; CHECK-NEXT:    .cfi_def_cfa_offset 16<br>
-; CHECK-NEXT:    movzwl %di, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
-; CHECK-NEXT:    callq __fixunssfti@PLT<br>
+; CHECK-NEXT:    callq __fixunshfti@PLT<br>
 ; CHECK-NEXT:    xorl %ecx, %ecx<br>
 ; CHECK-NEXT:    testq %rdx, %rdx<br>
 ; CHECK-NEXT:    cmovneq %rcx, %rax<br>
@@ -611,9 +613,7 @@ define i64 @ustest_f16i64(half %x) {<br>
 ; CHECK:       # %bb.0: # %entry<br>
 ; CHECK-NEXT:    pushq %rax<br>
 ; CHECK-NEXT:    .cfi_def_cfa_offset 16<br>
-; CHECK-NEXT:    movzwl %di, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
-; CHECK-NEXT:    callq __fixsfti@PLT<br>
+; CHECK-NEXT:    callq __fixhfti@PLT<br>
 ; CHECK-NEXT:    xorl %ecx, %ecx<br>
 ; CHECK-NEXT:    testq %rdx, %rdx<br>
 ; CHECK-NEXT:    movl $1, %esi<br>
@@ -768,15 +768,17 @@ define i32 @stest_f16i32_mm(half %x) {<br>
 ; CHECK:       # %bb.0: # %entry<br>
 ; CHECK-NEXT:    pushq %rax<br>
 ; CHECK-NEXT:    .cfi_def_cfa_offset 16<br>
-; CHECK-NEXT:    movzwl %di, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %eax<br>
 ; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
-; CHECK-NEXT:    movl $2147483647, %ecx # imm = 0x7FFFFFFF<br>
-; CHECK-NEXT:    cmovbel %eax, %ecx<br>
+; CHECK-NEXT:    movl $-2147483648, %ecx # imm = 0x80000000<br>
+; CHECK-NEXT:    cmovael %eax, %ecx<br>
+; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
+; CHECK-NEXT:    movl $2147483647, %edx # imm = 0x7FFFFFFF<br>
+; CHECK-NEXT:    cmovbel %ecx, %edx<br>
 ; CHECK-NEXT:    xorl %eax, %eax<br>
 ; CHECK-NEXT:    ucomiss %xmm0, %xmm0<br>
-; CHECK-NEXT:    cmovnpl %ecx, %eax<br>
+; CHECK-NEXT:    cmovnpl %edx, %eax<br>
 ; CHECK-NEXT:    popq %rcx<br>
 ; CHECK-NEXT:    .cfi_def_cfa_offset 8<br>
 ; CHECK-NEXT:    retq<br>
@@ -793,8 +795,7 @@ define i32 @utesth_f16i32_mm(half %x) {<br>
 ; CHECK:       # %bb.0: # %entry<br>
 ; CHECK-NEXT:    pushq %rax<br>
 ; CHECK-NEXT:    .cfi_def_cfa_offset 16<br>
-; CHECK-NEXT:    movzwl %di, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %rcx<br>
 ; CHECK-NEXT:    movq %rcx, %rdx<br>
 ; CHECK-NEXT:    sarq $63, %rdx<br>
@@ -821,8 +822,7 @@ define i32 @ustest_f16i32_mm(half %x) {<br>
 ; CHECK:       # %bb.0: # %entry<br>
 ; CHECK-NEXT:    pushq %rax<br>
 ; CHECK-NEXT:    .cfi_def_cfa_offset 16<br>
-; CHECK-NEXT:    movzwl %di, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %rax<br>
 ; CHECK-NEXT:    movl $4294967295, %ecx # imm = 0xFFFFFFFF<br>
 ; CHECK-NEXT:    cmpq %rcx, %rax<br>
@@ -957,13 +957,17 @@ define i16 @stest_f16i16_mm(half %x) {<br>
 ; CHECK:       # %bb.0: # %entry<br>
 ; CHECK-NEXT:    pushq %rax<br>
 ; CHECK-NEXT:    .cfi_def_cfa_offset 16<br>
-; CHECK-NEXT:    movzwl %di, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
-; CHECK-NEXT:    movss {{.*#+}} xmm1 = mem[0],zero,zero,zero<br>
-; CHECK-NEXT:    maxss %xmm0, %xmm1<br>
-; CHECK-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero<br>
-; CHECK-NEXT:    minss %xmm1, %xmm0<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %eax<br>
+; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
+; CHECK-NEXT:    movl $32768, %ecx # imm = 0x8000<br>
+; CHECK-NEXT:    cmovael %eax, %ecx<br>
+; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
+; CHECK-NEXT:    movl $32767, %edx # imm = 0x7FFF<br>
+; CHECK-NEXT:    cmovbel %ecx, %edx<br>
+; CHECK-NEXT:    xorl %eax, %eax<br>
+; CHECK-NEXT:    ucomiss %xmm0, %xmm0<br>
+; CHECK-NEXT:    cmovnpl %edx, %eax<br>
 ; CHECK-NEXT:    # kill: def $ax killed $ax killed $eax<br>
 ; CHECK-NEXT:    popq %rcx<br>
 ; CHECK-NEXT:    .cfi_def_cfa_offset 8<br>
@@ -981,8 +985,7 @@ define i16 @utesth_f16i16_mm(half %x) {<br>
 ; CHECK:       # %bb.0: # %entry<br>
 ; CHECK-NEXT:    pushq %rax<br>
 ; CHECK-NEXT:    .cfi_def_cfa_offset 16<br>
-; CHECK-NEXT:    movzwl %di, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %rcx<br>
 ; CHECK-NEXT:    cmpl $65535, %ecx # imm = 0xFFFF<br>
 ; CHECK-NEXT:    movl $65535, %eax # imm = 0xFFFF<br>
@@ -1003,8 +1006,7 @@ define i16 @ustest_f16i16_mm(half %x) {<br>
 ; CHECK:       # %bb.0: # %entry<br>
 ; CHECK-NEXT:    pushq %rax<br>
 ; CHECK-NEXT:    .cfi_def_cfa_offset 16<br>
-; CHECK-NEXT:    movzwl %di, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %eax<br>
 ; CHECK-NEXT:    cmpl $65535, %eax # imm = 0xFFFF<br>
 ; CHECK-NEXT:    movl $65535, %ecx # imm = 0xFFFF<br>
@@ -1163,15 +1165,17 @@ define i64 @stest_f16i64_mm(half %x) {<br>
 ; CHECK:       # %bb.0: # %entry<br>
 ; CHECK-NEXT:    pushq %rax<br>
 ; CHECK-NEXT:    .cfi_def_cfa_offset 16<br>
-; CHECK-NEXT:    movzwl %di, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %rax<br>
 ; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
-; CHECK-NEXT:    movabsq $9223372036854775807, %rcx # imm = 0x7FFFFFFFFFFFFFFF<br>
-; CHECK-NEXT:    cmovbeq %rax, %rcx<br>
+; CHECK-NEXT:    movabsq $-9223372036854775808, %rcx # imm = 0x8000000000000000<br>
+; CHECK-NEXT:    cmovaeq %rax, %rcx<br>
+; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
+; CHECK-NEXT:    movabsq $9223372036854775807, %rdx # imm = 0x7FFFFFFFFFFFFFFF<br>
+; CHECK-NEXT:    cmovbeq %rcx, %rdx<br>
 ; CHECK-NEXT:    xorl %eax, %eax<br>
 ; CHECK-NEXT:    ucomiss %xmm0, %xmm0<br>
-; CHECK-NEXT:    cmovnpq %rcx, %rax<br>
+; CHECK-NEXT:    cmovnpq %rdx, %rax<br>
 ; CHECK-NEXT:    popq %rcx<br>
 ; CHECK-NEXT:    .cfi_def_cfa_offset 8<br>
 ; CHECK-NEXT:    retq<br>
@@ -1188,9 +1192,7 @@ define i64 @utesth_f16i64_mm(half %x) {<br>
 ; CHECK:       # %bb.0: # %entry<br>
 ; CHECK-NEXT:    pushq %rax<br>
 ; CHECK-NEXT:    .cfi_def_cfa_offset 16<br>
-; CHECK-NEXT:    movzwl %di, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
-; CHECK-NEXT:    callq __fixunssfti@PLT<br>
+; CHECK-NEXT:    callq __fixunshfti@PLT<br>
 ; CHECK-NEXT:    xorl %ecx, %ecx<br>
 ; CHECK-NEXT:    testq %rdx, %rdx<br>
 ; CHECK-NEXT:    cmovneq %rcx, %rax<br>
@@ -1211,9 +1213,7 @@ define i64 @ustest_f16i64_mm(half %x) {<br>
 ; CHECK:       # %bb.0: # %entry<br>
 ; CHECK-NEXT:    pushq %rax<br>
 ; CHECK-NEXT:    .cfi_def_cfa_offset 16<br>
-; CHECK-NEXT:    movzwl %di, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
-; CHECK-NEXT:    callq __fixsfti@PLT<br>
+; CHECK-NEXT:    callq __fixhfti@PLT<br>
 ; CHECK-NEXT:    xorl %ecx, %ecx<br>
 ; CHECK-NEXT:    testq %rdx, %rdx<br>
 ; CHECK-NEXT:    movl $1, %esi<br>
<br>
diff  --git a/llvm/test/CodeGen/X86/fpclamptosat_vec.ll b/llvm/test/CodeGen/X86/fpclamptosat_vec.ll<br>
index 312fad5302ef1..54e4fc8af6749 100644<br>
--- a/llvm/test/CodeGen/X86/fpclamptosat_vec.ll<br>
+++ b/llvm/test/CodeGen/X86/fpclamptosat_vec.ll<br>
@@ -395,39 +395,33 @@ entry:<br>
 define <4 x i32> @stest_f16i32(<4 x half> %x) {<br>
 ; CHECK-LABEL: stest_f16i32:<br>
 ; CHECK:       # %bb.0: # %entry<br>
-; CHECK-NEXT:    pushq %rbp<br>
-; CHECK-NEXT:    .cfi_def_cfa_offset 16<br>
-; CHECK-NEXT:    pushq %r14<br>
-; CHECK-NEXT:    .cfi_def_cfa_offset 24<br>
-; CHECK-NEXT:    pushq %rbx<br>
-; CHECK-NEXT:    .cfi_def_cfa_offset 32<br>
-; CHECK-NEXT:    subq $32, %rsp<br>
-; CHECK-NEXT:    .cfi_def_cfa_offset 64<br>
-; CHECK-NEXT:    .cfi_offset %rbx, -32<br>
-; CHECK-NEXT:    .cfi_offset %r14, -24<br>
-; CHECK-NEXT:    .cfi_offset %rbp, -16<br>
-; CHECK-NEXT:    movl %edx, %ebp<br>
-; CHECK-NEXT:    movl %esi, %ebx<br>
-; CHECK-NEXT:    movl %edi, %r14d<br>
-; CHECK-NEXT:    movzwl %cx, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    subq $72, %rsp<br>
+; CHECK-NEXT:    .cfi_def_cfa_offset 80<br>
+; CHECK-NEXT:    movss %xmm2, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movss %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movaps %xmm3, %xmm0<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %rax<br>
 ; CHECK-NEXT:    movq %rax, %xmm0<br>
-; CHECK-NEXT:    movdqa %xmm0, (%rsp) # 16-byte Spill<br>
-; CHECK-NEXT:    movzwl %bp, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %rax<br>
 ; CHECK-NEXT:    movq %rax, %xmm0<br>
-; CHECK-NEXT:    punpcklqdq (%rsp), %xmm0 # 16-byte Folded Reload<br>
+; CHECK-NEXT:    punpcklqdq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload<br>
 ; CHECK-NEXT:    # xmm0 = xmm0[0],mem[0]<br>
-; CHECK-NEXT:    movdqa %xmm0, (%rsp) # 16-byte Spill<br>
-; CHECK-NEXT:    movzwl %bx, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %rax<br>
 ; CHECK-NEXT:    movq %rax, %xmm0<br>
 ; CHECK-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
-; CHECK-NEXT:    movzwl %r14w, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %rax<br>
 ; CHECK-NEXT:    movq %rax, %xmm3<br>
 ; CHECK-NEXT:    punpcklqdq {{[-0-9]+}}(%r{{[sb]}}p), %xmm3 # 16-byte Folded Reload<br>
@@ -448,7 +442,7 @@ define <4 x i32> @stest_f16i32(<4 x half> %x) {<br>
 ; CHECK-NEXT:    pand %xmm1, %xmm3<br>
 ; CHECK-NEXT:    pandn %xmm2, %xmm1<br>
 ; CHECK-NEXT:    por %xmm3, %xmm1<br>
-; CHECK-NEXT:    movdqa (%rsp), %xmm7 # 16-byte Reload<br>
+; CHECK-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm7 # 16-byte Reload<br>
 ; CHECK-NEXT:    movdqa %xmm7, %xmm3<br>
 ; CHECK-NEXT:    pxor %xmm0, %xmm3<br>
 ; CHECK-NEXT:    movdqa %xmm4, %xmm5<br>
@@ -491,13 +485,7 @@ define <4 x i32> @stest_f16i32(<4 x half> %x) {<br>
 ; CHECK-NEXT:    pandn %xmm2, %xmm0<br>
 ; CHECK-NEXT:    por %xmm1, %xmm0<br>
 ; CHECK-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2],xmm6[0,2]<br>
-; CHECK-NEXT:    addq $32, %rsp<br>
-; CHECK-NEXT:    .cfi_def_cfa_offset 32<br>
-; CHECK-NEXT:    popq %rbx<br>
-; CHECK-NEXT:    .cfi_def_cfa_offset 24<br>
-; CHECK-NEXT:    popq %r14<br>
-; CHECK-NEXT:    .cfi_def_cfa_offset 16<br>
-; CHECK-NEXT:    popq %rbp<br>
+; CHECK-NEXT:    addq $72, %rsp<br>
 ; CHECK-NEXT:    .cfi_def_cfa_offset 8<br>
 ; CHECK-NEXT:    retq<br>
 entry:<br>
@@ -513,22 +501,13 @@ entry:<br>
 define <4 x i32> @utesth_f16i32(<4 x half> %x) {<br>
 ; CHECK-LABEL: utesth_f16i32:<br>
 ; CHECK:       # %bb.0: # %entry<br>
-; CHECK-NEXT:    pushq %rbp<br>
-; CHECK-NEXT:    .cfi_def_cfa_offset 16<br>
-; CHECK-NEXT:    pushq %r14<br>
-; CHECK-NEXT:    .cfi_def_cfa_offset 24<br>
-; CHECK-NEXT:    pushq %rbx<br>
-; CHECK-NEXT:    .cfi_def_cfa_offset 32<br>
-; CHECK-NEXT:    subq $32, %rsp<br>
-; CHECK-NEXT:    .cfi_def_cfa_offset 64<br>
-; CHECK-NEXT:    .cfi_offset %rbx, -32<br>
-; CHECK-NEXT:    .cfi_offset %r14, -24<br>
-; CHECK-NEXT:    .cfi_offset %rbp, -16<br>
-; CHECK-NEXT:    movl %ecx, %ebp<br>
-; CHECK-NEXT:    movl %edx, %r14d<br>
-; CHECK-NEXT:    movl %edi, %ebx<br>
-; CHECK-NEXT:    movzwl %si, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    subq $72, %rsp<br>
+; CHECK-NEXT:    .cfi_def_cfa_offset 80<br>
+; CHECK-NEXT:    movss %xmm3, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movss %xmm2, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movaps %xmm1, %xmm0<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %rax<br>
 ; CHECK-NEXT:    subss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %rcx<br>
@@ -537,9 +516,10 @@ define <4 x i32> @utesth_f16i32(<4 x half> %x) {<br>
 ; CHECK-NEXT:    andq %rcx, %rdx<br>
 ; CHECK-NEXT:    orq %rax, %rdx<br>
 ; CHECK-NEXT:    movq %rdx, %xmm0<br>
-; CHECK-NEXT:    movdqa %xmm0, (%rsp) # 16-byte Spill<br>
-; CHECK-NEXT:    movzwl %bx, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %rax<br>
 ; CHECK-NEXT:    subss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %rcx<br>
@@ -548,11 +528,12 @@ define <4 x i32> @utesth_f16i32(<4 x half> %x) {<br>
 ; CHECK-NEXT:    andq %rcx, %rdx<br>
 ; CHECK-NEXT:    orq %rax, %rdx<br>
 ; CHECK-NEXT:    movq %rdx, %xmm0<br>
-; CHECK-NEXT:    punpcklqdq (%rsp), %xmm0 # 16-byte Folded Reload<br>
+; CHECK-NEXT:    punpcklqdq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload<br>
 ; CHECK-NEXT:    # xmm0 = xmm0[0],mem[0]<br>
-; CHECK-NEXT:    movdqa %xmm0, (%rsp) # 16-byte Spill<br>
-; CHECK-NEXT:    movzwl %bp, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %rax<br>
 ; CHECK-NEXT:    subss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %rcx<br>
@@ -562,8 +543,9 @@ define <4 x i32> @utesth_f16i32(<4 x half> %x) {<br>
 ; CHECK-NEXT:    orq %rax, %rdx<br>
 ; CHECK-NEXT:    movq %rdx, %xmm0<br>
 ; CHECK-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
-; CHECK-NEXT:    movzwl %r14w, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %rax<br>
 ; CHECK-NEXT:    subss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %rcx<br>
@@ -590,7 +572,7 @@ define <4 x i32> @utesth_f16i32(<4 x half> %x) {<br>
 ; CHECK-NEXT:    pand %xmm5, %xmm0<br>
 ; CHECK-NEXT:    pandn %xmm1, %xmm5<br>
 ; CHECK-NEXT:    por %xmm0, %xmm5<br>
-; CHECK-NEXT:    movdqa (%rsp), %xmm6 # 16-byte Reload<br>
+; CHECK-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm6 # 16-byte Reload<br>
 ; CHECK-NEXT:    pxor %xmm6, %xmm2<br>
 ; CHECK-NEXT:    movdqa %xmm4, %xmm0<br>
 ; CHECK-NEXT:    pcmpgtd %xmm2, %xmm0<br>
@@ -604,13 +586,7 @@ define <4 x i32> @utesth_f16i32(<4 x half> %x) {<br>
 ; CHECK-NEXT:    pandn %xmm1, %xmm0<br>
 ; CHECK-NEXT:    por %xmm6, %xmm0<br>
 ; CHECK-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2],xmm5[0,2]<br>
-; CHECK-NEXT:    addq $32, %rsp<br>
-; CHECK-NEXT:    .cfi_def_cfa_offset 32<br>
-; CHECK-NEXT:    popq %rbx<br>
-; CHECK-NEXT:    .cfi_def_cfa_offset 24<br>
-; CHECK-NEXT:    popq %r14<br>
-; CHECK-NEXT:    .cfi_def_cfa_offset 16<br>
-; CHECK-NEXT:    popq %rbp<br>
+; CHECK-NEXT:    addq $72, %rsp<br>
 ; CHECK-NEXT:    .cfi_def_cfa_offset 8<br>
 ; CHECK-NEXT:    retq<br>
 entry:<br>
@@ -624,39 +600,33 @@ entry:<br>
 define <4 x i32> @ustest_f16i32(<4 x half> %x) {<br>
 ; CHECK-LABEL: ustest_f16i32:<br>
 ; CHECK:       # %bb.0: # %entry<br>
-; CHECK-NEXT:    pushq %rbp<br>
-; CHECK-NEXT:    .cfi_def_cfa_offset 16<br>
-; CHECK-NEXT:    pushq %r14<br>
-; CHECK-NEXT:    .cfi_def_cfa_offset 24<br>
-; CHECK-NEXT:    pushq %rbx<br>
-; CHECK-NEXT:    .cfi_def_cfa_offset 32<br>
-; CHECK-NEXT:    subq $32, %rsp<br>
-; CHECK-NEXT:    .cfi_def_cfa_offset 64<br>
-; CHECK-NEXT:    .cfi_offset %rbx, -32<br>
-; CHECK-NEXT:    .cfi_offset %r14, -24<br>
-; CHECK-NEXT:    .cfi_offset %rbp, -16<br>
-; CHECK-NEXT:    movl %edx, %ebp<br>
-; CHECK-NEXT:    movl %esi, %ebx<br>
-; CHECK-NEXT:    movl %edi, %r14d<br>
-; CHECK-NEXT:    movzwl %cx, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    subq $72, %rsp<br>
+; CHECK-NEXT:    .cfi_def_cfa_offset 80<br>
+; CHECK-NEXT:    movss %xmm2, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movss %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movaps %xmm3, %xmm0<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %rax<br>
 ; CHECK-NEXT:    movq %rax, %xmm0<br>
-; CHECK-NEXT:    movdqa %xmm0, (%rsp) # 16-byte Spill<br>
-; CHECK-NEXT:    movzwl %bp, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %rax<br>
 ; CHECK-NEXT:    movq %rax, %xmm0<br>
-; CHECK-NEXT:    punpcklqdq (%rsp), %xmm0 # 16-byte Folded Reload<br>
+; CHECK-NEXT:    punpcklqdq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload<br>
 ; CHECK-NEXT:    # xmm0 = xmm0[0],mem[0]<br>
-; CHECK-NEXT:    movdqa %xmm0, (%rsp) # 16-byte Spill<br>
-; CHECK-NEXT:    movzwl %bx, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %rax<br>
 ; CHECK-NEXT:    movq %rax, %xmm0<br>
 ; CHECK-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
-; CHECK-NEXT:    movzwl %r14w, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %rax<br>
 ; CHECK-NEXT:    movq %rax, %xmm3<br>
 ; CHECK-NEXT:    punpcklqdq {{[-0-9]+}}(%r{{[sb]}}p), %xmm3 # 16-byte Folded Reload<br>
@@ -677,7 +647,7 @@ define <4 x i32> @ustest_f16i32(<4 x half> %x) {<br>
 ; CHECK-NEXT:    pand %xmm1, %xmm3<br>
 ; CHECK-NEXT:    pandn %xmm2, %xmm1<br>
 ; CHECK-NEXT:    por %xmm3, %xmm1<br>
-; CHECK-NEXT:    movdqa (%rsp), %xmm7 # 16-byte Reload<br>
+; CHECK-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm7 # 16-byte Reload<br>
 ; CHECK-NEXT:    movdqa %xmm7, %xmm3<br>
 ; CHECK-NEXT:    pxor %xmm0, %xmm3<br>
 ; CHECK-NEXT:    movdqa %xmm4, %xmm5<br>
@@ -713,13 +683,7 @@ define <4 x i32> @ustest_f16i32(<4 x half> %x) {<br>
 ; CHECK-NEXT:    por %xmm2, %xmm0<br>
 ; CHECK-NEXT:    pand %xmm1, %xmm0<br>
 ; CHECK-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2],xmm3[0,2]<br>
-; CHECK-NEXT:    addq $32, %rsp<br>
-; CHECK-NEXT:    .cfi_def_cfa_offset 32<br>
-; CHECK-NEXT:    popq %rbx<br>
-; CHECK-NEXT:    .cfi_def_cfa_offset 24<br>
-; CHECK-NEXT:    popq %r14<br>
-; CHECK-NEXT:    .cfi_def_cfa_offset 16<br>
-; CHECK-NEXT:    popq %rbp<br>
+; CHECK-NEXT:    addq $72, %rsp<br>
 ; CHECK-NEXT:    .cfi_def_cfa_offset 8<br>
 ; CHECK-NEXT:    retq<br>
 entry:<br>
@@ -891,52 +855,37 @@ entry:<br>
 define <8 x i16> @stest_f16i16(<8 x half> %x) {<br>
 ; CHECK-LABEL: stest_f16i16:<br>
 ; CHECK:       # %bb.0: # %entry<br>
-; CHECK-NEXT:    pushq %rbp<br>
-; CHECK-NEXT:    .cfi_def_cfa_offset 16<br>
-; CHECK-NEXT:    pushq %r15<br>
-; CHECK-NEXT:    .cfi_def_cfa_offset 24<br>
-; CHECK-NEXT:    pushq %r14<br>
-; CHECK-NEXT:    .cfi_def_cfa_offset 32<br>
-; CHECK-NEXT:    pushq %r13<br>
-; CHECK-NEXT:    .cfi_def_cfa_offset 40<br>
-; CHECK-NEXT:    pushq %r12<br>
-; CHECK-NEXT:    .cfi_def_cfa_offset 48<br>
-; CHECK-NEXT:    pushq %rbx<br>
-; CHECK-NEXT:    .cfi_def_cfa_offset 56<br>
-; CHECK-NEXT:    subq $72, %rsp<br>
-; CHECK-NEXT:    .cfi_def_cfa_offset 128<br>
-; CHECK-NEXT:    .cfi_offset %rbx, -56<br>
-; CHECK-NEXT:    .cfi_offset %r12, -48<br>
-; CHECK-NEXT:    .cfi_offset %r13, -40<br>
-; CHECK-NEXT:    .cfi_offset %r14, -32<br>
-; CHECK-NEXT:    .cfi_offset %r15, -24<br>
-; CHECK-NEXT:    .cfi_offset %rbp, -16<br>
-; CHECK-NEXT:    movl %r9d, %ebp<br>
-; CHECK-NEXT:    movl %r8d, %ebx<br>
-; CHECK-NEXT:    movl %ecx, %r13d<br>
-; CHECK-NEXT:    movl %edx, %r12d<br>
-; CHECK-NEXT:    movl %esi, %r15d<br>
-; CHECK-NEXT:    movl %edi, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%rsp), %r14d<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%rsp), %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    subq $136, %rsp<br>
+; CHECK-NEXT:    .cfi_def_cfa_offset 144<br>
+; CHECK-NEXT:    movss %xmm6, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movss %xmm5, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movss %xmm4, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movss %xmm3, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movss %xmm2, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movss %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movaps %xmm7, %xmm0<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %eax<br>
 ; CHECK-NEXT:    movd %eax, %xmm0<br>
 ; CHECK-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
-; CHECK-NEXT:    movl %r14d, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %eax<br>
 ; CHECK-NEXT:    movd %eax, %xmm0<br>
 ; CHECK-NEXT:    punpckldq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload<br>
 ; CHECK-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]<br>
 ; CHECK-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
-; CHECK-NEXT:    movzwl %bp, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %eax<br>
 ; CHECK-NEXT:    movd %eax, %xmm0<br>
 ; CHECK-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
-; CHECK-NEXT:    movzwl %bx, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %eax<br>
 ; CHECK-NEXT:    movd %eax, %xmm0<br>
 ; CHECK-NEXT:    punpckldq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload<br>
@@ -944,25 +893,29 @@ define <8 x i16> @stest_f16i16(<8 x half> %x) {<br>
 ; CHECK-NEXT:    punpcklqdq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload<br>
 ; CHECK-NEXT:    # xmm0 = xmm0[0],mem[0]<br>
 ; CHECK-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
-; CHECK-NEXT:    movzwl %r13w, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %eax<br>
 ; CHECK-NEXT:    movd %eax, %xmm0<br>
 ; CHECK-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
-; CHECK-NEXT:    movzwl %r12w, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %eax<br>
 ; CHECK-NEXT:    movd %eax, %xmm0<br>
 ; CHECK-NEXT:    punpckldq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload<br>
 ; CHECK-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]<br>
 ; CHECK-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
-; CHECK-NEXT:    movzwl %r15w, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %eax<br>
 ; CHECK-NEXT:    movd %eax, %xmm0<br>
 ; CHECK-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
-; CHECK-NEXT:    movzwl {{[-0-9]+}}(%r{{[sb]}}p), %edi # 2-byte Folded Reload<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %eax<br>
 ; CHECK-NEXT:    movd %eax, %xmm0<br>
 ; CHECK-NEXT:    punpckldq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload<br>
@@ -970,19 +923,7 @@ define <8 x i16> @stest_f16i16(<8 x half> %x) {<br>
 ; CHECK-NEXT:    punpcklqdq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload<br>
 ; CHECK-NEXT:    # xmm0 = xmm0[0],mem[0]<br>
 ; CHECK-NEXT:    packssdw {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload<br>
-; CHECK-NEXT:    addq $72, %rsp<br>
-; CHECK-NEXT:    .cfi_def_cfa_offset 56<br>
-; CHECK-NEXT:    popq %rbx<br>
-; CHECK-NEXT:    .cfi_def_cfa_offset 48<br>
-; CHECK-NEXT:    popq %r12<br>
-; CHECK-NEXT:    .cfi_def_cfa_offset 40<br>
-; CHECK-NEXT:    popq %r13<br>
-; CHECK-NEXT:    .cfi_def_cfa_offset 32<br>
-; CHECK-NEXT:    popq %r14<br>
-; CHECK-NEXT:    .cfi_def_cfa_offset 24<br>
-; CHECK-NEXT:    popq %r15<br>
-; CHECK-NEXT:    .cfi_def_cfa_offset 16<br>
-; CHECK-NEXT:    popq %rbp<br>
+; CHECK-NEXT:    addq $136, %rsp<br>
 ; CHECK-NEXT:    .cfi_def_cfa_offset 8<br>
 ; CHECK-NEXT:    retq<br>
 entry:<br>
@@ -998,52 +939,37 @@ entry:<br>
 define <8 x i16> @utesth_f16i16(<8 x half> %x) {<br>
 ; CHECK-LABEL: utesth_f16i16:<br>
 ; CHECK:       # %bb.0: # %entry<br>
-; CHECK-NEXT:    pushq %rbp<br>
-; CHECK-NEXT:    .cfi_def_cfa_offset 16<br>
-; CHECK-NEXT:    pushq %r15<br>
-; CHECK-NEXT:    .cfi_def_cfa_offset 24<br>
-; CHECK-NEXT:    pushq %r14<br>
-; CHECK-NEXT:    .cfi_def_cfa_offset 32<br>
-; CHECK-NEXT:    pushq %r13<br>
-; CHECK-NEXT:    .cfi_def_cfa_offset 40<br>
-; CHECK-NEXT:    pushq %r12<br>
-; CHECK-NEXT:    .cfi_def_cfa_offset 48<br>
-; CHECK-NEXT:    pushq %rbx<br>
-; CHECK-NEXT:    .cfi_def_cfa_offset 56<br>
-; CHECK-NEXT:    subq $72, %rsp<br>
-; CHECK-NEXT:    .cfi_def_cfa_offset 128<br>
-; CHECK-NEXT:    .cfi_offset %rbx, -56<br>
-; CHECK-NEXT:    .cfi_offset %r12, -48<br>
-; CHECK-NEXT:    .cfi_offset %r13, -40<br>
-; CHECK-NEXT:    .cfi_offset %r14, -32<br>
-; CHECK-NEXT:    .cfi_offset %r15, -24<br>
-; CHECK-NEXT:    .cfi_offset %rbp, -16<br>
-; CHECK-NEXT:    movl %r9d, %ebp<br>
-; CHECK-NEXT:    movl %r8d, %ebx<br>
-; CHECK-NEXT:    movl %ecx, %r13d<br>
-; CHECK-NEXT:    movl %edx, %r12d<br>
-; CHECK-NEXT:    movl %esi, %r15d<br>
-; CHECK-NEXT:    movl %edi, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%rsp), %r14d<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%rsp), %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    subq $136, %rsp<br>
+; CHECK-NEXT:    .cfi_def_cfa_offset 144<br>
+; CHECK-NEXT:    movss %xmm6, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movss %xmm5, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movss %xmm4, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movss %xmm3, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movss %xmm2, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movss %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movaps %xmm7, %xmm0<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %rax<br>
 ; CHECK-NEXT:    movd %eax, %xmm0<br>
 ; CHECK-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
-; CHECK-NEXT:    movl %r14d, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %rax<br>
 ; CHECK-NEXT:    movd %eax, %xmm0<br>
 ; CHECK-NEXT:    punpckldq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload<br>
 ; CHECK-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]<br>
 ; CHECK-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
-; CHECK-NEXT:    movzwl %bp, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %rax<br>
 ; CHECK-NEXT:    movd %eax, %xmm0<br>
 ; CHECK-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
-; CHECK-NEXT:    movzwl %bx, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %rax<br>
 ; CHECK-NEXT:    movd %eax, %xmm0<br>
 ; CHECK-NEXT:    punpckldq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload<br>
@@ -1051,25 +977,29 @@ define <8 x i16> @utesth_f16i16(<8 x half> %x) {<br>
 ; CHECK-NEXT:    punpcklqdq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload<br>
 ; CHECK-NEXT:    # xmm0 = xmm0[0],mem[0]<br>
 ; CHECK-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
-; CHECK-NEXT:    movzwl %r13w, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %rax<br>
 ; CHECK-NEXT:    movd %eax, %xmm0<br>
 ; CHECK-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
-; CHECK-NEXT:    movzwl %r12w, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %rax<br>
 ; CHECK-NEXT:    movd %eax, %xmm0<br>
 ; CHECK-NEXT:    punpckldq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload<br>
 ; CHECK-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]<br>
 ; CHECK-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
-; CHECK-NEXT:    movzwl %r15w, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %rax<br>
 ; CHECK-NEXT:    movd %eax, %xmm0<br>
 ; CHECK-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
-; CHECK-NEXT:    movzwl {{[-0-9]+}}(%r{{[sb]}}p), %edi # 2-byte Folded Reload<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %rax<br>
 ; CHECK-NEXT:    movd %eax, %xmm1<br>
 ; CHECK-NEXT:    punpckldq {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Folded Reload<br>
@@ -1097,19 +1027,7 @@ define <8 x i16> @utesth_f16i16(<8 x half> %x) {<br>
 ; CHECK-NEXT:    pslld $16, %xmm0<br>
 ; CHECK-NEXT:    psrad $16, %xmm0<br>
 ; CHECK-NEXT:    packssdw %xmm4, %xmm0<br>
-; CHECK-NEXT:    addq $72, %rsp<br>
-; CHECK-NEXT:    .cfi_def_cfa_offset 56<br>
-; CHECK-NEXT:    popq %rbx<br>
-; CHECK-NEXT:    .cfi_def_cfa_offset 48<br>
-; CHECK-NEXT:    popq %r12<br>
-; CHECK-NEXT:    .cfi_def_cfa_offset 40<br>
-; CHECK-NEXT:    popq %r13<br>
-; CHECK-NEXT:    .cfi_def_cfa_offset 32<br>
-; CHECK-NEXT:    popq %r14<br>
-; CHECK-NEXT:    .cfi_def_cfa_offset 24<br>
-; CHECK-NEXT:    popq %r15<br>
-; CHECK-NEXT:    .cfi_def_cfa_offset 16<br>
-; CHECK-NEXT:    popq %rbp<br>
+; CHECK-NEXT:    addq $136, %rsp<br>
 ; CHECK-NEXT:    .cfi_def_cfa_offset 8<br>
 ; CHECK-NEXT:    retq<br>
 entry:<br>
@@ -1123,52 +1041,37 @@ entry:<br>
 define <8 x i16> @ustest_f16i16(<8 x half> %x) {<br>
 ; CHECK-LABEL: ustest_f16i16:<br>
 ; CHECK:       # %bb.0: # %entry<br>
-; CHECK-NEXT:    pushq %rbp<br>
-; CHECK-NEXT:    .cfi_def_cfa_offset 16<br>
-; CHECK-NEXT:    pushq %r15<br>
-; CHECK-NEXT:    .cfi_def_cfa_offset 24<br>
-; CHECK-NEXT:    pushq %r14<br>
-; CHECK-NEXT:    .cfi_def_cfa_offset 32<br>
-; CHECK-NEXT:    pushq %r13<br>
-; CHECK-NEXT:    .cfi_def_cfa_offset 40<br>
-; CHECK-NEXT:    pushq %r12<br>
-; CHECK-NEXT:    .cfi_def_cfa_offset 48<br>
-; CHECK-NEXT:    pushq %rbx<br>
-; CHECK-NEXT:    .cfi_def_cfa_offset 56<br>
-; CHECK-NEXT:    subq $72, %rsp<br>
-; CHECK-NEXT:    .cfi_def_cfa_offset 128<br>
-; CHECK-NEXT:    .cfi_offset %rbx, -56<br>
-; CHECK-NEXT:    .cfi_offset %r12, -48<br>
-; CHECK-NEXT:    .cfi_offset %r13, -40<br>
-; CHECK-NEXT:    .cfi_offset %r14, -32<br>
-; CHECK-NEXT:    .cfi_offset %r15, -24<br>
-; CHECK-NEXT:    .cfi_offset %rbp, -16<br>
-; CHECK-NEXT:    movl %r9d, %r15d<br>
-; CHECK-NEXT:    movl %r8d, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movl %edx, %ebp<br>
-; CHECK-NEXT:    movl %esi, %r14d<br>
-; CHECK-NEXT:    movl %edi, %ebx<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%rsp), %r12d<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%rsp), %r13d<br>
-; CHECK-NEXT:    movzwl %cx, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    subq $136, %rsp<br>
+; CHECK-NEXT:    .cfi_def_cfa_offset 144<br>
+; CHECK-NEXT:    movss %xmm7, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movss %xmm6, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movss %xmm5, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movss %xmm4, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movss %xmm2, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movss %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movaps %xmm3, %xmm0<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %eax<br>
 ; CHECK-NEXT:    movd %eax, %xmm0<br>
 ; CHECK-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
-; CHECK-NEXT:    movzwl %bp, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %eax<br>
 ; CHECK-NEXT:    movd %eax, %xmm0<br>
 ; CHECK-NEXT:    punpckldq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload<br>
 ; CHECK-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]<br>
 ; CHECK-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
-; CHECK-NEXT:    movzwl %r14w, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %eax<br>
 ; CHECK-NEXT:    movd %eax, %xmm0<br>
 ; CHECK-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
-; CHECK-NEXT:    movzwl %bx, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %eax<br>
 ; CHECK-NEXT:    movd %eax, %xmm0<br>
 ; CHECK-NEXT:    punpckldq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload<br>
@@ -1176,25 +1079,29 @@ define <8 x i16> @ustest_f16i16(<8 x half> %x) {<br>
 ; CHECK-NEXT:    punpcklqdq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload<br>
 ; CHECK-NEXT:    # xmm0 = xmm0[0],mem[0]<br>
 ; CHECK-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
-; CHECK-NEXT:    movl %r13d, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %eax<br>
 ; CHECK-NEXT:    movd %eax, %xmm0<br>
 ; CHECK-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
-; CHECK-NEXT:    movl %r12d, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %eax<br>
 ; CHECK-NEXT:    movd %eax, %xmm0<br>
 ; CHECK-NEXT:    punpckldq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload<br>
 ; CHECK-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]<br>
 ; CHECK-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
-; CHECK-NEXT:    movzwl %r15w, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %eax<br>
 ; CHECK-NEXT:    movd %eax, %xmm0<br>
 ; CHECK-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
-; CHECK-NEXT:    movzwl {{[-0-9]+}}(%r{{[sb]}}p), %edi # 2-byte Folded Reload<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %eax<br>
 ; CHECK-NEXT:    movd %eax, %xmm0<br>
 ; CHECK-NEXT:    punpckldq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload<br>
@@ -1225,19 +1132,7 @@ define <8 x i16> @ustest_f16i16(<8 x half> %x) {<br>
 ; CHECK-NEXT:    pslld $16, %xmm0<br>
 ; CHECK-NEXT:    psrad $16, %xmm0<br>
 ; CHECK-NEXT:    packssdw %xmm3, %xmm0<br>
-; CHECK-NEXT:    addq $72, %rsp<br>
-; CHECK-NEXT:    .cfi_def_cfa_offset 56<br>
-; CHECK-NEXT:    popq %rbx<br>
-; CHECK-NEXT:    .cfi_def_cfa_offset 48<br>
-; CHECK-NEXT:    popq %r12<br>
-; CHECK-NEXT:    .cfi_def_cfa_offset 40<br>
-; CHECK-NEXT:    popq %r13<br>
-; CHECK-NEXT:    .cfi_def_cfa_offset 32<br>
-; CHECK-NEXT:    popq %r14<br>
-; CHECK-NEXT:    .cfi_def_cfa_offset 24<br>
-; CHECK-NEXT:    popq %r15<br>
-; CHECK-NEXT:    .cfi_def_cfa_offset 16<br>
-; CHECK-NEXT:    popq %rbp<br>
+; CHECK-NEXT:    addq $136, %rsp<br>
 ; CHECK-NEXT:    .cfi_def_cfa_offset 8<br>
 ; CHECK-NEXT:    retq<br>
 entry:<br>
@@ -1567,24 +1462,21 @@ entry:<br>
 define <2 x i64> @stest_f16i64(<2 x half> %x) {<br>
 ; CHECK-LABEL: stest_f16i64:<br>
 ; CHECK:       # %bb.0: # %entry<br>
-; CHECK-NEXT:    pushq %rbp<br>
-; CHECK-NEXT:    .cfi_def_cfa_offset 16<br>
 ; CHECK-NEXT:    pushq %r14<br>
-; CHECK-NEXT:    .cfi_def_cfa_offset 24<br>
+; CHECK-NEXT:    .cfi_def_cfa_offset 16<br>
 ; CHECK-NEXT:    pushq %rbx<br>
+; CHECK-NEXT:    .cfi_def_cfa_offset 24<br>
+; CHECK-NEXT:    pushq %rax<br>
 ; CHECK-NEXT:    .cfi_def_cfa_offset 32<br>
-; CHECK-NEXT:    .cfi_offset %rbx, -32<br>
-; CHECK-NEXT:    .cfi_offset %r14, -24<br>
-; CHECK-NEXT:    .cfi_offset %rbp, -16<br>
-; CHECK-NEXT:    movl %esi, %r14d<br>
-; CHECK-NEXT:    movzwl %di, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
-; CHECK-NEXT:    callq __fixsfti@PLT<br>
-; CHECK-NEXT:    movq %rax, %rbx<br>
-; CHECK-NEXT:    movq %rdx, %rbp<br>
-; CHECK-NEXT:    movzwl %r14w, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
-; CHECK-NEXT:    callq __fixsfti@PLT<br>
+; CHECK-NEXT:    .cfi_offset %rbx, -24<br>
+; CHECK-NEXT:    .cfi_offset %r14, -16<br>
+; CHECK-NEXT:    movss %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    callq __fixhfti@PLT<br>
+; CHECK-NEXT:    movq %rax, %r14<br>
+; CHECK-NEXT:    movq %rdx, %rbx<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __fixhfti@PLT<br>
 ; CHECK-NEXT:    xorl %ecx, %ecx<br>
 ; CHECK-NEXT:    movabsq $9223372036854775807, %rsi # imm = 0x7FFFFFFFFFFFFFFF<br>
 ; CHECK-NEXT:    cmpq %rsi, %rax<br>
@@ -1592,28 +1484,28 @@ define <2 x i64> @stest_f16i64(<2 x half> %x) {<br>
 ; CHECK-NEXT:    sbbq $0, %rdi<br>
 ; CHECK-NEXT:    cmovgeq %rcx, %rdx<br>
 ; CHECK-NEXT:    cmovgeq %rsi, %rax<br>
-; CHECK-NEXT:    cmpq %rsi, %rbx<br>
-; CHECK-NEXT:    movq %rbp, %rdi<br>
+; CHECK-NEXT:    cmpq %rsi, %r14<br>
+; CHECK-NEXT:    movq %rbx, %rdi<br>
 ; CHECK-NEXT:    sbbq $0, %rdi<br>
-; CHECK-NEXT:    cmovlq %rbp, %rcx<br>
-; CHECK-NEXT:    cmovlq %rbx, %rsi<br>
-; CHECK-NEXT:    movabsq $-9223372036854775808, %rdi # imm = 0x8000000000000000<br>
-; CHECK-NEXT:    cmpq %rsi, %rdi<br>
-; CHECK-NEXT:    movq $-1, %rbp<br>
+; CHECK-NEXT:    cmovlq %rbx, %rcx<br>
+; CHECK-NEXT:    cmovlq %r14, %rsi<br>
+; CHECK-NEXT:    movabsq $-9223372036854775808, %r8 # imm = 0x8000000000000000<br>
+; CHECK-NEXT:    cmpq %rsi, %r8<br>
 ; CHECK-NEXT:    movq $-1, %rbx<br>
-; CHECK-NEXT:    sbbq %rcx, %rbx<br>
-; CHECK-NEXT:    cmovgeq %rdi, %rsi<br>
-; CHECK-NEXT:    cmpq %rax, %rdi<br>
-; CHECK-NEXT:    sbbq %rdx, %rbp<br>
-; CHECK-NEXT:    cmovgeq %rdi, %rax<br>
+; CHECK-NEXT:    movq $-1, %rdi<br>
+; CHECK-NEXT:    sbbq %rcx, %rdi<br>
+; CHECK-NEXT:    cmovgeq %r8, %rsi<br>
+; CHECK-NEXT:    cmpq %rax, %r8<br>
+; CHECK-NEXT:    sbbq %rdx, %rbx<br>
+; CHECK-NEXT:    cmovgeq %r8, %rax<br>
 ; CHECK-NEXT:    movq %rax, %xmm1<br>
 ; CHECK-NEXT:    movq %rsi, %xmm0<br>
 ; CHECK-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]<br>
-; CHECK-NEXT:    popq %rbx<br>
+; CHECK-NEXT:    addq $8, %rsp<br>
 ; CHECK-NEXT:    .cfi_def_cfa_offset 24<br>
-; CHECK-NEXT:    popq %r14<br>
+; CHECK-NEXT:    popq %rbx<br>
 ; CHECK-NEXT:    .cfi_def_cfa_offset 16<br>
-; CHECK-NEXT:    popq %rbp<br>
+; CHECK-NEXT:    popq %r14<br>
 ; CHECK-NEXT:    .cfi_def_cfa_offset 8<br>
 ; CHECK-NEXT:    retq<br>
 entry:<br>
@@ -1629,24 +1521,22 @@ entry:<br>
 define <2 x i64> @utesth_f16i64(<2 x half> %x) {<br>
 ; CHECK-LABEL: utesth_f16i64:<br>
 ; CHECK:       # %bb.0: # %entry<br>
-; CHECK-NEXT:    pushq %rbp<br>
-; CHECK-NEXT:    .cfi_def_cfa_offset 16<br>
 ; CHECK-NEXT:    pushq %r14<br>
-; CHECK-NEXT:    .cfi_def_cfa_offset 24<br>
+; CHECK-NEXT:    .cfi_def_cfa_offset 16<br>
 ; CHECK-NEXT:    pushq %rbx<br>
+; CHECK-NEXT:    .cfi_def_cfa_offset 24<br>
+; CHECK-NEXT:    pushq %rax<br>
 ; CHECK-NEXT:    .cfi_def_cfa_offset 32<br>
-; CHECK-NEXT:    .cfi_offset %rbx, -32<br>
-; CHECK-NEXT:    .cfi_offset %r14, -24<br>
-; CHECK-NEXT:    .cfi_offset %rbp, -16<br>
-; CHECK-NEXT:    movl %edi, %ebp<br>
-; CHECK-NEXT:    movzwl %si, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
-; CHECK-NEXT:    callq __fixunssfti@PLT<br>
+; CHECK-NEXT:    .cfi_offset %rbx, -24<br>
+; CHECK-NEXT:    .cfi_offset %r14, -16<br>
+; CHECK-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movaps %xmm1, %xmm0<br>
+; CHECK-NEXT:    callq __fixunshfti@PLT<br>
 ; CHECK-NEXT:    movq %rax, %rbx<br>
 ; CHECK-NEXT:    movq %rdx, %r14<br>
-; CHECK-NEXT:    movzwl %bp, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
-; CHECK-NEXT:    callq __fixunssfti@PLT<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __fixunshfti@PLT<br>
 ; CHECK-NEXT:    xorl %ecx, %ecx<br>
 ; CHECK-NEXT:    testq %rdx, %rdx<br>
 ; CHECK-NEXT:    cmovneq %rcx, %rax<br>
@@ -1655,11 +1545,11 @@ define <2 x i64> @utesth_f16i64(<2 x half> %x) {<br>
 ; CHECK-NEXT:    movq %rbx, %xmm1<br>
 ; CHECK-NEXT:    movq %rax, %xmm0<br>
 ; CHECK-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]<br>
-; CHECK-NEXT:    popq %rbx<br>
+; CHECK-NEXT:    addq $8, %rsp<br>
 ; CHECK-NEXT:    .cfi_def_cfa_offset 24<br>
-; CHECK-NEXT:    popq %r14<br>
+; CHECK-NEXT:    popq %rbx<br>
 ; CHECK-NEXT:    .cfi_def_cfa_offset 16<br>
-; CHECK-NEXT:    popq %rbp<br>
+; CHECK-NEXT:    popq %r14<br>
 ; CHECK-NEXT:    .cfi_def_cfa_offset 8<br>
 ; CHECK-NEXT:    retq<br>
 entry:<br>
@@ -1673,31 +1563,28 @@ entry:<br>
 define <2 x i64> @ustest_f16i64(<2 x half> %x) {<br>
 ; CHECK-LABEL: ustest_f16i64:<br>
 ; CHECK:       # %bb.0: # %entry<br>
-; CHECK-NEXT:    pushq %rbp<br>
-; CHECK-NEXT:    .cfi_def_cfa_offset 16<br>
 ; CHECK-NEXT:    pushq %r14<br>
-; CHECK-NEXT:    .cfi_def_cfa_offset 24<br>
+; CHECK-NEXT:    .cfi_def_cfa_offset 16<br>
 ; CHECK-NEXT:    pushq %rbx<br>
+; CHECK-NEXT:    .cfi_def_cfa_offset 24<br>
+; CHECK-NEXT:    pushq %rax<br>
 ; CHECK-NEXT:    .cfi_def_cfa_offset 32<br>
-; CHECK-NEXT:    .cfi_offset %rbx, -32<br>
-; CHECK-NEXT:    .cfi_offset %r14, -24<br>
-; CHECK-NEXT:    .cfi_offset %rbp, -16<br>
-; CHECK-NEXT:    movl %esi, %r14d<br>
-; CHECK-NEXT:    movzwl %di, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
-; CHECK-NEXT:    callq __fixsfti@PLT<br>
+; CHECK-NEXT:    .cfi_offset %rbx, -24<br>
+; CHECK-NEXT:    .cfi_offset %r14, -16<br>
+; CHECK-NEXT:    movss %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    callq __fixhfti@PLT<br>
 ; CHECK-NEXT:    movq %rax, %rbx<br>
-; CHECK-NEXT:    movq %rdx, %rbp<br>
-; CHECK-NEXT:    movzwl %r14w, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
-; CHECK-NEXT:    callq __fixsfti@PLT<br>
+; CHECK-NEXT:    movq %rdx, %r14<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __fixhfti@PLT<br>
 ; CHECK-NEXT:    xorl %ecx, %ecx<br>
 ; CHECK-NEXT:    testq %rdx, %rdx<br>
 ; CHECK-NEXT:    movl $1, %esi<br>
 ; CHECK-NEXT:    cmovgq %rsi, %rdx<br>
 ; CHECK-NEXT:    cmovgq %rcx, %rax<br>
-; CHECK-NEXT:    testq %rbp, %rbp<br>
-; CHECK-NEXT:    cmovleq %rbp, %rsi<br>
+; CHECK-NEXT:    testq %r14, %r14<br>
+; CHECK-NEXT:    cmovleq %r14, %rsi<br>
 ; CHECK-NEXT:    cmovgq %rcx, %rbx<br>
 ; CHECK-NEXT:    movq %rbx, %rdi<br>
 ; CHECK-NEXT:    negq %rdi<br>
@@ -1712,11 +1599,11 @@ define <2 x i64> @ustest_f16i64(<2 x half> %x) {<br>
 ; CHECK-NEXT:    movq %rax, %xmm1<br>
 ; CHECK-NEXT:    movq %rbx, %xmm0<br>
 ; CHECK-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]<br>
-; CHECK-NEXT:    popq %rbx<br>
+; CHECK-NEXT:    addq $8, %rsp<br>
 ; CHECK-NEXT:    .cfi_def_cfa_offset 24<br>
-; CHECK-NEXT:    popq %r14<br>
+; CHECK-NEXT:    popq %rbx<br>
 ; CHECK-NEXT:    .cfi_def_cfa_offset 16<br>
-; CHECK-NEXT:    popq %rbp<br>
+; CHECK-NEXT:    popq %r14<br>
 ; CHECK-NEXT:    .cfi_def_cfa_offset 8<br>
 ; CHECK-NEXT:    retq<br>
 entry:<br>
@@ -2115,39 +2002,33 @@ entry:<br>
 define <4 x i32> @stest_f16i32_mm(<4 x half> %x) {<br>
 ; CHECK-LABEL: stest_f16i32_mm:<br>
 ; CHECK:       # %bb.0: # %entry<br>
-; CHECK-NEXT:    pushq %rbp<br>
-; CHECK-NEXT:    .cfi_def_cfa_offset 16<br>
-; CHECK-NEXT:    pushq %r14<br>
-; CHECK-NEXT:    .cfi_def_cfa_offset 24<br>
-; CHECK-NEXT:    pushq %rbx<br>
-; CHECK-NEXT:    .cfi_def_cfa_offset 32<br>
-; CHECK-NEXT:    subq $32, %rsp<br>
-; CHECK-NEXT:    .cfi_def_cfa_offset 64<br>
-; CHECK-NEXT:    .cfi_offset %rbx, -32<br>
-; CHECK-NEXT:    .cfi_offset %r14, -24<br>
-; CHECK-NEXT:    .cfi_offset %rbp, -16<br>
-; CHECK-NEXT:    movl %edx, %ebp<br>
-; CHECK-NEXT:    movl %esi, %ebx<br>
-; CHECK-NEXT:    movl %edi, %r14d<br>
-; CHECK-NEXT:    movzwl %cx, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    subq $72, %rsp<br>
+; CHECK-NEXT:    .cfi_def_cfa_offset 80<br>
+; CHECK-NEXT:    movss %xmm2, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movss %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movaps %xmm3, %xmm0<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %rax<br>
 ; CHECK-NEXT:    movq %rax, %xmm0<br>
-; CHECK-NEXT:    movdqa %xmm0, (%rsp) # 16-byte Spill<br>
-; CHECK-NEXT:    movzwl %bp, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %rax<br>
 ; CHECK-NEXT:    movq %rax, %xmm0<br>
-; CHECK-NEXT:    punpcklqdq (%rsp), %xmm0 # 16-byte Folded Reload<br>
+; CHECK-NEXT:    punpcklqdq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload<br>
 ; CHECK-NEXT:    # xmm0 = xmm0[0],mem[0]<br>
-; CHECK-NEXT:    movdqa %xmm0, (%rsp) # 16-byte Spill<br>
-; CHECK-NEXT:    movzwl %bx, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %rax<br>
 ; CHECK-NEXT:    movq %rax, %xmm0<br>
 ; CHECK-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
-; CHECK-NEXT:    movzwl %r14w, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %rax<br>
 ; CHECK-NEXT:    movq %rax, %xmm2<br>
 ; CHECK-NEXT:    punpcklqdq {{[-0-9]+}}(%r{{[sb]}}p), %xmm2 # 16-byte Folded Reload<br>
@@ -2168,7 +2049,7 @@ define <4 x i32> @stest_f16i32_mm(<4 x half> %x) {<br>
 ; CHECK-NEXT:    pand %xmm1, %xmm2<br>
 ; CHECK-NEXT:    pandn %xmm4, %xmm1<br>
 ; CHECK-NEXT:    por %xmm2, %xmm1<br>
-; CHECK-NEXT:    movdqa (%rsp), %xmm7 # 16-byte Reload<br>
+; CHECK-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm7 # 16-byte Reload<br>
 ; CHECK-NEXT:    movdqa %xmm7, %xmm2<br>
 ; CHECK-NEXT:    pxor %xmm0, %xmm2<br>
 ; CHECK-NEXT:    movdqa %xmm3, %xmm5<br>
@@ -2211,13 +2092,7 @@ define <4 x i32> @stest_f16i32_mm(<4 x half> %x) {<br>
 ; CHECK-NEXT:    pandn %xmm2, %xmm0<br>
 ; CHECK-NEXT:    por %xmm1, %xmm0<br>
 ; CHECK-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2],xmm5[0,2]<br>
-; CHECK-NEXT:    addq $32, %rsp<br>
-; CHECK-NEXT:    .cfi_def_cfa_offset 32<br>
-; CHECK-NEXT:    popq %rbx<br>
-; CHECK-NEXT:    .cfi_def_cfa_offset 24<br>
-; CHECK-NEXT:    popq %r14<br>
-; CHECK-NEXT:    .cfi_def_cfa_offset 16<br>
-; CHECK-NEXT:    popq %rbp<br>
+; CHECK-NEXT:    addq $72, %rsp<br>
 ; CHECK-NEXT:    .cfi_def_cfa_offset 8<br>
 ; CHECK-NEXT:    retq<br>
 entry:<br>
@@ -2231,22 +2106,13 @@ entry:<br>
 define <4 x i32> @utesth_f16i32_mm(<4 x half> %x) {<br>
 ; CHECK-LABEL: utesth_f16i32_mm:<br>
 ; CHECK:       # %bb.0: # %entry<br>
-; CHECK-NEXT:    pushq %rbp<br>
-; CHECK-NEXT:    .cfi_def_cfa_offset 16<br>
-; CHECK-NEXT:    pushq %r14<br>
-; CHECK-NEXT:    .cfi_def_cfa_offset 24<br>
-; CHECK-NEXT:    pushq %rbx<br>
-; CHECK-NEXT:    .cfi_def_cfa_offset 32<br>
-; CHECK-NEXT:    subq $32, %rsp<br>
-; CHECK-NEXT:    .cfi_def_cfa_offset 64<br>
-; CHECK-NEXT:    .cfi_offset %rbx, -32<br>
-; CHECK-NEXT:    .cfi_offset %r14, -24<br>
-; CHECK-NEXT:    .cfi_offset %rbp, -16<br>
-; CHECK-NEXT:    movl %ecx, %ebp<br>
-; CHECK-NEXT:    movl %edx, %r14d<br>
-; CHECK-NEXT:    movl %edi, %ebx<br>
-; CHECK-NEXT:    movzwl %si, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    subq $72, %rsp<br>
+; CHECK-NEXT:    .cfi_def_cfa_offset 80<br>
+; CHECK-NEXT:    movss %xmm3, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movss %xmm2, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movaps %xmm1, %xmm0<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %rax<br>
 ; CHECK-NEXT:    subss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %rcx<br>
@@ -2255,9 +2121,10 @@ define <4 x i32> @utesth_f16i32_mm(<4 x half> %x) {<br>
 ; CHECK-NEXT:    andq %rcx, %rdx<br>
 ; CHECK-NEXT:    orq %rax, %rdx<br>
 ; CHECK-NEXT:    movq %rdx, %xmm0<br>
-; CHECK-NEXT:    movdqa %xmm0, (%rsp) # 16-byte Spill<br>
-; CHECK-NEXT:    movzwl %bx, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %rax<br>
 ; CHECK-NEXT:    subss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %rcx<br>
@@ -2266,11 +2133,12 @@ define <4 x i32> @utesth_f16i32_mm(<4 x half> %x) {<br>
 ; CHECK-NEXT:    andq %rcx, %rdx<br>
 ; CHECK-NEXT:    orq %rax, %rdx<br>
 ; CHECK-NEXT:    movq %rdx, %xmm0<br>
-; CHECK-NEXT:    punpcklqdq (%rsp), %xmm0 # 16-byte Folded Reload<br>
+; CHECK-NEXT:    punpcklqdq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload<br>
 ; CHECK-NEXT:    # xmm0 = xmm0[0],mem[0]<br>
-; CHECK-NEXT:    movdqa %xmm0, (%rsp) # 16-byte Spill<br>
-; CHECK-NEXT:    movzwl %bp, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %rax<br>
 ; CHECK-NEXT:    subss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %rcx<br>
@@ -2280,8 +2148,9 @@ define <4 x i32> @utesth_f16i32_mm(<4 x half> %x) {<br>
 ; CHECK-NEXT:    orq %rax, %rdx<br>
 ; CHECK-NEXT:    movq %rdx, %xmm0<br>
 ; CHECK-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
-; CHECK-NEXT:    movzwl %r14w, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %rax<br>
 ; CHECK-NEXT:    subss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %rcx<br>
@@ -2308,7 +2177,7 @@ define <4 x i32> @utesth_f16i32_mm(<4 x half> %x) {<br>
 ; CHECK-NEXT:    pand %xmm4, %xmm0<br>
 ; CHECK-NEXT:    pandn %xmm2, %xmm4<br>
 ; CHECK-NEXT:    por %xmm0, %xmm4<br>
-; CHECK-NEXT:    movdqa (%rsp), %xmm6 # 16-byte Reload<br>
+; CHECK-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm6 # 16-byte Reload<br>
 ; CHECK-NEXT:    pxor %xmm6, %xmm1<br>
 ; CHECK-NEXT:    movdqa %xmm3, %xmm0<br>
 ; CHECK-NEXT:    pcmpgtd %xmm1, %xmm0<br>
@@ -2322,13 +2191,7 @@ define <4 x i32> @utesth_f16i32_mm(<4 x half> %x) {<br>
 ; CHECK-NEXT:    pandn %xmm2, %xmm0<br>
 ; CHECK-NEXT:    por %xmm6, %xmm0<br>
 ; CHECK-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2],xmm4[0,2]<br>
-; CHECK-NEXT:    addq $32, %rsp<br>
-; CHECK-NEXT:    .cfi_def_cfa_offset 32<br>
-; CHECK-NEXT:    popq %rbx<br>
-; CHECK-NEXT:    .cfi_def_cfa_offset 24<br>
-; CHECK-NEXT:    popq %r14<br>
-; CHECK-NEXT:    .cfi_def_cfa_offset 16<br>
-; CHECK-NEXT:    popq %rbp<br>
+; CHECK-NEXT:    addq $72, %rsp<br>
 ; CHECK-NEXT:    .cfi_def_cfa_offset 8<br>
 ; CHECK-NEXT:    retq<br>
 entry:<br>
@@ -2341,39 +2204,33 @@ entry:<br>
 define <4 x i32> @ustest_f16i32_mm(<4 x half> %x) {<br>
 ; CHECK-LABEL: ustest_f16i32_mm:<br>
 ; CHECK:       # %bb.0: # %entry<br>
-; CHECK-NEXT:    pushq %rbp<br>
-; CHECK-NEXT:    .cfi_def_cfa_offset 16<br>
-; CHECK-NEXT:    pushq %r14<br>
-; CHECK-NEXT:    .cfi_def_cfa_offset 24<br>
-; CHECK-NEXT:    pushq %rbx<br>
-; CHECK-NEXT:    .cfi_def_cfa_offset 32<br>
-; CHECK-NEXT:    subq $32, %rsp<br>
-; CHECK-NEXT:    .cfi_def_cfa_offset 64<br>
-; CHECK-NEXT:    .cfi_offset %rbx, -32<br>
-; CHECK-NEXT:    .cfi_offset %r14, -24<br>
-; CHECK-NEXT:    .cfi_offset %rbp, -16<br>
-; CHECK-NEXT:    movl %edx, %ebp<br>
-; CHECK-NEXT:    movl %esi, %ebx<br>
-; CHECK-NEXT:    movl %edi, %r14d<br>
-; CHECK-NEXT:    movzwl %cx, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    subq $72, %rsp<br>
+; CHECK-NEXT:    .cfi_def_cfa_offset 80<br>
+; CHECK-NEXT:    movss %xmm2, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movss %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movaps %xmm3, %xmm0<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %rax<br>
 ; CHECK-NEXT:    movq %rax, %xmm0<br>
-; CHECK-NEXT:    movdqa %xmm0, (%rsp) # 16-byte Spill<br>
-; CHECK-NEXT:    movzwl %bp, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %rax<br>
 ; CHECK-NEXT:    movq %rax, %xmm0<br>
-; CHECK-NEXT:    punpcklqdq (%rsp), %xmm0 # 16-byte Folded Reload<br>
+; CHECK-NEXT:    punpcklqdq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload<br>
 ; CHECK-NEXT:    # xmm0 = xmm0[0],mem[0]<br>
-; CHECK-NEXT:    movdqa %xmm0, (%rsp) # 16-byte Spill<br>
-; CHECK-NEXT:    movzwl %bx, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %rax<br>
 ; CHECK-NEXT:    movq %rax, %xmm0<br>
 ; CHECK-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
-; CHECK-NEXT:    movzwl %r14w, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %rax<br>
 ; CHECK-NEXT:    movq %rax, %xmm2<br>
 ; CHECK-NEXT:    punpcklqdq {{[-0-9]+}}(%r{{[sb]}}p), %xmm2 # 16-byte Folded Reload<br>
@@ -2394,7 +2251,7 @@ define <4 x i32> @ustest_f16i32_mm(<4 x half> %x) {<br>
 ; CHECK-NEXT:    pand %xmm1, %xmm2<br>
 ; CHECK-NEXT:    pandn %xmm4, %xmm1<br>
 ; CHECK-NEXT:    por %xmm2, %xmm1<br>
-; CHECK-NEXT:    movdqa (%rsp), %xmm7 # 16-byte Reload<br>
+; CHECK-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm7 # 16-byte Reload<br>
 ; CHECK-NEXT:    movdqa %xmm7, %xmm2<br>
 ; CHECK-NEXT:    pxor %xmm0, %xmm2<br>
 ; CHECK-NEXT:    movdqa %xmm3, %xmm5<br>
@@ -2430,13 +2287,7 @@ define <4 x i32> @ustest_f16i32_mm(<4 x half> %x) {<br>
 ; CHECK-NEXT:    por %xmm2, %xmm0<br>
 ; CHECK-NEXT:    pand %xmm1, %xmm0<br>
 ; CHECK-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2],xmm4[0,2]<br>
-; CHECK-NEXT:    addq $32, %rsp<br>
-; CHECK-NEXT:    .cfi_def_cfa_offset 32<br>
-; CHECK-NEXT:    popq %rbx<br>
-; CHECK-NEXT:    .cfi_def_cfa_offset 24<br>
-; CHECK-NEXT:    popq %r14<br>
-; CHECK-NEXT:    .cfi_def_cfa_offset 16<br>
-; CHECK-NEXT:    popq %rbp<br>
+; CHECK-NEXT:    addq $72, %rsp<br>
 ; CHECK-NEXT:    .cfi_def_cfa_offset 8<br>
 ; CHECK-NEXT:    retq<br>
 entry:<br>
@@ -2596,52 +2447,37 @@ entry:<br>
 define <8 x i16> @stest_f16i16_mm(<8 x half> %x) {<br>
 ; CHECK-LABEL: stest_f16i16_mm:<br>
 ; CHECK:       # %bb.0: # %entry<br>
-; CHECK-NEXT:    pushq %rbp<br>
-; CHECK-NEXT:    .cfi_def_cfa_offset 16<br>
-; CHECK-NEXT:    pushq %r15<br>
-; CHECK-NEXT:    .cfi_def_cfa_offset 24<br>
-; CHECK-NEXT:    pushq %r14<br>
-; CHECK-NEXT:    .cfi_def_cfa_offset 32<br>
-; CHECK-NEXT:    pushq %r13<br>
-; CHECK-NEXT:    .cfi_def_cfa_offset 40<br>
-; CHECK-NEXT:    pushq %r12<br>
-; CHECK-NEXT:    .cfi_def_cfa_offset 48<br>
-; CHECK-NEXT:    pushq %rbx<br>
-; CHECK-NEXT:    .cfi_def_cfa_offset 56<br>
-; CHECK-NEXT:    subq $72, %rsp<br>
-; CHECK-NEXT:    .cfi_def_cfa_offset 128<br>
-; CHECK-NEXT:    .cfi_offset %rbx, -56<br>
-; CHECK-NEXT:    .cfi_offset %r12, -48<br>
-; CHECK-NEXT:    .cfi_offset %r13, -40<br>
-; CHECK-NEXT:    .cfi_offset %r14, -32<br>
-; CHECK-NEXT:    .cfi_offset %r15, -24<br>
-; CHECK-NEXT:    .cfi_offset %rbp, -16<br>
-; CHECK-NEXT:    movl %r9d, %ebp<br>
-; CHECK-NEXT:    movl %r8d, %ebx<br>
-; CHECK-NEXT:    movl %ecx, %r13d<br>
-; CHECK-NEXT:    movl %edx, %r12d<br>
-; CHECK-NEXT:    movl %esi, %r15d<br>
-; CHECK-NEXT:    movl %edi, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%rsp), %r14d<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%rsp), %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    subq $136, %rsp<br>
+; CHECK-NEXT:    .cfi_def_cfa_offset 144<br>
+; CHECK-NEXT:    movss %xmm6, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movss %xmm5, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movss %xmm4, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movss %xmm3, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movss %xmm2, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movss %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movaps %xmm7, %xmm0<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %eax<br>
 ; CHECK-NEXT:    movd %eax, %xmm0<br>
 ; CHECK-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
-; CHECK-NEXT:    movl %r14d, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %eax<br>
 ; CHECK-NEXT:    movd %eax, %xmm0<br>
 ; CHECK-NEXT:    punpckldq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload<br>
 ; CHECK-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]<br>
 ; CHECK-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
-; CHECK-NEXT:    movzwl %bp, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %eax<br>
 ; CHECK-NEXT:    movd %eax, %xmm0<br>
 ; CHECK-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
-; CHECK-NEXT:    movzwl %bx, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %eax<br>
 ; CHECK-NEXT:    movd %eax, %xmm0<br>
 ; CHECK-NEXT:    punpckldq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload<br>
@@ -2649,25 +2485,29 @@ define <8 x i16> @stest_f16i16_mm(<8 x half> %x) {<br>
 ; CHECK-NEXT:    punpcklqdq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload<br>
 ; CHECK-NEXT:    # xmm0 = xmm0[0],mem[0]<br>
 ; CHECK-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
-; CHECK-NEXT:    movzwl %r13w, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %eax<br>
 ; CHECK-NEXT:    movd %eax, %xmm0<br>
 ; CHECK-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
-; CHECK-NEXT:    movzwl %r12w, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %eax<br>
 ; CHECK-NEXT:    movd %eax, %xmm0<br>
 ; CHECK-NEXT:    punpckldq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload<br>
 ; CHECK-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]<br>
 ; CHECK-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
-; CHECK-NEXT:    movzwl %r15w, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %eax<br>
 ; CHECK-NEXT:    movd %eax, %xmm0<br>
 ; CHECK-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
-; CHECK-NEXT:    movzwl {{[-0-9]+}}(%r{{[sb]}}p), %edi # 2-byte Folded Reload<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %eax<br>
 ; CHECK-NEXT:    movd %eax, %xmm0<br>
 ; CHECK-NEXT:    punpckldq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload<br>
@@ -2675,19 +2515,7 @@ define <8 x i16> @stest_f16i16_mm(<8 x half> %x) {<br>
 ; CHECK-NEXT:    punpcklqdq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload<br>
 ; CHECK-NEXT:    # xmm0 = xmm0[0],mem[0]<br>
 ; CHECK-NEXT:    packssdw {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload<br>
-; CHECK-NEXT:    addq $72, %rsp<br>
-; CHECK-NEXT:    .cfi_def_cfa_offset 56<br>
-; CHECK-NEXT:    popq %rbx<br>
-; CHECK-NEXT:    .cfi_def_cfa_offset 48<br>
-; CHECK-NEXT:    popq %r12<br>
-; CHECK-NEXT:    .cfi_def_cfa_offset 40<br>
-; CHECK-NEXT:    popq %r13<br>
-; CHECK-NEXT:    .cfi_def_cfa_offset 32<br>
-; CHECK-NEXT:    popq %r14<br>
-; CHECK-NEXT:    .cfi_def_cfa_offset 24<br>
-; CHECK-NEXT:    popq %r15<br>
-; CHECK-NEXT:    .cfi_def_cfa_offset 16<br>
-; CHECK-NEXT:    popq %rbp<br>
+; CHECK-NEXT:    addq $136, %rsp<br>
 ; CHECK-NEXT:    .cfi_def_cfa_offset 8<br>
 ; CHECK-NEXT:    retq<br>
 entry:<br>
@@ -2701,52 +2529,37 @@ entry:<br>
 define <8 x i16> @utesth_f16i16_mm(<8 x half> %x) {<br>
 ; CHECK-LABEL: utesth_f16i16_mm:<br>
 ; CHECK:       # %bb.0: # %entry<br>
-; CHECK-NEXT:    pushq %rbp<br>
-; CHECK-NEXT:    .cfi_def_cfa_offset 16<br>
-; CHECK-NEXT:    pushq %r15<br>
-; CHECK-NEXT:    .cfi_def_cfa_offset 24<br>
-; CHECK-NEXT:    pushq %r14<br>
-; CHECK-NEXT:    .cfi_def_cfa_offset 32<br>
-; CHECK-NEXT:    pushq %r13<br>
-; CHECK-NEXT:    .cfi_def_cfa_offset 40<br>
-; CHECK-NEXT:    pushq %r12<br>
-; CHECK-NEXT:    .cfi_def_cfa_offset 48<br>
-; CHECK-NEXT:    pushq %rbx<br>
-; CHECK-NEXT:    .cfi_def_cfa_offset 56<br>
-; CHECK-NEXT:    subq $72, %rsp<br>
-; CHECK-NEXT:    .cfi_def_cfa_offset 128<br>
-; CHECK-NEXT:    .cfi_offset %rbx, -56<br>
-; CHECK-NEXT:    .cfi_offset %r12, -48<br>
-; CHECK-NEXT:    .cfi_offset %r13, -40<br>
-; CHECK-NEXT:    .cfi_offset %r14, -32<br>
-; CHECK-NEXT:    .cfi_offset %r15, -24<br>
-; CHECK-NEXT:    .cfi_offset %rbp, -16<br>
-; CHECK-NEXT:    movl %r9d, %ebp<br>
-; CHECK-NEXT:    movl %r8d, %ebx<br>
-; CHECK-NEXT:    movl %ecx, %r13d<br>
-; CHECK-NEXT:    movl %edx, %r12d<br>
-; CHECK-NEXT:    movl %esi, %r15d<br>
-; CHECK-NEXT:    movl %edi, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%rsp), %r14d<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%rsp), %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    subq $136, %rsp<br>
+; CHECK-NEXT:    .cfi_def_cfa_offset 144<br>
+; CHECK-NEXT:    movss %xmm6, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movss %xmm5, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movss %xmm4, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movss %xmm3, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movss %xmm2, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movss %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movaps %xmm7, %xmm0<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %rax<br>
 ; CHECK-NEXT:    movd %eax, %xmm0<br>
 ; CHECK-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
-; CHECK-NEXT:    movl %r14d, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %rax<br>
 ; CHECK-NEXT:    movd %eax, %xmm0<br>
 ; CHECK-NEXT:    punpckldq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload<br>
 ; CHECK-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]<br>
 ; CHECK-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
-; CHECK-NEXT:    movzwl %bp, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %rax<br>
 ; CHECK-NEXT:    movd %eax, %xmm0<br>
 ; CHECK-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
-; CHECK-NEXT:    movzwl %bx, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %rax<br>
 ; CHECK-NEXT:    movd %eax, %xmm0<br>
 ; CHECK-NEXT:    punpckldq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload<br>
@@ -2754,25 +2567,29 @@ define <8 x i16> @utesth_f16i16_mm(<8 x half> %x) {<br>
 ; CHECK-NEXT:    punpcklqdq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload<br>
 ; CHECK-NEXT:    # xmm0 = xmm0[0],mem[0]<br>
 ; CHECK-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
-; CHECK-NEXT:    movzwl %r13w, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %rax<br>
 ; CHECK-NEXT:    movd %eax, %xmm0<br>
 ; CHECK-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
-; CHECK-NEXT:    movzwl %r12w, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %rax<br>
 ; CHECK-NEXT:    movd %eax, %xmm0<br>
 ; CHECK-NEXT:    punpckldq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload<br>
 ; CHECK-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]<br>
 ; CHECK-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
-; CHECK-NEXT:    movzwl %r15w, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %rax<br>
 ; CHECK-NEXT:    movd %eax, %xmm0<br>
 ; CHECK-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
-; CHECK-NEXT:    movzwl {{[-0-9]+}}(%r{{[sb]}}p), %edi # 2-byte Folded Reload<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %rax<br>
 ; CHECK-NEXT:    movd %eax, %xmm1<br>
 ; CHECK-NEXT:    punpckldq {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Folded Reload<br>
@@ -2800,19 +2617,7 @@ define <8 x i16> @utesth_f16i16_mm(<8 x half> %x) {<br>
 ; CHECK-NEXT:    pslld $16, %xmm0<br>
 ; CHECK-NEXT:    psrad $16, %xmm0<br>
 ; CHECK-NEXT:    packssdw %xmm4, %xmm0<br>
-; CHECK-NEXT:    addq $72, %rsp<br>
-; CHECK-NEXT:    .cfi_def_cfa_offset 56<br>
-; CHECK-NEXT:    popq %rbx<br>
-; CHECK-NEXT:    .cfi_def_cfa_offset 48<br>
-; CHECK-NEXT:    popq %r12<br>
-; CHECK-NEXT:    .cfi_def_cfa_offset 40<br>
-; CHECK-NEXT:    popq %r13<br>
-; CHECK-NEXT:    .cfi_def_cfa_offset 32<br>
-; CHECK-NEXT:    popq %r14<br>
-; CHECK-NEXT:    .cfi_def_cfa_offset 24<br>
-; CHECK-NEXT:    popq %r15<br>
-; CHECK-NEXT:    .cfi_def_cfa_offset 16<br>
-; CHECK-NEXT:    popq %rbp<br>
+; CHECK-NEXT:    addq $136, %rsp<br>
 ; CHECK-NEXT:    .cfi_def_cfa_offset 8<br>
 ; CHECK-NEXT:    retq<br>
 entry:<br>
@@ -2825,52 +2630,37 @@ entry:<br>
 define <8 x i16> @ustest_f16i16_mm(<8 x half> %x) {<br>
 ; CHECK-LABEL: ustest_f16i16_mm:<br>
 ; CHECK:       # %bb.0: # %entry<br>
-; CHECK-NEXT:    pushq %rbp<br>
-; CHECK-NEXT:    .cfi_def_cfa_offset 16<br>
-; CHECK-NEXT:    pushq %r15<br>
-; CHECK-NEXT:    .cfi_def_cfa_offset 24<br>
-; CHECK-NEXT:    pushq %r14<br>
-; CHECK-NEXT:    .cfi_def_cfa_offset 32<br>
-; CHECK-NEXT:    pushq %r13<br>
-; CHECK-NEXT:    .cfi_def_cfa_offset 40<br>
-; CHECK-NEXT:    pushq %r12<br>
-; CHECK-NEXT:    .cfi_def_cfa_offset 48<br>
-; CHECK-NEXT:    pushq %rbx<br>
-; CHECK-NEXT:    .cfi_def_cfa_offset 56<br>
-; CHECK-NEXT:    subq $72, %rsp<br>
-; CHECK-NEXT:    .cfi_def_cfa_offset 128<br>
-; CHECK-NEXT:    .cfi_offset %rbx, -56<br>
-; CHECK-NEXT:    .cfi_offset %r12, -48<br>
-; CHECK-NEXT:    .cfi_offset %r13, -40<br>
-; CHECK-NEXT:    .cfi_offset %r14, -32<br>
-; CHECK-NEXT:    .cfi_offset %r15, -24<br>
-; CHECK-NEXT:    .cfi_offset %rbp, -16<br>
-; CHECK-NEXT:    movl %r9d, %r15d<br>
-; CHECK-NEXT:    movl %r8d, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movl %edx, %ebp<br>
-; CHECK-NEXT:    movl %esi, %r14d<br>
-; CHECK-NEXT:    movl %edi, %ebx<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%rsp), %r12d<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%rsp), %r13d<br>
-; CHECK-NEXT:    movzwl %cx, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    subq $136, %rsp<br>
+; CHECK-NEXT:    .cfi_def_cfa_offset 144<br>
+; CHECK-NEXT:    movss %xmm7, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movss %xmm6, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movss %xmm5, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movss %xmm4, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movss %xmm2, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movss %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movaps %xmm3, %xmm0<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %eax<br>
 ; CHECK-NEXT:    movd %eax, %xmm0<br>
 ; CHECK-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
-; CHECK-NEXT:    movzwl %bp, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %eax<br>
 ; CHECK-NEXT:    movd %eax, %xmm0<br>
 ; CHECK-NEXT:    punpckldq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload<br>
 ; CHECK-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]<br>
 ; CHECK-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
-; CHECK-NEXT:    movzwl %r14w, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %eax<br>
 ; CHECK-NEXT:    movd %eax, %xmm0<br>
 ; CHECK-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
-; CHECK-NEXT:    movzwl %bx, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %eax<br>
 ; CHECK-NEXT:    movd %eax, %xmm0<br>
 ; CHECK-NEXT:    punpckldq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload<br>
@@ -2878,25 +2668,29 @@ define <8 x i16> @ustest_f16i16_mm(<8 x half> %x) {<br>
 ; CHECK-NEXT:    punpcklqdq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload<br>
 ; CHECK-NEXT:    # xmm0 = xmm0[0],mem[0]<br>
 ; CHECK-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
-; CHECK-NEXT:    movl %r13d, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %eax<br>
 ; CHECK-NEXT:    movd %eax, %xmm0<br>
 ; CHECK-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
-; CHECK-NEXT:    movl %r12d, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %eax<br>
 ; CHECK-NEXT:    movd %eax, %xmm0<br>
 ; CHECK-NEXT:    punpckldq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload<br>
 ; CHECK-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]<br>
 ; CHECK-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
-; CHECK-NEXT:    movzwl %r15w, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %eax<br>
 ; CHECK-NEXT:    movd %eax, %xmm0<br>
 ; CHECK-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
-; CHECK-NEXT:    movzwl {{[-0-9]+}}(%r{{[sb]}}p), %edi # 2-byte Folded Reload<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %eax<br>
 ; CHECK-NEXT:    movd %eax, %xmm0<br>
 ; CHECK-NEXT:    punpckldq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload<br>
@@ -2927,19 +2721,7 @@ define <8 x i16> @ustest_f16i16_mm(<8 x half> %x) {<br>
 ; CHECK-NEXT:    pslld $16, %xmm0<br>
 ; CHECK-NEXT:    psrad $16, %xmm0<br>
 ; CHECK-NEXT:    packssdw %xmm3, %xmm0<br>
-; CHECK-NEXT:    addq $72, %rsp<br>
-; CHECK-NEXT:    .cfi_def_cfa_offset 56<br>
-; CHECK-NEXT:    popq %rbx<br>
-; CHECK-NEXT:    .cfi_def_cfa_offset 48<br>
-; CHECK-NEXT:    popq %r12<br>
-; CHECK-NEXT:    .cfi_def_cfa_offset 40<br>
-; CHECK-NEXT:    popq %r13<br>
-; CHECK-NEXT:    .cfi_def_cfa_offset 32<br>
-; CHECK-NEXT:    popq %r14<br>
-; CHECK-NEXT:    .cfi_def_cfa_offset 24<br>
-; CHECK-NEXT:    popq %r15<br>
-; CHECK-NEXT:    .cfi_def_cfa_offset 16<br>
-; CHECK-NEXT:    popq %rbp<br>
+; CHECK-NEXT:    addq $136, %rsp<br>
 ; CHECK-NEXT:    .cfi_def_cfa_offset 8<br>
 ; CHECK-NEXT:    retq<br>
 entry:<br>
@@ -3283,24 +3065,21 @@ entry:<br>
 define <2 x i64> @stest_f16i64_mm(<2 x half> %x) {<br>
 ; CHECK-LABEL: stest_f16i64_mm:<br>
 ; CHECK:       # %bb.0: # %entry<br>
-; CHECK-NEXT:    pushq %rbp<br>
-; CHECK-NEXT:    .cfi_def_cfa_offset 16<br>
 ; CHECK-NEXT:    pushq %r14<br>
-; CHECK-NEXT:    .cfi_def_cfa_offset 24<br>
+; CHECK-NEXT:    .cfi_def_cfa_offset 16<br>
 ; CHECK-NEXT:    pushq %rbx<br>
+; CHECK-NEXT:    .cfi_def_cfa_offset 24<br>
+; CHECK-NEXT:    pushq %rax<br>
 ; CHECK-NEXT:    .cfi_def_cfa_offset 32<br>
-; CHECK-NEXT:    .cfi_offset %rbx, -32<br>
-; CHECK-NEXT:    .cfi_offset %r14, -24<br>
-; CHECK-NEXT:    .cfi_offset %rbp, -16<br>
-; CHECK-NEXT:    movl %esi, %ebp<br>
-; CHECK-NEXT:    movzwl %di, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
-; CHECK-NEXT:    callq __fixsfti@PLT<br>
+; CHECK-NEXT:    .cfi_offset %rbx, -24<br>
+; CHECK-NEXT:    .cfi_offset %r14, -16<br>
+; CHECK-NEXT:    movss %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    callq __fixhfti@PLT<br>
 ; CHECK-NEXT:    movq %rax, %rbx<br>
 ; CHECK-NEXT:    movq %rdx, %r14<br>
-; CHECK-NEXT:    movzwl %bp, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
-; CHECK-NEXT:    callq __fixsfti@PLT<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __fixhfti@PLT<br>
 ; CHECK-NEXT:    movabsq $9223372036854775807, %rcx # imm = 0x7FFFFFFFFFFFFFFF<br>
 ; CHECK-NEXT:    cmpq %rcx, %rax<br>
 ; CHECK-NEXT:    movq %rcx, %rsi<br>
@@ -3318,28 +3097,28 @@ define <2 x i64> @stest_f16i64_mm(<2 x half> %x) {<br>
 ; CHECK-NEXT:    cmoveq %rsi, %rcx<br>
 ; CHECK-NEXT:    cmovsq %r14, %rdi<br>
 ; CHECK-NEXT:    testq %rdi, %rdi<br>
-; CHECK-NEXT:    movabsq $-9223372036854775808, %rbp # imm = 0x8000000000000000<br>
-; CHECK-NEXT:    movq %rbp, %rsi<br>
+; CHECK-NEXT:    movabsq $-9223372036854775808, %rbx # imm = 0x8000000000000000<br>
+; CHECK-NEXT:    movq %rbx, %rsi<br>
 ; CHECK-NEXT:    cmovnsq %rcx, %rsi<br>
-; CHECK-NEXT:    cmpq %rbp, %rcx<br>
-; CHECK-NEXT:    cmovbeq %rbp, %rcx<br>
+; CHECK-NEXT:    cmpq %rbx, %rcx<br>
+; CHECK-NEXT:    cmovbeq %rbx, %rcx<br>
 ; CHECK-NEXT:    cmpq $-1, %rdi<br>
 ; CHECK-NEXT:    cmovneq %rsi, %rcx<br>
 ; CHECK-NEXT:    testq %rdx, %rdx<br>
-; CHECK-NEXT:    movq %rbp, %rsi<br>
+; CHECK-NEXT:    movq %rbx, %rsi<br>
 ; CHECK-NEXT:    cmovnsq %rax, %rsi<br>
-; CHECK-NEXT:    cmpq %rbp, %rax<br>
-; CHECK-NEXT:    cmovbeq %rbp, %rax<br>
+; CHECK-NEXT:    cmpq %rbx, %rax<br>
+; CHECK-NEXT:    cmovbeq %rbx, %rax<br>
 ; CHECK-NEXT:    cmpq $-1, %rdx<br>
 ; CHECK-NEXT:    cmovneq %rsi, %rax<br>
 ; CHECK-NEXT:    movq %rax, %xmm1<br>
 ; CHECK-NEXT:    movq %rcx, %xmm0<br>
 ; CHECK-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]<br>
-; CHECK-NEXT:    popq %rbx<br>
+; CHECK-NEXT:    addq $8, %rsp<br>
 ; CHECK-NEXT:    .cfi_def_cfa_offset 24<br>
-; CHECK-NEXT:    popq %r14<br>
+; CHECK-NEXT:    popq %rbx<br>
 ; CHECK-NEXT:    .cfi_def_cfa_offset 16<br>
-; CHECK-NEXT:    popq %rbp<br>
+; CHECK-NEXT:    popq %r14<br>
 ; CHECK-NEXT:    .cfi_def_cfa_offset 8<br>
 ; CHECK-NEXT:    retq<br>
 entry:<br>
@@ -3353,41 +3132,39 @@ entry:<br>
 define <2 x i64> @utesth_f16i64_mm(<2 x half> %x) {<br>
 ; CHECK-LABEL: utesth_f16i64_mm:<br>
 ; CHECK:       # %bb.0: # %entry<br>
-; CHECK-NEXT:    pushq %rbp<br>
-; CHECK-NEXT:    .cfi_def_cfa_offset 16<br>
 ; CHECK-NEXT:    pushq %r14<br>
-; CHECK-NEXT:    .cfi_def_cfa_offset 24<br>
+; CHECK-NEXT:    .cfi_def_cfa_offset 16<br>
 ; CHECK-NEXT:    pushq %rbx<br>
+; CHECK-NEXT:    .cfi_def_cfa_offset 24<br>
+; CHECK-NEXT:    pushq %rax<br>
 ; CHECK-NEXT:    .cfi_def_cfa_offset 32<br>
-; CHECK-NEXT:    .cfi_offset %rbx, -32<br>
-; CHECK-NEXT:    .cfi_offset %r14, -24<br>
-; CHECK-NEXT:    .cfi_offset %rbp, -16<br>
-; CHECK-NEXT:    movl %edi, %r14d<br>
-; CHECK-NEXT:    movzwl %si, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
-; CHECK-NEXT:    callq __fixunssfti@PLT<br>
+; CHECK-NEXT:    .cfi_offset %rbx, -24<br>
+; CHECK-NEXT:    .cfi_offset %r14, -16<br>
+; CHECK-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movaps %xmm1, %xmm0<br>
+; CHECK-NEXT:    callq __fixunshfti@PLT<br>
 ; CHECK-NEXT:    movq %rax, %rbx<br>
-; CHECK-NEXT:    movq %rdx, %rbp<br>
-; CHECK-NEXT:    movzwl %r14w, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
-; CHECK-NEXT:    callq __fixunssfti@PLT<br>
+; CHECK-NEXT:    movq %rdx, %r14<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __fixunshfti@PLT<br>
 ; CHECK-NEXT:    xorl %ecx, %ecx<br>
 ; CHECK-NEXT:    testq %rdx, %rdx<br>
 ; CHECK-NEXT:    cmovneq %rcx, %rax<br>
 ; CHECK-NEXT:    cmpq $1, %rdx<br>
 ; CHECK-NEXT:    cmoveq %rcx, %rax<br>
-; CHECK-NEXT:    testq %rbp, %rbp<br>
+; CHECK-NEXT:    testq %r14, %r14<br>
 ; CHECK-NEXT:    cmovneq %rcx, %rbx<br>
-; CHECK-NEXT:    cmpq $1, %rbp<br>
+; CHECK-NEXT:    cmpq $1, %r14<br>
 ; CHECK-NEXT:    cmoveq %rcx, %rbx<br>
 ; CHECK-NEXT:    movq %rbx, %xmm1<br>
 ; CHECK-NEXT:    movq %rax, %xmm0<br>
 ; CHECK-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]<br>
-; CHECK-NEXT:    popq %rbx<br>
+; CHECK-NEXT:    addq $8, %rsp<br>
 ; CHECK-NEXT:    .cfi_def_cfa_offset 24<br>
-; CHECK-NEXT:    popq %r14<br>
+; CHECK-NEXT:    popq %rbx<br>
 ; CHECK-NEXT:    .cfi_def_cfa_offset 16<br>
-; CHECK-NEXT:    popq %rbp<br>
+; CHECK-NEXT:    popq %r14<br>
 ; CHECK-NEXT:    .cfi_def_cfa_offset 8<br>
 ; CHECK-NEXT:    retq<br>
 entry:<br>
@@ -3400,24 +3177,21 @@ entry:<br>
 define <2 x i64> @ustest_f16i64_mm(<2 x half> %x) {<br>
 ; CHECK-LABEL: ustest_f16i64_mm:<br>
 ; CHECK:       # %bb.0: # %entry<br>
-; CHECK-NEXT:    pushq %rbp<br>
-; CHECK-NEXT:    .cfi_def_cfa_offset 16<br>
 ; CHECK-NEXT:    pushq %r14<br>
-; CHECK-NEXT:    .cfi_def_cfa_offset 24<br>
+; CHECK-NEXT:    .cfi_def_cfa_offset 16<br>
 ; CHECK-NEXT:    pushq %rbx<br>
+; CHECK-NEXT:    .cfi_def_cfa_offset 24<br>
+; CHECK-NEXT:    pushq %rax<br>
 ; CHECK-NEXT:    .cfi_def_cfa_offset 32<br>
-; CHECK-NEXT:    .cfi_offset %rbx, -32<br>
-; CHECK-NEXT:    .cfi_offset %r14, -24<br>
-; CHECK-NEXT:    .cfi_offset %rbp, -16<br>
-; CHECK-NEXT:    movl %esi, %r14d<br>
-; CHECK-NEXT:    movzwl %di, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
-; CHECK-NEXT:    callq __fixsfti@PLT<br>
+; CHECK-NEXT:    .cfi_offset %rbx, -24<br>
+; CHECK-NEXT:    .cfi_offset %r14, -16<br>
+; CHECK-NEXT:    movss %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    callq __fixhfti@PLT<br>
 ; CHECK-NEXT:    movq %rax, %rbx<br>
-; CHECK-NEXT:    movq %rdx, %rbp<br>
-; CHECK-NEXT:    movzwl %r14w, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
-; CHECK-NEXT:    callq __fixsfti@PLT<br>
+; CHECK-NEXT:    movq %rdx, %r14<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __fixhfti@PLT<br>
 ; CHECK-NEXT:    xorl %ecx, %ecx<br>
 ; CHECK-NEXT:    testq %rdx, %rdx<br>
 ; CHECK-NEXT:    movl $1, %esi<br>
@@ -3426,10 +3200,10 @@ define <2 x i64> @ustest_f16i64_mm(<2 x half> %x) {<br>
 ; CHECK-NEXT:    cmovgq %rcx, %rax<br>
 ; CHECK-NEXT:    cmpq $1, %rdx<br>
 ; CHECK-NEXT:    cmoveq %rcx, %rax<br>
-; CHECK-NEXT:    testq %rbp, %rbp<br>
-; CHECK-NEXT:    cmovleq %rbp, %rsi<br>
+; CHECK-NEXT:    testq %r14, %r14<br>
+; CHECK-NEXT:    cmovleq %r14, %rsi<br>
 ; CHECK-NEXT:    cmovgq %rcx, %rbx<br>
-; CHECK-NEXT:    cmpq $1, %rbp<br>
+; CHECK-NEXT:    cmpq $1, %r14<br>
 ; CHECK-NEXT:    cmoveq %rcx, %rbx<br>
 ; CHECK-NEXT:    testq %rsi, %rsi<br>
 ; CHECK-NEXT:    cmovsq %rcx, %rbx<br>
@@ -3438,11 +3212,11 @@ define <2 x i64> @ustest_f16i64_mm(<2 x half> %x) {<br>
 ; CHECK-NEXT:    movq %rax, %xmm1<br>
 ; CHECK-NEXT:    movq %rbx, %xmm0<br>
 ; CHECK-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]<br>
-; CHECK-NEXT:    popq %rbx<br>
+; CHECK-NEXT:    addq $8, %rsp<br>
 ; CHECK-NEXT:    .cfi_def_cfa_offset 24<br>
-; CHECK-NEXT:    popq %r14<br>
+; CHECK-NEXT:    popq %rbx<br>
 ; CHECK-NEXT:    .cfi_def_cfa_offset 16<br>
-; CHECK-NEXT:    popq %rbp<br>
+; CHECK-NEXT:    popq %r14<br>
 ; CHECK-NEXT:    .cfi_def_cfa_offset 8<br>
 ; CHECK-NEXT:    retq<br>
 entry:<br>
<br>
diff  --git a/llvm/test/CodeGen/X86/fptosi-sat-scalar.ll b/llvm/test/CodeGen/X86/fptosi-sat-scalar.ll<br>
index bcfac18d6f4f4..8ace836987319 100644<br>
--- a/llvm/test/CodeGen/X86/fptosi-sat-scalar.ll<br>
+++ b/llvm/test/CodeGen/X86/fptosi-sat-scalar.ll<br>
@@ -2052,6 +2052,7 @@ declare  i64 @llvm.fptosi.sat.i64.f16 (half)<br>
 declare i100 @llvm.fptosi.sat.i100.f16(half)<br>
 declare i128 @llvm.fptosi.sat.i128.f16(half)<br>
<br>
+; FIXME: Can be optimizated with maxss + minss<br>
 define i1 @test_signed_i1_f16(half %f) nounwind {<br>
 ; X86-X87-LABEL: test_signed_i1_f16:<br>
 ; X86-X87:       # %bb.0:<br>
@@ -2109,15 +2110,22 @@ define i1 @test_signed_i1_f16(half %f) nounwind {<br>
 ; X86-SSE-LABEL: test_signed_i1_f16:<br>
 ; X86-SSE:       # %bb.0:<br>
 ; X86-SSE-NEXT:    subl $12, %esp<br>
-; X86-SSE-NEXT:    movzwl {{[0-9]+}}(%esp), %eax<br>
-; X86-SSE-NEXT:    movl %eax, (%esp)<br>
-; X86-SSE-NEXT:    calll __gnu_h2f_ieee<br>
+; X86-SSE-NEXT:    pinsrw $0, {{[0-9]+}}(%esp), %xmm0<br>
+; X86-SSE-NEXT:    pextrw $0, %xmm0, %eax<br>
+; X86-SSE-NEXT:    movw %ax, (%esp)<br>
+; X86-SSE-NEXT:    calll __extendhfsf2<br>
 ; X86-SSE-NEXT:    fstps {{[0-9]+}}(%esp)<br>
 ; X86-SSE-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero<br>
-; X86-SSE-NEXT:    maxss {{[0-9]+}}(%esp), %xmm0<br>
+; X86-SSE-NEXT:    cvttss2si %xmm0, %ecx<br>
+; X86-SSE-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0<br>
+; X86-SSE-NEXT:    movl $255, %eax<br>
+; X86-SSE-NEXT:    cmovael %ecx, %eax<br>
+; X86-SSE-NEXT:    xorl %ecx, %ecx<br>
 ; X86-SSE-NEXT:    xorps %xmm1, %xmm1<br>
-; X86-SSE-NEXT:    minss %xmm0, %xmm1<br>
-; X86-SSE-NEXT:    cvttss2si %xmm1, %eax<br>
+; X86-SSE-NEXT:    ucomiss %xmm1, %xmm0<br>
+; X86-SSE-NEXT:    cmoval %ecx, %eax<br>
+; X86-SSE-NEXT:    ucomiss %xmm0, %xmm0<br>
+; X86-SSE-NEXT:    cmovpl %ecx, %eax<br>
 ; X86-SSE-NEXT:    # kill: def $al killed $al killed $eax<br>
 ; X86-SSE-NEXT:    addl $12, %esp<br>
 ; X86-SSE-NEXT:    retl<br>
@@ -2125,13 +2133,17 @@ define i1 @test_signed_i1_f16(half %f) nounwind {<br>
 ; X64-LABEL: test_signed_i1_f16:<br>
 ; X64:       # %bb.0:<br>
 ; X64-NEXT:    pushq %rax<br>
-; X64-NEXT:    movzwl %di, %edi<br>
-; X64-NEXT:    callq __gnu_h2f_ieee@PLT<br>
-; X64-NEXT:    movss {{.*#+}} xmm1 = mem[0],zero,zero,zero<br>
-; X64-NEXT:    maxss %xmm0, %xmm1<br>
-; X64-NEXT:    xorps %xmm0, %xmm0<br>
-; X64-NEXT:    minss %xmm1, %xmm0<br>
-; X64-NEXT:    cvttss2si %xmm0, %eax<br>
+; X64-NEXT:    callq __extendhfsf2@PLT<br>
+; X64-NEXT:    cvttss2si %xmm0, %ecx<br>
+; X64-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
+; X64-NEXT:    movl $255, %eax<br>
+; X64-NEXT:    cmovael %ecx, %eax<br>
+; X64-NEXT:    xorl %ecx, %ecx<br>
+; X64-NEXT:    xorps %xmm1, %xmm1<br>
+; X64-NEXT:    ucomiss %xmm1, %xmm0<br>
+; X64-NEXT:    cmoval %ecx, %eax<br>
+; X64-NEXT:    ucomiss %xmm0, %xmm0<br>
+; X64-NEXT:    cmovpl %ecx, %eax<br>
 ; X64-NEXT:    # kill: def $al killed $al killed $eax<br>
 ; X64-NEXT:    popq %rcx<br>
 ; X64-NEXT:    retq<br>
@@ -2139,6 +2151,7 @@ define i1 @test_signed_i1_f16(half %f) nounwind {<br>
     ret i1 %x<br>
 }<br>
<br>
+; FIXME: Can be optimizated with maxss + minss<br>
 define i8 @test_signed_i8_f16(half %f) nounwind {<br>
 ; X86-X87-LABEL: test_signed_i8_f16:<br>
 ; X86-X87:       # %bb.0:<br>
@@ -2192,15 +2205,22 @@ define i8 @test_signed_i8_f16(half %f) nounwind {<br>
 ; X86-SSE-LABEL: test_signed_i8_f16:<br>
 ; X86-SSE:       # %bb.0:<br>
 ; X86-SSE-NEXT:    subl $12, %esp<br>
-; X86-SSE-NEXT:    movzwl {{[0-9]+}}(%esp), %eax<br>
-; X86-SSE-NEXT:    movl %eax, (%esp)<br>
-; X86-SSE-NEXT:    calll __gnu_h2f_ieee<br>
+; X86-SSE-NEXT:    pinsrw $0, {{[0-9]+}}(%esp), %xmm0<br>
+; X86-SSE-NEXT:    pextrw $0, %xmm0, %eax<br>
+; X86-SSE-NEXT:    movw %ax, (%esp)<br>
+; X86-SSE-NEXT:    calll __extendhfsf2<br>
 ; X86-SSE-NEXT:    fstps {{[0-9]+}}(%esp)<br>
 ; X86-SSE-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero<br>
-; X86-SSE-NEXT:    maxss {{[0-9]+}}(%esp), %xmm0<br>
-; X86-SSE-NEXT:    movss {{.*#+}} xmm1 = mem[0],zero,zero,zero<br>
-; X86-SSE-NEXT:    minss %xmm0, %xmm1<br>
-; X86-SSE-NEXT:    cvttss2si %xmm1, %eax<br>
+; X86-SSE-NEXT:    cvttss2si %xmm0, %eax<br>
+; X86-SSE-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0<br>
+; X86-SSE-NEXT:    movl $128, %ecx<br>
+; X86-SSE-NEXT:    cmovael %eax, %ecx<br>
+; X86-SSE-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0<br>
+; X86-SSE-NEXT:    movl $127, %edx<br>
+; X86-SSE-NEXT:    cmovbel %ecx, %edx<br>
+; X86-SSE-NEXT:    xorl %eax, %eax<br>
+; X86-SSE-NEXT:    ucomiss %xmm0, %xmm0<br>
+; X86-SSE-NEXT:    cmovnpl %edx, %eax<br>
 ; X86-SSE-NEXT:    # kill: def $al killed $al killed $eax<br>
 ; X86-SSE-NEXT:    addl $12, %esp<br>
 ; X86-SSE-NEXT:    retl<br>
@@ -2208,13 +2228,17 @@ define i8 @test_signed_i8_f16(half %f) nounwind {<br>
 ; X64-LABEL: test_signed_i8_f16:<br>
 ; X64:       # %bb.0:<br>
 ; X64-NEXT:    pushq %rax<br>
-; X64-NEXT:    movzwl %di, %edi<br>
-; X64-NEXT:    callq __gnu_h2f_ieee@PLT<br>
-; X64-NEXT:    movss {{.*#+}} xmm1 = mem[0],zero,zero,zero<br>
-; X64-NEXT:    maxss %xmm0, %xmm1<br>
-; X64-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero<br>
-; X64-NEXT:    minss %xmm1, %xmm0<br>
+; X64-NEXT:    callq __extendhfsf2@PLT<br>
 ; X64-NEXT:    cvttss2si %xmm0, %eax<br>
+; X64-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
+; X64-NEXT:    movl $128, %ecx<br>
+; X64-NEXT:    cmovael %eax, %ecx<br>
+; X64-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
+; X64-NEXT:    movl $127, %edx<br>
+; X64-NEXT:    cmovbel %ecx, %edx<br>
+; X64-NEXT:    xorl %eax, %eax<br>
+; X64-NEXT:    ucomiss %xmm0, %xmm0<br>
+; X64-NEXT:    cmovnpl %edx, %eax<br>
 ; X64-NEXT:    # kill: def $al killed $al killed $eax<br>
 ; X64-NEXT:    popq %rcx<br>
 ; X64-NEXT:    retq<br>
@@ -2222,6 +2246,7 @@ define i8 @test_signed_i8_f16(half %f) nounwind {<br>
     ret i8 %x<br>
 }<br>
<br>
+; FIXME: Can be optimizated with maxss + minss<br>
 define i13 @test_signed_i13_f16(half %f) nounwind {<br>
 ; X86-X87-LABEL: test_signed_i13_f16:<br>
 ; X86-X87:       # %bb.0:<br>
@@ -2276,15 +2301,22 @@ define i13 @test_signed_i13_f16(half %f) nounwind {<br>
 ; X86-SSE-LABEL: test_signed_i13_f16:<br>
 ; X86-SSE:       # %bb.0:<br>
 ; X86-SSE-NEXT:    subl $12, %esp<br>
-; X86-SSE-NEXT:    movzwl {{[0-9]+}}(%esp), %eax<br>
-; X86-SSE-NEXT:    movl %eax, (%esp)<br>
-; X86-SSE-NEXT:    calll __gnu_h2f_ieee<br>
+; X86-SSE-NEXT:    pinsrw $0, {{[0-9]+}}(%esp), %xmm0<br>
+; X86-SSE-NEXT:    pextrw $0, %xmm0, %eax<br>
+; X86-SSE-NEXT:    movw %ax, (%esp)<br>
+; X86-SSE-NEXT:    calll __extendhfsf2<br>
 ; X86-SSE-NEXT:    fstps {{[0-9]+}}(%esp)<br>
 ; X86-SSE-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero<br>
-; X86-SSE-NEXT:    maxss {{[0-9]+}}(%esp), %xmm0<br>
-; X86-SSE-NEXT:    movss {{.*#+}} xmm1 = mem[0],zero,zero,zero<br>
-; X86-SSE-NEXT:    minss %xmm0, %xmm1<br>
-; X86-SSE-NEXT:    cvttss2si %xmm1, %eax<br>
+; X86-SSE-NEXT:    cvttss2si %xmm0, %eax<br>
+; X86-SSE-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0<br>
+; X86-SSE-NEXT:    movl $61440, %ecx # imm = 0xF000<br>
+; X86-SSE-NEXT:    cmovael %eax, %ecx<br>
+; X86-SSE-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0<br>
+; X86-SSE-NEXT:    movl $4095, %edx # imm = 0xFFF<br>
+; X86-SSE-NEXT:    cmovbel %ecx, %edx<br>
+; X86-SSE-NEXT:    xorl %eax, %eax<br>
+; X86-SSE-NEXT:    ucomiss %xmm0, %xmm0<br>
+; X86-SSE-NEXT:    cmovnpl %edx, %eax<br>
 ; X86-SSE-NEXT:    # kill: def $ax killed $ax killed $eax<br>
 ; X86-SSE-NEXT:    addl $12, %esp<br>
 ; X86-SSE-NEXT:    retl<br>
@@ -2292,13 +2324,17 @@ define i13 @test_signed_i13_f16(half %f) nounwind {<br>
 ; X64-LABEL: test_signed_i13_f16:<br>
 ; X64:       # %bb.0:<br>
 ; X64-NEXT:    pushq %rax<br>
-; X64-NEXT:    movzwl %di, %edi<br>
-; X64-NEXT:    callq __gnu_h2f_ieee@PLT<br>
-; X64-NEXT:    movss {{.*#+}} xmm1 = mem[0],zero,zero,zero<br>
-; X64-NEXT:    maxss %xmm0, %xmm1<br>
-; X64-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero<br>
-; X64-NEXT:    minss %xmm1, %xmm0<br>
+; X64-NEXT:    callq __extendhfsf2@PLT<br>
 ; X64-NEXT:    cvttss2si %xmm0, %eax<br>
+; X64-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
+; X64-NEXT:    movl $61440, %ecx # imm = 0xF000<br>
+; X64-NEXT:    cmovael %eax, %ecx<br>
+; X64-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
+; X64-NEXT:    movl $4095, %edx # imm = 0xFFF<br>
+; X64-NEXT:    cmovbel %ecx, %edx<br>
+; X64-NEXT:    xorl %eax, %eax<br>
+; X64-NEXT:    ucomiss %xmm0, %xmm0<br>
+; X64-NEXT:    cmovnpl %edx, %eax<br>
 ; X64-NEXT:    # kill: def $ax killed $ax killed $eax<br>
 ; X64-NEXT:    popq %rcx<br>
 ; X64-NEXT:    retq<br>
@@ -2306,6 +2342,7 @@ define i13 @test_signed_i13_f16(half %f) nounwind {<br>
     ret i13 %x<br>
 }<br>
<br>
+; FIXME: Can be optimizated with maxss + minss<br>
 define i16 @test_signed_i16_f16(half %f) nounwind {<br>
 ; X86-X87-LABEL: test_signed_i16_f16:<br>
 ; X86-X87:       # %bb.0:<br>
@@ -2360,15 +2397,22 @@ define i16 @test_signed_i16_f16(half %f) nounwind {<br>
 ; X86-SSE-LABEL: test_signed_i16_f16:<br>
 ; X86-SSE:       # %bb.0:<br>
 ; X86-SSE-NEXT:    subl $12, %esp<br>
-; X86-SSE-NEXT:    movzwl {{[0-9]+}}(%esp), %eax<br>
-; X86-SSE-NEXT:    movl %eax, (%esp)<br>
-; X86-SSE-NEXT:    calll __gnu_h2f_ieee<br>
+; X86-SSE-NEXT:    pinsrw $0, {{[0-9]+}}(%esp), %xmm0<br>
+; X86-SSE-NEXT:    pextrw $0, %xmm0, %eax<br>
+; X86-SSE-NEXT:    movw %ax, (%esp)<br>
+; X86-SSE-NEXT:    calll __extendhfsf2<br>
 ; X86-SSE-NEXT:    fstps {{[0-9]+}}(%esp)<br>
 ; X86-SSE-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero<br>
-; X86-SSE-NEXT:    maxss {{[0-9]+}}(%esp), %xmm0<br>
-; X86-SSE-NEXT:    movss {{.*#+}} xmm1 = mem[0],zero,zero,zero<br>
-; X86-SSE-NEXT:    minss %xmm0, %xmm1<br>
-; X86-SSE-NEXT:    cvttss2si %xmm1, %eax<br>
+; X86-SSE-NEXT:    cvttss2si %xmm0, %eax<br>
+; X86-SSE-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0<br>
+; X86-SSE-NEXT:    movl $32768, %ecx # imm = 0x8000<br>
+; X86-SSE-NEXT:    cmovael %eax, %ecx<br>
+; X86-SSE-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0<br>
+; X86-SSE-NEXT:    movl $32767, %edx # imm = 0x7FFF<br>
+; X86-SSE-NEXT:    cmovbel %ecx, %edx<br>
+; X86-SSE-NEXT:    xorl %eax, %eax<br>
+; X86-SSE-NEXT:    ucomiss %xmm0, %xmm0<br>
+; X86-SSE-NEXT:    cmovnpl %edx, %eax<br>
 ; X86-SSE-NEXT:    # kill: def $ax killed $ax killed $eax<br>
 ; X86-SSE-NEXT:    addl $12, %esp<br>
 ; X86-SSE-NEXT:    retl<br>
@@ -2376,13 +2420,17 @@ define i16 @test_signed_i16_f16(half %f) nounwind {<br>
 ; X64-LABEL: test_signed_i16_f16:<br>
 ; X64:       # %bb.0:<br>
 ; X64-NEXT:    pushq %rax<br>
-; X64-NEXT:    movzwl %di, %edi<br>
-; X64-NEXT:    callq __gnu_h2f_ieee@PLT<br>
-; X64-NEXT:    movss {{.*#+}} xmm1 = mem[0],zero,zero,zero<br>
-; X64-NEXT:    maxss %xmm0, %xmm1<br>
-; X64-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero<br>
-; X64-NEXT:    minss %xmm1, %xmm0<br>
+; X64-NEXT:    callq __extendhfsf2@PLT<br>
 ; X64-NEXT:    cvttss2si %xmm0, %eax<br>
+; X64-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
+; X64-NEXT:    movl $32768, %ecx # imm = 0x8000<br>
+; X64-NEXT:    cmovael %eax, %ecx<br>
+; X64-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
+; X64-NEXT:    movl $32767, %edx # imm = 0x7FFF<br>
+; X64-NEXT:    cmovbel %ecx, %edx<br>
+; X64-NEXT:    xorl %eax, %eax<br>
+; X64-NEXT:    ucomiss %xmm0, %xmm0<br>
+; X64-NEXT:    cmovnpl %edx, %eax<br>
 ; X64-NEXT:    # kill: def $ax killed $ax killed $eax<br>
 ; X64-NEXT:    popq %rcx<br>
 ; X64-NEXT:    retq<br>
@@ -2390,6 +2438,7 @@ define i16 @test_signed_i16_f16(half %f) nounwind {<br>
     ret i16 %x<br>
 }<br>
<br>
+; FIXME: Can be optimizated with maxss + minss<br>
 define i19 @test_signed_i19_f16(half %f) nounwind {<br>
 ; X86-X87-LABEL: test_signed_i19_f16:<br>
 ; X86-X87:       # %bb.0:<br>
@@ -2444,31 +2493,39 @@ define i19 @test_signed_i19_f16(half %f) nounwind {<br>
 ; X86-SSE-LABEL: test_signed_i19_f16:<br>
 ; X86-SSE:       # %bb.0:<br>
 ; X86-SSE-NEXT:    subl $12, %esp<br>
-; X86-SSE-NEXT:    movzwl {{[0-9]+}}(%esp), %eax<br>
-; X86-SSE-NEXT:    movl %eax, (%esp)<br>
-; X86-SSE-NEXT:    calll __gnu_h2f_ieee<br>
+; X86-SSE-NEXT:    pinsrw $0, {{[0-9]+}}(%esp), %xmm0<br>
+; X86-SSE-NEXT:    pextrw $0, %xmm0, %eax<br>
+; X86-SSE-NEXT:    movw %ax, (%esp)<br>
+; X86-SSE-NEXT:    calll __extendhfsf2<br>
 ; X86-SSE-NEXT:    fstps {{[0-9]+}}(%esp)<br>
 ; X86-SSE-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero<br>
+; X86-SSE-NEXT:    cvttss2si %xmm0, %eax<br>
+; X86-SSE-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0<br>
+; X86-SSE-NEXT:    movl $-262144, %ecx # imm = 0xFFFC0000<br>
+; X86-SSE-NEXT:    cmovael %eax, %ecx<br>
+; X86-SSE-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0<br>
+; X86-SSE-NEXT:    movl $262143, %edx # imm = 0x3FFFF<br>
+; X86-SSE-NEXT:    cmovbel %ecx, %edx<br>
 ; X86-SSE-NEXT:    xorl %eax, %eax<br>
 ; X86-SSE-NEXT:    ucomiss %xmm0, %xmm0<br>
-; X86-SSE-NEXT:    maxss {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0<br>
-; X86-SSE-NEXT:    minss {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0<br>
-; X86-SSE-NEXT:    cvttss2si %xmm0, %ecx<br>
-; X86-SSE-NEXT:    cmovnpl %ecx, %eax<br>
+; X86-SSE-NEXT:    cmovnpl %edx, %eax<br>
 ; X86-SSE-NEXT:    addl $12, %esp<br>
 ; X86-SSE-NEXT:    retl<br>
 ;<br>
 ; X64-LABEL: test_signed_i19_f16:<br>
 ; X64:       # %bb.0:<br>
 ; X64-NEXT:    pushq %rax<br>
-; X64-NEXT:    movzwl %di, %edi<br>
-; X64-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; X64-NEXT:    callq __extendhfsf2@PLT<br>
+; X64-NEXT:    cvttss2si %xmm0, %eax<br>
+; X64-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
+; X64-NEXT:    movl $-262144, %ecx # imm = 0xFFFC0000<br>
+; X64-NEXT:    cmovael %eax, %ecx<br>
+; X64-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
+; X64-NEXT:    movl $262143, %edx # imm = 0x3FFFF<br>
+; X64-NEXT:    cmovbel %ecx, %edx<br>
 ; X64-NEXT:    xorl %eax, %eax<br>
 ; X64-NEXT:    ucomiss %xmm0, %xmm0<br>
-; X64-NEXT:    maxss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
-; X64-NEXT:    minss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
-; X64-NEXT:    cvttss2si %xmm0, %ecx<br>
-; X64-NEXT:    cmovnpl %ecx, %eax<br>
+; X64-NEXT:    cmovnpl %edx, %eax<br>
 ; X64-NEXT:    popq %rcx<br>
 ; X64-NEXT:    retq<br>
     %x = call i19 @llvm.fptosi.sat.i19.f16(half %f)<br>
@@ -2529,33 +2586,39 @@ define i32 @test_signed_i32_f16(half %f) nounwind {<br>
 ; X86-SSE-LABEL: test_signed_i32_f16:<br>
 ; X86-SSE:       # %bb.0:<br>
 ; X86-SSE-NEXT:    subl $12, %esp<br>
-; X86-SSE-NEXT:    movzwl {{[0-9]+}}(%esp), %eax<br>
-; X86-SSE-NEXT:    movl %eax, (%esp)<br>
-; X86-SSE-NEXT:    calll __gnu_h2f_ieee<br>
+; X86-SSE-NEXT:    pinsrw $0, {{[0-9]+}}(%esp), %xmm0<br>
+; X86-SSE-NEXT:    pextrw $0, %xmm0, %eax<br>
+; X86-SSE-NEXT:    movw %ax, (%esp)<br>
+; X86-SSE-NEXT:    calll __extendhfsf2<br>
 ; X86-SSE-NEXT:    fstps {{[0-9]+}}(%esp)<br>
 ; X86-SSE-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero<br>
 ; X86-SSE-NEXT:    cvttss2si %xmm0, %eax<br>
 ; X86-SSE-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0<br>
-; X86-SSE-NEXT:    movl $2147483647, %ecx # imm = 0x7FFFFFFF<br>
-; X86-SSE-NEXT:    cmovbel %eax, %ecx<br>
+; X86-SSE-NEXT:    movl $-2147483648, %ecx # imm = 0x80000000<br>
+; X86-SSE-NEXT:    cmovael %eax, %ecx<br>
+; X86-SSE-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0<br>
+; X86-SSE-NEXT:    movl $2147483647, %edx # imm = 0x7FFFFFFF<br>
+; X86-SSE-NEXT:    cmovbel %ecx, %edx<br>
 ; X86-SSE-NEXT:    xorl %eax, %eax<br>
 ; X86-SSE-NEXT:    ucomiss %xmm0, %xmm0<br>
-; X86-SSE-NEXT:    cmovnpl %ecx, %eax<br>
+; X86-SSE-NEXT:    cmovnpl %edx, %eax<br>
 ; X86-SSE-NEXT:    addl $12, %esp<br>
 ; X86-SSE-NEXT:    retl<br>
 ;<br>
 ; X64-LABEL: test_signed_i32_f16:<br>
 ; X64:       # %bb.0:<br>
 ; X64-NEXT:    pushq %rax<br>
-; X64-NEXT:    movzwl %di, %edi<br>
-; X64-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; X64-NEXT:    callq __extendhfsf2@PLT<br>
 ; X64-NEXT:    cvttss2si %xmm0, %eax<br>
 ; X64-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
-; X64-NEXT:    movl $2147483647, %ecx # imm = 0x7FFFFFFF<br>
-; X64-NEXT:    cmovbel %eax, %ecx<br>
+; X64-NEXT:    movl $-2147483648, %ecx # imm = 0x80000000<br>
+; X64-NEXT:    cmovael %eax, %ecx<br>
+; X64-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
+; X64-NEXT:    movl $2147483647, %edx # imm = 0x7FFFFFFF<br>
+; X64-NEXT:    cmovbel %ecx, %edx<br>
 ; X64-NEXT:    xorl %eax, %eax<br>
 ; X64-NEXT:    ucomiss %xmm0, %xmm0<br>
-; X64-NEXT:    cmovnpl %ecx, %eax<br>
+; X64-NEXT:    cmovnpl %edx, %eax<br>
 ; X64-NEXT:    popq %rcx<br>
 ; X64-NEXT:    retq<br>
     %x = call i32 @llvm.fptosi.sat.i32.f16(half %f)<br>
@@ -2634,9 +2697,10 @@ define i50 @test_signed_i50_f16(half %f) nounwind {<br>
 ; X86-SSE:       # %bb.0:<br>
 ; X86-SSE-NEXT:    pushl %esi<br>
 ; X86-SSE-NEXT:    subl $24, %esp<br>
-; X86-SSE-NEXT:    movzwl {{[0-9]+}}(%esp), %eax<br>
-; X86-SSE-NEXT:    movl %eax, (%esp)<br>
-; X86-SSE-NEXT:    calll __gnu_h2f_ieee<br>
+; X86-SSE-NEXT:    pinsrw $0, {{[0-9]+}}(%esp), %xmm0<br>
+; X86-SSE-NEXT:    pextrw $0, %xmm0, %eax<br>
+; X86-SSE-NEXT:    movw %ax, (%esp)<br>
+; X86-SSE-NEXT:    calll __extendhfsf2<br>
 ; X86-SSE-NEXT:    fstps {{[0-9]+}}(%esp)<br>
 ; X86-SSE-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero<br>
 ; X86-SSE-NEXT:    movss %xmm0, {{[0-9]+}}(%esp)<br>
@@ -2669,8 +2733,7 @@ define i50 @test_signed_i50_f16(half %f) nounwind {<br>
 ; X64-LABEL: test_signed_i50_f16:<br>
 ; X64:       # %bb.0:<br>
 ; X64-NEXT:    pushq %rax<br>
-; X64-NEXT:    movzwl %di, %edi<br>
-; X64-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; X64-NEXT:    callq __extendhfsf2@PLT<br>
 ; X64-NEXT:    cvttss2si %xmm0, %rax<br>
 ; X64-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
 ; X64-NEXT:    movabsq $-562949953421312, %rcx # imm = 0xFFFE000000000000<br>
@@ -2759,9 +2822,10 @@ define i64 @test_signed_i64_f16(half %f) nounwind {<br>
 ; X86-SSE:       # %bb.0:<br>
 ; X86-SSE-NEXT:    pushl %esi<br>
 ; X86-SSE-NEXT:    subl $24, %esp<br>
-; X86-SSE-NEXT:    movzwl {{[0-9]+}}(%esp), %eax<br>
-; X86-SSE-NEXT:    movl %eax, (%esp)<br>
-; X86-SSE-NEXT:    calll __gnu_h2f_ieee<br>
+; X86-SSE-NEXT:    pinsrw $0, {{[0-9]+}}(%esp), %xmm0<br>
+; X86-SSE-NEXT:    pextrw $0, %xmm0, %eax<br>
+; X86-SSE-NEXT:    movw %ax, (%esp)<br>
+; X86-SSE-NEXT:    calll __extendhfsf2<br>
 ; X86-SSE-NEXT:    fstps {{[0-9]+}}(%esp)<br>
 ; X86-SSE-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero<br>
 ; X86-SSE-NEXT:    movss %xmm0, {{[0-9]+}}(%esp)<br>
@@ -2794,15 +2858,17 @@ define i64 @test_signed_i64_f16(half %f) nounwind {<br>
 ; X64-LABEL: test_signed_i64_f16:<br>
 ; X64:       # %bb.0:<br>
 ; X64-NEXT:    pushq %rax<br>
-; X64-NEXT:    movzwl %di, %edi<br>
-; X64-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; X64-NEXT:    callq __extendhfsf2@PLT<br>
 ; X64-NEXT:    cvttss2si %xmm0, %rax<br>
 ; X64-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
-; X64-NEXT:    movabsq $9223372036854775807, %rcx # imm = 0x7FFFFFFFFFFFFFFF<br>
-; X64-NEXT:    cmovbeq %rax, %rcx<br>
+; X64-NEXT:    movabsq $-9223372036854775808, %rcx # imm = 0x8000000000000000<br>
+; X64-NEXT:    cmovaeq %rax, %rcx<br>
+; X64-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
+; X64-NEXT:    movabsq $9223372036854775807, %rdx # imm = 0x7FFFFFFFFFFFFFFF<br>
+; X64-NEXT:    cmovbeq %rcx, %rdx<br>
 ; X64-NEXT:    xorl %eax, %eax<br>
 ; X64-NEXT:    ucomiss %xmm0, %xmm0<br>
-; X64-NEXT:    cmovnpq %rcx, %rax<br>
+; X64-NEXT:    cmovnpq %rdx, %rax<br>
 ; X64-NEXT:    popq %rcx<br>
 ; X64-NEXT:    retq<br>
     %x = call i64 @llvm.fptosi.sat.i64.f16(half %f)<br>
@@ -2908,10 +2974,11 @@ define i100 @test_signed_i100_f16(half %f) nounwind {<br>
 ; X86-SSE-NEXT:    pushl %edi<br>
 ; X86-SSE-NEXT:    pushl %esi<br>
 ; X86-SSE-NEXT:    subl $44, %esp<br>
+; X86-SSE-NEXT:    pinsrw $0, {{[0-9]+}}(%esp), %xmm0<br>
 ; X86-SSE-NEXT:    movl {{[0-9]+}}(%esp), %esi<br>
-; X86-SSE-NEXT:    movzwl {{[0-9]+}}(%esp), %eax<br>
-; X86-SSE-NEXT:    movl %eax, (%esp)<br>
-; X86-SSE-NEXT:    calll __gnu_h2f_ieee<br>
+; X86-SSE-NEXT:    pextrw $0, %xmm0, %eax<br>
+; X86-SSE-NEXT:    movw %ax, (%esp)<br>
+; X86-SSE-NEXT:    calll __extendhfsf2<br>
 ; X86-SSE-NEXT:    leal {{[0-9]+}}(%esp), %eax<br>
 ; X86-SSE-NEXT:    movl %eax, (%esp)<br>
 ; X86-SSE-NEXT:    fstps {{[0-9]+}}(%esp)<br>
@@ -2963,8 +3030,7 @@ define i100 @test_signed_i100_f16(half %f) nounwind {<br>
 ; X64-LABEL: test_signed_i100_f16:<br>
 ; X64:       # %bb.0:<br>
 ; X64-NEXT:    pushq %rax<br>
-; X64-NEXT:    movzwl %di, %edi<br>
-; X64-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; X64-NEXT:    callq __extendhfsf2@PLT<br>
 ; X64-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
 ; X64-NEXT:    callq __fixsfti@PLT<br>
 ; X64-NEXT:    xorl %ecx, %ecx<br>
@@ -3093,10 +3159,11 @@ define i128 @test_signed_i128_f16(half %f) nounwind {<br>
 ; X86-SSE-NEXT:    pushl %edi<br>
 ; X86-SSE-NEXT:    pushl %esi<br>
 ; X86-SSE-NEXT:    subl $44, %esp<br>
+; X86-SSE-NEXT:    pinsrw $0, {{[0-9]+}}(%esp), %xmm0<br>
 ; X86-SSE-NEXT:    movl {{[0-9]+}}(%esp), %esi<br>
-; X86-SSE-NEXT:    movzwl {{[0-9]+}}(%esp), %eax<br>
-; X86-SSE-NEXT:    movl %eax, (%esp)<br>
-; X86-SSE-NEXT:    calll __gnu_h2f_ieee<br>
+; X86-SSE-NEXT:    pextrw $0, %xmm0, %eax<br>
+; X86-SSE-NEXT:    movw %ax, (%esp)<br>
+; X86-SSE-NEXT:    calll __extendhfsf2<br>
 ; X86-SSE-NEXT:    leal {{[0-9]+}}(%esp), %eax<br>
 ; X86-SSE-NEXT:    movl %eax, (%esp)<br>
 ; X86-SSE-NEXT:    fstps {{[0-9]+}}(%esp)<br>
@@ -3144,8 +3211,7 @@ define i128 @test_signed_i128_f16(half %f) nounwind {<br>
 ; X64-LABEL: test_signed_i128_f16:<br>
 ; X64:       # %bb.0:<br>
 ; X64-NEXT:    pushq %rax<br>
-; X64-NEXT:    movzwl %di, %edi<br>
-; X64-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; X64-NEXT:    callq __extendhfsf2@PLT<br>
 ; X64-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
 ; X64-NEXT:    callq __fixsfti@PLT<br>
 ; X64-NEXT:    xorl %ecx, %ecx<br>
<br>
diff  --git a/llvm/test/CodeGen/X86/fptosi-sat-vector-128.ll b/llvm/test/CodeGen/X86/fptosi-sat-vector-128.ll<br>
index a568e3673846f..2dfd226284832 100644<br>
--- a/llvm/test/CodeGen/X86/fptosi-sat-vector-128.ll<br>
+++ b/llvm/test/CodeGen/X86/fptosi-sat-vector-128.ll<br>
@@ -542,97 +542,119 @@ define <8 x i1> @test_signed_v8i1_v8f16(<8 x half> %f) nounwind {<br>
 ; CHECK-LABEL: test_signed_v8i1_v8f16:<br>
 ; CHECK:       # %bb.0:<br>
 ; CHECK-NEXT:    pushq %rbp<br>
-; CHECK-NEXT:    pushq %r15<br>
-; CHECK-NEXT:    pushq %r14<br>
-; CHECK-NEXT:    pushq %r13<br>
-; CHECK-NEXT:    pushq %r12<br>
 ; CHECK-NEXT:    pushq %rbx<br>
-; CHECK-NEXT:    subq $72, %rsp<br>
-; CHECK-NEXT:    movl %r9d, %ebp<br>
-; CHECK-NEXT:    movl %r8d, %ebx<br>
-; CHECK-NEXT:    movl %ecx, %r13d<br>
-; CHECK-NEXT:    movl %edx, %r12d<br>
-; CHECK-NEXT:    movl %esi, %r15d<br>
-; CHECK-NEXT:    movl %edi, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%rsp), %r14d<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%rsp), %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
-; CHECK-NEXT:    movss {{.*#+}} xmm1 = mem[0],zero,zero,zero<br>
-; CHECK-NEXT:    maxss %xmm0, %xmm1<br>
-; CHECK-NEXT:    xorps %xmm0, %xmm0<br>
-; CHECK-NEXT:    minss %xmm1, %xmm0<br>
+; CHECK-NEXT:    subq $136, %rsp<br>
+; CHECK-NEXT:    movss %xmm6, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movss %xmm5, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movss %xmm4, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movss %xmm3, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movss %xmm2, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movss %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movaps %xmm7, %xmm0<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %eax<br>
+; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
+; CHECK-NEXT:    movl $65535, %ebp # imm = 0xFFFF<br>
+; CHECK-NEXT:    cmovbl %ebp, %eax<br>
+; CHECK-NEXT:    xorl %ebx, %ebx<br>
+; CHECK-NEXT:    xorps %xmm1, %xmm1<br>
+; CHECK-NEXT:    ucomiss %xmm1, %xmm0<br>
+; CHECK-NEXT:    cmoval %ebx, %eax<br>
+; CHECK-NEXT:    ucomiss %xmm0, %xmm0<br>
+; CHECK-NEXT:    cmovpl %ebx, %eax<br>
 ; CHECK-NEXT:    movd %eax, %xmm0<br>
 ; CHECK-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
-; CHECK-NEXT:    movl %r14d, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
-; CHECK-NEXT:    movss {{.*#+}} xmm1 = mem[0],zero,zero,zero<br>
-; CHECK-NEXT:    maxss %xmm0, %xmm1<br>
-; CHECK-NEXT:    xorps %xmm0, %xmm0<br>
-; CHECK-NEXT:    minss %xmm1, %xmm0<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %eax<br>
+; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
+; CHECK-NEXT:    cmovbl %ebp, %eax<br>
+; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
+; CHECK-NEXT:    cmoval %ebx, %eax<br>
+; CHECK-NEXT:    ucomiss %xmm0, %xmm0<br>
+; CHECK-NEXT:    cmovpl %ebx, %eax<br>
 ; CHECK-NEXT:    movd %eax, %xmm0<br>
 ; CHECK-NEXT:    punpcklwd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload<br>
 ; CHECK-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3]<br>
 ; CHECK-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
-; CHECK-NEXT:    movzwl %bp, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
-; CHECK-NEXT:    movss {{.*#+}} xmm1 = mem[0],zero,zero,zero<br>
-; CHECK-NEXT:    maxss %xmm0, %xmm1<br>
-; CHECK-NEXT:    xorps %xmm0, %xmm0<br>
-; CHECK-NEXT:    minss %xmm1, %xmm0<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %eax<br>
+; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
+; CHECK-NEXT:    cmovbl %ebp, %eax<br>
+; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
+; CHECK-NEXT:    cmoval %ebx, %eax<br>
+; CHECK-NEXT:    ucomiss %xmm0, %xmm0<br>
+; CHECK-NEXT:    cmovpl %ebx, %eax<br>
 ; CHECK-NEXT:    movd %eax, %xmm0<br>
 ; CHECK-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
-; CHECK-NEXT:    movzwl %bx, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
-; CHECK-NEXT:    movss {{.*#+}} xmm1 = mem[0],zero,zero,zero<br>
-; CHECK-NEXT:    maxss %xmm0, %xmm1<br>
-; CHECK-NEXT:    xorps %xmm0, %xmm0<br>
-; CHECK-NEXT:    minss %xmm1, %xmm0<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %eax<br>
+; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
+; CHECK-NEXT:    cmovbl %ebp, %eax<br>
+; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
+; CHECK-NEXT:    cmoval %ebx, %eax<br>
+; CHECK-NEXT:    ucomiss %xmm0, %xmm0<br>
+; CHECK-NEXT:    cmovpl %ebx, %eax<br>
 ; CHECK-NEXT:    movd %eax, %xmm0<br>
 ; CHECK-NEXT:    punpcklwd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload<br>
 ; CHECK-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3]<br>
 ; CHECK-NEXT:    punpckldq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload<br>
 ; CHECK-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]<br>
 ; CHECK-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
-; CHECK-NEXT:    movzwl %r13w, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
-; CHECK-NEXT:    movss {{.*#+}} xmm1 = mem[0],zero,zero,zero<br>
-; CHECK-NEXT:    maxss %xmm0, %xmm1<br>
-; CHECK-NEXT:    xorps %xmm0, %xmm0<br>
-; CHECK-NEXT:    minss %xmm1, %xmm0<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %eax<br>
+; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
+; CHECK-NEXT:    cmovbl %ebp, %eax<br>
+; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
+; CHECK-NEXT:    cmoval %ebx, %eax<br>
+; CHECK-NEXT:    ucomiss %xmm0, %xmm0<br>
+; CHECK-NEXT:    cmovpl %ebx, %eax<br>
 ; CHECK-NEXT:    movd %eax, %xmm0<br>
 ; CHECK-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
-; CHECK-NEXT:    movzwl %r12w, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
-; CHECK-NEXT:    movss {{.*#+}} xmm1 = mem[0],zero,zero,zero<br>
-; CHECK-NEXT:    maxss %xmm0, %xmm1<br>
-; CHECK-NEXT:    xorps %xmm0, %xmm0<br>
-; CHECK-NEXT:    minss %xmm1, %xmm0<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %eax<br>
+; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
+; CHECK-NEXT:    cmovbl %ebp, %eax<br>
+; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
+; CHECK-NEXT:    cmoval %ebx, %eax<br>
+; CHECK-NEXT:    ucomiss %xmm0, %xmm0<br>
+; CHECK-NEXT:    cmovpl %ebx, %eax<br>
 ; CHECK-NEXT:    movd %eax, %xmm0<br>
 ; CHECK-NEXT:    punpcklwd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload<br>
 ; CHECK-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3]<br>
 ; CHECK-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
-; CHECK-NEXT:    movzwl %r15w, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
-; CHECK-NEXT:    movss {{.*#+}} xmm1 = mem[0],zero,zero,zero<br>
-; CHECK-NEXT:    maxss %xmm0, %xmm1<br>
-; CHECK-NEXT:    xorps %xmm0, %xmm0<br>
-; CHECK-NEXT:    minss %xmm1, %xmm0<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %eax<br>
+; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
+; CHECK-NEXT:    cmovbl %ebp, %eax<br>
+; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
+; CHECK-NEXT:    cmoval %ebx, %eax<br>
+; CHECK-NEXT:    ucomiss %xmm0, %xmm0<br>
+; CHECK-NEXT:    cmovpl %ebx, %eax<br>
 ; CHECK-NEXT:    movd %eax, %xmm0<br>
 ; CHECK-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
-; CHECK-NEXT:    movzwl {{[-0-9]+}}(%r{{[sb]}}p), %edi # 2-byte Folded Reload<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
-; CHECK-NEXT:    movss {{.*#+}} xmm1 = mem[0],zero,zero,zero<br>
-; CHECK-NEXT:    maxss %xmm0, %xmm1<br>
-; CHECK-NEXT:    xorps %xmm0, %xmm0<br>
-; CHECK-NEXT:    minss %xmm1, %xmm0<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %eax<br>
+; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
+; CHECK-NEXT:    cmovbl %ebp, %eax<br>
+; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
+; CHECK-NEXT:    cmoval %ebx, %eax<br>
+; CHECK-NEXT:    ucomiss %xmm0, %xmm0<br>
+; CHECK-NEXT:    cmovpl %ebx, %eax<br>
 ; CHECK-NEXT:    movd %eax, %xmm0<br>
 ; CHECK-NEXT:    punpcklwd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload<br>
 ; CHECK-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3]<br>
@@ -640,12 +662,8 @@ define <8 x i1> @test_signed_v8i1_v8f16(<8 x half> %f) nounwind {<br>
 ; CHECK-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]<br>
 ; CHECK-NEXT:    punpcklqdq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload<br>
 ; CHECK-NEXT:    # xmm0 = xmm0[0],mem[0]<br>
-; CHECK-NEXT:    addq $72, %rsp<br>
+; CHECK-NEXT:    addq $136, %rsp<br>
 ; CHECK-NEXT:    popq %rbx<br>
-; CHECK-NEXT:    popq %r12<br>
-; CHECK-NEXT:    popq %r13<br>
-; CHECK-NEXT:    popq %r14<br>
-; CHECK-NEXT:    popq %r15<br>
 ; CHECK-NEXT:    popq %rbp<br>
 ; CHECK-NEXT:    retq<br>
   %x = call <8 x i1> @llvm.fptosi.sat.v8i1.v8f16(<8 x half> %f)<br>
@@ -658,99 +676,121 @@ define <8 x i8> @test_signed_v8i8_v8f16(<8 x half> %f) nounwind {<br>
 ; CHECK-NEXT:    pushq %rbp<br>
 ; CHECK-NEXT:    pushq %r15<br>
 ; CHECK-NEXT:    pushq %r14<br>
-; CHECK-NEXT:    pushq %r13<br>
 ; CHECK-NEXT:    pushq %r12<br>
 ; CHECK-NEXT:    pushq %rbx<br>
-; CHECK-NEXT:    subq $40, %rsp<br>
-; CHECK-NEXT:    movl %r9d, %r13d<br>
-; CHECK-NEXT:    movl %r8d, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movl %edx, %r14d<br>
-; CHECK-NEXT:    movl %esi, %ebp<br>
-; CHECK-NEXT:    movl %edi, %r15d<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%rsp), %eax<br>
-; CHECK-NEXT:    movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%rsp), %eax<br>
-; CHECK-NEXT:    movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movzwl %cx, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
-; CHECK-NEXT:    movss {{.*#+}} xmm1 = mem[0],zero,zero,zero<br>
-; CHECK-NEXT:    maxss %xmm0, %xmm1<br>
-; CHECK-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero<br>
-; CHECK-NEXT:    minss %xmm1, %xmm0<br>
-; CHECK-NEXT:    cvttss2si %xmm0, %r12d<br>
-; CHECK-NEXT:    shll $8, %r12d<br>
-; CHECK-NEXT:    movzwl %r14w, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
-; CHECK-NEXT:    movss {{.*#+}} xmm1 = mem[0],zero,zero,zero<br>
-; CHECK-NEXT:    maxss %xmm0, %xmm1<br>
-; CHECK-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero<br>
-; CHECK-NEXT:    minss %xmm1, %xmm0<br>
+; CHECK-NEXT:    subq $48, %rsp<br>
+; CHECK-NEXT:    movss %xmm7, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movss %xmm6, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movss %xmm5, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movss %xmm4, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movss %xmm2, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movss %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movaps %xmm3, %xmm0<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
+; CHECK-NEXT:    cvttss2si %xmm0, %ebp<br>
+; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
+; CHECK-NEXT:    movl $128, %r14d<br>
+; CHECK-NEXT:    cmovbl %r14d, %ebp<br>
+; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
+; CHECK-NEXT:    movl $127, %r12d<br>
+; CHECK-NEXT:    cmoval %r12d, %ebp<br>
+; CHECK-NEXT:    xorl %r15d, %r15d<br>
+; CHECK-NEXT:    ucomiss %xmm0, %xmm0<br>
+; CHECK-NEXT:    cmovpl %r15d, %ebp<br>
+; CHECK-NEXT:    shll $8, %ebp<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %eax<br>
+; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
+; CHECK-NEXT:    cmovbl %r14d, %eax<br>
+; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
+; CHECK-NEXT:    cmoval %r12d, %eax<br>
+; CHECK-NEXT:    ucomiss %xmm0, %xmm0<br>
+; CHECK-NEXT:    cmovpl %r15d, %eax<br>
 ; CHECK-NEXT:    movzbl %al, %ebx<br>
-; CHECK-NEXT:    orl %r12d, %ebx<br>
-; CHECK-NEXT:    movzwl %bp, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
-; CHECK-NEXT:    movss {{.*#+}} xmm1 = mem[0],zero,zero,zero<br>
-; CHECK-NEXT:    maxss %xmm0, %xmm1<br>
-; CHECK-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero<br>
-; CHECK-NEXT:    minss %xmm1, %xmm0<br>
+; CHECK-NEXT:    orl %ebp, %ebx<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %ebp<br>
+; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
+; CHECK-NEXT:    cmovbl %r14d, %ebp<br>
+; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
+; CHECK-NEXT:    cmoval %r12d, %ebp<br>
+; CHECK-NEXT:    ucomiss %xmm0, %xmm0<br>
+; CHECK-NEXT:    cmovpl %r15d, %ebp<br>
 ; CHECK-NEXT:    shll $8, %ebp<br>
-; CHECK-NEXT:    movzwl %r15w, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
-; CHECK-NEXT:    movss {{.*#+}} xmm1 = mem[0],zero,zero,zero<br>
-; CHECK-NEXT:    maxss %xmm0, %xmm1<br>
-; CHECK-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero<br>
-; CHECK-NEXT:    minss %xmm1, %xmm0<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %eax<br>
+; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
+; CHECK-NEXT:    cmovbl %r14d, %eax<br>
+; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
+; CHECK-NEXT:    cmoval %r12d, %eax<br>
+; CHECK-NEXT:    ucomiss %xmm0, %xmm0<br>
+; CHECK-NEXT:    cmovpl %r15d, %eax<br>
 ; CHECK-NEXT:    movzbl %al, %eax<br>
 ; CHECK-NEXT:    orl %ebp, %eax<br>
 ; CHECK-NEXT:    movd %eax, %xmm0<br>
 ; CHECK-NEXT:    pinsrw $1, %ebx, %xmm0<br>
 ; CHECK-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
-; CHECK-NEXT:    movzwl %r13w, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
-; CHECK-NEXT:    movss {{.*#+}} xmm1 = mem[0],zero,zero,zero<br>
-; CHECK-NEXT:    maxss %xmm0, %xmm1<br>
-; CHECK-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero<br>
-; CHECK-NEXT:    minss %xmm1, %xmm0<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %ebx<br>
+; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
+; CHECK-NEXT:    cmovbl %r14d, %ebx<br>
+; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
+; CHECK-NEXT:    cmoval %r12d, %ebx<br>
+; CHECK-NEXT:    ucomiss %xmm0, %xmm0<br>
+; CHECK-NEXT:    cmovpl %r15d, %ebx<br>
 ; CHECK-NEXT:    shll $8, %ebx<br>
-; CHECK-NEXT:    movzwl {{[-0-9]+}}(%r{{[sb]}}p), %edi # 2-byte Folded Reload<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
-; CHECK-NEXT:    movss {{.*#+}} xmm1 = mem[0],zero,zero,zero<br>
-; CHECK-NEXT:    maxss %xmm0, %xmm1<br>
-; CHECK-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero<br>
-; CHECK-NEXT:    minss %xmm1, %xmm0<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %eax<br>
+; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
+; CHECK-NEXT:    cmovbl %r14d, %eax<br>
+; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
+; CHECK-NEXT:    cmoval %r12d, %eax<br>
+; CHECK-NEXT:    ucomiss %xmm0, %xmm0<br>
+; CHECK-NEXT:    cmovpl %r15d, %eax<br>
 ; CHECK-NEXT:    movzbl %al, %eax<br>
 ; CHECK-NEXT:    orl %ebx, %eax<br>
 ; CHECK-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
 ; CHECK-NEXT:    pinsrw $2, %eax, %xmm0<br>
 ; CHECK-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
-; CHECK-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %edi # 4-byte Reload<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
-; CHECK-NEXT:    movss {{.*#+}} xmm1 = mem[0],zero,zero,zero<br>
-; CHECK-NEXT:    maxss %xmm0, %xmm1<br>
-; CHECK-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero<br>
-; CHECK-NEXT:    minss %xmm1, %xmm0<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %ebx<br>
+; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
+; CHECK-NEXT:    cmovbl %r14d, %ebx<br>
+; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
+; CHECK-NEXT:    cmoval %r12d, %ebx<br>
+; CHECK-NEXT:    ucomiss %xmm0, %xmm0<br>
+; CHECK-NEXT:    cmovpl %r15d, %ebx<br>
 ; CHECK-NEXT:    shll $8, %ebx<br>
-; CHECK-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %edi # 4-byte Reload<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
-; CHECK-NEXT:    movss {{.*#+}} xmm1 = mem[0],zero,zero,zero<br>
-; CHECK-NEXT:    maxss %xmm0, %xmm1<br>
-; CHECK-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero<br>
-; CHECK-NEXT:    minss %xmm1, %xmm0<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %eax<br>
+; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
+; CHECK-NEXT:    cmovbl %r14d, %eax<br>
+; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
+; CHECK-NEXT:    cmoval %r12d, %eax<br>
+; CHECK-NEXT:    ucomiss %xmm0, %xmm0<br>
+; CHECK-NEXT:    cmovpl %r15d, %eax<br>
 ; CHECK-NEXT:    movzbl %al, %eax<br>
 ; CHECK-NEXT:    orl %ebx, %eax<br>
 ; CHECK-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
 ; CHECK-NEXT:    pinsrw $3, %eax, %xmm0<br>
-; CHECK-NEXT:    addq $40, %rsp<br>
+; CHECK-NEXT:    addq $48, %rsp<br>
 ; CHECK-NEXT:    popq %rbx<br>
 ; CHECK-NEXT:    popq %r12<br>
-; CHECK-NEXT:    popq %r13<br>
 ; CHECK-NEXT:    popq %r14<br>
 ; CHECK-NEXT:    popq %r15<br>
 ; CHECK-NEXT:    popq %rbp<br>
@@ -763,97 +803,120 @@ define <8 x i16> @test_signed_v8i16_v8f16(<8 x half> %f) nounwind {<br>
 ; CHECK-LABEL: test_signed_v8i16_v8f16:<br>
 ; CHECK:       # %bb.0:<br>
 ; CHECK-NEXT:    pushq %rbp<br>
-; CHECK-NEXT:    pushq %r15<br>
 ; CHECK-NEXT:    pushq %r14<br>
-; CHECK-NEXT:    pushq %r13<br>
-; CHECK-NEXT:    pushq %r12<br>
 ; CHECK-NEXT:    pushq %rbx<br>
-; CHECK-NEXT:    subq $72, %rsp<br>
-; CHECK-NEXT:    movl %r9d, %ebp<br>
-; CHECK-NEXT:    movl %r8d, %ebx<br>
-; CHECK-NEXT:    movl %ecx, %r13d<br>
-; CHECK-NEXT:    movl %edx, %r12d<br>
-; CHECK-NEXT:    movl %esi, %r15d<br>
-; CHECK-NEXT:    movl %edi, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%rsp), %r14d<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%rsp), %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
-; CHECK-NEXT:    movss {{.*#+}} xmm1 = mem[0],zero,zero,zero<br>
-; CHECK-NEXT:    maxss %xmm0, %xmm1<br>
-; CHECK-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero<br>
-; CHECK-NEXT:    minss %xmm1, %xmm0<br>
+; CHECK-NEXT:    subq $128, %rsp<br>
+; CHECK-NEXT:    movss %xmm6, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movss %xmm5, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movss %xmm4, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movss %xmm3, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movss %xmm2, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movss %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movaps %xmm7, %xmm0<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %eax<br>
+; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
+; CHECK-NEXT:    movl $32768, %r14d # imm = 0x8000<br>
+; CHECK-NEXT:    cmovbl %r14d, %eax<br>
+; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
+; CHECK-NEXT:    movl $32767, %ebp # imm = 0x7FFF<br>
+; CHECK-NEXT:    cmoval %ebp, %eax<br>
+; CHECK-NEXT:    xorl %ebx, %ebx<br>
+; CHECK-NEXT:    ucomiss %xmm0, %xmm0<br>
+; CHECK-NEXT:    cmovpl %ebx, %eax<br>
 ; CHECK-NEXT:    movd %eax, %xmm0<br>
 ; CHECK-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
-; CHECK-NEXT:    movl %r14d, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
-; CHECK-NEXT:    movss {{.*#+}} xmm1 = mem[0],zero,zero,zero<br>
-; CHECK-NEXT:    maxss %xmm0, %xmm1<br>
-; CHECK-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero<br>
-; CHECK-NEXT:    minss %xmm1, %xmm0<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %eax<br>
+; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
+; CHECK-NEXT:    cmovbl %r14d, %eax<br>
+; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
+; CHECK-NEXT:    cmoval %ebp, %eax<br>
+; CHECK-NEXT:    ucomiss %xmm0, %xmm0<br>
+; CHECK-NEXT:    cmovpl %ebx, %eax<br>
 ; CHECK-NEXT:    movd %eax, %xmm0<br>
 ; CHECK-NEXT:    punpcklwd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload<br>
 ; CHECK-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3]<br>
 ; CHECK-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
-; CHECK-NEXT:    movzwl %bp, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
-; CHECK-NEXT:    movss {{.*#+}} xmm1 = mem[0],zero,zero,zero<br>
-; CHECK-NEXT:    maxss %xmm0, %xmm1<br>
-; CHECK-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero<br>
-; CHECK-NEXT:    minss %xmm1, %xmm0<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %eax<br>
+; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
+; CHECK-NEXT:    cmovbl %r14d, %eax<br>
+; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
+; CHECK-NEXT:    cmoval %ebp, %eax<br>
+; CHECK-NEXT:    ucomiss %xmm0, %xmm0<br>
+; CHECK-NEXT:    cmovpl %ebx, %eax<br>
 ; CHECK-NEXT:    movd %eax, %xmm0<br>
 ; CHECK-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
-; CHECK-NEXT:    movzwl %bx, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
-; CHECK-NEXT:    movss {{.*#+}} xmm1 = mem[0],zero,zero,zero<br>
-; CHECK-NEXT:    maxss %xmm0, %xmm1<br>
-; CHECK-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero<br>
-; CHECK-NEXT:    minss %xmm1, %xmm0<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %eax<br>
+; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
+; CHECK-NEXT:    cmovbl %r14d, %eax<br>
+; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
+; CHECK-NEXT:    cmoval %ebp, %eax<br>
+; CHECK-NEXT:    ucomiss %xmm0, %xmm0<br>
+; CHECK-NEXT:    cmovpl %ebx, %eax<br>
 ; CHECK-NEXT:    movd %eax, %xmm0<br>
 ; CHECK-NEXT:    punpcklwd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload<br>
 ; CHECK-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3]<br>
 ; CHECK-NEXT:    punpckldq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload<br>
 ; CHECK-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]<br>
 ; CHECK-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
-; CHECK-NEXT:    movzwl %r13w, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
-; CHECK-NEXT:    movss {{.*#+}} xmm1 = mem[0],zero,zero,zero<br>
-; CHECK-NEXT:    maxss %xmm0, %xmm1<br>
-; CHECK-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero<br>
-; CHECK-NEXT:    minss %xmm1, %xmm0<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %eax<br>
+; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
+; CHECK-NEXT:    cmovbl %r14d, %eax<br>
+; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
+; CHECK-NEXT:    cmoval %ebp, %eax<br>
+; CHECK-NEXT:    ucomiss %xmm0, %xmm0<br>
+; CHECK-NEXT:    cmovpl %ebx, %eax<br>
 ; CHECK-NEXT:    movd %eax, %xmm0<br>
 ; CHECK-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
-; CHECK-NEXT:    movzwl %r12w, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
-; CHECK-NEXT:    movss {{.*#+}} xmm1 = mem[0],zero,zero,zero<br>
-; CHECK-NEXT:    maxss %xmm0, %xmm1<br>
-; CHECK-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero<br>
-; CHECK-NEXT:    minss %xmm1, %xmm0<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %eax<br>
+; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
+; CHECK-NEXT:    cmovbl %r14d, %eax<br>
+; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
+; CHECK-NEXT:    cmoval %ebp, %eax<br>
+; CHECK-NEXT:    ucomiss %xmm0, %xmm0<br>
+; CHECK-NEXT:    cmovpl %ebx, %eax<br>
 ; CHECK-NEXT:    movd %eax, %xmm0<br>
 ; CHECK-NEXT:    punpcklwd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload<br>
 ; CHECK-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3]<br>
 ; CHECK-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
-; CHECK-NEXT:    movzwl %r15w, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
-; CHECK-NEXT:    movss {{.*#+}} xmm1 = mem[0],zero,zero,zero<br>
-; CHECK-NEXT:    maxss %xmm0, %xmm1<br>
-; CHECK-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero<br>
-; CHECK-NEXT:    minss %xmm1, %xmm0<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %eax<br>
+; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
+; CHECK-NEXT:    cmovbl %r14d, %eax<br>
+; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
+; CHECK-NEXT:    cmoval %ebp, %eax<br>
+; CHECK-NEXT:    ucomiss %xmm0, %xmm0<br>
+; CHECK-NEXT:    cmovpl %ebx, %eax<br>
 ; CHECK-NEXT:    movd %eax, %xmm0<br>
 ; CHECK-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
-; CHECK-NEXT:    movzwl {{[-0-9]+}}(%r{{[sb]}}p), %edi # 2-byte Folded Reload<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
-; CHECK-NEXT:    movss {{.*#+}} xmm1 = mem[0],zero,zero,zero<br>
-; CHECK-NEXT:    maxss %xmm0, %xmm1<br>
-; CHECK-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero<br>
-; CHECK-NEXT:    minss %xmm1, %xmm0<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %eax<br>
+; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
+; CHECK-NEXT:    cmovbl %r14d, %eax<br>
+; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
+; CHECK-NEXT:    cmoval %ebp, %eax<br>
+; CHECK-NEXT:    ucomiss %xmm0, %xmm0<br>
+; CHECK-NEXT:    cmovpl %ebx, %eax<br>
 ; CHECK-NEXT:    movd %eax, %xmm0<br>
 ; CHECK-NEXT:    punpcklwd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload<br>
 ; CHECK-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3]<br>
@@ -861,12 +924,9 @@ define <8 x i16> @test_signed_v8i16_v8f16(<8 x half> %f) nounwind {<br>
 ; CHECK-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]<br>
 ; CHECK-NEXT:    punpcklqdq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload<br>
 ; CHECK-NEXT:    # xmm0 = xmm0[0],mem[0]<br>
-; CHECK-NEXT:    addq $72, %rsp<br>
+; CHECK-NEXT:    addq $128, %rsp<br>
 ; CHECK-NEXT:    popq %rbx<br>
-; CHECK-NEXT:    popq %r12<br>
-; CHECK-NEXT:    popq %r13<br>
 ; CHECK-NEXT:    popq %r14<br>
-; CHECK-NEXT:    popq %r15<br>
 ; CHECK-NEXT:    popq %rbp<br>
 ; CHECK-NEXT:    retq<br>
   %x = call <8 x i16> @llvm.fptosi.sat.v8i16.v8f16(<8 x half> %f)<br>
@@ -877,112 +937,129 @@ define <8 x i32> @test_signed_v8i32_v8f16(<8 x half> %f) nounwind {<br>
 ; CHECK-LABEL: test_signed_v8i32_v8f16:<br>
 ; CHECK:       # %bb.0:<br>
 ; CHECK-NEXT:    pushq %rbp<br>
-; CHECK-NEXT:    pushq %r15<br>
 ; CHECK-NEXT:    pushq %r14<br>
-; CHECK-NEXT:    pushq %r13<br>
-; CHECK-NEXT:    pushq %r12<br>
 ; CHECK-NEXT:    pushq %rbx<br>
-; CHECK-NEXT:    subq $88, %rsp<br>
-; CHECK-NEXT:    movl %r9d, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movl %r8d, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movl %edx, %r14d<br>
-; CHECK-NEXT:    movl %esi, %ebp<br>
-; CHECK-NEXT:    movl %edi, %ebx<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%rsp), %eax<br>
-; CHECK-NEXT:    movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%rsp), %r13d<br>
-; CHECK-NEXT:    movzwl %cx, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    subq $128, %rsp<br>
+; CHECK-NEXT:    movss %xmm7, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movss %xmm6, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movss %xmm5, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movss %xmm4, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movss %xmm2, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movss %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movaps %xmm3, %xmm0<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %eax<br>
 ; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
-; CHECK-NEXT:    movl $2147483647, %r15d # imm = 0x7FFFFFFF<br>
-; CHECK-NEXT:    cmoval %r15d, %eax<br>
-; CHECK-NEXT:    xorl %r12d, %r12d<br>
+; CHECK-NEXT:    movl $-2147483648, %r14d # imm = 0x80000000<br>
+; CHECK-NEXT:    cmovbl %r14d, %eax<br>
+; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
+; CHECK-NEXT:    movl $2147483647, %ebp # imm = 0x7FFFFFFF<br>
+; CHECK-NEXT:    cmoval %ebp, %eax<br>
+; CHECK-NEXT:    xorl %ebx, %ebx<br>
 ; CHECK-NEXT:    ucomiss %xmm0, %xmm0<br>
-; CHECK-NEXT:    cmovpl %r12d, %eax<br>
+; CHECK-NEXT:    cmovpl %ebx, %eax<br>
 ; CHECK-NEXT:    movd %eax, %xmm0<br>
 ; CHECK-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
-; CHECK-NEXT:    movzwl %r14w, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %eax<br>
 ; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
-; CHECK-NEXT:    cmoval %r15d, %eax<br>
+; CHECK-NEXT:    cmovbl %r14d, %eax<br>
+; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
+; CHECK-NEXT:    cmoval %ebp, %eax<br>
 ; CHECK-NEXT:    ucomiss %xmm0, %xmm0<br>
-; CHECK-NEXT:    cmovpl %r12d, %eax<br>
+; CHECK-NEXT:    cmovpl %ebx, %eax<br>
 ; CHECK-NEXT:    movd %eax, %xmm0<br>
 ; CHECK-NEXT:    punpckldq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload<br>
 ; CHECK-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]<br>
 ; CHECK-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
-; CHECK-NEXT:    movzwl %bp, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %eax<br>
 ; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
-; CHECK-NEXT:    cmoval %r15d, %eax<br>
+; CHECK-NEXT:    cmovbl %r14d, %eax<br>
+; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
+; CHECK-NEXT:    cmoval %ebp, %eax<br>
 ; CHECK-NEXT:    ucomiss %xmm0, %xmm0<br>
-; CHECK-NEXT:    cmovpl %r12d, %eax<br>
+; CHECK-NEXT:    cmovpl %ebx, %eax<br>
 ; CHECK-NEXT:    movd %eax, %xmm0<br>
 ; CHECK-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
-; CHECK-NEXT:    movzwl %bx, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %eax<br>
 ; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
-; CHECK-NEXT:    cmoval %r15d, %eax<br>
+; CHECK-NEXT:    cmovbl %r14d, %eax<br>
+; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
+; CHECK-NEXT:    cmoval %ebp, %eax<br>
 ; CHECK-NEXT:    ucomiss %xmm0, %xmm0<br>
-; CHECK-NEXT:    cmovpl %r12d, %eax<br>
+; CHECK-NEXT:    cmovpl %ebx, %eax<br>
 ; CHECK-NEXT:    movd %eax, %xmm0<br>
 ; CHECK-NEXT:    punpckldq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload<br>
 ; CHECK-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]<br>
 ; CHECK-NEXT:    punpcklqdq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload<br>
 ; CHECK-NEXT:    # xmm0 = xmm0[0],mem[0]<br>
 ; CHECK-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
-; CHECK-NEXT:    movl %r13d, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %eax<br>
 ; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
-; CHECK-NEXT:    cmoval %r15d, %eax<br>
+; CHECK-NEXT:    cmovbl %r14d, %eax<br>
+; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
+; CHECK-NEXT:    cmoval %ebp, %eax<br>
 ; CHECK-NEXT:    ucomiss %xmm0, %xmm0<br>
-; CHECK-NEXT:    cmovpl %r12d, %eax<br>
+; CHECK-NEXT:    cmovpl %ebx, %eax<br>
 ; CHECK-NEXT:    movd %eax, %xmm0<br>
 ; CHECK-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
-; CHECK-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %edi # 4-byte Reload<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %eax<br>
 ; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
-; CHECK-NEXT:    cmoval %r15d, %eax<br>
+; CHECK-NEXT:    cmovbl %r14d, %eax<br>
+; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
+; CHECK-NEXT:    cmoval %ebp, %eax<br>
 ; CHECK-NEXT:    ucomiss %xmm0, %xmm0<br>
-; CHECK-NEXT:    cmovpl %r12d, %eax<br>
+; CHECK-NEXT:    cmovpl %ebx, %eax<br>
 ; CHECK-NEXT:    movd %eax, %xmm0<br>
 ; CHECK-NEXT:    punpckldq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload<br>
 ; CHECK-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]<br>
 ; CHECK-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
-; CHECK-NEXT:    movzwl {{[-0-9]+}}(%r{{[sb]}}p), %edi # 2-byte Folded Reload<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %eax<br>
 ; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
-; CHECK-NEXT:    cmoval %r15d, %eax<br>
+; CHECK-NEXT:    cmovbl %r14d, %eax<br>
+; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
+; CHECK-NEXT:    cmoval %ebp, %eax<br>
 ; CHECK-NEXT:    ucomiss %xmm0, %xmm0<br>
-; CHECK-NEXT:    cmovpl %r12d, %eax<br>
+; CHECK-NEXT:    cmovpl %ebx, %eax<br>
 ; CHECK-NEXT:    movd %eax, %xmm0<br>
 ; CHECK-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
-; CHECK-NEXT:    movzwl {{[-0-9]+}}(%r{{[sb]}}p), %edi # 2-byte Folded Reload<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %eax<br>
 ; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
-; CHECK-NEXT:    cmoval %r15d, %eax<br>
+; CHECK-NEXT:    cmovbl %r14d, %eax<br>
+; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
+; CHECK-NEXT:    cmoval %ebp, %eax<br>
 ; CHECK-NEXT:    ucomiss %xmm0, %xmm0<br>
-; CHECK-NEXT:    cmovpl %r12d, %eax<br>
+; CHECK-NEXT:    cmovpl %ebx, %eax<br>
 ; CHECK-NEXT:    movd %eax, %xmm1<br>
 ; CHECK-NEXT:    punpckldq {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Folded Reload<br>
 ; CHECK-NEXT:    # xmm1 = xmm1[0],mem[0],xmm1[1],mem[1]<br>
 ; CHECK-NEXT:    punpcklqdq {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Folded Reload<br>
 ; CHECK-NEXT:    # xmm1 = xmm1[0],mem[0]<br>
 ; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
-; CHECK-NEXT:    addq $88, %rsp<br>
+; CHECK-NEXT:    addq $128, %rsp<br>
 ; CHECK-NEXT:    popq %rbx<br>
-; CHECK-NEXT:    popq %r12<br>
-; CHECK-NEXT:    popq %r13<br>
 ; CHECK-NEXT:    popq %r14<br>
-; CHECK-NEXT:    popq %r15<br>
 ; CHECK-NEXT:    popq %rbp<br>
 ; CHECK-NEXT:    retq<br>
   %x = call <8 x i32> @llvm.fptosi.sat.v8i32.v8f16(<8 x half> %f)<br>
@@ -992,111 +1069,129 @@ define <8 x i32> @test_signed_v8i32_v8f16(<8 x half> %f) nounwind {<br>
 define <8 x i64> @test_signed_v8i64_v8f16(<8 x half> %f) nounwind {<br>
 ; CHECK-LABEL: test_signed_v8i64_v8f16:<br>
 ; CHECK:       # %bb.0:<br>
-; CHECK-NEXT:    pushq %rbp<br>
 ; CHECK-NEXT:    pushq %r15<br>
 ; CHECK-NEXT:    pushq %r14<br>
-; CHECK-NEXT:    pushq %r13<br>
-; CHECK-NEXT:    pushq %r12<br>
 ; CHECK-NEXT:    pushq %rbx<br>
-; CHECK-NEXT:    subq $104, %rsp<br>
-; CHECK-NEXT:    movl %r9d, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movl %r8d, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movl %ecx, %r13d<br>
-; CHECK-NEXT:    movl %edx, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movl %esi, %ebp<br>
-; CHECK-NEXT:    movl %edi, %ebx<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%rsp), %r14d<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%rsp), %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    subq $128, %rsp<br>
+; CHECK-NEXT:    movss %xmm7, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movss %xmm6, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movss %xmm5, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movss %xmm4, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movss %xmm3, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movss %xmm2, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movaps %xmm1, %xmm0<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %rax<br>
 ; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
-; CHECK-NEXT:    movabsq $9223372036854775807, %r15 # imm = 0x7FFFFFFFFFFFFFFF<br>
-; CHECK-NEXT:    cmovaq %r15, %rax<br>
-; CHECK-NEXT:    xorl %r12d, %r12d<br>
+; CHECK-NEXT:    movabsq $-9223372036854775808, %r14 # imm = 0x8000000000000000<br>
+; CHECK-NEXT:    cmovbq %r14, %rax<br>
+; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
+; CHECK-NEXT:    movabsq $9223372036854775807, %rbx # imm = 0x7FFFFFFFFFFFFFFF<br>
+; CHECK-NEXT:    cmovaq %rbx, %rax<br>
+; CHECK-NEXT:    xorl %r15d, %r15d<br>
 ; CHECK-NEXT:    ucomiss %xmm0, %xmm0<br>
-; CHECK-NEXT:    cmovpq %r12, %rax<br>
+; CHECK-NEXT:    cmovpq %r15, %rax<br>
 ; CHECK-NEXT:    movq %rax, %xmm0<br>
 ; CHECK-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
-; CHECK-NEXT:    movl %r14d, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %rax<br>
 ; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
-; CHECK-NEXT:    cmovaq %r15, %rax<br>
+; CHECK-NEXT:    cmovbq %r14, %rax<br>
+; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
+; CHECK-NEXT:    cmovaq %rbx, %rax<br>
 ; CHECK-NEXT:    ucomiss %xmm0, %xmm0<br>
-; CHECK-NEXT:    cmovpq %r12, %rax<br>
+; CHECK-NEXT:    cmovpq %r15, %rax<br>
 ; CHECK-NEXT:    movq %rax, %xmm0<br>
 ; CHECK-NEXT:    punpcklqdq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload<br>
 ; CHECK-NEXT:    # xmm0 = xmm0[0],mem[0]<br>
 ; CHECK-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
-; CHECK-NEXT:    movzwl %bp, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %rax<br>
 ; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
-; CHECK-NEXT:    cmovaq %r15, %rax<br>
+; CHECK-NEXT:    cmovbq %r14, %rax<br>
+; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
+; CHECK-NEXT:    cmovaq %rbx, %rax<br>
 ; CHECK-NEXT:    ucomiss %xmm0, %xmm0<br>
-; CHECK-NEXT:    cmovpq %r12, %rax<br>
+; CHECK-NEXT:    cmovpq %r15, %rax<br>
 ; CHECK-NEXT:    movq %rax, %xmm0<br>
 ; CHECK-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
-; CHECK-NEXT:    movzwl %bx, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %rax<br>
 ; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
-; CHECK-NEXT:    cmovaq %r15, %rax<br>
+; CHECK-NEXT:    cmovbq %r14, %rax<br>
+; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
+; CHECK-NEXT:    cmovaq %rbx, %rax<br>
 ; CHECK-NEXT:    ucomiss %xmm0, %xmm0<br>
-; CHECK-NEXT:    cmovpq %r12, %rax<br>
+; CHECK-NEXT:    cmovpq %r15, %rax<br>
 ; CHECK-NEXT:    movq %rax, %xmm0<br>
 ; CHECK-NEXT:    punpcklqdq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload<br>
 ; CHECK-NEXT:    # xmm0 = xmm0[0],mem[0]<br>
 ; CHECK-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
-; CHECK-NEXT:    movzwl %r13w, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %rax<br>
 ; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
-; CHECK-NEXT:    cmovaq %r15, %rax<br>
+; CHECK-NEXT:    cmovbq %r14, %rax<br>
+; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
+; CHECK-NEXT:    cmovaq %rbx, %rax<br>
 ; CHECK-NEXT:    ucomiss %xmm0, %xmm0<br>
-; CHECK-NEXT:    cmovpq %r12, %rax<br>
+; CHECK-NEXT:    cmovpq %r15, %rax<br>
 ; CHECK-NEXT:    movq %rax, %xmm0<br>
 ; CHECK-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
-; CHECK-NEXT:    movzwl {{[-0-9]+}}(%r{{[sb]}}p), %edi # 2-byte Folded Reload<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %rax<br>
 ; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
-; CHECK-NEXT:    cmovaq %r15, %rax<br>
+; CHECK-NEXT:    cmovbq %r14, %rax<br>
+; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
+; CHECK-NEXT:    cmovaq %rbx, %rax<br>
 ; CHECK-NEXT:    ucomiss %xmm0, %xmm0<br>
-; CHECK-NEXT:    cmovpq %r12, %rax<br>
+; CHECK-NEXT:    cmovpq %r15, %rax<br>
 ; CHECK-NEXT:    movq %rax, %xmm0<br>
 ; CHECK-NEXT:    punpcklqdq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload<br>
 ; CHECK-NEXT:    # xmm0 = xmm0[0],mem[0]<br>
 ; CHECK-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
-; CHECK-NEXT:    movzwl {{[-0-9]+}}(%r{{[sb]}}p), %edi # 2-byte Folded Reload<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %rax<br>
 ; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
-; CHECK-NEXT:    cmovaq %r15, %rax<br>
+; CHECK-NEXT:    cmovbq %r14, %rax<br>
+; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
+; CHECK-NEXT:    cmovaq %rbx, %rax<br>
 ; CHECK-NEXT:    ucomiss %xmm0, %xmm0<br>
-; CHECK-NEXT:    cmovpq %r12, %rax<br>
+; CHECK-NEXT:    cmovpq %r15, %rax<br>
 ; CHECK-NEXT:    movq %rax, %xmm0<br>
 ; CHECK-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
-; CHECK-NEXT:    movzwl {{[-0-9]+}}(%r{{[sb]}}p), %edi # 2-byte Folded Reload<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %rax<br>
 ; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
-; CHECK-NEXT:    cmovaq %r15, %rax<br>
+; CHECK-NEXT:    cmovbq %r14, %rax<br>
+; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
+; CHECK-NEXT:    cmovaq %rbx, %rax<br>
 ; CHECK-NEXT:    ucomiss %xmm0, %xmm0<br>
-; CHECK-NEXT:    cmovpq %r12, %rax<br>
-; CHECK-NEXT:    movq %rax, %xmm2<br>
-; CHECK-NEXT:    punpcklqdq {{[-0-9]+}}(%r{{[sb]}}p), %xmm2 # 16-byte Folded Reload<br>
-; CHECK-NEXT:    # xmm2 = xmm2[0],mem[0]<br>
+; CHECK-NEXT:    cmovpq %r15, %rax<br>
+; CHECK-NEXT:    movq %rax, %xmm3<br>
+; CHECK-NEXT:    punpcklqdq {{[-0-9]+}}(%r{{[sb]}}p), %xmm3 # 16-byte Folded Reload<br>
+; CHECK-NEXT:    # xmm3 = xmm3[0],mem[0]<br>
 ; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
 ; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload<br>
-; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm3 # 16-byte Reload<br>
-; CHECK-NEXT:    addq $104, %rsp<br>
+; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm2 # 16-byte Reload<br>
+; CHECK-NEXT:    addq $128, %rsp<br>
 ; CHECK-NEXT:    popq %rbx<br>
-; CHECK-NEXT:    popq %r12<br>
-; CHECK-NEXT:    popq %r13<br>
 ; CHECK-NEXT:    popq %r14<br>
 ; CHECK-NEXT:    popq %r15<br>
-; CHECK-NEXT:    popq %rbp<br>
 ; CHECK-NEXT:    retq<br>
   %x = call <8 x i64> @llvm.fptosi.sat.v8i64.v8f16(<8 x half> %f)<br>
   ret <8 x i64> %x<br>
@@ -1112,113 +1207,116 @@ define <8 x i128> @test_signed_v8i128_v8f16(<8 x half> %f) nounwind {<br>
 ; CHECK-NEXT:    pushq %r12<br>
 ; CHECK-NEXT:    pushq %rbx<br>
 ; CHECK-NEXT:    subq $88, %rsp<br>
-; CHECK-NEXT:    movl %r9d, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movl %r8d, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movl %ecx, %r14d<br>
-; CHECK-NEXT:    movl %edx, %r12d<br>
+; CHECK-NEXT:    movss %xmm7, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movss %xmm6, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movss %xmm5, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movss %xmm4, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movss %xmm3, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movss %xmm2, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movss %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
 ; CHECK-NEXT:    movq %rdi, %rbx<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%rsp), %eax<br>
-; CHECK-NEXT:    movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%rsp), %eax<br>
-; CHECK-NEXT:    movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%rsp), %eax<br>
-; CHECK-NEXT:    movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movzwl %si, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
 ; CHECK-NEXT:    callq __fixsfti@PLT<br>
-; CHECK-NEXT:    xorl %ebp, %ebp<br>
+; CHECK-NEXT:    xorl %r12d, %r12d<br>
 ; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
 ; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
 ; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
-; CHECK-NEXT:    cmovbq %rbp, %rax<br>
+; CHECK-NEXT:    cmovbq %r12, %rax<br>
 ; CHECK-NEXT:    movabsq $-9223372036854775808, %rcx # imm = 0x8000000000000000<br>
 ; CHECK-NEXT:    cmovbq %rcx, %rdx<br>
-; CHECK-NEXT:    movq %rcx, %r13<br>
+; CHECK-NEXT:    movq %rcx, %r14<br>
 ; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
-; CHECK-NEXT:    movabsq $9223372036854775807, %r15 # imm = 0x7FFFFFFFFFFFFFFF<br>
-; CHECK-NEXT:    cmovaq %r15, %rdx<br>
+; CHECK-NEXT:    movabsq $9223372036854775807, %rcx # imm = 0x7FFFFFFFFFFFFFFF<br>
+; CHECK-NEXT:    cmovaq %rcx, %rdx<br>
+; CHECK-NEXT:    movq %rcx, %rbp<br>
 ; CHECK-NEXT:    movq $-1, %rcx<br>
 ; CHECK-NEXT:    cmovaq %rcx, %rax<br>
+; CHECK-NEXT:    movq $-1, %r15<br>
 ; CHECK-NEXT:    ucomiss %xmm0, %xmm0<br>
-; CHECK-NEXT:    cmovpq %rbp, %rax<br>
+; CHECK-NEXT:    cmovpq %r12, %rax<br>
 ; CHECK-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill<br>
-; CHECK-NEXT:    cmovpq %rbp, %rdx<br>
+; CHECK-NEXT:    cmovpq %r12, %rdx<br>
 ; CHECK-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill<br>
-; CHECK-NEXT:    movzwl %r12w, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
 ; CHECK-NEXT:    callq __fixsfti@PLT<br>
 ; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
 ; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
 ; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
-; CHECK-NEXT:    cmovbq %rbp, %rax<br>
-; CHECK-NEXT:    cmovbq %r13, %rdx<br>
+; CHECK-NEXT:    cmovbq %r12, %rax<br>
+; CHECK-NEXT:    cmovbq %r14, %rdx<br>
 ; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
-; CHECK-NEXT:    cmovaq %r15, %rdx<br>
-; CHECK-NEXT:    movq $-1, %rcx<br>
-; CHECK-NEXT:    cmovaq %rcx, %rax<br>
-; CHECK-NEXT:    movq $-1, %r12<br>
+; CHECK-NEXT:    cmovaq %rbp, %rdx<br>
+; CHECK-NEXT:    cmovaq %r15, %rax<br>
+; CHECK-NEXT:    movq $-1, %r15<br>
 ; CHECK-NEXT:    ucomiss %xmm0, %xmm0<br>
-; CHECK-NEXT:    cmovpq %rbp, %rax<br>
+; CHECK-NEXT:    cmovpq %r12, %rax<br>
 ; CHECK-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill<br>
-; CHECK-NEXT:    cmovpq %rbp, %rdx<br>
+; CHECK-NEXT:    cmovpq %r12, %rdx<br>
 ; CHECK-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill<br>
-; CHECK-NEXT:    movzwl %r14w, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
 ; CHECK-NEXT:    callq __fixsfti@PLT<br>
 ; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
 ; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
 ; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
-; CHECK-NEXT:    cmovbq %rbp, %rax<br>
-; CHECK-NEXT:    cmovbq %r13, %rdx<br>
+; CHECK-NEXT:    cmovbq %r12, %rax<br>
+; CHECK-NEXT:    cmovbq %r14, %rdx<br>
 ; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
-; CHECK-NEXT:    cmovaq %r15, %rdx<br>
-; CHECK-NEXT:    cmovaq %r12, %rax<br>
-; CHECK-NEXT:    movq $-1, %r14<br>
+; CHECK-NEXT:    cmovaq %rbp, %rdx<br>
+; CHECK-NEXT:    cmovaq %r15, %rax<br>
+; CHECK-NEXT:    movq $-1, %r15<br>
 ; CHECK-NEXT:    ucomiss %xmm0, %xmm0<br>
-; CHECK-NEXT:    cmovpq %rbp, %rax<br>
+; CHECK-NEXT:    cmovpq %r12, %rax<br>
 ; CHECK-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill<br>
-; CHECK-NEXT:    cmovpq %rbp, %rdx<br>
+; CHECK-NEXT:    cmovpq %r12, %rdx<br>
 ; CHECK-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill<br>
-; CHECK-NEXT:    movzwl {{[-0-9]+}}(%r{{[sb]}}p), %edi # 2-byte Folded Reload<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
 ; CHECK-NEXT:    callq __fixsfti@PLT<br>
 ; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
 ; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
 ; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
-; CHECK-NEXT:    cmovbq %rbp, %rax<br>
-; CHECK-NEXT:    cmovbq %r13, %rdx<br>
+; CHECK-NEXT:    cmovbq %r12, %rax<br>
+; CHECK-NEXT:    cmovbq %r14, %rdx<br>
 ; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
-; CHECK-NEXT:    cmovaq %r15, %rdx<br>
-; CHECK-NEXT:    cmovaq %r14, %rax<br>
-; CHECK-NEXT:    movq $-1, %r14<br>
+; CHECK-NEXT:    cmovaq %rbp, %rdx<br>
+; CHECK-NEXT:    movq %rbp, %r13<br>
+; CHECK-NEXT:    cmovaq %r15, %rax<br>
+; CHECK-NEXT:    movq $-1, %r15<br>
 ; CHECK-NEXT:    ucomiss %xmm0, %xmm0<br>
-; CHECK-NEXT:    cmovpq %rbp, %rax<br>
+; CHECK-NEXT:    cmovpq %r12, %rax<br>
 ; CHECK-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill<br>
-; CHECK-NEXT:    cmovpq %rbp, %rdx<br>
+; CHECK-NEXT:    cmovpq %r12, %rdx<br>
 ; CHECK-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill<br>
-; CHECK-NEXT:    movzwl {{[-0-9]+}}(%r{{[sb]}}p), %edi # 2-byte Folded Reload<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
 ; CHECK-NEXT:    callq __fixsfti@PLT<br>
-; CHECK-NEXT:    movq %rdx, %r12<br>
+; CHECK-NEXT:    movq %rdx, %rbp<br>
 ; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
 ; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
 ; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
-; CHECK-NEXT:    cmovbq %rbp, %rax<br>
-; CHECK-NEXT:    cmovbq %r13, %r12<br>
+; CHECK-NEXT:    cmovbq %r12, %rax<br>
+; CHECK-NEXT:    cmovbq %r14, %rbp<br>
 ; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
-; CHECK-NEXT:    cmovaq %r15, %r12<br>
-; CHECK-NEXT:    cmovaq %r14, %rax<br>
+; CHECK-NEXT:    cmovaq %r13, %rbp<br>
+; CHECK-NEXT:    cmovaq %r15, %rax<br>
 ; CHECK-NEXT:    ucomiss %xmm0, %xmm0<br>
-; CHECK-NEXT:    cmovpq %rbp, %rax<br>
+; CHECK-NEXT:    cmovpq %r12, %rax<br>
 ; CHECK-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill<br>
-; CHECK-NEXT:    cmovpq %rbp, %r12<br>
-; CHECK-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %edi # 4-byte Reload<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    cmovpq %r12, %rbp<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
 ; CHECK-NEXT:    callq __fixsfti@PLT<br>
 ; CHECK-NEXT:    movq %rax, %r14<br>
@@ -1226,39 +1324,41 @@ define <8 x i128> @test_signed_v8i128_v8f16(<8 x half> %f) nounwind {<br>
 ; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
 ; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
 ; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
-; CHECK-NEXT:    cmovbq %rbp, %r14<br>
-; CHECK-NEXT:    cmovbq %r13, %r15<br>
+; CHECK-NEXT:    cmovbq %r12, %r14<br>
+; CHECK-NEXT:    movabsq $-9223372036854775808, %rax # imm = 0x8000000000000000<br>
+; CHECK-NEXT:    cmovbq %rax, %r15<br>
 ; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
-; CHECK-NEXT:    movabsq $9223372036854775807, %rax # imm = 0x7FFFFFFFFFFFFFFF<br>
-; CHECK-NEXT:    cmovaq %rax, %r15<br>
+; CHECK-NEXT:    cmovaq %r13, %r15<br>
 ; CHECK-NEXT:    movq $-1, %rax<br>
 ; CHECK-NEXT:    cmovaq %rax, %r14<br>
 ; CHECK-NEXT:    ucomiss %xmm0, %xmm0<br>
-; CHECK-NEXT:    cmovpq %rbp, %r14<br>
-; CHECK-NEXT:    cmovpq %rbp, %r15<br>
-; CHECK-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %edi # 4-byte Reload<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    cmovpq %r12, %r14<br>
+; CHECK-NEXT:    cmovpq %r12, %r15<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
 ; CHECK-NEXT:    callq __fixsfti@PLT<br>
-; CHECK-NEXT:    movq %rax, %r13<br>
-; CHECK-NEXT:    movq %rdx, %rbp<br>
+; CHECK-NEXT:    movq %rax, %r12<br>
+; CHECK-NEXT:    movq %rdx, %r13<br>
 ; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
 ; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
 ; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
 ; CHECK-NEXT:    movl $0, %eax<br>
-; CHECK-NEXT:    cmovbq %rax, %r13<br>
+; CHECK-NEXT:    cmovbq %rax, %r12<br>
 ; CHECK-NEXT:    movabsq $-9223372036854775808, %rcx # imm = 0x8000000000000000<br>
-; CHECK-NEXT:    cmovbq %rcx, %rbp<br>
+; CHECK-NEXT:    cmovbq %rcx, %r13<br>
 ; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
 ; CHECK-NEXT:    movabsq $9223372036854775807, %rcx # imm = 0x7FFFFFFFFFFFFFFF<br>
-; CHECK-NEXT:    cmovaq %rcx, %rbp<br>
-; CHECK-NEXT:    movq $-1, %rcx<br>
 ; CHECK-NEXT:    cmovaq %rcx, %r13<br>
+; CHECK-NEXT:    movq $-1, %rcx<br>
+; CHECK-NEXT:    cmovaq %rcx, %r12<br>
 ; CHECK-NEXT:    ucomiss %xmm0, %xmm0<br>
+; CHECK-NEXT:    cmovpq %rax, %r12<br>
 ; CHECK-NEXT:    cmovpq %rax, %r13<br>
-; CHECK-NEXT:    cmovpq %rax, %rbp<br>
-; CHECK-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %edi # 4-byte Reload<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
 ; CHECK-NEXT:    callq __fixsfti@PLT<br>
 ; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
@@ -1279,11 +1379,11 @@ define <8 x i128> @test_signed_v8i128_v8f16(<8 x half> %f) nounwind {<br>
 ; CHECK-NEXT:    cmovpq %rcx, %rdx<br>
 ; CHECK-NEXT:    movq %rdx, 120(%rbx)<br>
 ; CHECK-NEXT:    movq %rax, 112(%rbx)<br>
-; CHECK-NEXT:    movq %rbp, 104(%rbx)<br>
-; CHECK-NEXT:    movq %r13, 96(%rbx)<br>
+; CHECK-NEXT:    movq %r13, 104(%rbx)<br>
+; CHECK-NEXT:    movq %r12, 96(%rbx)<br>
 ; CHECK-NEXT:    movq %r15, 88(%rbx)<br>
 ; CHECK-NEXT:    movq %r14, 80(%rbx)<br>
-; CHECK-NEXT:    movq %r12, 72(%rbx)<br>
+; CHECK-NEXT:    movq %rbp, 72(%rbx)<br>
 ; CHECK-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload<br>
 ; CHECK-NEXT:    movq %rax, 64(%rbx)<br>
 ; CHECK-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload<br>
<br>
diff  --git a/llvm/test/CodeGen/X86/fptoui-sat-scalar.ll b/llvm/test/CodeGen/X86/fptoui-sat-scalar.ll<br>
index afc7c71963b5b..5fbf26c9d166a 100644<br>
--- a/llvm/test/CodeGen/X86/fptoui-sat-scalar.ll<br>
+++ b/llvm/test/CodeGen/X86/fptoui-sat-scalar.ll<br>
@@ -1922,15 +1922,20 @@ define i1 @test_unsigned_i1_f16(half %f) nounwind {<br>
 ; X86-SSE-LABEL: test_unsigned_i1_f16:<br>
 ; X86-SSE:       # %bb.0:<br>
 ; X86-SSE-NEXT:    subl $12, %esp<br>
-; X86-SSE-NEXT:    movzwl {{[0-9]+}}(%esp), %eax<br>
-; X86-SSE-NEXT:    movl %eax, (%esp)<br>
-; X86-SSE-NEXT:    calll __gnu_h2f_ieee<br>
+; X86-SSE-NEXT:    pinsrw $0, {{[0-9]+}}(%esp), %xmm0<br>
+; X86-SSE-NEXT:    pextrw $0, %xmm0, %eax<br>
+; X86-SSE-NEXT:    movw %ax, (%esp)<br>
+; X86-SSE-NEXT:    calll __extendhfsf2<br>
 ; X86-SSE-NEXT:    fstps {{[0-9]+}}(%esp)<br>
-; X86-SSE-NEXT:    xorps %xmm0, %xmm0<br>
-; X86-SSE-NEXT:    maxss {{[0-9]+}}(%esp), %xmm0<br>
-; X86-SSE-NEXT:    movss {{.*#+}} xmm1 = mem[0],zero,zero,zero<br>
-; X86-SSE-NEXT:    minss %xmm0, %xmm1<br>
-; X86-SSE-NEXT:    cvttss2si %xmm1, %eax<br>
+; X86-SSE-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero<br>
+; X86-SSE-NEXT:    cvttss2si %xmm0, %eax<br>
+; X86-SSE-NEXT:    xorl %ecx, %ecx<br>
+; X86-SSE-NEXT:    xorps %xmm1, %xmm1<br>
+; X86-SSE-NEXT:    ucomiss %xmm1, %xmm0<br>
+; X86-SSE-NEXT:    cmovael %eax, %ecx<br>
+; X86-SSE-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0<br>
+; X86-SSE-NEXT:    movl $1, %eax<br>
+; X86-SSE-NEXT:    cmovbel %ecx, %eax<br>
 ; X86-SSE-NEXT:    # kill: def $al killed $al killed $eax<br>
 ; X86-SSE-NEXT:    addl $12, %esp<br>
 ; X86-SSE-NEXT:    retl<br>
@@ -1938,13 +1943,15 @@ define i1 @test_unsigned_i1_f16(half %f) nounwind {<br>
 ; X64-LABEL: test_unsigned_i1_f16:<br>
 ; X64:       # %bb.0:<br>
 ; X64-NEXT:    pushq %rax<br>
-; X64-NEXT:    movzwl %di, %edi<br>
-; X64-NEXT:    callq __gnu_h2f_ieee@PLT<br>
-; X64-NEXT:    xorps %xmm1, %xmm1<br>
-; X64-NEXT:    maxss %xmm0, %xmm1<br>
-; X64-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero<br>
-; X64-NEXT:    minss %xmm1, %xmm0<br>
+; X64-NEXT:    callq __extendhfsf2@PLT<br>
 ; X64-NEXT:    cvttss2si %xmm0, %eax<br>
+; X64-NEXT:    xorl %ecx, %ecx<br>
+; X64-NEXT:    xorps %xmm1, %xmm1<br>
+; X64-NEXT:    ucomiss %xmm1, %xmm0<br>
+; X64-NEXT:    cmovael %eax, %ecx<br>
+; X64-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
+; X64-NEXT:    movl $1, %eax<br>
+; X64-NEXT:    cmovbel %ecx, %eax<br>
 ; X64-NEXT:    # kill: def $al killed $al killed $eax<br>
 ; X64-NEXT:    popq %rcx<br>
 ; X64-NEXT:    retq<br>
@@ -1997,15 +2004,20 @@ define i8 @test_unsigned_i8_f16(half %f) nounwind {<br>
 ; X86-SSE-LABEL: test_unsigned_i8_f16:<br>
 ; X86-SSE:       # %bb.0:<br>
 ; X86-SSE-NEXT:    subl $12, %esp<br>
-; X86-SSE-NEXT:    movzwl {{[0-9]+}}(%esp), %eax<br>
-; X86-SSE-NEXT:    movl %eax, (%esp)<br>
-; X86-SSE-NEXT:    calll __gnu_h2f_ieee<br>
+; X86-SSE-NEXT:    pinsrw $0, {{[0-9]+}}(%esp), %xmm0<br>
+; X86-SSE-NEXT:    pextrw $0, %xmm0, %eax<br>
+; X86-SSE-NEXT:    movw %ax, (%esp)<br>
+; X86-SSE-NEXT:    calll __extendhfsf2<br>
 ; X86-SSE-NEXT:    fstps {{[0-9]+}}(%esp)<br>
-; X86-SSE-NEXT:    xorps %xmm0, %xmm0<br>
-; X86-SSE-NEXT:    maxss {{[0-9]+}}(%esp), %xmm0<br>
-; X86-SSE-NEXT:    movss {{.*#+}} xmm1 = mem[0],zero,zero,zero<br>
-; X86-SSE-NEXT:    minss %xmm0, %xmm1<br>
-; X86-SSE-NEXT:    cvttss2si %xmm1, %eax<br>
+; X86-SSE-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero<br>
+; X86-SSE-NEXT:    cvttss2si %xmm0, %eax<br>
+; X86-SSE-NEXT:    xorl %ecx, %ecx<br>
+; X86-SSE-NEXT:    xorps %xmm1, %xmm1<br>
+; X86-SSE-NEXT:    ucomiss %xmm1, %xmm0<br>
+; X86-SSE-NEXT:    cmovael %eax, %ecx<br>
+; X86-SSE-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0<br>
+; X86-SSE-NEXT:    movl $255, %eax<br>
+; X86-SSE-NEXT:    cmovbel %ecx, %eax<br>
 ; X86-SSE-NEXT:    # kill: def $al killed $al killed $eax<br>
 ; X86-SSE-NEXT:    addl $12, %esp<br>
 ; X86-SSE-NEXT:    retl<br>
@@ -2013,13 +2025,15 @@ define i8 @test_unsigned_i8_f16(half %f) nounwind {<br>
 ; X64-LABEL: test_unsigned_i8_f16:<br>
 ; X64:       # %bb.0:<br>
 ; X64-NEXT:    pushq %rax<br>
-; X64-NEXT:    movzwl %di, %edi<br>
-; X64-NEXT:    callq __gnu_h2f_ieee@PLT<br>
-; X64-NEXT:    xorps %xmm1, %xmm1<br>
-; X64-NEXT:    maxss %xmm0, %xmm1<br>
-; X64-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero<br>
-; X64-NEXT:    minss %xmm1, %xmm0<br>
+; X64-NEXT:    callq __extendhfsf2@PLT<br>
 ; X64-NEXT:    cvttss2si %xmm0, %eax<br>
+; X64-NEXT:    xorl %ecx, %ecx<br>
+; X64-NEXT:    xorps %xmm1, %xmm1<br>
+; X64-NEXT:    ucomiss %xmm1, %xmm0<br>
+; X64-NEXT:    cmovael %eax, %ecx<br>
+; X64-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
+; X64-NEXT:    movl $255, %eax<br>
+; X64-NEXT:    cmovbel %ecx, %eax<br>
 ; X64-NEXT:    # kill: def $al killed $al killed $eax<br>
 ; X64-NEXT:    popq %rcx<br>
 ; X64-NEXT:    retq<br>
@@ -2071,15 +2085,20 @@ define i13 @test_unsigned_i13_f16(half %f) nounwind {<br>
 ; X86-SSE-LABEL: test_unsigned_i13_f16:<br>
 ; X86-SSE:       # %bb.0:<br>
 ; X86-SSE-NEXT:    subl $12, %esp<br>
-; X86-SSE-NEXT:    movzwl {{[0-9]+}}(%esp), %eax<br>
-; X86-SSE-NEXT:    movl %eax, (%esp)<br>
-; X86-SSE-NEXT:    calll __gnu_h2f_ieee<br>
+; X86-SSE-NEXT:    pinsrw $0, {{[0-9]+}}(%esp), %xmm0<br>
+; X86-SSE-NEXT:    pextrw $0, %xmm0, %eax<br>
+; X86-SSE-NEXT:    movw %ax, (%esp)<br>
+; X86-SSE-NEXT:    calll __extendhfsf2<br>
 ; X86-SSE-NEXT:    fstps {{[0-9]+}}(%esp)<br>
-; X86-SSE-NEXT:    xorps %xmm0, %xmm0<br>
-; X86-SSE-NEXT:    maxss {{[0-9]+}}(%esp), %xmm0<br>
-; X86-SSE-NEXT:    movss {{.*#+}} xmm1 = mem[0],zero,zero,zero<br>
-; X86-SSE-NEXT:    minss %xmm0, %xmm1<br>
-; X86-SSE-NEXT:    cvttss2si %xmm1, %eax<br>
+; X86-SSE-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero<br>
+; X86-SSE-NEXT:    cvttss2si %xmm0, %eax<br>
+; X86-SSE-NEXT:    xorl %ecx, %ecx<br>
+; X86-SSE-NEXT:    xorps %xmm1, %xmm1<br>
+; X86-SSE-NEXT:    ucomiss %xmm1, %xmm0<br>
+; X86-SSE-NEXT:    cmovael %eax, %ecx<br>
+; X86-SSE-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0<br>
+; X86-SSE-NEXT:    movl $8191, %eax # imm = 0x1FFF<br>
+; X86-SSE-NEXT:    cmovbel %ecx, %eax<br>
 ; X86-SSE-NEXT:    # kill: def $ax killed $ax killed $eax<br>
 ; X86-SSE-NEXT:    addl $12, %esp<br>
 ; X86-SSE-NEXT:    retl<br>
@@ -2087,13 +2106,15 @@ define i13 @test_unsigned_i13_f16(half %f) nounwind {<br>
 ; X64-LABEL: test_unsigned_i13_f16:<br>
 ; X64:       # %bb.0:<br>
 ; X64-NEXT:    pushq %rax<br>
-; X64-NEXT:    movzwl %di, %edi<br>
-; X64-NEXT:    callq __gnu_h2f_ieee@PLT<br>
-; X64-NEXT:    xorps %xmm1, %xmm1<br>
-; X64-NEXT:    maxss %xmm0, %xmm1<br>
-; X64-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero<br>
-; X64-NEXT:    minss %xmm1, %xmm0<br>
+; X64-NEXT:    callq __extendhfsf2@PLT<br>
 ; X64-NEXT:    cvttss2si %xmm0, %eax<br>
+; X64-NEXT:    xorl %ecx, %ecx<br>
+; X64-NEXT:    xorps %xmm1, %xmm1<br>
+; X64-NEXT:    ucomiss %xmm1, %xmm0<br>
+; X64-NEXT:    cmovael %eax, %ecx<br>
+; X64-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
+; X64-NEXT:    movl $8191, %eax # imm = 0x1FFF<br>
+; X64-NEXT:    cmovbel %ecx, %eax<br>
 ; X64-NEXT:    # kill: def $ax killed $ax killed $eax<br>
 ; X64-NEXT:    popq %rcx<br>
 ; X64-NEXT:    retq<br>
@@ -2145,15 +2166,20 @@ define i16 @test_unsigned_i16_f16(half %f) nounwind {<br>
 ; X86-SSE-LABEL: test_unsigned_i16_f16:<br>
 ; X86-SSE:       # %bb.0:<br>
 ; X86-SSE-NEXT:    subl $12, %esp<br>
-; X86-SSE-NEXT:    movzwl {{[0-9]+}}(%esp), %eax<br>
-; X86-SSE-NEXT:    movl %eax, (%esp)<br>
-; X86-SSE-NEXT:    calll __gnu_h2f_ieee<br>
+; X86-SSE-NEXT:    pinsrw $0, {{[0-9]+}}(%esp), %xmm0<br>
+; X86-SSE-NEXT:    pextrw $0, %xmm0, %eax<br>
+; X86-SSE-NEXT:    movw %ax, (%esp)<br>
+; X86-SSE-NEXT:    calll __extendhfsf2<br>
 ; X86-SSE-NEXT:    fstps {{[0-9]+}}(%esp)<br>
-; X86-SSE-NEXT:    xorps %xmm0, %xmm0<br>
-; X86-SSE-NEXT:    maxss {{[0-9]+}}(%esp), %xmm0<br>
-; X86-SSE-NEXT:    movss {{.*#+}} xmm1 = mem[0],zero,zero,zero<br>
-; X86-SSE-NEXT:    minss %xmm0, %xmm1<br>
-; X86-SSE-NEXT:    cvttss2si %xmm1, %eax<br>
+; X86-SSE-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero<br>
+; X86-SSE-NEXT:    cvttss2si %xmm0, %eax<br>
+; X86-SSE-NEXT:    xorl %ecx, %ecx<br>
+; X86-SSE-NEXT:    xorps %xmm1, %xmm1<br>
+; X86-SSE-NEXT:    ucomiss %xmm1, %xmm0<br>
+; X86-SSE-NEXT:    cmovael %eax, %ecx<br>
+; X86-SSE-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0<br>
+; X86-SSE-NEXT:    movl $65535, %eax # imm = 0xFFFF<br>
+; X86-SSE-NEXT:    cmovbel %ecx, %eax<br>
 ; X86-SSE-NEXT:    # kill: def $ax killed $ax killed $eax<br>
 ; X86-SSE-NEXT:    addl $12, %esp<br>
 ; X86-SSE-NEXT:    retl<br>
@@ -2161,13 +2187,15 @@ define i16 @test_unsigned_i16_f16(half %f) nounwind {<br>
 ; X64-LABEL: test_unsigned_i16_f16:<br>
 ; X64:       # %bb.0:<br>
 ; X64-NEXT:    pushq %rax<br>
-; X64-NEXT:    movzwl %di, %edi<br>
-; X64-NEXT:    callq __gnu_h2f_ieee@PLT<br>
-; X64-NEXT:    xorps %xmm1, %xmm1<br>
-; X64-NEXT:    maxss %xmm0, %xmm1<br>
-; X64-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero<br>
-; X64-NEXT:    minss %xmm1, %xmm0<br>
+; X64-NEXT:    callq __extendhfsf2@PLT<br>
 ; X64-NEXT:    cvttss2si %xmm0, %eax<br>
+; X64-NEXT:    xorl %ecx, %ecx<br>
+; X64-NEXT:    xorps %xmm1, %xmm1<br>
+; X64-NEXT:    ucomiss %xmm1, %xmm0<br>
+; X64-NEXT:    cmovael %eax, %ecx<br>
+; X64-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
+; X64-NEXT:    movl $65535, %eax # imm = 0xFFFF<br>
+; X64-NEXT:    cmovbel %ecx, %eax<br>
 ; X64-NEXT:    # kill: def $ax killed $ax killed $eax<br>
 ; X64-NEXT:    popq %rcx<br>
 ; X64-NEXT:    retq<br>
@@ -2219,27 +2247,42 @@ define i19 @test_unsigned_i19_f16(half %f) nounwind {<br>
 ; X86-SSE-LABEL: test_unsigned_i19_f16:<br>
 ; X86-SSE:       # %bb.0:<br>
 ; X86-SSE-NEXT:    subl $12, %esp<br>
-; X86-SSE-NEXT:    movzwl {{[0-9]+}}(%esp), %eax<br>
-; X86-SSE-NEXT:    movl %eax, (%esp)<br>
-; X86-SSE-NEXT:    calll __gnu_h2f_ieee<br>
+; X86-SSE-NEXT:    pinsrw $0, {{[0-9]+}}(%esp), %xmm0<br>
+; X86-SSE-NEXT:    pextrw $0, %xmm0, %eax<br>
+; X86-SSE-NEXT:    movw %ax, (%esp)<br>
+; X86-SSE-NEXT:    calll __extendhfsf2<br>
 ; X86-SSE-NEXT:    fstps {{[0-9]+}}(%esp)<br>
 ; X86-SSE-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero<br>
-; X86-SSE-NEXT:    xorps %xmm1, %xmm1<br>
-; X86-SSE-NEXT:    maxss %xmm1, %xmm0<br>
-; X86-SSE-NEXT:    minss {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0<br>
 ; X86-SSE-NEXT:    cvttss2si %xmm0, %eax<br>
+; X86-SSE-NEXT:    movl %eax, %ecx<br>
+; X86-SSE-NEXT:    sarl $31, %ecx<br>
+; X86-SSE-NEXT:    movaps %xmm0, %xmm1<br>
+; X86-SSE-NEXT:    subss {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1<br>
+; X86-SSE-NEXT:    cvttss2si %xmm1, %edx<br>
+; X86-SSE-NEXT:    andl %ecx, %edx<br>
+; X86-SSE-NEXT:    orl %eax, %edx<br>
+; X86-SSE-NEXT:    xorl %ecx, %ecx<br>
+; X86-SSE-NEXT:    xorps %xmm1, %xmm1<br>
+; X86-SSE-NEXT:    ucomiss %xmm1, %xmm0<br>
+; X86-SSE-NEXT:    cmovael %edx, %ecx<br>
+; X86-SSE-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0<br>
+; X86-SSE-NEXT:    movl $524287, %eax # imm = 0x7FFFF<br>
+; X86-SSE-NEXT:    cmovbel %ecx, %eax<br>
 ; X86-SSE-NEXT:    addl $12, %esp<br>
 ; X86-SSE-NEXT:    retl<br>
 ;<br>
 ; X64-LABEL: test_unsigned_i19_f16:<br>
 ; X64:       # %bb.0:<br>
 ; X64-NEXT:    pushq %rax<br>
-; X64-NEXT:    movzwl %di, %edi<br>
-; X64-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; X64-NEXT:    callq __extendhfsf2@PLT<br>
+; X64-NEXT:    cvttss2si %xmm0, %rax<br>
+; X64-NEXT:    xorl %ecx, %ecx<br>
 ; X64-NEXT:    xorps %xmm1, %xmm1<br>
-; X64-NEXT:    maxss %xmm1, %xmm0<br>
-; X64-NEXT:    minss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
-; X64-NEXT:    cvttss2si %xmm0, %eax<br>
+; X64-NEXT:    ucomiss %xmm1, %xmm0<br>
+; X64-NEXT:    cmovael %eax, %ecx<br>
+; X64-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
+; X64-NEXT:    movl $524287, %eax # imm = 0x7FFFF<br>
+; X64-NEXT:    cmovbel %ecx, %eax<br>
 ; X64-NEXT:    popq %rcx<br>
 ; X64-NEXT:    retq<br>
     %x = call i19 @llvm.fptoui.sat.i19.f16(half %f)<br>
@@ -2290,9 +2333,10 @@ define i32 @test_unsigned_i32_f16(half %f) nounwind {<br>
 ; X86-SSE-LABEL: test_unsigned_i32_f16:<br>
 ; X86-SSE:       # %bb.0:<br>
 ; X86-SSE-NEXT:    subl $12, %esp<br>
-; X86-SSE-NEXT:    movzwl {{[0-9]+}}(%esp), %eax<br>
-; X86-SSE-NEXT:    movl %eax, (%esp)<br>
-; X86-SSE-NEXT:    calll __gnu_h2f_ieee<br>
+; X86-SSE-NEXT:    pinsrw $0, {{[0-9]+}}(%esp), %xmm0<br>
+; X86-SSE-NEXT:    pextrw $0, %xmm0, %eax<br>
+; X86-SSE-NEXT:    movw %ax, (%esp)<br>
+; X86-SSE-NEXT:    calll __extendhfsf2<br>
 ; X86-SSE-NEXT:    fstps {{[0-9]+}}(%esp)<br>
 ; X86-SSE-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero<br>
 ; X86-SSE-NEXT:    cvttss2si %xmm0, %eax<br>
@@ -2316,8 +2360,7 @@ define i32 @test_unsigned_i32_f16(half %f) nounwind {<br>
 ; X64-LABEL: test_unsigned_i32_f16:<br>
 ; X64:       # %bb.0:<br>
 ; X64-NEXT:    pushq %rax<br>
-; X64-NEXT:    movzwl %di, %edi<br>
-; X64-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; X64-NEXT:    callq __extendhfsf2@PLT<br>
 ; X64-NEXT:    cvttss2si %xmm0, %rax<br>
 ; X64-NEXT:    xorl %ecx, %ecx<br>
 ; X64-NEXT:    xorps %xmm1, %xmm1<br>
@@ -2406,9 +2449,10 @@ define i50 @test_unsigned_i50_f16(half %f) nounwind {<br>
 ; X86-SSE:       # %bb.0:<br>
 ; X86-SSE-NEXT:    pushl %esi<br>
 ; X86-SSE-NEXT:    subl $24, %esp<br>
-; X86-SSE-NEXT:    movzwl {{[0-9]+}}(%esp), %eax<br>
-; X86-SSE-NEXT:    movl %eax, (%esp)<br>
-; X86-SSE-NEXT:    calll __gnu_h2f_ieee<br>
+; X86-SSE-NEXT:    pinsrw $0, {{[0-9]+}}(%esp), %xmm0<br>
+; X86-SSE-NEXT:    pextrw $0, %xmm0, %eax<br>
+; X86-SSE-NEXT:    movw %ax, (%esp)<br>
+; X86-SSE-NEXT:    calll __extendhfsf2<br>
 ; X86-SSE-NEXT:    fstps {{[0-9]+}}(%esp)<br>
 ; X86-SSE-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero<br>
 ; X86-SSE-NEXT:    movss {{.*#+}} xmm2 = mem[0],zero,zero,zero<br>
@@ -2452,13 +2496,19 @@ define i50 @test_unsigned_i50_f16(half %f) nounwind {<br>
 ; X64-LABEL: test_unsigned_i50_f16:<br>
 ; X64:       # %bb.0:<br>
 ; X64-NEXT:    pushq %rax<br>
-; X64-NEXT:    movzwl %di, %edi<br>
-; X64-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; X64-NEXT:    callq __extendhfsf2@PLT<br>
 ; X64-NEXT:    cvttss2si %xmm0, %rax<br>
+; X64-NEXT:    movq %rax, %rcx<br>
+; X64-NEXT:    sarq $63, %rcx<br>
+; X64-NEXT:    movaps %xmm0, %xmm1<br>
+; X64-NEXT:    subss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1<br>
+; X64-NEXT:    cvttss2si %xmm1, %rdx<br>
+; X64-NEXT:    andq %rcx, %rdx<br>
+; X64-NEXT:    orq %rax, %rdx<br>
 ; X64-NEXT:    xorl %ecx, %ecx<br>
 ; X64-NEXT:    xorps %xmm1, %xmm1<br>
 ; X64-NEXT:    ucomiss %xmm1, %xmm0<br>
-; X64-NEXT:    cmovaeq %rax, %rcx<br>
+; X64-NEXT:    cmovaeq %rdx, %rcx<br>
 ; X64-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
 ; X64-NEXT:    movabsq $1125899906842623, %rax # imm = 0x3FFFFFFFFFFFF<br>
 ; X64-NEXT:    cmovbeq %rcx, %rax<br>
@@ -2540,9 +2590,10 @@ define i64 @test_unsigned_i64_f16(half %f) nounwind {<br>
 ; X86-SSE-LABEL: test_unsigned_i64_f16:<br>
 ; X86-SSE:       # %bb.0:<br>
 ; X86-SSE-NEXT:    subl $28, %esp<br>
-; X86-SSE-NEXT:    movzwl {{[0-9]+}}(%esp), %eax<br>
-; X86-SSE-NEXT:    movl %eax, (%esp)<br>
-; X86-SSE-NEXT:    calll __gnu_h2f_ieee<br>
+; X86-SSE-NEXT:    pinsrw $0, {{[0-9]+}}(%esp), %xmm0<br>
+; X86-SSE-NEXT:    pextrw $0, %xmm0, %eax<br>
+; X86-SSE-NEXT:    movw %ax, (%esp)<br>
+; X86-SSE-NEXT:    calll __extendhfsf2<br>
 ; X86-SSE-NEXT:    fstps {{[0-9]+}}(%esp)<br>
 ; X86-SSE-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero<br>
 ; X86-SSE-NEXT:    movss {{.*#+}} xmm2 = mem[0],zero,zero,zero<br>
@@ -2584,8 +2635,7 @@ define i64 @test_unsigned_i64_f16(half %f) nounwind {<br>
 ; X64-LABEL: test_unsigned_i64_f16:<br>
 ; X64:       # %bb.0:<br>
 ; X64-NEXT:    pushq %rax<br>
-; X64-NEXT:    movzwl %di, %edi<br>
-; X64-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; X64-NEXT:    callq __extendhfsf2@PLT<br>
 ; X64-NEXT:    cvttss2si %xmm0, %rax<br>
 ; X64-NEXT:    movq %rax, %rcx<br>
 ; X64-NEXT:    sarq $63, %rcx<br>
@@ -2689,10 +2739,11 @@ define i100 @test_unsigned_i100_f16(half %f) nounwind {<br>
 ; X86-SSE-NEXT:    pushl %edi<br>
 ; X86-SSE-NEXT:    pushl %esi<br>
 ; X86-SSE-NEXT:    subl $32, %esp<br>
+; X86-SSE-NEXT:    pinsrw $0, {{[0-9]+}}(%esp), %xmm0<br>
 ; X86-SSE-NEXT:    movl {{[0-9]+}}(%esp), %esi<br>
-; X86-SSE-NEXT:    movzwl {{[0-9]+}}(%esp), %eax<br>
-; X86-SSE-NEXT:    movl %eax, (%esp)<br>
-; X86-SSE-NEXT:    calll __gnu_h2f_ieee<br>
+; X86-SSE-NEXT:    pextrw $0, %xmm0, %eax<br>
+; X86-SSE-NEXT:    movw %ax, (%esp)<br>
+; X86-SSE-NEXT:    calll __extendhfsf2<br>
 ; X86-SSE-NEXT:    leal {{[0-9]+}}(%esp), %eax<br>
 ; X86-SSE-NEXT:    movl %eax, (%esp)<br>
 ; X86-SSE-NEXT:    fstps {{[0-9]+}}(%esp)<br>
@@ -2739,8 +2790,7 @@ define i100 @test_unsigned_i100_f16(half %f) nounwind {<br>
 ; X64-LABEL: test_unsigned_i100_f16:<br>
 ; X64:       # %bb.0:<br>
 ; X64-NEXT:    pushq %rax<br>
-; X64-NEXT:    movzwl %di, %edi<br>
-; X64-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; X64-NEXT:    callq __extendhfsf2@PLT<br>
 ; X64-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
 ; X64-NEXT:    callq __fixunssfti@PLT<br>
 ; X64-NEXT:    xorl %ecx, %ecx<br>
@@ -2840,10 +2890,11 @@ define i128 @test_unsigned_i128_f16(half %f) nounwind {<br>
 ; X86-SSE-NEXT:    pushl %edi<br>
 ; X86-SSE-NEXT:    pushl %esi<br>
 ; X86-SSE-NEXT:    subl $32, %esp<br>
+; X86-SSE-NEXT:    pinsrw $0, {{[0-9]+}}(%esp), %xmm0<br>
 ; X86-SSE-NEXT:    movl {{[0-9]+}}(%esp), %esi<br>
-; X86-SSE-NEXT:    movzwl {{[0-9]+}}(%esp), %eax<br>
-; X86-SSE-NEXT:    movl %eax, (%esp)<br>
-; X86-SSE-NEXT:    calll __gnu_h2f_ieee<br>
+; X86-SSE-NEXT:    pextrw $0, %xmm0, %eax<br>
+; X86-SSE-NEXT:    movw %ax, (%esp)<br>
+; X86-SSE-NEXT:    calll __extendhfsf2<br>
 ; X86-SSE-NEXT:    leal {{[0-9]+}}(%esp), %eax<br>
 ; X86-SSE-NEXT:    movl %eax, (%esp)<br>
 ; X86-SSE-NEXT:    fstps {{[0-9]+}}(%esp)<br>
@@ -2888,8 +2939,7 @@ define i128 @test_unsigned_i128_f16(half %f) nounwind {<br>
 ; X64-LABEL: test_unsigned_i128_f16:<br>
 ; X64:       # %bb.0:<br>
 ; X64-NEXT:    pushq %rax<br>
-; X64-NEXT:    movzwl %di, %edi<br>
-; X64-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; X64-NEXT:    callq __extendhfsf2@PLT<br>
 ; X64-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
 ; X64-NEXT:    callq __fixunssfti@PLT<br>
 ; X64-NEXT:    xorl %ecx, %ecx<br>
<br>
diff  --git a/llvm/test/CodeGen/X86/fptoui-sat-vector-128.ll b/llvm/test/CodeGen/X86/fptoui-sat-vector-128.ll<br>
index 44b6ca0c55d64..7d5f075b64f30 100644<br>
--- a/llvm/test/CodeGen/X86/fptoui-sat-vector-128.ll<br>
+++ b/llvm/test/CodeGen/X86/fptoui-sat-vector-128.ll<br>
@@ -541,97 +541,103 @@ define <8 x i1> @test_unsigned_v8i1_v8f16(<8 x half> %f) nounwind {<br>
 ; CHECK-LABEL: test_unsigned_v8i1_v8f16:<br>
 ; CHECK:       # %bb.0:<br>
 ; CHECK-NEXT:    pushq %rbp<br>
-; CHECK-NEXT:    pushq %r15<br>
-; CHECK-NEXT:    pushq %r14<br>
-; CHECK-NEXT:    pushq %r13<br>
-; CHECK-NEXT:    pushq %r12<br>
 ; CHECK-NEXT:    pushq %rbx<br>
-; CHECK-NEXT:    subq $72, %rsp<br>
-; CHECK-NEXT:    movl %r9d, %ebp<br>
-; CHECK-NEXT:    movl %r8d, %ebx<br>
-; CHECK-NEXT:    movl %ecx, %r13d<br>
-; CHECK-NEXT:    movl %edx, %r12d<br>
-; CHECK-NEXT:    movl %esi, %r15d<br>
-; CHECK-NEXT:    movl %edi, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%rsp), %r14d<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%rsp), %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
-; CHECK-NEXT:    xorps %xmm1, %xmm1<br>
-; CHECK-NEXT:    maxss %xmm0, %xmm1<br>
-; CHECK-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero<br>
-; CHECK-NEXT:    minss %xmm1, %xmm0<br>
+; CHECK-NEXT:    subq $136, %rsp<br>
+; CHECK-NEXT:    movss %xmm6, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movss %xmm5, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movss %xmm4, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movss %xmm3, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movss %xmm2, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movss %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movaps %xmm7, %xmm0<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %eax<br>
+; CHECK-NEXT:    xorl %ebx, %ebx<br>
+; CHECK-NEXT:    xorps %xmm1, %xmm1<br>
+; CHECK-NEXT:    ucomiss %xmm1, %xmm0<br>
+; CHECK-NEXT:    cmovbl %ebx, %eax<br>
+; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
+; CHECK-NEXT:    movl $1, %ebp<br>
+; CHECK-NEXT:    cmoval %ebp, %eax<br>
 ; CHECK-NEXT:    movd %eax, %xmm0<br>
 ; CHECK-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
-; CHECK-NEXT:    movl %r14d, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
-; CHECK-NEXT:    xorps %xmm1, %xmm1<br>
-; CHECK-NEXT:    maxss %xmm0, %xmm1<br>
-; CHECK-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero<br>
-; CHECK-NEXT:    minss %xmm1, %xmm0<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %eax<br>
+; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
+; CHECK-NEXT:    cmovbl %ebx, %eax<br>
+; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
+; CHECK-NEXT:    cmoval %ebp, %eax<br>
 ; CHECK-NEXT:    movd %eax, %xmm0<br>
 ; CHECK-NEXT:    punpcklwd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload<br>
 ; CHECK-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3]<br>
 ; CHECK-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
-; CHECK-NEXT:    movzwl %bp, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
-; CHECK-NEXT:    xorps %xmm1, %xmm1<br>
-; CHECK-NEXT:    maxss %xmm0, %xmm1<br>
-; CHECK-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero<br>
-; CHECK-NEXT:    minss %xmm1, %xmm0<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %eax<br>
+; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
+; CHECK-NEXT:    cmovbl %ebx, %eax<br>
+; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
+; CHECK-NEXT:    cmoval %ebp, %eax<br>
 ; CHECK-NEXT:    movd %eax, %xmm0<br>
 ; CHECK-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
-; CHECK-NEXT:    movzwl %bx, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
-; CHECK-NEXT:    xorps %xmm1, %xmm1<br>
-; CHECK-NEXT:    maxss %xmm0, %xmm1<br>
-; CHECK-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero<br>
-; CHECK-NEXT:    minss %xmm1, %xmm0<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %eax<br>
+; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
+; CHECK-NEXT:    cmovbl %ebx, %eax<br>
+; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
+; CHECK-NEXT:    cmoval %ebp, %eax<br>
 ; CHECK-NEXT:    movd %eax, %xmm0<br>
 ; CHECK-NEXT:    punpcklwd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload<br>
 ; CHECK-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3]<br>
 ; CHECK-NEXT:    punpckldq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload<br>
 ; CHECK-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]<br>
 ; CHECK-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
-; CHECK-NEXT:    movzwl %r13w, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
-; CHECK-NEXT:    xorps %xmm1, %xmm1<br>
-; CHECK-NEXT:    maxss %xmm0, %xmm1<br>
-; CHECK-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero<br>
-; CHECK-NEXT:    minss %xmm1, %xmm0<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %eax<br>
+; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
+; CHECK-NEXT:    cmovbl %ebx, %eax<br>
+; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
+; CHECK-NEXT:    cmoval %ebp, %eax<br>
 ; CHECK-NEXT:    movd %eax, %xmm0<br>
 ; CHECK-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
-; CHECK-NEXT:    movzwl %r12w, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
-; CHECK-NEXT:    xorps %xmm1, %xmm1<br>
-; CHECK-NEXT:    maxss %xmm0, %xmm1<br>
-; CHECK-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero<br>
-; CHECK-NEXT:    minss %xmm1, %xmm0<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %eax<br>
+; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
+; CHECK-NEXT:    cmovbl %ebx, %eax<br>
+; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
+; CHECK-NEXT:    cmoval %ebp, %eax<br>
 ; CHECK-NEXT:    movd %eax, %xmm0<br>
 ; CHECK-NEXT:    punpcklwd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload<br>
 ; CHECK-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3]<br>
 ; CHECK-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
-; CHECK-NEXT:    movzwl %r15w, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
-; CHECK-NEXT:    xorps %xmm1, %xmm1<br>
-; CHECK-NEXT:    maxss %xmm0, %xmm1<br>
-; CHECK-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero<br>
-; CHECK-NEXT:    minss %xmm1, %xmm0<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %eax<br>
+; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
+; CHECK-NEXT:    cmovbl %ebx, %eax<br>
+; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
+; CHECK-NEXT:    cmoval %ebp, %eax<br>
 ; CHECK-NEXT:    movd %eax, %xmm0<br>
 ; CHECK-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
-; CHECK-NEXT:    movzwl {{[-0-9]+}}(%r{{[sb]}}p), %edi # 2-byte Folded Reload<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
-; CHECK-NEXT:    xorps %xmm1, %xmm1<br>
-; CHECK-NEXT:    maxss %xmm0, %xmm1<br>
-; CHECK-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero<br>
-; CHECK-NEXT:    minss %xmm1, %xmm0<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %eax<br>
+; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
+; CHECK-NEXT:    cmovbl %ebx, %eax<br>
+; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
+; CHECK-NEXT:    cmoval %ebp, %eax<br>
 ; CHECK-NEXT:    movd %eax, %xmm0<br>
 ; CHECK-NEXT:    punpcklwd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload<br>
 ; CHECK-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3]<br>
@@ -639,12 +645,8 @@ define <8 x i1> @test_unsigned_v8i1_v8f16(<8 x half> %f) nounwind {<br>
 ; CHECK-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]<br>
 ; CHECK-NEXT:    punpcklqdq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload<br>
 ; CHECK-NEXT:    # xmm0 = xmm0[0],mem[0]<br>
-; CHECK-NEXT:    addq $72, %rsp<br>
+; CHECK-NEXT:    addq $136, %rsp<br>
 ; CHECK-NEXT:    popq %rbx<br>
-; CHECK-NEXT:    popq %r12<br>
-; CHECK-NEXT:    popq %r13<br>
-; CHECK-NEXT:    popq %r14<br>
-; CHECK-NEXT:    popq %r15<br>
 ; CHECK-NEXT:    popq %rbp<br>
 ; CHECK-NEXT:    retq<br>
   %x = call <8 x i1> @llvm.fptoui.sat.v8i1.v8f16(<8 x half> %f)<br>
@@ -657,99 +659,103 @@ define <8 x i8> @test_unsigned_v8i8_v8f16(<8 x half> %f) nounwind {<br>
 ; CHECK-NEXT:    pushq %rbp<br>
 ; CHECK-NEXT:    pushq %r15<br>
 ; CHECK-NEXT:    pushq %r14<br>
-; CHECK-NEXT:    pushq %r13<br>
-; CHECK-NEXT:    pushq %r12<br>
 ; CHECK-NEXT:    pushq %rbx<br>
-; CHECK-NEXT:    subq $40, %rsp<br>
-; CHECK-NEXT:    movl %r9d, %r13d<br>
-; CHECK-NEXT:    movl %r8d, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movl %edx, %r14d<br>
-; CHECK-NEXT:    movl %esi, %ebp<br>
-; CHECK-NEXT:    movl %edi, %r15d<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%rsp), %eax<br>
-; CHECK-NEXT:    movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%rsp), %eax<br>
-; CHECK-NEXT:    movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movzwl %cx, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
-; CHECK-NEXT:    xorps %xmm1, %xmm1<br>
-; CHECK-NEXT:    maxss %xmm0, %xmm1<br>
-; CHECK-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero<br>
-; CHECK-NEXT:    minss %xmm1, %xmm0<br>
-; CHECK-NEXT:    cvttss2si %xmm0, %r12d<br>
-; CHECK-NEXT:    shll $8, %r12d<br>
-; CHECK-NEXT:    movzwl %r14w, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    subq $56, %rsp<br>
+; CHECK-NEXT:    movss %xmm7, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movss %xmm6, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movss %xmm5, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movss %xmm4, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movss %xmm2, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movss %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movaps %xmm3, %xmm0<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
+; CHECK-NEXT:    cvttss2si %xmm0, %ebp<br>
+; CHECK-NEXT:    xorl %r14d, %r14d<br>
 ; CHECK-NEXT:    xorps %xmm1, %xmm1<br>
-; CHECK-NEXT:    maxss %xmm0, %xmm1<br>
-; CHECK-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero<br>
-; CHECK-NEXT:    minss %xmm1, %xmm0<br>
+; CHECK-NEXT:    ucomiss %xmm1, %xmm0<br>
+; CHECK-NEXT:    cmovbl %r14d, %ebp<br>
+; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
+; CHECK-NEXT:    movl $255, %r15d<br>
+; CHECK-NEXT:    cmoval %r15d, %ebp<br>
+; CHECK-NEXT:    shll $8, %ebp<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %eax<br>
+; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
+; CHECK-NEXT:    cmovbl %r14d, %eax<br>
+; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
+; CHECK-NEXT:    cmoval %r15d, %eax<br>
 ; CHECK-NEXT:    movzbl %al, %ebx<br>
-; CHECK-NEXT:    orl %r12d, %ebx<br>
-; CHECK-NEXT:    movzwl %bp, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
-; CHECK-NEXT:    xorps %xmm1, %xmm1<br>
-; CHECK-NEXT:    maxss %xmm0, %xmm1<br>
-; CHECK-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero<br>
-; CHECK-NEXT:    minss %xmm1, %xmm0<br>
+; CHECK-NEXT:    orl %ebp, %ebx<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %ebp<br>
+; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
+; CHECK-NEXT:    cmovbl %r14d, %ebp<br>
+; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
+; CHECK-NEXT:    cmoval %r15d, %ebp<br>
 ; CHECK-NEXT:    shll $8, %ebp<br>
-; CHECK-NEXT:    movzwl %r15w, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
-; CHECK-NEXT:    xorps %xmm1, %xmm1<br>
-; CHECK-NEXT:    maxss %xmm0, %xmm1<br>
-; CHECK-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero<br>
-; CHECK-NEXT:    minss %xmm1, %xmm0<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %eax<br>
+; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
+; CHECK-NEXT:    cmovbl %r14d, %eax<br>
+; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
+; CHECK-NEXT:    cmoval %r15d, %eax<br>
 ; CHECK-NEXT:    movzbl %al, %eax<br>
 ; CHECK-NEXT:    orl %ebp, %eax<br>
 ; CHECK-NEXT:    movd %eax, %xmm0<br>
 ; CHECK-NEXT:    pinsrw $1, %ebx, %xmm0<br>
 ; CHECK-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
-; CHECK-NEXT:    movzwl %r13w, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
-; CHECK-NEXT:    xorps %xmm1, %xmm1<br>
-; CHECK-NEXT:    maxss %xmm0, %xmm1<br>
-; CHECK-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero<br>
-; CHECK-NEXT:    minss %xmm1, %xmm0<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %ebx<br>
+; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
+; CHECK-NEXT:    cmovbl %r14d, %ebx<br>
+; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
+; CHECK-NEXT:    cmoval %r15d, %ebx<br>
 ; CHECK-NEXT:    shll $8, %ebx<br>
-; CHECK-NEXT:    movzwl {{[-0-9]+}}(%r{{[sb]}}p), %edi # 2-byte Folded Reload<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
-; CHECK-NEXT:    xorps %xmm1, %xmm1<br>
-; CHECK-NEXT:    maxss %xmm0, %xmm1<br>
-; CHECK-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero<br>
-; CHECK-NEXT:    minss %xmm1, %xmm0<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %eax<br>
+; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
+; CHECK-NEXT:    cmovbl %r14d, %eax<br>
+; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
+; CHECK-NEXT:    cmoval %r15d, %eax<br>
 ; CHECK-NEXT:    movzbl %al, %eax<br>
 ; CHECK-NEXT:    orl %ebx, %eax<br>
 ; CHECK-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
 ; CHECK-NEXT:    pinsrw $2, %eax, %xmm0<br>
 ; CHECK-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
-; CHECK-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %edi # 4-byte Reload<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
-; CHECK-NEXT:    xorps %xmm1, %xmm1<br>
-; CHECK-NEXT:    maxss %xmm0, %xmm1<br>
-; CHECK-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero<br>
-; CHECK-NEXT:    minss %xmm1, %xmm0<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %ebx<br>
+; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
+; CHECK-NEXT:    cmovbl %r14d, %ebx<br>
+; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
+; CHECK-NEXT:    cmoval %r15d, %ebx<br>
 ; CHECK-NEXT:    shll $8, %ebx<br>
-; CHECK-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %edi # 4-byte Reload<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
-; CHECK-NEXT:    xorps %xmm1, %xmm1<br>
-; CHECK-NEXT:    maxss %xmm0, %xmm1<br>
-; CHECK-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero<br>
-; CHECK-NEXT:    minss %xmm1, %xmm0<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %eax<br>
+; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
+; CHECK-NEXT:    cmovbl %r14d, %eax<br>
+; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
+; CHECK-NEXT:    cmoval %r15d, %eax<br>
 ; CHECK-NEXT:    movzbl %al, %eax<br>
 ; CHECK-NEXT:    orl %ebx, %eax<br>
 ; CHECK-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
 ; CHECK-NEXT:    pinsrw $3, %eax, %xmm0<br>
-; CHECK-NEXT:    addq $40, %rsp<br>
+; CHECK-NEXT:    addq $56, %rsp<br>
 ; CHECK-NEXT:    popq %rbx<br>
-; CHECK-NEXT:    popq %r12<br>
-; CHECK-NEXT:    popq %r13<br>
 ; CHECK-NEXT:    popq %r14<br>
 ; CHECK-NEXT:    popq %r15<br>
 ; CHECK-NEXT:    popq %rbp<br>
@@ -762,97 +768,103 @@ define <8 x i16> @test_unsigned_v8i16_v8f16(<8 x half> %f) nounwind {<br>
 ; CHECK-LABEL: test_unsigned_v8i16_v8f16:<br>
 ; CHECK:       # %bb.0:<br>
 ; CHECK-NEXT:    pushq %rbp<br>
-; CHECK-NEXT:    pushq %r15<br>
-; CHECK-NEXT:    pushq %r14<br>
-; CHECK-NEXT:    pushq %r13<br>
-; CHECK-NEXT:    pushq %r12<br>
 ; CHECK-NEXT:    pushq %rbx<br>
-; CHECK-NEXT:    subq $72, %rsp<br>
-; CHECK-NEXT:    movl %r9d, %ebp<br>
-; CHECK-NEXT:    movl %r8d, %ebx<br>
-; CHECK-NEXT:    movl %ecx, %r13d<br>
-; CHECK-NEXT:    movl %edx, %r12d<br>
-; CHECK-NEXT:    movl %esi, %r15d<br>
-; CHECK-NEXT:    movl %edi, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%rsp), %r14d<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%rsp), %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
-; CHECK-NEXT:    xorps %xmm1, %xmm1<br>
-; CHECK-NEXT:    maxss %xmm0, %xmm1<br>
-; CHECK-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero<br>
-; CHECK-NEXT:    minss %xmm1, %xmm0<br>
+; CHECK-NEXT:    subq $136, %rsp<br>
+; CHECK-NEXT:    movss %xmm6, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movss %xmm5, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movss %xmm4, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movss %xmm3, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movss %xmm2, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movss %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movaps %xmm7, %xmm0<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %eax<br>
+; CHECK-NEXT:    xorl %ebx, %ebx<br>
+; CHECK-NEXT:    xorps %xmm1, %xmm1<br>
+; CHECK-NEXT:    ucomiss %xmm1, %xmm0<br>
+; CHECK-NEXT:    cmovbl %ebx, %eax<br>
+; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
+; CHECK-NEXT:    movl $65535, %ebp # imm = 0xFFFF<br>
+; CHECK-NEXT:    cmoval %ebp, %eax<br>
 ; CHECK-NEXT:    movd %eax, %xmm0<br>
 ; CHECK-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
-; CHECK-NEXT:    movl %r14d, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
-; CHECK-NEXT:    xorps %xmm1, %xmm1<br>
-; CHECK-NEXT:    maxss %xmm0, %xmm1<br>
-; CHECK-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero<br>
-; CHECK-NEXT:    minss %xmm1, %xmm0<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %eax<br>
+; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
+; CHECK-NEXT:    cmovbl %ebx, %eax<br>
+; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
+; CHECK-NEXT:    cmoval %ebp, %eax<br>
 ; CHECK-NEXT:    movd %eax, %xmm0<br>
 ; CHECK-NEXT:    punpcklwd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload<br>
 ; CHECK-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3]<br>
 ; CHECK-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
-; CHECK-NEXT:    movzwl %bp, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
-; CHECK-NEXT:    xorps %xmm1, %xmm1<br>
-; CHECK-NEXT:    maxss %xmm0, %xmm1<br>
-; CHECK-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero<br>
-; CHECK-NEXT:    minss %xmm1, %xmm0<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %eax<br>
+; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
+; CHECK-NEXT:    cmovbl %ebx, %eax<br>
+; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
+; CHECK-NEXT:    cmoval %ebp, %eax<br>
 ; CHECK-NEXT:    movd %eax, %xmm0<br>
 ; CHECK-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
-; CHECK-NEXT:    movzwl %bx, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
-; CHECK-NEXT:    xorps %xmm1, %xmm1<br>
-; CHECK-NEXT:    maxss %xmm0, %xmm1<br>
-; CHECK-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero<br>
-; CHECK-NEXT:    minss %xmm1, %xmm0<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %eax<br>
+; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
+; CHECK-NEXT:    cmovbl %ebx, %eax<br>
+; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
+; CHECK-NEXT:    cmoval %ebp, %eax<br>
 ; CHECK-NEXT:    movd %eax, %xmm0<br>
 ; CHECK-NEXT:    punpcklwd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload<br>
 ; CHECK-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3]<br>
 ; CHECK-NEXT:    punpckldq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload<br>
 ; CHECK-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]<br>
 ; CHECK-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
-; CHECK-NEXT:    movzwl %r13w, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
-; CHECK-NEXT:    xorps %xmm1, %xmm1<br>
-; CHECK-NEXT:    maxss %xmm0, %xmm1<br>
-; CHECK-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero<br>
-; CHECK-NEXT:    minss %xmm1, %xmm0<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %eax<br>
+; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
+; CHECK-NEXT:    cmovbl %ebx, %eax<br>
+; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
+; CHECK-NEXT:    cmoval %ebp, %eax<br>
 ; CHECK-NEXT:    movd %eax, %xmm0<br>
 ; CHECK-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
-; CHECK-NEXT:    movzwl %r12w, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
-; CHECK-NEXT:    xorps %xmm1, %xmm1<br>
-; CHECK-NEXT:    maxss %xmm0, %xmm1<br>
-; CHECK-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero<br>
-; CHECK-NEXT:    minss %xmm1, %xmm0<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %eax<br>
+; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
+; CHECK-NEXT:    cmovbl %ebx, %eax<br>
+; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
+; CHECK-NEXT:    cmoval %ebp, %eax<br>
 ; CHECK-NEXT:    movd %eax, %xmm0<br>
 ; CHECK-NEXT:    punpcklwd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload<br>
 ; CHECK-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3]<br>
 ; CHECK-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
-; CHECK-NEXT:    movzwl %r15w, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
-; CHECK-NEXT:    xorps %xmm1, %xmm1<br>
-; CHECK-NEXT:    maxss %xmm0, %xmm1<br>
-; CHECK-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero<br>
-; CHECK-NEXT:    minss %xmm1, %xmm0<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %eax<br>
+; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
+; CHECK-NEXT:    cmovbl %ebx, %eax<br>
+; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
+; CHECK-NEXT:    cmoval %ebp, %eax<br>
 ; CHECK-NEXT:    movd %eax, %xmm0<br>
 ; CHECK-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
-; CHECK-NEXT:    movzwl {{[-0-9]+}}(%r{{[sb]}}p), %edi # 2-byte Folded Reload<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
-; CHECK-NEXT:    xorps %xmm1, %xmm1<br>
-; CHECK-NEXT:    maxss %xmm0, %xmm1<br>
-; CHECK-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero<br>
-; CHECK-NEXT:    minss %xmm1, %xmm0<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %eax<br>
+; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
+; CHECK-NEXT:    cmovbl %ebx, %eax<br>
+; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
+; CHECK-NEXT:    cmoval %ebp, %eax<br>
 ; CHECK-NEXT:    movd %eax, %xmm0<br>
 ; CHECK-NEXT:    punpcklwd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload<br>
 ; CHECK-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3]<br>
@@ -860,12 +872,8 @@ define <8 x i16> @test_unsigned_v8i16_v8f16(<8 x half> %f) nounwind {<br>
 ; CHECK-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]<br>
 ; CHECK-NEXT:    punpcklqdq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload<br>
 ; CHECK-NEXT:    # xmm0 = xmm0[0],mem[0]<br>
-; CHECK-NEXT:    addq $72, %rsp<br>
+; CHECK-NEXT:    addq $136, %rsp<br>
 ; CHECK-NEXT:    popq %rbx<br>
-; CHECK-NEXT:    popq %r12<br>
-; CHECK-NEXT:    popq %r13<br>
-; CHECK-NEXT:    popq %r14<br>
-; CHECK-NEXT:    popq %r15<br>
 ; CHECK-NEXT:    popq %rbp<br>
 ; CHECK-NEXT:    retq<br>
   %x = call <8 x i16> @llvm.fptoui.sat.v8i16.v8f16(<8 x half> %f)<br>
@@ -876,113 +884,111 @@ define <8 x i32> @test_unsigned_v8i32_v8f16(<8 x half> %f) nounwind {<br>
 ; CHECK-LABEL: test_unsigned_v8i32_v8f16:<br>
 ; CHECK:       # %bb.0:<br>
 ; CHECK-NEXT:    pushq %rbp<br>
-; CHECK-NEXT:    pushq %r15<br>
-; CHECK-NEXT:    pushq %r14<br>
-; CHECK-NEXT:    pushq %r13<br>
-; CHECK-NEXT:    pushq %r12<br>
 ; CHECK-NEXT:    pushq %rbx<br>
-; CHECK-NEXT:    subq $88, %rsp<br>
-; CHECK-NEXT:    movl %r9d, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movl %r8d, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movl %edx, %r14d<br>
-; CHECK-NEXT:    movl %esi, %ebp<br>
-; CHECK-NEXT:    movl %edi, %ebx<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%rsp), %eax<br>
-; CHECK-NEXT:    movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%rsp), %r13d<br>
-; CHECK-NEXT:    movzwl %cx, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    subq $136, %rsp<br>
+; CHECK-NEXT:    movss %xmm7, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movss %xmm6, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movss %xmm5, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movss %xmm4, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movss %xmm2, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movss %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movaps %xmm3, %xmm0<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %rax<br>
-; CHECK-NEXT:    xorl %r15d, %r15d<br>
+; CHECK-NEXT:    xorl %ebx, %ebx<br>
 ; CHECK-NEXT:    xorps %xmm1, %xmm1<br>
 ; CHECK-NEXT:    ucomiss %xmm1, %xmm0<br>
-; CHECK-NEXT:    cmovbl %r15d, %eax<br>
+; CHECK-NEXT:    cmovbl %ebx, %eax<br>
 ; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
-; CHECK-NEXT:    movl $-1, %r12d<br>
-; CHECK-NEXT:    cmoval %r12d, %eax<br>
+; CHECK-NEXT:    movl $-1, %ebp<br>
+; CHECK-NEXT:    cmoval %ebp, %eax<br>
 ; CHECK-NEXT:    movd %eax, %xmm0<br>
 ; CHECK-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
-; CHECK-NEXT:    movzwl %r14w, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %rax<br>
 ; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
-; CHECK-NEXT:    cmovbl %r15d, %eax<br>
+; CHECK-NEXT:    cmovbl %ebx, %eax<br>
 ; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
-; CHECK-NEXT:    cmoval %r12d, %eax<br>
+; CHECK-NEXT:    cmoval %ebp, %eax<br>
 ; CHECK-NEXT:    movd %eax, %xmm0<br>
 ; CHECK-NEXT:    punpckldq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload<br>
 ; CHECK-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]<br>
 ; CHECK-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
-; CHECK-NEXT:    movzwl %bp, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %rax<br>
 ; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
-; CHECK-NEXT:    cmovbl %r15d, %eax<br>
+; CHECK-NEXT:    cmovbl %ebx, %eax<br>
 ; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
-; CHECK-NEXT:    cmoval %r12d, %eax<br>
+; CHECK-NEXT:    cmoval %ebp, %eax<br>
 ; CHECK-NEXT:    movd %eax, %xmm0<br>
 ; CHECK-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
-; CHECK-NEXT:    movzwl %bx, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %rax<br>
 ; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
-; CHECK-NEXT:    cmovbl %r15d, %eax<br>
+; CHECK-NEXT:    cmovbl %ebx, %eax<br>
 ; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
-; CHECK-NEXT:    cmoval %r12d, %eax<br>
+; CHECK-NEXT:    cmoval %ebp, %eax<br>
 ; CHECK-NEXT:    movd %eax, %xmm0<br>
 ; CHECK-NEXT:    punpckldq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload<br>
 ; CHECK-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]<br>
 ; CHECK-NEXT:    punpcklqdq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload<br>
 ; CHECK-NEXT:    # xmm0 = xmm0[0],mem[0]<br>
 ; CHECK-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
-; CHECK-NEXT:    movl %r13d, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %rax<br>
 ; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
-; CHECK-NEXT:    cmovbl %r15d, %eax<br>
+; CHECK-NEXT:    cmovbl %ebx, %eax<br>
 ; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
-; CHECK-NEXT:    cmoval %r12d, %eax<br>
+; CHECK-NEXT:    cmoval %ebp, %eax<br>
 ; CHECK-NEXT:    movd %eax, %xmm0<br>
 ; CHECK-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
-; CHECK-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %edi # 4-byte Reload<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %rax<br>
 ; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
-; CHECK-NEXT:    cmovbl %r15d, %eax<br>
+; CHECK-NEXT:    cmovbl %ebx, %eax<br>
 ; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
-; CHECK-NEXT:    cmoval %r12d, %eax<br>
+; CHECK-NEXT:    cmoval %ebp, %eax<br>
 ; CHECK-NEXT:    movd %eax, %xmm0<br>
 ; CHECK-NEXT:    punpckldq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload<br>
 ; CHECK-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]<br>
 ; CHECK-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
-; CHECK-NEXT:    movzwl {{[-0-9]+}}(%r{{[sb]}}p), %edi # 2-byte Folded Reload<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %rax<br>
 ; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
-; CHECK-NEXT:    cmovbl %r15d, %eax<br>
+; CHECK-NEXT:    cmovbl %ebx, %eax<br>
 ; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
-; CHECK-NEXT:    cmoval %r12d, %eax<br>
+; CHECK-NEXT:    cmoval %ebp, %eax<br>
 ; CHECK-NEXT:    movd %eax, %xmm0<br>
 ; CHECK-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
-; CHECK-NEXT:    movzwl {{[-0-9]+}}(%r{{[sb]}}p), %edi # 2-byte Folded Reload<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %rax<br>
 ; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
-; CHECK-NEXT:    cmovbl %r15d, %eax<br>
+; CHECK-NEXT:    cmovbl %ebx, %eax<br>
 ; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
-; CHECK-NEXT:    cmoval %r12d, %eax<br>
+; CHECK-NEXT:    cmoval %ebp, %eax<br>
 ; CHECK-NEXT:    movd %eax, %xmm1<br>
 ; CHECK-NEXT:    punpckldq {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Folded Reload<br>
 ; CHECK-NEXT:    # xmm1 = xmm1[0],mem[0],xmm1[1],mem[1]<br>
 ; CHECK-NEXT:    punpcklqdq {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Folded Reload<br>
 ; CHECK-NEXT:    # xmm1 = xmm1[0],mem[0]<br>
 ; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
-; CHECK-NEXT:    addq $88, %rsp<br>
+; CHECK-NEXT:    addq $136, %rsp<br>
 ; CHECK-NEXT:    popq %rbx<br>
-; CHECK-NEXT:    popq %r12<br>
-; CHECK-NEXT:    popq %r13<br>
-; CHECK-NEXT:    popq %r14<br>
-; CHECK-NEXT:    popq %r15<br>
 ; CHECK-NEXT:    popq %rbp<br>
 ; CHECK-NEXT:    retq<br>
   %x = call <8 x i32> @llvm.fptoui.sat.v8i32.v8f16(<8 x half> %f)<br>
@@ -992,22 +998,18 @@ define <8 x i32> @test_unsigned_v8i32_v8f16(<8 x half> %f) nounwind {<br>
 define <8 x i64> @test_unsigned_v8i64_v8f16(<8 x half> %f) nounwind {<br>
 ; CHECK-LABEL: test_unsigned_v8i64_v8f16:<br>
 ; CHECK:       # %bb.0:<br>
-; CHECK-NEXT:    pushq %rbp<br>
-; CHECK-NEXT:    pushq %r15<br>
 ; CHECK-NEXT:    pushq %r14<br>
-; CHECK-NEXT:    pushq %r13<br>
-; CHECK-NEXT:    pushq %r12<br>
 ; CHECK-NEXT:    pushq %rbx<br>
-; CHECK-NEXT:    subq $104, %rsp<br>
-; CHECK-NEXT:    movl %r9d, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movl %r8d, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movl %ecx, %r13d<br>
-; CHECK-NEXT:    movl %edx, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movl %esi, %ebp<br>
-; CHECK-NEXT:    movl %edi, %ebx<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%rsp), %r14d<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%rsp), %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    subq $136, %rsp<br>
+; CHECK-NEXT:    movss %xmm7, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movss %xmm6, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movss %xmm5, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movss %xmm4, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movss %xmm3, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movss %xmm2, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movaps %xmm1, %xmm0<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    movaps %xmm0, %xmm1<br>
 ; CHECK-NEXT:    subss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1<br>
 ; CHECK-NEXT:    cvttss2si %xmm1, %rax<br>
@@ -1016,18 +1018,19 @@ define <8 x i64> @test_unsigned_v8i64_v8f16(<8 x half> %f) nounwind {<br>
 ; CHECK-NEXT:    sarq $63, %rdx<br>
 ; CHECK-NEXT:    andq %rax, %rdx<br>
 ; CHECK-NEXT:    orq %rcx, %rdx<br>
-; CHECK-NEXT:    xorl %r15d, %r15d<br>
+; CHECK-NEXT:    xorl %r14d, %r14d<br>
 ; CHECK-NEXT:    xorps %xmm1, %xmm1<br>
 ; CHECK-NEXT:    ucomiss %xmm1, %xmm0<br>
-; CHECK-NEXT:    cmovbq %r15, %rdx<br>
+; CHECK-NEXT:    cmovbq %r14, %rdx<br>
 ; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
-; CHECK-NEXT:    movq $-1, %r12<br>
-; CHECK-NEXT:    cmovaq %r12, %rdx<br>
+; CHECK-NEXT:    movq $-1, %rbx<br>
+; CHECK-NEXT:    cmovaq %rbx, %rdx<br>
 ; CHECK-NEXT:    movq %rdx, %xmm0<br>
 ; CHECK-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
-; CHECK-NEXT:    movl %r14d, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
-; CHECK-NEXT:    movdqa %xmm0, %xmm1<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
+; CHECK-NEXT:    movaps %xmm0, %xmm1<br>
 ; CHECK-NEXT:    subss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1<br>
 ; CHECK-NEXT:    cvttss2si %xmm1, %rax<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %rcx<br>
@@ -1036,16 +1039,17 @@ define <8 x i64> @test_unsigned_v8i64_v8f16(<8 x half> %f) nounwind {<br>
 ; CHECK-NEXT:    andq %rax, %rdx<br>
 ; CHECK-NEXT:    orq %rcx, %rdx<br>
 ; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
-; CHECK-NEXT:    cmovbq %r15, %rdx<br>
+; CHECK-NEXT:    cmovbq %r14, %rdx<br>
 ; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
-; CHECK-NEXT:    cmovaq %r12, %rdx<br>
+; CHECK-NEXT:    cmovaq %rbx, %rdx<br>
 ; CHECK-NEXT:    movq %rdx, %xmm0<br>
 ; CHECK-NEXT:    punpcklqdq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload<br>
 ; CHECK-NEXT:    # xmm0 = xmm0[0],mem[0]<br>
 ; CHECK-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
-; CHECK-NEXT:    movzwl %bp, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
-; CHECK-NEXT:    movdqa %xmm0, %xmm1<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
+; CHECK-NEXT:    movaps %xmm0, %xmm1<br>
 ; CHECK-NEXT:    subss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1<br>
 ; CHECK-NEXT:    cvttss2si %xmm1, %rax<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %rcx<br>
@@ -1054,14 +1058,15 @@ define <8 x i64> @test_unsigned_v8i64_v8f16(<8 x half> %f) nounwind {<br>
 ; CHECK-NEXT:    andq %rax, %rdx<br>
 ; CHECK-NEXT:    orq %rcx, %rdx<br>
 ; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
-; CHECK-NEXT:    cmovbq %r15, %rdx<br>
+; CHECK-NEXT:    cmovbq %r14, %rdx<br>
 ; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
-; CHECK-NEXT:    cmovaq %r12, %rdx<br>
+; CHECK-NEXT:    cmovaq %rbx, %rdx<br>
 ; CHECK-NEXT:    movq %rdx, %xmm0<br>
 ; CHECK-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
-; CHECK-NEXT:    movzwl %bx, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
-; CHECK-NEXT:    movdqa %xmm0, %xmm1<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
+; CHECK-NEXT:    movaps %xmm0, %xmm1<br>
 ; CHECK-NEXT:    subss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1<br>
 ; CHECK-NEXT:    cvttss2si %xmm1, %rax<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %rcx<br>
@@ -1070,16 +1075,17 @@ define <8 x i64> @test_unsigned_v8i64_v8f16(<8 x half> %f) nounwind {<br>
 ; CHECK-NEXT:    andq %rax, %rdx<br>
 ; CHECK-NEXT:    orq %rcx, %rdx<br>
 ; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
-; CHECK-NEXT:    cmovbq %r15, %rdx<br>
+; CHECK-NEXT:    cmovbq %r14, %rdx<br>
 ; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
-; CHECK-NEXT:    cmovaq %r12, %rdx<br>
+; CHECK-NEXT:    cmovaq %rbx, %rdx<br>
 ; CHECK-NEXT:    movq %rdx, %xmm0<br>
 ; CHECK-NEXT:    punpcklqdq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload<br>
 ; CHECK-NEXT:    # xmm0 = xmm0[0],mem[0]<br>
 ; CHECK-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
-; CHECK-NEXT:    movzwl %r13w, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
-; CHECK-NEXT:    movdqa %xmm0, %xmm1<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
+; CHECK-NEXT:    movaps %xmm0, %xmm1<br>
 ; CHECK-NEXT:    subss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1<br>
 ; CHECK-NEXT:    cvttss2si %xmm1, %rax<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %rcx<br>
@@ -1088,14 +1094,15 @@ define <8 x i64> @test_unsigned_v8i64_v8f16(<8 x half> %f) nounwind {<br>
 ; CHECK-NEXT:    andq %rax, %rdx<br>
 ; CHECK-NEXT:    orq %rcx, %rdx<br>
 ; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
-; CHECK-NEXT:    cmovbq %r15, %rdx<br>
+; CHECK-NEXT:    cmovbq %r14, %rdx<br>
 ; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
-; CHECK-NEXT:    cmovaq %r12, %rdx<br>
+; CHECK-NEXT:    cmovaq %rbx, %rdx<br>
 ; CHECK-NEXT:    movq %rdx, %xmm0<br>
 ; CHECK-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
-; CHECK-NEXT:    movzwl {{[-0-9]+}}(%r{{[sb]}}p), %edi # 2-byte Folded Reload<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
-; CHECK-NEXT:    movdqa %xmm0, %xmm1<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
+; CHECK-NEXT:    movaps %xmm0, %xmm1<br>
 ; CHECK-NEXT:    subss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1<br>
 ; CHECK-NEXT:    cvttss2si %xmm1, %rax<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %rcx<br>
@@ -1104,16 +1111,17 @@ define <8 x i64> @test_unsigned_v8i64_v8f16(<8 x half> %f) nounwind {<br>
 ; CHECK-NEXT:    andq %rax, %rdx<br>
 ; CHECK-NEXT:    orq %rcx, %rdx<br>
 ; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
-; CHECK-NEXT:    cmovbq %r15, %rdx<br>
+; CHECK-NEXT:    cmovbq %r14, %rdx<br>
 ; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
-; CHECK-NEXT:    cmovaq %r12, %rdx<br>
+; CHECK-NEXT:    cmovaq %rbx, %rdx<br>
 ; CHECK-NEXT:    movq %rdx, %xmm0<br>
 ; CHECK-NEXT:    punpcklqdq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload<br>
 ; CHECK-NEXT:    # xmm0 = xmm0[0],mem[0]<br>
 ; CHECK-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
-; CHECK-NEXT:    movzwl {{[-0-9]+}}(%r{{[sb]}}p), %edi # 2-byte Folded Reload<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
-; CHECK-NEXT:    movdqa %xmm0, %xmm1<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
+; CHECK-NEXT:    movaps %xmm0, %xmm1<br>
 ; CHECK-NEXT:    subss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1<br>
 ; CHECK-NEXT:    cvttss2si %xmm1, %rax<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %rcx<br>
@@ -1122,14 +1130,15 @@ define <8 x i64> @test_unsigned_v8i64_v8f16(<8 x half> %f) nounwind {<br>
 ; CHECK-NEXT:    andq %rax, %rdx<br>
 ; CHECK-NEXT:    orq %rcx, %rdx<br>
 ; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
-; CHECK-NEXT:    cmovbq %r15, %rdx<br>
+; CHECK-NEXT:    cmovbq %r14, %rdx<br>
 ; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
-; CHECK-NEXT:    cmovaq %r12, %rdx<br>
+; CHECK-NEXT:    cmovaq %rbx, %rdx<br>
 ; CHECK-NEXT:    movq %rdx, %xmm0<br>
 ; CHECK-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
-; CHECK-NEXT:    movzwl {{[-0-9]+}}(%r{{[sb]}}p), %edi # 2-byte Folded Reload<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
-; CHECK-NEXT:    movdqa %xmm0, %xmm1<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
+; CHECK-NEXT:    movaps %xmm0, %xmm1<br>
 ; CHECK-NEXT:    subss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1<br>
 ; CHECK-NEXT:    cvttss2si %xmm1, %rax<br>
 ; CHECK-NEXT:    cvttss2si %xmm0, %rcx<br>
@@ -1138,22 +1147,18 @@ define <8 x i64> @test_unsigned_v8i64_v8f16(<8 x half> %f) nounwind {<br>
 ; CHECK-NEXT:    andq %rax, %rdx<br>
 ; CHECK-NEXT:    orq %rcx, %rdx<br>
 ; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
-; CHECK-NEXT:    cmovbq %r15, %rdx<br>
+; CHECK-NEXT:    cmovbq %r14, %rdx<br>
 ; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
-; CHECK-NEXT:    cmovaq %r12, %rdx<br>
-; CHECK-NEXT:    movq %rdx, %xmm2<br>
-; CHECK-NEXT:    punpcklqdq {{[-0-9]+}}(%r{{[sb]}}p), %xmm2 # 16-byte Folded Reload<br>
-; CHECK-NEXT:    # xmm2 = xmm2[0],mem[0]<br>
+; CHECK-NEXT:    cmovaq %rbx, %rdx<br>
+; CHECK-NEXT:    movq %rdx, %xmm3<br>
+; CHECK-NEXT:    punpcklqdq {{[-0-9]+}}(%r{{[sb]}}p), %xmm3 # 16-byte Folded Reload<br>
+; CHECK-NEXT:    # xmm3 = xmm3[0],mem[0]<br>
 ; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
 ; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload<br>
-; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm3 # 16-byte Reload<br>
-; CHECK-NEXT:    addq $104, %rsp<br>
+; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm2 # 16-byte Reload<br>
+; CHECK-NEXT:    addq $136, %rsp<br>
 ; CHECK-NEXT:    popq %rbx<br>
-; CHECK-NEXT:    popq %r12<br>
-; CHECK-NEXT:    popq %r13<br>
 ; CHECK-NEXT:    popq %r14<br>
-; CHECK-NEXT:    popq %r15<br>
-; CHECK-NEXT:    popq %rbp<br>
 ; CHECK-NEXT:    retq<br>
   %x = call <8 x i64> @llvm.fptoui.sat.v8i64.v8f16(<8 x half> %f)<br>
   ret <8 x i64> %x<br>
@@ -1169,92 +1174,93 @@ define <8 x i128> @test_unsigned_v8i128_v8f16(<8 x half> %f) nounwind {<br>
 ; CHECK-NEXT:    pushq %r12<br>
 ; CHECK-NEXT:    pushq %rbx<br>
 ; CHECK-NEXT:    subq $88, %rsp<br>
-; CHECK-NEXT:    movl %r9d, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movl %r8d, %r15d<br>
-; CHECK-NEXT:    movl %ecx, %r14d<br>
-; CHECK-NEXT:    movl %edx, %r12d<br>
+; CHECK-NEXT:    movss %xmm7, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movss %xmm6, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movss %xmm5, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movss %xmm4, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movss %xmm3, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movss %xmm2, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movss %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
 ; CHECK-NEXT:    movq %rdi, %rbx<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%rsp), %eax<br>
-; CHECK-NEXT:    movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%rsp), %eax<br>
-; CHECK-NEXT:    movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%rsp), %eax<br>
-; CHECK-NEXT:    movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movzwl %si, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
 ; CHECK-NEXT:    callq __fixunssfti@PLT<br>
-; CHECK-NEXT:    xorl %r13d, %r13d<br>
+; CHECK-NEXT:    xorl %r12d, %r12d<br>
 ; CHECK-NEXT:    xorps %xmm0, %xmm0<br>
 ; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 4-byte Reload<br>
 ; CHECK-NEXT:    # xmm1 = mem[0],zero,zero,zero<br>
 ; CHECK-NEXT:    ucomiss %xmm0, %xmm1<br>
-; CHECK-NEXT:    cmovbq %r13, %rdx<br>
-; CHECK-NEXT:    cmovbq %r13, %rax<br>
+; CHECK-NEXT:    cmovbq %r12, %rdx<br>
+; CHECK-NEXT:    cmovbq %r12, %rax<br>
 ; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1<br>
-; CHECK-NEXT:    movq $-1, %rbp<br>
-; CHECK-NEXT:    cmovaq %rbp, %rax<br>
+; CHECK-NEXT:    movq $-1, %r13<br>
+; CHECK-NEXT:    cmovaq %r13, %rax<br>
 ; CHECK-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill<br>
-; CHECK-NEXT:    cmovaq %rbp, %rdx<br>
+; CHECK-NEXT:    cmovaq %r13, %rdx<br>
 ; CHECK-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill<br>
-; CHECK-NEXT:    movzwl %r12w, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
 ; CHECK-NEXT:    callq __fixunssfti@PLT<br>
 ; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
 ; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
 ; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
-; CHECK-NEXT:    cmovbq %r13, %rdx<br>
-; CHECK-NEXT:    cmovbq %r13, %rax<br>
+; CHECK-NEXT:    cmovbq %r12, %rdx<br>
+; CHECK-NEXT:    cmovbq %r12, %rax<br>
 ; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
-; CHECK-NEXT:    cmovaq %rbp, %rax<br>
+; CHECK-NEXT:    cmovaq %r13, %rax<br>
 ; CHECK-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill<br>
-; CHECK-NEXT:    cmovaq %rbp, %rdx<br>
+; CHECK-NEXT:    cmovaq %r13, %rdx<br>
 ; CHECK-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill<br>
-; CHECK-NEXT:    movzwl %r14w, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
 ; CHECK-NEXT:    callq __fixunssfti@PLT<br>
 ; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
 ; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
 ; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
-; CHECK-NEXT:    cmovbq %r13, %rdx<br>
-; CHECK-NEXT:    cmovbq %r13, %rax<br>
+; CHECK-NEXT:    cmovbq %r12, %rdx<br>
+; CHECK-NEXT:    cmovbq %r12, %rax<br>
 ; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
-; CHECK-NEXT:    cmovaq %rbp, %rax<br>
+; CHECK-NEXT:    cmovaq %r13, %rax<br>
 ; CHECK-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill<br>
-; CHECK-NEXT:    cmovaq %rbp, %rdx<br>
+; CHECK-NEXT:    cmovaq %r13, %rdx<br>
 ; CHECK-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill<br>
-; CHECK-NEXT:    movzwl %r15w, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
 ; CHECK-NEXT:    callq __fixunssfti@PLT<br>
 ; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
 ; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
 ; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
-; CHECK-NEXT:    cmovbq %r13, %rdx<br>
-; CHECK-NEXT:    cmovbq %r13, %rax<br>
+; CHECK-NEXT:    cmovbq %r12, %rdx<br>
+; CHECK-NEXT:    cmovbq %r12, %rax<br>
 ; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
-; CHECK-NEXT:    cmovaq %rbp, %rax<br>
+; CHECK-NEXT:    cmovaq %r13, %rax<br>
 ; CHECK-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill<br>
-; CHECK-NEXT:    cmovaq %rbp, %rdx<br>
+; CHECK-NEXT:    cmovaq %r13, %rdx<br>
 ; CHECK-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill<br>
-; CHECK-NEXT:    movzwl {{[-0-9]+}}(%r{{[sb]}}p), %edi # 2-byte Folded Reload<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
 ; CHECK-NEXT:    callq __fixunssfti@PLT<br>
-; CHECK-NEXT:    movq %rdx, %r12<br>
+; CHECK-NEXT:    movq %rdx, %rbp<br>
 ; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
 ; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
 ; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
-; CHECK-NEXT:    cmovbq %r13, %r12<br>
-; CHECK-NEXT:    cmovbq %r13, %rax<br>
+; CHECK-NEXT:    cmovbq %r12, %rbp<br>
+; CHECK-NEXT:    cmovbq %r12, %rax<br>
 ; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
-; CHECK-NEXT:    cmovaq %rbp, %rax<br>
+; CHECK-NEXT:    cmovaq %r13, %rax<br>
 ; CHECK-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill<br>
-; CHECK-NEXT:    cmovaq %rbp, %r12<br>
-; CHECK-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %edi # 4-byte Reload<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    cmovaq %r13, %rbp<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
 ; CHECK-NEXT:    callq __fixunssfti@PLT<br>
 ; CHECK-NEXT:    movq %rax, %r14<br>
@@ -1262,29 +1268,31 @@ define <8 x i128> @test_unsigned_v8i128_v8f16(<8 x half> %f) nounwind {<br>
 ; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
 ; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
 ; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
-; CHECK-NEXT:    cmovbq %r13, %r15<br>
-; CHECK-NEXT:    cmovbq %r13, %r14<br>
+; CHECK-NEXT:    cmovbq %r12, %r15<br>
+; CHECK-NEXT:    cmovbq %r12, %r14<br>
 ; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
-; CHECK-NEXT:    cmovaq %rbp, %r14<br>
-; CHECK-NEXT:    cmovaq %rbp, %r15<br>
-; CHECK-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %edi # 4-byte Reload<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    cmovaq %r13, %r14<br>
+; CHECK-NEXT:    cmovaq %r13, %r15<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
 ; CHECK-NEXT:    callq __fixunssfti@PLT<br>
-; CHECK-NEXT:    movq %rax, %r13<br>
-; CHECK-NEXT:    movq %rdx, %rbp<br>
+; CHECK-NEXT:    movq %rax, %r12<br>
+; CHECK-NEXT:    movq %rdx, %r13<br>
 ; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
 ; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
 ; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
 ; CHECK-NEXT:    movl $0, %eax<br>
-; CHECK-NEXT:    cmovbq %rax, %rbp<br>
 ; CHECK-NEXT:    cmovbq %rax, %r13<br>
+; CHECK-NEXT:    cmovbq %rax, %r12<br>
 ; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0<br>
 ; CHECK-NEXT:    movq $-1, %rax<br>
+; CHECK-NEXT:    cmovaq %rax, %r12<br>
 ; CHECK-NEXT:    cmovaq %rax, %r13<br>
-; CHECK-NEXT:    cmovaq %rax, %rbp<br>
-; CHECK-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %edi # 4-byte Reload<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
 ; CHECK-NEXT:    callq __fixunssfti@PLT<br>
 ; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
@@ -1299,11 +1307,11 @@ define <8 x i128> @test_unsigned_v8i128_v8f16(<8 x half> %f) nounwind {<br>
 ; CHECK-NEXT:    cmovaq %rcx, %rdx<br>
 ; CHECK-NEXT:    movq %rdx, 120(%rbx)<br>
 ; CHECK-NEXT:    movq %rax, 112(%rbx)<br>
-; CHECK-NEXT:    movq %rbp, 104(%rbx)<br>
-; CHECK-NEXT:    movq %r13, 96(%rbx)<br>
+; CHECK-NEXT:    movq %r13, 104(%rbx)<br>
+; CHECK-NEXT:    movq %r12, 96(%rbx)<br>
 ; CHECK-NEXT:    movq %r15, 88(%rbx)<br>
 ; CHECK-NEXT:    movq %r14, 80(%rbx)<br>
-; CHECK-NEXT:    movq %r12, 72(%rbx)<br>
+; CHECK-NEXT:    movq %rbp, 72(%rbx)<br>
 ; CHECK-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload<br>
 ; CHECK-NEXT:    movq %rax, 64(%rbx)<br>
 ; CHECK-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload<br>
<br>
diff  --git a/llvm/test/CodeGen/X86/freeze.ll b/llvm/test/CodeGen/X86/freeze.ll<br>
index 36156a77dfd35..28b65aee746df 100644<br>
--- a/llvm/test/CodeGen/X86/freeze.ll<br>
+++ b/llvm/test/CodeGen/X86/freeze.ll<br>
@@ -38,14 +38,10 @@ define half @freeze_half() {<br>
 ; X86ASM:       # %bb.0:<br>
 ; X86ASM-NEXT:    pushq %rax<br>
 ; X86ASM-NEXT:    .cfi_def_cfa_offset 16<br>
-; X86ASM-NEXT:    xorl %edi, %edi<br>
-; X86ASM-NEXT:    callq __gnu_h2f_ieee@PLT<br>
-; X86ASM-NEXT:    callq __gnu_f2h_ieee@PLT<br>
-; X86ASM-NEXT:    movzwl %ax, %edi<br>
-; X86ASM-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; X86ASM-NEXT:    callq __extendhfsf2@PLT<br>
 ; X86ASM-NEXT:    addss %xmm0, %xmm0<br>
-; X86ASM-NEXT:    callq __gnu_f2h_ieee@PLT<br>
-; X86ASM-NEXT:    popq %rcx<br>
+; X86ASM-NEXT:    callq __truncsfhf2@PLT<br>
+; X86ASM-NEXT:    popq %rax<br>
 ; X86ASM-NEXT:    .cfi_def_cfa_offset 8<br>
 ; X86ASM-NEXT:    retq<br>
   %y1 = freeze half undef<br>
<br>
diff  --git a/llvm/test/CodeGen/X86/frem.ll b/llvm/test/CodeGen/X86/frem.ll<br>
index 50e7d62fb4a2e..b1fcbb05b2fd7 100644<br>
--- a/llvm/test/CodeGen/X86/frem.ll<br>
+++ b/llvm/test/CodeGen/X86/frem.ll<br>
@@ -6,24 +6,24 @@<br>
 define void @frem_f16(half %a0, half %a1, half *%p3) nounwind {<br>
 ; CHECK-LABEL: frem_f16:<br>
 ; CHECK:       # %bb.0:<br>
-; CHECK-NEXT:    pushq %rbp<br>
 ; CHECK-NEXT:    pushq %rbx<br>
-; CHECK-NEXT:    pushq %rax<br>
-; CHECK-NEXT:    movq %rdx, %rbx<br>
-; CHECK-NEXT:    movl %edi, %ebp<br>
-; CHECK-NEXT:    movzwl %si, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    subq $16, %rsp<br>
+; CHECK-NEXT:    movq %rdi, %rbx<br>
+; CHECK-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movaps %xmm1, %xmm0<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movzwl %bp, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 4-byte Reload<br>
 ; CHECK-NEXT:    # xmm1 = mem[0],zero,zero,zero<br>
 ; CHECK-NEXT:    callq fmodf@PLT<br>
-; CHECK-NEXT:    callq __gnu_f2h_ieee@PLT<br>
+; CHECK-NEXT:    callq __truncsfhf2@PLT<br>
+; CHECK-NEXT:    pextrw $0, %xmm0, %eax<br>
 ; CHECK-NEXT:    movw %ax, (%rbx)<br>
-; CHECK-NEXT:    addq $8, %rsp<br>
+; CHECK-NEXT:    addq $16, %rsp<br>
 ; CHECK-NEXT:    popq %rbx<br>
-; CHECK-NEXT:    popq %rbp<br>
 ; CHECK-NEXT:    retq<br>
   %frem = frem half %a0, %a1<br>
   store half %frem, half *%p3<br>
@@ -501,503 +501,564 @@ define void @frem_v32f16(<32 x half> %a0, <32 x half> %a1, <32 x half> *%p3) nou<br>
 ; CHECK-NEXT:    pushq %r13<br>
 ; CHECK-NEXT:    pushq %r12<br>
 ; CHECK-NEXT:    pushq %rbx<br>
-; CHECK-NEXT:    subq $248, %rsp<br>
-; CHECK-NEXT:    movl %r9d, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movl %r8d, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movl %ecx, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movl %edx, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movl %esi, %r14d<br>
-; CHECK-NEXT:    movl %edi, %ebx<br>
-; CHECK-NEXT:    movq {{[0-9]+}}(%rsp), %r15<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%rsp), %eax<br>
-; CHECK-NEXT:    movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%rsp), %eax<br>
-; CHECK-NEXT:    movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%rsp), %eax<br>
-; CHECK-NEXT:    movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%rsp), %eax<br>
-; CHECK-NEXT:    movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%rsp), %eax<br>
-; CHECK-NEXT:    movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%rsp), %eax<br>
-; CHECK-NEXT:    movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%rsp), %eax<br>
-; CHECK-NEXT:    movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%rsp), %eax<br>
-; CHECK-NEXT:    movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%rsp), %eax<br>
-; CHECK-NEXT:    movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%rsp), %eax<br>
-; CHECK-NEXT:    movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%rsp), %eax<br>
-; CHECK-NEXT:    movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%rsp), %eax<br>
-; CHECK-NEXT:    movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%rsp), %eax<br>
-; CHECK-NEXT:    movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%rsp), %eax<br>
-; CHECK-NEXT:    movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%rsp), %eax<br>
-; CHECK-NEXT:    movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%rsp), %eax<br>
-; CHECK-NEXT:    movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%rsp), %eax<br>
-; CHECK-NEXT:    movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%rsp), %eax<br>
-; CHECK-NEXT:    movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%rsp), %eax<br>
-; CHECK-NEXT:    movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%rsp), %eax<br>
-; CHECK-NEXT:    movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%rsp), %eax<br>
-; CHECK-NEXT:    movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%rsp), %eax<br>
-; CHECK-NEXT:    movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%rsp), %eax<br>
-; CHECK-NEXT:    movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%rsp), %eax<br>
-; CHECK-NEXT:    movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%rsp), %eax<br>
-; CHECK-NEXT:    movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%rsp), %eax<br>
-; CHECK-NEXT:    movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%rsp), %eax<br>
-; CHECK-NEXT:    movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%rsp), %eax<br>
-; CHECK-NEXT:    movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%rsp), %eax<br>
-; CHECK-NEXT:    movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%rsp), %eax<br>
-; CHECK-NEXT:    movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%rsp), %eax<br>
-; CHECK-NEXT:    movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%rsp), %eax<br>
-; CHECK-NEXT:    movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%rsp), %eax<br>
-; CHECK-NEXT:    movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%rsp), %eax<br>
-; CHECK-NEXT:    movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%rsp), %eax<br>
-; CHECK-NEXT:    movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%rsp), %eax<br>
-; CHECK-NEXT:    movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%rsp), %eax<br>
-; CHECK-NEXT:    movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%rsp), %eax<br>
-; CHECK-NEXT:    movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%rsp), %eax<br>
-; CHECK-NEXT:    movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%rsp), %eax<br>
-; CHECK-NEXT:    movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%rsp), %eax<br>
-; CHECK-NEXT:    movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%rsp), %eax<br>
-; CHECK-NEXT:    movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%rsp), %eax<br>
-; CHECK-NEXT:    movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%rsp), %eax<br>
-; CHECK-NEXT:    movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%rsp), %eax<br>
-; CHECK-NEXT:    movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%rsp), %eax<br>
-; CHECK-NEXT:    movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%rsp), %eax<br>
-; CHECK-NEXT:    movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%rsp), %eax<br>
-; CHECK-NEXT:    movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%rsp), %eax<br>
-; CHECK-NEXT:    movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%rsp), %eax<br>
-; CHECK-NEXT:    movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%rsp), %eax<br>
-; CHECK-NEXT:    movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%rsp), %eax<br>
-; CHECK-NEXT:    movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%rsp), %eax<br>
-; CHECK-NEXT:    movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%rsp), %eax<br>
-; CHECK-NEXT:    movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%rsp), %ebp<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%rsp), %r13d<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%rsp), %r12d<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%rsp), %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    subq $1032, %rsp # imm = 0x408<br>
+; CHECK-NEXT:    movq %rdi, %rbx<br>
+; CHECK-NEXT:    movss %xmm7, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movss %xmm6, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movss %xmm5, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movss %xmm4, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movss %xmm3, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movss %xmm2, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movd %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Folded Spill<br>
+; CHECK-NEXT:    pinsrw $0, {{[0-9]+}}(%rsp), %xmm1<br>
+; CHECK-NEXT:    movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    pinsrw $0, {{[0-9]+}}(%rsp), %xmm1<br>
+; CHECK-NEXT:    movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    pinsrw $0, {{[0-9]+}}(%rsp), %xmm1<br>
+; CHECK-NEXT:    movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    pinsrw $0, {{[0-9]+}}(%rsp), %xmm1<br>
+; CHECK-NEXT:    movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    pinsrw $0, {{[0-9]+}}(%rsp), %xmm1<br>
+; CHECK-NEXT:    movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    pinsrw $0, {{[0-9]+}}(%rsp), %xmm1<br>
+; CHECK-NEXT:    movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    pinsrw $0, {{[0-9]+}}(%rsp), %xmm1<br>
+; CHECK-NEXT:    movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    pinsrw $0, {{[0-9]+}}(%rsp), %xmm1<br>
+; CHECK-NEXT:    movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    pinsrw $0, {{[0-9]+}}(%rsp), %xmm1<br>
+; CHECK-NEXT:    movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    pinsrw $0, {{[0-9]+}}(%rsp), %xmm1<br>
+; CHECK-NEXT:    movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    pinsrw $0, {{[0-9]+}}(%rsp), %xmm1<br>
+; CHECK-NEXT:    movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    pinsrw $0, {{[0-9]+}}(%rsp), %xmm1<br>
+; CHECK-NEXT:    movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    pinsrw $0, {{[0-9]+}}(%rsp), %xmm1<br>
+; CHECK-NEXT:    movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    pinsrw $0, {{[0-9]+}}(%rsp), %xmm1<br>
+; CHECK-NEXT:    movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    pinsrw $0, {{[0-9]+}}(%rsp), %xmm1<br>
+; CHECK-NEXT:    movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    pinsrw $0, {{[0-9]+}}(%rsp), %xmm1<br>
+; CHECK-NEXT:    movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    pinsrw $0, {{[0-9]+}}(%rsp), %xmm1<br>
+; CHECK-NEXT:    movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    pinsrw $0, {{[0-9]+}}(%rsp), %xmm1<br>
+; CHECK-NEXT:    movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    pinsrw $0, {{[0-9]+}}(%rsp), %xmm1<br>
+; CHECK-NEXT:    movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    pinsrw $0, {{[0-9]+}}(%rsp), %xmm1<br>
+; CHECK-NEXT:    movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    pinsrw $0, {{[0-9]+}}(%rsp), %xmm1<br>
+; CHECK-NEXT:    movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    pinsrw $0, {{[0-9]+}}(%rsp), %xmm1<br>
+; CHECK-NEXT:    movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    pinsrw $0, {{[0-9]+}}(%rsp), %xmm1<br>
+; CHECK-NEXT:    movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    pinsrw $0, {{[0-9]+}}(%rsp), %xmm1<br>
+; CHECK-NEXT:    movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    pinsrw $0, {{[0-9]+}}(%rsp), %xmm1<br>
+; CHECK-NEXT:    movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    pinsrw $0, {{[0-9]+}}(%rsp), %xmm1<br>
+; CHECK-NEXT:    movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    pinsrw $0, {{[0-9]+}}(%rsp), %xmm1<br>
+; CHECK-NEXT:    movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    pinsrw $0, {{[0-9]+}}(%rsp), %xmm1<br>
+; CHECK-NEXT:    movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    pinsrw $0, {{[0-9]+}}(%rsp), %xmm1<br>
+; CHECK-NEXT:    movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    pinsrw $0, {{[0-9]+}}(%rsp), %xmm1<br>
+; CHECK-NEXT:    movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    pinsrw $0, {{[0-9]+}}(%rsp), %xmm1<br>
+; CHECK-NEXT:    movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    pinsrw $0, {{[0-9]+}}(%rsp), %xmm1<br>
+; CHECK-NEXT:    movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    pinsrw $0, {{[0-9]+}}(%rsp), %xmm1<br>
+; CHECK-NEXT:    movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    pinsrw $0, {{[0-9]+}}(%rsp), %xmm1<br>
+; CHECK-NEXT:    movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    pinsrw $0, {{[0-9]+}}(%rsp), %xmm1<br>
+; CHECK-NEXT:    movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    pinsrw $0, {{[0-9]+}}(%rsp), %xmm1<br>
+; CHECK-NEXT:    movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    pinsrw $0, {{[0-9]+}}(%rsp), %xmm1<br>
+; CHECK-NEXT:    movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    pinsrw $0, {{[0-9]+}}(%rsp), %xmm1<br>
+; CHECK-NEXT:    movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    pinsrw $0, {{[0-9]+}}(%rsp), %xmm1<br>
+; CHECK-NEXT:    movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    pinsrw $0, {{[0-9]+}}(%rsp), %xmm1<br>
+; CHECK-NEXT:    movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    pinsrw $0, {{[0-9]+}}(%rsp), %xmm1<br>
+; CHECK-NEXT:    movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    pinsrw $0, {{[0-9]+}}(%rsp), %xmm1<br>
+; CHECK-NEXT:    movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    pinsrw $0, {{[0-9]+}}(%rsp), %xmm1<br>
+; CHECK-NEXT:    movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    pinsrw $0, {{[0-9]+}}(%rsp), %xmm1<br>
+; CHECK-NEXT:    movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    pinsrw $0, {{[0-9]+}}(%rsp), %xmm1<br>
+; CHECK-NEXT:    movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    pinsrw $0, {{[0-9]+}}(%rsp), %xmm1<br>
+; CHECK-NEXT:    movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    pinsrw $0, {{[0-9]+}}(%rsp), %xmm1<br>
+; CHECK-NEXT:    movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    pinsrw $0, {{[0-9]+}}(%rsp), %xmm1<br>
+; CHECK-NEXT:    movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    pinsrw $0, {{[0-9]+}}(%rsp), %xmm1<br>
+; CHECK-NEXT:    movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    pinsrw $0, {{[0-9]+}}(%rsp), %xmm1<br>
+; CHECK-NEXT:    movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    pinsrw $0, {{[0-9]+}}(%rsp), %xmm1<br>
+; CHECK-NEXT:    movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    pinsrw $0, {{[0-9]+}}(%rsp), %xmm1<br>
+; CHECK-NEXT:    movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    pinsrw $0, {{[0-9]+}}(%rsp), %xmm1<br>
+; CHECK-NEXT:    movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    pinsrw $0, {{[0-9]+}}(%rsp), %xmm1<br>
+; CHECK-NEXT:    movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    pinsrw $0, {{[0-9]+}}(%rsp), %xmm1<br>
+; CHECK-NEXT:    movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    pinsrw $0, {{[0-9]+}}(%rsp), %xmm1<br>
+; CHECK-NEXT:    movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movzwl %bx, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
-; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 4-byte Reload<br>
-; CHECK-NEXT:    # xmm1 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
+; CHECK-NEXT:    movaps %xmm0, %xmm1<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
 ; CHECK-NEXT:    callq fmodf@PLT<br>
-; CHECK-NEXT:    callq __gnu_f2h_ieee@PLT<br>
-; CHECK-NEXT:    movw %ax, {{[-0-9]+}}(%r{{[sb]}}p) # 2-byte Spill<br>
-; CHECK-NEXT:    movl %r12d, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    callq __truncsfhf2@PLT<br>
+; CHECK-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movzwl %r14w, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
-; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 4-byte Reload<br>
-; CHECK-NEXT:    # xmm1 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
+; CHECK-NEXT:    movaps %xmm0, %xmm1<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
 ; CHECK-NEXT:    callq fmodf@PLT<br>
-; CHECK-NEXT:    callq __gnu_f2h_ieee@PLT<br>
-; CHECK-NEXT:    movw %ax, {{[-0-9]+}}(%r{{[sb]}}p) # 2-byte Spill<br>
-; CHECK-NEXT:    movl %r13d, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    callq __truncsfhf2@PLT<br>
+; CHECK-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movzwl {{[-0-9]+}}(%r{{[sb]}}p), %edi # 2-byte Folded Reload<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
-; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 4-byte Reload<br>
-; CHECK-NEXT:    # xmm1 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
+; CHECK-NEXT:    movaps %xmm0, %xmm1<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
 ; CHECK-NEXT:    callq fmodf@PLT<br>
-; CHECK-NEXT:    callq __gnu_f2h_ieee@PLT<br>
-; CHECK-NEXT:    movw %ax, {{[-0-9]+}}(%r{{[sb]}}p) # 2-byte Spill<br>
-; CHECK-NEXT:    movl %ebp, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    callq __truncsfhf2@PLT<br>
+; CHECK-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movzwl {{[-0-9]+}}(%r{{[sb]}}p), %edi # 2-byte Folded Reload<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
-; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 4-byte Reload<br>
-; CHECK-NEXT:    # xmm1 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
+; CHECK-NEXT:    movaps %xmm0, %xmm1<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
 ; CHECK-NEXT:    callq fmodf@PLT<br>
-; CHECK-NEXT:    callq __gnu_f2h_ieee@PLT<br>
-; CHECK-NEXT:    movw %ax, {{[-0-9]+}}(%r{{[sb]}}p) # 2-byte Spill<br>
-; CHECK-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %edi # 4-byte Reload<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    callq __truncsfhf2@PLT<br>
+; CHECK-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movzwl {{[-0-9]+}}(%r{{[sb]}}p), %edi # 2-byte Folded Reload<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
-; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 4-byte Reload<br>
-; CHECK-NEXT:    # xmm1 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
+; CHECK-NEXT:    movaps %xmm0, %xmm1<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
 ; CHECK-NEXT:    callq fmodf@PLT<br>
-; CHECK-NEXT:    callq __gnu_f2h_ieee@PLT<br>
-; CHECK-NEXT:    movw %ax, {{[-0-9]+}}(%r{{[sb]}}p) # 2-byte Spill<br>
-; CHECK-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %edi # 4-byte Reload<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    callq __truncsfhf2@PLT<br>
+; CHECK-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movzwl {{[-0-9]+}}(%r{{[sb]}}p), %edi # 2-byte Folded Reload<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
-; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 4-byte Reload<br>
-; CHECK-NEXT:    # xmm1 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
+; CHECK-NEXT:    movaps %xmm0, %xmm1<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
 ; CHECK-NEXT:    callq fmodf@PLT<br>
-; CHECK-NEXT:    callq __gnu_f2h_ieee@PLT<br>
-; CHECK-NEXT:    movw %ax, {{[-0-9]+}}(%r{{[sb]}}p) # 2-byte Spill<br>
-; CHECK-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %edi # 4-byte Reload<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    callq __truncsfhf2@PLT<br>
+; CHECK-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %edi # 4-byte Reload<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
-; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 4-byte Reload<br>
-; CHECK-NEXT:    # xmm1 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
+; CHECK-NEXT:    movaps %xmm0, %xmm1<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
 ; CHECK-NEXT:    callq fmodf@PLT<br>
-; CHECK-NEXT:    callq __gnu_f2h_ieee@PLT<br>
-; CHECK-NEXT:    movw %ax, {{[-0-9]+}}(%r{{[sb]}}p) # 2-byte Spill<br>
-; CHECK-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %edi # 4-byte Reload<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    callq __truncsfhf2@PLT<br>
+; CHECK-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %edi # 4-byte Reload<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
-; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 4-byte Reload<br>
-; CHECK-NEXT:    # xmm1 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
+; CHECK-NEXT:    movaps %xmm0, %xmm1<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
 ; CHECK-NEXT:    callq fmodf@PLT<br>
-; CHECK-NEXT:    callq __gnu_f2h_ieee@PLT<br>
-; CHECK-NEXT:    movw %ax, {{[-0-9]+}}(%r{{[sb]}}p) # 2-byte Spill<br>
-; CHECK-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %edi # 4-byte Reload<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    callq __truncsfhf2@PLT<br>
+; CHECK-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %edi # 4-byte Reload<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 4-byte Reload<br>
 ; CHECK-NEXT:    # xmm1 = mem[0],zero,zero,zero<br>
 ; CHECK-NEXT:    callq fmodf@PLT<br>
-; CHECK-NEXT:    callq __gnu_f2h_ieee@PLT<br>
-; CHECK-NEXT:    movw %ax, {{[-0-9]+}}(%r{{[sb]}}p) # 2-byte Spill<br>
-; CHECK-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %edi # 4-byte Reload<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    callq __truncsfhf2@PLT<br>
+; CHECK-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %edi # 4-byte Reload<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 4-byte Reload<br>
 ; CHECK-NEXT:    # xmm1 = mem[0],zero,zero,zero<br>
 ; CHECK-NEXT:    callq fmodf@PLT<br>
-; CHECK-NEXT:    callq __gnu_f2h_ieee@PLT<br>
-; CHECK-NEXT:    movw %ax, {{[-0-9]+}}(%r{{[sb]}}p) # 2-byte Spill<br>
-; CHECK-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %edi # 4-byte Reload<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    callq __truncsfhf2@PLT<br>
+; CHECK-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %edi # 4-byte Reload<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 4-byte Reload<br>
 ; CHECK-NEXT:    # xmm1 = mem[0],zero,zero,zero<br>
 ; CHECK-NEXT:    callq fmodf@PLT<br>
-; CHECK-NEXT:    callq __gnu_f2h_ieee@PLT<br>
-; CHECK-NEXT:    movw %ax, {{[-0-9]+}}(%r{{[sb]}}p) # 2-byte Spill<br>
-; CHECK-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %edi # 4-byte Reload<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    callq __truncsfhf2@PLT<br>
+; CHECK-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %edi # 4-byte Reload<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 4-byte Reload<br>
 ; CHECK-NEXT:    # xmm1 = mem[0],zero,zero,zero<br>
 ; CHECK-NEXT:    callq fmodf@PLT<br>
-; CHECK-NEXT:    callq __gnu_f2h_ieee@PLT<br>
-; CHECK-NEXT:    movw %ax, {{[-0-9]+}}(%r{{[sb]}}p) # 2-byte Spill<br>
-; CHECK-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %edi # 4-byte Reload<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    callq __truncsfhf2@PLT<br>
+; CHECK-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %edi # 4-byte Reload<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 4-byte Reload<br>
 ; CHECK-NEXT:    # xmm1 = mem[0],zero,zero,zero<br>
 ; CHECK-NEXT:    callq fmodf@PLT<br>
-; CHECK-NEXT:    callq __gnu_f2h_ieee@PLT<br>
-; CHECK-NEXT:    movw %ax, {{[-0-9]+}}(%r{{[sb]}}p) # 2-byte Spill<br>
-; CHECK-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %edi # 4-byte Reload<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    callq __truncsfhf2@PLT<br>
+; CHECK-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %edi # 4-byte Reload<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 4-byte Reload<br>
 ; CHECK-NEXT:    # xmm1 = mem[0],zero,zero,zero<br>
 ; CHECK-NEXT:    callq fmodf@PLT<br>
-; CHECK-NEXT:    callq __gnu_f2h_ieee@PLT<br>
-; CHECK-NEXT:    movw %ax, {{[-0-9]+}}(%r{{[sb]}}p) # 2-byte Spill<br>
-; CHECK-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %edi # 4-byte Reload<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    callq __truncsfhf2@PLT<br>
+; CHECK-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %edi # 4-byte Reload<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 4-byte Reload<br>
 ; CHECK-NEXT:    # xmm1 = mem[0],zero,zero,zero<br>
 ; CHECK-NEXT:    callq fmodf@PLT<br>
-; CHECK-NEXT:    callq __gnu_f2h_ieee@PLT<br>
-; CHECK-NEXT:    movw %ax, {{[-0-9]+}}(%r{{[sb]}}p) # 2-byte Spill<br>
-; CHECK-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %edi # 4-byte Reload<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    callq __truncsfhf2@PLT<br>
+; CHECK-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %edi # 4-byte Reload<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 4-byte Reload<br>
 ; CHECK-NEXT:    # xmm1 = mem[0],zero,zero,zero<br>
 ; CHECK-NEXT:    callq fmodf@PLT<br>
-; CHECK-NEXT:    callq __gnu_f2h_ieee@PLT<br>
-; CHECK-NEXT:    movw %ax, {{[-0-9]+}}(%r{{[sb]}}p) # 2-byte Spill<br>
-; CHECK-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %edi # 4-byte Reload<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    callq __truncsfhf2@PLT<br>
+; CHECK-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %edi # 4-byte Reload<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 4-byte Reload<br>
 ; CHECK-NEXT:    # xmm1 = mem[0],zero,zero,zero<br>
 ; CHECK-NEXT:    callq fmodf@PLT<br>
-; CHECK-NEXT:    callq __gnu_f2h_ieee@PLT<br>
-; CHECK-NEXT:    movw %ax, {{[-0-9]+}}(%r{{[sb]}}p) # 2-byte Spill<br>
-; CHECK-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %edi # 4-byte Reload<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    callq __truncsfhf2@PLT<br>
+; CHECK-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %edi # 4-byte Reload<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 4-byte Reload<br>
 ; CHECK-NEXT:    # xmm1 = mem[0],zero,zero,zero<br>
 ; CHECK-NEXT:    callq fmodf@PLT<br>
-; CHECK-NEXT:    callq __gnu_f2h_ieee@PLT<br>
-; CHECK-NEXT:    movw %ax, {{[-0-9]+}}(%r{{[sb]}}p) # 2-byte Spill<br>
-; CHECK-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %edi # 4-byte Reload<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    callq __truncsfhf2@PLT<br>
+; CHECK-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %edi # 4-byte Reload<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 4-byte Reload<br>
 ; CHECK-NEXT:    # xmm1 = mem[0],zero,zero,zero<br>
 ; CHECK-NEXT:    callq fmodf@PLT<br>
-; CHECK-NEXT:    callq __gnu_f2h_ieee@PLT<br>
-; CHECK-NEXT:    movw %ax, {{[-0-9]+}}(%r{{[sb]}}p) # 2-byte Spill<br>
-; CHECK-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %edi # 4-byte Reload<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    callq __truncsfhf2@PLT<br>
+; CHECK-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %edi # 4-byte Reload<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 4-byte Reload<br>
 ; CHECK-NEXT:    # xmm1 = mem[0],zero,zero,zero<br>
 ; CHECK-NEXT:    callq fmodf@PLT<br>
-; CHECK-NEXT:    callq __gnu_f2h_ieee@PLT<br>
-; CHECK-NEXT:    movw %ax, {{[-0-9]+}}(%r{{[sb]}}p) # 2-byte Spill<br>
-; CHECK-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %edi # 4-byte Reload<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    callq __truncsfhf2@PLT<br>
+; CHECK-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %edi # 4-byte Reload<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 4-byte Reload<br>
 ; CHECK-NEXT:    # xmm1 = mem[0],zero,zero,zero<br>
 ; CHECK-NEXT:    callq fmodf@PLT<br>
-; CHECK-NEXT:    callq __gnu_f2h_ieee@PLT<br>
-; CHECK-NEXT:    movw %ax, {{[-0-9]+}}(%r{{[sb]}}p) # 2-byte Spill<br>
-; CHECK-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %edi # 4-byte Reload<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    callq __truncsfhf2@PLT<br>
+; CHECK-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %edi # 4-byte Reload<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 4-byte Reload<br>
 ; CHECK-NEXT:    # xmm1 = mem[0],zero,zero,zero<br>
 ; CHECK-NEXT:    callq fmodf@PLT<br>
-; CHECK-NEXT:    callq __gnu_f2h_ieee@PLT<br>
-; CHECK-NEXT:    movw %ax, {{[-0-9]+}}(%r{{[sb]}}p) # 2-byte Spill<br>
-; CHECK-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %edi # 4-byte Reload<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    callq __truncsfhf2@PLT<br>
+; CHECK-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %edi # 4-byte Reload<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 4-byte Reload<br>
 ; CHECK-NEXT:    # xmm1 = mem[0],zero,zero,zero<br>
 ; CHECK-NEXT:    callq fmodf@PLT<br>
-; CHECK-NEXT:    callq __gnu_f2h_ieee@PLT<br>
-; CHECK-NEXT:    movw %ax, {{[-0-9]+}}(%r{{[sb]}}p) # 2-byte Spill<br>
-; CHECK-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %edi # 4-byte Reload<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    callq __truncsfhf2@PLT<br>
+; CHECK-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %edi # 4-byte Reload<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 4-byte Reload<br>
 ; CHECK-NEXT:    # xmm1 = mem[0],zero,zero,zero<br>
 ; CHECK-NEXT:    callq fmodf@PLT<br>
-; CHECK-NEXT:    callq __gnu_f2h_ieee@PLT<br>
-; CHECK-NEXT:    movw %ax, {{[-0-9]+}}(%r{{[sb]}}p) # 2-byte Spill<br>
-; CHECK-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %edi # 4-byte Reload<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    callq __truncsfhf2@PLT<br>
+; CHECK-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %edi # 4-byte Reload<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 4-byte Reload<br>
 ; CHECK-NEXT:    # xmm1 = mem[0],zero,zero,zero<br>
 ; CHECK-NEXT:    callq fmodf@PLT<br>
-; CHECK-NEXT:    callq __gnu_f2h_ieee@PLT<br>
-; CHECK-NEXT:    movw %ax, {{[-0-9]+}}(%r{{[sb]}}p) # 2-byte Spill<br>
-; CHECK-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %edi # 4-byte Reload<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    callq __truncsfhf2@PLT<br>
+; CHECK-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %edi # 4-byte Reload<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 4-byte Reload<br>
 ; CHECK-NEXT:    # xmm1 = mem[0],zero,zero,zero<br>
 ; CHECK-NEXT:    callq fmodf@PLT<br>
-; CHECK-NEXT:    callq __gnu_f2h_ieee@PLT<br>
-; CHECK-NEXT:    movw %ax, {{[-0-9]+}}(%r{{[sb]}}p) # 2-byte Spill<br>
-; CHECK-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %edi # 4-byte Reload<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    callq __truncsfhf2@PLT<br>
+; CHECK-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %edi # 4-byte Reload<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 4-byte Reload<br>
 ; CHECK-NEXT:    # xmm1 = mem[0],zero,zero,zero<br>
 ; CHECK-NEXT:    callq fmodf@PLT<br>
-; CHECK-NEXT:    callq __gnu_f2h_ieee@PLT<br>
-; CHECK-NEXT:    movl %eax, %ebp<br>
-; CHECK-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %edi # 4-byte Reload<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    callq __truncsfhf2@PLT<br>
+; CHECK-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %edi # 4-byte Reload<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 4-byte Reload<br>
 ; CHECK-NEXT:    # xmm1 = mem[0],zero,zero,zero<br>
 ; CHECK-NEXT:    callq fmodf@PLT<br>
-; CHECK-NEXT:    callq __gnu_f2h_ieee@PLT<br>
-; CHECK-NEXT:    movl %eax, %r14d<br>
-; CHECK-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %edi # 4-byte Reload<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    callq __truncsfhf2@PLT<br>
+; CHECK-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %edi # 4-byte Reload<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 4-byte Reload<br>
 ; CHECK-NEXT:    # xmm1 = mem[0],zero,zero,zero<br>
 ; CHECK-NEXT:    callq fmodf@PLT<br>
-; CHECK-NEXT:    callq __gnu_f2h_ieee@PLT<br>
-; CHECK-NEXT:    movl %eax, %r12d<br>
-; CHECK-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %edi # 4-byte Reload<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    callq __truncsfhf2@PLT<br>
+; CHECK-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %edi # 4-byte Reload<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 4-byte Reload<br>
 ; CHECK-NEXT:    # xmm1 = mem[0],zero,zero,zero<br>
 ; CHECK-NEXT:    callq fmodf@PLT<br>
-; CHECK-NEXT:    callq __gnu_f2h_ieee@PLT<br>
-; CHECK-NEXT:    movl %eax, %r13d<br>
-; CHECK-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %edi # 4-byte Reload<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    callq __truncsfhf2@PLT<br>
+; CHECK-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %edi # 4-byte Reload<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 4-byte Reload<br>
 ; CHECK-NEXT:    # xmm1 = mem[0],zero,zero,zero<br>
 ; CHECK-NEXT:    callq fmodf@PLT<br>
-; CHECK-NEXT:    callq __gnu_f2h_ieee@PLT<br>
-; CHECK-NEXT:    movl %eax, %ebx<br>
-; CHECK-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %edi # 4-byte Reload<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    callq __truncsfhf2@PLT<br>
+; CHECK-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %edi # 4-byte Reload<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 4-byte Reload<br>
 ; CHECK-NEXT:    # xmm1 = mem[0],zero,zero,zero<br>
 ; CHECK-NEXT:    callq fmodf@PLT<br>
-; CHECK-NEXT:    callq __gnu_f2h_ieee@PLT<br>
-; CHECK-NEXT:    movw %ax, 62(%r15)<br>
-; CHECK-NEXT:    movw %bx, 60(%r15)<br>
-; CHECK-NEXT:    movw %r13w, 58(%r15)<br>
-; CHECK-NEXT:    movw %r12w, 56(%r15)<br>
-; CHECK-NEXT:    movw %r14w, 54(%r15)<br>
-; CHECK-NEXT:    movw %bp, 52(%r15)<br>
-; CHECK-NEXT:    movzwl {{[-0-9]+}}(%r{{[sb]}}p), %eax # 2-byte Folded Reload<br>
-; CHECK-NEXT:    movw %ax, 50(%r15)<br>
-; CHECK-NEXT:    movzwl {{[-0-9]+}}(%r{{[sb]}}p), %eax # 2-byte Folded Reload<br>
-; CHECK-NEXT:    movw %ax, 48(%r15)<br>
-; CHECK-NEXT:    movzwl {{[-0-9]+}}(%r{{[sb]}}p), %eax # 2-byte Folded Reload<br>
-; CHECK-NEXT:    movw %ax, 46(%r15)<br>
-; CHECK-NEXT:    movzwl {{[-0-9]+}}(%r{{[sb]}}p), %eax # 2-byte Folded Reload<br>
-; CHECK-NEXT:    movw %ax, 44(%r15)<br>
-; CHECK-NEXT:    movzwl {{[-0-9]+}}(%r{{[sb]}}p), %eax # 2-byte Folded Reload<br>
-; CHECK-NEXT:    movw %ax, 42(%r15)<br>
-; CHECK-NEXT:    movzwl {{[-0-9]+}}(%r{{[sb]}}p), %eax # 2-byte Folded Reload<br>
-; CHECK-NEXT:    movw %ax, 40(%r15)<br>
-; CHECK-NEXT:    movzwl {{[-0-9]+}}(%r{{[sb]}}p), %eax # 2-byte Folded Reload<br>
-; CHECK-NEXT:    movw %ax, 38(%r15)<br>
-; CHECK-NEXT:    movzwl {{[-0-9]+}}(%r{{[sb]}}p), %eax # 2-byte Folded Reload<br>
-; CHECK-NEXT:    movw %ax, 36(%r15)<br>
-; CHECK-NEXT:    movzwl {{[-0-9]+}}(%r{{[sb]}}p), %eax # 2-byte Folded Reload<br>
-; CHECK-NEXT:    movw %ax, 34(%r15)<br>
-; CHECK-NEXT:    movzwl {{[-0-9]+}}(%r{{[sb]}}p), %eax # 2-byte Folded Reload<br>
-; CHECK-NEXT:    movw %ax, 32(%r15)<br>
-; CHECK-NEXT:    movzwl {{[-0-9]+}}(%r{{[sb]}}p), %eax # 2-byte Folded Reload<br>
-; CHECK-NEXT:    movw %ax, 30(%r15)<br>
-; CHECK-NEXT:    movzwl {{[-0-9]+}}(%r{{[sb]}}p), %eax # 2-byte Folded Reload<br>
-; CHECK-NEXT:    movw %ax, 28(%r15)<br>
-; CHECK-NEXT:    movzwl {{[-0-9]+}}(%r{{[sb]}}p), %eax # 2-byte Folded Reload<br>
-; CHECK-NEXT:    movw %ax, 26(%r15)<br>
-; CHECK-NEXT:    movzwl {{[-0-9]+}}(%r{{[sb]}}p), %eax # 2-byte Folded Reload<br>
-; CHECK-NEXT:    movw %ax, 24(%r15)<br>
-; CHECK-NEXT:    movzwl {{[-0-9]+}}(%r{{[sb]}}p), %eax # 2-byte Folded Reload<br>
-; CHECK-NEXT:    movw %ax, 22(%r15)<br>
-; CHECK-NEXT:    movzwl {{[-0-9]+}}(%r{{[sb]}}p), %eax # 2-byte Folded Reload<br>
-; CHECK-NEXT:    movw %ax, 20(%r15)<br>
-; CHECK-NEXT:    movzwl {{[-0-9]+}}(%r{{[sb]}}p), %eax # 2-byte Folded Reload<br>
-; CHECK-NEXT:    movw %ax, 18(%r15)<br>
-; CHECK-NEXT:    movzwl {{[-0-9]+}}(%r{{[sb]}}p), %eax # 2-byte Folded Reload<br>
-; CHECK-NEXT:    movw %ax, 16(%r15)<br>
-; CHECK-NEXT:    movzwl {{[-0-9]+}}(%r{{[sb]}}p), %eax # 2-byte Folded Reload<br>
-; CHECK-NEXT:    movw %ax, 14(%r15)<br>
-; CHECK-NEXT:    movzwl {{[-0-9]+}}(%r{{[sb]}}p), %eax # 2-byte Folded Reload<br>
-; CHECK-NEXT:    movw %ax, 12(%r15)<br>
-; CHECK-NEXT:    movzwl {{[-0-9]+}}(%r{{[sb]}}p), %eax # 2-byte Folded Reload<br>
-; CHECK-NEXT:    movw %ax, 10(%r15)<br>
-; CHECK-NEXT:    movzwl {{[-0-9]+}}(%r{{[sb]}}p), %eax # 2-byte Folded Reload<br>
-; CHECK-NEXT:    movw %ax, 8(%r15)<br>
-; CHECK-NEXT:    movzwl {{[-0-9]+}}(%r{{[sb]}}p), %eax # 2-byte Folded Reload<br>
-; CHECK-NEXT:    movw %ax, 6(%r15)<br>
-; CHECK-NEXT:    movzwl {{[-0-9]+}}(%r{{[sb]}}p), %eax # 2-byte Folded Reload<br>
-; CHECK-NEXT:    movw %ax, 4(%r15)<br>
-; CHECK-NEXT:    movzwl {{[-0-9]+}}(%r{{[sb]}}p), %eax # 2-byte Folded Reload<br>
-; CHECK-NEXT:    movw %ax, 2(%r15)<br>
-; CHECK-NEXT:    movzwl {{[-0-9]+}}(%r{{[sb]}}p), %eax # 2-byte Folded Reload<br>
-; CHECK-NEXT:    movw %ax, (%r15)<br>
-; CHECK-NEXT:    addq $248, %rsp<br>
+; CHECK-NEXT:    callq __truncsfhf2@PLT<br>
+; CHECK-NEXT:    pextrw $0, %xmm0, %eax<br>
+; CHECK-NEXT:    movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-NEXT:    pextrw $0, %xmm0, %eax<br>
+; CHECK-NEXT:    movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-NEXT:    pextrw $0, %xmm0, %eax<br>
+; CHECK-NEXT:    movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-NEXT:    pextrw $0, %xmm0, %esi<br>
+; CHECK-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-NEXT:    pextrw $0, %xmm0, %edi<br>
+; CHECK-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-NEXT:    pextrw $0, %xmm0, %eax<br>
+; CHECK-NEXT:    movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-NEXT:    pextrw $0, %xmm0, %ecx<br>
+; CHECK-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-NEXT:    pextrw $0, %xmm0, %edx<br>
+; CHECK-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-NEXT:    pextrw $0, %xmm0, %r11d<br>
+; CHECK-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-NEXT:    pextrw $0, %xmm0, %ebp<br>
+; CHECK-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-NEXT:    pextrw $0, %xmm0, %r14d<br>
+; CHECK-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-NEXT:    pextrw $0, %xmm0, %r15d<br>
+; CHECK-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-NEXT:    pextrw $0, %xmm0, %r12d<br>
+; CHECK-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-NEXT:    pextrw $0, %xmm0, %r13d<br>
+; CHECK-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-NEXT:    pextrw $0, %xmm0, %r8d<br>
+; CHECK-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-NEXT:    pextrw $0, %xmm0, %r9d<br>
+; CHECK-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %r10d # 4-byte Reload<br>
+; CHECK-NEXT:    movw %r10w, 62(%rbx)<br>
+; CHECK-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %eax # 4-byte Reload<br>
+; CHECK-NEXT:    movw %ax, 60(%rbx)<br>
+; CHECK-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %eax # 4-byte Reload<br>
+; CHECK-NEXT:    movw %ax, 58(%rbx)<br>
+; CHECK-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-NEXT:    pextrw $0, %xmm0, %r10d<br>
+; CHECK-NEXT:    movw %si, 56(%rbx)<br>
+; CHECK-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-NEXT:    pextrw $0, %xmm0, %esi<br>
+; CHECK-NEXT:    movw %di, 54(%rbx)<br>
+; CHECK-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-NEXT:    pextrw $0, %xmm0, %edi<br>
+; CHECK-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %eax # 4-byte Reload<br>
+; CHECK-NEXT:    movw %ax, 52(%rbx)<br>
+; CHECK-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-NEXT:    pextrw $0, %xmm0, %eax<br>
+; CHECK-NEXT:    movw %cx, 50(%rbx)<br>
+; CHECK-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-NEXT:    pextrw $0, %xmm0, %ecx<br>
+; CHECK-NEXT:    movw %dx, 48(%rbx)<br>
+; CHECK-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-NEXT:    pextrw $0, %xmm0, %edx<br>
+; CHECK-NEXT:    movw %r11w, 46(%rbx)<br>
+; CHECK-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-NEXT:    pextrw $0, %xmm0, %r11d<br>
+; CHECK-NEXT:    movw %bp, 44(%rbx)<br>
+; CHECK-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-NEXT:    pextrw $0, %xmm0, %ebp<br>
+; CHECK-NEXT:    movw %r14w, 42(%rbx)<br>
+; CHECK-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-NEXT:    pextrw $0, %xmm0, %r14d<br>
+; CHECK-NEXT:    movw %r15w, 40(%rbx)<br>
+; CHECK-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-NEXT:    pextrw $0, %xmm0, %r15d<br>
+; CHECK-NEXT:    movw %r12w, 38(%rbx)<br>
+; CHECK-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-NEXT:    pextrw $0, %xmm0, %r12d<br>
+; CHECK-NEXT:    movw %r13w, 36(%rbx)<br>
+; CHECK-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-NEXT:    pextrw $0, %xmm0, %r13d<br>
+; CHECK-NEXT:    movw %r8w, 34(%rbx)<br>
+; CHECK-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-NEXT:    pextrw $0, %xmm0, %r8d<br>
+; CHECK-NEXT:    movw %r9w, 32(%rbx)<br>
+; CHECK-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-NEXT:    pextrw $0, %xmm0, %r9d<br>
+; CHECK-NEXT:    movw %r10w, 30(%rbx)<br>
+; CHECK-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-NEXT:    pextrw $0, %xmm0, %r10d<br>
+; CHECK-NEXT:    movw %si, 28(%rbx)<br>
+; CHECK-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-NEXT:    pextrw $0, %xmm0, %esi<br>
+; CHECK-NEXT:    movw %di, 26(%rbx)<br>
+; CHECK-NEXT:    movw %ax, 24(%rbx)<br>
+; CHECK-NEXT:    movw %cx, 22(%rbx)<br>
+; CHECK-NEXT:    movw %dx, 20(%rbx)<br>
+; CHECK-NEXT:    movw %r11w, 18(%rbx)<br>
+; CHECK-NEXT:    movw %bp, 16(%rbx)<br>
+; CHECK-NEXT:    movw %r14w, 14(%rbx)<br>
+; CHECK-NEXT:    movw %r15w, 12(%rbx)<br>
+; CHECK-NEXT:    movw %r12w, 10(%rbx)<br>
+; CHECK-NEXT:    movw %r13w, 8(%rbx)<br>
+; CHECK-NEXT:    movw %r8w, 6(%rbx)<br>
+; CHECK-NEXT:    movw %r9w, 4(%rbx)<br>
+; CHECK-NEXT:    movw %r10w, 2(%rbx)<br>
+; CHECK-NEXT:    movw %si, (%rbx)<br>
+; CHECK-NEXT:    addq $1032, %rsp # imm = 0x408<br>
 ; CHECK-NEXT:    popq %rbx<br>
 ; CHECK-NEXT:    popq %r12<br>
 ; CHECK-NEXT:    popq %r13<br>
@@ -1013,259 +1074,286 @@ define void @frem_v32f16(<32 x half> %a0, <32 x half> %a1, <32 x half> *%p3) nou<br>
 define void @frem_v16f16(<16 x half> %a0, <16 x half> %a1, <16 x half> *%p3) nounwind {<br>
 ; CHECK-LABEL: frem_v16f16:<br>
 ; CHECK:       # %bb.0:<br>
-; CHECK-NEXT:    pushq %rbp<br>
-; CHECK-NEXT:    pushq %r15<br>
-; CHECK-NEXT:    pushq %r14<br>
-; CHECK-NEXT:    pushq %r13<br>
-; CHECK-NEXT:    pushq %r12<br>
 ; CHECK-NEXT:    pushq %rbx<br>
-; CHECK-NEXT:    subq $120, %rsp<br>
-; CHECK-NEXT:    movl %r9d, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movl %r8d, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movl %ecx, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movl %edx, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movl %esi, %r15d<br>
-; CHECK-NEXT:    movl %edi, %r14d<br>
-; CHECK-NEXT:    movq {{[0-9]+}}(%rsp), %rbp<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%rsp), %eax<br>
-; CHECK-NEXT:    movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%rsp), %eax<br>
-; CHECK-NEXT:    movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%rsp), %eax<br>
-; CHECK-NEXT:    movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%rsp), %eax<br>
-; CHECK-NEXT:    movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%rsp), %eax<br>
-; CHECK-NEXT:    movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%rsp), %eax<br>
-; CHECK-NEXT:    movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%rsp), %eax<br>
-; CHECK-NEXT:    movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%rsp), %eax<br>
-; CHECK-NEXT:    movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%rsp), %eax<br>
-; CHECK-NEXT:    movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%rsp), %eax<br>
-; CHECK-NEXT:    movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%rsp), %eax<br>
-; CHECK-NEXT:    movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%rsp), %eax<br>
-; CHECK-NEXT:    movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%rsp), %eax<br>
-; CHECK-NEXT:    movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%rsp), %eax<br>
-; CHECK-NEXT:    movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%rsp), %eax<br>
-; CHECK-NEXT:    movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%rsp), %eax<br>
-; CHECK-NEXT:    movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%rsp), %eax<br>
-; CHECK-NEXT:    movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%rsp), %eax<br>
-; CHECK-NEXT:    movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%rsp), %eax<br>
-; CHECK-NEXT:    movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%rsp), %eax<br>
-; CHECK-NEXT:    movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%rsp), %eax<br>
-; CHECK-NEXT:    movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%rsp), %eax<br>
-; CHECK-NEXT:    movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%rsp), %r13d<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%rsp), %r12d<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%rsp), %ebx<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%rsp), %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    subq $512, %rsp # imm = 0x200<br>
+; CHECK-NEXT:    movq %rdi, %rbx<br>
+; CHECK-NEXT:    movss %xmm7, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movss %xmm6, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movss %xmm5, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movss %xmm4, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movss %xmm3, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movss %xmm2, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movd %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Folded Spill<br>
+; CHECK-NEXT:    pinsrw $0, {{[0-9]+}}(%rsp), %xmm1<br>
+; CHECK-NEXT:    movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    pinsrw $0, {{[0-9]+}}(%rsp), %xmm1<br>
+; CHECK-NEXT:    movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    pinsrw $0, {{[0-9]+}}(%rsp), %xmm1<br>
+; CHECK-NEXT:    movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    pinsrw $0, {{[0-9]+}}(%rsp), %xmm1<br>
+; CHECK-NEXT:    movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    pinsrw $0, {{[0-9]+}}(%rsp), %xmm1<br>
+; CHECK-NEXT:    movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    pinsrw $0, {{[0-9]+}}(%rsp), %xmm1<br>
+; CHECK-NEXT:    movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    pinsrw $0, {{[0-9]+}}(%rsp), %xmm1<br>
+; CHECK-NEXT:    movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    pinsrw $0, {{[0-9]+}}(%rsp), %xmm1<br>
+; CHECK-NEXT:    movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    pinsrw $0, {{[0-9]+}}(%rsp), %xmm1<br>
+; CHECK-NEXT:    movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    pinsrw $0, {{[0-9]+}}(%rsp), %xmm1<br>
+; CHECK-NEXT:    movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    pinsrw $0, {{[0-9]+}}(%rsp), %xmm1<br>
+; CHECK-NEXT:    movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    pinsrw $0, {{[0-9]+}}(%rsp), %xmm1<br>
+; CHECK-NEXT:    movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    pinsrw $0, {{[0-9]+}}(%rsp), %xmm1<br>
+; CHECK-NEXT:    movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    pinsrw $0, {{[0-9]+}}(%rsp), %xmm1<br>
+; CHECK-NEXT:    movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    pinsrw $0, {{[0-9]+}}(%rsp), %xmm1<br>
+; CHECK-NEXT:    movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    pinsrw $0, {{[0-9]+}}(%rsp), %xmm1<br>
+; CHECK-NEXT:    movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    pinsrw $0, {{[0-9]+}}(%rsp), %xmm1<br>
+; CHECK-NEXT:    movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    pinsrw $0, {{[0-9]+}}(%rsp), %xmm1<br>
+; CHECK-NEXT:    movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    pinsrw $0, {{[0-9]+}}(%rsp), %xmm1<br>
+; CHECK-NEXT:    movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    pinsrw $0, {{[0-9]+}}(%rsp), %xmm1<br>
+; CHECK-NEXT:    movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    pinsrw $0, {{[0-9]+}}(%rsp), %xmm1<br>
+; CHECK-NEXT:    movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    pinsrw $0, {{[0-9]+}}(%rsp), %xmm1<br>
+; CHECK-NEXT:    movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    pinsrw $0, {{[0-9]+}}(%rsp), %xmm1<br>
+; CHECK-NEXT:    movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    pinsrw $0, {{[0-9]+}}(%rsp), %xmm1<br>
+; CHECK-NEXT:    movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movzwl %r14w, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
-; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 4-byte Reload<br>
-; CHECK-NEXT:    # xmm1 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
+; CHECK-NEXT:    movaps %xmm0, %xmm1<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
 ; CHECK-NEXT:    callq fmodf@PLT<br>
-; CHECK-NEXT:    callq __gnu_f2h_ieee@PLT<br>
-; CHECK-NEXT:    movw %ax, {{[-0-9]+}}(%r{{[sb]}}p) # 2-byte Spill<br>
-; CHECK-NEXT:    movl %ebx, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    callq __truncsfhf2@PLT<br>
+; CHECK-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movzwl %r15w, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
-; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 4-byte Reload<br>
-; CHECK-NEXT:    # xmm1 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
+; CHECK-NEXT:    movaps %xmm0, %xmm1<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
 ; CHECK-NEXT:    callq fmodf@PLT<br>
-; CHECK-NEXT:    callq __gnu_f2h_ieee@PLT<br>
-; CHECK-NEXT:    movw %ax, {{[-0-9]+}}(%r{{[sb]}}p) # 2-byte Spill<br>
-; CHECK-NEXT:    movl %r12d, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    callq __truncsfhf2@PLT<br>
+; CHECK-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movzwl {{[-0-9]+}}(%r{{[sb]}}p), %edi # 2-byte Folded Reload<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
-; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 4-byte Reload<br>
-; CHECK-NEXT:    # xmm1 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
+; CHECK-NEXT:    movaps %xmm0, %xmm1<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
 ; CHECK-NEXT:    callq fmodf@PLT<br>
-; CHECK-NEXT:    callq __gnu_f2h_ieee@PLT<br>
-; CHECK-NEXT:    movw %ax, {{[-0-9]+}}(%r{{[sb]}}p) # 2-byte Spill<br>
-; CHECK-NEXT:    movl %r13d, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    callq __truncsfhf2@PLT<br>
+; CHECK-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movzwl {{[-0-9]+}}(%r{{[sb]}}p), %edi # 2-byte Folded Reload<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
-; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 4-byte Reload<br>
-; CHECK-NEXT:    # xmm1 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
+; CHECK-NEXT:    movaps %xmm0, %xmm1<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
 ; CHECK-NEXT:    callq fmodf@PLT<br>
-; CHECK-NEXT:    callq __gnu_f2h_ieee@PLT<br>
-; CHECK-NEXT:    movw %ax, {{[-0-9]+}}(%r{{[sb]}}p) # 2-byte Spill<br>
-; CHECK-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %edi # 4-byte Reload<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    callq __truncsfhf2@PLT<br>
+; CHECK-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movzwl {{[-0-9]+}}(%r{{[sb]}}p), %edi # 2-byte Folded Reload<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
-; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 4-byte Reload<br>
-; CHECK-NEXT:    # xmm1 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
+; CHECK-NEXT:    movaps %xmm0, %xmm1<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
 ; CHECK-NEXT:    callq fmodf@PLT<br>
-; CHECK-NEXT:    callq __gnu_f2h_ieee@PLT<br>
-; CHECK-NEXT:    movw %ax, {{[-0-9]+}}(%r{{[sb]}}p) # 2-byte Spill<br>
-; CHECK-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %edi # 4-byte Reload<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    callq __truncsfhf2@PLT<br>
+; CHECK-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movzwl {{[-0-9]+}}(%r{{[sb]}}p), %edi # 2-byte Folded Reload<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
-; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 4-byte Reload<br>
-; CHECK-NEXT:    # xmm1 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
+; CHECK-NEXT:    movaps %xmm0, %xmm1<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
 ; CHECK-NEXT:    callq fmodf@PLT<br>
-; CHECK-NEXT:    callq __gnu_f2h_ieee@PLT<br>
-; CHECK-NEXT:    movw %ax, {{[-0-9]+}}(%r{{[sb]}}p) # 2-byte Spill<br>
-; CHECK-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %edi # 4-byte Reload<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    callq __truncsfhf2@PLT<br>
+; CHECK-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %edi # 4-byte Reload<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
-; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 4-byte Reload<br>
-; CHECK-NEXT:    # xmm1 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
+; CHECK-NEXT:    movaps %xmm0, %xmm1<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
 ; CHECK-NEXT:    callq fmodf@PLT<br>
-; CHECK-NEXT:    callq __gnu_f2h_ieee@PLT<br>
-; CHECK-NEXT:    movw %ax, {{[-0-9]+}}(%r{{[sb]}}p) # 2-byte Spill<br>
-; CHECK-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %edi # 4-byte Reload<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    callq __truncsfhf2@PLT<br>
+; CHECK-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %edi # 4-byte Reload<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
-; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 4-byte Reload<br>
-; CHECK-NEXT:    # xmm1 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
+; CHECK-NEXT:    movaps %xmm0, %xmm1<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
 ; CHECK-NEXT:    callq fmodf@PLT<br>
-; CHECK-NEXT:    callq __gnu_f2h_ieee@PLT<br>
-; CHECK-NEXT:    movw %ax, {{[-0-9]+}}(%r{{[sb]}}p) # 2-byte Spill<br>
-; CHECK-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %edi # 4-byte Reload<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    callq __truncsfhf2@PLT<br>
+; CHECK-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %edi # 4-byte Reload<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 4-byte Reload<br>
 ; CHECK-NEXT:    # xmm1 = mem[0],zero,zero,zero<br>
 ; CHECK-NEXT:    callq fmodf@PLT<br>
-; CHECK-NEXT:    callq __gnu_f2h_ieee@PLT<br>
-; CHECK-NEXT:    movw %ax, {{[-0-9]+}}(%r{{[sb]}}p) # 2-byte Spill<br>
-; CHECK-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %edi # 4-byte Reload<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    callq __truncsfhf2@PLT<br>
+; CHECK-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %edi # 4-byte Reload<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 4-byte Reload<br>
 ; CHECK-NEXT:    # xmm1 = mem[0],zero,zero,zero<br>
 ; CHECK-NEXT:    callq fmodf@PLT<br>
-; CHECK-NEXT:    callq __gnu_f2h_ieee@PLT<br>
-; CHECK-NEXT:    movw %ax, {{[-0-9]+}}(%r{{[sb]}}p) # 2-byte Spill<br>
-; CHECK-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %edi # 4-byte Reload<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    callq __truncsfhf2@PLT<br>
+; CHECK-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %edi # 4-byte Reload<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 4-byte Reload<br>
 ; CHECK-NEXT:    # xmm1 = mem[0],zero,zero,zero<br>
 ; CHECK-NEXT:    callq fmodf@PLT<br>
-; CHECK-NEXT:    callq __gnu_f2h_ieee@PLT<br>
-; CHECK-NEXT:    movl %eax, %r13d<br>
-; CHECK-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %edi # 4-byte Reload<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    callq __truncsfhf2@PLT<br>
+; CHECK-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %edi # 4-byte Reload<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 4-byte Reload<br>
 ; CHECK-NEXT:    # xmm1 = mem[0],zero,zero,zero<br>
 ; CHECK-NEXT:    callq fmodf@PLT<br>
-; CHECK-NEXT:    callq __gnu_f2h_ieee@PLT<br>
-; CHECK-NEXT:    movl %eax, %r12d<br>
-; CHECK-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %edi # 4-byte Reload<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    callq __truncsfhf2@PLT<br>
+; CHECK-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %edi # 4-byte Reload<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 4-byte Reload<br>
 ; CHECK-NEXT:    # xmm1 = mem[0],zero,zero,zero<br>
 ; CHECK-NEXT:    callq fmodf@PLT<br>
-; CHECK-NEXT:    callq __gnu_f2h_ieee@PLT<br>
-; CHECK-NEXT:    movl %eax, %ebx<br>
-; CHECK-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %edi # 4-byte Reload<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    callq __truncsfhf2@PLT<br>
+; CHECK-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %edi # 4-byte Reload<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 4-byte Reload<br>
 ; CHECK-NEXT:    # xmm1 = mem[0],zero,zero,zero<br>
 ; CHECK-NEXT:    callq fmodf@PLT<br>
-; CHECK-NEXT:    callq __gnu_f2h_ieee@PLT<br>
-; CHECK-NEXT:    movl %eax, %r14d<br>
-; CHECK-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %edi # 4-byte Reload<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    callq __truncsfhf2@PLT<br>
+; CHECK-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %edi # 4-byte Reload<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 4-byte Reload<br>
 ; CHECK-NEXT:    # xmm1 = mem[0],zero,zero,zero<br>
 ; CHECK-NEXT:    callq fmodf@PLT<br>
-; CHECK-NEXT:    callq __gnu_f2h_ieee@PLT<br>
-; CHECK-NEXT:    movl %eax, %r15d<br>
-; CHECK-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %edi # 4-byte Reload<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    callq __truncsfhf2@PLT<br>
+; CHECK-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %edi # 4-byte Reload<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 4-byte Reload<br>
 ; CHECK-NEXT:    # xmm1 = mem[0],zero,zero,zero<br>
 ; CHECK-NEXT:    callq fmodf@PLT<br>
-; CHECK-NEXT:    callq __gnu_f2h_ieee@PLT<br>
-; CHECK-NEXT:    movw %ax, 30(%rbp)<br>
-; CHECK-NEXT:    movw %r15w, 28(%rbp)<br>
-; CHECK-NEXT:    movw %r14w, 26(%rbp)<br>
-; CHECK-NEXT:    movw %bx, 24(%rbp)<br>
-; CHECK-NEXT:    movw %r12w, 22(%rbp)<br>
-; CHECK-NEXT:    movw %r13w, 20(%rbp)<br>
-; CHECK-NEXT:    movzwl {{[-0-9]+}}(%r{{[sb]}}p), %eax # 2-byte Folded Reload<br>
-; CHECK-NEXT:    movw %ax, 18(%rbp)<br>
-; CHECK-NEXT:    movzwl {{[-0-9]+}}(%r{{[sb]}}p), %eax # 2-byte Folded Reload<br>
-; CHECK-NEXT:    movw %ax, 16(%rbp)<br>
-; CHECK-NEXT:    movzwl {{[-0-9]+}}(%r{{[sb]}}p), %eax # 2-byte Folded Reload<br>
-; CHECK-NEXT:    movw %ax, 14(%rbp)<br>
-; CHECK-NEXT:    movzwl {{[-0-9]+}}(%r{{[sb]}}p), %eax # 2-byte Folded Reload<br>
-; CHECK-NEXT:    movw %ax, 12(%rbp)<br>
-; CHECK-NEXT:    movzwl {{[-0-9]+}}(%r{{[sb]}}p), %eax # 2-byte Folded Reload<br>
-; CHECK-NEXT:    movw %ax, 10(%rbp)<br>
-; CHECK-NEXT:    movzwl {{[-0-9]+}}(%r{{[sb]}}p), %eax # 2-byte Folded Reload<br>
-; CHECK-NEXT:    movw %ax, 8(%rbp)<br>
-; CHECK-NEXT:    movzwl {{[-0-9]+}}(%r{{[sb]}}p), %eax # 2-byte Folded Reload<br>
-; CHECK-NEXT:    movw %ax, 6(%rbp)<br>
-; CHECK-NEXT:    movzwl {{[-0-9]+}}(%r{{[sb]}}p), %eax # 2-byte Folded Reload<br>
-; CHECK-NEXT:    movw %ax, 4(%rbp)<br>
-; CHECK-NEXT:    movzwl {{[-0-9]+}}(%r{{[sb]}}p), %eax # 2-byte Folded Reload<br>
-; CHECK-NEXT:    movw %ax, 2(%rbp)<br>
-; CHECK-NEXT:    movzwl {{[-0-9]+}}(%r{{[sb]}}p), %eax # 2-byte Folded Reload<br>
-; CHECK-NEXT:    movw %ax, (%rbp)<br>
-; CHECK-NEXT:    addq $120, %rsp<br>
+; CHECK-NEXT:    callq __truncsfhf2@PLT<br>
+; CHECK-NEXT:    pextrw $0, %xmm0, %eax<br>
+; CHECK-NEXT:    movw %ax, 30(%rbx)<br>
+; CHECK-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-NEXT:    pextrw $0, %xmm0, %eax<br>
+; CHECK-NEXT:    movw %ax, 28(%rbx)<br>
+; CHECK-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-NEXT:    pextrw $0, %xmm0, %eax<br>
+; CHECK-NEXT:    movw %ax, 26(%rbx)<br>
+; CHECK-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-NEXT:    pextrw $0, %xmm0, %eax<br>
+; CHECK-NEXT:    movw %ax, 24(%rbx)<br>
+; CHECK-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-NEXT:    pextrw $0, %xmm0, %eax<br>
+; CHECK-NEXT:    movw %ax, 22(%rbx)<br>
+; CHECK-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-NEXT:    pextrw $0, %xmm0, %eax<br>
+; CHECK-NEXT:    movw %ax, 20(%rbx)<br>
+; CHECK-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-NEXT:    pextrw $0, %xmm0, %eax<br>
+; CHECK-NEXT:    movw %ax, 18(%rbx)<br>
+; CHECK-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-NEXT:    pextrw $0, %xmm0, %eax<br>
+; CHECK-NEXT:    movw %ax, 16(%rbx)<br>
+; CHECK-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-NEXT:    pextrw $0, %xmm0, %eax<br>
+; CHECK-NEXT:    movw %ax, 14(%rbx)<br>
+; CHECK-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-NEXT:    pextrw $0, %xmm0, %eax<br>
+; CHECK-NEXT:    movw %ax, 12(%rbx)<br>
+; CHECK-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-NEXT:    pextrw $0, %xmm0, %eax<br>
+; CHECK-NEXT:    movw %ax, 10(%rbx)<br>
+; CHECK-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-NEXT:    pextrw $0, %xmm0, %eax<br>
+; CHECK-NEXT:    movw %ax, 8(%rbx)<br>
+; CHECK-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-NEXT:    pextrw $0, %xmm0, %eax<br>
+; CHECK-NEXT:    movw %ax, 6(%rbx)<br>
+; CHECK-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-NEXT:    pextrw $0, %xmm0, %eax<br>
+; CHECK-NEXT:    movw %ax, 4(%rbx)<br>
+; CHECK-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-NEXT:    pextrw $0, %xmm0, %eax<br>
+; CHECK-NEXT:    movw %ax, 2(%rbx)<br>
+; CHECK-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-NEXT:    pextrw $0, %xmm0, %eax<br>
+; CHECK-NEXT:    movw %ax, (%rbx)<br>
+; CHECK-NEXT:    addq $512, %rsp # imm = 0x200<br>
 ; CHECK-NEXT:    popq %rbx<br>
-; CHECK-NEXT:    popq %r12<br>
-; CHECK-NEXT:    popq %r13<br>
-; CHECK-NEXT:    popq %r14<br>
-; CHECK-NEXT:    popq %r15<br>
-; CHECK-NEXT:    popq %rbp<br>
 ; CHECK-NEXT:    retq<br>
   %frem = frem <16 x half> %a0, %a1<br>
   store <16 x half> %frem, <16 x half> *%p3<br>
@@ -1275,130 +1363,150 @@ define void @frem_v16f16(<16 x half> %a0, <16 x half> %a1, <16 x half> *%p3) nou<br>
 define void @frem_v8f16(<8 x half> %a0, <8 x half> %a1, <8 x half> *%p3) nounwind {<br>
 ; CHECK-LABEL: frem_v8f16:<br>
 ; CHECK:       # %bb.0:<br>
-; CHECK-NEXT:    pushq %rbp<br>
-; CHECK-NEXT:    pushq %r15<br>
-; CHECK-NEXT:    pushq %r14<br>
-; CHECK-NEXT:    pushq %r13<br>
-; CHECK-NEXT:    pushq %r12<br>
 ; CHECK-NEXT:    pushq %rbx<br>
-; CHECK-NEXT:    subq $56, %rsp<br>
-; CHECK-NEXT:    movl %r9d, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movl %r8d, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movl %ecx, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movl %edx, %ebx<br>
-; CHECK-NEXT:    movl %esi, %r13d<br>
-; CHECK-NEXT:    movl %edi, %r15d<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%rsp), %eax<br>
-; CHECK-NEXT:    movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%rsp), %eax<br>
-; CHECK-NEXT:    movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%rsp), %eax<br>
-; CHECK-NEXT:    movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%rsp), %eax<br>
-; CHECK-NEXT:    movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%rsp), %eax<br>
-; CHECK-NEXT:    movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%rsp), %eax<br>
-; CHECK-NEXT:    movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%rsp), %r14d<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%rsp), %ebp<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%rsp), %r12d<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%rsp), %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    subq $240, %rsp<br>
+; CHECK-NEXT:    movq %rdi, %rbx<br>
+; CHECK-NEXT:    movss %xmm7, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movss %xmm6, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movss %xmm5, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movss %xmm4, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movss %xmm3, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movss %xmm2, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    movd %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Folded Spill<br>
+; CHECK-NEXT:    pinsrw $0, {{[0-9]+}}(%rsp), %xmm1<br>
+; CHECK-NEXT:    movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    pinsrw $0, {{[0-9]+}}(%rsp), %xmm1<br>
+; CHECK-NEXT:    movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    pinsrw $0, {{[0-9]+}}(%rsp), %xmm1<br>
+; CHECK-NEXT:    movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    pinsrw $0, {{[0-9]+}}(%rsp), %xmm1<br>
+; CHECK-NEXT:    movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    pinsrw $0, {{[0-9]+}}(%rsp), %xmm1<br>
+; CHECK-NEXT:    movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    pinsrw $0, {{[0-9]+}}(%rsp), %xmm1<br>
+; CHECK-NEXT:    movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    pinsrw $0, {{[0-9]+}}(%rsp), %xmm1<br>
+; CHECK-NEXT:    movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    pinsrw $0, {{[0-9]+}}(%rsp), %xmm1<br>
+; CHECK-NEXT:    movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movzwl %r15w, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
-; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 4-byte Reload<br>
-; CHECK-NEXT:    # xmm1 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
+; CHECK-NEXT:    movaps %xmm0, %xmm1<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
 ; CHECK-NEXT:    callq fmodf@PLT<br>
-; CHECK-NEXT:    callq __gnu_f2h_ieee@PLT<br>
-; CHECK-NEXT:    movw %ax, {{[-0-9]+}}(%r{{[sb]}}p) # 2-byte Spill<br>
-; CHECK-NEXT:    movl %r12d, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    callq __truncsfhf2@PLT<br>
+; CHECK-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movzwl %r13w, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
-; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 4-byte Reload<br>
-; CHECK-NEXT:    # xmm1 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
+; CHECK-NEXT:    movaps %xmm0, %xmm1<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
 ; CHECK-NEXT:    callq fmodf@PLT<br>
-; CHECK-NEXT:    callq __gnu_f2h_ieee@PLT<br>
-; CHECK-NEXT:    movl %eax, %r12d<br>
-; CHECK-NEXT:    movl %ebp, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    callq __truncsfhf2@PLT<br>
+; CHECK-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movzwl %bx, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
-; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 4-byte Reload<br>
-; CHECK-NEXT:    # xmm1 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
+; CHECK-NEXT:    movaps %xmm0, %xmm1<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
 ; CHECK-NEXT:    callq fmodf@PLT<br>
-; CHECK-NEXT:    callq __gnu_f2h_ieee@PLT<br>
-; CHECK-NEXT:    movl %eax, %r13d<br>
-; CHECK-NEXT:    movl %r14d, %edi<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    callq __truncsfhf2@PLT<br>
+; CHECK-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movzwl {{[-0-9]+}}(%r{{[sb]}}p), %edi # 2-byte Folded Reload<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
-; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 4-byte Reload<br>
-; CHECK-NEXT:    # xmm1 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
+; CHECK-NEXT:    movaps %xmm0, %xmm1<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
 ; CHECK-NEXT:    callq fmodf@PLT<br>
-; CHECK-NEXT:    callq __gnu_f2h_ieee@PLT<br>
-; CHECK-NEXT:    movl %eax, %r14d<br>
-; CHECK-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %edi # 4-byte Reload<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    callq __truncsfhf2@PLT<br>
+; CHECK-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movzwl {{[-0-9]+}}(%r{{[sb]}}p), %edi # 2-byte Folded Reload<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
-; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 4-byte Reload<br>
-; CHECK-NEXT:    # xmm1 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
+; CHECK-NEXT:    movaps %xmm0, %xmm1<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
 ; CHECK-NEXT:    callq fmodf@PLT<br>
-; CHECK-NEXT:    callq __gnu_f2h_ieee@PLT<br>
-; CHECK-NEXT:    movl %eax, %r15d<br>
-; CHECK-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %edi # 4-byte Reload<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    callq __truncsfhf2@PLT<br>
+; CHECK-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movzwl {{[-0-9]+}}(%r{{[sb]}}p), %edi # 2-byte Folded Reload<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
-; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 4-byte Reload<br>
-; CHECK-NEXT:    # xmm1 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
+; CHECK-NEXT:    movaps %xmm0, %xmm1<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
 ; CHECK-NEXT:    callq fmodf@PLT<br>
-; CHECK-NEXT:    callq __gnu_f2h_ieee@PLT<br>
-; CHECK-NEXT:    movl %eax, %ebp<br>
-; CHECK-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %edi # 4-byte Reload<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    callq __truncsfhf2@PLT<br>
+; CHECK-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %edi # 4-byte Reload<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
-; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 4-byte Reload<br>
-; CHECK-NEXT:    # xmm1 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
+; CHECK-NEXT:    movaps %xmm0, %xmm1<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
 ; CHECK-NEXT:    callq fmodf@PLT<br>
-; CHECK-NEXT:    callq __gnu_f2h_ieee@PLT<br>
-; CHECK-NEXT:    movl %eax, %ebx<br>
-; CHECK-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %edi # 4-byte Reload<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-NEXT:    callq __truncsfhf2@PLT<br>
+; CHECK-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %edi # 4-byte Reload<br>
-; CHECK-NEXT:    callq __gnu_h2f_ieee@PLT<br>
-; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 4-byte Reload<br>
-; CHECK-NEXT:    # xmm1 = mem[0],zero,zero,zero<br>
-; CHECK-NEXT:    callq fmodf@PLT<br>
-; CHECK-NEXT:    callq __gnu_f2h_ieee@PLT<br>
-; CHECK-NEXT:    movq {{[0-9]+}}(%rsp), %rcx<br>
-; CHECK-NEXT:    movw %ax, 14(%rcx)<br>
-; CHECK-NEXT:    movw %bx, 12(%rcx)<br>
-; CHECK-NEXT:    movw %bp, 10(%rcx)<br>
-; CHECK-NEXT:    movw %r15w, 8(%rcx)<br>
-; CHECK-NEXT:    movw %r14w, 6(%rcx)<br>
-; CHECK-NEXT:    movw %r13w, 4(%rcx)<br>
-; CHECK-NEXT:    movw %r12w, 2(%rcx)<br>
-; CHECK-NEXT:    movzwl {{[-0-9]+}}(%r{{[sb]}}p), %eax # 2-byte Folded Reload<br>
-; CHECK-NEXT:    movw %ax, (%rcx)<br>
-; CHECK-NEXT:    addq $56, %rsp<br>
+; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-NEXT:    callq __extendhfsf2@PLT<br>
+; CHECK-NEXT:    movaps %xmm0, %xmm1<br>
+; CHECK-NEXT:    movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    callq fmodf@PLT<br>
+; CHECK-NEXT:    callq __truncsfhf2@PLT<br>
+; CHECK-NEXT:    pextrw $0, %xmm0, %eax<br>
+; CHECK-NEXT:    movw %ax, 14(%rbx)<br>
+; CHECK-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-NEXT:    pextrw $0, %xmm0, %eax<br>
+; CHECK-NEXT:    movw %ax, 12(%rbx)<br>
+; CHECK-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-NEXT:    pextrw $0, %xmm0, %eax<br>
+; CHECK-NEXT:    movw %ax, 10(%rbx)<br>
+; CHECK-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-NEXT:    pextrw $0, %xmm0, %eax<br>
+; CHECK-NEXT:    movw %ax, 8(%rbx)<br>
+; CHECK-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-NEXT:    pextrw $0, %xmm0, %eax<br>
+; CHECK-NEXT:    movw %ax, 6(%rbx)<br>
+; CHECK-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-NEXT:    pextrw $0, %xmm0, %eax<br>
+; CHECK-NEXT:    movw %ax, 4(%rbx)<br>
+; CHECK-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-NEXT:    pextrw $0, %xmm0, %eax<br>
+; CHECK-NEXT:    movw %ax, 2(%rbx)<br>
+; CHECK-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-NEXT:    pextrw $0, %xmm0, %eax<br>
+; CHECK-NEXT:    movw %ax, (%rbx)<br>
+; CHECK-NEXT:    addq $240, %rsp<br>
 ; CHECK-NEXT:    popq %rbx<br>
-; CHECK-NEXT:    popq %r12<br>
-; CHECK-NEXT:    popq %r13<br>
-; CHECK-NEXT:    popq %r14<br>
-; CHECK-NEXT:    popq %r15<br>
-; CHECK-NEXT:    popq %rbp<br>
 ; CHECK-NEXT:    retq<br>
   %frem = frem <8 x half> %a0, %a1<br>
   store <8 x half> %frem, <8 x half> *%p3<br>
<br>
diff  --git a/llvm/test/CodeGen/X86/half-constrained.ll b/llvm/test/CodeGen/X86/half-constrained.ll<br>
index 600673a8ca1f8..00972fb940121 100644<br>
--- a/llvm/test/CodeGen/X86/half-constrained.ll<br>
+++ b/llvm/test/CodeGen/X86/half-constrained.ll<br>
@@ -36,7 +36,7 @@ define float @half_to_float() strictfp {<br>
 ; X64-NOF16C:       ## %bb.0:<br>
 ; X64-NOF16C-NEXT:    pushq %rax<br>
 ; X64-NOF16C-NEXT:    .cfi_def_cfa_offset 16<br>
-; X64-NOF16C-NEXT:    movzwl _a(%rip), %edi<br>
+; X64-NOF16C-NEXT:    pinsrw $0, _a(%rip), %xmm0<br>
 ; X64-NOF16C-NEXT:    callq ___extendhfsf2<br>
 ; X64-NOF16C-NEXT:    popq %rax<br>
 ; X64-NOF16C-NEXT:    retq<br>
@@ -81,7 +81,7 @@ define double @half_to_double() strictfp {<br>
 ; X64-NOF16C:       ## %bb.0:<br>
 ; X64-NOF16C-NEXT:    pushq %rax<br>
 ; X64-NOF16C-NEXT:    .cfi_def_cfa_offset 16<br>
-; X64-NOF16C-NEXT:    movzwl _a(%rip), %edi<br>
+; X64-NOF16C-NEXT:    pinsrw $0, _a(%rip), %xmm0<br>
 ; X64-NOF16C-NEXT:    callq ___extendhfsf2<br>
 ; X64-NOF16C-NEXT:    cvtss2sd %xmm0, %xmm0<br>
 ; X64-NOF16C-NEXT:    popq %rax<br>
@@ -112,37 +112,30 @@ define x86_fp80 @half_to_fp80() strictfp {<br>
 ;<br>
 ; X32-F16C-LABEL: half_to_fp80:<br>
 ; X32-F16C:       ## %bb.0:<br>
-; X32-F16C-NEXT:    pushl %eax<br>
-; X32-F16C-NEXT:    .cfi_def_cfa_offset 8<br>
-; X32-F16C-NEXT:    movzwl _a, %eax<br>
-; X32-F16C-NEXT:    vmovd %eax, %xmm0<br>
-; X32-F16C-NEXT:    vcvtph2ps %xmm0, %xmm0<br>
-; X32-F16C-NEXT:    vmovss %xmm0, (%esp)<br>
-; X32-F16C-NEXT:    flds (%esp)<br>
-; X32-F16C-NEXT:    wait<br>
-; X32-F16C-NEXT:    popl %eax<br>
+; X32-F16C-NEXT:    subl $12, %esp<br>
+; X32-F16C-NEXT:    .cfi_def_cfa_offset 16<br>
+; X32-F16C-NEXT:    vpinsrw $0, _a, %xmm0, %xmm0<br>
+; X32-F16C-NEXT:    vpextrw $0, %xmm0, (%esp)<br>
+; X32-F16C-NEXT:    calll ___extendhfxf2<br>
+; X32-F16C-NEXT:    addl $12, %esp<br>
 ; X32-F16C-NEXT:    retl<br>
 ;<br>
 ; X64-NOF16C-LABEL: half_to_fp80:<br>
 ; X64-NOF16C:       ## %bb.0:<br>
 ; X64-NOF16C-NEXT:    pushq %rax<br>
 ; X64-NOF16C-NEXT:    .cfi_def_cfa_offset 16<br>
-; X64-NOF16C-NEXT:    movzwl _a(%rip), %edi<br>
-; X64-NOF16C-NEXT:    callq ___extendhfsf2<br>
-; X64-NOF16C-NEXT:    movss %xmm0, {{[0-9]+}}(%rsp)<br>
-; X64-NOF16C-NEXT:    flds {{[0-9]+}}(%rsp)<br>
-; X64-NOF16C-NEXT:    wait<br>
+; X64-NOF16C-NEXT:    pinsrw $0, _a(%rip), %xmm0<br>
+; X64-NOF16C-NEXT:    callq ___extendhfxf2<br>
 ; X64-NOF16C-NEXT:    popq %rax<br>
 ; X64-NOF16C-NEXT:    retq<br>
 ;<br>
 ; X64-F16C-LABEL: half_to_fp80:<br>
 ; X64-F16C:       ## %bb.0:<br>
-; X64-F16C-NEXT:    movzwl _a(%rip), %eax<br>
-; X64-F16C-NEXT:    vmovd %eax, %xmm0<br>
-; X64-F16C-NEXT:    vcvtph2ps %xmm0, %xmm0<br>
-; X64-F16C-NEXT:    vmovss %xmm0, -{{[0-9]+}}(%rsp)<br>
-; X64-F16C-NEXT:    flds -{{[0-9]+}}(%rsp)<br>
-; X64-F16C-NEXT:    wait<br>
+; X64-F16C-NEXT:    pushq %rax<br>
+; X64-F16C-NEXT:    .cfi_def_cfa_offset 16<br>
+; X64-F16C-NEXT:    vpinsrw $0, _a(%rip), %xmm0, %xmm0<br>
+; X64-F16C-NEXT:    callq ___extendhfxf2<br>
+; X64-F16C-NEXT:    popq %rax<br>
 ; X64-F16C-NEXT:    retq<br>
   %1 = load half, half* @a, align 2<br>
   %2 = tail call x86_fp80 @llvm.experimental.constrained.fpext.f80.f16(half %1, metadata !"fpexcept.strict") #0<br>
@@ -166,7 +159,8 @@ define void @float_to_half(float %0) strictfp {<br>
 ; X32-F16C:       ## %bb.0:<br>
 ; X32-F16C-NEXT:    vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero<br>
 ; X32-F16C-NEXT:    vcvtps2ph $4, %xmm0, %xmm0<br>
-; X32-F16C-NEXT:    vpextrw $0, %xmm0, _a<br>
+; X32-F16C-NEXT:    vmovd %xmm0, %eax<br>
+; X32-F16C-NEXT:    movw %ax, _a<br>
 ; X32-F16C-NEXT:    retl<br>
 ;<br>
 ; X64-NOF16C-LABEL: float_to_half:<br>
@@ -174,6 +168,7 @@ define void @float_to_half(float %0) strictfp {<br>
 ; X64-NOF16C-NEXT:    pushq %rax<br>
 ; X64-NOF16C-NEXT:    .cfi_def_cfa_offset 16<br>
 ; X64-NOF16C-NEXT:    callq ___truncsfhf2<br>
+; X64-NOF16C-NEXT:    pextrw $0, %xmm0, %eax<br>
 ; X64-NOF16C-NEXT:    movw %ax, _a(%rip)<br>
 ; X64-NOF16C-NEXT:    popq %rax<br>
 ; X64-NOF16C-NEXT:    retq<br>
@@ -183,7 +178,8 @@ define void @float_to_half(float %0) strictfp {<br>
 ; X64-F16C-NEXT:    vxorps %xmm1, %xmm1, %xmm1<br>
 ; X64-F16C-NEXT:    vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3]<br>
 ; X64-F16C-NEXT:    vcvtps2ph $4, %xmm0, %xmm0<br>
-; X64-F16C-NEXT:    vpextrw $0, %xmm0, _a(%rip)<br>
+; X64-F16C-NEXT:    vmovd %xmm0, %eax<br>
+; X64-F16C-NEXT:    movw %ax, _a(%rip)<br>
 ; X64-F16C-NEXT:    retq<br>
   %2 = tail call half @llvm.experimental.constrained.fptrunc.f16.f32(float %0, metadata !"round.tonearest", metadata !"fpexcept.strict") #0<br>
   store half %2, half* @a, align 2<br>
@@ -205,13 +201,13 @@ define void @double_to_half(double %0) strictfp {<br>
 ;<br>
 ; X32-F16C-LABEL: double_to_half:<br>
 ; X32-F16C:       ## %bb.0:<br>
-; X32-F16C-NEXT:    subl $12, %esp<br>
-; X32-F16C-NEXT:    .cfi_def_cfa_offset 16<br>
 ; X32-F16C-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero<br>
-; X32-F16C-NEXT:    vmovsd %xmm0, (%esp)<br>
-; X32-F16C-NEXT:    calll ___truncdfhf2<br>
+; X32-F16C-NEXT:    vcvtsd2ss %xmm0, %xmm0, %xmm0<br>
+; X32-F16C-NEXT:    vxorps %xmm1, %xmm1, %xmm1<br>
+; X32-F16C-NEXT:    vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3]<br>
+; X32-F16C-NEXT:    vcvtps2ph $4, %xmm0, %xmm0<br>
+; X32-F16C-NEXT:    vmovd %xmm0, %eax<br>
 ; X32-F16C-NEXT:    movw %ax, _a<br>
-; X32-F16C-NEXT:    addl $12, %esp<br>
 ; X32-F16C-NEXT:    retl<br>
 ;<br>
 ; X64-NOF16C-LABEL: double_to_half:<br>
@@ -219,17 +215,19 @@ define void @double_to_half(double %0) strictfp {<br>
 ; X64-NOF16C-NEXT:    pushq %rax<br>
 ; X64-NOF16C-NEXT:    .cfi_def_cfa_offset 16<br>
 ; X64-NOF16C-NEXT:    callq ___truncdfhf2<br>
+; X64-NOF16C-NEXT:    pextrw $0, %xmm0, %eax<br>
 ; X64-NOF16C-NEXT:    movw %ax, _a(%rip)<br>
 ; X64-NOF16C-NEXT:    popq %rax<br>
 ; X64-NOF16C-NEXT:    retq<br>
 ;<br>
 ; X64-F16C-LABEL: double_to_half:<br>
 ; X64-F16C:       ## %bb.0:<br>
-; X64-F16C-NEXT:    pushq %rax<br>
-; X64-F16C-NEXT:    .cfi_def_cfa_offset 16<br>
-; X64-F16C-NEXT:    callq ___truncdfhf2<br>
+; X64-F16C-NEXT:    vcvtsd2ss %xmm0, %xmm0, %xmm0<br>
+; X64-F16C-NEXT:    vxorps %xmm1, %xmm1, %xmm1<br>
+; X64-F16C-NEXT:    vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3]<br>
+; X64-F16C-NEXT:    vcvtps2ph $4, %xmm0, %xmm0<br>
+; X64-F16C-NEXT:    vmovd %xmm0, %eax<br>
 ; X64-F16C-NEXT:    movw %ax, _a(%rip)<br>
-; X64-F16C-NEXT:    popq %rax<br>
 ; X64-F16C-NEXT:    retq<br>
   %2 = tail call half @llvm.experimental.constrained.fptrunc.f16.f64(double %0, metadata !"round.tonearest", metadata !"fpexcept.strict") #0<br>
   store half %2, half* @a, align 2<br>
@@ -257,7 +255,7 @@ define void @fp80_to_half(x86_fp80 %0) strictfp {<br>
 ; X32-F16C-NEXT:    fstpt (%esp)<br>
 ; X32-F16C-NEXT:    wait<br>
 ; X32-F16C-NEXT:    calll ___truncxfhf2<br>
-; X32-F16C-NEXT:    movw %ax, _a<br>
+; X32-F16C-NEXT:    vpextrw $0, %xmm0, _a<br>
 ; X32-F16C-NEXT:    addl $28, %esp<br>
 ; X32-F16C-NEXT:    retl<br>
 ;<br>
@@ -269,6 +267,7 @@ define void @fp80_to_half(x86_fp80 %0) strictfp {<br>
 ; X64-NOF16C-NEXT:    fstpt (%rsp)<br>
 ; X64-NOF16C-NEXT:    wait<br>
 ; X64-NOF16C-NEXT:    callq ___truncxfhf2<br>
+; X64-NOF16C-NEXT:    pextrw $0, %xmm0, %eax<br>
 ; X64-NOF16C-NEXT:    movw %ax, _a(%rip)<br>
 ; X64-NOF16C-NEXT:    addq $24, %rsp<br>
 ; X64-NOF16C-NEXT:    retq<br>
@@ -281,7 +280,7 @@ define void @fp80_to_half(x86_fp80 %0) strictfp {<br>
 ; X64-F16C-NEXT:    fstpt (%rsp)<br>
 ; X64-F16C-NEXT:    wait<br>
 ; X64-F16C-NEXT:    callq ___truncxfhf2<br>
-; X64-F16C-NEXT:    movw %ax, _a(%rip)<br>
+; X64-F16C-NEXT:    vpextrw $0, %xmm0, _a(%rip)<br>
 ; X64-F16C-NEXT:    addq $24, %rsp<br>
 ; X64-F16C-NEXT:    retq<br>
   %2 = tail call half @llvm.experimental.constrained.fptrunc.f16.f80(x86_fp80 %0, metadata !"round.tonearest", metadata !"fpexcept.strict") #0<br>
@@ -323,20 +322,22 @@ define void @add() strictfp {<br>
 ; X32-F16C-NEXT:    vxorps %xmm1, %xmm1, %xmm1<br>
 ; X32-F16C-NEXT:    vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3]<br>
 ; X32-F16C-NEXT:    vcvtps2ph $4, %xmm0, %xmm0<br>
-; X32-F16C-NEXT:    vpextrw $0, %xmm0, _c<br>
+; X32-F16C-NEXT:    vmovd %xmm0, %eax<br>
+; X32-F16C-NEXT:    movw %ax, _c<br>
 ; X32-F16C-NEXT:    retl<br>
 ;<br>
 ; X64-NOF16C-LABEL: add:<br>
 ; X64-NOF16C:       ## %bb.0:<br>
 ; X64-NOF16C-NEXT:    pushq %rax<br>
 ; X64-NOF16C-NEXT:    .cfi_def_cfa_offset 16<br>
-; X64-NOF16C-NEXT:    movzwl _a(%rip), %edi<br>
+; X64-NOF16C-NEXT:    pinsrw $0, _a(%rip), %xmm0<br>
 ; X64-NOF16C-NEXT:    callq ___extendhfsf2<br>
-; X64-NOF16C-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) ## 4-byte Spill<br>
-; X64-NOF16C-NEXT:    movzwl _b(%rip), %edi<br>
+; X64-NOF16C-NEXT:    movd %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) ## 4-byte Folded Spill<br>
+; X64-NOF16C-NEXT:    pinsrw $0, _b(%rip), %xmm0<br>
 ; X64-NOF16C-NEXT:    callq ___extendhfsf2<br>
 ; X64-NOF16C-NEXT:    addss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 ## 4-byte Folded Reload<br>
 ; X64-NOF16C-NEXT:    callq ___truncsfhf2<br>
+; X64-NOF16C-NEXT:    pextrw $0, %xmm0, %eax<br>
 ; X64-NOF16C-NEXT:    movw %ax, _c(%rip)<br>
 ; X64-NOF16C-NEXT:    popq %rax<br>
 ; X64-NOF16C-NEXT:    retq<br>
@@ -353,7 +354,8 @@ define void @add() strictfp {<br>
 ; X64-F16C-NEXT:    vxorps %xmm1, %xmm1, %xmm1<br>
 ; X64-F16C-NEXT:    vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3]<br>
 ; X64-F16C-NEXT:    vcvtps2ph $4, %xmm0, %xmm0<br>
-; X64-F16C-NEXT:    vpextrw $0, %xmm0, _c(%rip)<br>
+; X64-F16C-NEXT:    vmovd %xmm0, %eax<br>
+; X64-F16C-NEXT:    movw %ax, _c(%rip)<br>
 ; X64-F16C-NEXT:    retq<br>
   %1 = load half, half* @a, align 2<br>
   %2 = tail call float @llvm.experimental.constrained.fpext.f32.f16(half %1, metadata !"fpexcept.strict") #0<br>
<br>
diff  --git a/llvm/test/CodeGen/X86/half.ll b/llvm/test/CodeGen/X86/half.ll<br>
index 46179e7d9113b..53f6f78155264 100644<br>
--- a/llvm/test/CodeGen/X86/half.ll<br>
+++ b/llvm/test/CodeGen/X86/half.ll<br>
@@ -1,6 +1,6 @@<br>
 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py<br>
 ; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu -mattr=-f16c -fixup-byte-word-insts=1 \<br>
-; RUN:   | FileCheck %s -check-prefixes=CHECK,CHECK-LIBCALL,BWON,BWON-NOF16C<br>
+; RUN:   | FileCheck %s -check-prefixes=CHECK,CHECK-LIBCALL,BWON<br>
 ; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu -mattr=-f16c  -fixup-byte-word-insts=0 \<br>
 ; RUN:   | FileCheck %s -check-prefixes=CHECK,CHECK-LIBCALL,BWOFF<br>
 ; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu -mattr=+f16c -fixup-byte-word-insts=1 \<br>
@@ -9,23 +9,25 @@<br>
 ; RUN:    | FileCheck %s -check-prefixes=CHECK-I686<br>
<br>
 define void @test_load_store(half* %in, half* %out) #0 {<br>
-; BWON-LABEL: test_load_store:<br>
-; BWON:       # %bb.0:<br>
-; BWON-NEXT:    movzwl (%rdi), %eax<br>
-; BWON-NEXT:    movw %ax, (%rsi)<br>
-; BWON-NEXT:    retq<br>
+; CHECK-LIBCALL-LABEL: test_load_store:<br>
+; CHECK-LIBCALL:       # %bb.0:<br>
+; CHECK-LIBCALL-NEXT:    pinsrw $0, (%rdi), %xmm0<br>
+; CHECK-LIBCALL-NEXT:    pextrw $0, %xmm0, %eax<br>
+; CHECK-LIBCALL-NEXT:    movw %ax, (%rsi)<br>
+; CHECK-LIBCALL-NEXT:    retq<br>
 ;<br>
-; BWOFF-LABEL: test_load_store:<br>
-; BWOFF:       # %bb.0:<br>
-; BWOFF-NEXT:    movw (%rdi), %ax<br>
-; BWOFF-NEXT:    movw %ax, (%rsi)<br>
-; BWOFF-NEXT:    retq<br>
+; BWON-F16C-LABEL: test_load_store:<br>
+; BWON-F16C:       # %bb.0:<br>
+; BWON-F16C-NEXT:    vpinsrw $0, (%rdi), %xmm0, %xmm0<br>
+; BWON-F16C-NEXT:    vpextrw $0, %xmm0, (%rsi)<br>
+; BWON-F16C-NEXT:    retq<br>
 ;<br>
 ; CHECK-I686-LABEL: test_load_store:<br>
 ; CHECK-I686:       # %bb.0:<br>
 ; CHECK-I686-NEXT:    movl {{[0-9]+}}(%esp), %eax<br>
 ; CHECK-I686-NEXT:    movl {{[0-9]+}}(%esp), %ecx<br>
-; CHECK-I686-NEXT:    movw (%ecx), %cx<br>
+; CHECK-I686-NEXT:    pinsrw $0, (%ecx), %xmm0<br>
+; CHECK-I686-NEXT:    pextrw $0, %xmm0, %ecx<br>
 ; CHECK-I686-NEXT:    movw %cx, (%eax)<br>
 ; CHECK-I686-NEXT:    retl<br>
   %val = load half, half* %in<br>
@@ -74,8 +76,8 @@ define void @test_bitcast_to_half(half* %addr, i16 %in) #0 {<br>
 define float @test_extend32(half* %addr) #0 {<br>
 ; CHECK-LIBCALL-LABEL: test_extend32:<br>
 ; CHECK-LIBCALL:       # %bb.0:<br>
-; CHECK-LIBCALL-NEXT:    movzwl (%rdi), %edi<br>
-; CHECK-LIBCALL-NEXT:    jmp __gnu_h2f_ieee@PLT # TAILCALL<br>
+; CHECK-LIBCALL-NEXT:    pinsrw $0, (%rdi), %xmm0<br>
+; CHECK-LIBCALL-NEXT:    jmp __extendhfsf2@PLT # TAILCALL<br>
 ;<br>
 ; BWON-F16C-LABEL: test_extend32:<br>
 ; BWON-F16C:       # %bb.0:<br>
@@ -88,9 +90,10 @@ define float @test_extend32(half* %addr) #0 {<br>
 ; CHECK-I686:       # %bb.0:<br>
 ; CHECK-I686-NEXT:    subl $12, %esp<br>
 ; CHECK-I686-NEXT:    movl {{[0-9]+}}(%esp), %eax<br>
-; CHECK-I686-NEXT:    movzwl (%eax), %eax<br>
-; CHECK-I686-NEXT:    movl %eax, (%esp)<br>
-; CHECK-I686-NEXT:    calll __gnu_h2f_ieee<br>
+; CHECK-I686-NEXT:    pinsrw $0, (%eax), %xmm0<br>
+; CHECK-I686-NEXT:    pextrw $0, %xmm0, %eax<br>
+; CHECK-I686-NEXT:    movw %ax, (%esp)<br>
+; CHECK-I686-NEXT:    calll __extendhfsf2<br>
 ; CHECK-I686-NEXT:    addl $12, %esp<br>
 ; CHECK-I686-NEXT:    retl<br>
   %val16 = load half, half* %addr<br>
@@ -102,8 +105,8 @@ define double @test_extend64(half* %addr) #0 {<br>
 ; CHECK-LIBCALL-LABEL: test_extend64:<br>
 ; CHECK-LIBCALL:       # %bb.0:<br>
 ; CHECK-LIBCALL-NEXT:    pushq %rax<br>
-; CHECK-LIBCALL-NEXT:    movzwl (%rdi), %edi<br>
-; CHECK-LIBCALL-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-LIBCALL-NEXT:    pinsrw $0, (%rdi), %xmm0<br>
+; CHECK-LIBCALL-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-LIBCALL-NEXT:    cvtss2sd %xmm0, %xmm0<br>
 ; CHECK-LIBCALL-NEXT:    popq %rax<br>
 ; CHECK-LIBCALL-NEXT:    retq<br>
@@ -120,9 +123,10 @@ define double @test_extend64(half* %addr) #0 {<br>
 ; CHECK-I686:       # %bb.0:<br>
 ; CHECK-I686-NEXT:    subl $12, %esp<br>
 ; CHECK-I686-NEXT:    movl {{[0-9]+}}(%esp), %eax<br>
-; CHECK-I686-NEXT:    movzwl (%eax), %eax<br>
-; CHECK-I686-NEXT:    movl %eax, (%esp)<br>
-; CHECK-I686-NEXT:    calll __gnu_h2f_ieee<br>
+; CHECK-I686-NEXT:    pinsrw $0, (%eax), %xmm0<br>
+; CHECK-I686-NEXT:    pextrw $0, %xmm0, %eax<br>
+; CHECK-I686-NEXT:    movw %ax, (%esp)<br>
+; CHECK-I686-NEXT:    calll __extendhfsf2<br>
 ; CHECK-I686-NEXT:    addl $12, %esp<br>
 ; CHECK-I686-NEXT:    retl<br>
   %val16 = load half, half* %addr<br>
@@ -135,7 +139,8 @@ define void @test_trunc32(float %in, half* %addr) #0 {<br>
 ; CHECK-LIBCALL:       # %bb.0:<br>
 ; CHECK-LIBCALL-NEXT:    pushq %rbx<br>
 ; CHECK-LIBCALL-NEXT:    movq %rdi, %rbx<br>
-; CHECK-LIBCALL-NEXT:    callq __gnu_f2h_ieee@PLT<br>
+; CHECK-LIBCALL-NEXT:    callq __truncsfhf2@PLT<br>
+; CHECK-LIBCALL-NEXT:    pextrw $0, %xmm0, %eax<br>
 ; CHECK-LIBCALL-NEXT:    movw %ax, (%rbx)<br>
 ; CHECK-LIBCALL-NEXT:    popq %rbx<br>
 ; CHECK-LIBCALL-NEXT:    retq<br>
@@ -143,7 +148,8 @@ define void @test_trunc32(float %in, half* %addr) #0 {<br>
 ; BWON-F16C-LABEL: test_trunc32:<br>
 ; BWON-F16C:       # %bb.0:<br>
 ; BWON-F16C-NEXT:    vcvtps2ph $4, %xmm0, %xmm0<br>
-; BWON-F16C-NEXT:    vpextrw $0, %xmm0, (%rdi)<br>
+; BWON-F16C-NEXT:    vmovd %xmm0, %eax<br>
+; BWON-F16C-NEXT:    movw %ax, (%rdi)<br>
 ; BWON-F16C-NEXT:    retq<br>
 ;<br>
 ; CHECK-I686-LABEL: test_trunc32:<br>
@@ -151,9 +157,10 @@ define void @test_trunc32(float %in, half* %addr) #0 {<br>
 ; CHECK-I686-NEXT:    pushl %esi<br>
 ; CHECK-I686-NEXT:    subl $8, %esp<br>
 ; CHECK-I686-NEXT:    movl {{[0-9]+}}(%esp), %esi<br>
-; CHECK-I686-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero<br>
-; CHECK-I686-NEXT:    movss %xmm0, (%esp)<br>
-; CHECK-I686-NEXT:    calll __gnu_f2h_ieee<br>
+; CHECK-I686-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-I686-NEXT:    movd %xmm0, (%esp)<br>
+; CHECK-I686-NEXT:    calll __truncsfhf2<br>
+; CHECK-I686-NEXT:    pextrw $0, %xmm0, %eax<br>
 ; CHECK-I686-NEXT:    movw %ax, (%esi)<br>
 ; CHECK-I686-NEXT:    addl $8, %esp<br>
 ; CHECK-I686-NEXT:    popl %esi<br>
@@ -164,23 +171,33 @@ define void @test_trunc32(float %in, half* %addr) #0 {<br>
 }<br>
<br>
 define void @test_trunc64(double %in, half* %addr) #0 {<br>
-; CHECK-LABEL: test_trunc64:<br>
-; CHECK:       # %bb.0:<br>
-; CHECK-NEXT:    pushq %rbx<br>
-; CHECK-NEXT:    movq %rdi, %rbx<br>
-; CHECK-NEXT:    callq __truncdfhf2@PLT<br>
-; CHECK-NEXT:    movw %ax, (%rbx)<br>
-; CHECK-NEXT:    popq %rbx<br>
-; CHECK-NEXT:    retq<br>
+; CHECK-LIBCALL-LABEL: test_trunc64:<br>
+; CHECK-LIBCALL:       # %bb.0:<br>
+; CHECK-LIBCALL-NEXT:    pushq %rbx<br>
+; CHECK-LIBCALL-NEXT:    movq %rdi, %rbx<br>
+; CHECK-LIBCALL-NEXT:    callq __truncdfhf2@PLT<br>
+; CHECK-LIBCALL-NEXT:    pextrw $0, %xmm0, %eax<br>
+; CHECK-LIBCALL-NEXT:    movw %ax, (%rbx)<br>
+; CHECK-LIBCALL-NEXT:    popq %rbx<br>
+; CHECK-LIBCALL-NEXT:    retq<br>
+;<br>
+; BWON-F16C-LABEL: test_trunc64:<br>
+; BWON-F16C:       # %bb.0:<br>
+; BWON-F16C-NEXT:    vcvtsd2ss %xmm0, %xmm0, %xmm0<br>
+; BWON-F16C-NEXT:    vcvtps2ph $4, %xmm0, %xmm0<br>
+; BWON-F16C-NEXT:    vmovd %xmm0, %eax<br>
+; BWON-F16C-NEXT:    movw %ax, (%rdi)<br>
+; BWON-F16C-NEXT:    retq<br>
 ;<br>
 ; CHECK-I686-LABEL: test_trunc64:<br>
 ; CHECK-I686:       # %bb.0:<br>
 ; CHECK-I686-NEXT:    pushl %esi<br>
 ; CHECK-I686-NEXT:    subl $8, %esp<br>
 ; CHECK-I686-NEXT:    movl {{[0-9]+}}(%esp), %esi<br>
-; CHECK-I686-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero<br>
-; CHECK-I686-NEXT:    movsd %xmm0, (%esp)<br>
+; CHECK-I686-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero<br>
+; CHECK-I686-NEXT:    movq %xmm0, (%esp)<br>
 ; CHECK-I686-NEXT:    calll __truncdfhf2<br>
+; CHECK-I686-NEXT:    pextrw $0, %xmm0, %eax<br>
 ; CHECK-I686-NEXT:    movw %ax, (%esi)<br>
 ; CHECK-I686-NEXT:    addl $8, %esp<br>
 ; CHECK-I686-NEXT:    popl %esi<br>
@@ -194,8 +211,8 @@ define i64 @test_fptosi_i64(half* %p) #0 {<br>
 ; CHECK-LIBCALL-LABEL: test_fptosi_i64:<br>
 ; CHECK-LIBCALL:       # %bb.0:<br>
 ; CHECK-LIBCALL-NEXT:    pushq %rax<br>
-; CHECK-LIBCALL-NEXT:    movzwl (%rdi), %edi<br>
-; CHECK-LIBCALL-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-LIBCALL-NEXT:    pinsrw $0, (%rdi), %xmm0<br>
+; CHECK-LIBCALL-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-LIBCALL-NEXT:    cvttss2si %xmm0, %rax<br>
 ; CHECK-LIBCALL-NEXT:    popq %rcx<br>
 ; CHECK-LIBCALL-NEXT:    retq<br>
@@ -210,23 +227,13 @@ define i64 @test_fptosi_i64(half* %p) #0 {<br>
 ;<br>
 ; CHECK-I686-LABEL: test_fptosi_i64:<br>
 ; CHECK-I686:       # %bb.0:<br>
-; CHECK-I686-NEXT:    subl $28, %esp<br>
-; CHECK-I686-NEXT:    movl {{[0-9]+}}(%esp), %eax<br>
-; CHECK-I686-NEXT:    movzwl (%eax), %eax<br>
-; CHECK-I686-NEXT:    movl %eax, (%esp)<br>
-; CHECK-I686-NEXT:    calll __gnu_h2f_ieee<br>
-; CHECK-I686-NEXT:    fstps {{[0-9]+}}(%esp)<br>
-; CHECK-I686-NEXT:    flds {{[0-9]+}}(%esp)<br>
-; CHECK-I686-NEXT:    fnstcw {{[0-9]+}}(%esp)<br>
-; CHECK-I686-NEXT:    movzwl {{[0-9]+}}(%esp), %eax<br>
-; CHECK-I686-NEXT:    orl $3072, %eax # imm = 0xC00<br>
-; CHECK-I686-NEXT:    movw %ax, {{[0-9]+}}(%esp)<br>
-; CHECK-I686-NEXT:    fldcw {{[0-9]+}}(%esp)<br>
-; CHECK-I686-NEXT:    fistpll {{[0-9]+}}(%esp)<br>
-; CHECK-I686-NEXT:    fldcw {{[0-9]+}}(%esp)<br>
+; CHECK-I686-NEXT:    subl $12, %esp<br>
 ; CHECK-I686-NEXT:    movl {{[0-9]+}}(%esp), %eax<br>
-; CHECK-I686-NEXT:    movl {{[0-9]+}}(%esp), %edx<br>
-; CHECK-I686-NEXT:    addl $28, %esp<br>
+; CHECK-I686-NEXT:    pinsrw $0, (%eax), %xmm0<br>
+; CHECK-I686-NEXT:    pextrw $0, %xmm0, %eax<br>
+; CHECK-I686-NEXT:    movw %ax, (%esp)<br>
+; CHECK-I686-NEXT:    calll __fixhfdi<br>
+; CHECK-I686-NEXT:    addl $12, %esp<br>
 ; CHECK-I686-NEXT:    retl<br>
   %a = load half, half* %p, align 2<br>
   %r = fptosi half %a to i64<br>
@@ -239,7 +246,8 @@ define void @test_sitofp_i64(i64 %a, half* %p) #0 {<br>
 ; CHECK-LIBCALL-NEXT:    pushq %rbx<br>
 ; CHECK-LIBCALL-NEXT:    movq %rsi, %rbx<br>
 ; CHECK-LIBCALL-NEXT:    cvtsi2ss %rdi, %xmm0<br>
-; CHECK-LIBCALL-NEXT:    callq __gnu_f2h_ieee@PLT<br>
+; CHECK-LIBCALL-NEXT:    callq __truncsfhf2@PLT<br>
+; CHECK-LIBCALL-NEXT:    pextrw $0, %xmm0, %eax<br>
 ; CHECK-LIBCALL-NEXT:    movw %ax, (%rbx)<br>
 ; CHECK-LIBCALL-NEXT:    popq %rbx<br>
 ; CHECK-LIBCALL-NEXT:    retq<br>
@@ -248,7 +256,8 @@ define void @test_sitofp_i64(i64 %a, half* %p) #0 {<br>
 ; BWON-F16C:       # %bb.0:<br>
 ; BWON-F16C-NEXT:    vcvtsi2ss %rdi, %xmm0, %xmm0<br>
 ; BWON-F16C-NEXT:    vcvtps2ph $4, %xmm0, %xmm0<br>
-; BWON-F16C-NEXT:    vpextrw $0, %xmm0, (%rsi)<br>
+; BWON-F16C-NEXT:    vmovd %xmm0, %eax<br>
+; BWON-F16C-NEXT:    movw %ax, (%rsi)<br>
 ; BWON-F16C-NEXT:    retq<br>
 ;<br>
 ; CHECK-I686-LABEL: test_sitofp_i64:<br>
@@ -260,9 +269,10 @@ define void @test_sitofp_i64(i64 %a, half* %p) #0 {<br>
 ; CHECK-I686-NEXT:    movlps %xmm0, {{[0-9]+}}(%esp)<br>
 ; CHECK-I686-NEXT:    fildll {{[0-9]+}}(%esp)<br>
 ; CHECK-I686-NEXT:    fstps {{[0-9]+}}(%esp)<br>
-; CHECK-I686-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero<br>
-; CHECK-I686-NEXT:    movss %xmm0, (%esp)<br>
-; CHECK-I686-NEXT:    calll __gnu_f2h_ieee<br>
+; CHECK-I686-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-I686-NEXT:    movd %xmm0, (%esp)<br>
+; CHECK-I686-NEXT:    calll __truncsfhf2<br>
+; CHECK-I686-NEXT:    pextrw $0, %xmm0, %eax<br>
 ; CHECK-I686-NEXT:    movw %ax, (%esi)<br>
 ; CHECK-I686-NEXT:    addl $24, %esp<br>
 ; CHECK-I686-NEXT:    popl %esi<br>
@@ -276,8 +286,8 @@ define i64 @test_fptoui_i64(half* %p) #0 {<br>
 ; CHECK-LIBCALL-LABEL: test_fptoui_i64:<br>
 ; CHECK-LIBCALL:       # %bb.0:<br>
 ; CHECK-LIBCALL-NEXT:    pushq %rax<br>
-; CHECK-LIBCALL-NEXT:    movzwl (%rdi), %edi<br>
-; CHECK-LIBCALL-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-LIBCALL-NEXT:    pinsrw $0, (%rdi), %xmm0<br>
+; CHECK-LIBCALL-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-LIBCALL-NEXT:    cvttss2si %xmm0, %rcx<br>
 ; CHECK-LIBCALL-NEXT:    movq %rcx, %rdx<br>
 ; CHECK-LIBCALL-NEXT:    sarq $63, %rdx<br>
@@ -304,35 +314,13 @@ define i64 @test_fptoui_i64(half* %p) #0 {<br>
 ;<br>
 ; CHECK-I686-LABEL: test_fptoui_i64:<br>
 ; CHECK-I686:       # %bb.0:<br>
-; CHECK-I686-NEXT:    subl $28, %esp<br>
-; CHECK-I686-NEXT:    movl {{[0-9]+}}(%esp), %eax<br>
-; CHECK-I686-NEXT:    movzwl (%eax), %eax<br>
-; CHECK-I686-NEXT:    movl %eax, (%esp)<br>
-; CHECK-I686-NEXT:    calll __gnu_h2f_ieee<br>
-; CHECK-I686-NEXT:    fstps {{[0-9]+}}(%esp)<br>
-; CHECK-I686-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero<br>
-; CHECK-I686-NEXT:    movss {{.*#+}} xmm1 = mem[0],zero,zero,zero<br>
-; CHECK-I686-NEXT:    ucomiss %xmm1, %xmm0<br>
-; CHECK-I686-NEXT:    jae .LBB9_2<br>
-; CHECK-I686-NEXT:  # %bb.1:<br>
-; CHECK-I686-NEXT:    xorps %xmm1, %xmm1<br>
-; CHECK-I686-NEXT:  .LBB9_2:<br>
-; CHECK-I686-NEXT:    subss %xmm1, %xmm0<br>
-; CHECK-I686-NEXT:    movss %xmm0, {{[0-9]+}}(%esp)<br>
-; CHECK-I686-NEXT:    setae %al<br>
-; CHECK-I686-NEXT:    flds {{[0-9]+}}(%esp)<br>
-; CHECK-I686-NEXT:    fnstcw {{[0-9]+}}(%esp)<br>
-; CHECK-I686-NEXT:    movzwl {{[0-9]+}}(%esp), %ecx<br>
-; CHECK-I686-NEXT:    orl $3072, %ecx # imm = 0xC00<br>
-; CHECK-I686-NEXT:    movw %cx, {{[0-9]+}}(%esp)<br>
-; CHECK-I686-NEXT:    fldcw {{[0-9]+}}(%esp)<br>
-; CHECK-I686-NEXT:    fistpll {{[0-9]+}}(%esp)<br>
-; CHECK-I686-NEXT:    fldcw {{[0-9]+}}(%esp)<br>
-; CHECK-I686-NEXT:    movzbl %al, %edx<br>
-; CHECK-I686-NEXT:    shll $31, %edx<br>
-; CHECK-I686-NEXT:    xorl {{[0-9]+}}(%esp), %edx<br>
+; CHECK-I686-NEXT:    subl $12, %esp<br>
 ; CHECK-I686-NEXT:    movl {{[0-9]+}}(%esp), %eax<br>
-; CHECK-I686-NEXT:    addl $28, %esp<br>
+; CHECK-I686-NEXT:    pinsrw $0, (%eax), %xmm0<br>
+; CHECK-I686-NEXT:    pextrw $0, %xmm0, %eax<br>
+; CHECK-I686-NEXT:    movw %ax, (%esp)<br>
+; CHECK-I686-NEXT:    calll __fixunshfdi<br>
+; CHECK-I686-NEXT:    addl $12, %esp<br>
 ; CHECK-I686-NEXT:    retl<br>
   %a = load half, half* %p, align 2<br>
   %r = fptoui half %a to i64<br>
@@ -357,7 +345,8 @@ define void @test_uitofp_i64(i64 %a, half* %p) #0 {<br>
 ; CHECK-LIBCALL-NEXT:    cvtsi2ss %rdi, %xmm0<br>
 ; CHECK-LIBCALL-NEXT:    addss %xmm0, %xmm0<br>
 ; CHECK-LIBCALL-NEXT:  .LBB10_3:<br>
-; CHECK-LIBCALL-NEXT:    callq __gnu_f2h_ieee@PLT<br>
+; CHECK-LIBCALL-NEXT:    callq __truncsfhf2@PLT<br>
+; CHECK-LIBCALL-NEXT:    pextrw $0, %xmm0, %eax<br>
 ; CHECK-LIBCALL-NEXT:    movw %ax, (%rbx)<br>
 ; CHECK-LIBCALL-NEXT:    popq %rbx<br>
 ; CHECK-LIBCALL-NEXT:    retq<br>
@@ -378,7 +367,8 @@ define void @test_uitofp_i64(i64 %a, half* %p) #0 {<br>
 ; BWON-F16C-NEXT:    vaddss %xmm0, %xmm0, %xmm0<br>
 ; BWON-F16C-NEXT:  .LBB10_3:<br>
 ; BWON-F16C-NEXT:    vcvtps2ph $4, %xmm0, %xmm0<br>
-; BWON-F16C-NEXT:    vpextrw $0, %xmm0, (%rsi)<br>
+; BWON-F16C-NEXT:    vmovd %xmm0, %eax<br>
+; BWON-F16C-NEXT:    movw %ax, (%rsi)<br>
 ; BWON-F16C-NEXT:    retq<br>
 ;<br>
 ; CHECK-I686-LABEL: test_uitofp_i64:<br>
@@ -387,13 +377,14 @@ define void @test_uitofp_i64(i64 %a, half* %p) #0 {<br>
 ; CHECK-I686-NEXT:    subl $24, %esp<br>
 ; CHECK-I686-NEXT:    movl {{[0-9]+}}(%esp), %esi<br>
 ; CHECK-I686-NEXT:    movl {{[0-9]+}}(%esp), %eax<br>
-; CHECK-I686-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero<br>
-; CHECK-I686-NEXT:    movlps %xmm0, {{[0-9]+}}(%esp)<br>
+; CHECK-I686-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero<br>
+; CHECK-I686-NEXT:    movq %xmm0, {{[0-9]+}}(%esp)<br>
 ; CHECK-I686-NEXT:    shrl $31, %eax<br>
 ; CHECK-I686-NEXT:    fildll {{[0-9]+}}(%esp)<br>
 ; CHECK-I686-NEXT:    fadds {{\.?LCPI[0-9]+_[0-9]+}}(,%eax,4)<br>
 ; CHECK-I686-NEXT:    fstps (%esp)<br>
-; CHECK-I686-NEXT:    calll __gnu_f2h_ieee<br>
+; CHECK-I686-NEXT:    calll __truncsfhf2<br>
+; CHECK-I686-NEXT:    pextrw $0, %xmm0, %eax<br>
 ; CHECK-I686-NEXT:    movw %ax, (%esi)<br>
 ; CHECK-I686-NEXT:    addl $24, %esp<br>
 ; CHECK-I686-NEXT:    popl %esi<br>
@@ -406,36 +397,31 @@ define void @test_uitofp_i64(i64 %a, half* %p) #0 {<br>
 define <4 x float> @test_extend32_vec4(<4 x half>* %p) #0 {<br>
 ; CHECK-LIBCALL-LABEL: test_extend32_vec4:<br>
 ; CHECK-LIBCALL:       # %bb.0:<br>
-; CHECK-LIBCALL-NEXT:    subq $88, %rsp<br>
-; CHECK-LIBCALL-NEXT:    movl (%rdi), %eax<br>
-; CHECK-LIBCALL-NEXT:    movl 4(%rdi), %ecx<br>
-; CHECK-LIBCALL-NEXT:    movl %eax, (%rsp)<br>
-; CHECK-LIBCALL-NEXT:    movl %ecx, {{[0-9]+}}(%rsp)<br>
-; CHECK-LIBCALL-NEXT:    movaps (%rsp), %xmm0<br>
-; CHECK-LIBCALL-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
-; CHECK-LIBCALL-NEXT:    movdqa {{[0-9]+}}(%rsp), %xmm0<br>
+; CHECK-LIBCALL-NEXT:    subq $72, %rsp<br>
+; CHECK-LIBCALL-NEXT:    pinsrw $0, (%rdi), %xmm0<br>
 ; CHECK-LIBCALL-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
-; CHECK-LIBCALL-NEXT:    pextrw $1, %xmm0, %edi<br>
-; CHECK-LIBCALL-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-LIBCALL-NEXT:    pinsrw $0, 2(%rdi), %xmm0<br>
 ; CHECK-LIBCALL-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
-; CHECK-LIBCALL-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
-; CHECK-LIBCALL-NEXT:    pextrw $0, %xmm0, %edi<br>
-; CHECK-LIBCALL-NEXT:    callq __gnu_h2f_ieee@PLT<br>
-; CHECK-LIBCALL-NEXT:    punpckldq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload<br>
-; CHECK-LIBCALL-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]<br>
+; CHECK-LIBCALL-NEXT:    pinsrw $0, 4(%rdi), %xmm0<br>
+; CHECK-LIBCALL-NEXT:    movdqa %xmm0, (%rsp) # 16-byte Spill<br>
+; CHECK-LIBCALL-NEXT:    pinsrw $0, 6(%rdi), %xmm0<br>
+; CHECK-LIBCALL-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-LIBCALL-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
-; CHECK-LIBCALL-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
-; CHECK-LIBCALL-NEXT:    pextrw $1, %xmm0, %edi<br>
-; CHECK-LIBCALL-NEXT:    callq __gnu_h2f_ieee@PLT<br>
-; CHECK-LIBCALL-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
-; CHECK-LIBCALL-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
-; CHECK-LIBCALL-NEXT:    pextrw $0, %xmm0, %edi<br>
-; CHECK-LIBCALL-NEXT:    callq __gnu_h2f_ieee@PLT<br>
-; CHECK-LIBCALL-NEXT:    punpckldq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload<br>
+; CHECK-LIBCALL-NEXT:    movaps (%rsp), %xmm0 # 16-byte Reload<br>
+; CHECK-LIBCALL-NEXT:    callq __extendhfsf2@PLT<br>
+; CHECK-LIBCALL-NEXT:    unpcklps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload<br>
 ; CHECK-LIBCALL-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]<br>
-; CHECK-LIBCALL-NEXT:    punpcklqdq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload<br>
+; CHECK-LIBCALL-NEXT:    movaps %xmm0, (%rsp) # 16-byte Spill<br>
+; CHECK-LIBCALL-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-LIBCALL-NEXT:    callq __extendhfsf2@PLT<br>
+; CHECK-LIBCALL-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-LIBCALL-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-LIBCALL-NEXT:    callq __extendhfsf2@PLT<br>
+; CHECK-LIBCALL-NEXT:    unpcklps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload<br>
+; CHECK-LIBCALL-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]<br>
+; CHECK-LIBCALL-NEXT:    unpcklpd (%rsp), %xmm0 # 16-byte Folded Reload<br>
 ; CHECK-LIBCALL-NEXT:    # xmm0 = xmm0[0],mem[0]<br>
-; CHECK-LIBCALL-NEXT:    addq $88, %rsp<br>
+; CHECK-LIBCALL-NEXT:    addq $72, %rsp<br>
 ; CHECK-LIBCALL-NEXT:    retq<br>
 ;<br>
 ; BWON-F16C-LABEL: test_extend32_vec4:<br>
@@ -445,38 +431,36 @@ define <4 x float> @test_extend32_vec4(<4 x half>* %p) #0 {<br>
 ;<br>
 ; CHECK-I686-LABEL: test_extend32_vec4:<br>
 ; CHECK-I686:       # %bb.0:<br>
-; CHECK-I686-NEXT:    subl $124, %esp<br>
+; CHECK-I686-NEXT:    pushl %esi<br>
+; CHECK-I686-NEXT:    subl $88, %esp<br>
 ; CHECK-I686-NEXT:    movl {{[0-9]+}}(%esp), %eax<br>
-; CHECK-I686-NEXT:    movl (%eax), %ecx<br>
-; CHECK-I686-NEXT:    movl 4(%eax), %eax<br>
-; CHECK-I686-NEXT:    movl %eax, {{[0-9]+}}(%esp)<br>
-; CHECK-I686-NEXT:    movl %ecx, {{[0-9]+}}(%esp)<br>
-; CHECK-I686-NEXT:    movaps {{[0-9]+}}(%esp), %xmm0<br>
-; CHECK-I686-NEXT:    movaps %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill<br>
-; CHECK-I686-NEXT:    movdqa {{[0-9]+}}(%esp), %xmm0<br>
+; CHECK-I686-NEXT:    pinsrw $0, (%eax), %xmm0<br>
 ; CHECK-I686-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill<br>
-; CHECK-I686-NEXT:    pextrw $1, %xmm0, %eax<br>
-; CHECK-I686-NEXT:    movl %eax, (%esp)<br>
-; CHECK-I686-NEXT:    calll __gnu_h2f_ieee<br>
+; CHECK-I686-NEXT:    pinsrw $0, 6(%eax), %xmm0<br>
+; CHECK-I686-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-I686-NEXT:    pinsrw $0, 4(%eax), %xmm0<br>
+; CHECK-I686-NEXT:    pinsrw $0, 2(%eax), %xmm1<br>
+; CHECK-I686-NEXT:    pextrw $0, %xmm1, %eax<br>
+; CHECK-I686-NEXT:    movw %ax, (%esp)<br>
+; CHECK-I686-NEXT:    pextrw $0, %xmm0, %esi<br>
+; CHECK-I686-NEXT:    calll __extendhfsf2<br>
 ; CHECK-I686-NEXT:    fstpt {{[-0-9]+}}(%e{{[sb]}}p) # 10-byte Folded Spill<br>
+; CHECK-I686-NEXT:    movw %si, (%esp)<br>
 ; CHECK-I686-NEXT:    movdqa {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload<br>
-; CHECK-I686-NEXT:    pextrw $0, %xmm0, %eax<br>
-; CHECK-I686-NEXT:    movl %eax, (%esp)<br>
-; CHECK-I686-NEXT:    calll __gnu_h2f_ieee<br>
+; CHECK-I686-NEXT:    pextrw $0, %xmm0, %esi<br>
+; CHECK-I686-NEXT:    calll __extendhfsf2<br>
 ; CHECK-I686-NEXT:    fstpt {{[-0-9]+}}(%e{{[sb]}}p) # 10-byte Folded Spill<br>
+; CHECK-I686-NEXT:    movw %si, (%esp)<br>
 ; CHECK-I686-NEXT:    movdqa {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload<br>
-; CHECK-I686-NEXT:    pextrw $1, %xmm0, %eax<br>
-; CHECK-I686-NEXT:    movl %eax, (%esp)<br>
-; CHECK-I686-NEXT:    calll __gnu_h2f_ieee<br>
-; CHECK-I686-NEXT:    movdqa {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload<br>
-; CHECK-I686-NEXT:    pextrw $0, %xmm0, %eax<br>
-; CHECK-I686-NEXT:    movl %eax, (%esp)<br>
+; CHECK-I686-NEXT:    pextrw $0, %xmm0, %esi<br>
+; CHECK-I686-NEXT:    calll __extendhfsf2<br>
+; CHECK-I686-NEXT:    movw %si, (%esp)<br>
 ; CHECK-I686-NEXT:    fstps {{[0-9]+}}(%esp)<br>
 ; CHECK-I686-NEXT:    fldt {{[-0-9]+}}(%e{{[sb]}}p) # 10-byte Folded Reload<br>
 ; CHECK-I686-NEXT:    fstps {{[0-9]+}}(%esp)<br>
 ; CHECK-I686-NEXT:    fldt {{[-0-9]+}}(%e{{[sb]}}p) # 10-byte Folded Reload<br>
 ; CHECK-I686-NEXT:    fstps {{[0-9]+}}(%esp)<br>
-; CHECK-I686-NEXT:    calll __gnu_h2f_ieee<br>
+; CHECK-I686-NEXT:    calll __extendhfsf2<br>
 ; CHECK-I686-NEXT:    fstps {{[0-9]+}}(%esp)<br>
 ; CHECK-I686-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero<br>
 ; CHECK-I686-NEXT:    movss {{.*#+}} xmm1 = mem[0],zero,zero,zero<br>
@@ -485,7 +469,8 @@ define <4 x float> @test_extend32_vec4(<4 x half>* %p) #0 {<br>
 ; CHECK-I686-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero<br>
 ; CHECK-I686-NEXT:    unpcklps {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]<br>
 ; CHECK-I686-NEXT:    movlhps {{.*#+}} xmm0 = xmm0[0],xmm1[0]<br>
-; CHECK-I686-NEXT:    addl $124, %esp<br>
+; CHECK-I686-NEXT:    addl $88, %esp<br>
+; CHECK-I686-NEXT:    popl %esi<br>
 ; CHECK-I686-NEXT:    retl<br>
   %a = load <4 x half>, <4 x half>* %p, align 8<br>
   %b = fpext <4 x half> %a to <4 x float><br>
@@ -495,37 +480,34 @@ define <4 x float> @test_extend32_vec4(<4 x half>* %p) #0 {<br>
 define <4 x double> @test_extend64_vec4(<4 x half>* %p) #0 {<br>
 ; CHECK-LIBCALL-LABEL: test_extend64_vec4:<br>
 ; CHECK-LIBCALL:       # %bb.0:<br>
-; CHECK-LIBCALL-NEXT:    pushq %rbp<br>
-; CHECK-LIBCALL-NEXT:    pushq %r14<br>
-; CHECK-LIBCALL-NEXT:    pushq %rbx<br>
-; CHECK-LIBCALL-NEXT:    subq $32, %rsp<br>
-; CHECK-LIBCALL-NEXT:    movzwl 4(%rdi), %r14d<br>
-; CHECK-LIBCALL-NEXT:    movzwl 6(%rdi), %ebp<br>
-; CHECK-LIBCALL-NEXT:    movzwl (%rdi), %ebx<br>
-; CHECK-LIBCALL-NEXT:    movzwl 2(%rdi), %edi<br>
-; CHECK-LIBCALL-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-LIBCALL-NEXT:    subq $72, %rsp<br>
+; CHECK-LIBCALL-NEXT:    pinsrw $0, 4(%rdi), %xmm0<br>
+; CHECK-LIBCALL-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-LIBCALL-NEXT:    pinsrw $0, 6(%rdi), %xmm0<br>
+; CHECK-LIBCALL-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-LIBCALL-NEXT:    pinsrw $0, (%rdi), %xmm0<br>
+; CHECK-LIBCALL-NEXT:    movdqa %xmm0, (%rsp) # 16-byte Spill<br>
+; CHECK-LIBCALL-NEXT:    pinsrw $0, 2(%rdi), %xmm0<br>
+; CHECK-LIBCALL-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-LIBCALL-NEXT:    cvtss2sd %xmm0, %xmm0<br>
-; CHECK-LIBCALL-NEXT:    movaps %xmm0, (%rsp) # 16-byte Spill<br>
-; CHECK-LIBCALL-NEXT:    movl %ebx, %edi<br>
-; CHECK-LIBCALL-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-LIBCALL-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-LIBCALL-NEXT:    movaps (%rsp), %xmm0 # 16-byte Reload<br>
+; CHECK-LIBCALL-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-LIBCALL-NEXT:    cvtss2sd %xmm0, %xmm0<br>
-; CHECK-LIBCALL-NEXT:    unpcklpd (%rsp), %xmm0 # 16-byte Folded Reload<br>
+; CHECK-LIBCALL-NEXT:    unpcklpd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload<br>
 ; CHECK-LIBCALL-NEXT:    # xmm0 = xmm0[0],mem[0]<br>
 ; CHECK-LIBCALL-NEXT:    movaps %xmm0, (%rsp) # 16-byte Spill<br>
-; CHECK-LIBCALL-NEXT:    movl %ebp, %edi<br>
-; CHECK-LIBCALL-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-LIBCALL-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-LIBCALL-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-LIBCALL-NEXT:    cvtss2sd %xmm0, %xmm0<br>
 ; CHECK-LIBCALL-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
-; CHECK-LIBCALL-NEXT:    movl %r14d, %edi<br>
-; CHECK-LIBCALL-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-LIBCALL-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-LIBCALL-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-LIBCALL-NEXT:    cvtss2sd %xmm0, %xmm1<br>
 ; CHECK-LIBCALL-NEXT:    unpcklpd {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Folded Reload<br>
 ; CHECK-LIBCALL-NEXT:    # xmm1 = xmm1[0],mem[0]<br>
 ; CHECK-LIBCALL-NEXT:    movaps (%rsp), %xmm0 # 16-byte Reload<br>
-; CHECK-LIBCALL-NEXT:    addq $32, %rsp<br>
-; CHECK-LIBCALL-NEXT:    popq %rbx<br>
-; CHECK-LIBCALL-NEXT:    popq %r14<br>
-; CHECK-LIBCALL-NEXT:    popq %rbp<br>
+; CHECK-LIBCALL-NEXT:    addq $72, %rsp<br>
 ; CHECK-LIBCALL-NEXT:    retq<br>
 ;<br>
 ; BWON-F16C-LABEL: test_extend64_vec4:<br>
@@ -536,39 +518,43 @@ define <4 x double> @test_extend64_vec4(<4 x half>* %p) #0 {<br>
 ;<br>
 ; CHECK-I686-LABEL: test_extend64_vec4:<br>
 ; CHECK-I686:       # %bb.0:<br>
-; CHECK-I686-NEXT:    pushl %ebx<br>
-; CHECK-I686-NEXT:    pushl %edi<br>
 ; CHECK-I686-NEXT:    pushl %esi<br>
-; CHECK-I686-NEXT:    subl $64, %esp<br>
+; CHECK-I686-NEXT:    subl $104, %esp<br>
 ; CHECK-I686-NEXT:    movl {{[0-9]+}}(%esp), %eax<br>
-; CHECK-I686-NEXT:    movzwl 6(%eax), %esi<br>
-; CHECK-I686-NEXT:    movzwl (%eax), %edi<br>
-; CHECK-I686-NEXT:    movzwl 2(%eax), %ebx<br>
-; CHECK-I686-NEXT:    movzwl 4(%eax), %eax<br>
-; CHECK-I686-NEXT:    movl %eax, (%esp)<br>
-; CHECK-I686-NEXT:    calll __gnu_h2f_ieee<br>
+; CHECK-I686-NEXT:    pinsrw $0, 6(%eax), %xmm0<br>
+; CHECK-I686-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-I686-NEXT:    pinsrw $0, (%eax), %xmm0<br>
+; CHECK-I686-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-I686-NEXT:    pinsrw $0, 2(%eax), %xmm0<br>
+; CHECK-I686-NEXT:    pinsrw $0, 4(%eax), %xmm1<br>
+; CHECK-I686-NEXT:    pextrw $0, %xmm1, %eax<br>
+; CHECK-I686-NEXT:    movw %ax, (%esp)<br>
+; CHECK-I686-NEXT:    pextrw $0, %xmm0, %esi<br>
+; CHECK-I686-NEXT:    calll __extendhfsf2<br>
 ; CHECK-I686-NEXT:    fstpt {{[-0-9]+}}(%e{{[sb]}}p) # 10-byte Folded Spill<br>
-; CHECK-I686-NEXT:    movl %ebx, (%esp)<br>
-; CHECK-I686-NEXT:    calll __gnu_h2f_ieee<br>
+; CHECK-I686-NEXT:    movw %si, (%esp)<br>
+; CHECK-I686-NEXT:    movdqa {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-I686-NEXT:    pextrw $0, %xmm0, %esi<br>
+; CHECK-I686-NEXT:    calll __extendhfsf2<br>
 ; CHECK-I686-NEXT:    fstpt {{[-0-9]+}}(%e{{[sb]}}p) # 10-byte Folded Spill<br>
-; CHECK-I686-NEXT:    movl %edi, (%esp)<br>
-; CHECK-I686-NEXT:    calll __gnu_h2f_ieee<br>
-; CHECK-I686-NEXT:    movl %esi, (%esp)<br>
+; CHECK-I686-NEXT:    movw %si, (%esp)<br>
+; CHECK-I686-NEXT:    movdqa {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-I686-NEXT:    pextrw $0, %xmm0, %esi<br>
+; CHECK-I686-NEXT:    calll __extendhfsf2<br>
+; CHECK-I686-NEXT:    movw %si, (%esp)<br>
 ; CHECK-I686-NEXT:    fstpl {{[0-9]+}}(%esp)<br>
 ; CHECK-I686-NEXT:    fldt {{[-0-9]+}}(%e{{[sb]}}p) # 10-byte Folded Reload<br>
 ; CHECK-I686-NEXT:    fstpl {{[0-9]+}}(%esp)<br>
 ; CHECK-I686-NEXT:    fldt {{[-0-9]+}}(%e{{[sb]}}p) # 10-byte Folded Reload<br>
 ; CHECK-I686-NEXT:    fstpl {{[0-9]+}}(%esp)<br>
-; CHECK-I686-NEXT:    calll __gnu_h2f_ieee<br>
+; CHECK-I686-NEXT:    calll __extendhfsf2<br>
 ; CHECK-I686-NEXT:    fstpl {{[0-9]+}}(%esp)<br>
 ; CHECK-I686-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero<br>
 ; CHECK-I686-NEXT:    movhps {{.*#+}} xmm0 = xmm0[0,1],mem[0,1]<br>
 ; CHECK-I686-NEXT:    movsd {{.*#+}} xmm1 = mem[0],zero<br>
 ; CHECK-I686-NEXT:    movhps {{.*#+}} xmm1 = xmm1[0,1],mem[0,1]<br>
-; CHECK-I686-NEXT:    addl $64, %esp<br>
+; CHECK-I686-NEXT:    addl $104, %esp<br>
 ; CHECK-I686-NEXT:    popl %esi<br>
-; CHECK-I686-NEXT:    popl %edi<br>
-; CHECK-I686-NEXT:    popl %ebx<br>
 ; CHECK-I686-NEXT:    retl<br>
   %a = load <4 x half>, <4 x half>* %p, align 8<br>
   %b = fpext <4 x half> %a to <4 x double><br>
@@ -576,71 +562,39 @@ define <4 x double> @test_extend64_vec4(<4 x half>* %p) #0 {<br>
 }<br>
<br>
 define void @test_trunc32_vec4(<4 x float> %a, <4 x half>* %p) #0 {<br>
-; BWON-NOF16C-LABEL: test_trunc32_vec4:<br>
-; BWON-NOF16C:       # %bb.0:<br>
-; BWON-NOF16C-NEXT:    pushq %rbp<br>
-; BWON-NOF16C-NEXT:    pushq %r15<br>
-; BWON-NOF16C-NEXT:    pushq %r14<br>
-; BWON-NOF16C-NEXT:    pushq %rbx<br>
-; BWON-NOF16C-NEXT:    subq $24, %rsp<br>
-; BWON-NOF16C-NEXT:    movq %rdi, %rbx<br>
-; BWON-NOF16C-NEXT:    movaps %xmm0, (%rsp) # 16-byte Spill<br>
-; BWON-NOF16C-NEXT:    shufps {{.*#+}} xmm0 = xmm0[1,1,1,1]<br>
-; BWON-NOF16C-NEXT:    callq __gnu_f2h_ieee@PLT<br>
-; BWON-NOF16C-NEXT:    movl %eax, %r14d<br>
-; BWON-NOF16C-NEXT:    movaps (%rsp), %xmm0 # 16-byte Reload<br>
-; BWON-NOF16C-NEXT:    movhlps {{.*#+}} xmm0 = xmm0[1,1]<br>
-; BWON-NOF16C-NEXT:    callq __gnu_f2h_ieee@PLT<br>
-; BWON-NOF16C-NEXT:    movl %eax, %r15d<br>
-; BWON-NOF16C-NEXT:    movaps (%rsp), %xmm0 # 16-byte Reload<br>
-; BWON-NOF16C-NEXT:    shufps {{.*#+}} xmm0 = xmm0[3,3,3,3]<br>
-; BWON-NOF16C-NEXT:    callq __gnu_f2h_ieee@PLT<br>
-; BWON-NOF16C-NEXT:    movl %eax, %ebp<br>
-; BWON-NOF16C-NEXT:    movaps (%rsp), %xmm0 # 16-byte Reload<br>
-; BWON-NOF16C-NEXT:    callq __gnu_f2h_ieee@PLT<br>
-; BWON-NOF16C-NEXT:    movw %ax, (%rbx)<br>
-; BWON-NOF16C-NEXT:    movw %bp, 6(%rbx)<br>
-; BWON-NOF16C-NEXT:    movw %r15w, 4(%rbx)<br>
-; BWON-NOF16C-NEXT:    movw %r14w, 2(%rbx)<br>
-; BWON-NOF16C-NEXT:    addq $24, %rsp<br>
-; BWON-NOF16C-NEXT:    popq %rbx<br>
-; BWON-NOF16C-NEXT:    popq %r14<br>
-; BWON-NOF16C-NEXT:    popq %r15<br>
-; BWON-NOF16C-NEXT:    popq %rbp<br>
-; BWON-NOF16C-NEXT:    retq<br>
-;<br>
-; BWOFF-LABEL: test_trunc32_vec4:<br>
-; BWOFF:       # %bb.0:<br>
-; BWOFF-NEXT:    pushq %rbp<br>
-; BWOFF-NEXT:    pushq %r15<br>
-; BWOFF-NEXT:    pushq %r14<br>
-; BWOFF-NEXT:    pushq %rbx<br>
-; BWOFF-NEXT:    subq $24, %rsp<br>
-; BWOFF-NEXT:    movq %rdi, %rbx<br>
-; BWOFF-NEXT:    movaps %xmm0, (%rsp) # 16-byte Spill<br>
-; BWOFF-NEXT:    shufps {{.*#+}} xmm0 = xmm0[1,1,1,1]<br>
-; BWOFF-NEXT:    callq __gnu_f2h_ieee@PLT<br>
-; BWOFF-NEXT:    movw %ax, %r14w<br>
-; BWOFF-NEXT:    movaps (%rsp), %xmm0 # 16-byte Reload<br>
-; BWOFF-NEXT:    movhlps {{.*#+}} xmm0 = xmm0[1,1]<br>
-; BWOFF-NEXT:    callq __gnu_f2h_ieee@PLT<br>
-; BWOFF-NEXT:    movw %ax, %r15w<br>
-; BWOFF-NEXT:    movaps (%rsp), %xmm0 # 16-byte Reload<br>
-; BWOFF-NEXT:    shufps {{.*#+}} xmm0 = xmm0[3,3,3,3]<br>
-; BWOFF-NEXT:    callq __gnu_f2h_ieee@PLT<br>
-; BWOFF-NEXT:    movw %ax, %bp<br>
-; BWOFF-NEXT:    movaps (%rsp), %xmm0 # 16-byte Reload<br>
-; BWOFF-NEXT:    callq __gnu_f2h_ieee@PLT<br>
-; BWOFF-NEXT:    movw %ax, (%rbx)<br>
-; BWOFF-NEXT:    movw %bp, 6(%rbx)<br>
-; BWOFF-NEXT:    movw %r15w, 4(%rbx)<br>
-; BWOFF-NEXT:    movw %r14w, 2(%rbx)<br>
-; BWOFF-NEXT:    addq $24, %rsp<br>
-; BWOFF-NEXT:    popq %rbx<br>
-; BWOFF-NEXT:    popq %r14<br>
-; BWOFF-NEXT:    popq %r15<br>
-; BWOFF-NEXT:    popq %rbp<br>
-; BWOFF-NEXT:    retq<br>
+; CHECK-LIBCALL-LABEL: test_trunc32_vec4:<br>
+; CHECK-LIBCALL:       # %bb.0:<br>
+; CHECK-LIBCALL-NEXT:    pushq %rbx<br>
+; CHECK-LIBCALL-NEXT:    subq $64, %rsp<br>
+; CHECK-LIBCALL-NEXT:    movq %rdi, %rbx<br>
+; CHECK-LIBCALL-NEXT:    movaps %xmm0, (%rsp) # 16-byte Spill<br>
+; CHECK-LIBCALL-NEXT:    shufps {{.*#+}} xmm0 = xmm0[1,1,1,1]<br>
+; CHECK-LIBCALL-NEXT:    callq __truncsfhf2@PLT<br>
+; CHECK-LIBCALL-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-LIBCALL-NEXT:    movaps (%rsp), %xmm0 # 16-byte Reload<br>
+; CHECK-LIBCALL-NEXT:    movhlps {{.*#+}} xmm0 = xmm0[1,1]<br>
+; CHECK-LIBCALL-NEXT:    callq __truncsfhf2@PLT<br>
+; CHECK-LIBCALL-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-LIBCALL-NEXT:    movaps (%rsp), %xmm0 # 16-byte Reload<br>
+; CHECK-LIBCALL-NEXT:    shufps {{.*#+}} xmm0 = xmm0[3,3,3,3]<br>
+; CHECK-LIBCALL-NEXT:    callq __truncsfhf2@PLT<br>
+; CHECK-LIBCALL-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-LIBCALL-NEXT:    movdqa (%rsp), %xmm0 # 16-byte Reload<br>
+; CHECK-LIBCALL-NEXT:    callq __truncsfhf2@PLT<br>
+; CHECK-LIBCALL-NEXT:    pextrw $0, %xmm0, %eax<br>
+; CHECK-LIBCALL-NEXT:    movw %ax, (%rbx)<br>
+; CHECK-LIBCALL-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-LIBCALL-NEXT:    pextrw $0, %xmm0, %eax<br>
+; CHECK-LIBCALL-NEXT:    movw %ax, 6(%rbx)<br>
+; CHECK-LIBCALL-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-LIBCALL-NEXT:    pextrw $0, %xmm0, %eax<br>
+; CHECK-LIBCALL-NEXT:    movw %ax, 4(%rbx)<br>
+; CHECK-LIBCALL-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-LIBCALL-NEXT:    pextrw $0, %xmm0, %eax<br>
+; CHECK-LIBCALL-NEXT:    movw %ax, 2(%rbx)<br>
+; CHECK-LIBCALL-NEXT:    addq $64, %rsp<br>
+; CHECK-LIBCALL-NEXT:    popq %rbx<br>
+; CHECK-LIBCALL-NEXT:    retq<br>
 ;<br>
 ; BWON-F16C-LABEL: test_trunc32_vec4:<br>
 ; BWON-F16C:       # %bb.0:<br>
@@ -649,40 +603,41 @@ define void @test_trunc32_vec4(<4 x float> %a, <4 x half>* %p) #0 {<br>
 ;<br>
 ; CHECK-I686-LABEL: test_trunc32_vec4:<br>
 ; CHECK-I686:       # %bb.0:<br>
-; CHECK-I686-NEXT:    pushl %ebp<br>
-; CHECK-I686-NEXT:    pushl %ebx<br>
-; CHECK-I686-NEXT:    pushl %edi<br>
 ; CHECK-I686-NEXT:    pushl %esi<br>
-; CHECK-I686-NEXT:    subl $44, %esp<br>
+; CHECK-I686-NEXT:    subl $88, %esp<br>
 ; CHECK-I686-NEXT:    movaps %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill<br>
-; CHECK-I686-NEXT:    movl {{[0-9]+}}(%esp), %ebp<br>
+; CHECK-I686-NEXT:    movl {{[0-9]+}}(%esp), %esi<br>
 ; CHECK-I686-NEXT:    movaps %xmm0, %xmm1<br>
 ; CHECK-I686-NEXT:    shufps {{.*#+}} xmm1 = xmm1[1,1],xmm0[1,1]<br>
 ; CHECK-I686-NEXT:    movss %xmm1, (%esp)<br>
-; CHECK-I686-NEXT:    calll __gnu_f2h_ieee<br>
-; CHECK-I686-NEXT:    movw %ax, %si<br>
+; CHECK-I686-NEXT:    calll __truncsfhf2<br>
+; CHECK-I686-NEXT:    movaps %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill<br>
 ; CHECK-I686-NEXT:    movaps {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload<br>
 ; CHECK-I686-NEXT:    movhlps {{.*#+}} xmm0 = xmm0[1,1]<br>
 ; CHECK-I686-NEXT:    movss %xmm0, (%esp)<br>
-; CHECK-I686-NEXT:    calll __gnu_f2h_ieee<br>
-; CHECK-I686-NEXT:    movw %ax, %di<br>
+; CHECK-I686-NEXT:    calll __truncsfhf2<br>
+; CHECK-I686-NEXT:    movaps %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill<br>
 ; CHECK-I686-NEXT:    movaps {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload<br>
 ; CHECK-I686-NEXT:    shufps {{.*#+}} xmm0 = xmm0[3,3,3,3]<br>
 ; CHECK-I686-NEXT:    movss %xmm0, (%esp)<br>
-; CHECK-I686-NEXT:    calll __gnu_f2h_ieee<br>
-; CHECK-I686-NEXT:    movw %ax, %bx<br>
-; CHECK-I686-NEXT:    movaps {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload<br>
-; CHECK-I686-NEXT:    movss %xmm0, (%esp)<br>
-; CHECK-I686-NEXT:    calll __gnu_f2h_ieee<br>
-; CHECK-I686-NEXT:    movw %ax, (%ebp)<br>
-; CHECK-I686-NEXT:    movw %bx, 6(%ebp)<br>
-; CHECK-I686-NEXT:    movw %di, 4(%ebp)<br>
-; CHECK-I686-NEXT:    movw %si, 2(%ebp)<br>
-; CHECK-I686-NEXT:    addl $44, %esp<br>
+; CHECK-I686-NEXT:    calll __truncsfhf2<br>
+; CHECK-I686-NEXT:    movaps %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-I686-NEXT:    movdqa {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-I686-NEXT:    movd %xmm0, (%esp)<br>
+; CHECK-I686-NEXT:    calll __truncsfhf2<br>
+; CHECK-I686-NEXT:    pextrw $0, %xmm0, %eax<br>
+; CHECK-I686-NEXT:    movw %ax, (%esi)<br>
+; CHECK-I686-NEXT:    movdqa {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-I686-NEXT:    pextrw $0, %xmm0, %eax<br>
+; CHECK-I686-NEXT:    movw %ax, 6(%esi)<br>
+; CHECK-I686-NEXT:    movdqa {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-I686-NEXT:    pextrw $0, %xmm0, %eax<br>
+; CHECK-I686-NEXT:    movw %ax, 4(%esi)<br>
+; CHECK-I686-NEXT:    movdqa {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-I686-NEXT:    pextrw $0, %xmm0, %eax<br>
+; CHECK-I686-NEXT:    movw %ax, 2(%esi)<br>
+; CHECK-I686-NEXT:    addl $88, %esp<br>
 ; CHECK-I686-NEXT:    popl %esi<br>
-; CHECK-I686-NEXT:    popl %edi<br>
-; CHECK-I686-NEXT:    popl %ebx<br>
-; CHECK-I686-NEXT:    popl %ebp<br>
 ; CHECK-I686-NEXT:    retl<br>
   %v = fptrunc <4 x float> %a to <4 x half><br>
   store <4 x half> %v, <4 x half>* %p<br>
@@ -690,143 +645,98 @@ define void @test_trunc32_vec4(<4 x float> %a, <4 x half>* %p) #0 {<br>
 }<br>
<br>
 define void @test_trunc64_vec4(<4 x double> %a, <4 x half>* %p) #0 {<br>
-; BWON-NOF16C-LABEL: test_trunc64_vec4:<br>
-; BWON-NOF16C:       # %bb.0:<br>
-; BWON-NOF16C-NEXT:    pushq %rbp<br>
-; BWON-NOF16C-NEXT:    pushq %r15<br>
-; BWON-NOF16C-NEXT:    pushq %r14<br>
-; BWON-NOF16C-NEXT:    pushq %rbx<br>
-; BWON-NOF16C-NEXT:    subq $40, %rsp<br>
-; BWON-NOF16C-NEXT:    movq %rdi, %rbx<br>
-; BWON-NOF16C-NEXT:    movaps %xmm1, (%rsp) # 16-byte Spill<br>
-; BWON-NOF16C-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
-; BWON-NOF16C-NEXT:    movhlps {{.*#+}} xmm0 = xmm0[1,1]<br>
-; BWON-NOF16C-NEXT:    callq __truncdfhf2@PLT<br>
-; BWON-NOF16C-NEXT:    movl %eax, %r14d<br>
-; BWON-NOF16C-NEXT:    movaps (%rsp), %xmm0 # 16-byte Reload<br>
-; BWON-NOF16C-NEXT:    movhlps {{.*#+}} xmm0 = xmm0[1,1]<br>
-; BWON-NOF16C-NEXT:    callq __truncdfhf2@PLT<br>
-; BWON-NOF16C-NEXT:    movl %eax, %r15d<br>
-; BWON-NOF16C-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
-; BWON-NOF16C-NEXT:    callq __truncdfhf2@PLT<br>
-; BWON-NOF16C-NEXT:    movl %eax, %ebp<br>
-; BWON-NOF16C-NEXT:    movaps (%rsp), %xmm0 # 16-byte Reload<br>
-; BWON-NOF16C-NEXT:    callq __truncdfhf2@PLT<br>
-; BWON-NOF16C-NEXT:    movw %ax, 4(%rbx)<br>
-; BWON-NOF16C-NEXT:    movw %bp, (%rbx)<br>
-; BWON-NOF16C-NEXT:    movw %r15w, 6(%rbx)<br>
-; BWON-NOF16C-NEXT:    movw %r14w, 2(%rbx)<br>
-; BWON-NOF16C-NEXT:    addq $40, %rsp<br>
-; BWON-NOF16C-NEXT:    popq %rbx<br>
-; BWON-NOF16C-NEXT:    popq %r14<br>
-; BWON-NOF16C-NEXT:    popq %r15<br>
-; BWON-NOF16C-NEXT:    popq %rbp<br>
-; BWON-NOF16C-NEXT:    retq<br>
-;<br>
-; BWOFF-LABEL: test_trunc64_vec4:<br>
-; BWOFF:       # %bb.0:<br>
-; BWOFF-NEXT:    pushq %rbp<br>
-; BWOFF-NEXT:    pushq %r15<br>
-; BWOFF-NEXT:    pushq %r14<br>
-; BWOFF-NEXT:    pushq %rbx<br>
-; BWOFF-NEXT:    subq $40, %rsp<br>
-; BWOFF-NEXT:    movq %rdi, %rbx<br>
-; BWOFF-NEXT:    movaps %xmm1, (%rsp) # 16-byte Spill<br>
-; BWOFF-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
-; BWOFF-NEXT:    movhlps {{.*#+}} xmm0 = xmm0[1,1]<br>
-; BWOFF-NEXT:    callq __truncdfhf2@PLT<br>
-; BWOFF-NEXT:    movw %ax, %r14w<br>
-; BWOFF-NEXT:    movaps (%rsp), %xmm0 # 16-byte Reload<br>
-; BWOFF-NEXT:    movhlps {{.*#+}} xmm0 = xmm0[1,1]<br>
-; BWOFF-NEXT:    callq __truncdfhf2@PLT<br>
-; BWOFF-NEXT:    movw %ax, %r15w<br>
-; BWOFF-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
-; BWOFF-NEXT:    callq __truncdfhf2@PLT<br>
-; BWOFF-NEXT:    movw %ax, %bp<br>
-; BWOFF-NEXT:    movaps (%rsp), %xmm0 # 16-byte Reload<br>
-; BWOFF-NEXT:    callq __truncdfhf2@PLT<br>
-; BWOFF-NEXT:    movw %ax, 4(%rbx)<br>
-; BWOFF-NEXT:    movw %bp, (%rbx)<br>
-; BWOFF-NEXT:    movw %r15w, 6(%rbx)<br>
-; BWOFF-NEXT:    movw %r14w, 2(%rbx)<br>
-; BWOFF-NEXT:    addq $40, %rsp<br>
-; BWOFF-NEXT:    popq %rbx<br>
-; BWOFF-NEXT:    popq %r14<br>
-; BWOFF-NEXT:    popq %r15<br>
-; BWOFF-NEXT:    popq %rbp<br>
-; BWOFF-NEXT:    retq<br>
+; CHECK-LIBCALL-LABEL: test_trunc64_vec4:<br>
+; CHECK-LIBCALL:       # %bb.0:<br>
+; CHECK-LIBCALL-NEXT:    pushq %rbx<br>
+; CHECK-LIBCALL-NEXT:    subq $64, %rsp<br>
+; CHECK-LIBCALL-NEXT:    movq %rdi, %rbx<br>
+; CHECK-LIBCALL-NEXT:    movaps %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-LIBCALL-NEXT:    movaps %xmm0, (%rsp) # 16-byte Spill<br>
+; CHECK-LIBCALL-NEXT:    movhlps {{.*#+}} xmm0 = xmm0[1,1]<br>
+; CHECK-LIBCALL-NEXT:    callq __truncdfhf2@PLT<br>
+; CHECK-LIBCALL-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-LIBCALL-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-LIBCALL-NEXT:    movhlps {{.*#+}} xmm0 = xmm0[1,1]<br>
+; CHECK-LIBCALL-NEXT:    callq __truncdfhf2@PLT<br>
+; CHECK-LIBCALL-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-LIBCALL-NEXT:    movaps (%rsp), %xmm0 # 16-byte Reload<br>
+; CHECK-LIBCALL-NEXT:    callq __truncdfhf2@PLT<br>
+; CHECK-LIBCALL-NEXT:    movaps %xmm0, (%rsp) # 16-byte Spill<br>
+; CHECK-LIBCALL-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-LIBCALL-NEXT:    callq __truncdfhf2@PLT<br>
+; CHECK-LIBCALL-NEXT:    pextrw $0, %xmm0, %eax<br>
+; CHECK-LIBCALL-NEXT:    movw %ax, 4(%rbx)<br>
+; CHECK-LIBCALL-NEXT:    movdqa (%rsp), %xmm0 # 16-byte Reload<br>
+; CHECK-LIBCALL-NEXT:    pextrw $0, %xmm0, %eax<br>
+; CHECK-LIBCALL-NEXT:    movw %ax, (%rbx)<br>
+; CHECK-LIBCALL-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-LIBCALL-NEXT:    pextrw $0, %xmm0, %eax<br>
+; CHECK-LIBCALL-NEXT:    movw %ax, 6(%rbx)<br>
+; CHECK-LIBCALL-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-LIBCALL-NEXT:    pextrw $0, %xmm0, %eax<br>
+; CHECK-LIBCALL-NEXT:    movw %ax, 2(%rbx)<br>
+; CHECK-LIBCALL-NEXT:    addq $64, %rsp<br>
+; CHECK-LIBCALL-NEXT:    popq %rbx<br>
+; CHECK-LIBCALL-NEXT:    retq<br>
 ;<br>
 ; BWON-F16C-LABEL: test_trunc64_vec4:<br>
 ; BWON-F16C:       # %bb.0:<br>
-; BWON-F16C-NEXT:    pushq %rbp<br>
-; BWON-F16C-NEXT:    pushq %r15<br>
-; BWON-F16C-NEXT:    pushq %r14<br>
-; BWON-F16C-NEXT:    pushq %rbx<br>
-; BWON-F16C-NEXT:    subq $56, %rsp<br>
-; BWON-F16C-NEXT:    movq %rdi, %rbx<br>
-; BWON-F16C-NEXT:    vmovupd %ymm0, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill<br>
-; BWON-F16C-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]<br>
-; BWON-F16C-NEXT:    vzeroupper<br>
-; BWON-F16C-NEXT:    callq __truncdfhf2@PLT<br>
-; BWON-F16C-NEXT:    movl %eax, %r14d<br>
-; BWON-F16C-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload<br>
-; BWON-F16C-NEXT:    vextractf128 $1, %ymm0, %xmm0<br>
-; BWON-F16C-NEXT:    vmovapd %xmm0, (%rsp) # 16-byte Spill<br>
-; BWON-F16C-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]<br>
-; BWON-F16C-NEXT:    vzeroupper<br>
-; BWON-F16C-NEXT:    callq __truncdfhf2@PLT<br>
-; BWON-F16C-NEXT:    movl %eax, %r15d<br>
-; BWON-F16C-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload<br>
-; BWON-F16C-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0<br>
+; BWON-F16C-NEXT:    vpermilpd {{.*#+}} xmm1 = xmm0[1,0]<br>
+; BWON-F16C-NEXT:    vcvtsd2ss %xmm1, %xmm1, %xmm1<br>
+; BWON-F16C-NEXT:    vcvtps2ph $4, %xmm1, %xmm1<br>
+; BWON-F16C-NEXT:    vmovd %xmm1, %eax<br>
+; BWON-F16C-NEXT:    vextractf128 $1, %ymm0, %xmm1<br>
+; BWON-F16C-NEXT:    vpermilpd {{.*#+}} xmm2 = xmm1[1,0]<br>
+; BWON-F16C-NEXT:    vcvtsd2ss %xmm2, %xmm2, %xmm2<br>
+; BWON-F16C-NEXT:    vcvtps2ph $4, %xmm2, %xmm2<br>
+; BWON-F16C-NEXT:    vmovd %xmm2, %ecx<br>
+; BWON-F16C-NEXT:    vcvtsd2ss %xmm0, %xmm0, %xmm0<br>
+; BWON-F16C-NEXT:    vcvtps2ph $4, %xmm0, %xmm0<br>
+; BWON-F16C-NEXT:    vmovd %xmm0, %edx<br>
+; BWON-F16C-NEXT:    vcvtsd2ss %xmm1, %xmm1, %xmm0<br>
+; BWON-F16C-NEXT:    vcvtps2ph $4, %xmm0, %xmm0<br>
+; BWON-F16C-NEXT:    vmovd %xmm0, %esi<br>
+; BWON-F16C-NEXT:    movw %si, 4(%rdi)<br>
+; BWON-F16C-NEXT:    movw %dx, (%rdi)<br>
+; BWON-F16C-NEXT:    movw %cx, 6(%rdi)<br>
+; BWON-F16C-NEXT:    movw %ax, 2(%rdi)<br>
 ; BWON-F16C-NEXT:    vzeroupper<br>
-; BWON-F16C-NEXT:    callq __truncdfhf2@PLT<br>
-; BWON-F16C-NEXT:    movl %eax, %ebp<br>
-; BWON-F16C-NEXT:    vmovaps (%rsp), %xmm0 # 16-byte Reload<br>
-; BWON-F16C-NEXT:    callq __truncdfhf2@PLT<br>
-; BWON-F16C-NEXT:    movw %ax, 4(%rbx)<br>
-; BWON-F16C-NEXT:    movw %bp, (%rbx)<br>
-; BWON-F16C-NEXT:    movw %r15w, 6(%rbx)<br>
-; BWON-F16C-NEXT:    movw %r14w, 2(%rbx)<br>
-; BWON-F16C-NEXT:    addq $56, %rsp<br>
-; BWON-F16C-NEXT:    popq %rbx<br>
-; BWON-F16C-NEXT:    popq %r14<br>
-; BWON-F16C-NEXT:    popq %r15<br>
-; BWON-F16C-NEXT:    popq %rbp<br>
 ; BWON-F16C-NEXT:    retq<br>
 ;<br>
 ; CHECK-I686-LABEL: test_trunc64_vec4:<br>
 ; CHECK-I686:       # %bb.0:<br>
-; CHECK-I686-NEXT:    pushl %ebp<br>
-; CHECK-I686-NEXT:    pushl %ebx<br>
-; CHECK-I686-NEXT:    pushl %edi<br>
 ; CHECK-I686-NEXT:    pushl %esi<br>
-; CHECK-I686-NEXT:    subl $60, %esp<br>
+; CHECK-I686-NEXT:    subl $88, %esp<br>
 ; CHECK-I686-NEXT:    movaps %xmm1, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill<br>
 ; CHECK-I686-NEXT:    movaps %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill<br>
-; CHECK-I686-NEXT:    movl {{[0-9]+}}(%esp), %ebp<br>
+; CHECK-I686-NEXT:    movl {{[0-9]+}}(%esp), %esi<br>
 ; CHECK-I686-NEXT:    movlps %xmm0, (%esp)<br>
 ; CHECK-I686-NEXT:    calll __truncdfhf2<br>
-; CHECK-I686-NEXT:    movw %ax, %si<br>
+; CHECK-I686-NEXT:    movaps %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill<br>
 ; CHECK-I686-NEXT:    movaps {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload<br>
 ; CHECK-I686-NEXT:    movhps %xmm0, (%esp)<br>
 ; CHECK-I686-NEXT:    calll __truncdfhf2<br>
-; CHECK-I686-NEXT:    movw %ax, %di<br>
+; CHECK-I686-NEXT:    movaps %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill<br>
 ; CHECK-I686-NEXT:    movaps {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload<br>
 ; CHECK-I686-NEXT:    movlps %xmm0, (%esp)<br>
 ; CHECK-I686-NEXT:    calll __truncdfhf2<br>
-; CHECK-I686-NEXT:    movw %ax, %bx<br>
+; CHECK-I686-NEXT:    movaps %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill<br>
 ; CHECK-I686-NEXT:    movaps {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload<br>
 ; CHECK-I686-NEXT:    movhps %xmm0, (%esp)<br>
 ; CHECK-I686-NEXT:    calll __truncdfhf2<br>
-; CHECK-I686-NEXT:    movw %ax, 6(%ebp)<br>
-; CHECK-I686-NEXT:    movw %bx, 4(%ebp)<br>
-; CHECK-I686-NEXT:    movw %di, 2(%ebp)<br>
-; CHECK-I686-NEXT:    movw %si, (%ebp)<br>
-; CHECK-I686-NEXT:    addl $60, %esp<br>
+; CHECK-I686-NEXT:    pextrw $0, %xmm0, %eax<br>
+; CHECK-I686-NEXT:    movw %ax, 6(%esi)<br>
+; CHECK-I686-NEXT:    movdqa {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-I686-NEXT:    pextrw $0, %xmm0, %eax<br>
+; CHECK-I686-NEXT:    movw %ax, 4(%esi)<br>
+; CHECK-I686-NEXT:    movdqa {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-I686-NEXT:    pextrw $0, %xmm0, %eax<br>
+; CHECK-I686-NEXT:    movw %ax, 2(%esi)<br>
+; CHECK-I686-NEXT:    movdqa {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-I686-NEXT:    pextrw $0, %xmm0, %eax<br>
+; CHECK-I686-NEXT:    movw %ax, (%esi)<br>
+; CHECK-I686-NEXT:    addl $88, %esp<br>
 ; CHECK-I686-NEXT:    popl %esi<br>
-; CHECK-I686-NEXT:    popl %edi<br>
-; CHECK-I686-NEXT:    popl %ebx<br>
-; CHECK-I686-NEXT:    popl %ebp<br>
 ; CHECK-I686-NEXT:    retl<br>
   %v = fptrunc <4 x double> %a to <4 x half><br>
   store <4 x half> %v, <4 x half>* %p<br>
@@ -843,8 +753,8 @@ define half @test_f80trunc_nodagcombine() #0 {<br>
 ; CHECK-LIBCALL:       # %bb.0:<br>
 ; CHECK-LIBCALL-NEXT:    pushq %rax<br>
 ; CHECK-LIBCALL-NEXT:    callq test_floatret@PLT<br>
-; CHECK-LIBCALL-NEXT:    callq __gnu_f2h_ieee@PLT<br>
-; CHECK-LIBCALL-NEXT:    popq %rcx<br>
+; CHECK-LIBCALL-NEXT:    callq __truncsfhf2@PLT<br>
+; CHECK-LIBCALL-NEXT:    popq %rax<br>
 ; CHECK-LIBCALL-NEXT:    retq<br>
 ;<br>
 ; BWON-F16C-LABEL: test_f80trunc_nodagcombine:<br>
@@ -853,8 +763,8 @@ define half @test_f80trunc_nodagcombine() #0 {<br>
 ; BWON-F16C-NEXT:    callq test_floatret@PLT<br>
 ; BWON-F16C-NEXT:    vcvtps2ph $4, %xmm0, %xmm0<br>
 ; BWON-F16C-NEXT:    vmovd %xmm0, %eax<br>
-; BWON-F16C-NEXT:    # kill: def $ax killed $ax killed $eax<br>
-; BWON-F16C-NEXT:    popq %rcx<br>
+; BWON-F16C-NEXT:    vpinsrw $0, %eax, %xmm0, %xmm0<br>
+; BWON-F16C-NEXT:    popq %rax<br>
 ; BWON-F16C-NEXT:    retq<br>
 ;<br>
 ; CHECK-I686-LABEL: test_f80trunc_nodagcombine:<br>
@@ -862,7 +772,7 @@ define half @test_f80trunc_nodagcombine() #0 {<br>
 ; CHECK-I686-NEXT:    subl $12, %esp<br>
 ; CHECK-I686-NEXT:    calll test_floatret@PLT<br>
 ; CHECK-I686-NEXT:    fstps (%esp)<br>
-; CHECK-I686-NEXT:    calll __gnu_f2h_ieee<br>
+; CHECK-I686-NEXT:    calll __truncsfhf2<br>
 ; CHECK-I686-NEXT:    addl $12, %esp<br>
 ; CHECK-I686-NEXT:    retl<br>
   %1 = call float @test_floatret()<br>
@@ -876,64 +786,70 @@ define half @test_f80trunc_nodagcombine() #0 {<br>
 define float @test_sitofp_fadd_i32(i32 %a, half* %b) #0 {<br>
 ; CHECK-LIBCALL-LABEL: test_sitofp_fadd_i32:<br>
 ; CHECK-LIBCALL:       # %bb.0:<br>
-; CHECK-LIBCALL-NEXT:    pushq %rbx<br>
-; CHECK-LIBCALL-NEXT:    subq $16, %rsp<br>
-; CHECK-LIBCALL-NEXT:    movzwl (%rsi), %ebx<br>
+; CHECK-LIBCALL-NEXT:    subq $40, %rsp<br>
+; CHECK-LIBCALL-NEXT:    pinsrw $0, (%rsi), %xmm0<br>
+; CHECK-LIBCALL-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-LIBCALL-NEXT:    xorps %xmm0, %xmm0<br>
 ; CHECK-LIBCALL-NEXT:    cvtsi2ss %edi, %xmm0<br>
-; CHECK-LIBCALL-NEXT:    callq __gnu_f2h_ieee@PLT<br>
-; CHECK-LIBCALL-NEXT:    movzwl %ax, %edi<br>
-; CHECK-LIBCALL-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-LIBCALL-NEXT:    callq __truncsfhf2@PLT<br>
 ; CHECK-LIBCALL-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-LIBCALL-NEXT:    movl %ebx, %edi<br>
-; CHECK-LIBCALL-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-LIBCALL-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-LIBCALL-NEXT:    callq __extendhfsf2@PLT<br>
+; CHECK-LIBCALL-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-LIBCALL-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-LIBCALL-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-LIBCALL-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-LIBCALL-NEXT:    addss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload<br>
-; CHECK-LIBCALL-NEXT:    callq __gnu_f2h_ieee@PLT<br>
-; CHECK-LIBCALL-NEXT:    movzwl %ax, %edi<br>
-; CHECK-LIBCALL-NEXT:    addq $16, %rsp<br>
-; CHECK-LIBCALL-NEXT:    popq %rbx<br>
-; CHECK-LIBCALL-NEXT:    jmp __gnu_h2f_ieee@PLT # TAILCALL<br>
+; CHECK-LIBCALL-NEXT:    callq __truncsfhf2@PLT<br>
+; CHECK-LIBCALL-NEXT:    addq $40, %rsp<br>
+; CHECK-LIBCALL-NEXT:    jmp __extendhfsf2@PLT # TAILCALL<br>
 ;<br>
 ; BWON-F16C-LABEL: test_sitofp_fadd_i32:<br>
 ; BWON-F16C:       # %bb.0:<br>
 ; BWON-F16C-NEXT:    movzwl (%rsi), %eax<br>
 ; BWON-F16C-NEXT:    vcvtsi2ss %edi, %xmm0, %xmm0<br>
 ; BWON-F16C-NEXT:    vcvtps2ph $4, %xmm0, %xmm0<br>
+; BWON-F16C-NEXT:    vpmovzxwq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero<br>
 ; BWON-F16C-NEXT:    vcvtph2ps %xmm0, %xmm0<br>
 ; BWON-F16C-NEXT:    vmovd %eax, %xmm1<br>
 ; BWON-F16C-NEXT:    vcvtph2ps %xmm1, %xmm1<br>
 ; BWON-F16C-NEXT:    vaddss %xmm0, %xmm1, %xmm0<br>
 ; BWON-F16C-NEXT:    vcvtps2ph $4, %xmm0, %xmm0<br>
+; BWON-F16C-NEXT:    vmovd %xmm0, %eax<br>
+; BWON-F16C-NEXT:    movzwl %ax, %eax<br>
+; BWON-F16C-NEXT:    vmovd %eax, %xmm0<br>
 ; BWON-F16C-NEXT:    vcvtph2ps %xmm0, %xmm0<br>
 ; BWON-F16C-NEXT:    retq<br>
 ;<br>
 ; CHECK-I686-LABEL: test_sitofp_fadd_i32:<br>
 ; CHECK-I686:       # %bb.0:<br>
-; CHECK-I686-NEXT:    pushl %edi<br>
-; CHECK-I686-NEXT:    pushl %esi<br>
-; CHECK-I686-NEXT:    subl $20, %esp<br>
+; CHECK-I686-NEXT:    subl $60, %esp<br>
 ; CHECK-I686-NEXT:    movl {{[0-9]+}}(%esp), %eax<br>
-; CHECK-I686-NEXT:    movzwl (%eax), %edi<br>
+; CHECK-I686-NEXT:    pinsrw $0, (%eax), %xmm0<br>
+; CHECK-I686-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-I686-NEXT:    xorps %xmm0, %xmm0<br>
 ; CHECK-I686-NEXT:    cvtsi2ssl {{[0-9]+}}(%esp), %xmm0<br>
 ; CHECK-I686-NEXT:    movss %xmm0, (%esp)<br>
-; CHECK-I686-NEXT:    calll __gnu_f2h_ieee<br>
-; CHECK-I686-NEXT:    movw %ax, %si<br>
-; CHECK-I686-NEXT:    movl %edi, (%esp)<br>
-; CHECK-I686-NEXT:    calll __gnu_h2f_ieee<br>
-; CHECK-I686-NEXT:    movzwl %si, %eax<br>
-; CHECK-I686-NEXT:    movl %eax, (%esp)<br>
+; CHECK-I686-NEXT:    calll __truncsfhf2<br>
+; CHECK-I686-NEXT:    movaps %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill<br>
+; CHECK-I686-NEXT:    movdqa {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-I686-NEXT:    pextrw $0, %xmm0, %eax<br>
+; CHECK-I686-NEXT:    movw %ax, (%esp)<br>
+; CHECK-I686-NEXT:    calll __extendhfsf2<br>
+; CHECK-I686-NEXT:    movdqa {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; CHECK-I686-NEXT:    pextrw $0, %xmm0, %eax<br>
+; CHECK-I686-NEXT:    movw %ax, (%esp)<br>
 ; CHECK-I686-NEXT:    fstps {{[0-9]+}}(%esp)<br>
-; CHECK-I686-NEXT:    calll __gnu_h2f_ieee<br>
+; CHECK-I686-NEXT:    calll __extendhfsf2<br>
 ; CHECK-I686-NEXT:    fstps {{[0-9]+}}(%esp)<br>
 ; CHECK-I686-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero<br>
 ; CHECK-I686-NEXT:    addss {{[0-9]+}}(%esp), %xmm0<br>
 ; CHECK-I686-NEXT:    movss %xmm0, (%esp)<br>
-; CHECK-I686-NEXT:    calll __gnu_f2h_ieee<br>
-; CHECK-I686-NEXT:    movzwl %ax, %eax<br>
-; CHECK-I686-NEXT:    movl %eax, (%esp)<br>
-; CHECK-I686-NEXT:    calll __gnu_h2f_ieee<br>
-; CHECK-I686-NEXT:    addl $20, %esp<br>
-; CHECK-I686-NEXT:    popl %esi<br>
-; CHECK-I686-NEXT:    popl %edi<br>
+; CHECK-I686-NEXT:    calll __truncsfhf2<br>
+; CHECK-I686-NEXT:    pextrw $0, %xmm0, %eax<br>
+; CHECK-I686-NEXT:    movw %ax, (%esp)<br>
+; CHECK-I686-NEXT:    calll __extendhfsf2<br>
+; CHECK-I686-NEXT:    addl $60, %esp<br>
 ; CHECK-I686-NEXT:    retl<br>
   %tmp0 = load half, half* %b<br>
   %tmp1 = sitofp i32 %a to half<br>
@@ -946,21 +862,21 @@ define half @PR40273(half) #0 {<br>
 ; CHECK-LIBCALL-LABEL: PR40273:<br>
 ; CHECK-LIBCALL:       # %bb.0:<br>
 ; CHECK-LIBCALL-NEXT:    pushq %rax<br>
-; CHECK-LIBCALL-NEXT:    movzwl %di, %edi<br>
-; CHECK-LIBCALL-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; CHECK-LIBCALL-NEXT:    callq __extendhfsf2@PLT<br>
 ; CHECK-LIBCALL-NEXT:    xorl %eax, %eax<br>
 ; CHECK-LIBCALL-NEXT:    xorps %xmm1, %xmm1<br>
 ; CHECK-LIBCALL-NEXT:    ucomiss %xmm1, %xmm0<br>
 ; CHECK-LIBCALL-NEXT:    movl $15360, %ecx # imm = 0x3C00<br>
 ; CHECK-LIBCALL-NEXT:    cmovnel %ecx, %eax<br>
 ; CHECK-LIBCALL-NEXT:    cmovpl %ecx, %eax<br>
-; CHECK-LIBCALL-NEXT:    # kill: def $ax killed $ax killed $eax<br>
-; CHECK-LIBCALL-NEXT:    popq %rcx<br>
+; CHECK-LIBCALL-NEXT:    pinsrw $0, %eax, %xmm0<br>
+; CHECK-LIBCALL-NEXT:    popq %rax<br>
 ; CHECK-LIBCALL-NEXT:    retq<br>
 ;<br>
 ; BWON-F16C-LABEL: PR40273:<br>
 ; BWON-F16C:       # %bb.0:<br>
-; BWON-F16C-NEXT:    movzwl %di, %eax<br>
+; BWON-F16C-NEXT:    vpextrw $0, %xmm0, %eax<br>
+; BWON-F16C-NEXT:    movzwl %ax, %eax<br>
 ; BWON-F16C-NEXT:    vmovd %eax, %xmm0<br>
 ; BWON-F16C-NEXT:    vcvtph2ps %xmm0, %xmm0<br>
 ; BWON-F16C-NEXT:    xorl %eax, %eax<br>
@@ -969,15 +885,16 @@ define half @PR40273(half) #0 {<br>
 ; BWON-F16C-NEXT:    movl $15360, %ecx # imm = 0x3C00<br>
 ; BWON-F16C-NEXT:    cmovnel %ecx, %eax<br>
 ; BWON-F16C-NEXT:    cmovpl %ecx, %eax<br>
-; BWON-F16C-NEXT:    # kill: def $ax killed $ax killed $eax<br>
+; BWON-F16C-NEXT:    vpinsrw $0, %eax, %xmm0, %xmm0<br>
 ; BWON-F16C-NEXT:    retq<br>
 ;<br>
 ; CHECK-I686-LABEL: PR40273:<br>
 ; CHECK-I686:       # %bb.0:<br>
 ; CHECK-I686-NEXT:    subl $12, %esp<br>
-; CHECK-I686-NEXT:    movzwl {{[0-9]+}}(%esp), %eax<br>
-; CHECK-I686-NEXT:    movl %eax, (%esp)<br>
-; CHECK-I686-NEXT:    calll __gnu_h2f_ieee<br>
+; CHECK-I686-NEXT:    pinsrw $0, {{[0-9]+}}(%esp), %xmm0<br>
+; CHECK-I686-NEXT:    pextrw $0, %xmm0, %eax<br>
+; CHECK-I686-NEXT:    movw %ax, (%esp)<br>
+; CHECK-I686-NEXT:    calll __extendhfsf2<br>
 ; CHECK-I686-NEXT:    fstps {{[0-9]+}}(%esp)<br>
 ; CHECK-I686-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero<br>
 ; CHECK-I686-NEXT:    xorl %eax, %eax<br>
@@ -986,7 +903,7 @@ define half @PR40273(half) #0 {<br>
 ; CHECK-I686-NEXT:    movl $15360, %ecx # imm = 0x3C00<br>
 ; CHECK-I686-NEXT:    cmovnel %ecx, %eax<br>
 ; CHECK-I686-NEXT:    cmovpl %ecx, %eax<br>
-; CHECK-I686-NEXT:    # kill: def $ax killed $ax killed $eax<br>
+; CHECK-I686-NEXT:    pinsrw $0, %eax, %xmm0<br>
 ; CHECK-I686-NEXT:    addl $12, %esp<br>
 ; CHECK-I686-NEXT:    retl<br>
   %2 = fcmp une half %0, 0xH0000<br>
@@ -994,4 +911,322 @@ define half @PR40273(half) #0 {<br>
   ret half %3<br>
 }<br>
<br>
+define dso_local void @brcond(half %0) {<br>
+; CHECK-LIBCALL-LABEL: brcond:<br>
+; CHECK-LIBCALL:       # %bb.0: # %entry<br>
+; CHECK-LIBCALL-NEXT:    pushq %rax<br>
+; CHECK-LIBCALL-NEXT:    .cfi_def_cfa_offset 16<br>
+; CHECK-LIBCALL-NEXT:    callq __extendhfsf2@PLT<br>
+; CHECK-LIBCALL-NEXT:    xorps %xmm1, %xmm1<br>
+; CHECK-LIBCALL-NEXT:    ucomiss %xmm1, %xmm0<br>
+; CHECK-LIBCALL-NEXT:    setp %al<br>
+; CHECK-LIBCALL-NEXT:    setne %cl<br>
+; CHECK-LIBCALL-NEXT:    orb %al, %cl<br>
+; CHECK-LIBCALL-NEXT:    jne .LBB18_2<br>
+; CHECK-LIBCALL-NEXT:  # %bb.1: # %if.then<br>
+; CHECK-LIBCALL-NEXT:    popq %rax<br>
+; CHECK-LIBCALL-NEXT:    .cfi_def_cfa_offset 8<br>
+; CHECK-LIBCALL-NEXT:    retq<br>
+; CHECK-LIBCALL-NEXT:  .LBB18_2: # %if.end<br>
+;<br>
+; BWON-F16C-LABEL: brcond:<br>
+; BWON-F16C:       # %bb.0: # %entry<br>
+; BWON-F16C-NEXT:    vpextrw $0, %xmm0, %eax<br>
+; BWON-F16C-NEXT:    movzwl %ax, %eax<br>
+; BWON-F16C-NEXT:    vmovd %eax, %xmm0<br>
+; BWON-F16C-NEXT:    vcvtph2ps %xmm0, %xmm0<br>
+; BWON-F16C-NEXT:    vxorps %xmm1, %xmm1, %xmm1<br>
+; BWON-F16C-NEXT:    vucomiss %xmm1, %xmm0<br>
+; BWON-F16C-NEXT:    setp %al<br>
+; BWON-F16C-NEXT:    setne %cl<br>
+; BWON-F16C-NEXT:    orb %al, %cl<br>
+; BWON-F16C-NEXT:    jne .LBB18_2<br>
+; BWON-F16C-NEXT:  # %bb.1: # %if.then<br>
+; BWON-F16C-NEXT:    retq<br>
+; BWON-F16C-NEXT:  .LBB18_2: # %if.end<br>
+;<br>
+; CHECK-I686-LABEL: brcond:<br>
+; CHECK-I686:       # %bb.0: # %entry<br>
+; CHECK-I686-NEXT:    subl $12, %esp<br>
+; CHECK-I686-NEXT:    .cfi_def_cfa_offset 16<br>
+; CHECK-I686-NEXT:    pinsrw $0, {{[0-9]+}}(%esp), %xmm0<br>
+; CHECK-I686-NEXT:    pextrw $0, %xmm0, %eax<br>
+; CHECK-I686-NEXT:    movw %ax, (%esp)<br>
+; CHECK-I686-NEXT:    calll __extendhfsf2<br>
+; CHECK-I686-NEXT:    fstps {{[0-9]+}}(%esp)<br>
+; CHECK-I686-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-I686-NEXT:    xorps %xmm1, %xmm1<br>
+; CHECK-I686-NEXT:    ucomiss %xmm1, %xmm0<br>
+; CHECK-I686-NEXT:    setp %al<br>
+; CHECK-I686-NEXT:    setne %cl<br>
+; CHECK-I686-NEXT:    orb %al, %cl<br>
+; CHECK-I686-NEXT:    jne .LBB18_2<br>
+; CHECK-I686-NEXT:  # %bb.1: # %if.then<br>
+; CHECK-I686-NEXT:    addl $12, %esp<br>
+; CHECK-I686-NEXT:    .cfi_def_cfa_offset 4<br>
+; CHECK-I686-NEXT:    retl<br>
+; CHECK-I686-NEXT:  .LBB18_2: # %if.end<br>
+entry:<br>
+  %cmp = fcmp oeq half 0xH0000, %0<br>
+  br i1 %cmp, label %if.then, label %if.end<br>
+<br>
+if.then:                                          ; preds = %entry<br>
+  ret void<br>
+<br>
+if.end:                                           ; preds = %entry<br>
+  unreachable<br>
+}<br>
+<br>
+define half @test_sqrt(half %0) {<br>
+; CHECK-LIBCALL-LABEL: test_sqrt:<br>
+; CHECK-LIBCALL:       # %bb.0: # %entry<br>
+; CHECK-LIBCALL-NEXT:    pushq %rax<br>
+; CHECK-LIBCALL-NEXT:    .cfi_def_cfa_offset 16<br>
+; CHECK-LIBCALL-NEXT:    callq __extendhfsf2@PLT<br>
+; CHECK-LIBCALL-NEXT:    sqrtss %xmm0, %xmm0<br>
+; CHECK-LIBCALL-NEXT:    callq __truncsfhf2@PLT<br>
+; CHECK-LIBCALL-NEXT:    popq %rax<br>
+; CHECK-LIBCALL-NEXT:    .cfi_def_cfa_offset 8<br>
+; CHECK-LIBCALL-NEXT:    retq<br>
+;<br>
+; BWON-F16C-LABEL: test_sqrt:<br>
+; BWON-F16C:       # %bb.0: # %entry<br>
+; BWON-F16C-NEXT:    vpextrw $0, %xmm0, %eax<br>
+; BWON-F16C-NEXT:    movzwl %ax, %eax<br>
+; BWON-F16C-NEXT:    vmovd %eax, %xmm0<br>
+; BWON-F16C-NEXT:    vcvtph2ps %xmm0, %xmm0<br>
+; BWON-F16C-NEXT:    vsqrtss %xmm0, %xmm0, %xmm0<br>
+; BWON-F16C-NEXT:    vcvtps2ph $4, %xmm0, %xmm0<br>
+; BWON-F16C-NEXT:    vmovd %xmm0, %eax<br>
+; BWON-F16C-NEXT:    vpinsrw $0, %eax, %xmm0, %xmm0<br>
+; BWON-F16C-NEXT:    retq<br>
+;<br>
+; CHECK-I686-LABEL: test_sqrt:<br>
+; CHECK-I686:       # %bb.0: # %entry<br>
+; CHECK-I686-NEXT:    subl $12, %esp<br>
+; CHECK-I686-NEXT:    .cfi_def_cfa_offset 16<br>
+; CHECK-I686-NEXT:    pinsrw $0, {{[0-9]+}}(%esp), %xmm0<br>
+; CHECK-I686-NEXT:    pextrw $0, %xmm0, %eax<br>
+; CHECK-I686-NEXT:    movw %ax, (%esp)<br>
+; CHECK-I686-NEXT:    calll __extendhfsf2<br>
+; CHECK-I686-NEXT:    fstps {{[0-9]+}}(%esp)<br>
+; CHECK-I686-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-I686-NEXT:    sqrtss %xmm0, %xmm0<br>
+; CHECK-I686-NEXT:    movss %xmm0, (%esp)<br>
+; CHECK-I686-NEXT:    calll __truncsfhf2<br>
+; CHECK-I686-NEXT:    addl $12, %esp<br>
+; CHECK-I686-NEXT:    .cfi_def_cfa_offset 4<br>
+; CHECK-I686-NEXT:    retl<br>
+entry:<br>
+  %1 = call half @llvm.sqrt.f16(half %0)<br>
+  ret half %1<br>
+}<br>
+<br>
+declare half @llvm.sqrt.f16(half)<br>
+<br>
+define void @main.158() local_unnamed_addr #0 {<br>
+; CHECK-LIBCALL-LABEL: main.158:<br>
+; CHECK-LIBCALL:       # %bb.0: # %entry<br>
+; CHECK-LIBCALL-NEXT:    pushq %rax<br>
+; CHECK-LIBCALL-NEXT:    xorps %xmm0, %xmm0<br>
+; CHECK-LIBCALL-NEXT:    callq __truncsfhf2@PLT<br>
+; CHECK-LIBCALL-NEXT:    callq __extendhfsf2@PLT<br>
+; CHECK-LIBCALL-NEXT:    movss {{.*#+}} xmm1 = mem[0],zero,zero,zero<br>
+; CHECK-LIBCALL-NEXT:    ucomiss %xmm0, %xmm1<br>
+; CHECK-LIBCALL-NEXT:    xorps %xmm0, %xmm0<br>
+; CHECK-LIBCALL-NEXT:    jae .LBB20_2<br>
+; CHECK-LIBCALL-NEXT:  # %bb.1: # %entry<br>
+; CHECK-LIBCALL-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-LIBCALL-NEXT:  .LBB20_2: # %entry<br>
+; CHECK-LIBCALL-NEXT:    callq __truncsfhf2@PLT<br>
+; CHECK-LIBCALL-NEXT:    pextrw $0, %xmm0, %eax<br>
+; CHECK-LIBCALL-NEXT:    movw %ax, (%rax)<br>
+; CHECK-LIBCALL-NEXT:    popq %rax<br>
+; CHECK-LIBCALL-NEXT:    retq<br>
+;<br>
+; BWON-F16C-LABEL: main.158:<br>
+; BWON-F16C:       # %bb.0: # %entry<br>
+; BWON-F16C-NEXT:    vxorps %xmm0, %xmm0, %xmm0<br>
+; BWON-F16C-NEXT:    vcvtps2ph $4, %xmm0, %xmm0<br>
+; BWON-F16C-NEXT:    vpmovzxwq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero<br>
+; BWON-F16C-NEXT:    vcvtph2ps %xmm0, %xmm0<br>
+; BWON-F16C-NEXT:    vmovss {{.*#+}} xmm1 = mem[0],zero,zero,zero<br>
+; BWON-F16C-NEXT:    vucomiss %xmm0, %xmm1<br>
+; BWON-F16C-NEXT:    vxorps %xmm0, %xmm0, %xmm0<br>
+; BWON-F16C-NEXT:    jae .LBB20_2<br>
+; BWON-F16C-NEXT:  # %bb.1: # %entry<br>
+; BWON-F16C-NEXT:    vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero<br>
+; BWON-F16C-NEXT:  .LBB20_2: # %entry<br>
+; BWON-F16C-NEXT:    vcvtps2ph $4, %xmm0, %xmm0<br>
+; BWON-F16C-NEXT:    vmovd %xmm0, %eax<br>
+; BWON-F16C-NEXT:    movw %ax, (%rax)<br>
+; BWON-F16C-NEXT:    retq<br>
+;<br>
+; CHECK-I686-LABEL: main.158:<br>
+; CHECK-I686:       # %bb.0: # %entry<br>
+; CHECK-I686-NEXT:    subl $12, %esp<br>
+; CHECK-I686-NEXT:    pxor %xmm0, %xmm0<br>
+; CHECK-I686-NEXT:    movd %xmm0, (%esp)<br>
+; CHECK-I686-NEXT:    calll __truncsfhf2<br>
+; CHECK-I686-NEXT:    pextrw $0, %xmm0, %eax<br>
+; CHECK-I686-NEXT:    movw %ax, (%esp)<br>
+; CHECK-I686-NEXT:    calll __extendhfsf2<br>
+; CHECK-I686-NEXT:    fstps {{[0-9]+}}(%esp)<br>
+; CHECK-I686-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-I686-NEXT:    ucomiss {{[0-9]+}}(%esp), %xmm0<br>
+; CHECK-I686-NEXT:    xorps %xmm0, %xmm0<br>
+; CHECK-I686-NEXT:    jae .LBB20_2<br>
+; CHECK-I686-NEXT:  # %bb.1: # %entry<br>
+; CHECK-I686-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-I686-NEXT:  .LBB20_2: # %entry<br>
+; CHECK-I686-NEXT:    movss %xmm0, (%esp)<br>
+; CHECK-I686-NEXT:    calll __truncsfhf2<br>
+; CHECK-I686-NEXT:    pextrw $0, %xmm0, %eax<br>
+; CHECK-I686-NEXT:    movw %ax, (%eax)<br>
+; CHECK-I686-NEXT:    addl $12, %esp<br>
+; CHECK-I686-NEXT:    retl<br>
+entry:<br>
+  %0 = tail call half @llvm.fabs.f16(half undef)<br>
+  %1 = fpext half %0 to float<br>
+  %compare.2 = fcmp ole half %0, 0xH4800<br>
+  %multiply.95 = fmul float %1, 5.000000e-01<br>
+  %add.82 = fadd float %multiply.95, -2.000000e+00<br>
+  %multiply.68 = fmul float %add.82, 0.000000e+00<br>
+  %subtract.65 = fsub float %multiply.68, 0.000000e+00<br>
+  %multiply.57 = fmul float undef, 0.000000e+00<br>
+  %2 = select i1 %compare.2, float 0.000000e+00, float %multiply.57<br>
+  %3 = fptrunc float %2 to half<br>
+  store half %3, half* undef, align 2<br>
+  ret void<br>
+}<br>
+<br>
+define void @main.45() local_unnamed_addr {<br>
+; CHECK-LIBCALL-LABEL: main.45:<br>
+; CHECK-LIBCALL:       # %bb.0: # %entry<br>
+; CHECK-LIBCALL-NEXT:    pushq %rbp<br>
+; CHECK-LIBCALL-NEXT:    .cfi_def_cfa_offset 16<br>
+; CHECK-LIBCALL-NEXT:    pushq %r15<br>
+; CHECK-LIBCALL-NEXT:    .cfi_def_cfa_offset 24<br>
+; CHECK-LIBCALL-NEXT:    pushq %r14<br>
+; CHECK-LIBCALL-NEXT:    .cfi_def_cfa_offset 32<br>
+; CHECK-LIBCALL-NEXT:    pushq %rbx<br>
+; CHECK-LIBCALL-NEXT:    .cfi_def_cfa_offset 40<br>
+; CHECK-LIBCALL-NEXT:    pushq %rax<br>
+; CHECK-LIBCALL-NEXT:    .cfi_def_cfa_offset 48<br>
+; CHECK-LIBCALL-NEXT:    .cfi_offset %rbx, -40<br>
+; CHECK-LIBCALL-NEXT:    .cfi_offset %r14, -32<br>
+; CHECK-LIBCALL-NEXT:    .cfi_offset %r15, -24<br>
+; CHECK-LIBCALL-NEXT:    .cfi_offset %rbp, -16<br>
+; CHECK-LIBCALL-NEXT:    pinsrw $0, (%rax), %xmm0<br>
+; CHECK-LIBCALL-NEXT:    pextrw $0, %xmm0, %eax<br>
+; CHECK-LIBCALL-NEXT:    movd %eax, %xmm1<br>
+; CHECK-LIBCALL-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[0,0,0,0,4,5,6,7]<br>
+; CHECK-LIBCALL-NEXT:    movq %xmm1, %rbx<br>
+; CHECK-LIBCALL-NEXT:    movq %rbx, %r14<br>
+; CHECK-LIBCALL-NEXT:    shrq $48, %r14<br>
+; CHECK-LIBCALL-NEXT:    movq %rbx, %r15<br>
+; CHECK-LIBCALL-NEXT:    shrq $32, %r15<br>
+; CHECK-LIBCALL-NEXT:    movl %ebx, %ebp<br>
+; CHECK-LIBCALL-NEXT:    shrl $16, %ebp<br>
+; CHECK-LIBCALL-NEXT:    callq __extendhfsf2@PLT<br>
+; CHECK-LIBCALL-NEXT:    ucomiss %xmm0, %xmm0<br>
+; CHECK-LIBCALL-NEXT:    movl $32256, %eax # imm = 0x7E00<br>
+; CHECK-LIBCALL-NEXT:    cmovpl %eax, %ebp<br>
+; CHECK-LIBCALL-NEXT:    cmovpl %eax, %r15d<br>
+; CHECK-LIBCALL-NEXT:    cmovpl %eax, %r14d<br>
+; CHECK-LIBCALL-NEXT:    cmovpl %eax, %ebx<br>
+; CHECK-LIBCALL-NEXT:    movw %bx, (%rax)<br>
+; CHECK-LIBCALL-NEXT:    movw %r14w, (%rax)<br>
+; CHECK-LIBCALL-NEXT:    movw %r15w, (%rax)<br>
+; CHECK-LIBCALL-NEXT:    movw %bp, (%rax)<br>
+; CHECK-LIBCALL-NEXT:    addq $8, %rsp<br>
+; CHECK-LIBCALL-NEXT:    .cfi_def_cfa_offset 40<br>
+; CHECK-LIBCALL-NEXT:    popq %rbx<br>
+; CHECK-LIBCALL-NEXT:    .cfi_def_cfa_offset 32<br>
+; CHECK-LIBCALL-NEXT:    popq %r14<br>
+; CHECK-LIBCALL-NEXT:    .cfi_def_cfa_offset 24<br>
+; CHECK-LIBCALL-NEXT:    popq %r15<br>
+; CHECK-LIBCALL-NEXT:    .cfi_def_cfa_offset 16<br>
+; CHECK-LIBCALL-NEXT:    popq %rbp<br>
+; CHECK-LIBCALL-NEXT:    .cfi_def_cfa_offset 8<br>
+; CHECK-LIBCALL-NEXT:    retq<br>
+;<br>
+; BWON-F16C-LABEL: main.45:<br>
+; BWON-F16C:       # %bb.0: # %entry<br>
+; BWON-F16C-NEXT:    movzwl (%rax), %eax<br>
+; BWON-F16C-NEXT:    vmovd %eax, %xmm0<br>
+; BWON-F16C-NEXT:    vpshuflw {{.*#+}} xmm1 = xmm0[0,0,0,0,4,5,6,7]<br>
+; BWON-F16C-NEXT:    vmovq %xmm1, %rax<br>
+; BWON-F16C-NEXT:    movq %rax, %rcx<br>
+; BWON-F16C-NEXT:    shrq $48, %rcx<br>
+; BWON-F16C-NEXT:    movq %rax, %rdx<br>
+; BWON-F16C-NEXT:    shrq $32, %rdx<br>
+; BWON-F16C-NEXT:    movl %eax, %esi<br>
+; BWON-F16C-NEXT:    shrl $16, %esi<br>
+; BWON-F16C-NEXT:    vcvtph2ps %xmm0, %xmm0<br>
+; BWON-F16C-NEXT:    vucomiss %xmm0, %xmm0<br>
+; BWON-F16C-NEXT:    movl $32256, %edi # imm = 0x7E00<br>
+; BWON-F16C-NEXT:    cmovpl %edi, %esi<br>
+; BWON-F16C-NEXT:    cmovpl %edi, %edx<br>
+; BWON-F16C-NEXT:    cmovpl %edi, %ecx<br>
+; BWON-F16C-NEXT:    cmovpl %edi, %eax<br>
+; BWON-F16C-NEXT:    movw %ax, (%rax)<br>
+; BWON-F16C-NEXT:    movw %cx, (%rax)<br>
+; BWON-F16C-NEXT:    movw %dx, (%rax)<br>
+; BWON-F16C-NEXT:    movw %si, (%rax)<br>
+; BWON-F16C-NEXT:    retq<br>
+;<br>
+; CHECK-I686-LABEL: main.45:<br>
+; CHECK-I686:       # %bb.0: # %entry<br>
+; CHECK-I686-NEXT:    pushl %edi<br>
+; CHECK-I686-NEXT:    .cfi_def_cfa_offset 8<br>
+; CHECK-I686-NEXT:    pushl %esi<br>
+; CHECK-I686-NEXT:    .cfi_def_cfa_offset 12<br>
+; CHECK-I686-NEXT:    subl $20, %esp<br>
+; CHECK-I686-NEXT:    .cfi_def_cfa_offset 32<br>
+; CHECK-I686-NEXT:    .cfi_offset %esi, -12<br>
+; CHECK-I686-NEXT:    .cfi_offset %edi, -8<br>
+; CHECK-I686-NEXT:    pinsrw $0, (%eax), %xmm0<br>
+; CHECK-I686-NEXT:    pextrw $0, %xmm0, %eax<br>
+; CHECK-I686-NEXT:    movd %eax, %xmm0<br>
+; CHECK-I686-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,0,0,0,4,5,6,7]<br>
+; CHECK-I686-NEXT:    movd %xmm0, %esi<br>
+; CHECK-I686-NEXT:    movl %esi, %edi<br>
+; CHECK-I686-NEXT:    shrl $16, %edi<br>
+; CHECK-I686-NEXT:    movw %ax, (%esp)<br>
+; CHECK-I686-NEXT:    calll __extendhfsf2<br>
+; CHECK-I686-NEXT:    fstps {{[0-9]+}}(%esp)<br>
+; CHECK-I686-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-I686-NEXT:    ucomiss %xmm0, %xmm0<br>
+; CHECK-I686-NEXT:    movl $32256, %eax # imm = 0x7E00<br>
+; CHECK-I686-NEXT:    cmovpl %eax, %esi<br>
+; CHECK-I686-NEXT:    cmovpl %eax, %edi<br>
+; CHECK-I686-NEXT:    movw %di, (%eax)<br>
+; CHECK-I686-NEXT:    movw %si, (%eax)<br>
+; CHECK-I686-NEXT:    addl $20, %esp<br>
+; CHECK-I686-NEXT:    .cfi_def_cfa_offset 12<br>
+; CHECK-I686-NEXT:    popl %esi<br>
+; CHECK-I686-NEXT:    .cfi_def_cfa_offset 8<br>
+; CHECK-I686-NEXT:    popl %edi<br>
+; CHECK-I686-NEXT:    .cfi_def_cfa_offset 4<br>
+; CHECK-I686-NEXT:    retl<br>
+entry:<br>
+  %0 = load half, half* undef, align 8<br>
+  %1 = bitcast half %0 to i16<br>
+  %broadcast.splatinsert = insertelement <4 x half> poison, half %0, i64 0<br>
+  %broadcast.splat = shufflevector <4 x half> %broadcast.splatinsert, <4 x half> poison, <4 x i32> zeroinitializer<br>
+  %broadcast.splatinsert13 = insertelement <4 x i16> poison, i16 %1, i64 0<br>
+  %broadcast.splat14 = shufflevector <4 x i16> %broadcast.splatinsert13, <4 x i16> poison, <4 x i32> zeroinitializer<br>
+  %2 = fcmp uno <4 x half> %broadcast.splat, zeroinitializer<br>
+  %3 = add <4 x i16> zeroinitializer, %broadcast.splat14<br>
+  %4 = select i1 undef, <4 x i16> undef, <4 x i16> %3<br>
+  %5 = select <4 x i1> undef, <4 x i16> undef, <4 x i16> %4<br>
+  %6 = bitcast <4 x i16> %5 to <4 x half><br>
+  %7 = select <4 x i1> %2, <4 x half> <half 0xH7E00, half 0xH7E00, half 0xH7E00, half 0xH7E00>, <4 x half> %6<br>
+  store <4 x half> %7, <4 x half>* undef, align 16<br>
+  ret void<br>
+}<br>
+<br>
+declare half @llvm.fabs.f16(half)<br>
+<br>
 attributes #0 = { nounwind }<br>
<br>
diff  --git a/llvm/test/CodeGen/X86/pr31088.ll b/llvm/test/CodeGen/X86/pr31088.ll<br>
index 555f769b316fe..d426cd764c15c 100644<br>
--- a/llvm/test/CodeGen/X86/pr31088.ll<br>
+++ b/llvm/test/CodeGen/X86/pr31088.ll<br>
@@ -7,68 +7,77 @@<br>
 define <1 x half> @ir_fadd_v1f16(<1 x half> %arg0, <1 x half> %arg1) nounwind {<br>
 ; X86-LABEL: ir_fadd_v1f16:<br>
 ; X86:       # %bb.0:<br>
-; X86-NEXT:    pushl %esi<br>
-; X86-NEXT:    subl $12, %esp<br>
-; X86-NEXT:    movzwl {{[0-9]+}}(%esp), %esi<br>
-; X86-NEXT:    movzwl {{[0-9]+}}(%esp), %eax<br>
-; X86-NEXT:    movl %eax, (%esp)<br>
-; X86-NEXT:    calll __gnu_h2f_ieee<br>
-; X86-NEXT:    movl %esi, (%esp)<br>
+; X86-NEXT:    subl $28, %esp<br>
+; X86-NEXT:    pinsrw $0, {{[0-9]+}}(%esp), %xmm0<br>
+; X86-NEXT:    movdqu %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill<br>
+; X86-NEXT:    pinsrw $0, {{[0-9]+}}(%esp), %xmm0<br>
+; X86-NEXT:    pextrw $0, %xmm0, %eax<br>
+; X86-NEXT:    movw %ax, (%esp)<br>
+; X86-NEXT:    calll __extendhfsf2<br>
+; X86-NEXT:    movdqu {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; X86-NEXT:    pextrw $0, %xmm0, %eax<br>
+; X86-NEXT:    movw %ax, (%esp)<br>
 ; X86-NEXT:    fstps {{[0-9]+}}(%esp)<br>
-; X86-NEXT:    calll __gnu_h2f_ieee<br>
+; X86-NEXT:    calll __extendhfsf2<br>
 ; X86-NEXT:    fstps {{[0-9]+}}(%esp)<br>
 ; X86-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero<br>
 ; X86-NEXT:    addss {{[0-9]+}}(%esp), %xmm0<br>
 ; X86-NEXT:    movss %xmm0, (%esp)<br>
-; X86-NEXT:    calll __gnu_f2h_ieee<br>
-; X86-NEXT:    addl $12, %esp<br>
-; X86-NEXT:    popl %esi<br>
+; X86-NEXT:    calll __truncsfhf2<br>
+; X86-NEXT:    addl $28, %esp<br>
 ; X86-NEXT:    retl<br>
 ;<br>
 ; X64-LABEL: ir_fadd_v1f16:<br>
 ; X64:       # %bb.0:<br>
-; X64-NEXT:    pushq %rbx<br>
-; X64-NEXT:    subq $16, %rsp<br>
-; X64-NEXT:    movl %edi, %ebx<br>
-; X64-NEXT:    movzwl %si, %edi<br>
-; X64-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; X64-NEXT:    pushq %rax<br>
 ; X64-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; X64-NEXT:    movzwl %bx, %edi<br>
-; X64-NEXT:    callq __gnu_h2f_ieee@PLT<br>
-; X64-NEXT:    addss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload<br>
-; X64-NEXT:    callq __gnu_f2h_ieee@PLT<br>
-; X64-NEXT:    addq $16, %rsp<br>
-; X64-NEXT:    popq %rbx<br>
+; X64-NEXT:    movaps %xmm1, %xmm0<br>
+; X64-NEXT:    callq __extendhfsf2@PLT<br>
+; X64-NEXT:    movss %xmm0, (%rsp) # 4-byte Spill<br>
+; X64-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; X64-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; X64-NEXT:    callq __extendhfsf2@PLT<br>
+; X64-NEXT:    addss (%rsp), %xmm0 # 4-byte Folded Reload<br>
+; X64-NEXT:    callq __truncsfhf2@PLT<br>
+; X64-NEXT:    popq %rax<br>
 ; X64-NEXT:    retq<br>
 ;<br>
 ; F16C-LABEL: ir_fadd_v1f16:<br>
 ; F16C:       # %bb.0:<br>
-; F16C-NEXT:    movzwl %si, %eax<br>
-; F16C-NEXT:    vmovd %eax, %xmm0<br>
+; F16C-NEXT:    vpextrw $0, %xmm0, %eax<br>
+; F16C-NEXT:    vpextrw $0, %xmm1, %ecx<br>
+; F16C-NEXT:    movzwl %cx, %ecx<br>
+; F16C-NEXT:    vmovd %ecx, %xmm0<br>
 ; F16C-NEXT:    vcvtph2ps %xmm0, %xmm0<br>
-; F16C-NEXT:    movzwl %di, %eax<br>
+; F16C-NEXT:    movzwl %ax, %eax<br>
 ; F16C-NEXT:    vmovd %eax, %xmm1<br>
 ; F16C-NEXT:    vcvtph2ps %xmm1, %xmm1<br>
 ; F16C-NEXT:    vaddss %xmm0, %xmm1, %xmm0<br>
 ; F16C-NEXT:    vcvtps2ph $4, %xmm0, %xmm0<br>
 ; F16C-NEXT:    vmovd %xmm0, %eax<br>
-; F16C-NEXT:    # kill: def $ax killed $ax killed $eax<br>
+; F16C-NEXT:    vpinsrw $0, %eax, %xmm0, %xmm0<br>
 ; F16C-NEXT:    retq<br>
 ;<br>
 ; F16C-O0-LABEL: ir_fadd_v1f16:<br>
 ; F16C-O0:       # %bb.0:<br>
-; F16C-O0-NEXT:    movw %si, %cx<br>
-; F16C-O0-NEXT:    movw %di, %ax<br>
-; F16C-O0-NEXT:    movzwl %cx, %ecx<br>
-; F16C-O0-NEXT:    vmovd %ecx, %xmm0<br>
-; F16C-O0-NEXT:    vcvtph2ps %xmm0, %xmm1<br>
+; F16C-O0-NEXT:    vpextrw $0, %xmm1, %eax<br>
+; F16C-O0-NEXT:    # kill: def $ax killed $ax killed $eax<br>
+; F16C-O0-NEXT:    movzwl %ax, %eax<br>
+; F16C-O0-NEXT:    vmovd %eax, %xmm1<br>
+; F16C-O0-NEXT:    vcvtph2ps %xmm1, %xmm1<br>
+; F16C-O0-NEXT:    vpextrw $0, %xmm0, %eax<br>
+; F16C-O0-NEXT:    # kill: def $ax killed $ax killed $eax<br>
 ; F16C-O0-NEXT:    movzwl %ax, %eax<br>
 ; F16C-O0-NEXT:    vmovd %eax, %xmm0<br>
 ; F16C-O0-NEXT:    vcvtph2ps %xmm0, %xmm0<br>
 ; F16C-O0-NEXT:    vaddss %xmm1, %xmm0, %xmm0<br>
 ; F16C-O0-NEXT:    vcvtps2ph $4, %xmm0, %xmm0<br>
 ; F16C-O0-NEXT:    vmovd %xmm0, %eax<br>
-; F16C-O0-NEXT:    # kill: def $ax killed $ax killed $eax<br>
+; F16C-O0-NEXT:    movw %ax, %cx<br>
+; F16C-O0-NEXT:    # implicit-def: $eax<br>
+; F16C-O0-NEXT:    movw %cx, %ax<br>
+; F16C-O0-NEXT:    # implicit-def: $xmm0<br>
+; F16C-O0-NEXT:    vpinsrw $0, %eax, %xmm0, %xmm0<br>
 ; F16C-O0-NEXT:    retq<br>
   %retval = fadd <1 x half> %arg0, %arg1<br>
   ret <1 x half> %retval<br>
@@ -77,148 +86,148 @@ define <1 x half> @ir_fadd_v1f16(<1 x half> %arg0, <1 x half> %arg1) nounwind {<br>
 define <2 x half> @ir_fadd_v2f16(<2 x half> %arg0, <2 x half> %arg1) nounwind {<br>
 ; X86-LABEL: ir_fadd_v2f16:<br>
 ; X86:       # %bb.0:<br>
-; X86-NEXT:    pushl %ebp<br>
-; X86-NEXT:    movl %esp, %ebp<br>
-; X86-NEXT:    pushl %ebx<br>
-; X86-NEXT:    pushl %edi<br>
-; X86-NEXT:    pushl %esi<br>
-; X86-NEXT:    andl $-16, %esp<br>
-; X86-NEXT:    subl $64, %esp<br>
-; X86-NEXT:    movzwl 8(%ebp), %esi<br>
-; X86-NEXT:    movzwl 12(%ebp), %edi<br>
-; X86-NEXT:    movzwl 20(%ebp), %ebx<br>
-; X86-NEXT:    movzwl 16(%ebp), %eax<br>
-; X86-NEXT:    movl %eax, (%esp)<br>
-; X86-NEXT:    calll __gnu_h2f_ieee<br>
+; X86-NEXT:    subl $80, %esp<br>
+; X86-NEXT:    pinsrw $0, {{[0-9]+}}(%esp), %xmm0<br>
+; X86-NEXT:    movdqu %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill<br>
+; X86-NEXT:    pinsrw $0, {{[0-9]+}}(%esp), %xmm0<br>
+; X86-NEXT:    movdqu %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill<br>
+; X86-NEXT:    pinsrw $0, {{[0-9]+}}(%esp), %xmm0<br>
+; X86-NEXT:    movdqu %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill<br>
+; X86-NEXT:    pinsrw $0, {{[0-9]+}}(%esp), %xmm0<br>
+; X86-NEXT:    pextrw $0, %xmm0, %eax<br>
+; X86-NEXT:    movw %ax, (%esp)<br>
+; X86-NEXT:    calll __extendhfsf2<br>
 ; X86-NEXT:    fstpt {{[-0-9]+}}(%e{{[sb]}}p) # 10-byte Folded Spill<br>
-; X86-NEXT:    movl %ebx, (%esp)<br>
-; X86-NEXT:    calll __gnu_h2f_ieee<br>
+; X86-NEXT:    movdqu {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; X86-NEXT:    pextrw $0, %xmm0, %eax<br>
+; X86-NEXT:    movw %ax, (%esp)<br>
+; X86-NEXT:    calll __extendhfsf2<br>
 ; X86-NEXT:    fstpt {{[-0-9]+}}(%e{{[sb]}}p) # 10-byte Folded Spill<br>
-; X86-NEXT:    movl %edi, (%esp)<br>
-; X86-NEXT:    calll __gnu_h2f_ieee<br>
-; X86-NEXT:    movl %esi, (%esp)<br>
+; X86-NEXT:    movdqu {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; X86-NEXT:    pextrw $0, %xmm0, %eax<br>
+; X86-NEXT:    movw %ax, (%esp)<br>
+; X86-NEXT:    calll __extendhfsf2<br>
+; X86-NEXT:    movdqu {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; X86-NEXT:    pextrw $0, %xmm0, %eax<br>
+; X86-NEXT:    movw %ax, (%esp)<br>
 ; X86-NEXT:    fstps {{[0-9]+}}(%esp)<br>
 ; X86-NEXT:    fldt {{[-0-9]+}}(%e{{[sb]}}p) # 10-byte Folded Reload<br>
 ; X86-NEXT:    fstps {{[0-9]+}}(%esp)<br>
-; X86-NEXT:    calll __gnu_h2f_ieee<br>
+; X86-NEXT:    calll __extendhfsf2<br>
 ; X86-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero<br>
 ; X86-NEXT:    addss {{[0-9]+}}(%esp), %xmm0<br>
 ; X86-NEXT:    movss %xmm0, (%esp)<br>
 ; X86-NEXT:    fstps {{[0-9]+}}(%esp)<br>
 ; X86-NEXT:    fldt {{[-0-9]+}}(%e{{[sb]}}p) # 10-byte Folded Reload<br>
 ; X86-NEXT:    fstps {{[0-9]+}}(%esp)<br>
-; X86-NEXT:    calll __gnu_f2h_ieee<br>
+; X86-NEXT:    calll __truncsfhf2<br>
+; X86-NEXT:    movss %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill<br>
 ; X86-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero<br>
 ; X86-NEXT:    addss {{[0-9]+}}(%esp), %xmm0<br>
 ; X86-NEXT:    movss %xmm0, (%esp)<br>
-; X86-NEXT:    movw %ax, {{[0-9]+}}(%esp)<br>
-; X86-NEXT:    calll __gnu_f2h_ieee<br>
-; X86-NEXT:    movw %ax, {{[0-9]+}}(%esp)<br>
-; X86-NEXT:    movdqa {{[0-9]+}}(%esp), %xmm0<br>
-; X86-NEXT:    movd %xmm0, %eax<br>
-; X86-NEXT:    pextrw $1, %xmm0, %edx<br>
-; X86-NEXT:    # kill: def $ax killed $ax killed $eax<br>
-; X86-NEXT:    # kill: def $dx killed $dx killed $edx<br>
-; X86-NEXT:    leal -12(%ebp), %esp<br>
-; X86-NEXT:    popl %esi<br>
-; X86-NEXT:    popl %edi<br>
-; X86-NEXT:    popl %ebx<br>
-; X86-NEXT:    popl %ebp<br>
+; X86-NEXT:    calll __truncsfhf2<br>
+; X86-NEXT:    movaps %xmm0, %xmm1<br>
+; X86-NEXT:    movss {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; X86-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; X86-NEXT:    addl $80, %esp<br>
 ; X86-NEXT:    retl<br>
 ;<br>
 ; X64-LABEL: ir_fadd_v2f16:<br>
 ; X64:       # %bb.0:<br>
-; X64-NEXT:    pushq %rbp<br>
-; X64-NEXT:    pushq %r14<br>
-; X64-NEXT:    pushq %rbx<br>
-; X64-NEXT:    subq $32, %rsp<br>
-; X64-NEXT:    movl %edx, %ebp<br>
-; X64-NEXT:    movl %esi, %ebx<br>
-; X64-NEXT:    movl %edi, %r14d<br>
-; X64-NEXT:    movzwl %cx, %edi<br>
-; X64-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; X64-NEXT:    subq $24, %rsp<br>
+; X64-NEXT:    movss %xmm3, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; X64-NEXT:    movss %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; X64-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; X64-NEXT:    movaps %xmm2, %xmm0<br>
+; X64-NEXT:    callq __extendhfsf2@PLT<br>
 ; X64-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; X64-NEXT:    movzwl %bx, %edi<br>
-; X64-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; X64-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; X64-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; X64-NEXT:    callq __extendhfsf2@PLT<br>
 ; X64-NEXT:    addss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload<br>
-; X64-NEXT:    callq __gnu_f2h_ieee@PLT<br>
-; X64-NEXT:    movw %ax, {{[0-9]+}}(%rsp)<br>
-; X64-NEXT:    movzwl %bp, %edi<br>
-; X64-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; X64-NEXT:    callq __truncsfhf2@PLT<br>
 ; X64-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; X64-NEXT:    movzwl %r14w, %edi<br>
-; X64-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; X64-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; X64-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; X64-NEXT:    callq __extendhfsf2@PLT<br>
+; X64-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; X64-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; X64-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; X64-NEXT:    callq __extendhfsf2@PLT<br>
 ; X64-NEXT:    addss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload<br>
-; X64-NEXT:    callq __gnu_f2h_ieee@PLT<br>
-; X64-NEXT:    movw %ax, {{[0-9]+}}(%rsp)<br>
-; X64-NEXT:    movdqa {{[0-9]+}}(%rsp), %xmm0<br>
-; X64-NEXT:    movd %xmm0, %eax<br>
-; X64-NEXT:    pextrw $1, %xmm0, %edx<br>
-; X64-NEXT:    # kill: def $ax killed $ax killed $eax<br>
-; X64-NEXT:    # kill: def $dx killed $dx killed $edx<br>
-; X64-NEXT:    addq $32, %rsp<br>
-; X64-NEXT:    popq %rbx<br>
-; X64-NEXT:    popq %r14<br>
-; X64-NEXT:    popq %rbp<br>
+; X64-NEXT:    callq __truncsfhf2@PLT<br>
+; X64-NEXT:    movaps %xmm0, %xmm1<br>
+; X64-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; X64-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; X64-NEXT:    addq $24, %rsp<br>
 ; X64-NEXT:    retq<br>
 ;<br>
 ; F16C-LABEL: ir_fadd_v2f16:<br>
 ; F16C:       # %bb.0:<br>
-; F16C-NEXT:    movzwl %cx, %eax<br>
-; F16C-NEXT:    vmovd %eax, %xmm0<br>
+; F16C-NEXT:    vpextrw $0, %xmm1, %eax<br>
+; F16C-NEXT:    vpextrw $0, %xmm3, %ecx<br>
+; F16C-NEXT:    vpextrw $0, %xmm0, %edx<br>
+; F16C-NEXT:    vpextrw $0, %xmm2, %esi<br>
+; F16C-NEXT:    movzwl %si, %esi<br>
+; F16C-NEXT:    vmovd %esi, %xmm0<br>
 ; F16C-NEXT:    vcvtph2ps %xmm0, %xmm0<br>
-; F16C-NEXT:    movzwl %si, %eax<br>
-; F16C-NEXT:    vmovd %eax, %xmm1<br>
+; F16C-NEXT:    movzwl %dx, %edx<br>
+; F16C-NEXT:    vmovd %edx, %xmm1<br>
 ; F16C-NEXT:    vcvtph2ps %xmm1, %xmm1<br>
 ; F16C-NEXT:    vaddss %xmm0, %xmm1, %xmm0<br>
 ; F16C-NEXT:    vcvtps2ph $4, %xmm0, %xmm0<br>
-; F16C-NEXT:    vpextrw $0, %xmm0, -{{[0-9]+}}(%rsp)<br>
-; F16C-NEXT:    movzwl %dx, %eax<br>
-; F16C-NEXT:    vmovd %eax, %xmm0<br>
-; F16C-NEXT:    vcvtph2ps %xmm0, %xmm0<br>
-; F16C-NEXT:    movzwl %di, %eax<br>
-; F16C-NEXT:    vmovd %eax, %xmm1<br>
+; F16C-NEXT:    vmovd %xmm0, %edx<br>
+; F16C-NEXT:    vpinsrw $0, %edx, %xmm0, %xmm0<br>
+; F16C-NEXT:    movzwl %cx, %ecx<br>
+; F16C-NEXT:    vmovd %ecx, %xmm1<br>
 ; F16C-NEXT:    vcvtph2ps %xmm1, %xmm1<br>
-; F16C-NEXT:    vaddss %xmm0, %xmm1, %xmm0<br>
-; F16C-NEXT:    vcvtps2ph $4, %xmm0, %xmm0<br>
-; F16C-NEXT:    vpextrw $0, %xmm0, -{{[0-9]+}}(%rsp)<br>
-; F16C-NEXT:    vmovdqa -{{[0-9]+}}(%rsp), %xmm0<br>
-; F16C-NEXT:    vmovd %xmm0, %eax<br>
-; F16C-NEXT:    vpextrw $1, %xmm0, %edx<br>
-; F16C-NEXT:    # kill: def $ax killed $ax killed $eax<br>
-; F16C-NEXT:    # kill: def $dx killed $dx killed $edx<br>
+; F16C-NEXT:    movzwl %ax, %eax<br>
+; F16C-NEXT:    vmovd %eax, %xmm2<br>
+; F16C-NEXT:    vcvtph2ps %xmm2, %xmm2<br>
+; F16C-NEXT:    vaddss %xmm1, %xmm2, %xmm1<br>
+; F16C-NEXT:    vcvtps2ph $4, %xmm1, %xmm1<br>
+; F16C-NEXT:    vmovd %xmm1, %eax<br>
+; F16C-NEXT:    vpinsrw $0, %eax, %xmm0, %xmm1<br>
 ; F16C-NEXT:    retq<br>
 ;<br>
 ; F16C-O0-LABEL: ir_fadd_v2f16:<br>
 ; F16C-O0:       # %bb.0:<br>
-; F16C-O0-NEXT:    movl %esi, %eax<br>
-; F16C-O0-NEXT:    # kill: def $cx killed $cx killed $ecx<br>
-; F16C-O0-NEXT:    movw %dx, %si<br>
+; F16C-O0-NEXT:    vpextrw $0, %xmm2, %eax<br>
+; F16C-O0-NEXT:    # kill: def $ax killed $ax killed $eax<br>
+; F16C-O0-NEXT:    movzwl %ax, %eax<br>
+; F16C-O0-NEXT:    vmovd %eax, %xmm2<br>
+; F16C-O0-NEXT:    vcvtph2ps %xmm2, %xmm2<br>
+; F16C-O0-NEXT:    vpextrw $0, %xmm0, %eax<br>
 ; F16C-O0-NEXT:    # kill: def $ax killed $ax killed $eax<br>
-; F16C-O0-NEXT:    movw %di, %dx<br>
-; F16C-O0-NEXT:    movzwl %si, %esi<br>
-; F16C-O0-NEXT:    vmovd %esi, %xmm0<br>
-; F16C-O0-NEXT:    vcvtph2ps %xmm0, %xmm1<br>
-; F16C-O0-NEXT:    movzwl %dx, %edx<br>
-; F16C-O0-NEXT:    vmovd %edx, %xmm0<br>
-; F16C-O0-NEXT:    vcvtph2ps %xmm0, %xmm0<br>
-; F16C-O0-NEXT:    vaddss %xmm1, %xmm0, %xmm0<br>
-; F16C-O0-NEXT:    vcvtps2ph $4, %xmm0, %xmm0<br>
-; F16C-O0-NEXT:    vpextrw $0, %xmm0, -{{[0-9]+}}(%rsp)<br>
-; F16C-O0-NEXT:    movzwl %cx, %ecx<br>
-; F16C-O0-NEXT:    vmovd %ecx, %xmm0<br>
-; F16C-O0-NEXT:    vcvtph2ps %xmm0, %xmm1<br>
 ; F16C-O0-NEXT:    movzwl %ax, %eax<br>
 ; F16C-O0-NEXT:    vmovd %eax, %xmm0<br>
 ; F16C-O0-NEXT:    vcvtph2ps %xmm0, %xmm0<br>
-; F16C-O0-NEXT:    vaddss %xmm1, %xmm0, %xmm0<br>
+; F16C-O0-NEXT:    vaddss %xmm2, %xmm0, %xmm0<br>
 ; F16C-O0-NEXT:    vcvtps2ph $4, %xmm0, %xmm0<br>
-; F16C-O0-NEXT:    vpextrw $0, %xmm0, -{{[0-9]+}}(%rsp)<br>
-; F16C-O0-NEXT:    vmovdqa -{{[0-9]+}}(%rsp), %xmm0<br>
 ; F16C-O0-NEXT:    vmovd %xmm0, %eax<br>
+; F16C-O0-NEXT:    movw %ax, %cx<br>
+; F16C-O0-NEXT:    # implicit-def: $eax<br>
+; F16C-O0-NEXT:    movw %cx, %ax<br>
+; F16C-O0-NEXT:    # implicit-def: $xmm0<br>
+; F16C-O0-NEXT:    vpinsrw $0, %eax, %xmm0, %xmm0<br>
+; F16C-O0-NEXT:    vpextrw $0, %xmm3, %eax<br>
 ; F16C-O0-NEXT:    # kill: def $ax killed $ax killed $eax<br>
-; F16C-O0-NEXT:    vpextrw $1, %xmm0, %ecx<br>
-; F16C-O0-NEXT:    movw %cx, %dx<br>
+; F16C-O0-NEXT:    movzwl %ax, %eax<br>
+; F16C-O0-NEXT:    vmovd %eax, %xmm2<br>
+; F16C-O0-NEXT:    vcvtph2ps %xmm2, %xmm2<br>
+; F16C-O0-NEXT:    vpextrw $0, %xmm1, %eax<br>
+; F16C-O0-NEXT:    # kill: def $ax killed $ax killed $eax<br>
+; F16C-O0-NEXT:    movzwl %ax, %eax<br>
+; F16C-O0-NEXT:    vmovd %eax, %xmm1<br>
+; F16C-O0-NEXT:    vcvtph2ps %xmm1, %xmm1<br>
+; F16C-O0-NEXT:    vaddss %xmm2, %xmm1, %xmm1<br>
+; F16C-O0-NEXT:    vcvtps2ph $4, %xmm1, %xmm1<br>
+; F16C-O0-NEXT:    vmovd %xmm1, %eax<br>
+; F16C-O0-NEXT:    movw %ax, %cx<br>
+; F16C-O0-NEXT:    # implicit-def: $eax<br>
+; F16C-O0-NEXT:    movw %cx, %ax<br>
+; F16C-O0-NEXT:    # implicit-def: $xmm1<br>
+; F16C-O0-NEXT:    vpinsrw $0, %eax, %xmm1, %xmm1<br>
 ; F16C-O0-NEXT:    retq<br>
   %retval = fadd <2 x half> %arg0, %arg1<br>
   ret <2 x half> %retval<br>
<br>
diff  --git a/llvm/test/CodeGen/X86/pr38533.ll b/llvm/test/CodeGen/X86/pr38533.ll<br>
index 53652e69e7c02..0f2360a2368d6 100644<br>
--- a/llvm/test/CodeGen/X86/pr38533.ll<br>
+++ b/llvm/test/CodeGen/X86/pr38533.ll<br>
@@ -1,23 +1,52 @@<br>
 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py<br>
-; RUN: llc < %s -mtriple=x86_64-unknown | FileCheck %s<br>
-; RUN: llc < %s -mtriple=x86_64-unknown -mattr=avx512f | FileCheck %s<br>
+; RUN: llc < %s -mtriple=x86_64-unknown | FileCheck %s --check-prefix=SSE2<br>
+; RUN: llc < %s -mtriple=x86_64-unknown -mattr=avx512f | FileCheck %s --check-prefix=AVX512<br>
+; RUN: llc < %s -mtriple=x86_64-unknown -mattr=avx512fp16 | FileCheck %s --check-prefix=AVX512FP16<br>
<br>
 ; This test makes sure that a vector that needs to be promoted that is bitcasted to fp16 is legalized correctly without causing a width mismatch.<br>
 define void @constant_fold_vector_to_half() {<br>
-; CHECK-LABEL: constant_fold_vector_to_half:<br>
-; CHECK:       # %bb.0:<br>
-; CHECK-NEXT:    movw $16384, (%rax) # imm = 0x4000<br>
-; CHECK-NEXT:    retq<br>
+; SSE2-LABEL: constant_fold_vector_to_half:<br>
+; SSE2:       # %bb.0:<br>
+; SSE2-NEXT:    movw $16384, -{{[0-9]+}}(%rsp) # imm = 0x4000<br>
+; SSE2-NEXT:    pinsrw $0, -{{[0-9]+}}(%rsp), %xmm0<br>
+; SSE2-NEXT:    pextrw $0, %xmm0, %eax<br>
+; SSE2-NEXT:    movw %ax, (%rax)<br>
+; SSE2-NEXT:    retq<br>
+;<br>
+; AVX512-LABEL: constant_fold_vector_to_half:<br>
+; AVX512:       # %bb.0:<br>
+; AVX512-NEXT:    movw $16384, -{{[0-9]+}}(%rsp) # imm = 0x4000<br>
+; AVX512-NEXT:    vpinsrw $0, -{{[0-9]+}}(%rsp), %xmm0, %xmm0<br>
+; AVX512-NEXT:    vpextrw $0, %xmm0, (%rax)<br>
+; AVX512-NEXT:    retq<br>
+;<br>
+; AVX512FP16-LABEL: constant_fold_vector_to_half:<br>
+; AVX512FP16:       # %bb.0:<br>
+; AVX512FP16-NEXT:    movw $16384, -{{[0-9]+}}(%rsp) # imm = 0x4000<br>
+; AVX512FP16-NEXT:    vmovsh -{{[0-9]+}}(%rsp), %xmm0<br>
+; AVX512FP16-NEXT:    vmovsh %xmm0, (%rax)<br>
+; AVX512FP16-NEXT:    retq<br>
   store volatile half bitcast (<4 x i4> <i4 0, i4 0, i4 0, i4 4> to half), half* undef<br>
   ret void<br>
 }<br>
<br>
 ; Similarly this makes sure that the opposite bitcast of the above is also legalized without crashing.<br>
 define void @pr38533_2(half %x) {<br>
-; CHECK-LABEL: pr38533_2:<br>
-; CHECK:       # %bb.0:<br>
-; CHECK-NEXT:    movw %di, (%rax)<br>
-; CHECK-NEXT:    retq<br>
+; SSE2-LABEL: pr38533_2:<br>
+; SSE2:       # %bb.0:<br>
+; SSE2-NEXT:    pextrw $0, %xmm0, %eax<br>
+; SSE2-NEXT:    movw %ax, (%rax)<br>
+; SSE2-NEXT:    retq<br>
+;<br>
+; AVX512-LABEL: pr38533_2:<br>
+; AVX512:       # %bb.0:<br>
+; AVX512-NEXT:    vpextrw $0, %xmm0, (%rax)<br>
+; AVX512-NEXT:    retq<br>
+;<br>
+; AVX512FP16-LABEL: pr38533_2:<br>
+; AVX512FP16:       # %bb.0:<br>
+; AVX512FP16-NEXT:    vmovsh %xmm0, (%rax)<br>
+; AVX512FP16-NEXT:    retq<br>
   %a = bitcast half %x to <4 x i4><br>
   store volatile <4 x i4> %a, <4 x i4>* undef<br>
   ret void<br>
@@ -25,10 +54,21 @@ define void @pr38533_2(half %x) {<br>
<br>
 ; This case is a bitcast from fp16 to a 16-bit wide legal vector type. In this case the result type is legal when the bitcast gets type legalized.<br>
 define void @pr38533_3(half %x) {<br>
-; CHECK-LABEL: pr38533_3:<br>
-; CHECK:       # %bb.0:<br>
-; CHECK-NEXT:    movw %di, (%rax)<br>
-; CHECK-NEXT:    retq<br>
+; SSE2-LABEL: pr38533_3:<br>
+; SSE2:       # %bb.0:<br>
+; SSE2-NEXT:    pextrw $0, %xmm0, %eax<br>
+; SSE2-NEXT:    movw %ax, (%rax)<br>
+; SSE2-NEXT:    retq<br>
+;<br>
+; AVX512-LABEL: pr38533_3:<br>
+; AVX512:       # %bb.0:<br>
+; AVX512-NEXT:    vpextrw $0, %xmm0, (%rax)<br>
+; AVX512-NEXT:    retq<br>
+;<br>
+; AVX512FP16-LABEL: pr38533_3:<br>
+; AVX512FP16:       # %bb.0:<br>
+; AVX512FP16-NEXT:    vmovsh %xmm0, (%rax)<br>
+; AVX512FP16-NEXT:    retq<br>
   %a = bitcast half %x to <16 x i1><br>
   store volatile <16 x i1> %a, <16 x i1>* undef<br>
   ret void<br>
<br>
diff  --git a/llvm/test/CodeGen/X86/pr47000.ll b/llvm/test/CodeGen/X86/pr47000.ll<br>
index 5c77c48b37ba7..9855d2f32819c 100755<br>
--- a/llvm/test/CodeGen/X86/pr47000.ll<br>
+++ b/llvm/test/CodeGen/X86/pr47000.ll<br>
@@ -7,55 +7,86 @@ target triple = "i386-unknown-linux-unknown"<br>
 define <4 x half> @doTheTestMod(<4 x half> %0, <4 x half> %1) nounwind {<br>
 ; CHECK-LABEL: doTheTestMod:<br>
 ; CHECK:       # %bb.0: # %Entry<br>
-; CHECK-NEXT:    pushl %ebp<br>
-; CHECK-NEXT:    pushl %ebx<br>
-; CHECK-NEXT:    pushl %edi<br>
-; CHECK-NEXT:    pushl %esi<br>
 ; CHECK-NEXT:    subl $124, %esp<br>
+; CHECK-NEXT:    # implicit-def: $xmm3<br>
+; CHECK-NEXT:    pinsrw $0, {{[0-9]+}}(%esp), %xmm3<br>
+; CHECK-NEXT:    # implicit-def: $xmm2<br>
+; CHECK-NEXT:    pinsrw $0, {{[0-9]+}}(%esp), %xmm2<br>
+; CHECK-NEXT:    # implicit-def: $xmm1<br>
+; CHECK-NEXT:    pinsrw $0, {{[0-9]+}}(%esp), %xmm1<br>
+; CHECK-NEXT:    # implicit-def: $xmm0<br>
+; CHECK-NEXT:    pinsrw $0, {{[0-9]+}}(%esp), %xmm0<br>
+; CHECK-NEXT:    # implicit-def: $xmm4<br>
+; CHECK-NEXT:    pinsrw $0, {{[0-9]+}}(%esp), %xmm4<br>
+; CHECK-NEXT:    # implicit-def: $xmm5<br>
+; CHECK-NEXT:    pinsrw $0, {{[0-9]+}}(%esp), %xmm5<br>
+; CHECK-NEXT:    # implicit-def: $xmm6<br>
+; CHECK-NEXT:    pinsrw $0, {{[0-9]+}}(%esp), %xmm6<br>
+; CHECK-NEXT:    # implicit-def: $xmm7<br>
+; CHECK-NEXT:    pinsrw $0, {{[0-9]+}}(%esp), %xmm7<br>
 ; CHECK-NEXT:    movl {{[0-9]+}}(%esp), %eax<br>
 ; CHECK-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill<br>
 ; CHECK-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movw {{[0-9]+}}(%esp), %si<br>
-; CHECK-NEXT:    movw {{[0-9]+}}(%esp), %dx<br>
-; CHECK-NEXT:    movw {{[0-9]+}}(%esp), %cx<br>
-; CHECK-NEXT:    movw {{[0-9]+}}(%esp), %ax<br>
-; CHECK-NEXT:    movw %ax, {{[-0-9]+}}(%e{{[sb]}}p) # 2-byte Spill<br>
-; CHECK-NEXT:    movw {{[0-9]+}}(%esp), %di<br>
-; CHECK-NEXT:    movw {{[0-9]+}}(%esp), %bx<br>
-; CHECK-NEXT:    movw {{[0-9]+}}(%esp), %bp<br>
-; CHECK-NEXT:    movw {{[0-9]+}}(%esp), %ax<br>
+; CHECK-NEXT:    pextrw $0, %xmm7, %eax<br>
+; CHECK-NEXT:    # kill: def $ax killed $ax killed $eax<br>
 ; CHECK-NEXT:    movw %ax, {{[0-9]+}}(%esp)<br>
-; CHECK-NEXT:    movw {{[-0-9]+}}(%e{{[sb]}}p), %ax # 2-byte Reload<br>
-; CHECK-NEXT:    movw %bp, {{[0-9]+}}(%esp)<br>
-; CHECK-NEXT:    movw %bx, {{[0-9]+}}(%esp)<br>
-; CHECK-NEXT:    movw %di, {{[0-9]+}}(%esp)<br>
-; CHECK-NEXT:    movw %si, {{[0-9]+}}(%esp)<br>
-; CHECK-NEXT:    movw %dx, {{[0-9]+}}(%esp)<br>
-; CHECK-NEXT:    movw %cx, {{[0-9]+}}(%esp)<br>
+; CHECK-NEXT:    pextrw $0, %xmm6, %eax<br>
+; CHECK-NEXT:    # kill: def $ax killed $ax killed $eax<br>
 ; CHECK-NEXT:    movw %ax, {{[0-9]+}}(%esp)<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%esp), %eax<br>
-; CHECK-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%esp), %eax<br>
-; CHECK-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%esp), %eax<br>
-; CHECK-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%esp), %ecx<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%esp), %eax<br>
-; CHECK-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%esp), %eax<br>
-; CHECK-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%esp), %eax<br>
-; CHECK-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movzwl {{[0-9]+}}(%esp), %eax<br>
-; CHECK-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill<br>
-; CHECK-NEXT:    movl %esp, %eax<br>
-; CHECK-NEXT:    movl %ecx, (%eax)<br>
-; CHECK-NEXT:    calll __gnu_h2f_ieee<br>
-; CHECK-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload<br>
+; CHECK-NEXT:    pextrw $0, %xmm5, %eax<br>
+; CHECK-NEXT:    # kill: def $ax killed $ax killed $eax<br>
+; CHECK-NEXT:    movw %ax, {{[0-9]+}}(%esp)<br>
+; CHECK-NEXT:    pextrw $0, %xmm4, %eax<br>
+; CHECK-NEXT:    # kill: def $ax killed $ax killed $eax<br>
+; CHECK-NEXT:    movw %ax, {{[0-9]+}}(%esp)<br>
+; CHECK-NEXT:    pextrw $0, %xmm3, %eax<br>
+; CHECK-NEXT:    # kill: def $ax killed $ax killed $eax<br>
+; CHECK-NEXT:    movw %ax, {{[0-9]+}}(%esp)<br>
+; CHECK-NEXT:    pextrw $0, %xmm2, %eax<br>
+; CHECK-NEXT:    # kill: def $ax killed $ax killed $eax<br>
+; CHECK-NEXT:    movw %ax, {{[0-9]+}}(%esp)<br>
+; CHECK-NEXT:    pextrw $0, %xmm1, %eax<br>
+; CHECK-NEXT:    # kill: def $ax killed $ax killed $eax<br>
+; CHECK-NEXT:    movw %ax, {{[0-9]+}}(%esp)<br>
+; CHECK-NEXT:    pextrw $0, %xmm0, %eax<br>
+; CHECK-NEXT:    # kill: def $ax killed $ax killed $eax<br>
+; CHECK-NEXT:    movw %ax, {{[0-9]+}}(%esp)<br>
+; CHECK-NEXT:    # implicit-def: $xmm0<br>
+; CHECK-NEXT:    pinsrw $0, {{[0-9]+}}(%esp), %xmm0<br>
+; CHECK-NEXT:    movss %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    # implicit-def: $xmm0<br>
+; CHECK-NEXT:    pinsrw $0, {{[0-9]+}}(%esp), %xmm0<br>
+; CHECK-NEXT:    movss %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    # implicit-def: $xmm0<br>
+; CHECK-NEXT:    pinsrw $0, {{[0-9]+}}(%esp), %xmm0<br>
+; CHECK-NEXT:    movss %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    # implicit-def: $xmm0<br>
+; CHECK-NEXT:    pinsrw $0, {{[0-9]+}}(%esp), %xmm0<br>
+; CHECK-NEXT:    # implicit-def: $xmm1<br>
+; CHECK-NEXT:    pinsrw $0, {{[0-9]+}}(%esp), %xmm1<br>
+; CHECK-NEXT:    movss %xmm1, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    # implicit-def: $xmm1<br>
+; CHECK-NEXT:    pinsrw $0, {{[0-9]+}}(%esp), %xmm1<br>
+; CHECK-NEXT:    movss %xmm1, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    # implicit-def: $xmm1<br>
+; CHECK-NEXT:    pinsrw $0, {{[0-9]+}}(%esp), %xmm1<br>
+; CHECK-NEXT:    movss %xmm1, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    # implicit-def: $xmm1<br>
+; CHECK-NEXT:    pinsrw $0, {{[0-9]+}}(%esp), %xmm1<br>
+; CHECK-NEXT:    movss %xmm1, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    pextrw $0, %xmm0, %eax<br>
+; CHECK-NEXT:    movw %ax, %cx<br>
+; CHECK-NEXT:    movl %esp, %eax<br>
+; CHECK-NEXT:    movw %cx, (%eax)<br>
+; CHECK-NEXT:    calll __extendhfsf2<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
 ; CHECK-NEXT:    fstpt {{[-0-9]+}}(%e{{[sb]}}p) # 10-byte Folded Spill<br>
+; CHECK-NEXT:    pextrw $0, %xmm0, %eax<br>
+; CHECK-NEXT:    movw %ax, %cx<br>
 ; CHECK-NEXT:    movl %esp, %eax<br>
-; CHECK-NEXT:    movl %ecx, (%eax)<br>
-; CHECK-NEXT:    calll __gnu_h2f_ieee<br>
+; CHECK-NEXT:    movw %cx, (%eax)<br>
+; CHECK-NEXT:    calll __extendhfsf2<br>
 ; CHECK-NEXT:    fldt {{[-0-9]+}}(%e{{[sb]}}p) # 10-byte Folded Reload<br>
 ; CHECK-NEXT:    movl %esp, %eax<br>
 ; CHECK-NEXT:    fxch %st(1)<br>
@@ -64,17 +95,24 @@ define <4 x half> @doTheTestMod(<4 x half> %0, <4 x half> %1) nounwind {<br>
 ; CHECK-NEXT:    calll fmodf<br>
 ; CHECK-NEXT:    movl %esp, %eax<br>
 ; CHECK-NEXT:    fstps (%eax)<br>
-; CHECK-NEXT:    calll __gnu_f2h_ieee<br>
-; CHECK-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload<br>
-; CHECK-NEXT:    movw %ax, {{[-0-9]+}}(%e{{[sb]}}p) # 2-byte Spill<br>
-; CHECK-NEXT:    movl %esp, %eax<br>
-; CHECK-NEXT:    movl %ecx, (%eax)<br>
-; CHECK-NEXT:    calll __gnu_h2f_ieee<br>
-; CHECK-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload<br>
+; CHECK-NEXT:    calll __truncsfhf2<br>
+; CHECK-NEXT:    movaps %xmm0, %xmm1<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    movss %xmm1, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    pextrw $0, %xmm0, %eax<br>
+; CHECK-NEXT:    movw %ax, %cx<br>
+; CHECK-NEXT:    movl %esp, %eax<br>
+; CHECK-NEXT:    movw %cx, (%eax)<br>
+; CHECK-NEXT:    calll __extendhfsf2<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
 ; CHECK-NEXT:    fstpt {{[-0-9]+}}(%e{{[sb]}}p) # 10-byte Folded Spill<br>
+; CHECK-NEXT:    pextrw $0, %xmm0, %eax<br>
+; CHECK-NEXT:    movw %ax, %cx<br>
 ; CHECK-NEXT:    movl %esp, %eax<br>
-; CHECK-NEXT:    movl %ecx, (%eax)<br>
-; CHECK-NEXT:    calll __gnu_h2f_ieee<br>
+; CHECK-NEXT:    movw %cx, (%eax)<br>
+; CHECK-NEXT:    calll __extendhfsf2<br>
 ; CHECK-NEXT:    fldt {{[-0-9]+}}(%e{{[sb]}}p) # 10-byte Folded Reload<br>
 ; CHECK-NEXT:    movl %esp, %eax<br>
 ; CHECK-NEXT:    fxch %st(1)<br>
@@ -83,17 +121,24 @@ define <4 x half> @doTheTestMod(<4 x half> %0, <4 x half> %1) nounwind {<br>
 ; CHECK-NEXT:    calll fmodf<br>
 ; CHECK-NEXT:    movl %esp, %eax<br>
 ; CHECK-NEXT:    fstps (%eax)<br>
-; CHECK-NEXT:    calll __gnu_f2h_ieee<br>
-; CHECK-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload<br>
-; CHECK-NEXT:    movw %ax, %si<br>
-; CHECK-NEXT:    movl %esp, %eax<br>
-; CHECK-NEXT:    movl %ecx, (%eax)<br>
-; CHECK-NEXT:    calll __gnu_h2f_ieee<br>
-; CHECK-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload<br>
+; CHECK-NEXT:    calll __truncsfhf2<br>
+; CHECK-NEXT:    movaps %xmm0, %xmm1<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    movss %xmm1, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    pextrw $0, %xmm0, %eax<br>
+; CHECK-NEXT:    movw %ax, %cx<br>
+; CHECK-NEXT:    movl %esp, %eax<br>
+; CHECK-NEXT:    movw %cx, (%eax)<br>
+; CHECK-NEXT:    calll __extendhfsf2<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
 ; CHECK-NEXT:    fstpt {{[-0-9]+}}(%e{{[sb]}}p) # 10-byte Folded Spill<br>
+; CHECK-NEXT:    pextrw $0, %xmm0, %eax<br>
+; CHECK-NEXT:    movw %ax, %cx<br>
 ; CHECK-NEXT:    movl %esp, %eax<br>
-; CHECK-NEXT:    movl %ecx, (%eax)<br>
-; CHECK-NEXT:    calll __gnu_h2f_ieee<br>
+; CHECK-NEXT:    movw %cx, (%eax)<br>
+; CHECK-NEXT:    calll __extendhfsf2<br>
 ; CHECK-NEXT:    fldt {{[-0-9]+}}(%e{{[sb]}}p) # 10-byte Folded Reload<br>
 ; CHECK-NEXT:    movl %esp, %eax<br>
 ; CHECK-NEXT:    fxch %st(1)<br>
@@ -102,17 +147,24 @@ define <4 x half> @doTheTestMod(<4 x half> %0, <4 x half> %1) nounwind {<br>
 ; CHECK-NEXT:    calll fmodf<br>
 ; CHECK-NEXT:    movl %esp, %eax<br>
 ; CHECK-NEXT:    fstps (%eax)<br>
-; CHECK-NEXT:    calll __gnu_f2h_ieee<br>
-; CHECK-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload<br>
-; CHECK-NEXT:    movw %ax, %di<br>
-; CHECK-NEXT:    movl %esp, %eax<br>
-; CHECK-NEXT:    movl %ecx, (%eax)<br>
-; CHECK-NEXT:    calll __gnu_h2f_ieee<br>
-; CHECK-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload<br>
+; CHECK-NEXT:    calll __truncsfhf2<br>
+; CHECK-NEXT:    movaps %xmm0, %xmm1<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    movss %xmm1, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill<br>
+; CHECK-NEXT:    pextrw $0, %xmm0, %eax<br>
+; CHECK-NEXT:    movw %ax, %cx<br>
+; CHECK-NEXT:    movl %esp, %eax<br>
+; CHECK-NEXT:    movw %cx, (%eax)<br>
+; CHECK-NEXT:    calll __extendhfsf2<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
 ; CHECK-NEXT:    fstpt {{[-0-9]+}}(%e{{[sb]}}p) # 10-byte Folded Spill<br>
+; CHECK-NEXT:    pextrw $0, %xmm0, %eax<br>
+; CHECK-NEXT:    movw %ax, %cx<br>
 ; CHECK-NEXT:    movl %esp, %eax<br>
-; CHECK-NEXT:    movl %ecx, (%eax)<br>
-; CHECK-NEXT:    calll __gnu_h2f_ieee<br>
+; CHECK-NEXT:    movw %cx, (%eax)<br>
+; CHECK-NEXT:    calll __extendhfsf2<br>
 ; CHECK-NEXT:    fldt {{[-0-9]+}}(%e{{[sb]}}p) # 10-byte Folded Reload<br>
 ; CHECK-NEXT:    movl %esp, %eax<br>
 ; CHECK-NEXT:    fxch %st(1)<br>
@@ -121,20 +173,29 @@ define <4 x half> @doTheTestMod(<4 x half> %0, <4 x half> %1) nounwind {<br>
 ; CHECK-NEXT:    calll fmodf<br>
 ; CHECK-NEXT:    movl %esp, %eax<br>
 ; CHECK-NEXT:    fstps (%eax)<br>
-; CHECK-NEXT:    calll __gnu_f2h_ieee<br>
-; CHECK-NEXT:    movw {{[-0-9]+}}(%e{{[sb]}}p), %dx # 2-byte Reload<br>
+; CHECK-NEXT:    calll __truncsfhf2<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%e{{[sb]}}p), %xmm2 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm2 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%e{{[sb]}}p), %xmm1 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm1 = mem[0],zero,zero,zero<br>
 ; CHECK-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload<br>
-; CHECK-NEXT:    movw %ax, %bx<br>
 ; CHECK-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload<br>
-; CHECK-NEXT:    movw %bx, 6(%ecx)<br>
-; CHECK-NEXT:    movw %di, 4(%ecx)<br>
-; CHECK-NEXT:    movw %si, 2(%ecx)<br>
+; CHECK-NEXT:    movaps %xmm0, %xmm3<br>
+; CHECK-NEXT:    movss {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; CHECK-NEXT:    pextrw $0, %xmm3, %edx<br>
+; CHECK-NEXT:    # kill: def $dx killed $dx killed $edx<br>
+; CHECK-NEXT:    movw %dx, 6(%ecx)<br>
+; CHECK-NEXT:    pextrw $0, %xmm2, %edx<br>
+; CHECK-NEXT:    # kill: def $dx killed $dx killed $edx<br>
+; CHECK-NEXT:    movw %dx, 4(%ecx)<br>
+; CHECK-NEXT:    pextrw $0, %xmm1, %edx<br>
+; CHECK-NEXT:    # kill: def $dx killed $dx killed $edx<br>
+; CHECK-NEXT:    movw %dx, 2(%ecx)<br>
+; CHECK-NEXT:    pextrw $0, %xmm0, %edx<br>
+; CHECK-NEXT:    # kill: def $dx killed $dx killed $edx<br>
 ; CHECK-NEXT:    movw %dx, (%ecx)<br>
 ; CHECK-NEXT:    addl $124, %esp<br>
-; CHECK-NEXT:    popl %esi<br>
-; CHECK-NEXT:    popl %edi<br>
-; CHECK-NEXT:    popl %ebx<br>
-; CHECK-NEXT:    popl %ebp<br>
 ; CHECK-NEXT:    retl $4<br>
 Entry:<br>
   %x = alloca <4 x half>, align 8<br>
<br>
diff  --git a/llvm/test/CodeGen/X86/scheduler-asm-moves.mir b/llvm/test/CodeGen/X86/scheduler-asm-moves.mir<br>
index 4c515f2f4b788..7def77b74eb4a 100644<br>
--- a/llvm/test/CodeGen/X86/scheduler-asm-moves.mir<br>
+++ b/llvm/test/CodeGen/X86/scheduler-asm-moves.mir<br>
@@ -128,7 +128,7 @@ body:             |<br>
     ; CHECK-NEXT: [[MOV32rm:%[0-9]+]]:gr32 = MOV32rm $noreg, 1, $noreg, @csum_ipv6_magic_daddr, $noreg :: (dereferenceable load (s32) from @csum_ipv6_magic_daddr, !tbaa !4)<br>
     ; CHECK-NEXT: [[MOV32rm1:%[0-9]+]]:gr32 = MOV32rm $noreg, 1, $noreg, @csum_ipv6_magic_proto, $noreg :: (dereferenceable load (s32) from @csum_ipv6_magic_proto, !tbaa !4)<br>
     ; CHECK-NEXT: [[MOV32r0_:%[0-9]+]]:gr32 = MOV32r0 implicit-def dead $eflags<br>
-    ; CHECK-NEXT: INLINEASM &"", 0 /* attdialect */, 2293771 /* regdef-ec:GR32 */, def early-clobber %2, 65545 /* reguse:GR8 */, [[MOV8rm]], 2293769 /* reguse:GR32 */, [[MOV32rm]], 2293769 /* reguse:GR32 */, [[MOV32r0_]], 2293769 /* reguse:GR32 */, [[MOV32rm1]],
 12 /* clobber */, implicit-def dead early-clobber $df, 12 /* clobber */, implicit-def early-clobber $fpsw, 12 /* clobber */, implicit-def dead early-clobber $eflags, !8<br>
+    ; CHECK-NEXT: INLINEASM &"", 0 /* attdialect */, 2359307 /* regdef-ec:GR32 */, def early-clobber %2, 65545 /* reguse:GR8 */, [[MOV8rm]], 2359305 /* reguse:GR32 */, [[MOV32rm]], 2359305 /* reguse:GR32 */, [[MOV32r0_]], 2359305 /* reguse:GR32 */, [[MOV32rm1]],
 12 /* clobber */, implicit-def dead early-clobber $df, 12 /* clobber */, implicit-def early-clobber $fpsw, 12 /* clobber */, implicit-def dead early-clobber $eflags, !8<br>
     ; CHECK-NEXT: MOV32mr $noreg, 1, $noreg, @csum_ipv6_magic_sum, $noreg, %2 :: (store (s32) into @csum_ipv6_magic_sum, !tbaa !4)<br>
     ; CHECK-NEXT: [[MOV32rm2:%[0-9]+]]:gr32 = MOV32rm $noreg, 1, $noreg, @synproxy_send_tcp_ipv6_nskb, $noreg :: (dereferenceable load (s32) from `i8** bitcast (%struct.sk_buff** @synproxy_send_tcp_ipv6_nskb to i8**)`, !tbaa !9)<br>
     ; CHECK-NEXT: OR8mi [[MOV32rm2]], 1, $noreg, 0, $noreg, 3, implicit-def dead $eflags :: (store (s8) into %ir.4), (load (s8) from %ir.4)<br>
@@ -143,7 +143,7 @@ body:             |<br>
     %4:gr32 = MOV32rm $noreg, 1, $noreg, @csum_ipv6_magic_daddr, $noreg :: (dereferenceable load (s32) from @csum_ipv6_magic_daddr, !tbaa !5)<br>
     %6:gr32 = MOV32rm $noreg, 1, $noreg, @csum_ipv6_magic_proto, $noreg :: (dereferenceable load (s32) from @csum_ipv6_magic_proto, !tbaa !5)<br>
     %5:gr32 = MOV32r0 implicit-def dead $eflags<br>
-    INLINEASM &"", 0 /* attdialect */, 2293771 /* regdef-ec:GR32 */, def early-clobber %2, 65545 /* reguse:GR8 */, %3, 2293769 /* reguse:GR32 */, %4, 2293769 /* reguse:GR32 */, %5, 2293769 /* reguse:GR32 */, %6, 12 /* clobber */, implicit-def dead early-clobber
 $df, 12 /* clobber */, implicit-def early-clobber $fpsw, 12 /* clobber */, implicit-def dead early-clobber $eflags, !9<br>
+    INLINEASM &"", 0 /* attdialect */, 2359307 /* regdef-ec:GR32 */, def early-clobber %2, 65545 /* reguse:GR8 */, %3, 2359305 /* reguse:GR32 */, %4, 2359305 /* reguse:GR32 */, %5, 2359305 /* reguse:GR32 */, %6, 12 /* clobber */, implicit-def dead early-clobber
 $df, 12 /* clobber */, implicit-def early-clobber $fpsw, 12 /* clobber */, implicit-def dead early-clobber $eflags, !9<br>
     MOV32mr $noreg, 1, $noreg, @csum_ipv6_magic_sum, $noreg, %2 :: (store (s32) into @csum_ipv6_magic_sum, !tbaa !5)<br>
     %7:gr32 = MOV32rm $noreg, 1, $noreg, @synproxy_send_tcp_ipv6_nskb, $noreg :: (dereferenceable load (s32) from `i8** bitcast (%struct.sk_buff** @synproxy_send_tcp_ipv6_nskb to i8**)`, !tbaa !10)<br>
     OR8mi %7, 1, $noreg, 0, $noreg, 3, implicit-def dead $eflags :: (store (s8) into %ir.4), (load (s8) from %ir.4)<br>
<br>
diff  --git a/llvm/test/CodeGen/X86/shuffle-extract-subvector.ll b/llvm/test/CodeGen/X86/shuffle-extract-subvector.ll<br>
index 6921bc142f1dc..7734a270a78d9 100644<br>
--- a/llvm/test/CodeGen/X86/shuffle-extract-subvector.ll<br>
+++ b/llvm/test/CodeGen/X86/shuffle-extract-subvector.ll<br>
@@ -4,13 +4,30 @@<br>
 define void @f(<4 x half>* %a, <4 x half>* %b, <8 x half>* %c) {<br>
 ; CHECK-LABEL: f:<br>
 ; CHECK:       # %bb.0:<br>
-; CHECK-NEXT:    movq (%rdi), %rax<br>
-; CHECK-NEXT:    movq %rax, -{{[0-9]+}}(%rsp)<br>
-; CHECK-NEXT:    movdqa -{{[0-9]+}}(%rsp), %xmm0<br>
-; CHECK-NEXT:    movq (%rsi), %rax<br>
-; CHECK-NEXT:    movq %rax, -{{[0-9]+}}(%rsp)<br>
-; CHECK-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3]<br>
-; CHECK-NEXT:    movdqa %xmm0, (%rdx)<br>
+; CHECK-NEXT:    pinsrw $0, (%rdi), %xmm0<br>
+; CHECK-NEXT:    pinsrw $0, 2(%rdi), %xmm1<br>
+; CHECK-NEXT:    pinsrw $0, 4(%rdi), %xmm2<br>
+; CHECK-NEXT:    pinsrw $0, 6(%rdi), %xmm3<br>
+; CHECK-NEXT:    pinsrw $0, (%rsi), %xmm4<br>
+; CHECK-NEXT:    pinsrw $0, 2(%rsi), %xmm5<br>
+; CHECK-NEXT:    pinsrw $0, 4(%rsi), %xmm6<br>
+; CHECK-NEXT:    pinsrw $0, 6(%rsi), %xmm7<br>
+; CHECK-NEXT:    pextrw $0, %xmm7, %eax<br>
+; CHECK-NEXT:    movw %ax, 14(%rdx)<br>
+; CHECK-NEXT:    pextrw $0, %xmm3, %eax<br>
+; CHECK-NEXT:    movw %ax, 12(%rdx)<br>
+; CHECK-NEXT:    pextrw $0, %xmm6, %eax<br>
+; CHECK-NEXT:    movw %ax, 10(%rdx)<br>
+; CHECK-NEXT:    pextrw $0, %xmm2, %eax<br>
+; CHECK-NEXT:    movw %ax, 8(%rdx)<br>
+; CHECK-NEXT:    pextrw $0, %xmm5, %eax<br>
+; CHECK-NEXT:    movw %ax, 6(%rdx)<br>
+; CHECK-NEXT:    pextrw $0, %xmm1, %eax<br>
+; CHECK-NEXT:    movw %ax, 4(%rdx)<br>
+; CHECK-NEXT:    pextrw $0, %xmm4, %eax<br>
+; CHECK-NEXT:    movw %ax, 2(%rdx)<br>
+; CHECK-NEXT:    pextrw $0, %xmm0, %eax<br>
+; CHECK-NEXT:    movw %ax, (%rdx)<br>
 ; CHECK-NEXT:    retq<br>
   %tmp4 = load <4 x half>, <4 x half>* %a<br>
   %tmp5 = load <4 x half>, <4 x half>* %b<br>
<br>
diff  --git a/llvm/test/CodeGen/X86/stack-folding-fp-avx512fp16-fma.ll b/llvm/test/CodeGen/X86/stack-folding-fp-avx512fp16-fma.ll<br>
index a0cc87f87db8f..9cd1d0cf5fc59 100644<br>
--- a/llvm/test/CodeGen/X86/stack-folding-fp-avx512fp16-fma.ll<br>
+++ b/llvm/test/CodeGen/X86/stack-folding-fp-avx512fp16-fma.ll<br>
@@ -803,7 +803,7 @@ define <32 x half> @stack_fold_fnmsub312ph_maskz(<32 x half> %a0, <32 x half> %a<br>
<br>
 define half @stack_fold_fmadd123sh(half %a0, half %a1, half %a2) {<br>
   ;CHECK-LABEL: stack_fold_fmadd123sh:<br>
-  ;CHECK:       vfmadd213sh {{-?[0-9]*}}(%rsp), {{%xmm[0-9][0-9]*}}, {{%xmm[0-9][0-9]*}} {{.*#+}} 2-byte Folded Reload<br>
+  ;CHECK:       vfmadd213sh {{-?[0-9]*}}(%rsp), {{%xmm[0-9][0-9]*}}, {{%xmm[0-9][0-9]*}} {{.*#+}} 4-byte Folded Reload<br>
   %1 = tail call <2 x i64> asm sideeffect "nop", "=x,~{xmm3},~{xmm4},~{xmm5},~{xmm6},~{xmm7},~{xmm8},~{xmm9},~{xmm10},~{xmm11},~{xmm12},~{xmm13},~{xmm14},~{xmm15},~{xmm16},~{xmm17},~{xmm18},~{xmm19},~{xmm20},~{xmm21},~{xmm22},~{xmm23},~{xmm24},~{xmm25},~{xmm26},~{xmm27},~{xmm28},~{xmm29},~{xmm30},~{xmm31},~{flags}"()<br>
   %2 = call half @llvm.fma.f16(half %a0, half %a1, half %a2)<br>
   ret half %2<br>
@@ -812,7 +812,7 @@ declare half @llvm.fma.f16(half, half, half)<br>
<br>
 define half @stack_fold_fmadd213sh(half %a0, half %a1, half %a2) {<br>
   ;CHECK-LABEL: stack_fold_fmadd213sh:<br>
-  ;CHECK:       vfmadd213sh {{-?[0-9]*}}(%rsp), {{%xmm[0-9][0-9]*}}, {{%xmm[0-9][0-9]*}} {{.*#+}} 2-byte Folded Reload<br>
+  ;CHECK:       vfmadd213sh {{-?[0-9]*}}(%rsp), {{%xmm[0-9][0-9]*}}, {{%xmm[0-9][0-9]*}} {{.*#+}} 4-byte Folded Reload<br>
   %1 = tail call <2 x i64> asm sideeffect "nop", "=x,~{xmm3},~{xmm4},~{xmm5},~{xmm6},~{xmm7},~{xmm8},~{xmm9},~{xmm10},~{xmm11},~{xmm12},~{xmm13},~{xmm14},~{xmm15},~{xmm16},~{xmm17},~{xmm18},~{xmm19},~{xmm20},~{xmm21},~{xmm22},~{xmm23},~{xmm24},~{xmm25},~{xmm26},~{xmm27},~{xmm28},~{xmm29},~{xmm30},~{xmm31},~{flags}"()<br>
   %2 = call half @llvm.fma.f16(half %a1, half %a0, half %a2)<br>
   ret half %2<br>
@@ -820,7 +820,7 @@ define half @stack_fold_fmadd213sh(half %a0, half %a1, half %a2) {<br>
<br>
 define half @stack_fold_fmadd231sh(half %a0, half %a1, half %a2) {<br>
   ;CHECK-LABEL: stack_fold_fmadd231sh:<br>
-  ;CHECK:       vfmadd231sh {{-?[0-9]*}}(%rsp), {{%xmm[0-9][0-9]*}}, {{%xmm[0-9][0-9]*}} {{.*#+}} 2-byte Folded Reload<br>
+  ;CHECK:       vfmadd231sh {{-?[0-9]*}}(%rsp), {{%xmm[0-9][0-9]*}}, {{%xmm[0-9][0-9]*}} {{.*#+}} 4-byte Folded Reload<br>
   %1 = tail call <2 x i64> asm sideeffect "nop", "=x,~{xmm3},~{xmm4},~{xmm5},~{xmm6},~{xmm7},~{xmm8},~{xmm9},~{xmm10},~{xmm11},~{xmm12},~{xmm13},~{xmm14},~{xmm15},~{xmm16},~{xmm17},~{xmm18},~{xmm19},~{xmm20},~{xmm21},~{xmm22},~{xmm23},~{xmm24},~{xmm25},~{xmm26},~{xmm27},~{xmm28},~{xmm29},~{xmm30},~{xmm31},~{flags}"()<br>
   %2 = call half @llvm.fma.f16(half %a1, half %a2, half %a0)<br>
   ret half %2<br>
@@ -828,7 +828,7 @@ define half @stack_fold_fmadd231sh(half %a0, half %a1, half %a2) {<br>
<br>
 define half @stack_fold_fmadd321sh(half %a0, half %a1, half %a2) {<br>
   ;CHECK-LABEL: stack_fold_fmadd321sh:<br>
-  ;CHECK:       vfmadd231sh {{-?[0-9]*}}(%rsp), {{%xmm[0-9][0-9]*}}, {{%xmm[0-9][0-9]*}} {{.*#+}} 2-byte Folded Reload<br>
+  ;CHECK:       vfmadd231sh {{-?[0-9]*}}(%rsp), {{%xmm[0-9][0-9]*}}, {{%xmm[0-9][0-9]*}} {{.*#+}} 4-byte Folded Reload<br>
   %1 = tail call <2 x i64> asm sideeffect "nop", "=x,~{xmm3},~{xmm4},~{xmm5},~{xmm6},~{xmm7},~{xmm8},~{xmm9},~{xmm10},~{xmm11},~{xmm12},~{xmm13},~{xmm14},~{xmm15},~{xmm16},~{xmm17},~{xmm18},~{xmm19},~{xmm20},~{xmm21},~{xmm22},~{xmm23},~{xmm24},~{xmm25},~{xmm26},~{xmm27},~{xmm28},~{xmm29},~{xmm30},~{xmm31},~{flags}"()<br>
   %2 = call half @llvm.fma.f16(half %a2, half %a1, half %a0)<br>
   ret half %2<br>
@@ -836,7 +836,7 @@ define half @stack_fold_fmadd321sh(half %a0, half %a1, half %a2) {<br>
<br>
 define half @stack_fold_fmadd132sh(half %a0, half %a1, half %a2) {<br>
   ;CHECK-LABEL: stack_fold_fmadd132sh:<br>
-  ;CHECK:       vfmadd132sh {{-?[0-9]*}}(%rsp), {{%xmm[0-9][0-9]*}}, {{%xmm[0-9][0-9]*}} {{.*#+}} 2-byte Folded Reload<br>
+  ;CHECK:       vfmadd132sh {{-?[0-9]*}}(%rsp), {{%xmm[0-9][0-9]*}}, {{%xmm[0-9][0-9]*}} {{.*#+}} 4-byte Folded Reload<br>
   %1 = tail call <2 x i64> asm sideeffect "nop", "=x,~{xmm3},~{xmm4},~{xmm5},~{xmm6},~{xmm7},~{xmm8},~{xmm9},~{xmm10},~{xmm11},~{xmm12},~{xmm13},~{xmm14},~{xmm15},~{xmm16},~{xmm17},~{xmm18},~{xmm19},~{xmm20},~{xmm21},~{xmm22},~{xmm23},~{xmm24},~{xmm25},~{xmm26},~{xmm27},~{xmm28},~{xmm29},~{xmm30},~{xmm31},~{flags}"()<br>
   %2 = call half @llvm.fma.f16(half %a0, half %a2, half %a1)<br>
   ret half %2<br>
@@ -844,7 +844,7 @@ define half @stack_fold_fmadd132sh(half %a0, half %a1, half %a2) {<br>
<br>
 define half @stack_fold_fmadd312sh(half %a0, half %a1, half %a2) {<br>
   ;CHECK-LABEL: stack_fold_fmadd312sh:<br>
-  ;CHECK:       vfmadd132sh {{-?[0-9]*}}(%rsp), {{%xmm[0-9][0-9]*}}, {{%xmm[0-9][0-9]*}} {{.*#+}} 2-byte Folded Reload<br>
+  ;CHECK:       vfmadd132sh {{-?[0-9]*}}(%rsp), {{%xmm[0-9][0-9]*}}, {{%xmm[0-9][0-9]*}} {{.*#+}} 4-byte Folded Reload<br>
   %1 = tail call <2 x i64> asm sideeffect "nop", "=x,~{xmm3},~{xmm4},~{xmm5},~{xmm6},~{xmm7},~{xmm8},~{xmm9},~{xmm10},~{xmm11},~{xmm12},~{xmm13},~{xmm14},~{xmm15},~{xmm16},~{xmm17},~{xmm18},~{xmm19},~{xmm20},~{xmm21},~{xmm22},~{xmm23},~{xmm24},~{xmm25},~{xmm26},~{xmm27},~{xmm28},~{xmm29},~{xmm30},~{xmm31},~{flags}"()<br>
   %2 = call half @llvm.fma.f16(half %a2, half %a0, half %a1)<br>
   ret half %2<br>
@@ -852,7 +852,7 @@ define half @stack_fold_fmadd312sh(half %a0, half %a1, half %a2) {<br>
<br>
 define half @stack_fold_fmsub123sh(half %a0, half %a1, half %a2) {<br>
   ;CHECK-LABEL: stack_fold_fmsub123sh:<br>
-  ;CHECK:       vfmsub213sh {{-?[0-9]*}}(%rsp), {{%xmm[0-9][0-9]*}}, {{%xmm[0-9][0-9]*}} {{.*#+}} 2-byte Folded Reload<br>
+  ;CHECK:       vfmsub213sh {{-?[0-9]*}}(%rsp), {{%xmm[0-9][0-9]*}}, {{%xmm[0-9][0-9]*}} {{.*#+}} 4-byte Folded Reload<br>
   %1 = tail call <2 x i64> asm sideeffect "nop", "=x,~{xmm3},~{xmm4},~{xmm5},~{xmm6},~{xmm7},~{xmm8},~{xmm9},~{xmm10},~{xmm11},~{xmm12},~{xmm13},~{xmm14},~{xmm15},~{xmm16},~{xmm17},~{xmm18},~{xmm19},~{xmm20},~{xmm21},~{xmm22},~{xmm23},~{xmm24},~{xmm25},~{xmm26},~{xmm27},~{xmm28},~{xmm29},~{xmm30},~{xmm31},~{flags}"()<br>
   %2 = fneg half %a2<br>
   %3 = call half @llvm.fma.f16(half %a0, half %a1, half %2)<br>
@@ -861,7 +861,7 @@ define half @stack_fold_fmsub123sh(half %a0, half %a1, half %a2) {<br>
<br>
 define half @stack_fold_fmsub213sh(half %a0, half %a1, half %a2) {<br>
   ;CHECK-LABEL: stack_fold_fmsub213sh:<br>
-  ;CHECK:       vfmsub213sh {{-?[0-9]*}}(%rsp), {{%xmm[0-9][0-9]*}}, {{%xmm[0-9][0-9]*}} {{.*#+}} 2-byte Folded Reload<br>
+  ;CHECK:       vfmsub213sh {{-?[0-9]*}}(%rsp), {{%xmm[0-9][0-9]*}}, {{%xmm[0-9][0-9]*}} {{.*#+}} 4-byte Folded Reload<br>
   %1 = tail call <2 x i64> asm sideeffect "nop", "=x,~{xmm3},~{xmm4},~{xmm5},~{xmm6},~{xmm7},~{xmm8},~{xmm9},~{xmm10},~{xmm11},~{xmm12},~{xmm13},~{xmm14},~{xmm15},~{xmm16},~{xmm17},~{xmm18},~{xmm19},~{xmm20},~{xmm21},~{xmm22},~{xmm23},~{xmm24},~{xmm25},~{xmm26},~{xmm27},~{xmm28},~{xmm29},~{xmm30},~{xmm31},~{flags}"()<br>
   %2 = fneg half %a2<br>
   %3 = call half @llvm.fma.f16(half %a1, half %a0, half %2)<br>
@@ -870,7 +870,7 @@ define half @stack_fold_fmsub213sh(half %a0, half %a1, half %a2) {<br>
<br>
 define half @stack_fold_fmsub231sh(half %a0, half %a1, half %a2) {<br>
   ;CHECK-LABEL: stack_fold_fmsub231sh:<br>
-  ;CHECK:       vfmsub231sh {{-?[0-9]*}}(%rsp), {{%xmm[0-9][0-9]*}}, {{%xmm[0-9][0-9]*}} {{.*#+}} 2-byte Folded Reload<br>
+  ;CHECK:       vfmsub231sh {{-?[0-9]*}}(%rsp), {{%xmm[0-9][0-9]*}}, {{%xmm[0-9][0-9]*}} {{.*#+}} 4-byte Folded Reload<br>
   %1 = tail call <2 x i64> asm sideeffect "nop", "=x,~{xmm3},~{xmm4},~{xmm5},~{xmm6},~{xmm7},~{xmm8},~{xmm9},~{xmm10},~{xmm11},~{xmm12},~{xmm13},~{xmm14},~{xmm15},~{xmm16},~{xmm17},~{xmm18},~{xmm19},~{xmm20},~{xmm21},~{xmm22},~{xmm23},~{xmm24},~{xmm25},~{xmm26},~{xmm27},~{xmm28},~{xmm29},~{xmm30},~{xmm31},~{flags}"()<br>
   %2 = fneg half %a0<br>
   %3 = call half @llvm.fma.f16(half %a1, half %a2, half %2)<br>
@@ -879,7 +879,7 @@ define half @stack_fold_fmsub231sh(half %a0, half %a1, half %a2) {<br>
<br>
 define half @stack_fold_fmsub321sh(half %a0, half %a1, half %a2) {<br>
   ;CHECK-LABEL: stack_fold_fmsub321sh:<br>
-  ;CHECK:       vfmsub231sh {{-?[0-9]*}}(%rsp), {{%xmm[0-9][0-9]*}}, {{%xmm[0-9][0-9]*}} {{.*#+}} 2-byte Folded Reload<br>
+  ;CHECK:       vfmsub231sh {{-?[0-9]*}}(%rsp), {{%xmm[0-9][0-9]*}}, {{%xmm[0-9][0-9]*}} {{.*#+}} 4-byte Folded Reload<br>
   %1 = tail call <2 x i64> asm sideeffect "nop", "=x,~{xmm3},~{xmm4},~{xmm5},~{xmm6},~{xmm7},~{xmm8},~{xmm9},~{xmm10},~{xmm11},~{xmm12},~{xmm13},~{xmm14},~{xmm15},~{xmm16},~{xmm17},~{xmm18},~{xmm19},~{xmm20},~{xmm21},~{xmm22},~{xmm23},~{xmm24},~{xmm25},~{xmm26},~{xmm27},~{xmm28},~{xmm29},~{xmm30},~{xmm31},~{flags}"()<br>
   %2 = fneg half %a0<br>
   %3 = call half @llvm.fma.f16(half %a2, half %a1, half %2)<br>
@@ -888,7 +888,7 @@ define half @stack_fold_fmsub321sh(half %a0, half %a1, half %a2) {<br>
<br>
 define half @stack_fold_fmsub132sh(half %a0, half %a1, half %a2) {<br>
   ;CHECK-LABEL: stack_fold_fmsub132sh:<br>
-  ;CHECK:       vfmsub132sh {{-?[0-9]*}}(%rsp), {{%xmm[0-9][0-9]*}}, {{%xmm[0-9][0-9]*}} {{.*#+}} 2-byte Folded Reload<br>
+  ;CHECK:       vfmsub132sh {{-?[0-9]*}}(%rsp), {{%xmm[0-9][0-9]*}}, {{%xmm[0-9][0-9]*}} {{.*#+}} 4-byte Folded Reload<br>
   %1 = tail call <2 x i64> asm sideeffect "nop", "=x,~{xmm3},~{xmm4},~{xmm5},~{xmm6},~{xmm7},~{xmm8},~{xmm9},~{xmm10},~{xmm11},~{xmm12},~{xmm13},~{xmm14},~{xmm15},~{xmm16},~{xmm17},~{xmm18},~{xmm19},~{xmm20},~{xmm21},~{xmm22},~{xmm23},~{xmm24},~{xmm25},~{xmm26},~{xmm27},~{xmm28},~{xmm29},~{xmm30},~{xmm31},~{flags}"()<br>
   %2 = fneg half %a1<br>
   %3 = call half @llvm.fma.f16(half %a0, half %a2, half %2)<br>
@@ -897,7 +897,7 @@ define half @stack_fold_fmsub132sh(half %a0, half %a1, half %a2) {<br>
<br>
 define half @stack_fold_fmsub312sh(half %a0, half %a1, half %a2) {<br>
   ;CHECK-LABEL: stack_fold_fmsub312sh:<br>
-  ;CHECK:       vfmsub132sh {{-?[0-9]*}}(%rsp), {{%xmm[0-9][0-9]*}}, {{%xmm[0-9][0-9]*}} {{.*#+}} 2-byte Folded Reload<br>
+  ;CHECK:       vfmsub132sh {{-?[0-9]*}}(%rsp), {{%xmm[0-9][0-9]*}}, {{%xmm[0-9][0-9]*}} {{.*#+}} 4-byte Folded Reload<br>
   %1 = tail call <2 x i64> asm sideeffect "nop", "=x,~{xmm3},~{xmm4},~{xmm5},~{xmm6},~{xmm7},~{xmm8},~{xmm9},~{xmm10},~{xmm11},~{xmm12},~{xmm13},~{xmm14},~{xmm15},~{xmm16},~{xmm17},~{xmm18},~{xmm19},~{xmm20},~{xmm21},~{xmm22},~{xmm23},~{xmm24},~{xmm25},~{xmm26},~{xmm27},~{xmm28},~{xmm29},~{xmm30},~{xmm31},~{flags}"()<br>
   %2 = fneg half %a1<br>
   %3 = call half @llvm.fma.f16(half %a2, half %a0, half %2)<br>
@@ -906,7 +906,7 @@ define half @stack_fold_fmsub312sh(half %a0, half %a1, half %a2) {<br>
<br>
 define half @stack_fold_fnmadd123sh(half %a0, half %a1, half %a2) {<br>
   ;CHECK-LABEL: stack_fold_fnmadd123sh:<br>
-  ;CHECK:       vfnmadd213sh {{-?[0-9]*}}(%rsp), {{%xmm[0-9][0-9]*}}, {{%xmm[0-9][0-9]*}} {{.*#+}} 2-byte Folded Reload<br>
+  ;CHECK:       vfnmadd213sh {{-?[0-9]*}}(%rsp), {{%xmm[0-9][0-9]*}}, {{%xmm[0-9][0-9]*}} {{.*#+}} 4-byte Folded Reload<br>
   %1 = tail call <2 x i64> asm sideeffect "nop", "=x,~{xmm3},~{xmm4},~{xmm5},~{xmm6},~{xmm7},~{xmm8},~{xmm9},~{xmm10},~{xmm11},~{xmm12},~{xmm13},~{xmm14},~{xmm15},~{xmm16},~{xmm17},~{xmm18},~{xmm19},~{xmm20},~{xmm21},~{xmm22},~{xmm23},~{xmm24},~{xmm25},~{xmm26},~{xmm27},~{xmm28},~{xmm29},~{xmm30},~{xmm31},~{flags}"()<br>
   %2 = fneg half %a0<br>
   %3 = call half @llvm.fma.f16(half %2, half %a1, half %a2)<br>
@@ -915,7 +915,7 @@ define half @stack_fold_fnmadd123sh(half %a0, half %a1, half %a2) {<br>
<br>
 define half @stack_fold_fnmadd213sh(half %a0, half %a1, half %a2) {<br>
   ;CHECK-LABEL: stack_fold_fnmadd213sh:<br>
-  ;CHECK:       vfnmadd213sh {{-?[0-9]*}}(%rsp), {{%xmm[0-9][0-9]*}}, {{%xmm[0-9][0-9]*}} {{.*#+}} 2-byte Folded Reload<br>
+  ;CHECK:       vfnmadd213sh {{-?[0-9]*}}(%rsp), {{%xmm[0-9][0-9]*}}, {{%xmm[0-9][0-9]*}} {{.*#+}} 4-byte Folded Reload<br>
   %1 = tail call <2 x i64> asm sideeffect "nop", "=x,~{xmm3},~{xmm4},~{xmm5},~{xmm6},~{xmm7},~{xmm8},~{xmm9},~{xmm10},~{xmm11},~{xmm12},~{xmm13},~{xmm14},~{xmm15},~{xmm16},~{xmm17},~{xmm18},~{xmm19},~{xmm20},~{xmm21},~{xmm22},~{xmm23},~{xmm24},~{xmm25},~{xmm26},~{xmm27},~{xmm28},~{xmm29},~{xmm30},~{xmm31},~{flags}"()<br>
   %2 = fneg half %a1<br>
   %3 = call half @llvm.fma.f16(half %2, half %a0, half %a2)<br>
@@ -924,7 +924,7 @@ define half @stack_fold_fnmadd213sh(half %a0, half %a1, half %a2) {<br>
<br>
 define half @stack_fold_fnmadd231sh(half %a0, half %a1, half %a2) {<br>
   ;CHECK-LABEL: stack_fold_fnmadd231sh:<br>
-  ;CHECK:       vfnmadd231sh {{-?[0-9]*}}(%rsp), {{%xmm[0-9][0-9]*}}, {{%xmm[0-9][0-9]*}} {{.*#+}} 2-byte Folded Reload<br>
+  ;CHECK:       vfnmadd231sh {{-?[0-9]*}}(%rsp), {{%xmm[0-9][0-9]*}}, {{%xmm[0-9][0-9]*}} {{.*#+}} 4-byte Folded Reload<br>
   %1 = tail call <2 x i64> asm sideeffect "nop", "=x,~{xmm3},~{xmm4},~{xmm5},~{xmm6},~{xmm7},~{xmm8},~{xmm9},~{xmm10},~{xmm11},~{xmm12},~{xmm13},~{xmm14},~{xmm15},~{xmm16},~{xmm17},~{xmm18},~{xmm19},~{xmm20},~{xmm21},~{xmm22},~{xmm23},~{xmm24},~{xmm25},~{xmm26},~{xmm27},~{xmm28},~{xmm29},~{xmm30},~{xmm31},~{flags}"()<br>
   %2 = fneg half %a1<br>
   %3 = call half @llvm.fma.f16(half %2, half %a2, half %a0)<br>
@@ -933,7 +933,7 @@ define half @stack_fold_fnmadd231sh(half %a0, half %a1, half %a2) {<br>
<br>
 define half @stack_fold_fnmadd321sh(half %a0, half %a1, half %a2) {<br>
   ;CHECK-LABEL: stack_fold_fnmadd321sh:<br>
-  ;CHECK:       vfnmadd231sh {{-?[0-9]*}}(%rsp), {{%xmm[0-9][0-9]*}}, {{%xmm[0-9][0-9]*}} {{.*#+}} 2-byte Folded Reload<br>
+  ;CHECK:       vfnmadd231sh {{-?[0-9]*}}(%rsp), {{%xmm[0-9][0-9]*}}, {{%xmm[0-9][0-9]*}} {{.*#+}} 4-byte Folded Reload<br>
   %1 = tail call <2 x i64> asm sideeffect "nop", "=x,~{xmm3},~{xmm4},~{xmm5},~{xmm6},~{xmm7},~{xmm8},~{xmm9},~{xmm10},~{xmm11},~{xmm12},~{xmm13},~{xmm14},~{xmm15},~{xmm16},~{xmm17},~{xmm18},~{xmm19},~{xmm20},~{xmm21},~{xmm22},~{xmm23},~{xmm24},~{xmm25},~{xmm26},~{xmm27},~{xmm28},~{xmm29},~{xmm30},~{xmm31},~{flags}"()<br>
   %2 = fneg half %a2<br>
   %3 = call half @llvm.fma.f16(half %2, half %a1, half %a0)<br>
@@ -942,7 +942,7 @@ define half @stack_fold_fnmadd321sh(half %a0, half %a1, half %a2) {<br>
<br>
 define half @stack_fold_fnmadd132sh(half %a0, half %a1, half %a2) {<br>
   ;CHECK-LABEL: stack_fold_fnmadd132sh:<br>
-  ;CHECK:       vfnmadd132sh {{-?[0-9]*}}(%rsp), {{%xmm[0-9][0-9]*}}, {{%xmm[0-9][0-9]*}} {{.*#+}} 2-byte Folded Reload<br>
+  ;CHECK:       vfnmadd132sh {{-?[0-9]*}}(%rsp), {{%xmm[0-9][0-9]*}}, {{%xmm[0-9][0-9]*}} {{.*#+}} 4-byte Folded Reload<br>
   %1 = tail call <2 x i64> asm sideeffect "nop", "=x,~{xmm3},~{xmm4},~{xmm5},~{xmm6},~{xmm7},~{xmm8},~{xmm9},~{xmm10},~{xmm11},~{xmm12},~{xmm13},~{xmm14},~{xmm15},~{xmm16},~{xmm17},~{xmm18},~{xmm19},~{xmm20},~{xmm21},~{xmm22},~{xmm23},~{xmm24},~{xmm25},~{xmm26},~{xmm27},~{xmm28},~{xmm29},~{xmm30},~{xmm31},~{flags}"()<br>
   %2 = fneg half %a0<br>
   %3 = call half @llvm.fma.f16(half %2, half %a2, half %a1)<br>
@@ -951,7 +951,7 @@ define half @stack_fold_fnmadd132sh(half %a0, half %a1, half %a2) {<br>
<br>
 define half @stack_fold_fnmadd312sh(half %a0, half %a1, half %a2) {<br>
   ;CHECK-LABEL: stack_fold_fnmadd312sh:<br>
-  ;CHECK:       vfnmadd132sh {{-?[0-9]*}}(%rsp), {{%xmm[0-9][0-9]*}}, {{%xmm[0-9][0-9]*}} {{.*#+}} 2-byte Folded Reload<br>
+  ;CHECK:       vfnmadd132sh {{-?[0-9]*}}(%rsp), {{%xmm[0-9][0-9]*}}, {{%xmm[0-9][0-9]*}} {{.*#+}} 4-byte Folded Reload<br>
   %1 = tail call <2 x i64> asm sideeffect "nop", "=x,~{xmm3},~{xmm4},~{xmm5},~{xmm6},~{xmm7},~{xmm8},~{xmm9},~{xmm10},~{xmm11},~{xmm12},~{xmm13},~{xmm14},~{xmm15},~{xmm16},~{xmm17},~{xmm18},~{xmm19},~{xmm20},~{xmm21},~{xmm22},~{xmm23},~{xmm24},~{xmm25},~{xmm26},~{xmm27},~{xmm28},~{xmm29},~{xmm30},~{xmm31},~{flags}"()<br>
   %2 = fneg half %a2<br>
   %3 = call half @llvm.fma.f16(half %2, half %a0, half %a1)<br>
@@ -960,7 +960,7 @@ define half @stack_fold_fnmadd312sh(half %a0, half %a1, half %a2) {<br>
<br>
 define half @stack_fold_fnmsub123sh(half %a0, half %a1, half %a2) {<br>
   ;CHECK-LABEL: stack_fold_fnmsub123sh:<br>
-  ;CHECK:       vfnmsub213sh {{-?[0-9]*}}(%rsp), {{%xmm[0-9][0-9]*}}, {{%xmm[0-9][0-9]*}} {{.*#+}} 2-byte Folded Reload<br>
+  ;CHECK:       vfnmsub213sh {{-?[0-9]*}}(%rsp), {{%xmm[0-9][0-9]*}}, {{%xmm[0-9][0-9]*}} {{.*#+}} 4-byte Folded Reload<br>
   %1 = tail call <2 x i64> asm sideeffect "nop", "=x,~{xmm3},~{xmm4},~{xmm5},~{xmm6},~{xmm7},~{xmm8},~{xmm9},~{xmm10},~{xmm11},~{xmm12},~{xmm13},~{xmm14},~{xmm15},~{xmm16},~{xmm17},~{xmm18},~{xmm19},~{xmm20},~{xmm21},~{xmm22},~{xmm23},~{xmm24},~{xmm25},~{xmm26},~{xmm27},~{xmm28},~{xmm29},~{xmm30},~{xmm31},~{flags}"()<br>
   %2 = fneg half %a0<br>
   %3 = fneg half %a2<br>
@@ -970,7 +970,7 @@ define half @stack_fold_fnmsub123sh(half %a0, half %a1, half %a2) {<br>
<br>
 define half @stack_fold_fnmsub213sh(half %a0, half %a1, half %a2) {<br>
   ;CHECK-LABEL: stack_fold_fnmsub213sh:<br>
-  ;CHECK:       vfnmsub213sh {{-?[0-9]*}}(%rsp), {{%xmm[0-9][0-9]*}}, {{%xmm[0-9][0-9]*}} {{.*#+}} 2-byte Folded Reload<br>
+  ;CHECK:       vfnmsub213sh {{-?[0-9]*}}(%rsp), {{%xmm[0-9][0-9]*}}, {{%xmm[0-9][0-9]*}} {{.*#+}} 4-byte Folded Reload<br>
   %1 = tail call <2 x i64> asm sideeffect "nop", "=x,~{xmm3},~{xmm4},~{xmm5},~{xmm6},~{xmm7},~{xmm8},~{xmm9},~{xmm10},~{xmm11},~{xmm12},~{xmm13},~{xmm14},~{xmm15},~{xmm16},~{xmm17},~{xmm18},~{xmm19},~{xmm20},~{xmm21},~{xmm22},~{xmm23},~{xmm24},~{xmm25},~{xmm26},~{xmm27},~{xmm28},~{xmm29},~{xmm30},~{xmm31},~{flags}"()<br>
   %2 = fneg half %a1<br>
   %3 = fneg half %a2<br>
@@ -980,7 +980,7 @@ define half @stack_fold_fnmsub213sh(half %a0, half %a1, half %a2) {<br>
<br>
 define half @stack_fold_fnmsub231sh(half %a0, half %a1, half %a2) {<br>
   ;CHECK-LABEL: stack_fold_fnmsub231sh:<br>
-  ;CHECK:       vfnmsub231sh {{-?[0-9]*}}(%rsp), {{%xmm[0-9][0-9]*}}, {{%xmm[0-9][0-9]*}} {{.*#+}} 2-byte Folded Reload<br>
+  ;CHECK:       vfnmsub231sh {{-?[0-9]*}}(%rsp), {{%xmm[0-9][0-9]*}}, {{%xmm[0-9][0-9]*}} {{.*#+}} 4-byte Folded Reload<br>
   %1 = tail call <2 x i64> asm sideeffect "nop", "=x,~{xmm3},~{xmm4},~{xmm5},~{xmm6},~{xmm7},~{xmm8},~{xmm9},~{xmm10},~{xmm11},~{xmm12},~{xmm13},~{xmm14},~{xmm15},~{xmm16},~{xmm17},~{xmm18},~{xmm19},~{xmm20},~{xmm21},~{xmm22},~{xmm23},~{xmm24},~{xmm25},~{xmm26},~{xmm27},~{xmm28},~{xmm29},~{xmm30},~{xmm31},~{flags}"()<br>
   %2 = fneg half %a1<br>
   %3 = fneg half %a0<br>
@@ -990,7 +990,7 @@ define half @stack_fold_fnmsub231sh(half %a0, half %a1, half %a2) {<br>
<br>
 define half @stack_fold_fnmsub321sh(half %a0, half %a1, half %a2) {<br>
   ;CHECK-LABEL: stack_fold_fnmsub321sh:<br>
-  ;CHECK:       vfnmsub231sh {{-?[0-9]*}}(%rsp), {{%xmm[0-9][0-9]*}}, {{%xmm[0-9][0-9]*}} {{.*#+}} 2-byte Folded Reload<br>
+  ;CHECK:       vfnmsub231sh {{-?[0-9]*}}(%rsp), {{%xmm[0-9][0-9]*}}, {{%xmm[0-9][0-9]*}} {{.*#+}} 4-byte Folded Reload<br>
   %1 = tail call <2 x i64> asm sideeffect "nop", "=x,~{xmm3},~{xmm4},~{xmm5},~{xmm6},~{xmm7},~{xmm8},~{xmm9},~{xmm10},~{xmm11},~{xmm12},~{xmm13},~{xmm14},~{xmm15},~{xmm16},~{xmm17},~{xmm18},~{xmm19},~{xmm20},~{xmm21},~{xmm22},~{xmm23},~{xmm24},~{xmm25},~{xmm26},~{xmm27},~{xmm28},~{xmm29},~{xmm30},~{xmm31},~{flags}"()<br>
   %2 = fneg half %a2<br>
   %3 = fneg half %a0<br>
@@ -1000,7 +1000,7 @@ define half @stack_fold_fnmsub321sh(half %a0, half %a1, half %a2) {<br>
<br>
 define half @stack_fold_fnmsub132sh(half %a0, half %a1, half %a2) {<br>
   ;CHECK-LABEL: stack_fold_fnmsub132sh:<br>
-  ;CHECK:       vfnmsub132sh {{-?[0-9]*}}(%rsp), {{%xmm[0-9][0-9]*}}, {{%xmm[0-9][0-9]*}} {{.*#+}} 2-byte Folded Reload<br>
+  ;CHECK:       vfnmsub132sh {{-?[0-9]*}}(%rsp), {{%xmm[0-9][0-9]*}}, {{%xmm[0-9][0-9]*}} {{.*#+}} 4-byte Folded Reload<br>
   %1 = tail call <2 x i64> asm sideeffect "nop", "=x,~{xmm3},~{xmm4},~{xmm5},~{xmm6},~{xmm7},~{xmm8},~{xmm9},~{xmm10},~{xmm11},~{xmm12},~{xmm13},~{xmm14},~{xmm15},~{xmm16},~{xmm17},~{xmm18},~{xmm19},~{xmm20},~{xmm21},~{xmm22},~{xmm23},~{xmm24},~{xmm25},~{xmm26},~{xmm27},~{xmm28},~{xmm29},~{xmm30},~{xmm31},~{flags}"()<br>
   %2 = fneg half %a0<br>
   %3 = fneg half %a1<br>
@@ -1010,7 +1010,7 @@ define half @stack_fold_fnmsub132sh(half %a0, half %a1, half %a2) {<br>
<br>
 define half @stack_fold_fnmsub312sh(half %a0, half %a1, half %a2) {<br>
   ;CHECK-LABEL: stack_fold_fnmsub312sh:<br>
-  ;CHECK:       vfnmsub132sh {{-?[0-9]*}}(%rsp), {{%xmm[0-9][0-9]*}}, {{%xmm[0-9][0-9]*}} {{.*#+}} 2-byte Folded Reload<br>
+  ;CHECK:       vfnmsub132sh {{-?[0-9]*}}(%rsp), {{%xmm[0-9][0-9]*}}, {{%xmm[0-9][0-9]*}} {{.*#+}} 4-byte Folded Reload<br>
   %1 = tail call <2 x i64> asm sideeffect "nop", "=x,~{xmm3},~{xmm4},~{xmm5},~{xmm6},~{xmm7},~{xmm8},~{xmm9},~{xmm10},~{xmm11},~{xmm12},~{xmm13},~{xmm14},~{xmm15},~{xmm16},~{xmm17},~{xmm18},~{xmm19},~{xmm20},~{xmm21},~{xmm22},~{xmm23},~{xmm24},~{xmm25},~{xmm26},~{xmm27},~{xmm28},~{xmm29},~{xmm30},~{xmm31},~{flags}"()<br>
   %2 = fneg half %a2<br>
   %3 = fneg half %a1<br>
<br>
diff  --git a/llvm/test/CodeGen/X86/stack-folding-fp-avx512fp16.ll b/llvm/test/CodeGen/X86/stack-folding-fp-avx512fp16.ll<br>
index 0be20ab6d5f41..f57a1caf3e4f7 100644<br>
--- a/llvm/test/CodeGen/X86/stack-folding-fp-avx512fp16.ll<br>
+++ b/llvm/test/CodeGen/X86/stack-folding-fp-avx512fp16.ll<br>
@@ -50,7 +50,7 @@ define <32 x half> @stack_fold_addph_zmm_kz(<32 x half> %a0, <32 x half> %a1, i3<br>
<br>
 define half @stack_fold_addsh(half %a0, half %a1) {<br>
   ;CHECK-LABEL: stack_fold_addsh<br>
-  ;CHECK:       vaddsh {{-?[0-9]*}}(%rsp), {{%xmm[0-9][0-9]*}}, {{%xmm[0-9][0-9]*}} {{.*#+}} 2-byte Folded Reload<br>
+  ;CHECK:       vaddsh {{-?[0-9]*}}(%rsp), {{%xmm[0-9][0-9]*}}, {{%xmm[0-9][0-9]*}} {{.*#+}} 4-byte Folded Reload<br>
   %1 = tail call <2 x i64> asm sideeffect "nop", "=x,~{xmm2},~{xmm3},~{xmm4},~{xmm5},~{xmm6},~{xmm7},~{xmm8},~{xmm9},~{xmm10},~{xmm11},~{xmm12},~{xmm13},~{xmm14},~{xmm15},~{xmm16},~{xmm17},~{xmm18},~{xmm19},~{xmm20},~{xmm21},~{xmm22},~{xmm23},~{xmm24},~{xmm25},~{xmm26},~{xmm27},~{xmm28},~{xmm29},~{xmm30},~{xmm31},~{flags}"()<br>
   %2 = fadd half %a0, %a1<br>
   ret half %2<br>
@@ -107,7 +107,7 @@ define <32 x half> @stack_fold_cmpph_mask_commuted(<32 x half> %a0, <32 x half><br>
<br>
 define half @stack_fold_divsh(half %a0, half %a1) {<br>
   ;CHECK-LABEL: stack_fold_divsh<br>
-  ;CHECK:       vdivsh {{-?[0-9]*}}(%rsp), {{%xmm[0-9][0-9]*}}, {{%xmm[0-9][0-9]*}} {{.*#+}} 2-byte Folded Reload<br>
+  ;CHECK:       vdivsh {{-?[0-9]*}}(%rsp), {{%xmm[0-9][0-9]*}}, {{%xmm[0-9][0-9]*}} {{.*#+}} 4-byte Folded Reload<br>
   %1 = tail call <2 x i64> asm sideeffect "nop", "=x,~{xmm2},~{xmm3},~{xmm4},~{xmm5},~{xmm6},~{xmm7},~{xmm8},~{xmm9},~{xmm10},~{xmm11},~{xmm12},~{xmm13},~{xmm14},~{xmm15},~{xmm16},~{xmm17},~{xmm18},~{xmm19},~{xmm20},~{xmm21},~{xmm22},~{xmm23},~{xmm24},~{xmm25},~{xmm26},~{xmm27},~{xmm28},~{xmm29},~{xmm30},~{xmm31},~{flags}"()<br>
   %2 = fdiv half %a0, %a1<br>
   ret half %2<br>
@@ -390,7 +390,7 @@ define <32 x half> @stack_fold_maxph_zmm_commutable_kz_commuted(<32 x half> %a0,<br>
<br>
 define half @stack_fold_maxsh(half %a0, half %a1) #0 {<br>
   ;CHECK-LABEL: stack_fold_maxsh:<br>
-  ;CHECK:       vmaxsh {{-?[0-9]*}}(%rsp), {{%xmm[0-9][0-9]*}}, {{%xmm[0-9][0-9]*}} {{.*#+}} 2-byte Folded Reload<br>
+  ;CHECK:       vmaxsh {{-?[0-9]*}}(%rsp), {{%xmm[0-9][0-9]*}}, {{%xmm[0-9][0-9]*}} {{.*#+}} 4-byte Folded Reload<br>
   %1 = tail call <2 x i64> asm sideeffect "nop", "=x,~{xmm2},~{xmm3},~{xmm4},~{xmm5},~{xmm6},~{xmm7},~{xmm8},~{xmm9},~{xmm10},~{xmm11},~{xmm12},~{xmm13},~{xmm14},~{xmm15},~{xmm16},~{xmm17},~{xmm18},~{xmm19},~{xmm20},~{xmm21},~{xmm22},~{xmm23},~{xmm24},~{xmm25},~{xmm26},~{xmm27},~{xmm28},~{xmm29},~{xmm30},~{xmm31},~{flags}"()<br>
   %2 = fcmp ogt half %a0, %a1<br>
   %3 = select i1 %2, half %a0, half %a1<br>
@@ -399,7 +399,7 @@ define half @stack_fold_maxsh(half %a0, half %a1) #0 {<br>
<br>
 define half @stack_fold_maxsh_commuted(half %a0, half %a1) #0 {<br>
   ;CHECK-LABEL: stack_fold_maxsh_commuted:<br>
-  ;CHECK-NOT:       vmaxsh {{-?[0-9]*}}(%rsp), {{%xmm[0-9][0-9]*}}, {{%xmm[0-9][0-9]*}} {{.*#+}} 2-byte Folded Reload<br>
+  ;CHECK-NOT:       vmaxsh {{-?[0-9]*}}(%rsp), {{%xmm[0-9][0-9]*}}, {{%xmm[0-9][0-9]*}} {{.*#+}} 4-byte Folded Reload<br>
   %1 = tail call <2 x i64> asm sideeffect "nop", "=x,~{xmm2},~{xmm3},~{xmm4},~{xmm5},~{xmm6},~{xmm7},~{xmm8},~{xmm9},~{xmm10},~{xmm11},~{xmm12},~{xmm13},~{xmm14},~{xmm15},~{xmm16},~{xmm17},~{xmm18},~{xmm19},~{xmm20},~{xmm21},~{xmm22},~{xmm23},~{xmm24},~{xmm25},~{xmm26},~{xmm27},~{xmm28},~{xmm29},~{xmm30},~{xmm31},~{flags}"()<br>
   %2 = fcmp ogt half %a1, %a0<br>
   %3 = select i1 %2, half %a1, half %a0<br>
@@ -408,7 +408,7 @@ define half @stack_fold_maxsh_commuted(half %a0, half %a1) #0 {<br>
<br>
 define half @stack_fold_maxsh_commutable(half %a0, half %a1) #1 {<br>
   ;CHECK-LABEL: stack_fold_maxsh_commutable:<br>
-  ;CHECK:       vmaxsh {{-?[0-9]*}}(%rsp), {{%xmm[0-9][0-9]*}}, {{%xmm[0-9][0-9]*}} {{.*#+}} 2-byte Folded Reload<br>
+  ;CHECK:       vmaxsh {{-?[0-9]*}}(%rsp), {{%xmm[0-9][0-9]*}}, {{%xmm[0-9][0-9]*}} {{.*#+}} 4-byte Folded Reload<br>
   %1 = tail call <2 x i64> asm sideeffect "nop", "=x,~{xmm2},~{xmm3},~{xmm4},~{xmm5},~{xmm6},~{xmm7},~{xmm8},~{xmm9},~{xmm10},~{xmm11},~{xmm12},~{xmm13},~{xmm14},~{xmm15},~{xmm16},~{xmm17},~{xmm18},~{xmm19},~{xmm20},~{xmm21},~{xmm22},~{xmm23},~{xmm24},~{xmm25},~{xmm26},~{xmm27},~{xmm28},~{xmm29},~{xmm30},~{xmm31},~{flags}"()<br>
   %2 = fcmp ogt half %a0, %a1<br>
   %3 = select i1 %2, half %a0, half %a1<br>
@@ -417,7 +417,7 @@ define half @stack_fold_maxsh_commutable(half %a0, half %a1) #1 {<br>
<br>
 define half @stack_fold_maxsh_commutable_commuted(half %a0, half %a1) #1 {<br>
   ;CHECK-LABEL: stack_fold_maxsh_commutable_commuted:<br>
-  ;CHECK:       vmaxsh {{-?[0-9]*}}(%rsp), {{%xmm[0-9][0-9]*}}, {{%xmm[0-9][0-9]*}} {{.*#+}} 2-byte Folded Reload<br>
+  ;CHECK:       vmaxsh {{-?[0-9]*}}(%rsp), {{%xmm[0-9][0-9]*}}, {{%xmm[0-9][0-9]*}} {{.*#+}} 4-byte Folded Reload<br>
   %1 = tail call <2 x i64> asm sideeffect "nop", "=x,~{xmm2},~{xmm3},~{xmm4},~{xmm5},~{xmm6},~{xmm7},~{xmm8},~{xmm9},~{xmm10},~{xmm11},~{xmm12},~{xmm13},~{xmm14},~{xmm15},~{xmm16},~{xmm17},~{xmm18},~{xmm19},~{xmm20},~{xmm21},~{xmm22},~{xmm23},~{xmm24},~{xmm25},~{xmm26},~{xmm27},~{xmm28},~{xmm29},~{xmm30},~{xmm31},~{flags}"()<br>
   %2 = fcmp ogt half %a1, %a0<br>
   %3 = select i1 %2, half %a1, half %a0<br>
@@ -569,7 +569,7 @@ define <32 x half> @stack_fold_minph_zmm_commutable_kz_commuted(<32 x half> %a0,<br>
<br>
 define half @stack_fold_minsh(half %a0, half %a1) #0 {<br>
   ;CHECK-LABEL: stack_fold_minsh:<br>
-  ;CHECK:       vminsh {{-?[0-9]*}}(%rsp), {{%xmm[0-9][0-9]*}}, {{%xmm[0-9][0-9]*}} {{.*#+}} 2-byte Folded Reload<br>
+  ;CHECK:       vminsh {{-?[0-9]*}}(%rsp), {{%xmm[0-9][0-9]*}}, {{%xmm[0-9][0-9]*}} {{.*#+}} 4-byte Folded Reload<br>
   %1 = tail call <2 x i64> asm sideeffect "nop", "=x,~{xmm2},~{xmm3},~{xmm4},~{xmm5},~{xmm6},~{xmm7},~{xmm8},~{xmm9},~{xmm10},~{xmm11},~{xmm12},~{xmm13},~{xmm14},~{xmm15},~{xmm16},~{xmm17},~{xmm18},~{xmm19},~{xmm20},~{xmm21},~{xmm22},~{xmm23},~{xmm24},~{xmm25},~{xmm26},~{xmm27},~{xmm28},~{xmm29},~{xmm30},~{xmm31},~{flags}"()<br>
   %2 = fcmp olt half %a0, %a1<br>
   %3 = select i1 %2, half %a0, half %a1<br>
@@ -578,7 +578,7 @@ define half @stack_fold_minsh(half %a0, half %a1) #0 {<br>
<br>
 define half @stack_fold_minsh_commuted(half %a0, half %a1) #0 {<br>
   ;CHECK-LABEL: stack_fold_minsh_commuted:<br>
-  ;CHECK-NOT:       vminsh {{-?[0-9]*}}(%rsp), {{%xmm[0-9][0-9]*}}, {{%xmm[0-9][0-9]*}} {{.*#+}} 2-byte Folded Reload<br>
+  ;CHECK-NOT:       vminsh {{-?[0-9]*}}(%rsp), {{%xmm[0-9][0-9]*}}, {{%xmm[0-9][0-9]*}} {{.*#+}} 4-byte Folded Reload<br>
   %1 = tail call <2 x i64> asm sideeffect "nop", "=x,~{xmm2},~{xmm3},~{xmm4},~{xmm5},~{xmm6},~{xmm7},~{xmm8},~{xmm9},~{xmm10},~{xmm11},~{xmm12},~{xmm13},~{xmm14},~{xmm15},~{xmm16},~{xmm17},~{xmm18},~{xmm19},~{xmm20},~{xmm21},~{xmm22},~{xmm23},~{xmm24},~{xmm25},~{xmm26},~{xmm27},~{xmm28},~{xmm29},~{xmm30},~{xmm31},~{flags}"()<br>
   %2 = fcmp olt half %a1, %a0<br>
   %3 = select i1 %2, half %a1, half %a0<br>
@@ -587,7 +587,7 @@ define half @stack_fold_minsh_commuted(half %a0, half %a1) #0 {<br>
<br>
 define half @stack_fold_minsh_commutable(half %a0, half %a1) #1 {<br>
   ;CHECK-LABEL: stack_fold_minsh_commutable:<br>
-  ;CHECK:       vminsh {{-?[0-9]*}}(%rsp), {{%xmm[0-9][0-9]*}}, {{%xmm[0-9][0-9]*}} {{.*#+}} 2-byte Folded Reload<br>
+  ;CHECK:       vminsh {{-?[0-9]*}}(%rsp), {{%xmm[0-9][0-9]*}}, {{%xmm[0-9][0-9]*}} {{.*#+}} 4-byte Folded Reload<br>
   %1 = tail call <2 x i64> asm sideeffect "nop", "=x,~{xmm2},~{xmm3},~{xmm4},~{xmm5},~{xmm6},~{xmm7},~{xmm8},~{xmm9},~{xmm10},~{xmm11},~{xmm12},~{xmm13},~{xmm14},~{xmm15},~{xmm16},~{xmm17},~{xmm18},~{xmm19},~{xmm20},~{xmm21},~{xmm22},~{xmm23},~{xmm24},~{xmm25},~{xmm26},~{xmm27},~{xmm28},~{xmm29},~{xmm30},~{xmm31},~{flags}"()<br>
   %2 = fcmp olt half %a0, %a1<br>
   %3 = select i1 %2, half %a0, half %a1<br>
@@ -596,7 +596,7 @@ define half @stack_fold_minsh_commutable(half %a0, half %a1) #1 {<br>
<br>
 define half @stack_fold_minsh_commutable_commuted(half %a0, half %a1) #1 {<br>
   ;CHECK-LABEL: stack_fold_minsh_commutable_commuted:<br>
-  ;CHECK:       vminsh {{-?[0-9]*}}(%rsp), {{%xmm[0-9][0-9]*}}, {{%xmm[0-9][0-9]*}} {{.*#+}} 2-byte Folded Reload<br>
+  ;CHECK:       vminsh {{-?[0-9]*}}(%rsp), {{%xmm[0-9][0-9]*}}, {{%xmm[0-9][0-9]*}} {{.*#+}} 4-byte Folded Reload<br>
   %1 = tail call <2 x i64> asm sideeffect "nop", "=x,~{xmm2},~{xmm3},~{xmm4},~{xmm5},~{xmm6},~{xmm7},~{xmm8},~{xmm9},~{xmm10},~{xmm11},~{xmm12},~{xmm13},~{xmm14},~{xmm15},~{xmm16},~{xmm17},~{xmm18},~{xmm19},~{xmm20},~{xmm21},~{xmm22},~{xmm23},~{xmm24},~{xmm25},~{xmm26},~{xmm27},~{xmm28},~{xmm29},~{xmm30},~{xmm31},~{flags}"()<br>
   %2 = fcmp olt half %a1, %a0<br>
   %3 = select i1 %2, half %a1, half %a0<br>
@@ -671,7 +671,7 @@ define <32 x half> @stack_fold_mulph_zmm_kz(<32 x half> %a0, <32 x half> %a1, i3<br>
<br>
 define half @stack_fold_mulsh(half %a0, half %a1) {<br>
   ;CHECK-LABEL: stack_fold_mulsh<br>
-  ;CHECK-NOT:       vmulss {{-?[0-9]*}}(%rsp), {{%xmm[0-9][0-9]*}}, {{%xmm[0-9][0-9]*}} {{.*#+}} 2-byte Folded Reload<br>
+  ;CHECK-NOT:       vmulss {{-?[0-9]*}}(%rsp), {{%xmm[0-9][0-9]*}}, {{%xmm[0-9][0-9]*}} {{.*#+}} 4-byte Folded Reload<br>
   %1 = tail call <2 x i64> asm sideeffect "nop", "=x,~{xmm2},~{xmm3},~{xmm4},~{xmm5},~{xmm6},~{xmm7},~{xmm8},~{xmm9},~{xmm10},~{xmm11},~{xmm12},~{xmm13},~{xmm14},~{xmm15},~{xmm16},~{xmm17},~{xmm18},~{xmm19},~{xmm20},~{xmm21},~{xmm22},~{xmm23},~{xmm24},~{xmm25},~{xmm26},~{xmm27},~{xmm28},~{xmm29},~{xmm30},~{xmm31},~{flags}"()<br>
   %2 = fmul half %a0, %a1<br>
   ret half %2<br>
@@ -972,7 +972,7 @@ define <32 x half> @stack_fold_subph_zmm(<32 x half> %a0, <32 x half> %a1) {<br>
<br>
 define half @stack_fold_subsh(half %a0, half %a1) {<br>
   ;CHECK-LABEL: stack_fold_subsh<br>
-  ;CHECK:       vsubsh {{-?[0-9]*}}(%rsp), {{%xmm[0-9][0-9]*}}, {{%xmm[0-9][0-9]*}} {{.*#+}} 2-byte Folded Reload<br>
+  ;CHECK:       vsubsh {{-?[0-9]*}}(%rsp), {{%xmm[0-9][0-9]*}}, {{%xmm[0-9][0-9]*}} {{.*#+}} 4-byte Folded Reload<br>
   %1 = tail call <2 x i64> asm sideeffect "nop", "=x,~{xmm2},~{xmm3},~{xmm4},~{xmm5},~{xmm6},~{xmm7},~{xmm8},~{xmm9},~{xmm10},~{xmm11},~{xmm12},~{xmm13},~{xmm14},~{xmm15},~{xmm16},~{xmm17},~{xmm18},~{xmm19},~{xmm20},~{xmm21},~{xmm22},~{xmm23},~{xmm24},~{xmm25},~{xmm26},~{xmm27},~{xmm28},~{xmm29},~{xmm30},~{xmm31},~{flags}"()<br>
   %2 = fsub half %a0, %a1<br>
   ret half %2<br>
<br>
diff  --git a/llvm/test/CodeGen/X86/statepoint-invoke-ra-enter-at-end.mir b/llvm/test/CodeGen/X86/statepoint-invoke-ra-enter-at-end.mir<br>
index e55b618bc9965..a7829ab938eec 100644<br>
--- a/llvm/test/CodeGen/X86/statepoint-invoke-ra-enter-at-end.mir<br>
+++ b/llvm/test/CodeGen/X86/statepoint-invoke-ra-enter-at-end.mir<br>
@@ -340,7 +340,7 @@ body:             |<br>
   ; CHECK:   CMP64rr [[NOT64r2]], [[COPY6]], implicit-def $eflags<br>
   ; CHECK:   undef %102.sub_32bit:gr64_with_sub_8bit = MOV32ri 0<br>
   ; CHECK:   [[CMOV64rr:%[0-9]+]]:gr64 = CMOV64rr [[CMOV64rr]], %102, 4, implicit killed $eflags<br>
-  ; CHECK:   INLINEASM &"lock btsq $0,($1)", 1 /* sideeffect attdialect */, 4390921 /* reguse:GR64 */, %102, 4390921 /* reguse:GR64 */, undef %56:gr64, 12 /* clobber */, implicit-def dead early-clobber $df, 12 /* clobber */, implicit-def early-clobber $fpsw,
 12 /* clobber */, implicit-def dead early-clobber $eflags<br>
+  ; CHECK:   INLINEASM &"lock btsq $0,($1)", 1 /* sideeffect attdialect */, 4456457 /* reguse:GR64 */, %102, 4456457 /* reguse:GR64 */, undef %56:gr64, 12 /* clobber */, implicit-def dead early-clobber $df, 12 /* clobber */, implicit-def early-clobber $fpsw,
 12 /* clobber */, implicit-def dead early-clobber $eflags<br>
   ; CHECK:   LCMPXCHG32 undef %67:gr64, 1, $noreg, 0, $noreg, [[COPY5]], implicit-def dead $eax, implicit-def dead $eflags, implicit undef $eax :: (load store acquire monotonic (s32) on `i32 addrspace(1)* undef`, addrspace 1)<br>
   ; CHECK:   ADJCALLSTACKDOWN64 0, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp<br>
   ; CHECK:   $rdi = COPY [[COPY4]]<br>
@@ -456,7 +456,7 @@ body:             |<br>
     %63:gr64 = NOT64r %63<br>
     CMP64rr %63, %31, implicit-def $eflags<br>
     %63:gr64 = CMOV64rr %63, %53, 4, implicit killed $eflags<br>
-    INLINEASM &"lock btsq $0,($1)", 1 /* sideeffect attdialect */, 4390921 /* reguse:GR64 */, %53, 4390921 /* reguse:GR64 */, undef %56:gr64, 12 /* clobber */, implicit-def dead early-clobber $df, 12 /* clobber */, implicit-def early-clobber $fpsw, 12 /* clobber
 */, implicit-def dead early-clobber $eflags<br>
+    INLINEASM &"lock btsq $0,($1)", 1 /* sideeffect attdialect */, 4456457 /* reguse:GR64 */, %53, 4456457 /* reguse:GR64 */, undef %56:gr64, 12 /* clobber */, implicit-def dead early-clobber $df, 12 /* clobber */, implicit-def early-clobber $fpsw, 12 /* clobber
 */, implicit-def dead early-clobber $eflags<br>
     LCMPXCHG32 undef %67:gr64, 1, $noreg, 0, $noreg, %65, implicit-def dead $eax, implicit-def dead $eflags, implicit undef $eax :: (load store acquire monotonic (s32) on `i32 addrspace(1)* undef`, addrspace 1)<br>
     ADJCALLSTACKDOWN64 0, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp<br>
     $rdi = COPY %64<br>
<br>
diff  --git a/llvm/test/CodeGen/X86/vec_fp_to_int.ll b/llvm/test/CodeGen/X86/vec_fp_to_int.ll<br>
index 25b702db977aa..db8d04704df4f 100644<br>
--- a/llvm/test/CodeGen/X86/vec_fp_to_int.ll<br>
+++ b/llvm/test/CodeGen/X86/vec_fp_to_int.ll<br>
@@ -2101,58 +2101,56 @@ define <8 x i32> @fptoui_8f32_to_8i32_const(<8 x float> %a) {<br>
 define <4 x i32> @fptosi_2f16_to_4i32(<2 x half> %a) nounwind {<br>
 ; SSE-LABEL: fptosi_2f16_to_4i32:<br>
 ; SSE:       # %bb.0:<br>
-; SSE-NEXT:    pushq %rbp<br>
 ; SSE-NEXT:    pushq %rbx<br>
-; SSE-NEXT:    pushq %rax<br>
-; SSE-NEXT:    movl %esi, %ebx<br>
-; SSE-NEXT:    movzwl %di, %edi<br>
-; SSE-NEXT:    callq __gnu_h2f_ieee@PLT<br>
-; SSE-NEXT:    cvttss2si %xmm0, %ebp<br>
-; SSE-NEXT:    movzwl %bx, %edi<br>
-; SSE-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; SSE-NEXT:    subq $16, %rsp<br>
+; SSE-NEXT:    movss %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; SSE-NEXT:    callq __extendhfsf2@PLT<br>
+; SSE-NEXT:    cvttss2si %xmm0, %ebx<br>
+; SSE-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; SSE-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; SSE-NEXT:    callq __extendhfsf2@PLT<br>
 ; SSE-NEXT:    cvttss2si %xmm0, %eax<br>
 ; SSE-NEXT:    movd %eax, %xmm0<br>
-; SSE-NEXT:    movd %ebp, %xmm1<br>
+; SSE-NEXT:    movd %ebx, %xmm1<br>
 ; SSE-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]<br>
 ; SSE-NEXT:    movq {{.*#+}} xmm0 = xmm1[0],zero<br>
-; SSE-NEXT:    addq $8, %rsp<br>
+; SSE-NEXT:    addq $16, %rsp<br>
 ; SSE-NEXT:    popq %rbx<br>
-; SSE-NEXT:    popq %rbp<br>
 ; SSE-NEXT:    retq<br>
 ;<br>
 ; VEX-LABEL: fptosi_2f16_to_4i32:<br>
 ; VEX:       # %bb.0:<br>
-; VEX-NEXT:    pushq %rbp<br>
 ; VEX-NEXT:    pushq %rbx<br>
-; VEX-NEXT:    pushq %rax<br>
-; VEX-NEXT:    movl %esi, %ebx<br>
-; VEX-NEXT:    movzwl %di, %edi<br>
-; VEX-NEXT:    callq __gnu_h2f_ieee@PLT<br>
-; VEX-NEXT:    vcvttss2si %xmm0, %ebp<br>
-; VEX-NEXT:    movzwl %bx, %edi<br>
-; VEX-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; VEX-NEXT:    subq $16, %rsp<br>
+; VEX-NEXT:    vmovss %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
+; VEX-NEXT:    callq __extendhfsf2@PLT<br>
+; VEX-NEXT:    vcvttss2si %xmm0, %ebx<br>
+; VEX-NEXT:    vmovss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload<br>
+; VEX-NEXT:    # xmm0 = mem[0],zero,zero,zero<br>
+; VEX-NEXT:    callq __extendhfsf2@PLT<br>
 ; VEX-NEXT:    vcvttss2si %xmm0, %eax<br>
 ; VEX-NEXT:    vmovd %eax, %xmm0<br>
-; VEX-NEXT:    vmovd %ebp, %xmm1<br>
+; VEX-NEXT:    vmovd %ebx, %xmm1<br>
 ; VEX-NEXT:    vpunpckldq {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]<br>
 ; VEX-NEXT:    vmovq {{.*#+}} xmm0 = xmm0[0],zero<br>
-; VEX-NEXT:    addq $8, %rsp<br>
+; VEX-NEXT:    addq $16, %rsp<br>
 ; VEX-NEXT:    popq %rbx<br>
-; VEX-NEXT:    popq %rbp<br>
 ; VEX-NEXT:    retq<br>
 ;<br>
 ; AVX512-LABEL: fptosi_2f16_to_4i32:<br>
 ; AVX512:       # %bb.0:<br>
-; AVX512-NEXT:    movzwl %di, %eax<br>
-; AVX512-NEXT:    vmovd %eax, %xmm0<br>
-; AVX512-NEXT:    vcvtph2ps %xmm0, %xmm0<br>
-; AVX512-NEXT:    vcvttss2si %xmm0, %eax<br>
-; AVX512-NEXT:    movzwl %si, %ecx<br>
+; AVX512-NEXT:    vpextrw $0, %xmm1, %eax<br>
+; AVX512-NEXT:    vpextrw $0, %xmm0, %ecx<br>
+; AVX512-NEXT:    movzwl %cx, %ecx<br>
 ; AVX512-NEXT:    vmovd %ecx, %xmm0<br>
 ; AVX512-NEXT:    vcvtph2ps %xmm0, %xmm0<br>
 ; AVX512-NEXT:    vcvttss2si %xmm0, %ecx<br>
-; AVX512-NEXT:    vmovd %ecx, %xmm0<br>
-; AVX512-NEXT:    vmovd %eax, %xmm1<br>
+; AVX512-NEXT:    movzwl %ax, %eax<br>
+; AVX512-NEXT:    vmovd %eax, %xmm0<br>
+; AVX512-NEXT:    vcvtph2ps %xmm0, %xmm0<br>
+; AVX512-NEXT:    vcvttss2si %xmm0, %eax<br>
+; AVX512-NEXT:    vmovd %eax, %xmm0<br>
+; AVX512-NEXT:    vmovd %ecx, %xmm1<br>
 ; AVX512-NEXT:    vpunpckldq {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]<br>
 ; AVX512-NEXT:    vmovq {{.*#+}} xmm0 = xmm0[0],zero<br>
 ; AVX512-NEXT:    retq<br>
<br>
diff  --git a/llvm/test/CodeGen/X86/vector-half-conversions.ll b/llvm/test/CodeGen/X86/vector-half-conversions.ll<br>
index c3b6edf00772a..3c25b31131372 100644<br>
--- a/llvm/test/CodeGen/X86/vector-half-conversions.ll<br>
+++ b/llvm/test/CodeGen/X86/vector-half-conversions.ll<br>
@@ -557,7 +557,8 @@ define void @store_cvt_f32_to_i16(float %a0, i16* %a1) nounwind {<br>
 ; ALL-LABEL: store_cvt_f32_to_i16:<br>
 ; ALL:       # %bb.0:<br>
 ; ALL-NEXT:    vcvtps2ph $4, %xmm0, %xmm0<br>
-; ALL-NEXT:    vpextrw $0, %xmm0, (%rdi)<br>
+; ALL-NEXT:    vmovd %xmm0, %eax<br>
+; ALL-NEXT:    movw %ax, (%rdi)<br>
 ; ALL-NEXT:    retq<br>
   %1 = fptrunc float %a0 to half<br>
   %2 = bitcast half %1 to i16<br>
@@ -647,7 +648,11 @@ define void @store_cvt_16f32_to_16i16(<16 x float> %a0, <16 x i16>* %a1) nounwin<br>
 define i16 @cvt_f64_to_i16(double %a0) nounwind {<br>
 ; ALL-LABEL: cvt_f64_to_i16:<br>
 ; ALL:       # %bb.0:<br>
-; ALL-NEXT:    jmp __truncdfhf2@PLT # TAILCALL<br>
+; ALL-NEXT:    vcvtsd2ss %xmm0, %xmm0, %xmm0<br>
+; ALL-NEXT:    vcvtps2ph $4, %xmm0, %xmm0<br>
+; ALL-NEXT:    vmovd %xmm0, %eax<br>
+; ALL-NEXT:    # kill: def $ax killed $ax killed $eax<br>
+; ALL-NEXT:    retq<br>
   %1 = fptrunc double %a0 to half<br>
   %2 = bitcast half %1 to i16<br>
   ret i16 %2<br>
@@ -656,16 +661,16 @@ define i16 @cvt_f64_to_i16(double %a0) nounwind {<br>
 define <2 x i16> @cvt_2f64_to_2i16(<2 x double> %a0) nounwind {<br>
 ; ALL-LABEL: cvt_2f64_to_2i16:<br>
 ; ALL:       # %bb.0:<br>
-; ALL-NEXT:    subq $40, %rsp<br>
-; ALL-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
-; ALL-NEXT:    callq __truncdfhf2@PLT<br>
-; ALL-NEXT:    movw %ax, (%rsp)<br>
-; ALL-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload<br>
-; ALL-NEXT:    # xmm0 = mem[1,0]<br>
-; ALL-NEXT:    callq __truncdfhf2@PLT<br>
-; ALL-NEXT:    movw %ax, {{[0-9]+}}(%rsp)<br>
-; ALL-NEXT:    vmovaps (%rsp), %xmm0<br>
-; ALL-NEXT:    addq $40, %rsp<br>
+; ALL-NEXT:    vcvtsd2ss %xmm0, %xmm0, %xmm1<br>
+; ALL-NEXT:    vcvtps2ph $4, %xmm1, %xmm1<br>
+; ALL-NEXT:    vmovd %xmm1, %eax<br>
+; ALL-NEXT:    movw %ax, -{{[0-9]+}}(%rsp)<br>
+; ALL-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]<br>
+; ALL-NEXT:    vcvtsd2ss %xmm0, %xmm0, %xmm0<br>
+; ALL-NEXT:    vcvtps2ph $4, %xmm0, %xmm0<br>
+; ALL-NEXT:    vmovd %xmm0, %eax<br>
+; ALL-NEXT:    movw %ax, -{{[0-9]+}}(%rsp)<br>
+; ALL-NEXT:    vmovaps -{{[0-9]+}}(%rsp), %xmm0<br>
 ; ALL-NEXT:    retq<br>
   %1 = fptrunc <2 x double> %a0 to <2 x half><br>
   %2 = bitcast <2 x half> %1 to <2 x i16><br>
@@ -675,28 +680,27 @@ define <2 x i16> @cvt_2f64_to_2i16(<2 x double> %a0) nounwind {<br>
 define <4 x i16> @cvt_4f64_to_4i16(<4 x double> %a0) nounwind {<br>
 ; ALL-LABEL: cvt_4f64_to_4i16:<br>
 ; ALL:       # %bb.0:<br>
-; ALL-NEXT:    subq $72, %rsp<br>
-; ALL-NEXT:    vmovups %ymm0, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill<br>
-; ALL-NEXT:    vextractf128 $1, %ymm0, %xmm0<br>
-; ALL-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
-; ALL-NEXT:    vzeroupper<br>
-; ALL-NEXT:    callq __truncdfhf2@PLT<br>
-; ALL-NEXT:    movw %ax, {{[0-9]+}}(%rsp)<br>
-; ALL-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload<br>
-; ALL-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0<br>
+; ALL-NEXT:    vextractf128 $1, %ymm0, %xmm1<br>
+; ALL-NEXT:    vcvtsd2ss %xmm1, %xmm1, %xmm2<br>
+; ALL-NEXT:    vcvtps2ph $4, %xmm2, %xmm2<br>
+; ALL-NEXT:    vmovd %xmm2, %eax<br>
+; ALL-NEXT:    movw %ax, -{{[0-9]+}}(%rsp)<br>
+; ALL-NEXT:    vcvtsd2ss %xmm0, %xmm0, %xmm2<br>
+; ALL-NEXT:    vcvtps2ph $4, %xmm2, %xmm2<br>
+; ALL-NEXT:    vmovd %xmm2, %eax<br>
+; ALL-NEXT:    movw %ax, -{{[0-9]+}}(%rsp)<br>
+; ALL-NEXT:    vpermilpd {{.*#+}} xmm1 = xmm1[1,0]<br>
+; ALL-NEXT:    vcvtsd2ss %xmm1, %xmm1, %xmm1<br>
+; ALL-NEXT:    vcvtps2ph $4, %xmm1, %xmm1<br>
+; ALL-NEXT:    vmovd %xmm1, %eax<br>
+; ALL-NEXT:    movw %ax, -{{[0-9]+}}(%rsp)<br>
+; ALL-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]<br>
+; ALL-NEXT:    vcvtsd2ss %xmm0, %xmm0, %xmm0<br>
+; ALL-NEXT:    vcvtps2ph $4, %xmm0, %xmm0<br>
+; ALL-NEXT:    vmovd %xmm0, %eax<br>
+; ALL-NEXT:    movw %ax, -{{[0-9]+}}(%rsp)<br>
+; ALL-NEXT:    vmovaps -{{[0-9]+}}(%rsp), %xmm0<br>
 ; ALL-NEXT:    vzeroupper<br>
-; ALL-NEXT:    callq __truncdfhf2@PLT<br>
-; ALL-NEXT:    movw %ax, (%rsp)<br>
-; ALL-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload<br>
-; ALL-NEXT:    # xmm0 = mem[1,0]<br>
-; ALL-NEXT:    callq __truncdfhf2@PLT<br>
-; ALL-NEXT:    movw %ax, {{[0-9]+}}(%rsp)<br>
-; ALL-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload<br>
-; ALL-NEXT:    # xmm0 = mem[1,0]<br>
-; ALL-NEXT:    callq __truncdfhf2@PLT<br>
-; ALL-NEXT:    movw %ax, {{[0-9]+}}(%rsp)<br>
-; ALL-NEXT:    vmovaps (%rsp), %xmm0<br>
-; ALL-NEXT:    addq $72, %rsp<br>
 ; ALL-NEXT:    retq<br>
   %1 = fptrunc <4 x double> %a0 to <4 x half><br>
   %2 = bitcast <4 x half> %1 to <4 x i16><br>
@@ -706,28 +710,27 @@ define <4 x i16> @cvt_4f64_to_4i16(<4 x double> %a0) nounwind {<br>
 define <8 x i16> @cvt_4f64_to_8i16_undef(<4 x double> %a0) nounwind {<br>
 ; ALL-LABEL: cvt_4f64_to_8i16_undef:<br>
 ; ALL:       # %bb.0:<br>
-; ALL-NEXT:    subq $72, %rsp<br>
-; ALL-NEXT:    vmovups %ymm0, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill<br>
-; ALL-NEXT:    vextractf128 $1, %ymm0, %xmm0<br>
-; ALL-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
-; ALL-NEXT:    vzeroupper<br>
-; ALL-NEXT:    callq __truncdfhf2@PLT<br>
-; ALL-NEXT:    movw %ax, {{[0-9]+}}(%rsp)<br>
-; ALL-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload<br>
-; ALL-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0<br>
+; ALL-NEXT:    vextractf128 $1, %ymm0, %xmm1<br>
+; ALL-NEXT:    vcvtsd2ss %xmm1, %xmm1, %xmm2<br>
+; ALL-NEXT:    vcvtps2ph $4, %xmm2, %xmm2<br>
+; ALL-NEXT:    vmovd %xmm2, %eax<br>
+; ALL-NEXT:    movw %ax, -{{[0-9]+}}(%rsp)<br>
+; ALL-NEXT:    vcvtsd2ss %xmm0, %xmm0, %xmm2<br>
+; ALL-NEXT:    vcvtps2ph $4, %xmm2, %xmm2<br>
+; ALL-NEXT:    vmovd %xmm2, %eax<br>
+; ALL-NEXT:    movw %ax, -{{[0-9]+}}(%rsp)<br>
+; ALL-NEXT:    vpermilpd {{.*#+}} xmm1 = xmm1[1,0]<br>
+; ALL-NEXT:    vcvtsd2ss %xmm1, %xmm1, %xmm1<br>
+; ALL-NEXT:    vcvtps2ph $4, %xmm1, %xmm1<br>
+; ALL-NEXT:    vmovd %xmm1, %eax<br>
+; ALL-NEXT:    movw %ax, -{{[0-9]+}}(%rsp)<br>
+; ALL-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]<br>
+; ALL-NEXT:    vcvtsd2ss %xmm0, %xmm0, %xmm0<br>
+; ALL-NEXT:    vcvtps2ph $4, %xmm0, %xmm0<br>
+; ALL-NEXT:    vmovd %xmm0, %eax<br>
+; ALL-NEXT:    movw %ax, -{{[0-9]+}}(%rsp)<br>
+; ALL-NEXT:    vmovaps -{{[0-9]+}}(%rsp), %xmm0<br>
 ; ALL-NEXT:    vzeroupper<br>
-; ALL-NEXT:    callq __truncdfhf2@PLT<br>
-; ALL-NEXT:    movw %ax, (%rsp)<br>
-; ALL-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload<br>
-; ALL-NEXT:    # xmm0 = mem[1,0]<br>
-; ALL-NEXT:    callq __truncdfhf2@PLT<br>
-; ALL-NEXT:    movw %ax, {{[0-9]+}}(%rsp)<br>
-; ALL-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload<br>
-; ALL-NEXT:    # xmm0 = mem[1,0]<br>
-; ALL-NEXT:    callq __truncdfhf2@PLT<br>
-; ALL-NEXT:    movw %ax, {{[0-9]+}}(%rsp)<br>
-; ALL-NEXT:    vmovaps (%rsp), %xmm0<br>
-; ALL-NEXT:    addq $72, %rsp<br>
 ; ALL-NEXT:    retq<br>
   %1 = fptrunc <4 x double> %a0 to <4 x half><br>
   %2 = bitcast <4 x half> %1 to <4 x i16><br>
@@ -738,28 +741,27 @@ define <8 x i16> @cvt_4f64_to_8i16_undef(<4 x double> %a0) nounwind {<br>
 define <8 x i16> @cvt_4f64_to_8i16_zero(<4 x double> %a0) nounwind {<br>
 ; ALL-LABEL: cvt_4f64_to_8i16_zero:<br>
 ; ALL:       # %bb.0:<br>
-; ALL-NEXT:    subq $72, %rsp<br>
-; ALL-NEXT:    vmovups %ymm0, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill<br>
-; ALL-NEXT:    vextractf128 $1, %ymm0, %xmm0<br>
-; ALL-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
-; ALL-NEXT:    vzeroupper<br>
-; ALL-NEXT:    callq __truncdfhf2@PLT<br>
-; ALL-NEXT:    movw %ax, {{[0-9]+}}(%rsp)<br>
-; ALL-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload<br>
-; ALL-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0<br>
-; ALL-NEXT:    vzeroupper<br>
-; ALL-NEXT:    callq __truncdfhf2@PLT<br>
-; ALL-NEXT:    movw %ax, (%rsp)<br>
-; ALL-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload<br>
-; ALL-NEXT:    # xmm0 = mem[1,0]<br>
-; ALL-NEXT:    callq __truncdfhf2@PLT<br>
-; ALL-NEXT:    movw %ax, {{[0-9]+}}(%rsp)<br>
-; ALL-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload<br>
-; ALL-NEXT:    # xmm0 = mem[1,0]<br>
-; ALL-NEXT:    callq __truncdfhf2@PLT<br>
-; ALL-NEXT:    movw %ax, {{[0-9]+}}(%rsp)<br>
+; ALL-NEXT:    vextractf128 $1, %ymm0, %xmm1<br>
+; ALL-NEXT:    vcvtsd2ss %xmm1, %xmm1, %xmm2<br>
+; ALL-NEXT:    vcvtps2ph $4, %xmm2, %xmm2<br>
+; ALL-NEXT:    vmovd %xmm2, %eax<br>
+; ALL-NEXT:    movw %ax, -{{[0-9]+}}(%rsp)<br>
+; ALL-NEXT:    vcvtsd2ss %xmm0, %xmm0, %xmm2<br>
+; ALL-NEXT:    vcvtps2ph $4, %xmm2, %xmm2<br>
+; ALL-NEXT:    vmovd %xmm2, %eax<br>
+; ALL-NEXT:    movw %ax, -{{[0-9]+}}(%rsp)<br>
+; ALL-NEXT:    vpermilpd {{.*#+}} xmm1 = xmm1[1,0]<br>
+; ALL-NEXT:    vcvtsd2ss %xmm1, %xmm1, %xmm1<br>
+; ALL-NEXT:    vcvtps2ph $4, %xmm1, %xmm1<br>
+; ALL-NEXT:    vmovd %xmm1, %eax<br>
+; ALL-NEXT:    movw %ax, -{{[0-9]+}}(%rsp)<br>
+; ALL-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]<br>
+; ALL-NEXT:    vcvtsd2ss %xmm0, %xmm0, %xmm0<br>
+; ALL-NEXT:    vcvtps2ph $4, %xmm0, %xmm0<br>
+; ALL-NEXT:    vmovd %xmm0, %eax<br>
+; ALL-NEXT:    movw %ax, -{{[0-9]+}}(%rsp)<br>
 ; ALL-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero<br>
-; ALL-NEXT:    addq $72, %rsp<br>
+; ALL-NEXT:    vzeroupper<br>
 ; ALL-NEXT:    retq<br>
   %1 = fptrunc <4 x double> %a0 to <4 x half><br>
   %2 = bitcast <4 x half> %1 to <4 x i16><br>
@@ -770,205 +772,165 @@ define <8 x i16> @cvt_4f64_to_8i16_zero(<4 x double> %a0) nounwind {<br>
 define <8 x i16> @cvt_8f64_to_8i16(<8 x double> %a0) nounwind {<br>
 ; AVX1-LABEL: cvt_8f64_to_8i16:<br>
 ; AVX1:       # %bb.0:<br>
-; AVX1-NEXT:    pushq %r15<br>
-; AVX1-NEXT:    pushq %r14<br>
-; AVX1-NEXT:    pushq %rbx<br>
-; AVX1-NEXT:    subq $64, %rsp<br>
-; AVX1-NEXT:    vmovups %ymm1, (%rsp) # 32-byte Spill<br>
-; AVX1-NEXT:    vmovupd %ymm0, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill<br>
-; AVX1-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]<br>
-; AVX1-NEXT:    vzeroupper<br>
-; AVX1-NEXT:    callq __truncdfhf2@PLT<br>
-; AVX1-NEXT:    movl %eax, %ebx<br>
-; AVX1-NEXT:    shll $16, %ebx<br>
-; AVX1-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload<br>
-; AVX1-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0<br>
-; AVX1-NEXT:    vzeroupper<br>
-; AVX1-NEXT:    callq __truncdfhf2@PLT<br>
-; AVX1-NEXT:    movzwl %ax, %r15d<br>
-; AVX1-NEXT:    orl %ebx, %r15d<br>
-; AVX1-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload<br>
+; AVX1-NEXT:    vpermilpd {{.*#+}} xmm2 = xmm0[1,0]<br>
+; AVX1-NEXT:    vcvtsd2ss %xmm2, %xmm2, %xmm2<br>
+; AVX1-NEXT:    vcvtps2ph $4, %xmm2, %xmm2<br>
+; AVX1-NEXT:    vmovd %xmm2, %eax<br>
+; AVX1-NEXT:    shll $16, %eax<br>
+; AVX1-NEXT:    vcvtsd2ss %xmm0, %xmm0, %xmm2<br>
+; AVX1-NEXT:    vcvtps2ph $4, %xmm2, %xmm2<br>
+; AVX1-NEXT:    vmovd %xmm2, %ecx<br>
+; AVX1-NEXT:    movzwl %cx, %ecx<br>
+; AVX1-NEXT:    orl %eax, %ecx<br>
 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0<br>
-; AVX1-NEXT:    vmovapd %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
-; AVX1-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]<br>
-; AVX1-NEXT:    vzeroupper<br>
-; AVX1-NEXT:    callq __truncdfhf2@PLT<br>
-; AVX1-NEXT:    movl %eax, %ebx<br>
-; AVX1-NEXT:    shll $16, %ebx<br>
-; AVX1-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
-; AVX1-NEXT:    callq __truncdfhf2@PLT<br>
-; AVX1-NEXT:    movzwl %ax, %r14d<br>
-; AVX1-NEXT:    orl %ebx, %r14d<br>
-; AVX1-NEXT:    shlq $32, %r14<br>
-; AVX1-NEXT:    orq %r15, %r14<br>
-; AVX1-NEXT:    vpermilpd $1, (%rsp), %xmm0 # 16-byte Folded Reload<br>
-; AVX1-NEXT:    # xmm0 = mem[1,0]<br>
-; AVX1-NEXT:    callq __truncdfhf2@PLT<br>
-; AVX1-NEXT:    movl %eax, %ebx<br>
-; AVX1-NEXT:    shll $16, %ebx<br>
-; AVX1-NEXT:    vmovups (%rsp), %ymm0 # 32-byte Reload<br>
-; AVX1-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0<br>
-; AVX1-NEXT:    vzeroupper<br>
-; AVX1-NEXT:    callq __truncdfhf2@PLT<br>
-; AVX1-NEXT:    movzwl %ax, %r15d<br>
-; AVX1-NEXT:    orl %ebx, %r15d<br>
-; AVX1-NEXT:    vmovups (%rsp), %ymm0 # 32-byte Reload<br>
-; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0<br>
-; AVX1-NEXT:    vmovapd %xmm0, (%rsp) # 16-byte Spill<br>
-; AVX1-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]<br>
-; AVX1-NEXT:    vzeroupper<br>
-; AVX1-NEXT:    callq __truncdfhf2@PLT<br>
-; AVX1-NEXT:    movl %eax, %ebx<br>
-; AVX1-NEXT:    shll $16, %ebx<br>
-; AVX1-NEXT:    vmovaps (%rsp), %xmm0 # 16-byte Reload<br>
-; AVX1-NEXT:    callq __truncdfhf2@PLT<br>
+; AVX1-NEXT:    vpermilpd {{.*#+}} xmm2 = xmm0[1,0]<br>
+; AVX1-NEXT:    vcvtsd2ss %xmm2, %xmm2, %xmm2<br>
+; AVX1-NEXT:    vcvtps2ph $4, %xmm2, %xmm2<br>
+; AVX1-NEXT:    vmovd %xmm2, %edx<br>
+; AVX1-NEXT:    shll $16, %edx<br>
+; AVX1-NEXT:    vcvtsd2ss %xmm0, %xmm0, %xmm0<br>
+; AVX1-NEXT:    vcvtps2ph $4, %xmm0, %xmm0<br>
+; AVX1-NEXT:    vmovd %xmm0, %eax<br>
 ; AVX1-NEXT:    movzwl %ax, %eax<br>
-; AVX1-NEXT:    orl %ebx, %eax<br>
+; AVX1-NEXT:    orl %edx, %eax<br>
 ; AVX1-NEXT:    shlq $32, %rax<br>
-; AVX1-NEXT:    orq %r15, %rax<br>
-; AVX1-NEXT:    vmovq %rax, %xmm0<br>
-; AVX1-NEXT:    vmovq %r14, %xmm1<br>
+; AVX1-NEXT:    orq %rcx, %rax<br>
+; AVX1-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm1[1,0]<br>
+; AVX1-NEXT:    vcvtsd2ss %xmm0, %xmm0, %xmm0<br>
+; AVX1-NEXT:    vcvtps2ph $4, %xmm0, %xmm0<br>
+; AVX1-NEXT:    vmovd %xmm0, %ecx<br>
+; AVX1-NEXT:    shll $16, %ecx<br>
+; AVX1-NEXT:    vcvtsd2ss %xmm1, %xmm1, %xmm0<br>
+; AVX1-NEXT:    vcvtps2ph $4, %xmm0, %xmm0<br>
+; AVX1-NEXT:    vmovd %xmm0, %edx<br>
+; AVX1-NEXT:    movzwl %dx, %edx<br>
+; AVX1-NEXT:    orl %ecx, %edx<br>
+; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm0<br>
+; AVX1-NEXT:    vpermilpd {{.*#+}} xmm1 = xmm0[1,0]<br>
+; AVX1-NEXT:    vcvtsd2ss %xmm1, %xmm1, %xmm1<br>
+; AVX1-NEXT:    vcvtps2ph $4, %xmm1, %xmm1<br>
+; AVX1-NEXT:    vmovd %xmm1, %ecx<br>
+; AVX1-NEXT:    shll $16, %ecx<br>
+; AVX1-NEXT:    vcvtsd2ss %xmm0, %xmm0, %xmm0<br>
+; AVX1-NEXT:    vcvtps2ph $4, %xmm0, %xmm0<br>
+; AVX1-NEXT:    vmovd %xmm0, %esi<br>
+; AVX1-NEXT:    movzwl %si, %esi<br>
+; AVX1-NEXT:    orl %ecx, %esi<br>
+; AVX1-NEXT:    shlq $32, %rsi<br>
+; AVX1-NEXT:    orq %rdx, %rsi<br>
+; AVX1-NEXT:    vmovq %rsi, %xmm0<br>
+; AVX1-NEXT:    vmovq %rax, %xmm1<br>
 ; AVX1-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]<br>
-; AVX1-NEXT:    addq $64, %rsp<br>
-; AVX1-NEXT:    popq %rbx<br>
-; AVX1-NEXT:    popq %r14<br>
-; AVX1-NEXT:    popq %r15<br>
+; AVX1-NEXT:    vzeroupper<br>
 ; AVX1-NEXT:    retq<br>
 ;<br>
 ; AVX2-LABEL: cvt_8f64_to_8i16:<br>
 ; AVX2:       # %bb.0:<br>
-; AVX2-NEXT:    pushq %r15<br>
-; AVX2-NEXT:    pushq %r14<br>
-; AVX2-NEXT:    pushq %rbx<br>
-; AVX2-NEXT:    subq $64, %rsp<br>
-; AVX2-NEXT:    vmovups %ymm1, (%rsp) # 32-byte Spill<br>
-; AVX2-NEXT:    vmovupd %ymm0, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill<br>
-; AVX2-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]<br>
-; AVX2-NEXT:    vzeroupper<br>
-; AVX2-NEXT:    callq __truncdfhf2@PLT<br>
-; AVX2-NEXT:    movl %eax, %ebx<br>
-; AVX2-NEXT:    shll $16, %ebx<br>
-; AVX2-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload<br>
-; AVX2-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0<br>
-; AVX2-NEXT:    vzeroupper<br>
-; AVX2-NEXT:    callq __truncdfhf2@PLT<br>
-; AVX2-NEXT:    movzwl %ax, %r15d<br>
-; AVX2-NEXT:    orl %ebx, %r15d<br>
-; AVX2-NEXT:    vmovupd {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload<br>
+; AVX2-NEXT:    vpermilpd {{.*#+}} xmm2 = xmm0[1,0]<br>
+; AVX2-NEXT:    vcvtsd2ss %xmm2, %xmm2, %xmm2<br>
+; AVX2-NEXT:    vcvtps2ph $4, %xmm2, %xmm2<br>
+; AVX2-NEXT:    vmovd %xmm2, %eax<br>
+; AVX2-NEXT:    shll $16, %eax<br>
+; AVX2-NEXT:    vcvtsd2ss %xmm0, %xmm0, %xmm2<br>
+; AVX2-NEXT:    vcvtps2ph $4, %xmm2, %xmm2<br>
+; AVX2-NEXT:    vmovd %xmm2, %ecx<br>
+; AVX2-NEXT:    movzwl %cx, %ecx<br>
+; AVX2-NEXT:    orl %eax, %ecx<br>
 ; AVX2-NEXT:    vextractf128 $1, %ymm0, %xmm0<br>
-; AVX2-NEXT:    vmovapd %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
-; AVX2-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]<br>
-; AVX2-NEXT:    vzeroupper<br>
-; AVX2-NEXT:    callq __truncdfhf2@PLT<br>
-; AVX2-NEXT:    movl %eax, %ebx<br>
-; AVX2-NEXT:    shll $16, %ebx<br>
-; AVX2-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
-; AVX2-NEXT:    callq __truncdfhf2@PLT<br>
-; AVX2-NEXT:    movzwl %ax, %r14d<br>
-; AVX2-NEXT:    orl %ebx, %r14d<br>
-; AVX2-NEXT:    shlq $32, %r14<br>
-; AVX2-NEXT:    orq %r15, %r14<br>
-; AVX2-NEXT:    vpermilpd $1, (%rsp), %xmm0 # 16-byte Folded Reload<br>
-; AVX2-NEXT:    # xmm0 = mem[1,0]<br>
-; AVX2-NEXT:    callq __truncdfhf2@PLT<br>
-; AVX2-NEXT:    movl %eax, %ebx<br>
-; AVX2-NEXT:    shll $16, %ebx<br>
-; AVX2-NEXT:    vmovups (%rsp), %ymm0 # 32-byte Reload<br>
-; AVX2-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0<br>
-; AVX2-NEXT:    vzeroupper<br>
-; AVX2-NEXT:    callq __truncdfhf2@PLT<br>
-; AVX2-NEXT:    movzwl %ax, %r15d<br>
-; AVX2-NEXT:    orl %ebx, %r15d<br>
-; AVX2-NEXT:    vmovupd (%rsp), %ymm0 # 32-byte Reload<br>
-; AVX2-NEXT:    vextractf128 $1, %ymm0, %xmm0<br>
-; AVX2-NEXT:    vmovapd %xmm0, (%rsp) # 16-byte Spill<br>
-; AVX2-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]<br>
-; AVX2-NEXT:    vzeroupper<br>
-; AVX2-NEXT:    callq __truncdfhf2@PLT<br>
-; AVX2-NEXT:    movl %eax, %ebx<br>
-; AVX2-NEXT:    shll $16, %ebx<br>
-; AVX2-NEXT:    vmovaps (%rsp), %xmm0 # 16-byte Reload<br>
-; AVX2-NEXT:    callq __truncdfhf2@PLT<br>
+; AVX2-NEXT:    vpermilpd {{.*#+}} xmm2 = xmm0[1,0]<br>
+; AVX2-NEXT:    vcvtsd2ss %xmm2, %xmm2, %xmm2<br>
+; AVX2-NEXT:    vcvtps2ph $4, %xmm2, %xmm2<br>
+; AVX2-NEXT:    vmovd %xmm2, %edx<br>
+; AVX2-NEXT:    shll $16, %edx<br>
+; AVX2-NEXT:    vcvtsd2ss %xmm0, %xmm0, %xmm0<br>
+; AVX2-NEXT:    vcvtps2ph $4, %xmm0, %xmm0<br>
+; AVX2-NEXT:    vmovd %xmm0, %eax<br>
 ; AVX2-NEXT:    movzwl %ax, %eax<br>
-; AVX2-NEXT:    orl %ebx, %eax<br>
+; AVX2-NEXT:    orl %edx, %eax<br>
 ; AVX2-NEXT:    shlq $32, %rax<br>
-; AVX2-NEXT:    orq %r15, %rax<br>
-; AVX2-NEXT:    vmovq %rax, %xmm0<br>
-; AVX2-NEXT:    vmovq %r14, %xmm1<br>
+; AVX2-NEXT:    orq %rcx, %rax<br>
+; AVX2-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm1[1,0]<br>
+; AVX2-NEXT:    vcvtsd2ss %xmm0, %xmm0, %xmm0<br>
+; AVX2-NEXT:    vcvtps2ph $4, %xmm0, %xmm0<br>
+; AVX2-NEXT:    vmovd %xmm0, %ecx<br>
+; AVX2-NEXT:    shll $16, %ecx<br>
+; AVX2-NEXT:    vcvtsd2ss %xmm1, %xmm1, %xmm0<br>
+; AVX2-NEXT:    vcvtps2ph $4, %xmm0, %xmm0<br>
+; AVX2-NEXT:    vmovd %xmm0, %edx<br>
+; AVX2-NEXT:    movzwl %dx, %edx<br>
+; AVX2-NEXT:    orl %ecx, %edx<br>
+; AVX2-NEXT:    vextractf128 $1, %ymm1, %xmm0<br>
+; AVX2-NEXT:    vpermilpd {{.*#+}} xmm1 = xmm0[1,0]<br>
+; AVX2-NEXT:    vcvtsd2ss %xmm1, %xmm1, %xmm1<br>
+; AVX2-NEXT:    vcvtps2ph $4, %xmm1, %xmm1<br>
+; AVX2-NEXT:    vmovd %xmm1, %ecx<br>
+; AVX2-NEXT:    shll $16, %ecx<br>
+; AVX2-NEXT:    vcvtsd2ss %xmm0, %xmm0, %xmm0<br>
+; AVX2-NEXT:    vcvtps2ph $4, %xmm0, %xmm0<br>
+; AVX2-NEXT:    vmovd %xmm0, %esi<br>
+; AVX2-NEXT:    movzwl %si, %esi<br>
+; AVX2-NEXT:    orl %ecx, %esi<br>
+; AVX2-NEXT:    shlq $32, %rsi<br>
+; AVX2-NEXT:    orq %rdx, %rsi<br>
+; AVX2-NEXT:    vmovq %rsi, %xmm0<br>
+; AVX2-NEXT:    vmovq %rax, %xmm1<br>
 ; AVX2-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]<br>
-; AVX2-NEXT:    addq $64, %rsp<br>
-; AVX2-NEXT:    popq %rbx<br>
-; AVX2-NEXT:    popq %r14<br>
-; AVX2-NEXT:    popq %r15<br>
+; AVX2-NEXT:    vzeroupper<br>
 ; AVX2-NEXT:    retq<br>
 ;<br>
 ; AVX512-LABEL: cvt_8f64_to_8i16:<br>
 ; AVX512:       # %bb.0:<br>
-; AVX512-NEXT:    pushq %r15<br>
-; AVX512-NEXT:    pushq %r14<br>
-; AVX512-NEXT:    pushq %rbx<br>
-; AVX512-NEXT:    subq $80, %rsp<br>
-; AVX512-NEXT:    vmovupd %zmm0, (%rsp) # 64-byte Spill<br>
-; AVX512-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]<br>
-; AVX512-NEXT:    vzeroupper<br>
-; AVX512-NEXT:    callq __truncdfhf2@PLT<br>
-; AVX512-NEXT:    movl %eax, %ebx<br>
-; AVX512-NEXT:    shll $16, %ebx<br>
-; AVX512-NEXT:    vmovups (%rsp), %zmm0 # 64-byte Reload<br>
-; AVX512-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0<br>
-; AVX512-NEXT:    vzeroupper<br>
-; AVX512-NEXT:    callq __truncdfhf2@PLT<br>
-; AVX512-NEXT:    movzwl %ax, %r15d<br>
-; AVX512-NEXT:    orl %ebx, %r15d<br>
-; AVX512-NEXT:    vmovupd (%rsp), %zmm0 # 64-byte Reload<br>
-; AVX512-NEXT:    vextractf128 $1, %ymm0, %xmm0<br>
-; AVX512-NEXT:    vmovapd %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
-; AVX512-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]<br>
-; AVX512-NEXT:    vzeroupper<br>
-; AVX512-NEXT:    callq __truncdfhf2@PLT<br>
-; AVX512-NEXT:    movl %eax, %ebx<br>
-; AVX512-NEXT:    shll $16, %ebx<br>
-; AVX512-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
-; AVX512-NEXT:    callq __truncdfhf2@PLT<br>
-; AVX512-NEXT:    movzwl %ax, %r14d<br>
-; AVX512-NEXT:    orl %ebx, %r14d<br>
-; AVX512-NEXT:    shlq $32, %r14<br>
-; AVX512-NEXT:    orq %r15, %r14<br>
-; AVX512-NEXT:    vmovupd (%rsp), %zmm0 # 64-byte Reload<br>
-; AVX512-NEXT:    vextractf64x4 $1, %zmm0, %ymm0<br>
-; AVX512-NEXT:    vmovupd %ymm0, (%rsp) # 32-byte Spill<br>
-; AVX512-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]<br>
-; AVX512-NEXT:    vzeroupper<br>
-; AVX512-NEXT:    callq __truncdfhf2@PLT<br>
-; AVX512-NEXT:    movl %eax, %ebx<br>
-; AVX512-NEXT:    shll $16, %ebx<br>
-; AVX512-NEXT:    vmovups (%rsp), %ymm0 # 32-byte Reload<br>
-; AVX512-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0<br>
-; AVX512-NEXT:    vzeroupper<br>
-; AVX512-NEXT:    callq __truncdfhf2@PLT<br>
-; AVX512-NEXT:    movzwl %ax, %r15d<br>
-; AVX512-NEXT:    orl %ebx, %r15d<br>
-; AVX512-NEXT:    vmovupd (%rsp), %ymm0 # 32-byte Reload<br>
-; AVX512-NEXT:    vextractf128 $1, %ymm0, %xmm0<br>
-; AVX512-NEXT:    vmovapd %xmm0, (%rsp) # 16-byte Spill<br>
-; AVX512-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]<br>
-; AVX512-NEXT:    vzeroupper<br>
-; AVX512-NEXT:    callq __truncdfhf2@PLT<br>
-; AVX512-NEXT:    movl %eax, %ebx<br>
-; AVX512-NEXT:    shll $16, %ebx<br>
-; AVX512-NEXT:    vmovaps (%rsp), %xmm0 # 16-byte Reload<br>
-; AVX512-NEXT:    callq __truncdfhf2@PLT<br>
+; AVX512-NEXT:    vpermilpd {{.*#+}} xmm1 = xmm0[1,0]<br>
+; AVX512-NEXT:    vcvtsd2ss %xmm1, %xmm1, %xmm1<br>
+; AVX512-NEXT:    vcvtps2ph $4, %xmm1, %xmm1<br>
+; AVX512-NEXT:    vmovd %xmm1, %eax<br>
+; AVX512-NEXT:    shll $16, %eax<br>
+; AVX512-NEXT:    vcvtsd2ss %xmm0, %xmm0, %xmm1<br>
+; AVX512-NEXT:    vcvtps2ph $4, %xmm1, %xmm1<br>
+; AVX512-NEXT:    vmovd %xmm1, %ecx<br>
+; AVX512-NEXT:    movzwl %cx, %ecx<br>
+; AVX512-NEXT:    orl %eax, %ecx<br>
+; AVX512-NEXT:    vextractf128 $1, %ymm0, %xmm1<br>
+; AVX512-NEXT:    vpermilpd {{.*#+}} xmm2 = xmm1[1,0]<br>
+; AVX512-NEXT:    vcvtsd2ss %xmm2, %xmm2, %xmm2<br>
+; AVX512-NEXT:    vcvtps2ph $4, %xmm2, %xmm2<br>
+; AVX512-NEXT:    vmovd %xmm2, %edx<br>
+; AVX512-NEXT:    shll $16, %edx<br>
+; AVX512-NEXT:    vcvtsd2ss %xmm1, %xmm1, %xmm1<br>
+; AVX512-NEXT:    vcvtps2ph $4, %xmm1, %xmm1<br>
+; AVX512-NEXT:    vmovd %xmm1, %eax<br>
 ; AVX512-NEXT:    movzwl %ax, %eax<br>
-; AVX512-NEXT:    orl %ebx, %eax<br>
+; AVX512-NEXT:    orl %edx, %eax<br>
 ; AVX512-NEXT:    shlq $32, %rax<br>
-; AVX512-NEXT:    orq %r15, %rax<br>
-; AVX512-NEXT:    vmovq %rax, %xmm0<br>
-; AVX512-NEXT:    vmovq %r14, %xmm1<br>
+; AVX512-NEXT:    orq %rcx, %rax<br>
+; AVX512-NEXT:    vextractf64x4 $1, %zmm0, %ymm0<br>
+; AVX512-NEXT:    vpermilpd {{.*#+}} xmm1 = xmm0[1,0]<br>
+; AVX512-NEXT:    vcvtsd2ss %xmm1, %xmm1, %xmm1<br>
+; AVX512-NEXT:    vcvtps2ph $4, %xmm1, %xmm1<br>
+; AVX512-NEXT:    vmovd %xmm1, %ecx<br>
+; AVX512-NEXT:    shll $16, %ecx<br>
+; AVX512-NEXT:    vcvtsd2ss %xmm0, %xmm0, %xmm1<br>
+; AVX512-NEXT:    vcvtps2ph $4, %xmm1, %xmm1<br>
+; AVX512-NEXT:    vmovd %xmm1, %edx<br>
+; AVX512-NEXT:    movzwl %dx, %edx<br>
+; AVX512-NEXT:    orl %ecx, %edx<br>
+; AVX512-NEXT:    vextractf128 $1, %ymm0, %xmm0<br>
+; AVX512-NEXT:    vpermilpd {{.*#+}} xmm1 = xmm0[1,0]<br>
+; AVX512-NEXT:    vcvtsd2ss %xmm1, %xmm1, %xmm1<br>
+; AVX512-NEXT:    vcvtps2ph $4, %xmm1, %xmm1<br>
+; AVX512-NEXT:    vmovd %xmm1, %ecx<br>
+; AVX512-NEXT:    shll $16, %ecx<br>
+; AVX512-NEXT:    vcvtsd2ss %xmm0, %xmm0, %xmm0<br>
+; AVX512-NEXT:    vcvtps2ph $4, %xmm0, %xmm0<br>
+; AVX512-NEXT:    vmovd %xmm0, %esi<br>
+; AVX512-NEXT:    movzwl %si, %esi<br>
+; AVX512-NEXT:    orl %ecx, %esi<br>
+; AVX512-NEXT:    shlq $32, %rsi<br>
+; AVX512-NEXT:    orq %rdx, %rsi<br>
+; AVX512-NEXT:    vmovq %rsi, %xmm0<br>
+; AVX512-NEXT:    vmovq %rax, %xmm1<br>
 ; AVX512-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]<br>
-; AVX512-NEXT:    addq $80, %rsp<br>
-; AVX512-NEXT:    popq %rbx<br>
-; AVX512-NEXT:    popq %r14<br>
-; AVX512-NEXT:    popq %r15<br>
+; AVX512-NEXT:    vzeroupper<br>
 ; AVX512-NEXT:    retq<br>
   %1 = fptrunc <8 x double> %a0 to <8 x half><br>
   %2 = bitcast <8 x half> %1 to <8 x i16><br>
@@ -982,11 +944,10 @@ define <8 x i16> @cvt_8f64_to_8i16(<8 x double> %a0) nounwind {<br>
 define void @store_cvt_f64_to_i16(double %a0, i16* %a1) nounwind {<br>
 ; ALL-LABEL: store_cvt_f64_to_i16:<br>
 ; ALL:       # %bb.0:<br>
-; ALL-NEXT:    pushq %rbx<br>
-; ALL-NEXT:    movq %rdi, %rbx<br>
-; ALL-NEXT:    callq __truncdfhf2@PLT<br>
-; ALL-NEXT:    movw %ax, (%rbx)<br>
-; ALL-NEXT:    popq %rbx<br>
+; ALL-NEXT:    vcvtsd2ss %xmm0, %xmm0, %xmm0<br>
+; ALL-NEXT:    vcvtps2ph $4, %xmm0, %xmm0<br>
+; ALL-NEXT:    vmovd %xmm0, %eax<br>
+; ALL-NEXT:    movw %ax, (%rdi)<br>
 ; ALL-NEXT:    retq<br>
   %1 = fptrunc double %a0 to half<br>
   %2 = bitcast half %1 to i16<br>
@@ -997,21 +958,15 @@ define void @store_cvt_f64_to_i16(double %a0, i16* %a1) nounwind {<br>
 define void @store_cvt_2f64_to_2i16(<2 x double> %a0, <2 x i16>* %a1) nounwind {<br>
 ; ALL-LABEL: store_cvt_2f64_to_2i16:<br>
 ; ALL:       # %bb.0:<br>
-; ALL-NEXT:    pushq %rbp<br>
-; ALL-NEXT:    pushq %rbx<br>
-; ALL-NEXT:    subq $24, %rsp<br>
-; ALL-NEXT:    movq %rdi, %rbx<br>
-; ALL-NEXT:    vmovapd %xmm0, (%rsp) # 16-byte Spill<br>
-; ALL-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]<br>
-; ALL-NEXT:    callq __truncdfhf2@PLT<br>
-; ALL-NEXT:    movl %eax, %ebp<br>
-; ALL-NEXT:    vmovaps (%rsp), %xmm0 # 16-byte Reload<br>
-; ALL-NEXT:    callq __truncdfhf2@PLT<br>
-; ALL-NEXT:    movw %ax, (%rbx)<br>
-; ALL-NEXT:    movw %bp, 2(%rbx)<br>
-; ALL-NEXT:    addq $24, %rsp<br>
-; ALL-NEXT:    popq %rbx<br>
-; ALL-NEXT:    popq %rbp<br>
+; ALL-NEXT:    vpermilpd {{.*#+}} xmm1 = xmm0[1,0]<br>
+; ALL-NEXT:    vcvtsd2ss %xmm1, %xmm1, %xmm1<br>
+; ALL-NEXT:    vcvtps2ph $4, %xmm1, %xmm1<br>
+; ALL-NEXT:    vmovd %xmm1, %eax<br>
+; ALL-NEXT:    vcvtsd2ss %xmm0, %xmm0, %xmm0<br>
+; ALL-NEXT:    vcvtps2ph $4, %xmm0, %xmm0<br>
+; ALL-NEXT:    vmovd %xmm0, %ecx<br>
+; ALL-NEXT:    movw %cx, (%rdi)<br>
+; ALL-NEXT:    movw %ax, 2(%rdi)<br>
 ; ALL-NEXT:    retq<br>
   %1 = fptrunc <2 x double> %a0 to <2 x half><br>
   %2 = bitcast <2 x half> %1 to <2 x i16><br>
@@ -1020,119 +975,29 @@ define void @store_cvt_2f64_to_2i16(<2 x double> %a0, <2 x i16>* %a1) nounwind {<br>
 }<br>
<br>
 define void @store_cvt_4f64_to_4i16(<4 x double> %a0, <4 x i16>* %a1) nounwind {<br>
-; AVX1-LABEL: store_cvt_4f64_to_4i16:<br>
-; AVX1:       # %bb.0:<br>
-; AVX1-NEXT:    pushq %rbp<br>
-; AVX1-NEXT:    pushq %r15<br>
-; AVX1-NEXT:    pushq %r14<br>
-; AVX1-NEXT:    pushq %rbx<br>
-; AVX1-NEXT:    subq $56, %rsp<br>
-; AVX1-NEXT:    movq %rdi, %rbx<br>
-; AVX1-NEXT:    vmovupd %ymm0, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill<br>
-; AVX1-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]<br>
-; AVX1-NEXT:    vzeroupper<br>
-; AVX1-NEXT:    callq __truncdfhf2@PLT<br>
-; AVX1-NEXT:    movl %eax, %r14d<br>
-; AVX1-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload<br>
-; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0<br>
-; AVX1-NEXT:    vmovapd %xmm0, (%rsp) # 16-byte Spill<br>
-; AVX1-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]<br>
-; AVX1-NEXT:    vzeroupper<br>
-; AVX1-NEXT:    callq __truncdfhf2@PLT<br>
-; AVX1-NEXT:    movl %eax, %r15d<br>
-; AVX1-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload<br>
-; AVX1-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0<br>
-; AVX1-NEXT:    vzeroupper<br>
-; AVX1-NEXT:    callq __truncdfhf2@PLT<br>
-; AVX1-NEXT:    movl %eax, %ebp<br>
-; AVX1-NEXT:    vmovaps (%rsp), %xmm0 # 16-byte Reload<br>
-; AVX1-NEXT:    callq __truncdfhf2@PLT<br>
-; AVX1-NEXT:    movw %ax, 4(%rbx)<br>
-; AVX1-NEXT:    movw %bp, (%rbx)<br>
-; AVX1-NEXT:    movw %r15w, 6(%rbx)<br>
-; AVX1-NEXT:    movw %r14w, 2(%rbx)<br>
-; AVX1-NEXT:    addq $56, %rsp<br>
-; AVX1-NEXT:    popq %rbx<br>
-; AVX1-NEXT:    popq %r14<br>
-; AVX1-NEXT:    popq %r15<br>
-; AVX1-NEXT:    popq %rbp<br>
-; AVX1-NEXT:    retq<br>
-;<br>
-; AVX2-LABEL: store_cvt_4f64_to_4i16:<br>
-; AVX2:       # %bb.0:<br>
-; AVX2-NEXT:    pushq %rbp<br>
-; AVX2-NEXT:    pushq %r15<br>
-; AVX2-NEXT:    pushq %r14<br>
-; AVX2-NEXT:    pushq %rbx<br>
-; AVX2-NEXT:    subq $56, %rsp<br>
-; AVX2-NEXT:    movq %rdi, %rbx<br>
-; AVX2-NEXT:    vmovupd %ymm0, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill<br>
-; AVX2-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]<br>
-; AVX2-NEXT:    vzeroupper<br>
-; AVX2-NEXT:    callq __truncdfhf2@PLT<br>
-; AVX2-NEXT:    movl %eax, %r14d<br>
-; AVX2-NEXT:    vmovupd {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload<br>
-; AVX2-NEXT:    vextractf128 $1, %ymm0, %xmm0<br>
-; AVX2-NEXT:    vmovapd %xmm0, (%rsp) # 16-byte Spill<br>
-; AVX2-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]<br>
-; AVX2-NEXT:    vzeroupper<br>
-; AVX2-NEXT:    callq __truncdfhf2@PLT<br>
-; AVX2-NEXT:    movl %eax, %r15d<br>
-; AVX2-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload<br>
-; AVX2-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0<br>
-; AVX2-NEXT:    vzeroupper<br>
-; AVX2-NEXT:    callq __truncdfhf2@PLT<br>
-; AVX2-NEXT:    movl %eax, %ebp<br>
-; AVX2-NEXT:    vmovaps (%rsp), %xmm0 # 16-byte Reload<br>
-; AVX2-NEXT:    callq __truncdfhf2@PLT<br>
-; AVX2-NEXT:    movw %ax, 4(%rbx)<br>
-; AVX2-NEXT:    movw %bp, (%rbx)<br>
-; AVX2-NEXT:    movw %r15w, 6(%rbx)<br>
-; AVX2-NEXT:    movw %r14w, 2(%rbx)<br>
-; AVX2-NEXT:    addq $56, %rsp<br>
-; AVX2-NEXT:    popq %rbx<br>
-; AVX2-NEXT:    popq %r14<br>
-; AVX2-NEXT:    popq %r15<br>
-; AVX2-NEXT:    popq %rbp<br>
-; AVX2-NEXT:    retq<br>
-;<br>
-; AVX512-LABEL: store_cvt_4f64_to_4i16:<br>
-; AVX512:       # %bb.0:<br>
-; AVX512-NEXT:    pushq %rbp<br>
-; AVX512-NEXT:    pushq %r15<br>
-; AVX512-NEXT:    pushq %r14<br>
-; AVX512-NEXT:    pushq %rbx<br>
-; AVX512-NEXT:    subq $56, %rsp<br>
-; AVX512-NEXT:    movq %rdi, %rbx<br>
-; AVX512-NEXT:    vmovupd %ymm0, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill<br>
-; AVX512-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]<br>
-; AVX512-NEXT:    vzeroupper<br>
-; AVX512-NEXT:    callq __truncdfhf2@PLT<br>
-; AVX512-NEXT:    movl %eax, %r14d<br>
-; AVX512-NEXT:    vmovupd {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload<br>
-; AVX512-NEXT:    vextractf128 $1, %ymm0, %xmm0<br>
-; AVX512-NEXT:    vmovapd %xmm0, (%rsp) # 16-byte Spill<br>
-; AVX512-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]<br>
-; AVX512-NEXT:    vzeroupper<br>
-; AVX512-NEXT:    callq __truncdfhf2@PLT<br>
-; AVX512-NEXT:    movl %eax, %r15d<br>
-; AVX512-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload<br>
-; AVX512-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0<br>
-; AVX512-NEXT:    vzeroupper<br>
-; AVX512-NEXT:    callq __truncdfhf2@PLT<br>
-; AVX512-NEXT:    movl %eax, %ebp<br>
-; AVX512-NEXT:    vmovaps (%rsp), %xmm0 # 16-byte Reload<br>
-; AVX512-NEXT:    callq __truncdfhf2@PLT<br>
-; AVX512-NEXT:    movw %ax, 4(%rbx)<br>
-; AVX512-NEXT:    movw %bp, (%rbx)<br>
-; AVX512-NEXT:    movw %r15w, 6(%rbx)<br>
-; AVX512-NEXT:    movw %r14w, 2(%rbx)<br>
-; AVX512-NEXT:    addq $56, %rsp<br>
-; AVX512-NEXT:    popq %rbx<br>
-; AVX512-NEXT:    popq %r14<br>
-; AVX512-NEXT:    popq %r15<br>
-; AVX512-NEXT:    popq %rbp<br>
-; AVX512-NEXT:    retq<br>
+; ALL-LABEL: store_cvt_4f64_to_4i16:<br>
+; ALL:       # %bb.0:<br>
+; ALL-NEXT:    vpermilpd {{.*#+}} xmm1 = xmm0[1,0]<br>
+; ALL-NEXT:    vcvtsd2ss %xmm1, %xmm1, %xmm1<br>
+; ALL-NEXT:    vcvtps2ph $4, %xmm1, %xmm1<br>
+; ALL-NEXT:    vmovd %xmm1, %eax<br>
+; ALL-NEXT:    vextractf128 $1, %ymm0, %xmm1<br>
+; ALL-NEXT:    vpermilpd {{.*#+}} xmm2 = xmm1[1,0]<br>
+; ALL-NEXT:    vcvtsd2ss %xmm2, %xmm2, %xmm2<br>
+; ALL-NEXT:    vcvtps2ph $4, %xmm2, %xmm2<br>
+; ALL-NEXT:    vmovd %xmm2, %ecx<br>
+; ALL-NEXT:    vcvtsd2ss %xmm0, %xmm0, %xmm0<br>
+; ALL-NEXT:    vcvtps2ph $4, %xmm0, %xmm0<br>
+; ALL-NEXT:    vmovd %xmm0, %edx<br>
+; ALL-NEXT:    vcvtsd2ss %xmm1, %xmm1, %xmm0<br>
+; ALL-NEXT:    vcvtps2ph $4, %xmm0, %xmm0<br>
+; ALL-NEXT:    vmovd %xmm0, %esi<br>
+; ALL-NEXT:    movw %si, 4(%rdi)<br>
+; ALL-NEXT:    movw %dx, (%rdi)<br>
+; ALL-NEXT:    movw %cx, 6(%rdi)<br>
+; ALL-NEXT:    movw %ax, 2(%rdi)<br>
+; ALL-NEXT:    vzeroupper<br>
+; ALL-NEXT:    retq<br>
   %1 = fptrunc <4 x double> %a0 to <4 x half><br>
   %2 = bitcast <4 x half> %1 to <4 x i16><br>
   store <4 x i16> %2, <4 x i16>* %a1<br>
@@ -1142,32 +1007,28 @@ define void @store_cvt_4f64_to_4i16(<4 x double> %a0, <4 x i16>* %a1) nounwind {<br>
 define void @store_cvt_4f64_to_8i16_undef(<4 x double> %a0, <8 x i16>* %a1) nounwind {<br>
 ; ALL-LABEL: store_cvt_4f64_to_8i16_undef:<br>
 ; ALL:       # %bb.0:<br>
-; ALL-NEXT:    pushq %rbx<br>
-; ALL-NEXT:    subq $64, %rsp<br>
-; ALL-NEXT:    movq %rdi, %rbx<br>
-; ALL-NEXT:    vmovups %ymm0, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill<br>
-; ALL-NEXT:    vextractf128 $1, %ymm0, %xmm0<br>
-; ALL-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
-; ALL-NEXT:    vzeroupper<br>
-; ALL-NEXT:    callq __truncdfhf2@PLT<br>
-; ALL-NEXT:    movw %ax, {{[0-9]+}}(%rsp)<br>
-; ALL-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload<br>
-; ALL-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0<br>
+; ALL-NEXT:    vextractf128 $1, %ymm0, %xmm1<br>
+; ALL-NEXT:    vcvtsd2ss %xmm1, %xmm1, %xmm2<br>
+; ALL-NEXT:    vcvtps2ph $4, %xmm2, %xmm2<br>
+; ALL-NEXT:    vmovd %xmm2, %eax<br>
+; ALL-NEXT:    movw %ax, -{{[0-9]+}}(%rsp)<br>
+; ALL-NEXT:    vcvtsd2ss %xmm0, %xmm0, %xmm2<br>
+; ALL-NEXT:    vcvtps2ph $4, %xmm2, %xmm2<br>
+; ALL-NEXT:    vmovd %xmm2, %eax<br>
+; ALL-NEXT:    movw %ax, -{{[0-9]+}}(%rsp)<br>
+; ALL-NEXT:    vpermilpd {{.*#+}} xmm1 = xmm1[1,0]<br>
+; ALL-NEXT:    vcvtsd2ss %xmm1, %xmm1, %xmm1<br>
+; ALL-NEXT:    vcvtps2ph $4, %xmm1, %xmm1<br>
+; ALL-NEXT:    vmovd %xmm1, %eax<br>
+; ALL-NEXT:    movw %ax, -{{[0-9]+}}(%rsp)<br>
+; ALL-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]<br>
+; ALL-NEXT:    vcvtsd2ss %xmm0, %xmm0, %xmm0<br>
+; ALL-NEXT:    vcvtps2ph $4, %xmm0, %xmm0<br>
+; ALL-NEXT:    vmovd %xmm0, %eax<br>
+; ALL-NEXT:    movw %ax, -{{[0-9]+}}(%rsp)<br>
+; ALL-NEXT:    vmovaps -{{[0-9]+}}(%rsp), %xmm0<br>
+; ALL-NEXT:    vmovaps %xmm0, (%rdi)<br>
 ; ALL-NEXT:    vzeroupper<br>
-; ALL-NEXT:    callq __truncdfhf2@PLT<br>
-; ALL-NEXT:    movw %ax, (%rsp)<br>
-; ALL-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload<br>
-; ALL-NEXT:    # xmm0 = mem[1,0]<br>
-; ALL-NEXT:    callq __truncdfhf2@PLT<br>
-; ALL-NEXT:    movw %ax, {{[0-9]+}}(%rsp)<br>
-; ALL-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload<br>
-; ALL-NEXT:    # xmm0 = mem[1,0]<br>
-; ALL-NEXT:    callq __truncdfhf2@PLT<br>
-; ALL-NEXT:    movw %ax, {{[0-9]+}}(%rsp)<br>
-; ALL-NEXT:    vmovaps (%rsp), %xmm0<br>
-; ALL-NEXT:    vmovaps %xmm0, (%rbx)<br>
-; ALL-NEXT:    addq $64, %rsp<br>
-; ALL-NEXT:    popq %rbx<br>
 ; ALL-NEXT:    retq<br>
   %1 = fptrunc <4 x double> %a0 to <4 x half><br>
   %2 = bitcast <4 x half> %1 to <4 x i16><br>
@@ -1179,32 +1040,28 @@ define void @store_cvt_4f64_to_8i16_undef(<4 x double> %a0, <8 x i16>* %a1) noun<br>
 define void @store_cvt_4f64_to_8i16_zero(<4 x double> %a0, <8 x i16>* %a1) nounwind {<br>
 ; ALL-LABEL: store_cvt_4f64_to_8i16_zero:<br>
 ; ALL:       # %bb.0:<br>
-; ALL-NEXT:    pushq %rbx<br>
-; ALL-NEXT:    subq $64, %rsp<br>
-; ALL-NEXT:    movq %rdi, %rbx<br>
-; ALL-NEXT:    vmovups %ymm0, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill<br>
-; ALL-NEXT:    vextractf128 $1, %ymm0, %xmm0<br>
-; ALL-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
-; ALL-NEXT:    vzeroupper<br>
-; ALL-NEXT:    callq __truncdfhf2@PLT<br>
-; ALL-NEXT:    movw %ax, {{[0-9]+}}(%rsp)<br>
-; ALL-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload<br>
-; ALL-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0<br>
-; ALL-NEXT:    vzeroupper<br>
-; ALL-NEXT:    callq __truncdfhf2@PLT<br>
-; ALL-NEXT:    movw %ax, (%rsp)<br>
-; ALL-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload<br>
-; ALL-NEXT:    # xmm0 = mem[1,0]<br>
-; ALL-NEXT:    callq __truncdfhf2@PLT<br>
-; ALL-NEXT:    movw %ax, {{[0-9]+}}(%rsp)<br>
-; ALL-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload<br>
-; ALL-NEXT:    # xmm0 = mem[1,0]<br>
-; ALL-NEXT:    callq __truncdfhf2@PLT<br>
-; ALL-NEXT:    movw %ax, {{[0-9]+}}(%rsp)<br>
+; ALL-NEXT:    vextractf128 $1, %ymm0, %xmm1<br>
+; ALL-NEXT:    vcvtsd2ss %xmm1, %xmm1, %xmm2<br>
+; ALL-NEXT:    vcvtps2ph $4, %xmm2, %xmm2<br>
+; ALL-NEXT:    vmovd %xmm2, %eax<br>
+; ALL-NEXT:    movw %ax, -{{[0-9]+}}(%rsp)<br>
+; ALL-NEXT:    vcvtsd2ss %xmm0, %xmm0, %xmm2<br>
+; ALL-NEXT:    vcvtps2ph $4, %xmm2, %xmm2<br>
+; ALL-NEXT:    vmovd %xmm2, %eax<br>
+; ALL-NEXT:    movw %ax, -{{[0-9]+}}(%rsp)<br>
+; ALL-NEXT:    vpermilpd {{.*#+}} xmm1 = xmm1[1,0]<br>
+; ALL-NEXT:    vcvtsd2ss %xmm1, %xmm1, %xmm1<br>
+; ALL-NEXT:    vcvtps2ph $4, %xmm1, %xmm1<br>
+; ALL-NEXT:    vmovd %xmm1, %eax<br>
+; ALL-NEXT:    movw %ax, -{{[0-9]+}}(%rsp)<br>
+; ALL-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]<br>
+; ALL-NEXT:    vcvtsd2ss %xmm0, %xmm0, %xmm0<br>
+; ALL-NEXT:    vcvtps2ph $4, %xmm0, %xmm0<br>
+; ALL-NEXT:    vmovd %xmm0, %eax<br>
+; ALL-NEXT:    movw %ax, -{{[0-9]+}}(%rsp)<br>
 ; ALL-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero<br>
-; ALL-NEXT:    vmovaps %xmm0, (%rbx)<br>
-; ALL-NEXT:    addq $64, %rsp<br>
-; ALL-NEXT:    popq %rbx<br>
+; ALL-NEXT:    vmovaps %xmm0, (%rdi)<br>
+; ALL-NEXT:    vzeroupper<br>
 ; ALL-NEXT:    retq<br>
   %1 = fptrunc <4 x double> %a0 to <4 x half><br>
   %2 = bitcast <4 x half> %1 to <4 x i16><br>
@@ -1216,208 +1073,132 @@ define void @store_cvt_4f64_to_8i16_zero(<4 x double> %a0, <8 x i16>* %a1) nounw<br>
 define void @store_cvt_8f64_to_8i16(<8 x double> %a0, <8 x i16>* %a1) nounwind {<br>
 ; AVX1-LABEL: store_cvt_8f64_to_8i16:<br>
 ; AVX1:       # %bb.0:<br>
-; AVX1-NEXT:    pushq %rbp<br>
-; AVX1-NEXT:    pushq %r15<br>
-; AVX1-NEXT:    pushq %r14<br>
-; AVX1-NEXT:    pushq %r13<br>
-; AVX1-NEXT:    pushq %r12<br>
-; AVX1-NEXT:    pushq %rbx<br>
-; AVX1-NEXT:    subq $120, %rsp<br>
-; AVX1-NEXT:    movq %rdi, %rbx<br>
-; AVX1-NEXT:    vmovups %ymm1, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill<br>
-; AVX1-NEXT:    vmovupd %ymm0, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill<br>
-; AVX1-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]<br>
+; AVX1-NEXT:    vpermilpd {{.*#+}} xmm2 = xmm0[1,0]<br>
+; AVX1-NEXT:    vcvtsd2ss %xmm2, %xmm2, %xmm2<br>
+; AVX1-NEXT:    vcvtps2ph $4, %xmm2, %xmm2<br>
+; AVX1-NEXT:    vmovd %xmm2, %r8d<br>
+; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2<br>
+; AVX1-NEXT:    vpermilpd {{.*#+}} xmm3 = xmm2[1,0]<br>
+; AVX1-NEXT:    vcvtsd2ss %xmm3, %xmm3, %xmm3<br>
+; AVX1-NEXT:    vcvtps2ph $4, %xmm3, %xmm3<br>
+; AVX1-NEXT:    vmovd %xmm3, %r9d<br>
+; AVX1-NEXT:    vpermilpd {{.*#+}} xmm3 = xmm1[1,0]<br>
+; AVX1-NEXT:    vcvtsd2ss %xmm3, %xmm3, %xmm3<br>
+; AVX1-NEXT:    vcvtps2ph $4, %xmm3, %xmm3<br>
+; AVX1-NEXT:    vmovd %xmm3, %r10d<br>
+; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm3<br>
+; AVX1-NEXT:    vpermilpd {{.*#+}} xmm4 = xmm3[1,0]<br>
+; AVX1-NEXT:    vcvtsd2ss %xmm4, %xmm4, %xmm4<br>
+; AVX1-NEXT:    vcvtps2ph $4, %xmm4, %xmm4<br>
+; AVX1-NEXT:    vmovd %xmm4, %r11d<br>
+; AVX1-NEXT:    vcvtsd2ss %xmm0, %xmm0, %xmm0<br>
+; AVX1-NEXT:    vcvtps2ph $4, %xmm0, %xmm0<br>
+; AVX1-NEXT:    vmovd %xmm0, %eax<br>
+; AVX1-NEXT:    vcvtsd2ss %xmm2, %xmm2, %xmm0<br>
+; AVX1-NEXT:    vcvtps2ph $4, %xmm0, %xmm0<br>
+; AVX1-NEXT:    vmovd %xmm0, %ecx<br>
+; AVX1-NEXT:    vcvtsd2ss %xmm1, %xmm1, %xmm0<br>
+; AVX1-NEXT:    vcvtps2ph $4, %xmm0, %xmm0<br>
+; AVX1-NEXT:    vmovd %xmm0, %edx<br>
+; AVX1-NEXT:    vcvtsd2ss %xmm3, %xmm3, %xmm0<br>
+; AVX1-NEXT:    vcvtps2ph $4, %xmm0, %xmm0<br>
+; AVX1-NEXT:    vmovd %xmm0, %esi<br>
+; AVX1-NEXT:    movw %si, 12(%rdi)<br>
+; AVX1-NEXT:    movw %dx, 8(%rdi)<br>
+; AVX1-NEXT:    movw %cx, 4(%rdi)<br>
+; AVX1-NEXT:    movw %ax, (%rdi)<br>
+; AVX1-NEXT:    movw %r11w, 14(%rdi)<br>
+; AVX1-NEXT:    movw %r10w, 10(%rdi)<br>
+; AVX1-NEXT:    movw %r9w, 6(%rdi)<br>
+; AVX1-NEXT:    movw %r8w, 2(%rdi)<br>
 ; AVX1-NEXT:    vzeroupper<br>
-; AVX1-NEXT:    callq __truncdfhf2@PLT<br>
-; AVX1-NEXT:    movw %ax, {{[-0-9]+}}(%r{{[sb]}}p) # 2-byte Spill<br>
-; AVX1-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload<br>
-; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0<br>
-; AVX1-NEXT:    vmovapd %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
-; AVX1-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]<br>
-; AVX1-NEXT:    vzeroupper<br>
-; AVX1-NEXT:    callq __truncdfhf2@PLT<br>
-; AVX1-NEXT:    movw %ax, {{[-0-9]+}}(%r{{[sb]}}p) # 2-byte Spill<br>
-; AVX1-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload<br>
-; AVX1-NEXT:    # xmm0 = mem[1,0]<br>
-; AVX1-NEXT:    callq __truncdfhf2@PLT<br>
-; AVX1-NEXT:    movl %eax, %r12d<br>
-; AVX1-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload<br>
-; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0<br>
-; AVX1-NEXT:    vmovapd %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
-; AVX1-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]<br>
-; AVX1-NEXT:    vzeroupper<br>
-; AVX1-NEXT:    callq __truncdfhf2@PLT<br>
-; AVX1-NEXT:    movl %eax, %r13d<br>
-; AVX1-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload<br>
-; AVX1-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0<br>
-; AVX1-NEXT:    vzeroupper<br>
-; AVX1-NEXT:    callq __truncdfhf2@PLT<br>
-; AVX1-NEXT:    movl %eax, %ebp<br>
-; AVX1-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
-; AVX1-NEXT:    callq __truncdfhf2@PLT<br>
-; AVX1-NEXT:    movl %eax, %r14d<br>
-; AVX1-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload<br>
-; AVX1-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0<br>
-; AVX1-NEXT:    vzeroupper<br>
-; AVX1-NEXT:    callq __truncdfhf2@PLT<br>
-; AVX1-NEXT:    movl %eax, %r15d<br>
-; AVX1-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
-; AVX1-NEXT:    callq __truncdfhf2@PLT<br>
-; AVX1-NEXT:    movw %ax, 12(%rbx)<br>
-; AVX1-NEXT:    movw %r15w, 8(%rbx)<br>
-; AVX1-NEXT:    movw %r14w, 4(%rbx)<br>
-; AVX1-NEXT:    movw %bp, (%rbx)<br>
-; AVX1-NEXT:    movw %r13w, 14(%rbx)<br>
-; AVX1-NEXT:    movw %r12w, 10(%rbx)<br>
-; AVX1-NEXT:    movzwl {{[-0-9]+}}(%r{{[sb]}}p), %eax # 2-byte Folded Reload<br>
-; AVX1-NEXT:    movw %ax, 6(%rbx)<br>
-; AVX1-NEXT:    movzwl {{[-0-9]+}}(%r{{[sb]}}p), %eax # 2-byte Folded Reload<br>
-; AVX1-NEXT:    movw %ax, 2(%rbx)<br>
-; AVX1-NEXT:    addq $120, %rsp<br>
-; AVX1-NEXT:    popq %rbx<br>
-; AVX1-NEXT:    popq %r12<br>
-; AVX1-NEXT:    popq %r13<br>
-; AVX1-NEXT:    popq %r14<br>
-; AVX1-NEXT:    popq %r15<br>
-; AVX1-NEXT:    popq %rbp<br>
 ; AVX1-NEXT:    retq<br>
 ;<br>
 ; AVX2-LABEL: store_cvt_8f64_to_8i16:<br>
 ; AVX2:       # %bb.0:<br>
-; AVX2-NEXT:    pushq %rbp<br>
-; AVX2-NEXT:    pushq %r15<br>
-; AVX2-NEXT:    pushq %r14<br>
-; AVX2-NEXT:    pushq %r13<br>
-; AVX2-NEXT:    pushq %r12<br>
-; AVX2-NEXT:    pushq %rbx<br>
-; AVX2-NEXT:    subq $120, %rsp<br>
-; AVX2-NEXT:    movq %rdi, %rbx<br>
-; AVX2-NEXT:    vmovups %ymm1, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill<br>
-; AVX2-NEXT:    vmovupd %ymm0, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill<br>
-; AVX2-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]<br>
+; AVX2-NEXT:    vpermilpd {{.*#+}} xmm2 = xmm0[1,0]<br>
+; AVX2-NEXT:    vcvtsd2ss %xmm2, %xmm2, %xmm2<br>
+; AVX2-NEXT:    vcvtps2ph $4, %xmm2, %xmm2<br>
+; AVX2-NEXT:    vmovd %xmm2, %r8d<br>
+; AVX2-NEXT:    vextractf128 $1, %ymm0, %xmm2<br>
+; AVX2-NEXT:    vpermilpd {{.*#+}} xmm3 = xmm2[1,0]<br>
+; AVX2-NEXT:    vcvtsd2ss %xmm3, %xmm3, %xmm3<br>
+; AVX2-NEXT:    vcvtps2ph $4, %xmm3, %xmm3<br>
+; AVX2-NEXT:    vmovd %xmm3, %r9d<br>
+; AVX2-NEXT:    vpermilpd {{.*#+}} xmm3 = xmm1[1,0]<br>
+; AVX2-NEXT:    vcvtsd2ss %xmm3, %xmm3, %xmm3<br>
+; AVX2-NEXT:    vcvtps2ph $4, %xmm3, %xmm3<br>
+; AVX2-NEXT:    vmovd %xmm3, %r10d<br>
+; AVX2-NEXT:    vextractf128 $1, %ymm1, %xmm3<br>
+; AVX2-NEXT:    vpermilpd {{.*#+}} xmm4 = xmm3[1,0]<br>
+; AVX2-NEXT:    vcvtsd2ss %xmm4, %xmm4, %xmm4<br>
+; AVX2-NEXT:    vcvtps2ph $4, %xmm4, %xmm4<br>
+; AVX2-NEXT:    vmovd %xmm4, %r11d<br>
+; AVX2-NEXT:    vcvtsd2ss %xmm0, %xmm0, %xmm0<br>
+; AVX2-NEXT:    vcvtps2ph $4, %xmm0, %xmm0<br>
+; AVX2-NEXT:    vmovd %xmm0, %eax<br>
+; AVX2-NEXT:    vcvtsd2ss %xmm2, %xmm2, %xmm0<br>
+; AVX2-NEXT:    vcvtps2ph $4, %xmm0, %xmm0<br>
+; AVX2-NEXT:    vmovd %xmm0, %ecx<br>
+; AVX2-NEXT:    vcvtsd2ss %xmm1, %xmm1, %xmm0<br>
+; AVX2-NEXT:    vcvtps2ph $4, %xmm0, %xmm0<br>
+; AVX2-NEXT:    vmovd %xmm0, %edx<br>
+; AVX2-NEXT:    vcvtsd2ss %xmm3, %xmm3, %xmm0<br>
+; AVX2-NEXT:    vcvtps2ph $4, %xmm0, %xmm0<br>
+; AVX2-NEXT:    vmovd %xmm0, %esi<br>
+; AVX2-NEXT:    movw %si, 12(%rdi)<br>
+; AVX2-NEXT:    movw %dx, 8(%rdi)<br>
+; AVX2-NEXT:    movw %cx, 4(%rdi)<br>
+; AVX2-NEXT:    movw %ax, (%rdi)<br>
+; AVX2-NEXT:    movw %r11w, 14(%rdi)<br>
+; AVX2-NEXT:    movw %r10w, 10(%rdi)<br>
+; AVX2-NEXT:    movw %r9w, 6(%rdi)<br>
+; AVX2-NEXT:    movw %r8w, 2(%rdi)<br>
 ; AVX2-NEXT:    vzeroupper<br>
-; AVX2-NEXT:    callq __truncdfhf2@PLT<br>
-; AVX2-NEXT:    movw %ax, {{[-0-9]+}}(%r{{[sb]}}p) # 2-byte Spill<br>
-; AVX2-NEXT:    vmovupd {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload<br>
-; AVX2-NEXT:    vextractf128 $1, %ymm0, %xmm0<br>
-; AVX2-NEXT:    vmovapd %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
-; AVX2-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]<br>
-; AVX2-NEXT:    vzeroupper<br>
-; AVX2-NEXT:    callq __truncdfhf2@PLT<br>
-; AVX2-NEXT:    movw %ax, {{[-0-9]+}}(%r{{[sb]}}p) # 2-byte Spill<br>
-; AVX2-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload<br>
-; AVX2-NEXT:    # xmm0 = mem[1,0]<br>
-; AVX2-NEXT:    callq __truncdfhf2@PLT<br>
-; AVX2-NEXT:    movl %eax, %r12d<br>
-; AVX2-NEXT:    vmovupd {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload<br>
-; AVX2-NEXT:    vextractf128 $1, %ymm0, %xmm0<br>
-; AVX2-NEXT:    vmovapd %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
-; AVX2-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]<br>
-; AVX2-NEXT:    vzeroupper<br>
-; AVX2-NEXT:    callq __truncdfhf2@PLT<br>
-; AVX2-NEXT:    movl %eax, %r13d<br>
-; AVX2-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload<br>
-; AVX2-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0<br>
-; AVX2-NEXT:    vzeroupper<br>
-; AVX2-NEXT:    callq __truncdfhf2@PLT<br>
-; AVX2-NEXT:    movl %eax, %ebp<br>
-; AVX2-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
-; AVX2-NEXT:    callq __truncdfhf2@PLT<br>
-; AVX2-NEXT:    movl %eax, %r14d<br>
-; AVX2-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload<br>
-; AVX2-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0<br>
-; AVX2-NEXT:    vzeroupper<br>
-; AVX2-NEXT:    callq __truncdfhf2@PLT<br>
-; AVX2-NEXT:    movl %eax, %r15d<br>
-; AVX2-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
-; AVX2-NEXT:    callq __truncdfhf2@PLT<br>
-; AVX2-NEXT:    movw %ax, 12(%rbx)<br>
-; AVX2-NEXT:    movw %r15w, 8(%rbx)<br>
-; AVX2-NEXT:    movw %r14w, 4(%rbx)<br>
-; AVX2-NEXT:    movw %bp, (%rbx)<br>
-; AVX2-NEXT:    movw %r13w, 14(%rbx)<br>
-; AVX2-NEXT:    movw %r12w, 10(%rbx)<br>
-; AVX2-NEXT:    movzwl {{[-0-9]+}}(%r{{[sb]}}p), %eax # 2-byte Folded Reload<br>
-; AVX2-NEXT:    movw %ax, 6(%rbx)<br>
-; AVX2-NEXT:    movzwl {{[-0-9]+}}(%r{{[sb]}}p), %eax # 2-byte Folded Reload<br>
-; AVX2-NEXT:    movw %ax, 2(%rbx)<br>
-; AVX2-NEXT:    addq $120, %rsp<br>
-; AVX2-NEXT:    popq %rbx<br>
-; AVX2-NEXT:    popq %r12<br>
-; AVX2-NEXT:    popq %r13<br>
-; AVX2-NEXT:    popq %r14<br>
-; AVX2-NEXT:    popq %r15<br>
-; AVX2-NEXT:    popq %rbp<br>
 ; AVX2-NEXT:    retq<br>
 ;<br>
 ; AVX512-LABEL: store_cvt_8f64_to_8i16:<br>
 ; AVX512:       # %bb.0:<br>
-; AVX512-NEXT:    pushq %rbp<br>
-; AVX512-NEXT:    pushq %r15<br>
-; AVX512-NEXT:    pushq %r14<br>
-; AVX512-NEXT:    pushq %r13<br>
-; AVX512-NEXT:    pushq %r12<br>
-; AVX512-NEXT:    pushq %rbx<br>
-; AVX512-NEXT:    subq $152, %rsp<br>
-; AVX512-NEXT:    movq %rdi, %rbx<br>
-; AVX512-NEXT:    vmovupd %zmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 64-byte Spill<br>
-; AVX512-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]<br>
-; AVX512-NEXT:    vzeroupper<br>
-; AVX512-NEXT:    callq __truncdfhf2@PLT<br>
-; AVX512-NEXT:    movw %ax, {{[-0-9]+}}(%r{{[sb]}}p) # 2-byte Spill<br>
-; AVX512-NEXT:    vmovupd {{[-0-9]+}}(%r{{[sb]}}p), %zmm0 # 64-byte Reload<br>
-; AVX512-NEXT:    vextractf128 $1, %ymm0, %xmm0<br>
-; AVX512-NEXT:    vmovapd %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
-; AVX512-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]<br>
-; AVX512-NEXT:    vzeroupper<br>
-; AVX512-NEXT:    callq __truncdfhf2@PLT<br>
-; AVX512-NEXT:    movw %ax, {{[-0-9]+}}(%r{{[sb]}}p) # 2-byte Spill<br>
-; AVX512-NEXT:    vmovupd {{[-0-9]+}}(%r{{[sb]}}p), %zmm0 # 64-byte Reload<br>
-; AVX512-NEXT:    vextractf64x4 $1, %zmm0, %ymm0<br>
-; AVX512-NEXT:    vmovupd %ymm0, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill<br>
-; AVX512-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]<br>
-; AVX512-NEXT:    vzeroupper<br>
-; AVX512-NEXT:    callq __truncdfhf2@PLT<br>
-; AVX512-NEXT:    movl %eax, %r12d<br>
-; AVX512-NEXT:    vmovupd {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload<br>
-; AVX512-NEXT:    vextractf128 $1, %ymm0, %xmm0<br>
-; AVX512-NEXT:    vmovapd %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
-; AVX512-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]<br>
-; AVX512-NEXT:    vzeroupper<br>
-; AVX512-NEXT:    callq __truncdfhf2@PLT<br>
-; AVX512-NEXT:    movl %eax, %r13d<br>
-; AVX512-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %zmm0 # 64-byte Reload<br>
-; AVX512-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0<br>
-; AVX512-NEXT:    vzeroupper<br>
-; AVX512-NEXT:    callq __truncdfhf2@PLT<br>
-; AVX512-NEXT:    movl %eax, %ebp<br>
-; AVX512-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
-; AVX512-NEXT:    callq __truncdfhf2@PLT<br>
-; AVX512-NEXT:    movl %eax, %r14d<br>
-; AVX512-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload<br>
-; AVX512-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0<br>
+; AVX512-NEXT:    vpermilpd {{.*#+}} xmm1 = xmm0[1,0]<br>
+; AVX512-NEXT:    vcvtsd2ss %xmm1, %xmm1, %xmm1<br>
+; AVX512-NEXT:    vcvtps2ph $4, %xmm1, %xmm1<br>
+; AVX512-NEXT:    vmovd %xmm1, %r8d<br>
+; AVX512-NEXT:    vextractf128 $1, %ymm0, %xmm1<br>
+; AVX512-NEXT:    vpermilpd {{.*#+}} xmm2 = xmm1[1,0]<br>
+; AVX512-NEXT:    vcvtsd2ss %xmm2, %xmm2, %xmm2<br>
+; AVX512-NEXT:    vcvtps2ph $4, %xmm2, %xmm2<br>
+; AVX512-NEXT:    vmovd %xmm2, %r9d<br>
+; AVX512-NEXT:    vextractf64x4 $1, %zmm0, %ymm2<br>
+; AVX512-NEXT:    vpermilpd {{.*#+}} xmm3 = xmm2[1,0]<br>
+; AVX512-NEXT:    vcvtsd2ss %xmm3, %xmm3, %xmm3<br>
+; AVX512-NEXT:    vcvtps2ph $4, %xmm3, %xmm3<br>
+; AVX512-NEXT:    vmovd %xmm3, %r10d<br>
+; AVX512-NEXT:    vextractf128 $1, %ymm2, %xmm3<br>
+; AVX512-NEXT:    vpermilpd {{.*#+}} xmm4 = xmm3[1,0]<br>
+; AVX512-NEXT:    vcvtsd2ss %xmm4, %xmm4, %xmm4<br>
+; AVX512-NEXT:    vcvtps2ph $4, %xmm4, %xmm4<br>
+; AVX512-NEXT:    vmovd %xmm4, %r11d<br>
+; AVX512-NEXT:    vcvtsd2ss %xmm0, %xmm0, %xmm0<br>
+; AVX512-NEXT:    vcvtps2ph $4, %xmm0, %xmm0<br>
+; AVX512-NEXT:    vmovd %xmm0, %eax<br>
+; AVX512-NEXT:    vcvtsd2ss %xmm1, %xmm1, %xmm0<br>
+; AVX512-NEXT:    vcvtps2ph $4, %xmm0, %xmm0<br>
+; AVX512-NEXT:    vmovd %xmm0, %ecx<br>
+; AVX512-NEXT:    vcvtsd2ss %xmm2, %xmm2, %xmm0<br>
+; AVX512-NEXT:    vcvtps2ph $4, %xmm0, %xmm0<br>
+; AVX512-NEXT:    vmovd %xmm0, %edx<br>
+; AVX512-NEXT:    vcvtsd2ss %xmm3, %xmm3, %xmm0<br>
+; AVX512-NEXT:    vcvtps2ph $4, %xmm0, %xmm0<br>
+; AVX512-NEXT:    vmovd %xmm0, %esi<br>
+; AVX512-NEXT:    movw %si, 12(%rdi)<br>
+; AVX512-NEXT:    movw %dx, 8(%rdi)<br>
+; AVX512-NEXT:    movw %cx, 4(%rdi)<br>
+; AVX512-NEXT:    movw %ax, (%rdi)<br>
+; AVX512-NEXT:    movw %r11w, 14(%rdi)<br>
+; AVX512-NEXT:    movw %r10w, 10(%rdi)<br>
+; AVX512-NEXT:    movw %r9w, 6(%rdi)<br>
+; AVX512-NEXT:    movw %r8w, 2(%rdi)<br>
 ; AVX512-NEXT:    vzeroupper<br>
-; AVX512-NEXT:    callq __truncdfhf2@PLT<br>
-; AVX512-NEXT:    movl %eax, %r15d<br>
-; AVX512-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
-; AVX512-NEXT:    callq __truncdfhf2@PLT<br>
-; AVX512-NEXT:    movw %ax, 12(%rbx)<br>
-; AVX512-NEXT:    movw %r15w, 8(%rbx)<br>
-; AVX512-NEXT:    movw %r14w, 4(%rbx)<br>
-; AVX512-NEXT:    movw %bp, (%rbx)<br>
-; AVX512-NEXT:    movw %r13w, 14(%rbx)<br>
-; AVX512-NEXT:    movw %r12w, 10(%rbx)<br>
-; AVX512-NEXT:    movzwl {{[-0-9]+}}(%r{{[sb]}}p), %eax # 2-byte Folded Reload<br>
-; AVX512-NEXT:    movw %ax, 6(%rbx)<br>
-; AVX512-NEXT:    movzwl {{[-0-9]+}}(%r{{[sb]}}p), %eax # 2-byte Folded Reload<br>
-; AVX512-NEXT:    movw %ax, 2(%rbx)<br>
-; AVX512-NEXT:    addq $152, %rsp<br>
-; AVX512-NEXT:    popq %rbx<br>
-; AVX512-NEXT:    popq %r12<br>
-; AVX512-NEXT:    popq %r13<br>
-; AVX512-NEXT:    popq %r14<br>
-; AVX512-NEXT:    popq %r15<br>
-; AVX512-NEXT:    popq %rbp<br>
 ; AVX512-NEXT:    retq<br>
   %1 = fptrunc <8 x double> %a0 to <8 x half><br>
   %2 = bitcast <8 x half> %1 to <8 x i16><br>
<br>
diff  --git a/llvm/test/CodeGen/X86/vector-reduce-fmax-nnan.ll b/llvm/test/CodeGen/X86/vector-reduce-fmax-nnan.ll<br>
index b1d30090cc6d8..00af4c60ef0c7 100644<br>
--- a/llvm/test/CodeGen/X86/vector-reduce-fmax-nnan.ll<br>
+++ b/llvm/test/CodeGen/X86/vector-reduce-fmax-nnan.ll<br>
@@ -368,69 +368,58 @@ define half @test_v2f16(<2 x half> %a0) nounwind {<br>
 ; SSE-LABEL: test_v2f16:<br>
 ; SSE:       # %bb.0:<br>
 ; SSE-NEXT:    pushq %rbp<br>
-; SSE-NEXT:    pushq %r14<br>
 ; SSE-NEXT:    pushq %rbx<br>
-; SSE-NEXT:    subq $16, %rsp<br>
-; SSE-NEXT:    movl %esi, %ebx<br>
-; SSE-NEXT:    movl %edi, %r14d<br>
-; SSE-NEXT:    movzwl %bx, %ebp<br>
-; SSE-NEXT:    movl %ebp, %edi<br>
-; SSE-NEXT:    callq __gnu_h2f_ieee@PLT<br>
-; SSE-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; SSE-NEXT:    movzwl %r14w, %edi<br>
-; SSE-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; SSE-NEXT:    subq $40, %rsp<br>
+; SSE-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; SSE-NEXT:    pextrw $0, %xmm1, %ebx<br>
+; SSE-NEXT:    pextrw $0, %xmm0, %ebp<br>
+; SSE-NEXT:    movdqa %xmm1, %xmm0<br>
+; SSE-NEXT:    callq __extendhfsf2@PLT<br>
+; SSE-NEXT:    movd %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Folded Spill<br>
+; SSE-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; SSE-NEXT:    callq __extendhfsf2@PLT<br>
 ; SSE-NEXT:    ucomiss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload<br>
-; SSE-NEXT:    movw %bp, {{[0-9]+}}(%rsp)<br>
-; SSE-NEXT:    cmoval %r14d, %ebx<br>
-; SSE-NEXT:    movw %bx, (%rsp)<br>
-; SSE-NEXT:    movl (%rsp), %eax<br>
-; SSE-NEXT:    # kill: def $ax killed $ax killed $eax<br>
-; SSE-NEXT:    addq $16, %rsp<br>
+; SSE-NEXT:    cmoval %ebp, %ebx<br>
+; SSE-NEXT:    pinsrw $0, %ebx, %xmm0<br>
+; SSE-NEXT:    addq $40, %rsp<br>
 ; SSE-NEXT:    popq %rbx<br>
-; SSE-NEXT:    popq %r14<br>
 ; SSE-NEXT:    popq %rbp<br>
 ; SSE-NEXT:    retq<br>
 ;<br>
 ; AVX-LABEL: test_v2f16:<br>
 ; AVX:       # %bb.0:<br>
 ; AVX-NEXT:    pushq %rbp<br>
-; AVX-NEXT:    pushq %r14<br>
 ; AVX-NEXT:    pushq %rbx<br>
-; AVX-NEXT:    subq $16, %rsp<br>
-; AVX-NEXT:    movl %esi, %ebx<br>
-; AVX-NEXT:    movl %edi, %r14d<br>
-; AVX-NEXT:    movzwl %bx, %ebp<br>
-; AVX-NEXT:    movl %ebp, %edi<br>
-; AVX-NEXT:    callq __gnu_h2f_ieee@PLT<br>
-; AVX-NEXT:    vmovss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; AVX-NEXT:    movzwl %r14w, %edi<br>
-; AVX-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; AVX-NEXT:    subq $40, %rsp<br>
+; AVX-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; AVX-NEXT:    vpextrw $0, %xmm1, %ebx<br>
+; AVX-NEXT:    vpextrw $0, %xmm0, %ebp<br>
+; AVX-NEXT:    vmovdqa %xmm1, %xmm0<br>
+; AVX-NEXT:    callq __extendhfsf2@PLT<br>
+; AVX-NEXT:    vmovd %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Folded Spill<br>
+; AVX-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; AVX-NEXT:    callq __extendhfsf2@PLT<br>
 ; AVX-NEXT:    vucomiss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload<br>
-; AVX-NEXT:    movw %bp, {{[0-9]+}}(%rsp)<br>
-; AVX-NEXT:    cmoval %r14d, %ebx<br>
-; AVX-NEXT:    movw %bx, (%rsp)<br>
-; AVX-NEXT:    movl (%rsp), %eax<br>
-; AVX-NEXT:    # kill: def $ax killed $ax killed $eax<br>
-; AVX-NEXT:    addq $16, %rsp<br>
+; AVX-NEXT:    cmoval %ebp, %ebx<br>
+; AVX-NEXT:    vpinsrw $0, %ebx, %xmm0, %xmm0<br>
+; AVX-NEXT:    addq $40, %rsp<br>
 ; AVX-NEXT:    popq %rbx<br>
-; AVX-NEXT:    popq %r14<br>
 ; AVX-NEXT:    popq %rbp<br>
 ; AVX-NEXT:    retq<br>
 ;<br>
 ; AVX512BW-LABEL: test_v2f16:<br>
 ; AVX512BW:       # %bb.0:<br>
-; AVX512BW-NEXT:    movzwl %si, %eax<br>
-; AVX512BW-NEXT:    vmovd %eax, %xmm0<br>
+; AVX512BW-NEXT:    vpextrw $0, %xmm0, %eax<br>
+; AVX512BW-NEXT:    vpextrw $0, %xmm1, %ecx<br>
+; AVX512BW-NEXT:    movzwl %cx, %ecx<br>
+; AVX512BW-NEXT:    vmovd %ecx, %xmm0<br>
 ; AVX512BW-NEXT:    vcvtph2ps %xmm0, %xmm0<br>
-; AVX512BW-NEXT:    movzwl %di, %ecx<br>
-; AVX512BW-NEXT:    vmovd %ecx, %xmm1<br>
+; AVX512BW-NEXT:    movzwl %ax, %eax<br>
+; AVX512BW-NEXT:    vmovd %eax, %xmm1<br>
 ; AVX512BW-NEXT:    vcvtph2ps %xmm1, %xmm1<br>
 ; AVX512BW-NEXT:    vucomiss %xmm0, %xmm1<br>
-; AVX512BW-NEXT:    movw %ax, -{{[0-9]+}}(%rsp)<br>
-; AVX512BW-NEXT:    cmoval %edi, %esi<br>
-; AVX512BW-NEXT:    movw %si, -{{[0-9]+}}(%rsp)<br>
-; AVX512BW-NEXT:    movl -{{[0-9]+}}(%rsp), %eax<br>
-; AVX512BW-NEXT:    # kill: def $ax killed $ax killed $eax<br>
+; AVX512BW-NEXT:    cmoval %eax, %ecx<br>
+; AVX512BW-NEXT:    vpinsrw $0, %ecx, %xmm0, %xmm0<br>
 ; AVX512BW-NEXT:    retq<br>
 ;<br>
 ; AVX512FP16-LABEL: test_v2f16:<br>
<br>
diff  --git a/llvm/test/CodeGen/X86/vector-reduce-fmin-nnan.ll b/llvm/test/CodeGen/X86/vector-reduce-fmin-nnan.ll<br>
index 50c805d37ddb7..d06b34a6e17ee 100644<br>
--- a/llvm/test/CodeGen/X86/vector-reduce-fmin-nnan.ll<br>
+++ b/llvm/test/CodeGen/X86/vector-reduce-fmin-nnan.ll<br>
@@ -367,69 +367,58 @@ define half @test_v2f16(<2 x half> %a0) nounwind {<br>
 ; SSE-LABEL: test_v2f16:<br>
 ; SSE:       # %bb.0:<br>
 ; SSE-NEXT:    pushq %rbp<br>
-; SSE-NEXT:    pushq %r14<br>
 ; SSE-NEXT:    pushq %rbx<br>
-; SSE-NEXT:    subq $16, %rsp<br>
-; SSE-NEXT:    movl %esi, %ebx<br>
-; SSE-NEXT:    movl %edi, %r14d<br>
-; SSE-NEXT:    movzwl %bx, %ebp<br>
-; SSE-NEXT:    movl %ebp, %edi<br>
-; SSE-NEXT:    callq __gnu_h2f_ieee@PLT<br>
-; SSE-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; SSE-NEXT:    movzwl %r14w, %edi<br>
-; SSE-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; SSE-NEXT:    subq $40, %rsp<br>
+; SSE-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; SSE-NEXT:    pextrw $0, %xmm1, %ebx<br>
+; SSE-NEXT:    pextrw $0, %xmm0, %ebp<br>
+; SSE-NEXT:    movdqa %xmm1, %xmm0<br>
+; SSE-NEXT:    callq __extendhfsf2@PLT<br>
+; SSE-NEXT:    movd %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Folded Spill<br>
+; SSE-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; SSE-NEXT:    callq __extendhfsf2@PLT<br>
 ; SSE-NEXT:    ucomiss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload<br>
-; SSE-NEXT:    movw %bp, {{[0-9]+}}(%rsp)<br>
-; SSE-NEXT:    cmovbl %r14d, %ebx<br>
-; SSE-NEXT:    movw %bx, (%rsp)<br>
-; SSE-NEXT:    movl (%rsp), %eax<br>
-; SSE-NEXT:    # kill: def $ax killed $ax killed $eax<br>
-; SSE-NEXT:    addq $16, %rsp<br>
+; SSE-NEXT:    cmovbl %ebp, %ebx<br>
+; SSE-NEXT:    pinsrw $0, %ebx, %xmm0<br>
+; SSE-NEXT:    addq $40, %rsp<br>
 ; SSE-NEXT:    popq %rbx<br>
-; SSE-NEXT:    popq %r14<br>
 ; SSE-NEXT:    popq %rbp<br>
 ; SSE-NEXT:    retq<br>
 ;<br>
 ; AVX-LABEL: test_v2f16:<br>
 ; AVX:       # %bb.0:<br>
 ; AVX-NEXT:    pushq %rbp<br>
-; AVX-NEXT:    pushq %r14<br>
 ; AVX-NEXT:    pushq %rbx<br>
-; AVX-NEXT:    subq $16, %rsp<br>
-; AVX-NEXT:    movl %esi, %ebx<br>
-; AVX-NEXT:    movl %edi, %r14d<br>
-; AVX-NEXT:    movzwl %bx, %ebp<br>
-; AVX-NEXT:    movl %ebp, %edi<br>
-; AVX-NEXT:    callq __gnu_h2f_ieee@PLT<br>
-; AVX-NEXT:    vmovss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill<br>
-; AVX-NEXT:    movzwl %r14w, %edi<br>
-; AVX-NEXT:    callq __gnu_h2f_ieee@PLT<br>
+; AVX-NEXT:    subq $40, %rsp<br>
+; AVX-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill<br>
+; AVX-NEXT:    vpextrw $0, %xmm1, %ebx<br>
+; AVX-NEXT:    vpextrw $0, %xmm0, %ebp<br>
+; AVX-NEXT:    vmovdqa %xmm1, %xmm0<br>
+; AVX-NEXT:    callq __extendhfsf2@PLT<br>
+; AVX-NEXT:    vmovd %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Folded Spill<br>
+; AVX-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload<br>
+; AVX-NEXT:    callq __extendhfsf2@PLT<br>
 ; AVX-NEXT:    vucomiss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload<br>
-; AVX-NEXT:    movw %bp, {{[0-9]+}}(%rsp)<br>
-; AVX-NEXT:    cmovbl %r14d, %ebx<br>
-; AVX-NEXT:    movw %bx, (%rsp)<br>
-; AVX-NEXT:    movl (%rsp), %eax<br>
-; AVX-NEXT:    # kill: def $ax killed $ax killed $eax<br>
-; AVX-NEXT:    addq $16, %rsp<br>
+; AVX-NEXT:    cmovbl %ebp, %ebx<br>
+; AVX-NEXT:    vpinsrw $0, %ebx, %xmm0, %xmm0<br>
+; AVX-NEXT:    addq $40, %rsp<br>
 ; AVX-NEXT:    popq %rbx<br>
-; AVX-NEXT:    popq %r14<br>
 ; AVX-NEXT:    popq %rbp<br>
 ; AVX-NEXT:    retq<br>
 ;<br>
 ; AVX512BW-LABEL: test_v2f16:<br>
 ; AVX512BW:       # %bb.0:<br>
-; AVX512BW-NEXT:    movzwl %si, %eax<br>
-; AVX512BW-NEXT:    vmovd %eax, %xmm0<br>
+; AVX512BW-NEXT:    vpextrw $0, %xmm0, %eax<br>
+; AVX512BW-NEXT:    vpextrw $0, %xmm1, %ecx<br>
+; AVX512BW-NEXT:    movzwl %cx, %ecx<br>
+; AVX512BW-NEXT:    vmovd %ecx, %xmm0<br>
 ; AVX512BW-NEXT:    vcvtph2ps %xmm0, %xmm0<br>
-; AVX512BW-NEXT:    movzwl %di, %ecx<br>
-; AVX512BW-NEXT:    vmovd %ecx, %xmm1<br>
+; AVX512BW-NEXT:    movzwl %ax, %eax<br>
+; AVX512BW-NEXT:    vmovd %eax, %xmm1<br>
 ; AVX512BW-NEXT:    vcvtph2ps %xmm1, %xmm1<br>
 ; AVX512BW-NEXT:    vucomiss %xmm0, %xmm1<br>
-; AVX512BW-NEXT:    movw %ax, -{{[0-9]+}}(%rsp)<br>
-; AVX512BW-NEXT:    cmovbl %edi, %esi<br>
-; AVX512BW-NEXT:    movw %si, -{{[0-9]+}}(%rsp)<br>
-; AVX512BW-NEXT:    movl -{{[0-9]+}}(%rsp), %eax<br>
-; AVX512BW-NEXT:    # kill: def $ax killed $ax killed $eax<br>
+; AVX512BW-NEXT:    cmovbl %eax, %ecx<br>
+; AVX512BW-NEXT:    vpinsrw $0, %ecx, %xmm0, %xmm0<br>
 ; AVX512BW-NEXT:    retq<br>
 ;<br>
 ; AVX512FP16-LABEL: test_v2f16:<br>
<br>
diff  --git a/llvm/test/MC/X86/x86_64-asm-match.s b/llvm/test/MC/X86/x86_64-asm-match.s<br>
index 7e1c2b42007e3..74f92118f3c9e 100644<br>
--- a/llvm/test/MC/X86/x86_64-asm-match.s<br>
+++ b/llvm/test/MC/X86/x86_64-asm-match.s<br>
@@ -5,16 +5,16 @@<br>
 // CHECK: Trying to match opcode MMX_PSHUFBrr<br>
 // CHECK:   Matching formal operand class MCK_VR64 against actual operand at index 1 (Memory: ModeSize=64,BaseReg=rip,Scale=1,Disp=CPI1_0): Opcode result: multiple operand mismatches, ignoring this opcode<br>
 // CHECK: Trying to match opcode PSHUFBrr<br>
-// CHECK:   Matching formal operand class MCK_FR32 against actual operand at index 1 (Memory: ModeSize=64,BaseReg=rip,Scale=1,Disp=CPI1_0): Opcode result: multiple operand mismatches, ignoring this opcode<br>
+// CHECK:   Matching formal operand class MCK_FR16 against actual operand at index 1 (Memory: ModeSize=64,BaseReg=rip,Scale=1,Disp=CPI1_0): Opcode result: multiple operand mismatches, ignoring this opcode<br>
 // CHECK: Trying to match opcode PSHUFBrm<br>
 // CHECK:   Matching formal operand class MCK_Mem128 against actual operand at index 1 (Memory: ModeSize=64,BaseReg=rip,Scale=1,Disp=CPI1_0): match success using generic matcher<br>
-// CHECK:   Matching formal operand class MCK_FR32 against actual operand at index 2 (Reg:xmm1): match success using generic matcher<br>
+// CHECK:   Matching formal operand class MCK_FR16 against actual operand at index 2 (Reg:xmm1): match success using generic matcher<br>
 // CHECK:   Matching formal operand class InvalidMatchClass against actual operand at index 3: actual operand index out of range Opcode result: complete match, selecting this opcode<br>
 // CHECK: AsmMatcher: found 2 encodings with mnemonic 'sha1rnds4'<br>
 // CHECK: Trying to match opcode SHA1RNDS4rri<br>
 // CHECK:   Matching formal operand class MCK_ImmUnsignedi8 against actual operand at index 1 (Imm:1): match success using generic matcher<br>
-// CHECK:   Matching formal operand class MCK_FR32 against actual operand at index 2 (Reg:xmm1): match success using generic matcher<br>
-// CHECK:   Matching formal operand class MCK_FR32 against actual operand at index 3 (Reg:xmm2): match success using generic matcher<br>
+// CHECK:   Matching formal operand class MCK_FR16 against actual operand at index 2 (Reg:xmm1): match success using generic matcher<br>
+// CHECK:   Matching formal operand class MCK_FR16 against actual operand at index 3 (Reg:xmm2): match success using generic matcher<br>
 // CHECK:   Matching formal operand class InvalidMatchClass against actual operand at index 4: actual operand index out of range Opcode result: complete match, selecting this opcode<br>
 // CHECK: AsmMatcher: found 4 encodings with mnemonic 'pinsrw'<br>
 // CHECK: Trying to match opcode MMX_PINSRWrr<br>
@@ -24,7 +24,7 @@<br>
 // CHECK: Trying to match opcode PINSRWrr<br>
 // CHECK:   Matching formal operand class MCK_ImmUnsignedi8 against actual operand at index 1 (Imm:3): match success using generic matcher<br>
 // CHECK:   Matching formal operand class MCK_GR32orGR64 against actual operand at index 2 (Reg:ecx): match success using generic matcher<br>
-// CHECK:   Matching formal operand class MCK_FR32 against actual operand at index 3 (Reg:xmm5): match success using generic matcher<br>
+// CHECK:   Matching formal operand class MCK_FR16 against actual operand at index 3 (Reg:xmm5): match success using generic matcher<br>
 // CHECK:   Matching formal operand class InvalidMatchClass against actual operand at index 4: actual operand index out of range Opcode result: complete match, selecting this opcode<br>
 // CHECK: AsmMatcher: found 2 encodings with mnemonic 'crc32l'<br>
 // CHECK: Trying to match opcode CRC32r32r32<br>
<br>
diff  --git a/mlir/test/Integration/Dialect/SparseTensor/CPU/dense_output_f16.mlir b/mlir/test/Integration/Dialect/SparseTensor/CPU/dense_output_f16.mlir<br>
index ec15477bb5800..9fd8701ca701e 100644<br>
--- a/mlir/test/Integration/Dialect/SparseTensor/CPU/dense_output_f16.mlir<br>
+++ b/mlir/test/Integration/Dialect/SparseTensor/CPU/dense_output_f16.mlir<br>
@@ -1,3 +1,5 @@<br>
+// FIXME: The runtime needs support for _Float16 on X86, see PR55992<br>
+// UNSUPPORTED: i386, x86_64<br>
 // RUN: mlir-opt %s --sparse-compiler | \<br>
 // RUN: mlir-cpu-runner \<br>
 // RUN:  -e entry -entry-point-result=void  \<br>
<br>
diff  --git a/mlir/test/Integration/Dialect/SparseTensor/CPU/sparse_sum_f16.mlir b/mlir/test/Integration/Dialect/SparseTensor/CPU/sparse_sum_f16.mlir<br>
index 9f107cfeeb72a..3ab7d6d7e657f 100644<br>
--- a/mlir/test/Integration/Dialect/SparseTensor/CPU/sparse_sum_f16.mlir<br>
+++ b/mlir/test/Integration/Dialect/SparseTensor/CPU/sparse_sum_f16.mlir<br>
@@ -1,4 +1,6 @@<br>
- // RUN: mlir-opt %s --sparse-compiler | \<br>
+// FIXME: The runtime needs support for _Float16 on X86, see PR55992<br>
+// UNSUPPORTED: i386, x86_64<br>
+// RUN: mlir-opt %s --sparse-compiler | \<br>
 // RUN: mlir-cpu-runner \<br>
 // RUN:  -e entry -entry-point-result=void  \<br>
 // RUN:  -shared-libs=%mlir_integration_test_dir/libmlir_c_runner_utils%shlibext | \<br>
<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a><br>
<a href="https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" target="_blank">https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><o:p></o:p></p>
</blockquote>
</div>
</div>
</body>
</html>