2015-05-26 2 views
-1

В настоящее время я работаю над функцией, которая вычисляет аппроксимацию Тейлора функции sin (x), используя C & 64-битная сборка в сборе (C с использованием функции asm). Я умеренно новичок в сборке & низкоуровневого программирования, и я до сих пор не получаю мало вещей. Вызов функцииSSE деление на целое число

Давайте в C:

 float taylor(float fi, float n); 

где ц угол и п число шагов. Я понял, что в сборке часть fi сохраняется в регистре xmm0, а n хранится в регистре rax.

  1. В каком регистре я должен положить возвращаемое значение в конце? (как плавающий)
  2. Я вычислил 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) - и я понятия не имею, как сделать его работу ...

+0

Для распределения регистра возврата вам нужно будет посмотреть соглашение о вызове. Какой OS/компилятор вы используете? – Dani

+0

Из названия я думал, что это будет более интересный вопрос .. фактическое SSE целочисленное деление должным образом раздражает, но это именно то, чего вы не хотите здесь. – harold

+0

@Dani: Linux 2.6.32-73-server x86_64, компилируя с использованием AS и GCC –

ответ

1

Вы должны потребуется некоторое время, чтобы изучить ссылку на набор инструкций, поэтому вы, по крайней мере, получите общее представление о том, какие у вас есть возможности. Кроме того, вы должны прочитать соответствующие документы ABI для соглашения о вызове.

Тем не менее, ответ на ваш первый вопрос возвращаемые значения с плавающей точкой должны быть переданы обратно в xmm0 и вы можете конвертировать из целого числа плавать с помощью CVTSI2SS (или CVTSI2SD для двойной точности).

Также обратите внимание, что вы должны использовать правильные скалярные/упакованные и плавающие/двойные версии. divpd упакован двойной, в то время как вам нужен скалярный сингл, поэтому вы действительно хотите divss.

PS: ваш вопрос конкретно не о FPU или MMX. Скорее, речь идет о SSE.

+0

правильно, мое плохо. Также кажется, что проблема заключалась в том, как вводить аргументы - когда я писал «6.0 10» вместо «6 10 », это разделение дает мне правильный результат 1.000. Спасибо. –

Смежные вопросы