summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Target/X86/X86FloatingPoint.cpp
Commit message (Collapse)AuthorAgeFilesLines
...
* Allow x87 FP registers to be alive globally in a function.Jakob Stoklund Olesen2010-07-161-36/+383
| | | | | | | | | | | | | | | | FP_REG_KILL instructions are still inserted, but can be disabled by passing -live-x87 to llc. The X87FPRegKillInserterPass is going to be removed shortly. CFG edges are partioned into bundles where the x87 stack must be allocated identically. Code is insertad at the end of each basic block that shuffles the live FP registers to match the outgoing bundles expectations. This fix is in preparation for some upcoming register allocator improvements that may extend the live range of registers beyond a basic block, similar to LICM. It also provides a nice runtime speedup if you are building with -mfpmath=387. llvm-svn: 108529
* Don't emit st(0)/st(1) copies as FpMOV instructions. Use FpSET_ST? instead.Jakob Stoklund Olesen2010-07-101-40/+28
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Based on a patch by Rafael Espíndola. Attempt to make the FpSET_ST1 hack more robust, but we are still relying on FpSET_ST0 preceeding it. This is only for supporting really weird x87 inline asm. We support: FpSET_ST0 INLINEASM FpSET_ST0 FpSET_ST1 INLINEASM with and without kills on the arguments. We don't support: FpSET_ST1 FpSET_ST0 INLINEASM nor FpSET_ST1 INLINEASM Just Don't Do It! llvm-svn: 108047
* add some long-overdue enums to refer to the parts of the 5-operandChris Lattner2010-07-081-1/+1
| | | | | | X86 memory operand. llvm-svn: 107925
* Teach the x86 floating point stackifier to handle COPY instructions.Jakob Stoklund Olesen2010-07-081-1/+36
| | | | | | | | | | | This pass runs before COPY instructions are passed to copyPhysReg, so we simply translate COPY to the proper pseudo instruction. Note that copyPhysReg does not handle floating point stack copies. Once COPY is used everywhere, this can be cleaned up a bit, and most of the pseudo instructions can be removed. llvm-svn: 107899
* Use pre-increment instead of post-increment when the result is not used.Dan Gohman2010-06-221-3/+3
| | | | llvm-svn: 106542
* Reapply r105521, this time appending "LLU" to 64 bitBruno Cardoso Lopes2010-06-081-1/+1
| | | | | | immediates to avoid breaking the build. llvm-svn: 105652
* revert r105521, which is breaking the buildbots with stuff like this:Chris Lattner2010-06-051-1/+1
| | | | | | | | | | | | | | In file included from X86InstrInfo.cpp:16: X86GenInstrInfo.inc:2789: error: integer constant is too large for 'long' type X86GenInstrInfo.inc:2790: error: integer constant is too large for 'long' type X86GenInstrInfo.inc:2792: error: integer constant is too large for 'long' type X86GenInstrInfo.inc:2793: error: integer constant is too large for 'long' type X86GenInstrInfo.inc:2808: error: integer constant is too large for 'long' type X86GenInstrInfo.inc:2809: error: integer constant is too large for 'long' type X86GenInstrInfo.inc:2816: error: integer constant is too large for 'long' type X86GenInstrInfo.inc:2817: error: integer constant is too large for 'long' type llvm-svn: 105524
* Initial AVX support for some instructions. No patterns matchedBruno Cardoso Lopes2010-06-051-1/+1
| | | | | | yet, only assembly encoding support. llvm-svn: 105521
* Teach X86FloatingPoint that a register can be killed multiple times by the sameJakob Stoklund Olesen2010-04-281-6/+7
| | | | | | | | | | | | instruction. This instruction would crash the pass: INLINEASM <es:foo $0 $1>, 9, %FP0<kill>, 9, %FP0<kill>, 14, %EFLAGS<earlyclobber,def,dead> Now it doesn't. llvm-svn: 102509
* move target-independent opcodes out of TargetInstrInfoChris Lattner2010-02-091-2/+2
| | | | | | | | | into TargetOpcodes.h. #include the new TargetOpcodes.h into MachineInstr. Add new inline accessors (like isPHI()) to MachineInstr, and start using them throughout the codebase. llvm-svn: 95687
* Change errs() to dbgs().David Greene2010-01-051-8/+8
| | | | llvm-svn: 92654
* improve portability to avoid conflicting with std::next in c++'0x.Chris Lattner2009-12-031-1/+1
| | | | | | Patch by Howard Hinnant! llvm-svn: 90365
* Remove includes of Support/Compiler.h that are no longer needed after theNick Lewycky2009-10-251-1/+0
| | | | | | VISIBILITY_HIDDEN removal. llvm-svn: 85043
* Remove VISIBILITY_HIDDEN from class/struct found inside anonymous namespaces.Nick Lewycky2009-10-251-1/+1
| | | | | | | Chris claims we should never have visibility_hidden inside any .cpp file but that's still not true even after this commit. llvm-svn: 85042
* fix PR4767, a crash because fp stackifier visited blocks inChris Lattner2009-09-081-0/+8
| | | | | | | | depth first order, so it wouldn't process unreachable blocks. When compiling at -O0, late dead block elimination isn't done and the bad instructions got to isel. llvm-svn: 81187
* eliminate uses of cerr()Chris Lattner2009-08-231-3/+3
| | | | llvm-svn: 79834
* remove various std::ostream version of printing methods fromChris Lattner2009-08-231-3/+3
| | | | | | | | MachineInstr and MachineOperand. This required eliminating a bunch of stuff that was using DOUT, I hope that bill doesn't mind me stealing his fun. ;-) llvm-svn: 79813
* - s/DOUT/DEBUG(errs()/gBill Wendling2009-08-031-10/+11
| | | | | | - Tidy up some headers. llvm-svn: 77929
* X86 floating-point passes don't modify the CFG.Dan Gohman2009-08-011-0/+1
| | | | llvm-svn: 77757
* llvm_unreachable->llvm_unreachable(0), LLVM_UNREACHABLE->llvm_unreachable.Torok Edwin2009-07-141-2/+2
| | | | | | | | | This adds location info for all llvm_unreachable calls (which is a macro now) in !NDEBUG builds. In NDEBUG builds location info and the message is off (it only prints "UREACHABLE executed"). llvm-svn: 75640
* assert(0) -> LLVM_UNREACHABLE.Torok Edwin2009-07-111-2/+3
| | | | | | | | | Make llvm_unreachable take an optional string, thus moving the cerr<< out of line. LLVM_UNREACHABLE is now a simple wrapper that makes the message go away for NDEBUG builds. llvm-svn: 75379
* Fix PR4485.Rafael Espindola2009-06-301-3/+6
| | | | | | | Avoid unnecessary duplication of operand 0 of X86::FpSET_ST0_80. This duplication would cause one register to remain on the stack at the function return. llvm-svn: 74534
* Fix PR4484.Rafael Espindola2009-06-301-3/+5
| | | | | | This was caused by me confounding FP0 and ST(0). llvm-svn: 74523
* FIX PR 4459.Rafael Espindola2009-06-291-1/+1
| | | | | | | Not sure I understand how the temp register gets used, but this fixes a bug and introduces no regressions. llvm-svn: 74446
* Fix PR4185.Rafael Espindola2009-06-211-2/+7
| | | | | | Handle FpSET_ST0_80 being used when ST0 is still alive. llvm-svn: 73850
* Have only one definition of X86AddrNumOperands.Rafael Espindola2009-03-281-1/+0
| | | | llvm-svn: 67949
* Make code a bit less brittle by no hardcoding the numberRafael Espindola2009-03-281-1/+2
| | | | | | of operands in an address in so many places. llvm-svn: 67945
* Model inline asm constraint which ties an input to an output register as ↵Evan Cheng2009-03-231-2/+30
| | | | | | machine operand TIED_TO constraint. This eliminated the need to pre-allocate registers for these. This also allows register allocator can eliminate the unneeded copies. llvm-svn: 67512
* Remove non-DebugLoc versions of BuildMI from X86.Dale Johannesen2009-02-131-6/+15
| | | | | | There were some that might even matter in X86FastISel. llvm-svn: 64437
* Implement FpSET_ST1_*.Evan Cheng2009-02-091-1/+15
| | | | llvm-svn: 64186
* Switch the MachineOperand accessors back to the short names likeDan Gohman2008-10-031-4/+4
| | | | | | isReg, etc., from isRegister, etc. llvm-svn: 57006
* Instead of setPreservesAll, just mark them preseving machine loop info and ↵Evan Cheng2008-09-221-1/+2
| | | | | | machine dominators. llvm-svn: 56475
* Mark several codegen passes as preserving all analysis.Evan Cheng2008-09-221-0/+5
| | | | llvm-svn: 56469
* Remove isImm(), isReg(), and friends, in favor of Dan Gohman2008-09-131-2/+2
| | | | | | | | | isImmediate(), isRegister(), and friends, to avoid confusion about having two different names with the same meaning. I'm not attached to the longer names, and would be ok with changing to the shorter names if others prefer it. llvm-svn: 56189
* Tidy up several unbeseeming casts from pointer to intptr_t.Dan Gohman2008-09-041-1/+1
| | | | llvm-svn: 55779
* Remove more uses of std::set.Owen Anderson2008-08-141-3/+3
| | | | llvm-svn: 54787
* Eliminate a compilation warning.Evan Cheng2008-07-211-0/+4
| | | | llvm-svn: 53873
* Pool-allocation for MachineInstrs, MachineBasicBlocks, andDan Gohman2008-07-071-1/+1
| | | | | | | | | | | MachineMemOperands. The pools are owned by MachineFunctions. This drastically reduces the number of calls to malloc/free made during the "Emit" phase of scheduling, as well as later phases in CodeGen. Combined with other changes, this speeds up the "instruction selection" phase of CodeGen by 10% in some cases. llvm-svn: 53212
* Restore this assert now that the livevar bug is fixed.Chris Lattner2008-03-211-2/+7
| | | | | | This verifies kill info for "ret" fp operands is right. llvm-svn: 48656
* remove Evan's "ugly hack" that sorta attempted to get Chris Lattner2008-03-211-5/+0
| | | | | | | x86-64 return conventions correct, but was never enabled. We can now do the "right thing" with multiple return values. llvm-svn: 48635
* Add support for calls that return two FP values inChris Lattner2008-03-211-0/+36
| | | | | | ST(0)/ST(1). llvm-svn: 48634
* disable a bogus assertion.Chris Lattner2008-03-211-2/+2
| | | | llvm-svn: 48633
* Enable support for returning two long-double values in ST(0)/ST(1).Chris Lattner2008-03-211-4/+1
| | | | | | | | | | | | | | This allows us to compile fp-stack-2results.ll into: _test: fldz fld1 ret which returns 1 in ST(0) and 0 in ST(1). This is needed for x86-64 _Complex long double. llvm-svn: 48632
* Implement basic support for the 'f' register class constraint. This basicallyChris Lattner2008-03-111-2/+45
| | | | | | works, but probably won't if you mix it with 't' or 'u' yet. llvm-svn: 48243
* Fix the build on gcc 4.2.Nick Lewycky2008-03-111-1/+1
| | | | llvm-svn: 48212
* Change the model for FP Stack return to use fp operands on the Chris Lattner2008-03-111-18/+100
| | | | | | | RET instruction instead of using FpSET_ST0_32. This also generalizes the code to handling returning of multiple FP results. llvm-svn: 48209
* rename FP_SETRESULT -> FP_SET_ST0Chris Lattner2008-03-091-3/+3
| | | | llvm-svn: 48094
* rename FpGETRESULT32 -> FpGET_ST0_32 etc. Add support forChris Lattner2008-03-091-5/+5
| | | | | | | isel'ing value preserving FP roundings from one fp stack reg to another into a noop, instead of stack traffic. llvm-svn: 48093
* Refactor code. Remove duplicated functions that basically do the same thing asEvan Cheng2008-03-051-20/+8
| | | | | | findRegisterUseOperandIdx, findRegisterDefOperandIndx. Fix some naming inconsistencies. llvm-svn: 47927
* Work in progress. This patch *fixes* x86-64 calls which are modelled as ↵Evan Cheng2008-01-291-0/+5
| | | | | | | | StructRet but really should be return in registers, e.g. _Complex long double, some 128-bit aggregates. This is a short term solution that is necessary only because llvm, for now, cannot model i128 nor call's with multiple results. Status: This only works for direct calls, and only the caller side is done. Disabled for now. llvm-svn: 46527
OpenPOWER on IntegriCloud