~ubuntu-branches/ubuntu/wily/clamav/wily-proposed

« back to all changes in this revision

Viewing changes to libclamav/c++/llvm/lib/Target/X86/X86ISelLowering.cpp

  • Committer: Package Import Robot
  • Author(s): Scott Kitterman, Sebastian Andrzej Siewior, Andreas Cadhalpun, Scott Kitterman, Javier Fernández-Sanguino
  • Date: 2015-01-28 00:25:13 UTC
  • mfrom: (0.48.14 sid)
  • Revision ID: package-import@ubuntu.com-20150128002513-lil2oi74cooy4lzr
Tags: 0.98.6+dfsg-1
[ Sebastian Andrzej Siewior ]
* update "fix-ssize_t-size_t-off_t-printf-modifier", include of misc.h was
  missing but was pulled in via the systemd patch.
* Don't leak return codes from libmspack to clamav API. (Closes: #774686).

[ Andreas Cadhalpun ]
* Add patch to avoid emitting incremental progress messages when not
  outputting to a terminal. (Closes: #767350)
* Update lintian-overrides for unused-file-paragraph-in-dep5-copyright.
* clamav-base.postinst: always chown /var/log/clamav and /var/lib/clamav
  to clamav:clamav, not only on fresh installations. (Closes: #775400)
* Adapt the clamav-daemon and clamav-freshclam logrotate scripts,
  so that they correctly work under systemd.
* Move the PidFile variable from the clamd/freshclam configuration files
  to the init scripts. This makes the init scripts more robust against
  misconfiguration and avoids error messages with systemd. (Closes: #767353)
* debian/copyright: drop files from Files-Excluded only present in github
  tarballs
* Drop Workaround-a-bug-in-libc-on-Hurd.patch, because hurd got fixed.
  (see #752237)
* debian/rules: Remove useless --with-system-tommath --without-included-ltdl
  configure options.

[ Scott Kitterman ]
* Stop stripping llvm when repacking the tarball as the system llvm on some
  releases is too old to use
* New upstream bugfix release
  - Library shared object revisions.
  - Includes a patch from Sebastian Andrzej Siewior making ClamAV pid files
    compatible with systemd.
  - Fix a heap out of bounds condition with crafted Yoda's crypter files.
    This issue was discovered by Felix Groebert of the Google Security Team.
  - Fix a heap out of bounds condition with crafted mew packer files. This
    issue was discovered by Felix Groebert of the Google Security Team.
  - Fix a heap out of bounds condition with crafted upx packer files. This
    issue was discovered by Kevin Szkudlapski of Quarkslab.
  - Fix a heap out of bounds condition with crafted upack packer files. This
    issue was discovered by Sebastian Andrzej Siewior. CVE-2014-9328.
  - Compensate a crash due to incorrect compiler optimization when handling
    crafted petite packer files. This issue was discovered by Sebastian
    Andrzej Siewior.
* Update lintian override for embedded zlib to match new so version

[ Javier Fernández-Sanguino ]
* Updated Spanish Debconf template translation (Closes: #773563)

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
//===-- X86ISelLowering.cpp - X86 DAG Lowering Implementation -------------===//
 
2
//
 
3
//                     The LLVM Compiler Infrastructure
 
4
//
 
5
// This file is distributed under the University of Illinois Open Source
 
6
// License. See LICENSE.TXT for details.
 
7
//
 
8
//===----------------------------------------------------------------------===//
 
9
//
 
10
// This file defines the interfaces that X86 uses to lower LLVM code into a
 
11
// selection DAG.
 
12
//
 
13
//===----------------------------------------------------------------------===//
 
14
 
 
15
#define DEBUG_TYPE "x86-isel"
 
16
#include "X86.h"
 
17
#include "X86InstrBuilder.h"
 
18
#include "X86ISelLowering.h"
 
19
#include "X86ShuffleDecode.h"
 
20
#include "X86TargetMachine.h"
 
21
#include "X86TargetObjectFile.h"
 
22
#include "llvm/CallingConv.h"
 
23
#include "llvm/Constants.h"
 
24
#include "llvm/DerivedTypes.h"
 
25
#include "llvm/GlobalAlias.h"
 
26
#include "llvm/GlobalVariable.h"
 
27
#include "llvm/Function.h"
 
28
#include "llvm/Instructions.h"
 
29
#include "llvm/Intrinsics.h"
 
30
#include "llvm/LLVMContext.h"
 
31
#include "llvm/CodeGen/MachineFrameInfo.h"
 
32
#include "llvm/CodeGen/MachineFunction.h"
 
33
#include "llvm/CodeGen/MachineInstrBuilder.h"
 
34
#include "llvm/CodeGen/MachineJumpTableInfo.h"
 
35
#include "llvm/CodeGen/MachineModuleInfo.h"
 
36
#include "llvm/CodeGen/MachineRegisterInfo.h"
 
37
#include "llvm/CodeGen/PseudoSourceValue.h"
 
38
#include "llvm/MC/MCAsmInfo.h"
 
39
#include "llvm/MC/MCContext.h"
 
40
#include "llvm/MC/MCExpr.h"
 
41
#include "llvm/MC/MCSymbol.h"
 
42
#include "llvm/ADT/BitVector.h"
 
43
#include "llvm/ADT/SmallSet.h"
 
44
#include "llvm/ADT/Statistic.h"
 
45
#include "llvm/ADT/StringExtras.h"
 
46
#include "llvm/ADT/VectorExtras.h"
 
47
#include "llvm/Support/CommandLine.h"
 
48
#include "llvm/Support/Debug.h"
 
49
#include "llvm/Support/Dwarf.h"
 
50
#include "llvm/Support/ErrorHandling.h"
 
51
#include "llvm/Support/MathExtras.h"
 
52
#include "llvm/Support/raw_ostream.h"
 
53
using namespace llvm;
 
54
using namespace dwarf;
 
55
 
 
56
STATISTIC(NumTailCalls, "Number of tail calls");
 
57
 
 
58
static cl::opt<bool>
 
59
DisableMMX("disable-mmx", cl::Hidden, cl::desc("Disable use of MMX"));
 
60
 
 
61
// Forward declarations.
 
62
static SDValue getMOVL(SelectionDAG &DAG, DebugLoc dl, EVT VT, SDValue V1,
 
63
                       SDValue V2);
 
64
 
 
65
static TargetLoweringObjectFile *createTLOF(X86TargetMachine &TM) {
 
66
  
 
67
  bool is64Bit = TM.getSubtarget<X86Subtarget>().is64Bit();
 
68
  
 
69
  if (TM.getSubtarget<X86Subtarget>().isTargetDarwin()) {
 
70
    if (is64Bit) return new X8664_MachoTargetObjectFile();
 
71
    return new TargetLoweringObjectFileMachO();
 
72
  } else if (TM.getSubtarget<X86Subtarget>().isTargetELF() ){
 
73
    if (is64Bit) return new X8664_ELFTargetObjectFile(TM);
 
74
    return new X8632_ELFTargetObjectFile(TM);
 
75
  } else if (TM.getSubtarget<X86Subtarget>().isTargetCOFF()) {
 
76
    return new TargetLoweringObjectFileCOFF();
 
77
  }  
 
78
  llvm_unreachable("unknown subtarget type");
 
79
}
 
80
 
 
81
X86TargetLowering::X86TargetLowering(X86TargetMachine &TM)
 
82
  : TargetLowering(TM, createTLOF(TM)) {
 
83
  Subtarget = &TM.getSubtarget<X86Subtarget>();
 
84
  X86ScalarSSEf64 = Subtarget->hasSSE2();
 
85
  X86ScalarSSEf32 = Subtarget->hasSSE1();
 
86
  X86StackPtr = Subtarget->is64Bit() ? X86::RSP : X86::ESP;
 
87
 
 
88
  RegInfo = TM.getRegisterInfo();
 
89
  TD = getTargetData();
 
90
 
 
91
  // Set up the TargetLowering object.
 
92
 
 
93
  // X86 is weird, it always uses i8 for shift amounts and setcc results.
 
94
  setShiftAmountType(MVT::i8);
 
95
  setBooleanContents(ZeroOrOneBooleanContent);
 
96
  setSchedulingPreference(Sched::RegPressure);
 
97
  setStackPointerRegisterToSaveRestore(X86StackPtr);
 
98
 
 
99
  if (Subtarget->isTargetDarwin()) {
 
100
    // Darwin should use _setjmp/_longjmp instead of setjmp/longjmp.
 
101
    setUseUnderscoreSetJmp(false);
 
102
    setUseUnderscoreLongJmp(false);
 
103
  } else if (Subtarget->isTargetMingw()) {
 
104
    // MS runtime is weird: it exports _setjmp, but longjmp!
 
105
    setUseUnderscoreSetJmp(true);
 
106
    setUseUnderscoreLongJmp(false);
 
107
  } else {
 
108
    setUseUnderscoreSetJmp(true);
 
109
    setUseUnderscoreLongJmp(true);
 
110
  }
 
111
 
 
112
  // Set up the register classes.
 
113
  addRegisterClass(MVT::i8, X86::GR8RegisterClass);
 
114
  addRegisterClass(MVT::i16, X86::GR16RegisterClass);
 
115
  addRegisterClass(MVT::i32, X86::GR32RegisterClass);
 
116
  if (Subtarget->is64Bit())
 
117
    addRegisterClass(MVT::i64, X86::GR64RegisterClass);
 
118
 
 
119
  setLoadExtAction(ISD::SEXTLOAD, MVT::i1, Promote);
 
120
 
 
121
  // We don't accept any truncstore of integer registers.
 
122
  setTruncStoreAction(MVT::i64, MVT::i32, Expand);
 
123
  setTruncStoreAction(MVT::i64, MVT::i16, Expand);
 
124
  setTruncStoreAction(MVT::i64, MVT::i8 , Expand);
 
125
  setTruncStoreAction(MVT::i32, MVT::i16, Expand);
 
126
  setTruncStoreAction(MVT::i32, MVT::i8 , Expand);
 
127
  setTruncStoreAction(MVT::i16, MVT::i8,  Expand);
 
128
 
 
129
  // SETOEQ and SETUNE require checking two conditions.
 
130
  setCondCodeAction(ISD::SETOEQ, MVT::f32, Expand);
 
131
  setCondCodeAction(ISD::SETOEQ, MVT::f64, Expand);
 
132
  setCondCodeAction(ISD::SETOEQ, MVT::f80, Expand);
 
133
  setCondCodeAction(ISD::SETUNE, MVT::f32, Expand);
 
134
  setCondCodeAction(ISD::SETUNE, MVT::f64, Expand);
 
135
  setCondCodeAction(ISD::SETUNE, MVT::f80, Expand);
 
136
 
 
137
  // Promote all UINT_TO_FP to larger SINT_TO_FP's, as X86 doesn't have this
 
138
  // operation.
 
139
  setOperationAction(ISD::UINT_TO_FP       , MVT::i1   , Promote);
 
140
  setOperationAction(ISD::UINT_TO_FP       , MVT::i8   , Promote);
 
141
  setOperationAction(ISD::UINT_TO_FP       , MVT::i16  , Promote);
 
142
 
 
143
  if (Subtarget->is64Bit()) {
 
144
    setOperationAction(ISD::UINT_TO_FP     , MVT::i32  , Promote);
 
145
    setOperationAction(ISD::UINT_TO_FP     , MVT::i64  , Expand);
 
146
  } else if (!UseSoftFloat) {
 
147
    // We have an algorithm for SSE2->double, and we turn this into a
 
148
    // 64-bit FILD followed by conditional FADD for other targets.
 
149
    setOperationAction(ISD::UINT_TO_FP     , MVT::i64  , Custom);
 
150
    // We have an algorithm for SSE2, and we turn this into a 64-bit
 
151
    // FILD for other targets.
 
152
    setOperationAction(ISD::UINT_TO_FP     , MVT::i32  , Custom);
 
153
  }
 
154
 
 
155
  // Promote i1/i8 SINT_TO_FP to larger SINT_TO_FP's, as X86 doesn't have
 
156
  // this operation.
 
157
  setOperationAction(ISD::SINT_TO_FP       , MVT::i1   , Promote);
 
158
  setOperationAction(ISD::SINT_TO_FP       , MVT::i8   , Promote);
 
159
 
 
160
  if (!UseSoftFloat) {
 
161
    // SSE has no i16 to fp conversion, only i32
 
162
    if (X86ScalarSSEf32) {
 
163
      setOperationAction(ISD::SINT_TO_FP     , MVT::i16  , Promote);
 
164
      // f32 and f64 cases are Legal, f80 case is not
 
165
      setOperationAction(ISD::SINT_TO_FP     , MVT::i32  , Custom);
 
166
    } else {
 
167
      setOperationAction(ISD::SINT_TO_FP     , MVT::i16  , Custom);
 
168
      setOperationAction(ISD::SINT_TO_FP     , MVT::i32  , Custom);
 
169
    }
 
170
  } else {
 
171
    setOperationAction(ISD::SINT_TO_FP     , MVT::i16  , Promote);
 
172
    setOperationAction(ISD::SINT_TO_FP     , MVT::i32  , Promote);
 
173
  }
 
174
 
 
175
  // In 32-bit mode these are custom lowered.  In 64-bit mode F32 and F64
 
176
  // are Legal, f80 is custom lowered.
 
177
  setOperationAction(ISD::FP_TO_SINT     , MVT::i64  , Custom);
 
178
  setOperationAction(ISD::SINT_TO_FP     , MVT::i64  , Custom);
 
179
 
 
180
  // Promote i1/i8 FP_TO_SINT to larger FP_TO_SINTS's, as X86 doesn't have
 
181
  // this operation.
 
182
  setOperationAction(ISD::FP_TO_SINT       , MVT::i1   , Promote);
 
183
  setOperationAction(ISD::FP_TO_SINT       , MVT::i8   , Promote);
 
184
 
 
185
  if (X86ScalarSSEf32) {
 
186
    setOperationAction(ISD::FP_TO_SINT     , MVT::i16  , Promote);
 
187
    // f32 and f64 cases are Legal, f80 case is not
 
188
    setOperationAction(ISD::FP_TO_SINT     , MVT::i32  , Custom);
 
189
  } else {
 
190
    setOperationAction(ISD::FP_TO_SINT     , MVT::i16  , Custom);
 
191
    setOperationAction(ISD::FP_TO_SINT     , MVT::i32  , Custom);
 
192
  }
 
193
 
 
194
  // Handle FP_TO_UINT by promoting the destination to a larger signed
 
195
  // conversion.
 
196
  setOperationAction(ISD::FP_TO_UINT       , MVT::i1   , Promote);
 
197
  setOperationAction(ISD::FP_TO_UINT       , MVT::i8   , Promote);
 
198
  setOperationAction(ISD::FP_TO_UINT       , MVT::i16  , Promote);
 
199
 
 
200
  if (Subtarget->is64Bit()) {
 
201
    setOperationAction(ISD::FP_TO_UINT     , MVT::i64  , Expand);
 
202
    setOperationAction(ISD::FP_TO_UINT     , MVT::i32  , Promote);
 
203
  } else if (!UseSoftFloat) {
 
204
    if (X86ScalarSSEf32 && !Subtarget->hasSSE3())
 
205
      // Expand FP_TO_UINT into a select.
 
206
      // FIXME: We would like to use a Custom expander here eventually to do
 
207
      // the optimal thing for SSE vs. the default expansion in the legalizer.
 
208
      setOperationAction(ISD::FP_TO_UINT   , MVT::i32  , Expand);
 
209
    else
 
210
      // With SSE3 we can use fisttpll to convert to a signed i64; without
 
211
      // SSE, we're stuck with a fistpll.
 
212
      setOperationAction(ISD::FP_TO_UINT   , MVT::i32  , Custom);
 
213
  }
 
214
 
 
215
  // TODO: when we have SSE, these could be more efficient, by using movd/movq.
 
216
  if (!X86ScalarSSEf64) { 
 
217
    setOperationAction(ISD::BIT_CONVERT      , MVT::f32  , Expand);
 
218
    setOperationAction(ISD::BIT_CONVERT      , MVT::i32  , Expand);
 
219
    if (Subtarget->is64Bit()) {
 
220
      setOperationAction(ISD::BIT_CONVERT    , MVT::f64  , Expand);
 
221
      // Without SSE, i64->f64 goes through memory; i64->MMX is Legal.
 
222
      if (Subtarget->hasMMX() && !DisableMMX)
 
223
        setOperationAction(ISD::BIT_CONVERT    , MVT::i64  , Custom);
 
224
      else 
 
225
        setOperationAction(ISD::BIT_CONVERT    , MVT::i64  , Expand);
 
226
    }
 
227
  }
 
228
 
 
229
  // Scalar integer divide and remainder are lowered to use operations that
 
230
  // produce two results, to match the available instructions. This exposes
 
231
  // the two-result form to trivial CSE, which is able to combine x/y and x%y
 
232
  // into a single instruction.
 
233
  //
 
234
  // Scalar integer multiply-high is also lowered to use two-result
 
235
  // operations, to match the available instructions. However, plain multiply
 
236
  // (low) operations are left as Legal, as there are single-result
 
237
  // instructions for this in x86. Using the two-result multiply instructions
 
238
  // when both high and low results are needed must be arranged by dagcombine.
 
239
  setOperationAction(ISD::MULHS           , MVT::i8    , Expand);
 
240
  setOperationAction(ISD::MULHU           , MVT::i8    , Expand);
 
241
  setOperationAction(ISD::SDIV            , MVT::i8    , Expand);
 
242
  setOperationAction(ISD::UDIV            , MVT::i8    , Expand);
 
243
  setOperationAction(ISD::SREM            , MVT::i8    , Expand);
 
244
  setOperationAction(ISD::UREM            , MVT::i8    , Expand);
 
245
  setOperationAction(ISD::MULHS           , MVT::i16   , Expand);
 
246
  setOperationAction(ISD::MULHU           , MVT::i16   , Expand);
 
247
  setOperationAction(ISD::SDIV            , MVT::i16   , Expand);
 
248
  setOperationAction(ISD::UDIV            , MVT::i16   , Expand);
 
249
  setOperationAction(ISD::SREM            , MVT::i16   , Expand);
 
250
  setOperationAction(ISD::UREM            , MVT::i16   , Expand);
 
251
  setOperationAction(ISD::MULHS           , MVT::i32   , Expand);
 
252
  setOperationAction(ISD::MULHU           , MVT::i32   , Expand);
 
253
  setOperationAction(ISD::SDIV            , MVT::i32   , Expand);
 
254
  setOperationAction(ISD::UDIV            , MVT::i32   , Expand);
 
255
  setOperationAction(ISD::SREM            , MVT::i32   , Expand);
 
256
  setOperationAction(ISD::UREM            , MVT::i32   , Expand);
 
257
  setOperationAction(ISD::MULHS           , MVT::i64   , Expand);
 
258
  setOperationAction(ISD::MULHU           , MVT::i64   , Expand);
 
259
  setOperationAction(ISD::SDIV            , MVT::i64   , Expand);
 
260
  setOperationAction(ISD::UDIV            , MVT::i64   , Expand);
 
261
  setOperationAction(ISD::SREM            , MVT::i64   , Expand);
 
262
  setOperationAction(ISD::UREM            , MVT::i64   , Expand);
 
263
 
 
264
  setOperationAction(ISD::BR_JT            , MVT::Other, Expand);
 
265
  setOperationAction(ISD::BRCOND           , MVT::Other, Custom);
 
266
  setOperationAction(ISD::BR_CC            , MVT::Other, Expand);
 
267
  setOperationAction(ISD::SELECT_CC        , MVT::Other, Expand);
 
268
  if (Subtarget->is64Bit())
 
269
    setOperationAction(ISD::SIGN_EXTEND_INREG, MVT::i32, Legal);
 
270
  setOperationAction(ISD::SIGN_EXTEND_INREG, MVT::i16  , Legal);
 
271
  setOperationAction(ISD::SIGN_EXTEND_INREG, MVT::i8   , Legal);
 
272
  setOperationAction(ISD::SIGN_EXTEND_INREG, MVT::i1   , Expand);
 
273
  setOperationAction(ISD::FP_ROUND_INREG   , MVT::f32  , Expand);
 
274
  setOperationAction(ISD::FREM             , MVT::f32  , Expand);
 
275
  setOperationAction(ISD::FREM             , MVT::f64  , Expand);
 
276
  setOperationAction(ISD::FREM             , MVT::f80  , Expand);
 
277
  setOperationAction(ISD::FLT_ROUNDS_      , MVT::i32  , Custom);
 
278
 
 
279
  setOperationAction(ISD::CTPOP            , MVT::i8   , Expand);
 
280
  setOperationAction(ISD::CTTZ             , MVT::i8   , Custom);
 
281
  setOperationAction(ISD::CTLZ             , MVT::i8   , Custom);
 
282
  setOperationAction(ISD::CTPOP            , MVT::i16  , Expand);
 
283
  setOperationAction(ISD::CTTZ             , MVT::i16  , Custom);
 
284
  setOperationAction(ISD::CTLZ             , MVT::i16  , Custom);
 
285
  setOperationAction(ISD::CTPOP            , MVT::i32  , Expand);
 
286
  setOperationAction(ISD::CTTZ             , MVT::i32  , Custom);
 
287
  setOperationAction(ISD::CTLZ             , MVT::i32  , Custom);
 
288
  if (Subtarget->is64Bit()) {
 
289
    setOperationAction(ISD::CTPOP          , MVT::i64  , Expand);
 
290
    setOperationAction(ISD::CTTZ           , MVT::i64  , Custom);
 
291
    setOperationAction(ISD::CTLZ           , MVT::i64  , Custom);
 
292
  }
 
293
 
 
294
  setOperationAction(ISD::READCYCLECOUNTER , MVT::i64  , Custom);
 
295
  setOperationAction(ISD::BSWAP            , MVT::i16  , Expand);
 
296
 
 
297
  // These should be promoted to a larger select which is supported.
 
298
  setOperationAction(ISD::SELECT          , MVT::i1   , Promote);
 
299
  // X86 wants to expand cmov itself.
 
300
  setOperationAction(ISD::SELECT          , MVT::i8   , Custom);
 
301
  setOperationAction(ISD::SELECT        , MVT::i16  , Custom);
 
302
  setOperationAction(ISD::SELECT          , MVT::i32  , Custom);
 
303
  setOperationAction(ISD::SELECT          , MVT::f32  , Custom);
 
304
  setOperationAction(ISD::SELECT          , MVT::f64  , Custom);
 
305
  setOperationAction(ISD::SELECT          , MVT::f80  , Custom);
 
306
  setOperationAction(ISD::SETCC           , MVT::i8   , Custom);
 
307
  setOperationAction(ISD::SETCC           , MVT::i16  , Custom);
 
308
  setOperationAction(ISD::SETCC           , MVT::i32  , Custom);
 
309
  setOperationAction(ISD::SETCC           , MVT::f32  , Custom);
 
310
  setOperationAction(ISD::SETCC           , MVT::f64  , Custom);
 
311
  setOperationAction(ISD::SETCC           , MVT::f80  , Custom);
 
312
  if (Subtarget->is64Bit()) {
 
313
    setOperationAction(ISD::SELECT        , MVT::i64  , Custom);
 
314
    setOperationAction(ISD::SETCC         , MVT::i64  , Custom);
 
315
  }
 
316
  setOperationAction(ISD::EH_RETURN       , MVT::Other, Custom);
 
317
 
 
318
  // Darwin ABI issue.
 
319
  setOperationAction(ISD::ConstantPool    , MVT::i32  , Custom);
 
320
  setOperationAction(ISD::JumpTable       , MVT::i32  , Custom);
 
321
  setOperationAction(ISD::GlobalAddress   , MVT::i32  , Custom);
 
322
  setOperationAction(ISD::GlobalTLSAddress, MVT::i32  , Custom);
 
323
  if (Subtarget->is64Bit())
 
324
    setOperationAction(ISD::GlobalTLSAddress, MVT::i64, Custom);
 
325
  setOperationAction(ISD::ExternalSymbol  , MVT::i32  , Custom);
 
326
  setOperationAction(ISD::BlockAddress    , MVT::i32  , Custom);
 
327
  if (Subtarget->is64Bit()) {
 
328
    setOperationAction(ISD::ConstantPool  , MVT::i64  , Custom);
 
329
    setOperationAction(ISD::JumpTable     , MVT::i64  , Custom);
 
330
    setOperationAction(ISD::GlobalAddress , MVT::i64  , Custom);
 
331
    setOperationAction(ISD::ExternalSymbol, MVT::i64  , Custom);
 
332
    setOperationAction(ISD::BlockAddress  , MVT::i64  , Custom);
 
333
  }
 
334
  // 64-bit addm sub, shl, sra, srl (iff 32-bit x86)
 
335
  setOperationAction(ISD::SHL_PARTS       , MVT::i32  , Custom);
 
336
  setOperationAction(ISD::SRA_PARTS       , MVT::i32  , Custom);
 
337
  setOperationAction(ISD::SRL_PARTS       , MVT::i32  , Custom);
 
338
  if (Subtarget->is64Bit()) {
 
339
    setOperationAction(ISD::SHL_PARTS     , MVT::i64  , Custom);
 
340
    setOperationAction(ISD::SRA_PARTS     , MVT::i64  , Custom);
 
341
    setOperationAction(ISD::SRL_PARTS     , MVT::i64  , Custom);
 
342
  }
 
343
 
 
344
  if (Subtarget->hasSSE1())
 
345
    setOperationAction(ISD::PREFETCH      , MVT::Other, Legal);
 
346
 
 
347
  // We may not have a libcall for MEMBARRIER so we should lower this.
 
348
  setOperationAction(ISD::MEMBARRIER    , MVT::Other, Custom);
 
349
  
 
350
  // On X86 and X86-64, atomic operations are lowered to locked instructions.
 
351
  // Locked instructions, in turn, have implicit fence semantics (all memory
 
352
  // operations are flushed before issuing the locked instruction, and they
 
353
  // are not buffered), so we can fold away the common pattern of
 
354
  // fence-atomic-fence.
 
355
  setShouldFoldAtomicFences(true);
 
356
 
 
357
  // Expand certain atomics
 
358
  setOperationAction(ISD::ATOMIC_CMP_SWAP, MVT::i8, Custom);
 
359
  setOperationAction(ISD::ATOMIC_CMP_SWAP, MVT::i16, Custom);
 
360
  setOperationAction(ISD::ATOMIC_CMP_SWAP, MVT::i32, Custom);
 
361
  setOperationAction(ISD::ATOMIC_CMP_SWAP, MVT::i64, Custom);
 
362
 
 
363
  setOperationAction(ISD::ATOMIC_LOAD_SUB, MVT::i8, Custom);
 
364
  setOperationAction(ISD::ATOMIC_LOAD_SUB, MVT::i16, Custom);
 
365
  setOperationAction(ISD::ATOMIC_LOAD_SUB, MVT::i32, Custom);
 
366
  setOperationAction(ISD::ATOMIC_LOAD_SUB, MVT::i64, Custom);
 
367
 
 
368
  if (!Subtarget->is64Bit()) {
 
369
    setOperationAction(ISD::ATOMIC_LOAD_ADD, MVT::i64, Custom);
 
370
    setOperationAction(ISD::ATOMIC_LOAD_SUB, MVT::i64, Custom);
 
371
    setOperationAction(ISD::ATOMIC_LOAD_AND, MVT::i64, Custom);
 
372
    setOperationAction(ISD::ATOMIC_LOAD_OR, MVT::i64, Custom);
 
373
    setOperationAction(ISD::ATOMIC_LOAD_XOR, MVT::i64, Custom);
 
374
    setOperationAction(ISD::ATOMIC_LOAD_NAND, MVT::i64, Custom);
 
375
    setOperationAction(ISD::ATOMIC_SWAP, MVT::i64, Custom);
 
376
  }
 
377
 
 
378
  // FIXME - use subtarget debug flags
 
379
  if (!Subtarget->isTargetDarwin() &&
 
380
      !Subtarget->isTargetELF() &&
 
381
      !Subtarget->isTargetCygMing()) {
 
382
    setOperationAction(ISD::EH_LABEL, MVT::Other, Expand);
 
383
  }
 
384
 
 
385
  setOperationAction(ISD::EXCEPTIONADDR, MVT::i64, Expand);
 
386
  setOperationAction(ISD::EHSELECTION,   MVT::i64, Expand);
 
387
  setOperationAction(ISD::EXCEPTIONADDR, MVT::i32, Expand);
 
388
  setOperationAction(ISD::EHSELECTION,   MVT::i32, Expand);
 
389
  if (Subtarget->is64Bit()) {
 
390
    setExceptionPointerRegister(X86::RAX);
 
391
    setExceptionSelectorRegister(X86::RDX);
 
392
  } else {
 
393
    setExceptionPointerRegister(X86::EAX);
 
394
    setExceptionSelectorRegister(X86::EDX);
 
395
  }
 
396
  setOperationAction(ISD::FRAME_TO_ARGS_OFFSET, MVT::i32, Custom);
 
397
  setOperationAction(ISD::FRAME_TO_ARGS_OFFSET, MVT::i64, Custom);
 
398
 
 
399
  setOperationAction(ISD::TRAMPOLINE, MVT::Other, Custom);
 
400
 
 
401
  setOperationAction(ISD::TRAP, MVT::Other, Legal);
 
402
 
 
403
  // VASTART needs to be custom lowered to use the VarArgsFrameIndex
 
404
  setOperationAction(ISD::VASTART           , MVT::Other, Custom);
 
405
  setOperationAction(ISD::VAEND             , MVT::Other, Expand);
 
406
  if (Subtarget->is64Bit()) {
 
407
    setOperationAction(ISD::VAARG           , MVT::Other, Custom);
 
408
    setOperationAction(ISD::VACOPY          , MVT::Other, Custom);
 
409
  } else {
 
410
    setOperationAction(ISD::VAARG           , MVT::Other, Expand);
 
411
    setOperationAction(ISD::VACOPY          , MVT::Other, Expand);
 
412
  }
 
413
 
 
414
  setOperationAction(ISD::STACKSAVE,          MVT::Other, Expand);
 
415
  setOperationAction(ISD::STACKRESTORE,       MVT::Other, Expand);
 
416
  if (Subtarget->is64Bit())
 
417
    setOperationAction(ISD::DYNAMIC_STACKALLOC, MVT::i64, Expand);
 
418
  if (Subtarget->isTargetCygMing())
 
419
    setOperationAction(ISD::DYNAMIC_STACKALLOC, MVT::i32, Custom);
 
420
  else
 
421
    setOperationAction(ISD::DYNAMIC_STACKALLOC, MVT::i32, Expand);
 
422
 
 
423
  if (!UseSoftFloat && X86ScalarSSEf64) {
 
424
    // f32 and f64 use SSE.
 
425
    // Set up the FP register classes.
 
426
    addRegisterClass(MVT::f32, X86::FR32RegisterClass);
 
427
    addRegisterClass(MVT::f64, X86::FR64RegisterClass);
 
428
 
 
429
    // Use ANDPD to simulate FABS.
 
430
    setOperationAction(ISD::FABS , MVT::f64, Custom);
 
431
    setOperationAction(ISD::FABS , MVT::f32, Custom);
 
432
 
 
433
    // Use XORP to simulate FNEG.
 
434
    setOperationAction(ISD::FNEG , MVT::f64, Custom);
 
435
    setOperationAction(ISD::FNEG , MVT::f32, Custom);
 
436
 
 
437
    // Use ANDPD and ORPD to simulate FCOPYSIGN.
 
438
    setOperationAction(ISD::FCOPYSIGN, MVT::f64, Custom);
 
439
    setOperationAction(ISD::FCOPYSIGN, MVT::f32, Custom);
 
440
 
 
441
    // We don't support sin/cos/fmod
 
442
    setOperationAction(ISD::FSIN , MVT::f64, Expand);
 
443
    setOperationAction(ISD::FCOS , MVT::f64, Expand);
 
444
    setOperationAction(ISD::FSIN , MVT::f32, Expand);
 
445
    setOperationAction(ISD::FCOS , MVT::f32, Expand);
 
446
 
 
447
    // Expand FP immediates into loads from the stack, except for the special
 
448
    // cases we handle.
 
449
    addLegalFPImmediate(APFloat(+0.0)); // xorpd
 
450
    addLegalFPImmediate(APFloat(+0.0f)); // xorps
 
451
  } else if (!UseSoftFloat && X86ScalarSSEf32) {
 
452
    // Use SSE for f32, x87 for f64.
 
453
    // Set up the FP register classes.
 
454
    addRegisterClass(MVT::f32, X86::FR32RegisterClass);
 
455
    addRegisterClass(MVT::f64, X86::RFP64RegisterClass);
 
456
 
 
457
    // Use ANDPS to simulate FABS.
 
458
    setOperationAction(ISD::FABS , MVT::f32, Custom);
 
459
 
 
460
    // Use XORP to simulate FNEG.
 
461
    setOperationAction(ISD::FNEG , MVT::f32, Custom);
 
462
 
 
463
    setOperationAction(ISD::UNDEF,     MVT::f64, Expand);
 
464
 
 
465
    // Use ANDPS and ORPS to simulate FCOPYSIGN.
 
466
    setOperationAction(ISD::FCOPYSIGN, MVT::f64, Expand);
 
467
    setOperationAction(ISD::FCOPYSIGN, MVT::f32, Custom);
 
468
 
 
469
    // We don't support sin/cos/fmod
 
470
    setOperationAction(ISD::FSIN , MVT::f32, Expand);
 
471
    setOperationAction(ISD::FCOS , MVT::f32, Expand);
 
472
 
 
473
    // Special cases we handle for FP constants.
 
474
    addLegalFPImmediate(APFloat(+0.0f)); // xorps
 
475
    addLegalFPImmediate(APFloat(+0.0)); // FLD0
 
476
    addLegalFPImmediate(APFloat(+1.0)); // FLD1
 
477
    addLegalFPImmediate(APFloat(-0.0)); // FLD0/FCHS
 
478
    addLegalFPImmediate(APFloat(-1.0)); // FLD1/FCHS
 
479
 
 
480
    if (!UnsafeFPMath) {
 
481
      setOperationAction(ISD::FSIN           , MVT::f64  , Expand);
 
482
      setOperationAction(ISD::FCOS           , MVT::f64  , Expand);
 
483
    }
 
484
  } else if (!UseSoftFloat) {
 
485
    // f32 and f64 in x87.
 
486
    // Set up the FP register classes.
 
487
    addRegisterClass(MVT::f64, X86::RFP64RegisterClass);
 
488
    addRegisterClass(MVT::f32, X86::RFP32RegisterClass);
 
489
 
 
490
    setOperationAction(ISD::UNDEF,     MVT::f64, Expand);
 
491
    setOperationAction(ISD::UNDEF,     MVT::f32, Expand);
 
492
    setOperationAction(ISD::FCOPYSIGN, MVT::f64, Expand);
 
493
    setOperationAction(ISD::FCOPYSIGN, MVT::f32, Expand);
 
494
 
 
495
    if (!UnsafeFPMath) {
 
496
      setOperationAction(ISD::FSIN           , MVT::f64  , Expand);
 
497
      setOperationAction(ISD::FCOS           , MVT::f64  , Expand);
 
498
    }
 
499
    addLegalFPImmediate(APFloat(+0.0)); // FLD0
 
500
    addLegalFPImmediate(APFloat(+1.0)); // FLD1
 
501
    addLegalFPImmediate(APFloat(-0.0)); // FLD0/FCHS
 
502
    addLegalFPImmediate(APFloat(-1.0)); // FLD1/FCHS
 
503
    addLegalFPImmediate(APFloat(+0.0f)); // FLD0
 
504
    addLegalFPImmediate(APFloat(+1.0f)); // FLD1
 
505
    addLegalFPImmediate(APFloat(-0.0f)); // FLD0/FCHS
 
506
    addLegalFPImmediate(APFloat(-1.0f)); // FLD1/FCHS
 
507
  }
 
508
 
 
509
  // Long double always uses X87.
 
510
  if (!UseSoftFloat) {
 
511
    addRegisterClass(MVT::f80, X86::RFP80RegisterClass);
 
512
    setOperationAction(ISD::UNDEF,     MVT::f80, Expand);
 
513
    setOperationAction(ISD::FCOPYSIGN, MVT::f80, Expand);
 
514
    {
 
515
      bool ignored;
 
516
      APFloat TmpFlt(+0.0);
 
517
      TmpFlt.convert(APFloat::x87DoubleExtended, APFloat::rmNearestTiesToEven,
 
518
                     &ignored);
 
519
      addLegalFPImmediate(TmpFlt);  // FLD0
 
520
      TmpFlt.changeSign();
 
521
      addLegalFPImmediate(TmpFlt);  // FLD0/FCHS
 
522
      APFloat TmpFlt2(+1.0);
 
523
      TmpFlt2.convert(APFloat::x87DoubleExtended, APFloat::rmNearestTiesToEven,
 
524
                      &ignored);
 
525
      addLegalFPImmediate(TmpFlt2);  // FLD1
 
526
      TmpFlt2.changeSign();
 
527
      addLegalFPImmediate(TmpFlt2);  // FLD1/FCHS
 
528
    }
 
529
 
 
530
    if (!UnsafeFPMath) {
 
531
      setOperationAction(ISD::FSIN           , MVT::f80  , Expand);
 
532
      setOperationAction(ISD::FCOS           , MVT::f80  , Expand);
 
533
    }
 
534
  }
 
535
 
 
536
  // Always use a library call for pow.
 
537
  setOperationAction(ISD::FPOW             , MVT::f32  , Expand);
 
538
  setOperationAction(ISD::FPOW             , MVT::f64  , Expand);
 
539
  setOperationAction(ISD::FPOW             , MVT::f80  , Expand);
 
540
 
 
541
  setOperationAction(ISD::FLOG, MVT::f80, Expand);
 
542
  setOperationAction(ISD::FLOG2, MVT::f80, Expand);
 
543
  setOperationAction(ISD::FLOG10, MVT::f80, Expand);
 
544
  setOperationAction(ISD::FEXP, MVT::f80, Expand);
 
545
  setOperationAction(ISD::FEXP2, MVT::f80, Expand);
 
546
 
 
547
  // First set operation action for all vector types to either promote
 
548
  // (for widening) or expand (for scalarization). Then we will selectively
 
549
  // turn on ones that can be effectively codegen'd.
 
550
  for (unsigned VT = (unsigned)MVT::FIRST_VECTOR_VALUETYPE;
 
551
       VT <= (unsigned)MVT::LAST_VECTOR_VALUETYPE; ++VT) {
 
552
    setOperationAction(ISD::ADD , (MVT::SimpleValueType)VT, Expand);
 
553
    setOperationAction(ISD::SUB , (MVT::SimpleValueType)VT, Expand);
 
554
    setOperationAction(ISD::FADD, (MVT::SimpleValueType)VT, Expand);
 
555
    setOperationAction(ISD::FNEG, (MVT::SimpleValueType)VT, Expand);
 
556
    setOperationAction(ISD::FSUB, (MVT::SimpleValueType)VT, Expand);
 
557
    setOperationAction(ISD::MUL , (MVT::SimpleValueType)VT, Expand);
 
558
    setOperationAction(ISD::FMUL, (MVT::SimpleValueType)VT, Expand);
 
559
    setOperationAction(ISD::SDIV, (MVT::SimpleValueType)VT, Expand);
 
560
    setOperationAction(ISD::UDIV, (MVT::SimpleValueType)VT, Expand);
 
561
    setOperationAction(ISD::FDIV, (MVT::SimpleValueType)VT, Expand);
 
562
    setOperationAction(ISD::SREM, (MVT::SimpleValueType)VT, Expand);
 
563
    setOperationAction(ISD::UREM, (MVT::SimpleValueType)VT, Expand);
 
564
    setOperationAction(ISD::LOAD, (MVT::SimpleValueType)VT, Expand);
 
565
    setOperationAction(ISD::VECTOR_SHUFFLE, (MVT::SimpleValueType)VT, Expand);
 
566
    setOperationAction(ISD::EXTRACT_VECTOR_ELT,(MVT::SimpleValueType)VT,Expand);
 
567
    setOperationAction(ISD::EXTRACT_SUBVECTOR,(MVT::SimpleValueType)VT,Expand);
 
568
    setOperationAction(ISD::INSERT_VECTOR_ELT,(MVT::SimpleValueType)VT, Expand);
 
569
    setOperationAction(ISD::FABS, (MVT::SimpleValueType)VT, Expand);
 
570
    setOperationAction(ISD::FSIN, (MVT::SimpleValueType)VT, Expand);
 
571
    setOperationAction(ISD::FCOS, (MVT::SimpleValueType)VT, Expand);
 
572
    setOperationAction(ISD::FREM, (MVT::SimpleValueType)VT, Expand);
 
573
    setOperationAction(ISD::FPOWI, (MVT::SimpleValueType)VT, Expand);
 
574
    setOperationAction(ISD::FSQRT, (MVT::SimpleValueType)VT, Expand);
 
575
    setOperationAction(ISD::FCOPYSIGN, (MVT::SimpleValueType)VT, Expand);
 
576
    setOperationAction(ISD::SMUL_LOHI, (MVT::SimpleValueType)VT, Expand);
 
577
    setOperationAction(ISD::UMUL_LOHI, (MVT::SimpleValueType)VT, Expand);
 
578
    setOperationAction(ISD::SDIVREM, (MVT::SimpleValueType)VT, Expand);
 
579
    setOperationAction(ISD::UDIVREM, (MVT::SimpleValueType)VT, Expand);
 
580
    setOperationAction(ISD::FPOW, (MVT::SimpleValueType)VT, Expand);
 
581
    setOperationAction(ISD::CTPOP, (MVT::SimpleValueType)VT, Expand);
 
582
    setOperationAction(ISD::CTTZ, (MVT::SimpleValueType)VT, Expand);
 
583
    setOperationAction(ISD::CTLZ, (MVT::SimpleValueType)VT, Expand);
 
584
    setOperationAction(ISD::SHL, (MVT::SimpleValueType)VT, Expand);
 
585
    setOperationAction(ISD::SRA, (MVT::SimpleValueType)VT, Expand);
 
586
    setOperationAction(ISD::SRL, (MVT::SimpleValueType)VT, Expand);
 
587
    setOperationAction(ISD::ROTL, (MVT::SimpleValueType)VT, Expand);
 
588
    setOperationAction(ISD::ROTR, (MVT::SimpleValueType)VT, Expand);
 
589
    setOperationAction(ISD::BSWAP, (MVT::SimpleValueType)VT, Expand);
 
590
    setOperationAction(ISD::VSETCC, (MVT::SimpleValueType)VT, Expand);
 
591
    setOperationAction(ISD::FLOG, (MVT::SimpleValueType)VT, Expand);
 
592
    setOperationAction(ISD::FLOG2, (MVT::SimpleValueType)VT, Expand);
 
593
    setOperationAction(ISD::FLOG10, (MVT::SimpleValueType)VT, Expand);
 
594
    setOperationAction(ISD::FEXP, (MVT::SimpleValueType)VT, Expand);
 
595
    setOperationAction(ISD::FEXP2, (MVT::SimpleValueType)VT, Expand);
 
596
    setOperationAction(ISD::FP_TO_UINT, (MVT::SimpleValueType)VT, Expand);
 
597
    setOperationAction(ISD::FP_TO_SINT, (MVT::SimpleValueType)VT, Expand);
 
598
    setOperationAction(ISD::UINT_TO_FP, (MVT::SimpleValueType)VT, Expand);
 
599
    setOperationAction(ISD::SINT_TO_FP, (MVT::SimpleValueType)VT, Expand);
 
600
    setOperationAction(ISD::SIGN_EXTEND_INREG, (MVT::SimpleValueType)VT,Expand);
 
601
    setOperationAction(ISD::TRUNCATE,  (MVT::SimpleValueType)VT, Expand);
 
602
    setOperationAction(ISD::SIGN_EXTEND,  (MVT::SimpleValueType)VT, Expand);
 
603
    setOperationAction(ISD::ZERO_EXTEND,  (MVT::SimpleValueType)VT, Expand);
 
604
    setOperationAction(ISD::ANY_EXTEND,  (MVT::SimpleValueType)VT, Expand);
 
605
    for (unsigned InnerVT = (unsigned)MVT::FIRST_VECTOR_VALUETYPE;
 
606
         InnerVT <= (unsigned)MVT::LAST_VECTOR_VALUETYPE; ++InnerVT)
 
607
      setTruncStoreAction((MVT::SimpleValueType)VT,
 
608
                          (MVT::SimpleValueType)InnerVT, Expand);
 
609
    setLoadExtAction(ISD::SEXTLOAD, (MVT::SimpleValueType)VT, Expand);
 
610
    setLoadExtAction(ISD::ZEXTLOAD, (MVT::SimpleValueType)VT, Expand);
 
611
    setLoadExtAction(ISD::EXTLOAD, (MVT::SimpleValueType)VT, Expand);
 
612
  }
 
613
 
 
614
  // FIXME: In order to prevent SSE instructions being expanded to MMX ones
 
615
  // with -msoft-float, disable use of MMX as well.
 
616
  if (!UseSoftFloat && !DisableMMX && Subtarget->hasMMX()) {
 
617
    addRegisterClass(MVT::v8i8,  X86::VR64RegisterClass, false);
 
618
    addRegisterClass(MVT::v4i16, X86::VR64RegisterClass, false);
 
619
    addRegisterClass(MVT::v2i32, X86::VR64RegisterClass, false);
 
620
    
 
621
    addRegisterClass(MVT::v1i64, X86::VR64RegisterClass, false);
 
622
 
 
623
    setOperationAction(ISD::ADD,                MVT::v8i8,  Legal);
 
624
    setOperationAction(ISD::ADD,                MVT::v4i16, Legal);
 
625
    setOperationAction(ISD::ADD,                MVT::v2i32, Legal);
 
626
    setOperationAction(ISD::ADD,                MVT::v1i64, Legal);
 
627
 
 
628
    setOperationAction(ISD::SUB,                MVT::v8i8,  Legal);
 
629
    setOperationAction(ISD::SUB,                MVT::v4i16, Legal);
 
630
    setOperationAction(ISD::SUB,                MVT::v2i32, Legal);
 
631
    setOperationAction(ISD::SUB,                MVT::v1i64, Legal);
 
632
 
 
633
    setOperationAction(ISD::MULHS,              MVT::v4i16, Legal);
 
634
    setOperationAction(ISD::MUL,                MVT::v4i16, Legal);
 
635
 
 
636
    setOperationAction(ISD::AND,                MVT::v8i8,  Promote);
 
637
    AddPromotedToType (ISD::AND,                MVT::v8i8,  MVT::v1i64);
 
638
    setOperationAction(ISD::AND,                MVT::v4i16, Promote);
 
639
    AddPromotedToType (ISD::AND,                MVT::v4i16, MVT::v1i64);
 
640
    setOperationAction(ISD::AND,                MVT::v2i32, Promote);
 
641
    AddPromotedToType (ISD::AND,                MVT::v2i32, MVT::v1i64);
 
642
    setOperationAction(ISD::AND,                MVT::v1i64, Legal);
 
643
 
 
644
    setOperationAction(ISD::OR,                 MVT::v8i8,  Promote);
 
645
    AddPromotedToType (ISD::OR,                 MVT::v8i8,  MVT::v1i64);
 
646
    setOperationAction(ISD::OR,                 MVT::v4i16, Promote);
 
647
    AddPromotedToType (ISD::OR,                 MVT::v4i16, MVT::v1i64);
 
648
    setOperationAction(ISD::OR,                 MVT::v2i32, Promote);
 
649
    AddPromotedToType (ISD::OR,                 MVT::v2i32, MVT::v1i64);
 
650
    setOperationAction(ISD::OR,                 MVT::v1i64, Legal);
 
651
 
 
652
    setOperationAction(ISD::XOR,                MVT::v8i8,  Promote);
 
653
    AddPromotedToType (ISD::XOR,                MVT::v8i8,  MVT::v1i64);
 
654
    setOperationAction(ISD::XOR,                MVT::v4i16, Promote);
 
655
    AddPromotedToType (ISD::XOR,                MVT::v4i16, MVT::v1i64);
 
656
    setOperationAction(ISD::XOR,                MVT::v2i32, Promote);
 
657
    AddPromotedToType (ISD::XOR,                MVT::v2i32, MVT::v1i64);
 
658
    setOperationAction(ISD::XOR,                MVT::v1i64, Legal);
 
659
 
 
660
    setOperationAction(ISD::LOAD,               MVT::v8i8,  Promote);
 
661
    AddPromotedToType (ISD::LOAD,               MVT::v8i8,  MVT::v1i64);
 
662
    setOperationAction(ISD::LOAD,               MVT::v4i16, Promote);
 
663
    AddPromotedToType (ISD::LOAD,               MVT::v4i16, MVT::v1i64);
 
664
    setOperationAction(ISD::LOAD,               MVT::v2i32, Promote);
 
665
    AddPromotedToType (ISD::LOAD,               MVT::v2i32, MVT::v1i64);
 
666
    setOperationAction(ISD::LOAD,               MVT::v1i64, Legal);
 
667
 
 
668
    setOperationAction(ISD::BUILD_VECTOR,       MVT::v8i8,  Custom);
 
669
    setOperationAction(ISD::BUILD_VECTOR,       MVT::v4i16, Custom);
 
670
    setOperationAction(ISD::BUILD_VECTOR,       MVT::v2i32, Custom);
 
671
    setOperationAction(ISD::BUILD_VECTOR,       MVT::v1i64, Custom);
 
672
 
 
673
    setOperationAction(ISD::VECTOR_SHUFFLE,     MVT::v8i8,  Custom);
 
674
    setOperationAction(ISD::VECTOR_SHUFFLE,     MVT::v4i16, Custom);
 
675
    setOperationAction(ISD::VECTOR_SHUFFLE,     MVT::v2i32, Custom);
 
676
    setOperationAction(ISD::VECTOR_SHUFFLE,     MVT::v1i64, Custom);
 
677
 
 
678
    setOperationAction(ISD::SCALAR_TO_VECTOR,   MVT::v8i8,  Custom);
 
679
    setOperationAction(ISD::SCALAR_TO_VECTOR,   MVT::v4i16, Custom);
 
680
    setOperationAction(ISD::SCALAR_TO_VECTOR,   MVT::v1i64, Custom);
 
681
 
 
682
    setOperationAction(ISD::INSERT_VECTOR_ELT,  MVT::v4i16, Custom);
 
683
 
 
684
    setOperationAction(ISD::SELECT,             MVT::v8i8, Promote);
 
685
    setOperationAction(ISD::SELECT,             MVT::v4i16, Promote);
 
686
    setOperationAction(ISD::SELECT,             MVT::v2i32, Promote);
 
687
    setOperationAction(ISD::SELECT,             MVT::v1i64, Custom);
 
688
    setOperationAction(ISD::VSETCC,             MVT::v8i8, Custom);
 
689
    setOperationAction(ISD::VSETCC,             MVT::v4i16, Custom);
 
690
    setOperationAction(ISD::VSETCC,             MVT::v2i32, Custom);
 
691
 
 
692
    if (!X86ScalarSSEf64 && Subtarget->is64Bit()) {
 
693
      setOperationAction(ISD::BIT_CONVERT,        MVT::v8i8,  Custom);
 
694
      setOperationAction(ISD::BIT_CONVERT,        MVT::v4i16, Custom);
 
695
      setOperationAction(ISD::BIT_CONVERT,        MVT::v2i32, Custom);
 
696
      setOperationAction(ISD::BIT_CONVERT,        MVT::v1i64, Custom);
 
697
    }
 
698
  }
 
699
 
 
700
  if (!UseSoftFloat && Subtarget->hasSSE1()) {
 
701
    addRegisterClass(MVT::v4f32, X86::VR128RegisterClass);
 
702
 
 
703
    setOperationAction(ISD::FADD,               MVT::v4f32, Legal);
 
704
    setOperationAction(ISD::FSUB,               MVT::v4f32, Legal);
 
705
    setOperationAction(ISD::FMUL,               MVT::v4f32, Legal);
 
706
    setOperationAction(ISD::FDIV,               MVT::v4f32, Legal);
 
707
    setOperationAction(ISD::FSQRT,              MVT::v4f32, Legal);
 
708
    setOperationAction(ISD::FNEG,               MVT::v4f32, Custom);
 
709
    setOperationAction(ISD::LOAD,               MVT::v4f32, Legal);
 
710
    setOperationAction(ISD::BUILD_VECTOR,       MVT::v4f32, Custom);
 
711
    setOperationAction(ISD::VECTOR_SHUFFLE,     MVT::v4f32, Custom);
 
712
    setOperationAction(ISD::EXTRACT_VECTOR_ELT, MVT::v4f32, Custom);
 
713
    setOperationAction(ISD::SELECT,             MVT::v4f32, Custom);
 
714
    setOperationAction(ISD::VSETCC,             MVT::v4f32, Custom);
 
715
  }
 
716
 
 
717
  if (!UseSoftFloat && Subtarget->hasSSE2()) {
 
718
    addRegisterClass(MVT::v2f64, X86::VR128RegisterClass);
 
719
 
 
720
    // FIXME: Unfortunately -soft-float and -no-implicit-float means XMM
 
721
    // registers cannot be used even for integer operations.
 
722
    addRegisterClass(MVT::v16i8, X86::VR128RegisterClass);
 
723
    addRegisterClass(MVT::v8i16, X86::VR128RegisterClass);
 
724
    addRegisterClass(MVT::v4i32, X86::VR128RegisterClass);
 
725
    addRegisterClass(MVT::v2i64, X86::VR128RegisterClass);
 
726
 
 
727
    setOperationAction(ISD::ADD,                MVT::v16i8, Legal);
 
728
    setOperationAction(ISD::ADD,                MVT::v8i16, Legal);
 
729
    setOperationAction(ISD::ADD,                MVT::v4i32, Legal);
 
730
    setOperationAction(ISD::ADD,                MVT::v2i64, Legal);
 
731
    setOperationAction(ISD::MUL,                MVT::v2i64, Custom);
 
732
    setOperationAction(ISD::SUB,                MVT::v16i8, Legal);
 
733
    setOperationAction(ISD::SUB,                MVT::v8i16, Legal);
 
734
    setOperationAction(ISD::SUB,                MVT::v4i32, Legal);
 
735
    setOperationAction(ISD::SUB,                MVT::v2i64, Legal);
 
736
    setOperationAction(ISD::MUL,                MVT::v8i16, Legal);
 
737
    setOperationAction(ISD::FADD,               MVT::v2f64, Legal);
 
738
    setOperationAction(ISD::FSUB,               MVT::v2f64, Legal);
 
739
    setOperationAction(ISD::FMUL,               MVT::v2f64, Legal);
 
740
    setOperationAction(ISD::FDIV,               MVT::v2f64, Legal);
 
741
    setOperationAction(ISD::FSQRT,              MVT::v2f64, Legal);
 
742
    setOperationAction(ISD::FNEG,               MVT::v2f64, Custom);
 
743
 
 
744
    setOperationAction(ISD::VSETCC,             MVT::v2f64, Custom);
 
745
    setOperationAction(ISD::VSETCC,             MVT::v16i8, Custom);
 
746
    setOperationAction(ISD::VSETCC,             MVT::v8i16, Custom);
 
747
    setOperationAction(ISD::VSETCC,             MVT::v4i32, Custom);
 
748
 
 
749
    setOperationAction(ISD::SCALAR_TO_VECTOR,   MVT::v16i8, Custom);
 
750
    setOperationAction(ISD::SCALAR_TO_VECTOR,   MVT::v8i16, Custom);
 
751
    setOperationAction(ISD::INSERT_VECTOR_ELT,  MVT::v8i16, Custom);
 
752
    setOperationAction(ISD::INSERT_VECTOR_ELT,  MVT::v4i32, Custom);
 
753
    setOperationAction(ISD::INSERT_VECTOR_ELT,  MVT::v4f32, Custom);
 
754
 
 
755
    setOperationAction(ISD::CONCAT_VECTORS,     MVT::v2f64, Custom);
 
756
    setOperationAction(ISD::CONCAT_VECTORS,     MVT::v2i64, Custom);
 
757
    setOperationAction(ISD::CONCAT_VECTORS,     MVT::v16i8, Custom);
 
758
    setOperationAction(ISD::CONCAT_VECTORS,     MVT::v8i16, Custom);
 
759
    setOperationAction(ISD::CONCAT_VECTORS,     MVT::v4i32, Custom);
 
760
 
 
761
    // Custom lower build_vector, vector_shuffle, and extract_vector_elt.
 
762
    for (unsigned i = (unsigned)MVT::v16i8; i != (unsigned)MVT::v2i64; ++i) {
 
763
      EVT VT = (MVT::SimpleValueType)i;
 
764
      // Do not attempt to custom lower non-power-of-2 vectors
 
765
      if (!isPowerOf2_32(VT.getVectorNumElements()))
 
766
        continue;
 
767
      // Do not attempt to custom lower non-128-bit vectors
 
768
      if (!VT.is128BitVector())
 
769
        continue;
 
770
      setOperationAction(ISD::BUILD_VECTOR,
 
771
                         VT.getSimpleVT().SimpleTy, Custom);
 
772
      setOperationAction(ISD::VECTOR_SHUFFLE,
 
773
                         VT.getSimpleVT().SimpleTy, Custom);
 
774
      setOperationAction(ISD::EXTRACT_VECTOR_ELT,
 
775
                         VT.getSimpleVT().SimpleTy, Custom);
 
776
    }
 
777
 
 
778
    setOperationAction(ISD::BUILD_VECTOR,       MVT::v2f64, Custom);
 
779
    setOperationAction(ISD::BUILD_VECTOR,       MVT::v2i64, Custom);
 
780
    setOperationAction(ISD::VECTOR_SHUFFLE,     MVT::v2f64, Custom);
 
781
    setOperationAction(ISD::VECTOR_SHUFFLE,     MVT::v2i64, Custom);
 
782
    setOperationAction(ISD::INSERT_VECTOR_ELT,  MVT::v2f64, Custom);
 
783
    setOperationAction(ISD::EXTRACT_VECTOR_ELT, MVT::v2f64, Custom);
 
784
 
 
785
    if (Subtarget->is64Bit()) {
 
786
      setOperationAction(ISD::INSERT_VECTOR_ELT,  MVT::v2i64, Custom);
 
787
      setOperationAction(ISD::EXTRACT_VECTOR_ELT, MVT::v2i64, Custom);
 
788
    }
 
789
 
 
790
    // Promote v16i8, v8i16, v4i32 load, select, and, or, xor to v2i64.
 
791
    for (unsigned i = (unsigned)MVT::v16i8; i != (unsigned)MVT::v2i64; i++) {
 
792
      MVT::SimpleValueType SVT = (MVT::SimpleValueType)i;
 
793
      EVT VT = SVT;
 
794
 
 
795
      // Do not attempt to promote non-128-bit vectors
 
796
      if (!VT.is128BitVector())
 
797
        continue;
 
798
      
 
799
      setOperationAction(ISD::AND,    SVT, Promote);
 
800
      AddPromotedToType (ISD::AND,    SVT, MVT::v2i64);
 
801
      setOperationAction(ISD::OR,     SVT, Promote);
 
802
      AddPromotedToType (ISD::OR,     SVT, MVT::v2i64);
 
803
      setOperationAction(ISD::XOR,    SVT, Promote);
 
804
      AddPromotedToType (ISD::XOR,    SVT, MVT::v2i64);
 
805
      setOperationAction(ISD::LOAD,   SVT, Promote);
 
806
      AddPromotedToType (ISD::LOAD,   SVT, MVT::v2i64);
 
807
      setOperationAction(ISD::SELECT, SVT, Promote);
 
808
      AddPromotedToType (ISD::SELECT, SVT, MVT::v2i64);
 
809
    }
 
810
 
 
811
    setTruncStoreAction(MVT::f64, MVT::f32, Expand);
 
812
 
 
813
    // Custom lower v2i64 and v2f64 selects.
 
814
    setOperationAction(ISD::LOAD,               MVT::v2f64, Legal);
 
815
    setOperationAction(ISD::LOAD,               MVT::v2i64, Legal);
 
816
    setOperationAction(ISD::SELECT,             MVT::v2f64, Custom);
 
817
    setOperationAction(ISD::SELECT,             MVT::v2i64, Custom);
 
818
 
 
819
    setOperationAction(ISD::FP_TO_SINT,         MVT::v4i32, Legal);
 
820
    setOperationAction(ISD::SINT_TO_FP,         MVT::v4i32, Legal);
 
821
    if (!DisableMMX && Subtarget->hasMMX()) {
 
822
      setOperationAction(ISD::FP_TO_SINT,         MVT::v2i32, Custom);
 
823
      setOperationAction(ISD::SINT_TO_FP,         MVT::v2i32, Custom);
 
824
    }
 
825
  }
 
826
 
 
827
  if (Subtarget->hasSSE41()) {
 
828
    setOperationAction(ISD::FFLOOR,             MVT::f32,   Legal);
 
829
    setOperationAction(ISD::FCEIL,              MVT::f32,   Legal);
 
830
    setOperationAction(ISD::FTRUNC,             MVT::f32,   Legal);
 
831
    setOperationAction(ISD::FRINT,              MVT::f32,   Legal);
 
832
    setOperationAction(ISD::FNEARBYINT,         MVT::f32,   Legal);
 
833
    setOperationAction(ISD::FFLOOR,             MVT::f64,   Legal);
 
834
    setOperationAction(ISD::FCEIL,              MVT::f64,   Legal);
 
835
    setOperationAction(ISD::FTRUNC,             MVT::f64,   Legal);
 
836
    setOperationAction(ISD::FRINT,              MVT::f64,   Legal);
 
837
    setOperationAction(ISD::FNEARBYINT,         MVT::f64,   Legal);
 
838
 
 
839
    // FIXME: Do we need to handle scalar-to-vector here?
 
840
    setOperationAction(ISD::MUL,                MVT::v4i32, Legal);
 
841
 
 
842
    // Can turn SHL into an integer multiply.
 
843
    setOperationAction(ISD::SHL,                MVT::v4i32, Custom);
 
844
    setOperationAction(ISD::SHL,                MVT::v16i8, Custom);
 
845
 
 
846
    // i8 and i16 vectors are custom , because the source register and source
 
847
    // source memory operand types are not the same width.  f32 vectors are
 
848
    // custom since the immediate controlling the insert encodes additional
 
849
    // information.
 
850
    setOperationAction(ISD::INSERT_VECTOR_ELT,  MVT::v16i8, Custom);
 
851
    setOperationAction(ISD::INSERT_VECTOR_ELT,  MVT::v8i16, Custom);
 
852
    setOperationAction(ISD::INSERT_VECTOR_ELT,  MVT::v4i32, Custom);
 
853
    setOperationAction(ISD::INSERT_VECTOR_ELT,  MVT::v4f32, Custom);
 
854
 
 
855
    setOperationAction(ISD::EXTRACT_VECTOR_ELT, MVT::v16i8, Custom);
 
856
    setOperationAction(ISD::EXTRACT_VECTOR_ELT, MVT::v8i16, Custom);
 
857
    setOperationAction(ISD::EXTRACT_VECTOR_ELT, MVT::v4i32, Custom);
 
858
    setOperationAction(ISD::EXTRACT_VECTOR_ELT, MVT::v4f32, Custom);
 
859
 
 
860
    if (Subtarget->is64Bit()) {
 
861
      setOperationAction(ISD::INSERT_VECTOR_ELT,  MVT::v2i64, Legal);
 
862
      setOperationAction(ISD::EXTRACT_VECTOR_ELT, MVT::v2i64, Legal);
 
863
    }
 
864
  }
 
865
 
 
866
  if (Subtarget->hasSSE42()) {
 
867
    setOperationAction(ISD::VSETCC,             MVT::v2i64, Custom);
 
868
  }
 
869
 
 
870
  if (!UseSoftFloat && Subtarget->hasAVX()) {
 
871
    addRegisterClass(MVT::v8f32, X86::VR256RegisterClass);
 
872
    addRegisterClass(MVT::v4f64, X86::VR256RegisterClass);
 
873
    addRegisterClass(MVT::v8i32, X86::VR256RegisterClass);
 
874
    addRegisterClass(MVT::v4i64, X86::VR256RegisterClass);
 
875
    addRegisterClass(MVT::v32i8, X86::VR256RegisterClass);
 
876
 
 
877
    setOperationAction(ISD::LOAD,               MVT::v8f32, Legal);
 
878
    setOperationAction(ISD::LOAD,               MVT::v8i32, Legal);
 
879
    setOperationAction(ISD::LOAD,               MVT::v4f64, Legal);
 
880
    setOperationAction(ISD::LOAD,               MVT::v4i64, Legal);
 
881
    setOperationAction(ISD::FADD,               MVT::v8f32, Legal);
 
882
    setOperationAction(ISD::FSUB,               MVT::v8f32, Legal);
 
883
    setOperationAction(ISD::FMUL,               MVT::v8f32, Legal);
 
884
    setOperationAction(ISD::FDIV,               MVT::v8f32, Legal);
 
885
    setOperationAction(ISD::FSQRT,              MVT::v8f32, Legal);
 
886
    setOperationAction(ISD::FNEG,               MVT::v8f32, Custom);
 
887
    setOperationAction(ISD::BUILD_VECTOR,       MVT::v8f32, Custom);
 
888
    //setOperationAction(ISD::VECTOR_SHUFFLE,     MVT::v8f32, Custom);
 
889
    //setOperationAction(ISD::EXTRACT_VECTOR_ELT, MVT::v8f32, Custom);
 
890
    //setOperationAction(ISD::SELECT,             MVT::v8f32, Custom);
 
891
    //setOperationAction(ISD::VSETCC,             MVT::v8f32, Custom);
 
892
 
 
893
    // Operations to consider commented out -v16i16 v32i8
 
894
    //setOperationAction(ISD::ADD,                MVT::v16i16, Legal);
 
895
    setOperationAction(ISD::ADD,                MVT::v8i32, Custom);
 
896
    setOperationAction(ISD::ADD,                MVT::v4i64, Custom);
 
897
    //setOperationAction(ISD::SUB,                MVT::v32i8, Legal);
 
898
    //setOperationAction(ISD::SUB,                MVT::v16i16, Legal);
 
899
    setOperationAction(ISD::SUB,                MVT::v8i32, Custom);
 
900
    setOperationAction(ISD::SUB,                MVT::v4i64, Custom);
 
901
    //setOperationAction(ISD::MUL,                MVT::v16i16, Legal);
 
902
    setOperationAction(ISD::FADD,               MVT::v4f64, Legal);
 
903
    setOperationAction(ISD::FSUB,               MVT::v4f64, Legal);
 
904
    setOperationAction(ISD::FMUL,               MVT::v4f64, Legal);
 
905
    setOperationAction(ISD::FDIV,               MVT::v4f64, Legal);
 
906
    setOperationAction(ISD::FSQRT,              MVT::v4f64, Legal);
 
907
    setOperationAction(ISD::FNEG,               MVT::v4f64, Custom);
 
908
 
 
909
    setOperationAction(ISD::VSETCC,             MVT::v4f64, Custom);
 
910
    // setOperationAction(ISD::VSETCC,             MVT::v32i8, Custom);
 
911
    // setOperationAction(ISD::VSETCC,             MVT::v16i16, Custom);
 
912
    setOperationAction(ISD::VSETCC,             MVT::v8i32, Custom);
 
913
 
 
914
    // setOperationAction(ISD::SCALAR_TO_VECTOR,   MVT::v32i8, Custom);
 
915
    // setOperationAction(ISD::SCALAR_TO_VECTOR,   MVT::v16i16, Custom);
 
916
    // setOperationAction(ISD::INSERT_VECTOR_ELT,  MVT::v16i16, Custom);
 
917
    setOperationAction(ISD::INSERT_VECTOR_ELT,  MVT::v8i32, Custom);
 
918
    setOperationAction(ISD::INSERT_VECTOR_ELT,  MVT::v8f32, Custom);
 
919
 
 
920
    setOperationAction(ISD::BUILD_VECTOR,       MVT::v4f64, Custom);
 
921
    setOperationAction(ISD::BUILD_VECTOR,       MVT::v4i64, Custom);
 
922
    setOperationAction(ISD::VECTOR_SHUFFLE,     MVT::v4f64, Custom);
 
923
    setOperationAction(ISD::VECTOR_SHUFFLE,     MVT::v4i64, Custom);
 
924
    setOperationAction(ISD::INSERT_VECTOR_ELT,  MVT::v4f64, Custom);
 
925
    setOperationAction(ISD::EXTRACT_VECTOR_ELT, MVT::v4f64, Custom);
 
926
 
 
927
#if 0
 
928
    // Not sure we want to do this since there are no 256-bit integer
 
929
    // operations in AVX
 
930
 
 
931
    // Custom lower build_vector, vector_shuffle, and extract_vector_elt.
 
932
    // This includes 256-bit vectors
 
933
    for (unsigned i = (unsigned)MVT::v16i8; i != (unsigned)MVT::v4i64; ++i) {
 
934
      EVT VT = (MVT::SimpleValueType)i;
 
935
 
 
936
      // Do not attempt to custom lower non-power-of-2 vectors
 
937
      if (!isPowerOf2_32(VT.getVectorNumElements()))
 
938
        continue;
 
939
 
 
940
      setOperationAction(ISD::BUILD_VECTOR,       VT, Custom);
 
941
      setOperationAction(ISD::VECTOR_SHUFFLE,     VT, Custom);
 
942
      setOperationAction(ISD::EXTRACT_VECTOR_ELT, VT, Custom);
 
943
    }
 
944
 
 
945
    if (Subtarget->is64Bit()) {
 
946
      setOperationAction(ISD::INSERT_VECTOR_ELT,  MVT::v4i64, Custom);
 
947
      setOperationAction(ISD::EXTRACT_VECTOR_ELT, MVT::v4i64, Custom);
 
948
    }
 
949
#endif
 
950
 
 
951
#if 0
 
952
    // Not sure we want to do this since there are no 256-bit integer
 
953
    // operations in AVX
 
954
 
 
955
    // Promote v32i8, v16i16, v8i32 load, select, and, or, xor to v4i64.
 
956
    // Including 256-bit vectors
 
957
    for (unsigned i = (unsigned)MVT::v16i8; i != (unsigned)MVT::v4i64; i++) {
 
958
      EVT VT = (MVT::SimpleValueType)i;
 
959
 
 
960
      if (!VT.is256BitVector()) {
 
961
        continue;
 
962
      }
 
963
      setOperationAction(ISD::AND,    VT, Promote);
 
964
      AddPromotedToType (ISD::AND,    VT, MVT::v4i64);
 
965
      setOperationAction(ISD::OR,     VT, Promote);
 
966
      AddPromotedToType (ISD::OR,     VT, MVT::v4i64);
 
967
      setOperationAction(ISD::XOR,    VT, Promote);
 
968
      AddPromotedToType (ISD::XOR,    VT, MVT::v4i64);
 
969
      setOperationAction(ISD::LOAD,   VT, Promote);
 
970
      AddPromotedToType (ISD::LOAD,   VT, MVT::v4i64);
 
971
      setOperationAction(ISD::SELECT, VT, Promote);
 
972
      AddPromotedToType (ISD::SELECT, VT, MVT::v4i64);
 
973
    }
 
974
 
 
975
    setTruncStoreAction(MVT::f64, MVT::f32, Expand);
 
976
#endif
 
977
  }
 
978
 
 
979
  // We want to custom lower some of our intrinsics.
 
980
  setOperationAction(ISD::INTRINSIC_WO_CHAIN, MVT::Other, Custom);
 
981
 
 
982
  // Add/Sub/Mul with overflow operations are custom lowered.
 
983
  setOperationAction(ISD::SADDO, MVT::i32, Custom);
 
984
  setOperationAction(ISD::UADDO, MVT::i32, Custom);
 
985
  setOperationAction(ISD::SSUBO, MVT::i32, Custom);
 
986
  setOperationAction(ISD::USUBO, MVT::i32, Custom);
 
987
  setOperationAction(ISD::SMULO, MVT::i32, Custom);
 
988
 
 
989
  // Only custom-lower 64-bit SADDO and friends on 64-bit because we don't
 
990
  // handle type legalization for these operations here.
 
991
  //
 
992
  // FIXME: We really should do custom legalization for addition and
 
993
  // subtraction on x86-32 once PR3203 is fixed.  We really can't do much better
 
994
  // than generic legalization for 64-bit multiplication-with-overflow, though.
 
995
  if (Subtarget->is64Bit()) {
 
996
    setOperationAction(ISD::SADDO, MVT::i64, Custom);
 
997
    setOperationAction(ISD::UADDO, MVT::i64, Custom);
 
998
    setOperationAction(ISD::SSUBO, MVT::i64, Custom);
 
999
    setOperationAction(ISD::USUBO, MVT::i64, Custom);
 
1000
    setOperationAction(ISD::SMULO, MVT::i64, Custom);
 
1001
  }
 
1002
 
 
1003
  if (!Subtarget->is64Bit()) {
 
1004
    // These libcalls are not available in 32-bit.
 
1005
    setLibcallName(RTLIB::SHL_I128, 0);
 
1006
    setLibcallName(RTLIB::SRL_I128, 0);
 
1007
    setLibcallName(RTLIB::SRA_I128, 0);
 
1008
  }
 
1009
 
 
1010
  // We have target-specific dag combine patterns for the following nodes:
 
1011
  setTargetDAGCombine(ISD::VECTOR_SHUFFLE);
 
1012
  setTargetDAGCombine(ISD::EXTRACT_VECTOR_ELT);
 
1013
  setTargetDAGCombine(ISD::BUILD_VECTOR);
 
1014
  setTargetDAGCombine(ISD::SELECT);
 
1015
  setTargetDAGCombine(ISD::SHL);
 
1016
  setTargetDAGCombine(ISD::SRA);
 
1017
  setTargetDAGCombine(ISD::SRL);
 
1018
  setTargetDAGCombine(ISD::OR);
 
1019
  setTargetDAGCombine(ISD::STORE);
 
1020
  setTargetDAGCombine(ISD::ZERO_EXTEND);
 
1021
  if (Subtarget->is64Bit())
 
1022
    setTargetDAGCombine(ISD::MUL);
 
1023
 
 
1024
  computeRegisterProperties();
 
1025
 
 
1026
  // FIXME: These should be based on subtarget info. Plus, the values should
 
1027
  // be smaller when we are in optimizing for size mode.
 
1028
  maxStoresPerMemset = 16; // For @llvm.memset -> sequence of stores
 
1029
  maxStoresPerMemcpy = 8; // For @llvm.memcpy -> sequence of stores
 
1030
  maxStoresPerMemmove = 3; // For @llvm.memmove -> sequence of stores
 
1031
  setPrefLoopAlignment(16);
 
1032
  benefitFromCodePlacementOpt = true;
 
1033
}
 
1034
 
 
1035
 
 
1036
MVT::SimpleValueType X86TargetLowering::getSetCCResultType(EVT VT) const {
 
1037
  return MVT::i8;
 
1038
}
 
1039
 
 
1040
 
 
1041
/// getMaxByValAlign - Helper for getByValTypeAlignment to determine
 
1042
/// the desired ByVal argument alignment.
 
1043
static void getMaxByValAlign(const Type *Ty, unsigned &MaxAlign) {
 
1044
  if (MaxAlign == 16)
 
1045
    return;
 
1046
  if (const VectorType *VTy = dyn_cast<VectorType>(Ty)) {
 
1047
    if (VTy->getBitWidth() == 128)
 
1048
      MaxAlign = 16;
 
1049
  } else if (const ArrayType *ATy = dyn_cast<ArrayType>(Ty)) {
 
1050
    unsigned EltAlign = 0;
 
1051
    getMaxByValAlign(ATy->getElementType(), EltAlign);
 
1052
    if (EltAlign > MaxAlign)
 
1053
      MaxAlign = EltAlign;
 
1054
  } else if (const StructType *STy = dyn_cast<StructType>(Ty)) {
 
1055
    for (unsigned i = 0, e = STy->getNumElements(); i != e; ++i) {
 
1056
      unsigned EltAlign = 0;
 
1057
      getMaxByValAlign(STy->getElementType(i), EltAlign);
 
1058
      if (EltAlign > MaxAlign)
 
1059
        MaxAlign = EltAlign;
 
1060
      if (MaxAlign == 16)
 
1061
        break;
 
1062
    }
 
1063
  }
 
1064
  return;
 
1065
}
 
1066
 
 
1067
/// getByValTypeAlignment - Return the desired alignment for ByVal aggregate
 
1068
/// function arguments in the caller parameter area. For X86, aggregates
 
1069
/// that contain SSE vectors are placed at 16-byte boundaries while the rest
 
1070
/// are at 4-byte boundaries.
 
1071
unsigned X86TargetLowering::getByValTypeAlignment(const Type *Ty) const {
 
1072
  if (Subtarget->is64Bit()) {
 
1073
    // Max of 8 and alignment of type.
 
1074
    unsigned TyAlign = TD->getABITypeAlignment(Ty);
 
1075
    if (TyAlign > 8)
 
1076
      return TyAlign;
 
1077
    return 8;
 
1078
  }
 
1079
 
 
1080
  unsigned Align = 4;
 
1081
  if (Subtarget->hasSSE1())
 
1082
    getMaxByValAlign(Ty, Align);
 
1083
  return Align;
 
1084
}
 
1085
 
 
1086
/// getOptimalMemOpType - Returns the target specific optimal type for load
 
1087
/// and store operations as a result of memset, memcpy, and memmove
 
1088
/// lowering. If DstAlign is zero that means it's safe to destination
 
1089
/// alignment can satisfy any constraint. Similarly if SrcAlign is zero it
 
1090
/// means there isn't a need to check it against alignment requirement,
 
1091
/// probably because the source does not need to be loaded. If
 
1092
/// 'NonScalarIntSafe' is true, that means it's safe to return a
 
1093
/// non-scalar-integer type, e.g. empty string source, constant, or loaded
 
1094
/// from memory. 'MemcpyStrSrc' indicates whether the memcpy source is
 
1095
/// constant so it does not need to be loaded.
 
1096
/// It returns EVT::Other if the type should be determined using generic
 
1097
/// target-independent logic.
 
1098
EVT
 
1099
X86TargetLowering::getOptimalMemOpType(uint64_t Size,
 
1100
                                       unsigned DstAlign, unsigned SrcAlign,
 
1101
                                       bool NonScalarIntSafe,
 
1102
                                       bool MemcpyStrSrc,
 
1103
                                       MachineFunction &MF) const {
 
1104
  // FIXME: This turns off use of xmm stores for memset/memcpy on targets like
 
1105
  // linux.  This is because the stack realignment code can't handle certain
 
1106
  // cases like PR2962.  This should be removed when PR2962 is fixed.
 
1107
  const Function *F = MF.getFunction();
 
1108
  if (NonScalarIntSafe &&
 
1109
      !F->hasFnAttr(Attribute::NoImplicitFloat)) {
 
1110
    if (Size >= 16 &&
 
1111
        (Subtarget->isUnalignedMemAccessFast() ||
 
1112
         ((DstAlign == 0 || DstAlign >= 16) &&
 
1113
          (SrcAlign == 0 || SrcAlign >= 16))) &&
 
1114
        Subtarget->getStackAlignment() >= 16) {
 
1115
      if (Subtarget->hasSSE2())
 
1116
        return MVT::v4i32;
 
1117
      if (Subtarget->hasSSE1())
 
1118
        return MVT::v4f32;
 
1119
    } else if (!MemcpyStrSrc && Size >= 8 &&
 
1120
               !Subtarget->is64Bit() &&
 
1121
               Subtarget->getStackAlignment() >= 8 &&
 
1122
               Subtarget->hasSSE2()) {
 
1123
      // Do not use f64 to lower memcpy if source is string constant. It's
 
1124
      // better to use i32 to avoid the loads.
 
1125
      return MVT::f64;
 
1126
    }
 
1127
  }
 
1128
  if (Subtarget->is64Bit() && Size >= 8)
 
1129
    return MVT::i64;
 
1130
  return MVT::i32;
 
1131
}
 
1132
 
 
1133
/// getJumpTableEncoding - Return the entry encoding for a jump table in the
 
1134
/// current function.  The returned value is a member of the
 
1135
/// MachineJumpTableInfo::JTEntryKind enum.
 
1136
unsigned X86TargetLowering::getJumpTableEncoding() const {
 
1137
  // In GOT pic mode, each entry in the jump table is emitted as a @GOTOFF
 
1138
  // symbol.
 
1139
  if (getTargetMachine().getRelocationModel() == Reloc::PIC_ &&
 
1140
      Subtarget->isPICStyleGOT())
 
1141
    return MachineJumpTableInfo::EK_Custom32;
 
1142
  
 
1143
  // Otherwise, use the normal jump table encoding heuristics.
 
1144
  return TargetLowering::getJumpTableEncoding();
 
1145
}
 
1146
 
 
1147
/// getPICBaseSymbol - Return the X86-32 PIC base.
 
1148
MCSymbol *
 
1149
X86TargetLowering::getPICBaseSymbol(const MachineFunction *MF,
 
1150
                                    MCContext &Ctx) const {
 
1151
  const MCAsmInfo &MAI = *getTargetMachine().getMCAsmInfo();
 
1152
  return Ctx.GetOrCreateSymbol(Twine(MAI.getPrivateGlobalPrefix())+
 
1153
                               Twine(MF->getFunctionNumber())+"$pb");
 
1154
}
 
1155
 
 
1156
 
 
1157
const MCExpr *
 
1158
X86TargetLowering::LowerCustomJumpTableEntry(const MachineJumpTableInfo *MJTI,
 
1159
                                             const MachineBasicBlock *MBB,
 
1160
                                             unsigned uid,MCContext &Ctx) const{
 
1161
  assert(getTargetMachine().getRelocationModel() == Reloc::PIC_ &&
 
1162
         Subtarget->isPICStyleGOT());
 
1163
  // In 32-bit ELF systems, our jump table entries are formed with @GOTOFF
 
1164
  // entries.
 
1165
  return MCSymbolRefExpr::Create(MBB->getSymbol(),
 
1166
                                 MCSymbolRefExpr::VK_GOTOFF, Ctx);
 
1167
}
 
1168
 
 
1169
/// getPICJumpTableRelocaBase - Returns relocation base for the given PIC
 
1170
/// jumptable.
 
1171
SDValue X86TargetLowering::getPICJumpTableRelocBase(SDValue Table,
 
1172
                                                    SelectionDAG &DAG) const {
 
1173
  if (!Subtarget->is64Bit())
 
1174
    // This doesn't have DebugLoc associated with it, but is not really the
 
1175
    // same as a Register.
 
1176
    return DAG.getNode(X86ISD::GlobalBaseReg, DebugLoc(), getPointerTy());
 
1177
  return Table;
 
1178
}
 
1179
 
 
1180
/// getPICJumpTableRelocBaseExpr - This returns the relocation base for the
 
1181
/// given PIC jumptable, the same as getPICJumpTableRelocBase, but as an
 
1182
/// MCExpr.
 
1183
const MCExpr *X86TargetLowering::
 
1184
getPICJumpTableRelocBaseExpr(const MachineFunction *MF, unsigned JTI,
 
1185
                             MCContext &Ctx) const {
 
1186
  // X86-64 uses RIP relative addressing based on the jump table label.
 
1187
  if (Subtarget->isPICStyleRIPRel())
 
1188
    return TargetLowering::getPICJumpTableRelocBaseExpr(MF, JTI, Ctx);
 
1189
 
 
1190
  // Otherwise, the reference is relative to the PIC base.
 
1191
  return MCSymbolRefExpr::Create(getPICBaseSymbol(MF, Ctx), Ctx);
 
1192
}
 
1193
 
 
1194
/// getFunctionAlignment - Return the Log2 alignment of this function.
 
1195
unsigned X86TargetLowering::getFunctionAlignment(const Function *F) const {
 
1196
  return F->hasFnAttr(Attribute::OptimizeForSize) ? 0 : 4;
 
1197
}
 
1198
 
 
1199
std::pair<const TargetRegisterClass*, uint8_t>
 
1200
X86TargetLowering::findRepresentativeClass(EVT VT) const{
 
1201
  const TargetRegisterClass *RRC = 0;
 
1202
  uint8_t Cost = 1;
 
1203
  switch (VT.getSimpleVT().SimpleTy) {
 
1204
  default:
 
1205
    return TargetLowering::findRepresentativeClass(VT);
 
1206
  case MVT::i8: case MVT::i16: case MVT::i32: case MVT::i64:
 
1207
    RRC = (Subtarget->is64Bit()
 
1208
           ? X86::GR64RegisterClass : X86::GR32RegisterClass);
 
1209
    break;
 
1210
  case MVT::v8i8: case MVT::v4i16:
 
1211
  case MVT::v2i32: case MVT::v1i64: 
 
1212
    RRC = X86::VR64RegisterClass;
 
1213
    break;
 
1214
  case MVT::f32: case MVT::f64:
 
1215
  case MVT::v16i8: case MVT::v8i16: case MVT::v4i32: case MVT::v2i64:
 
1216
  case MVT::v4f32: case MVT::v2f64:
 
1217
  case MVT::v32i8: case MVT::v8i32: case MVT::v4i64: case MVT::v8f32:
 
1218
  case MVT::v4f64:
 
1219
    RRC = X86::VR128RegisterClass;
 
1220
    break;
 
1221
  }
 
1222
  return std::make_pair(RRC, Cost);
 
1223
}
 
1224
 
 
1225
unsigned
 
1226
X86TargetLowering::getRegPressureLimit(const TargetRegisterClass *RC,
 
1227
                                       MachineFunction &MF) const {
 
1228
  unsigned FPDiff = RegInfo->hasFP(MF) ? 1 : 0;
 
1229
  switch (RC->getID()) {
 
1230
  default:
 
1231
    return 0;
 
1232
  case X86::GR32RegClassID:
 
1233
    return 4 - FPDiff;
 
1234
  case X86::GR64RegClassID:
 
1235
    return 8 - FPDiff;
 
1236
  case X86::VR128RegClassID:
 
1237
    return Subtarget->is64Bit() ? 10 : 4;
 
1238
  case X86::VR64RegClassID:
 
1239
    return 4;
 
1240
  }
 
1241
}
 
1242
 
 
1243
bool X86TargetLowering::getStackCookieLocation(unsigned &AddressSpace,
 
1244
                                               unsigned &Offset) const {
 
1245
  if (!Subtarget->isTargetLinux())
 
1246
    return false;
 
1247
 
 
1248
  if (Subtarget->is64Bit()) {
 
1249
    // %fs:0x28, unless we're using a Kernel code model, in which case it's %gs:
 
1250
    Offset = 0x28;
 
1251
    if (getTargetMachine().getCodeModel() == CodeModel::Kernel)
 
1252
      AddressSpace = 256;
 
1253
    else
 
1254
      AddressSpace = 257;
 
1255
  } else {
 
1256
    // %gs:0x14 on i386
 
1257
    Offset = 0x14;
 
1258
    AddressSpace = 256;
 
1259
  }
 
1260
  return true;
 
1261
}
 
1262
 
 
1263
 
 
1264
//===----------------------------------------------------------------------===//
 
1265
//               Return Value Calling Convention Implementation
 
1266
//===----------------------------------------------------------------------===//
 
1267
 
 
1268
#include "X86GenCallingConv.inc"
 
1269
 
 
1270
bool 
 
1271
X86TargetLowering::CanLowerReturn(CallingConv::ID CallConv, bool isVarArg,
 
1272
                        const SmallVectorImpl<ISD::OutputArg> &Outs,
 
1273
                        LLVMContext &Context) const {
 
1274
  SmallVector<CCValAssign, 16> RVLocs;
 
1275
  CCState CCInfo(CallConv, isVarArg, getTargetMachine(),
 
1276
                 RVLocs, Context);
 
1277
  return CCInfo.CheckReturn(Outs, RetCC_X86);
 
1278
}
 
1279
 
 
1280
SDValue
 
1281
X86TargetLowering::LowerReturn(SDValue Chain,
 
1282
                               CallingConv::ID CallConv, bool isVarArg,
 
1283
                               const SmallVectorImpl<ISD::OutputArg> &Outs,
 
1284
                               const SmallVectorImpl<SDValue> &OutVals,
 
1285
                               DebugLoc dl, SelectionDAG &DAG) const {
 
1286
  MachineFunction &MF = DAG.getMachineFunction();
 
1287
  X86MachineFunctionInfo *FuncInfo = MF.getInfo<X86MachineFunctionInfo>();
 
1288
 
 
1289
  SmallVector<CCValAssign, 16> RVLocs;
 
1290
  CCState CCInfo(CallConv, isVarArg, getTargetMachine(),
 
1291
                 RVLocs, *DAG.getContext());
 
1292
  CCInfo.AnalyzeReturn(Outs, RetCC_X86);
 
1293
 
 
1294
  // Add the regs to the liveout set for the function.
 
1295
  MachineRegisterInfo &MRI = DAG.getMachineFunction().getRegInfo();
 
1296
  for (unsigned i = 0; i != RVLocs.size(); ++i)
 
1297
    if (RVLocs[i].isRegLoc() && !MRI.isLiveOut(RVLocs[i].getLocReg()))
 
1298
      MRI.addLiveOut(RVLocs[i].getLocReg());
 
1299
 
 
1300
  SDValue Flag;
 
1301
 
 
1302
  SmallVector<SDValue, 6> RetOps;
 
1303
  RetOps.push_back(Chain); // Operand #0 = Chain (updated below)
 
1304
  // Operand #1 = Bytes To Pop
 
1305
  RetOps.push_back(DAG.getTargetConstant(FuncInfo->getBytesToPopOnReturn(),
 
1306
                   MVT::i16));
 
1307
 
 
1308
  // Copy the result values into the output registers.
 
1309
  for (unsigned i = 0; i != RVLocs.size(); ++i) {
 
1310
    CCValAssign &VA = RVLocs[i];
 
1311
    assert(VA.isRegLoc() && "Can only return in registers!");
 
1312
    SDValue ValToCopy = OutVals[i];
 
1313
    EVT ValVT = ValToCopy.getValueType();
 
1314
 
 
1315
    // If this is x86-64, and we disabled SSE, we can't return FP values
 
1316
    if ((ValVT == MVT::f32 || ValVT == MVT::f64) &&
 
1317
        (Subtarget->is64Bit() && !Subtarget->hasSSE1())) {
 
1318
      report_fatal_error("SSE register return with SSE disabled");
 
1319
    }
 
1320
    // Likewise we can't return F64 values with SSE1 only.  gcc does so, but
 
1321
    // llvm-gcc has never done it right and no one has noticed, so this
 
1322
    // should be OK for now.
 
1323
    if (ValVT == MVT::f64 &&
 
1324
        (Subtarget->is64Bit() && !Subtarget->hasSSE2()))
 
1325
      report_fatal_error("SSE2 register return with SSE2 disabled");
 
1326
 
 
1327
    // Returns in ST0/ST1 are handled specially: these are pushed as operands to
 
1328
    // the RET instruction and handled by the FP Stackifier.
 
1329
    if (VA.getLocReg() == X86::ST0 ||
 
1330
        VA.getLocReg() == X86::ST1) {
 
1331
      // If this is a copy from an xmm register to ST(0), use an FPExtend to
 
1332
      // change the value to the FP stack register class.
 
1333
      if (isScalarFPTypeInSSEReg(VA.getValVT()))
 
1334
        ValToCopy = DAG.getNode(ISD::FP_EXTEND, dl, MVT::f80, ValToCopy);
 
1335
      RetOps.push_back(ValToCopy);
 
1336
      // Don't emit a copytoreg.
 
1337
      continue;
 
1338
    }
 
1339
 
 
1340
    // 64-bit vector (MMX) values are returned in XMM0 / XMM1 except for v1i64
 
1341
    // which is returned in RAX / RDX.
 
1342
    if (Subtarget->is64Bit()) {
 
1343
      if (ValVT.isVector() && ValVT.getSizeInBits() == 64) {
 
1344
        ValToCopy = DAG.getNode(ISD::BIT_CONVERT, dl, MVT::i64, ValToCopy);
 
1345
        if (VA.getLocReg() == X86::XMM0 || VA.getLocReg() == X86::XMM1) {
 
1346
          ValToCopy = DAG.getNode(ISD::SCALAR_TO_VECTOR, dl, MVT::v2i64,
 
1347
                                  ValToCopy);
 
1348
          
 
1349
          // If we don't have SSE2 available, convert to v4f32 so the generated
 
1350
          // register is legal.
 
1351
          if (!Subtarget->hasSSE2())
 
1352
            ValToCopy = DAG.getNode(ISD::BIT_CONVERT, dl, MVT::v4f32,ValToCopy);
 
1353
        }
 
1354
      }
 
1355
    }
 
1356
    
 
1357
    Chain = DAG.getCopyToReg(Chain, dl, VA.getLocReg(), ValToCopy, Flag);
 
1358
    Flag = Chain.getValue(1);
 
1359
  }
 
1360
 
 
1361
  // The x86-64 ABI for returning structs by value requires that we copy
 
1362
  // the sret argument into %rax for the return. We saved the argument into
 
1363
  // a virtual register in the entry block, so now we copy the value out
 
1364
  // and into %rax.
 
1365
  if (Subtarget->is64Bit() &&
 
1366
      DAG.getMachineFunction().getFunction()->hasStructRetAttr()) {
 
1367
    MachineFunction &MF = DAG.getMachineFunction();
 
1368
    X86MachineFunctionInfo *FuncInfo = MF.getInfo<X86MachineFunctionInfo>();
 
1369
    unsigned Reg = FuncInfo->getSRetReturnReg();
 
1370
    assert(Reg && 
 
1371
           "SRetReturnReg should have been set in LowerFormalArguments().");
 
1372
    SDValue Val = DAG.getCopyFromReg(Chain, dl, Reg, getPointerTy());
 
1373
 
 
1374
    Chain = DAG.getCopyToReg(Chain, dl, X86::RAX, Val, Flag);
 
1375
    Flag = Chain.getValue(1);
 
1376
 
 
1377
    // RAX now acts like a return value.
 
1378
    MRI.addLiveOut(X86::RAX);
 
1379
  }
 
1380
 
 
1381
  RetOps[0] = Chain;  // Update chain.
 
1382
 
 
1383
  // Add the flag if we have it.
 
1384
  if (Flag.getNode())
 
1385
    RetOps.push_back(Flag);
 
1386
 
 
1387
  return DAG.getNode(X86ISD::RET_FLAG, dl,
 
1388
                     MVT::Other, &RetOps[0], RetOps.size());
 
1389
}
 
1390
 
 
1391
/// LowerCallResult - Lower the result values of a call into the
 
1392
/// appropriate copies out of appropriate physical registers.
 
1393
///
 
1394
SDValue
 
1395
X86TargetLowering::LowerCallResult(SDValue Chain, SDValue InFlag,
 
1396
                                   CallingConv::ID CallConv, bool isVarArg,
 
1397
                                   const SmallVectorImpl<ISD::InputArg> &Ins,
 
1398
                                   DebugLoc dl, SelectionDAG &DAG,
 
1399
                                   SmallVectorImpl<SDValue> &InVals) const {
 
1400
 
 
1401
  // Assign locations to each value returned by this call.
 
1402
  SmallVector<CCValAssign, 16> RVLocs;
 
1403
  bool Is64Bit = Subtarget->is64Bit();
 
1404
  CCState CCInfo(CallConv, isVarArg, getTargetMachine(),
 
1405
                 RVLocs, *DAG.getContext());
 
1406
  CCInfo.AnalyzeCallResult(Ins, RetCC_X86);
 
1407
 
 
1408
  // Copy all of the result registers out of their specified physreg.
 
1409
  for (unsigned i = 0; i != RVLocs.size(); ++i) {
 
1410
    CCValAssign &VA = RVLocs[i];
 
1411
    EVT CopyVT = VA.getValVT();
 
1412
 
 
1413
    // If this is x86-64, and we disabled SSE, we can't return FP values
 
1414
    if ((CopyVT == MVT::f32 || CopyVT == MVT::f64) &&
 
1415
        ((Is64Bit || Ins[i].Flags.isInReg()) && !Subtarget->hasSSE1())) {
 
1416
      report_fatal_error("SSE register return with SSE disabled");
 
1417
    }
 
1418
 
 
1419
    SDValue Val;
 
1420
 
 
1421
    // If this is a call to a function that returns an fp value on the floating
 
1422
    // point stack, we must guarantee the the value is popped from the stack, so
 
1423
    // a CopyFromReg is not good enough - the copy instruction may be eliminated
 
1424
    // if the return value is not used. We use the FpGET_ST0 instructions
 
1425
    // instead.
 
1426
    if (VA.getLocReg() == X86::ST0 || VA.getLocReg() == X86::ST1) {
 
1427
      // If we prefer to use the value in xmm registers, copy it out as f80 and
 
1428
      // use a truncate to move it from fp stack reg to xmm reg.
 
1429
      if (isScalarFPTypeInSSEReg(VA.getValVT())) CopyVT = MVT::f80;
 
1430
      bool isST0 = VA.getLocReg() == X86::ST0;
 
1431
      unsigned Opc = 0;
 
1432
      if (CopyVT == MVT::f32) Opc = isST0 ? X86::FpGET_ST0_32:X86::FpGET_ST1_32;
 
1433
      if (CopyVT == MVT::f64) Opc = isST0 ? X86::FpGET_ST0_64:X86::FpGET_ST1_64;
 
1434
      if (CopyVT == MVT::f80) Opc = isST0 ? X86::FpGET_ST0_80:X86::FpGET_ST1_80;
 
1435
      SDValue Ops[] = { Chain, InFlag };
 
1436
      Chain = SDValue(DAG.getMachineNode(Opc, dl, CopyVT, MVT::Other, MVT::Flag,
 
1437
                                         Ops, 2), 1);
 
1438
      Val = Chain.getValue(0);
 
1439
 
 
1440
      // Round the f80 to the right size, which also moves it to the appropriate
 
1441
      // xmm register.
 
1442
      if (CopyVT != VA.getValVT())
 
1443
        Val = DAG.getNode(ISD::FP_ROUND, dl, VA.getValVT(), Val,
 
1444
                          // This truncation won't change the value.
 
1445
                          DAG.getIntPtrConstant(1));
 
1446
    } else if (Is64Bit && CopyVT.isVector() && CopyVT.getSizeInBits() == 64) {
 
1447
      // For x86-64, MMX values are returned in XMM0 / XMM1 except for v1i64.
 
1448
      if (VA.getLocReg() == X86::XMM0 || VA.getLocReg() == X86::XMM1) {
 
1449
        Chain = DAG.getCopyFromReg(Chain, dl, VA.getLocReg(),
 
1450
                                   MVT::v2i64, InFlag).getValue(1);
 
1451
        Val = Chain.getValue(0);
 
1452
        Val = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, MVT::i64,
 
1453
                          Val, DAG.getConstant(0, MVT::i64));
 
1454
      } else {
 
1455
        Chain = DAG.getCopyFromReg(Chain, dl, VA.getLocReg(),
 
1456
                                   MVT::i64, InFlag).getValue(1);
 
1457
        Val = Chain.getValue(0);
 
1458
      }
 
1459
      Val = DAG.getNode(ISD::BIT_CONVERT, dl, CopyVT, Val);
 
1460
    } else {
 
1461
      Chain = DAG.getCopyFromReg(Chain, dl, VA.getLocReg(),
 
1462
                                 CopyVT, InFlag).getValue(1);
 
1463
      Val = Chain.getValue(0);
 
1464
    }
 
1465
    InFlag = Chain.getValue(2);
 
1466
    InVals.push_back(Val);
 
1467
  }
 
1468
 
 
1469
  return Chain;
 
1470
}
 
1471
 
 
1472
 
 
1473
//===----------------------------------------------------------------------===//
 
1474
//                C & StdCall & Fast Calling Convention implementation
 
1475
//===----------------------------------------------------------------------===//
 
1476
//  StdCall calling convention seems to be standard for many Windows' API
 
1477
//  routines and around. It differs from C calling convention just a little:
 
1478
//  callee should clean up the stack, not caller. Symbols should be also
 
1479
//  decorated in some fancy way :) It doesn't support any vector arguments.
 
1480
//  For info on fast calling convention see Fast Calling Convention (tail call)
 
1481
//  implementation LowerX86_32FastCCCallTo.
 
1482
 
 
1483
/// CallIsStructReturn - Determines whether a call uses struct return
 
1484
/// semantics.
 
1485
static bool CallIsStructReturn(const SmallVectorImpl<ISD::OutputArg> &Outs) {
 
1486
  if (Outs.empty())
 
1487
    return false;
 
1488
 
 
1489
  return Outs[0].Flags.isSRet();
 
1490
}
 
1491
 
 
1492
/// ArgsAreStructReturn - Determines whether a function uses struct
 
1493
/// return semantics.
 
1494
static bool
 
1495
ArgsAreStructReturn(const SmallVectorImpl<ISD::InputArg> &Ins) {
 
1496
  if (Ins.empty())
 
1497
    return false;
 
1498
 
 
1499
  return Ins[0].Flags.isSRet();
 
1500
}
 
1501
 
 
1502
/// CCAssignFnForNode - Selects the correct CCAssignFn for a the
 
1503
/// given CallingConvention value.
 
1504
CCAssignFn *X86TargetLowering::CCAssignFnForNode(CallingConv::ID CC) const {
 
1505
  if (Subtarget->is64Bit()) {
 
1506
    if (CC == CallingConv::GHC)
 
1507
      return CC_X86_64_GHC;
 
1508
    else if (Subtarget->isTargetWin64())
 
1509
      return CC_X86_Win64_C;
 
1510
    else
 
1511
      return CC_X86_64_C;
 
1512
  }
 
1513
 
 
1514
  if (CC == CallingConv::X86_FastCall)
 
1515
    return CC_X86_32_FastCall;
 
1516
  else if (CC == CallingConv::X86_ThisCall)
 
1517
    return CC_X86_32_ThisCall;
 
1518
  else if (CC == CallingConv::Fast)
 
1519
    return CC_X86_32_FastCC;
 
1520
  else if (CC == CallingConv::GHC)
 
1521
    return CC_X86_32_GHC;
 
1522
  else
 
1523
    return CC_X86_32_C;
 
1524
}
 
1525
 
 
1526
/// CreateCopyOfByValArgument - Make a copy of an aggregate at address specified
 
1527
/// by "Src" to address "Dst" with size and alignment information specified by
 
1528
/// the specific parameter attribute. The copy will be passed as a byval
 
1529
/// function parameter.
 
1530
static SDValue
 
1531
CreateCopyOfByValArgument(SDValue Src, SDValue Dst, SDValue Chain,
 
1532
                          ISD::ArgFlagsTy Flags, SelectionDAG &DAG,
 
1533
                          DebugLoc dl) {
 
1534
  SDValue SizeNode     = DAG.getConstant(Flags.getByValSize(), MVT::i32);
 
1535
  return DAG.getMemcpy(Chain, dl, Dst, Src, SizeNode, Flags.getByValAlign(),
 
1536
                       /*isVolatile*/false, /*AlwaysInline=*/true,
 
1537
                       NULL, 0, NULL, 0);
 
1538
}
 
1539
 
 
1540
/// IsTailCallConvention - Return true if the calling convention is one that
 
1541
/// supports tail call optimization.
 
1542
static bool IsTailCallConvention(CallingConv::ID CC) {
 
1543
  return (CC == CallingConv::Fast || CC == CallingConv::GHC);
 
1544
}
 
1545
 
 
1546
/// FuncIsMadeTailCallSafe - Return true if the function is being made into
 
1547
/// a tailcall target by changing its ABI.
 
1548
static bool FuncIsMadeTailCallSafe(CallingConv::ID CC) {
 
1549
  return GuaranteedTailCallOpt && IsTailCallConvention(CC);
 
1550
}
 
1551
 
 
1552
SDValue
 
1553
X86TargetLowering::LowerMemArgument(SDValue Chain,
 
1554
                                    CallingConv::ID CallConv,
 
1555
                                    const SmallVectorImpl<ISD::InputArg> &Ins,
 
1556
                                    DebugLoc dl, SelectionDAG &DAG,
 
1557
                                    const CCValAssign &VA,
 
1558
                                    MachineFrameInfo *MFI,
 
1559
                                    unsigned i) const {
 
1560
  // Create the nodes corresponding to a load from this parameter slot.
 
1561
  ISD::ArgFlagsTy Flags = Ins[i].Flags;
 
1562
  bool AlwaysUseMutable = FuncIsMadeTailCallSafe(CallConv);
 
1563
  bool isImmutable = !AlwaysUseMutable && !Flags.isByVal();
 
1564
  EVT ValVT;
 
1565
 
 
1566
  // If value is passed by pointer we have address passed instead of the value
 
1567
  // itself.
 
1568
  if (VA.getLocInfo() == CCValAssign::Indirect)
 
1569
    ValVT = VA.getLocVT();
 
1570
  else
 
1571
    ValVT = VA.getValVT();
 
1572
 
 
1573
  // FIXME: For now, all byval parameter objects are marked mutable. This can be
 
1574
  // changed with more analysis.
 
1575
  // In case of tail call optimization mark all arguments mutable. Since they
 
1576
  // could be overwritten by lowering of arguments in case of a tail call.
 
1577
  if (Flags.isByVal()) {
 
1578
    int FI = MFI->CreateFixedObject(Flags.getByValSize(),
 
1579
                                    VA.getLocMemOffset(), isImmutable);
 
1580
    return DAG.getFrameIndex(FI, getPointerTy());
 
1581
  } else {
 
1582
    int FI = MFI->CreateFixedObject(ValVT.getSizeInBits()/8,
 
1583
                                    VA.getLocMemOffset(), isImmutable);
 
1584
    SDValue FIN = DAG.getFrameIndex(FI, getPointerTy());
 
1585
    return DAG.getLoad(ValVT, dl, Chain, FIN,
 
1586
                       PseudoSourceValue::getFixedStack(FI), 0,
 
1587
                       false, false, 0);
 
1588
  }
 
1589
}
 
1590
 
 
1591
SDValue
 
1592
X86TargetLowering::LowerFormalArguments(SDValue Chain,
 
1593
                                        CallingConv::ID CallConv,
 
1594
                                        bool isVarArg,
 
1595
                                      const SmallVectorImpl<ISD::InputArg> &Ins,
 
1596
                                        DebugLoc dl,
 
1597
                                        SelectionDAG &DAG,
 
1598
                                        SmallVectorImpl<SDValue> &InVals)
 
1599
                                          const {
 
1600
  MachineFunction &MF = DAG.getMachineFunction();
 
1601
  X86MachineFunctionInfo *FuncInfo = MF.getInfo<X86MachineFunctionInfo>();
 
1602
 
 
1603
  const Function* Fn = MF.getFunction();
 
1604
  if (Fn->hasExternalLinkage() &&
 
1605
      Subtarget->isTargetCygMing() &&
 
1606
      Fn->getName() == "main")
 
1607
    FuncInfo->setForceFramePointer(true);
 
1608
 
 
1609
  MachineFrameInfo *MFI = MF.getFrameInfo();
 
1610
  bool Is64Bit = Subtarget->is64Bit();
 
1611
  bool IsWin64 = Subtarget->isTargetWin64();
 
1612
 
 
1613
  assert(!(isVarArg && IsTailCallConvention(CallConv)) &&
 
1614
         "Var args not supported with calling convention fastcc or ghc");
 
1615
 
 
1616
  // Assign locations to all of the incoming arguments.
 
1617
  SmallVector<CCValAssign, 16> ArgLocs;
 
1618
  CCState CCInfo(CallConv, isVarArg, getTargetMachine(),
 
1619
                 ArgLocs, *DAG.getContext());
 
1620
  CCInfo.AnalyzeFormalArguments(Ins, CCAssignFnForNode(CallConv));
 
1621
 
 
1622
  unsigned LastVal = ~0U;
 
1623
  SDValue ArgValue;
 
1624
  for (unsigned i = 0, e = ArgLocs.size(); i != e; ++i) {
 
1625
    CCValAssign &VA = ArgLocs[i];
 
1626
    // TODO: If an arg is passed in two places (e.g. reg and stack), skip later
 
1627
    // places.
 
1628
    assert(VA.getValNo() != LastVal &&
 
1629
           "Don't support value assigned to multiple locs yet");
 
1630
    LastVal = VA.getValNo();
 
1631
 
 
1632
    if (VA.isRegLoc()) {
 
1633
      EVT RegVT = VA.getLocVT();
 
1634
      TargetRegisterClass *RC = NULL;
 
1635
      if (RegVT == MVT::i32)
 
1636
        RC = X86::GR32RegisterClass;
 
1637
      else if (Is64Bit && RegVT == MVT::i64)
 
1638
        RC = X86::GR64RegisterClass;
 
1639
      else if (RegVT == MVT::f32)
 
1640
        RC = X86::FR32RegisterClass;
 
1641
      else if (RegVT == MVT::f64)
 
1642
        RC = X86::FR64RegisterClass;
 
1643
      else if (RegVT.isVector() && RegVT.getSizeInBits() == 256)
 
1644
        RC = X86::VR256RegisterClass;
 
1645
      else if (RegVT.isVector() && RegVT.getSizeInBits() == 128)
 
1646
        RC = X86::VR128RegisterClass;
 
1647
      else if (RegVT.isVector() && RegVT.getSizeInBits() == 64)
 
1648
        RC = X86::VR64RegisterClass;
 
1649
      else
 
1650
        llvm_unreachable("Unknown argument type!");
 
1651
 
 
1652
      unsigned Reg = MF.addLiveIn(VA.getLocReg(), RC);
 
1653
      ArgValue = DAG.getCopyFromReg(Chain, dl, Reg, RegVT);
 
1654
 
 
1655
      // If this is an 8 or 16-bit value, it is really passed promoted to 32
 
1656
      // bits.  Insert an assert[sz]ext to capture this, then truncate to the
 
1657
      // right size.
 
1658
      if (VA.getLocInfo() == CCValAssign::SExt)
 
1659
        ArgValue = DAG.getNode(ISD::AssertSext, dl, RegVT, ArgValue,
 
1660
                               DAG.getValueType(VA.getValVT()));
 
1661
      else if (VA.getLocInfo() == CCValAssign::ZExt)
 
1662
        ArgValue = DAG.getNode(ISD::AssertZext, dl, RegVT, ArgValue,
 
1663
                               DAG.getValueType(VA.getValVT()));
 
1664
      else if (VA.getLocInfo() == CCValAssign::BCvt)
 
1665
        ArgValue = DAG.getNode(ISD::BIT_CONVERT, dl, VA.getValVT(), ArgValue);
 
1666
 
 
1667
      if (VA.isExtInLoc()) {
 
1668
        // Handle MMX values passed in XMM regs.
 
1669
        if (RegVT.isVector()) {
 
1670
          ArgValue = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, MVT::i64,
 
1671
                                 ArgValue, DAG.getConstant(0, MVT::i64));
 
1672
          ArgValue = DAG.getNode(ISD::BIT_CONVERT, dl, VA.getValVT(), ArgValue);
 
1673
        } else
 
1674
          ArgValue = DAG.getNode(ISD::TRUNCATE, dl, VA.getValVT(), ArgValue);
 
1675
      }
 
1676
    } else {
 
1677
      assert(VA.isMemLoc());
 
1678
      ArgValue = LowerMemArgument(Chain, CallConv, Ins, dl, DAG, VA, MFI, i);
 
1679
    }
 
1680
 
 
1681
    // If value is passed via pointer - do a load.
 
1682
    if (VA.getLocInfo() == CCValAssign::Indirect)
 
1683
      ArgValue = DAG.getLoad(VA.getValVT(), dl, Chain, ArgValue, NULL, 0,
 
1684
                             false, false, 0);
 
1685
 
 
1686
    InVals.push_back(ArgValue);
 
1687
  }
 
1688
 
 
1689
  // The x86-64 ABI for returning structs by value requires that we copy
 
1690
  // the sret argument into %rax for the return. Save the argument into
 
1691
  // a virtual register so that we can access it from the return points.
 
1692
  if (Is64Bit && MF.getFunction()->hasStructRetAttr()) {
 
1693
    X86MachineFunctionInfo *FuncInfo = MF.getInfo<X86MachineFunctionInfo>();
 
1694
    unsigned Reg = FuncInfo->getSRetReturnReg();
 
1695
    if (!Reg) {
 
1696
      Reg = MF.getRegInfo().createVirtualRegister(getRegClassFor(MVT::i64));
 
1697
      FuncInfo->setSRetReturnReg(Reg);
 
1698
    }
 
1699
    SDValue Copy = DAG.getCopyToReg(DAG.getEntryNode(), dl, Reg, InVals[0]);
 
1700
    Chain = DAG.getNode(ISD::TokenFactor, dl, MVT::Other, Copy, Chain);
 
1701
  }
 
1702
 
 
1703
  unsigned StackSize = CCInfo.getNextStackOffset();
 
1704
  // Align stack specially for tail calls.
 
1705
  if (FuncIsMadeTailCallSafe(CallConv))
 
1706
    StackSize = GetAlignedArgumentStackSize(StackSize, DAG);
 
1707
 
 
1708
  // If the function takes variable number of arguments, make a frame index for
 
1709
  // the start of the first vararg value... for expansion of llvm.va_start.
 
1710
  if (isVarArg) {
 
1711
    if (Is64Bit || (CallConv != CallingConv::X86_FastCall &&
 
1712
                    CallConv != CallingConv::X86_ThisCall)) {
 
1713
      FuncInfo->setVarArgsFrameIndex(MFI->CreateFixedObject(1, StackSize,true));
 
1714
    }
 
1715
    if (Is64Bit) {
 
1716
      unsigned TotalNumIntRegs = 0, TotalNumXMMRegs = 0;
 
1717
 
 
1718
      // FIXME: We should really autogenerate these arrays
 
1719
      static const unsigned GPR64ArgRegsWin64[] = {
 
1720
        X86::RCX, X86::RDX, X86::R8,  X86::R9
 
1721
      };
 
1722
      static const unsigned XMMArgRegsWin64[] = {
 
1723
        X86::XMM0, X86::XMM1, X86::XMM2, X86::XMM3
 
1724
      };
 
1725
      static const unsigned GPR64ArgRegs64Bit[] = {
 
1726
        X86::RDI, X86::RSI, X86::RDX, X86::RCX, X86::R8, X86::R9
 
1727
      };
 
1728
      static const unsigned XMMArgRegs64Bit[] = {
 
1729
        X86::XMM0, X86::XMM1, X86::XMM2, X86::XMM3,
 
1730
        X86::XMM4, X86::XMM5, X86::XMM6, X86::XMM7
 
1731
      };
 
1732
      const unsigned *GPR64ArgRegs, *XMMArgRegs;
 
1733
 
 
1734
      if (IsWin64) {
 
1735
        TotalNumIntRegs = 4; TotalNumXMMRegs = 4;
 
1736
        GPR64ArgRegs = GPR64ArgRegsWin64;
 
1737
        XMMArgRegs = XMMArgRegsWin64;
 
1738
      } else {
 
1739
        TotalNumIntRegs = 6; TotalNumXMMRegs = 8;
 
1740
        GPR64ArgRegs = GPR64ArgRegs64Bit;
 
1741
        XMMArgRegs = XMMArgRegs64Bit;
 
1742
      }
 
1743
      unsigned NumIntRegs = CCInfo.getFirstUnallocated(GPR64ArgRegs,
 
1744
                                                       TotalNumIntRegs);
 
1745
      unsigned NumXMMRegs = CCInfo.getFirstUnallocated(XMMArgRegs,
 
1746
                                                       TotalNumXMMRegs);
 
1747
 
 
1748
      bool NoImplicitFloatOps = Fn->hasFnAttr(Attribute::NoImplicitFloat);
 
1749
      assert(!(NumXMMRegs && !Subtarget->hasSSE1()) &&
 
1750
             "SSE register cannot be used when SSE is disabled!");
 
1751
      assert(!(NumXMMRegs && UseSoftFloat && NoImplicitFloatOps) &&
 
1752
             "SSE register cannot be used when SSE is disabled!");
 
1753
      if (UseSoftFloat || NoImplicitFloatOps || !Subtarget->hasSSE1())
 
1754
        // Kernel mode asks for SSE to be disabled, so don't push them
 
1755
        // on the stack.
 
1756
        TotalNumXMMRegs = 0;
 
1757
 
 
1758
      // For X86-64, if there are vararg parameters that are passed via
 
1759
      // registers, then we must store them to their spots on the stack so they
 
1760
      // may be loaded by deferencing the result of va_next.
 
1761
      FuncInfo->setVarArgsGPOffset(NumIntRegs * 8);
 
1762
      FuncInfo->setVarArgsFPOffset(TotalNumIntRegs * 8 + NumXMMRegs * 16);
 
1763
      FuncInfo->setRegSaveFrameIndex(
 
1764
        MFI->CreateStackObject(TotalNumIntRegs * 8 + TotalNumXMMRegs * 16, 16,
 
1765
                               false));
 
1766
 
 
1767
      // Store the integer parameter registers.
 
1768
      SmallVector<SDValue, 8> MemOps;
 
1769
      SDValue RSFIN = DAG.getFrameIndex(FuncInfo->getRegSaveFrameIndex(),
 
1770
                                        getPointerTy());
 
1771
      unsigned Offset = FuncInfo->getVarArgsGPOffset();
 
1772
      for (; NumIntRegs != TotalNumIntRegs; ++NumIntRegs) {
 
1773
        SDValue FIN = DAG.getNode(ISD::ADD, dl, getPointerTy(), RSFIN,
 
1774
                                  DAG.getIntPtrConstant(Offset));
 
1775
        unsigned VReg = MF.addLiveIn(GPR64ArgRegs[NumIntRegs],
 
1776
                                     X86::GR64RegisterClass);
 
1777
        SDValue Val = DAG.getCopyFromReg(Chain, dl, VReg, MVT::i64);
 
1778
        SDValue Store =
 
1779
          DAG.getStore(Val.getValue(1), dl, Val, FIN,
 
1780
                       PseudoSourceValue::getFixedStack(
 
1781
                         FuncInfo->getRegSaveFrameIndex()),
 
1782
                       Offset, false, false, 0);
 
1783
        MemOps.push_back(Store);
 
1784
        Offset += 8;
 
1785
      }
 
1786
 
 
1787
      if (TotalNumXMMRegs != 0 && NumXMMRegs != TotalNumXMMRegs) {
 
1788
        // Now store the XMM (fp + vector) parameter registers.
 
1789
        SmallVector<SDValue, 11> SaveXMMOps;
 
1790
        SaveXMMOps.push_back(Chain);
 
1791
 
 
1792
        unsigned AL = MF.addLiveIn(X86::AL, X86::GR8RegisterClass);
 
1793
        SDValue ALVal = DAG.getCopyFromReg(DAG.getEntryNode(), dl, AL, MVT::i8);
 
1794
        SaveXMMOps.push_back(ALVal);
 
1795
 
 
1796
        SaveXMMOps.push_back(DAG.getIntPtrConstant(
 
1797
                               FuncInfo->getRegSaveFrameIndex()));
 
1798
        SaveXMMOps.push_back(DAG.getIntPtrConstant(
 
1799
                               FuncInfo->getVarArgsFPOffset()));
 
1800
 
 
1801
        for (; NumXMMRegs != TotalNumXMMRegs; ++NumXMMRegs) {
 
1802
          unsigned VReg = MF.addLiveIn(XMMArgRegs[NumXMMRegs],
 
1803
                                       X86::VR128RegisterClass);
 
1804
          SDValue Val = DAG.getCopyFromReg(Chain, dl, VReg, MVT::v4f32);
 
1805
          SaveXMMOps.push_back(Val);
 
1806
        }
 
1807
        MemOps.push_back(DAG.getNode(X86ISD::VASTART_SAVE_XMM_REGS, dl,
 
1808
                                     MVT::Other,
 
1809
                                     &SaveXMMOps[0], SaveXMMOps.size()));
 
1810
      }
 
1811
 
 
1812
      if (!MemOps.empty())
 
1813
        Chain = DAG.getNode(ISD::TokenFactor, dl, MVT::Other,
 
1814
                            &MemOps[0], MemOps.size());
 
1815
    }
 
1816
  }
 
1817
 
 
1818
  // Some CCs need callee pop.
 
1819
  if (Subtarget->IsCalleePop(isVarArg, CallConv)) {
 
1820
    FuncInfo->setBytesToPopOnReturn(StackSize); // Callee pops everything.
 
1821
  } else {
 
1822
    FuncInfo->setBytesToPopOnReturn(0); // Callee pops nothing.
 
1823
    // If this is an sret function, the return should pop the hidden pointer.
 
1824
    if (!Is64Bit && !IsTailCallConvention(CallConv) && ArgsAreStructReturn(Ins))
 
1825
      FuncInfo->setBytesToPopOnReturn(4);
 
1826
  }
 
1827
 
 
1828
  if (!Is64Bit) {
 
1829
    // RegSaveFrameIndex is X86-64 only.
 
1830
    FuncInfo->setRegSaveFrameIndex(0xAAAAAAA);
 
1831
    if (CallConv == CallingConv::X86_FastCall ||
 
1832
        CallConv == CallingConv::X86_ThisCall)
 
1833
      // fastcc functions can't have varargs.
 
1834
      FuncInfo->setVarArgsFrameIndex(0xAAAAAAA);
 
1835
  }
 
1836
 
 
1837
  return Chain;
 
1838
}
 
1839
 
 
1840
SDValue
 
1841
X86TargetLowering::LowerMemOpCallTo(SDValue Chain,
 
1842
                                    SDValue StackPtr, SDValue Arg,
 
1843
                                    DebugLoc dl, SelectionDAG &DAG,
 
1844
                                    const CCValAssign &VA,
 
1845
                                    ISD::ArgFlagsTy Flags) const {
 
1846
  const unsigned FirstStackArgOffset = (Subtarget->isTargetWin64() ? 32 : 0);
 
1847
  unsigned LocMemOffset = FirstStackArgOffset + VA.getLocMemOffset();
 
1848
  SDValue PtrOff = DAG.getIntPtrConstant(LocMemOffset);
 
1849
  PtrOff = DAG.getNode(ISD::ADD, dl, getPointerTy(), StackPtr, PtrOff);
 
1850
  if (Flags.isByVal()) {
 
1851
    return CreateCopyOfByValArgument(Arg, PtrOff, Chain, Flags, DAG, dl);
 
1852
  }
 
1853
  return DAG.getStore(Chain, dl, Arg, PtrOff,
 
1854
                      PseudoSourceValue::getStack(), LocMemOffset,
 
1855
                      false, false, 0);
 
1856
}
 
1857
 
 
1858
/// EmitTailCallLoadRetAddr - Emit a load of return address if tail call
 
1859
/// optimization is performed and it is required.
 
1860
SDValue
 
1861
X86TargetLowering::EmitTailCallLoadRetAddr(SelectionDAG &DAG,
 
1862
                                           SDValue &OutRetAddr, SDValue Chain,
 
1863
                                           bool IsTailCall, bool Is64Bit,
 
1864
                                           int FPDiff, DebugLoc dl) const {
 
1865
  // Adjust the Return address stack slot.
 
1866
  EVT VT = getPointerTy();
 
1867
  OutRetAddr = getReturnAddressFrameIndex(DAG);
 
1868
 
 
1869
  // Load the "old" Return address.
 
1870
  OutRetAddr = DAG.getLoad(VT, dl, Chain, OutRetAddr, NULL, 0, false, false, 0);
 
1871
  return SDValue(OutRetAddr.getNode(), 1);
 
1872
}
 
1873
 
 
1874
/// EmitTailCallStoreRetAddr - Emit a store of the return adress if tail call
 
1875
/// optimization is performed and it is required (FPDiff!=0).
 
1876
static SDValue
 
1877
EmitTailCallStoreRetAddr(SelectionDAG & DAG, MachineFunction &MF,
 
1878
                         SDValue Chain, SDValue RetAddrFrIdx,
 
1879
                         bool Is64Bit, int FPDiff, DebugLoc dl) {
 
1880
  // Store the return address to the appropriate stack slot.
 
1881
  if (!FPDiff) return Chain;
 
1882
  // Calculate the new stack slot for the return address.
 
1883
  int SlotSize = Is64Bit ? 8 : 4;
 
1884
  int NewReturnAddrFI =
 
1885
    MF.getFrameInfo()->CreateFixedObject(SlotSize, FPDiff-SlotSize, false);
 
1886
  EVT VT = Is64Bit ? MVT::i64 : MVT::i32;
 
1887
  SDValue NewRetAddrFrIdx = DAG.getFrameIndex(NewReturnAddrFI, VT);
 
1888
  Chain = DAG.getStore(Chain, dl, RetAddrFrIdx, NewRetAddrFrIdx,
 
1889
                       PseudoSourceValue::getFixedStack(NewReturnAddrFI), 0,
 
1890
                       false, false, 0);
 
1891
  return Chain;
 
1892
}
 
1893
 
 
1894
SDValue
 
1895
X86TargetLowering::LowerCall(SDValue Chain, SDValue Callee,
 
1896
                             CallingConv::ID CallConv, bool isVarArg,
 
1897
                             bool &isTailCall,
 
1898
                             const SmallVectorImpl<ISD::OutputArg> &Outs,
 
1899
                             const SmallVectorImpl<SDValue> &OutVals,
 
1900
                             const SmallVectorImpl<ISD::InputArg> &Ins,
 
1901
                             DebugLoc dl, SelectionDAG &DAG,
 
1902
                             SmallVectorImpl<SDValue> &InVals) const {
 
1903
  MachineFunction &MF = DAG.getMachineFunction();
 
1904
  bool Is64Bit        = Subtarget->is64Bit();
 
1905
  bool IsStructRet    = CallIsStructReturn(Outs);
 
1906
  bool IsSibcall      = false;
 
1907
 
 
1908
  if (isTailCall) {
 
1909
    // Check if it's really possible to do a tail call.
 
1910
    isTailCall = IsEligibleForTailCallOptimization(Callee, CallConv,
 
1911
                    isVarArg, IsStructRet, MF.getFunction()->hasStructRetAttr(),
 
1912
                                                   Outs, OutVals, Ins, DAG);
 
1913
 
 
1914
    // Sibcalls are automatically detected tailcalls which do not require
 
1915
    // ABI changes.
 
1916
    if (!GuaranteedTailCallOpt && isTailCall)
 
1917
      IsSibcall = true;
 
1918
 
 
1919
    if (isTailCall)
 
1920
      ++NumTailCalls;
 
1921
  }
 
1922
 
 
1923
  assert(!(isVarArg && IsTailCallConvention(CallConv)) &&
 
1924
         "Var args not supported with calling convention fastcc or ghc");
 
1925
 
 
1926
  // Analyze operands of the call, assigning locations to each operand.
 
1927
  SmallVector<CCValAssign, 16> ArgLocs;
 
1928
  CCState CCInfo(CallConv, isVarArg, getTargetMachine(),
 
1929
                 ArgLocs, *DAG.getContext());
 
1930
  CCInfo.AnalyzeCallOperands(Outs, CCAssignFnForNode(CallConv));
 
1931
 
 
1932
  // Get a count of how many bytes are to be pushed on the stack.
 
1933
  unsigned NumBytes = CCInfo.getNextStackOffset();
 
1934
  if (IsSibcall)
 
1935
    // This is a sibcall. The memory operands are available in caller's
 
1936
    // own caller's stack.
 
1937
    NumBytes = 0;
 
1938
  else if (GuaranteedTailCallOpt && IsTailCallConvention(CallConv))
 
1939
    NumBytes = GetAlignedArgumentStackSize(NumBytes, DAG);
 
1940
 
 
1941
  int FPDiff = 0;
 
1942
  if (isTailCall && !IsSibcall) {
 
1943
    // Lower arguments at fp - stackoffset + fpdiff.
 
1944
    unsigned NumBytesCallerPushed =
 
1945
      MF.getInfo<X86MachineFunctionInfo>()->getBytesToPopOnReturn();
 
1946
    FPDiff = NumBytesCallerPushed - NumBytes;
 
1947
 
 
1948
    // Set the delta of movement of the returnaddr stackslot.
 
1949
    // But only set if delta is greater than previous delta.
 
1950
    if (FPDiff < (MF.getInfo<X86MachineFunctionInfo>()->getTCReturnAddrDelta()))
 
1951
      MF.getInfo<X86MachineFunctionInfo>()->setTCReturnAddrDelta(FPDiff);
 
1952
  }
 
1953
 
 
1954
  if (!IsSibcall)
 
1955
    Chain = DAG.getCALLSEQ_START(Chain, DAG.getIntPtrConstant(NumBytes, true));
 
1956
 
 
1957
  SDValue RetAddrFrIdx;
 
1958
  // Load return adress for tail calls.
 
1959
  if (isTailCall && FPDiff)
 
1960
    Chain = EmitTailCallLoadRetAddr(DAG, RetAddrFrIdx, Chain, isTailCall,
 
1961
                                    Is64Bit, FPDiff, dl);
 
1962
 
 
1963
  SmallVector<std::pair<unsigned, SDValue>, 8> RegsToPass;
 
1964
  SmallVector<SDValue, 8> MemOpChains;
 
1965
  SDValue StackPtr;
 
1966
 
 
1967
  // Walk the register/memloc assignments, inserting copies/loads.  In the case
 
1968
  // of tail call optimization arguments are handle later.
 
1969
  for (unsigned i = 0, e = ArgLocs.size(); i != e; ++i) {
 
1970
    CCValAssign &VA = ArgLocs[i];
 
1971
    EVT RegVT = VA.getLocVT();
 
1972
    SDValue Arg = OutVals[i];
 
1973
    ISD::ArgFlagsTy Flags = Outs[i].Flags;
 
1974
    bool isByVal = Flags.isByVal();
 
1975
 
 
1976
    // Promote the value if needed.
 
1977
    switch (VA.getLocInfo()) {
 
1978
    default: llvm_unreachable("Unknown loc info!");
 
1979
    case CCValAssign::Full: break;
 
1980
    case CCValAssign::SExt:
 
1981
      Arg = DAG.getNode(ISD::SIGN_EXTEND, dl, RegVT, Arg);
 
1982
      break;
 
1983
    case CCValAssign::ZExt:
 
1984
      Arg = DAG.getNode(ISD::ZERO_EXTEND, dl, RegVT, Arg);
 
1985
      break;
 
1986
    case CCValAssign::AExt:
 
1987
      if (RegVT.isVector() && RegVT.getSizeInBits() == 128) {
 
1988
        // Special case: passing MMX values in XMM registers.
 
1989
        Arg = DAG.getNode(ISD::BIT_CONVERT, dl, MVT::i64, Arg);
 
1990
        Arg = DAG.getNode(ISD::SCALAR_TO_VECTOR, dl, MVT::v2i64, Arg);
 
1991
        Arg = getMOVL(DAG, dl, MVT::v2i64, DAG.getUNDEF(MVT::v2i64), Arg);
 
1992
      } else
 
1993
        Arg = DAG.getNode(ISD::ANY_EXTEND, dl, RegVT, Arg);
 
1994
      break;
 
1995
    case CCValAssign::BCvt:
 
1996
      Arg = DAG.getNode(ISD::BIT_CONVERT, dl, RegVT, Arg);
 
1997
      break;
 
1998
    case CCValAssign::Indirect: {
 
1999
      // Store the argument.
 
2000
      SDValue SpillSlot = DAG.CreateStackTemporary(VA.getValVT());
 
2001
      int FI = cast<FrameIndexSDNode>(SpillSlot)->getIndex();
 
2002
      Chain = DAG.getStore(Chain, dl, Arg, SpillSlot,
 
2003
                           PseudoSourceValue::getFixedStack(FI), 0,
 
2004
                           false, false, 0);
 
2005
      Arg = SpillSlot;
 
2006
      break;
 
2007
    }
 
2008
    }
 
2009
 
 
2010
    if (VA.isRegLoc()) {
 
2011
      RegsToPass.push_back(std::make_pair(VA.getLocReg(), Arg));
 
2012
      if (isVarArg && Subtarget->isTargetWin64()) {
 
2013
        // Win64 ABI requires argument XMM reg to be copied to the corresponding
 
2014
        // shadow reg if callee is a varargs function.
 
2015
        unsigned ShadowReg = 0;
 
2016
        switch (VA.getLocReg()) {
 
2017
        case X86::XMM0: ShadowReg = X86::RCX; break;
 
2018
        case X86::XMM1: ShadowReg = X86::RDX; break;
 
2019
        case X86::XMM2: ShadowReg = X86::R8; break;
 
2020
        case X86::XMM3: ShadowReg = X86::R9; break;
 
2021
        }
 
2022
        if (ShadowReg)
 
2023
          RegsToPass.push_back(std::make_pair(ShadowReg, Arg));
 
2024
      }
 
2025
    } else if (!IsSibcall && (!isTailCall || isByVal)) {
 
2026
      assert(VA.isMemLoc());
 
2027
      if (StackPtr.getNode() == 0)
 
2028
        StackPtr = DAG.getCopyFromReg(Chain, dl, X86StackPtr, getPointerTy());
 
2029
      MemOpChains.push_back(LowerMemOpCallTo(Chain, StackPtr, Arg,
 
2030
                                             dl, DAG, VA, Flags));
 
2031
    }
 
2032
  }
 
2033
 
 
2034
  if (!MemOpChains.empty())
 
2035
    Chain = DAG.getNode(ISD::TokenFactor, dl, MVT::Other,
 
2036
                        &MemOpChains[0], MemOpChains.size());
 
2037
 
 
2038
  // Build a sequence of copy-to-reg nodes chained together with token chain
 
2039
  // and flag operands which copy the outgoing args into registers.
 
2040
  SDValue InFlag;
 
2041
  // Tail call byval lowering might overwrite argument registers so in case of
 
2042
  // tail call optimization the copies to registers are lowered later.
 
2043
  if (!isTailCall)
 
2044
    for (unsigned i = 0, e = RegsToPass.size(); i != e; ++i) {
 
2045
      Chain = DAG.getCopyToReg(Chain, dl, RegsToPass[i].first,
 
2046
                               RegsToPass[i].second, InFlag);
 
2047
      InFlag = Chain.getValue(1);
 
2048
    }
 
2049
 
 
2050
  if (Subtarget->isPICStyleGOT()) {
 
2051
    // ELF / PIC requires GOT in the EBX register before function calls via PLT
 
2052
    // GOT pointer.
 
2053
    if (!isTailCall) {
 
2054
      Chain = DAG.getCopyToReg(Chain, dl, X86::EBX,
 
2055
                               DAG.getNode(X86ISD::GlobalBaseReg,
 
2056
                                           DebugLoc(), getPointerTy()),
 
2057
                               InFlag);
 
2058
      InFlag = Chain.getValue(1);
 
2059
    } else {
 
2060
      // If we are tail calling and generating PIC/GOT style code load the
 
2061
      // address of the callee into ECX. The value in ecx is used as target of
 
2062
      // the tail jump. This is done to circumvent the ebx/callee-saved problem
 
2063
      // for tail calls on PIC/GOT architectures. Normally we would just put the
 
2064
      // address of GOT into ebx and then call target@PLT. But for tail calls
 
2065
      // ebx would be restored (since ebx is callee saved) before jumping to the
 
2066
      // target@PLT.
 
2067
 
 
2068
      // Note: The actual moving to ECX is done further down.
 
2069
      GlobalAddressSDNode *G = dyn_cast<GlobalAddressSDNode>(Callee);
 
2070
      if (G && !G->getGlobal()->hasHiddenVisibility() &&
 
2071
          !G->getGlobal()->hasProtectedVisibility())
 
2072
        Callee = LowerGlobalAddress(Callee, DAG);
 
2073
      else if (isa<ExternalSymbolSDNode>(Callee))
 
2074
        Callee = LowerExternalSymbol(Callee, DAG);
 
2075
    }
 
2076
  }
 
2077
 
 
2078
  if (Is64Bit && isVarArg && !Subtarget->isTargetWin64()) {
 
2079
    // From AMD64 ABI document:
 
2080
    // For calls that may call functions that use varargs or stdargs
 
2081
    // (prototype-less calls or calls to functions containing ellipsis (...) in
 
2082
    // the declaration) %al is used as hidden argument to specify the number
 
2083
    // of SSE registers used. The contents of %al do not need to match exactly
 
2084
    // the number of registers, but must be an ubound on the number of SSE
 
2085
    // registers used and is in the range 0 - 8 inclusive.
 
2086
 
 
2087
    // Count the number of XMM registers allocated.
 
2088
    static const unsigned XMMArgRegs[] = {
 
2089
      X86::XMM0, X86::XMM1, X86::XMM2, X86::XMM3,
 
2090
      X86::XMM4, X86::XMM5, X86::XMM6, X86::XMM7
 
2091
    };
 
2092
    unsigned NumXMMRegs = CCInfo.getFirstUnallocated(XMMArgRegs, 8);
 
2093
    assert((Subtarget->hasSSE1() || !NumXMMRegs)
 
2094
           && "SSE registers cannot be used when SSE is disabled");
 
2095
 
 
2096
    Chain = DAG.getCopyToReg(Chain, dl, X86::AL,
 
2097
                             DAG.getConstant(NumXMMRegs, MVT::i8), InFlag);
 
2098
    InFlag = Chain.getValue(1);
 
2099
  }
 
2100
 
 
2101
 
 
2102
  // For tail calls lower the arguments to the 'real' stack slot.
 
2103
  if (isTailCall) {
 
2104
    // Force all the incoming stack arguments to be loaded from the stack
 
2105
    // before any new outgoing arguments are stored to the stack, because the
 
2106
    // outgoing stack slots may alias the incoming argument stack slots, and
 
2107
    // the alias isn't otherwise explicit. This is slightly more conservative
 
2108
    // than necessary, because it means that each store effectively depends
 
2109
    // on every argument instead of just those arguments it would clobber.
 
2110
    SDValue ArgChain = DAG.getStackArgumentTokenFactor(Chain);
 
2111
 
 
2112
    SmallVector<SDValue, 8> MemOpChains2;
 
2113
    SDValue FIN;
 
2114
    int FI = 0;
 
2115
    // Do not flag preceeding copytoreg stuff together with the following stuff.
 
2116
    InFlag = SDValue();
 
2117
    if (GuaranteedTailCallOpt) {
 
2118
      for (unsigned i = 0, e = ArgLocs.size(); i != e; ++i) {
 
2119
        CCValAssign &VA = ArgLocs[i];
 
2120
        if (VA.isRegLoc())
 
2121
          continue;
 
2122
        assert(VA.isMemLoc());
 
2123
        SDValue Arg = OutVals[i];
 
2124
        ISD::ArgFlagsTy Flags = Outs[i].Flags;
 
2125
        // Create frame index.
 
2126
        int32_t Offset = VA.getLocMemOffset()+FPDiff;
 
2127
        uint32_t OpSize = (VA.getLocVT().getSizeInBits()+7)/8;
 
2128
        FI = MF.getFrameInfo()->CreateFixedObject(OpSize, Offset, true);
 
2129
        FIN = DAG.getFrameIndex(FI, getPointerTy());
 
2130
 
 
2131
        if (Flags.isByVal()) {
 
2132
          // Copy relative to framepointer.
 
2133
          SDValue Source = DAG.getIntPtrConstant(VA.getLocMemOffset());
 
2134
          if (StackPtr.getNode() == 0)
 
2135
            StackPtr = DAG.getCopyFromReg(Chain, dl, X86StackPtr,
 
2136
                                          getPointerTy());
 
2137
          Source = DAG.getNode(ISD::ADD, dl, getPointerTy(), StackPtr, Source);
 
2138
 
 
2139
          MemOpChains2.push_back(CreateCopyOfByValArgument(Source, FIN,
 
2140
                                                           ArgChain,
 
2141
                                                           Flags, DAG, dl));
 
2142
        } else {
 
2143
          // Store relative to framepointer.
 
2144
          MemOpChains2.push_back(
 
2145
            DAG.getStore(ArgChain, dl, Arg, FIN,
 
2146
                         PseudoSourceValue::getFixedStack(FI), 0,
 
2147
                         false, false, 0));
 
2148
        }
 
2149
      }
 
2150
    }
 
2151
 
 
2152
    if (!MemOpChains2.empty())
 
2153
      Chain = DAG.getNode(ISD::TokenFactor, dl, MVT::Other,
 
2154
                          &MemOpChains2[0], MemOpChains2.size());
 
2155
 
 
2156
    // Copy arguments to their registers.
 
2157
    for (unsigned i = 0, e = RegsToPass.size(); i != e; ++i) {
 
2158
      Chain = DAG.getCopyToReg(Chain, dl, RegsToPass[i].first,
 
2159
                               RegsToPass[i].second, InFlag);
 
2160
      InFlag = Chain.getValue(1);
 
2161
    }
 
2162
    InFlag =SDValue();
 
2163
 
 
2164
    // Store the return address to the appropriate stack slot.
 
2165
    Chain = EmitTailCallStoreRetAddr(DAG, MF, Chain, RetAddrFrIdx, Is64Bit,
 
2166
                                     FPDiff, dl);
 
2167
  }
 
2168
 
 
2169
  if (getTargetMachine().getCodeModel() == CodeModel::Large) {
 
2170
    assert(Is64Bit && "Large code model is only legal in 64-bit mode.");
 
2171
    // In the 64-bit large code model, we have to make all calls
 
2172
    // through a register, since the call instruction's 32-bit
 
2173
    // pc-relative offset may not be large enough to hold the whole
 
2174
    // address.
 
2175
  } else if (GlobalAddressSDNode *G = dyn_cast<GlobalAddressSDNode>(Callee)) {
 
2176
    // If the callee is a GlobalAddress node (quite common, every direct call
 
2177
    // is) turn it into a TargetGlobalAddress node so that legalize doesn't hack
 
2178
    // it.
 
2179
 
 
2180
    // We should use extra load for direct calls to dllimported functions in
 
2181
    // non-JIT mode.
 
2182
    const GlobalValue *GV = G->getGlobal();
 
2183
    if (!GV->hasDLLImportLinkage()) {
 
2184
      unsigned char OpFlags = 0;
 
2185
 
 
2186
      // On ELF targets, in both X86-64 and X86-32 mode, direct calls to
 
2187
      // external symbols most go through the PLT in PIC mode.  If the symbol
 
2188
      // has hidden or protected visibility, or if it is static or local, then
 
2189
      // we don't need to use the PLT - we can directly call it.
 
2190
      if (Subtarget->isTargetELF() &&
 
2191
          getTargetMachine().getRelocationModel() == Reloc::PIC_ &&
 
2192
          GV->hasDefaultVisibility() && !GV->hasLocalLinkage()) {
 
2193
        OpFlags = X86II::MO_PLT;
 
2194
      } else if (Subtarget->isPICStyleStubAny() &&
 
2195
               (GV->isDeclaration() || GV->isWeakForLinker()) &&
 
2196
               Subtarget->getDarwinVers() < 9) {
 
2197
        // PC-relative references to external symbols should go through $stub,
 
2198
        // unless we're building with the leopard linker or later, which
 
2199
        // automatically synthesizes these stubs.
 
2200
        OpFlags = X86II::MO_DARWIN_STUB;
 
2201
      }
 
2202
 
 
2203
      Callee = DAG.getTargetGlobalAddress(GV, dl, getPointerTy(),
 
2204
                                          G->getOffset(), OpFlags);
 
2205
    }
 
2206
  } else if (ExternalSymbolSDNode *S = dyn_cast<ExternalSymbolSDNode>(Callee)) {
 
2207
    unsigned char OpFlags = 0;
 
2208
 
 
2209
    // On ELF targets, in either X86-64 or X86-32 mode, direct calls to external
 
2210
    // symbols should go through the PLT.
 
2211
    if (Subtarget->isTargetELF() &&
 
2212
        getTargetMachine().getRelocationModel() == Reloc::PIC_) {
 
2213
      OpFlags = X86II::MO_PLT;
 
2214
    } else if (Subtarget->isPICStyleStubAny() &&
 
2215
             Subtarget->getDarwinVers() < 9) {
 
2216
      // PC-relative references to external symbols should go through $stub,
 
2217
      // unless we're building with the leopard linker or later, which
 
2218
      // automatically synthesizes these stubs.
 
2219
      OpFlags = X86II::MO_DARWIN_STUB;
 
2220
    }
 
2221
 
 
2222
    Callee = DAG.getTargetExternalSymbol(S->getSymbol(), getPointerTy(),
 
2223
                                         OpFlags);
 
2224
  }
 
2225
 
 
2226
  // Returns a chain & a flag for retval copy to use.
 
2227
  SDVTList NodeTys = DAG.getVTList(MVT::Other, MVT::Flag);
 
2228
  SmallVector<SDValue, 8> Ops;
 
2229
 
 
2230
  if (!IsSibcall && isTailCall) {
 
2231
    Chain = DAG.getCALLSEQ_END(Chain, DAG.getIntPtrConstant(NumBytes, true),
 
2232
                           DAG.getIntPtrConstant(0, true), InFlag);
 
2233
    InFlag = Chain.getValue(1);
 
2234
  }
 
2235
 
 
2236
  Ops.push_back(Chain);
 
2237
  Ops.push_back(Callee);
 
2238
 
 
2239
  if (isTailCall)
 
2240
    Ops.push_back(DAG.getConstant(FPDiff, MVT::i32));
 
2241
 
 
2242
  // Add argument registers to the end of the list so that they are known live
 
2243
  // into the call.
 
2244
  for (unsigned i = 0, e = RegsToPass.size(); i != e; ++i)
 
2245
    Ops.push_back(DAG.getRegister(RegsToPass[i].first,
 
2246
                                  RegsToPass[i].second.getValueType()));
 
2247
 
 
2248
  // Add an implicit use GOT pointer in EBX.
 
2249
  if (!isTailCall && Subtarget->isPICStyleGOT())
 
2250
    Ops.push_back(DAG.getRegister(X86::EBX, getPointerTy()));
 
2251
 
 
2252
  // Add an implicit use of AL for non-Windows x86 64-bit vararg functions.
 
2253
  if (Is64Bit && isVarArg && !Subtarget->isTargetWin64())
 
2254
    Ops.push_back(DAG.getRegister(X86::AL, MVT::i8));
 
2255
 
 
2256
  if (InFlag.getNode())
 
2257
    Ops.push_back(InFlag);
 
2258
 
 
2259
  if (isTailCall) {
 
2260
    // We used to do:
 
2261
    //// If this is the first return lowered for this function, add the regs
 
2262
    //// to the liveout set for the function.
 
2263
    // This isn't right, although it's probably harmless on x86; liveouts
 
2264
    // should be computed from returns not tail calls.  Consider a void
 
2265
    // function making a tail call to a function returning int.
 
2266
    return DAG.getNode(X86ISD::TC_RETURN, dl,
 
2267
                       NodeTys, &Ops[0], Ops.size());
 
2268
  }
 
2269
 
 
2270
  Chain = DAG.getNode(X86ISD::CALL, dl, NodeTys, &Ops[0], Ops.size());
 
2271
  InFlag = Chain.getValue(1);
 
2272
 
 
2273
  // Create the CALLSEQ_END node.
 
2274
  unsigned NumBytesForCalleeToPush;
 
2275
  if (Subtarget->IsCalleePop(isVarArg, CallConv))
 
2276
    NumBytesForCalleeToPush = NumBytes;    // Callee pops everything
 
2277
  else if (!Is64Bit && !IsTailCallConvention(CallConv) && IsStructRet)
 
2278
    // If this is a call to a struct-return function, the callee
 
2279
    // pops the hidden struct pointer, so we have to push it back.
 
2280
    // This is common for Darwin/X86, Linux & Mingw32 targets.
 
2281
    NumBytesForCalleeToPush = 4;
 
2282
  else
 
2283
    NumBytesForCalleeToPush = 0;  // Callee pops nothing.
 
2284
 
 
2285
  // Returns a flag for retval copy to use.
 
2286
  if (!IsSibcall) {
 
2287
    Chain = DAG.getCALLSEQ_END(Chain,
 
2288
                               DAG.getIntPtrConstant(NumBytes, true),
 
2289
                               DAG.getIntPtrConstant(NumBytesForCalleeToPush,
 
2290
                                                     true),
 
2291
                               InFlag);
 
2292
    InFlag = Chain.getValue(1);
 
2293
  }
 
2294
 
 
2295
  // Handle result values, copying them out of physregs into vregs that we
 
2296
  // return.
 
2297
  return LowerCallResult(Chain, InFlag, CallConv, isVarArg,
 
2298
                         Ins, dl, DAG, InVals);
 
2299
}
 
2300
 
 
2301
 
 
2302
//===----------------------------------------------------------------------===//
 
2303
//                Fast Calling Convention (tail call) implementation
 
2304
//===----------------------------------------------------------------------===//
 
2305
 
 
2306
//  Like std call, callee cleans arguments, convention except that ECX is
 
2307
//  reserved for storing the tail called function address. Only 2 registers are
 
2308
//  free for argument passing (inreg). Tail call optimization is performed
 
2309
//  provided:
 
2310
//                * tailcallopt is enabled
 
2311
//                * caller/callee are fastcc
 
2312
//  On X86_64 architecture with GOT-style position independent code only local
 
2313
//  (within module) calls are supported at the moment.
 
2314
//  To keep the stack aligned according to platform abi the function
 
2315
//  GetAlignedArgumentStackSize ensures that argument delta is always multiples
 
2316
//  of stack alignment. (Dynamic linkers need this - darwin's dyld for example)
 
2317
//  If a tail called function callee has more arguments than the caller the
 
2318
//  caller needs to make sure that there is room to move the RETADDR to. This is
 
2319
//  achieved by reserving an area the size of the argument delta right after the
 
2320
//  original REtADDR, but before the saved framepointer or the spilled registers
 
2321
//  e.g. caller(arg1, arg2) calls callee(arg1, arg2,arg3,arg4)
 
2322
//  stack layout:
 
2323
//    arg1
 
2324
//    arg2
 
2325
//    RETADDR
 
2326
//    [ new RETADDR
 
2327
//      move area ]
 
2328
//    (possible EBP)
 
2329
//    ESI
 
2330
//    EDI
 
2331
//    local1 ..
 
2332
 
 
2333
/// GetAlignedArgumentStackSize - Make the stack size align e.g 16n + 12 aligned
 
2334
/// for a 16 byte align requirement.
 
2335
unsigned
 
2336
X86TargetLowering::GetAlignedArgumentStackSize(unsigned StackSize,
 
2337
                                               SelectionDAG& DAG) const {
 
2338
  MachineFunction &MF = DAG.getMachineFunction();
 
2339
  const TargetMachine &TM = MF.getTarget();
 
2340
  const TargetFrameInfo &TFI = *TM.getFrameInfo();
 
2341
  unsigned StackAlignment = TFI.getStackAlignment();
 
2342
  uint64_t AlignMask = StackAlignment - 1;
 
2343
  int64_t Offset = StackSize;
 
2344
  uint64_t SlotSize = TD->getPointerSize();
 
2345
  if ( (Offset & AlignMask) <= (StackAlignment - SlotSize) ) {
 
2346
    // Number smaller than 12 so just add the difference.
 
2347
    Offset += ((StackAlignment - SlotSize) - (Offset & AlignMask));
 
2348
  } else {
 
2349
    // Mask out lower bits, add stackalignment once plus the 12 bytes.
 
2350
    Offset = ((~AlignMask) & Offset) + StackAlignment +
 
2351
      (StackAlignment-SlotSize);
 
2352
  }
 
2353
  return Offset;
 
2354
}
 
2355
 
 
2356
/// MatchingStackOffset - Return true if the given stack call argument is
 
2357
/// already available in the same position (relatively) of the caller's
 
2358
/// incoming argument stack.
 
2359
static
 
2360
bool MatchingStackOffset(SDValue Arg, unsigned Offset, ISD::ArgFlagsTy Flags,
 
2361
                         MachineFrameInfo *MFI, const MachineRegisterInfo *MRI,
 
2362
                         const X86InstrInfo *TII) {
 
2363
  unsigned Bytes = Arg.getValueType().getSizeInBits() / 8;
 
2364
  int FI = INT_MAX;
 
2365
  if (Arg.getOpcode() == ISD::CopyFromReg) {
 
2366
    unsigned VR = cast<RegisterSDNode>(Arg.getOperand(1))->getReg();
 
2367
    if (!VR || TargetRegisterInfo::isPhysicalRegister(VR))
 
2368
      return false;
 
2369
    MachineInstr *Def = MRI->getVRegDef(VR);
 
2370
    if (!Def)
 
2371
      return false;
 
2372
    if (!Flags.isByVal()) {
 
2373
      if (!TII->isLoadFromStackSlot(Def, FI))
 
2374
        return false;
 
2375
    } else {
 
2376
      unsigned Opcode = Def->getOpcode();
 
2377
      if ((Opcode == X86::LEA32r || Opcode == X86::LEA64r) &&
 
2378
          Def->getOperand(1).isFI()) {
 
2379
        FI = Def->getOperand(1).getIndex();
 
2380
        Bytes = Flags.getByValSize();
 
2381
      } else
 
2382
        return false;
 
2383
    }
 
2384
  } else if (LoadSDNode *Ld = dyn_cast<LoadSDNode>(Arg)) {
 
2385
    if (Flags.isByVal())
 
2386
      // ByVal argument is passed in as a pointer but it's now being
 
2387
      // dereferenced. e.g.
 
2388
      // define @foo(%struct.X* %A) {
 
2389
      //   tail call @bar(%struct.X* byval %A)
 
2390
      // }
 
2391
      return false;
 
2392
    SDValue Ptr = Ld->getBasePtr();
 
2393
    FrameIndexSDNode *FINode = dyn_cast<FrameIndexSDNode>(Ptr);
 
2394
    if (!FINode)
 
2395
      return false;
 
2396
    FI = FINode->getIndex();
 
2397
  } else
 
2398
    return false;
 
2399
 
 
2400
  assert(FI != INT_MAX);
 
2401
  if (!MFI->isFixedObjectIndex(FI))
 
2402
    return false;
 
2403
  return Offset == MFI->getObjectOffset(FI) && Bytes == MFI->getObjectSize(FI);
 
2404
}
 
2405
 
 
2406
/// IsEligibleForTailCallOptimization - Check whether the call is eligible
 
2407
/// for tail call optimization. Targets which want to do tail call
 
2408
/// optimization should implement this function.
 
2409
bool
 
2410
X86TargetLowering::IsEligibleForTailCallOptimization(SDValue Callee,
 
2411
                                                     CallingConv::ID CalleeCC,
 
2412
                                                     bool isVarArg,
 
2413
                                                     bool isCalleeStructRet,
 
2414
                                                     bool isCallerStructRet,
 
2415
                                    const SmallVectorImpl<ISD::OutputArg> &Outs,
 
2416
                                    const SmallVectorImpl<SDValue> &OutVals,
 
2417
                                    const SmallVectorImpl<ISD::InputArg> &Ins,
 
2418
                                                     SelectionDAG& DAG) const {
 
2419
  if (!IsTailCallConvention(CalleeCC) &&
 
2420
      CalleeCC != CallingConv::C)
 
2421
    return false;
 
2422
 
 
2423
  // If -tailcallopt is specified, make fastcc functions tail-callable.
 
2424
  const MachineFunction &MF = DAG.getMachineFunction();
 
2425
  const Function *CallerF = DAG.getMachineFunction().getFunction();
 
2426
  CallingConv::ID CallerCC = CallerF->getCallingConv();
 
2427
  bool CCMatch = CallerCC == CalleeCC;
 
2428
 
 
2429
  if (GuaranteedTailCallOpt) {
 
2430
    if (IsTailCallConvention(CalleeCC) && CCMatch)
 
2431
      return true;
 
2432
    return false;
 
2433
  }
 
2434
 
 
2435
  // Look for obvious safe cases to perform tail call optimization that do not
 
2436
  // require ABI changes. This is what gcc calls sibcall.
 
2437
 
 
2438
  // Can't do sibcall if stack needs to be dynamically re-aligned. PEI needs to
 
2439
  // emit a special epilogue.
 
2440
  if (RegInfo->needsStackRealignment(MF))
 
2441
    return false;
 
2442
 
 
2443
  // Do not sibcall optimize vararg calls unless the call site is not passing
 
2444
  // any arguments.
 
2445
  if (isVarArg && !Outs.empty())
 
2446
    return false;
 
2447
 
 
2448
  // Also avoid sibcall optimization if either caller or callee uses struct
 
2449
  // return semantics.
 
2450
  if (isCalleeStructRet || isCallerStructRet)
 
2451
    return false;
 
2452
 
 
2453
  // If the call result is in ST0 / ST1, it needs to be popped off the x87 stack.
 
2454
  // Therefore if it's not used by the call it is not safe to optimize this into
 
2455
  // a sibcall.
 
2456
  bool Unused = false;
 
2457
  for (unsigned i = 0, e = Ins.size(); i != e; ++i) {
 
2458
    if (!Ins[i].Used) {
 
2459
      Unused = true;
 
2460
      break;
 
2461
    }
 
2462
  }
 
2463
  if (Unused) {
 
2464
    SmallVector<CCValAssign, 16> RVLocs;
 
2465
    CCState CCInfo(CalleeCC, false, getTargetMachine(),
 
2466
                   RVLocs, *DAG.getContext());
 
2467
    CCInfo.AnalyzeCallResult(Ins, RetCC_X86);
 
2468
    for (unsigned i = 0, e = RVLocs.size(); i != e; ++i) {
 
2469
      CCValAssign &VA = RVLocs[i];
 
2470
      if (VA.getLocReg() == X86::ST0 || VA.getLocReg() == X86::ST1)
 
2471
        return false;
 
2472
    }
 
2473
  }
 
2474
 
 
2475
  // If the calling conventions do not match, then we'd better make sure the
 
2476
  // results are returned in the same way as what the caller expects.
 
2477
  if (!CCMatch) {
 
2478
    SmallVector<CCValAssign, 16> RVLocs1;
 
2479
    CCState CCInfo1(CalleeCC, false, getTargetMachine(),
 
2480
                    RVLocs1, *DAG.getContext());
 
2481
    CCInfo1.AnalyzeCallResult(Ins, RetCC_X86);
 
2482
 
 
2483
    SmallVector<CCValAssign, 16> RVLocs2;
 
2484
    CCState CCInfo2(CallerCC, false, getTargetMachine(),
 
2485
                    RVLocs2, *DAG.getContext());
 
2486
    CCInfo2.AnalyzeCallResult(Ins, RetCC_X86);
 
2487
 
 
2488
    if (RVLocs1.size() != RVLocs2.size())
 
2489
      return false;
 
2490
    for (unsigned i = 0, e = RVLocs1.size(); i != e; ++i) {
 
2491
      if (RVLocs1[i].isRegLoc() != RVLocs2[i].isRegLoc())
 
2492
        return false;
 
2493
      if (RVLocs1[i].getLocInfo() != RVLocs2[i].getLocInfo())
 
2494
        return false;
 
2495
      if (RVLocs1[i].isRegLoc()) {
 
2496
        if (RVLocs1[i].getLocReg() != RVLocs2[i].getLocReg())
 
2497
          return false;
 
2498
      } else {
 
2499
        if (RVLocs1[i].getLocMemOffset() != RVLocs2[i].getLocMemOffset())
 
2500
          return false;
 
2501
      }
 
2502
    }
 
2503
  }
 
2504
 
 
2505
  // If the callee takes no arguments then go on to check the results of the
 
2506
  // call.
 
2507
  if (!Outs.empty()) {
 
2508
    // Check if stack adjustment is needed. For now, do not do this if any
 
2509
    // argument is passed on the stack.
 
2510
    SmallVector<CCValAssign, 16> ArgLocs;
 
2511
    CCState CCInfo(CalleeCC, isVarArg, getTargetMachine(),
 
2512
                   ArgLocs, *DAG.getContext());
 
2513
    CCInfo.AnalyzeCallOperands(Outs, CCAssignFnForNode(CalleeCC));
 
2514
    if (CCInfo.getNextStackOffset()) {
 
2515
      MachineFunction &MF = DAG.getMachineFunction();
 
2516
      if (MF.getInfo<X86MachineFunctionInfo>()->getBytesToPopOnReturn())
 
2517
        return false;
 
2518
      if (Subtarget->isTargetWin64())
 
2519
        // Win64 ABI has additional complications.
 
2520
        return false;
 
2521
 
 
2522
      // Check if the arguments are already laid out in the right way as
 
2523
      // the caller's fixed stack objects.
 
2524
      MachineFrameInfo *MFI = MF.getFrameInfo();
 
2525
      const MachineRegisterInfo *MRI = &MF.getRegInfo();
 
2526
      const X86InstrInfo *TII =
 
2527
        ((X86TargetMachine&)getTargetMachine()).getInstrInfo();
 
2528
      for (unsigned i = 0, e = ArgLocs.size(); i != e; ++i) {
 
2529
        CCValAssign &VA = ArgLocs[i];
 
2530
        SDValue Arg = OutVals[i];
 
2531
        ISD::ArgFlagsTy Flags = Outs[i].Flags;
 
2532
        if (VA.getLocInfo() == CCValAssign::Indirect)
 
2533
          return false;
 
2534
        if (!VA.isRegLoc()) {
 
2535
          if (!MatchingStackOffset(Arg, VA.getLocMemOffset(), Flags,
 
2536
                                   MFI, MRI, TII))
 
2537
            return false;
 
2538
        }
 
2539
      }
 
2540
    }
 
2541
 
 
2542
    // If the tailcall address may be in a register, then make sure it's
 
2543
    // possible to register allocate for it. In 32-bit, the call address can
 
2544
    // only target EAX, EDX, or ECX since the tail call must be scheduled after
 
2545
    // callee-saved registers are restored. These happen to be the same
 
2546
    // registers used to pass 'inreg' arguments so watch out for those.
 
2547
    if (!Subtarget->is64Bit() &&
 
2548
        !isa<GlobalAddressSDNode>(Callee) &&
 
2549
        !isa<ExternalSymbolSDNode>(Callee)) {
 
2550
      unsigned NumInRegs = 0;
 
2551
      for (unsigned i = 0, e = ArgLocs.size(); i != e; ++i) {
 
2552
        CCValAssign &VA = ArgLocs[i];
 
2553
        if (!VA.isRegLoc())
 
2554
          continue;
 
2555
        unsigned Reg = VA.getLocReg();
 
2556
        switch (Reg) {
 
2557
        default: break;
 
2558
        case X86::EAX: case X86::EDX: case X86::ECX:
 
2559
          if (++NumInRegs == 3)
 
2560
            return false;
 
2561
          break;
 
2562
        }
 
2563
      }
 
2564
    }
 
2565
  }
 
2566
 
 
2567
  return true;
 
2568
}
 
2569
 
 
2570
FastISel *
 
2571
X86TargetLowering::createFastISel(FunctionLoweringInfo &funcInfo) const {
 
2572
  return X86::createFastISel(funcInfo);
 
2573
}
 
2574
 
 
2575
 
 
2576
//===----------------------------------------------------------------------===//
 
2577
//                           Other Lowering Hooks
 
2578
//===----------------------------------------------------------------------===//
 
2579
 
 
2580
static bool MayFoldLoad(SDValue Op) {
 
2581
  return Op.hasOneUse() && ISD::isNormalLoad(Op.getNode());
 
2582
}
 
2583
 
 
2584
static bool MayFoldIntoStore(SDValue Op) {
 
2585
  return Op.hasOneUse() && ISD::isNormalStore(*Op.getNode()->use_begin());
 
2586
}
 
2587
 
 
2588
static bool isTargetShuffle(unsigned Opcode) {
 
2589
  switch(Opcode) {
 
2590
  default: return false;
 
2591
  case X86ISD::PSHUFD:
 
2592
  case X86ISD::PSHUFHW:
 
2593
  case X86ISD::PSHUFLW:
 
2594
  case X86ISD::SHUFPD:
 
2595
  case X86ISD::SHUFPS:
 
2596
  case X86ISD::MOVLHPS:
 
2597
  case X86ISD::MOVLHPD:
 
2598
  case X86ISD::MOVHLPS:
 
2599
  case X86ISD::MOVLPS:
 
2600
  case X86ISD::MOVLPD:
 
2601
  case X86ISD::MOVSHDUP:
 
2602
  case X86ISD::MOVSLDUP:
 
2603
  case X86ISD::MOVSS:
 
2604
  case X86ISD::MOVSD:
 
2605
  case X86ISD::UNPCKLPS:
 
2606
  case X86ISD::UNPCKLPD:
 
2607
  case X86ISD::PUNPCKLWD:
 
2608
  case X86ISD::PUNPCKLBW:
 
2609
  case X86ISD::PUNPCKLDQ:
 
2610
  case X86ISD::PUNPCKLQDQ:
 
2611
  case X86ISD::UNPCKHPS:
 
2612
  case X86ISD::UNPCKHPD:
 
2613
  case X86ISD::PUNPCKHWD:
 
2614
  case X86ISD::PUNPCKHBW:
 
2615
  case X86ISD::PUNPCKHDQ:
 
2616
  case X86ISD::PUNPCKHQDQ:
 
2617
    return true;
 
2618
  }
 
2619
  return false;
 
2620
}
 
2621
 
 
2622
static SDValue getTargetShuffleNode(unsigned Opc, DebugLoc dl, EVT VT,
 
2623
                                               SDValue V1, SelectionDAG &DAG) {
 
2624
  switch(Opc) {
 
2625
  default: llvm_unreachable("Unknown x86 shuffle node");
 
2626
  case X86ISD::MOVSHDUP:
 
2627
  case X86ISD::MOVSLDUP:
 
2628
    return DAG.getNode(Opc, dl, VT, V1);
 
2629
  }
 
2630
 
 
2631
  return SDValue();
 
2632
}
 
2633
 
 
2634
static SDValue getTargetShuffleNode(unsigned Opc, DebugLoc dl, EVT VT,
 
2635
                          SDValue V1, unsigned TargetMask, SelectionDAG &DAG) {
 
2636
  switch(Opc) {
 
2637
  default: llvm_unreachable("Unknown x86 shuffle node");
 
2638
  case X86ISD::PSHUFD:
 
2639
  case X86ISD::PSHUFHW:
 
2640
  case X86ISD::PSHUFLW:
 
2641
    return DAG.getNode(Opc, dl, VT, V1, DAG.getConstant(TargetMask, MVT::i8));
 
2642
  }
 
2643
 
 
2644
  return SDValue();
 
2645
}
 
2646
 
 
2647
static SDValue getTargetShuffleNode(unsigned Opc, DebugLoc dl, EVT VT,
 
2648
               SDValue V1, SDValue V2, unsigned TargetMask, SelectionDAG &DAG) {
 
2649
  switch(Opc) {
 
2650
  default: llvm_unreachable("Unknown x86 shuffle node");
 
2651
  case X86ISD::SHUFPD:
 
2652
  case X86ISD::SHUFPS:
 
2653
    return DAG.getNode(Opc, dl, VT, V1, V2,
 
2654
                       DAG.getConstant(TargetMask, MVT::i8));
 
2655
  }
 
2656
  return SDValue();
 
2657
}
 
2658
 
 
2659
static SDValue getTargetShuffleNode(unsigned Opc, DebugLoc dl, EVT VT,
 
2660
                                    SDValue V1, SDValue V2, SelectionDAG &DAG) {
 
2661
  switch(Opc) {
 
2662
  default: llvm_unreachable("Unknown x86 shuffle node");
 
2663
  case X86ISD::MOVLHPS:
 
2664
  case X86ISD::MOVLHPD:
 
2665
  case X86ISD::MOVHLPS:
 
2666
  case X86ISD::MOVLPS:
 
2667
  case X86ISD::MOVLPD:
 
2668
  case X86ISD::MOVSS:
 
2669
  case X86ISD::MOVSD:
 
2670
  case X86ISD::UNPCKLPS:
 
2671
  case X86ISD::UNPCKLPD:
 
2672
  case X86ISD::PUNPCKLWD:
 
2673
  case X86ISD::PUNPCKLBW:
 
2674
  case X86ISD::PUNPCKLDQ:
 
2675
  case X86ISD::PUNPCKLQDQ:
 
2676
  case X86ISD::UNPCKHPS:
 
2677
  case X86ISD::UNPCKHPD:
 
2678
  case X86ISD::PUNPCKHWD:
 
2679
  case X86ISD::PUNPCKHBW:
 
2680
  case X86ISD::PUNPCKHDQ:
 
2681
  case X86ISD::PUNPCKHQDQ:
 
2682
    return DAG.getNode(Opc, dl, VT, V1, V2);
 
2683
  }
 
2684
  return SDValue();
 
2685
}
 
2686
 
 
2687
SDValue X86TargetLowering::getReturnAddressFrameIndex(SelectionDAG &DAG) const {
 
2688
  MachineFunction &MF = DAG.getMachineFunction();
 
2689
  X86MachineFunctionInfo *FuncInfo = MF.getInfo<X86MachineFunctionInfo>();
 
2690
  int ReturnAddrIndex = FuncInfo->getRAIndex();
 
2691
 
 
2692
  if (ReturnAddrIndex == 0) {
 
2693
    // Set up a frame object for the return address.
 
2694
    uint64_t SlotSize = TD->getPointerSize();
 
2695
    ReturnAddrIndex = MF.getFrameInfo()->CreateFixedObject(SlotSize, -SlotSize,
 
2696
                                                           false);
 
2697
    FuncInfo->setRAIndex(ReturnAddrIndex);
 
2698
  }
 
2699
 
 
2700
  return DAG.getFrameIndex(ReturnAddrIndex, getPointerTy());
 
2701
}
 
2702
 
 
2703
 
 
2704
bool X86::isOffsetSuitableForCodeModel(int64_t Offset, CodeModel::Model M,
 
2705
                                       bool hasSymbolicDisplacement) {
 
2706
  // Offset should fit into 32 bit immediate field.
 
2707
  if (!isInt<32>(Offset))
 
2708
    return false;
 
2709
 
 
2710
  // If we don't have a symbolic displacement - we don't have any extra
 
2711
  // restrictions.
 
2712
  if (!hasSymbolicDisplacement)
 
2713
    return true;
 
2714
 
 
2715
  // FIXME: Some tweaks might be needed for medium code model.
 
2716
  if (M != CodeModel::Small && M != CodeModel::Kernel)
 
2717
    return false;
 
2718
 
 
2719
  // For small code model we assume that latest object is 16MB before end of 31
 
2720
  // bits boundary. We may also accept pretty large negative constants knowing
 
2721
  // that all objects are in the positive half of address space.
 
2722
  if (M == CodeModel::Small && Offset < 16*1024*1024)
 
2723
    return true;
 
2724
 
 
2725
  // For kernel code model we know that all object resist in the negative half
 
2726
  // of 32bits address space. We may not accept negative offsets, since they may
 
2727
  // be just off and we may accept pretty large positive ones.
 
2728
  if (M == CodeModel::Kernel && Offset > 0)
 
2729
    return true;
 
2730
 
 
2731
  return false;
 
2732
}
 
2733
 
 
2734
/// TranslateX86CC - do a one to one translation of a ISD::CondCode to the X86
 
2735
/// specific condition code, returning the condition code and the LHS/RHS of the
 
2736
/// comparison to make.
 
2737
static unsigned TranslateX86CC(ISD::CondCode SetCCOpcode, bool isFP,
 
2738
                               SDValue &LHS, SDValue &RHS, SelectionDAG &DAG) {
 
2739
  if (!isFP) {
 
2740
    if (ConstantSDNode *RHSC = dyn_cast<ConstantSDNode>(RHS)) {
 
2741
      if (SetCCOpcode == ISD::SETGT && RHSC->isAllOnesValue()) {
 
2742
        // X > -1   -> X == 0, jump !sign.
 
2743
        RHS = DAG.getConstant(0, RHS.getValueType());
 
2744
        return X86::COND_NS;
 
2745
      } else if (SetCCOpcode == ISD::SETLT && RHSC->isNullValue()) {
 
2746
        // X < 0   -> X == 0, jump on sign.
 
2747
        return X86::COND_S;
 
2748
      } else if (SetCCOpcode == ISD::SETLT && RHSC->getZExtValue() == 1) {
 
2749
        // X < 1   -> X <= 0
 
2750
        RHS = DAG.getConstant(0, RHS.getValueType());
 
2751
        return X86::COND_LE;
 
2752
      }
 
2753
    }
 
2754
 
 
2755
    switch (SetCCOpcode) {
 
2756
    default: llvm_unreachable("Invalid integer condition!");
 
2757
    case ISD::SETEQ:  return X86::COND_E;
 
2758
    case ISD::SETGT:  return X86::COND_G;
 
2759
    case ISD::SETGE:  return X86::COND_GE;
 
2760
    case ISD::SETLT:  return X86::COND_L;
 
2761
    case ISD::SETLE:  return X86::COND_LE;
 
2762
    case ISD::SETNE:  return X86::COND_NE;
 
2763
    case ISD::SETULT: return X86::COND_B;
 
2764
    case ISD::SETUGT: return X86::COND_A;
 
2765
    case ISD::SETULE: return X86::COND_BE;
 
2766
    case ISD::SETUGE: return X86::COND_AE;
 
2767
    }
 
2768
  }
 
2769
 
 
2770
  // First determine if it is required or is profitable to flip the operands.
 
2771
 
 
2772
  // If LHS is a foldable load, but RHS is not, flip the condition.
 
2773
  if ((ISD::isNON_EXTLoad(LHS.getNode()) && LHS.hasOneUse()) &&
 
2774
      !(ISD::isNON_EXTLoad(RHS.getNode()) && RHS.hasOneUse())) {
 
2775
    SetCCOpcode = getSetCCSwappedOperands(SetCCOpcode);
 
2776
    std::swap(LHS, RHS);
 
2777
  }
 
2778
 
 
2779
  switch (SetCCOpcode) {
 
2780
  default: break;
 
2781
  case ISD::SETOLT:
 
2782
  case ISD::SETOLE:
 
2783
  case ISD::SETUGT:
 
2784
  case ISD::SETUGE:
 
2785
    std::swap(LHS, RHS);
 
2786
    break;
 
2787
  }
 
2788
 
 
2789
  // On a floating point condition, the flags are set as follows:
 
2790
  // ZF  PF  CF   op
 
2791
  //  0 | 0 | 0 | X > Y
 
2792
  //  0 | 0 | 1 | X < Y
 
2793
  //  1 | 0 | 0 | X == Y
 
2794
  //  1 | 1 | 1 | unordered
 
2795
  switch (SetCCOpcode) {
 
2796
  default: llvm_unreachable("Condcode should be pre-legalized away");
 
2797
  case ISD::SETUEQ:
 
2798
  case ISD::SETEQ:   return X86::COND_E;
 
2799
  case ISD::SETOLT:              // flipped
 
2800
  case ISD::SETOGT:
 
2801
  case ISD::SETGT:   return X86::COND_A;
 
2802
  case ISD::SETOLE:              // flipped
 
2803
  case ISD::SETOGE:
 
2804
  case ISD::SETGE:   return X86::COND_AE;
 
2805
  case ISD::SETUGT:              // flipped
 
2806
  case ISD::SETULT:
 
2807
  case ISD::SETLT:   return X86::COND_B;
 
2808
  case ISD::SETUGE:              // flipped
 
2809
  case ISD::SETULE:
 
2810
  case ISD::SETLE:   return X86::COND_BE;
 
2811
  case ISD::SETONE:
 
2812
  case ISD::SETNE:   return X86::COND_NE;
 
2813
  case ISD::SETUO:   return X86::COND_P;
 
2814
  case ISD::SETO:    return X86::COND_NP;
 
2815
  case ISD::SETOEQ:
 
2816
  case ISD::SETUNE:  return X86::COND_INVALID;
 
2817
  }
 
2818
}
 
2819
 
 
2820
/// hasFPCMov - is there a floating point cmov for the specific X86 condition
 
2821
/// code. Current x86 isa includes the following FP cmov instructions:
 
2822
/// fcmovb, fcomvbe, fcomve, fcmovu, fcmovae, fcmova, fcmovne, fcmovnu.
 
2823
static bool hasFPCMov(unsigned X86CC) {
 
2824
  switch (X86CC) {
 
2825
  default:
 
2826
    return false;
 
2827
  case X86::COND_B:
 
2828
  case X86::COND_BE:
 
2829
  case X86::COND_E:
 
2830
  case X86::COND_P:
 
2831
  case X86::COND_A:
 
2832
  case X86::COND_AE:
 
2833
  case X86::COND_NE:
 
2834
  case X86::COND_NP:
 
2835
    return true;
 
2836
  }
 
2837
}
 
2838
 
 
2839
/// isFPImmLegal - Returns true if the target can instruction select the
 
2840
/// specified FP immediate natively. If false, the legalizer will
 
2841
/// materialize the FP immediate as a load from a constant pool.
 
2842
bool X86TargetLowering::isFPImmLegal(const APFloat &Imm, EVT VT) const {
 
2843
  for (unsigned i = 0, e = LegalFPImmediates.size(); i != e; ++i) {
 
2844
    if (Imm.bitwiseIsEqual(LegalFPImmediates[i]))
 
2845
      return true;
 
2846
  }
 
2847
  return false;
 
2848
}
 
2849
 
 
2850
/// isUndefOrInRange - Return true if Val is undef or if its value falls within
 
2851
/// the specified range (L, H].
 
2852
static bool isUndefOrInRange(int Val, int Low, int Hi) {
 
2853
  return (Val < 0) || (Val >= Low && Val < Hi);
 
2854
}
 
2855
 
 
2856
/// isUndefOrEqual - Val is either less than zero (undef) or equal to the
 
2857
/// specified value.
 
2858
static bool isUndefOrEqual(int Val, int CmpVal) {
 
2859
  if (Val < 0 || Val == CmpVal)
 
2860
    return true;
 
2861
  return false;
 
2862
}
 
2863
 
 
2864
/// isPSHUFDMask - Return true if the node specifies a shuffle of elements that
 
2865
/// is suitable for input to PSHUFD or PSHUFW.  That is, it doesn't reference
 
2866
/// the second operand.
 
2867
static bool isPSHUFDMask(const SmallVectorImpl<int> &Mask, EVT VT) {
 
2868
  if (VT == MVT::v4f32 || VT == MVT::v4i32 || VT == MVT::v4i16)
 
2869
    return (Mask[0] < 4 && Mask[1] < 4 && Mask[2] < 4 && Mask[3] < 4);
 
2870
  if (VT == MVT::v2f64 || VT == MVT::v2i64)
 
2871
    return (Mask[0] < 2 && Mask[1] < 2);
 
2872
  return false;
 
2873
}
 
2874
 
 
2875
bool X86::isPSHUFDMask(ShuffleVectorSDNode *N) {
 
2876
  SmallVector<int, 8> M;
 
2877
  N->getMask(M);
 
2878
  return ::isPSHUFDMask(M, N->getValueType(0));
 
2879
}
 
2880
 
 
2881
/// isPSHUFHWMask - Return true if the node specifies a shuffle of elements that
 
2882
/// is suitable for input to PSHUFHW.
 
2883
static bool isPSHUFHWMask(const SmallVectorImpl<int> &Mask, EVT VT) {
 
2884
  if (VT != MVT::v8i16)
 
2885
    return false;
 
2886
 
 
2887
  // Lower quadword copied in order or undef.
 
2888
  for (int i = 0; i != 4; ++i)
 
2889
    if (Mask[i] >= 0 && Mask[i] != i)
 
2890
      return false;
 
2891
 
 
2892
  // Upper quadword shuffled.
 
2893
  for (int i = 4; i != 8; ++i)
 
2894
    if (Mask[i] >= 0 && (Mask[i] < 4 || Mask[i] > 7))
 
2895
      return false;
 
2896
 
 
2897
  return true;
 
2898
}
 
2899
 
 
2900
bool X86::isPSHUFHWMask(ShuffleVectorSDNode *N) {
 
2901
  SmallVector<int, 8> M;
 
2902
  N->getMask(M);
 
2903
  return ::isPSHUFHWMask(M, N->getValueType(0));
 
2904
}
 
2905
 
 
2906
/// isPSHUFLWMask - Return true if the node specifies a shuffle of elements that
 
2907
/// is suitable for input to PSHUFLW.
 
2908
static bool isPSHUFLWMask(const SmallVectorImpl<int> &Mask, EVT VT) {
 
2909
  if (VT != MVT::v8i16)
 
2910
    return false;
 
2911
 
 
2912
  // Upper quadword copied in order.
 
2913
  for (int i = 4; i != 8; ++i)
 
2914
    if (Mask[i] >= 0 && Mask[i] != i)
 
2915
      return false;
 
2916
 
 
2917
  // Lower quadword shuffled.
 
2918
  for (int i = 0; i != 4; ++i)
 
2919
    if (Mask[i] >= 4)
 
2920
      return false;
 
2921
 
 
2922
  return true;
 
2923
}
 
2924
 
 
2925
bool X86::isPSHUFLWMask(ShuffleVectorSDNode *N) {
 
2926
  SmallVector<int, 8> M;
 
2927
  N->getMask(M);
 
2928
  return ::isPSHUFLWMask(M, N->getValueType(0));
 
2929
}
 
2930
 
 
2931
/// isPALIGNRMask - Return true if the node specifies a shuffle of elements that
 
2932
/// is suitable for input to PALIGNR.
 
2933
static bool isPALIGNRMask(const SmallVectorImpl<int> &Mask, EVT VT,
 
2934
                          bool hasSSSE3) {
 
2935
  int i, e = VT.getVectorNumElements();
 
2936
  
 
2937
  // Do not handle v2i64 / v2f64 shuffles with palignr.
 
2938
  if (e < 4 || !hasSSSE3)
 
2939
    return false;
 
2940
  
 
2941
  for (i = 0; i != e; ++i)
 
2942
    if (Mask[i] >= 0)
 
2943
      break;
 
2944
  
 
2945
  // All undef, not a palignr.
 
2946
  if (i == e)
 
2947
    return false;
 
2948
 
 
2949
  // Determine if it's ok to perform a palignr with only the LHS, since we
 
2950
  // don't have access to the actual shuffle elements to see if RHS is undef.
 
2951
  bool Unary = Mask[i] < (int)e;
 
2952
  bool NeedsUnary = false;
 
2953
 
 
2954
  int s = Mask[i] - i;
 
2955
  
 
2956
  // Check the rest of the elements to see if they are consecutive.
 
2957
  for (++i; i != e; ++i) {
 
2958
    int m = Mask[i];
 
2959
    if (m < 0) 
 
2960
      continue;
 
2961
    
 
2962
    Unary = Unary && (m < (int)e);
 
2963
    NeedsUnary = NeedsUnary || (m < s);
 
2964
 
 
2965
    if (NeedsUnary && !Unary)
 
2966
      return false;
 
2967
    if (Unary && m != ((s+i) & (e-1)))
 
2968
      return false;
 
2969
    if (!Unary && m != (s+i))
 
2970
      return false;
 
2971
  }
 
2972
  return true;
 
2973
}
 
2974
 
 
2975
bool X86::isPALIGNRMask(ShuffleVectorSDNode *N) {
 
2976
  SmallVector<int, 8> M;
 
2977
  N->getMask(M);
 
2978
  return ::isPALIGNRMask(M, N->getValueType(0), true);
 
2979
}
 
2980
 
 
2981
/// isSHUFPMask - Return true if the specified VECTOR_SHUFFLE operand
 
2982
/// specifies a shuffle of elements that is suitable for input to SHUFP*.
 
2983
static bool isSHUFPMask(const SmallVectorImpl<int> &Mask, EVT VT) {
 
2984
  int NumElems = VT.getVectorNumElements();
 
2985
  if (NumElems != 2 && NumElems != 4)
 
2986
    return false;
 
2987
 
 
2988
  int Half = NumElems / 2;
 
2989
  for (int i = 0; i < Half; ++i)
 
2990
    if (!isUndefOrInRange(Mask[i], 0, NumElems))
 
2991
      return false;
 
2992
  for (int i = Half; i < NumElems; ++i)
 
2993
    if (!isUndefOrInRange(Mask[i], NumElems, NumElems*2))
 
2994
      return false;
 
2995
 
 
2996
  return true;
 
2997
}
 
2998
 
 
2999
bool X86::isSHUFPMask(ShuffleVectorSDNode *N) {
 
3000
  SmallVector<int, 8> M;
 
3001
  N->getMask(M);
 
3002
  return ::isSHUFPMask(M, N->getValueType(0));
 
3003
}
 
3004
 
 
3005
/// isCommutedSHUFP - Returns true if the shuffle mask is exactly
 
3006
/// the reverse of what x86 shuffles want. x86 shuffles requires the lower
 
3007
/// half elements to come from vector 1 (which would equal the dest.) and
 
3008
/// the upper half to come from vector 2.
 
3009
static bool isCommutedSHUFPMask(const SmallVectorImpl<int> &Mask, EVT VT) {
 
3010
  int NumElems = VT.getVectorNumElements();
 
3011
 
 
3012
  if (NumElems != 2 && NumElems != 4)
 
3013
    return false;
 
3014
 
 
3015
  int Half = NumElems / 2;
 
3016
  for (int i = 0; i < Half; ++i)
 
3017
    if (!isUndefOrInRange(Mask[i], NumElems, NumElems*2))
 
3018
      return false;
 
3019
  for (int i = Half; i < NumElems; ++i)
 
3020
    if (!isUndefOrInRange(Mask[i], 0, NumElems))
 
3021
      return false;
 
3022
  return true;
 
3023
}
 
3024
 
 
3025
static bool isCommutedSHUFP(ShuffleVectorSDNode *N) {
 
3026
  SmallVector<int, 8> M;
 
3027
  N->getMask(M);
 
3028
  return isCommutedSHUFPMask(M, N->getValueType(0));
 
3029
}
 
3030
 
 
3031
/// isMOVHLPSMask - Return true if the specified VECTOR_SHUFFLE operand
 
3032
/// specifies a shuffle of elements that is suitable for input to MOVHLPS.
 
3033
bool X86::isMOVHLPSMask(ShuffleVectorSDNode *N) {
 
3034
  if (N->getValueType(0).getVectorNumElements() != 4)
 
3035
    return false;
 
3036
 
 
3037
  // Expect bit0 == 6, bit1 == 7, bit2 == 2, bit3 == 3
 
3038
  return isUndefOrEqual(N->getMaskElt(0), 6) &&
 
3039
         isUndefOrEqual(N->getMaskElt(1), 7) &&
 
3040
         isUndefOrEqual(N->getMaskElt(2), 2) &&
 
3041
         isUndefOrEqual(N->getMaskElt(3), 3);
 
3042
}
 
3043
 
 
3044
/// isMOVHLPS_v_undef_Mask - Special case of isMOVHLPSMask for canonical form
 
3045
/// of vector_shuffle v, v, <2, 3, 2, 3>, i.e. vector_shuffle v, undef,
 
3046
/// <2, 3, 2, 3>
 
3047
bool X86::isMOVHLPS_v_undef_Mask(ShuffleVectorSDNode *N) {
 
3048
  unsigned NumElems = N->getValueType(0).getVectorNumElements();
 
3049
  
 
3050
  if (NumElems != 4)
 
3051
    return false;
 
3052
  
 
3053
  return isUndefOrEqual(N->getMaskElt(0), 2) &&
 
3054
  isUndefOrEqual(N->getMaskElt(1), 3) &&
 
3055
  isUndefOrEqual(N->getMaskElt(2), 2) &&
 
3056
  isUndefOrEqual(N->getMaskElt(3), 3);
 
3057
}
 
3058
 
 
3059
/// isMOVLPMask - Return true if the specified VECTOR_SHUFFLE operand
 
3060
/// specifies a shuffle of elements that is suitable for input to MOVLP{S|D}.
 
3061
bool X86::isMOVLPMask(ShuffleVectorSDNode *N) {
 
3062
  unsigned NumElems = N->getValueType(0).getVectorNumElements();
 
3063
 
 
3064
  if (NumElems != 2 && NumElems != 4)
 
3065
    return false;
 
3066
 
 
3067
  for (unsigned i = 0; i < NumElems/2; ++i)
 
3068
    if (!isUndefOrEqual(N->getMaskElt(i), i + NumElems))
 
3069
      return false;
 
3070
 
 
3071
  for (unsigned i = NumElems/2; i < NumElems; ++i)
 
3072
    if (!isUndefOrEqual(N->getMaskElt(i), i))
 
3073
      return false;
 
3074
 
 
3075
  return true;
 
3076
}
 
3077
 
 
3078
/// isMOVLHPSMask - Return true if the specified VECTOR_SHUFFLE operand
 
3079
/// specifies a shuffle of elements that is suitable for input to MOVLHPS.
 
3080
bool X86::isMOVLHPSMask(ShuffleVectorSDNode *N) {
 
3081
  unsigned NumElems = N->getValueType(0).getVectorNumElements();
 
3082
 
 
3083
  if (NumElems != 2 && NumElems != 4)
 
3084
    return false;
 
3085
 
 
3086
  for (unsigned i = 0; i < NumElems/2; ++i)
 
3087
    if (!isUndefOrEqual(N->getMaskElt(i), i))
 
3088
      return false;
 
3089
 
 
3090
  for (unsigned i = 0; i < NumElems/2; ++i)
 
3091
    if (!isUndefOrEqual(N->getMaskElt(i + NumElems/2), i + NumElems))
 
3092
      return false;
 
3093
 
 
3094
  return true;
 
3095
}
 
3096
 
 
3097
/// isUNPCKLMask - Return true if the specified VECTOR_SHUFFLE operand
 
3098
/// specifies a shuffle of elements that is suitable for input to UNPCKL.
 
3099
static bool isUNPCKLMask(const SmallVectorImpl<int> &Mask, EVT VT,
 
3100
                         bool V2IsSplat = false) {
 
3101
  int NumElts = VT.getVectorNumElements();
 
3102
  if (NumElts != 2 && NumElts != 4 && NumElts != 8 && NumElts != 16)
 
3103
    return false;
 
3104
 
 
3105
  for (int i = 0, j = 0; i != NumElts; i += 2, ++j) {
 
3106
    int BitI  = Mask[i];
 
3107
    int BitI1 = Mask[i+1];
 
3108
    if (!isUndefOrEqual(BitI, j))
 
3109
      return false;
 
3110
    if (V2IsSplat) {
 
3111
      if (!isUndefOrEqual(BitI1, NumElts))
 
3112
        return false;
 
3113
    } else {
 
3114
      if (!isUndefOrEqual(BitI1, j + NumElts))
 
3115
        return false;
 
3116
    }
 
3117
  }
 
3118
  return true;
 
3119
}
 
3120
 
 
3121
bool X86::isUNPCKLMask(ShuffleVectorSDNode *N, bool V2IsSplat) {
 
3122
  SmallVector<int, 8> M;
 
3123
  N->getMask(M);
 
3124
  return ::isUNPCKLMask(M, N->getValueType(0), V2IsSplat);
 
3125
}
 
3126
 
 
3127
/// isUNPCKHMask - Return true if the specified VECTOR_SHUFFLE operand
 
3128
/// specifies a shuffle of elements that is suitable for input to UNPCKH.
 
3129
static bool isUNPCKHMask(const SmallVectorImpl<int> &Mask, EVT VT,
 
3130
                         bool V2IsSplat = false) {
 
3131
  int NumElts = VT.getVectorNumElements();
 
3132
  if (NumElts != 2 && NumElts != 4 && NumElts != 8 && NumElts != 16)
 
3133
    return false;
 
3134
 
 
3135
  for (int i = 0, j = 0; i != NumElts; i += 2, ++j) {
 
3136
    int BitI  = Mask[i];
 
3137
    int BitI1 = Mask[i+1];
 
3138
    if (!isUndefOrEqual(BitI, j + NumElts/2))
 
3139
      return false;
 
3140
    if (V2IsSplat) {
 
3141
      if (isUndefOrEqual(BitI1, NumElts))
 
3142
        return false;
 
3143
    } else {
 
3144
      if (!isUndefOrEqual(BitI1, j + NumElts/2 + NumElts))
 
3145
        return false;
 
3146
    }
 
3147
  }
 
3148
  return true;
 
3149
}
 
3150
 
 
3151
bool X86::isUNPCKHMask(ShuffleVectorSDNode *N, bool V2IsSplat) {
 
3152
  SmallVector<int, 8> M;
 
3153
  N->getMask(M);
 
3154
  return ::isUNPCKHMask(M, N->getValueType(0), V2IsSplat);
 
3155
}
 
3156
 
 
3157
/// isUNPCKL_v_undef_Mask - Special case of isUNPCKLMask for canonical form
 
3158
/// of vector_shuffle v, v, <0, 4, 1, 5>, i.e. vector_shuffle v, undef,
 
3159
/// <0, 0, 1, 1>
 
3160
static bool isUNPCKL_v_undef_Mask(const SmallVectorImpl<int> &Mask, EVT VT) {
 
3161
  int NumElems = VT.getVectorNumElements();
 
3162
  if (NumElems != 2 && NumElems != 4 && NumElems != 8 && NumElems != 16)
 
3163
    return false;
 
3164
 
 
3165
  for (int i = 0, j = 0; i != NumElems; i += 2, ++j) {
 
3166
    int BitI  = Mask[i];
 
3167
    int BitI1 = Mask[i+1];
 
3168
    if (!isUndefOrEqual(BitI, j))
 
3169
      return false;
 
3170
    if (!isUndefOrEqual(BitI1, j))
 
3171
      return false;
 
3172
  }
 
3173
  return true;
 
3174
}
 
3175
 
 
3176
bool X86::isUNPCKL_v_undef_Mask(ShuffleVectorSDNode *N) {
 
3177
  SmallVector<int, 8> M;
 
3178
  N->getMask(M);
 
3179
  return ::isUNPCKL_v_undef_Mask(M, N->getValueType(0));
 
3180
}
 
3181
 
 
3182
/// isUNPCKH_v_undef_Mask - Special case of isUNPCKHMask for canonical form
 
3183
/// of vector_shuffle v, v, <2, 6, 3, 7>, i.e. vector_shuffle v, undef,
 
3184
/// <2, 2, 3, 3>
 
3185
static bool isUNPCKH_v_undef_Mask(const SmallVectorImpl<int> &Mask, EVT VT) {
 
3186
  int NumElems = VT.getVectorNumElements();
 
3187
  if (NumElems != 2 && NumElems != 4 && NumElems != 8 && NumElems != 16)
 
3188
    return false;
 
3189
 
 
3190
  for (int i = 0, j = NumElems / 2; i != NumElems; i += 2, ++j) {
 
3191
    int BitI  = Mask[i];
 
3192
    int BitI1 = Mask[i+1];
 
3193
    if (!isUndefOrEqual(BitI, j))
 
3194
      return false;
 
3195
    if (!isUndefOrEqual(BitI1, j))
 
3196
      return false;
 
3197
  }
 
3198
  return true;
 
3199
}
 
3200
 
 
3201
bool X86::isUNPCKH_v_undef_Mask(ShuffleVectorSDNode *N) {
 
3202
  SmallVector<int, 8> M;
 
3203
  N->getMask(M);
 
3204
  return ::isUNPCKH_v_undef_Mask(M, N->getValueType(0));
 
3205
}
 
3206
 
 
3207
/// isMOVLMask - Return true if the specified VECTOR_SHUFFLE operand
 
3208
/// specifies a shuffle of elements that is suitable for input to MOVSS,
 
3209
/// MOVSD, and MOVD, i.e. setting the lowest element.
 
3210
static bool isMOVLMask(const SmallVectorImpl<int> &Mask, EVT VT) {
 
3211
  if (VT.getVectorElementType().getSizeInBits() < 32)
 
3212
    return false;
 
3213
 
 
3214
  int NumElts = VT.getVectorNumElements();
 
3215
 
 
3216
  if (!isUndefOrEqual(Mask[0], NumElts))
 
3217
    return false;
 
3218
 
 
3219
  for (int i = 1; i < NumElts; ++i)
 
3220
    if (!isUndefOrEqual(Mask[i], i))
 
3221
      return false;
 
3222
 
 
3223
  return true;
 
3224
}
 
3225
 
 
3226
bool X86::isMOVLMask(ShuffleVectorSDNode *N) {
 
3227
  SmallVector<int, 8> M;
 
3228
  N->getMask(M);
 
3229
  return ::isMOVLMask(M, N->getValueType(0));
 
3230
}
 
3231
 
 
3232
/// isCommutedMOVL - Returns true if the shuffle mask is except the reverse
 
3233
/// of what x86 movss want. X86 movs requires the lowest  element to be lowest
 
3234
/// element of vector 2 and the other elements to come from vector 1 in order.
 
3235
static bool isCommutedMOVLMask(const SmallVectorImpl<int> &Mask, EVT VT,
 
3236
                               bool V2IsSplat = false, bool V2IsUndef = false) {
 
3237
  int NumOps = VT.getVectorNumElements();
 
3238
  if (NumOps != 2 && NumOps != 4 && NumOps != 8 && NumOps != 16)
 
3239
    return false;
 
3240
 
 
3241
  if (!isUndefOrEqual(Mask[0], 0))
 
3242
    return false;
 
3243
 
 
3244
  for (int i = 1; i < NumOps; ++i)
 
3245
    if (!(isUndefOrEqual(Mask[i], i+NumOps) ||
 
3246
          (V2IsUndef && isUndefOrInRange(Mask[i], NumOps, NumOps*2)) ||
 
3247
          (V2IsSplat && isUndefOrEqual(Mask[i], NumOps))))
 
3248
      return false;
 
3249
 
 
3250
  return true;
 
3251
}
 
3252
 
 
3253
static bool isCommutedMOVL(ShuffleVectorSDNode *N, bool V2IsSplat = false,
 
3254
                           bool V2IsUndef = false) {
 
3255
  SmallVector<int, 8> M;
 
3256
  N->getMask(M);
 
3257
  return isCommutedMOVLMask(M, N->getValueType(0), V2IsSplat, V2IsUndef);
 
3258
}
 
3259
 
 
3260
/// isMOVSHDUPMask - Return true if the specified VECTOR_SHUFFLE operand
 
3261
/// specifies a shuffle of elements that is suitable for input to MOVSHDUP.
 
3262
bool X86::isMOVSHDUPMask(ShuffleVectorSDNode *N) {
 
3263
  if (N->getValueType(0).getVectorNumElements() != 4)
 
3264
    return false;
 
3265
 
 
3266
  // Expect 1, 1, 3, 3
 
3267
  for (unsigned i = 0; i < 2; ++i) {
 
3268
    int Elt = N->getMaskElt(i);
 
3269
    if (Elt >= 0 && Elt != 1)
 
3270
      return false;
 
3271
  }
 
3272
 
 
3273
  bool HasHi = false;
 
3274
  for (unsigned i = 2; i < 4; ++i) {
 
3275
    int Elt = N->getMaskElt(i);
 
3276
    if (Elt >= 0 && Elt != 3)
 
3277
      return false;
 
3278
    if (Elt == 3)
 
3279
      HasHi = true;
 
3280
  }
 
3281
  // Don't use movshdup if it can be done with a shufps.
 
3282
  // FIXME: verify that matching u, u, 3, 3 is what we want.
 
3283
  return HasHi;
 
3284
}
 
3285
 
 
3286
/// isMOVSLDUPMask - Return true if the specified VECTOR_SHUFFLE operand
 
3287
/// specifies a shuffle of elements that is suitable for input to MOVSLDUP.
 
3288
bool X86::isMOVSLDUPMask(ShuffleVectorSDNode *N) {
 
3289
  if (N->getValueType(0).getVectorNumElements() != 4)
 
3290
    return false;
 
3291
 
 
3292
  // Expect 0, 0, 2, 2
 
3293
  for (unsigned i = 0; i < 2; ++i)
 
3294
    if (N->getMaskElt(i) > 0)
 
3295
      return false;
 
3296
 
 
3297
  bool HasHi = false;
 
3298
  for (unsigned i = 2; i < 4; ++i) {
 
3299
    int Elt = N->getMaskElt(i);
 
3300
    if (Elt >= 0 && Elt != 2)
 
3301
      return false;
 
3302
    if (Elt == 2)
 
3303
      HasHi = true;
 
3304
  }
 
3305
  // Don't use movsldup if it can be done with a shufps.
 
3306
  return HasHi;
 
3307
}
 
3308
 
 
3309
/// isMOVDDUPMask - Return true if the specified VECTOR_SHUFFLE operand
 
3310
/// specifies a shuffle of elements that is suitable for input to MOVDDUP.
 
3311
bool X86::isMOVDDUPMask(ShuffleVectorSDNode *N) {
 
3312
  int e = N->getValueType(0).getVectorNumElements() / 2;
 
3313
 
 
3314
  for (int i = 0; i < e; ++i)
 
3315
    if (!isUndefOrEqual(N->getMaskElt(i), i))
 
3316
      return false;
 
3317
  for (int i = 0; i < e; ++i)
 
3318
    if (!isUndefOrEqual(N->getMaskElt(e+i), i))
 
3319
      return false;
 
3320
  return true;
 
3321
}
 
3322
 
 
3323
/// getShuffleSHUFImmediate - Return the appropriate immediate to shuffle
 
3324
/// the specified VECTOR_SHUFFLE mask with PSHUF* and SHUFP* instructions.
 
3325
unsigned X86::getShuffleSHUFImmediate(SDNode *N) {
 
3326
  ShuffleVectorSDNode *SVOp = cast<ShuffleVectorSDNode>(N);
 
3327
  int NumOperands = SVOp->getValueType(0).getVectorNumElements();
 
3328
 
 
3329
  unsigned Shift = (NumOperands == 4) ? 2 : 1;
 
3330
  unsigned Mask = 0;
 
3331
  for (int i = 0; i < NumOperands; ++i) {
 
3332
    int Val = SVOp->getMaskElt(NumOperands-i-1);
 
3333
    if (Val < 0) Val = 0;
 
3334
    if (Val >= NumOperands) Val -= NumOperands;
 
3335
    Mask |= Val;
 
3336
    if (i != NumOperands - 1)
 
3337
      Mask <<= Shift;
 
3338
  }
 
3339
  return Mask;
 
3340
}
 
3341
 
 
3342
/// getShufflePSHUFHWImmediate - Return the appropriate immediate to shuffle
 
3343
/// the specified VECTOR_SHUFFLE mask with the PSHUFHW instruction.
 
3344
unsigned X86::getShufflePSHUFHWImmediate(SDNode *N) {
 
3345
  ShuffleVectorSDNode *SVOp = cast<ShuffleVectorSDNode>(N);
 
3346
  unsigned Mask = 0;
 
3347
  // 8 nodes, but we only care about the last 4.
 
3348
  for (unsigned i = 7; i >= 4; --i) {
 
3349
    int Val = SVOp->getMaskElt(i);
 
3350
    if (Val >= 0)
 
3351
      Mask |= (Val - 4);
 
3352
    if (i != 4)
 
3353
      Mask <<= 2;
 
3354
  }
 
3355
  return Mask;
 
3356
}
 
3357
 
 
3358
/// getShufflePSHUFLWImmediate - Return the appropriate immediate to shuffle
 
3359
/// the specified VECTOR_SHUFFLE mask with the PSHUFLW instruction.
 
3360
unsigned X86::getShufflePSHUFLWImmediate(SDNode *N) {
 
3361
  ShuffleVectorSDNode *SVOp = cast<ShuffleVectorSDNode>(N);
 
3362
  unsigned Mask = 0;
 
3363
  // 8 nodes, but we only care about the first 4.
 
3364
  for (int i = 3; i >= 0; --i) {
 
3365
    int Val = SVOp->getMaskElt(i);
 
3366
    if (Val >= 0)
 
3367
      Mask |= Val;
 
3368
    if (i != 0)
 
3369
      Mask <<= 2;
 
3370
  }
 
3371
  return Mask;
 
3372
}
 
3373
 
 
3374
/// getShufflePALIGNRImmediate - Return the appropriate immediate to shuffle
 
3375
/// the specified VECTOR_SHUFFLE mask with the PALIGNR instruction.
 
3376
unsigned X86::getShufflePALIGNRImmediate(SDNode *N) {
 
3377
  ShuffleVectorSDNode *SVOp = cast<ShuffleVectorSDNode>(N);
 
3378
  EVT VVT = N->getValueType(0);
 
3379
  unsigned EltSize = VVT.getVectorElementType().getSizeInBits() >> 3;
 
3380
  int Val = 0;
 
3381
 
 
3382
  unsigned i, e;
 
3383
  for (i = 0, e = VVT.getVectorNumElements(); i != e; ++i) {
 
3384
    Val = SVOp->getMaskElt(i);
 
3385
    if (Val >= 0)
 
3386
      break;
 
3387
  }
 
3388
  return (Val - i) * EltSize;
 
3389
}
 
3390
 
 
3391
/// isZeroNode - Returns true if Elt is a constant zero or a floating point
 
3392
/// constant +0.0.
 
3393
bool X86::isZeroNode(SDValue Elt) {
 
3394
  return ((isa<ConstantSDNode>(Elt) &&
 
3395
           cast<ConstantSDNode>(Elt)->isNullValue()) ||
 
3396
          (isa<ConstantFPSDNode>(Elt) &&
 
3397
           cast<ConstantFPSDNode>(Elt)->getValueAPF().isPosZero()));
 
3398
}
 
3399
 
 
3400
/// CommuteVectorShuffle - Swap vector_shuffle operands as well as values in
 
3401
/// their permute mask.
 
3402
static SDValue CommuteVectorShuffle(ShuffleVectorSDNode *SVOp,
 
3403
                                    SelectionDAG &DAG) {
 
3404
  EVT VT = SVOp->getValueType(0);
 
3405
  unsigned NumElems = VT.getVectorNumElements();
 
3406
  SmallVector<int, 8> MaskVec;
 
3407
 
 
3408
  for (unsigned i = 0; i != NumElems; ++i) {
 
3409
    int idx = SVOp->getMaskElt(i);
 
3410
    if (idx < 0)
 
3411
      MaskVec.push_back(idx);
 
3412
    else if (idx < (int)NumElems)
 
3413
      MaskVec.push_back(idx + NumElems);
 
3414
    else
 
3415
      MaskVec.push_back(idx - NumElems);
 
3416
  }
 
3417
  return DAG.getVectorShuffle(VT, SVOp->getDebugLoc(), SVOp->getOperand(1),
 
3418
                              SVOp->getOperand(0), &MaskVec[0]);
 
3419
}
 
3420
 
 
3421
/// CommuteVectorShuffleMask - Change values in a shuffle permute mask assuming
 
3422
/// the two vector operands have swapped position.
 
3423
static void CommuteVectorShuffleMask(SmallVectorImpl<int> &Mask, EVT VT) {
 
3424
  unsigned NumElems = VT.getVectorNumElements();
 
3425
  for (unsigned i = 0; i != NumElems; ++i) {
 
3426
    int idx = Mask[i];
 
3427
    if (idx < 0)
 
3428
      continue;
 
3429
    else if (idx < (int)NumElems)
 
3430
      Mask[i] = idx + NumElems;
 
3431
    else
 
3432
      Mask[i] = idx - NumElems;
 
3433
  }
 
3434
}
 
3435
 
 
3436
/// ShouldXformToMOVHLPS - Return true if the node should be transformed to
 
3437
/// match movhlps. The lower half elements should come from upper half of
 
3438
/// V1 (and in order), and the upper half elements should come from the upper
 
3439
/// half of V2 (and in order).
 
3440
static bool ShouldXformToMOVHLPS(ShuffleVectorSDNode *Op) {
 
3441
  if (Op->getValueType(0).getVectorNumElements() != 4)
 
3442
    return false;
 
3443
  for (unsigned i = 0, e = 2; i != e; ++i)
 
3444
    if (!isUndefOrEqual(Op->getMaskElt(i), i+2))
 
3445
      return false;
 
3446
  for (unsigned i = 2; i != 4; ++i)
 
3447
    if (!isUndefOrEqual(Op->getMaskElt(i), i+4))
 
3448
      return false;
 
3449
  return true;
 
3450
}
 
3451
 
 
3452
/// isScalarLoadToVector - Returns true if the node is a scalar load that
 
3453
/// is promoted to a vector. It also returns the LoadSDNode by reference if
 
3454
/// required.
 
3455
static bool isScalarLoadToVector(SDNode *N, LoadSDNode **LD = NULL) {
 
3456
  if (N->getOpcode() != ISD::SCALAR_TO_VECTOR)
 
3457
    return false;
 
3458
  N = N->getOperand(0).getNode();
 
3459
  if (!ISD::isNON_EXTLoad(N))
 
3460
    return false;
 
3461
  if (LD)
 
3462
    *LD = cast<LoadSDNode>(N);
 
3463
  return true;
 
3464
}
 
3465
 
 
3466
/// ShouldXformToMOVLP{S|D} - Return true if the node should be transformed to
 
3467
/// match movlp{s|d}. The lower half elements should come from lower half of
 
3468
/// V1 (and in order), and the upper half elements should come from the upper
 
3469
/// half of V2 (and in order). And since V1 will become the source of the
 
3470
/// MOVLP, it must be either a vector load or a scalar load to vector.
 
3471
static bool ShouldXformToMOVLP(SDNode *V1, SDNode *V2,
 
3472
                               ShuffleVectorSDNode *Op) {
 
3473
  if (!ISD::isNON_EXTLoad(V1) && !isScalarLoadToVector(V1))
 
3474
    return false;
 
3475
  // Is V2 is a vector load, don't do this transformation. We will try to use
 
3476
  // load folding shufps op.
 
3477
  if (ISD::isNON_EXTLoad(V2))
 
3478
    return false;
 
3479
 
 
3480
  unsigned NumElems = Op->getValueType(0).getVectorNumElements();
 
3481
 
 
3482
  if (NumElems != 2 && NumElems != 4)
 
3483
    return false;
 
3484
  for (unsigned i = 0, e = NumElems/2; i != e; ++i)
 
3485
    if (!isUndefOrEqual(Op->getMaskElt(i), i))
 
3486
      return false;
 
3487
  for (unsigned i = NumElems/2; i != NumElems; ++i)
 
3488
    if (!isUndefOrEqual(Op->getMaskElt(i), i+NumElems))
 
3489
      return false;
 
3490
  return true;
 
3491
}
 
3492
 
 
3493
/// isSplatVector - Returns true if N is a BUILD_VECTOR node whose elements are
 
3494
/// all the same.
 
3495
static bool isSplatVector(SDNode *N) {
 
3496
  if (N->getOpcode() != ISD::BUILD_VECTOR)
 
3497
    return false;
 
3498
 
 
3499
  SDValue SplatValue = N->getOperand(0);
 
3500
  for (unsigned i = 1, e = N->getNumOperands(); i != e; ++i)
 
3501
    if (N->getOperand(i) != SplatValue)
 
3502
      return false;
 
3503
  return true;
 
3504
}
 
3505
 
 
3506
/// isZeroShuffle - Returns true if N is a VECTOR_SHUFFLE that can be resolved
 
3507
/// to an zero vector.
 
3508
/// FIXME: move to dag combiner / method on ShuffleVectorSDNode
 
3509
static bool isZeroShuffle(ShuffleVectorSDNode *N) {
 
3510
  SDValue V1 = N->getOperand(0);
 
3511
  SDValue V2 = N->getOperand(1);
 
3512
  unsigned NumElems = N->getValueType(0).getVectorNumElements();
 
3513
  for (unsigned i = 0; i != NumElems; ++i) {
 
3514
    int Idx = N->getMaskElt(i);
 
3515
    if (Idx >= (int)NumElems) {
 
3516
      unsigned Opc = V2.getOpcode();
 
3517
      if (Opc == ISD::UNDEF || ISD::isBuildVectorAllZeros(V2.getNode()))
 
3518
        continue;
 
3519
      if (Opc != ISD::BUILD_VECTOR ||
 
3520
          !X86::isZeroNode(V2.getOperand(Idx-NumElems)))
 
3521
        return false;
 
3522
    } else if (Idx >= 0) {
 
3523
      unsigned Opc = V1.getOpcode();
 
3524
      if (Opc == ISD::UNDEF || ISD::isBuildVectorAllZeros(V1.getNode()))
 
3525
        continue;
 
3526
      if (Opc != ISD::BUILD_VECTOR ||
 
3527
          !X86::isZeroNode(V1.getOperand(Idx)))
 
3528
        return false;
 
3529
    }
 
3530
  }
 
3531
  return true;
 
3532
}
 
3533
 
 
3534
/// getZeroVector - Returns a vector of specified type with all zero elements.
 
3535
///
 
3536
static SDValue getZeroVector(EVT VT, bool HasSSE2, SelectionDAG &DAG,
 
3537
                             DebugLoc dl) {
 
3538
  assert(VT.isVector() && "Expected a vector type");
 
3539
 
 
3540
  // Always build zero vectors as <4 x i32> or <2 x i32> bitcasted
 
3541
  // to their dest type. This ensures they get CSE'd.
 
3542
  SDValue Vec;
 
3543
  if (VT.getSizeInBits() == 64) { // MMX
 
3544
    SDValue Cst = DAG.getTargetConstant(0, MVT::i32);
 
3545
    Vec = DAG.getNode(ISD::BUILD_VECTOR, dl, MVT::v2i32, Cst, Cst);
 
3546
  } else if (VT.getSizeInBits() == 128) {
 
3547
    if (HasSSE2) {  // SSE2
 
3548
      SDValue Cst = DAG.getTargetConstant(0, MVT::i32);
 
3549
      Vec = DAG.getNode(ISD::BUILD_VECTOR, dl, MVT::v4i32, Cst, Cst, Cst, Cst);
 
3550
    } else { // SSE1
 
3551
      SDValue Cst = DAG.getTargetConstantFP(+0.0, MVT::f32);
 
3552
      Vec = DAG.getNode(ISD::BUILD_VECTOR, dl, MVT::v4f32, Cst, Cst, Cst, Cst);
 
3553
    }
 
3554
  } else if (VT.getSizeInBits() == 256) { // AVX
 
3555
    // 256-bit logic and arithmetic instructions in AVX are
 
3556
    // all floating-point, no support for integer ops. Default
 
3557
    // to emitting fp zeroed vectors then.
 
3558
    SDValue Cst = DAG.getTargetConstantFP(+0.0, MVT::f32);
 
3559
    SDValue Ops[] = { Cst, Cst, Cst, Cst, Cst, Cst, Cst, Cst };
 
3560
    Vec = DAG.getNode(ISD::BUILD_VECTOR, dl, MVT::v8f32, Ops, 8);
 
3561
  }
 
3562
  return DAG.getNode(ISD::BIT_CONVERT, dl, VT, Vec);
 
3563
}
 
3564
 
 
3565
/// getOnesVector - Returns a vector of specified type with all bits set.
 
3566
///
 
3567
static SDValue getOnesVector(EVT VT, SelectionDAG &DAG, DebugLoc dl) {
 
3568
  assert(VT.isVector() && "Expected a vector type");
 
3569
 
 
3570
  // Always build ones vectors as <4 x i32> or <2 x i32> bitcasted to their dest
 
3571
  // type.  This ensures they get CSE'd.
 
3572
  SDValue Cst = DAG.getTargetConstant(~0U, MVT::i32);
 
3573
  SDValue Vec;
 
3574
  if (VT.getSizeInBits() == 64) // MMX
 
3575
    Vec = DAG.getNode(ISD::BUILD_VECTOR, dl, MVT::v2i32, Cst, Cst);
 
3576
  else // SSE
 
3577
    Vec = DAG.getNode(ISD::BUILD_VECTOR, dl, MVT::v4i32, Cst, Cst, Cst, Cst);
 
3578
  return DAG.getNode(ISD::BIT_CONVERT, dl, VT, Vec);
 
3579
}
 
3580
 
 
3581
 
 
3582
/// NormalizeMask - V2 is a splat, modify the mask (if needed) so all elements
 
3583
/// that point to V2 points to its first element.
 
3584
static SDValue NormalizeMask(ShuffleVectorSDNode *SVOp, SelectionDAG &DAG) {
 
3585
  EVT VT = SVOp->getValueType(0);
 
3586
  unsigned NumElems = VT.getVectorNumElements();
 
3587
 
 
3588
  bool Changed = false;
 
3589
  SmallVector<int, 8> MaskVec;
 
3590
  SVOp->getMask(MaskVec);
 
3591
 
 
3592
  for (unsigned i = 0; i != NumElems; ++i) {
 
3593
    if (MaskVec[i] > (int)NumElems) {
 
3594
      MaskVec[i] = NumElems;
 
3595
      Changed = true;
 
3596
    }
 
3597
  }
 
3598
  if (Changed)
 
3599
    return DAG.getVectorShuffle(VT, SVOp->getDebugLoc(), SVOp->getOperand(0),
 
3600
                                SVOp->getOperand(1), &MaskVec[0]);
 
3601
  return SDValue(SVOp, 0);
 
3602
}
 
3603
 
 
3604
/// getMOVLMask - Returns a vector_shuffle mask for an movs{s|d}, movd
 
3605
/// operation of specified width.
 
3606
static SDValue getMOVL(SelectionDAG &DAG, DebugLoc dl, EVT VT, SDValue V1,
 
3607
                       SDValue V2) {
 
3608
  unsigned NumElems = VT.getVectorNumElements();
 
3609
  SmallVector<int, 8> Mask;
 
3610
  Mask.push_back(NumElems);
 
3611
  for (unsigned i = 1; i != NumElems; ++i)
 
3612
    Mask.push_back(i);
 
3613
  return DAG.getVectorShuffle(VT, dl, V1, V2, &Mask[0]);
 
3614
}
 
3615
 
 
3616
/// getUnpackl - Returns a vector_shuffle node for an unpackl operation.
 
3617
static SDValue getUnpackl(SelectionDAG &DAG, DebugLoc dl, EVT VT, SDValue V1,
 
3618
                          SDValue V2) {
 
3619
  unsigned NumElems = VT.getVectorNumElements();
 
3620
  SmallVector<int, 8> Mask;
 
3621
  for (unsigned i = 0, e = NumElems/2; i != e; ++i) {
 
3622
    Mask.push_back(i);
 
3623
    Mask.push_back(i + NumElems);
 
3624
  }
 
3625
  return DAG.getVectorShuffle(VT, dl, V1, V2, &Mask[0]);
 
3626
}
 
3627
 
 
3628
/// getUnpackhMask - Returns a vector_shuffle node for an unpackh operation.
 
3629
static SDValue getUnpackh(SelectionDAG &DAG, DebugLoc dl, EVT VT, SDValue V1,
 
3630
                          SDValue V2) {
 
3631
  unsigned NumElems = VT.getVectorNumElements();
 
3632
  unsigned Half = NumElems/2;
 
3633
  SmallVector<int, 8> Mask;
 
3634
  for (unsigned i = 0; i != Half; ++i) {
 
3635
    Mask.push_back(i + Half);
 
3636
    Mask.push_back(i + NumElems + Half);
 
3637
  }
 
3638
  return DAG.getVectorShuffle(VT, dl, V1, V2, &Mask[0]);
 
3639
}
 
3640
 
 
3641
/// PromoteSplat - Promote a splat of v4i32, v8i16 or v16i8 to v4f32.
 
3642
static SDValue PromoteSplat(ShuffleVectorSDNode *SV, SelectionDAG &DAG) {
 
3643
  if (SV->getValueType(0).getVectorNumElements() <= 4)
 
3644
    return SDValue(SV, 0);
 
3645
 
 
3646
  EVT PVT = MVT::v4f32;
 
3647
  EVT VT = SV->getValueType(0);
 
3648
  DebugLoc dl = SV->getDebugLoc();
 
3649
  SDValue V1 = SV->getOperand(0);
 
3650
  int NumElems = VT.getVectorNumElements();
 
3651
  int EltNo = SV->getSplatIndex();
 
3652
 
 
3653
  // unpack elements to the correct location
 
3654
  while (NumElems > 4) {
 
3655
    if (EltNo < NumElems/2) {
 
3656
      V1 = getUnpackl(DAG, dl, VT, V1, V1);
 
3657
    } else {
 
3658
      V1 = getUnpackh(DAG, dl, VT, V1, V1);
 
3659
      EltNo -= NumElems/2;
 
3660
    }
 
3661
    NumElems >>= 1;
 
3662
  }
 
3663
 
 
3664
  // Perform the splat.
 
3665
  int SplatMask[4] = { EltNo, EltNo, EltNo, EltNo };
 
3666
  V1 = DAG.getNode(ISD::BIT_CONVERT, dl, PVT, V1);
 
3667
  V1 = DAG.getVectorShuffle(PVT, dl, V1, DAG.getUNDEF(PVT), &SplatMask[0]);
 
3668
  return DAG.getNode(ISD::BIT_CONVERT, dl, VT, V1);
 
3669
}
 
3670
 
 
3671
/// getShuffleVectorZeroOrUndef - Return a vector_shuffle of the specified
 
3672
/// vector of zero or undef vector.  This produces a shuffle where the low
 
3673
/// element of V2 is swizzled into the zero/undef vector, landing at element
 
3674
/// Idx.  This produces a shuffle mask like 4,1,2,3 (idx=0) or  0,1,2,4 (idx=3).
 
3675
static SDValue getShuffleVectorZeroOrUndef(SDValue V2, unsigned Idx,
 
3676
                                             bool isZero, bool HasSSE2,
 
3677
                                             SelectionDAG &DAG) {
 
3678
  EVT VT = V2.getValueType();
 
3679
  SDValue V1 = isZero
 
3680
    ? getZeroVector(VT, HasSSE2, DAG, V2.getDebugLoc()) : DAG.getUNDEF(VT);
 
3681
  unsigned NumElems = VT.getVectorNumElements();
 
3682
  SmallVector<int, 16> MaskVec;
 
3683
  for (unsigned i = 0; i != NumElems; ++i)
 
3684
    // If this is the insertion idx, put the low elt of V2 here.
 
3685
    MaskVec.push_back(i == Idx ? NumElems : i);
 
3686
  return DAG.getVectorShuffle(VT, V2.getDebugLoc(), V1, V2, &MaskVec[0]);
 
3687
}
 
3688
 
 
3689
/// getShuffleScalarElt - Returns the scalar element that will make up the ith
 
3690
/// element of the result of the vector shuffle.
 
3691
SDValue getShuffleScalarElt(SDNode *N, int Index, SelectionDAG &DAG,
 
3692
                            unsigned Depth) {
 
3693
  if (Depth == 6)
 
3694
    return SDValue();  // Limit search depth.
 
3695
 
 
3696
  SDValue V = SDValue(N, 0);
 
3697
  EVT VT = V.getValueType();
 
3698
  unsigned Opcode = V.getOpcode();
 
3699
 
 
3700
  // Recurse into ISD::VECTOR_SHUFFLE node to find scalars.
 
3701
  if (const ShuffleVectorSDNode *SV = dyn_cast<ShuffleVectorSDNode>(N)) {
 
3702
    Index = SV->getMaskElt(Index);
 
3703
 
 
3704
    if (Index < 0)
 
3705
      return DAG.getUNDEF(VT.getVectorElementType());
 
3706
 
 
3707
    int NumElems = VT.getVectorNumElements();
 
3708
    SDValue NewV = (Index < NumElems) ? SV->getOperand(0) : SV->getOperand(1);
 
3709
    return getShuffleScalarElt(NewV.getNode(), Index % NumElems, DAG, Depth+1);
 
3710
  }
 
3711
 
 
3712
  // Recurse into target specific vector shuffles to find scalars.
 
3713
  if (isTargetShuffle(Opcode)) {
 
3714
    int NumElems = VT.getVectorNumElements();
 
3715
    SmallVector<unsigned, 16> ShuffleMask;
 
3716
    SDValue ImmN;
 
3717
 
 
3718
    switch(Opcode) {
 
3719
    case X86ISD::SHUFPS:
 
3720
    case X86ISD::SHUFPD:
 
3721
      ImmN = N->getOperand(N->getNumOperands()-1);
 
3722
      DecodeSHUFPSMask(NumElems,
 
3723
                       cast<ConstantSDNode>(ImmN)->getZExtValue(),
 
3724
                       ShuffleMask);
 
3725
      break;
 
3726
    case X86ISD::PUNPCKHBW:
 
3727
    case X86ISD::PUNPCKHWD:
 
3728
    case X86ISD::PUNPCKHDQ:
 
3729
    case X86ISD::PUNPCKHQDQ:
 
3730
      DecodePUNPCKHMask(NumElems, ShuffleMask);
 
3731
      break;
 
3732
    case X86ISD::UNPCKHPS:
 
3733
    case X86ISD::UNPCKHPD:
 
3734
      DecodeUNPCKHPMask(NumElems, ShuffleMask);
 
3735
      break;
 
3736
    case X86ISD::PUNPCKLBW:
 
3737
    case X86ISD::PUNPCKLWD:
 
3738
    case X86ISD::PUNPCKLDQ:
 
3739
    case X86ISD::PUNPCKLQDQ:
 
3740
      DecodePUNPCKLMask(NumElems, ShuffleMask);
 
3741
      break;
 
3742
    case X86ISD::UNPCKLPS:
 
3743
    case X86ISD::UNPCKLPD:
 
3744
      DecodeUNPCKLPMask(NumElems, ShuffleMask);
 
3745
      break;
 
3746
    case X86ISD::MOVHLPS:
 
3747
      DecodeMOVHLPSMask(NumElems, ShuffleMask);
 
3748
      break;
 
3749
    case X86ISD::MOVLHPS:
 
3750
      DecodeMOVLHPSMask(NumElems, ShuffleMask);
 
3751
      break;
 
3752
    case X86ISD::PSHUFD:
 
3753
      ImmN = N->getOperand(N->getNumOperands()-1);
 
3754
      DecodePSHUFMask(NumElems,
 
3755
                      cast<ConstantSDNode>(ImmN)->getZExtValue(),
 
3756
                      ShuffleMask);
 
3757
      break;
 
3758
    case X86ISD::PSHUFHW:
 
3759
      ImmN = N->getOperand(N->getNumOperands()-1);
 
3760
      DecodePSHUFHWMask(cast<ConstantSDNode>(ImmN)->getZExtValue(),
 
3761
                        ShuffleMask);
 
3762
      break;
 
3763
    case X86ISD::PSHUFLW:
 
3764
      ImmN = N->getOperand(N->getNumOperands()-1);
 
3765
      DecodePSHUFLWMask(cast<ConstantSDNode>(ImmN)->getZExtValue(),
 
3766
                        ShuffleMask);
 
3767
      break;
 
3768
    case X86ISD::MOVSS:
 
3769
    case X86ISD::MOVSD: {
 
3770
      // The index 0 always comes from the first element of the second source,
 
3771
      // this is why MOVSS and MOVSD are used in the first place. The other
 
3772
      // elements come from the other positions of the first source vector.
 
3773
      unsigned OpNum = (Index == 0) ? 1 : 0;
 
3774
      return getShuffleScalarElt(V.getOperand(OpNum).getNode(), Index, DAG,
 
3775
                                 Depth+1);
 
3776
    }
 
3777
    default:
 
3778
      assert("not implemented for target shuffle node");
 
3779
      return SDValue();
 
3780
    }
 
3781
 
 
3782
    Index = ShuffleMask[Index];
 
3783
    if (Index < 0)
 
3784
      return DAG.getUNDEF(VT.getVectorElementType());
 
3785
 
 
3786
    SDValue NewV = (Index < NumElems) ? N->getOperand(0) : N->getOperand(1);
 
3787
    return getShuffleScalarElt(NewV.getNode(), Index % NumElems, DAG,
 
3788
                               Depth+1);
 
3789
  }
 
3790
 
 
3791
  // Actual nodes that may contain scalar elements
 
3792
  if (Opcode == ISD::BIT_CONVERT) {
 
3793
    V = V.getOperand(0);
 
3794
    EVT SrcVT = V.getValueType();
 
3795
    unsigned NumElems = VT.getVectorNumElements();
 
3796
 
 
3797
    if (!SrcVT.isVector() || SrcVT.getVectorNumElements() != NumElems)
 
3798
      return SDValue();
 
3799
  }
 
3800
 
 
3801
  if (V.getOpcode() == ISD::SCALAR_TO_VECTOR)
 
3802
    return (Index == 0) ? V.getOperand(0)
 
3803
                          : DAG.getUNDEF(VT.getVectorElementType());
 
3804
 
 
3805
  if (V.getOpcode() == ISD::BUILD_VECTOR)
 
3806
    return V.getOperand(Index);
 
3807
 
 
3808
  return SDValue();
 
3809
}
 
3810
 
 
3811
/// getNumOfConsecutiveZeros - Return the number of elements of a vector
 
3812
/// shuffle operation which come from a consecutively from a zero. The
 
3813
/// search can start in two diferent directions, from left or right.
 
3814
static
 
3815
unsigned getNumOfConsecutiveZeros(SDNode *N, int NumElems,
 
3816
                                  bool ZerosFromLeft, SelectionDAG &DAG) {
 
3817
  int i = 0;
 
3818
 
 
3819
  while (i < NumElems) {
 
3820
    unsigned Index = ZerosFromLeft ? i : NumElems-i-1;
 
3821
    SDValue Elt = getShuffleScalarElt(N, Index, DAG, 0);
 
3822
    if (!(Elt.getNode() &&
 
3823
         (Elt.getOpcode() == ISD::UNDEF || X86::isZeroNode(Elt))))
 
3824
      break;
 
3825
    ++i;
 
3826
  }
 
3827
 
 
3828
  return i;
 
3829
}
 
3830
 
 
3831
/// isShuffleMaskConsecutive - Check if the shuffle mask indicies from MaskI to
 
3832
/// MaskE correspond consecutively to elements from one of the vector operands,
 
3833
/// starting from its index OpIdx. Also tell OpNum which source vector operand.
 
3834
static
 
3835
bool isShuffleMaskConsecutive(ShuffleVectorSDNode *SVOp, int MaskI, int MaskE,
 
3836
                              int OpIdx, int NumElems, unsigned &OpNum) {
 
3837
  bool SeenV1 = false;
 
3838
  bool SeenV2 = false;
 
3839
 
 
3840
  for (int i = MaskI; i <= MaskE; ++i, ++OpIdx) {
 
3841
    int Idx = SVOp->getMaskElt(i);
 
3842
    // Ignore undef indicies
 
3843
    if (Idx < 0)
 
3844
      continue;
 
3845
 
 
3846
    if (Idx < NumElems)
 
3847
      SeenV1 = true;
 
3848
    else
 
3849
      SeenV2 = true;
 
3850
 
 
3851
    // Only accept consecutive elements from the same vector
 
3852
    if ((Idx % NumElems != OpIdx) || (SeenV1 && SeenV2))
 
3853
      return false;
 
3854
  }
 
3855
 
 
3856
  OpNum = SeenV1 ? 0 : 1;
 
3857
  return true;
 
3858
}
 
3859
 
 
3860
/// isVectorShiftRight - Returns true if the shuffle can be implemented as a
 
3861
/// logical left shift of a vector.
 
3862
static bool isVectorShiftRight(ShuffleVectorSDNode *SVOp, SelectionDAG &DAG,
 
3863
                               bool &isLeft, SDValue &ShVal, unsigned &ShAmt) {
 
3864
  unsigned NumElems = SVOp->getValueType(0).getVectorNumElements();
 
3865
  unsigned NumZeros = getNumOfConsecutiveZeros(SVOp, NumElems,
 
3866
              false /* check zeros from right */, DAG);
 
3867
  unsigned OpSrc;
 
3868
 
 
3869
  if (!NumZeros)
 
3870
    return false;
 
3871
 
 
3872
  // Considering the elements in the mask that are not consecutive zeros,
 
3873
  // check if they consecutively come from only one of the source vectors.
 
3874
  //
 
3875
  //               V1 = {X, A, B, C}     0
 
3876
  //                         \  \  \    /
 
3877
  //   vector_shuffle V1, V2 <1, 2, 3, X>
 
3878
  //
 
3879
  if (!isShuffleMaskConsecutive(SVOp,
 
3880
            0,                   // Mask Start Index
 
3881
            NumElems-NumZeros-1, // Mask End Index
 
3882
            NumZeros,            // Where to start looking in the src vector
 
3883
            NumElems,            // Number of elements in vector
 
3884
            OpSrc))              // Which source operand ?
 
3885
    return false;
 
3886
 
 
3887
  isLeft = false;
 
3888
  ShAmt = NumZeros;
 
3889
  ShVal = SVOp->getOperand(OpSrc);
 
3890
  return true;
 
3891
}
 
3892
 
 
3893
/// isVectorShiftLeft - Returns true if the shuffle can be implemented as a
 
3894
/// logical left shift of a vector.
 
3895
static bool isVectorShiftLeft(ShuffleVectorSDNode *SVOp, SelectionDAG &DAG,
 
3896
                              bool &isLeft, SDValue &ShVal, unsigned &ShAmt) {
 
3897
  unsigned NumElems = SVOp->getValueType(0).getVectorNumElements();
 
3898
  unsigned NumZeros = getNumOfConsecutiveZeros(SVOp, NumElems,
 
3899
              true /* check zeros from left */, DAG);
 
3900
  unsigned OpSrc;
 
3901
 
 
3902
  if (!NumZeros)
 
3903
    return false;
 
3904
 
 
3905
  // Considering the elements in the mask that are not consecutive zeros,
 
3906
  // check if they consecutively come from only one of the source vectors.
 
3907
  //
 
3908
  //                           0    { A, B, X, X } = V2
 
3909
  //                          / \    /  /
 
3910
  //   vector_shuffle V1, V2 <X, X, 4, 5>
 
3911
  //
 
3912
  if (!isShuffleMaskConsecutive(SVOp,
 
3913
            NumZeros,     // Mask Start Index
 
3914
            NumElems-1,   // Mask End Index
 
3915
            0,            // Where to start looking in the src vector
 
3916
            NumElems,     // Number of elements in vector
 
3917
            OpSrc))       // Which source operand ?
 
3918
    return false;
 
3919
 
 
3920
  isLeft = true;
 
3921
  ShAmt = NumZeros;
 
3922
  ShVal = SVOp->getOperand(OpSrc);
 
3923
  return true;
 
3924
}
 
3925
 
 
3926
/// isVectorShift - Returns true if the shuffle can be implemented as a
 
3927
/// logical left or right shift of a vector.
 
3928
static bool isVectorShift(ShuffleVectorSDNode *SVOp, SelectionDAG &DAG,
 
3929
                          bool &isLeft, SDValue &ShVal, unsigned &ShAmt) {
 
3930
  if (isVectorShiftLeft(SVOp, DAG, isLeft, ShVal, ShAmt) ||
 
3931
      isVectorShiftRight(SVOp, DAG, isLeft, ShVal, ShAmt))
 
3932
    return true;
 
3933
 
 
3934
  return false;
 
3935
}
 
3936
 
 
3937
/// LowerBuildVectorv16i8 - Custom lower build_vector of v16i8.
 
3938
///
 
3939
static SDValue LowerBuildVectorv16i8(SDValue Op, unsigned NonZeros,
 
3940
                                       unsigned NumNonZero, unsigned NumZero,
 
3941
                                       SelectionDAG &DAG,
 
3942
                                       const TargetLowering &TLI) {
 
3943
  if (NumNonZero > 8)
 
3944
    return SDValue();
 
3945
 
 
3946
  DebugLoc dl = Op.getDebugLoc();
 
3947
  SDValue V(0, 0);
 
3948
  bool First = true;
 
3949
  for (unsigned i = 0; i < 16; ++i) {
 
3950
    bool ThisIsNonZero = (NonZeros & (1 << i)) != 0;
 
3951
    if (ThisIsNonZero && First) {
 
3952
      if (NumZero)
 
3953
        V = getZeroVector(MVT::v8i16, true, DAG, dl);
 
3954
      else
 
3955
        V = DAG.getUNDEF(MVT::v8i16);
 
3956
      First = false;
 
3957
    }
 
3958
 
 
3959
    if ((i & 1) != 0) {
 
3960
      SDValue ThisElt(0, 0), LastElt(0, 0);
 
3961
      bool LastIsNonZero = (NonZeros & (1 << (i-1))) != 0;
 
3962
      if (LastIsNonZero) {
 
3963
        LastElt = DAG.getNode(ISD::ZERO_EXTEND, dl,
 
3964
                              MVT::i16, Op.getOperand(i-1));
 
3965
      }
 
3966
      if (ThisIsNonZero) {
 
3967
        ThisElt = DAG.getNode(ISD::ZERO_EXTEND, dl, MVT::i16, Op.getOperand(i));
 
3968
        ThisElt = DAG.getNode(ISD::SHL, dl, MVT::i16,
 
3969
                              ThisElt, DAG.getConstant(8, MVT::i8));
 
3970
        if (LastIsNonZero)
 
3971
          ThisElt = DAG.getNode(ISD::OR, dl, MVT::i16, ThisElt, LastElt);
 
3972
      } else
 
3973
        ThisElt = LastElt;
 
3974
 
 
3975
      if (ThisElt.getNode())
 
3976
        V = DAG.getNode(ISD::INSERT_VECTOR_ELT, dl, MVT::v8i16, V, ThisElt,
 
3977
                        DAG.getIntPtrConstant(i/2));
 
3978
    }
 
3979
  }
 
3980
 
 
3981
  return DAG.getNode(ISD::BIT_CONVERT, dl, MVT::v16i8, V);
 
3982
}
 
3983
 
 
3984
/// LowerBuildVectorv8i16 - Custom lower build_vector of v8i16.
 
3985
///
 
3986
static SDValue LowerBuildVectorv8i16(SDValue Op, unsigned NonZeros,
 
3987
                                     unsigned NumNonZero, unsigned NumZero,
 
3988
                                     SelectionDAG &DAG,
 
3989
                                     const TargetLowering &TLI) {
 
3990
  if (NumNonZero > 4)
 
3991
    return SDValue();
 
3992
 
 
3993
  DebugLoc dl = Op.getDebugLoc();
 
3994
  SDValue V(0, 0);
 
3995
  bool First = true;
 
3996
  for (unsigned i = 0; i < 8; ++i) {
 
3997
    bool isNonZero = (NonZeros & (1 << i)) != 0;
 
3998
    if (isNonZero) {
 
3999
      if (First) {
 
4000
        if (NumZero)
 
4001
          V = getZeroVector(MVT::v8i16, true, DAG, dl);
 
4002
        else
 
4003
          V = DAG.getUNDEF(MVT::v8i16);
 
4004
        First = false;
 
4005
      }
 
4006
      V = DAG.getNode(ISD::INSERT_VECTOR_ELT, dl,
 
4007
                      MVT::v8i16, V, Op.getOperand(i),
 
4008
                      DAG.getIntPtrConstant(i));
 
4009
    }
 
4010
  }
 
4011
 
 
4012
  return V;
 
4013
}
 
4014
 
 
4015
/// getVShift - Return a vector logical shift node.
 
4016
///
 
4017
static SDValue getVShift(bool isLeft, EVT VT, SDValue SrcOp,
 
4018
                         unsigned NumBits, SelectionDAG &DAG,
 
4019
                         const TargetLowering &TLI, DebugLoc dl) {
 
4020
  bool isMMX = VT.getSizeInBits() == 64;
 
4021
  EVT ShVT = isMMX ? MVT::v1i64 : MVT::v2i64;
 
4022
  unsigned Opc = isLeft ? X86ISD::VSHL : X86ISD::VSRL;
 
4023
  SrcOp = DAG.getNode(ISD::BIT_CONVERT, dl, ShVT, SrcOp);
 
4024
  return DAG.getNode(ISD::BIT_CONVERT, dl, VT,
 
4025
                     DAG.getNode(Opc, dl, ShVT, SrcOp,
 
4026
                             DAG.getConstant(NumBits, TLI.getShiftAmountTy())));
 
4027
}
 
4028
 
 
4029
SDValue
 
4030
X86TargetLowering::LowerAsSplatVectorLoad(SDValue SrcOp, EVT VT, DebugLoc dl,
 
4031
                                          SelectionDAG &DAG) const {
 
4032
  
 
4033
  // Check if the scalar load can be widened into a vector load. And if
 
4034
  // the address is "base + cst" see if the cst can be "absorbed" into
 
4035
  // the shuffle mask.
 
4036
  if (LoadSDNode *LD = dyn_cast<LoadSDNode>(SrcOp)) {
 
4037
    SDValue Ptr = LD->getBasePtr();
 
4038
    if (!ISD::isNormalLoad(LD) || LD->isVolatile())
 
4039
      return SDValue();
 
4040
    EVT PVT = LD->getValueType(0);
 
4041
    if (PVT != MVT::i32 && PVT != MVT::f32)
 
4042
      return SDValue();
 
4043
 
 
4044
    int FI = -1;
 
4045
    int64_t Offset = 0;
 
4046
    if (FrameIndexSDNode *FINode = dyn_cast<FrameIndexSDNode>(Ptr)) {
 
4047
      FI = FINode->getIndex();
 
4048
      Offset = 0;
 
4049
    } else if (Ptr.getOpcode() == ISD::ADD &&
 
4050
               isa<ConstantSDNode>(Ptr.getOperand(1)) &&
 
4051
               isa<FrameIndexSDNode>(Ptr.getOperand(0))) {
 
4052
      FI = cast<FrameIndexSDNode>(Ptr.getOperand(0))->getIndex();
 
4053
      Offset = Ptr.getConstantOperandVal(1);
 
4054
      Ptr = Ptr.getOperand(0);
 
4055
    } else {
 
4056
      return SDValue();
 
4057
    }
 
4058
 
 
4059
    SDValue Chain = LD->getChain();
 
4060
    // Make sure the stack object alignment is at least 16.
 
4061
    MachineFrameInfo *MFI = DAG.getMachineFunction().getFrameInfo();
 
4062
    if (DAG.InferPtrAlignment(Ptr) < 16) {
 
4063
      if (MFI->isFixedObjectIndex(FI)) {
 
4064
        // Can't change the alignment. FIXME: It's possible to compute
 
4065
        // the exact stack offset and reference FI + adjust offset instead.
 
4066
        // If someone *really* cares about this. That's the way to implement it.
 
4067
        return SDValue();
 
4068
      } else {
 
4069
        MFI->setObjectAlignment(FI, 16);
 
4070
      }
 
4071
    }
 
4072
 
 
4073
    // (Offset % 16) must be multiple of 4. Then address is then
 
4074
    // Ptr + (Offset & ~15).
 
4075
    if (Offset < 0)
 
4076
      return SDValue();
 
4077
    if ((Offset % 16) & 3)
 
4078
      return SDValue();
 
4079
    int64_t StartOffset = Offset & ~15;
 
4080
    if (StartOffset)
 
4081
      Ptr = DAG.getNode(ISD::ADD, Ptr.getDebugLoc(), Ptr.getValueType(),
 
4082
                        Ptr,DAG.getConstant(StartOffset, Ptr.getValueType()));
 
4083
 
 
4084
    int EltNo = (Offset - StartOffset) >> 2;
 
4085
    int Mask[4] = { EltNo, EltNo, EltNo, EltNo };
 
4086
    EVT VT = (PVT == MVT::i32) ? MVT::v4i32 : MVT::v4f32;
 
4087
    SDValue V1 = DAG.getLoad(VT, dl, Chain, Ptr,LD->getSrcValue(),0,
 
4088
                             false, false, 0);
 
4089
    // Canonicalize it to a v4i32 shuffle.
 
4090
    V1 = DAG.getNode(ISD::BIT_CONVERT, dl, MVT::v4i32, V1);
 
4091
    return DAG.getNode(ISD::BIT_CONVERT, dl, VT,
 
4092
                       DAG.getVectorShuffle(MVT::v4i32, dl, V1,
 
4093
                                            DAG.getUNDEF(MVT::v4i32), &Mask[0]));
 
4094
  }
 
4095
 
 
4096
  return SDValue();
 
4097
}
 
4098
 
 
4099
/// EltsFromConsecutiveLoads - Given the initializing elements 'Elts' of a 
 
4100
/// vector of type 'VT', see if the elements can be replaced by a single large 
 
4101
/// load which has the same value as a build_vector whose operands are 'elts'.
 
4102
///
 
4103
/// Example: <load i32 *a, load i32 *a+4, undef, undef> -> zextload a
 
4104
/// 
 
4105
/// FIXME: we'd also like to handle the case where the last elements are zero
 
4106
/// rather than undef via VZEXT_LOAD, but we do not detect that case today.
 
4107
/// There's even a handy isZeroNode for that purpose.
 
4108
static SDValue EltsFromConsecutiveLoads(EVT VT, SmallVectorImpl<SDValue> &Elts,
 
4109
                                        DebugLoc &dl, SelectionDAG &DAG) {
 
4110
  EVT EltVT = VT.getVectorElementType();
 
4111
  unsigned NumElems = Elts.size();
 
4112
  
 
4113
  LoadSDNode *LDBase = NULL;
 
4114
  unsigned LastLoadedElt = -1U;
 
4115
  
 
4116
  // For each element in the initializer, see if we've found a load or an undef.
 
4117
  // If we don't find an initial load element, or later load elements are 
 
4118
  // non-consecutive, bail out.
 
4119
  for (unsigned i = 0; i < NumElems; ++i) {
 
4120
    SDValue Elt = Elts[i];
 
4121
    
 
4122
    if (!Elt.getNode() ||
 
4123
        (Elt.getOpcode() != ISD::UNDEF && !ISD::isNON_EXTLoad(Elt.getNode())))
 
4124
      return SDValue();
 
4125
    if (!LDBase) {
 
4126
      if (Elt.getNode()->getOpcode() == ISD::UNDEF)
 
4127
        return SDValue();
 
4128
      LDBase = cast<LoadSDNode>(Elt.getNode());
 
4129
      LastLoadedElt = i;
 
4130
      continue;
 
4131
    }
 
4132
    if (Elt.getOpcode() == ISD::UNDEF)
 
4133
      continue;
 
4134
 
 
4135
    LoadSDNode *LD = cast<LoadSDNode>(Elt);
 
4136
    if (!DAG.isConsecutiveLoad(LD, LDBase, EltVT.getSizeInBits()/8, i))
 
4137
      return SDValue();
 
4138
    LastLoadedElt = i;
 
4139
  }
 
4140
 
 
4141
  // If we have found an entire vector of loads and undefs, then return a large
 
4142
  // load of the entire vector width starting at the base pointer.  If we found
 
4143
  // consecutive loads for the low half, generate a vzext_load node.
 
4144
  if (LastLoadedElt == NumElems - 1) {
 
4145
    if (DAG.InferPtrAlignment(LDBase->getBasePtr()) >= 16)
 
4146
      return DAG.getLoad(VT, dl, LDBase->getChain(), LDBase->getBasePtr(),
 
4147
                         LDBase->getSrcValue(), LDBase->getSrcValueOffset(),
 
4148
                         LDBase->isVolatile(), LDBase->isNonTemporal(), 0);
 
4149
    return DAG.getLoad(VT, dl, LDBase->getChain(), LDBase->getBasePtr(),
 
4150
                       LDBase->getSrcValue(), LDBase->getSrcValueOffset(),
 
4151
                       LDBase->isVolatile(), LDBase->isNonTemporal(),
 
4152
                       LDBase->getAlignment());
 
4153
  } else if (NumElems == 4 && LastLoadedElt == 1) {
 
4154
    SDVTList Tys = DAG.getVTList(MVT::v2i64, MVT::Other);
 
4155
    SDValue Ops[] = { LDBase->getChain(), LDBase->getBasePtr() };
 
4156
    SDValue ResNode = DAG.getNode(X86ISD::VZEXT_LOAD, dl, Tys, Ops, 2);
 
4157
    return DAG.getNode(ISD::BIT_CONVERT, dl, VT, ResNode);
 
4158
  }
 
4159
  return SDValue();
 
4160
}
 
4161
 
 
4162
SDValue
 
4163
X86TargetLowering::LowerBUILD_VECTOR(SDValue Op, SelectionDAG &DAG) const {
 
4164
  DebugLoc dl = Op.getDebugLoc();
 
4165
  // All zero's are handled with pxor in SSE2 and above, xorps in SSE1.
 
4166
  // All one's are handled with pcmpeqd. In AVX, zero's are handled with
 
4167
  // vpxor in 128-bit and xor{pd,ps} in 256-bit, but no 256 version of pcmpeqd
 
4168
  // is present, so AllOnes is ignored.
 
4169
  if (ISD::isBuildVectorAllZeros(Op.getNode()) ||
 
4170
      (Op.getValueType().getSizeInBits() != 256 &&
 
4171
       ISD::isBuildVectorAllOnes(Op.getNode()))) {
 
4172
    // Canonicalize this to either <4 x i32> or <2 x i32> (SSE vs MMX) to
 
4173
    // 1) ensure the zero vectors are CSE'd, and 2) ensure that i64 scalars are
 
4174
    // eliminated on x86-32 hosts.
 
4175
    if (Op.getValueType() == MVT::v4i32 || Op.getValueType() == MVT::v2i32)
 
4176
      return Op;
 
4177
 
 
4178
    if (ISD::isBuildVectorAllOnes(Op.getNode()))
 
4179
      return getOnesVector(Op.getValueType(), DAG, dl);
 
4180
    return getZeroVector(Op.getValueType(), Subtarget->hasSSE2(), DAG, dl);
 
4181
  }
 
4182
 
 
4183
  EVT VT = Op.getValueType();
 
4184
  EVT ExtVT = VT.getVectorElementType();
 
4185
  unsigned EVTBits = ExtVT.getSizeInBits();
 
4186
 
 
4187
  unsigned NumElems = Op.getNumOperands();
 
4188
  unsigned NumZero  = 0;
 
4189
  unsigned NumNonZero = 0;
 
4190
  unsigned NonZeros = 0;
 
4191
  bool IsAllConstants = true;
 
4192
  SmallSet<SDValue, 8> Values;
 
4193
  for (unsigned i = 0; i < NumElems; ++i) {
 
4194
    SDValue Elt = Op.getOperand(i);
 
4195
    if (Elt.getOpcode() == ISD::UNDEF)
 
4196
      continue;
 
4197
    Values.insert(Elt);
 
4198
    if (Elt.getOpcode() != ISD::Constant &&
 
4199
        Elt.getOpcode() != ISD::ConstantFP)
 
4200
      IsAllConstants = false;
 
4201
    if (X86::isZeroNode(Elt))
 
4202
      NumZero++;
 
4203
    else {
 
4204
      NonZeros |= (1 << i);
 
4205
      NumNonZero++;
 
4206
    }
 
4207
  }
 
4208
 
 
4209
  // All undef vector. Return an UNDEF.  All zero vectors were handled above.
 
4210
  if (NumNonZero == 0)
 
4211
    return DAG.getUNDEF(VT);
 
4212
 
 
4213
  // Special case for single non-zero, non-undef, element.
 
4214
  if (NumNonZero == 1) {
 
4215
    unsigned Idx = CountTrailingZeros_32(NonZeros);
 
4216
    SDValue Item = Op.getOperand(Idx);
 
4217
 
 
4218
    // If this is an insertion of an i64 value on x86-32, and if the top bits of
 
4219
    // the value are obviously zero, truncate the value to i32 and do the
 
4220
    // insertion that way.  Only do this if the value is non-constant or if the
 
4221
    // value is a constant being inserted into element 0.  It is cheaper to do
 
4222
    // a constant pool load than it is to do a movd + shuffle.
 
4223
    if (ExtVT == MVT::i64 && !Subtarget->is64Bit() &&
 
4224
        (!IsAllConstants || Idx == 0)) {
 
4225
      if (DAG.MaskedValueIsZero(Item, APInt::getBitsSet(64, 32, 64))) {
 
4226
        // Handle MMX and SSE both.
 
4227
        EVT VecVT = VT == MVT::v2i64 ? MVT::v4i32 : MVT::v2i32;
 
4228
        unsigned VecElts = VT == MVT::v2i64 ? 4 : 2;
 
4229
 
 
4230
        // Truncate the value (which may itself be a constant) to i32, and
 
4231
        // convert it to a vector with movd (S2V+shuffle to zero extend).
 
4232
        Item = DAG.getNode(ISD::TRUNCATE, dl, MVT::i32, Item);
 
4233
        Item = DAG.getNode(ISD::SCALAR_TO_VECTOR, dl, VecVT, Item);
 
4234
        Item = getShuffleVectorZeroOrUndef(Item, 0, true,
 
4235
                                           Subtarget->hasSSE2(), DAG);
 
4236
 
 
4237
        // Now we have our 32-bit value zero extended in the low element of
 
4238
        // a vector.  If Idx != 0, swizzle it into place.
 
4239
        if (Idx != 0) {
 
4240
          SmallVector<int, 4> Mask;
 
4241
          Mask.push_back(Idx);
 
4242
          for (unsigned i = 1; i != VecElts; ++i)
 
4243
            Mask.push_back(i);
 
4244
          Item = DAG.getVectorShuffle(VecVT, dl, Item,
 
4245
                                      DAG.getUNDEF(Item.getValueType()),
 
4246
                                      &Mask[0]);
 
4247
        }
 
4248
        return DAG.getNode(ISD::BIT_CONVERT, dl, Op.getValueType(), Item);
 
4249
      }
 
4250
    }
 
4251
 
 
4252
    // If we have a constant or non-constant insertion into the low element of
 
4253
    // a vector, we can do this with SCALAR_TO_VECTOR + shuffle of zero into
 
4254
    // the rest of the elements.  This will be matched as movd/movq/movss/movsd
 
4255
    // depending on what the source datatype is.
 
4256
    if (Idx == 0) {
 
4257
      if (NumZero == 0) {
 
4258
        return DAG.getNode(ISD::SCALAR_TO_VECTOR, dl, VT, Item);
 
4259
      } else if (ExtVT == MVT::i32 || ExtVT == MVT::f32 || ExtVT == MVT::f64 ||
 
4260
          (ExtVT == MVT::i64 && Subtarget->is64Bit())) {
 
4261
        Item = DAG.getNode(ISD::SCALAR_TO_VECTOR, dl, VT, Item);
 
4262
        // Turn it into a MOVL (i.e. movss, movsd, or movd) to a zero vector.
 
4263
        return getShuffleVectorZeroOrUndef(Item, 0, true, Subtarget->hasSSE2(),
 
4264
                                           DAG);
 
4265
      } else if (ExtVT == MVT::i16 || ExtVT == MVT::i8) {
 
4266
        Item = DAG.getNode(ISD::ZERO_EXTEND, dl, MVT::i32, Item);
 
4267
        EVT MiddleVT = VT.getSizeInBits() == 64 ? MVT::v2i32 : MVT::v4i32;
 
4268
        Item = DAG.getNode(ISD::SCALAR_TO_VECTOR, dl, MiddleVT, Item);
 
4269
        Item = getShuffleVectorZeroOrUndef(Item, 0, true,
 
4270
                                           Subtarget->hasSSE2(), DAG);
 
4271
        return DAG.getNode(ISD::BIT_CONVERT, dl, VT, Item);
 
4272
      }
 
4273
    }
 
4274
 
 
4275
    // Is it a vector logical left shift?
 
4276
    if (NumElems == 2 && Idx == 1 &&
 
4277
        X86::isZeroNode(Op.getOperand(0)) &&
 
4278
        !X86::isZeroNode(Op.getOperand(1))) {
 
4279
      unsigned NumBits = VT.getSizeInBits();
 
4280
      return getVShift(true, VT,
 
4281
                       DAG.getNode(ISD::SCALAR_TO_VECTOR, dl,
 
4282
                                   VT, Op.getOperand(1)),
 
4283
                       NumBits/2, DAG, *this, dl);
 
4284
    }
 
4285
 
 
4286
    if (IsAllConstants) // Otherwise, it's better to do a constpool load.
 
4287
      return SDValue();
 
4288
 
 
4289
    // Otherwise, if this is a vector with i32 or f32 elements, and the element
 
4290
    // is a non-constant being inserted into an element other than the low one,
 
4291
    // we can't use a constant pool load.  Instead, use SCALAR_TO_VECTOR (aka
 
4292
    // movd/movss) to move this into the low element, then shuffle it into
 
4293
    // place.
 
4294
    if (EVTBits == 32) {
 
4295
      Item = DAG.getNode(ISD::SCALAR_TO_VECTOR, dl, VT, Item);
 
4296
 
 
4297
      // Turn it into a shuffle of zero and zero-extended scalar to vector.
 
4298
      Item = getShuffleVectorZeroOrUndef(Item, 0, NumZero > 0,
 
4299
                                         Subtarget->hasSSE2(), DAG);
 
4300
      SmallVector<int, 8> MaskVec;
 
4301
      for (unsigned i = 0; i < NumElems; i++)
 
4302
        MaskVec.push_back(i == Idx ? 0 : 1);
 
4303
      return DAG.getVectorShuffle(VT, dl, Item, DAG.getUNDEF(VT), &MaskVec[0]);
 
4304
    }
 
4305
  }
 
4306
 
 
4307
  // Splat is obviously ok. Let legalizer expand it to a shuffle.
 
4308
  if (Values.size() == 1) {
 
4309
    if (EVTBits == 32) {
 
4310
      // Instead of a shuffle like this:
 
4311
      // shuffle (scalar_to_vector (load (ptr + 4))), undef, <0, 0, 0, 0>
 
4312
      // Check if it's possible to issue this instead.
 
4313
      // shuffle (vload ptr)), undef, <1, 1, 1, 1>
 
4314
      unsigned Idx = CountTrailingZeros_32(NonZeros);
 
4315
      SDValue Item = Op.getOperand(Idx);
 
4316
      if (Op.getNode()->isOnlyUserOf(Item.getNode()))
 
4317
        return LowerAsSplatVectorLoad(Item, VT, dl, DAG);
 
4318
    }
 
4319
    return SDValue();
 
4320
  }
 
4321
 
 
4322
  // A vector full of immediates; various special cases are already
 
4323
  // handled, so this is best done with a single constant-pool load.
 
4324
  if (IsAllConstants)
 
4325
    return SDValue();
 
4326
 
 
4327
  // Let legalizer expand 2-wide build_vectors.
 
4328
  if (EVTBits == 64) {
 
4329
    if (NumNonZero == 1) {
 
4330
      // One half is zero or undef.
 
4331
      unsigned Idx = CountTrailingZeros_32(NonZeros);
 
4332
      SDValue V2 = DAG.getNode(ISD::SCALAR_TO_VECTOR, dl, VT,
 
4333
                                 Op.getOperand(Idx));
 
4334
      return getShuffleVectorZeroOrUndef(V2, Idx, true,
 
4335
                                         Subtarget->hasSSE2(), DAG);
 
4336
    }
 
4337
    return SDValue();
 
4338
  }
 
4339
 
 
4340
  // If element VT is < 32 bits, convert it to inserts into a zero vector.
 
4341
  if (EVTBits == 8 && NumElems == 16) {
 
4342
    SDValue V = LowerBuildVectorv16i8(Op, NonZeros,NumNonZero,NumZero, DAG,
 
4343
                                        *this);
 
4344
    if (V.getNode()) return V;
 
4345
  }
 
4346
 
 
4347
  if (EVTBits == 16 && NumElems == 8) {
 
4348
    SDValue V = LowerBuildVectorv8i16(Op, NonZeros,NumNonZero,NumZero, DAG,
 
4349
                                      *this);
 
4350
    if (V.getNode()) return V;
 
4351
  }
 
4352
 
 
4353
  // If element VT is == 32 bits, turn it into a number of shuffles.
 
4354
  SmallVector<SDValue, 8> V;
 
4355
  V.resize(NumElems);
 
4356
  if (NumElems == 4 && NumZero > 0) {
 
4357
    for (unsigned i = 0; i < 4; ++i) {
 
4358
      bool isZero = !(NonZeros & (1 << i));
 
4359
      if (isZero)
 
4360
        V[i] = getZeroVector(VT, Subtarget->hasSSE2(), DAG, dl);
 
4361
      else
 
4362
        V[i] = DAG.getNode(ISD::SCALAR_TO_VECTOR, dl, VT, Op.getOperand(i));
 
4363
    }
 
4364
 
 
4365
    for (unsigned i = 0; i < 2; ++i) {
 
4366
      switch ((NonZeros & (0x3 << i*2)) >> (i*2)) {
 
4367
        default: break;
 
4368
        case 0:
 
4369
          V[i] = V[i*2];  // Must be a zero vector.
 
4370
          break;
 
4371
        case 1:
 
4372
          V[i] = getMOVL(DAG, dl, VT, V[i*2+1], V[i*2]);
 
4373
          break;
 
4374
        case 2:
 
4375
          V[i] = getMOVL(DAG, dl, VT, V[i*2], V[i*2+1]);
 
4376
          break;
 
4377
        case 3:
 
4378
          V[i] = getUnpackl(DAG, dl, VT, V[i*2], V[i*2+1]);
 
4379
          break;
 
4380
      }
 
4381
    }
 
4382
 
 
4383
    SmallVector<int, 8> MaskVec;
 
4384
    bool Reverse = (NonZeros & 0x3) == 2;
 
4385
    for (unsigned i = 0; i < 2; ++i)
 
4386
      MaskVec.push_back(Reverse ? 1-i : i);
 
4387
    Reverse = ((NonZeros & (0x3 << 2)) >> 2) == 2;
 
4388
    for (unsigned i = 0; i < 2; ++i)
 
4389
      MaskVec.push_back(Reverse ? 1-i+NumElems : i+NumElems);
 
4390
    return DAG.getVectorShuffle(VT, dl, V[0], V[1], &MaskVec[0]);
 
4391
  }
 
4392
 
 
4393
  if (Values.size() > 1 && VT.getSizeInBits() == 128) {
 
4394
    // Check for a build vector of consecutive loads.
 
4395
    for (unsigned i = 0; i < NumElems; ++i)
 
4396
      V[i] = Op.getOperand(i);
 
4397
    
 
4398
    // Check for elements which are consecutive loads.
 
4399
    SDValue LD = EltsFromConsecutiveLoads(VT, V, dl, DAG);
 
4400
    if (LD.getNode())
 
4401
      return LD;
 
4402
    
 
4403
    // For SSE 4.1, use insertps to put the high elements into the low element. 
 
4404
    if (getSubtarget()->hasSSE41()) {
 
4405
      SDValue Result;
 
4406
      if (Op.getOperand(0).getOpcode() != ISD::UNDEF)
 
4407
        Result = DAG.getNode(ISD::SCALAR_TO_VECTOR, dl, VT, Op.getOperand(0));
 
4408
      else
 
4409
        Result = DAG.getUNDEF(VT);
 
4410
      
 
4411
      for (unsigned i = 1; i < NumElems; ++i) {
 
4412
        if (Op.getOperand(i).getOpcode() == ISD::UNDEF) continue;
 
4413
        Result = DAG.getNode(ISD::INSERT_VECTOR_ELT, dl, VT, Result,
 
4414
                             Op.getOperand(i), DAG.getIntPtrConstant(i));
 
4415
      }
 
4416
      return Result;
 
4417
    }
 
4418
    
 
4419
    // Otherwise, expand into a number of unpckl*, start by extending each of
 
4420
    // our (non-undef) elements to the full vector width with the element in the
 
4421
    // bottom slot of the vector (which generates no code for SSE).
 
4422
    for (unsigned i = 0; i < NumElems; ++i) {
 
4423
      if (Op.getOperand(i).getOpcode() != ISD::UNDEF)
 
4424
        V[i] = DAG.getNode(ISD::SCALAR_TO_VECTOR, dl, VT, Op.getOperand(i));
 
4425
      else
 
4426
        V[i] = DAG.getUNDEF(VT);
 
4427
    }
 
4428
 
 
4429
    // Next, we iteratively mix elements, e.g. for v4f32:
 
4430
    //   Step 1: unpcklps 0, 2 ==> X: <?, ?, 2, 0>
 
4431
    //         : unpcklps 1, 3 ==> Y: <?, ?, 3, 1>
 
4432
    //   Step 2: unpcklps X, Y ==>    <3, 2, 1, 0>
 
4433
    unsigned EltStride = NumElems >> 1;
 
4434
    while (EltStride != 0) {
 
4435
      for (unsigned i = 0; i < EltStride; ++i) {
 
4436
        // If V[i+EltStride] is undef and this is the first round of mixing,
 
4437
        // then it is safe to just drop this shuffle: V[i] is already in the
 
4438
        // right place, the one element (since it's the first round) being
 
4439
        // inserted as undef can be dropped.  This isn't safe for successive
 
4440
        // rounds because they will permute elements within both vectors.
 
4441
        if (V[i+EltStride].getOpcode() == ISD::UNDEF &&
 
4442
            EltStride == NumElems/2)
 
4443
          continue;
 
4444
        
 
4445
        V[i] = getUnpackl(DAG, dl, VT, V[i], V[i + EltStride]);
 
4446
      }
 
4447
      EltStride >>= 1;
 
4448
    }
 
4449
    return V[0];
 
4450
  }
 
4451
  return SDValue();
 
4452
}
 
4453
 
 
4454
SDValue
 
4455
X86TargetLowering::LowerCONCAT_VECTORS(SDValue Op, SelectionDAG &DAG) const {
 
4456
  // We support concatenate two MMX registers and place them in a MMX
 
4457
  // register.  This is better than doing a stack convert.
 
4458
  DebugLoc dl = Op.getDebugLoc();
 
4459
  EVT ResVT = Op.getValueType();
 
4460
  assert(Op.getNumOperands() == 2);
 
4461
  assert(ResVT == MVT::v2i64 || ResVT == MVT::v4i32 ||
 
4462
         ResVT == MVT::v8i16 || ResVT == MVT::v16i8);
 
4463
  int Mask[2];
 
4464
  SDValue InVec = DAG.getNode(ISD::BIT_CONVERT,dl, MVT::v1i64, Op.getOperand(0));
 
4465
  SDValue VecOp = DAG.getNode(X86ISD::MOVQ2DQ, dl, MVT::v2i64, InVec);
 
4466
  InVec = Op.getOperand(1);
 
4467
  if (InVec.getOpcode() == ISD::SCALAR_TO_VECTOR) {
 
4468
    unsigned NumElts = ResVT.getVectorNumElements();
 
4469
    VecOp = DAG.getNode(ISD::BIT_CONVERT, dl, ResVT, VecOp);
 
4470
    VecOp = DAG.getNode(ISD::INSERT_VECTOR_ELT, dl, ResVT, VecOp,
 
4471
                       InVec.getOperand(0), DAG.getIntPtrConstant(NumElts/2+1));
 
4472
  } else {
 
4473
    InVec = DAG.getNode(ISD::BIT_CONVERT, dl, MVT::v1i64, InVec);
 
4474
    SDValue VecOp2 = DAG.getNode(X86ISD::MOVQ2DQ, dl, MVT::v2i64, InVec);
 
4475
    Mask[0] = 0; Mask[1] = 2;
 
4476
    VecOp = DAG.getVectorShuffle(MVT::v2i64, dl, VecOp, VecOp2, Mask);
 
4477
  }
 
4478
  return DAG.getNode(ISD::BIT_CONVERT, dl, ResVT, VecOp);
 
4479
}
 
4480
 
 
4481
// v8i16 shuffles - Prefer shuffles in the following order:
 
4482
// 1. [all]   pshuflw, pshufhw, optional move
 
4483
// 2. [ssse3] 1 x pshufb
 
4484
// 3. [ssse3] 2 x pshufb + 1 x por
 
4485
// 4. [all]   mov + pshuflw + pshufhw + N x (pextrw + pinsrw)
 
4486
SDValue
 
4487
X86TargetLowering::LowerVECTOR_SHUFFLEv8i16(SDValue Op,
 
4488
                                            SelectionDAG &DAG) const {
 
4489
  ShuffleVectorSDNode *SVOp = cast<ShuffleVectorSDNode>(Op);
 
4490
  SDValue V1 = SVOp->getOperand(0);
 
4491
  SDValue V2 = SVOp->getOperand(1);
 
4492
  DebugLoc dl = SVOp->getDebugLoc();
 
4493
  SmallVector<int, 8> MaskVals;
 
4494
 
 
4495
  // Determine if more than 1 of the words in each of the low and high quadwords
 
4496
  // of the result come from the same quadword of one of the two inputs.  Undef
 
4497
  // mask values count as coming from any quadword, for better codegen.
 
4498
  SmallVector<unsigned, 4> LoQuad(4);
 
4499
  SmallVector<unsigned, 4> HiQuad(4);
 
4500
  BitVector InputQuads(4);
 
4501
  for (unsigned i = 0; i < 8; ++i) {
 
4502
    SmallVectorImpl<unsigned> &Quad = i < 4 ? LoQuad : HiQuad;
 
4503
    int EltIdx = SVOp->getMaskElt(i);
 
4504
    MaskVals.push_back(EltIdx);
 
4505
    if (EltIdx < 0) {
 
4506
      ++Quad[0];
 
4507
      ++Quad[1];
 
4508
      ++Quad[2];
 
4509
      ++Quad[3];
 
4510
      continue;
 
4511
    }
 
4512
    ++Quad[EltIdx / 4];
 
4513
    InputQuads.set(EltIdx / 4);
 
4514
  }
 
4515
 
 
4516
  int BestLoQuad = -1;
 
4517
  unsigned MaxQuad = 1;
 
4518
  for (unsigned i = 0; i < 4; ++i) {
 
4519
    if (LoQuad[i] > MaxQuad) {
 
4520
      BestLoQuad = i;
 
4521
      MaxQuad = LoQuad[i];
 
4522
    }
 
4523
  }
 
4524
 
 
4525
  int BestHiQuad = -1;
 
4526
  MaxQuad = 1;
 
4527
  for (unsigned i = 0; i < 4; ++i) {
 
4528
    if (HiQuad[i] > MaxQuad) {
 
4529
      BestHiQuad = i;
 
4530
      MaxQuad = HiQuad[i];
 
4531
    }
 
4532
  }
 
4533
 
 
4534
  // For SSSE3, If all 8 words of the result come from only 1 quadword of each
 
4535
  // of the two input vectors, shuffle them into one input vector so only a
 
4536
  // single pshufb instruction is necessary. If There are more than 2 input
 
4537
  // quads, disable the next transformation since it does not help SSSE3.
 
4538
  bool V1Used = InputQuads[0] || InputQuads[1];
 
4539
  bool V2Used = InputQuads[2] || InputQuads[3];
 
4540
  if (Subtarget->hasSSSE3()) {
 
4541
    if (InputQuads.count() == 2 && V1Used && V2Used) {
 
4542
      BestLoQuad = InputQuads.find_first();
 
4543
      BestHiQuad = InputQuads.find_next(BestLoQuad);
 
4544
    }
 
4545
    if (InputQuads.count() > 2) {
 
4546
      BestLoQuad = -1;
 
4547
      BestHiQuad = -1;
 
4548
    }
 
4549
  }
 
4550
 
 
4551
  // If BestLoQuad or BestHiQuad are set, shuffle the quads together and update
 
4552
  // the shuffle mask.  If a quad is scored as -1, that means that it contains
 
4553
  // words from all 4 input quadwords.
 
4554
  SDValue NewV;
 
4555
  if (BestLoQuad >= 0 || BestHiQuad >= 0) {
 
4556
    SmallVector<int, 8> MaskV;
 
4557
    MaskV.push_back(BestLoQuad < 0 ? 0 : BestLoQuad);
 
4558
    MaskV.push_back(BestHiQuad < 0 ? 1 : BestHiQuad);
 
4559
    NewV = DAG.getVectorShuffle(MVT::v2i64, dl,
 
4560
                  DAG.getNode(ISD::BIT_CONVERT, dl, MVT::v2i64, V1),
 
4561
                  DAG.getNode(ISD::BIT_CONVERT, dl, MVT::v2i64, V2), &MaskV[0]);
 
4562
    NewV = DAG.getNode(ISD::BIT_CONVERT, dl, MVT::v8i16, NewV);
 
4563
 
 
4564
    // Rewrite the MaskVals and assign NewV to V1 if NewV now contains all the
 
4565
    // source words for the shuffle, to aid later transformations.
 
4566
    bool AllWordsInNewV = true;
 
4567
    bool InOrder[2] = { true, true };
 
4568
    for (unsigned i = 0; i != 8; ++i) {
 
4569
      int idx = MaskVals[i];
 
4570
      if (idx != (int)i)
 
4571
        InOrder[i/4] = false;
 
4572
      if (idx < 0 || (idx/4) == BestLoQuad || (idx/4) == BestHiQuad)
 
4573
        continue;
 
4574
      AllWordsInNewV = false;
 
4575
      break;
 
4576
    }
 
4577
 
 
4578
    bool pshuflw = AllWordsInNewV, pshufhw = AllWordsInNewV;
 
4579
    if (AllWordsInNewV) {
 
4580
      for (int i = 0; i != 8; ++i) {
 
4581
        int idx = MaskVals[i];
 
4582
        if (idx < 0)
 
4583
          continue;
 
4584
        idx = MaskVals[i] = (idx / 4) == BestLoQuad ? (idx & 3) : (idx & 3) + 4;
 
4585
        if ((idx != i) && idx < 4)
 
4586
          pshufhw = false;
 
4587
        if ((idx != i) && idx > 3)
 
4588
          pshuflw = false;
 
4589
      }
 
4590
      V1 = NewV;
 
4591
      V2Used = false;
 
4592
      BestLoQuad = 0;
 
4593
      BestHiQuad = 1;
 
4594
    }
 
4595
 
 
4596
    // If we've eliminated the use of V2, and the new mask is a pshuflw or
 
4597
    // pshufhw, that's as cheap as it gets.  Return the new shuffle.
 
4598
    if ((pshufhw && InOrder[0]) || (pshuflw && InOrder[1])) {
 
4599
      unsigned Opc = pshufhw ? X86ISD::PSHUFHW : X86ISD::PSHUFLW;
 
4600
      unsigned TargetMask = 0;
 
4601
      NewV = DAG.getVectorShuffle(MVT::v8i16, dl, NewV,
 
4602
                                  DAG.getUNDEF(MVT::v8i16), &MaskVals[0]);
 
4603
      TargetMask = pshufhw ? X86::getShufflePSHUFHWImmediate(NewV.getNode()):
 
4604
                             X86::getShufflePSHUFLWImmediate(NewV.getNode());
 
4605
      V1 = NewV.getOperand(0);
 
4606
      return getTargetShuffleNode(Opc, dl, MVT::v8i16, V1, TargetMask, DAG);
 
4607
    }
 
4608
  }
 
4609
 
 
4610
  // If we have SSSE3, and all words of the result are from 1 input vector,
 
4611
  // case 2 is generated, otherwise case 3 is generated.  If no SSSE3
 
4612
  // is present, fall back to case 4.
 
4613
  if (Subtarget->hasSSSE3()) {
 
4614
    SmallVector<SDValue,16> pshufbMask;
 
4615
 
 
4616
    // If we have elements from both input vectors, set the high bit of the
 
4617
    // shuffle mask element to zero out elements that come from V2 in the V1
 
4618
    // mask, and elements that come from V1 in the V2 mask, so that the two
 
4619
    // results can be OR'd together.
 
4620
    bool TwoInputs = V1Used && V2Used;
 
4621
    for (unsigned i = 0; i != 8; ++i) {
 
4622
      int EltIdx = MaskVals[i] * 2;
 
4623
      if (TwoInputs && (EltIdx >= 16)) {
 
4624
        pshufbMask.push_back(DAG.getConstant(0x80, MVT::i8));
 
4625
        pshufbMask.push_back(DAG.getConstant(0x80, MVT::i8));
 
4626
        continue;
 
4627
      }
 
4628
      pshufbMask.push_back(DAG.getConstant(EltIdx,   MVT::i8));
 
4629
      pshufbMask.push_back(DAG.getConstant(EltIdx+1, MVT::i8));
 
4630
    }
 
4631
    V1 = DAG.getNode(ISD::BIT_CONVERT, dl, MVT::v16i8, V1);
 
4632
    V1 = DAG.getNode(X86ISD::PSHUFB, dl, MVT::v16i8, V1,
 
4633
                     DAG.getNode(ISD::BUILD_VECTOR, dl,
 
4634
                                 MVT::v16i8, &pshufbMask[0], 16));
 
4635
    if (!TwoInputs)
 
4636
      return DAG.getNode(ISD::BIT_CONVERT, dl, MVT::v8i16, V1);
 
4637
 
 
4638
    // Calculate the shuffle mask for the second input, shuffle it, and
 
4639
    // OR it with the first shuffled input.
 
4640
    pshufbMask.clear();
 
4641
    for (unsigned i = 0; i != 8; ++i) {
 
4642
      int EltIdx = MaskVals[i] * 2;
 
4643
      if (EltIdx < 16) {
 
4644
        pshufbMask.push_back(DAG.getConstant(0x80, MVT::i8));
 
4645
        pshufbMask.push_back(DAG.getConstant(0x80, MVT::i8));
 
4646
        continue;
 
4647
      }
 
4648
      pshufbMask.push_back(DAG.getConstant(EltIdx - 16, MVT::i8));
 
4649
      pshufbMask.push_back(DAG.getConstant(EltIdx - 15, MVT::i8));
 
4650
    }
 
4651
    V2 = DAG.getNode(ISD::BIT_CONVERT, dl, MVT::v16i8, V2);
 
4652
    V2 = DAG.getNode(X86ISD::PSHUFB, dl, MVT::v16i8, V2,
 
4653
                     DAG.getNode(ISD::BUILD_VECTOR, dl,
 
4654
                                 MVT::v16i8, &pshufbMask[0], 16));
 
4655
    V1 = DAG.getNode(ISD::OR, dl, MVT::v16i8, V1, V2);
 
4656
    return DAG.getNode(ISD::BIT_CONVERT, dl, MVT::v8i16, V1);
 
4657
  }
 
4658
 
 
4659
  // If BestLoQuad >= 0, generate a pshuflw to put the low elements in order,
 
4660
  // and update MaskVals with new element order.
 
4661
  BitVector InOrder(8);
 
4662
  if (BestLoQuad >= 0) {
 
4663
    SmallVector<int, 8> MaskV;
 
4664
    for (int i = 0; i != 4; ++i) {
 
4665
      int idx = MaskVals[i];
 
4666
      if (idx < 0) {
 
4667
        MaskV.push_back(-1);
 
4668
        InOrder.set(i);
 
4669
      } else if ((idx / 4) == BestLoQuad) {
 
4670
        MaskV.push_back(idx & 3);
 
4671
        InOrder.set(i);
 
4672
      } else {
 
4673
        MaskV.push_back(-1);
 
4674
      }
 
4675
    }
 
4676
    for (unsigned i = 4; i != 8; ++i)
 
4677
      MaskV.push_back(i);
 
4678
    NewV = DAG.getVectorShuffle(MVT::v8i16, dl, NewV, DAG.getUNDEF(MVT::v8i16),
 
4679
                                &MaskV[0]);
 
4680
 
 
4681
    if (NewV.getOpcode() == ISD::VECTOR_SHUFFLE && Subtarget->hasSSSE3())
 
4682
      NewV = getTargetShuffleNode(X86ISD::PSHUFLW, dl, MVT::v8i16,
 
4683
                               NewV.getOperand(0),
 
4684
                               X86::getShufflePSHUFLWImmediate(NewV.getNode()),
 
4685
                               DAG);
 
4686
  }
 
4687
 
 
4688
  // If BestHi >= 0, generate a pshufhw to put the high elements in order,
 
4689
  // and update MaskVals with the new element order.
 
4690
  if (BestHiQuad >= 0) {
 
4691
    SmallVector<int, 8> MaskV;
 
4692
    for (unsigned i = 0; i != 4; ++i)
 
4693
      MaskV.push_back(i);
 
4694
    for (unsigned i = 4; i != 8; ++i) {
 
4695
      int idx = MaskVals[i];
 
4696
      if (idx < 0) {
 
4697
        MaskV.push_back(-1);
 
4698
        InOrder.set(i);
 
4699
      } else if ((idx / 4) == BestHiQuad) {
 
4700
        MaskV.push_back((idx & 3) + 4);
 
4701
        InOrder.set(i);
 
4702
      } else {
 
4703
        MaskV.push_back(-1);
 
4704
      }
 
4705
    }
 
4706
    NewV = DAG.getVectorShuffle(MVT::v8i16, dl, NewV, DAG.getUNDEF(MVT::v8i16),
 
4707
                                &MaskV[0]);
 
4708
 
 
4709
    if (NewV.getOpcode() == ISD::VECTOR_SHUFFLE && Subtarget->hasSSSE3())
 
4710
      NewV = getTargetShuffleNode(X86ISD::PSHUFHW, dl, MVT::v8i16,
 
4711
                              NewV.getOperand(0),
 
4712
                              X86::getShufflePSHUFHWImmediate(NewV.getNode()),
 
4713
                              DAG);
 
4714
  }
 
4715
 
 
4716
  // In case BestHi & BestLo were both -1, which means each quadword has a word
 
4717
  // from each of the four input quadwords, calculate the InOrder bitvector now
 
4718
  // before falling through to the insert/extract cleanup.
 
4719
  if (BestLoQuad == -1 && BestHiQuad == -1) {
 
4720
    NewV = V1;
 
4721
    for (int i = 0; i != 8; ++i)
 
4722
      if (MaskVals[i] < 0 || MaskVals[i] == i)
 
4723
        InOrder.set(i);
 
4724
  }
 
4725
 
 
4726
  // The other elements are put in the right place using pextrw and pinsrw.
 
4727
  for (unsigned i = 0; i != 8; ++i) {
 
4728
    if (InOrder[i])
 
4729
      continue;
 
4730
    int EltIdx = MaskVals[i];
 
4731
    if (EltIdx < 0)
 
4732
      continue;
 
4733
    SDValue ExtOp = (EltIdx < 8)
 
4734
    ? DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, MVT::i16, V1,
 
4735
                  DAG.getIntPtrConstant(EltIdx))
 
4736
    : DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, MVT::i16, V2,
 
4737
                  DAG.getIntPtrConstant(EltIdx - 8));
 
4738
    NewV = DAG.getNode(ISD::INSERT_VECTOR_ELT, dl, MVT::v8i16, NewV, ExtOp,
 
4739
                       DAG.getIntPtrConstant(i));
 
4740
  }
 
4741
  return NewV;
 
4742
}
 
4743
 
 
4744
// v16i8 shuffles - Prefer shuffles in the following order:
 
4745
// 1. [ssse3] 1 x pshufb
 
4746
// 2. [ssse3] 2 x pshufb + 1 x por
 
4747
// 3. [all]   v8i16 shuffle + N x pextrw + rotate + pinsrw
 
4748
static
 
4749
SDValue LowerVECTOR_SHUFFLEv16i8(ShuffleVectorSDNode *SVOp,
 
4750
                                 SelectionDAG &DAG,
 
4751
                                 const X86TargetLowering &TLI) {
 
4752
  SDValue V1 = SVOp->getOperand(0);
 
4753
  SDValue V2 = SVOp->getOperand(1);
 
4754
  DebugLoc dl = SVOp->getDebugLoc();
 
4755
  SmallVector<int, 16> MaskVals;
 
4756
  SVOp->getMask(MaskVals);
 
4757
 
 
4758
  // If we have SSSE3, case 1 is generated when all result bytes come from
 
4759
  // one of  the inputs.  Otherwise, case 2 is generated.  If no SSSE3 is
 
4760
  // present, fall back to case 3.
 
4761
  // FIXME: kill V2Only once shuffles are canonizalized by getNode.
 
4762
  bool V1Only = true;
 
4763
  bool V2Only = true;
 
4764
  for (unsigned i = 0; i < 16; ++i) {
 
4765
    int EltIdx = MaskVals[i];
 
4766
    if (EltIdx < 0)
 
4767
      continue;
 
4768
    if (EltIdx < 16)
 
4769
      V2Only = false;
 
4770
    else
 
4771
      V1Only = false;
 
4772
  }
 
4773
 
 
4774
  // If SSSE3, use 1 pshufb instruction per vector with elements in the result.
 
4775
  if (TLI.getSubtarget()->hasSSSE3()) {
 
4776
    SmallVector<SDValue,16> pshufbMask;
 
4777
 
 
4778
    // If all result elements are from one input vector, then only translate
 
4779
    // undef mask values to 0x80 (zero out result) in the pshufb mask.
 
4780
    //
 
4781
    // Otherwise, we have elements from both input vectors, and must zero out
 
4782
    // elements that come from V2 in the first mask, and V1 in the second mask
 
4783
    // so that we can OR them together.
 
4784
    bool TwoInputs = !(V1Only || V2Only);
 
4785
    for (unsigned i = 0; i != 16; ++i) {
 
4786
      int EltIdx = MaskVals[i];
 
4787
      if (EltIdx < 0 || (TwoInputs && EltIdx >= 16)) {
 
4788
        pshufbMask.push_back(DAG.getConstant(0x80, MVT::i8));
 
4789
        continue;
 
4790
      }
 
4791
      pshufbMask.push_back(DAG.getConstant(EltIdx, MVT::i8));
 
4792
    }
 
4793
    // If all the elements are from V2, assign it to V1 and return after
 
4794
    // building the first pshufb.
 
4795
    if (V2Only)
 
4796
      V1 = V2;
 
4797
    V1 = DAG.getNode(X86ISD::PSHUFB, dl, MVT::v16i8, V1,
 
4798
                     DAG.getNode(ISD::BUILD_VECTOR, dl,
 
4799
                                 MVT::v16i8, &pshufbMask[0], 16));
 
4800
    if (!TwoInputs)
 
4801
      return V1;
 
4802
 
 
4803
    // Calculate the shuffle mask for the second input, shuffle it, and
 
4804
    // OR it with the first shuffled input.
 
4805
    pshufbMask.clear();
 
4806
    for (unsigned i = 0; i != 16; ++i) {
 
4807
      int EltIdx = MaskVals[i];
 
4808
      if (EltIdx < 16) {
 
4809
        pshufbMask.push_back(DAG.getConstant(0x80, MVT::i8));
 
4810
        continue;
 
4811
      }
 
4812
      pshufbMask.push_back(DAG.getConstant(EltIdx - 16, MVT::i8));
 
4813
    }
 
4814
    V2 = DAG.getNode(X86ISD::PSHUFB, dl, MVT::v16i8, V2,
 
4815
                     DAG.getNode(ISD::BUILD_VECTOR, dl,
 
4816
                                 MVT::v16i8, &pshufbMask[0], 16));
 
4817
    return DAG.getNode(ISD::OR, dl, MVT::v16i8, V1, V2);
 
4818
  }
 
4819
 
 
4820
  // No SSSE3 - Calculate in place words and then fix all out of place words
 
4821
  // With 0-16 extracts & inserts.  Worst case is 16 bytes out of order from
 
4822
  // the 16 different words that comprise the two doublequadword input vectors.
 
4823
  V1 = DAG.getNode(ISD::BIT_CONVERT, dl, MVT::v8i16, V1);
 
4824
  V2 = DAG.getNode(ISD::BIT_CONVERT, dl, MVT::v8i16, V2);
 
4825
  SDValue NewV = V2Only ? V2 : V1;
 
4826
  for (int i = 0; i != 8; ++i) {
 
4827
    int Elt0 = MaskVals[i*2];
 
4828
    int Elt1 = MaskVals[i*2+1];
 
4829
 
 
4830
    // This word of the result is all undef, skip it.
 
4831
    if (Elt0 < 0 && Elt1 < 0)
 
4832
      continue;
 
4833
 
 
4834
    // This word of the result is already in the correct place, skip it.
 
4835
    if (V1Only && (Elt0 == i*2) && (Elt1 == i*2+1))
 
4836
      continue;
 
4837
    if (V2Only && (Elt0 == i*2+16) && (Elt1 == i*2+17))
 
4838
      continue;
 
4839
 
 
4840
    SDValue Elt0Src = Elt0 < 16 ? V1 : V2;
 
4841
    SDValue Elt1Src = Elt1 < 16 ? V1 : V2;
 
4842
    SDValue InsElt;
 
4843
 
 
4844
    // If Elt0 and Elt1 are defined, are consecutive, and can be load
 
4845
    // using a single extract together, load it and store it.
 
4846
    if ((Elt0 >= 0) && ((Elt0 + 1) == Elt1) && ((Elt0 & 1) == 0)) {
 
4847
      InsElt = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, MVT::i16, Elt1Src,
 
4848
                           DAG.getIntPtrConstant(Elt1 / 2));
 
4849
      NewV = DAG.getNode(ISD::INSERT_VECTOR_ELT, dl, MVT::v8i16, NewV, InsElt,
 
4850
                        DAG.getIntPtrConstant(i));
 
4851
      continue;
 
4852
    }
 
4853
 
 
4854
    // If Elt1 is defined, extract it from the appropriate source.  If the
 
4855
    // source byte is not also odd, shift the extracted word left 8 bits
 
4856
    // otherwise clear the bottom 8 bits if we need to do an or.
 
4857
    if (Elt1 >= 0) {
 
4858
      InsElt = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, MVT::i16, Elt1Src,
 
4859
                           DAG.getIntPtrConstant(Elt1 / 2));
 
4860
      if ((Elt1 & 1) == 0)
 
4861
        InsElt = DAG.getNode(ISD::SHL, dl, MVT::i16, InsElt,
 
4862
                             DAG.getConstant(8, TLI.getShiftAmountTy()));
 
4863
      else if (Elt0 >= 0)
 
4864
        InsElt = DAG.getNode(ISD::AND, dl, MVT::i16, InsElt,
 
4865
                             DAG.getConstant(0xFF00, MVT::i16));
 
4866
    }
 
4867
    // If Elt0 is defined, extract it from the appropriate source.  If the
 
4868
    // source byte is not also even, shift the extracted word right 8 bits. If
 
4869
    // Elt1 was also defined, OR the extracted values together before
 
4870
    // inserting them in the result.
 
4871
    if (Elt0 >= 0) {
 
4872
      SDValue InsElt0 = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, MVT::i16,
 
4873
                                    Elt0Src, DAG.getIntPtrConstant(Elt0 / 2));
 
4874
      if ((Elt0 & 1) != 0)
 
4875
        InsElt0 = DAG.getNode(ISD::SRL, dl, MVT::i16, InsElt0,
 
4876
                              DAG.getConstant(8, TLI.getShiftAmountTy()));
 
4877
      else if (Elt1 >= 0)
 
4878
        InsElt0 = DAG.getNode(ISD::AND, dl, MVT::i16, InsElt0,
 
4879
                             DAG.getConstant(0x00FF, MVT::i16));
 
4880
      InsElt = Elt1 >= 0 ? DAG.getNode(ISD::OR, dl, MVT::i16, InsElt, InsElt0)
 
4881
                         : InsElt0;
 
4882
    }
 
4883
    NewV = DAG.getNode(ISD::INSERT_VECTOR_ELT, dl, MVT::v8i16, NewV, InsElt,
 
4884
                       DAG.getIntPtrConstant(i));
 
4885
  }
 
4886
  return DAG.getNode(ISD::BIT_CONVERT, dl, MVT::v16i8, NewV);
 
4887
}
 
4888
 
 
4889
/// RewriteAsNarrowerShuffle - Try rewriting v8i16 and v16i8 shuffles as 4 wide
 
4890
/// ones, or rewriting v4i32 / v2i32 as 2 wide ones if possible. This can be
 
4891
/// done when every pair / quad of shuffle mask elements point to elements in
 
4892
/// the right sequence. e.g.
 
4893
/// vector_shuffle <>, <>, < 3, 4, | 10, 11, | 0, 1, | 14, 15>
 
4894
static
 
4895
SDValue RewriteAsNarrowerShuffle(ShuffleVectorSDNode *SVOp,
 
4896
                                 SelectionDAG &DAG,
 
4897
                                 const TargetLowering &TLI, DebugLoc dl) {
 
4898
  EVT VT = SVOp->getValueType(0);
 
4899
  SDValue V1 = SVOp->getOperand(0);
 
4900
  SDValue V2 = SVOp->getOperand(1);
 
4901
  unsigned NumElems = VT.getVectorNumElements();
 
4902
  unsigned NewWidth = (NumElems == 4) ? 2 : 4;
 
4903
  EVT MaskVT = (NewWidth == 4) ? MVT::v4i16 : MVT::v2i32;
 
4904
  EVT NewVT = MaskVT;
 
4905
  switch (VT.getSimpleVT().SimpleTy) {
 
4906
  default: assert(false && "Unexpected!");
 
4907
  case MVT::v4f32: NewVT = MVT::v2f64; break;
 
4908
  case MVT::v4i32: NewVT = MVT::v2i64; break;
 
4909
  case MVT::v8i16: NewVT = MVT::v4i32; break;
 
4910
  case MVT::v16i8: NewVT = MVT::v4i32; break;
 
4911
  }
 
4912
 
 
4913
  if (NewWidth == 2) {
 
4914
    if (VT.isInteger())
 
4915
      NewVT = MVT::v2i64;
 
4916
    else
 
4917
      NewVT = MVT::v2f64;
 
4918
  }
 
4919
  int Scale = NumElems / NewWidth;
 
4920
  SmallVector<int, 8> MaskVec;
 
4921
  for (unsigned i = 0; i < NumElems; i += Scale) {
 
4922
    int StartIdx = -1;
 
4923
    for (int j = 0; j < Scale; ++j) {
 
4924
      int EltIdx = SVOp->getMaskElt(i+j);
 
4925
      if (EltIdx < 0)
 
4926
        continue;
 
4927
      if (StartIdx == -1)
 
4928
        StartIdx = EltIdx - (EltIdx % Scale);
 
4929
      if (EltIdx != StartIdx + j)
 
4930
        return SDValue();
 
4931
    }
 
4932
    if (StartIdx == -1)
 
4933
      MaskVec.push_back(-1);
 
4934
    else
 
4935
      MaskVec.push_back(StartIdx / Scale);
 
4936
  }
 
4937
 
 
4938
  V1 = DAG.getNode(ISD::BIT_CONVERT, dl, NewVT, V1);
 
4939
  V2 = DAG.getNode(ISD::BIT_CONVERT, dl, NewVT, V2);
 
4940
  return DAG.getVectorShuffle(NewVT, dl, V1, V2, &MaskVec[0]);
 
4941
}
 
4942
 
 
4943
/// getVZextMovL - Return a zero-extending vector move low node.
 
4944
///
 
4945
static SDValue getVZextMovL(EVT VT, EVT OpVT,
 
4946
                            SDValue SrcOp, SelectionDAG &DAG,
 
4947
                            const X86Subtarget *Subtarget, DebugLoc dl) {
 
4948
  if (VT == MVT::v2f64 || VT == MVT::v4f32) {
 
4949
    LoadSDNode *LD = NULL;
 
4950
    if (!isScalarLoadToVector(SrcOp.getNode(), &LD))
 
4951
      LD = dyn_cast<LoadSDNode>(SrcOp);
 
4952
    if (!LD) {
 
4953
      // movssrr and movsdrr do not clear top bits. Try to use movd, movq
 
4954
      // instead.
 
4955
      MVT ExtVT = (OpVT == MVT::v2f64) ? MVT::i64 : MVT::i32;
 
4956
      if ((ExtVT.SimpleTy != MVT::i64 || Subtarget->is64Bit()) &&
 
4957
          SrcOp.getOpcode() == ISD::SCALAR_TO_VECTOR &&
 
4958
          SrcOp.getOperand(0).getOpcode() == ISD::BIT_CONVERT &&
 
4959
          SrcOp.getOperand(0).getOperand(0).getValueType() == ExtVT) {
 
4960
        // PR2108
 
4961
        OpVT = (OpVT == MVT::v2f64) ? MVT::v2i64 : MVT::v4i32;
 
4962
        return DAG.getNode(ISD::BIT_CONVERT, dl, VT,
 
4963
                           DAG.getNode(X86ISD::VZEXT_MOVL, dl, OpVT,
 
4964
                                       DAG.getNode(ISD::SCALAR_TO_VECTOR, dl,
 
4965
                                                   OpVT,
 
4966
                                                   SrcOp.getOperand(0)
 
4967
                                                          .getOperand(0))));
 
4968
      }
 
4969
    }
 
4970
  }
 
4971
 
 
4972
  return DAG.getNode(ISD::BIT_CONVERT, dl, VT,
 
4973
                     DAG.getNode(X86ISD::VZEXT_MOVL, dl, OpVT,
 
4974
                                 DAG.getNode(ISD::BIT_CONVERT, dl,
 
4975
                                             OpVT, SrcOp)));
 
4976
}
 
4977
 
 
4978
/// LowerVECTOR_SHUFFLE_4wide - Handle all 4 wide cases with a number of
 
4979
/// shuffles.
 
4980
static SDValue
 
4981
LowerVECTOR_SHUFFLE_4wide(ShuffleVectorSDNode *SVOp, SelectionDAG &DAG) {
 
4982
  SDValue V1 = SVOp->getOperand(0);
 
4983
  SDValue V2 = SVOp->getOperand(1);
 
4984
  DebugLoc dl = SVOp->getDebugLoc();
 
4985
  EVT VT = SVOp->getValueType(0);
 
4986
 
 
4987
  SmallVector<std::pair<int, int>, 8> Locs;
 
4988
  Locs.resize(4);
 
4989
  SmallVector<int, 8> Mask1(4U, -1);
 
4990
  SmallVector<int, 8> PermMask;
 
4991
  SVOp->getMask(PermMask);
 
4992
 
 
4993
  unsigned NumHi = 0;
 
4994
  unsigned NumLo = 0;
 
4995
  for (unsigned i = 0; i != 4; ++i) {
 
4996
    int Idx = PermMask[i];
 
4997
    if (Idx < 0) {
 
4998
      Locs[i] = std::make_pair(-1, -1);
 
4999
    } else {
 
5000
      assert(Idx < 8 && "Invalid VECTOR_SHUFFLE index!");
 
5001
      if (Idx < 4) {
 
5002
        Locs[i] = std::make_pair(0, NumLo);
 
5003
        Mask1[NumLo] = Idx;
 
5004
        NumLo++;
 
5005
      } else {
 
5006
        Locs[i] = std::make_pair(1, NumHi);
 
5007
        if (2+NumHi < 4)
 
5008
          Mask1[2+NumHi] = Idx;
 
5009
        NumHi++;
 
5010
      }
 
5011
    }
 
5012
  }
 
5013
 
 
5014
  if (NumLo <= 2 && NumHi <= 2) {
 
5015
    // If no more than two elements come from either vector. This can be
 
5016
    // implemented with two shuffles. First shuffle gather the elements.
 
5017
    // The second shuffle, which takes the first shuffle as both of its
 
5018
    // vector operands, put the elements into the right order.
 
5019
    V1 = DAG.getVectorShuffle(VT, dl, V1, V2, &Mask1[0]);
 
5020
 
 
5021
    SmallVector<int, 8> Mask2(4U, -1);
 
5022
 
 
5023
    for (unsigned i = 0; i != 4; ++i) {
 
5024
      if (Locs[i].first == -1)
 
5025
        continue;
 
5026
      else {
 
5027
        unsigned Idx = (i < 2) ? 0 : 4;
 
5028
        Idx += Locs[i].first * 2 + Locs[i].second;
 
5029
        Mask2[i] = Idx;
 
5030
      }
 
5031
    }
 
5032
 
 
5033
    return DAG.getVectorShuffle(VT, dl, V1, V1, &Mask2[0]);
 
5034
  } else if (NumLo == 3 || NumHi == 3) {
 
5035
    // Otherwise, we must have three elements from one vector, call it X, and
 
5036
    // one element from the other, call it Y.  First, use a shufps to build an
 
5037
    // intermediate vector with the one element from Y and the element from X
 
5038
    // that will be in the same half in the final destination (the indexes don't
 
5039
    // matter). Then, use a shufps to build the final vector, taking the half
 
5040
    // containing the element from Y from the intermediate, and the other half
 
5041
    // from X.
 
5042
    if (NumHi == 3) {
 
5043
      // Normalize it so the 3 elements come from V1.
 
5044
      CommuteVectorShuffleMask(PermMask, VT);
 
5045
      std::swap(V1, V2);
 
5046
    }
 
5047
 
 
5048
    // Find the element from V2.
 
5049
    unsigned HiIndex;
 
5050
    for (HiIndex = 0; HiIndex < 3; ++HiIndex) {
 
5051
      int Val = PermMask[HiIndex];
 
5052
      if (Val < 0)
 
5053
        continue;
 
5054
      if (Val >= 4)
 
5055
        break;
 
5056
    }
 
5057
 
 
5058
    Mask1[0] = PermMask[HiIndex];
 
5059
    Mask1[1] = -1;
 
5060
    Mask1[2] = PermMask[HiIndex^1];
 
5061
    Mask1[3] = -1;
 
5062
    V2 = DAG.getVectorShuffle(VT, dl, V1, V2, &Mask1[0]);
 
5063
 
 
5064
    if (HiIndex >= 2) {
 
5065
      Mask1[0] = PermMask[0];
 
5066
      Mask1[1] = PermMask[1];
 
5067
      Mask1[2] = HiIndex & 1 ? 6 : 4;
 
5068
      Mask1[3] = HiIndex & 1 ? 4 : 6;
 
5069
      return DAG.getVectorShuffle(VT, dl, V1, V2, &Mask1[0]);
 
5070
    } else {
 
5071
      Mask1[0] = HiIndex & 1 ? 2 : 0;
 
5072
      Mask1[1] = HiIndex & 1 ? 0 : 2;
 
5073
      Mask1[2] = PermMask[2];
 
5074
      Mask1[3] = PermMask[3];
 
5075
      if (Mask1[2] >= 0)
 
5076
        Mask1[2] += 4;
 
5077
      if (Mask1[3] >= 0)
 
5078
        Mask1[3] += 4;
 
5079
      return DAG.getVectorShuffle(VT, dl, V2, V1, &Mask1[0]);
 
5080
    }
 
5081
  }
 
5082
 
 
5083
  // Break it into (shuffle shuffle_hi, shuffle_lo).
 
5084
  Locs.clear();
 
5085
  SmallVector<int,8> LoMask(4U, -1);
 
5086
  SmallVector<int,8> HiMask(4U, -1);
 
5087
 
 
5088
  SmallVector<int,8> *MaskPtr = &LoMask;
 
5089
  unsigned MaskIdx = 0;
 
5090
  unsigned LoIdx = 0;
 
5091
  unsigned HiIdx = 2;
 
5092
  for (unsigned i = 0; i != 4; ++i) {
 
5093
    if (i == 2) {
 
5094
      MaskPtr = &HiMask;
 
5095
      MaskIdx = 1;
 
5096
      LoIdx = 0;
 
5097
      HiIdx = 2;
 
5098
    }
 
5099
    int Idx = PermMask[i];
 
5100
    if (Idx < 0) {
 
5101
      Locs[i] = std::make_pair(-1, -1);
 
5102
    } else if (Idx < 4) {
 
5103
      Locs[i] = std::make_pair(MaskIdx, LoIdx);
 
5104
      (*MaskPtr)[LoIdx] = Idx;
 
5105
      LoIdx++;
 
5106
    } else {
 
5107
      Locs[i] = std::make_pair(MaskIdx, HiIdx);
 
5108
      (*MaskPtr)[HiIdx] = Idx;
 
5109
      HiIdx++;
 
5110
    }
 
5111
  }
 
5112
 
 
5113
  SDValue LoShuffle = DAG.getVectorShuffle(VT, dl, V1, V2, &LoMask[0]);
 
5114
  SDValue HiShuffle = DAG.getVectorShuffle(VT, dl, V1, V2, &HiMask[0]);
 
5115
  SmallVector<int, 8> MaskOps;
 
5116
  for (unsigned i = 0; i != 4; ++i) {
 
5117
    if (Locs[i].first == -1) {
 
5118
      MaskOps.push_back(-1);
 
5119
    } else {
 
5120
      unsigned Idx = Locs[i].first * 4 + Locs[i].second;
 
5121
      MaskOps.push_back(Idx);
 
5122
    }
 
5123
  }
 
5124
  return DAG.getVectorShuffle(VT, dl, LoShuffle, HiShuffle, &MaskOps[0]);
 
5125
}
 
5126
 
 
5127
static bool MayFoldVectorLoad(SDValue V) {
 
5128
  if (V.hasOneUse() && V.getOpcode() == ISD::BIT_CONVERT)
 
5129
    V = V.getOperand(0);
 
5130
  if (V.hasOneUse() && V.getOpcode() == ISD::SCALAR_TO_VECTOR)
 
5131
    V = V.getOperand(0);
 
5132
  if (MayFoldLoad(V))
 
5133
    return true;
 
5134
  return false;
 
5135
}
 
5136
 
 
5137
static
 
5138
SDValue getMOVLowToHigh(SDValue &Op, DebugLoc &dl, SelectionDAG &DAG,
 
5139
                        bool HasSSE2) {
 
5140
  SDValue V1 = Op.getOperand(0);
 
5141
  SDValue V2 = Op.getOperand(1);
 
5142
  EVT VT = Op.getValueType();
 
5143
 
 
5144
  assert(VT != MVT::v2i64 && "unsupported shuffle type");
 
5145
 
 
5146
  if (HasSSE2 && VT == MVT::v2f64)
 
5147
    return getTargetShuffleNode(X86ISD::MOVLHPD, dl, VT, V1, V2, DAG);
 
5148
 
 
5149
  // v4f32 or v4i32
 
5150
  return getTargetShuffleNode(X86ISD::MOVLHPS, dl, VT, V1, V2, DAG);
 
5151
}
 
5152
 
 
5153
static
 
5154
SDValue getMOVHighToLow(SDValue &Op, DebugLoc &dl, SelectionDAG &DAG) {
 
5155
  SDValue V1 = Op.getOperand(0);
 
5156
  SDValue V2 = Op.getOperand(1);
 
5157
  EVT VT = Op.getValueType();
 
5158
 
 
5159
  assert((VT == MVT::v4i32 || VT == MVT::v4f32) &&
 
5160
         "unsupported shuffle type");
 
5161
 
 
5162
  if (V2.getOpcode() == ISD::UNDEF)
 
5163
    V2 = V1;
 
5164
 
 
5165
  // v4i32 or v4f32
 
5166
  return getTargetShuffleNode(X86ISD::MOVHLPS, dl, VT, V1, V2, DAG);
 
5167
}
 
5168
 
 
5169
static
 
5170
SDValue getMOVLP(SDValue &Op, DebugLoc &dl, SelectionDAG &DAG, bool HasSSE2) {
 
5171
  SDValue V1 = Op.getOperand(0);
 
5172
  SDValue V2 = Op.getOperand(1);
 
5173
  EVT VT = Op.getValueType();
 
5174
  unsigned NumElems = VT.getVectorNumElements();
 
5175
 
 
5176
  // Use MOVLPS and MOVLPD in case V1 or V2 are loads. During isel, the second
 
5177
  // operand of these instructions is only memory, so check if there's a
 
5178
  // potencial load folding here, otherwise use SHUFPS or MOVSD to match the
 
5179
  // same masks.
 
5180
  bool CanFoldLoad = false;
 
5181
 
 
5182
  // Trivial case, when V2 comes from a load.
 
5183
  if (MayFoldVectorLoad(V2))
 
5184
    CanFoldLoad = true;
 
5185
 
 
5186
  // When V1 is a load, it can be folded later into a store in isel, example:
 
5187
  //  (store (v4f32 (X86Movlps (load addr:$src1), VR128:$src2)), addr:$src1)
 
5188
  //    turns into:
 
5189
  //  (MOVLPSmr addr:$src1, VR128:$src2)
 
5190
  // So, recognize this potential and also use MOVLPS or MOVLPD
 
5191
  if (MayFoldVectorLoad(V1) && MayFoldIntoStore(Op))
 
5192
    CanFoldLoad = true;
 
5193
 
 
5194
  if (CanFoldLoad) {
 
5195
    if (HasSSE2 && NumElems == 2)
 
5196
      return getTargetShuffleNode(X86ISD::MOVLPD, dl, VT, V1, V2, DAG);
 
5197
 
 
5198
    if (NumElems == 4)
 
5199
      return getTargetShuffleNode(X86ISD::MOVLPS, dl, VT, V1, V2, DAG);
 
5200
  }
 
5201
 
 
5202
  ShuffleVectorSDNode *SVOp = cast<ShuffleVectorSDNode>(Op);
 
5203
  // movl and movlp will both match v2i64, but v2i64 is never matched by
 
5204
  // movl earlier because we make it strict to avoid messing with the movlp load
 
5205
  // folding logic (see the code above getMOVLP call). Match it here then,
 
5206
  // this is horrible, but will stay like this until we move all shuffle
 
5207
  // matching to x86 specific nodes. Note that for the 1st condition all
 
5208
  // types are matched with movsd.
 
5209
  if ((HasSSE2 && NumElems == 2) || !X86::isMOVLMask(SVOp))
 
5210
    return getTargetShuffleNode(X86ISD::MOVSD, dl, VT, V1, V2, DAG);
 
5211
  else if (HasSSE2)
 
5212
    return getTargetShuffleNode(X86ISD::MOVSS, dl, VT, V1, V2, DAG);
 
5213
 
 
5214
 
 
5215
  assert(VT != MVT::v4i32 && "unsupported shuffle type");
 
5216
 
 
5217
  // Invert the operand order and use SHUFPS to match it.
 
5218
  return getTargetShuffleNode(X86ISD::SHUFPS, dl, VT, V2, V1,
 
5219
                              X86::getShuffleSHUFImmediate(SVOp), DAG);
 
5220
}
 
5221
 
 
5222
static inline unsigned getUNPCKLOpcode(EVT VT) {
 
5223
  switch(VT.getSimpleVT().SimpleTy) {
 
5224
  case MVT::v4i32: return X86ISD::PUNPCKLDQ;
 
5225
  case MVT::v2i64: return X86ISD::PUNPCKLQDQ;
 
5226
  case MVT::v4f32: return X86ISD::UNPCKLPS;
 
5227
  case MVT::v2f64: return X86ISD::UNPCKLPD;
 
5228
  case MVT::v16i8: return X86ISD::PUNPCKLBW;
 
5229
  case MVT::v8i16: return X86ISD::PUNPCKLWD;
 
5230
  default:
 
5231
    llvm_unreachable("Unknow type for unpckl");
 
5232
  }
 
5233
  return 0;
 
5234
}
 
5235
 
 
5236
static inline unsigned getUNPCKHOpcode(EVT VT) {
 
5237
  switch(VT.getSimpleVT().SimpleTy) {
 
5238
  case MVT::v4i32: return X86ISD::PUNPCKHDQ;
 
5239
  case MVT::v2i64: return X86ISD::PUNPCKHQDQ;
 
5240
  case MVT::v4f32: return X86ISD::UNPCKHPS;
 
5241
  case MVT::v2f64: return X86ISD::UNPCKHPD;
 
5242
  case MVT::v16i8: return X86ISD::PUNPCKHBW;
 
5243
  case MVT::v8i16: return X86ISD::PUNPCKHWD;
 
5244
  default:
 
5245
    llvm_unreachable("Unknow type for unpckh");
 
5246
  }
 
5247
  return 0;
 
5248
}
 
5249
 
 
5250
SDValue
 
5251
X86TargetLowering::LowerVECTOR_SHUFFLE(SDValue Op, SelectionDAG &DAG) const {
 
5252
  ShuffleVectorSDNode *SVOp = cast<ShuffleVectorSDNode>(Op);
 
5253
  SDValue V1 = Op.getOperand(0);
 
5254
  SDValue V2 = Op.getOperand(1);
 
5255
  EVT VT = Op.getValueType();
 
5256
  DebugLoc dl = Op.getDebugLoc();
 
5257
  unsigned NumElems = VT.getVectorNumElements();
 
5258
  bool isMMX = VT.getSizeInBits() == 64;
 
5259
  bool V1IsUndef = V1.getOpcode() == ISD::UNDEF;
 
5260
  bool V2IsUndef = V2.getOpcode() == ISD::UNDEF;
 
5261
  bool V1IsSplat = false;
 
5262
  bool V2IsSplat = false;
 
5263
  bool HasSSE2 = Subtarget->hasSSE2() || Subtarget->hasAVX();
 
5264
  bool HasSSE3 = Subtarget->hasSSE3() || Subtarget->hasAVX();
 
5265
  MachineFunction &MF = DAG.getMachineFunction();
 
5266
  bool OptForSize = MF.getFunction()->hasFnAttr(Attribute::OptimizeForSize);
 
5267
 
 
5268
  if (isZeroShuffle(SVOp))
 
5269
    return getZeroVector(VT, Subtarget->hasSSE2(), DAG, dl);
 
5270
 
 
5271
  // Promote splats to v4f32.
 
5272
  if (SVOp->isSplat()) {
 
5273
    if (isMMX || NumElems < 4)
 
5274
      return Op;
 
5275
    return PromoteSplat(SVOp, DAG);
 
5276
  }
 
5277
 
 
5278
  // If the shuffle can be profitably rewritten as a narrower shuffle, then
 
5279
  // do it!
 
5280
  if (VT == MVT::v8i16 || VT == MVT::v16i8) {
 
5281
    SDValue NewOp = RewriteAsNarrowerShuffle(SVOp, DAG, *this, dl);
 
5282
    if (NewOp.getNode())
 
5283
      return DAG.getNode(ISD::BIT_CONVERT, dl, VT,
 
5284
                         LowerVECTOR_SHUFFLE(NewOp, DAG));
 
5285
  } else if ((VT == MVT::v4i32 || (VT == MVT::v4f32 && Subtarget->hasSSE2()))) {
 
5286
    // FIXME: Figure out a cleaner way to do this.
 
5287
    // Try to make use of movq to zero out the top part.
 
5288
    if (ISD::isBuildVectorAllZeros(V2.getNode())) {
 
5289
      SDValue NewOp = RewriteAsNarrowerShuffle(SVOp, DAG, *this, dl);
 
5290
      if (NewOp.getNode()) {
 
5291
        if (isCommutedMOVL(cast<ShuffleVectorSDNode>(NewOp), true, false))
 
5292
          return getVZextMovL(VT, NewOp.getValueType(), NewOp.getOperand(0),
 
5293
                              DAG, Subtarget, dl);
 
5294
      }
 
5295
    } else if (ISD::isBuildVectorAllZeros(V1.getNode())) {
 
5296
      SDValue NewOp = RewriteAsNarrowerShuffle(SVOp, DAG, *this, dl);
 
5297
      if (NewOp.getNode() && X86::isMOVLMask(cast<ShuffleVectorSDNode>(NewOp)))
 
5298
        return getVZextMovL(VT, NewOp.getValueType(), NewOp.getOperand(1),
 
5299
                            DAG, Subtarget, dl);
 
5300
    }
 
5301
  }
 
5302
 
 
5303
  // NOTE: isPSHUFDMask can also match both masks below (unpckl_undef and
 
5304
  // unpckh_undef). Only use pshufd if speed is more important than size.
 
5305
  if (OptForSize && X86::isUNPCKL_v_undef_Mask(SVOp))
 
5306
    if (VT != MVT::v2i64 && VT != MVT::v2f64)
 
5307
      return getTargetShuffleNode(getUNPCKLOpcode(VT), dl, VT, V1, V1, DAG);
 
5308
  if (OptForSize && X86::isUNPCKH_v_undef_Mask(SVOp))
 
5309
    if (VT != MVT::v2i64 && VT != MVT::v2f64)
 
5310
      return getTargetShuffleNode(getUNPCKHOpcode(VT), dl, VT, V1, V1, DAG);
 
5311
 
 
5312
  if (X86::isPSHUFDMask(SVOp)) {
 
5313
    // The actual implementation will match the mask in the if above and then
 
5314
    // during isel it can match several different instructions, not only pshufd
 
5315
    // as its name says, sad but true, emulate the behavior for now...
 
5316
    if (X86::isMOVDDUPMask(SVOp) && ((VT == MVT::v4f32 || VT == MVT::v2i64)))
 
5317
        return getTargetShuffleNode(X86ISD::MOVLHPS, dl, VT, V1, V1, DAG);
 
5318
 
 
5319
    unsigned TargetMask = X86::getShuffleSHUFImmediate(SVOp);
 
5320
 
 
5321
    if (HasSSE2 && (VT == MVT::v4f32 || VT == MVT::v4i32))
 
5322
      return getTargetShuffleNode(X86ISD::PSHUFD, dl, VT, V1, TargetMask, DAG);
 
5323
 
 
5324
    if (HasSSE2 && (VT == MVT::v2i64 || VT == MVT::v2f64))
 
5325
      return getTargetShuffleNode(X86ISD::SHUFPD, dl, VT, V1, V1,
 
5326
                                  TargetMask, DAG);
 
5327
 
 
5328
    if (VT == MVT::v4f32)
 
5329
      return getTargetShuffleNode(X86ISD::SHUFPS, dl, VT, V1, V1,
 
5330
                                  TargetMask, DAG);
 
5331
  }
 
5332
 
 
5333
  // Check if this can be converted into a logical shift.
 
5334
  bool isLeft = false;
 
5335
  unsigned ShAmt = 0;
 
5336
  SDValue ShVal;
 
5337
  bool isShift = getSubtarget()->hasSSE2() &&
 
5338
    isVectorShift(SVOp, DAG, isLeft, ShVal, ShAmt);
 
5339
  if (isShift && ShVal.hasOneUse()) {
 
5340
    // If the shifted value has multiple uses, it may be cheaper to use
 
5341
    // v_set0 + movlhps or movhlps, etc.
 
5342
    EVT EltVT = VT.getVectorElementType();
 
5343
    ShAmt *= EltVT.getSizeInBits();
 
5344
    return getVShift(isLeft, VT, ShVal, ShAmt, DAG, *this, dl);
 
5345
  }
 
5346
 
 
5347
  if (X86::isMOVLMask(SVOp)) {
 
5348
    if (V1IsUndef)
 
5349
      return V2;
 
5350
    if (ISD::isBuildVectorAllZeros(V1.getNode()))
 
5351
      return getVZextMovL(VT, VT, V2, DAG, Subtarget, dl);
 
5352
    if (!isMMX && !X86::isMOVLPMask(SVOp)) {
 
5353
      if (HasSSE2 && (VT == MVT::v2i64 || VT == MVT::v2f64))
 
5354
        return getTargetShuffleNode(X86ISD::MOVSD, dl, VT, V1, V2, DAG);
 
5355
 
 
5356
      if (VT == MVT::v4i32 || VT == MVT::v4f32)
 
5357
        return getTargetShuffleNode(X86ISD::MOVSS, dl, VT, V1, V2, DAG);
 
5358
    }
 
5359
  }
 
5360
 
 
5361
  // FIXME: fold these into legal mask.
 
5362
  if (!isMMX) {
 
5363
    if (X86::isMOVLHPSMask(SVOp) && !X86::isUNPCKLMask(SVOp))
 
5364
      return getMOVLowToHigh(Op, dl, DAG, HasSSE2);
 
5365
 
 
5366
    if (X86::isMOVHLPSMask(SVOp))
 
5367
      return getMOVHighToLow(Op, dl, DAG);
 
5368
 
 
5369
    if (X86::isMOVSHDUPMask(SVOp) && HasSSE3 && V2IsUndef && NumElems == 4)
 
5370
      return getTargetShuffleNode(X86ISD::MOVSHDUP, dl, VT, V1, DAG);
 
5371
 
 
5372
    if (X86::isMOVSLDUPMask(SVOp) && HasSSE3 && V2IsUndef && NumElems == 4)
 
5373
      return getTargetShuffleNode(X86ISD::MOVSLDUP, dl, VT, V1, DAG);
 
5374
 
 
5375
    if (X86::isMOVLPMask(SVOp))
 
5376
      return getMOVLP(Op, dl, DAG, HasSSE2);
 
5377
  }
 
5378
 
 
5379
  if (ShouldXformToMOVHLPS(SVOp) ||
 
5380
      ShouldXformToMOVLP(V1.getNode(), V2.getNode(), SVOp))
 
5381
    return CommuteVectorShuffle(SVOp, DAG);
 
5382
 
 
5383
  if (isShift) {
 
5384
    // No better options. Use a vshl / vsrl.
 
5385
    EVT EltVT = VT.getVectorElementType();
 
5386
    ShAmt *= EltVT.getSizeInBits();
 
5387
    return getVShift(isLeft, VT, ShVal, ShAmt, DAG, *this, dl);
 
5388
  }
 
5389
 
 
5390
  bool Commuted = false;
 
5391
  // FIXME: This should also accept a bitcast of a splat?  Be careful, not
 
5392
  // 1,1,1,1 -> v8i16 though.
 
5393
  V1IsSplat = isSplatVector(V1.getNode());
 
5394
  V2IsSplat = isSplatVector(V2.getNode());
 
5395
 
 
5396
  // Canonicalize the splat or undef, if present, to be on the RHS.
 
5397
  if ((V1IsSplat || V1IsUndef) && !(V2IsSplat || V2IsUndef)) {
 
5398
    Op = CommuteVectorShuffle(SVOp, DAG);
 
5399
    SVOp = cast<ShuffleVectorSDNode>(Op);
 
5400
    V1 = SVOp->getOperand(0);
 
5401
    V2 = SVOp->getOperand(1);
 
5402
    std::swap(V1IsSplat, V2IsSplat);
 
5403
    std::swap(V1IsUndef, V2IsUndef);
 
5404
    Commuted = true;
 
5405
  }
 
5406
 
 
5407
  if (isCommutedMOVL(SVOp, V2IsSplat, V2IsUndef)) {
 
5408
    // Shuffling low element of v1 into undef, just return v1.
 
5409
    if (V2IsUndef)
 
5410
      return V1;
 
5411
    // If V2 is a splat, the mask may be malformed such as <4,3,3,3>, which
 
5412
    // the instruction selector will not match, so get a canonical MOVL with
 
5413
    // swapped operands to undo the commute.
 
5414
    return getMOVL(DAG, dl, VT, V2, V1);
 
5415
  }
 
5416
 
 
5417
  if (X86::isUNPCKL_v_undef_Mask(SVOp) || X86::isUNPCKLMask(SVOp))
 
5418
    return (isMMX) ?
 
5419
      Op : getTargetShuffleNode(getUNPCKLOpcode(VT), dl, VT, V1, V2, DAG);
 
5420
 
 
5421
  if (X86::isUNPCKH_v_undef_Mask(SVOp) || X86::isUNPCKHMask(SVOp))
 
5422
    return (isMMX) ?
 
5423
      Op : getTargetShuffleNode(getUNPCKHOpcode(VT), dl, VT, V1, V2, DAG);
 
5424
 
 
5425
  if (V2IsSplat) {
 
5426
    // Normalize mask so all entries that point to V2 points to its first
 
5427
    // element then try to match unpck{h|l} again. If match, return a
 
5428
    // new vector_shuffle with the corrected mask.
 
5429
    SDValue NewMask = NormalizeMask(SVOp, DAG);
 
5430
    ShuffleVectorSDNode *NSVOp = cast<ShuffleVectorSDNode>(NewMask);
 
5431
    if (NSVOp != SVOp) {
 
5432
      if (X86::isUNPCKLMask(NSVOp, true)) {
 
5433
        return NewMask;
 
5434
      } else if (X86::isUNPCKHMask(NSVOp, true)) {
 
5435
        return NewMask;
 
5436
      }
 
5437
    }
 
5438
  }
 
5439
 
 
5440
  if (Commuted) {
 
5441
    // Commute is back and try unpck* again.
 
5442
    // FIXME: this seems wrong.
 
5443
    SDValue NewOp = CommuteVectorShuffle(SVOp, DAG);
 
5444
    ShuffleVectorSDNode *NewSVOp = cast<ShuffleVectorSDNode>(NewOp);
 
5445
 
 
5446
    if (X86::isUNPCKL_v_undef_Mask(NewSVOp) || X86::isUNPCKLMask(NewSVOp))
 
5447
      return (isMMX) ?
 
5448
        NewOp : getTargetShuffleNode(getUNPCKLOpcode(VT), dl, VT, V2, V1, DAG);
 
5449
 
 
5450
    if (X86::isUNPCKH_v_undef_Mask(NewSVOp) || X86::isUNPCKHMask(NewSVOp))
 
5451
      return (isMMX) ?
 
5452
        NewOp : getTargetShuffleNode(getUNPCKHOpcode(VT), dl, VT, V2, V1, DAG);
 
5453
  }
 
5454
 
 
5455
  // FIXME: for mmx, bitcast v2i32 to v4i16 for shuffle.
 
5456
 
 
5457
  // Normalize the node to match x86 shuffle ops if needed
 
5458
  if (!isMMX && V2.getOpcode() != ISD::UNDEF && isCommutedSHUFP(SVOp))
 
5459
    return CommuteVectorShuffle(SVOp, DAG);
 
5460
 
 
5461
  // The checks below are all present in isShuffleMaskLegal, but they are
 
5462
  // inlined here right now to enable us to directly emit target specific
 
5463
  // nodes, and remove one by one until they don't return Op anymore.
 
5464
  SmallVector<int, 16> M;
 
5465
  SVOp->getMask(M);
 
5466
 
 
5467
  // Very little shuffling can be done for 64-bit vectors right now.
 
5468
  if (VT.getSizeInBits() == 64)
 
5469
    return isPALIGNRMask(M, VT, Subtarget->hasSSSE3()) ? Op : SDValue();
 
5470
 
 
5471
  // FIXME: pshufb, blends, shifts.
 
5472
  if (VT.getVectorNumElements() == 2 ||
 
5473
      ShuffleVectorSDNode::isSplatMask(&M[0], VT) ||
 
5474
      isPALIGNRMask(M, VT, Subtarget->hasSSSE3()))
 
5475
    return Op;
 
5476
 
 
5477
  if (isPSHUFHWMask(M, VT))
 
5478
    return getTargetShuffleNode(X86ISD::PSHUFHW, dl, VT, V1,
 
5479
                                X86::getShufflePSHUFHWImmediate(SVOp),
 
5480
                                DAG);
 
5481
 
 
5482
  if (isPSHUFLWMask(M, VT))
 
5483
    return getTargetShuffleNode(X86ISD::PSHUFLW, dl, VT, V1,
 
5484
                                X86::getShufflePSHUFLWImmediate(SVOp),
 
5485
                                DAG);
 
5486
 
 
5487
  if (isSHUFPMask(M, VT)) {
 
5488
    unsigned TargetMask = X86::getShuffleSHUFImmediate(SVOp);
 
5489
    if (VT == MVT::v4f32 || VT == MVT::v4i32)
 
5490
      return getTargetShuffleNode(X86ISD::SHUFPS, dl, VT, V1, V2,
 
5491
                                  TargetMask, DAG);
 
5492
    if (VT == MVT::v2f64 || VT == MVT::v2i64)
 
5493
      return getTargetShuffleNode(X86ISD::SHUFPD, dl, VT, V1, V2,
 
5494
                                  TargetMask, DAG);
 
5495
  }
 
5496
 
 
5497
  // Handle v8i16 specifically since SSE can do byte extraction and insertion.
 
5498
  if (VT == MVT::v8i16) {
 
5499
    SDValue NewOp = LowerVECTOR_SHUFFLEv8i16(Op, DAG);
 
5500
    if (NewOp.getNode())
 
5501
      return NewOp;
 
5502
  }
 
5503
 
 
5504
  if (VT == MVT::v16i8) {
 
5505
    SDValue NewOp = LowerVECTOR_SHUFFLEv16i8(SVOp, DAG, *this);
 
5506
    if (NewOp.getNode())
 
5507
      return NewOp;
 
5508
  }
 
5509
 
 
5510
  // Handle all 4 wide cases with a number of shuffles except for MMX.
 
5511
  if (NumElems == 4 && !isMMX)
 
5512
    return LowerVECTOR_SHUFFLE_4wide(SVOp, DAG);
 
5513
 
 
5514
  return SDValue();
 
5515
}
 
5516
 
 
5517
SDValue
 
5518
X86TargetLowering::LowerEXTRACT_VECTOR_ELT_SSE4(SDValue Op,
 
5519
                                                SelectionDAG &DAG) const {
 
5520
  EVT VT = Op.getValueType();
 
5521
  DebugLoc dl = Op.getDebugLoc();
 
5522
  if (VT.getSizeInBits() == 8) {
 
5523
    SDValue Extract = DAG.getNode(X86ISD::PEXTRB, dl, MVT::i32,
 
5524
                                    Op.getOperand(0), Op.getOperand(1));
 
5525
    SDValue Assert  = DAG.getNode(ISD::AssertZext, dl, MVT::i32, Extract,
 
5526
                                    DAG.getValueType(VT));
 
5527
    return DAG.getNode(ISD::TRUNCATE, dl, VT, Assert);
 
5528
  } else if (VT.getSizeInBits() == 16) {
 
5529
    unsigned Idx = cast<ConstantSDNode>(Op.getOperand(1))->getZExtValue();
 
5530
    // If Idx is 0, it's cheaper to do a move instead of a pextrw.
 
5531
    if (Idx == 0)
 
5532
      return DAG.getNode(ISD::TRUNCATE, dl, MVT::i16,
 
5533
                         DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, MVT::i32,
 
5534
                                     DAG.getNode(ISD::BIT_CONVERT, dl,
 
5535
                                                 MVT::v4i32,
 
5536
                                                 Op.getOperand(0)),
 
5537
                                     Op.getOperand(1)));
 
5538
    SDValue Extract = DAG.getNode(X86ISD::PEXTRW, dl, MVT::i32,
 
5539
                                    Op.getOperand(0), Op.getOperand(1));
 
5540
    SDValue Assert  = DAG.getNode(ISD::AssertZext, dl, MVT::i32, Extract,
 
5541
                                    DAG.getValueType(VT));
 
5542
    return DAG.getNode(ISD::TRUNCATE, dl, VT, Assert);
 
5543
  } else if (VT == MVT::f32) {
 
5544
    // EXTRACTPS outputs to a GPR32 register which will require a movd to copy
 
5545
    // the result back to FR32 register. It's only worth matching if the
 
5546
    // result has a single use which is a store or a bitcast to i32.  And in
 
5547
    // the case of a store, it's not worth it if the index is a constant 0,
 
5548
    // because a MOVSSmr can be used instead, which is smaller and faster.
 
5549
    if (!Op.hasOneUse())
 
5550
      return SDValue();
 
5551
    SDNode *User = *Op.getNode()->use_begin();
 
5552
    if ((User->getOpcode() != ISD::STORE ||
 
5553
         (isa<ConstantSDNode>(Op.getOperand(1)) &&
 
5554
          cast<ConstantSDNode>(Op.getOperand(1))->isNullValue())) &&
 
5555
        (User->getOpcode() != ISD::BIT_CONVERT ||
 
5556
         User->getValueType(0) != MVT::i32))
 
5557
      return SDValue();
 
5558
    SDValue Extract = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, MVT::i32,
 
5559
                                  DAG.getNode(ISD::BIT_CONVERT, dl, MVT::v4i32,
 
5560
                                              Op.getOperand(0)),
 
5561
                                              Op.getOperand(1));
 
5562
    return DAG.getNode(ISD::BIT_CONVERT, dl, MVT::f32, Extract);
 
5563
  } else if (VT == MVT::i32) {
 
5564
    // ExtractPS works with constant index.
 
5565
    if (isa<ConstantSDNode>(Op.getOperand(1)))
 
5566
      return Op;
 
5567
  }
 
5568
  return SDValue();
 
5569
}
 
5570
 
 
5571
 
 
5572
SDValue
 
5573
X86TargetLowering::LowerEXTRACT_VECTOR_ELT(SDValue Op,
 
5574
                                           SelectionDAG &DAG) const {
 
5575
  if (!isa<ConstantSDNode>(Op.getOperand(1)))
 
5576
    return SDValue();
 
5577
 
 
5578
  if (Subtarget->hasSSE41()) {
 
5579
    SDValue Res = LowerEXTRACT_VECTOR_ELT_SSE4(Op, DAG);
 
5580
    if (Res.getNode())
 
5581
      return Res;
 
5582
  }
 
5583
 
 
5584
  EVT VT = Op.getValueType();
 
5585
  DebugLoc dl = Op.getDebugLoc();
 
5586
  // TODO: handle v16i8.
 
5587
  if (VT.getSizeInBits() == 16) {
 
5588
    SDValue Vec = Op.getOperand(0);
 
5589
    unsigned Idx = cast<ConstantSDNode>(Op.getOperand(1))->getZExtValue();
 
5590
    if (Idx == 0)
 
5591
      return DAG.getNode(ISD::TRUNCATE, dl, MVT::i16,
 
5592
                         DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, MVT::i32,
 
5593
                                     DAG.getNode(ISD::BIT_CONVERT, dl,
 
5594
                                                 MVT::v4i32, Vec),
 
5595
                                     Op.getOperand(1)));
 
5596
    // Transform it so it match pextrw which produces a 32-bit result.
 
5597
    EVT EltVT = MVT::i32;
 
5598
    SDValue Extract = DAG.getNode(X86ISD::PEXTRW, dl, EltVT,
 
5599
                                    Op.getOperand(0), Op.getOperand(1));
 
5600
    SDValue Assert  = DAG.getNode(ISD::AssertZext, dl, EltVT, Extract,
 
5601
                                    DAG.getValueType(VT));
 
5602
    return DAG.getNode(ISD::TRUNCATE, dl, VT, Assert);
 
5603
  } else if (VT.getSizeInBits() == 32) {
 
5604
    unsigned Idx = cast<ConstantSDNode>(Op.getOperand(1))->getZExtValue();
 
5605
    if (Idx == 0)
 
5606
      return Op;
 
5607
 
 
5608
    // SHUFPS the element to the lowest double word, then movss.
 
5609
    int Mask[4] = { Idx, -1, -1, -1 };
 
5610
    EVT VVT = Op.getOperand(0).getValueType();
 
5611
    SDValue Vec = DAG.getVectorShuffle(VVT, dl, Op.getOperand(0),
 
5612
                                       DAG.getUNDEF(VVT), Mask);
 
5613
    return DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, VT, Vec,
 
5614
                       DAG.getIntPtrConstant(0));
 
5615
  } else if (VT.getSizeInBits() == 64) {
 
5616
    // FIXME: .td only matches this for <2 x f64>, not <2 x i64> on 32b
 
5617
    // FIXME: seems like this should be unnecessary if mov{h,l}pd were taught
 
5618
    //        to match extract_elt for f64.
 
5619
    unsigned Idx = cast<ConstantSDNode>(Op.getOperand(1))->getZExtValue();
 
5620
    if (Idx == 0)
 
5621
      return Op;
 
5622
 
 
5623
    // UNPCKHPD the element to the lowest double word, then movsd.
 
5624
    // Note if the lower 64 bits of the result of the UNPCKHPD is then stored
 
5625
    // to a f64mem, the whole operation is folded into a single MOVHPDmr.
 
5626
    int Mask[2] = { 1, -1 };
 
5627
    EVT VVT = Op.getOperand(0).getValueType();
 
5628
    SDValue Vec = DAG.getVectorShuffle(VVT, dl, Op.getOperand(0),
 
5629
                                       DAG.getUNDEF(VVT), Mask);
 
5630
    return DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, VT, Vec,
 
5631
                       DAG.getIntPtrConstant(0));
 
5632
  }
 
5633
 
 
5634
  return SDValue();
 
5635
}
 
5636
 
 
5637
SDValue
 
5638
X86TargetLowering::LowerINSERT_VECTOR_ELT_SSE4(SDValue Op,
 
5639
                                               SelectionDAG &DAG) const {
 
5640
  EVT VT = Op.getValueType();
 
5641
  EVT EltVT = VT.getVectorElementType();
 
5642
  DebugLoc dl = Op.getDebugLoc();
 
5643
 
 
5644
  SDValue N0 = Op.getOperand(0);
 
5645
  SDValue N1 = Op.getOperand(1);
 
5646
  SDValue N2 = Op.getOperand(2);
 
5647
 
 
5648
  if ((EltVT.getSizeInBits() == 8 || EltVT.getSizeInBits() == 16) &&
 
5649
      isa<ConstantSDNode>(N2)) {
 
5650
    unsigned Opc;
 
5651
    if (VT == MVT::v8i16)
 
5652
      Opc = X86ISD::PINSRW;
 
5653
    else if (VT == MVT::v4i16)
 
5654
      Opc = X86ISD::MMX_PINSRW;
 
5655
    else if (VT == MVT::v16i8)
 
5656
      Opc = X86ISD::PINSRB;
 
5657
    else
 
5658
      Opc = X86ISD::PINSRB;
 
5659
 
 
5660
    // Transform it so it match pinsr{b,w} which expects a GR32 as its second
 
5661
    // argument.
 
5662
    if (N1.getValueType() != MVT::i32)
 
5663
      N1 = DAG.getNode(ISD::ANY_EXTEND, dl, MVT::i32, N1);
 
5664
    if (N2.getValueType() != MVT::i32)
 
5665
      N2 = DAG.getIntPtrConstant(cast<ConstantSDNode>(N2)->getZExtValue());
 
5666
    return DAG.getNode(Opc, dl, VT, N0, N1, N2);
 
5667
  } else if (EltVT == MVT::f32 && isa<ConstantSDNode>(N2)) {
 
5668
    // Bits [7:6] of the constant are the source select.  This will always be
 
5669
    //  zero here.  The DAG Combiner may combine an extract_elt index into these
 
5670
    //  bits.  For example (insert (extract, 3), 2) could be matched by putting
 
5671
    //  the '3' into bits [7:6] of X86ISD::INSERTPS.
 
5672
    // Bits [5:4] of the constant are the destination select.  This is the
 
5673
    //  value of the incoming immediate.
 
5674
    // Bits [3:0] of the constant are the zero mask.  The DAG Combiner may
 
5675
    //   combine either bitwise AND or insert of float 0.0 to set these bits.
 
5676
    N2 = DAG.getIntPtrConstant(cast<ConstantSDNode>(N2)->getZExtValue() << 4);
 
5677
    // Create this as a scalar to vector..
 
5678
    N1 = DAG.getNode(ISD::SCALAR_TO_VECTOR, dl, MVT::v4f32, N1);
 
5679
    return DAG.getNode(X86ISD::INSERTPS, dl, VT, N0, N1, N2);
 
5680
  } else if (EltVT == MVT::i32 && isa<ConstantSDNode>(N2)) {
 
5681
    // PINSR* works with constant index.
 
5682
    return Op;
 
5683
  }
 
5684
  return SDValue();
 
5685
}
 
5686
 
 
5687
SDValue
 
5688
X86TargetLowering::LowerINSERT_VECTOR_ELT(SDValue Op, SelectionDAG &DAG) const {
 
5689
  EVT VT = Op.getValueType();
 
5690
  EVT EltVT = VT.getVectorElementType();
 
5691
 
 
5692
  if (Subtarget->hasSSE41())
 
5693
    return LowerINSERT_VECTOR_ELT_SSE4(Op, DAG);
 
5694
 
 
5695
  if (EltVT == MVT::i8)
 
5696
    return SDValue();
 
5697
 
 
5698
  DebugLoc dl = Op.getDebugLoc();
 
5699
  SDValue N0 = Op.getOperand(0);
 
5700
  SDValue N1 = Op.getOperand(1);
 
5701
  SDValue N2 = Op.getOperand(2);
 
5702
 
 
5703
  if (EltVT.getSizeInBits() == 16 && isa<ConstantSDNode>(N2)) {
 
5704
    // Transform it so it match pinsrw which expects a 16-bit value in a GR32
 
5705
    // as its second argument.
 
5706
    if (N1.getValueType() != MVT::i32)
 
5707
      N1 = DAG.getNode(ISD::ANY_EXTEND, dl, MVT::i32, N1);
 
5708
    if (N2.getValueType() != MVT::i32)
 
5709
      N2 = DAG.getIntPtrConstant(cast<ConstantSDNode>(N2)->getZExtValue());
 
5710
    return DAG.getNode(VT == MVT::v8i16 ? X86ISD::PINSRW : X86ISD::MMX_PINSRW,
 
5711
                       dl, VT, N0, N1, N2);
 
5712
  }
 
5713
  return SDValue();
 
5714
}
 
5715
 
 
5716
SDValue
 
5717
X86TargetLowering::LowerSCALAR_TO_VECTOR(SDValue Op, SelectionDAG &DAG) const {
 
5718
  DebugLoc dl = Op.getDebugLoc();
 
5719
  
 
5720
  if (Op.getValueType() == MVT::v1i64 &&
 
5721
      Op.getOperand(0).getValueType() == MVT::i64)
 
5722
    return DAG.getNode(ISD::SCALAR_TO_VECTOR, dl, MVT::v1i64, Op.getOperand(0));
 
5723
 
 
5724
  SDValue AnyExt = DAG.getNode(ISD::ANY_EXTEND, dl, MVT::i32, Op.getOperand(0));
 
5725
  EVT VT = MVT::v2i32;
 
5726
  switch (Op.getValueType().getSimpleVT().SimpleTy) {
 
5727
  default: break;
 
5728
  case MVT::v16i8:
 
5729
  case MVT::v8i16:
 
5730
    VT = MVT::v4i32;
 
5731
    break;
 
5732
  }
 
5733
  return DAG.getNode(ISD::BIT_CONVERT, dl, Op.getValueType(),
 
5734
                     DAG.getNode(ISD::SCALAR_TO_VECTOR, dl, VT, AnyExt));
 
5735
}
 
5736
 
 
5737
// ConstantPool, JumpTable, GlobalAddress, and ExternalSymbol are lowered as
 
5738
// their target countpart wrapped in the X86ISD::Wrapper node. Suppose N is
 
5739
// one of the above mentioned nodes. It has to be wrapped because otherwise
 
5740
// Select(N) returns N. So the raw TargetGlobalAddress nodes, etc. can only
 
5741
// be used to form addressing mode. These wrapped nodes will be selected
 
5742
// into MOV32ri.
 
5743
SDValue
 
5744
X86TargetLowering::LowerConstantPool(SDValue Op, SelectionDAG &DAG) const {
 
5745
  ConstantPoolSDNode *CP = cast<ConstantPoolSDNode>(Op);
 
5746
 
 
5747
  // In PIC mode (unless we're in RIPRel PIC mode) we add an offset to the
 
5748
  // global base reg.
 
5749
  unsigned char OpFlag = 0;
 
5750
  unsigned WrapperKind = X86ISD::Wrapper;
 
5751
  CodeModel::Model M = getTargetMachine().getCodeModel();
 
5752
 
 
5753
  if (Subtarget->isPICStyleRIPRel() &&
 
5754
      (M == CodeModel::Small || M == CodeModel::Kernel))
 
5755
    WrapperKind = X86ISD::WrapperRIP;
 
5756
  else if (Subtarget->isPICStyleGOT())
 
5757
    OpFlag = X86II::MO_GOTOFF;
 
5758
  else if (Subtarget->isPICStyleStubPIC())
 
5759
    OpFlag = X86II::MO_PIC_BASE_OFFSET;
 
5760
 
 
5761
  SDValue Result = DAG.getTargetConstantPool(CP->getConstVal(), getPointerTy(),
 
5762
                                             CP->getAlignment(),
 
5763
                                             CP->getOffset(), OpFlag);
 
5764
  DebugLoc DL = CP->getDebugLoc();
 
5765
  Result = DAG.getNode(WrapperKind, DL, getPointerTy(), Result);
 
5766
  // With PIC, the address is actually $g + Offset.
 
5767
  if (OpFlag) {
 
5768
    Result = DAG.getNode(ISD::ADD, DL, getPointerTy(),
 
5769
                         DAG.getNode(X86ISD::GlobalBaseReg,
 
5770
                                     DebugLoc(), getPointerTy()),
 
5771
                         Result);
 
5772
  }
 
5773
 
 
5774
  return Result;
 
5775
}
 
5776
 
 
5777
SDValue X86TargetLowering::LowerJumpTable(SDValue Op, SelectionDAG &DAG) const {
 
5778
  JumpTableSDNode *JT = cast<JumpTableSDNode>(Op);
 
5779
 
 
5780
  // In PIC mode (unless we're in RIPRel PIC mode) we add an offset to the
 
5781
  // global base reg.
 
5782
  unsigned char OpFlag = 0;
 
5783
  unsigned WrapperKind = X86ISD::Wrapper;
 
5784
  CodeModel::Model M = getTargetMachine().getCodeModel();
 
5785
 
 
5786
  if (Subtarget->isPICStyleRIPRel() &&
 
5787
      (M == CodeModel::Small || M == CodeModel::Kernel))
 
5788
    WrapperKind = X86ISD::WrapperRIP;
 
5789
  else if (Subtarget->isPICStyleGOT())
 
5790
    OpFlag = X86II::MO_GOTOFF;
 
5791
  else if (Subtarget->isPICStyleStubPIC())
 
5792
    OpFlag = X86II::MO_PIC_BASE_OFFSET;
 
5793
 
 
5794
  SDValue Result = DAG.getTargetJumpTable(JT->getIndex(), getPointerTy(),
 
5795
                                          OpFlag);
 
5796
  DebugLoc DL = JT->getDebugLoc();
 
5797
  Result = DAG.getNode(WrapperKind, DL, getPointerTy(), Result);
 
5798
 
 
5799
  // With PIC, the address is actually $g + Offset.
 
5800
  if (OpFlag) {
 
5801
    Result = DAG.getNode(ISD::ADD, DL, getPointerTy(),
 
5802
                         DAG.getNode(X86ISD::GlobalBaseReg,
 
5803
                                     DebugLoc(), getPointerTy()),
 
5804
                         Result);
 
5805
  }
 
5806
 
 
5807
  return Result;
 
5808
}
 
5809
 
 
5810
SDValue
 
5811
X86TargetLowering::LowerExternalSymbol(SDValue Op, SelectionDAG &DAG) const {
 
5812
  const char *Sym = cast<ExternalSymbolSDNode>(Op)->getSymbol();
 
5813
 
 
5814
  // In PIC mode (unless we're in RIPRel PIC mode) we add an offset to the
 
5815
  // global base reg.
 
5816
  unsigned char OpFlag = 0;
 
5817
  unsigned WrapperKind = X86ISD::Wrapper;
 
5818
  CodeModel::Model M = getTargetMachine().getCodeModel();
 
5819
 
 
5820
  if (Subtarget->isPICStyleRIPRel() &&
 
5821
      (M == CodeModel::Small || M == CodeModel::Kernel))
 
5822
    WrapperKind = X86ISD::WrapperRIP;
 
5823
  else if (Subtarget->isPICStyleGOT())
 
5824
    OpFlag = X86II::MO_GOTOFF;
 
5825
  else if (Subtarget->isPICStyleStubPIC())
 
5826
    OpFlag = X86II::MO_PIC_BASE_OFFSET;
 
5827
 
 
5828
  SDValue Result = DAG.getTargetExternalSymbol(Sym, getPointerTy(), OpFlag);
 
5829
 
 
5830
  DebugLoc DL = Op.getDebugLoc();
 
5831
  Result = DAG.getNode(WrapperKind, DL, getPointerTy(), Result);
 
5832
 
 
5833
 
 
5834
  // With PIC, the address is actually $g + Offset.
 
5835
  if (getTargetMachine().getRelocationModel() == Reloc::PIC_ &&
 
5836
      !Subtarget->is64Bit()) {
 
5837
    Result = DAG.getNode(ISD::ADD, DL, getPointerTy(),
 
5838
                         DAG.getNode(X86ISD::GlobalBaseReg,
 
5839
                                     DebugLoc(), getPointerTy()),
 
5840
                         Result);
 
5841
  }
 
5842
 
 
5843
  return Result;
 
5844
}
 
5845
 
 
5846
SDValue
 
5847
X86TargetLowering::LowerBlockAddress(SDValue Op, SelectionDAG &DAG) const {
 
5848
  // Create the TargetBlockAddressAddress node.
 
5849
  unsigned char OpFlags =
 
5850
    Subtarget->ClassifyBlockAddressReference();
 
5851
  CodeModel::Model M = getTargetMachine().getCodeModel();
 
5852
  const BlockAddress *BA = cast<BlockAddressSDNode>(Op)->getBlockAddress();
 
5853
  DebugLoc dl = Op.getDebugLoc();
 
5854
  SDValue Result = DAG.getBlockAddress(BA, getPointerTy(),
 
5855
                                       /*isTarget=*/true, OpFlags);
 
5856
 
 
5857
  if (Subtarget->isPICStyleRIPRel() &&
 
5858
      (M == CodeModel::Small || M == CodeModel::Kernel))
 
5859
    Result = DAG.getNode(X86ISD::WrapperRIP, dl, getPointerTy(), Result);
 
5860
  else
 
5861
    Result = DAG.getNode(X86ISD::Wrapper, dl, getPointerTy(), Result);
 
5862
 
 
5863
  // With PIC, the address is actually $g + Offset.
 
5864
  if (isGlobalRelativeToPICBase(OpFlags)) {
 
5865
    Result = DAG.getNode(ISD::ADD, dl, getPointerTy(),
 
5866
                         DAG.getNode(X86ISD::GlobalBaseReg, dl, getPointerTy()),
 
5867
                         Result);
 
5868
  }
 
5869
 
 
5870
  return Result;
 
5871
}
 
5872
 
 
5873
SDValue
 
5874
X86TargetLowering::LowerGlobalAddress(const GlobalValue *GV, DebugLoc dl,
 
5875
                                      int64_t Offset,
 
5876
                                      SelectionDAG &DAG) const {
 
5877
  // Create the TargetGlobalAddress node, folding in the constant
 
5878
  // offset if it is legal.
 
5879
  unsigned char OpFlags =
 
5880
    Subtarget->ClassifyGlobalReference(GV, getTargetMachine());
 
5881
  CodeModel::Model M = getTargetMachine().getCodeModel();
 
5882
  SDValue Result;
 
5883
  if (OpFlags == X86II::MO_NO_FLAG &&
 
5884
      X86::isOffsetSuitableForCodeModel(Offset, M)) {
 
5885
    // A direct static reference to a global.
 
5886
    Result = DAG.getTargetGlobalAddress(GV, dl, getPointerTy(), Offset);
 
5887
    Offset = 0;
 
5888
  } else {
 
5889
    Result = DAG.getTargetGlobalAddress(GV, dl, getPointerTy(), 0, OpFlags);
 
5890
  }
 
5891
 
 
5892
  if (Subtarget->isPICStyleRIPRel() &&
 
5893
      (M == CodeModel::Small || M == CodeModel::Kernel))
 
5894
    Result = DAG.getNode(X86ISD::WrapperRIP, dl, getPointerTy(), Result);
 
5895
  else
 
5896
    Result = DAG.getNode(X86ISD::Wrapper, dl, getPointerTy(), Result);
 
5897
 
 
5898
  // With PIC, the address is actually $g + Offset.
 
5899
  if (isGlobalRelativeToPICBase(OpFlags)) {
 
5900
    Result = DAG.getNode(ISD::ADD, dl, getPointerTy(),
 
5901
                         DAG.getNode(X86ISD::GlobalBaseReg, dl, getPointerTy()),
 
5902
                         Result);
 
5903
  }
 
5904
 
 
5905
  // For globals that require a load from a stub to get the address, emit the
 
5906
  // load.
 
5907
  if (isGlobalStubReference(OpFlags))
 
5908
    Result = DAG.getLoad(getPointerTy(), dl, DAG.getEntryNode(), Result,
 
5909
                         PseudoSourceValue::getGOT(), 0, false, false, 0);
 
5910
 
 
5911
  // If there was a non-zero offset that we didn't fold, create an explicit
 
5912
  // addition for it.
 
5913
  if (Offset != 0)
 
5914
    Result = DAG.getNode(ISD::ADD, dl, getPointerTy(), Result,
 
5915
                         DAG.getConstant(Offset, getPointerTy()));
 
5916
 
 
5917
  return Result;
 
5918
}
 
5919
 
 
5920
SDValue
 
5921
X86TargetLowering::LowerGlobalAddress(SDValue Op, SelectionDAG &DAG) const {
 
5922
  const GlobalValue *GV = cast<GlobalAddressSDNode>(Op)->getGlobal();
 
5923
  int64_t Offset = cast<GlobalAddressSDNode>(Op)->getOffset();
 
5924
  return LowerGlobalAddress(GV, Op.getDebugLoc(), Offset, DAG);
 
5925
}
 
5926
 
 
5927
static SDValue
 
5928
GetTLSADDR(SelectionDAG &DAG, SDValue Chain, GlobalAddressSDNode *GA,
 
5929
           SDValue *InFlag, const EVT PtrVT, unsigned ReturnReg,
 
5930
           unsigned char OperandFlags) {
 
5931
  MachineFrameInfo *MFI = DAG.getMachineFunction().getFrameInfo();
 
5932
  SDVTList NodeTys = DAG.getVTList(MVT::Other, MVT::Flag);
 
5933
  DebugLoc dl = GA->getDebugLoc();
 
5934
  SDValue TGA = DAG.getTargetGlobalAddress(GA->getGlobal(), dl,
 
5935
                                           GA->getValueType(0),
 
5936
                                           GA->getOffset(),
 
5937
                                           OperandFlags);
 
5938
  if (InFlag) {
 
5939
    SDValue Ops[] = { Chain,  TGA, *InFlag };
 
5940
    Chain = DAG.getNode(X86ISD::TLSADDR, dl, NodeTys, Ops, 3);
 
5941
  } else {
 
5942
    SDValue Ops[]  = { Chain, TGA };
 
5943
    Chain = DAG.getNode(X86ISD::TLSADDR, dl, NodeTys, Ops, 2);
 
5944
  }
 
5945
 
 
5946
  // TLSADDR will be codegen'ed as call. Inform MFI that function has calls.
 
5947
  MFI->setAdjustsStack(true);
 
5948
 
 
5949
  SDValue Flag = Chain.getValue(1);
 
5950
  return DAG.getCopyFromReg(Chain, dl, ReturnReg, PtrVT, Flag);
 
5951
}
 
5952
 
 
5953
// Lower ISD::GlobalTLSAddress using the "general dynamic" model, 32 bit
 
5954
static SDValue
 
5955
LowerToTLSGeneralDynamicModel32(GlobalAddressSDNode *GA, SelectionDAG &DAG,
 
5956
                                const EVT PtrVT) {
 
5957
  SDValue InFlag;
 
5958
  DebugLoc dl = GA->getDebugLoc();  // ? function entry point might be better
 
5959
  SDValue Chain = DAG.getCopyToReg(DAG.getEntryNode(), dl, X86::EBX,
 
5960
                                     DAG.getNode(X86ISD::GlobalBaseReg,
 
5961
                                                 DebugLoc(), PtrVT), InFlag);
 
5962
  InFlag = Chain.getValue(1);
 
5963
 
 
5964
  return GetTLSADDR(DAG, Chain, GA, &InFlag, PtrVT, X86::EAX, X86II::MO_TLSGD);
 
5965
}
 
5966
 
 
5967
// Lower ISD::GlobalTLSAddress using the "general dynamic" model, 64 bit
 
5968
static SDValue
 
5969
LowerToTLSGeneralDynamicModel64(GlobalAddressSDNode *GA, SelectionDAG &DAG,
 
5970
                                const EVT PtrVT) {
 
5971
  return GetTLSADDR(DAG, DAG.getEntryNode(), GA, NULL, PtrVT,
 
5972
                    X86::RAX, X86II::MO_TLSGD);
 
5973
}
 
5974
 
 
5975
// Lower ISD::GlobalTLSAddress using the "initial exec" (for no-pic) or
 
5976
// "local exec" model.
 
5977
static SDValue LowerToTLSExecModel(GlobalAddressSDNode *GA, SelectionDAG &DAG,
 
5978
                                   const EVT PtrVT, TLSModel::Model model,
 
5979
                                   bool is64Bit) {
 
5980
  DebugLoc dl = GA->getDebugLoc();
 
5981
  // Get the Thread Pointer
 
5982
  SDValue Base = DAG.getNode(X86ISD::SegmentBaseAddress,
 
5983
                             DebugLoc(), PtrVT,
 
5984
                             DAG.getRegister(is64Bit? X86::FS : X86::GS,
 
5985
                                             MVT::i32));
 
5986
 
 
5987
  SDValue ThreadPointer = DAG.getLoad(PtrVT, dl, DAG.getEntryNode(), Base,
 
5988
                                      NULL, 0, false, false, 0);
 
5989
 
 
5990
  unsigned char OperandFlags = 0;
 
5991
  // Most TLS accesses are not RIP relative, even on x86-64.  One exception is
 
5992
  // initialexec.
 
5993
  unsigned WrapperKind = X86ISD::Wrapper;
 
5994
  if (model == TLSModel::LocalExec) {
 
5995
    OperandFlags = is64Bit ? X86II::MO_TPOFF : X86II::MO_NTPOFF;
 
5996
  } else if (is64Bit) {
 
5997
    assert(model == TLSModel::InitialExec);
 
5998
    OperandFlags = X86II::MO_GOTTPOFF;
 
5999
    WrapperKind = X86ISD::WrapperRIP;
 
6000
  } else {
 
6001
    assert(model == TLSModel::InitialExec);
 
6002
    OperandFlags = X86II::MO_INDNTPOFF;
 
6003
  }
 
6004
 
 
6005
  // emit "addl x@ntpoff,%eax" (local exec) or "addl x@indntpoff,%eax" (initial
 
6006
  // exec)
 
6007
  SDValue TGA = DAG.getTargetGlobalAddress(GA->getGlobal(), dl, 
 
6008
                                           GA->getValueType(0),
 
6009
                                           GA->getOffset(), OperandFlags);
 
6010
  SDValue Offset = DAG.getNode(WrapperKind, dl, PtrVT, TGA);
 
6011
 
 
6012
  if (model == TLSModel::InitialExec)
 
6013
    Offset = DAG.getLoad(PtrVT, dl, DAG.getEntryNode(), Offset,
 
6014
                         PseudoSourceValue::getGOT(), 0, false, false, 0);
 
6015
 
 
6016
  // The address of the thread local variable is the add of the thread
 
6017
  // pointer with the offset of the variable.
 
6018
  return DAG.getNode(ISD::ADD, dl, PtrVT, ThreadPointer, Offset);
 
6019
}
 
6020
 
 
6021
SDValue
 
6022
X86TargetLowering::LowerGlobalTLSAddress(SDValue Op, SelectionDAG &DAG) const {
 
6023
  
 
6024
  GlobalAddressSDNode *GA = cast<GlobalAddressSDNode>(Op);
 
6025
  const GlobalValue *GV = GA->getGlobal();
 
6026
 
 
6027
  if (Subtarget->isTargetELF()) {
 
6028
    // TODO: implement the "local dynamic" model
 
6029
    // TODO: implement the "initial exec"model for pic executables
 
6030
    
 
6031
    // If GV is an alias then use the aliasee for determining
 
6032
    // thread-localness.
 
6033
    if (const GlobalAlias *GA = dyn_cast<GlobalAlias>(GV))
 
6034
      GV = GA->resolveAliasedGlobal(false);
 
6035
    
 
6036
    TLSModel::Model model 
 
6037
      = getTLSModel(GV, getTargetMachine().getRelocationModel());
 
6038
    
 
6039
    switch (model) {
 
6040
      case TLSModel::GeneralDynamic:
 
6041
      case TLSModel::LocalDynamic: // not implemented
 
6042
        if (Subtarget->is64Bit())
 
6043
          return LowerToTLSGeneralDynamicModel64(GA, DAG, getPointerTy());
 
6044
        return LowerToTLSGeneralDynamicModel32(GA, DAG, getPointerTy());
 
6045
        
 
6046
      case TLSModel::InitialExec:
 
6047
      case TLSModel::LocalExec:
 
6048
        return LowerToTLSExecModel(GA, DAG, getPointerTy(), model,
 
6049
                                   Subtarget->is64Bit());
 
6050
    }
 
6051
  } else if (Subtarget->isTargetDarwin()) {
 
6052
    // Darwin only has one model of TLS.  Lower to that.
 
6053
    unsigned char OpFlag = 0;
 
6054
    unsigned WrapperKind = Subtarget->isPICStyleRIPRel() ?
 
6055
                           X86ISD::WrapperRIP : X86ISD::Wrapper;
 
6056
    
 
6057
    // In PIC mode (unless we're in RIPRel PIC mode) we add an offset to the
 
6058
    // global base reg.
 
6059
    bool PIC32 = (getTargetMachine().getRelocationModel() == Reloc::PIC_) &&
 
6060
                  !Subtarget->is64Bit();
 
6061
    if (PIC32)
 
6062
      OpFlag = X86II::MO_TLVP_PIC_BASE;
 
6063
    else
 
6064
      OpFlag = X86II::MO_TLVP;
 
6065
    DebugLoc DL = Op.getDebugLoc();    
 
6066
    SDValue Result = DAG.getTargetGlobalAddress(GA->getGlobal(), DL,
 
6067
                                                getPointerTy(),
 
6068
                                                GA->getOffset(), OpFlag);
 
6069
    SDValue Offset = DAG.getNode(WrapperKind, DL, getPointerTy(), Result);
 
6070
  
 
6071
    // With PIC32, the address is actually $g + Offset.
 
6072
    if (PIC32)
 
6073
      Offset = DAG.getNode(ISD::ADD, DL, getPointerTy(),
 
6074
                           DAG.getNode(X86ISD::GlobalBaseReg,
 
6075
                                       DebugLoc(), getPointerTy()),
 
6076
                           Offset);
 
6077
    
 
6078
    // Lowering the machine isd will make sure everything is in the right
 
6079
    // location.
 
6080
    SDValue Args[] = { Offset };
 
6081
    SDValue Chain = DAG.getNode(X86ISD::TLSCALL, DL, MVT::Other, Args, 1);
 
6082
    
 
6083
    // TLSCALL will be codegen'ed as call. Inform MFI that function has calls.
 
6084
    MachineFrameInfo *MFI = DAG.getMachineFunction().getFrameInfo();
 
6085
    MFI->setAdjustsStack(true);
 
6086
 
 
6087
    // And our return value (tls address) is in the standard call return value
 
6088
    // location.
 
6089
    unsigned Reg = Subtarget->is64Bit() ? X86::RAX : X86::EAX;
 
6090
    return DAG.getCopyFromReg(Chain, DL, Reg, getPointerTy());
 
6091
  }
 
6092
  
 
6093
  assert(false &&
 
6094
         "TLS not implemented for this target.");
 
6095
 
 
6096
  llvm_unreachable("Unreachable");
 
6097
  return SDValue();
 
6098
}
 
6099
 
 
6100
 
 
6101
/// LowerShift - Lower SRA_PARTS and friends, which return two i32 values and
 
6102
/// take a 2 x i32 value to shift plus a shift amount.
 
6103
SDValue X86TargetLowering::LowerShift(SDValue Op, SelectionDAG &DAG) const {
 
6104
  assert(Op.getNumOperands() == 3 && "Not a double-shift!");
 
6105
  EVT VT = Op.getValueType();
 
6106
  unsigned VTBits = VT.getSizeInBits();
 
6107
  DebugLoc dl = Op.getDebugLoc();
 
6108
  bool isSRA = Op.getOpcode() == ISD::SRA_PARTS;
 
6109
  SDValue ShOpLo = Op.getOperand(0);
 
6110
  SDValue ShOpHi = Op.getOperand(1);
 
6111
  SDValue ShAmt  = Op.getOperand(2);
 
6112
  SDValue Tmp1 = isSRA ? DAG.getNode(ISD::SRA, dl, VT, ShOpHi,
 
6113
                                     DAG.getConstant(VTBits - 1, MVT::i8))
 
6114
                       : DAG.getConstant(0, VT);
 
6115
 
 
6116
  SDValue Tmp2, Tmp3;
 
6117
  if (Op.getOpcode() == ISD::SHL_PARTS) {
 
6118
    Tmp2 = DAG.getNode(X86ISD::SHLD, dl, VT, ShOpHi, ShOpLo, ShAmt);
 
6119
    Tmp3 = DAG.getNode(ISD::SHL, dl, VT, ShOpLo, ShAmt);
 
6120
  } else {
 
6121
    Tmp2 = DAG.getNode(X86ISD::SHRD, dl, VT, ShOpLo, ShOpHi, ShAmt);
 
6122
    Tmp3 = DAG.getNode(isSRA ? ISD::SRA : ISD::SRL, dl, VT, ShOpHi, ShAmt);
 
6123
  }
 
6124
 
 
6125
  SDValue AndNode = DAG.getNode(ISD::AND, dl, MVT::i8, ShAmt,
 
6126
                                DAG.getConstant(VTBits, MVT::i8));
 
6127
  SDValue Cond = DAG.getNode(X86ISD::CMP, dl, MVT::i32,
 
6128
                             AndNode, DAG.getConstant(0, MVT::i8));
 
6129
 
 
6130
  SDValue Hi, Lo;
 
6131
  SDValue CC = DAG.getConstant(X86::COND_NE, MVT::i8);
 
6132
  SDValue Ops0[4] = { Tmp2, Tmp3, CC, Cond };
 
6133
  SDValue Ops1[4] = { Tmp3, Tmp1, CC, Cond };
 
6134
 
 
6135
  if (Op.getOpcode() == ISD::SHL_PARTS) {
 
6136
    Hi = DAG.getNode(X86ISD::CMOV, dl, VT, Ops0, 4);
 
6137
    Lo = DAG.getNode(X86ISD::CMOV, dl, VT, Ops1, 4);
 
6138
  } else {
 
6139
    Lo = DAG.getNode(X86ISD::CMOV, dl, VT, Ops0, 4);
 
6140
    Hi = DAG.getNode(X86ISD::CMOV, dl, VT, Ops1, 4);
 
6141
  }
 
6142
 
 
6143
  SDValue Ops[2] = { Lo, Hi };
 
6144
  return DAG.getMergeValues(Ops, 2, dl);
 
6145
}
 
6146
 
 
6147
SDValue X86TargetLowering::LowerSINT_TO_FP(SDValue Op,
 
6148
                                           SelectionDAG &DAG) const {
 
6149
  EVT SrcVT = Op.getOperand(0).getValueType();
 
6150
 
 
6151
  if (SrcVT.isVector()) {
 
6152
    if (SrcVT == MVT::v2i32 && Op.getValueType() == MVT::v2f64) {
 
6153
      return Op;
 
6154
    }
 
6155
    return SDValue();
 
6156
  }
 
6157
 
 
6158
  assert(SrcVT.getSimpleVT() <= MVT::i64 && SrcVT.getSimpleVT() >= MVT::i16 &&
 
6159
         "Unknown SINT_TO_FP to lower!");
 
6160
 
 
6161
  // These are really Legal; return the operand so the caller accepts it as
 
6162
  // Legal.
 
6163
  if (SrcVT == MVT::i32 && isScalarFPTypeInSSEReg(Op.getValueType()))
 
6164
    return Op;
 
6165
  if (SrcVT == MVT::i64 && isScalarFPTypeInSSEReg(Op.getValueType()) &&
 
6166
      Subtarget->is64Bit()) {
 
6167
    return Op;
 
6168
  }
 
6169
 
 
6170
  DebugLoc dl = Op.getDebugLoc();
 
6171
  unsigned Size = SrcVT.getSizeInBits()/8;
 
6172
  MachineFunction &MF = DAG.getMachineFunction();
 
6173
  int SSFI = MF.getFrameInfo()->CreateStackObject(Size, Size, false);
 
6174
  SDValue StackSlot = DAG.getFrameIndex(SSFI, getPointerTy());
 
6175
  SDValue Chain = DAG.getStore(DAG.getEntryNode(), dl, Op.getOperand(0),
 
6176
                               StackSlot,
 
6177
                               PseudoSourceValue::getFixedStack(SSFI), 0,
 
6178
                               false, false, 0);
 
6179
  return BuildFILD(Op, SrcVT, Chain, StackSlot, DAG);
 
6180
}
 
6181
 
 
6182
SDValue X86TargetLowering::BuildFILD(SDValue Op, EVT SrcVT, SDValue Chain,
 
6183
                                     SDValue StackSlot, 
 
6184
                                     SelectionDAG &DAG) const {
 
6185
  // Build the FILD
 
6186
  DebugLoc dl = Op.getDebugLoc();
 
6187
  SDVTList Tys;
 
6188
  bool useSSE = isScalarFPTypeInSSEReg(Op.getValueType());
 
6189
  if (useSSE)
 
6190
    Tys = DAG.getVTList(MVT::f64, MVT::Other, MVT::Flag);
 
6191
  else
 
6192
    Tys = DAG.getVTList(Op.getValueType(), MVT::Other);
 
6193
  SDValue Ops[] = { Chain, StackSlot, DAG.getValueType(SrcVT) };
 
6194
  SDValue Result = DAG.getNode(useSSE ? X86ISD::FILD_FLAG : X86ISD::FILD, dl,
 
6195
                               Tys, Ops, array_lengthof(Ops));
 
6196
 
 
6197
  if (useSSE) {
 
6198
    Chain = Result.getValue(1);
 
6199
    SDValue InFlag = Result.getValue(2);
 
6200
 
 
6201
    // FIXME: Currently the FST is flagged to the FILD_FLAG. This
 
6202
    // shouldn't be necessary except that RFP cannot be live across
 
6203
    // multiple blocks. When stackifier is fixed, they can be uncoupled.
 
6204
    MachineFunction &MF = DAG.getMachineFunction();
 
6205
    int SSFI = MF.getFrameInfo()->CreateStackObject(8, 8, false);
 
6206
    SDValue StackSlot = DAG.getFrameIndex(SSFI, getPointerTy());
 
6207
    Tys = DAG.getVTList(MVT::Other);
 
6208
    SDValue Ops[] = {
 
6209
      Chain, Result, StackSlot, DAG.getValueType(Op.getValueType()), InFlag
 
6210
    };
 
6211
    Chain = DAG.getNode(X86ISD::FST, dl, Tys, Ops, array_lengthof(Ops));
 
6212
    Result = DAG.getLoad(Op.getValueType(), dl, Chain, StackSlot,
 
6213
                         PseudoSourceValue::getFixedStack(SSFI), 0,
 
6214
                         false, false, 0);
 
6215
  }
 
6216
 
 
6217
  return Result;
 
6218
}
 
6219
 
 
6220
// LowerUINT_TO_FP_i64 - 64-bit unsigned integer to double expansion.
 
6221
SDValue X86TargetLowering::LowerUINT_TO_FP_i64(SDValue Op,
 
6222
                                               SelectionDAG &DAG) const {
 
6223
  // This algorithm is not obvious. Here it is in C code, more or less:
 
6224
  /*
 
6225
    double uint64_to_double( uint32_t hi, uint32_t lo ) {
 
6226
      static const __m128i exp = { 0x4330000045300000ULL, 0 };
 
6227
      static const __m128d bias = { 0x1.0p84, 0x1.0p52 };
 
6228
 
 
6229
      // Copy ints to xmm registers.
 
6230
      __m128i xh = _mm_cvtsi32_si128( hi );
 
6231
      __m128i xl = _mm_cvtsi32_si128( lo );
 
6232
 
 
6233
      // Combine into low half of a single xmm register.
 
6234
      __m128i x = _mm_unpacklo_epi32( xh, xl );
 
6235
      __m128d d;
 
6236
      double sd;
 
6237
 
 
6238
      // Merge in appropriate exponents to give the integer bits the right
 
6239
      // magnitude.
 
6240
      x = _mm_unpacklo_epi32( x, exp );
 
6241
 
 
6242
      // Subtract away the biases to deal with the IEEE-754 double precision
 
6243
      // implicit 1.
 
6244
      d = _mm_sub_pd( (__m128d) x, bias );
 
6245
 
 
6246
      // All conversions up to here are exact. The correctly rounded result is
 
6247
      // calculated using the current rounding mode using the following
 
6248
      // horizontal add.
 
6249
      d = _mm_add_sd( d, _mm_unpackhi_pd( d, d ) );
 
6250
      _mm_store_sd( &sd, d );   // Because we are returning doubles in XMM, this
 
6251
                                // store doesn't really need to be here (except
 
6252
                                // maybe to zero the other double)
 
6253
      return sd;
 
6254
    }
 
6255
  */
 
6256
 
 
6257
  DebugLoc dl = Op.getDebugLoc();
 
6258
  LLVMContext *Context = DAG.getContext();
 
6259
 
 
6260
  // Build some magic constants.
 
6261
  std::vector<Constant*> CV0;
 
6262
  CV0.push_back(ConstantInt::get(*Context, APInt(32, 0x45300000)));
 
6263
  CV0.push_back(ConstantInt::get(*Context, APInt(32, 0x43300000)));
 
6264
  CV0.push_back(ConstantInt::get(*Context, APInt(32, 0)));
 
6265
  CV0.push_back(ConstantInt::get(*Context, APInt(32, 0)));
 
6266
  Constant *C0 = ConstantVector::get(CV0);
 
6267
  SDValue CPIdx0 = DAG.getConstantPool(C0, getPointerTy(), 16);
 
6268
 
 
6269
  std::vector<Constant*> CV1;
 
6270
  CV1.push_back(
 
6271
    ConstantFP::get(*Context, APFloat(APInt(64, 0x4530000000000000ULL))));
 
6272
  CV1.push_back(
 
6273
    ConstantFP::get(*Context, APFloat(APInt(64, 0x4330000000000000ULL))));
 
6274
  Constant *C1 = ConstantVector::get(CV1);
 
6275
  SDValue CPIdx1 = DAG.getConstantPool(C1, getPointerTy(), 16);
 
6276
 
 
6277
  SDValue XR1 = DAG.getNode(ISD::SCALAR_TO_VECTOR, dl, MVT::v4i32,
 
6278
                            DAG.getNode(ISD::EXTRACT_ELEMENT, dl, MVT::i32,
 
6279
                                        Op.getOperand(0),
 
6280
                                        DAG.getIntPtrConstant(1)));
 
6281
  SDValue XR2 = DAG.getNode(ISD::SCALAR_TO_VECTOR, dl, MVT::v4i32,
 
6282
                            DAG.getNode(ISD::EXTRACT_ELEMENT, dl, MVT::i32,
 
6283
                                        Op.getOperand(0),
 
6284
                                        DAG.getIntPtrConstant(0)));
 
6285
  SDValue Unpck1 = getUnpackl(DAG, dl, MVT::v4i32, XR1, XR2);
 
6286
  SDValue CLod0 = DAG.getLoad(MVT::v4i32, dl, DAG.getEntryNode(), CPIdx0,
 
6287
                              PseudoSourceValue::getConstantPool(), 0,
 
6288
                              false, false, 16);
 
6289
  SDValue Unpck2 = getUnpackl(DAG, dl, MVT::v4i32, Unpck1, CLod0);
 
6290
  SDValue XR2F = DAG.getNode(ISD::BIT_CONVERT, dl, MVT::v2f64, Unpck2);
 
6291
  SDValue CLod1 = DAG.getLoad(MVT::v2f64, dl, CLod0.getValue(1), CPIdx1,
 
6292
                              PseudoSourceValue::getConstantPool(), 0,
 
6293
                              false, false, 16);
 
6294
  SDValue Sub = DAG.getNode(ISD::FSUB, dl, MVT::v2f64, XR2F, CLod1);
 
6295
 
 
6296
  // Add the halves; easiest way is to swap them into another reg first.
 
6297
  int ShufMask[2] = { 1, -1 };
 
6298
  SDValue Shuf = DAG.getVectorShuffle(MVT::v2f64, dl, Sub,
 
6299
                                      DAG.getUNDEF(MVT::v2f64), ShufMask);
 
6300
  SDValue Add = DAG.getNode(ISD::FADD, dl, MVT::v2f64, Shuf, Sub);
 
6301
  return DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, MVT::f64, Add,
 
6302
                     DAG.getIntPtrConstant(0));
 
6303
}
 
6304
 
 
6305
// LowerUINT_TO_FP_i32 - 32-bit unsigned integer to float expansion.
 
6306
SDValue X86TargetLowering::LowerUINT_TO_FP_i32(SDValue Op,
 
6307
                                               SelectionDAG &DAG) const {
 
6308
  DebugLoc dl = Op.getDebugLoc();
 
6309
  // FP constant to bias correct the final result.
 
6310
  SDValue Bias = DAG.getConstantFP(BitsToDouble(0x4330000000000000ULL),
 
6311
                                   MVT::f64);
 
6312
 
 
6313
  // Load the 32-bit value into an XMM register.
 
6314
  SDValue Load = DAG.getNode(ISD::SCALAR_TO_VECTOR, dl, MVT::v4i32,
 
6315
                             DAG.getNode(ISD::EXTRACT_ELEMENT, dl, MVT::i32,
 
6316
                                         Op.getOperand(0),
 
6317
                                         DAG.getIntPtrConstant(0)));
 
6318
 
 
6319
  Load = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, MVT::f64,
 
6320
                     DAG.getNode(ISD::BIT_CONVERT, dl, MVT::v2f64, Load),
 
6321
                     DAG.getIntPtrConstant(0));
 
6322
 
 
6323
  // Or the load with the bias.
 
6324
  SDValue Or = DAG.getNode(ISD::OR, dl, MVT::v2i64,
 
6325
                           DAG.getNode(ISD::BIT_CONVERT, dl, MVT::v2i64,
 
6326
                                       DAG.getNode(ISD::SCALAR_TO_VECTOR, dl,
 
6327
                                                   MVT::v2f64, Load)),
 
6328
                           DAG.getNode(ISD::BIT_CONVERT, dl, MVT::v2i64,
 
6329
                                       DAG.getNode(ISD::SCALAR_TO_VECTOR, dl,
 
6330
                                                   MVT::v2f64, Bias)));
 
6331
  Or = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, MVT::f64,
 
6332
                   DAG.getNode(ISD::BIT_CONVERT, dl, MVT::v2f64, Or),
 
6333
                   DAG.getIntPtrConstant(0));
 
6334
 
 
6335
  // Subtract the bias.
 
6336
  SDValue Sub = DAG.getNode(ISD::FSUB, dl, MVT::f64, Or, Bias);
 
6337
 
 
6338
  // Handle final rounding.
 
6339
  EVT DestVT = Op.getValueType();
 
6340
 
 
6341
  if (DestVT.bitsLT(MVT::f64)) {
 
6342
    return DAG.getNode(ISD::FP_ROUND, dl, DestVT, Sub,
 
6343
                       DAG.getIntPtrConstant(0));
 
6344
  } else if (DestVT.bitsGT(MVT::f64)) {
 
6345
    return DAG.getNode(ISD::FP_EXTEND, dl, DestVT, Sub);
 
6346
  }
 
6347
 
 
6348
  // Handle final rounding.
 
6349
  return Sub;
 
6350
}
 
6351
 
 
6352
SDValue X86TargetLowering::LowerUINT_TO_FP(SDValue Op,
 
6353
                                           SelectionDAG &DAG) const {
 
6354
  SDValue N0 = Op.getOperand(0);
 
6355
  DebugLoc dl = Op.getDebugLoc();
 
6356
 
 
6357
  // Since UINT_TO_FP is legal (it's marked custom), dag combiner won't
 
6358
  // optimize it to a SINT_TO_FP when the sign bit is known zero. Perform
 
6359
  // the optimization here.
 
6360
  if (DAG.SignBitIsZero(N0))
 
6361
    return DAG.getNode(ISD::SINT_TO_FP, dl, Op.getValueType(), N0);
 
6362
 
 
6363
  EVT SrcVT = N0.getValueType();
 
6364
  EVT DstVT = Op.getValueType();
 
6365
  if (SrcVT == MVT::i64 && DstVT == MVT::f64 && X86ScalarSSEf64)
 
6366
    return LowerUINT_TO_FP_i64(Op, DAG);
 
6367
  else if (SrcVT == MVT::i32 && X86ScalarSSEf64)
 
6368
    return LowerUINT_TO_FP_i32(Op, DAG);
 
6369
 
 
6370
  // Make a 64-bit buffer, and use it to build an FILD.
 
6371
  SDValue StackSlot = DAG.CreateStackTemporary(MVT::i64);
 
6372
  if (SrcVT == MVT::i32) {
 
6373
    SDValue WordOff = DAG.getConstant(4, getPointerTy());
 
6374
    SDValue OffsetSlot = DAG.getNode(ISD::ADD, dl,
 
6375
                                     getPointerTy(), StackSlot, WordOff);
 
6376
    SDValue Store1 = DAG.getStore(DAG.getEntryNode(), dl, Op.getOperand(0),
 
6377
                                  StackSlot, NULL, 0, false, false, 0);
 
6378
    SDValue Store2 = DAG.getStore(Store1, dl, DAG.getConstant(0, MVT::i32),
 
6379
                                  OffsetSlot, NULL, 0, false, false, 0);
 
6380
    SDValue Fild = BuildFILD(Op, MVT::i64, Store2, StackSlot, DAG);
 
6381
    return Fild;
 
6382
  }
 
6383
 
 
6384
  assert(SrcVT == MVT::i64 && "Unexpected type in UINT_TO_FP");
 
6385
  SDValue Store = DAG.getStore(DAG.getEntryNode(), dl, Op.getOperand(0),
 
6386
                                StackSlot, NULL, 0, false, false, 0);
 
6387
  // For i64 source, we need to add the appropriate power of 2 if the input
 
6388
  // was negative.  This is the same as the optimization in
 
6389
  // DAGTypeLegalizer::ExpandIntOp_UNIT_TO_FP, and for it to be safe here,
 
6390
  // we must be careful to do the computation in x87 extended precision, not
 
6391
  // in SSE. (The generic code can't know it's OK to do this, or how to.)
 
6392
  SDVTList Tys = DAG.getVTList(MVT::f80, MVT::Other);
 
6393
  SDValue Ops[] = { Store, StackSlot, DAG.getValueType(MVT::i64) };
 
6394
  SDValue Fild = DAG.getNode(X86ISD::FILD, dl, Tys, Ops, 3);
 
6395
 
 
6396
  APInt FF(32, 0x5F800000ULL);
 
6397
 
 
6398
  // Check whether the sign bit is set.
 
6399
  SDValue SignSet = DAG.getSetCC(dl, getSetCCResultType(MVT::i64),
 
6400
                                 Op.getOperand(0), DAG.getConstant(0, MVT::i64),
 
6401
                                 ISD::SETLT);
 
6402
 
 
6403
  // Build a 64 bit pair (0, FF) in the constant pool, with FF in the lo bits.
 
6404
  SDValue FudgePtr = DAG.getConstantPool(
 
6405
                             ConstantInt::get(*DAG.getContext(), FF.zext(64)),
 
6406
                                         getPointerTy());
 
6407
 
 
6408
  // Get a pointer to FF if the sign bit was set, or to 0 otherwise.
 
6409
  SDValue Zero = DAG.getIntPtrConstant(0);
 
6410
  SDValue Four = DAG.getIntPtrConstant(4);
 
6411
  SDValue Offset = DAG.getNode(ISD::SELECT, dl, Zero.getValueType(), SignSet,
 
6412
                               Zero, Four);
 
6413
  FudgePtr = DAG.getNode(ISD::ADD, dl, getPointerTy(), FudgePtr, Offset);
 
6414
 
 
6415
  // Load the value out, extending it from f32 to f80.
 
6416
  // FIXME: Avoid the extend by constructing the right constant pool?
 
6417
  SDValue Fudge = DAG.getExtLoad(ISD::EXTLOAD, MVT::f80, dl, DAG.getEntryNode(),
 
6418
                                 FudgePtr, PseudoSourceValue::getConstantPool(),
 
6419
                                 0, MVT::f32, false, false, 4);
 
6420
  // Extend everything to 80 bits to force it to be done on x87.
 
6421
  SDValue Add = DAG.getNode(ISD::FADD, dl, MVT::f80, Fild, Fudge);
 
6422
  return DAG.getNode(ISD::FP_ROUND, dl, DstVT, Add, DAG.getIntPtrConstant(0));
 
6423
}
 
6424
 
 
6425
std::pair<SDValue,SDValue> X86TargetLowering::
 
6426
FP_TO_INTHelper(SDValue Op, SelectionDAG &DAG, bool IsSigned) const {
 
6427
  DebugLoc dl = Op.getDebugLoc();
 
6428
 
 
6429
  EVT DstTy = Op.getValueType();
 
6430
 
 
6431
  if (!IsSigned) {
 
6432
    assert(DstTy == MVT::i32 && "Unexpected FP_TO_UINT");
 
6433
    DstTy = MVT::i64;
 
6434
  }
 
6435
 
 
6436
  assert(DstTy.getSimpleVT() <= MVT::i64 &&
 
6437
         DstTy.getSimpleVT() >= MVT::i16 &&
 
6438
         "Unknown FP_TO_SINT to lower!");
 
6439
 
 
6440
  // These are really Legal.
 
6441
  if (DstTy == MVT::i32 &&
 
6442
      isScalarFPTypeInSSEReg(Op.getOperand(0).getValueType()))
 
6443
    return std::make_pair(SDValue(), SDValue());
 
6444
  if (Subtarget->is64Bit() &&
 
6445
      DstTy == MVT::i64 &&
 
6446
      isScalarFPTypeInSSEReg(Op.getOperand(0).getValueType()))
 
6447
    return std::make_pair(SDValue(), SDValue());
 
6448
 
 
6449
  // We lower FP->sint64 into FISTP64, followed by a load, all to a temporary
 
6450
  // stack slot.
 
6451
  MachineFunction &MF = DAG.getMachineFunction();
 
6452
  unsigned MemSize = DstTy.getSizeInBits()/8;
 
6453
  int SSFI = MF.getFrameInfo()->CreateStackObject(MemSize, MemSize, false);
 
6454
  SDValue StackSlot = DAG.getFrameIndex(SSFI, getPointerTy());
 
6455
 
 
6456
  unsigned Opc;
 
6457
  switch (DstTy.getSimpleVT().SimpleTy) {
 
6458
  default: llvm_unreachable("Invalid FP_TO_SINT to lower!");
 
6459
  case MVT::i16: Opc = X86ISD::FP_TO_INT16_IN_MEM; break;
 
6460
  case MVT::i32: Opc = X86ISD::FP_TO_INT32_IN_MEM; break;
 
6461
  case MVT::i64: Opc = X86ISD::FP_TO_INT64_IN_MEM; break;
 
6462
  }
 
6463
 
 
6464
  SDValue Chain = DAG.getEntryNode();
 
6465
  SDValue Value = Op.getOperand(0);
 
6466
  if (isScalarFPTypeInSSEReg(Op.getOperand(0).getValueType())) {
 
6467
    assert(DstTy == MVT::i64 && "Invalid FP_TO_SINT to lower!");
 
6468
    Chain = DAG.getStore(Chain, dl, Value, StackSlot,
 
6469
                         PseudoSourceValue::getFixedStack(SSFI), 0,
 
6470
                         false, false, 0);
 
6471
    SDVTList Tys = DAG.getVTList(Op.getOperand(0).getValueType(), MVT::Other);
 
6472
    SDValue Ops[] = {
 
6473
      Chain, StackSlot, DAG.getValueType(Op.getOperand(0).getValueType())
 
6474
    };
 
6475
    Value = DAG.getNode(X86ISD::FLD, dl, Tys, Ops, 3);
 
6476
    Chain = Value.getValue(1);
 
6477
    SSFI = MF.getFrameInfo()->CreateStackObject(MemSize, MemSize, false);
 
6478
    StackSlot = DAG.getFrameIndex(SSFI, getPointerTy());
 
6479
  }
 
6480
 
 
6481
  // Build the FP_TO_INT*_IN_MEM
 
6482
  SDValue Ops[] = { Chain, Value, StackSlot };
 
6483
  SDValue FIST = DAG.getNode(Opc, dl, MVT::Other, Ops, 3);
 
6484
 
 
6485
  return std::make_pair(FIST, StackSlot);
 
6486
}
 
6487
 
 
6488
SDValue X86TargetLowering::LowerFP_TO_SINT(SDValue Op,
 
6489
                                           SelectionDAG &DAG) const {
 
6490
  if (Op.getValueType().isVector()) {
 
6491
    if (Op.getValueType() == MVT::v2i32 &&
 
6492
        Op.getOperand(0).getValueType() == MVT::v2f64) {
 
6493
      return Op;
 
6494
    }
 
6495
    return SDValue();
 
6496
  }
 
6497
 
 
6498
  std::pair<SDValue,SDValue> Vals = FP_TO_INTHelper(Op, DAG, true);
 
6499
  SDValue FIST = Vals.first, StackSlot = Vals.second;
 
6500
  // If FP_TO_INTHelper failed, the node is actually supposed to be Legal.
 
6501
  if (FIST.getNode() == 0) return Op;
 
6502
 
 
6503
  // Load the result.
 
6504
  return DAG.getLoad(Op.getValueType(), Op.getDebugLoc(),
 
6505
                     FIST, StackSlot, NULL, 0, false, false, 0);
 
6506
}
 
6507
 
 
6508
SDValue X86TargetLowering::LowerFP_TO_UINT(SDValue Op,
 
6509
                                           SelectionDAG &DAG) const {
 
6510
  std::pair<SDValue,SDValue> Vals = FP_TO_INTHelper(Op, DAG, false);
 
6511
  SDValue FIST = Vals.first, StackSlot = Vals.second;
 
6512
  assert(FIST.getNode() && "Unexpected failure");
 
6513
 
 
6514
  // Load the result.
 
6515
  return DAG.getLoad(Op.getValueType(), Op.getDebugLoc(),
 
6516
                     FIST, StackSlot, NULL, 0, false, false, 0);
 
6517
}
 
6518
 
 
6519
SDValue X86TargetLowering::LowerFABS(SDValue Op,
 
6520
                                     SelectionDAG &DAG) const {
 
6521
  LLVMContext *Context = DAG.getContext();
 
6522
  DebugLoc dl = Op.getDebugLoc();
 
6523
  EVT VT = Op.getValueType();
 
6524
  EVT EltVT = VT;
 
6525
  if (VT.isVector())
 
6526
    EltVT = VT.getVectorElementType();
 
6527
  std::vector<Constant*> CV;
 
6528
  if (EltVT == MVT::f64) {
 
6529
    Constant *C = ConstantFP::get(*Context, APFloat(APInt(64, ~(1ULL << 63))));
 
6530
    CV.push_back(C);
 
6531
    CV.push_back(C);
 
6532
  } else {
 
6533
    Constant *C = ConstantFP::get(*Context, APFloat(APInt(32, ~(1U << 31))));
 
6534
    CV.push_back(C);
 
6535
    CV.push_back(C);
 
6536
    CV.push_back(C);
 
6537
    CV.push_back(C);
 
6538
  }
 
6539
  Constant *C = ConstantVector::get(CV);
 
6540
  SDValue CPIdx = DAG.getConstantPool(C, getPointerTy(), 16);
 
6541
  SDValue Mask = DAG.getLoad(VT, dl, DAG.getEntryNode(), CPIdx,
 
6542
                             PseudoSourceValue::getConstantPool(), 0,
 
6543
                             false, false, 16);
 
6544
  return DAG.getNode(X86ISD::FAND, dl, VT, Op.getOperand(0), Mask);
 
6545
}
 
6546
 
 
6547
SDValue X86TargetLowering::LowerFNEG(SDValue Op, SelectionDAG &DAG) const {
 
6548
  LLVMContext *Context = DAG.getContext();
 
6549
  DebugLoc dl = Op.getDebugLoc();
 
6550
  EVT VT = Op.getValueType();
 
6551
  EVT EltVT = VT;
 
6552
  if (VT.isVector())
 
6553
    EltVT = VT.getVectorElementType();
 
6554
  std::vector<Constant*> CV;
 
6555
  if (EltVT == MVT::f64) {
 
6556
    Constant *C = ConstantFP::get(*Context, APFloat(APInt(64, 1ULL << 63)));
 
6557
    CV.push_back(C);
 
6558
    CV.push_back(C);
 
6559
  } else {
 
6560
    Constant *C = ConstantFP::get(*Context, APFloat(APInt(32, 1U << 31)));
 
6561
    CV.push_back(C);
 
6562
    CV.push_back(C);
 
6563
    CV.push_back(C);
 
6564
    CV.push_back(C);
 
6565
  }
 
6566
  Constant *C = ConstantVector::get(CV);
 
6567
  SDValue CPIdx = DAG.getConstantPool(C, getPointerTy(), 16);
 
6568
  SDValue Mask = DAG.getLoad(VT, dl, DAG.getEntryNode(), CPIdx,
 
6569
                             PseudoSourceValue::getConstantPool(), 0,
 
6570
                             false, false, 16);
 
6571
  if (VT.isVector()) {
 
6572
    return DAG.getNode(ISD::BIT_CONVERT, dl, VT,
 
6573
                       DAG.getNode(ISD::XOR, dl, MVT::v2i64,
 
6574
                    DAG.getNode(ISD::BIT_CONVERT, dl, MVT::v2i64,
 
6575
                                Op.getOperand(0)),
 
6576
                    DAG.getNode(ISD::BIT_CONVERT, dl, MVT::v2i64, Mask)));
 
6577
  } else {
 
6578
    return DAG.getNode(X86ISD::FXOR, dl, VT, Op.getOperand(0), Mask);
 
6579
  }
 
6580
}
 
6581
 
 
6582
SDValue X86TargetLowering::LowerFCOPYSIGN(SDValue Op, SelectionDAG &DAG) const {
 
6583
  LLVMContext *Context = DAG.getContext();
 
6584
  SDValue Op0 = Op.getOperand(0);
 
6585
  SDValue Op1 = Op.getOperand(1);
 
6586
  DebugLoc dl = Op.getDebugLoc();
 
6587
  EVT VT = Op.getValueType();
 
6588
  EVT SrcVT = Op1.getValueType();
 
6589
 
 
6590
  // If second operand is smaller, extend it first.
 
6591
  if (SrcVT.bitsLT(VT)) {
 
6592
    Op1 = DAG.getNode(ISD::FP_EXTEND, dl, VT, Op1);
 
6593
    SrcVT = VT;
 
6594
  }
 
6595
  // And if it is bigger, shrink it first.
 
6596
  if (SrcVT.bitsGT(VT)) {
 
6597
    Op1 = DAG.getNode(ISD::FP_ROUND, dl, VT, Op1, DAG.getIntPtrConstant(1));
 
6598
    SrcVT = VT;
 
6599
  }
 
6600
 
 
6601
  // At this point the operands and the result should have the same
 
6602
  // type, and that won't be f80 since that is not custom lowered.
 
6603
 
 
6604
  // First get the sign bit of second operand.
 
6605
  std::vector<Constant*> CV;
 
6606
  if (SrcVT == MVT::f64) {
 
6607
    CV.push_back(ConstantFP::get(*Context, APFloat(APInt(64, 1ULL << 63))));
 
6608
    CV.push_back(ConstantFP::get(*Context, APFloat(APInt(64, 0))));
 
6609
  } else {
 
6610
    CV.push_back(ConstantFP::get(*Context, APFloat(APInt(32, 1U << 31))));
 
6611
    CV.push_back(ConstantFP::get(*Context, APFloat(APInt(32, 0))));
 
6612
    CV.push_back(ConstantFP::get(*Context, APFloat(APInt(32, 0))));
 
6613
    CV.push_back(ConstantFP::get(*Context, APFloat(APInt(32, 0))));
 
6614
  }
 
6615
  Constant *C = ConstantVector::get(CV);
 
6616
  SDValue CPIdx = DAG.getConstantPool(C, getPointerTy(), 16);
 
6617
  SDValue Mask1 = DAG.getLoad(SrcVT, dl, DAG.getEntryNode(), CPIdx,
 
6618
                              PseudoSourceValue::getConstantPool(), 0,
 
6619
                              false, false, 16);
 
6620
  SDValue SignBit = DAG.getNode(X86ISD::FAND, dl, SrcVT, Op1, Mask1);
 
6621
 
 
6622
  // Shift sign bit right or left if the two operands have different types.
 
6623
  if (SrcVT.bitsGT(VT)) {
 
6624
    // Op0 is MVT::f32, Op1 is MVT::f64.
 
6625
    SignBit = DAG.getNode(ISD::SCALAR_TO_VECTOR, dl, MVT::v2f64, SignBit);
 
6626
    SignBit = DAG.getNode(X86ISD::FSRL, dl, MVT::v2f64, SignBit,
 
6627
                          DAG.getConstant(32, MVT::i32));
 
6628
    SignBit = DAG.getNode(ISD::BIT_CONVERT, dl, MVT::v4f32, SignBit);
 
6629
    SignBit = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, MVT::f32, SignBit,
 
6630
                          DAG.getIntPtrConstant(0));
 
6631
  }
 
6632
 
 
6633
  // Clear first operand sign bit.
 
6634
  CV.clear();
 
6635
  if (VT == MVT::f64) {
 
6636
    CV.push_back(ConstantFP::get(*Context, APFloat(APInt(64, ~(1ULL << 63)))));
 
6637
    CV.push_back(ConstantFP::get(*Context, APFloat(APInt(64, 0))));
 
6638
  } else {
 
6639
    CV.push_back(ConstantFP::get(*Context, APFloat(APInt(32, ~(1U << 31)))));
 
6640
    CV.push_back(ConstantFP::get(*Context, APFloat(APInt(32, 0))));
 
6641
    CV.push_back(ConstantFP::get(*Context, APFloat(APInt(32, 0))));
 
6642
    CV.push_back(ConstantFP::get(*Context, APFloat(APInt(32, 0))));
 
6643
  }
 
6644
  C = ConstantVector::get(CV);
 
6645
  CPIdx = DAG.getConstantPool(C, getPointerTy(), 16);
 
6646
  SDValue Mask2 = DAG.getLoad(VT, dl, DAG.getEntryNode(), CPIdx,
 
6647
                              PseudoSourceValue::getConstantPool(), 0,
 
6648
                              false, false, 16);
 
6649
  SDValue Val = DAG.getNode(X86ISD::FAND, dl, VT, Op0, Mask2);
 
6650
 
 
6651
  // Or the value with the sign bit.
 
6652
  return DAG.getNode(X86ISD::FOR, dl, VT, Val, SignBit);
 
6653
}
 
6654
 
 
6655
/// Emit nodes that will be selected as "test Op0,Op0", or something
 
6656
/// equivalent.
 
6657
SDValue X86TargetLowering::EmitTest(SDValue Op, unsigned X86CC,
 
6658
                                    SelectionDAG &DAG) const {
 
6659
  DebugLoc dl = Op.getDebugLoc();
 
6660
 
 
6661
  // CF and OF aren't always set the way we want. Determine which
 
6662
  // of these we need.
 
6663
  bool NeedCF = false;
 
6664
  bool NeedOF = false;
 
6665
  switch (X86CC) {
 
6666
  default: break;
 
6667
  case X86::COND_A: case X86::COND_AE:
 
6668
  case X86::COND_B: case X86::COND_BE:
 
6669
    NeedCF = true;
 
6670
    break;
 
6671
  case X86::COND_G: case X86::COND_GE:
 
6672
  case X86::COND_L: case X86::COND_LE:
 
6673
  case X86::COND_O: case X86::COND_NO:
 
6674
    NeedOF = true;
 
6675
    break;
 
6676
  }
 
6677
 
 
6678
  // See if we can use the EFLAGS value from the operand instead of
 
6679
  // doing a separate TEST. TEST always sets OF and CF to 0, so unless
 
6680
  // we prove that the arithmetic won't overflow, we can't use OF or CF.
 
6681
  if (Op.getResNo() != 0 || NeedOF || NeedCF)
 
6682
    // Emit a CMP with 0, which is the TEST pattern.
 
6683
    return DAG.getNode(X86ISD::CMP, dl, MVT::i32, Op,
 
6684
                       DAG.getConstant(0, Op.getValueType()));
 
6685
 
 
6686
  unsigned Opcode = 0;
 
6687
  unsigned NumOperands = 0;
 
6688
  switch (Op.getNode()->getOpcode()) {
 
6689
  case ISD::ADD:
 
6690
    // Due to an isel shortcoming, be conservative if this add is likely to be
 
6691
    // selected as part of a load-modify-store instruction. When the root node
 
6692
    // in a match is a store, isel doesn't know how to remap non-chain non-flag
 
6693
    // uses of other nodes in the match, such as the ADD in this case. This
 
6694
    // leads to the ADD being left around and reselected, with the result being
 
6695
    // two adds in the output.  Alas, even if none our users are stores, that
 
6696
    // doesn't prove we're O.K.  Ergo, if we have any parents that aren't
 
6697
    // CopyToReg or SETCC, eschew INC/DEC.  A better fix seems to require
 
6698
    // climbing the DAG back to the root, and it doesn't seem to be worth the
 
6699
    // effort.
 
6700
    for (SDNode::use_iterator UI = Op.getNode()->use_begin(),
 
6701
           UE = Op.getNode()->use_end(); UI != UE; ++UI)
 
6702
      if (UI->getOpcode() != ISD::CopyToReg && UI->getOpcode() != ISD::SETCC)
 
6703
        goto default_case;
 
6704
 
 
6705
    if (ConstantSDNode *C =
 
6706
        dyn_cast<ConstantSDNode>(Op.getNode()->getOperand(1))) {
 
6707
      // An add of one will be selected as an INC.
 
6708
      if (C->getAPIntValue() == 1) {
 
6709
        Opcode = X86ISD::INC;
 
6710
        NumOperands = 1;
 
6711
        break;
 
6712
      }
 
6713
 
 
6714
      // An add of negative one (subtract of one) will be selected as a DEC.
 
6715
      if (C->getAPIntValue().isAllOnesValue()) {
 
6716
        Opcode = X86ISD::DEC;
 
6717
        NumOperands = 1;
 
6718
        break;
 
6719
      }
 
6720
    }
 
6721
 
 
6722
    // Otherwise use a regular EFLAGS-setting add.
 
6723
    Opcode = X86ISD::ADD;
 
6724
    NumOperands = 2;
 
6725
    break;
 
6726
  case ISD::AND: {
 
6727
    // If the primary and result isn't used, don't bother using X86ISD::AND,
 
6728
    // because a TEST instruction will be better.
 
6729
    bool NonFlagUse = false;
 
6730
    for (SDNode::use_iterator UI = Op.getNode()->use_begin(),
 
6731
           UE = Op.getNode()->use_end(); UI != UE; ++UI) {
 
6732
      SDNode *User = *UI;
 
6733
      unsigned UOpNo = UI.getOperandNo();
 
6734
      if (User->getOpcode() == ISD::TRUNCATE && User->hasOneUse()) {
 
6735
        // Look pass truncate.
 
6736
        UOpNo = User->use_begin().getOperandNo();
 
6737
        User = *User->use_begin();
 
6738
      }
 
6739
 
 
6740
      if (User->getOpcode() != ISD::BRCOND &&
 
6741
          User->getOpcode() != ISD::SETCC &&
 
6742
          (User->getOpcode() != ISD::SELECT || UOpNo != 0)) {
 
6743
        NonFlagUse = true;
 
6744
        break;
 
6745
      }
 
6746
    }
 
6747
 
 
6748
    if (!NonFlagUse)
 
6749
      break;
 
6750
  }
 
6751
    // FALL THROUGH
 
6752
  case ISD::SUB:
 
6753
  case ISD::OR:
 
6754
  case ISD::XOR:
 
6755
    // Due to the ISEL shortcoming noted above, be conservative if this op is
 
6756
    // likely to be selected as part of a load-modify-store instruction.
 
6757
    for (SDNode::use_iterator UI = Op.getNode()->use_begin(),
 
6758
           UE = Op.getNode()->use_end(); UI != UE; ++UI)
 
6759
      if (UI->getOpcode() == ISD::STORE)
 
6760
        goto default_case;
 
6761
 
 
6762
    // Otherwise use a regular EFLAGS-setting instruction.
 
6763
    switch (Op.getNode()->getOpcode()) {
 
6764
    default: llvm_unreachable("unexpected operator!");
 
6765
    case ISD::SUB: Opcode = X86ISD::SUB; break;
 
6766
    case ISD::OR:  Opcode = X86ISD::OR;  break;
 
6767
    case ISD::XOR: Opcode = X86ISD::XOR; break;
 
6768
    case ISD::AND: Opcode = X86ISD::AND; break;
 
6769
    }
 
6770
 
 
6771
    NumOperands = 2;
 
6772
    break;
 
6773
  case X86ISD::ADD:
 
6774
  case X86ISD::SUB:
 
6775
  case X86ISD::INC:
 
6776
  case X86ISD::DEC:
 
6777
  case X86ISD::OR:
 
6778
  case X86ISD::XOR:
 
6779
  case X86ISD::AND:
 
6780
    return SDValue(Op.getNode(), 1);
 
6781
  default:
 
6782
  default_case:
 
6783
    break;
 
6784
  }
 
6785
 
 
6786
  if (Opcode == 0)
 
6787
    // Emit a CMP with 0, which is the TEST pattern.
 
6788
    return DAG.getNode(X86ISD::CMP, dl, MVT::i32, Op,
 
6789
                       DAG.getConstant(0, Op.getValueType()));
 
6790
 
 
6791
  SDVTList VTs = DAG.getVTList(Op.getValueType(), MVT::i32);
 
6792
  SmallVector<SDValue, 4> Ops;
 
6793
  for (unsigned i = 0; i != NumOperands; ++i)
 
6794
    Ops.push_back(Op.getOperand(i));
 
6795
 
 
6796
  SDValue New = DAG.getNode(Opcode, dl, VTs, &Ops[0], NumOperands);
 
6797
  DAG.ReplaceAllUsesWith(Op, New);
 
6798
  return SDValue(New.getNode(), 1);
 
6799
}
 
6800
 
 
6801
/// Emit nodes that will be selected as "cmp Op0,Op1", or something
 
6802
/// equivalent.
 
6803
SDValue X86TargetLowering::EmitCmp(SDValue Op0, SDValue Op1, unsigned X86CC,
 
6804
                                   SelectionDAG &DAG) const {
 
6805
  if (ConstantSDNode *C = dyn_cast<ConstantSDNode>(Op1))
 
6806
    if (C->getAPIntValue() == 0)
 
6807
      return EmitTest(Op0, X86CC, DAG);
 
6808
 
 
6809
  DebugLoc dl = Op0.getDebugLoc();
 
6810
  return DAG.getNode(X86ISD::CMP, dl, MVT::i32, Op0, Op1);
 
6811
}
 
6812
 
 
6813
/// LowerToBT - Result of 'and' is compared against zero. Turn it into a BT node
 
6814
/// if it's possible.
 
6815
SDValue X86TargetLowering::LowerToBT(SDValue And, ISD::CondCode CC,
 
6816
                                     DebugLoc dl, SelectionDAG &DAG) const {
 
6817
  SDValue Op0 = And.getOperand(0);
 
6818
  SDValue Op1 = And.getOperand(1);
 
6819
  if (Op0.getOpcode() == ISD::TRUNCATE)
 
6820
    Op0 = Op0.getOperand(0);
 
6821
  if (Op1.getOpcode() == ISD::TRUNCATE)
 
6822
    Op1 = Op1.getOperand(0);
 
6823
 
 
6824
  SDValue LHS, RHS;
 
6825
  if (Op1.getOpcode() == ISD::SHL)
 
6826
    std::swap(Op0, Op1);
 
6827
  if (Op0.getOpcode() == ISD::SHL) {
 
6828
    if (ConstantSDNode *And00C = dyn_cast<ConstantSDNode>(Op0.getOperand(0)))
 
6829
      if (And00C->getZExtValue() == 1) {
 
6830
        // If we looked past a truncate, check that it's only truncating away
 
6831
        // known zeros.
 
6832
        unsigned BitWidth = Op0.getValueSizeInBits();
 
6833
        unsigned AndBitWidth = And.getValueSizeInBits();
 
6834
        if (BitWidth > AndBitWidth) {
 
6835
          APInt Mask = APInt::getAllOnesValue(BitWidth), Zeros, Ones;
 
6836
          DAG.ComputeMaskedBits(Op0, Mask, Zeros, Ones);
 
6837
          if (Zeros.countLeadingOnes() < BitWidth - AndBitWidth)
 
6838
            return SDValue();
 
6839
        }
 
6840
        LHS = Op1;
 
6841
        RHS = Op0.getOperand(1);
 
6842
      }
 
6843
  } else if (Op1.getOpcode() == ISD::Constant) {
 
6844
    ConstantSDNode *AndRHS = cast<ConstantSDNode>(Op1);
 
6845
    SDValue AndLHS = Op0;
 
6846
    if (AndRHS->getZExtValue() == 1 && AndLHS.getOpcode() == ISD::SRL) {
 
6847
      LHS = AndLHS.getOperand(0);
 
6848
      RHS = AndLHS.getOperand(1);
 
6849
    }
 
6850
  }
 
6851
 
 
6852
  if (LHS.getNode()) {
 
6853
    // If LHS is i8, promote it to i32 with any_extend.  There is no i8 BT
 
6854
    // instruction.  Since the shift amount is in-range-or-undefined, we know
 
6855
    // that doing a bittest on the i32 value is ok.  We extend to i32 because
 
6856
    // the encoding for the i16 version is larger than the i32 version.
 
6857
    // Also promote i16 to i32 for performance / code size reason.
 
6858
    if (LHS.getValueType() == MVT::i8 ||
 
6859
        LHS.getValueType() == MVT::i16)
 
6860
      LHS = DAG.getNode(ISD::ANY_EXTEND, dl, MVT::i32, LHS);
 
6861
 
 
6862
    // If the operand types disagree, extend the shift amount to match.  Since
 
6863
    // BT ignores high bits (like shifts) we can use anyextend.
 
6864
    if (LHS.getValueType() != RHS.getValueType())
 
6865
      RHS = DAG.getNode(ISD::ANY_EXTEND, dl, LHS.getValueType(), RHS);
 
6866
 
 
6867
    SDValue BT = DAG.getNode(X86ISD::BT, dl, MVT::i32, LHS, RHS);
 
6868
    unsigned Cond = CC == ISD::SETEQ ? X86::COND_AE : X86::COND_B;
 
6869
    return DAG.getNode(X86ISD::SETCC, dl, MVT::i8,
 
6870
                       DAG.getConstant(Cond, MVT::i8), BT);
 
6871
  }
 
6872
 
 
6873
  return SDValue();
 
6874
}
 
6875
 
 
6876
SDValue X86TargetLowering::LowerSETCC(SDValue Op, SelectionDAG &DAG) const {
 
6877
  assert(Op.getValueType() == MVT::i8 && "SetCC type must be 8-bit integer");
 
6878
  SDValue Op0 = Op.getOperand(0);
 
6879
  SDValue Op1 = Op.getOperand(1);
 
6880
  DebugLoc dl = Op.getDebugLoc();
 
6881
  ISD::CondCode CC = cast<CondCodeSDNode>(Op.getOperand(2))->get();
 
6882
 
 
6883
  // Optimize to BT if possible.
 
6884
  // Lower (X & (1 << N)) == 0 to BT(X, N).
 
6885
  // Lower ((X >>u N) & 1) != 0 to BT(X, N).
 
6886
  // Lower ((X >>s N) & 1) != 0 to BT(X, N).
 
6887
  if (Op0.getOpcode() == ISD::AND &&
 
6888
      Op0.hasOneUse() &&
 
6889
      Op1.getOpcode() == ISD::Constant &&
 
6890
      cast<ConstantSDNode>(Op1)->isNullValue() &&
 
6891
      (CC == ISD::SETEQ || CC == ISD::SETNE)) {
 
6892
    SDValue NewSetCC = LowerToBT(Op0, CC, dl, DAG);
 
6893
    if (NewSetCC.getNode())
 
6894
      return NewSetCC;
 
6895
  }
 
6896
 
 
6897
  // Look for "(setcc) == / != 1" to avoid unncessary setcc.
 
6898
  if (Op0.getOpcode() == X86ISD::SETCC &&
 
6899
      Op1.getOpcode() == ISD::Constant &&
 
6900
      (cast<ConstantSDNode>(Op1)->getZExtValue() == 1 ||
 
6901
       cast<ConstantSDNode>(Op1)->isNullValue()) &&
 
6902
      (CC == ISD::SETEQ || CC == ISD::SETNE)) {
 
6903
    X86::CondCode CCode = (X86::CondCode)Op0.getConstantOperandVal(0);
 
6904
    bool Invert = (CC == ISD::SETNE) ^
 
6905
      cast<ConstantSDNode>(Op1)->isNullValue();
 
6906
    if (Invert)
 
6907
      CCode = X86::GetOppositeBranchCondition(CCode);
 
6908
    return DAG.getNode(X86ISD::SETCC, dl, MVT::i8,
 
6909
                       DAG.getConstant(CCode, MVT::i8), Op0.getOperand(1));
 
6910
  }
 
6911
 
 
6912
  bool isFP = Op1.getValueType().isFloatingPoint();
 
6913
  unsigned X86CC = TranslateX86CC(CC, isFP, Op0, Op1, DAG);
 
6914
  if (X86CC == X86::COND_INVALID)
 
6915
    return SDValue();
 
6916
 
 
6917
  SDValue Cond = EmitCmp(Op0, Op1, X86CC, DAG);
 
6918
 
 
6919
  // Use sbb x, x to materialize carry bit into a GPR.
 
6920
  if (X86CC == X86::COND_B)
 
6921
    return DAG.getNode(ISD::AND, dl, MVT::i8,
 
6922
                       DAG.getNode(X86ISD::SETCC_CARRY, dl, MVT::i8,
 
6923
                                   DAG.getConstant(X86CC, MVT::i8), Cond),
 
6924
                       DAG.getConstant(1, MVT::i8));
 
6925
 
 
6926
  return DAG.getNode(X86ISD::SETCC, dl, MVT::i8,
 
6927
                     DAG.getConstant(X86CC, MVT::i8), Cond);
 
6928
}
 
6929
 
 
6930
SDValue X86TargetLowering::LowerVSETCC(SDValue Op, SelectionDAG &DAG) const {
 
6931
  SDValue Cond;
 
6932
  SDValue Op0 = Op.getOperand(0);
 
6933
  SDValue Op1 = Op.getOperand(1);
 
6934
  SDValue CC = Op.getOperand(2);
 
6935
  EVT VT = Op.getValueType();
 
6936
  ISD::CondCode SetCCOpcode = cast<CondCodeSDNode>(CC)->get();
 
6937
  bool isFP = Op.getOperand(1).getValueType().isFloatingPoint();
 
6938
  DebugLoc dl = Op.getDebugLoc();
 
6939
 
 
6940
  if (isFP) {
 
6941
    unsigned SSECC = 8;
 
6942
    EVT VT0 = Op0.getValueType();
 
6943
    assert(VT0 == MVT::v4f32 || VT0 == MVT::v2f64);
 
6944
    unsigned Opc = VT0 == MVT::v4f32 ? X86ISD::CMPPS : X86ISD::CMPPD;
 
6945
    bool Swap = false;
 
6946
 
 
6947
    switch (SetCCOpcode) {
 
6948
    default: break;
 
6949
    case ISD::SETOEQ:
 
6950
    case ISD::SETEQ:  SSECC = 0; break;
 
6951
    case ISD::SETOGT:
 
6952
    case ISD::SETGT: Swap = true; // Fallthrough
 
6953
    case ISD::SETLT:
 
6954
    case ISD::SETOLT: SSECC = 1; break;
 
6955
    case ISD::SETOGE:
 
6956
    case ISD::SETGE: Swap = true; // Fallthrough
 
6957
    case ISD::SETLE:
 
6958
    case ISD::SETOLE: SSECC = 2; break;
 
6959
    case ISD::SETUO:  SSECC = 3; break;
 
6960
    case ISD::SETUNE:
 
6961
    case ISD::SETNE:  SSECC = 4; break;
 
6962
    case ISD::SETULE: Swap = true;
 
6963
    case ISD::SETUGE: SSECC = 5; break;
 
6964
    case ISD::SETULT: Swap = true;
 
6965
    case ISD::SETUGT: SSECC = 6; break;
 
6966
    case ISD::SETO:   SSECC = 7; break;
 
6967
    }
 
6968
    if (Swap)
 
6969
      std::swap(Op0, Op1);
 
6970
 
 
6971
    // In the two special cases we can't handle, emit two comparisons.
 
6972
    if (SSECC == 8) {
 
6973
      if (SetCCOpcode == ISD::SETUEQ) {
 
6974
        SDValue UNORD, EQ;
 
6975
        UNORD = DAG.getNode(Opc, dl, VT, Op0, Op1, DAG.getConstant(3, MVT::i8));
 
6976
        EQ = DAG.getNode(Opc, dl, VT, Op0, Op1, DAG.getConstant(0, MVT::i8));
 
6977
        return DAG.getNode(ISD::OR, dl, VT, UNORD, EQ);
 
6978
      }
 
6979
      else if (SetCCOpcode == ISD::SETONE) {
 
6980
        SDValue ORD, NEQ;
 
6981
        ORD = DAG.getNode(Opc, dl, VT, Op0, Op1, DAG.getConstant(7, MVT::i8));
 
6982
        NEQ = DAG.getNode(Opc, dl, VT, Op0, Op1, DAG.getConstant(4, MVT::i8));
 
6983
        return DAG.getNode(ISD::AND, dl, VT, ORD, NEQ);
 
6984
      }
 
6985
      llvm_unreachable("Illegal FP comparison");
 
6986
    }
 
6987
    // Handle all other FP comparisons here.
 
6988
    return DAG.getNode(Opc, dl, VT, Op0, Op1, DAG.getConstant(SSECC, MVT::i8));
 
6989
  }
 
6990
 
 
6991
  // We are handling one of the integer comparisons here.  Since SSE only has
 
6992
  // GT and EQ comparisons for integer, swapping operands and multiple
 
6993
  // operations may be required for some comparisons.
 
6994
  unsigned Opc = 0, EQOpc = 0, GTOpc = 0;
 
6995
  bool Swap = false, Invert = false, FlipSigns = false;
 
6996
 
 
6997
  switch (VT.getSimpleVT().SimpleTy) {
 
6998
  default: break;
 
6999
  case MVT::v8i8:
 
7000
  case MVT::v16i8: EQOpc = X86ISD::PCMPEQB; GTOpc = X86ISD::PCMPGTB; break;
 
7001
  case MVT::v4i16:
 
7002
  case MVT::v8i16: EQOpc = X86ISD::PCMPEQW; GTOpc = X86ISD::PCMPGTW; break;
 
7003
  case MVT::v2i32:
 
7004
  case MVT::v4i32: EQOpc = X86ISD::PCMPEQD; GTOpc = X86ISD::PCMPGTD; break;
 
7005
  case MVT::v2i64: EQOpc = X86ISD::PCMPEQQ; GTOpc = X86ISD::PCMPGTQ; break;
 
7006
  }
 
7007
 
 
7008
  switch (SetCCOpcode) {
 
7009
  default: break;
 
7010
  case ISD::SETNE:  Invert = true;
 
7011
  case ISD::SETEQ:  Opc = EQOpc; break;
 
7012
  case ISD::SETLT:  Swap = true;
 
7013
  case ISD::SETGT:  Opc = GTOpc; break;
 
7014
  case ISD::SETGE:  Swap = true;
 
7015
  case ISD::SETLE:  Opc = GTOpc; Invert = true; break;
 
7016
  case ISD::SETULT: Swap = true;
 
7017
  case ISD::SETUGT: Opc = GTOpc; FlipSigns = true; break;
 
7018
  case ISD::SETUGE: Swap = true;
 
7019
  case ISD::SETULE: Opc = GTOpc; FlipSigns = true; Invert = true; break;
 
7020
  }
 
7021
  if (Swap)
 
7022
    std::swap(Op0, Op1);
 
7023
 
 
7024
  // Since SSE has no unsigned integer comparisons, we need to flip  the sign
 
7025
  // bits of the inputs before performing those operations.
 
7026
  if (FlipSigns) {
 
7027
    EVT EltVT = VT.getVectorElementType();
 
7028
    SDValue SignBit = DAG.getConstant(APInt::getSignBit(EltVT.getSizeInBits()),
 
7029
                                      EltVT);
 
7030
    std::vector<SDValue> SignBits(VT.getVectorNumElements(), SignBit);
 
7031
    SDValue SignVec = DAG.getNode(ISD::BUILD_VECTOR, dl, VT, &SignBits[0],
 
7032
                                    SignBits.size());
 
7033
    Op0 = DAG.getNode(ISD::XOR, dl, VT, Op0, SignVec);
 
7034
    Op1 = DAG.getNode(ISD::XOR, dl, VT, Op1, SignVec);
 
7035
  }
 
7036
 
 
7037
  SDValue Result = DAG.getNode(Opc, dl, VT, Op0, Op1);
 
7038
 
 
7039
  // If the logical-not of the result is required, perform that now.
 
7040
  if (Invert)
 
7041
    Result = DAG.getNOT(dl, Result, VT);
 
7042
 
 
7043
  return Result;
 
7044
}
 
7045
 
 
7046
// isX86LogicalCmp - Return true if opcode is a X86 logical comparison.
 
7047
static bool isX86LogicalCmp(SDValue Op) {
 
7048
  unsigned Opc = Op.getNode()->getOpcode();
 
7049
  if (Opc == X86ISD::CMP || Opc == X86ISD::COMI || Opc == X86ISD::UCOMI)
 
7050
    return true;
 
7051
  if (Op.getResNo() == 1 &&
 
7052
      (Opc == X86ISD::ADD ||
 
7053
       Opc == X86ISD::SUB ||
 
7054
       Opc == X86ISD::SMUL ||
 
7055
       Opc == X86ISD::UMUL ||
 
7056
       Opc == X86ISD::INC ||
 
7057
       Opc == X86ISD::DEC ||
 
7058
       Opc == X86ISD::OR ||
 
7059
       Opc == X86ISD::XOR ||
 
7060
       Opc == X86ISD::AND))
 
7061
    return true;
 
7062
 
 
7063
  return false;
 
7064
}
 
7065
 
 
7066
SDValue X86TargetLowering::LowerSELECT(SDValue Op, SelectionDAG &DAG) const {
 
7067
  bool addTest = true;
 
7068
  SDValue Cond  = Op.getOperand(0);
 
7069
  DebugLoc dl = Op.getDebugLoc();
 
7070
  SDValue CC;
 
7071
 
 
7072
  if (Cond.getOpcode() == ISD::SETCC) {
 
7073
    SDValue NewCond = LowerSETCC(Cond, DAG);
 
7074
    if (NewCond.getNode())
 
7075
      Cond = NewCond;
 
7076
  }
 
7077
 
 
7078
  // (select (x == 0), -1, 0) -> (sign_bit (x - 1))
 
7079
  SDValue Op1 = Op.getOperand(1);
 
7080
  SDValue Op2 = Op.getOperand(2);
 
7081
  if (Cond.getOpcode() == X86ISD::SETCC &&
 
7082
      cast<ConstantSDNode>(Cond.getOperand(0))->getZExtValue() == X86::COND_E) {
 
7083
    SDValue Cmp = Cond.getOperand(1);
 
7084
    if (Cmp.getOpcode() == X86ISD::CMP) {
 
7085
      ConstantSDNode *N1C = dyn_cast<ConstantSDNode>(Op1);
 
7086
      ConstantSDNode *N2C = dyn_cast<ConstantSDNode>(Op2);
 
7087
      ConstantSDNode *RHSC =
 
7088
        dyn_cast<ConstantSDNode>(Cmp.getOperand(1).getNode());
 
7089
      if (N1C && N1C->isAllOnesValue() &&
 
7090
          N2C && N2C->isNullValue() &&
 
7091
          RHSC && RHSC->isNullValue()) {
 
7092
        SDValue CmpOp0 = Cmp.getOperand(0);
 
7093
        Cmp = DAG.getNode(X86ISD::CMP, dl, MVT::i32,
 
7094
                          CmpOp0, DAG.getConstant(1, CmpOp0.getValueType()));
 
7095
        return DAG.getNode(X86ISD::SETCC_CARRY, dl, Op.getValueType(),
 
7096
                           DAG.getConstant(X86::COND_B, MVT::i8), Cmp);
 
7097
      }
 
7098
    }
 
7099
  }
 
7100
 
 
7101
  // Look pass (and (setcc_carry (cmp ...)), 1).
 
7102
  if (Cond.getOpcode() == ISD::AND &&
 
7103
      Cond.getOperand(0).getOpcode() == X86ISD::SETCC_CARRY) {
 
7104
    ConstantSDNode *C = dyn_cast<ConstantSDNode>(Cond.getOperand(1));
 
7105
    if (C && C->getAPIntValue() == 1) 
 
7106
      Cond = Cond.getOperand(0);
 
7107
  }
 
7108
 
 
7109
  // If condition flag is set by a X86ISD::CMP, then use it as the condition
 
7110
  // setting operand in place of the X86ISD::SETCC.
 
7111
  if (Cond.getOpcode() == X86ISD::SETCC ||
 
7112
      Cond.getOpcode() == X86ISD::SETCC_CARRY) {
 
7113
    CC = Cond.getOperand(0);
 
7114
 
 
7115
    SDValue Cmp = Cond.getOperand(1);
 
7116
    unsigned Opc = Cmp.getOpcode();
 
7117
    EVT VT = Op.getValueType();
 
7118
 
 
7119
    bool IllegalFPCMov = false;
 
7120
    if (VT.isFloatingPoint() && !VT.isVector() &&
 
7121
        !isScalarFPTypeInSSEReg(VT))  // FPStack?
 
7122
      IllegalFPCMov = !hasFPCMov(cast<ConstantSDNode>(CC)->getSExtValue());
 
7123
 
 
7124
    if ((isX86LogicalCmp(Cmp) && !IllegalFPCMov) ||
 
7125
        Opc == X86ISD::BT) { // FIXME
 
7126
      Cond = Cmp;
 
7127
      addTest = false;
 
7128
    }
 
7129
  }
 
7130
 
 
7131
  if (addTest) {
 
7132
    // Look pass the truncate.
 
7133
    if (Cond.getOpcode() == ISD::TRUNCATE)
 
7134
      Cond = Cond.getOperand(0);
 
7135
 
 
7136
    // We know the result of AND is compared against zero. Try to match
 
7137
    // it to BT.
 
7138
    if (Cond.getOpcode() == ISD::AND && Cond.hasOneUse()) { 
 
7139
      SDValue NewSetCC = LowerToBT(Cond, ISD::SETNE, dl, DAG);
 
7140
      if (NewSetCC.getNode()) {
 
7141
        CC = NewSetCC.getOperand(0);
 
7142
        Cond = NewSetCC.getOperand(1);
 
7143
        addTest = false;
 
7144
      }
 
7145
    }
 
7146
  }
 
7147
 
 
7148
  if (addTest) {
 
7149
    CC = DAG.getConstant(X86::COND_NE, MVT::i8);
 
7150
    Cond = EmitTest(Cond, X86::COND_NE, DAG);
 
7151
  }
 
7152
 
 
7153
  // X86ISD::CMOV means set the result (which is operand 1) to the RHS if
 
7154
  // condition is true.
 
7155
  SDVTList VTs = DAG.getVTList(Op.getValueType(), MVT::Flag);
 
7156
  SDValue Ops[] = { Op2, Op1, CC, Cond };
 
7157
  return DAG.getNode(X86ISD::CMOV, dl, VTs, Ops, array_lengthof(Ops));
 
7158
}
 
7159
 
 
7160
// isAndOrOfSingleUseSetCCs - Return true if node is an ISD::AND or
 
7161
// ISD::OR of two X86ISD::SETCC nodes each of which has no other use apart
 
7162
// from the AND / OR.
 
7163
static bool isAndOrOfSetCCs(SDValue Op, unsigned &Opc) {
 
7164
  Opc = Op.getOpcode();
 
7165
  if (Opc != ISD::OR && Opc != ISD::AND)
 
7166
    return false;
 
7167
  return (Op.getOperand(0).getOpcode() == X86ISD::SETCC &&
 
7168
          Op.getOperand(0).hasOneUse() &&
 
7169
          Op.getOperand(1).getOpcode() == X86ISD::SETCC &&
 
7170
          Op.getOperand(1).hasOneUse());
 
7171
}
 
7172
 
 
7173
// isXor1OfSetCC - Return true if node is an ISD::XOR of a X86ISD::SETCC and
 
7174
// 1 and that the SETCC node has a single use.
 
7175
static bool isXor1OfSetCC(SDValue Op) {
 
7176
  if (Op.getOpcode() != ISD::XOR)
 
7177
    return false;
 
7178
  ConstantSDNode *N1C = dyn_cast<ConstantSDNode>(Op.getOperand(1));
 
7179
  if (N1C && N1C->getAPIntValue() == 1) {
 
7180
    return Op.getOperand(0).getOpcode() == X86ISD::SETCC &&
 
7181
      Op.getOperand(0).hasOneUse();
 
7182
  }
 
7183
  return false;
 
7184
}
 
7185
 
 
7186
SDValue X86TargetLowering::LowerBRCOND(SDValue Op, SelectionDAG &DAG) const {
 
7187
  bool addTest = true;
 
7188
  SDValue Chain = Op.getOperand(0);
 
7189
  SDValue Cond  = Op.getOperand(1);
 
7190
  SDValue Dest  = Op.getOperand(2);
 
7191
  DebugLoc dl = Op.getDebugLoc();
 
7192
  SDValue CC;
 
7193
 
 
7194
  if (Cond.getOpcode() == ISD::SETCC) {
 
7195
    SDValue NewCond = LowerSETCC(Cond, DAG);
 
7196
    if (NewCond.getNode())
 
7197
      Cond = NewCond;
 
7198
  }
 
7199
#if 0
 
7200
  // FIXME: LowerXALUO doesn't handle these!!
 
7201
  else if (Cond.getOpcode() == X86ISD::ADD  ||
 
7202
           Cond.getOpcode() == X86ISD::SUB  ||
 
7203
           Cond.getOpcode() == X86ISD::SMUL ||
 
7204
           Cond.getOpcode() == X86ISD::UMUL)
 
7205
    Cond = LowerXALUO(Cond, DAG);
 
7206
#endif
 
7207
 
 
7208
  // Look pass (and (setcc_carry (cmp ...)), 1).
 
7209
  if (Cond.getOpcode() == ISD::AND &&
 
7210
      Cond.getOperand(0).getOpcode() == X86ISD::SETCC_CARRY) {
 
7211
    ConstantSDNode *C = dyn_cast<ConstantSDNode>(Cond.getOperand(1));
 
7212
    if (C && C->getAPIntValue() == 1) 
 
7213
      Cond = Cond.getOperand(0);
 
7214
  }
 
7215
 
 
7216
  // If condition flag is set by a X86ISD::CMP, then use it as the condition
 
7217
  // setting operand in place of the X86ISD::SETCC.
 
7218
  if (Cond.getOpcode() == X86ISD::SETCC ||
 
7219
      Cond.getOpcode() == X86ISD::SETCC_CARRY) {
 
7220
    CC = Cond.getOperand(0);
 
7221
 
 
7222
    SDValue Cmp = Cond.getOperand(1);
 
7223
    unsigned Opc = Cmp.getOpcode();
 
7224
    // FIXME: WHY THE SPECIAL CASING OF LogicalCmp??
 
7225
    if (isX86LogicalCmp(Cmp) || Opc == X86ISD::BT) {
 
7226
      Cond = Cmp;
 
7227
      addTest = false;
 
7228
    } else {
 
7229
      switch (cast<ConstantSDNode>(CC)->getZExtValue()) {
 
7230
      default: break;
 
7231
      case X86::COND_O:
 
7232
      case X86::COND_B:
 
7233
        // These can only come from an arithmetic instruction with overflow,
 
7234
        // e.g. SADDO, UADDO.
 
7235
        Cond = Cond.getNode()->getOperand(1);
 
7236
        addTest = false;
 
7237
        break;
 
7238
      }
 
7239
    }
 
7240
  } else {
 
7241
    unsigned CondOpc;
 
7242
    if (Cond.hasOneUse() && isAndOrOfSetCCs(Cond, CondOpc)) {
 
7243
      SDValue Cmp = Cond.getOperand(0).getOperand(1);
 
7244
      if (CondOpc == ISD::OR) {
 
7245
        // Also, recognize the pattern generated by an FCMP_UNE. We can emit
 
7246
        // two branches instead of an explicit OR instruction with a
 
7247
        // separate test.
 
7248
        if (Cmp == Cond.getOperand(1).getOperand(1) &&
 
7249
            isX86LogicalCmp(Cmp)) {
 
7250
          CC = Cond.getOperand(0).getOperand(0);
 
7251
          Chain = DAG.getNode(X86ISD::BRCOND, dl, Op.getValueType(),
 
7252
                              Chain, Dest, CC, Cmp);
 
7253
          CC = Cond.getOperand(1).getOperand(0);
 
7254
          Cond = Cmp;
 
7255
          addTest = false;
 
7256
        }
 
7257
      } else { // ISD::AND
 
7258
        // Also, recognize the pattern generated by an FCMP_OEQ. We can emit
 
7259
        // two branches instead of an explicit AND instruction with a
 
7260
        // separate test. However, we only do this if this block doesn't
 
7261
        // have a fall-through edge, because this requires an explicit
 
7262
        // jmp when the condition is false.
 
7263
        if (Cmp == Cond.getOperand(1).getOperand(1) &&
 
7264
            isX86LogicalCmp(Cmp) &&
 
7265
            Op.getNode()->hasOneUse()) {
 
7266
          X86::CondCode CCode =
 
7267
            (X86::CondCode)Cond.getOperand(0).getConstantOperandVal(0);
 
7268
          CCode = X86::GetOppositeBranchCondition(CCode);
 
7269
          CC = DAG.getConstant(CCode, MVT::i8);
 
7270
          SDNode *User = *Op.getNode()->use_begin();
 
7271
          // Look for an unconditional branch following this conditional branch.
 
7272
          // We need this because we need to reverse the successors in order
 
7273
          // to implement FCMP_OEQ.
 
7274
          if (User->getOpcode() == ISD::BR) {
 
7275
            SDValue FalseBB = User->getOperand(1);
 
7276
            SDNode *NewBR =
 
7277
              DAG.UpdateNodeOperands(User, User->getOperand(0), Dest);
 
7278
            assert(NewBR == User);
 
7279
            (void)NewBR;
 
7280
            Dest = FalseBB;
 
7281
 
 
7282
            Chain = DAG.getNode(X86ISD::BRCOND, dl, Op.getValueType(),
 
7283
                                Chain, Dest, CC, Cmp);
 
7284
            X86::CondCode CCode =
 
7285
              (X86::CondCode)Cond.getOperand(1).getConstantOperandVal(0);
 
7286
            CCode = X86::GetOppositeBranchCondition(CCode);
 
7287
            CC = DAG.getConstant(CCode, MVT::i8);
 
7288
            Cond = Cmp;
 
7289
            addTest = false;
 
7290
          }
 
7291
        }
 
7292
      }
 
7293
    } else if (Cond.hasOneUse() && isXor1OfSetCC(Cond)) {
 
7294
      // Recognize for xorb (setcc), 1 patterns. The xor inverts the condition.
 
7295
      // It should be transformed during dag combiner except when the condition
 
7296
      // is set by a arithmetics with overflow node.
 
7297
      X86::CondCode CCode =
 
7298
        (X86::CondCode)Cond.getOperand(0).getConstantOperandVal(0);
 
7299
      CCode = X86::GetOppositeBranchCondition(CCode);
 
7300
      CC = DAG.getConstant(CCode, MVT::i8);
 
7301
      Cond = Cond.getOperand(0).getOperand(1);
 
7302
      addTest = false;
 
7303
    }
 
7304
  }
 
7305
 
 
7306
  if (addTest) {
 
7307
    // Look pass the truncate.
 
7308
    if (Cond.getOpcode() == ISD::TRUNCATE)
 
7309
      Cond = Cond.getOperand(0);
 
7310
 
 
7311
    // We know the result of AND is compared against zero. Try to match
 
7312
    // it to BT.
 
7313
    if (Cond.getOpcode() == ISD::AND && Cond.hasOneUse()) { 
 
7314
      SDValue NewSetCC = LowerToBT(Cond, ISD::SETNE, dl, DAG);
 
7315
      if (NewSetCC.getNode()) {
 
7316
        CC = NewSetCC.getOperand(0);
 
7317
        Cond = NewSetCC.getOperand(1);
 
7318
        addTest = false;
 
7319
      }
 
7320
    }
 
7321
  }
 
7322
 
 
7323
  if (addTest) {
 
7324
    CC = DAG.getConstant(X86::COND_NE, MVT::i8);
 
7325
    Cond = EmitTest(Cond, X86::COND_NE, DAG);
 
7326
  }
 
7327
  return DAG.getNode(X86ISD::BRCOND, dl, Op.getValueType(),
 
7328
                     Chain, Dest, CC, Cond);
 
7329
}
 
7330
 
 
7331
 
 
7332
// Lower dynamic stack allocation to _alloca call for Cygwin/Mingw targets.
 
7333
// Calls to _alloca is needed to probe the stack when allocating more than 4k
 
7334
// bytes in one go. Touching the stack at 4K increments is necessary to ensure
 
7335
// that the guard pages used by the OS virtual memory manager are allocated in
 
7336
// correct sequence.
 
7337
SDValue
 
7338
X86TargetLowering::LowerDYNAMIC_STACKALLOC(SDValue Op,
 
7339
                                           SelectionDAG &DAG) const {
 
7340
  assert(Subtarget->isTargetCygMing() &&
 
7341
         "This should be used only on Cygwin/Mingw targets");
 
7342
  DebugLoc dl = Op.getDebugLoc();
 
7343
 
 
7344
  // Get the inputs.
 
7345
  SDValue Chain = Op.getOperand(0);
 
7346
  SDValue Size  = Op.getOperand(1);
 
7347
  // FIXME: Ensure alignment here
 
7348
 
 
7349
  SDValue Flag;
 
7350
 
 
7351
  EVT SPTy = Subtarget->is64Bit() ? MVT::i64 : MVT::i32;
 
7352
 
 
7353
  Chain = DAG.getCopyToReg(Chain, dl, X86::EAX, Size, Flag);
 
7354
  Flag = Chain.getValue(1);
 
7355
 
 
7356
  SDVTList NodeTys = DAG.getVTList(MVT::Other, MVT::Flag);
 
7357
 
 
7358
  Chain = DAG.getNode(X86ISD::MINGW_ALLOCA, dl, NodeTys, Chain, Flag);
 
7359
  Flag = Chain.getValue(1);
 
7360
 
 
7361
  Chain = DAG.getCopyFromReg(Chain, dl, X86StackPtr, SPTy).getValue(1);
 
7362
 
 
7363
  SDValue Ops1[2] = { Chain.getValue(0), Chain };
 
7364
  return DAG.getMergeValues(Ops1, 2, dl);
 
7365
}
 
7366
 
 
7367
SDValue X86TargetLowering::LowerVASTART(SDValue Op, SelectionDAG &DAG) const {
 
7368
  MachineFunction &MF = DAG.getMachineFunction();
 
7369
  X86MachineFunctionInfo *FuncInfo = MF.getInfo<X86MachineFunctionInfo>();
 
7370
 
 
7371
  const Value *SV = cast<SrcValueSDNode>(Op.getOperand(2))->getValue();
 
7372
  DebugLoc dl = Op.getDebugLoc();
 
7373
 
 
7374
  if (!Subtarget->is64Bit()) {
 
7375
    // vastart just stores the address of the VarArgsFrameIndex slot into the
 
7376
    // memory location argument.
 
7377
    SDValue FR = DAG.getFrameIndex(FuncInfo->getVarArgsFrameIndex(),
 
7378
                                   getPointerTy());
 
7379
    return DAG.getStore(Op.getOperand(0), dl, FR, Op.getOperand(1), SV, 0,
 
7380
                        false, false, 0);
 
7381
  }
 
7382
 
 
7383
  // __va_list_tag:
 
7384
  //   gp_offset         (0 - 6 * 8)
 
7385
  //   fp_offset         (48 - 48 + 8 * 16)
 
7386
  //   overflow_arg_area (point to parameters coming in memory).
 
7387
  //   reg_save_area
 
7388
  SmallVector<SDValue, 8> MemOps;
 
7389
  SDValue FIN = Op.getOperand(1);
 
7390
  // Store gp_offset
 
7391
  SDValue Store = DAG.getStore(Op.getOperand(0), dl,
 
7392
                               DAG.getConstant(FuncInfo->getVarArgsGPOffset(),
 
7393
                                               MVT::i32),
 
7394
                               FIN, SV, 0, false, false, 0);
 
7395
  MemOps.push_back(Store);
 
7396
 
 
7397
  // Store fp_offset
 
7398
  FIN = DAG.getNode(ISD::ADD, dl, getPointerTy(),
 
7399
                    FIN, DAG.getIntPtrConstant(4));
 
7400
  Store = DAG.getStore(Op.getOperand(0), dl,
 
7401
                       DAG.getConstant(FuncInfo->getVarArgsFPOffset(),
 
7402
                                       MVT::i32),
 
7403
                       FIN, SV, 4, false, false, 0);
 
7404
  MemOps.push_back(Store);
 
7405
 
 
7406
  // Store ptr to overflow_arg_area
 
7407
  FIN = DAG.getNode(ISD::ADD, dl, getPointerTy(),
 
7408
                    FIN, DAG.getIntPtrConstant(4));
 
7409
  SDValue OVFIN = DAG.getFrameIndex(FuncInfo->getVarArgsFrameIndex(),
 
7410
                                    getPointerTy());
 
7411
  Store = DAG.getStore(Op.getOperand(0), dl, OVFIN, FIN, SV, 8,
 
7412
                       false, false, 0);
 
7413
  MemOps.push_back(Store);
 
7414
 
 
7415
  // Store ptr to reg_save_area.
 
7416
  FIN = DAG.getNode(ISD::ADD, dl, getPointerTy(),
 
7417
                    FIN, DAG.getIntPtrConstant(8));
 
7418
  SDValue RSFIN = DAG.getFrameIndex(FuncInfo->getRegSaveFrameIndex(),
 
7419
                                    getPointerTy());
 
7420
  Store = DAG.getStore(Op.getOperand(0), dl, RSFIN, FIN, SV, 16,
 
7421
                       false, false, 0);
 
7422
  MemOps.push_back(Store);
 
7423
  return DAG.getNode(ISD::TokenFactor, dl, MVT::Other,
 
7424
                     &MemOps[0], MemOps.size());
 
7425
}
 
7426
 
 
7427
SDValue X86TargetLowering::LowerVAARG(SDValue Op, SelectionDAG &DAG) const {
 
7428
  // X86-64 va_list is a struct { i32, i32, i8*, i8* }.
 
7429
  assert(Subtarget->is64Bit() && "This code only handles 64-bit va_arg!");
 
7430
 
 
7431
  report_fatal_error("VAArgInst is not yet implemented for x86-64!");
 
7432
  return SDValue();
 
7433
}
 
7434
 
 
7435
SDValue X86TargetLowering::LowerVACOPY(SDValue Op, SelectionDAG &DAG) const {
 
7436
  // X86-64 va_list is a struct { i32, i32, i8*, i8* }.
 
7437
  assert(Subtarget->is64Bit() && "This code only handles 64-bit va_copy!");
 
7438
  SDValue Chain = Op.getOperand(0);
 
7439
  SDValue DstPtr = Op.getOperand(1);
 
7440
  SDValue SrcPtr = Op.getOperand(2);
 
7441
  const Value *DstSV = cast<SrcValueSDNode>(Op.getOperand(3))->getValue();
 
7442
  const Value *SrcSV = cast<SrcValueSDNode>(Op.getOperand(4))->getValue();
 
7443
  DebugLoc dl = Op.getDebugLoc();
 
7444
 
 
7445
  return DAG.getMemcpy(Chain, dl, DstPtr, SrcPtr,
 
7446
                       DAG.getIntPtrConstant(24), 8, /*isVolatile*/false,
 
7447
                       false, DstSV, 0, SrcSV, 0);
 
7448
}
 
7449
 
 
7450
SDValue
 
7451
X86TargetLowering::LowerINTRINSIC_WO_CHAIN(SDValue Op, SelectionDAG &DAG) const {
 
7452
  DebugLoc dl = Op.getDebugLoc();
 
7453
  unsigned IntNo = cast<ConstantSDNode>(Op.getOperand(0))->getZExtValue();
 
7454
  switch (IntNo) {
 
7455
  default: return SDValue();    // Don't custom lower most intrinsics.
 
7456
  // Comparison intrinsics.
 
7457
  case Intrinsic::x86_sse_comieq_ss:
 
7458
  case Intrinsic::x86_sse_comilt_ss:
 
7459
  case Intrinsic::x86_sse_comile_ss:
 
7460
  case Intrinsic::x86_sse_comigt_ss:
 
7461
  case Intrinsic::x86_sse_comige_ss:
 
7462
  case Intrinsic::x86_sse_comineq_ss:
 
7463
  case Intrinsic::x86_sse_ucomieq_ss:
 
7464
  case Intrinsic::x86_sse_ucomilt_ss:
 
7465
  case Intrinsic::x86_sse_ucomile_ss:
 
7466
  case Intrinsic::x86_sse_ucomigt_ss:
 
7467
  case Intrinsic::x86_sse_ucomige_ss:
 
7468
  case Intrinsic::x86_sse_ucomineq_ss:
 
7469
  case Intrinsic::x86_sse2_comieq_sd:
 
7470
  case Intrinsic::x86_sse2_comilt_sd:
 
7471
  case Intrinsic::x86_sse2_comile_sd:
 
7472
  case Intrinsic::x86_sse2_comigt_sd:
 
7473
  case Intrinsic::x86_sse2_comige_sd:
 
7474
  case Intrinsic::x86_sse2_comineq_sd:
 
7475
  case Intrinsic::x86_sse2_ucomieq_sd:
 
7476
  case Intrinsic::x86_sse2_ucomilt_sd:
 
7477
  case Intrinsic::x86_sse2_ucomile_sd:
 
7478
  case Intrinsic::x86_sse2_ucomigt_sd:
 
7479
  case Intrinsic::x86_sse2_ucomige_sd:
 
7480
  case Intrinsic::x86_sse2_ucomineq_sd: {
 
7481
    unsigned Opc = 0;
 
7482
    ISD::CondCode CC = ISD::SETCC_INVALID;
 
7483
    switch (IntNo) {
 
7484
    default: break;
 
7485
    case Intrinsic::x86_sse_comieq_ss:
 
7486
    case Intrinsic::x86_sse2_comieq_sd:
 
7487
      Opc = X86ISD::COMI;
 
7488
      CC = ISD::SETEQ;
 
7489
      break;
 
7490
    case Intrinsic::x86_sse_comilt_ss:
 
7491
    case Intrinsic::x86_sse2_comilt_sd:
 
7492
      Opc = X86ISD::COMI;
 
7493
      CC = ISD::SETLT;
 
7494
      break;
 
7495
    case Intrinsic::x86_sse_comile_ss:
 
7496
    case Intrinsic::x86_sse2_comile_sd:
 
7497
      Opc = X86ISD::COMI;
 
7498
      CC = ISD::SETLE;
 
7499
      break;
 
7500
    case Intrinsic::x86_sse_comigt_ss:
 
7501
    case Intrinsic::x86_sse2_comigt_sd:
 
7502
      Opc = X86ISD::COMI;
 
7503
      CC = ISD::SETGT;
 
7504
      break;
 
7505
    case Intrinsic::x86_sse_comige_ss:
 
7506
    case Intrinsic::x86_sse2_comige_sd:
 
7507
      Opc = X86ISD::COMI;
 
7508
      CC = ISD::SETGE;
 
7509
      break;
 
7510
    case Intrinsic::x86_sse_comineq_ss:
 
7511
    case Intrinsic::x86_sse2_comineq_sd:
 
7512
      Opc = X86ISD::COMI;
 
7513
      CC = ISD::SETNE;
 
7514
      break;
 
7515
    case Intrinsic::x86_sse_ucomieq_ss:
 
7516
    case Intrinsic::x86_sse2_ucomieq_sd:
 
7517
      Opc = X86ISD::UCOMI;
 
7518
      CC = ISD::SETEQ;
 
7519
      break;
 
7520
    case Intrinsic::x86_sse_ucomilt_ss:
 
7521
    case Intrinsic::x86_sse2_ucomilt_sd:
 
7522
      Opc = X86ISD::UCOMI;
 
7523
      CC = ISD::SETLT;
 
7524
      break;
 
7525
    case Intrinsic::x86_sse_ucomile_ss:
 
7526
    case Intrinsic::x86_sse2_ucomile_sd:
 
7527
      Opc = X86ISD::UCOMI;
 
7528
      CC = ISD::SETLE;
 
7529
      break;
 
7530
    case Intrinsic::x86_sse_ucomigt_ss:
 
7531
    case Intrinsic::x86_sse2_ucomigt_sd:
 
7532
      Opc = X86ISD::UCOMI;
 
7533
      CC = ISD::SETGT;
 
7534
      break;
 
7535
    case Intrinsic::x86_sse_ucomige_ss:
 
7536
    case Intrinsic::x86_sse2_ucomige_sd:
 
7537
      Opc = X86ISD::UCOMI;
 
7538
      CC = ISD::SETGE;
 
7539
      break;
 
7540
    case Intrinsic::x86_sse_ucomineq_ss:
 
7541
    case Intrinsic::x86_sse2_ucomineq_sd:
 
7542
      Opc = X86ISD::UCOMI;
 
7543
      CC = ISD::SETNE;
 
7544
      break;
 
7545
    }
 
7546
 
 
7547
    SDValue LHS = Op.getOperand(1);
 
7548
    SDValue RHS = Op.getOperand(2);
 
7549
    unsigned X86CC = TranslateX86CC(CC, true, LHS, RHS, DAG);
 
7550
    assert(X86CC != X86::COND_INVALID && "Unexpected illegal condition!");
 
7551
    SDValue Cond = DAG.getNode(Opc, dl, MVT::i32, LHS, RHS);
 
7552
    SDValue SetCC = DAG.getNode(X86ISD::SETCC, dl, MVT::i8,
 
7553
                                DAG.getConstant(X86CC, MVT::i8), Cond);
 
7554
    return DAG.getNode(ISD::ZERO_EXTEND, dl, MVT::i32, SetCC);
 
7555
  }
 
7556
  // ptest and testp intrinsics. The intrinsic these come from are designed to
 
7557
  // return an integer value, not just an instruction so lower it to the ptest
 
7558
  // or testp pattern and a setcc for the result.
 
7559
  case Intrinsic::x86_sse41_ptestz:
 
7560
  case Intrinsic::x86_sse41_ptestc:
 
7561
  case Intrinsic::x86_sse41_ptestnzc:
 
7562
  case Intrinsic::x86_avx_ptestz_256:
 
7563
  case Intrinsic::x86_avx_ptestc_256:
 
7564
  case Intrinsic::x86_avx_ptestnzc_256:
 
7565
  case Intrinsic::x86_avx_vtestz_ps:
 
7566
  case Intrinsic::x86_avx_vtestc_ps:
 
7567
  case Intrinsic::x86_avx_vtestnzc_ps:
 
7568
  case Intrinsic::x86_avx_vtestz_pd:
 
7569
  case Intrinsic::x86_avx_vtestc_pd:
 
7570
  case Intrinsic::x86_avx_vtestnzc_pd:
 
7571
  case Intrinsic::x86_avx_vtestz_ps_256:
 
7572
  case Intrinsic::x86_avx_vtestc_ps_256:
 
7573
  case Intrinsic::x86_avx_vtestnzc_ps_256:
 
7574
  case Intrinsic::x86_avx_vtestz_pd_256:
 
7575
  case Intrinsic::x86_avx_vtestc_pd_256:
 
7576
  case Intrinsic::x86_avx_vtestnzc_pd_256: {
 
7577
    bool IsTestPacked = false;
 
7578
    unsigned X86CC = 0;
 
7579
    switch (IntNo) {
 
7580
    default: llvm_unreachable("Bad fallthrough in Intrinsic lowering.");
 
7581
    case Intrinsic::x86_avx_vtestz_ps:
 
7582
    case Intrinsic::x86_avx_vtestz_pd:
 
7583
    case Intrinsic::x86_avx_vtestz_ps_256:
 
7584
    case Intrinsic::x86_avx_vtestz_pd_256:
 
7585
      IsTestPacked = true; // Fallthrough
 
7586
    case Intrinsic::x86_sse41_ptestz:
 
7587
    case Intrinsic::x86_avx_ptestz_256:
 
7588
      // ZF = 1
 
7589
      X86CC = X86::COND_E;
 
7590
      break;
 
7591
    case Intrinsic::x86_avx_vtestc_ps:
 
7592
    case Intrinsic::x86_avx_vtestc_pd:
 
7593
    case Intrinsic::x86_avx_vtestc_ps_256:
 
7594
    case Intrinsic::x86_avx_vtestc_pd_256:
 
7595
      IsTestPacked = true; // Fallthrough
 
7596
    case Intrinsic::x86_sse41_ptestc:
 
7597
    case Intrinsic::x86_avx_ptestc_256:
 
7598
      // CF = 1
 
7599
      X86CC = X86::COND_B;
 
7600
      break;
 
7601
    case Intrinsic::x86_avx_vtestnzc_ps:
 
7602
    case Intrinsic::x86_avx_vtestnzc_pd:
 
7603
    case Intrinsic::x86_avx_vtestnzc_ps_256:
 
7604
    case Intrinsic::x86_avx_vtestnzc_pd_256:
 
7605
      IsTestPacked = true; // Fallthrough
 
7606
    case Intrinsic::x86_sse41_ptestnzc:
 
7607
    case Intrinsic::x86_avx_ptestnzc_256:
 
7608
      // ZF and CF = 0
 
7609
      X86CC = X86::COND_A;
 
7610
      break;
 
7611
    }
 
7612
 
 
7613
    SDValue LHS = Op.getOperand(1);
 
7614
    SDValue RHS = Op.getOperand(2);
 
7615
    unsigned TestOpc = IsTestPacked ? X86ISD::TESTP : X86ISD::PTEST;
 
7616
    SDValue Test = DAG.getNode(TestOpc, dl, MVT::i32, LHS, RHS);
 
7617
    SDValue CC = DAG.getConstant(X86CC, MVT::i8);
 
7618
    SDValue SetCC = DAG.getNode(X86ISD::SETCC, dl, MVT::i8, CC, Test);
 
7619
    return DAG.getNode(ISD::ZERO_EXTEND, dl, MVT::i32, SetCC);
 
7620
  }
 
7621
 
 
7622
  // Fix vector shift instructions where the last operand is a non-immediate
 
7623
  // i32 value.
 
7624
  case Intrinsic::x86_sse2_pslli_w:
 
7625
  case Intrinsic::x86_sse2_pslli_d:
 
7626
  case Intrinsic::x86_sse2_pslli_q:
 
7627
  case Intrinsic::x86_sse2_psrli_w:
 
7628
  case Intrinsic::x86_sse2_psrli_d:
 
7629
  case Intrinsic::x86_sse2_psrli_q:
 
7630
  case Intrinsic::x86_sse2_psrai_w:
 
7631
  case Intrinsic::x86_sse2_psrai_d:
 
7632
  case Intrinsic::x86_mmx_pslli_w:
 
7633
  case Intrinsic::x86_mmx_pslli_d:
 
7634
  case Intrinsic::x86_mmx_pslli_q:
 
7635
  case Intrinsic::x86_mmx_psrli_w:
 
7636
  case Intrinsic::x86_mmx_psrli_d:
 
7637
  case Intrinsic::x86_mmx_psrli_q:
 
7638
  case Intrinsic::x86_mmx_psrai_w:
 
7639
  case Intrinsic::x86_mmx_psrai_d: {
 
7640
    SDValue ShAmt = Op.getOperand(2);
 
7641
    if (isa<ConstantSDNode>(ShAmt))
 
7642
      return SDValue();
 
7643
 
 
7644
    unsigned NewIntNo = 0;
 
7645
    EVT ShAmtVT = MVT::v4i32;
 
7646
    switch (IntNo) {
 
7647
    case Intrinsic::x86_sse2_pslli_w:
 
7648
      NewIntNo = Intrinsic::x86_sse2_psll_w;
 
7649
      break;
 
7650
    case Intrinsic::x86_sse2_pslli_d:
 
7651
      NewIntNo = Intrinsic::x86_sse2_psll_d;
 
7652
      break;
 
7653
    case Intrinsic::x86_sse2_pslli_q:
 
7654
      NewIntNo = Intrinsic::x86_sse2_psll_q;
 
7655
      break;
 
7656
    case Intrinsic::x86_sse2_psrli_w:
 
7657
      NewIntNo = Intrinsic::x86_sse2_psrl_w;
 
7658
      break;
 
7659
    case Intrinsic::x86_sse2_psrli_d:
 
7660
      NewIntNo = Intrinsic::x86_sse2_psrl_d;
 
7661
      break;
 
7662
    case Intrinsic::x86_sse2_psrli_q:
 
7663
      NewIntNo = Intrinsic::x86_sse2_psrl_q;
 
7664
      break;
 
7665
    case Intrinsic::x86_sse2_psrai_w:
 
7666
      NewIntNo = Intrinsic::x86_sse2_psra_w;
 
7667
      break;
 
7668
    case Intrinsic::x86_sse2_psrai_d:
 
7669
      NewIntNo = Intrinsic::x86_sse2_psra_d;
 
7670
      break;
 
7671
    default: {
 
7672
      ShAmtVT = MVT::v2i32;
 
7673
      switch (IntNo) {
 
7674
      case Intrinsic::x86_mmx_pslli_w:
 
7675
        NewIntNo = Intrinsic::x86_mmx_psll_w;
 
7676
        break;
 
7677
      case Intrinsic::x86_mmx_pslli_d:
 
7678
        NewIntNo = Intrinsic::x86_mmx_psll_d;
 
7679
        break;
 
7680
      case Intrinsic::x86_mmx_pslli_q:
 
7681
        NewIntNo = Intrinsic::x86_mmx_psll_q;
 
7682
        break;
 
7683
      case Intrinsic::x86_mmx_psrli_w:
 
7684
        NewIntNo = Intrinsic::x86_mmx_psrl_w;
 
7685
        break;
 
7686
      case Intrinsic::x86_mmx_psrli_d:
 
7687
        NewIntNo = Intrinsic::x86_mmx_psrl_d;
 
7688
        break;
 
7689
      case Intrinsic::x86_mmx_psrli_q:
 
7690
        NewIntNo = Intrinsic::x86_mmx_psrl_q;
 
7691
        break;
 
7692
      case Intrinsic::x86_mmx_psrai_w:
 
7693
        NewIntNo = Intrinsic::x86_mmx_psra_w;
 
7694
        break;
 
7695
      case Intrinsic::x86_mmx_psrai_d:
 
7696
        NewIntNo = Intrinsic::x86_mmx_psra_d;
 
7697
        break;
 
7698
      default: llvm_unreachable("Impossible intrinsic");  // Can't reach here.
 
7699
      }
 
7700
      break;
 
7701
    }
 
7702
    }
 
7703
 
 
7704
    // The vector shift intrinsics with scalars uses 32b shift amounts but
 
7705
    // the sse2/mmx shift instructions reads 64 bits. Set the upper 32 bits
 
7706
    // to be zero.
 
7707
    SDValue ShOps[4];
 
7708
    ShOps[0] = ShAmt;
 
7709
    ShOps[1] = DAG.getConstant(0, MVT::i32);
 
7710
    if (ShAmtVT == MVT::v4i32) {
 
7711
      ShOps[2] = DAG.getUNDEF(MVT::i32);
 
7712
      ShOps[3] = DAG.getUNDEF(MVT::i32);
 
7713
      ShAmt =  DAG.getNode(ISD::BUILD_VECTOR, dl, ShAmtVT, &ShOps[0], 4);
 
7714
    } else {
 
7715
      ShAmt =  DAG.getNode(ISD::BUILD_VECTOR, dl, ShAmtVT, &ShOps[0], 2);
 
7716
    }
 
7717
 
 
7718
    EVT VT = Op.getValueType();
 
7719
    ShAmt = DAG.getNode(ISD::BIT_CONVERT, dl, VT, ShAmt);
 
7720
    return DAG.getNode(ISD::INTRINSIC_WO_CHAIN, dl, VT,
 
7721
                       DAG.getConstant(NewIntNo, MVT::i32),
 
7722
                       Op.getOperand(1), ShAmt);
 
7723
  }
 
7724
  }
 
7725
}
 
7726
 
 
7727
SDValue X86TargetLowering::LowerRETURNADDR(SDValue Op,
 
7728
                                           SelectionDAG &DAG) const {
 
7729
  MachineFrameInfo *MFI = DAG.getMachineFunction().getFrameInfo();
 
7730
  MFI->setReturnAddressIsTaken(true);
 
7731
 
 
7732
  unsigned Depth = cast<ConstantSDNode>(Op.getOperand(0))->getZExtValue();
 
7733
  DebugLoc dl = Op.getDebugLoc();
 
7734
 
 
7735
  if (Depth > 0) {
 
7736
    SDValue FrameAddr = LowerFRAMEADDR(Op, DAG);
 
7737
    SDValue Offset =
 
7738
      DAG.getConstant(TD->getPointerSize(),
 
7739
                      Subtarget->is64Bit() ? MVT::i64 : MVT::i32);
 
7740
    return DAG.getLoad(getPointerTy(), dl, DAG.getEntryNode(),
 
7741
                       DAG.getNode(ISD::ADD, dl, getPointerTy(),
 
7742
                                   FrameAddr, Offset),
 
7743
                       NULL, 0, false, false, 0);
 
7744
  }
 
7745
 
 
7746
  // Just load the return address.
 
7747
  SDValue RetAddrFI = getReturnAddressFrameIndex(DAG);
 
7748
  return DAG.getLoad(getPointerTy(), dl, DAG.getEntryNode(),
 
7749
                     RetAddrFI, NULL, 0, false, false, 0);
 
7750
}
 
7751
 
 
7752
SDValue X86TargetLowering::LowerFRAMEADDR(SDValue Op, SelectionDAG &DAG) const {
 
7753
  MachineFrameInfo *MFI = DAG.getMachineFunction().getFrameInfo();
 
7754
  MFI->setFrameAddressIsTaken(true);
 
7755
 
 
7756
  EVT VT = Op.getValueType();
 
7757
  DebugLoc dl = Op.getDebugLoc();  // FIXME probably not meaningful
 
7758
  unsigned Depth = cast<ConstantSDNode>(Op.getOperand(0))->getZExtValue();
 
7759
  unsigned FrameReg = Subtarget->is64Bit() ? X86::RBP : X86::EBP;
 
7760
  SDValue FrameAddr = DAG.getCopyFromReg(DAG.getEntryNode(), dl, FrameReg, VT);
 
7761
  while (Depth--)
 
7762
    FrameAddr = DAG.getLoad(VT, dl, DAG.getEntryNode(), FrameAddr, NULL, 0,
 
7763
                            false, false, 0);
 
7764
  return FrameAddr;
 
7765
}
 
7766
 
 
7767
SDValue X86TargetLowering::LowerFRAME_TO_ARGS_OFFSET(SDValue Op,
 
7768
                                                     SelectionDAG &DAG) const {
 
7769
  return DAG.getIntPtrConstant(2*TD->getPointerSize());
 
7770
}
 
7771
 
 
7772
SDValue X86TargetLowering::LowerEH_RETURN(SDValue Op, SelectionDAG &DAG) const {
 
7773
  MachineFunction &MF = DAG.getMachineFunction();
 
7774
  SDValue Chain     = Op.getOperand(0);
 
7775
  SDValue Offset    = Op.getOperand(1);
 
7776
  SDValue Handler   = Op.getOperand(2);
 
7777
  DebugLoc dl       = Op.getDebugLoc();
 
7778
 
 
7779
  SDValue Frame = DAG.getCopyFromReg(DAG.getEntryNode(), dl,
 
7780
                                     Subtarget->is64Bit() ? X86::RBP : X86::EBP,
 
7781
                                     getPointerTy());
 
7782
  unsigned StoreAddrReg = (Subtarget->is64Bit() ? X86::RCX : X86::ECX);
 
7783
 
 
7784
  SDValue StoreAddr = DAG.getNode(ISD::ADD, dl, getPointerTy(), Frame,
 
7785
                                  DAG.getIntPtrConstant(TD->getPointerSize()));
 
7786
  StoreAddr = DAG.getNode(ISD::ADD, dl, getPointerTy(), StoreAddr, Offset);
 
7787
  Chain = DAG.getStore(Chain, dl, Handler, StoreAddr, NULL, 0, false, false, 0);
 
7788
  Chain = DAG.getCopyToReg(Chain, dl, StoreAddrReg, StoreAddr);
 
7789
  MF.getRegInfo().addLiveOut(StoreAddrReg);
 
7790
 
 
7791
  return DAG.getNode(X86ISD::EH_RETURN, dl,
 
7792
                     MVT::Other,
 
7793
                     Chain, DAG.getRegister(StoreAddrReg, getPointerTy()));
 
7794
}
 
7795
 
 
7796
SDValue X86TargetLowering::LowerTRAMPOLINE(SDValue Op,
 
7797
                                             SelectionDAG &DAG) const {
 
7798
  SDValue Root = Op.getOperand(0);
 
7799
  SDValue Trmp = Op.getOperand(1); // trampoline
 
7800
  SDValue FPtr = Op.getOperand(2); // nested function
 
7801
  SDValue Nest = Op.getOperand(3); // 'nest' parameter value
 
7802
  DebugLoc dl  = Op.getDebugLoc();
 
7803
 
 
7804
  const Value *TrmpAddr = cast<SrcValueSDNode>(Op.getOperand(4))->getValue();
 
7805
 
 
7806
  if (Subtarget->is64Bit()) {
 
7807
    SDValue OutChains[6];
 
7808
 
 
7809
    // Large code-model.
 
7810
    const unsigned char JMP64r  = 0xFF; // 64-bit jmp through register opcode.
 
7811
    const unsigned char MOV64ri = 0xB8; // X86::MOV64ri opcode.
 
7812
 
 
7813
    const unsigned char N86R10 = RegInfo->getX86RegNum(X86::R10);
 
7814
    const unsigned char N86R11 = RegInfo->getX86RegNum(X86::R11);
 
7815
 
 
7816
    const unsigned char REX_WB = 0x40 | 0x08 | 0x01; // REX prefix
 
7817
 
 
7818
    // Load the pointer to the nested function into R11.
 
7819
    unsigned OpCode = ((MOV64ri | N86R11) << 8) | REX_WB; // movabsq r11
 
7820
    SDValue Addr = Trmp;
 
7821
    OutChains[0] = DAG.getStore(Root, dl, DAG.getConstant(OpCode, MVT::i16),
 
7822
                                Addr, TrmpAddr, 0, false, false, 0);
 
7823
 
 
7824
    Addr = DAG.getNode(ISD::ADD, dl, MVT::i64, Trmp,
 
7825
                       DAG.getConstant(2, MVT::i64));
 
7826
    OutChains[1] = DAG.getStore(Root, dl, FPtr, Addr, TrmpAddr, 2,
 
7827
                                false, false, 2);
 
7828
 
 
7829
    // Load the 'nest' parameter value into R10.
 
7830
    // R10 is specified in X86CallingConv.td
 
7831
    OpCode = ((MOV64ri | N86R10) << 8) | REX_WB; // movabsq r10
 
7832
    Addr = DAG.getNode(ISD::ADD, dl, MVT::i64, Trmp,
 
7833
                       DAG.getConstant(10, MVT::i64));
 
7834
    OutChains[2] = DAG.getStore(Root, dl, DAG.getConstant(OpCode, MVT::i16),
 
7835
                                Addr, TrmpAddr, 10, false, false, 0);
 
7836
 
 
7837
    Addr = DAG.getNode(ISD::ADD, dl, MVT::i64, Trmp,
 
7838
                       DAG.getConstant(12, MVT::i64));
 
7839
    OutChains[3] = DAG.getStore(Root, dl, Nest, Addr, TrmpAddr, 12,
 
7840
                                false, false, 2);
 
7841
 
 
7842
    // Jump to the nested function.
 
7843
    OpCode = (JMP64r << 8) | REX_WB; // jmpq *...
 
7844
    Addr = DAG.getNode(ISD::ADD, dl, MVT::i64, Trmp,
 
7845
                       DAG.getConstant(20, MVT::i64));
 
7846
    OutChains[4] = DAG.getStore(Root, dl, DAG.getConstant(OpCode, MVT::i16),
 
7847
                                Addr, TrmpAddr, 20, false, false, 0);
 
7848
 
 
7849
    unsigned char ModRM = N86R11 | (4 << 3) | (3 << 6); // ...r11
 
7850
    Addr = DAG.getNode(ISD::ADD, dl, MVT::i64, Trmp,
 
7851
                       DAG.getConstant(22, MVT::i64));
 
7852
    OutChains[5] = DAG.getStore(Root, dl, DAG.getConstant(ModRM, MVT::i8), Addr,
 
7853
                                TrmpAddr, 22, false, false, 0);
 
7854
 
 
7855
    SDValue Ops[] =
 
7856
      { Trmp, DAG.getNode(ISD::TokenFactor, dl, MVT::Other, OutChains, 6) };
 
7857
    return DAG.getMergeValues(Ops, 2, dl);
 
7858
  } else {
 
7859
    const Function *Func =
 
7860
      cast<Function>(cast<SrcValueSDNode>(Op.getOperand(5))->getValue());
 
7861
    CallingConv::ID CC = Func->getCallingConv();
 
7862
    unsigned NestReg;
 
7863
 
 
7864
    switch (CC) {
 
7865
    default:
 
7866
      llvm_unreachable("Unsupported calling convention");
 
7867
    case CallingConv::C:
 
7868
    case CallingConv::X86_StdCall: {
 
7869
      // Pass 'nest' parameter in ECX.
 
7870
      // Must be kept in sync with X86CallingConv.td
 
7871
      NestReg = X86::ECX;
 
7872
 
 
7873
      // Check that ECX wasn't needed by an 'inreg' parameter.
 
7874
      const FunctionType *FTy = Func->getFunctionType();
 
7875
      const AttrListPtr &Attrs = Func->getAttributes();
 
7876
 
 
7877
      if (!Attrs.isEmpty() && !Func->isVarArg()) {
 
7878
        unsigned InRegCount = 0;
 
7879
        unsigned Idx = 1;
 
7880
 
 
7881
        for (FunctionType::param_iterator I = FTy->param_begin(),
 
7882
             E = FTy->param_end(); I != E; ++I, ++Idx)
 
7883
          if (Attrs.paramHasAttr(Idx, Attribute::InReg))
 
7884
            // FIXME: should only count parameters that are lowered to integers.
 
7885
            InRegCount += (TD->getTypeSizeInBits(*I) + 31) / 32;
 
7886
 
 
7887
        if (InRegCount > 2) {
 
7888
          report_fatal_error("Nest register in use - reduce number of inreg"
 
7889
                             " parameters!");
 
7890
        }
 
7891
      }
 
7892
      break;
 
7893
    }
 
7894
    case CallingConv::X86_FastCall:
 
7895
    case CallingConv::X86_ThisCall:
 
7896
    case CallingConv::Fast:
 
7897
      // Pass 'nest' parameter in EAX.
 
7898
      // Must be kept in sync with X86CallingConv.td
 
7899
      NestReg = X86::EAX;
 
7900
      break;
 
7901
    }
 
7902
 
 
7903
    SDValue OutChains[4];
 
7904
    SDValue Addr, Disp;
 
7905
 
 
7906
    Addr = DAG.getNode(ISD::ADD, dl, MVT::i32, Trmp,
 
7907
                       DAG.getConstant(10, MVT::i32));
 
7908
    Disp = DAG.getNode(ISD::SUB, dl, MVT::i32, FPtr, Addr);
 
7909
 
 
7910
    // This is storing the opcode for MOV32ri.
 
7911
    const unsigned char MOV32ri = 0xB8; // X86::MOV32ri's opcode byte.
 
7912
    const unsigned char N86Reg = RegInfo->getX86RegNum(NestReg);
 
7913
    OutChains[0] = DAG.getStore(Root, dl,
 
7914
                                DAG.getConstant(MOV32ri|N86Reg, MVT::i8),
 
7915
                                Trmp, TrmpAddr, 0, false, false, 0);
 
7916
 
 
7917
    Addr = DAG.getNode(ISD::ADD, dl, MVT::i32, Trmp,
 
7918
                       DAG.getConstant(1, MVT::i32));
 
7919
    OutChains[1] = DAG.getStore(Root, dl, Nest, Addr, TrmpAddr, 1,
 
7920
                                false, false, 1);
 
7921
 
 
7922
    const unsigned char JMP = 0xE9; // jmp <32bit dst> opcode.
 
7923
    Addr = DAG.getNode(ISD::ADD, dl, MVT::i32, Trmp,
 
7924
                       DAG.getConstant(5, MVT::i32));
 
7925
    OutChains[2] = DAG.getStore(Root, dl, DAG.getConstant(JMP, MVT::i8), Addr,
 
7926
                                TrmpAddr, 5, false, false, 1);
 
7927
 
 
7928
    Addr = DAG.getNode(ISD::ADD, dl, MVT::i32, Trmp,
 
7929
                       DAG.getConstant(6, MVT::i32));
 
7930
    OutChains[3] = DAG.getStore(Root, dl, Disp, Addr, TrmpAddr, 6,
 
7931
                                false, false, 1);
 
7932
 
 
7933
    SDValue Ops[] =
 
7934
      { Trmp, DAG.getNode(ISD::TokenFactor, dl, MVT::Other, OutChains, 4) };
 
7935
    return DAG.getMergeValues(Ops, 2, dl);
 
7936
  }
 
7937
}
 
7938
 
 
7939
SDValue X86TargetLowering::LowerFLT_ROUNDS_(SDValue Op,
 
7940
                                            SelectionDAG &DAG) const {
 
7941
  /*
 
7942
   The rounding mode is in bits 11:10 of FPSR, and has the following
 
7943
   settings:
 
7944
     00 Round to nearest
 
7945
     01 Round to -inf
 
7946
     10 Round to +inf
 
7947
     11 Round to 0
 
7948
 
 
7949
  FLT_ROUNDS, on the other hand, expects the following:
 
7950
    -1 Undefined
 
7951
     0 Round to 0
 
7952
     1 Round to nearest
 
7953
     2 Round to +inf
 
7954
     3 Round to -inf
 
7955
 
 
7956
  To perform the conversion, we do:
 
7957
    (((((FPSR & 0x800) >> 11) | ((FPSR & 0x400) >> 9)) + 1) & 3)
 
7958
  */
 
7959
 
 
7960
  MachineFunction &MF = DAG.getMachineFunction();
 
7961
  const TargetMachine &TM = MF.getTarget();
 
7962
  const TargetFrameInfo &TFI = *TM.getFrameInfo();
 
7963
  unsigned StackAlignment = TFI.getStackAlignment();
 
7964
  EVT VT = Op.getValueType();
 
7965
  DebugLoc dl = Op.getDebugLoc();
 
7966
 
 
7967
  // Save FP Control Word to stack slot
 
7968
  int SSFI = MF.getFrameInfo()->CreateStackObject(2, StackAlignment, false);
 
7969
  SDValue StackSlot = DAG.getFrameIndex(SSFI, getPointerTy());
 
7970
 
 
7971
  SDValue Chain = DAG.getNode(X86ISD::FNSTCW16m, dl, MVT::Other,
 
7972
                              DAG.getEntryNode(), StackSlot);
 
7973
 
 
7974
  // Load FP Control Word from stack slot
 
7975
  SDValue CWD = DAG.getLoad(MVT::i16, dl, Chain, StackSlot, NULL, 0,
 
7976
                            false, false, 0);
 
7977
 
 
7978
  // Transform as necessary
 
7979
  SDValue CWD1 =
 
7980
    DAG.getNode(ISD::SRL, dl, MVT::i16,
 
7981
                DAG.getNode(ISD::AND, dl, MVT::i16,
 
7982
                            CWD, DAG.getConstant(0x800, MVT::i16)),
 
7983
                DAG.getConstant(11, MVT::i8));
 
7984
  SDValue CWD2 =
 
7985
    DAG.getNode(ISD::SRL, dl, MVT::i16,
 
7986
                DAG.getNode(ISD::AND, dl, MVT::i16,
 
7987
                            CWD, DAG.getConstant(0x400, MVT::i16)),
 
7988
                DAG.getConstant(9, MVT::i8));
 
7989
 
 
7990
  SDValue RetVal =
 
7991
    DAG.getNode(ISD::AND, dl, MVT::i16,
 
7992
                DAG.getNode(ISD::ADD, dl, MVT::i16,
 
7993
                            DAG.getNode(ISD::OR, dl, MVT::i16, CWD1, CWD2),
 
7994
                            DAG.getConstant(1, MVT::i16)),
 
7995
                DAG.getConstant(3, MVT::i16));
 
7996
 
 
7997
 
 
7998
  return DAG.getNode((VT.getSizeInBits() < 16 ?
 
7999
                      ISD::TRUNCATE : ISD::ZERO_EXTEND), dl, VT, RetVal);
 
8000
}
 
8001
 
 
8002
SDValue X86TargetLowering::LowerCTLZ(SDValue Op, SelectionDAG &DAG) const {
 
8003
  EVT VT = Op.getValueType();
 
8004
  EVT OpVT = VT;
 
8005
  unsigned NumBits = VT.getSizeInBits();
 
8006
  DebugLoc dl = Op.getDebugLoc();
 
8007
 
 
8008
  Op = Op.getOperand(0);
 
8009
  if (VT == MVT::i8) {
 
8010
    // Zero extend to i32 since there is not an i8 bsr.
 
8011
    OpVT = MVT::i32;
 
8012
    Op = DAG.getNode(ISD::ZERO_EXTEND, dl, OpVT, Op);
 
8013
  }
 
8014
 
 
8015
  // Issue a bsr (scan bits in reverse) which also sets EFLAGS.
 
8016
  SDVTList VTs = DAG.getVTList(OpVT, MVT::i32);
 
8017
  Op = DAG.getNode(X86ISD::BSR, dl, VTs, Op);
 
8018
 
 
8019
  // If src is zero (i.e. bsr sets ZF), returns NumBits.
 
8020
  SDValue Ops[] = {
 
8021
    Op,
 
8022
    DAG.getConstant(NumBits+NumBits-1, OpVT),
 
8023
    DAG.getConstant(X86::COND_E, MVT::i8),
 
8024
    Op.getValue(1)
 
8025
  };
 
8026
  Op = DAG.getNode(X86ISD::CMOV, dl, OpVT, Ops, array_lengthof(Ops));
 
8027
 
 
8028
  // Finally xor with NumBits-1.
 
8029
  Op = DAG.getNode(ISD::XOR, dl, OpVT, Op, DAG.getConstant(NumBits-1, OpVT));
 
8030
 
 
8031
  if (VT == MVT::i8)
 
8032
    Op = DAG.getNode(ISD::TRUNCATE, dl, MVT::i8, Op);
 
8033
  return Op;
 
8034
}
 
8035
 
 
8036
SDValue X86TargetLowering::LowerCTTZ(SDValue Op, SelectionDAG &DAG) const {
 
8037
  EVT VT = Op.getValueType();
 
8038
  EVT OpVT = VT;
 
8039
  unsigned NumBits = VT.getSizeInBits();
 
8040
  DebugLoc dl = Op.getDebugLoc();
 
8041
 
 
8042
  Op = Op.getOperand(0);
 
8043
  if (VT == MVT::i8) {
 
8044
    OpVT = MVT::i32;
 
8045
    Op = DAG.getNode(ISD::ZERO_EXTEND, dl, OpVT, Op);
 
8046
  }
 
8047
 
 
8048
  // Issue a bsf (scan bits forward) which also sets EFLAGS.
 
8049
  SDVTList VTs = DAG.getVTList(OpVT, MVT::i32);
 
8050
  Op = DAG.getNode(X86ISD::BSF, dl, VTs, Op);
 
8051
 
 
8052
  // If src is zero (i.e. bsf sets ZF), returns NumBits.
 
8053
  SDValue Ops[] = {
 
8054
    Op,
 
8055
    DAG.getConstant(NumBits, OpVT),
 
8056
    DAG.getConstant(X86::COND_E, MVT::i8),
 
8057
    Op.getValue(1)
 
8058
  };
 
8059
  Op = DAG.getNode(X86ISD::CMOV, dl, OpVT, Ops, array_lengthof(Ops));
 
8060
 
 
8061
  if (VT == MVT::i8)
 
8062
    Op = DAG.getNode(ISD::TRUNCATE, dl, MVT::i8, Op);
 
8063
  return Op;
 
8064
}
 
8065
 
 
8066
SDValue X86TargetLowering::LowerMUL_V2I64(SDValue Op, SelectionDAG &DAG) const {
 
8067
  EVT VT = Op.getValueType();
 
8068
  assert(VT == MVT::v2i64 && "Only know how to lower V2I64 multiply");
 
8069
  DebugLoc dl = Op.getDebugLoc();
 
8070
 
 
8071
  //  ulong2 Ahi = __builtin_ia32_psrlqi128( a, 32);
 
8072
  //  ulong2 Bhi = __builtin_ia32_psrlqi128( b, 32);
 
8073
  //  ulong2 AloBlo = __builtin_ia32_pmuludq128( a, b );
 
8074
  //  ulong2 AloBhi = __builtin_ia32_pmuludq128( a, Bhi );
 
8075
  //  ulong2 AhiBlo = __builtin_ia32_pmuludq128( Ahi, b );
 
8076
  //
 
8077
  //  AloBhi = __builtin_ia32_psllqi128( AloBhi, 32 );
 
8078
  //  AhiBlo = __builtin_ia32_psllqi128( AhiBlo, 32 );
 
8079
  //  return AloBlo + AloBhi + AhiBlo;
 
8080
 
 
8081
  SDValue A = Op.getOperand(0);
 
8082
  SDValue B = Op.getOperand(1);
 
8083
 
 
8084
  SDValue Ahi = DAG.getNode(ISD::INTRINSIC_WO_CHAIN, dl, VT,
 
8085
                       DAG.getConstant(Intrinsic::x86_sse2_psrli_q, MVT::i32),
 
8086
                       A, DAG.getConstant(32, MVT::i32));
 
8087
  SDValue Bhi = DAG.getNode(ISD::INTRINSIC_WO_CHAIN, dl, VT,
 
8088
                       DAG.getConstant(Intrinsic::x86_sse2_psrli_q, MVT::i32),
 
8089
                       B, DAG.getConstant(32, MVT::i32));
 
8090
  SDValue AloBlo = DAG.getNode(ISD::INTRINSIC_WO_CHAIN, dl, VT,
 
8091
                       DAG.getConstant(Intrinsic::x86_sse2_pmulu_dq, MVT::i32),
 
8092
                       A, B);
 
8093
  SDValue AloBhi = DAG.getNode(ISD::INTRINSIC_WO_CHAIN, dl, VT,
 
8094
                       DAG.getConstant(Intrinsic::x86_sse2_pmulu_dq, MVT::i32),
 
8095
                       A, Bhi);
 
8096
  SDValue AhiBlo = DAG.getNode(ISD::INTRINSIC_WO_CHAIN, dl, VT,
 
8097
                       DAG.getConstant(Intrinsic::x86_sse2_pmulu_dq, MVT::i32),
 
8098
                       Ahi, B);
 
8099
  AloBhi = DAG.getNode(ISD::INTRINSIC_WO_CHAIN, dl, VT,
 
8100
                       DAG.getConstant(Intrinsic::x86_sse2_pslli_q, MVT::i32),
 
8101
                       AloBhi, DAG.getConstant(32, MVT::i32));
 
8102
  AhiBlo = DAG.getNode(ISD::INTRINSIC_WO_CHAIN, dl, VT,
 
8103
                       DAG.getConstant(Intrinsic::x86_sse2_pslli_q, MVT::i32),
 
8104
                       AhiBlo, DAG.getConstant(32, MVT::i32));
 
8105
  SDValue Res = DAG.getNode(ISD::ADD, dl, VT, AloBlo, AloBhi);
 
8106
  Res = DAG.getNode(ISD::ADD, dl, VT, Res, AhiBlo);
 
8107
  return Res;
 
8108
}
 
8109
 
 
8110
SDValue X86TargetLowering::LowerSHL(SDValue Op, SelectionDAG &DAG) const {
 
8111
  EVT VT = Op.getValueType();
 
8112
  DebugLoc dl = Op.getDebugLoc();
 
8113
  SDValue R = Op.getOperand(0);
 
8114
 
 
8115
  LLVMContext *Context = DAG.getContext();
 
8116
 
 
8117
  assert(Subtarget->hasSSE41() && "Cannot lower SHL without SSE4.1 or later");
 
8118
 
 
8119
  if (VT == MVT::v4i32) {
 
8120
    Op = DAG.getNode(ISD::INTRINSIC_WO_CHAIN, dl, VT,
 
8121
                     DAG.getConstant(Intrinsic::x86_sse2_pslli_d, MVT::i32),
 
8122
                     Op.getOperand(1), DAG.getConstant(23, MVT::i32));
 
8123
 
 
8124
    ConstantInt *CI = ConstantInt::get(*Context, APInt(32, 0x3f800000U));
 
8125
    
 
8126
    std::vector<Constant*> CV(4, CI);
 
8127
    Constant *C = ConstantVector::get(CV);
 
8128
    SDValue CPIdx = DAG.getConstantPool(C, getPointerTy(), 16);
 
8129
    SDValue Addend = DAG.getLoad(VT, dl, DAG.getEntryNode(), CPIdx,
 
8130
                                 PseudoSourceValue::getConstantPool(), 0,
 
8131
                                 false, false, 16);
 
8132
 
 
8133
    Op = DAG.getNode(ISD::ADD, dl, VT, Op, Addend);
 
8134
    Op = DAG.getNode(ISD::BIT_CONVERT, dl, MVT::v4f32, Op);
 
8135
    Op = DAG.getNode(ISD::FP_TO_SINT, dl, VT, Op);
 
8136
    return DAG.getNode(ISD::MUL, dl, VT, Op, R);
 
8137
  }
 
8138
  if (VT == MVT::v16i8) {
 
8139
    // a = a << 5;
 
8140
    Op = DAG.getNode(ISD::INTRINSIC_WO_CHAIN, dl, VT,
 
8141
                     DAG.getConstant(Intrinsic::x86_sse2_pslli_w, MVT::i32),
 
8142
                     Op.getOperand(1), DAG.getConstant(5, MVT::i32));
 
8143
 
 
8144
    ConstantInt *CM1 = ConstantInt::get(*Context, APInt(8, 15));
 
8145
    ConstantInt *CM2 = ConstantInt::get(*Context, APInt(8, 63));
 
8146
 
 
8147
    std::vector<Constant*> CVM1(16, CM1);
 
8148
    std::vector<Constant*> CVM2(16, CM2);
 
8149
    Constant *C = ConstantVector::get(CVM1);
 
8150
    SDValue CPIdx = DAG.getConstantPool(C, getPointerTy(), 16);
 
8151
    SDValue M = DAG.getLoad(VT, dl, DAG.getEntryNode(), CPIdx,
 
8152
                            PseudoSourceValue::getConstantPool(), 0,
 
8153
                            false, false, 16);
 
8154
 
 
8155
    // r = pblendv(r, psllw(r & (char16)15, 4), a);
 
8156
    M = DAG.getNode(ISD::AND, dl, VT, R, M);
 
8157
    M = DAG.getNode(ISD::INTRINSIC_WO_CHAIN, dl, VT,
 
8158
                    DAG.getConstant(Intrinsic::x86_sse2_pslli_w, MVT::i32), M,
 
8159
                    DAG.getConstant(4, MVT::i32));
 
8160
    R = DAG.getNode(ISD::INTRINSIC_WO_CHAIN, dl, VT,
 
8161
                    DAG.getConstant(Intrinsic::x86_sse41_pblendvb, MVT::i32),
 
8162
                    R, M, Op);
 
8163
    // a += a
 
8164
    Op = DAG.getNode(ISD::ADD, dl, VT, Op, Op);
 
8165
    
 
8166
    C = ConstantVector::get(CVM2);
 
8167
    CPIdx = DAG.getConstantPool(C, getPointerTy(), 16);
 
8168
    M = DAG.getLoad(VT, dl, DAG.getEntryNode(), CPIdx,
 
8169
                    PseudoSourceValue::getConstantPool(), 0, false, false, 16);
 
8170
    
 
8171
    // r = pblendv(r, psllw(r & (char16)63, 2), a);
 
8172
    M = DAG.getNode(ISD::AND, dl, VT, R, M);
 
8173
    M = DAG.getNode(ISD::INTRINSIC_WO_CHAIN, dl, VT,
 
8174
                    DAG.getConstant(Intrinsic::x86_sse2_pslli_w, MVT::i32), M,
 
8175
                    DAG.getConstant(2, MVT::i32));
 
8176
    R = DAG.getNode(ISD::INTRINSIC_WO_CHAIN, dl, VT,
 
8177
                    DAG.getConstant(Intrinsic::x86_sse41_pblendvb, MVT::i32),
 
8178
                    R, M, Op);
 
8179
    // a += a
 
8180
    Op = DAG.getNode(ISD::ADD, dl, VT, Op, Op);
 
8181
    
 
8182
    // return pblendv(r, r+r, a);
 
8183
    R = DAG.getNode(ISD::INTRINSIC_WO_CHAIN, dl, VT,
 
8184
                    DAG.getConstant(Intrinsic::x86_sse41_pblendvb, MVT::i32),
 
8185
                    R, DAG.getNode(ISD::ADD, dl, VT, R, R), Op);
 
8186
    return R;
 
8187
  }
 
8188
  return SDValue();
 
8189
}
 
8190
 
 
8191
SDValue X86TargetLowering::LowerXALUO(SDValue Op, SelectionDAG &DAG) const {
 
8192
  // Lower the "add/sub/mul with overflow" instruction into a regular ins plus
 
8193
  // a "setcc" instruction that checks the overflow flag. The "brcond" lowering
 
8194
  // looks for this combo and may remove the "setcc" instruction if the "setcc"
 
8195
  // has only one use.
 
8196
  SDNode *N = Op.getNode();
 
8197
  SDValue LHS = N->getOperand(0);
 
8198
  SDValue RHS = N->getOperand(1);
 
8199
  unsigned BaseOp = 0;
 
8200
  unsigned Cond = 0;
 
8201
  DebugLoc dl = Op.getDebugLoc();
 
8202
 
 
8203
  switch (Op.getOpcode()) {
 
8204
  default: llvm_unreachable("Unknown ovf instruction!");
 
8205
  case ISD::SADDO:
 
8206
    // A subtract of one will be selected as a INC. Note that INC doesn't
 
8207
    // set CF, so we can't do this for UADDO.
 
8208
    if (ConstantSDNode *C = dyn_cast<ConstantSDNode>(Op))
 
8209
      if (C->getAPIntValue() == 1) {
 
8210
        BaseOp = X86ISD::INC;
 
8211
        Cond = X86::COND_O;
 
8212
        break;
 
8213
      }
 
8214
    BaseOp = X86ISD::ADD;
 
8215
    Cond = X86::COND_O;
 
8216
    break;
 
8217
  case ISD::UADDO:
 
8218
    BaseOp = X86ISD::ADD;
 
8219
    Cond = X86::COND_B;
 
8220
    break;
 
8221
  case ISD::SSUBO:
 
8222
    // A subtract of one will be selected as a DEC. Note that DEC doesn't
 
8223
    // set CF, so we can't do this for USUBO.
 
8224
    if (ConstantSDNode *C = dyn_cast<ConstantSDNode>(Op))
 
8225
      if (C->getAPIntValue() == 1) {
 
8226
        BaseOp = X86ISD::DEC;
 
8227
        Cond = X86::COND_O;
 
8228
        break;
 
8229
      }
 
8230
    BaseOp = X86ISD::SUB;
 
8231
    Cond = X86::COND_O;
 
8232
    break;
 
8233
  case ISD::USUBO:
 
8234
    BaseOp = X86ISD::SUB;
 
8235
    Cond = X86::COND_B;
 
8236
    break;
 
8237
  case ISD::SMULO:
 
8238
    BaseOp = X86ISD::SMUL;
 
8239
    Cond = X86::COND_O;
 
8240
    break;
 
8241
  case ISD::UMULO:
 
8242
    BaseOp = X86ISD::UMUL;
 
8243
    Cond = X86::COND_B;
 
8244
    break;
 
8245
  }
 
8246
 
 
8247
  // Also sets EFLAGS.
 
8248
  SDVTList VTs = DAG.getVTList(N->getValueType(0), MVT::i32);
 
8249
  SDValue Sum = DAG.getNode(BaseOp, dl, VTs, LHS, RHS);
 
8250
 
 
8251
  SDValue SetCC =
 
8252
    DAG.getNode(X86ISD::SETCC, dl, N->getValueType(1),
 
8253
                DAG.getConstant(Cond, MVT::i32), SDValue(Sum.getNode(), 1));
 
8254
 
 
8255
  DAG.ReplaceAllUsesOfValueWith(SDValue(N, 1), SetCC);
 
8256
  return Sum;
 
8257
}
 
8258
 
 
8259
SDValue X86TargetLowering::LowerMEMBARRIER(SDValue Op, SelectionDAG &DAG) const{
 
8260
  DebugLoc dl = Op.getDebugLoc();
 
8261
  
 
8262
  if (!Subtarget->hasSSE2()) {
 
8263
    SDValue Chain = Op.getOperand(0);
 
8264
    SDValue Zero = DAG.getConstant(0, 
 
8265
                                   Subtarget->is64Bit() ? MVT::i64 : MVT::i32);
 
8266
    SDValue Ops[] = {
 
8267
      DAG.getRegister(X86::ESP, MVT::i32), // Base
 
8268
      DAG.getTargetConstant(1, MVT::i8),   // Scale
 
8269
      DAG.getRegister(0, MVT::i32),        // Index
 
8270
      DAG.getTargetConstant(0, MVT::i32),  // Disp
 
8271
      DAG.getRegister(0, MVT::i32),        // Segment.
 
8272
      Zero,
 
8273
      Chain
 
8274
    };
 
8275
    SDNode *Res = 
 
8276
      DAG.getMachineNode(X86::OR32mrLocked, dl, MVT::Other, Ops,
 
8277
                          array_lengthof(Ops));
 
8278
    return SDValue(Res, 0);
 
8279
  }
 
8280
  
 
8281
  unsigned isDev = cast<ConstantSDNode>(Op.getOperand(5))->getZExtValue();
 
8282
  if (!isDev)
 
8283
    return DAG.getNode(X86ISD::MEMBARRIER, dl, MVT::Other, Op.getOperand(0));
 
8284
  
 
8285
  unsigned Op1 = cast<ConstantSDNode>(Op.getOperand(1))->getZExtValue();
 
8286
  unsigned Op2 = cast<ConstantSDNode>(Op.getOperand(2))->getZExtValue();
 
8287
  unsigned Op3 = cast<ConstantSDNode>(Op.getOperand(3))->getZExtValue();
 
8288
  unsigned Op4 = cast<ConstantSDNode>(Op.getOperand(4))->getZExtValue();
 
8289
  
 
8290
  // def : Pat<(membarrier (i8 0), (i8 0), (i8 0), (i8 1), (i8 1)), (SFENCE)>;
 
8291
  if (!Op1 && !Op2 && !Op3 && Op4)
 
8292
    return DAG.getNode(X86ISD::SFENCE, dl, MVT::Other, Op.getOperand(0));
 
8293
  
 
8294
  // def : Pat<(membarrier (i8 1), (i8 0), (i8 0), (i8 0), (i8 1)), (LFENCE)>;
 
8295
  if (Op1 && !Op2 && !Op3 && !Op4)
 
8296
    return DAG.getNode(X86ISD::LFENCE, dl, MVT::Other, Op.getOperand(0));
 
8297
  
 
8298
  // def : Pat<(membarrier (i8 imm), (i8 imm), (i8 imm), (i8 imm), (i8 1)), 
 
8299
  //           (MFENCE)>;
 
8300
  return DAG.getNode(X86ISD::MFENCE, dl, MVT::Other, Op.getOperand(0));
 
8301
}
 
8302
 
 
8303
SDValue X86TargetLowering::LowerCMP_SWAP(SDValue Op, SelectionDAG &DAG) const {
 
8304
  EVT T = Op.getValueType();
 
8305
  DebugLoc dl = Op.getDebugLoc();
 
8306
  unsigned Reg = 0;
 
8307
  unsigned size = 0;
 
8308
  switch(T.getSimpleVT().SimpleTy) {
 
8309
  default:
 
8310
    assert(false && "Invalid value type!");
 
8311
  case MVT::i8:  Reg = X86::AL;  size = 1; break;
 
8312
  case MVT::i16: Reg = X86::AX;  size = 2; break;
 
8313
  case MVT::i32: Reg = X86::EAX; size = 4; break;
 
8314
  case MVT::i64:
 
8315
    assert(Subtarget->is64Bit() && "Node not type legal!");
 
8316
    Reg = X86::RAX; size = 8;
 
8317
    break;
 
8318
  }
 
8319
  SDValue cpIn = DAG.getCopyToReg(Op.getOperand(0), dl, Reg,
 
8320
                                    Op.getOperand(2), SDValue());
 
8321
  SDValue Ops[] = { cpIn.getValue(0),
 
8322
                    Op.getOperand(1),
 
8323
                    Op.getOperand(3),
 
8324
                    DAG.getTargetConstant(size, MVT::i8),
 
8325
                    cpIn.getValue(1) };
 
8326
  SDVTList Tys = DAG.getVTList(MVT::Other, MVT::Flag);
 
8327
  SDValue Result = DAG.getNode(X86ISD::LCMPXCHG_DAG, dl, Tys, Ops, 5);
 
8328
  SDValue cpOut =
 
8329
    DAG.getCopyFromReg(Result.getValue(0), dl, Reg, T, Result.getValue(1));
 
8330
  return cpOut;
 
8331
}
 
8332
 
 
8333
SDValue X86TargetLowering::LowerREADCYCLECOUNTER(SDValue Op,
 
8334
                                                 SelectionDAG &DAG) const {
 
8335
  assert(Subtarget->is64Bit() && "Result not type legalized?");
 
8336
  SDVTList Tys = DAG.getVTList(MVT::Other, MVT::Flag);
 
8337
  SDValue TheChain = Op.getOperand(0);
 
8338
  DebugLoc dl = Op.getDebugLoc();
 
8339
  SDValue rd = DAG.getNode(X86ISD::RDTSC_DAG, dl, Tys, &TheChain, 1);
 
8340
  SDValue rax = DAG.getCopyFromReg(rd, dl, X86::RAX, MVT::i64, rd.getValue(1));
 
8341
  SDValue rdx = DAG.getCopyFromReg(rax.getValue(1), dl, X86::RDX, MVT::i64,
 
8342
                                   rax.getValue(2));
 
8343
  SDValue Tmp = DAG.getNode(ISD::SHL, dl, MVT::i64, rdx,
 
8344
                            DAG.getConstant(32, MVT::i8));
 
8345
  SDValue Ops[] = {
 
8346
    DAG.getNode(ISD::OR, dl, MVT::i64, rax, Tmp),
 
8347
    rdx.getValue(1)
 
8348
  };
 
8349
  return DAG.getMergeValues(Ops, 2, dl);
 
8350
}
 
8351
 
 
8352
SDValue X86TargetLowering::LowerBIT_CONVERT(SDValue Op,
 
8353
                                            SelectionDAG &DAG) const {
 
8354
  EVT SrcVT = Op.getOperand(0).getValueType();
 
8355
  EVT DstVT = Op.getValueType();
 
8356
  assert((Subtarget->is64Bit() && !Subtarget->hasSSE2() && 
 
8357
          Subtarget->hasMMX() && !DisableMMX) &&
 
8358
         "Unexpected custom BIT_CONVERT");
 
8359
  assert((DstVT == MVT::i64 || 
 
8360
          (DstVT.isVector() && DstVT.getSizeInBits()==64)) &&
 
8361
         "Unexpected custom BIT_CONVERT");
 
8362
  // i64 <=> MMX conversions are Legal.
 
8363
  if (SrcVT==MVT::i64 && DstVT.isVector())
 
8364
    return Op;
 
8365
  if (DstVT==MVT::i64 && SrcVT.isVector())
 
8366
    return Op;
 
8367
  // MMX <=> MMX conversions are Legal.
 
8368
  if (SrcVT.isVector() && DstVT.isVector())
 
8369
    return Op;
 
8370
  // All other conversions need to be expanded.
 
8371
  return SDValue();
 
8372
}
 
8373
SDValue X86TargetLowering::LowerLOAD_SUB(SDValue Op, SelectionDAG &DAG) const {
 
8374
  SDNode *Node = Op.getNode();
 
8375
  DebugLoc dl = Node->getDebugLoc();
 
8376
  EVT T = Node->getValueType(0);
 
8377
  SDValue negOp = DAG.getNode(ISD::SUB, dl, T,
 
8378
                              DAG.getConstant(0, T), Node->getOperand(2));
 
8379
  return DAG.getAtomic(ISD::ATOMIC_LOAD_ADD, dl,
 
8380
                       cast<AtomicSDNode>(Node)->getMemoryVT(),
 
8381
                       Node->getOperand(0),
 
8382
                       Node->getOperand(1), negOp,
 
8383
                       cast<AtomicSDNode>(Node)->getSrcValue(),
 
8384
                       cast<AtomicSDNode>(Node)->getAlignment());
 
8385
}
 
8386
 
 
8387
/// LowerOperation - Provide custom lowering hooks for some operations.
 
8388
///
 
8389
SDValue X86TargetLowering::LowerOperation(SDValue Op, SelectionDAG &DAG) const {
 
8390
  switch (Op.getOpcode()) {
 
8391
  default: llvm_unreachable("Should not custom lower this!");
 
8392
  case ISD::MEMBARRIER:         return LowerMEMBARRIER(Op,DAG);
 
8393
  case ISD::ATOMIC_CMP_SWAP:    return LowerCMP_SWAP(Op,DAG);
 
8394
  case ISD::ATOMIC_LOAD_SUB:    return LowerLOAD_SUB(Op,DAG);
 
8395
  case ISD::BUILD_VECTOR:       return LowerBUILD_VECTOR(Op, DAG);
 
8396
  case ISD::CONCAT_VECTORS:     return LowerCONCAT_VECTORS(Op, DAG);
 
8397
  case ISD::VECTOR_SHUFFLE:     return LowerVECTOR_SHUFFLE(Op, DAG);
 
8398
  case ISD::EXTRACT_VECTOR_ELT: return LowerEXTRACT_VECTOR_ELT(Op, DAG);
 
8399
  case ISD::INSERT_VECTOR_ELT:  return LowerINSERT_VECTOR_ELT(Op, DAG);
 
8400
  case ISD::SCALAR_TO_VECTOR:   return LowerSCALAR_TO_VECTOR(Op, DAG);
 
8401
  case ISD::ConstantPool:       return LowerConstantPool(Op, DAG);
 
8402
  case ISD::GlobalAddress:      return LowerGlobalAddress(Op, DAG);
 
8403
  case ISD::GlobalTLSAddress:   return LowerGlobalTLSAddress(Op, DAG);
 
8404
  case ISD::ExternalSymbol:     return LowerExternalSymbol(Op, DAG);
 
8405
  case ISD::BlockAddress:       return LowerBlockAddress(Op, DAG);
 
8406
  case ISD::SHL_PARTS:
 
8407
  case ISD::SRA_PARTS:
 
8408
  case ISD::SRL_PARTS:          return LowerShift(Op, DAG);
 
8409
  case ISD::SINT_TO_FP:         return LowerSINT_TO_FP(Op, DAG);
 
8410
  case ISD::UINT_TO_FP:         return LowerUINT_TO_FP(Op, DAG);
 
8411
  case ISD::FP_TO_SINT:         return LowerFP_TO_SINT(Op, DAG);
 
8412
  case ISD::FP_TO_UINT:         return LowerFP_TO_UINT(Op, DAG);
 
8413
  case ISD::FABS:               return LowerFABS(Op, DAG);
 
8414
  case ISD::FNEG:               return LowerFNEG(Op, DAG);
 
8415
  case ISD::FCOPYSIGN:          return LowerFCOPYSIGN(Op, DAG);
 
8416
  case ISD::SETCC:              return LowerSETCC(Op, DAG);
 
8417
  case ISD::VSETCC:             return LowerVSETCC(Op, DAG);
 
8418
  case ISD::SELECT:             return LowerSELECT(Op, DAG);
 
8419
  case ISD::BRCOND:             return LowerBRCOND(Op, DAG);
 
8420
  case ISD::JumpTable:          return LowerJumpTable(Op, DAG);
 
8421
  case ISD::VASTART:            return LowerVASTART(Op, DAG);
 
8422
  case ISD::VAARG:              return LowerVAARG(Op, DAG);
 
8423
  case ISD::VACOPY:             return LowerVACOPY(Op, DAG);
 
8424
  case ISD::INTRINSIC_WO_CHAIN: return LowerINTRINSIC_WO_CHAIN(Op, DAG);
 
8425
  case ISD::RETURNADDR:         return LowerRETURNADDR(Op, DAG);
 
8426
  case ISD::FRAMEADDR:          return LowerFRAMEADDR(Op, DAG);
 
8427
  case ISD::FRAME_TO_ARGS_OFFSET:
 
8428
                                return LowerFRAME_TO_ARGS_OFFSET(Op, DAG);
 
8429
  case ISD::DYNAMIC_STACKALLOC: return LowerDYNAMIC_STACKALLOC(Op, DAG);
 
8430
  case ISD::EH_RETURN:          return LowerEH_RETURN(Op, DAG);
 
8431
  case ISD::TRAMPOLINE:         return LowerTRAMPOLINE(Op, DAG);
 
8432
  case ISD::FLT_ROUNDS_:        return LowerFLT_ROUNDS_(Op, DAG);
 
8433
  case ISD::CTLZ:               return LowerCTLZ(Op, DAG);
 
8434
  case ISD::CTTZ:               return LowerCTTZ(Op, DAG);
 
8435
  case ISD::MUL:                return LowerMUL_V2I64(Op, DAG);
 
8436
  case ISD::SHL:                return LowerSHL(Op, DAG);
 
8437
  case ISD::SADDO:
 
8438
  case ISD::UADDO:
 
8439
  case ISD::SSUBO:
 
8440
  case ISD::USUBO:
 
8441
  case ISD::SMULO:
 
8442
  case ISD::UMULO:              return LowerXALUO(Op, DAG);
 
8443
  case ISD::READCYCLECOUNTER:   return LowerREADCYCLECOUNTER(Op, DAG);
 
8444
  case ISD::BIT_CONVERT:        return LowerBIT_CONVERT(Op, DAG);
 
8445
  }
 
8446
}
 
8447
 
 
8448
void X86TargetLowering::
 
8449
ReplaceATOMIC_BINARY_64(SDNode *Node, SmallVectorImpl<SDValue>&Results,
 
8450
                        SelectionDAG &DAG, unsigned NewOp) const {
 
8451
  EVT T = Node->getValueType(0);
 
8452
  DebugLoc dl = Node->getDebugLoc();
 
8453
  assert (T == MVT::i64 && "Only know how to expand i64 atomics");
 
8454
 
 
8455
  SDValue Chain = Node->getOperand(0);
 
8456
  SDValue In1 = Node->getOperand(1);
 
8457
  SDValue In2L = DAG.getNode(ISD::EXTRACT_ELEMENT, dl, MVT::i32,
 
8458
                             Node->getOperand(2), DAG.getIntPtrConstant(0));
 
8459
  SDValue In2H = DAG.getNode(ISD::EXTRACT_ELEMENT, dl, MVT::i32,
 
8460
                             Node->getOperand(2), DAG.getIntPtrConstant(1));
 
8461
  SDValue Ops[] = { Chain, In1, In2L, In2H };
 
8462
  SDVTList Tys = DAG.getVTList(MVT::i32, MVT::i32, MVT::Other);
 
8463
  SDValue Result =
 
8464
    DAG.getMemIntrinsicNode(NewOp, dl, Tys, Ops, 4, MVT::i64,
 
8465
                            cast<MemSDNode>(Node)->getMemOperand());
 
8466
  SDValue OpsF[] = { Result.getValue(0), Result.getValue(1)};
 
8467
  Results.push_back(DAG.getNode(ISD::BUILD_PAIR, dl, MVT::i64, OpsF, 2));
 
8468
  Results.push_back(Result.getValue(2));
 
8469
}
 
8470
 
 
8471
/// ReplaceNodeResults - Replace a node with an illegal result type
 
8472
/// with a new node built out of custom code.
 
8473
void X86TargetLowering::ReplaceNodeResults(SDNode *N,
 
8474
                                           SmallVectorImpl<SDValue>&Results,
 
8475
                                           SelectionDAG &DAG) const {
 
8476
  DebugLoc dl = N->getDebugLoc();
 
8477
  switch (N->getOpcode()) {
 
8478
  default:
 
8479
    assert(false && "Do not know how to custom type legalize this operation!");
 
8480
    return;
 
8481
  case ISD::FP_TO_SINT: {
 
8482
    std::pair<SDValue,SDValue> Vals =
 
8483
        FP_TO_INTHelper(SDValue(N, 0), DAG, true);
 
8484
    SDValue FIST = Vals.first, StackSlot = Vals.second;
 
8485
    if (FIST.getNode() != 0) {
 
8486
      EVT VT = N->getValueType(0);
 
8487
      // Return a load from the stack slot.
 
8488
      Results.push_back(DAG.getLoad(VT, dl, FIST, StackSlot, NULL, 0,
 
8489
                                    false, false, 0));
 
8490
    }
 
8491
    return;
 
8492
  }
 
8493
  case ISD::READCYCLECOUNTER: {
 
8494
    SDVTList Tys = DAG.getVTList(MVT::Other, MVT::Flag);
 
8495
    SDValue TheChain = N->getOperand(0);
 
8496
    SDValue rd = DAG.getNode(X86ISD::RDTSC_DAG, dl, Tys, &TheChain, 1);
 
8497
    SDValue eax = DAG.getCopyFromReg(rd, dl, X86::EAX, MVT::i32,
 
8498
                                     rd.getValue(1));
 
8499
    SDValue edx = DAG.getCopyFromReg(eax.getValue(1), dl, X86::EDX, MVT::i32,
 
8500
                                     eax.getValue(2));
 
8501
    // Use a buildpair to merge the two 32-bit values into a 64-bit one.
 
8502
    SDValue Ops[] = { eax, edx };
 
8503
    Results.push_back(DAG.getNode(ISD::BUILD_PAIR, dl, MVT::i64, Ops, 2));
 
8504
    Results.push_back(edx.getValue(1));
 
8505
    return;
 
8506
  }
 
8507
  case ISD::ATOMIC_CMP_SWAP: {
 
8508
    EVT T = N->getValueType(0);
 
8509
    assert (T == MVT::i64 && "Only know how to expand i64 Cmp and Swap");
 
8510
    SDValue cpInL, cpInH;
 
8511
    cpInL = DAG.getNode(ISD::EXTRACT_ELEMENT, dl, MVT::i32, N->getOperand(2),
 
8512
                        DAG.getConstant(0, MVT::i32));
 
8513
    cpInH = DAG.getNode(ISD::EXTRACT_ELEMENT, dl, MVT::i32, N->getOperand(2),
 
8514
                        DAG.getConstant(1, MVT::i32));
 
8515
    cpInL = DAG.getCopyToReg(N->getOperand(0), dl, X86::EAX, cpInL, SDValue());
 
8516
    cpInH = DAG.getCopyToReg(cpInL.getValue(0), dl, X86::EDX, cpInH,
 
8517
                             cpInL.getValue(1));
 
8518
    SDValue swapInL, swapInH;
 
8519
    swapInL = DAG.getNode(ISD::EXTRACT_ELEMENT, dl, MVT::i32, N->getOperand(3),
 
8520
                          DAG.getConstant(0, MVT::i32));
 
8521
    swapInH = DAG.getNode(ISD::EXTRACT_ELEMENT, dl, MVT::i32, N->getOperand(3),
 
8522
                          DAG.getConstant(1, MVT::i32));
 
8523
    swapInL = DAG.getCopyToReg(cpInH.getValue(0), dl, X86::EBX, swapInL,
 
8524
                               cpInH.getValue(1));
 
8525
    swapInH = DAG.getCopyToReg(swapInL.getValue(0), dl, X86::ECX, swapInH,
 
8526
                               swapInL.getValue(1));
 
8527
    SDValue Ops[] = { swapInH.getValue(0),
 
8528
                      N->getOperand(1),
 
8529
                      swapInH.getValue(1) };
 
8530
    SDVTList Tys = DAG.getVTList(MVT::Other, MVT::Flag);
 
8531
    SDValue Result = DAG.getNode(X86ISD::LCMPXCHG8_DAG, dl, Tys, Ops, 3);
 
8532
    SDValue cpOutL = DAG.getCopyFromReg(Result.getValue(0), dl, X86::EAX,
 
8533
                                        MVT::i32, Result.getValue(1));
 
8534
    SDValue cpOutH = DAG.getCopyFromReg(cpOutL.getValue(1), dl, X86::EDX,
 
8535
                                        MVT::i32, cpOutL.getValue(2));
 
8536
    SDValue OpsF[] = { cpOutL.getValue(0), cpOutH.getValue(0)};
 
8537
    Results.push_back(DAG.getNode(ISD::BUILD_PAIR, dl, MVT::i64, OpsF, 2));
 
8538
    Results.push_back(cpOutH.getValue(1));
 
8539
    return;
 
8540
  }
 
8541
  case ISD::ATOMIC_LOAD_ADD:
 
8542
    ReplaceATOMIC_BINARY_64(N, Results, DAG, X86ISD::ATOMADD64_DAG);
 
8543
    return;
 
8544
  case ISD::ATOMIC_LOAD_AND:
 
8545
    ReplaceATOMIC_BINARY_64(N, Results, DAG, X86ISD::ATOMAND64_DAG);
 
8546
    return;
 
8547
  case ISD::ATOMIC_LOAD_NAND:
 
8548
    ReplaceATOMIC_BINARY_64(N, Results, DAG, X86ISD::ATOMNAND64_DAG);
 
8549
    return;
 
8550
  case ISD::ATOMIC_LOAD_OR:
 
8551
    ReplaceATOMIC_BINARY_64(N, Results, DAG, X86ISD::ATOMOR64_DAG);
 
8552
    return;
 
8553
  case ISD::ATOMIC_LOAD_SUB:
 
8554
    ReplaceATOMIC_BINARY_64(N, Results, DAG, X86ISD::ATOMSUB64_DAG);
 
8555
    return;
 
8556
  case ISD::ATOMIC_LOAD_XOR:
 
8557
    ReplaceATOMIC_BINARY_64(N, Results, DAG, X86ISD::ATOMXOR64_DAG);
 
8558
    return;
 
8559
  case ISD::ATOMIC_SWAP:
 
8560
    ReplaceATOMIC_BINARY_64(N, Results, DAG, X86ISD::ATOMSWAP64_DAG);
 
8561
    return;
 
8562
  }
 
8563
}
 
8564
 
 
8565
const char *X86TargetLowering::getTargetNodeName(unsigned Opcode) const {
 
8566
  switch (Opcode) {
 
8567
  default: return NULL;
 
8568
  case X86ISD::BSF:                return "X86ISD::BSF";
 
8569
  case X86ISD::BSR:                return "X86ISD::BSR";
 
8570
  case X86ISD::SHLD:               return "X86ISD::SHLD";
 
8571
  case X86ISD::SHRD:               return "X86ISD::SHRD";
 
8572
  case X86ISD::FAND:               return "X86ISD::FAND";
 
8573
  case X86ISD::FOR:                return "X86ISD::FOR";
 
8574
  case X86ISD::FXOR:               return "X86ISD::FXOR";
 
8575
  case X86ISD::FSRL:               return "X86ISD::FSRL";
 
8576
  case X86ISD::FILD:               return "X86ISD::FILD";
 
8577
  case X86ISD::FILD_FLAG:          return "X86ISD::FILD_FLAG";
 
8578
  case X86ISD::FP_TO_INT16_IN_MEM: return "X86ISD::FP_TO_INT16_IN_MEM";
 
8579
  case X86ISD::FP_TO_INT32_IN_MEM: return "X86ISD::FP_TO_INT32_IN_MEM";
 
8580
  case X86ISD::FP_TO_INT64_IN_MEM: return "X86ISD::FP_TO_INT64_IN_MEM";
 
8581
  case X86ISD::FLD:                return "X86ISD::FLD";
 
8582
  case X86ISD::FST:                return "X86ISD::FST";
 
8583
  case X86ISD::CALL:               return "X86ISD::CALL";
 
8584
  case X86ISD::RDTSC_DAG:          return "X86ISD::RDTSC_DAG";
 
8585
  case X86ISD::BT:                 return "X86ISD::BT";
 
8586
  case X86ISD::CMP:                return "X86ISD::CMP";
 
8587
  case X86ISD::COMI:               return "X86ISD::COMI";
 
8588
  case X86ISD::UCOMI:              return "X86ISD::UCOMI";
 
8589
  case X86ISD::SETCC:              return "X86ISD::SETCC";
 
8590
  case X86ISD::SETCC_CARRY:        return "X86ISD::SETCC_CARRY";
 
8591
  case X86ISD::CMOV:               return "X86ISD::CMOV";
 
8592
  case X86ISD::BRCOND:             return "X86ISD::BRCOND";
 
8593
  case X86ISD::RET_FLAG:           return "X86ISD::RET_FLAG";
 
8594
  case X86ISD::REP_STOS:           return "X86ISD::REP_STOS";
 
8595
  case X86ISD::REP_MOVS:           return "X86ISD::REP_MOVS";
 
8596
  case X86ISD::GlobalBaseReg:      return "X86ISD::GlobalBaseReg";
 
8597
  case X86ISD::Wrapper:            return "X86ISD::Wrapper";
 
8598
  case X86ISD::WrapperRIP:         return "X86ISD::WrapperRIP";
 
8599
  case X86ISD::PEXTRB:             return "X86ISD::PEXTRB";
 
8600
  case X86ISD::PEXTRW:             return "X86ISD::PEXTRW";
 
8601
  case X86ISD::INSERTPS:           return "X86ISD::INSERTPS";
 
8602
  case X86ISD::PINSRB:             return "X86ISD::PINSRB";
 
8603
  case X86ISD::PINSRW:             return "X86ISD::PINSRW";
 
8604
  case X86ISD::MMX_PINSRW:         return "X86ISD::MMX_PINSRW";
 
8605
  case X86ISD::PSHUFB:             return "X86ISD::PSHUFB";
 
8606
  case X86ISD::FMAX:               return "X86ISD::FMAX";
 
8607
  case X86ISD::FMIN:               return "X86ISD::FMIN";
 
8608
  case X86ISD::FRSQRT:             return "X86ISD::FRSQRT";
 
8609
  case X86ISD::FRCP:               return "X86ISD::FRCP";
 
8610
  case X86ISD::TLSADDR:            return "X86ISD::TLSADDR";
 
8611
  case X86ISD::TLSCALL:            return "X86ISD::TLSCALL";
 
8612
  case X86ISD::SegmentBaseAddress: return "X86ISD::SegmentBaseAddress";
 
8613
  case X86ISD::EH_RETURN:          return "X86ISD::EH_RETURN";
 
8614
  case X86ISD::TC_RETURN:          return "X86ISD::TC_RETURN";
 
8615
  case X86ISD::FNSTCW16m:          return "X86ISD::FNSTCW16m";
 
8616
  case X86ISD::LCMPXCHG_DAG:       return "X86ISD::LCMPXCHG_DAG";
 
8617
  case X86ISD::LCMPXCHG8_DAG:      return "X86ISD::LCMPXCHG8_DAG";
 
8618
  case X86ISD::ATOMADD64_DAG:      return "X86ISD::ATOMADD64_DAG";
 
8619
  case X86ISD::ATOMSUB64_DAG:      return "X86ISD::ATOMSUB64_DAG";
 
8620
  case X86ISD::ATOMOR64_DAG:       return "X86ISD::ATOMOR64_DAG";
 
8621
  case X86ISD::ATOMXOR64_DAG:      return "X86ISD::ATOMXOR64_DAG";
 
8622
  case X86ISD::ATOMAND64_DAG:      return "X86ISD::ATOMAND64_DAG";
 
8623
  case X86ISD::ATOMNAND64_DAG:     return "X86ISD::ATOMNAND64_DAG";
 
8624
  case X86ISD::VZEXT_MOVL:         return "X86ISD::VZEXT_MOVL";
 
8625
  case X86ISD::VZEXT_LOAD:         return "X86ISD::VZEXT_LOAD";
 
8626
  case X86ISD::VSHL:               return "X86ISD::VSHL";
 
8627
  case X86ISD::VSRL:               return "X86ISD::VSRL";
 
8628
  case X86ISD::CMPPD:              return "X86ISD::CMPPD";
 
8629
  case X86ISD::CMPPS:              return "X86ISD::CMPPS";
 
8630
  case X86ISD::PCMPEQB:            return "X86ISD::PCMPEQB";
 
8631
  case X86ISD::PCMPEQW:            return "X86ISD::PCMPEQW";
 
8632
  case X86ISD::PCMPEQD:            return "X86ISD::PCMPEQD";
 
8633
  case X86ISD::PCMPEQQ:            return "X86ISD::PCMPEQQ";
 
8634
  case X86ISD::PCMPGTB:            return "X86ISD::PCMPGTB";
 
8635
  case X86ISD::PCMPGTW:            return "X86ISD::PCMPGTW";
 
8636
  case X86ISD::PCMPGTD:            return "X86ISD::PCMPGTD";
 
8637
  case X86ISD::PCMPGTQ:            return "X86ISD::PCMPGTQ";
 
8638
  case X86ISD::ADD:                return "X86ISD::ADD";
 
8639
  case X86ISD::SUB:                return "X86ISD::SUB";
 
8640
  case X86ISD::SMUL:               return "X86ISD::SMUL";
 
8641
  case X86ISD::UMUL:               return "X86ISD::UMUL";
 
8642
  case X86ISD::INC:                return "X86ISD::INC";
 
8643
  case X86ISD::DEC:                return "X86ISD::DEC";
 
8644
  case X86ISD::OR:                 return "X86ISD::OR";
 
8645
  case X86ISD::XOR:                return "X86ISD::XOR";
 
8646
  case X86ISD::AND:                return "X86ISD::AND";
 
8647
  case X86ISD::MUL_IMM:            return "X86ISD::MUL_IMM";
 
8648
  case X86ISD::PTEST:              return "X86ISD::PTEST";
 
8649
  case X86ISD::TESTP:              return "X86ISD::TESTP";
 
8650
  case X86ISD::PALIGN:             return "X86ISD::PALIGN";
 
8651
  case X86ISD::PSHUFD:             return "X86ISD::PSHUFD";
 
8652
  case X86ISD::PSHUFHW:            return "X86ISD::PSHUFHW";
 
8653
  case X86ISD::PSHUFHW_LD:         return "X86ISD::PSHUFHW_LD";
 
8654
  case X86ISD::PSHUFLW:            return "X86ISD::PSHUFLW";
 
8655
  case X86ISD::PSHUFLW_LD:         return "X86ISD::PSHUFLW_LD";
 
8656
  case X86ISD::SHUFPS:             return "X86ISD::SHUFPS";
 
8657
  case X86ISD::SHUFPD:             return "X86ISD::SHUFPD";
 
8658
  case X86ISD::MOVLHPS:            return "X86ISD::MOVLHPS";
 
8659
  case X86ISD::MOVLHPD:            return "X86ISD::MOVLHPD";
 
8660
  case X86ISD::MOVHLPS:            return "X86ISD::MOVHLPS";
 
8661
  case X86ISD::MOVHLPD:            return "X86ISD::MOVHLPD";
 
8662
  case X86ISD::MOVLPS:             return "X86ISD::MOVLPS";
 
8663
  case X86ISD::MOVLPD:             return "X86ISD::MOVLPD";
 
8664
  case X86ISD::MOVDDUP:            return "X86ISD::MOVDDUP";
 
8665
  case X86ISD::MOVSHDUP:           return "X86ISD::MOVSHDUP";
 
8666
  case X86ISD::MOVSLDUP:           return "X86ISD::MOVSLDUP";
 
8667
  case X86ISD::MOVSHDUP_LD:        return "X86ISD::MOVSHDUP_LD";
 
8668
  case X86ISD::MOVSLDUP_LD:        return "X86ISD::MOVSLDUP_LD";
 
8669
  case X86ISD::MOVSD:              return "X86ISD::MOVSD";
 
8670
  case X86ISD::MOVSS:              return "X86ISD::MOVSS";
 
8671
  case X86ISD::UNPCKLPS:           return "X86ISD::UNPCKLPS";
 
8672
  case X86ISD::UNPCKLPD:           return "X86ISD::UNPCKLPD";
 
8673
  case X86ISD::UNPCKHPS:           return "X86ISD::UNPCKHPS";
 
8674
  case X86ISD::UNPCKHPD:           return "X86ISD::UNPCKHPD";
 
8675
  case X86ISD::PUNPCKLBW:          return "X86ISD::PUNPCKLBW";
 
8676
  case X86ISD::PUNPCKLWD:          return "X86ISD::PUNPCKLWD";
 
8677
  case X86ISD::PUNPCKLDQ:          return "X86ISD::PUNPCKLDQ";
 
8678
  case X86ISD::PUNPCKLQDQ:         return "X86ISD::PUNPCKLQDQ";
 
8679
  case X86ISD::PUNPCKHBW:          return "X86ISD::PUNPCKHBW";
 
8680
  case X86ISD::PUNPCKHWD:          return "X86ISD::PUNPCKHWD";
 
8681
  case X86ISD::PUNPCKHDQ:          return "X86ISD::PUNPCKHDQ";
 
8682
  case X86ISD::PUNPCKHQDQ:         return "X86ISD::PUNPCKHQDQ";
 
8683
  case X86ISD::VASTART_SAVE_XMM_REGS: return "X86ISD::VASTART_SAVE_XMM_REGS";
 
8684
  case X86ISD::MINGW_ALLOCA:       return "X86ISD::MINGW_ALLOCA";
 
8685
  }
 
8686
}
 
8687
 
 
8688
// isLegalAddressingMode - Return true if the addressing mode represented
 
8689
// by AM is legal for this target, for a load/store of the specified type.
 
8690
bool X86TargetLowering::isLegalAddressingMode(const AddrMode &AM,
 
8691
                                              const Type *Ty) const {
 
8692
  // X86 supports extremely general addressing modes.
 
8693
  CodeModel::Model M = getTargetMachine().getCodeModel();
 
8694
  Reloc::Model R = getTargetMachine().getRelocationModel();
 
8695
 
 
8696
  // X86 allows a sign-extended 32-bit immediate field as a displacement.
 
8697
  if (!X86::isOffsetSuitableForCodeModel(AM.BaseOffs, M, AM.BaseGV != NULL))
 
8698
    return false;
 
8699
 
 
8700
  if (AM.BaseGV) {
 
8701
    unsigned GVFlags =
 
8702
      Subtarget->ClassifyGlobalReference(AM.BaseGV, getTargetMachine());
 
8703
 
 
8704
    // If a reference to this global requires an extra load, we can't fold it.
 
8705
    if (isGlobalStubReference(GVFlags))
 
8706
      return false;
 
8707
 
 
8708
    // If BaseGV requires a register for the PIC base, we cannot also have a
 
8709
    // BaseReg specified.
 
8710
    if (AM.HasBaseReg && isGlobalRelativeToPICBase(GVFlags))
 
8711
      return false;
 
8712
 
 
8713
    // If lower 4G is not available, then we must use rip-relative addressing.
 
8714
    if ((M != CodeModel::Small || R != Reloc::Static) &&
 
8715
        Subtarget->is64Bit() && (AM.BaseOffs || AM.Scale > 1))
 
8716
      return false;
 
8717
  }
 
8718
 
 
8719
  switch (AM.Scale) {
 
8720
  case 0:
 
8721
  case 1:
 
8722
  case 2:
 
8723
  case 4:
 
8724
  case 8:
 
8725
    // These scales always work.
 
8726
    break;
 
8727
  case 3:
 
8728
  case 5:
 
8729
  case 9:
 
8730
    // These scales are formed with basereg+scalereg.  Only accept if there is
 
8731
    // no basereg yet.
 
8732
    if (AM.HasBaseReg)
 
8733
      return false;
 
8734
    break;
 
8735
  default:  // Other stuff never works.
 
8736
    return false;
 
8737
  }
 
8738
 
 
8739
  return true;
 
8740
}
 
8741
 
 
8742
 
 
8743
bool X86TargetLowering::isTruncateFree(const Type *Ty1, const Type *Ty2) const {
 
8744
  if (!Ty1->isIntegerTy() || !Ty2->isIntegerTy())
 
8745
    return false;
 
8746
  unsigned NumBits1 = Ty1->getPrimitiveSizeInBits();
 
8747
  unsigned NumBits2 = Ty2->getPrimitiveSizeInBits();
 
8748
  if (NumBits1 <= NumBits2)
 
8749
    return false;
 
8750
  return true;
 
8751
}
 
8752
 
 
8753
bool X86TargetLowering::isTruncateFree(EVT VT1, EVT VT2) const {
 
8754
  if (!VT1.isInteger() || !VT2.isInteger())
 
8755
    return false;
 
8756
  unsigned NumBits1 = VT1.getSizeInBits();
 
8757
  unsigned NumBits2 = VT2.getSizeInBits();
 
8758
  if (NumBits1 <= NumBits2)
 
8759
    return false;
 
8760
  return true;
 
8761
}
 
8762
 
 
8763
bool X86TargetLowering::isZExtFree(const Type *Ty1, const Type *Ty2) const {
 
8764
  // x86-64 implicitly zero-extends 32-bit results in 64-bit registers.
 
8765
  return Ty1->isIntegerTy(32) && Ty2->isIntegerTy(64) && Subtarget->is64Bit();
 
8766
}
 
8767
 
 
8768
bool X86TargetLowering::isZExtFree(EVT VT1, EVT VT2) const {
 
8769
  // x86-64 implicitly zero-extends 32-bit results in 64-bit registers.
 
8770
  return VT1 == MVT::i32 && VT2 == MVT::i64 && Subtarget->is64Bit();
 
8771
}
 
8772
 
 
8773
bool X86TargetLowering::isNarrowingProfitable(EVT VT1, EVT VT2) const {
 
8774
  // i16 instructions are longer (0x66 prefix) and potentially slower.
 
8775
  return !(VT1 == MVT::i32 && VT2 == MVT::i16);
 
8776
}
 
8777
 
 
8778
/// isShuffleMaskLegal - Targets can use this to indicate that they only
 
8779
/// support *some* VECTOR_SHUFFLE operations, those with specific masks.
 
8780
/// By default, if a target supports the VECTOR_SHUFFLE node, all mask values
 
8781
/// are assumed to be legal.
 
8782
bool
 
8783
X86TargetLowering::isShuffleMaskLegal(const SmallVectorImpl<int> &M,
 
8784
                                      EVT VT) const {
 
8785
  // Very little shuffling can be done for 64-bit vectors right now.
 
8786
  if (VT.getSizeInBits() == 64)
 
8787
    return isPALIGNRMask(M, VT, Subtarget->hasSSSE3());
 
8788
 
 
8789
  // FIXME: pshufb, blends, shifts.
 
8790
  return (VT.getVectorNumElements() == 2 ||
 
8791
          ShuffleVectorSDNode::isSplatMask(&M[0], VT) ||
 
8792
          isMOVLMask(M, VT) ||
 
8793
          isSHUFPMask(M, VT) ||
 
8794
          isPSHUFDMask(M, VT) ||
 
8795
          isPSHUFHWMask(M, VT) ||
 
8796
          isPSHUFLWMask(M, VT) ||
 
8797
          isPALIGNRMask(M, VT, Subtarget->hasSSSE3()) ||
 
8798
          isUNPCKLMask(M, VT) ||
 
8799
          isUNPCKHMask(M, VT) ||
 
8800
          isUNPCKL_v_undef_Mask(M, VT) ||
 
8801
          isUNPCKH_v_undef_Mask(M, VT));
 
8802
}
 
8803
 
 
8804
bool
 
8805
X86TargetLowering::isVectorClearMaskLegal(const SmallVectorImpl<int> &Mask,
 
8806
                                          EVT VT) const {
 
8807
  unsigned NumElts = VT.getVectorNumElements();
 
8808
  // FIXME: This collection of masks seems suspect.
 
8809
  if (NumElts == 2)
 
8810
    return true;
 
8811
  if (NumElts == 4 && VT.getSizeInBits() == 128) {
 
8812
    return (isMOVLMask(Mask, VT)  ||
 
8813
            isCommutedMOVLMask(Mask, VT, true) ||
 
8814
            isSHUFPMask(Mask, VT) ||
 
8815
            isCommutedSHUFPMask(Mask, VT));
 
8816
  }
 
8817
  return false;
 
8818
}
 
8819
 
 
8820
//===----------------------------------------------------------------------===//
 
8821
//                           X86 Scheduler Hooks
 
8822
//===----------------------------------------------------------------------===//
 
8823
 
 
8824
// private utility function
 
8825
MachineBasicBlock *
 
8826
X86TargetLowering::EmitAtomicBitwiseWithCustomInserter(MachineInstr *bInstr,
 
8827
                                                       MachineBasicBlock *MBB,
 
8828
                                                       unsigned regOpc,
 
8829
                                                       unsigned immOpc,
 
8830
                                                       unsigned LoadOpc,
 
8831
                                                       unsigned CXchgOpc,
 
8832
                                                       unsigned notOpc,
 
8833
                                                       unsigned EAXreg,
 
8834
                                                       TargetRegisterClass *RC,
 
8835
                                                       bool invSrc) const {
 
8836
  // For the atomic bitwise operator, we generate
 
8837
  //   thisMBB:
 
8838
  //   newMBB:
 
8839
  //     ld  t1 = [bitinstr.addr]
 
8840
  //     op  t2 = t1, [bitinstr.val]
 
8841
  //     mov EAX = t1
 
8842
  //     lcs dest = [bitinstr.addr], t2  [EAX is implicit]
 
8843
  //     bz  newMBB
 
8844
  //     fallthrough -->nextMBB
 
8845
  const TargetInstrInfo *TII = getTargetMachine().getInstrInfo();
 
8846
  const BasicBlock *LLVM_BB = MBB->getBasicBlock();
 
8847
  MachineFunction::iterator MBBIter = MBB;
 
8848
  ++MBBIter;
 
8849
 
 
8850
  /// First build the CFG
 
8851
  MachineFunction *F = MBB->getParent();
 
8852
  MachineBasicBlock *thisMBB = MBB;
 
8853
  MachineBasicBlock *newMBB = F->CreateMachineBasicBlock(LLVM_BB);
 
8854
  MachineBasicBlock *nextMBB = F->CreateMachineBasicBlock(LLVM_BB);
 
8855
  F->insert(MBBIter, newMBB);
 
8856
  F->insert(MBBIter, nextMBB);
 
8857
 
 
8858
  // Transfer the remainder of thisMBB and its successor edges to nextMBB.
 
8859
  nextMBB->splice(nextMBB->begin(), thisMBB,
 
8860
                  llvm::next(MachineBasicBlock::iterator(bInstr)),
 
8861
                  thisMBB->end());
 
8862
  nextMBB->transferSuccessorsAndUpdatePHIs(thisMBB);
 
8863
 
 
8864
  // Update thisMBB to fall through to newMBB
 
8865
  thisMBB->addSuccessor(newMBB);
 
8866
 
 
8867
  // newMBB jumps to itself and fall through to nextMBB
 
8868
  newMBB->addSuccessor(nextMBB);
 
8869
  newMBB->addSuccessor(newMBB);
 
8870
 
 
8871
  // Insert instructions into newMBB based on incoming instruction
 
8872
  assert(bInstr->getNumOperands() < X86::AddrNumOperands + 4 &&
 
8873
         "unexpected number of operands");
 
8874
  DebugLoc dl = bInstr->getDebugLoc();
 
8875
  MachineOperand& destOper = bInstr->getOperand(0);
 
8876
  MachineOperand* argOpers[2 + X86::AddrNumOperands];
 
8877
  int numArgs = bInstr->getNumOperands() - 1;
 
8878
  for (int i=0; i < numArgs; ++i)
 
8879
    argOpers[i] = &bInstr->getOperand(i+1);
 
8880
 
 
8881
  // x86 address has 4 operands: base, index, scale, and displacement
 
8882
  int lastAddrIndx = X86::AddrNumOperands - 1; // [0,3]
 
8883
  int valArgIndx = lastAddrIndx + 1;
 
8884
 
 
8885
  unsigned t1 = F->getRegInfo().createVirtualRegister(RC);
 
8886
  MachineInstrBuilder MIB = BuildMI(newMBB, dl, TII->get(LoadOpc), t1);
 
8887
  for (int i=0; i <= lastAddrIndx; ++i)
 
8888
    (*MIB).addOperand(*argOpers[i]);
 
8889
 
 
8890
  unsigned tt = F->getRegInfo().createVirtualRegister(RC);
 
8891
  if (invSrc) {
 
8892
    MIB = BuildMI(newMBB, dl, TII->get(notOpc), tt).addReg(t1);
 
8893
  }
 
8894
  else
 
8895
    tt = t1;
 
8896
 
 
8897
  unsigned t2 = F->getRegInfo().createVirtualRegister(RC);
 
8898
  assert((argOpers[valArgIndx]->isReg() ||
 
8899
          argOpers[valArgIndx]->isImm()) &&
 
8900
         "invalid operand");
 
8901
  if (argOpers[valArgIndx]->isReg())
 
8902
    MIB = BuildMI(newMBB, dl, TII->get(regOpc), t2);
 
8903
  else
 
8904
    MIB = BuildMI(newMBB, dl, TII->get(immOpc), t2);
 
8905
  MIB.addReg(tt);
 
8906
  (*MIB).addOperand(*argOpers[valArgIndx]);
 
8907
 
 
8908
  MIB = BuildMI(newMBB, dl, TII->get(TargetOpcode::COPY), EAXreg);
 
8909
  MIB.addReg(t1);
 
8910
 
 
8911
  MIB = BuildMI(newMBB, dl, TII->get(CXchgOpc));
 
8912
  for (int i=0; i <= lastAddrIndx; ++i)
 
8913
    (*MIB).addOperand(*argOpers[i]);
 
8914
  MIB.addReg(t2);
 
8915
  assert(bInstr->hasOneMemOperand() && "Unexpected number of memoperand");
 
8916
  (*MIB).setMemRefs(bInstr->memoperands_begin(),
 
8917
                    bInstr->memoperands_end());
 
8918
 
 
8919
  MIB = BuildMI(newMBB, dl, TII->get(TargetOpcode::COPY), destOper.getReg());
 
8920
  MIB.addReg(EAXreg);
 
8921
 
 
8922
  // insert branch
 
8923
  BuildMI(newMBB, dl, TII->get(X86::JNE_4)).addMBB(newMBB);
 
8924
 
 
8925
  bInstr->eraseFromParent();   // The pseudo instruction is gone now.
 
8926
  return nextMBB;
 
8927
}
 
8928
 
 
8929
// private utility function:  64 bit atomics on 32 bit host.
 
8930
MachineBasicBlock *
 
8931
X86TargetLowering::EmitAtomicBit6432WithCustomInserter(MachineInstr *bInstr,
 
8932
                                                       MachineBasicBlock *MBB,
 
8933
                                                       unsigned regOpcL,
 
8934
                                                       unsigned regOpcH,
 
8935
                                                       unsigned immOpcL,
 
8936
                                                       unsigned immOpcH,
 
8937
                                                       bool invSrc) const {
 
8938
  // For the atomic bitwise operator, we generate
 
8939
  //   thisMBB (instructions are in pairs, except cmpxchg8b)
 
8940
  //     ld t1,t2 = [bitinstr.addr]
 
8941
  //   newMBB:
 
8942
  //     out1, out2 = phi (thisMBB, t1/t2) (newMBB, t3/t4)
 
8943
  //     op  t5, t6 <- out1, out2, [bitinstr.val]
 
8944
  //      (for SWAP, substitute:  mov t5, t6 <- [bitinstr.val])
 
8945
  //     mov ECX, EBX <- t5, t6
 
8946
  //     mov EAX, EDX <- t1, t2
 
8947
  //     cmpxchg8b [bitinstr.addr]  [EAX, EDX, EBX, ECX implicit]
 
8948
  //     mov t3, t4 <- EAX, EDX
 
8949
  //     bz  newMBB
 
8950
  //     result in out1, out2
 
8951
  //     fallthrough -->nextMBB
 
8952
 
 
8953
  const TargetRegisterClass *RC = X86::GR32RegisterClass;
 
8954
  const unsigned LoadOpc = X86::MOV32rm;
 
8955
  const unsigned NotOpc = X86::NOT32r;
 
8956
  const TargetInstrInfo *TII = getTargetMachine().getInstrInfo();
 
8957
  const BasicBlock *LLVM_BB = MBB->getBasicBlock();
 
8958
  MachineFunction::iterator MBBIter = MBB;
 
8959
  ++MBBIter;
 
8960
 
 
8961
  /// First build the CFG
 
8962
  MachineFunction *F = MBB->getParent();
 
8963
  MachineBasicBlock *thisMBB = MBB;
 
8964
  MachineBasicBlock *newMBB = F->CreateMachineBasicBlock(LLVM_BB);
 
8965
  MachineBasicBlock *nextMBB = F->CreateMachineBasicBlock(LLVM_BB);
 
8966
  F->insert(MBBIter, newMBB);
 
8967
  F->insert(MBBIter, nextMBB);
 
8968
 
 
8969
  // Transfer the remainder of thisMBB and its successor edges to nextMBB.
 
8970
  nextMBB->splice(nextMBB->begin(), thisMBB,
 
8971
                  llvm::next(MachineBasicBlock::iterator(bInstr)),
 
8972
                  thisMBB->end());
 
8973
  nextMBB->transferSuccessorsAndUpdatePHIs(thisMBB);
 
8974
 
 
8975
  // Update thisMBB to fall through to newMBB
 
8976
  thisMBB->addSuccessor(newMBB);
 
8977
 
 
8978
  // newMBB jumps to itself and fall through to nextMBB
 
8979
  newMBB->addSuccessor(nextMBB);
 
8980
  newMBB->addSuccessor(newMBB);
 
8981
 
 
8982
  DebugLoc dl = bInstr->getDebugLoc();
 
8983
  // Insert instructions into newMBB based on incoming instruction
 
8984
  // There are 8 "real" operands plus 9 implicit def/uses, ignored here.
 
8985
  assert(bInstr->getNumOperands() < X86::AddrNumOperands + 14 &&
 
8986
         "unexpected number of operands");
 
8987
  MachineOperand& dest1Oper = bInstr->getOperand(0);
 
8988
  MachineOperand& dest2Oper = bInstr->getOperand(1);
 
8989
  MachineOperand* argOpers[2 + X86::AddrNumOperands];
 
8990
  for (int i=0; i < 2 + X86::AddrNumOperands; ++i) {
 
8991
    argOpers[i] = &bInstr->getOperand(i+2);
 
8992
 
 
8993
    // We use some of the operands multiple times, so conservatively just
 
8994
    // clear any kill flags that might be present.
 
8995
    if (argOpers[i]->isReg() && argOpers[i]->isUse())
 
8996
      argOpers[i]->setIsKill(false);
 
8997
  }
 
8998
 
 
8999
  // x86 address has 5 operands: base, index, scale, displacement, and segment.
 
9000
  int lastAddrIndx = X86::AddrNumOperands - 1; // [0,3]
 
9001
 
 
9002
  unsigned t1 = F->getRegInfo().createVirtualRegister(RC);
 
9003
  MachineInstrBuilder MIB = BuildMI(thisMBB, dl, TII->get(LoadOpc), t1);
 
9004
  for (int i=0; i <= lastAddrIndx; ++i)
 
9005
    (*MIB).addOperand(*argOpers[i]);
 
9006
  unsigned t2 = F->getRegInfo().createVirtualRegister(RC);
 
9007
  MIB = BuildMI(thisMBB, dl, TII->get(LoadOpc), t2);
 
9008
  // add 4 to displacement.
 
9009
  for (int i=0; i <= lastAddrIndx-2; ++i)
 
9010
    (*MIB).addOperand(*argOpers[i]);
 
9011
  MachineOperand newOp3 = *(argOpers[3]);
 
9012
  if (newOp3.isImm())
 
9013
    newOp3.setImm(newOp3.getImm()+4);
 
9014
  else
 
9015
    newOp3.setOffset(newOp3.getOffset()+4);
 
9016
  (*MIB).addOperand(newOp3);
 
9017
  (*MIB).addOperand(*argOpers[lastAddrIndx]);
 
9018
 
 
9019
  // t3/4 are defined later, at the bottom of the loop
 
9020
  unsigned t3 = F->getRegInfo().createVirtualRegister(RC);
 
9021
  unsigned t4 = F->getRegInfo().createVirtualRegister(RC);
 
9022
  BuildMI(newMBB, dl, TII->get(X86::PHI), dest1Oper.getReg())
 
9023
    .addReg(t1).addMBB(thisMBB).addReg(t3).addMBB(newMBB);
 
9024
  BuildMI(newMBB, dl, TII->get(X86::PHI), dest2Oper.getReg())
 
9025
    .addReg(t2).addMBB(thisMBB).addReg(t4).addMBB(newMBB);
 
9026
 
 
9027
  // The subsequent operations should be using the destination registers of
 
9028
  //the PHI instructions.
 
9029
  if (invSrc) {
 
9030
    t1 = F->getRegInfo().createVirtualRegister(RC);
 
9031
    t2 = F->getRegInfo().createVirtualRegister(RC);
 
9032
    MIB = BuildMI(newMBB, dl, TII->get(NotOpc), t1).addReg(dest1Oper.getReg());
 
9033
    MIB = BuildMI(newMBB, dl, TII->get(NotOpc), t2).addReg(dest2Oper.getReg());
 
9034
  } else {
 
9035
    t1 = dest1Oper.getReg();
 
9036
    t2 = dest2Oper.getReg();
 
9037
  }
 
9038
 
 
9039
  int valArgIndx = lastAddrIndx + 1;
 
9040
  assert((argOpers[valArgIndx]->isReg() ||
 
9041
          argOpers[valArgIndx]->isImm()) &&
 
9042
         "invalid operand");
 
9043
  unsigned t5 = F->getRegInfo().createVirtualRegister(RC);
 
9044
  unsigned t6 = F->getRegInfo().createVirtualRegister(RC);
 
9045
  if (argOpers[valArgIndx]->isReg())
 
9046
    MIB = BuildMI(newMBB, dl, TII->get(regOpcL), t5);
 
9047
  else
 
9048
    MIB = BuildMI(newMBB, dl, TII->get(immOpcL), t5);
 
9049
  if (regOpcL != X86::MOV32rr)
 
9050
    MIB.addReg(t1);
 
9051
  (*MIB).addOperand(*argOpers[valArgIndx]);
 
9052
  assert(argOpers[valArgIndx + 1]->isReg() ==
 
9053
         argOpers[valArgIndx]->isReg());
 
9054
  assert(argOpers[valArgIndx + 1]->isImm() ==
 
9055
         argOpers[valArgIndx]->isImm());
 
9056
  if (argOpers[valArgIndx + 1]->isReg())
 
9057
    MIB = BuildMI(newMBB, dl, TII->get(regOpcH), t6);
 
9058
  else
 
9059
    MIB = BuildMI(newMBB, dl, TII->get(immOpcH), t6);
 
9060
  if (regOpcH != X86::MOV32rr)
 
9061
    MIB.addReg(t2);
 
9062
  (*MIB).addOperand(*argOpers[valArgIndx + 1]);
 
9063
 
 
9064
  MIB = BuildMI(newMBB, dl, TII->get(TargetOpcode::COPY), X86::EAX);
 
9065
  MIB.addReg(t1);
 
9066
  MIB = BuildMI(newMBB, dl, TII->get(TargetOpcode::COPY), X86::EDX);
 
9067
  MIB.addReg(t2);
 
9068
 
 
9069
  MIB = BuildMI(newMBB, dl, TII->get(TargetOpcode::COPY), X86::EBX);
 
9070
  MIB.addReg(t5);
 
9071
  MIB = BuildMI(newMBB, dl, TII->get(TargetOpcode::COPY), X86::ECX);
 
9072
  MIB.addReg(t6);
 
9073
 
 
9074
  MIB = BuildMI(newMBB, dl, TII->get(X86::LCMPXCHG8B));
 
9075
  for (int i=0; i <= lastAddrIndx; ++i)
 
9076
    (*MIB).addOperand(*argOpers[i]);
 
9077
 
 
9078
  assert(bInstr->hasOneMemOperand() && "Unexpected number of memoperand");
 
9079
  (*MIB).setMemRefs(bInstr->memoperands_begin(),
 
9080
                    bInstr->memoperands_end());
 
9081
 
 
9082
  MIB = BuildMI(newMBB, dl, TII->get(TargetOpcode::COPY), t3);
 
9083
  MIB.addReg(X86::EAX);
 
9084
  MIB = BuildMI(newMBB, dl, TII->get(TargetOpcode::COPY), t4);
 
9085
  MIB.addReg(X86::EDX);
 
9086
 
 
9087
  // insert branch
 
9088
  BuildMI(newMBB, dl, TII->get(X86::JNE_4)).addMBB(newMBB);
 
9089
 
 
9090
  bInstr->eraseFromParent();   // The pseudo instruction is gone now.
 
9091
  return nextMBB;
 
9092
}
 
9093
 
 
9094
// private utility function
 
9095
MachineBasicBlock *
 
9096
X86TargetLowering::EmitAtomicMinMaxWithCustomInserter(MachineInstr *mInstr,
 
9097
                                                      MachineBasicBlock *MBB,
 
9098
                                                      unsigned cmovOpc) const {
 
9099
  // For the atomic min/max operator, we generate
 
9100
  //   thisMBB:
 
9101
  //   newMBB:
 
9102
  //     ld t1 = [min/max.addr]
 
9103
  //     mov t2 = [min/max.val]
 
9104
  //     cmp  t1, t2
 
9105
  //     cmov[cond] t2 = t1
 
9106
  //     mov EAX = t1
 
9107
  //     lcs dest = [bitinstr.addr], t2  [EAX is implicit]
 
9108
  //     bz   newMBB
 
9109
  //     fallthrough -->nextMBB
 
9110
  //
 
9111
  const TargetInstrInfo *TII = getTargetMachine().getInstrInfo();
 
9112
  const BasicBlock *LLVM_BB = MBB->getBasicBlock();
 
9113
  MachineFunction::iterator MBBIter = MBB;
 
9114
  ++MBBIter;
 
9115
 
 
9116
  /// First build the CFG
 
9117
  MachineFunction *F = MBB->getParent();
 
9118
  MachineBasicBlock *thisMBB = MBB;
 
9119
  MachineBasicBlock *newMBB = F->CreateMachineBasicBlock(LLVM_BB);
 
9120
  MachineBasicBlock *nextMBB = F->CreateMachineBasicBlock(LLVM_BB);
 
9121
  F->insert(MBBIter, newMBB);
 
9122
  F->insert(MBBIter, nextMBB);
 
9123
 
 
9124
  // Transfer the remainder of thisMBB and its successor edges to nextMBB.
 
9125
  nextMBB->splice(nextMBB->begin(), thisMBB,
 
9126
                  llvm::next(MachineBasicBlock::iterator(mInstr)),
 
9127
                  thisMBB->end());
 
9128
  nextMBB->transferSuccessorsAndUpdatePHIs(thisMBB);
 
9129
 
 
9130
  // Update thisMBB to fall through to newMBB
 
9131
  thisMBB->addSuccessor(newMBB);
 
9132
 
 
9133
  // newMBB jumps to newMBB and fall through to nextMBB
 
9134
  newMBB->addSuccessor(nextMBB);
 
9135
  newMBB->addSuccessor(newMBB);
 
9136
 
 
9137
  DebugLoc dl = mInstr->getDebugLoc();
 
9138
  // Insert instructions into newMBB based on incoming instruction
 
9139
  assert(mInstr->getNumOperands() < X86::AddrNumOperands + 4 &&
 
9140
         "unexpected number of operands");
 
9141
  MachineOperand& destOper = mInstr->getOperand(0);
 
9142
  MachineOperand* argOpers[2 + X86::AddrNumOperands];
 
9143
  int numArgs = mInstr->getNumOperands() - 1;
 
9144
  for (int i=0; i < numArgs; ++i)
 
9145
    argOpers[i] = &mInstr->getOperand(i+1);
 
9146
 
 
9147
  // x86 address has 4 operands: base, index, scale, and displacement
 
9148
  int lastAddrIndx = X86::AddrNumOperands - 1; // [0,3]
 
9149
  int valArgIndx = lastAddrIndx + 1;
 
9150
 
 
9151
  unsigned t1 = F->getRegInfo().createVirtualRegister(X86::GR32RegisterClass);
 
9152
  MachineInstrBuilder MIB = BuildMI(newMBB, dl, TII->get(X86::MOV32rm), t1);
 
9153
  for (int i=0; i <= lastAddrIndx; ++i)
 
9154
    (*MIB).addOperand(*argOpers[i]);
 
9155
 
 
9156
  // We only support register and immediate values
 
9157
  assert((argOpers[valArgIndx]->isReg() ||
 
9158
          argOpers[valArgIndx]->isImm()) &&
 
9159
         "invalid operand");
 
9160
 
 
9161
  unsigned t2 = F->getRegInfo().createVirtualRegister(X86::GR32RegisterClass);
 
9162
  if (argOpers[valArgIndx]->isReg())
 
9163
    MIB = BuildMI(newMBB, dl, TII->get(TargetOpcode::COPY), t2);
 
9164
  else
 
9165
    MIB = BuildMI(newMBB, dl, TII->get(X86::MOV32rr), t2);
 
9166
  (*MIB).addOperand(*argOpers[valArgIndx]);
 
9167
 
 
9168
  MIB = BuildMI(newMBB, dl, TII->get(TargetOpcode::COPY), X86::EAX);
 
9169
  MIB.addReg(t1);
 
9170
 
 
9171
  MIB = BuildMI(newMBB, dl, TII->get(X86::CMP32rr));
 
9172
  MIB.addReg(t1);
 
9173
  MIB.addReg(t2);
 
9174
 
 
9175
  // Generate movc
 
9176
  unsigned t3 = F->getRegInfo().createVirtualRegister(X86::GR32RegisterClass);
 
9177
  MIB = BuildMI(newMBB, dl, TII->get(cmovOpc),t3);
 
9178
  MIB.addReg(t2);
 
9179
  MIB.addReg(t1);
 
9180
 
 
9181
  // Cmp and exchange if none has modified the memory location
 
9182
  MIB = BuildMI(newMBB, dl, TII->get(X86::LCMPXCHG32));
 
9183
  for (int i=0; i <= lastAddrIndx; ++i)
 
9184
    (*MIB).addOperand(*argOpers[i]);
 
9185
  MIB.addReg(t3);
 
9186
  assert(mInstr->hasOneMemOperand() && "Unexpected number of memoperand");
 
9187
  (*MIB).setMemRefs(mInstr->memoperands_begin(),
 
9188
                    mInstr->memoperands_end());
 
9189
 
 
9190
  MIB = BuildMI(newMBB, dl, TII->get(TargetOpcode::COPY), destOper.getReg());
 
9191
  MIB.addReg(X86::EAX);
 
9192
 
 
9193
  // insert branch
 
9194
  BuildMI(newMBB, dl, TII->get(X86::JNE_4)).addMBB(newMBB);
 
9195
 
 
9196
  mInstr->eraseFromParent();   // The pseudo instruction is gone now.
 
9197
  return nextMBB;
 
9198
}
 
9199
 
 
9200
// FIXME: When we get size specific XMM0 registers, i.e. XMM0_V16I8
 
9201
// or XMM0_V32I8 in AVX all of this code can be replaced with that
 
9202
// in the .td file.
 
9203
MachineBasicBlock *
 
9204
X86TargetLowering::EmitPCMP(MachineInstr *MI, MachineBasicBlock *BB,
 
9205
                            unsigned numArgs, bool memArg) const {
 
9206
 
 
9207
  assert((Subtarget->hasSSE42() || Subtarget->hasAVX()) &&
 
9208
         "Target must have SSE4.2 or AVX features enabled");
 
9209
 
 
9210
  DebugLoc dl = MI->getDebugLoc();
 
9211
  const TargetInstrInfo *TII = getTargetMachine().getInstrInfo();
 
9212
 
 
9213
  unsigned Opc;
 
9214
 
 
9215
  if (!Subtarget->hasAVX()) {
 
9216
    if (memArg)
 
9217
      Opc = numArgs == 3 ? X86::PCMPISTRM128rm : X86::PCMPESTRM128rm;
 
9218
    else
 
9219
      Opc = numArgs == 3 ? X86::PCMPISTRM128rr : X86::PCMPESTRM128rr;
 
9220
  } else {
 
9221
    if (memArg)
 
9222
      Opc = numArgs == 3 ? X86::VPCMPISTRM128rm : X86::VPCMPESTRM128rm;
 
9223
    else
 
9224
      Opc = numArgs == 3 ? X86::VPCMPISTRM128rr : X86::VPCMPESTRM128rr;
 
9225
  }
 
9226
 
 
9227
  MachineInstrBuilder MIB = BuildMI(BB, dl, TII->get(Opc));
 
9228
 
 
9229
  for (unsigned i = 0; i < numArgs; ++i) {
 
9230
    MachineOperand &Op = MI->getOperand(i+1);
 
9231
 
 
9232
    if (!(Op.isReg() && Op.isImplicit()))
 
9233
      MIB.addOperand(Op);
 
9234
  }
 
9235
 
 
9236
  BuildMI(BB, dl, TII->get(X86::MOVAPSrr), MI->getOperand(0).getReg())
 
9237
    .addReg(X86::XMM0);
 
9238
 
 
9239
  MI->eraseFromParent();
 
9240
 
 
9241
  return BB;
 
9242
}
 
9243
 
 
9244
MachineBasicBlock *
 
9245
X86TargetLowering::EmitVAStartSaveXMMRegsWithCustomInserter(
 
9246
                                                 MachineInstr *MI,
 
9247
                                                 MachineBasicBlock *MBB) const {
 
9248
  // Emit code to save XMM registers to the stack. The ABI says that the
 
9249
  // number of registers to save is given in %al, so it's theoretically
 
9250
  // possible to do an indirect jump trick to avoid saving all of them,
 
9251
  // however this code takes a simpler approach and just executes all
 
9252
  // of the stores if %al is non-zero. It's less code, and it's probably
 
9253
  // easier on the hardware branch predictor, and stores aren't all that
 
9254
  // expensive anyway.
 
9255
 
 
9256
  // Create the new basic blocks. One block contains all the XMM stores,
 
9257
  // and one block is the final destination regardless of whether any
 
9258
  // stores were performed.
 
9259
  const BasicBlock *LLVM_BB = MBB->getBasicBlock();
 
9260
  MachineFunction *F = MBB->getParent();
 
9261
  MachineFunction::iterator MBBIter = MBB;
 
9262
  ++MBBIter;
 
9263
  MachineBasicBlock *XMMSaveMBB = F->CreateMachineBasicBlock(LLVM_BB);
 
9264
  MachineBasicBlock *EndMBB = F->CreateMachineBasicBlock(LLVM_BB);
 
9265
  F->insert(MBBIter, XMMSaveMBB);
 
9266
  F->insert(MBBIter, EndMBB);
 
9267
 
 
9268
  // Transfer the remainder of MBB and its successor edges to EndMBB.
 
9269
  EndMBB->splice(EndMBB->begin(), MBB,
 
9270
                 llvm::next(MachineBasicBlock::iterator(MI)),
 
9271
                 MBB->end());
 
9272
  EndMBB->transferSuccessorsAndUpdatePHIs(MBB);
 
9273
 
 
9274
  // The original block will now fall through to the XMM save block.
 
9275
  MBB->addSuccessor(XMMSaveMBB);
 
9276
  // The XMMSaveMBB will fall through to the end block.
 
9277
  XMMSaveMBB->addSuccessor(EndMBB);
 
9278
 
 
9279
  // Now add the instructions.
 
9280
  const TargetInstrInfo *TII = getTargetMachine().getInstrInfo();
 
9281
  DebugLoc DL = MI->getDebugLoc();
 
9282
 
 
9283
  unsigned CountReg = MI->getOperand(0).getReg();
 
9284
  int64_t RegSaveFrameIndex = MI->getOperand(1).getImm();
 
9285
  int64_t VarArgsFPOffset = MI->getOperand(2).getImm();
 
9286
 
 
9287
  if (!Subtarget->isTargetWin64()) {
 
9288
    // If %al is 0, branch around the XMM save block.
 
9289
    BuildMI(MBB, DL, TII->get(X86::TEST8rr)).addReg(CountReg).addReg(CountReg);
 
9290
    BuildMI(MBB, DL, TII->get(X86::JE_4)).addMBB(EndMBB);
 
9291
    MBB->addSuccessor(EndMBB);
 
9292
  }
 
9293
 
 
9294
  // In the XMM save block, save all the XMM argument registers.
 
9295
  for (int i = 3, e = MI->getNumOperands(); i != e; ++i) {
 
9296
    int64_t Offset = (i - 3) * 16 + VarArgsFPOffset;
 
9297
    MachineMemOperand *MMO =
 
9298
      F->getMachineMemOperand(
 
9299
        PseudoSourceValue::getFixedStack(RegSaveFrameIndex),
 
9300
        MachineMemOperand::MOStore, Offset,
 
9301
        /*Size=*/16, /*Align=*/16);
 
9302
    BuildMI(XMMSaveMBB, DL, TII->get(X86::MOVAPSmr))
 
9303
      .addFrameIndex(RegSaveFrameIndex)
 
9304
      .addImm(/*Scale=*/1)
 
9305
      .addReg(/*IndexReg=*/0)
 
9306
      .addImm(/*Disp=*/Offset)
 
9307
      .addReg(/*Segment=*/0)
 
9308
      .addReg(MI->getOperand(i).getReg())
 
9309
      .addMemOperand(MMO);
 
9310
  }
 
9311
 
 
9312
  MI->eraseFromParent();   // The pseudo instruction is gone now.
 
9313
 
 
9314
  return EndMBB;
 
9315
}
 
9316
 
 
9317
MachineBasicBlock *
 
9318
X86TargetLowering::EmitLoweredSelect(MachineInstr *MI,
 
9319
                                     MachineBasicBlock *BB) const {
 
9320
  const TargetInstrInfo *TII = getTargetMachine().getInstrInfo();
 
9321
  DebugLoc DL = MI->getDebugLoc();
 
9322
 
 
9323
  // To "insert" a SELECT_CC instruction, we actually have to insert the
 
9324
  // diamond control-flow pattern.  The incoming instruction knows the
 
9325
  // destination vreg to set, the condition code register to branch on, the
 
9326
  // true/false values to select between, and a branch opcode to use.
 
9327
  const BasicBlock *LLVM_BB = BB->getBasicBlock();
 
9328
  MachineFunction::iterator It = BB;
 
9329
  ++It;
 
9330
 
 
9331
  //  thisMBB:
 
9332
  //  ...
 
9333
  //   TrueVal = ...
 
9334
  //   cmpTY ccX, r1, r2
 
9335
  //   bCC copy1MBB
 
9336
  //   fallthrough --> copy0MBB
 
9337
  MachineBasicBlock *thisMBB = BB;
 
9338
  MachineFunction *F = BB->getParent();
 
9339
  MachineBasicBlock *copy0MBB = F->CreateMachineBasicBlock(LLVM_BB);
 
9340
  MachineBasicBlock *sinkMBB = F->CreateMachineBasicBlock(LLVM_BB);
 
9341
  F->insert(It, copy0MBB);
 
9342
  F->insert(It, sinkMBB);
 
9343
 
 
9344
  // If the EFLAGS register isn't dead in the terminator, then claim that it's
 
9345
  // live into the sink and copy blocks.
 
9346
  const MachineFunction *MF = BB->getParent();
 
9347
  const TargetRegisterInfo *TRI = MF->getTarget().getRegisterInfo();
 
9348
  BitVector ReservedRegs = TRI->getReservedRegs(*MF);
 
9349
 
 
9350
  for (unsigned I = 0, E = MI->getNumOperands(); I != E; ++I) {
 
9351
    const MachineOperand &MO = MI->getOperand(I);
 
9352
    if (!MO.isReg() || !MO.isUse() || MO.isKill()) continue;
 
9353
    unsigned Reg = MO.getReg();
 
9354
    if (Reg != X86::EFLAGS) continue;
 
9355
    copy0MBB->addLiveIn(Reg);
 
9356
    sinkMBB->addLiveIn(Reg);
 
9357
  }
 
9358
 
 
9359
  // Transfer the remainder of BB and its successor edges to sinkMBB.
 
9360
  sinkMBB->splice(sinkMBB->begin(), BB,
 
9361
                  llvm::next(MachineBasicBlock::iterator(MI)),
 
9362
                  BB->end());
 
9363
  sinkMBB->transferSuccessorsAndUpdatePHIs(BB);
 
9364
 
 
9365
  // Add the true and fallthrough blocks as its successors.
 
9366
  BB->addSuccessor(copy0MBB);
 
9367
  BB->addSuccessor(sinkMBB);
 
9368
 
 
9369
  // Create the conditional branch instruction.
 
9370
  unsigned Opc =
 
9371
    X86::GetCondBranchFromCond((X86::CondCode)MI->getOperand(3).getImm());
 
9372
  BuildMI(BB, DL, TII->get(Opc)).addMBB(sinkMBB);
 
9373
 
 
9374
  //  copy0MBB:
 
9375
  //   %FalseValue = ...
 
9376
  //   # fallthrough to sinkMBB
 
9377
  copy0MBB->addSuccessor(sinkMBB);
 
9378
 
 
9379
  //  sinkMBB:
 
9380
  //   %Result = phi [ %FalseValue, copy0MBB ], [ %TrueValue, thisMBB ]
 
9381
  //  ...
 
9382
  BuildMI(*sinkMBB, sinkMBB->begin(), DL,
 
9383
          TII->get(X86::PHI), MI->getOperand(0).getReg())
 
9384
    .addReg(MI->getOperand(1).getReg()).addMBB(copy0MBB)
 
9385
    .addReg(MI->getOperand(2).getReg()).addMBB(thisMBB);
 
9386
 
 
9387
  MI->eraseFromParent();   // The pseudo instruction is gone now.
 
9388
  return sinkMBB;
 
9389
}
 
9390
 
 
9391
MachineBasicBlock *
 
9392
X86TargetLowering::EmitLoweredMingwAlloca(MachineInstr *MI,
 
9393
                                          MachineBasicBlock *BB) const {
 
9394
  const TargetInstrInfo *TII = getTargetMachine().getInstrInfo();
 
9395
  DebugLoc DL = MI->getDebugLoc();
 
9396
 
 
9397
  // The lowering is pretty easy: we're just emitting the call to _alloca.  The
 
9398
  // non-trivial part is impdef of ESP.
 
9399
  // FIXME: The code should be tweaked as soon as we'll try to do codegen for
 
9400
  // mingw-w64.
 
9401
 
 
9402
  BuildMI(*BB, MI, DL, TII->get(X86::CALLpcrel32))
 
9403
    .addExternalSymbol("_alloca")
 
9404
    .addReg(X86::EAX, RegState::Implicit)
 
9405
    .addReg(X86::ESP, RegState::Implicit)
 
9406
    .addReg(X86::EAX, RegState::Define | RegState::Implicit)
 
9407
    .addReg(X86::ESP, RegState::Define | RegState::Implicit)
 
9408
    .addReg(X86::EFLAGS, RegState::Define | RegState::Implicit);
 
9409
 
 
9410
  MI->eraseFromParent();   // The pseudo instruction is gone now.
 
9411
  return BB;
 
9412
}
 
9413
 
 
9414
MachineBasicBlock *
 
9415
X86TargetLowering::EmitLoweredTLSCall(MachineInstr *MI,
 
9416
                                      MachineBasicBlock *BB) const {
 
9417
  // This is pretty easy.  We're taking the value that we received from
 
9418
  // our load from the relocation, sticking it in either RDI (x86-64)
 
9419
  // or EAX and doing an indirect call.  The return value will then
 
9420
  // be in the normal return register.
 
9421
  const X86InstrInfo *TII 
 
9422
    = static_cast<const X86InstrInfo*>(getTargetMachine().getInstrInfo());
 
9423
  DebugLoc DL = MI->getDebugLoc();
 
9424
  MachineFunction *F = BB->getParent();
 
9425
  bool IsWin64 = Subtarget->isTargetWin64();
 
9426
  
 
9427
  assert(MI->getOperand(3).isGlobal() && "This should be a global");
 
9428
  
 
9429
  if (Subtarget->is64Bit()) {
 
9430
    MachineInstrBuilder MIB = BuildMI(*BB, MI, DL,
 
9431
                                      TII->get(X86::MOV64rm), X86::RDI)
 
9432
    .addReg(X86::RIP)
 
9433
    .addImm(0).addReg(0)
 
9434
    .addGlobalAddress(MI->getOperand(3).getGlobal(), 0, 
 
9435
                      MI->getOperand(3).getTargetFlags())
 
9436
    .addReg(0);
 
9437
    MIB = BuildMI(*BB, MI, DL, TII->get(IsWin64 ? X86::WINCALL64m : X86::CALL64m));
 
9438
    addDirectMem(MIB, X86::RDI);
 
9439
  } else if (getTargetMachine().getRelocationModel() != Reloc::PIC_) {
 
9440
    MachineInstrBuilder MIB = BuildMI(*BB, MI, DL,
 
9441
                                      TII->get(X86::MOV32rm), X86::EAX)
 
9442
    .addReg(0)
 
9443
    .addImm(0).addReg(0)
 
9444
    .addGlobalAddress(MI->getOperand(3).getGlobal(), 0, 
 
9445
                      MI->getOperand(3).getTargetFlags())
 
9446
    .addReg(0);
 
9447
    MIB = BuildMI(*BB, MI, DL, TII->get(X86::CALL32m));
 
9448
    addDirectMem(MIB, X86::EAX);
 
9449
  } else {
 
9450
    MachineInstrBuilder MIB = BuildMI(*BB, MI, DL,
 
9451
                                      TII->get(X86::MOV32rm), X86::EAX)
 
9452
    .addReg(TII->getGlobalBaseReg(F))
 
9453
    .addImm(0).addReg(0)
 
9454
    .addGlobalAddress(MI->getOperand(3).getGlobal(), 0, 
 
9455
                      MI->getOperand(3).getTargetFlags())
 
9456
    .addReg(0);
 
9457
    MIB = BuildMI(*BB, MI, DL, TII->get(X86::CALL32m));
 
9458
    addDirectMem(MIB, X86::EAX);
 
9459
  }
 
9460
  
 
9461
  MI->eraseFromParent(); // The pseudo instruction is gone now.
 
9462
  return BB;
 
9463
}
 
9464
 
 
9465
MachineBasicBlock *
 
9466
X86TargetLowering::EmitInstrWithCustomInserter(MachineInstr *MI,
 
9467
                                               MachineBasicBlock *BB) const {
 
9468
  switch (MI->getOpcode()) {
 
9469
  default: assert(false && "Unexpected instr type to insert");
 
9470
  case X86::MINGW_ALLOCA:
 
9471
    return EmitLoweredMingwAlloca(MI, BB);
 
9472
  case X86::TLSCall_32:
 
9473
  case X86::TLSCall_64:
 
9474
    return EmitLoweredTLSCall(MI, BB);
 
9475
  case X86::CMOV_GR8:
 
9476
  case X86::CMOV_V1I64:
 
9477
  case X86::CMOV_FR32:
 
9478
  case X86::CMOV_FR64:
 
9479
  case X86::CMOV_V4F32:
 
9480
  case X86::CMOV_V2F64:
 
9481
  case X86::CMOV_V2I64:
 
9482
  case X86::CMOV_GR16:
 
9483
  case X86::CMOV_GR32:
 
9484
  case X86::CMOV_RFP32:
 
9485
  case X86::CMOV_RFP64:
 
9486
  case X86::CMOV_RFP80:
 
9487
    return EmitLoweredSelect(MI, BB);
 
9488
 
 
9489
  case X86::FP32_TO_INT16_IN_MEM:
 
9490
  case X86::FP32_TO_INT32_IN_MEM:
 
9491
  case X86::FP32_TO_INT64_IN_MEM:
 
9492
  case X86::FP64_TO_INT16_IN_MEM:
 
9493
  case X86::FP64_TO_INT32_IN_MEM:
 
9494
  case X86::FP64_TO_INT64_IN_MEM:
 
9495
  case X86::FP80_TO_INT16_IN_MEM:
 
9496
  case X86::FP80_TO_INT32_IN_MEM:
 
9497
  case X86::FP80_TO_INT64_IN_MEM: {
 
9498
    const TargetInstrInfo *TII = getTargetMachine().getInstrInfo();
 
9499
    DebugLoc DL = MI->getDebugLoc();
 
9500
 
 
9501
    // Change the floating point control register to use "round towards zero"
 
9502
    // mode when truncating to an integer value.
 
9503
    MachineFunction *F = BB->getParent();
 
9504
    int CWFrameIdx = F->getFrameInfo()->CreateStackObject(2, 2, false);
 
9505
    addFrameReference(BuildMI(*BB, MI, DL,
 
9506
                              TII->get(X86::FNSTCW16m)), CWFrameIdx);
 
9507
 
 
9508
    // Load the old value of the high byte of the control word...
 
9509
    unsigned OldCW =
 
9510
      F->getRegInfo().createVirtualRegister(X86::GR16RegisterClass);
 
9511
    addFrameReference(BuildMI(*BB, MI, DL, TII->get(X86::MOV16rm), OldCW),
 
9512
                      CWFrameIdx);
 
9513
 
 
9514
    // Set the high part to be round to zero...
 
9515
    addFrameReference(BuildMI(*BB, MI, DL, TII->get(X86::MOV16mi)), CWFrameIdx)
 
9516
      .addImm(0xC7F);
 
9517
 
 
9518
    // Reload the modified control word now...
 
9519
    addFrameReference(BuildMI(*BB, MI, DL,
 
9520
                              TII->get(X86::FLDCW16m)), CWFrameIdx);
 
9521
 
 
9522
    // Restore the memory image of control word to original value
 
9523
    addFrameReference(BuildMI(*BB, MI, DL, TII->get(X86::MOV16mr)), CWFrameIdx)
 
9524
      .addReg(OldCW);
 
9525
 
 
9526
    // Get the X86 opcode to use.
 
9527
    unsigned Opc;
 
9528
    switch (MI->getOpcode()) {
 
9529
    default: llvm_unreachable("illegal opcode!");
 
9530
    case X86::FP32_TO_INT16_IN_MEM: Opc = X86::IST_Fp16m32; break;
 
9531
    case X86::FP32_TO_INT32_IN_MEM: Opc = X86::IST_Fp32m32; break;
 
9532
    case X86::FP32_TO_INT64_IN_MEM: Opc = X86::IST_Fp64m32; break;
 
9533
    case X86::FP64_TO_INT16_IN_MEM: Opc = X86::IST_Fp16m64; break;
 
9534
    case X86::FP64_TO_INT32_IN_MEM: Opc = X86::IST_Fp32m64; break;
 
9535
    case X86::FP64_TO_INT64_IN_MEM: Opc = X86::IST_Fp64m64; break;
 
9536
    case X86::FP80_TO_INT16_IN_MEM: Opc = X86::IST_Fp16m80; break;
 
9537
    case X86::FP80_TO_INT32_IN_MEM: Opc = X86::IST_Fp32m80; break;
 
9538
    case X86::FP80_TO_INT64_IN_MEM: Opc = X86::IST_Fp64m80; break;
 
9539
    }
 
9540
 
 
9541
    X86AddressMode AM;
 
9542
    MachineOperand &Op = MI->getOperand(0);
 
9543
    if (Op.isReg()) {
 
9544
      AM.BaseType = X86AddressMode::RegBase;
 
9545
      AM.Base.Reg = Op.getReg();
 
9546
    } else {
 
9547
      AM.BaseType = X86AddressMode::FrameIndexBase;
 
9548
      AM.Base.FrameIndex = Op.getIndex();
 
9549
    }
 
9550
    Op = MI->getOperand(1);
 
9551
    if (Op.isImm())
 
9552
      AM.Scale = Op.getImm();
 
9553
    Op = MI->getOperand(2);
 
9554
    if (Op.isImm())
 
9555
      AM.IndexReg = Op.getImm();
 
9556
    Op = MI->getOperand(3);
 
9557
    if (Op.isGlobal()) {
 
9558
      AM.GV = Op.getGlobal();
 
9559
    } else {
 
9560
      AM.Disp = Op.getImm();
 
9561
    }
 
9562
    addFullAddress(BuildMI(*BB, MI, DL, TII->get(Opc)), AM)
 
9563
                      .addReg(MI->getOperand(X86::AddrNumOperands).getReg());
 
9564
 
 
9565
    // Reload the original control word now.
 
9566
    addFrameReference(BuildMI(*BB, MI, DL,
 
9567
                              TII->get(X86::FLDCW16m)), CWFrameIdx);
 
9568
 
 
9569
    MI->eraseFromParent();   // The pseudo instruction is gone now.
 
9570
    return BB;
 
9571
  }
 
9572
    // String/text processing lowering.
 
9573
  case X86::PCMPISTRM128REG:
 
9574
  case X86::VPCMPISTRM128REG:
 
9575
    return EmitPCMP(MI, BB, 3, false /* in-mem */);
 
9576
  case X86::PCMPISTRM128MEM:
 
9577
  case X86::VPCMPISTRM128MEM:
 
9578
    return EmitPCMP(MI, BB, 3, true /* in-mem */);
 
9579
  case X86::PCMPESTRM128REG:
 
9580
  case X86::VPCMPESTRM128REG:
 
9581
    return EmitPCMP(MI, BB, 5, false /* in mem */);
 
9582
  case X86::PCMPESTRM128MEM:
 
9583
  case X86::VPCMPESTRM128MEM:
 
9584
    return EmitPCMP(MI, BB, 5, true /* in mem */);
 
9585
 
 
9586
    // Atomic Lowering.
 
9587
  case X86::ATOMAND32:
 
9588
    return EmitAtomicBitwiseWithCustomInserter(MI, BB, X86::AND32rr,
 
9589
                                               X86::AND32ri, X86::MOV32rm,
 
9590
                                               X86::LCMPXCHG32,
 
9591
                                               X86::NOT32r, X86::EAX,
 
9592
                                               X86::GR32RegisterClass);
 
9593
  case X86::ATOMOR32:
 
9594
    return EmitAtomicBitwiseWithCustomInserter(MI, BB, X86::OR32rr,
 
9595
                                               X86::OR32ri, X86::MOV32rm,
 
9596
                                               X86::LCMPXCHG32,
 
9597
                                               X86::NOT32r, X86::EAX,
 
9598
                                               X86::GR32RegisterClass);
 
9599
  case X86::ATOMXOR32:
 
9600
    return EmitAtomicBitwiseWithCustomInserter(MI, BB, X86::XOR32rr,
 
9601
                                               X86::XOR32ri, X86::MOV32rm,
 
9602
                                               X86::LCMPXCHG32,
 
9603
                                               X86::NOT32r, X86::EAX,
 
9604
                                               X86::GR32RegisterClass);
 
9605
  case X86::ATOMNAND32:
 
9606
    return EmitAtomicBitwiseWithCustomInserter(MI, BB, X86::AND32rr,
 
9607
                                               X86::AND32ri, X86::MOV32rm,
 
9608
                                               X86::LCMPXCHG32,
 
9609
                                               X86::NOT32r, X86::EAX,
 
9610
                                               X86::GR32RegisterClass, true);
 
9611
  case X86::ATOMMIN32:
 
9612
    return EmitAtomicMinMaxWithCustomInserter(MI, BB, X86::CMOVL32rr);
 
9613
  case X86::ATOMMAX32:
 
9614
    return EmitAtomicMinMaxWithCustomInserter(MI, BB, X86::CMOVG32rr);
 
9615
  case X86::ATOMUMIN32:
 
9616
    return EmitAtomicMinMaxWithCustomInserter(MI, BB, X86::CMOVB32rr);
 
9617
  case X86::ATOMUMAX32:
 
9618
    return EmitAtomicMinMaxWithCustomInserter(MI, BB, X86::CMOVA32rr);
 
9619
 
 
9620
  case X86::ATOMAND16:
 
9621
    return EmitAtomicBitwiseWithCustomInserter(MI, BB, X86::AND16rr,
 
9622
                                               X86::AND16ri, X86::MOV16rm,
 
9623
                                               X86::LCMPXCHG16,
 
9624
                                               X86::NOT16r, X86::AX,
 
9625
                                               X86::GR16RegisterClass);
 
9626
  case X86::ATOMOR16:
 
9627
    return EmitAtomicBitwiseWithCustomInserter(MI, BB, X86::OR16rr,
 
9628
                                               X86::OR16ri, X86::MOV16rm,
 
9629
                                               X86::LCMPXCHG16,
 
9630
                                               X86::NOT16r, X86::AX,
 
9631
                                               X86::GR16RegisterClass);
 
9632
  case X86::ATOMXOR16:
 
9633
    return EmitAtomicBitwiseWithCustomInserter(MI, BB, X86::XOR16rr,
 
9634
                                               X86::XOR16ri, X86::MOV16rm,
 
9635
                                               X86::LCMPXCHG16,
 
9636
                                               X86::NOT16r, X86::AX,
 
9637
                                               X86::GR16RegisterClass);
 
9638
  case X86::ATOMNAND16:
 
9639
    return EmitAtomicBitwiseWithCustomInserter(MI, BB, X86::AND16rr,
 
9640
                                               X86::AND16ri, X86::MOV16rm,
 
9641
                                               X86::LCMPXCHG16,
 
9642
                                               X86::NOT16r, X86::AX,
 
9643
                                               X86::GR16RegisterClass, true);
 
9644
  case X86::ATOMMIN16:
 
9645
    return EmitAtomicMinMaxWithCustomInserter(MI, BB, X86::CMOVL16rr);
 
9646
  case X86::ATOMMAX16:
 
9647
    return EmitAtomicMinMaxWithCustomInserter(MI, BB, X86::CMOVG16rr);
 
9648
  case X86::ATOMUMIN16:
 
9649
    return EmitAtomicMinMaxWithCustomInserter(MI, BB, X86::CMOVB16rr);
 
9650
  case X86::ATOMUMAX16:
 
9651
    return EmitAtomicMinMaxWithCustomInserter(MI, BB, X86::CMOVA16rr);
 
9652
 
 
9653
  case X86::ATOMAND8:
 
9654
    return EmitAtomicBitwiseWithCustomInserter(MI, BB, X86::AND8rr,
 
9655
                                               X86::AND8ri, X86::MOV8rm,
 
9656
                                               X86::LCMPXCHG8,
 
9657
                                               X86::NOT8r, X86::AL,
 
9658
                                               X86::GR8RegisterClass);
 
9659
  case X86::ATOMOR8:
 
9660
    return EmitAtomicBitwiseWithCustomInserter(MI, BB, X86::OR8rr,
 
9661
                                               X86::OR8ri, X86::MOV8rm,
 
9662
                                               X86::LCMPXCHG8,
 
9663
                                               X86::NOT8r, X86::AL,
 
9664
                                               X86::GR8RegisterClass);
 
9665
  case X86::ATOMXOR8:
 
9666
    return EmitAtomicBitwiseWithCustomInserter(MI, BB, X86::XOR8rr,
 
9667
                                               X86::XOR8ri, X86::MOV8rm,
 
9668
                                               X86::LCMPXCHG8,
 
9669
                                               X86::NOT8r, X86::AL,
 
9670
                                               X86::GR8RegisterClass);
 
9671
  case X86::ATOMNAND8:
 
9672
    return EmitAtomicBitwiseWithCustomInserter(MI, BB, X86::AND8rr,
 
9673
                                               X86::AND8ri, X86::MOV8rm,
 
9674
                                               X86::LCMPXCHG8,
 
9675
                                               X86::NOT8r, X86::AL,
 
9676
                                               X86::GR8RegisterClass, true);
 
9677
  // FIXME: There are no CMOV8 instructions; MIN/MAX need some other way.
 
9678
  // This group is for 64-bit host.
 
9679
  case X86::ATOMAND64:
 
9680
    return EmitAtomicBitwiseWithCustomInserter(MI, BB, X86::AND64rr,
 
9681
                                               X86::AND64ri32, X86::MOV64rm,
 
9682
                                               X86::LCMPXCHG64,
 
9683
                                               X86::NOT64r, X86::RAX,
 
9684
                                               X86::GR64RegisterClass);
 
9685
  case X86::ATOMOR64:
 
9686
    return EmitAtomicBitwiseWithCustomInserter(MI, BB, X86::OR64rr,
 
9687
                                               X86::OR64ri32, X86::MOV64rm,
 
9688
                                               X86::LCMPXCHG64,
 
9689
                                               X86::NOT64r, X86::RAX,
 
9690
                                               X86::GR64RegisterClass);
 
9691
  case X86::ATOMXOR64:
 
9692
    return EmitAtomicBitwiseWithCustomInserter(MI, BB, X86::XOR64rr,
 
9693
                                               X86::XOR64ri32, X86::MOV64rm,
 
9694
                                               X86::LCMPXCHG64,
 
9695
                                               X86::NOT64r, X86::RAX,
 
9696
                                               X86::GR64RegisterClass);
 
9697
  case X86::ATOMNAND64:
 
9698
    return EmitAtomicBitwiseWithCustomInserter(MI, BB, X86::AND64rr,
 
9699
                                               X86::AND64ri32, X86::MOV64rm,
 
9700
                                               X86::LCMPXCHG64,
 
9701
                                               X86::NOT64r, X86::RAX,
 
9702
                                               X86::GR64RegisterClass, true);
 
9703
  case X86::ATOMMIN64:
 
9704
    return EmitAtomicMinMaxWithCustomInserter(MI, BB, X86::CMOVL64rr);
 
9705
  case X86::ATOMMAX64:
 
9706
    return EmitAtomicMinMaxWithCustomInserter(MI, BB, X86::CMOVG64rr);
 
9707
  case X86::ATOMUMIN64:
 
9708
    return EmitAtomicMinMaxWithCustomInserter(MI, BB, X86::CMOVB64rr);
 
9709
  case X86::ATOMUMAX64:
 
9710
    return EmitAtomicMinMaxWithCustomInserter(MI, BB, X86::CMOVA64rr);
 
9711
 
 
9712
  // This group does 64-bit operations on a 32-bit host.
 
9713
  case X86::ATOMAND6432:
 
9714
    return EmitAtomicBit6432WithCustomInserter(MI, BB,
 
9715
                                               X86::AND32rr, X86::AND32rr,
 
9716
                                               X86::AND32ri, X86::AND32ri,
 
9717
                                               false);
 
9718
  case X86::ATOMOR6432:
 
9719
    return EmitAtomicBit6432WithCustomInserter(MI, BB,
 
9720
                                               X86::OR32rr, X86::OR32rr,
 
9721
                                               X86::OR32ri, X86::OR32ri,
 
9722
                                               false);
 
9723
  case X86::ATOMXOR6432:
 
9724
    return EmitAtomicBit6432WithCustomInserter(MI, BB,
 
9725
                                               X86::XOR32rr, X86::XOR32rr,
 
9726
                                               X86::XOR32ri, X86::XOR32ri,
 
9727
                                               false);
 
9728
  case X86::ATOMNAND6432:
 
9729
    return EmitAtomicBit6432WithCustomInserter(MI, BB,
 
9730
                                               X86::AND32rr, X86::AND32rr,
 
9731
                                               X86::AND32ri, X86::AND32ri,
 
9732
                                               true);
 
9733
  case X86::ATOMADD6432:
 
9734
    return EmitAtomicBit6432WithCustomInserter(MI, BB,
 
9735
                                               X86::ADD32rr, X86::ADC32rr,
 
9736
                                               X86::ADD32ri, X86::ADC32ri,
 
9737
                                               false);
 
9738
  case X86::ATOMSUB6432:
 
9739
    return EmitAtomicBit6432WithCustomInserter(MI, BB,
 
9740
                                               X86::SUB32rr, X86::SBB32rr,
 
9741
                                               X86::SUB32ri, X86::SBB32ri,
 
9742
                                               false);
 
9743
  case X86::ATOMSWAP6432:
 
9744
    return EmitAtomicBit6432WithCustomInserter(MI, BB,
 
9745
                                               X86::MOV32rr, X86::MOV32rr,
 
9746
                                               X86::MOV32ri, X86::MOV32ri,
 
9747
                                               false);
 
9748
  case X86::VASTART_SAVE_XMM_REGS:
 
9749
    return EmitVAStartSaveXMMRegsWithCustomInserter(MI, BB);
 
9750
  }
 
9751
}
 
9752
 
 
9753
//===----------------------------------------------------------------------===//
 
9754
//                           X86 Optimization Hooks
 
9755
//===----------------------------------------------------------------------===//
 
9756
 
 
9757
void X86TargetLowering::computeMaskedBitsForTargetNode(const SDValue Op,
 
9758
                                                       const APInt &Mask,
 
9759
                                                       APInt &KnownZero,
 
9760
                                                       APInt &KnownOne,
 
9761
                                                       const SelectionDAG &DAG,
 
9762
                                                       unsigned Depth) const {
 
9763
  unsigned Opc = Op.getOpcode();
 
9764
  assert((Opc >= ISD::BUILTIN_OP_END ||
 
9765
          Opc == ISD::INTRINSIC_WO_CHAIN ||
 
9766
          Opc == ISD::INTRINSIC_W_CHAIN ||
 
9767
          Opc == ISD::INTRINSIC_VOID) &&
 
9768
         "Should use MaskedValueIsZero if you don't know whether Op"
 
9769
         " is a target node!");
 
9770
 
 
9771
  KnownZero = KnownOne = APInt(Mask.getBitWidth(), 0);   // Don't know anything.
 
9772
  switch (Opc) {
 
9773
  default: break;
 
9774
  case X86ISD::ADD:
 
9775
  case X86ISD::SUB:
 
9776
  case X86ISD::SMUL:
 
9777
  case X86ISD::UMUL:
 
9778
  case X86ISD::INC:
 
9779
  case X86ISD::DEC:
 
9780
  case X86ISD::OR:
 
9781
  case X86ISD::XOR:
 
9782
  case X86ISD::AND:
 
9783
    // These nodes' second result is a boolean.
 
9784
    if (Op.getResNo() == 0)
 
9785
      break;
 
9786
    // Fallthrough
 
9787
  case X86ISD::SETCC:
 
9788
    KnownZero |= APInt::getHighBitsSet(Mask.getBitWidth(),
 
9789
                                       Mask.getBitWidth() - 1);
 
9790
    break;
 
9791
  }
 
9792
}
 
9793
 
 
9794
/// isGAPlusOffset - Returns true (and the GlobalValue and the offset) if the
 
9795
/// node is a GlobalAddress + offset.
 
9796
bool X86TargetLowering::isGAPlusOffset(SDNode *N,
 
9797
                                       const GlobalValue* &GA,
 
9798
                                       int64_t &Offset) const {
 
9799
  if (N->getOpcode() == X86ISD::Wrapper) {
 
9800
    if (isa<GlobalAddressSDNode>(N->getOperand(0))) {
 
9801
      GA = cast<GlobalAddressSDNode>(N->getOperand(0))->getGlobal();
 
9802
      Offset = cast<GlobalAddressSDNode>(N->getOperand(0))->getOffset();
 
9803
      return true;
 
9804
    }
 
9805
  }
 
9806
  return TargetLowering::isGAPlusOffset(N, GA, Offset);
 
9807
}
 
9808
 
 
9809
/// PerformShuffleCombine - Combine a vector_shuffle that is equal to
 
9810
/// build_vector load1, load2, load3, load4, <0, 1, 2, 3> into a 128-bit load
 
9811
/// if the load addresses are consecutive, non-overlapping, and in the right
 
9812
/// order.
 
9813
static SDValue PerformShuffleCombine(SDNode *N, SelectionDAG &DAG,
 
9814
                                     const TargetLowering &TLI) {
 
9815
  DebugLoc dl = N->getDebugLoc();
 
9816
  EVT VT = N->getValueType(0);
 
9817
 
 
9818
  if (VT.getSizeInBits() != 128)
 
9819
    return SDValue();
 
9820
 
 
9821
  SmallVector<SDValue, 16> Elts;
 
9822
  for (unsigned i = 0, e = VT.getVectorNumElements(); i != e; ++i)
 
9823
    Elts.push_back(getShuffleScalarElt(N, i, DAG, 0));
 
9824
 
 
9825
  return EltsFromConsecutiveLoads(VT, Elts, dl, DAG);
 
9826
}
 
9827
 
 
9828
/// PerformEXTRACT_VECTOR_ELTCombine - Detect vector gather/scatter index
 
9829
/// generation and convert it from being a bunch of shuffles and extracts
 
9830
/// to a simple store and scalar loads to extract the elements.
 
9831
static SDValue PerformEXTRACT_VECTOR_ELTCombine(SDNode *N, SelectionDAG &DAG,
 
9832
                                                const TargetLowering &TLI) {
 
9833
  SDValue InputVector = N->getOperand(0);
 
9834
 
 
9835
  // Only operate on vectors of 4 elements, where the alternative shuffling
 
9836
  // gets to be more expensive.
 
9837
  if (InputVector.getValueType() != MVT::v4i32)
 
9838
    return SDValue();
 
9839
 
 
9840
  // Check whether every use of InputVector is an EXTRACT_VECTOR_ELT with a
 
9841
  // single use which is a sign-extend or zero-extend, and all elements are
 
9842
  // used.
 
9843
  SmallVector<SDNode *, 4> Uses;
 
9844
  unsigned ExtractedElements = 0;
 
9845
  for (SDNode::use_iterator UI = InputVector.getNode()->use_begin(),
 
9846
       UE = InputVector.getNode()->use_end(); UI != UE; ++UI) {
 
9847
    if (UI.getUse().getResNo() != InputVector.getResNo())
 
9848
      return SDValue();
 
9849
 
 
9850
    SDNode *Extract = *UI;
 
9851
    if (Extract->getOpcode() != ISD::EXTRACT_VECTOR_ELT)
 
9852
      return SDValue();
 
9853
 
 
9854
    if (Extract->getValueType(0) != MVT::i32)
 
9855
      return SDValue();
 
9856
    if (!Extract->hasOneUse())
 
9857
      return SDValue();
 
9858
    if (Extract->use_begin()->getOpcode() != ISD::SIGN_EXTEND &&
 
9859
        Extract->use_begin()->getOpcode() != ISD::ZERO_EXTEND)
 
9860
      return SDValue();
 
9861
    if (!isa<ConstantSDNode>(Extract->getOperand(1)))
 
9862
      return SDValue();
 
9863
 
 
9864
    // Record which element was extracted.
 
9865
    ExtractedElements |=
 
9866
      1 << cast<ConstantSDNode>(Extract->getOperand(1))->getZExtValue();
 
9867
 
 
9868
    Uses.push_back(Extract);
 
9869
  }
 
9870
 
 
9871
  // If not all the elements were used, this may not be worthwhile.
 
9872
  if (ExtractedElements != 15)
 
9873
    return SDValue();
 
9874
 
 
9875
  // Ok, we've now decided to do the transformation.
 
9876
  DebugLoc dl = InputVector.getDebugLoc();
 
9877
 
 
9878
  // Store the value to a temporary stack slot.
 
9879
  SDValue StackPtr = DAG.CreateStackTemporary(InputVector.getValueType());
 
9880
  SDValue Ch = DAG.getStore(DAG.getEntryNode(), dl, InputVector, StackPtr, NULL,
 
9881
                            0, false, false, 0);
 
9882
 
 
9883
  // Replace each use (extract) with a load of the appropriate element.
 
9884
  for (SmallVectorImpl<SDNode *>::iterator UI = Uses.begin(),
 
9885
       UE = Uses.end(); UI != UE; ++UI) {
 
9886
    SDNode *Extract = *UI;
 
9887
 
 
9888
    // Compute the element's address.
 
9889
    SDValue Idx = Extract->getOperand(1);
 
9890
    unsigned EltSize =
 
9891
        InputVector.getValueType().getVectorElementType().getSizeInBits()/8;
 
9892
    uint64_t Offset = EltSize * cast<ConstantSDNode>(Idx)->getZExtValue();
 
9893
    SDValue OffsetVal = DAG.getConstant(Offset, TLI.getPointerTy());
 
9894
 
 
9895
    SDValue ScalarAddr = DAG.getNode(ISD::ADD, dl, Idx.getValueType(),
 
9896
                                     OffsetVal, StackPtr);
 
9897
 
 
9898
    // Load the scalar.
 
9899
    SDValue LoadScalar = DAG.getLoad(Extract->getValueType(0), dl, Ch,
 
9900
                                     ScalarAddr, NULL, 0, false, false, 0);
 
9901
 
 
9902
    // Replace the exact with the load.
 
9903
    DAG.ReplaceAllUsesOfValueWith(SDValue(Extract, 0), LoadScalar);
 
9904
  }
 
9905
 
 
9906
  // The replacement was made in place; don't return anything.
 
9907
  return SDValue();
 
9908
}
 
9909
 
 
9910
/// PerformSELECTCombine - Do target-specific dag combines on SELECT nodes.
 
9911
static SDValue PerformSELECTCombine(SDNode *N, SelectionDAG &DAG,
 
9912
                                    const X86Subtarget *Subtarget) {
 
9913
  DebugLoc DL = N->getDebugLoc();
 
9914
  SDValue Cond = N->getOperand(0);
 
9915
  // Get the LHS/RHS of the select.
 
9916
  SDValue LHS = N->getOperand(1);
 
9917
  SDValue RHS = N->getOperand(2);
 
9918
 
 
9919
  // If we have SSE[12] support, try to form min/max nodes. SSE min/max
 
9920
  // instructions match the semantics of the common C idiom x<y?x:y but not
 
9921
  // x<=y?x:y, because of how they handle negative zero (which can be
 
9922
  // ignored in unsafe-math mode).
 
9923
  if (Subtarget->hasSSE2() &&
 
9924
      (LHS.getValueType() == MVT::f32 || LHS.getValueType() == MVT::f64) &&
 
9925
      Cond.getOpcode() == ISD::SETCC) {
 
9926
    ISD::CondCode CC = cast<CondCodeSDNode>(Cond.getOperand(2))->get();
 
9927
 
 
9928
    unsigned Opcode = 0;
 
9929
    // Check for x CC y ? x : y.
 
9930
    if (DAG.isEqualTo(LHS, Cond.getOperand(0)) &&
 
9931
        DAG.isEqualTo(RHS, Cond.getOperand(1))) {
 
9932
      switch (CC) {
 
9933
      default: break;
 
9934
      case ISD::SETULT:
 
9935
        // Converting this to a min would handle NaNs incorrectly, and swapping
 
9936
        // the operands would cause it to handle comparisons between positive
 
9937
        // and negative zero incorrectly.
 
9938
        if (!DAG.isKnownNeverNaN(LHS) || !DAG.isKnownNeverNaN(RHS)) {
 
9939
          if (!UnsafeFPMath &&
 
9940
              !(DAG.isKnownNeverZero(LHS) || DAG.isKnownNeverZero(RHS)))
 
9941
            break;
 
9942
          std::swap(LHS, RHS);
 
9943
        }
 
9944
        Opcode = X86ISD::FMIN;
 
9945
        break;
 
9946
      case ISD::SETOLE:
 
9947
        // Converting this to a min would handle comparisons between positive
 
9948
        // and negative zero incorrectly.
 
9949
        if (!UnsafeFPMath &&
 
9950
            !DAG.isKnownNeverZero(LHS) && !DAG.isKnownNeverZero(RHS))
 
9951
          break;
 
9952
        Opcode = X86ISD::FMIN;
 
9953
        break;
 
9954
      case ISD::SETULE:
 
9955
        // Converting this to a min would handle both negative zeros and NaNs
 
9956
        // incorrectly, but we can swap the operands to fix both.
 
9957
        std::swap(LHS, RHS);
 
9958
      case ISD::SETOLT:
 
9959
      case ISD::SETLT:
 
9960
      case ISD::SETLE:
 
9961
        Opcode = X86ISD::FMIN;
 
9962
        break;
 
9963
 
 
9964
      case ISD::SETOGE:
 
9965
        // Converting this to a max would handle comparisons between positive
 
9966
        // and negative zero incorrectly.
 
9967
        if (!UnsafeFPMath &&
 
9968
            !DAG.isKnownNeverZero(LHS) && !DAG.isKnownNeverZero(LHS))
 
9969
          break;
 
9970
        Opcode = X86ISD::FMAX;
 
9971
        break;
 
9972
      case ISD::SETUGT:
 
9973
        // Converting this to a max would handle NaNs incorrectly, and swapping
 
9974
        // the operands would cause it to handle comparisons between positive
 
9975
        // and negative zero incorrectly.
 
9976
        if (!DAG.isKnownNeverNaN(LHS) || !DAG.isKnownNeverNaN(RHS)) {
 
9977
          if (!UnsafeFPMath &&
 
9978
              !(DAG.isKnownNeverZero(LHS) || DAG.isKnownNeverZero(RHS)))
 
9979
            break;
 
9980
          std::swap(LHS, RHS);
 
9981
        }
 
9982
        Opcode = X86ISD::FMAX;
 
9983
        break;
 
9984
      case ISD::SETUGE:
 
9985
        // Converting this to a max would handle both negative zeros and NaNs
 
9986
        // incorrectly, but we can swap the operands to fix both.
 
9987
        std::swap(LHS, RHS);
 
9988
      case ISD::SETOGT:
 
9989
      case ISD::SETGT:
 
9990
      case ISD::SETGE:
 
9991
        Opcode = X86ISD::FMAX;
 
9992
        break;
 
9993
      }
 
9994
    // Check for x CC y ? y : x -- a min/max with reversed arms.
 
9995
    } else if (DAG.isEqualTo(LHS, Cond.getOperand(1)) &&
 
9996
               DAG.isEqualTo(RHS, Cond.getOperand(0))) {
 
9997
      switch (CC) {
 
9998
      default: break;
 
9999
      case ISD::SETOGE:
 
10000
        // Converting this to a min would handle comparisons between positive
 
10001
        // and negative zero incorrectly, and swapping the operands would
 
10002
        // cause it to handle NaNs incorrectly.
 
10003
        if (!UnsafeFPMath &&
 
10004
            !(DAG.isKnownNeverZero(LHS) || DAG.isKnownNeverZero(RHS))) {
 
10005
          if (!DAG.isKnownNeverNaN(LHS) || !DAG.isKnownNeverNaN(RHS))
 
10006
            break;
 
10007
          std::swap(LHS, RHS);
 
10008
        }
 
10009
        Opcode = X86ISD::FMIN;
 
10010
        break;
 
10011
      case ISD::SETUGT:
 
10012
        // Converting this to a min would handle NaNs incorrectly.
 
10013
        if (!UnsafeFPMath &&
 
10014
            (!DAG.isKnownNeverNaN(LHS) || !DAG.isKnownNeverNaN(RHS)))
 
10015
          break;
 
10016
        Opcode = X86ISD::FMIN;
 
10017
        break;
 
10018
      case ISD::SETUGE:
 
10019
        // Converting this to a min would handle both negative zeros and NaNs
 
10020
        // incorrectly, but we can swap the operands to fix both.
 
10021
        std::swap(LHS, RHS);
 
10022
      case ISD::SETOGT:
 
10023
      case ISD::SETGT:
 
10024
      case ISD::SETGE:
 
10025
        Opcode = X86ISD::FMIN;
 
10026
        break;
 
10027
 
 
10028
      case ISD::SETULT:
 
10029
        // Converting this to a max would handle NaNs incorrectly.
 
10030
        if (!DAG.isKnownNeverNaN(LHS) || !DAG.isKnownNeverNaN(RHS))
 
10031
          break;
 
10032
        Opcode = X86ISD::FMAX;
 
10033
        break;
 
10034
      case ISD::SETOLE:
 
10035
        // Converting this to a max would handle comparisons between positive
 
10036
        // and negative zero incorrectly, and swapping the operands would
 
10037
        // cause it to handle NaNs incorrectly.
 
10038
        if (!UnsafeFPMath &&
 
10039
            !DAG.isKnownNeverZero(LHS) && !DAG.isKnownNeverZero(RHS)) {
 
10040
          if (!DAG.isKnownNeverNaN(LHS) || !DAG.isKnownNeverNaN(RHS))
 
10041
            break;
 
10042
          std::swap(LHS, RHS);
 
10043
        }
 
10044
        Opcode = X86ISD::FMAX;
 
10045
        break;
 
10046
      case ISD::SETULE:
 
10047
        // Converting this to a max would handle both negative zeros and NaNs
 
10048
        // incorrectly, but we can swap the operands to fix both.
 
10049
        std::swap(LHS, RHS);
 
10050
      case ISD::SETOLT:
 
10051
      case ISD::SETLT:
 
10052
      case ISD::SETLE:
 
10053
        Opcode = X86ISD::FMAX;
 
10054
        break;
 
10055
      }
 
10056
    }
 
10057
 
 
10058
    if (Opcode)
 
10059
      return DAG.getNode(Opcode, DL, N->getValueType(0), LHS, RHS);
 
10060
  }
 
10061
 
 
10062
  // If this is a select between two integer constants, try to do some
 
10063
  // optimizations.
 
10064
  if (ConstantSDNode *TrueC = dyn_cast<ConstantSDNode>(LHS)) {
 
10065
    if (ConstantSDNode *FalseC = dyn_cast<ConstantSDNode>(RHS))
 
10066
      // Don't do this for crazy integer types.
 
10067
      if (DAG.getTargetLoweringInfo().isTypeLegal(LHS.getValueType())) {
 
10068
        // If this is efficiently invertible, canonicalize the LHSC/RHSC values
 
10069
        // so that TrueC (the true value) is larger than FalseC.
 
10070
        bool NeedsCondInvert = false;
 
10071
 
 
10072
        if (TrueC->getAPIntValue().ult(FalseC->getAPIntValue()) &&
 
10073
            // Efficiently invertible.
 
10074
            (Cond.getOpcode() == ISD::SETCC ||  // setcc -> invertible.
 
10075
             (Cond.getOpcode() == ISD::XOR &&   // xor(X, C) -> invertible.
 
10076
              isa<ConstantSDNode>(Cond.getOperand(1))))) {
 
10077
          NeedsCondInvert = true;
 
10078
          std::swap(TrueC, FalseC);
 
10079
        }
 
10080
 
 
10081
        // Optimize C ? 8 : 0 -> zext(C) << 3.  Likewise for any pow2/0.
 
10082
        if (FalseC->getAPIntValue() == 0 &&
 
10083
            TrueC->getAPIntValue().isPowerOf2()) {
 
10084
          if (NeedsCondInvert) // Invert the condition if needed.
 
10085
            Cond = DAG.getNode(ISD::XOR, DL, Cond.getValueType(), Cond,
 
10086
                               DAG.getConstant(1, Cond.getValueType()));
 
10087
 
 
10088
          // Zero extend the condition if needed.
 
10089
          Cond = DAG.getNode(ISD::ZERO_EXTEND, DL, LHS.getValueType(), Cond);
 
10090
 
 
10091
          unsigned ShAmt = TrueC->getAPIntValue().logBase2();
 
10092
          return DAG.getNode(ISD::SHL, DL, LHS.getValueType(), Cond,
 
10093
                             DAG.getConstant(ShAmt, MVT::i8));
 
10094
        }
 
10095
 
 
10096
        // Optimize Cond ? cst+1 : cst -> zext(setcc(C)+cst.
 
10097
        if (FalseC->getAPIntValue()+1 == TrueC->getAPIntValue()) {
 
10098
          if (NeedsCondInvert) // Invert the condition if needed.
 
10099
            Cond = DAG.getNode(ISD::XOR, DL, Cond.getValueType(), Cond,
 
10100
                               DAG.getConstant(1, Cond.getValueType()));
 
10101
 
 
10102
          // Zero extend the condition if needed.
 
10103
          Cond = DAG.getNode(ISD::ZERO_EXTEND, DL,
 
10104
                             FalseC->getValueType(0), Cond);
 
10105
          return DAG.getNode(ISD::ADD, DL, Cond.getValueType(), Cond,
 
10106
                             SDValue(FalseC, 0));
 
10107
        }
 
10108
 
 
10109
        // Optimize cases that will turn into an LEA instruction.  This requires
 
10110
        // an i32 or i64 and an efficient multiplier (1, 2, 3, 4, 5, 8, 9).
 
10111
        if (N->getValueType(0) == MVT::i32 || N->getValueType(0) == MVT::i64) {
 
10112
          uint64_t Diff = TrueC->getZExtValue()-FalseC->getZExtValue();
 
10113
          if (N->getValueType(0) == MVT::i32) Diff = (unsigned)Diff;
 
10114
 
 
10115
          bool isFastMultiplier = false;
 
10116
          if (Diff < 10) {
 
10117
            switch ((unsigned char)Diff) {
 
10118
              default: break;
 
10119
              case 1:  // result = add base, cond
 
10120
              case 2:  // result = lea base(    , cond*2)
 
10121
              case 3:  // result = lea base(cond, cond*2)
 
10122
              case 4:  // result = lea base(    , cond*4)
 
10123
              case 5:  // result = lea base(cond, cond*4)
 
10124
              case 8:  // result = lea base(    , cond*8)
 
10125
              case 9:  // result = lea base(cond, cond*8)
 
10126
                isFastMultiplier = true;
 
10127
                break;
 
10128
            }
 
10129
          }
 
10130
 
 
10131
          if (isFastMultiplier) {
 
10132
            APInt Diff = TrueC->getAPIntValue()-FalseC->getAPIntValue();
 
10133
            if (NeedsCondInvert) // Invert the condition if needed.
 
10134
              Cond = DAG.getNode(ISD::XOR, DL, Cond.getValueType(), Cond,
 
10135
                                 DAG.getConstant(1, Cond.getValueType()));
 
10136
 
 
10137
            // Zero extend the condition if needed.
 
10138
            Cond = DAG.getNode(ISD::ZERO_EXTEND, DL, FalseC->getValueType(0),
 
10139
                               Cond);
 
10140
            // Scale the condition by the difference.
 
10141
            if (Diff != 1)
 
10142
              Cond = DAG.getNode(ISD::MUL, DL, Cond.getValueType(), Cond,
 
10143
                                 DAG.getConstant(Diff, Cond.getValueType()));
 
10144
 
 
10145
            // Add the base if non-zero.
 
10146
            if (FalseC->getAPIntValue() != 0)
 
10147
              Cond = DAG.getNode(ISD::ADD, DL, Cond.getValueType(), Cond,
 
10148
                                 SDValue(FalseC, 0));
 
10149
            return Cond;
 
10150
          }
 
10151
        }
 
10152
      }
 
10153
  }
 
10154
 
 
10155
  return SDValue();
 
10156
}
 
10157
 
 
10158
/// Optimize X86ISD::CMOV [LHS, RHS, CONDCODE (e.g. X86::COND_NE), CONDVAL]
 
10159
static SDValue PerformCMOVCombine(SDNode *N, SelectionDAG &DAG,
 
10160
                                  TargetLowering::DAGCombinerInfo &DCI) {
 
10161
  DebugLoc DL = N->getDebugLoc();
 
10162
 
 
10163
  // If the flag operand isn't dead, don't touch this CMOV.
 
10164
  if (N->getNumValues() == 2 && !SDValue(N, 1).use_empty())
 
10165
    return SDValue();
 
10166
 
 
10167
  // If this is a select between two integer constants, try to do some
 
10168
  // optimizations.  Note that the operands are ordered the opposite of SELECT
 
10169
  // operands.
 
10170
  if (ConstantSDNode *TrueC = dyn_cast<ConstantSDNode>(N->getOperand(1))) {
 
10171
    if (ConstantSDNode *FalseC = dyn_cast<ConstantSDNode>(N->getOperand(0))) {
 
10172
      // Canonicalize the TrueC/FalseC values so that TrueC (the true value) is
 
10173
      // larger than FalseC (the false value).
 
10174
      X86::CondCode CC = (X86::CondCode)N->getConstantOperandVal(2);
 
10175
 
 
10176
      if (TrueC->getAPIntValue().ult(FalseC->getAPIntValue())) {
 
10177
        CC = X86::GetOppositeBranchCondition(CC);
 
10178
        std::swap(TrueC, FalseC);
 
10179
      }
 
10180
 
 
10181
      // Optimize C ? 8 : 0 -> zext(setcc(C)) << 3.  Likewise for any pow2/0.
 
10182
      // This is efficient for any integer data type (including i8/i16) and
 
10183
      // shift amount.
 
10184
      if (FalseC->getAPIntValue() == 0 && TrueC->getAPIntValue().isPowerOf2()) {
 
10185
        SDValue Cond = N->getOperand(3);
 
10186
        Cond = DAG.getNode(X86ISD::SETCC, DL, MVT::i8,
 
10187
                           DAG.getConstant(CC, MVT::i8), Cond);
 
10188
 
 
10189
        // Zero extend the condition if needed.
 
10190
        Cond = DAG.getNode(ISD::ZERO_EXTEND, DL, TrueC->getValueType(0), Cond);
 
10191
 
 
10192
        unsigned ShAmt = TrueC->getAPIntValue().logBase2();
 
10193
        Cond = DAG.getNode(ISD::SHL, DL, Cond.getValueType(), Cond,
 
10194
                           DAG.getConstant(ShAmt, MVT::i8));
 
10195
        if (N->getNumValues() == 2)  // Dead flag value?
 
10196
          return DCI.CombineTo(N, Cond, SDValue());
 
10197
        return Cond;
 
10198
      }
 
10199
 
 
10200
      // Optimize Cond ? cst+1 : cst -> zext(setcc(C)+cst.  This is efficient
 
10201
      // for any integer data type, including i8/i16.
 
10202
      if (FalseC->getAPIntValue()+1 == TrueC->getAPIntValue()) {
 
10203
        SDValue Cond = N->getOperand(3);
 
10204
        Cond = DAG.getNode(X86ISD::SETCC, DL, MVT::i8,
 
10205
                           DAG.getConstant(CC, MVT::i8), Cond);
 
10206
 
 
10207
        // Zero extend the condition if needed.
 
10208
        Cond = DAG.getNode(ISD::ZERO_EXTEND, DL,
 
10209
                           FalseC->getValueType(0), Cond);
 
10210
        Cond = DAG.getNode(ISD::ADD, DL, Cond.getValueType(), Cond,
 
10211
                           SDValue(FalseC, 0));
 
10212
 
 
10213
        if (N->getNumValues() == 2)  // Dead flag value?
 
10214
          return DCI.CombineTo(N, Cond, SDValue());
 
10215
        return Cond;
 
10216
      }
 
10217
 
 
10218
      // Optimize cases that will turn into an LEA instruction.  This requires
 
10219
      // an i32 or i64 and an efficient multiplier (1, 2, 3, 4, 5, 8, 9).
 
10220
      if (N->getValueType(0) == MVT::i32 || N->getValueType(0) == MVT::i64) {
 
10221
        uint64_t Diff = TrueC->getZExtValue()-FalseC->getZExtValue();
 
10222
        if (N->getValueType(0) == MVT::i32) Diff = (unsigned)Diff;
 
10223
 
 
10224
        bool isFastMultiplier = false;
 
10225
        if (Diff < 10) {
 
10226
          switch ((unsigned char)Diff) {
 
10227
          default: break;
 
10228
          case 1:  // result = add base, cond
 
10229
          case 2:  // result = lea base(    , cond*2)
 
10230
          case 3:  // result = lea base(cond, cond*2)
 
10231
          case 4:  // result = lea base(    , cond*4)
 
10232
          case 5:  // result = lea base(cond, cond*4)
 
10233
          case 8:  // result = lea base(    , cond*8)
 
10234
          case 9:  // result = lea base(cond, cond*8)
 
10235
            isFastMultiplier = true;
 
10236
            break;
 
10237
          }
 
10238
        }
 
10239
 
 
10240
        if (isFastMultiplier) {
 
10241
          APInt Diff = TrueC->getAPIntValue()-FalseC->getAPIntValue();
 
10242
          SDValue Cond = N->getOperand(3);
 
10243
          Cond = DAG.getNode(X86ISD::SETCC, DL, MVT::i8,
 
10244
                             DAG.getConstant(CC, MVT::i8), Cond);
 
10245
          // Zero extend the condition if needed.
 
10246
          Cond = DAG.getNode(ISD::ZERO_EXTEND, DL, FalseC->getValueType(0),
 
10247
                             Cond);
 
10248
          // Scale the condition by the difference.
 
10249
          if (Diff != 1)
 
10250
            Cond = DAG.getNode(ISD::MUL, DL, Cond.getValueType(), Cond,
 
10251
                               DAG.getConstant(Diff, Cond.getValueType()));
 
10252
 
 
10253
          // Add the base if non-zero.
 
10254
          if (FalseC->getAPIntValue() != 0)
 
10255
            Cond = DAG.getNode(ISD::ADD, DL, Cond.getValueType(), Cond,
 
10256
                               SDValue(FalseC, 0));
 
10257
          if (N->getNumValues() == 2)  // Dead flag value?
 
10258
            return DCI.CombineTo(N, Cond, SDValue());
 
10259
          return Cond;
 
10260
        }
 
10261
      }
 
10262
    }
 
10263
  }
 
10264
  return SDValue();
 
10265
}
 
10266
 
 
10267
 
 
10268
/// PerformMulCombine - Optimize a single multiply with constant into two
 
10269
/// in order to implement it with two cheaper instructions, e.g.
 
10270
/// LEA + SHL, LEA + LEA.
 
10271
static SDValue PerformMulCombine(SDNode *N, SelectionDAG &DAG,
 
10272
                                 TargetLowering::DAGCombinerInfo &DCI) {
 
10273
  if (DCI.isBeforeLegalize() || DCI.isCalledByLegalizer())
 
10274
    return SDValue();
 
10275
 
 
10276
  EVT VT = N->getValueType(0);
 
10277
  if (VT != MVT::i64)
 
10278
    return SDValue();
 
10279
 
 
10280
  ConstantSDNode *C = dyn_cast<ConstantSDNode>(N->getOperand(1));
 
10281
  if (!C)
 
10282
    return SDValue();
 
10283
  uint64_t MulAmt = C->getZExtValue();
 
10284
  if (isPowerOf2_64(MulAmt) || MulAmt == 3 || MulAmt == 5 || MulAmt == 9)
 
10285
    return SDValue();
 
10286
 
 
10287
  uint64_t MulAmt1 = 0;
 
10288
  uint64_t MulAmt2 = 0;
 
10289
  if ((MulAmt % 9) == 0) {
 
10290
    MulAmt1 = 9;
 
10291
    MulAmt2 = MulAmt / 9;
 
10292
  } else if ((MulAmt % 5) == 0) {
 
10293
    MulAmt1 = 5;
 
10294
    MulAmt2 = MulAmt / 5;
 
10295
  } else if ((MulAmt % 3) == 0) {
 
10296
    MulAmt1 = 3;
 
10297
    MulAmt2 = MulAmt / 3;
 
10298
  }
 
10299
  if (MulAmt2 &&
 
10300
      (isPowerOf2_64(MulAmt2) || MulAmt2 == 3 || MulAmt2 == 5 || MulAmt2 == 9)){
 
10301
    DebugLoc DL = N->getDebugLoc();
 
10302
 
 
10303
    if (isPowerOf2_64(MulAmt2) &&
 
10304
        !(N->hasOneUse() && N->use_begin()->getOpcode() == ISD::ADD))
 
10305
      // If second multiplifer is pow2, issue it first. We want the multiply by
 
10306
      // 3, 5, or 9 to be folded into the addressing mode unless the lone use
 
10307
      // is an add.
 
10308
      std::swap(MulAmt1, MulAmt2);
 
10309
 
 
10310
    SDValue NewMul;
 
10311
    if (isPowerOf2_64(MulAmt1))
 
10312
      NewMul = DAG.getNode(ISD::SHL, DL, VT, N->getOperand(0),
 
10313
                           DAG.getConstant(Log2_64(MulAmt1), MVT::i8));
 
10314
    else
 
10315
      NewMul = DAG.getNode(X86ISD::MUL_IMM, DL, VT, N->getOperand(0),
 
10316
                           DAG.getConstant(MulAmt1, VT));
 
10317
 
 
10318
    if (isPowerOf2_64(MulAmt2))
 
10319
      NewMul = DAG.getNode(ISD::SHL, DL, VT, NewMul,
 
10320
                           DAG.getConstant(Log2_64(MulAmt2), MVT::i8));
 
10321
    else
 
10322
      NewMul = DAG.getNode(X86ISD::MUL_IMM, DL, VT, NewMul,
 
10323
                           DAG.getConstant(MulAmt2, VT));
 
10324
 
 
10325
    // Do not add new nodes to DAG combiner worklist.
 
10326
    DCI.CombineTo(N, NewMul, false);
 
10327
  }
 
10328
  return SDValue();
 
10329
}
 
10330
 
 
10331
static SDValue PerformSHLCombine(SDNode *N, SelectionDAG &DAG) {
 
10332
  SDValue N0 = N->getOperand(0);
 
10333
  SDValue N1 = N->getOperand(1);
 
10334
  ConstantSDNode *N1C = dyn_cast<ConstantSDNode>(N1);
 
10335
  EVT VT = N0.getValueType();
 
10336
 
 
10337
  // fold (shl (and (setcc_c), c1), c2) -> (and setcc_c, (c1 << c2))
 
10338
  // since the result of setcc_c is all zero's or all ones.
 
10339
  if (N1C && N0.getOpcode() == ISD::AND &&
 
10340
      N0.getOperand(1).getOpcode() == ISD::Constant) {
 
10341
    SDValue N00 = N0.getOperand(0);
 
10342
    if (N00.getOpcode() == X86ISD::SETCC_CARRY ||
 
10343
        ((N00.getOpcode() == ISD::ANY_EXTEND ||
 
10344
          N00.getOpcode() == ISD::ZERO_EXTEND) &&
 
10345
         N00.getOperand(0).getOpcode() == X86ISD::SETCC_CARRY)) {
 
10346
      APInt Mask = cast<ConstantSDNode>(N0.getOperand(1))->getAPIntValue();
 
10347
      APInt ShAmt = N1C->getAPIntValue();
 
10348
      Mask = Mask.shl(ShAmt);
 
10349
      if (Mask != 0)
 
10350
        return DAG.getNode(ISD::AND, N->getDebugLoc(), VT,
 
10351
                           N00, DAG.getConstant(Mask, VT));
 
10352
    }
 
10353
  }
 
10354
 
 
10355
  return SDValue();
 
10356
}
 
10357
 
 
10358
/// PerformShiftCombine - Transforms vector shift nodes to use vector shifts
 
10359
///                       when possible.
 
10360
static SDValue PerformShiftCombine(SDNode* N, SelectionDAG &DAG,
 
10361
                                   const X86Subtarget *Subtarget) {
 
10362
  EVT VT = N->getValueType(0);
 
10363
  if (!VT.isVector() && VT.isInteger() &&
 
10364
      N->getOpcode() == ISD::SHL)
 
10365
    return PerformSHLCombine(N, DAG);
 
10366
 
 
10367
  // On X86 with SSE2 support, we can transform this to a vector shift if
 
10368
  // all elements are shifted by the same amount.  We can't do this in legalize
 
10369
  // because the a constant vector is typically transformed to a constant pool
 
10370
  // so we have no knowledge of the shift amount.
 
10371
  if (!Subtarget->hasSSE2())
 
10372
    return SDValue();
 
10373
 
 
10374
  if (VT != MVT::v2i64 && VT != MVT::v4i32 && VT != MVT::v8i16)
 
10375
    return SDValue();
 
10376
 
 
10377
  SDValue ShAmtOp = N->getOperand(1);
 
10378
  EVT EltVT = VT.getVectorElementType();
 
10379
  DebugLoc DL = N->getDebugLoc();
 
10380
  SDValue BaseShAmt = SDValue();
 
10381
  if (ShAmtOp.getOpcode() == ISD::BUILD_VECTOR) {
 
10382
    unsigned NumElts = VT.getVectorNumElements();
 
10383
    unsigned i = 0;
 
10384
    for (; i != NumElts; ++i) {
 
10385
      SDValue Arg = ShAmtOp.getOperand(i);
 
10386
      if (Arg.getOpcode() == ISD::UNDEF) continue;
 
10387
      BaseShAmt = Arg;
 
10388
      break;
 
10389
    }
 
10390
    for (; i != NumElts; ++i) {
 
10391
      SDValue Arg = ShAmtOp.getOperand(i);
 
10392
      if (Arg.getOpcode() == ISD::UNDEF) continue;
 
10393
      if (Arg != BaseShAmt) {
 
10394
        return SDValue();
 
10395
      }
 
10396
    }
 
10397
  } else if (ShAmtOp.getOpcode() == ISD::VECTOR_SHUFFLE &&
 
10398
             cast<ShuffleVectorSDNode>(ShAmtOp)->isSplat()) {
 
10399
    SDValue InVec = ShAmtOp.getOperand(0);
 
10400
    if (InVec.getOpcode() == ISD::BUILD_VECTOR) {
 
10401
      unsigned NumElts = InVec.getValueType().getVectorNumElements();
 
10402
      unsigned i = 0;
 
10403
      for (; i != NumElts; ++i) {
 
10404
        SDValue Arg = InVec.getOperand(i);
 
10405
        if (Arg.getOpcode() == ISD::UNDEF) continue;
 
10406
        BaseShAmt = Arg;
 
10407
        break;
 
10408
      }
 
10409
    } else if (InVec.getOpcode() == ISD::INSERT_VECTOR_ELT) {
 
10410
       if (ConstantSDNode *C = dyn_cast<ConstantSDNode>(InVec.getOperand(2))) {
 
10411
         unsigned SplatIdx= cast<ShuffleVectorSDNode>(ShAmtOp)->getSplatIndex();
 
10412
         if (C->getZExtValue() == SplatIdx)
 
10413
           BaseShAmt = InVec.getOperand(1);
 
10414
       }
 
10415
    }
 
10416
    if (BaseShAmt.getNode() == 0)
 
10417
      BaseShAmt = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, DL, EltVT, ShAmtOp,
 
10418
                              DAG.getIntPtrConstant(0));
 
10419
  } else
 
10420
    return SDValue();
 
10421
 
 
10422
  // The shift amount is an i32.
 
10423
  if (EltVT.bitsGT(MVT::i32))
 
10424
    BaseShAmt = DAG.getNode(ISD::TRUNCATE, DL, MVT::i32, BaseShAmt);
 
10425
  else if (EltVT.bitsLT(MVT::i32))
 
10426
    BaseShAmt = DAG.getNode(ISD::ZERO_EXTEND, DL, MVT::i32, BaseShAmt);
 
10427
 
 
10428
  // The shift amount is identical so we can do a vector shift.
 
10429
  SDValue  ValOp = N->getOperand(0);
 
10430
  switch (N->getOpcode()) {
 
10431
  default:
 
10432
    llvm_unreachable("Unknown shift opcode!");
 
10433
    break;
 
10434
  case ISD::SHL:
 
10435
    if (VT == MVT::v2i64)
 
10436
      return DAG.getNode(ISD::INTRINSIC_WO_CHAIN, DL, VT,
 
10437
                         DAG.getConstant(Intrinsic::x86_sse2_pslli_q, MVT::i32),
 
10438
                         ValOp, BaseShAmt);
 
10439
    if (VT == MVT::v4i32)
 
10440
      return DAG.getNode(ISD::INTRINSIC_WO_CHAIN, DL, VT,
 
10441
                         DAG.getConstant(Intrinsic::x86_sse2_pslli_d, MVT::i32),
 
10442
                         ValOp, BaseShAmt);
 
10443
    if (VT == MVT::v8i16)
 
10444
      return DAG.getNode(ISD::INTRINSIC_WO_CHAIN, DL, VT,
 
10445
                         DAG.getConstant(Intrinsic::x86_sse2_pslli_w, MVT::i32),
 
10446
                         ValOp, BaseShAmt);
 
10447
    break;
 
10448
  case ISD::SRA:
 
10449
    if (VT == MVT::v4i32)
 
10450
      return DAG.getNode(ISD::INTRINSIC_WO_CHAIN, DL, VT,
 
10451
                         DAG.getConstant(Intrinsic::x86_sse2_psrai_d, MVT::i32),
 
10452
                         ValOp, BaseShAmt);
 
10453
    if (VT == MVT::v8i16)
 
10454
      return DAG.getNode(ISD::INTRINSIC_WO_CHAIN, DL, VT,
 
10455
                         DAG.getConstant(Intrinsic::x86_sse2_psrai_w, MVT::i32),
 
10456
                         ValOp, BaseShAmt);
 
10457
    break;
 
10458
  case ISD::SRL:
 
10459
    if (VT == MVT::v2i64)
 
10460
      return DAG.getNode(ISD::INTRINSIC_WO_CHAIN, DL, VT,
 
10461
                         DAG.getConstant(Intrinsic::x86_sse2_psrli_q, MVT::i32),
 
10462
                         ValOp, BaseShAmt);
 
10463
    if (VT == MVT::v4i32)
 
10464
      return DAG.getNode(ISD::INTRINSIC_WO_CHAIN, DL, VT,
 
10465
                         DAG.getConstant(Intrinsic::x86_sse2_psrli_d, MVT::i32),
 
10466
                         ValOp, BaseShAmt);
 
10467
    if (VT ==  MVT::v8i16)
 
10468
      return DAG.getNode(ISD::INTRINSIC_WO_CHAIN, DL, VT,
 
10469
                         DAG.getConstant(Intrinsic::x86_sse2_psrli_w, MVT::i32),
 
10470
                         ValOp, BaseShAmt);
 
10471
    break;
 
10472
  }
 
10473
  return SDValue();
 
10474
}
 
10475
 
 
10476
static SDValue PerformOrCombine(SDNode *N, SelectionDAG &DAG,
 
10477
                                TargetLowering::DAGCombinerInfo &DCI,
 
10478
                                const X86Subtarget *Subtarget) {
 
10479
  if (DCI.isBeforeLegalizeOps())
 
10480
    return SDValue();
 
10481
 
 
10482
  EVT VT = N->getValueType(0);
 
10483
  if (VT != MVT::i16 && VT != MVT::i32 && VT != MVT::i64)
 
10484
    return SDValue();
 
10485
 
 
10486
  // fold (or (x << c) | (y >> (64 - c))) ==> (shld64 x, y, c)
 
10487
  SDValue N0 = N->getOperand(0);
 
10488
  SDValue N1 = N->getOperand(1);
 
10489
  if (N0.getOpcode() == ISD::SRL && N1.getOpcode() == ISD::SHL)
 
10490
    std::swap(N0, N1);
 
10491
  if (N0.getOpcode() != ISD::SHL || N1.getOpcode() != ISD::SRL)
 
10492
    return SDValue();
 
10493
  if (!N0.hasOneUse() || !N1.hasOneUse())
 
10494
    return SDValue();
 
10495
 
 
10496
  SDValue ShAmt0 = N0.getOperand(1);
 
10497
  if (ShAmt0.getValueType() != MVT::i8)
 
10498
    return SDValue();
 
10499
  SDValue ShAmt1 = N1.getOperand(1);
 
10500
  if (ShAmt1.getValueType() != MVT::i8)
 
10501
    return SDValue();
 
10502
  if (ShAmt0.getOpcode() == ISD::TRUNCATE)
 
10503
    ShAmt0 = ShAmt0.getOperand(0);
 
10504
  if (ShAmt1.getOpcode() == ISD::TRUNCATE)
 
10505
    ShAmt1 = ShAmt1.getOperand(0);
 
10506
 
 
10507
  DebugLoc DL = N->getDebugLoc();
 
10508
  unsigned Opc = X86ISD::SHLD;
 
10509
  SDValue Op0 = N0.getOperand(0);
 
10510
  SDValue Op1 = N1.getOperand(0);
 
10511
  if (ShAmt0.getOpcode() == ISD::SUB) {
 
10512
    Opc = X86ISD::SHRD;
 
10513
    std::swap(Op0, Op1);
 
10514
    std::swap(ShAmt0, ShAmt1);
 
10515
  }
 
10516
 
 
10517
  unsigned Bits = VT.getSizeInBits();
 
10518
  if (ShAmt1.getOpcode() == ISD::SUB) {
 
10519
    SDValue Sum = ShAmt1.getOperand(0);
 
10520
    if (ConstantSDNode *SumC = dyn_cast<ConstantSDNode>(Sum)) {
 
10521
      SDValue ShAmt1Op1 = ShAmt1.getOperand(1);
 
10522
      if (ShAmt1Op1.getNode()->getOpcode() == ISD::TRUNCATE)
 
10523
        ShAmt1Op1 = ShAmt1Op1.getOperand(0);
 
10524
      if (SumC->getSExtValue() == Bits && ShAmt1Op1 == ShAmt0)
 
10525
        return DAG.getNode(Opc, DL, VT,
 
10526
                           Op0, Op1,
 
10527
                           DAG.getNode(ISD::TRUNCATE, DL,
 
10528
                                       MVT::i8, ShAmt0));
 
10529
    }
 
10530
  } else if (ConstantSDNode *ShAmt1C = dyn_cast<ConstantSDNode>(ShAmt1)) {
 
10531
    ConstantSDNode *ShAmt0C = dyn_cast<ConstantSDNode>(ShAmt0);
 
10532
    if (ShAmt0C &&
 
10533
        ShAmt0C->getSExtValue() + ShAmt1C->getSExtValue() == Bits)
 
10534
      return DAG.getNode(Opc, DL, VT,
 
10535
                         N0.getOperand(0), N1.getOperand(0),
 
10536
                         DAG.getNode(ISD::TRUNCATE, DL,
 
10537
                                       MVT::i8, ShAmt0));
 
10538
  }
 
10539
 
 
10540
  return SDValue();
 
10541
}
 
10542
 
 
10543
/// PerformSTORECombine - Do target-specific dag combines on STORE nodes.
 
10544
static SDValue PerformSTORECombine(SDNode *N, SelectionDAG &DAG,
 
10545
                                   const X86Subtarget *Subtarget) {
 
10546
  // Turn load->store of MMX types into GPR load/stores.  This avoids clobbering
 
10547
  // the FP state in cases where an emms may be missing.
 
10548
  // A preferable solution to the general problem is to figure out the right
 
10549
  // places to insert EMMS.  This qualifies as a quick hack.
 
10550
 
 
10551
  // Similarly, turn load->store of i64 into double load/stores in 32-bit mode.
 
10552
  StoreSDNode *St = cast<StoreSDNode>(N);
 
10553
  EVT VT = St->getValue().getValueType();
 
10554
  if (VT.getSizeInBits() != 64)
 
10555
    return SDValue();
 
10556
 
 
10557
  const Function *F = DAG.getMachineFunction().getFunction();
 
10558
  bool NoImplicitFloatOps = F->hasFnAttr(Attribute::NoImplicitFloat);
 
10559
  bool F64IsLegal = !UseSoftFloat && !NoImplicitFloatOps
 
10560
    && Subtarget->hasSSE2();
 
10561
  if ((VT.isVector() ||
 
10562
       (VT == MVT::i64 && F64IsLegal && !Subtarget->is64Bit())) &&
 
10563
      isa<LoadSDNode>(St->getValue()) &&
 
10564
      !cast<LoadSDNode>(St->getValue())->isVolatile() &&
 
10565
      St->getChain().hasOneUse() && !St->isVolatile()) {
 
10566
    SDNode* LdVal = St->getValue().getNode();
 
10567
    LoadSDNode *Ld = 0;
 
10568
    int TokenFactorIndex = -1;
 
10569
    SmallVector<SDValue, 8> Ops;
 
10570
    SDNode* ChainVal = St->getChain().getNode();
 
10571
    // Must be a store of a load.  We currently handle two cases:  the load
 
10572
    // is a direct child, and it's under an intervening TokenFactor.  It is
 
10573
    // possible to dig deeper under nested TokenFactors.
 
10574
    if (ChainVal == LdVal)
 
10575
      Ld = cast<LoadSDNode>(St->getChain());
 
10576
    else if (St->getValue().hasOneUse() &&
 
10577
             ChainVal->getOpcode() == ISD::TokenFactor) {
 
10578
      for (unsigned i=0, e = ChainVal->getNumOperands(); i != e; ++i) {
 
10579
        if (ChainVal->getOperand(i).getNode() == LdVal) {
 
10580
          TokenFactorIndex = i;
 
10581
          Ld = cast<LoadSDNode>(St->getValue());
 
10582
        } else
 
10583
          Ops.push_back(ChainVal->getOperand(i));
 
10584
      }
 
10585
    }
 
10586
 
 
10587
    if (!Ld || !ISD::isNormalLoad(Ld))
 
10588
      return SDValue();
 
10589
 
 
10590
    // If this is not the MMX case, i.e. we are just turning i64 load/store
 
10591
    // into f64 load/store, avoid the transformation if there are multiple
 
10592
    // uses of the loaded value.
 
10593
    if (!VT.isVector() && !Ld->hasNUsesOfValue(1, 0))
 
10594
      return SDValue();
 
10595
 
 
10596
    DebugLoc LdDL = Ld->getDebugLoc();
 
10597
    DebugLoc StDL = N->getDebugLoc();
 
10598
    // If we are a 64-bit capable x86, lower to a single movq load/store pair.
 
10599
    // Otherwise, if it's legal to use f64 SSE instructions, use f64 load/store
 
10600
    // pair instead.
 
10601
    if (Subtarget->is64Bit() || F64IsLegal) {
 
10602
      EVT LdVT = Subtarget->is64Bit() ? MVT::i64 : MVT::f64;
 
10603
      SDValue NewLd = DAG.getLoad(LdVT, LdDL, Ld->getChain(),
 
10604
                                  Ld->getBasePtr(), Ld->getSrcValue(),
 
10605
                                  Ld->getSrcValueOffset(), Ld->isVolatile(),
 
10606
                                  Ld->isNonTemporal(), Ld->getAlignment());
 
10607
      SDValue NewChain = NewLd.getValue(1);
 
10608
      if (TokenFactorIndex != -1) {
 
10609
        Ops.push_back(NewChain);
 
10610
        NewChain = DAG.getNode(ISD::TokenFactor, LdDL, MVT::Other, &Ops[0],
 
10611
                               Ops.size());
 
10612
      }
 
10613
      return DAG.getStore(NewChain, StDL, NewLd, St->getBasePtr(),
 
10614
                          St->getSrcValue(), St->getSrcValueOffset(),
 
10615
                          St->isVolatile(), St->isNonTemporal(),
 
10616
                          St->getAlignment());
 
10617
    }
 
10618
 
 
10619
    // Otherwise, lower to two pairs of 32-bit loads / stores.
 
10620
    SDValue LoAddr = Ld->getBasePtr();
 
10621
    SDValue HiAddr = DAG.getNode(ISD::ADD, LdDL, MVT::i32, LoAddr,
 
10622
                                 DAG.getConstant(4, MVT::i32));
 
10623
 
 
10624
    SDValue LoLd = DAG.getLoad(MVT::i32, LdDL, Ld->getChain(), LoAddr,
 
10625
                               Ld->getSrcValue(), Ld->getSrcValueOffset(),
 
10626
                               Ld->isVolatile(), Ld->isNonTemporal(),
 
10627
                               Ld->getAlignment());
 
10628
    SDValue HiLd = DAG.getLoad(MVT::i32, LdDL, Ld->getChain(), HiAddr,
 
10629
                               Ld->getSrcValue(), Ld->getSrcValueOffset()+4,
 
10630
                               Ld->isVolatile(), Ld->isNonTemporal(),
 
10631
                               MinAlign(Ld->getAlignment(), 4));
 
10632
 
 
10633
    SDValue NewChain = LoLd.getValue(1);
 
10634
    if (TokenFactorIndex != -1) {
 
10635
      Ops.push_back(LoLd);
 
10636
      Ops.push_back(HiLd);
 
10637
      NewChain = DAG.getNode(ISD::TokenFactor, LdDL, MVT::Other, &Ops[0],
 
10638
                             Ops.size());
 
10639
    }
 
10640
 
 
10641
    LoAddr = St->getBasePtr();
 
10642
    HiAddr = DAG.getNode(ISD::ADD, StDL, MVT::i32, LoAddr,
 
10643
                         DAG.getConstant(4, MVT::i32));
 
10644
 
 
10645
    SDValue LoSt = DAG.getStore(NewChain, StDL, LoLd, LoAddr,
 
10646
                                St->getSrcValue(), St->getSrcValueOffset(),
 
10647
                                St->isVolatile(), St->isNonTemporal(),
 
10648
                                St->getAlignment());
 
10649
    SDValue HiSt = DAG.getStore(NewChain, StDL, HiLd, HiAddr,
 
10650
                                St->getSrcValue(),
 
10651
                                St->getSrcValueOffset() + 4,
 
10652
                                St->isVolatile(),
 
10653
                                St->isNonTemporal(),
 
10654
                                MinAlign(St->getAlignment(), 4));
 
10655
    return DAG.getNode(ISD::TokenFactor, StDL, MVT::Other, LoSt, HiSt);
 
10656
  }
 
10657
  return SDValue();
 
10658
}
 
10659
 
 
10660
/// PerformFORCombine - Do target-specific dag combines on X86ISD::FOR and
 
10661
/// X86ISD::FXOR nodes.
 
10662
static SDValue PerformFORCombine(SDNode *N, SelectionDAG &DAG) {
 
10663
  assert(N->getOpcode() == X86ISD::FOR || N->getOpcode() == X86ISD::FXOR);
 
10664
  // F[X]OR(0.0, x) -> x
 
10665
  // F[X]OR(x, 0.0) -> x
 
10666
  if (ConstantFPSDNode *C = dyn_cast<ConstantFPSDNode>(N->getOperand(0)))
 
10667
    if (C->getValueAPF().isPosZero())
 
10668
      return N->getOperand(1);
 
10669
  if (ConstantFPSDNode *C = dyn_cast<ConstantFPSDNode>(N->getOperand(1)))
 
10670
    if (C->getValueAPF().isPosZero())
 
10671
      return N->getOperand(0);
 
10672
  return SDValue();
 
10673
}
 
10674
 
 
10675
/// PerformFANDCombine - Do target-specific dag combines on X86ISD::FAND nodes.
 
10676
static SDValue PerformFANDCombine(SDNode *N, SelectionDAG &DAG) {
 
10677
  // FAND(0.0, x) -> 0.0
 
10678
  // FAND(x, 0.0) -> 0.0
 
10679
  if (ConstantFPSDNode *C = dyn_cast<ConstantFPSDNode>(N->getOperand(0)))
 
10680
    if (C->getValueAPF().isPosZero())
 
10681
      return N->getOperand(0);
 
10682
  if (ConstantFPSDNode *C = dyn_cast<ConstantFPSDNode>(N->getOperand(1)))
 
10683
    if (C->getValueAPF().isPosZero())
 
10684
      return N->getOperand(1);
 
10685
  return SDValue();
 
10686
}
 
10687
 
 
10688
static SDValue PerformBTCombine(SDNode *N,
 
10689
                                SelectionDAG &DAG,
 
10690
                                TargetLowering::DAGCombinerInfo &DCI) {
 
10691
  // BT ignores high bits in the bit index operand.
 
10692
  SDValue Op1 = N->getOperand(1);
 
10693
  if (Op1.hasOneUse()) {
 
10694
    unsigned BitWidth = Op1.getValueSizeInBits();
 
10695
    APInt DemandedMask = APInt::getLowBitsSet(BitWidth, Log2_32(BitWidth));
 
10696
    APInt KnownZero, KnownOne;
 
10697
    TargetLowering::TargetLoweringOpt TLO(DAG, !DCI.isBeforeLegalize(),
 
10698
                                          !DCI.isBeforeLegalizeOps());
 
10699
    const TargetLowering &TLI = DAG.getTargetLoweringInfo();
 
10700
    if (TLO.ShrinkDemandedConstant(Op1, DemandedMask) ||
 
10701
        TLI.SimplifyDemandedBits(Op1, DemandedMask, KnownZero, KnownOne, TLO))
 
10702
      DCI.CommitTargetLoweringOpt(TLO);
 
10703
  }
 
10704
  return SDValue();
 
10705
}
 
10706
 
 
10707
static SDValue PerformVZEXT_MOVLCombine(SDNode *N, SelectionDAG &DAG) {
 
10708
  SDValue Op = N->getOperand(0);
 
10709
  if (Op.getOpcode() == ISD::BIT_CONVERT)
 
10710
    Op = Op.getOperand(0);
 
10711
  EVT VT = N->getValueType(0), OpVT = Op.getValueType();
 
10712
  if (Op.getOpcode() == X86ISD::VZEXT_LOAD &&
 
10713
      VT.getVectorElementType().getSizeInBits() ==
 
10714
      OpVT.getVectorElementType().getSizeInBits()) {
 
10715
    return DAG.getNode(ISD::BIT_CONVERT, N->getDebugLoc(), VT, Op);
 
10716
  }
 
10717
  return SDValue();
 
10718
}
 
10719
 
 
10720
static SDValue PerformZExtCombine(SDNode *N, SelectionDAG &DAG) {
 
10721
  // (i32 zext (and (i8  x86isd::setcc_carry), 1)) ->
 
10722
  //           (and (i32 x86isd::setcc_carry), 1)
 
10723
  // This eliminates the zext. This transformation is necessary because
 
10724
  // ISD::SETCC is always legalized to i8.
 
10725
  DebugLoc dl = N->getDebugLoc();
 
10726
  SDValue N0 = N->getOperand(0);
 
10727
  EVT VT = N->getValueType(0);
 
10728
  if (N0.getOpcode() == ISD::AND &&
 
10729
      N0.hasOneUse() &&
 
10730
      N0.getOperand(0).hasOneUse()) {
 
10731
    SDValue N00 = N0.getOperand(0);
 
10732
    if (N00.getOpcode() != X86ISD::SETCC_CARRY)
 
10733
      return SDValue();
 
10734
    ConstantSDNode *C = dyn_cast<ConstantSDNode>(N0.getOperand(1));
 
10735
    if (!C || C->getZExtValue() != 1)
 
10736
      return SDValue();
 
10737
    return DAG.getNode(ISD::AND, dl, VT,
 
10738
                       DAG.getNode(X86ISD::SETCC_CARRY, dl, VT,
 
10739
                                   N00.getOperand(0), N00.getOperand(1)),
 
10740
                       DAG.getConstant(1, VT));
 
10741
  }
 
10742
 
 
10743
  return SDValue();
 
10744
}
 
10745
 
 
10746
SDValue X86TargetLowering::PerformDAGCombine(SDNode *N,
 
10747
                                             DAGCombinerInfo &DCI) const {
 
10748
  SelectionDAG &DAG = DCI.DAG;
 
10749
  switch (N->getOpcode()) {
 
10750
  default: break;
 
10751
  case ISD::EXTRACT_VECTOR_ELT:
 
10752
                        return PerformEXTRACT_VECTOR_ELTCombine(N, DAG, *this);
 
10753
  case ISD::SELECT:         return PerformSELECTCombine(N, DAG, Subtarget);
 
10754
  case X86ISD::CMOV:        return PerformCMOVCombine(N, DAG, DCI);
 
10755
  case ISD::MUL:            return PerformMulCombine(N, DAG, DCI);
 
10756
  case ISD::SHL:
 
10757
  case ISD::SRA:
 
10758
  case ISD::SRL:            return PerformShiftCombine(N, DAG, Subtarget);
 
10759
  case ISD::OR:             return PerformOrCombine(N, DAG, DCI, Subtarget);
 
10760
  case ISD::STORE:          return PerformSTORECombine(N, DAG, Subtarget);
 
10761
  case X86ISD::FXOR:
 
10762
  case X86ISD::FOR:         return PerformFORCombine(N, DAG);
 
10763
  case X86ISD::FAND:        return PerformFANDCombine(N, DAG);
 
10764
  case X86ISD::BT:          return PerformBTCombine(N, DAG, DCI);
 
10765
  case X86ISD::VZEXT_MOVL:  return PerformVZEXT_MOVLCombine(N, DAG);
 
10766
  case ISD::ZERO_EXTEND:    return PerformZExtCombine(N, DAG);
 
10767
  case X86ISD::SHUFPS:      // Handle all target specific shuffles
 
10768
  case X86ISD::SHUFPD:
 
10769
  case X86ISD::PUNPCKHBW:
 
10770
  case X86ISD::PUNPCKHWD:
 
10771
  case X86ISD::PUNPCKHDQ:
 
10772
  case X86ISD::PUNPCKHQDQ:
 
10773
  case X86ISD::UNPCKHPS:
 
10774
  case X86ISD::UNPCKHPD:
 
10775
  case X86ISD::PUNPCKLBW:
 
10776
  case X86ISD::PUNPCKLWD:
 
10777
  case X86ISD::PUNPCKLDQ:
 
10778
  case X86ISD::PUNPCKLQDQ:
 
10779
  case X86ISD::UNPCKLPS:
 
10780
  case X86ISD::UNPCKLPD:
 
10781
  case X86ISD::MOVHLPS:
 
10782
  case X86ISD::MOVLHPS:
 
10783
  case X86ISD::PSHUFD:
 
10784
  case X86ISD::PSHUFHW:
 
10785
  case X86ISD::PSHUFLW:
 
10786
  case X86ISD::MOVSS:
 
10787
  case X86ISD::MOVSD:
 
10788
  case ISD::VECTOR_SHUFFLE: return PerformShuffleCombine(N, DAG, *this);
 
10789
  }
 
10790
 
 
10791
  return SDValue();
 
10792
}
 
10793
 
 
10794
/// isTypeDesirableForOp - Return true if the target has native support for
 
10795
/// the specified value type and it is 'desirable' to use the type for the
 
10796
/// given node type. e.g. On x86 i16 is legal, but undesirable since i16
 
10797
/// instruction encodings are longer and some i16 instructions are slow.
 
10798
bool X86TargetLowering::isTypeDesirableForOp(unsigned Opc, EVT VT) const {
 
10799
  if (!isTypeLegal(VT))
 
10800
    return false;
 
10801
  if (VT != MVT::i16)
 
10802
    return true;
 
10803
 
 
10804
  switch (Opc) {
 
10805
  default:
 
10806
    return true;
 
10807
  case ISD::LOAD:
 
10808
  case ISD::SIGN_EXTEND:
 
10809
  case ISD::ZERO_EXTEND:
 
10810
  case ISD::ANY_EXTEND:
 
10811
  case ISD::SHL:
 
10812
  case ISD::SRL:
 
10813
  case ISD::SUB:
 
10814
  case ISD::ADD:
 
10815
  case ISD::MUL:
 
10816
  case ISD::AND:
 
10817
  case ISD::OR:
 
10818
  case ISD::XOR:
 
10819
    return false;
 
10820
  }
 
10821
}
 
10822
 
 
10823
/// IsDesirableToPromoteOp - This method query the target whether it is
 
10824
/// beneficial for dag combiner to promote the specified node. If true, it
 
10825
/// should return the desired promotion type by reference.
 
10826
bool X86TargetLowering::IsDesirableToPromoteOp(SDValue Op, EVT &PVT) const {
 
10827
  EVT VT = Op.getValueType();
 
10828
  if (VT != MVT::i16)
 
10829
    return false;
 
10830
 
 
10831
  bool Promote = false;
 
10832
  bool Commute = false;
 
10833
  switch (Op.getOpcode()) {
 
10834
  default: break;
 
10835
  case ISD::LOAD: {
 
10836
    LoadSDNode *LD = cast<LoadSDNode>(Op);
 
10837
    // If the non-extending load has a single use and it's not live out, then it
 
10838
    // might be folded.
 
10839
    if (LD->getExtensionType() == ISD::NON_EXTLOAD /*&&
 
10840
                                                     Op.hasOneUse()*/) {
 
10841
      for (SDNode::use_iterator UI = Op.getNode()->use_begin(),
 
10842
             UE = Op.getNode()->use_end(); UI != UE; ++UI) {
 
10843
        // The only case where we'd want to promote LOAD (rather then it being
 
10844
        // promoted as an operand is when it's only use is liveout.
 
10845
        if (UI->getOpcode() != ISD::CopyToReg)
 
10846
          return false;
 
10847
      }
 
10848
    }
 
10849
    Promote = true;
 
10850
    break;
 
10851
  }
 
10852
  case ISD::SIGN_EXTEND:
 
10853
  case ISD::ZERO_EXTEND:
 
10854
  case ISD::ANY_EXTEND:
 
10855
    Promote = true;
 
10856
    break;
 
10857
  case ISD::SHL:
 
10858
  case ISD::SRL: {
 
10859
    SDValue N0 = Op.getOperand(0);
 
10860
    // Look out for (store (shl (load), x)).
 
10861
    if (MayFoldLoad(N0) && MayFoldIntoStore(Op))
 
10862
      return false;
 
10863
    Promote = true;
 
10864
    break;
 
10865
  }
 
10866
  case ISD::ADD:
 
10867
  case ISD::MUL:
 
10868
  case ISD::AND:
 
10869
  case ISD::OR:
 
10870
  case ISD::XOR:
 
10871
    Commute = true;
 
10872
    // fallthrough
 
10873
  case ISD::SUB: {
 
10874
    SDValue N0 = Op.getOperand(0);
 
10875
    SDValue N1 = Op.getOperand(1);
 
10876
    if (!Commute && MayFoldLoad(N1))
 
10877
      return false;
 
10878
    // Avoid disabling potential load folding opportunities.
 
10879
    if (MayFoldLoad(N0) && (!isa<ConstantSDNode>(N1) || MayFoldIntoStore(Op)))
 
10880
      return false;
 
10881
    if (MayFoldLoad(N1) && (!isa<ConstantSDNode>(N0) || MayFoldIntoStore(Op)))
 
10882
      return false;
 
10883
    Promote = true;
 
10884
  }
 
10885
  }
 
10886
 
 
10887
  PVT = MVT::i32;
 
10888
  return Promote;
 
10889
}
 
10890
 
 
10891
//===----------------------------------------------------------------------===//
 
10892
//                           X86 Inline Assembly Support
 
10893
//===----------------------------------------------------------------------===//
 
10894
 
 
10895
static bool LowerToBSwap(CallInst *CI) {
 
10896
  // FIXME: this should verify that we are targetting a 486 or better.  If not,
 
10897
  // we will turn this bswap into something that will be lowered to logical ops
 
10898
  // instead of emitting the bswap asm.  For now, we don't support 486 or lower
 
10899
  // so don't worry about this.
 
10900
 
 
10901
  // Verify this is a simple bswap.
 
10902
  if (CI->getNumArgOperands() != 1 ||
 
10903
      CI->getType() != CI->getArgOperand(0)->getType() ||
 
10904
      !CI->getType()->isIntegerTy())
 
10905
    return false;
 
10906
 
 
10907
  const IntegerType *Ty = dyn_cast<IntegerType>(CI->getType());
 
10908
  if (!Ty || Ty->getBitWidth() % 16 != 0)
 
10909
    return false;
 
10910
 
 
10911
  // Okay, we can do this xform, do so now.
 
10912
  const Type *Tys[] = { Ty };
 
10913
  Module *M = CI->getParent()->getParent()->getParent();
 
10914
  Constant *Int = Intrinsic::getDeclaration(M, Intrinsic::bswap, Tys, 1);
 
10915
 
 
10916
  Value *Op = CI->getArgOperand(0);
 
10917
  Op = CallInst::Create(Int, Op, CI->getName(), CI);
 
10918
 
 
10919
  CI->replaceAllUsesWith(Op);
 
10920
  CI->eraseFromParent();
 
10921
  return true;
 
10922
}
 
10923
 
 
10924
bool X86TargetLowering::ExpandInlineAsm(CallInst *CI) const {
 
10925
  InlineAsm *IA = cast<InlineAsm>(CI->getCalledValue());
 
10926
  std::vector<InlineAsm::ConstraintInfo> Constraints = IA->ParseConstraints();
 
10927
 
 
10928
  std::string AsmStr = IA->getAsmString();
 
10929
 
 
10930
  // TODO: should remove alternatives from the asmstring: "foo {a|b}" -> "foo a"
 
10931
  SmallVector<StringRef, 4> AsmPieces;
 
10932
  SplitString(AsmStr, AsmPieces, "\n");  // ; as separator?
 
10933
 
 
10934
  switch (AsmPieces.size()) {
 
10935
  default: return false;
 
10936
  case 1:
 
10937
    AsmStr = AsmPieces[0];
 
10938
    AsmPieces.clear();
 
10939
    SplitString(AsmStr, AsmPieces, " \t");  // Split with whitespace.
 
10940
 
 
10941
    // bswap $0
 
10942
    if (AsmPieces.size() == 2 &&
 
10943
        (AsmPieces[0] == "bswap" ||
 
10944
         AsmPieces[0] == "bswapq" ||
 
10945
         AsmPieces[0] == "bswapl") &&
 
10946
        (AsmPieces[1] == "$0" ||
 
10947
         AsmPieces[1] == "${0:q}")) {
 
10948
      // No need to check constraints, nothing other than the equivalent of
 
10949
      // "=r,0" would be valid here.
 
10950
      return LowerToBSwap(CI);
 
10951
    }
 
10952
    // rorw $$8, ${0:w}  -->  llvm.bswap.i16
 
10953
    if (CI->getType()->isIntegerTy(16) &&
 
10954
        AsmPieces.size() == 3 &&
 
10955
        (AsmPieces[0] == "rorw" || AsmPieces[0] == "rolw") &&
 
10956
        AsmPieces[1] == "$$8," &&
 
10957
        AsmPieces[2] == "${0:w}" &&
 
10958
        IA->getConstraintString().compare(0, 5, "=r,0,") == 0) {
 
10959
      AsmPieces.clear();
 
10960
      const std::string &Constraints = IA->getConstraintString();
 
10961
      SplitString(StringRef(Constraints).substr(5), AsmPieces, ",");
 
10962
      std::sort(AsmPieces.begin(), AsmPieces.end());
 
10963
      if (AsmPieces.size() == 4 &&
 
10964
          AsmPieces[0] == "~{cc}" &&
 
10965
          AsmPieces[1] == "~{dirflag}" &&
 
10966
          AsmPieces[2] == "~{flags}" &&
 
10967
          AsmPieces[3] == "~{fpsr}") {
 
10968
        return LowerToBSwap(CI);
 
10969
      }
 
10970
    }
 
10971
    break;
 
10972
  case 3:
 
10973
    if (CI->getType()->isIntegerTy(64) &&
 
10974
        Constraints.size() >= 2 &&
 
10975
        Constraints[0].Codes.size() == 1 && Constraints[0].Codes[0] == "A" &&
 
10976
        Constraints[1].Codes.size() == 1 && Constraints[1].Codes[0] == "0") {
 
10977
      // bswap %eax / bswap %edx / xchgl %eax, %edx  -> llvm.bswap.i64
 
10978
      SmallVector<StringRef, 4> Words;
 
10979
      SplitString(AsmPieces[0], Words, " \t");
 
10980
      if (Words.size() == 2 && Words[0] == "bswap" && Words[1] == "%eax") {
 
10981
        Words.clear();
 
10982
        SplitString(AsmPieces[1], Words, " \t");
 
10983
        if (Words.size() == 2 && Words[0] == "bswap" && Words[1] == "%edx") {
 
10984
          Words.clear();
 
10985
          SplitString(AsmPieces[2], Words, " \t,");
 
10986
          if (Words.size() == 3 && Words[0] == "xchgl" && Words[1] == "%eax" &&
 
10987
              Words[2] == "%edx") {
 
10988
            return LowerToBSwap(CI);
 
10989
          }
 
10990
        }
 
10991
      }
 
10992
    }
 
10993
    break;
 
10994
  }
 
10995
  return false;
 
10996
}
 
10997
 
 
10998
 
 
10999
 
 
11000
/// getConstraintType - Given a constraint letter, return the type of
 
11001
/// constraint it is for this target.
 
11002
X86TargetLowering::ConstraintType
 
11003
X86TargetLowering::getConstraintType(const std::string &Constraint) const {
 
11004
  if (Constraint.size() == 1) {
 
11005
    switch (Constraint[0]) {
 
11006
    case 'A':
 
11007
      return C_Register;
 
11008
    case 'f':
 
11009
    case 'r':
 
11010
    case 'R':
 
11011
    case 'l':
 
11012
    case 'q':
 
11013
    case 'Q':
 
11014
    case 'x':
 
11015
    case 'y':
 
11016
    case 'Y':
 
11017
      return C_RegisterClass;
 
11018
    case 'e':
 
11019
    case 'Z':
 
11020
      return C_Other;
 
11021
    default:
 
11022
      break;
 
11023
    }
 
11024
  }
 
11025
  return TargetLowering::getConstraintType(Constraint);
 
11026
}
 
11027
 
 
11028
/// LowerXConstraint - try to replace an X constraint, which matches anything,
 
11029
/// with another that has more specific requirements based on the type of the
 
11030
/// corresponding operand.
 
11031
const char *X86TargetLowering::
 
11032
LowerXConstraint(EVT ConstraintVT) const {
 
11033
  // FP X constraints get lowered to SSE1/2 registers if available, otherwise
 
11034
  // 'f' like normal targets.
 
11035
  if (ConstraintVT.isFloatingPoint()) {
 
11036
    if (Subtarget->hasSSE2())
 
11037
      return "Y";
 
11038
    if (Subtarget->hasSSE1())
 
11039
      return "x";
 
11040
  }
 
11041
 
 
11042
  return TargetLowering::LowerXConstraint(ConstraintVT);
 
11043
}
 
11044
 
 
11045
/// LowerAsmOperandForConstraint - Lower the specified operand into the Ops
 
11046
/// vector.  If it is invalid, don't add anything to Ops.
 
11047
void X86TargetLowering::LowerAsmOperandForConstraint(SDValue Op,
 
11048
                                                     char Constraint,
 
11049
                                                     std::vector<SDValue>&Ops,
 
11050
                                                     SelectionDAG &DAG) const {
 
11051
  SDValue Result(0, 0);
 
11052
 
 
11053
  switch (Constraint) {
 
11054
  default: break;
 
11055
  case 'I':
 
11056
    if (ConstantSDNode *C = dyn_cast<ConstantSDNode>(Op)) {
 
11057
      if (C->getZExtValue() <= 31) {
 
11058
        Result = DAG.getTargetConstant(C->getZExtValue(), Op.getValueType());
 
11059
        break;
 
11060
      }
 
11061
    }
 
11062
    return;
 
11063
  case 'J':
 
11064
    if (ConstantSDNode *C = dyn_cast<ConstantSDNode>(Op)) {
 
11065
      if (C->getZExtValue() <= 63) {
 
11066
        Result = DAG.getTargetConstant(C->getZExtValue(), Op.getValueType());
 
11067
        break;
 
11068
      }
 
11069
    }
 
11070
    return;
 
11071
  case 'K':
 
11072
    if (ConstantSDNode *C = dyn_cast<ConstantSDNode>(Op)) {
 
11073
      if ((int8_t)C->getSExtValue() == C->getSExtValue()) {
 
11074
        Result = DAG.getTargetConstant(C->getZExtValue(), Op.getValueType());
 
11075
        break;
 
11076
      }
 
11077
    }
 
11078
    return;
 
11079
  case 'N':
 
11080
    if (ConstantSDNode *C = dyn_cast<ConstantSDNode>(Op)) {
 
11081
      if (C->getZExtValue() <= 255) {
 
11082
        Result = DAG.getTargetConstant(C->getZExtValue(), Op.getValueType());
 
11083
        break;
 
11084
      }
 
11085
    }
 
11086
    return;
 
11087
  case 'e': {
 
11088
    // 32-bit signed value
 
11089
    if (ConstantSDNode *C = dyn_cast<ConstantSDNode>(Op)) {
 
11090
      if (ConstantInt::isValueValidForType(Type::getInt32Ty(*DAG.getContext()),
 
11091
                                           C->getSExtValue())) {
 
11092
        // Widen to 64 bits here to get it sign extended.
 
11093
        Result = DAG.getTargetConstant(C->getSExtValue(), MVT::i64);
 
11094
        break;
 
11095
      }
 
11096
    // FIXME gcc accepts some relocatable values here too, but only in certain
 
11097
    // memory models; it's complicated.
 
11098
    }
 
11099
    return;
 
11100
  }
 
11101
  case 'Z': {
 
11102
    // 32-bit unsigned value
 
11103
    if (ConstantSDNode *C = dyn_cast<ConstantSDNode>(Op)) {
 
11104
      if (ConstantInt::isValueValidForType(Type::getInt32Ty(*DAG.getContext()),
 
11105
                                           C->getZExtValue())) {
 
11106
        Result = DAG.getTargetConstant(C->getZExtValue(), Op.getValueType());
 
11107
        break;
 
11108
      }
 
11109
    }
 
11110
    // FIXME gcc accepts some relocatable values here too, but only in certain
 
11111
    // memory models; it's complicated.
 
11112
    return;
 
11113
  }
 
11114
  case 'i': {
 
11115
    // Literal immediates are always ok.
 
11116
    if (ConstantSDNode *CST = dyn_cast<ConstantSDNode>(Op)) {
 
11117
      // Widen to 64 bits here to get it sign extended.
 
11118
      Result = DAG.getTargetConstant(CST->getSExtValue(), MVT::i64);
 
11119
      break;
 
11120
    }
 
11121
 
 
11122
    // In any sort of PIC mode addresses need to be computed at runtime by
 
11123
    // adding in a register or some sort of table lookup.  These can't
 
11124
    // be used as immediates.
 
11125
    if (Subtarget->isPICStyleGOT() || Subtarget->isPICStyleStubPIC())
 
11126
      return;
 
11127
 
 
11128
    // If we are in non-pic codegen mode, we allow the address of a global (with
 
11129
    // an optional displacement) to be used with 'i'.
 
11130
    GlobalAddressSDNode *GA = 0;
 
11131
    int64_t Offset = 0;
 
11132
 
 
11133
    // Match either (GA), (GA+C), (GA+C1+C2), etc.
 
11134
    while (1) {
 
11135
      if ((GA = dyn_cast<GlobalAddressSDNode>(Op))) {
 
11136
        Offset += GA->getOffset();
 
11137
        break;
 
11138
      } else if (Op.getOpcode() == ISD::ADD) {
 
11139
        if (ConstantSDNode *C = dyn_cast<ConstantSDNode>(Op.getOperand(1))) {
 
11140
          Offset += C->getZExtValue();
 
11141
          Op = Op.getOperand(0);
 
11142
          continue;
 
11143
        }
 
11144
      } else if (Op.getOpcode() == ISD::SUB) {
 
11145
        if (ConstantSDNode *C = dyn_cast<ConstantSDNode>(Op.getOperand(1))) {
 
11146
          Offset += -C->getZExtValue();
 
11147
          Op = Op.getOperand(0);
 
11148
          continue;
 
11149
        }
 
11150
      }
 
11151
 
 
11152
      // Otherwise, this isn't something we can handle, reject it.
 
11153
      return;
 
11154
    }
 
11155
 
 
11156
    const GlobalValue *GV = GA->getGlobal();
 
11157
    // If we require an extra load to get this address, as in PIC mode, we
 
11158
    // can't accept it.
 
11159
    if (isGlobalStubReference(Subtarget->ClassifyGlobalReference(GV,
 
11160
                                                        getTargetMachine())))
 
11161
      return;
 
11162
 
 
11163
    Result = DAG.getTargetGlobalAddress(GV, Op.getDebugLoc(),
 
11164
                                        GA->getValueType(0), Offset);
 
11165
    break;
 
11166
  }
 
11167
  }
 
11168
 
 
11169
  if (Result.getNode()) {
 
11170
    Ops.push_back(Result);
 
11171
    return;
 
11172
  }
 
11173
  return TargetLowering::LowerAsmOperandForConstraint(Op, Constraint, Ops, DAG);
 
11174
}
 
11175
 
 
11176
std::vector<unsigned> X86TargetLowering::
 
11177
getRegClassForInlineAsmConstraint(const std::string &Constraint,
 
11178
                                  EVT VT) const {
 
11179
  if (Constraint.size() == 1) {
 
11180
    // FIXME: not handling fp-stack yet!
 
11181
    switch (Constraint[0]) {      // GCC X86 Constraint Letters
 
11182
    default: break;  // Unknown constraint letter
 
11183
    case 'q':   // GENERAL_REGS in 64-bit mode, Q_REGS in 32-bit mode.
 
11184
      if (Subtarget->is64Bit()) {
 
11185
        if (VT == MVT::i32)
 
11186
          return make_vector<unsigned>(X86::EAX, X86::EDX, X86::ECX, X86::EBX,
 
11187
                                       X86::ESI, X86::EDI, X86::R8D, X86::R9D,
 
11188
                                       X86::R10D,X86::R11D,X86::R12D,
 
11189
                                       X86::R13D,X86::R14D,X86::R15D,
 
11190
                                       X86::EBP, X86::ESP, 0);
 
11191
        else if (VT == MVT::i16)
 
11192
          return make_vector<unsigned>(X86::AX,  X86::DX,  X86::CX, X86::BX,
 
11193
                                       X86::SI,  X86::DI,  X86::R8W,X86::R9W,
 
11194
                                       X86::R10W,X86::R11W,X86::R12W,
 
11195
                                       X86::R13W,X86::R14W,X86::R15W,
 
11196
                                       X86::BP,  X86::SP, 0);
 
11197
        else if (VT == MVT::i8)
 
11198
          return make_vector<unsigned>(X86::AL,  X86::DL,  X86::CL, X86::BL,
 
11199
                                       X86::SIL, X86::DIL, X86::R8B,X86::R9B,
 
11200
                                       X86::R10B,X86::R11B,X86::R12B,
 
11201
                                       X86::R13B,X86::R14B,X86::R15B,
 
11202
                                       X86::BPL, X86::SPL, 0);
 
11203
 
 
11204
        else if (VT == MVT::i64)
 
11205
          return make_vector<unsigned>(X86::RAX, X86::RDX, X86::RCX, X86::RBX,
 
11206
                                       X86::RSI, X86::RDI, X86::R8,  X86::R9,
 
11207
                                       X86::R10, X86::R11, X86::R12,
 
11208
                                       X86::R13, X86::R14, X86::R15,
 
11209
                                       X86::RBP, X86::RSP, 0);
 
11210
 
 
11211
        break;
 
11212
      }
 
11213
      // 32-bit fallthrough
 
11214
    case 'Q':   // Q_REGS
 
11215
      if (VT == MVT::i32)
 
11216
        return make_vector<unsigned>(X86::EAX, X86::EDX, X86::ECX, X86::EBX, 0);
 
11217
      else if (VT == MVT::i16)
 
11218
        return make_vector<unsigned>(X86::AX, X86::DX, X86::CX, X86::BX, 0);
 
11219
      else if (VT == MVT::i8)
 
11220
        return make_vector<unsigned>(X86::AL, X86::DL, X86::CL, X86::BL, 0);
 
11221
      else if (VT == MVT::i64)
 
11222
        return make_vector<unsigned>(X86::RAX, X86::RDX, X86::RCX, X86::RBX, 0);
 
11223
      break;
 
11224
    }
 
11225
  }
 
11226
 
 
11227
  return std::vector<unsigned>();
 
11228
}
 
11229
 
 
11230
std::pair<unsigned, const TargetRegisterClass*>
 
11231
X86TargetLowering::getRegForInlineAsmConstraint(const std::string &Constraint,
 
11232
                                                EVT VT) const {
 
11233
  // First, see if this is a constraint that directly corresponds to an LLVM
 
11234
  // register class.
 
11235
  if (Constraint.size() == 1) {
 
11236
    // GCC Constraint Letters
 
11237
    switch (Constraint[0]) {
 
11238
    default: break;
 
11239
    case 'r':   // GENERAL_REGS
 
11240
    case 'l':   // INDEX_REGS
 
11241
      if (VT == MVT::i8)
 
11242
        return std::make_pair(0U, X86::GR8RegisterClass);
 
11243
      if (VT == MVT::i16)
 
11244
        return std::make_pair(0U, X86::GR16RegisterClass);
 
11245
      if (VT == MVT::i32 || !Subtarget->is64Bit())
 
11246
        return std::make_pair(0U, X86::GR32RegisterClass);
 
11247
      return std::make_pair(0U, X86::GR64RegisterClass);
 
11248
    case 'R':   // LEGACY_REGS
 
11249
      if (VT == MVT::i8)
 
11250
        return std::make_pair(0U, X86::GR8_NOREXRegisterClass);
 
11251
      if (VT == MVT::i16)
 
11252
        return std::make_pair(0U, X86::GR16_NOREXRegisterClass);
 
11253
      if (VT == MVT::i32 || !Subtarget->is64Bit())
 
11254
        return std::make_pair(0U, X86::GR32_NOREXRegisterClass);
 
11255
      return std::make_pair(0U, X86::GR64_NOREXRegisterClass);
 
11256
    case 'f':  // FP Stack registers.
 
11257
      // If SSE is enabled for this VT, use f80 to ensure the isel moves the
 
11258
      // value to the correct fpstack register class.
 
11259
      if (VT == MVT::f32 && !isScalarFPTypeInSSEReg(VT))
 
11260
        return std::make_pair(0U, X86::RFP32RegisterClass);
 
11261
      if (VT == MVT::f64 && !isScalarFPTypeInSSEReg(VT))
 
11262
        return std::make_pair(0U, X86::RFP64RegisterClass);
 
11263
      return std::make_pair(0U, X86::RFP80RegisterClass);
 
11264
    case 'y':   // MMX_REGS if MMX allowed.
 
11265
      if (!Subtarget->hasMMX()) break;
 
11266
      return std::make_pair(0U, X86::VR64RegisterClass);
 
11267
    case 'Y':   // SSE_REGS if SSE2 allowed
 
11268
      if (!Subtarget->hasSSE2()) break;
 
11269
      // FALL THROUGH.
 
11270
    case 'x':   // SSE_REGS if SSE1 allowed
 
11271
      if (!Subtarget->hasSSE1()) break;
 
11272
 
 
11273
      switch (VT.getSimpleVT().SimpleTy) {
 
11274
      default: break;
 
11275
      // Scalar SSE types.
 
11276
      case MVT::f32:
 
11277
      case MVT::i32:
 
11278
        return std::make_pair(0U, X86::FR32RegisterClass);
 
11279
      case MVT::f64:
 
11280
      case MVT::i64:
 
11281
        return std::make_pair(0U, X86::FR64RegisterClass);
 
11282
      // Vector types.
 
11283
      case MVT::v16i8:
 
11284
      case MVT::v8i16:
 
11285
      case MVT::v4i32:
 
11286
      case MVT::v2i64:
 
11287
      case MVT::v4f32:
 
11288
      case MVT::v2f64:
 
11289
        return std::make_pair(0U, X86::VR128RegisterClass);
 
11290
      }
 
11291
      break;
 
11292
    }
 
11293
  }
 
11294
 
 
11295
  // Use the default implementation in TargetLowering to convert the register
 
11296
  // constraint into a member of a register class.
 
11297
  std::pair<unsigned, const TargetRegisterClass*> Res;
 
11298
  Res = TargetLowering::getRegForInlineAsmConstraint(Constraint, VT);
 
11299
 
 
11300
  // Not found as a standard register?
 
11301
  if (Res.second == 0) {
 
11302
    // Map st(0) -> st(7) -> ST0
 
11303
    if (Constraint.size() == 7 && Constraint[0] == '{' &&
 
11304
        tolower(Constraint[1]) == 's' &&
 
11305
        tolower(Constraint[2]) == 't' &&
 
11306
        Constraint[3] == '(' &&
 
11307
        (Constraint[4] >= '0' && Constraint[4] <= '7') &&
 
11308
        Constraint[5] == ')' &&
 
11309
        Constraint[6] == '}') {
 
11310
 
 
11311
      Res.first = X86::ST0+Constraint[4]-'0';
 
11312
      Res.second = X86::RFP80RegisterClass;
 
11313
      return Res;
 
11314
    }
 
11315
 
 
11316
    // GCC allows "st(0)" to be called just plain "st".
 
11317
    if (StringRef("{st}").equals_lower(Constraint)) {
 
11318
      Res.first = X86::ST0;
 
11319
      Res.second = X86::RFP80RegisterClass;
 
11320
      return Res;
 
11321
    }
 
11322
 
 
11323
    // flags -> EFLAGS
 
11324
    if (StringRef("{flags}").equals_lower(Constraint)) {
 
11325
      Res.first = X86::EFLAGS;
 
11326
      Res.second = X86::CCRRegisterClass;
 
11327
      return Res;
 
11328
    }
 
11329
 
 
11330
    // 'A' means EAX + EDX.
 
11331
    if (Constraint == "A") {
 
11332
      Res.first = X86::EAX;
 
11333
      Res.second = X86::GR32_ADRegisterClass;
 
11334
      return Res;
 
11335
    }
 
11336
    return Res;
 
11337
  }
 
11338
 
 
11339
  // Otherwise, check to see if this is a register class of the wrong value
 
11340
  // type.  For example, we want to map "{ax},i32" -> {eax}, we don't want it to
 
11341
  // turn into {ax},{dx}.
 
11342
  if (Res.second->hasType(VT))
 
11343
    return Res;   // Correct type already, nothing to do.
 
11344
 
 
11345
  // All of the single-register GCC register classes map their values onto
 
11346
  // 16-bit register pieces "ax","dx","cx","bx","si","di","bp","sp".  If we
 
11347
  // really want an 8-bit or 32-bit register, map to the appropriate register
 
11348
  // class and return the appropriate register.
 
11349
  if (Res.second == X86::GR16RegisterClass) {
 
11350
    if (VT == MVT::i8) {
 
11351
      unsigned DestReg = 0;
 
11352
      switch (Res.first) {
 
11353
      default: break;
 
11354
      case X86::AX: DestReg = X86::AL; break;
 
11355
      case X86::DX: DestReg = X86::DL; break;
 
11356
      case X86::CX: DestReg = X86::CL; break;
 
11357
      case X86::BX: DestReg = X86::BL; break;
 
11358
      }
 
11359
      if (DestReg) {
 
11360
        Res.first = DestReg;
 
11361
        Res.second = X86::GR8RegisterClass;
 
11362
      }
 
11363
    } else if (VT == MVT::i32) {
 
11364
      unsigned DestReg = 0;
 
11365
      switch (Res.first) {
 
11366
      default: break;
 
11367
      case X86::AX: DestReg = X86::EAX; break;
 
11368
      case X86::DX: DestReg = X86::EDX; break;
 
11369
      case X86::CX: DestReg = X86::ECX; break;
 
11370
      case X86::BX: DestReg = X86::EBX; break;
 
11371
      case X86::SI: DestReg = X86::ESI; break;
 
11372
      case X86::DI: DestReg = X86::EDI; break;
 
11373
      case X86::BP: DestReg = X86::EBP; break;
 
11374
      case X86::SP: DestReg = X86::ESP; break;
 
11375
      }
 
11376
      if (DestReg) {
 
11377
        Res.first = DestReg;
 
11378
        Res.second = X86::GR32RegisterClass;
 
11379
      }
 
11380
    } else if (VT == MVT::i64) {
 
11381
      unsigned DestReg = 0;
 
11382
      switch (Res.first) {
 
11383
      default: break;
 
11384
      case X86::AX: DestReg = X86::RAX; break;
 
11385
      case X86::DX: DestReg = X86::RDX; break;
 
11386
      case X86::CX: DestReg = X86::RCX; break;
 
11387
      case X86::BX: DestReg = X86::RBX; break;
 
11388
      case X86::SI: DestReg = X86::RSI; break;
 
11389
      case X86::DI: DestReg = X86::RDI; break;
 
11390
      case X86::BP: DestReg = X86::RBP; break;
 
11391
      case X86::SP: DestReg = X86::RSP; break;
 
11392
      }
 
11393
      if (DestReg) {
 
11394
        Res.first = DestReg;
 
11395
        Res.second = X86::GR64RegisterClass;
 
11396
      }
 
11397
    }
 
11398
  } else if (Res.second == X86::FR32RegisterClass ||
 
11399
             Res.second == X86::FR64RegisterClass ||
 
11400
             Res.second == X86::VR128RegisterClass) {
 
11401
    // Handle references to XMM physical registers that got mapped into the
 
11402
    // wrong class.  This can happen with constraints like {xmm0} where the
 
11403
    // target independent register mapper will just pick the first match it can
 
11404
    // find, ignoring the required type.
 
11405
    if (VT == MVT::f32)
 
11406
      Res.second = X86::FR32RegisterClass;
 
11407
    else if (VT == MVT::f64)
 
11408
      Res.second = X86::FR64RegisterClass;
 
11409
    else if (X86::VR128RegisterClass->hasType(VT))
 
11410
      Res.second = X86::VR128RegisterClass;
 
11411
  }
 
11412
 
 
11413
  return Res;
 
11414
}