Seite 1 von 1

[SSE] comiss

Verfasst: 25.01.2012, 13:10
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?).

Re: [SSE] comiss

Verfasst: 25.01.2012, 16:12
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

Re: [SSE] comiss

Verfasst: 25.01.2012, 17:16
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.