Войти
ПрограммированиеФорумОбщее

Найти формулу для координат соседей (3 стр)

Страницы: 1 2 3
#30
(Правка: 14:58) 14:57, 28 мая 2021

Mikle
> Те же шесть действий
Да, но x+4*y+5 можно посчитать через одну lea


#31
14:58, 28 мая 2021

foxes
Я о том, что маскировение встроено в саму операцию сдвига:

shr eax,cl

использует только 5 бит cl.
Соответственно, такой AND на x86 бесплатен (в случае оптимизации).

#32
16:29, 28 мая 2021

entryway
Для

7 3 4
0 * 2
5 1 6

вот 32bit версия

(0x65204F>>((x+4*y+5)*2))&7
#33
(Правка: 18:20) 16:34, 28 мая 2021

FordPerfect
Круто. Тоже хотел найти вариант с наложением бит индексов, но для твоей изначальной индексации не получается. Забыл, что порядок индексов внутри группы (боковые, угловые) автору не важен.

#34
(Правка: 20:29) 19:57, 28 мая 2021

вот вы реально загоняетесь, что мешает хранить индексы или просто ссылки?
типичные neighbor по cell или даже графам (если соседей меньше 9). http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%BE%D0%B8%D1%8… 8%D1%80%D0%B0

12 156 -1
32768 * 0
26 -1 400542

#35
(Правка: 21:34) 20:32, 28 мая 2021

GCC отжигает? Или clang? Поясните.
https://godbolt.org/z/xvcqP9aar

И почему clang тупит с lea?

#36
(Правка: 20:56) 20:52, 28 мая 2021

entryway
массив нужно вынести из функции, иначе он будет при каждом вызове сохраняться в стек.

foo(int, int):
        lea    eax, [rdi+5+rsi*4]
        cdqe
        mov    eax, DWORD PTR arr[0+rax*4]
        ret
arr:

#37
(Правка: 21:19) 20:56, 28 мая 2021

foxes
> массив нужно вынести из функции иначе от будет при каждом вызове сохраняться в стек.
Выносить - это как-то не очень, static внутри тоже помогает. Ну и clang же почему-то не занимается этим. Забил на какие-то стандарты что ли?

#38
(Правка: 21:28) 21:20, 28 мая 2021

entryway
> Ну и clang же справляется.
Такая шляпа начиная с gcc 4.4.7
gcc 4.1.2 - нормально пережевывает. Но остальные компиляторы тоже, по разному собирают. Видимо за это отвечают какие-то флаги, которые ставятся по умолчанию в разных версиях по разному.

#39
(Правка: 22:06) 21:38, 28 мая 2021

foxes
> Видимо за это отвечают какие-то флаги
-fmerge-all-constants помогает, хотя оно вроде и не совсем для этого.
https://godbolt.org/z/6vMdGK6as

-fno-merge-all-constants не "ломает" выхлоп clang. Да он и без const не занимается копированием.

#40
14:26, 29 мая 2021

AlexeyLarin
(y-y0)*3+(x-x0) - индекс от 0 до 8, кроме 4 - центр клетка
можешь поменять порядок через доп массив индексов размера 9

Страницы: 1 2 3
ПрограммированиеФорумОбщее