[SSE] comiss

Programmiersprachen, APIs, Bibliotheken, Open Source Engines, Debugging, Quellcode Fehler und alles was mit praktischer Programmierung zu tun hat.
Antworten
anonym
Beiträge: 79
Registriert: 15.07.2009, 07:35
Kontaktdaten:

[SSE] comiss

Beitrag von anonym »

Ich habe ein Problem mit der SSE-Instruktion comiss (Vergleich des float in den Bits [0;31] eines XMM-Registers mit dem entsprechenden float eines anderen XMM-Registers oder einem float einer Adresse m32, setzt EFLAGS). Ich erhalte dabei falsche Ergebnisse:
2 < 4 wahr
3 < 4 wahr
4 < 4 falsch
9 < 4 wahr
Das ist der Assemblercode:
movups xmm0, dqword ptr [rdi]
movups xmm1, dqword ptr [rsi]
cvttss2si rax, xmm0
mov dword ptr [rdx], rax
cvttss2si rax, xmm1
mov dword ptr [rcx], rax
comiss xmm0, xmm1
short jl L.2
mov rax, 0
jmp L.1
L.2:
mov rax, 1
Alle floats in einem XMM-Register habe den selben Wert (float f[4] = { 1.0f };, oder?).
Bergmon
Beiträge: 46
Registriert: 03.05.2003, 16:39
Kontaktdaten:

Re: [SSE] comiss

Beitrag von Bergmon »

Hi,

hast du den Code selbstgeschrieben oder stammt er aus einem Compiler?

Das ist eine Art Debug-Ausgabe, oder?

Code: Alles auswählen

cvttss2si rax, xmm0
mov dword ptr [rdx], rax
cvttss2si rax, xmm1
mov dword ptr [rcx], rax
Das einzige was mir einfallen würde:

Code: Alles auswählen

short jl L.2
zu

Code: Alles auswählen

short jb L.2
ändern.
comiss setzt für den Fall < das CF (siehe z.B.: http://siyobik.info/main/reference/instruction/COMISS)

Und nach http://en.wikibooks.org/wiki/X86_Assemb ... mp_if_Less wird von
jl das ZF!=OF abgefragt, währen jb das CF prüft.

Ist ein Schuss ins Blaue, aber viele Möglichkeiten gibt es nicht :).

Viele Grüße
Bergmon
anonym
Beiträge: 79
Registriert: 15.07.2009, 07:35
Kontaktdaten:

Re: [SSE] comiss

Beitrag von anonym »

Danke, scheint soweit ich jetzt überblicken kann zu funktionieren. Das war in der Tat nur Testcode, um mit Assemblerprogrammierung generell und spezieller mit einem JIT-Assembler warm zu werden.
Antworten