Implement v16i8 multiply with this code:
[oota-llvm.git] / lib / Target / PowerPC / README_ALTIVEC.txt
1 //===- README_ALTIVEC.txt - Notes for improving Altivec code gen ----------===//
2
3 Implement PPCInstrInfo::isLoadFromStackSlot/isStoreToStackSlot for vector
4 registers, to generate better spill code.
5
6 //===----------------------------------------------------------------------===//
7
8 The first should be a single lvx from the constant pool, the second should be 
9 a xor/stvx:
10
11 void foo(void) {
12   int x[8] __attribute__((aligned(128))) = { 1, 1, 1, 17, 1, 1, 1, 1 };
13   bar (x);
14 }
15
16 #include <string.h>
17 void foo(void) {
18   int x[8] __attribute__((aligned(128)));
19   memset (x, 0, sizeof (x));
20   bar (x);
21 }
22
23 //===----------------------------------------------------------------------===//
24
25 Altivec: Codegen'ing MUL with vector FMADD should add -0.0, not 0.0:
26 http://gcc.gnu.org/bugzilla/show_bug.cgi?id=8763
27
28 When -ffast-math is on, we can use 0.0.
29
30 //===----------------------------------------------------------------------===//
31
32   Consider this:
33   v4f32 Vector;
34   v4f32 Vector2 = { Vector.X, Vector.X, Vector.X, Vector.X };
35
36 Since we know that "Vector" is 16-byte aligned and we know the element offset 
37 of ".X", we should change the load into a lve*x instruction, instead of doing
38 a load/store/lve*x sequence.
39
40 //===----------------------------------------------------------------------===//
41
42 FABS/FNEG can be codegen'd with the appropriate and/xor of -0.0.
43
44 //===----------------------------------------------------------------------===//
45
46 For functions that use altivec AND have calls, we are VRSAVE'ing all call
47 clobbered regs.
48
49 //===----------------------------------------------------------------------===//
50
51 Implement passing vectors by value.
52
53 //===----------------------------------------------------------------------===//
54
55 GCC apparently tries to codegen { C1, C2, Variable, C3 } as a constant pool load
56 of C1/C2/C3, then a load and vperm of Variable.
57
58 //===----------------------------------------------------------------------===//
59
60 We currently codegen SCALAR_TO_VECTOR as a store of the scalar to a 16-byte
61 aligned stack slot, followed by a load/vperm.  We should probably just store it
62 to a scalar stack slot, then use lvsl/vperm to load it.  If the value is already
63 in memory, this is a huge win.
64
65 //===----------------------------------------------------------------------===//
66
67 Do not generate the MFCR/RLWINM sequence for predicate compares when the
68 predicate compare is used immediately by a branch.  Just branch on the right
69 cond code on CR6.
70
71 //===----------------------------------------------------------------------===//
72
73 We need a way to teach tblgen that some operands of an intrinsic are required to
74 be constants.  The verifier should enforce this constraint.
75
76 //===----------------------------------------------------------------------===//
77
78 extract_vector_elt of an arbitrary constant vector can be done with the 
79 following instructions:
80
81 vTemp = vec_splat(v0,2);    // 2 is the element the src is in.
82 vec_ste(&destloc,0,vTemp);
83
84 We can do an arbitrary non-constant value by using lvsr/perm/ste.
85
86 //===----------------------------------------------------------------------===//
87
88 If we want to tie instruction selection into the scheduler, we can do some
89 constant formation with different instructions.  For example, we can generate
90 "vsplti -1" with "vcmpequw R,R" and 1,1,1,1 with "vsubcuw R,R", both of which
91 use different execution units, thus could help scheduling.
92
93 This is probably only reasonable for a post-pass scheduler.
94
95 //===----------------------------------------------------------------------===//
96