1 //===---------------------------------------------------------------------===//
2 // Random ideas for the X86 backend.
3 //===---------------------------------------------------------------------===//
5 Add a MUL2U and MUL2S nodes to represent a multiply that returns both the
6 Hi and Lo parts (combination of MUL and MULH[SU] into one node). Add this to
7 X86, & make the dag combiner produce it when needed. This will eliminate one
8 imul from the code generated for:
10 long long test(long long X, long long Y) { return X*Y; }
12 by using the EAX result from the mul. We should add a similar node for
17 long long test(int X, int Y) { return (long long)X*Y; }
19 ... which should only be one imul instruction.
21 //===---------------------------------------------------------------------===//
23 This should be one DIV/IDIV instruction, not a libcall:
25 unsigned test(unsigned long long X, unsigned Y) {
29 This can be done trivially with a custom legalizer. What about overflow
30 though? http://gcc.gnu.org/bugzilla/show_bug.cgi?id=14224
32 //===---------------------------------------------------------------------===//
34 Need to add support for rotate instructions.
36 //===---------------------------------------------------------------------===//
38 Some targets (e.g. athlons) prefer freep to fstp ST(0):
39 http://gcc.gnu.org/ml/gcc-patches/2004-04/msg00659.html
41 //===---------------------------------------------------------------------===//
43 This should use faddi on chips where it is profitable:
44 double foo(double P, int *I) { return P+*I; }
46 //===---------------------------------------------------------------------===//
48 The FP stackifier needs to be global. Also, it should handle simple permutates
49 to reduce number of shuffle instructions, e.g. turning:
61 //===---------------------------------------------------------------------===//
63 Improvements to the multiply -> shift/add algorithm:
64 http://gcc.gnu.org/ml/gcc-patches/2004-08/msg01590.html
66 //===---------------------------------------------------------------------===//
68 Improve code like this (occurs fairly frequently, e.g. in LLVM):
69 long long foo(int x) { return 1LL << x; }
71 http://gcc.gnu.org/ml/gcc-patches/2004-09/msg01109.html
72 http://gcc.gnu.org/ml/gcc-patches/2004-09/msg01128.html
73 http://gcc.gnu.org/ml/gcc-patches/2004-09/msg01136.html
75 Another useful one would be ~0ULL >> X and ~0ULL << X.
77 //===---------------------------------------------------------------------===//
79 Should support emission of the bswap instruction, probably by adding a new
80 DAG node for byte swapping. Also useful on PPC which has byte-swapping loads.
82 //===---------------------------------------------------------------------===//
85 _Bool f(_Bool a) { return a!=1; }
92 //===---------------------------------------------------------------------===//
96 1. Dynamic programming based approach when compile time if not an
98 2. Code duplication (addressing mode) during isel.
99 3. Other ideas from "Register-Sensitive Selection, Duplication, and
100 Sequencing of Instructions".
102 //===---------------------------------------------------------------------===//
104 Should we promote i16 to i32 to avoid partial register update stalls?