Я хочу преобразовать цикл for в следующем коде в сборку, но я не уверен, как начать. Объяснение того, как это сделать и почему это работает, будет оценено по достоинству.используя in-line asm для записи цикла for с 2 сравнениями
Я использую VS2010, C++, записывая для x86. Код выглядит следующим образом:
for (n = 0; norm2 < 4.0 && n < N; ++n)
{
__asm{
///a*a - b*b + x
fld a // a
fmul st(0), st(0) // aa
fld b // b aa
fmul st(0), st(0) // bb aa
fsub // (aa-bb) // st(0) - st(1)
fld x // x (aa-bb)
fadd // (aa-bb+x)
/// 2.0*a*b + y;
fld d // d (aa-bb+x)
fld a // d a (aa-bb+x)
fmul // ad (aa-bb+x)
fld b // b ad (aa-bb+x)
fmul // abd (aa-bb+x)
fld y // y adb (aa-bb+x)
fadd // b:(adb+y) a:(aa-bb+x)
fld st(0) //b b:(adb+y) a:(aa-bb+x)
fmul st(0), st(0) // bb b:(adb+y) a:(aa-bb+x)
fld st(2) // a bb b:(adb+y) a:(aa-bb+x)
fmul st(0), st(0) // aa bb b:(adb+y) a:(aa-bb+x)
fadd // aa+bb b:(adb+y) a:(aa-bb+x)
fstp norm2 // store aa+bb to norm2, st(0) is popped.
fstp b
fstp a
}
}
Вы можете попробовать обратный: переписать сборку на C++ и пусть использовать компилятор SSE2 ('/ арк: sse2'). – avakar
Кажется странным; это в основном в встроенной сборке уже, и часть цикла будет не намного быстрее, чем создает компилятор C. (Во всяком случае компилятор C++, вероятно, будет генерировать более быстрый код, чем данный ассемблер) – Elemental
@ Elemental Данный ассемблер уже на 20% быстрее. Во всяком случае, я пытаюсь понять это, а не оптимизировать код. – aCuria