一 准备跑开intrinsic,直接通过汇编操作寄存器,进一步理解向量寄存器们。
二 第二课,把一个数组存入xmm寄存器,然后再读取出来,存入内存,打印出来。
使用的SIMD指令为
movdqa xmm0, [rdi]
movd [rsi], xmm0 ;//只是mov了低4个字节,全部mov继续研究,
代码:
- global Load
- global Save
- extern printf
- Load:
- push rax; //这些都是测试代码,用于打印,先缓存rax寄存器
- push rdi; //缓存rdi寄存器,因为这个寄存器就是存的数组指针
- push rsi; //输出的数组指针
- movdqa xmm0, [rdi] //先存到xmm0
- movd [rsi], xmm0 //从xmm0读取出来
- ;//下面是用于打印的代码,详见上一篇文章的介绍
- mov rax, rdi;
- mov rdi, format;
- mov rsi, rax;
- xor rax, rax;
- call printf
- pop rsi
- pop rdi;
- pop rax
- section .data
- format: db "data address %p", 10, 0
再来看C语言调用代码:
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
-
- extern void Load(char *ptr, char *out);
- extern void Save(char *ptr);
-
- int main()
- {
- char *a = (char*)malloc(100);
- for (int i = 0; i < 100; i++)
- a[i] = i;
- printf("we know a address %p\n", a);
- char b[100];
- memset(b, 0x0, 100);
- Load(a, b);
- free(a);
- for (int i = 0; i < 100; i++)
- printf("b[%d] = %d\n", i, b[i]);
- return 0;
- }
执行输出:
test# ./inout
we know a address 0x13fb260
data address 0x13fb260
b[0] = 0
b[1] = 1
b[2] = 2
b[3] = 3
b[4] = 0
b[5] = 0
符合预期