В настоящее время я работаю над функцией, которая вычисляет аппроксимацию Тейлора функции sin (x), используя C & 64-битная сборка в сборе (C с использованием функции asm). Я умеренно новичок в сборке & низкоуровневого программирования, и я до сих пор не получаю мало вещей. Вызов функцииSSE деление на целое число
Давайте в C:
float taylor(float fi, float n);
где ц угол и п число шагов. Я понял, что в сборке часть fi сохраняется в регистре xmm0, а n хранится в регистре rax.
- В каком регистре я должен положить возвращаемое значение в конце? (как плавающий)
Я вычислил x^3, x^5, x^7 и т. д., просто умножив значение хранения xmm самостоятельно, но как разделить его на целые факториалы? (x^3/3! и т. д.). Есть ли способ поставить f.e. 3! = 6 в регистр xmm, чтобы он плавал, поэтому он будет отображаться как 6.0? Я понятия не имею, как разделить эти два числа. Я пытался что-то вроде этого:
movq $6, %rbx movq %rbx, %xmm1 divpd %xmm0, %xmm1
Но это дает результат NaN (приведенный пример параметры: 6 10) - и я понятия не имею, как сделать его работу ...
Для распределения регистра возврата вам нужно будет посмотреть соглашение о вызове. Какой OS/компилятор вы используете? – Dani
Из названия я думал, что это будет более интересный вопрос .. фактическое SSE целочисленное деление должным образом раздражает, но это именно то, чего вы не хотите здесь. – harold
@Dani: Linux 2.6.32-73-server x86_64, компилируя с использованием AS и GCC –