summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Target/X86
Commit message (Collapse)AuthorAgeFilesLines
* Make sure to emit the immediate byte for instructions like:Chris Lattner2004-07-171-0/+2
| | | | | | | | shrd [mem], reg, imm This fixes the jit-ls failure on 186.crafty. llvm-svn: 14914
* Reserve the correct amt of space.Chris Lattner2004-07-171-2/+2
| | | | llvm-svn: 14913
* Patches towards fixing PR341Chris Lattner2004-07-152-4/+4
| | | | llvm-svn: 14841
* Improve codegen for the LLVM offsetof/sizeof "operator". Before we compiledChris Lattner2004-07-151-0/+15
| | | | | | | | | | | | | | | | | | | | | | | | | | | | this LLVM function: int %foo() { ret int cast (int** getelementptr (int** null, int 1) to int) } into: foo: mov %EAX, 0 lea %EAX, DWORD PTR [%EAX + 4] ret now we compile it into: foo: mov %EAX, 4 ret This sequence is frequently generated by the MSIL front-end, and soon the malloc lowering pass and Java front-ends as well.. -Chris llvm-svn: 14834
* Delete the allocate*TargetMachine function, which is now dead .Chris Lattner2004-07-112-10/+2
| | | | | | The shared command line options are now in a header that makes sense. llvm-svn: 14756
* Make these format a bit nicerChris Lattner2004-07-111-1/+1
| | | | llvm-svn: 14747
* Auto-registrate targetChris Lattner2004-07-112-0/+25
| | | | llvm-svn: 14745
* Add #include <iostream> since Value.h does not #include it any more.Reid Spencer2004-07-042-1/+3
| | | | llvm-svn: 14622
* Remove dead blocksChris Lattner2004-07-021-0/+6
| | | | llvm-svn: 14564
* Fix associativity of parameters to assert(): now it actually makes sense.Misha Brukman2004-06-291-2/+3
| | | | llvm-svn: 14483
* Convert tabs to spaces.Misha Brukman2004-06-291-18/+17
| | | | llvm-svn: 14482
* I believe that the code generator now properly handles dead basic blocks. ↵Chris Lattner2004-06-291-8/+0
| | | | | | | | If not, this is a bug, and should be fixed. llvm-svn: 14476
* Fix a regression from r1.224. In particular, codegen a cast from double ->Chris Lattner2004-06-291-4/+11
| | | | | | | float as a truncation by going through memory. This truncation was being skipped, which caused 175.vpr to fail after aggressive register promotion. llvm-svn: 14473
* Made a fix so that you can print out MachineInstrs that belong to a ↵Tanya Lattner2004-06-252-3/+3
| | | | | | MachineBasicBlock that is not yet attached to a MachineFunction. This change includes changing the third operand (TargetMachine) to a pointer for the MachineInstr::print function. llvm-svn: 14389
* Spell out `NoFramePointerElim' for readability.Misha Brukman2004-06-211-1/+1
| | | | llvm-svn: 14299
* Use the common `NoFPElim' setting instead of our own.Misha Brukman2004-06-211-4/+2
| | | | llvm-svn: 14298
* Move the IntrinsicLowering header into the CodeGen directory, as per PR346Chris Lattner2004-06-203-5/+6
| | | | llvm-svn: 14266
* Codegen sub C, X a little bit better for register pressure. Instead ofChris Lattner2004-06-181-12/+27
| | | | | | | | | | | | | | mov REG, C sub REG, X generate: neg X add X, C which uses one less reg llvm-svn: 14213
* Fold setcc instructions into select and branches that are not in the same BB asChris Lattner2004-06-181-4/+2
| | | | | | the setcc. llvm-svn: 14212
* Do not fold loads into instructions if it is used more than once. In particularChris Lattner2004-06-171-1/+2
| | | | | | | | | | we do not want to fold the load in cases like this: X = load = add A, X = add B, X llvm-svn: 14204
* Rename Type::PrimitiveID to TypeId and ::getPrimitiveID() to ::getTypeID()Chris Lattner2004-06-174-11/+11
| | | | llvm-svn: 14201
* Remove support for llvm.isnan. Alkis wins :)Chris Lattner2004-06-151-50/+0
| | | | llvm-svn: 14189
* Add basic support for the isunordered intrinsic. The isnan stuff still ↵Chris Lattner2004-06-151-0/+9
| | | | | | needs to go llvm-svn: 14185
* By far, one of the most common uses of isnan is to make 'isunordered'Chris Lattner2004-06-111-14/+59
| | | | | | | | | | | | | | | | | | | | | | | | | | | | comparisons. In an 'isunordered' predicate, which looks like this at the LLVM level: %a = call bool %llvm.isnan(double %X) %b = call bool %llvm.isnan(double %Y) %COM = or bool %a, %b We used to generate this code: fxch %ST(1) fucomip %ST(0), %ST(0) setp %AL fucomip %ST(0), %ST(0) setp %AH or %AL, %AH With this patch, we generate this code: fucomip %ST(0), %ST(1) fstp %ST(0) setp %AL Which should make alkis happy. Tested as X86/compare_folding.llx:test1 llvm-svn: 14148
* Fix bug in previous checkinChris Lattner2004-06-111-0/+3
| | | | llvm-svn: 14146
* No really, these are dead nowChris Lattner2004-06-111-2/+0
| | | | llvm-svn: 14145
* Now that compare instructions aren't lumped in with the other twoargfp ↵Chris Lattner2004-06-114-15/+9
| | | | | | | | | instructions, we can get rid of the FpUCOM/FpUCOMi pseudo instructions, which makes stuff simpler and faster. llvm-svn: 14144
* Introduce a new FP instruction type to separate the compare cases from theChris Lattner2004-06-113-12/+13
| | | | | | twoarg cases. llvm-svn: 14143
* Add direct support for the isnan intrinsic, implementing ↵Chris Lattner2004-06-111-9/+22
| | | | | | | | test/Regression/CodeGen/X86/isnan.llx testcase llvm-svn: 14141
* Add support for the setp instructionsChris Lattner2004-06-112-0/+3
| | | | llvm-svn: 14140
* Split compare instruction handling OUT of handleTwoArgFP into handleCompareFP.Chris Lattner2004-06-111-43/+49
| | | | | | | | | | | | This makes the code much simpler, and the two cases really do belong apart. Once we do it, it's pretty obvious how flawed the logic was for A != A case, so I fixed it (fixing PR369). This also uses freeStackSlotAfter instead of inserting an fxchg then popStackAfter'ing in the case where there is a dead result (unlikely, but possible), producing better code. llvm-svn: 14139
* Fix the fixed stack offset, patch contributed by Vladimir PrusChris Lattner2004-06-101-1/+1
| | | | llvm-svn: 14110
* Fix for PR#366. We use getClassB() so that we can handle cast instructionsJohn Criswell2004-06-091-1/+1
| | | | | | that cast to bool. llvm-svn: 14096
* This file is obsoleteChris Lattner2004-06-041-194/+0
| | | | llvm-svn: 14005
* Convert to the new TargetMachine interface.Chris Lattner2004-06-028-15/+11
| | | | llvm-svn: 13952
* Add support for accurate garbage collection to the LLVM code generatorsChris Lattner2004-05-231-0/+5
| | | | llvm-svn: 13696
* Add some notes to myself, no functional changesChris Lattner2004-05-231-7/+19
| | | | llvm-svn: 13695
* minor wording changeChris Lattner2004-05-231-1/+1
| | | | llvm-svn: 13694
* Don't keep track of references to LLVM BasicBlocks while emitting; useBrian Gaeke2004-05-141-11/+9
| | | | | | MachineBasicBlocks instead. llvm-svn: 13568
* Support MachineBasicBlock operands on RawFrm instructions.Brian Gaeke2004-05-141-27/+12
| | | | | | | Get rid of separate numbering for LLVM BasicBlocks; use the automatically generated MachineBasicBlock numbering. llvm-svn: 13567
* Generate branch machine instructions with MachineBasicBlock operands instead ofBrian Gaeke2004-05-141-7/+9
| | | | | | LLVM BasicBlock operands. llvm-svn: 13566
* Two more improvements for null pointer handling: storing a null pointerChris Lattner2004-05-131-3/+12
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | and passing a null pointer into a function. For this testcase: void %test(int** %X) { store int* null, int** %X call void %test(int** null) ret void } we now generate this: test: sub %ESP, 12 mov %EAX, DWORD PTR [%ESP + 16] mov DWORD PTR [%EAX], 0 mov DWORD PTR [%ESP], 0 call test add %ESP, 12 ret instead of this: test: sub %ESP, 12 mov %EAX, DWORD PTR [%ESP + 16] mov %ECX, 0 mov DWORD PTR [%EAX], %ECX mov %EAX, 0 mov DWORD PTR [%ESP], %EAX call test add %ESP, 12 ret llvm-svn: 13558
* Second half of my fixed-sized-alloca patch. This folds the LEA to computeChris Lattner2004-05-131-93/+179
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | the alloca address into common operations like loads/stores. In a simple testcase like this (which is just designed to excersize the alloca A, nothing more): int %test(int %X, bool %C) { %A = alloca int store int %X, int* %A store int* %A, int** %G br bool %C, label %T, label %F T: call int %test(int 1, bool false) %V = load int* %A ret int %V F: call int %test(int 123, bool true) %V2 = load int* %A ret int %V2 } We now generate: test: sub %ESP, 12 mov %EAX, DWORD PTR [%ESP + 16] mov %CL, BYTE PTR [%ESP + 20] *** mov DWORD PTR [%ESP + 8], %EAX mov %EAX, OFFSET G lea %EDX, DWORD PTR [%ESP + 8] mov DWORD PTR [%EAX], %EDX test %CL, %CL je .LBB2 # PC rel: F .LBB1: # T mov DWORD PTR [%ESP], 1 mov DWORD PTR [%ESP + 4], 0 call test *** mov %EAX, DWORD PTR [%ESP + 8] add %ESP, 12 ret .LBB2: # F mov DWORD PTR [%ESP], 123 mov DWORD PTR [%ESP + 4], 1 call test *** mov %EAX, DWORD PTR [%ESP + 8] add %ESP, 12 ret Instead of: test: sub %ESP, 20 mov %EAX, DWORD PTR [%ESP + 24] mov %CL, BYTE PTR [%ESP + 28] *** lea %EDX, DWORD PTR [%ESP + 16] *** mov DWORD PTR [%EDX], %EAX mov %EAX, OFFSET G mov DWORD PTR [%EAX], %EDX test %CL, %CL *** mov DWORD PTR [%ESP + 12], %EDX je .LBB2 # PC rel: F .LBB1: # T mov DWORD PTR [%ESP], 1 mov %EAX, 0 mov DWORD PTR [%ESP + 4], %EAX call test *** mov %EAX, DWORD PTR [%ESP + 12] *** mov %EAX, DWORD PTR [%EAX] add %ESP, 20 ret .LBB2: # F mov DWORD PTR [%ESP], 123 mov %EAX, 1 mov DWORD PTR [%ESP + 4], %EAX call test *** mov %EAX, DWORD PTR [%ESP + 12] *** mov %EAX, DWORD PTR [%EAX] add %ESP, 20 ret llvm-svn: 13557
* Substantially improve code generation for address exposed locals (aka fixedChris Lattner2004-05-131-64/+101
| | | | | | | | | | | | | | | | | | | | | | | | | | | sized allocas in the entry block). Instead of generating code like this: entry: reg1024 = ESP+1234 ... (much later) *reg1024 = 17 Generate code that looks like this: entry: (no code generated) ... (much later) t = ESP+1234 *t = 17 The advantage being that we DRAMATICALLY reduce the register pressure for these silly temporaries (they were all being spilled to the stack, resulting in very silly code). This is actually a manual implementation of rematerialization :) I have a patch to fold the alloca address computation into loads & stores, which will make this much better still, but just getting this right took way too much time and I'm sleepy. llvm-svn: 13554
* Pass boolean constants into function calls more efficiently, generating:Chris Lattner2004-05-121-1/+7
| | | | | | | | | | | mov DWORD PTR [%ESP + 4], 1 instead of: mov %EAX, 1 mov DWORD PTR [%ESP + 4], %EAX llvm-svn: 13494
* Fix a fairly serious pessimizaion that was preventing us from efficientlyChris Lattner2004-05-101-2/+3
| | | | | | | compiling things like 'add long %X, 1'. The problem is that we were switching the order of the operands for longs even though we can't fold them yet. llvm-svn: 13451
* Fix some comments, avoid sign extending booleans when zero extend works fineChris Lattner2004-05-091-5/+5
| | | | llvm-svn: 13440
* Generate more efficient code for casting booleans to integers (no sign ↵Chris Lattner2004-05-091-1/+1
| | | | | | extension required) llvm-svn: 13439
* Codegen floating point stores of constants into integer instructions. ThisChris Lattner2004-05-071-15/+37
| | | | | | | | | | | | | | | | | | | allows us to compile: store float 10.0, float* %P into: mov DWORD PTR [%EAX], 1092616192 instead of: .CPItest_0: # float 0x4024000000000000 .long 1092616192 # float 10 ... fld DWORD PTR [.CPItest_0] fstp DWORD PTR [%EAX] llvm-svn: 13409
* Make comparisons against the null pointer as efficient as integer comparisonsChris Lattner2004-05-071-1/+8
| | | | | | | | | | | | | against zero. In particular, don't emit: mov %ESI, 0 cmp %ECX, %ESI instead, emit: test %ECX, %ECX llvm-svn: 13407
OpenPOWER on IntegriCloud