này là một phần của tiêu đề SDK CryENGINE làm tôi chú ý:Mặt nạ nhánh hoạt động như thế nào trong CryENGINE 3?
branchmask.h
#ifndef __BRANCHLESS_MASK__
#define __BRANCHLESS_MASK__
///////////////////////////////////////////
// helper functions for branch elimination
//
// msb/lsb - most/less significant byte
//
// mask - 0xFFFFFFFF
// nz - not zero
// zr - is zero
ILINE const uint32 nz2msb(const uint32 x)
{
return -(int32)x | x;
}
ILINE const uint32 msb2mask(const uint32 x)
{
return (int32)(x) >> 31;
}
ILINE const uint32 nz2one(const uint32 x)
{
return nz2msb(x) >> 31; // int((bool)x);
}
ILINE const uint32 nz2mask(const uint32 x)
{
return (int32)msb2mask(nz2msb(x)); // -(int32)(bool)x;
}
ILINE const uint32 iselmask(const uint32 mask, uint32 x, const uint32 y)// select integer with mask (0xFFFFFFFF or 0x0 only!!!)
{
return (x & mask) | (y & ~mask);
}
ILINE const uint32 mask_nz_nz(const uint32 x, const uint32 y)// mask if(x != 0 && y != 0)
{
return msb2mask(nz2msb(x) & nz2msb(y));
}
ILINE const uint32 mask_nz_zr(const uint32 x, const uint32 y)// mask if(x != 0 && y == 0)
{
return msb2mask(nz2msb(x) & ~nz2msb(y));
}
ILINE const uint32 mask_zr_zr(const uint32 x, const uint32 y)// mask if(x == 0 && y == 0)
{
return ~nz2mask(x | y);
}
#endif//__BRANCHLESS_MASK__
Có thể ai đó ném một giải thích ngắn gọn như thế nào chính xác được các chức năng này dự định sẽ được sử dụng để làm giảm các chi nhánh? ILINE Tôi giả sử là nội lực được xác định trước hoặc một cái gì đó như thế. Tôi đã tìm kiếm trên Google về nó, nhưng tất cả những gì tôi tìm thấy là các bản sao của các tiêu đề CryENGINE được tải lên ở các trang khác nhau, nhưng không có thảo luận về vấn đề cụ thể này.
với dự đoán nhánh tốt hơn tôi đoán – user1849534
@didierc Hay đúng hơn, các ví dụ này loại bỏ hoàn toàn các nhánh. – Mysticial