Sign in Join

Live chat for Free Pascal, Lazarus, Delphi and every Pascal programmer.

Mailing lists / fpc-devel / 2019-06

i386 operand size quirk

1 message · 1 person ·

Reply by email Subscribe to this list Your subscription

Read-only archive. Use j and k to move between messages.

J. Gareth Moreton

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

Reply by email