WEB开发网
开发学院软件开发C++ Pentium III处理器的单指令多数据流扩展指令(2)... 阅读

Pentium III处理器的单指令多数据流扩展指令(2)

 2010-10-15 09:08:11 来源:Web开发网   
核心提示:3. 例子在这一节,我们将介绍几个例子来帮你理解Pentium III的SSE指令集应用.在每个例子中,我们都将介绍三种解决方案,分别使用汇编语言、intrinsics库和C++类.附加例子将在下一部分的附加示例节中介绍.3.1 包裹乘法在前面我们已经用三种不同的开发机制介绍了两个包裹数据的乘法计算,这三种机制分别是使

3. 例子

在这一节,我们将介绍几个例子来帮你理解Pentium III的SSE指令集应用.在每个例子中,我们都将介绍三种解决方案,分别使用汇编语言、intrinsics库和C++类.附加例子将在下一部分的附加示例节中介绍.

3.1 包裹乘法

在前面我们已经用三种不同的开发机制介绍了两个包裹数据的乘法计算,这三种机制分别是使用汇编语言、intrinsics库和C++类来编写.

3.2 比较操作

让我们来考虑一下比较的事件.如果不使用SSE,我们每次只能对一对浮点数进行比较.使用了SSE以后,可以同时对4对浮点数进行比较.

在C和C++中比较4对浮点数,我们可以像下面一样写一个循环,把每次的比较放在循环里面.另外我们还需要定义保存比较结果的变量.代码可以类似于下面的例子.

float a[4], b[4]
int i, c[4];
// assume that a contains 4.5 6.7 2.3 and 1.2
// assume that b contains 4.3 6.9 2.0 and 1.5
for (i = 0;i < 4; i++ )

c[i] = a[i] < b[i];
// take action on comparison result

在SSE指令集中,比较指令是cmpps,她有两个128位的操作数和一个选项参数.选项参数是用来指明指令比较类型的:是大于、小于、大于等于还是小于等于的比较.cmpps指令用来比较4对浮点数的大小,并将比较结果放在第一个操作数中.如果比较的结果是真,相对应的元素将被置为FFFFFFFF,如果为非,则被置为00000000.这个结果还可以被映射到一个普通的(8位或者16位)寄存器中,这个普通的寄存器用一个位来映射SSE寄存器的一个元素.我们可以从这个映射的寄存器来得到比较的结果.

下面举例来说明cmpps指令的用法.

; assume that xmm0 contains 4.5 6.7 2.3 and 1.2
; assume that xmm1 contains 4.3 6.9 2.0 and 1.5
; compare for less than condition
cmpps xmm0, xmm1, 1;
; move result of comparison as a mask into eax
movmskps eax, xmm0;
; test eax against some value
test eax, 5;
; jump if true, to the given label
je match13

这个操作也可以用图8的图示来表示.

上一页  1 2 3 4 5 6  下一页

Tags:Pentium III 处理器

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接