Hi everyone,

I'm trying to fix an issue with x86 assembly language where certain SSE and AVX instructions don't properly accept memory operands due to their size being that of a single element ( https://bugs.freepascal.org/view.php?id=32219 ).  My fixes are going okay for the most part, but I've run into an interesting situation with i386... it seems that 8-byte operands are instead treated as 4-byte operands, and the Tx86Operand.SetSize method even acknowledges this (it explains that it's fixed when SetCorrectSize is called) - the reason is because the TCGSize2OpSize array returns S_L instead of S_Q for sizes larger than 32-bit, and this is a conscious design decision.

What is the reason for this? I'm trying to find a good solution to this problem that isn't hacky.  So far I've gotten things like "VADDSD XMM0, XMM0, [EAX]" and "VADDSD XMM0, XMM0, QWORD PTR [EAX]" to compile without returning any warning, but now "VADDSD XMM0, XMM0, DoubleConst" fails because it thinks DoubleConst is 32-bit even though it's defined globally as "const DoubleConst: Double = 1.5".

Gareth aka. Kit


---
This email has been checked for viruses by Avast antivirus software.
https://www.avast.com/antivirus

_______________________________________________
fpc-devel maillist  -  [email protected]
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-devel

Reply via email to