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.

Reply via email to