> This is an implementation of the changes I spoke about the other > week. These changes segregate the vector vs. non-vector mode > handling in the sparc backend.
I think that the original motivation for the previous design was the 32-bit vector ABI, where the arguments are passed in integer registers. So for: typedef char vec8 __attribute__((vector_size(8))); extern vec8 foo (vec8); vec8 bar(vec8 a, vec8 b) { return foo(a & b); } the generated code at -O2 is optimal: fun8_2: and %o2, %o0, %o0 sethi %hi(foo), %g1 jmp %g1 + %lo(foo) and %o3, %o1, %o1 My understand is that, with the changes, you will spill and reload twice. Of course things are totally different with the 64-bit ABI. A compromise could be to segregate the patterns, but still have alternatives for the other registers, i.e. andsi3 would still have the 'd' alternative at the end and the andv1si3 would have a 'r' alternative at the end, them being disparaged properly. > In fact, gcc.target/sparc/combined-1.c passes always even without > adjusting the optimization level to placate the register allocator > and many tests now generate more VIS instructions than before, > particularly on 32-bit. Feel free to revert the adjustment I made as part of the patch. -- Eric Botcazou