Here's a cute little hack I came up with when doing some fixed-point arithmetic stuff in Visual C++ a while ago. I wanted to make a templated C++ class with some inline assembly, the generation of which depends on a numeric template parameter. Doing the obvious thing doesn't work:
template<int N> class ArithmeticHelper<N> { public: static Int5 MultiplyShiftRight(Int5 x, Int5 y) { __asm { mov eax, x imul y shrd eax, edx, N } } }; |
However, one can introduce numeric parameters into inline assembly code by pretending that they are the length of something, and using the "length" operator:
template<int N> class ArithmeticHelper<N> { private: static const int nn[N]; // VC's inline asm doesn't allow "shl eax, N" directly, but this works... public: static Int5 MultiplyShiftRight(Int5 x, Int5 y) { __asm { mov eax, x imul y shrd eax, edx, length nn } } }; |