https://gcc.gnu.org/bugzilla/show_bug.cgi?id=106770
--- Comment #2 from Jens Seifert <jens.seifert at de dot ibm.com> --- vec_extract(vr, 1) should extract the left element. But xxpermdi x,x,x,3 extracts the right element. Looks like a bug in vec_extract for PPCLE and not a problem regarding unnecessary xxpermdi. Using assembly for the subtract: int cmp3(double a, double b) { vector double va = vec_promote(a, 0); vector double vb = vec_promote(b, 0); vector long long vlt = (vector long long)vec_cmplt(va, vb); vector long long vgt = (vector long long)vec_cmplt(vb, va); vector signed long long vr; __asm__ volatile("vsubudm %0,%1,%2":"=v"(vr):"v"(vlt),"v"(vgt):); //vector signed long long vr = vec_sub(vlt, vgt); return vec_extract(vr, 1); } generates: _Z4cmp3dd: .LFB2: .cfi_startproc xxpermdi 1,1,1,0 xxpermdi 2,2,2,0 xvcmpgtdp 32,2,1 xvcmpgtdp 33,1,2 #APP # 34 "cmpdouble.C" 1 vsubudm 0,0,1 # 0 "" 2 #NO_APP mfvsrd 3,32 extsw 3,3 " Looks like the compile knows about the vec_promote doing splat and at the end extracts the non-preferred right element instead of the expected left element.