- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
// We have to put a separate function with 'if constexpr' here as Visual Studio
// produces a false positive warning in a case of RegDstUInt == uint32
// (shifting uint32 left by 32 is an undefined behavior)
// See: https://developercommunity.visualstudio.com/content/problem/225040/c4293-false-positive-on-unreacheable-code.html
static RegDstUInt get_hi_part( RegDstUInt value)
{
// Clang-Tidy generates a false positive 'misc-suspicious-semicolon' warning
// on `if constexpr ()` with template
// LLVM bug 35824: https://bugs.llvm.org/show_bug.cgi?id=35824
if constexpr( (sizeof(RegDstUInt) > 4)
return value >> 32; // NOLINT
// GCC bug 81676 https://gcc.gnu.org/bugzilla/show_bug.cgi?id=81676
// Wrong warning with unused-but-set-parameter within 'if constexpr'
(void)(value);
return 0;
}
В попытке починить сборку в Visual Studio поломали GCC и Clang-Tidy.
pavelmips 29.03.2018 17:14 # 0
bormand 29.03.2018 20:45 # −1
Ну нихуя себе false positive. Сдвиг 32-битного числа на 32 -- самый настоящий UB.
З.Ы. Или всё-таки implementation defined (лень стандарт с мобилы листать). Впрочем, это ничего не меняет.
pavelmips 29.03.2018 20:53 # 0
bormand 29.03.2018 20:58 # −1
pavelmips 29.03.2018 21:00 # 0
bormand 29.03.2018 21:10 # −1
pavelmips 29.03.2018 21:23 # 0
да, но тогда нужно будет делать разные функции для работы с 64-битными и 32-битными числами — тот же костыль. а здесь до начала педантичной борьбы с ворнингами был очень простой код: foo( HAS_32_BIT ? val >> 32 : 0);
> кастом перед разбиением
есть случай с RegDstUInt == uint128, так что без костыля тоже не получитcя
bormand 29.03.2018 21:26 # −1
Но блин, оно же вернёт старшие 96 бит... Каким алгоритмам нужно такое странное разбиение?
pavelmips 29.03.2018 21:37 # +1
у MIPS32 умножение пишет 64 бита в два 32-битных регистра. у RISCV128 команды пишут 128 бит в один 128-битный регистр (умножение пока опустим). эта разбивалка вызывается, только если класс регистрового файла инстанцирован под MIPS
bormand 29.03.2018 21:42 # −1
pavelmips 29.03.2018 21:47 # 0
bormand 29.03.2018 21:57 # −1
З.Ы. Проект опенсурсный?
pavelmips 29.03.2018 22:18 # 0
тогда надо понять, какая нужна, а какая нет)
при делении в lo пишется частное, в hi остаток — что нужно последующему коду, надо успеть понять.
> З.Ы. Проект опенсурсный?
да
bormand 29.03.2018 22:24 # −1
Можно линк?
pavelmips 29.03.2018 22:32 # +1
bormand 29.03.2018 22:30 # −1
pavelmips 29.03.2018 22:36 # +1
pavelmips 29.03.2018 22:20 # 0
inho 29.03.2018 20:58 # +1
Зачем?
bormand 29.03.2018 21:19 # −1
А UB тут нужен чтобы конпелятору не приходилось втыкать костыли и замедлять код если величина сдвига берётся из переменной.
inho 29.03.2018 21:28 # 0
bormand 29.03.2018 21:35 # −1
Плюс те же восьмибитные числа обычно апкастятся до слова, и может выйти забавная ситуация - сдвиг на 9 даст 0, а сдвиг на 33 будет выглядеть как сдвиг на 1.
inho 29.03.2018 20:53 # 0
pavelmips 29.03.2018 20:57 # 0
subaru 29.03.2018 22:22 # +3
"shift count negative or too big, undefined behavior!" — раздался пронзительный голос со стороны параши.
Но пацаны, как всегда, не обратили внимания на это визгливое кукареканье. Пусть кукарекает, что с него взять?
Компилятор — не человек, и сегодня ему предстоит очень трудная ночь. У него уже в течение полутора лет каждая ночь была очень трудной, и теперь его лексер был разработан настолько, что он без труда мог распарсить даже boost.spirit.