Конференция "Основная" » Оптимизация и Double
 
  • dmk © (17.01.17 01:29) [20]
    >Так кто кого подставил?
    Компилятор меня. В хелпе про это нет ни слова.
  • Rouse_ © (17.01.17 18:48) [21]
    Вообще странно, я проверил на ХЕ4 и на последнм Берлине, не воспроизвелось (ХЕ6 нет)
  • dmk © (17.01.17 21:11) [22]
    Для меня это тоже странно.

    Там такой код:
     //Единица на случай нулевой разницы
     if (gEndTime = gStartTime) then gEndTime := (gEndTime + 1);
     //Время использованное на отрисовку кадра в миллисекундах
     gUsedTime := (gEndTime - gStartTime);
     //Время использованное на отрисовку кадра в секундах
     gFrameTime := (gUsedTime / 1000);
     //Всего кадров отрисовано с момента сброса
     gTotalFrames := (gTotalFrames + 1);
     //Всего времени с момента сброса
     gTotalTime := (gTotalTime + gFrameTime);
     //Кадров в секунду с момента сброса
     gFPS := (gTotalFrames / gTotalTime);


    Потом вызывается

    //Рамка региона отсечения
    sBmp.RectAA(Rgn.X, Rgn.Y, Rgn.W, Rgn.H, crWhite, 255, 128);


    Внутри RectAA есть вызов

    //Рисуем линию
    FBlendScLine(lpDA, lpLen, dColor, dAlpha, dOpacity);


    В линии (часть кода):
     //Формируем маски очистки из одной
     movdqu xmm6, PClearMask //Читаем общую маску очистки
     movdqu xmm8, xmm6 //дублируем
     movdqu xmm9, xmm6 //дублируем
     psrldq xmm8, 1 //xmm8 - Маска очистки 15-го байта
     psrldq xmm9, 15 //xmm9 - маска инверсии
     psrldq xmm6, 8 //в xmm6 маска очистки 7..0 байтов


    В общем использую xmm на полную. После выход а из нее переменная приобретает вид QNAN вместо 0,001 как было до нее.

    Где я накосячил?
    Если сделать переменную глобальную - все в полном порядке.
    Если выключить оптимизацию - все хорошо.
    Поэтому вывод один - компилятор пихает локульную переменную в регистры.
    И да стека у меня нет. Ничего не сохраняю. Там все 16 xmm-регистров используются.
  • dmk © (17.01.17 21:14) [23]
    МОгу полный код FBlendScLine на почту скинуть. Кормить не хочу халявщиков :)
  • Давно не заходил (17.01.17 22:01) [24]
    In line with the x64 Application Binary Interface (ABI), the contents of the following registers must be preserved and restored within inline assembly functions: R12, R13, R14, R15, RDI, RSI, RBX, RBP, RSP, XMM4, XMM5, XMM6, XMM7, XMM8, XMM8, XMM9, XMM10, XMM11, XMM12, XMM13, XMM14, and XMM15.

    http://docwiki.embarcadero.com/RADStudio/XE6/en/Using_Inline_Assembly_Code
  • dmk © (17.01.17 23:23) [25]
    Ну да, меня предупреждали :(
  • dmk © (17.01.17 23:23) [26]
    Спасибо!
 
Конференция "Основная" » Оптимизация и Double
Есть новые Нет новых   [118573   +13][b:0][p:0]