nabbla (nabbla1) wrote,
nabbla
nabbla1

Categories:

QuatCore: таблица непосредственных значений

Вот она и построена:

93    00FF SP Stack/Inv 1/j++ 0/j++ 0/ZACC MinusOne/NOP 0/kLOOP main::@zloop/NOP 0/Inv 1/iLOOP QuatMultiply::@out_loop                                                           
24    00FF Y Points2D/X Points2D/Z Points2D/iLOOP SortCCW::@loop/jLOOP Compute4PointAffine::@j_loop/kLOOP FindRoll::@k_loop/Inv 0                                                
0     FFFF [SP+1] 0/[SP] 0/JL SortCCW::@skip/JGE FindRoll::@skip/[Y+k] 0/[Y+1] 0/[SP] 0/[SP+1] 0/JL FindScale::@skipCheb/Acc 0                                                   
3     001F j 3/i 3/i 3/ZACC RoundZero/j 3/ZACC RoundZero/j 3/k 3/j 3/i 3/ZACC RoundZero/i 3                                                                                      
1     FFFF k 1/JL FindMDD3::@skip/j 1/i 1/k 1/i 1/i 1/j 1/i 1/k 1/j 1/i 1/DIV2S 1/JGE FindVector::@SkipOflo/i 1/k 1/k 1/i 1                                                      
25    001F iLOOP FindMDD3::@i_loop/kLOOP ShiftOrigin::@k_loop                                                                                                                    
23    001F kLOOP FindMDD3::@k_loop/jLOOP SortCCW::@loop/jLOOP QuatMultiply::@row_loop                                                                                            
240   00FF jLOOP FindMDD3::@j_loop/X QuatA/Y QuatA                                                                                                                               
26    00FF X Fx1/iLOOP FindRoll::@sico/kLOOP FindVector::@Newton/ZACC ThreeHalf                                                                                                  
28    00FF Z Fx2/iLOOP Compute4PointAffine::@i_loop/jLOOP FindRoll::@j_loop/JNO FindScale::@shl1/iLOOP FindVector::@vector/iLOOP NormSiCo::@inmult/iLOOP QuatMultiply::@col_loop 
30    00FF X Fx3/JNO main::@endless                                                                                                                                              
49    00FF X AffineMat                                                                                                                                                           
199   00FF Z Matrix/k 7                                                                                                                                                          
11010 FFFF j 2/FMA 11010/JO FindScale::@endLoop/i 2                                                                                                                              
22    001F kLOOP Compute4PointAffine::@k_loop/iLOOP FindRoll::@i_loop/jLOOP NormSiCo::@norm                                                                                      
242   00FF Y QuatY/Y QuatY                                                                                                                                                       
16384 FFFF ADD 16384                                                                                                                                                             
205   00FF X AfTransf                                                                                                                                                            
-13   001F iLOOP FindScale::@loop                                                                                                                                                
21758 FFFF FMA 21758                                                                                                                                                             
43648 FFFF C 43648                                                                                                                                                               
236   00FF Z Exp/j 12                                                                                                                                                            
203   00FF Y Rx                                                                                                                                                                  
238   00FF X Ty                                                                                                                                                                  
27    001F kLOOP SwapPoints::@swap/iLOOP ShiftOrigin::@i_loop


Левая колонка: само значение в десятичной форме, затем маска в hex, а потом приведены все строки кода, которые "ссылаются" на данное значение.

Сначала я не хотел всю строку целиком приводить, только само "непосредственное значение", и получил полный отвал башки:

Stack / 0 / 1 / MinusOne / ...

Оптимизатор настолько агрессивный, что начальный адрес стека, ноль, единицу и МИНУС единицу сделал одним значением!!!

И как ни странно, он прав!


И вот как раз полные строки позволяют осознать его правоту. Адрес стека: 93 = 0x5D = 0101_1101 - с этим понятно.
Следующее применение числа 93: "Inv 1". Inv - это однобитный регистр, оказывающий влияние на команды PM (Plus-Minus) и FMPM (Fused Multiply Plus-Minus). Раз он однобитный, нас устроило бы любое непосредственное значение с единицей на конце, и почему бы не 93 :) Как вы уже догадались, мы выбираем первое подходящее значение из уже занесённых в список :)

Дальше ещё смешнее, j++ 0. Этой команде вообще абсолютно пофиг до "аргумента", она просто прибавляет единицу, и поэтому вместо нуля вполне сойдёт значение 93 :)

MinusOne у нас определён в QuatCoreConsts.inc:

MinusOne EQU 1


А используется он командой ZAcc (инициализация аккумулятора интересными значениями, которые не влезают в 16-битную шину), которая использует только два младших бита шины данных. Так что опять же, число 93 нам вполне подходит, у него младшие биты 01 :)

Далее идёт метка для цикла:

	@@zloop:	OUT		[Z+k]		;преобр. матрица 2х2
			kLOOP		@@zloop


Нам нужно прыгнуть на 1 назад, но с учётом конвейера это получается на 3 назад. Число "-3", изображенная в 5-битном дополнительном коде, выглядит как 11101, и что за совпадение - нас опять вполне устраивает число 93 :)

Потом, ясное дело, такой же короткий цикл встретился в процедуре перемножения кватернионов - и мы ещё разок задействовали число 93.

И подобные вещи творятся со многими другими константами. Вон, число 11010 = 0x2B02 - это по совместительству двойка, а 30=0x1E - это не только адрес в памяти, где лежит Fx1 (X-координата первой обнаруженной точки), но ещё и относительный прыжок на -2, который нужен для "бесконечного цикла".


Забавная вещь выходит: старая версия программы использовала 32 непосредственных значения, при том, что всё больше -64..+63 мы взамен хранили в сегменте данных. Здесь же, с добавлением 5 новых "больших" констант, мы используем всего 25 значений, за счёт "поумневшего" компилятора. У меня хорошее предчувствие, что смогу распихать их компактно по 7 битам, не прибегая к таблицам. Сейчас приеду на дачу - и буду играться, сначала с помощью бумажки и ручки :)
Tags: ПЛИС, математика, программки, работа, странные девайсы
Subscribe

  • Формулы приведения, что б их... (и atan на ТРЁХ умножениях)

    Формулу арктангенса на 4 умножениях ещё немножко оптимизировал с помощью алгоритма Ремеза: Ошибка уменьшилась с 4,9 до 4,65 угловой секунды, и…

  • Алгоритм Ремеза в экселе

    Вот и до него руки дошли, причина станет ясна в следующем посте. Изучать чужие библиотеки было лениво (в том же BOOSTе сам чёрт ногу сломит), писать…

  • atan на ЧЕТЫРЁХ умножениях

    Мишка такой человек — ему обязательно надо, чтоб от всего была польза. Когда у него бывают лишние деньги, он идёт в магазин и покупает какую-нибудь…

  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your IP address will be recorded 

  • 0 comments