llvm-project
llvm-project copied to clipboard
Failures to use optimal math routine
Absolute value
All of them synthesize the operation (poorly)
- [ ]
int8_t - [ ]
int16_t - [ ]
int24_t - [ ]
int32_t - [ ]
int48_t - [ ]
int64_t
Bit reverse
- [ ]
uint48_t foo(uint48_t x) { return __builtin_bitreverse64(x) >> 16; }uses__llbitrevinstead of__i48bitrev(but__builtin_bitreverse32(x >> 16) | (uint48_t)__builtin_bitreverse16(x) << 32is fine?)
Byte swap
- [ ]
int24_t foo(int24_t x) { return __builtin_bswap32(x) >> 8; }uses__lbswapinstead of__ibswap(__ibswapdoesn't exist yet, but probably should?) - [ ]
int48_t foo(int48_t x) { return __builtin_bswap64(x) >> 16; }uses__llbswapinstead of__i48bswap? (can't confirm because of https://github.com/jacobly0/llvm-project/issues/44#issuecomment-2468738761)
Division
- [ ]
int8_t foo(int8_t x, int8_t y) { return x / y; }uses__sdivsinstead of__bdivs - [ ]
int16_t foo(int16_t x, int16_t y) { return x / y; }uses__idivsinstead of__sdivs
Negation
- [ ]
int48_t foo(int48_t x) { return -x; }synthesizes the operation (poorly) instead of using__i48abs
Remainder
- [ ]
int8_t foo(int8_t x, int8_t y) { return x % y; }uses__sremsinstead of__brems - [ ]
int16_t foo(int16_t x, int16_t y) { return x % y; }uses__iremsinstead of__srems
Shift left
- [ ]
int8_t foo(int8_t x, int8_t y) { return x << y; }uses__ishlinstead of__bshl - [ ]
int16_t foo(int16_t x, int16_t y) { return x << y; }uses__ishlinstead of__sshl
Shift right
- [ ]
int8_t foo(int8_t x, int8_t y) { return x >> y; }uses__ishrsinstead of__bshl - [ ]
uint8_t foo(uint8_t x, uint8_t y) { return x >> y; }uses__ishruinstead of__bshru - [ ]
int16_t foo(int16_t x, int16_t y) { return x >> y; }uses__ishrsinstead of__sshrs - [ ]
uint16_t foo(uint16_t x, uint16_t y) { return x >> y; }uses__ishruinstead of__sshru