https://gcc.gnu.org/bugzilla/show_bug.cgi?id=120034

            Bug ID: 120034
           Summary: Fails to recognize bzhi consistently
           Product: gcc
           Version: 15.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: target
          Assignee: unassigned at gcc dot gnu.org
          Reporter: rguenth at gcc dot gnu.org
  Target Milestone: ---

The following testcases manage to emit bzhi only for the first case, not the
others:

#define uint64_t unsigned long 
#define uint32_t unsigned int 
uint64_t bzhi_emulation(uint64_t value, uint32_t index) {  
    if (index >= 64) {  
        return value; // No change if index is out of range  
    }  
    uint64_t mask = (1ULL << index) - 1;  
    return value & mask;  
}  


uint32_t bzhi_emulation1(uint32_t value, uint32_t index) {  
    return value & ((1ULL << index) - 1);    
}
void foo(uint32_t value1, uint32_t value2);
void  bzhi_emulation2(uint32_t value1, uint32_t index, const unsigned char*
const a, const unsigned char* const b) {  
    uint32_t value;
    const uint32_t btMask = (1 << index) - 1;    
    const uint32_t check = (unsigned int) (a-b);
    value =  2*(check&btMask);
    value1 =  2*(value1&btMask);
    foo(value1, value);

 }

 uint32_t bzhi_emulation3(uint32_t value1, uint32_t value2, uint32_t index ) {  
    uint32_t lvalue1;
    uint32_t lvalue2;
    const uint32_t btMask = (1 << index) - 1;    
    lvalue1 =  2*(value1&btMask);
    lvalue2 =  2*(value2&btMask);
    return lvalue1 +  lvalue2;

 }


void bzhi_emulation4(uint32_t value1, uint32_t value2, uint32_t index ) {  
    uint32_t lvalue1;
    uint32_t lvalue2;
    const uint32_t btMask = (1 << index) - 1;    
    lvalue1 =  (value1&btMask);
    lvalue2 =  (value2&btMask);
    foo(lvalue1 ,  lvalue2);

}

Reply via email to