linux编程的108种奇淫巧计-11(乱序)【续】

本文介绍了一段使用SSE4指令集中的palignr指令优化的数据处理代码。通过利用Intel Core i3 CPU的支持,该文章展示了如何将原有的代码进行重写以实现左移操作,并对比了使用palignr指令前后在虚拟机环境下的性能表现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

接上文:linux编程的108种奇淫巧计-11(乱序)

用了支持SSE4的CPU,intel core i3,因为支持了palignr指令,所以把上文的代码改用了palignr指令重写了一下如下:

可能由于在虚拟机上运行的原因,性能提升并不显著。

#include<stdio.h> #include<stdlib.h> #include <stddef.h> #include <stdint.h> asm(" .text "); asm(" .type shl_7, @function "); asm("shl_7: push %rbp "); asm(" mov %rsp,%rbp "); asm("loop: sub $0x80, %rdx "); asm(" movaps -0x07(%rsi), %xmm1 "); asm(" movaps 0x09(%rsi), %xmm2 "); asm(" movaps 0x19(%rsi), %xmm3 "); asm(" movaps 0x29(%rsi), %xmm4 "); asm(" movaps 0x39(%rsi), %xmm5 "); asm(" movaps 0x49(%rsi), %xmm6 "); asm(" movaps 0x59(%rsi), %xmm7 "); asm(" movaps 0x69(%rsi), %xmm8 "); asm(" movaps 0x79(%rsi), %xmm9 "); asm(" lea 0x80(%rsi), %rsi "); asm(" palignr $7, %xmm8, %xmm9 "); asm(" palignr $7, %xmm7, %xmm8 "); asm(" palignr $7, %xmm6, %xmm7 "); asm(" palignr $7, %xmm5, %xmm6 "); asm(" palignr $7, %xmm4, %xmm5 "); asm(" palignr $7, %xmm3, %xmm4 "); asm(" palignr $7, %xmm2, %xmm3 "); asm(" palignr $7, %xmm1, %xmm2 "); asm(" movaps %xmm9, 0x70(%rdi) "); asm(" movaps %xmm8, 0x60(%rdi) "); asm(" movaps %xmm7, 0x50(%rdi) "); asm(" movaps %xmm6, 0x40(%rdi) "); asm(" movaps %xmm5, 0x30(%rdi) "); asm(" movaps %xmm4, 0x20(%rdi) "); asm(" movaps %xmm3, 0x10(%rdi) "); asm(" movaps %xmm2, (%rdi) "); asm(" leaveq "); asm(" retq "); asm(" .text "); asm(" .type shl_7_f, @function "); asm("shl_7_f: push %rbp "); asm(" mov %rsp,%rbp "); asm("loop_f: sub $0x80, %rdx "); asm(" movaps -0x07(%rsi), %xmm1 "); asm(" movaps 0x09(%rsi), %xmm2 "); asm(" movaps 0x19(%rsi), %xmm3 "); asm(" movaps 0x29(%rsi), %xmm4 "); asm(" movaps 0x39(%rsi), %xmm5 "); asm(" movaps 0x49(%rsi), %xmm6 "); asm(" movaps 0x59(%rsi), %xmm7 "); asm(" movaps 0x69(%rsi), %xmm8 "); asm(" movaps 0x79(%rsi), %xmm9 "); asm(" lea 0x80(%rsi), %rsi "); asm(" palignr $7, %xmm8, %xmm9 "); asm(" movaps %xmm9, 0x70(%rdi) "); asm(" palignr $7, %xmm7, %xmm8 "); asm(" movaps %xmm8, 0x60(%rdi) "); asm(" palignr $7, %xmm6, %xmm7 "); asm(" movaps %xmm7, 0x50(%rdi) "); asm(" palignr $7, %xmm5, %xmm6 "); asm(" movaps %xmm6, 0x40(%rdi) "); asm(" palignr $7, %xmm4, %xmm5 "); asm(" movaps %xmm5, 0x30(%rdi) "); asm(" palignr $7, %xmm3, %xmm4 "); asm(" movaps %xmm4, 0x20(%rdi) "); asm(" palignr $7, %xmm2, %xmm3 "); asm(" movaps %xmm3, 0x10(%rdi) "); asm(" palignr $7, %xmm1, %xmm2 "); asm(" movaps %xmm2, (%rdi) "); asm(" leaveq "); asm(" retq "); int main(void) { uint8_t * src = (uint8_t*)malloc(sizeof(uint8_t)*(128+7)); uint8_t * des = (uint8_t*)malloc(sizeof(uint8_t)*128); int i = 0; for(;i<128;++i) { src[i] = 0xFF; } src[0] = 0x0; src[1]=0x1; src[2]=0x2; src[7]=0x7; src[8]=0x8; src[9]=0x9; src[10]=0xA; src[126]=0xB; src[127]=0xA; src+=7; shl_7(des,src); i = 0; for(;i<128;++i) { //printf("%d,%d\n",i,des[i]); } i = 0; for(;i<100000000;++i) { #ifdef _SLOW shl_7(des,src); #endif #ifdef _FAST shl_7_f(des,src); #endif } return 0; }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值