Skip to content
  • Chris Lattner's avatar
    Implement an important entry from README_ALTIVEC: · 9754d142
    Chris Lattner authored
    If an altivec predicate compare is used immediately by a branch, don't
    use a (serializing) MFCR instruction to read the CR6 register, which requires
    a compare to get it back to CR's.  Instead, just branch on CR6 directly. :)
    
    For example, for:
    void foo2(vector float *A, vector float *B) {
      if (!vec_any_eq(*A, *B))
        *B = (vector float){0,0,0,0};
    }
    
    We now generate:
    
    _foo2:
            mfspr r2, 256
            oris r5, r2, 12288
            mtspr 256, r5
            lvx v2, 0, r4
            lvx v3, 0, r3
            vcmpeqfp. v2, v3, v2
            bne cr6, LBB1_2 ; UnifiedReturnBlock
    LBB1_1: ; cond_true
            vxor v2, v2, v2
            stvx v2, 0, r4
            mtspr 256, r2
            blr
    LBB1_2: ; UnifiedReturnBlock
            mtspr 256, r2
            blr
    
    instead of:
    
    _foo2:
            mfspr r2, 256
            oris r5, r2, 12288
            mtspr 256, r5
            lvx v2, 0, r4
            lvx v3, 0, r3
            vcmpeqfp. v2, v3, v2
            mfcr r3, 2
            rlwinm r3, r3, 27, 31, 31
            cmpwi cr0, r3, 0
            beq cr0, LBB1_2 ; UnifiedReturnBlock
    LBB1_1: ; cond_true
            vxor v2, v2, v2
            stvx v2, 0, r4
            mtspr 256, r2
            blr
    LBB1_2: ; UnifiedReturnBlock
            mtspr 256, r2
            blr
    
    This implements CodeGen/PowerPC/vec_br_cmp.ll.
    
    llvm-svn: 27804
    9754d142
Loading