LINUX.ORG.RU

Объясните сишную магию

 ,


11

14

Пытался понять как реализовать SVG фильтр feComposite, ибо SVG дока унылая, поэтому залез в сорцы вебкита. Там тоже документации ноль, ещё и код очень странный.

Вот что это за ужас (src):

static unsigned char clampByte(int c)
{
    unsigned char buff[] = { static_cast<unsigned char>(c), 255, 0 };
    unsigned uc = static_cast<unsigned>(c);
    return buff[!!(uc & ~0xff) + !!(uc & ~(~0u >> 1))];
}

Я так понимаю, они проверяют что int в 0..255 диапазоне, но уж слишком странным образом.

UPD: коммит, который добавил этот код.

★★★★★

Последнее исправление: RazrFalcon (всего исправлений: 1)
Ответ на: комментарий от anonymous

код из оп-поста правильно решает вполне конкретную задачу

здесь ты меня цитируешь. ниже мы побеседовали с другим(?) аноном. попробую подытожить в одном комментарии.

рассматриваем код из оп-поста.

1. на уровне ast никаких ветвлений нет. представить себе оптимизацию, которая их воткнёт, я не могу.

2. на уровне генерации машинного кода есть нюанс: в коде используются static_cast<unsigned> и (неявно) static_cast<bool>. если они реализованы в компиляторе с использованием ветвлений (есть такой пример, но в микроконтроллерах), то карточный домик рассыпается.

3. чтобы защититься от использования ии в компиляторе (по-другому я идею анона о замене массива buff регистрами объяснить не могу), можно добавить в объявление buff модификатор volatile.

anonymous
()
Ответ на: комментарий от anonymous

1. на уровне ast никаких ветвлений нет. представить себе оптимизацию, которая их воткнёт, я не могу.

2. на уровне генерации машинного кода есть нюанс: в коде используются static_cast<unsigned> и (неявно) static_cast<bool>. если они реализованы в компиляторе с использованием ветвлений (есть такой пример, но в микроконтроллерах), то карточный домик рассыпается.

Ты рассматриваешь случай, когда оптимизатор и кодогенератор(со своим оптимизатором) не знают друг о друге (clang->llvm). Если оптимизатор знает, что кодогенератор использует ветвление, перестраивает ast, используя эти ветвлениями. Потом оптимизирует уже таргетозависимый ast, в котором есть полная инфа о языковых конструкциях. (clang скорее всего так не сможет)

3. чтобы защититься от использования ии в компиляторе (по-другому я идею анона о замене массива buff регистрами объяснить не могу), можно добавить в объявление buff модификатор volatile.

Это почти как векторизация, можно даже в 32+-битный регистр записать 3 байта.

anonymous
()
Ответ на: комментарий от anonymous

Да, с другим. Я спрашиваю, а он бесшовно продолжает, в лучших традициях «х пойми кто о чем».

volatile

В данном случае это видимо прокатит. Но в общем виде... вы его никто не высказали явно, но я понял ответ, спасибо.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.