//设计对数据执行不同的运算 #define IDENT 0 //求和,如果是求乘积设为1 #define OP + //如果求乘积设为*
voidcombin3(vec_ptr v, data_t* dest) { long i; long length = vec_length(v); //减少循环中的函数调用 data_t* data = get_vec_start(v); //减少过程调用的优化
*dest = IDENT;
for(int i = 0; i < length; ++i) { *dest = *dest OP data[i]; } }
上述代码的汇编码如下:
1 2 3 4 5 6 7 8
# vmovsd代表从指定的位置读数据 .L17: # loop: vmovsd (%rbx), %xmm0 # Read product from dest 指针dest的地址从%xmm0读出来,存在寄存器%rbx中 vmulsd (%rdx), %xmm0 # Multiply product by data[i] 第i个元素的指针保存在%rdx中 vmovsd %xmm0, (%rbx) # Store product at dest 将rbx中的数据读出,存入%xmm0中 addq $8, %rdx # Increment data + i cmpq %rax, %rdx # Compare to data+length data+length存放在%rax中 jne .L17 # If !=, goto loop