hallo alle,
ich hab nach dem 3dnow! tutorial mal das folgende kleine programm geschrieben.
|
Quellcode
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
|
#include <iostream>
int main() {
float f[4];
float g[4];
int i = 0;
for(i = 0; i < 4; i++) {
f[i] = i;
g[i] = i;
}
for(i = 0; i < 4; i++) std::cout << f[i] << "\t";
std::cout << "\n";
asm(
"femms\n\t"
"mov %1, (%%eax)\n\t"
"mov %2, (%%ebx)\n\t"
"movq (%%eax), %%mm0\n\t"
"movq 8(%%eax), %%mm1\n\t"
"pfadd (%%ebx), %%mm0\n\t"
"pfadd 8(%%ebx), %%mm1\n\t"
"movq %%mm0, (%%eax)\n\t"
"movq %%mm1, 8(%%eax)\n\t"
"mov %%eax, %0\n\t"
"femms\n\t"
:"=m" (f)
:"a" (f), "b" (g)
);
std::cout << f << "\n";
for(i = 0; i < 4; i++) std::cout << f[i] << "\t";
std::cout << "\n";
}
|
nur um mal zu sehen wie das so funktioniert.. (wie ihr vieleicht seht verwende ich gnu-assembler.. erkennbar an der at&t syntax. im prinzip ist das nicht viel anders als im tutorial beschrieben .. normale klammern statt [ ] und:
befehl quelle, ziel anordnung statt: befehl ziel, quelle
\n\t ist nur für den assembler damit er aufeinanderfolgende befehle erkennt \n\t umbruch+tab)
nun liefert mein programm aber statt dem erwarteten 0 2 4 6, -1,99bla 2 4 6 als ergebnis.
ich kann mir auf die schnelle nicht erklären was da passiert.. kann mir da jemand weiterhelfen?
vielen dank im voraus
eviluser