Commit Graph

3422 Commits

Author SHA1 Message Date
Chris Lattner 423d7cbbf8 add a few missing cases
llvm-svn: 22891
2005-08-19 00:41:29 +00:00
Chris Lattner e2967ac53d Give ADJCALLSTACKDOWN/UP the correct operands.
Give a whole bunch of other stuff variable operands, particularly FP.  The
FP stackifier is playing fast and loose with operands here, so we have to
mark them all as variable.  This will have to be fixed before we can dag->dag
the X86 backend.  The solution is for the pre-stackifier and post-stackifier
instructions to all be disjoint.

llvm-svn: 22890
2005-08-19 00:38:22 +00:00
Nate Begeman 93c4bc6dca ISD::OR, and it's accompanying SelectBitfieldInsert
llvm-svn: 22889
2005-08-19 00:38:14 +00:00
Chris Lattner a9d68f140e The variable SAR's only take one operand too
llvm-svn: 22888
2005-08-19 00:31:37 +00:00
Chris Lattner 145695927a Stop adding bogus operands to variable shifts on X86. These instructions
only take one operand.  The other comes implicitly in through CL.

llvm-svn: 22887
2005-08-19 00:16:17 +00:00
Nate Begeman be1f314a47 Remove the X86 and PowerPC Simple instruction selectors; their time has
passed.

llvm-svn: 22886
2005-08-18 23:53:15 +00:00
Nate Begeman 33acb2c135 Add shifts.
llvm-svn: 22884
2005-08-18 23:38:00 +00:00
Chris Lattner 4bd805e785 Fix operand numbers by marking variable arity nodes as such and by fixing
the operand lists of a few other nodes.

llvm-svn: 22883
2005-08-18 23:25:33 +00:00
Chris Lattner 51e851d0e6 MFLR doesn't take an operand, the LR register is implicit
llvm-svn: 22882
2005-08-18 23:24:50 +00:00
Chris Lattner 5cfa377947 Add a new flag
llvm-svn: 22881
2005-08-18 23:17:07 +00:00
Chris Lattner 4e00ff6e70 Move this to the emitter
llvm-svn: 22877
2005-08-18 20:08:53 +00:00
Jim Laskey 18b9b8df86 More optimal solution for loading constants.
llvm-svn: 22870
2005-08-18 18:58:23 +00:00
Chris Lattner 015d73996d After selecting the instructions for a basic block, emit the instructions
llvm-svn: 22869
2005-08-18 18:46:06 +00:00
Chris Lattner 15b5c7ca84 remove some unused stuff
llvm-svn: 22866
2005-08-18 18:34:00 +00:00
Nate Begeman d16a26a8d4 Fix int foo() { return 65535; } by using the top 16 bits of the constant
as the argument to LIS rather than the result of HA16(constant).

The DAG->DAG ISel was already doing the right thing.

llvm-svn: 22865
2005-08-18 18:14:49 +00:00
Nate Begeman d32638706a Improve ISD::Constant codegen.
Now for int foo() { return -1; } we generate:
_foo:
        li r3, -1
        blr

instead of
_foo:
        lis r2, -1
        ori r3, r2, 65535
        blr

llvm-svn: 22864
2005-08-18 18:01:39 +00:00
Chris Lattner 37faf35b35 replace switch stmt with an assert, generate li 0 instead of lis 0 for 0,
to make the code follow people's expectations better.

llvm-svn: 22861
2005-08-18 17:16:52 +00:00
Jim Laskey 32d4c85278 Handle loading of 0x????0000 constants with a single instruction.
llvm-svn: 22858
2005-08-18 15:52:30 +00:00
Nate Begeman b3821a3943 Add support for ISD::AND, and its various optimized forms.
llvm-svn: 22857
2005-08-18 07:30:46 +00:00
Nate Begeman cfb9a74c2e Maintain consistency in negating things
llvm-svn: 22855
2005-08-18 05:44:50 +00:00
Nate Begeman 72d6f8800d Implement XOR, remove a broken sign_extend_inreg case
llvm-svn: 22854
2005-08-18 05:00:13 +00:00
Nate Begeman 4bfb4a215d Add a bunch more simple nodes.
llvm-svn: 22851
2005-08-18 03:04:18 +00:00
Nate Begeman 457367f14c Add a couple more nodes that are easy to handle
llvm-svn: 22850
2005-08-18 00:53:47 +00:00
Nate Begeman 74d5529b88 Be fruitful and multiply!
llvm-svn: 22849
2005-08-18 00:21:41 +00:00
Jim Laskey 04160c6d8d Better version of isIntImmediate.
llvm-svn: 22848
2005-08-18 00:15:15 +00:00
Nate Begeman 3fcf47d8f0 Teach the DAG->DAG ISel about FNEG, and how it can be used to invert
several of the PowerPC opcodes that come in both negated and non-negated
forms.

llvm-svn: 22845
2005-08-17 23:46:35 +00:00
Jim Laskey 17e7599ecb Promote dependency for MathExtras.h out of Constants.h.
llvm-svn: 22839
2005-08-17 20:04:34 +00:00
Jim Laskey b74c666186 Culling out use of unions for converting FP to bits and vice versa.
llvm-svn: 22838
2005-08-17 19:34:49 +00:00
Chris Lattner c6aa80668e add a beta option for turning on dag->dag isel
llvm-svn: 22837
2005-08-17 19:33:30 +00:00
Chris Lattner 43ff01e2e6 initial hack at a dag->dag instruction selector. This is obviously woefully
incomplete, but it is a start.  It handles basic argument/retval stuff, immediates,
add and sub.

llvm-svn: 22836
2005-08-17 19:33:03 +00:00
Chris Lattner f61cce952b add prototype, remove dead proto
llvm-svn: 22835
2005-08-17 19:32:03 +00:00
Chris Lattner 33900811ee Fix some bugs in the alpha backend, some of which I introduced yesterday,
and some that were preexisting.  All alpha regtests pass now.

llvm-svn: 22829
2005-08-17 17:08:24 +00:00
Chris Lattner 63f774ec6e Fix a few small typos I noticed when converting this over to the DAG->DAG
selector.  Also, there is no difference between addSImm and addImm, so just
use addImm, folding some branches.

llvm-svn: 22819
2005-08-17 01:25:14 +00:00
Jim Laskey 9828f26cf1 Removed UINT_TO_FP and SINT_TO_FP from ISel outright.
llvm-svn: 22818
2005-08-17 01:14:38 +00:00
Andrew Lenharth 73370ba5fd thinko. Should fix s4addl.ll regression
llvm-svn: 22817
2005-08-17 00:47:24 +00:00
Jim Laskey 5909c8b10a Remove ISel code generation for UINT_TO_FP and SINT_TO_FP. Now asserts if
marked as legal.

llvm-svn: 22816
2005-08-17 00:41:40 +00:00
Jim Laskey 6267b2c97c Make UINT_TO_FP and SINT_TO_FP use generic expansion.
llvm-svn: 22815
2005-08-17 00:40:22 +00:00
Nate Begeman 784c8068a7 Implement a couple improvements:
Remove dead code in ISD::Constant handling
Add support for add long, imm16

We now codegen 'long long foo(long long a) { return ++a; }'
as:
addic r4, r4, 1
addze r3, r3
blr

instead of:
li r2, 1
li r5, 0
addc r2, r4, r2
adde r3, r3, r5
blr

llvm-svn: 22811
2005-08-17 00:20:08 +00:00
Chris Lattner 79f5ebc7b9 updates for changes in nodes
llvm-svn: 22808
2005-08-16 21:58:15 +00:00
Chris Lattner 7c76278242 update the backends to work with the new CopyFromReg/CopyToReg/ImplicitDef nodes
llvm-svn: 22807
2005-08-16 21:56:37 +00:00
Nate Begeman 371e49515d Implement BR_CC and BRTWOWAY_CC. This allows the removal of a rather nasty
fixme from the PowerPC backend.  Emit slightly better code for legalizing
select_cc.

llvm-svn: 22805
2005-08-16 19:49:35 +00:00
Chris Lattner f22556d3ad Pull the LLVM -> DAG lowering code out of the pattern selector so that it
can be shared with the DAG->DAG selector.

llvm-svn: 22799
2005-08-16 17:14:42 +00:00
Chris Lattner 73785d2ef2 Turn loop strength reduction on by default.
Only run createLowerConstantExpressionsPass for the simple isel.  The DAG
isel has no need for it.

llvm-svn: 22794
2005-08-15 23:47:04 +00:00
Jim Laskey 24b84072ea Broke 80 column rule.
llvm-svn: 22792
2005-08-15 17:35:26 +00:00
Jim Laskey 42623a9539 Changed code gen for int to f32 to use rounding. This makes FP results
consistent with gcc.

llvm-svn: 22791
2005-08-15 17:14:19 +00:00
Andrew Lenharth b65b1568ae isIntImmediate is a good Idea. Add a flavor that checks bounds while it is at it
llvm-svn: 22790
2005-08-15 14:31:37 +00:00
Nate Begeman d5e739dcc2 Fix last night's PPC32 regressions by
1. Not selecting the false value of a select_cc in the false arm, which
   isn't legal for nested selects.
2. Actually returning the node we created and Legalized in the FP_TO_UINT
   Expander.

llvm-svn: 22789
2005-08-14 18:38:32 +00:00
Nate Begeman e5394d453d Fix last night's X86 regressions by putting code for SSE in the if(SSE)
block.  nur.

llvm-svn: 22788
2005-08-14 18:37:02 +00:00
Nate Begeman 4d959f6627 Fix FP_TO_UINT with Scalar SSE2 now that the legalizer can handle it. We
now generate the relatively good code sequences:
unsigned short foo(float a) { return a; }
_foo:
        movss 4(%esp), %xmm0
        cvttss2si %xmm0, %eax
        movzwl %ax, %eax
        ret

and
unsigned bar(float a) { return a; }
_bar:
        movss .CPI_bar_0, %xmm0
        movss 4(%esp), %xmm1
        movapd %xmm1, %xmm2
        subss %xmm0, %xmm2
        cvttss2si %xmm2, %eax
        xorl $-2147483648, %eax
        cvttss2si %xmm1, %ecx
        ucomiss %xmm0, %xmm1
        cmovb %ecx, %eax
        ret

llvm-svn: 22786
2005-08-14 04:36:51 +00:00
Nate Begeman 83f6b98c42 Make FP_TO_UINT Illegal. This allows us to generate significantly better
codegen for FP_TO_UINT by using the legalizer's SELECT variant.

Implement a codegen improvement for SELECT_CC, selecting the false node in
the MBB that feeds the phi node.  This allows us to codegen:
void foo(int *a, int b, int c) { int d = (a < b) ? 5 : 9; *a = d; }
as:
_foo:
        li r2, 5
        cmpw cr0, r4, r3
        bgt .LBB_foo_2  ; entry
.LBB_foo_1:     ; entry
        li r2, 9
.LBB_foo_2:     ; entry
        stw r2, 0(r3)
        blr

insted of:
_foo:
        li r2, 5
        li r5, 9
        cmpw cr0, r4, r3
        bgt .LBB_foo_2  ; entry
.LBB_foo_1:     ; entry
        or r2, r5, r5
.LBB_foo_2:     ; entry
        stw r2, 0(r3)
        blr

llvm-svn: 22784
2005-08-14 01:17:16 +00:00