c++ - Strange assembler generated by VS 2008 -
i have c++ function, looking like:
inline unsigned short function_name(float x, float y, somestruct *cfg) { int x_pos = (int)(x*2 + 0.5f); int y_pos = (int)(y*2 + 0.5f); int dict_index = x_pos + (y_pos * cfg->subdivisions_adj); [...] while somestruct declared as:
struct somestruct { int subdivisions; int subdivisions_adj; [...] } the generated assembly third line (int dict_index = [...]) is:
cvttss2si edi,xmm3 imul edi,[ecx+04h] movss xmm3,[ecx+0ch] movaps xmm4,xmm3 mulss xmm4,xmm0 addss xmm4,xmm1 cvttss2si eax,xmm4 add edi,eax (see result amdcodeanalyst)
can explain assembly does? don't know why cvttss2si , movaps used @ all, aren't floating point numbers?
i using visual studio 2008 on windows 7, sse2 instruction set enabled.
what seeing compiler merges first 3 lines 1 intermingled sequence of instructions.
cvttss2si edi,xmm3 convert xmm3 float 32-bit int. presumably xmm3 contains float value of y_pos, , result of (int) on calculateion of y_pos.
imul edi,[ecx+04h] multiply cfg->subdivisions_adj (ecx = cfg, subdivisions_adj = offset of 4)
movss xmm3,[ecx+0ch] would part of ... in cfg variable, suppose.
movaps xmm4,xmm3 mulss xmm4,xmm0 adss xmm4,xmm1 calculate x_pos = x * 2 + 0.5
cvttss2si eax,xmm4 (int) x_pos;
add edi,eax add x_pos y_pos * cfg->subdivisions_adj;
Comments
Post a Comment