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

Popular posts from this blog

Unable to remove the www from url on https using .htaccess -