The NASM manual talks about these macros, but it doesn't really explain how to use them as far as I can see. Section 3.4.6 states:
Floating-point constants are acceptable only as arguments to
DB,DW,DD,DQ,DT, andDO, or as arguments to the special operators__?float8?__,__?float16?__,__?bfloat16?__,__?float32?__,__?float64?__,__?float80m?__,__?float80e?__,__?float128l?__, and__?float128h?__
At first, I thought this was to use floating-point constants outside the data section. But when I tried mov xmm0, __?float32?__(1.23), I got an "Invalid combination of opcode and operands" error. Eventually, I saw that foo: dd __?float32?__(1.23) works. This feels strange to me though; if you can do dd 1.23 directly, what is the point of these macros? One possibility could be if maybe you need to define, for example, a single-precision float in a quadword. Is this truly the only use for these macros, or am I using them wrong?