|  | Missing support | 
|  | =============== | 
|  |  | 
|  | * The PNaCl LLVM backend expands shufflevector operations into sequences of | 
|  | insertelement and extractelement operations. For instance: | 
|  |  | 
|  | define <4 x i32> @shuffle(<4 x i32> %arg1, <4 x i32> %arg2) { | 
|  | entry: | 
|  | %res = shufflevector <4 x i32> %arg1, | 
|  | <4 x i32> %arg2, | 
|  | <4 x i32> <i32 4, i32 5, i32 0, i32 1> | 
|  | ret <4 x i32> %res | 
|  | } | 
|  |  | 
|  | gets expanded into: | 
|  |  | 
|  | define <4 x i32> @shuffle(<4 x i32> %arg1, <4 x i32> %arg2) { | 
|  | entry: | 
|  | %0 = extractelement <4 x i32> %arg2, i32 0 | 
|  | %1 = insertelement <4 x i32> undef, i32 %0, i32 0 | 
|  | %2 = extractelement <4 x i32> %arg2, i32 1 | 
|  | %3 = insertelement <4 x i32> %1, i32 %2, i32 1 | 
|  | %4 = extractelement <4 x i32> %arg1, i32 0 | 
|  | %5 = insertelement <4 x i32> %3, i32 %4, i32 2 | 
|  | %6 = extractelement <4 x i32> %arg1, i32 1 | 
|  | %7 = insertelement <4 x i32> %5, i32 %6, i32 3 | 
|  | ret <4 x i32> %7 | 
|  | } | 
|  |  | 
|  | Subzero should recognize these sequences and recombine them into | 
|  | shuffle operations where appropriate. | 
|  |  | 
|  | * Add support for vector constants in the backend. The current code | 
|  | materializes the vector constants it needs (eg. for performing icmp on | 
|  | unsigned operands) using register operations, but this should be changed to | 
|  | loading them from a constant pool if the register initialization is too | 
|  | complicated (such as in TargetX8632::makeVectorOfHighOrderBits()). | 
|  |  | 
|  | * [x86 specific] llvm-mc does not allow lea to take a mem128 memory operand | 
|  | when assembling x86-32 code. The current InstX8632Lea::emit() code uses | 
|  | Variable::asType() to convert any mem128 Variables into a compatible memory | 
|  | operand type. However, the emit code does not do any conversions of | 
|  | OperandX8632Mem, so if an OperandX8632Mem is passed to lea as mem128 the | 
|  | resulting code will not assemble.  One way to fix this is by implementing | 
|  | OperandX8632Mem::asType(). | 
|  |  | 
|  | * [x86 specific] Lower shl with <4 x i32> using some clever float conversion: | 
|  | http://lists.cs.uiuc.edu/pipermail/llvm-commits/Week-of-Mon-20100726/105087.html | 
|  |  | 
|  | * [x86 specific] Add support for using aligned mov operations (movaps). This | 
|  | will require passing alignment information to loads and stores. | 
|  |  | 
|  | x86 SIMD Diversification | 
|  | ======================== | 
|  |  | 
|  | * Vector "bitwise" operations have several variant instructions: the AND | 
|  | operation can be implemented with pand, andpd, or andps. This pattern also | 
|  | holds for ANDN, OR, and XOR. | 
|  |  | 
|  | * Vector "mov" instructions can be diversified (eg. movdqu instead of movups) | 
|  | at the cost of a possible performance penalty. | 
|  |  | 
|  | * Scalar FP arithmetic can be diversified by performing the operations with the | 
|  | vector version of the instructions. |