问题:测试平台中的SSE4

m2213231 2006-12-22 02:13:36
在测试平台的列表里面写着支持sse4指令集,但我没有找到关于这个指令集的任何资料,请问哪里可以找到关于sse4的资料?
另外我在intel icc 的reference document里面看到了_mm_rsqrt_pd这样的指令,但是sse/sse2/sse3中似乎并没有rsqrtpd这条指令,请问这是怎么回事?
...全文
377 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
flyingdog 2006-12-23
  • 打赏
  • 举报
回复
你怎么能根据sqrtpd的opcode推算rsqrpd的opcode那?加0x66肯定是不对的。
intel的文章中有每条指令对应的opcode可以查。

但是硬件上根本没有rsqrpd这条指令。不存在的。所以你怎么写都是无效的。
m2213231 2006-12-22
  • 打赏
  • 举报
回复
那我如果要把rsqrtpd硬编码到我的程序中应该怎么写呢?
我试过不加0x66的,直接写0f 52 c0,是可以运行,但是运行结果不正确.
加了0x66就直接跳出一个dialog说程序挂掉了,根本不能运行
m2213231 2006-12-22
  • 打赏
  • 举报
回复
哦,谢谢flyingdog的回复,这个问题我可能没说清楚

我是因为不知道如何能使用rsqrtpd这条指令才发贴问这个问题
然后housisong(HouSisong)跟贴说rsqrtpd需要用硬编码的形式直接写到代码里面(看二楼回贴),于是我就写了一个用了sqrtpd指令的代码,然后反编译回来,发现_mm_sqrt_pd刚好就只有一条sqrtpd指令,于是我就把sqrtpd指令的opcode改成rsqrtpd的opcode然后写到代码里(相当于把sqrtpd替换成为rsqrtpd),就得到了我最早贴出的(五楼)代码,对应这四行

_EMIT 0x66;
_EMIT 0x0f;
_EMIT 0x52;
_EMIT 0xc0;

但是我把这段代码编译以后不可以运行,不明白为什么.
是我的opcode写错了还是怎么的,请高手指点
flyingdog 2006-12-22
  • 打赏
  • 举报
回复
The operand-size override prefix allows a program to switch between 16- and 32-bit
operand sizes. Either size can be the default; use of the prefix selects the non-default
size. Use of 66H followed by 0FH is treated as a mandatory prefix by some
SSE/SSE2/SSE3 instructions. Other use of the 66H prefix with MMX/SSE/SSE2/SSE3
instructions is reserved; such use may cause unpredictable behavior.
flyingdog 2006-12-22
  • 打赏
  • 举报
回复
66H—Operand-size override prefix (when used with the escape opcode
0FH, this is treated as a mandatory prefix for some SIMD instructions)

以上内容摘自intel的文档。66的确是前导码啊。
flyingdog 2006-12-22
  • 打赏
  • 举报
回复
你给出的代码只有sqrt操作,没有reverse操作啊。怎么能说是_mm_rsqrt_pd那?
sqrtpd 指令当然有的咯。 就是没有rsqrtpd指令。

m2213231 2006-12-22
  • 打赏
  • 举报
回复
回楼上的,rsqrt那几条汇编我是照着这段代码写的,这段代码我用objdump反汇编了,出来的汇编代码在下面

int main(void){
__m128d d;
double a[2];

d=_mm_set_pd(16,100);
d=_mm_sqrt_pd(d);
_mm_store_pd(a,d);

return 0;
}

401000: 53 push %ebx
401001: 8b dc mov %esp,%ebx
401003: 83 e4 c0 and $0xffffffc0,%esp
401006: 55 push %ebp
401007: 55 push %ebp
401008: 8b 6b 04 mov 0x4(%ebx),%ebp
40100b: 89 6c 24 04 mov %ebp,0x4(%esp)
40100f: 8b ec mov %esp,%ebp
401011: 83 ec 38 sub $0x38,%esp
401014: 66 0f 28 05 60 d1 40 movapd 0x40d160,%xmm0
40101b: 00
40101c: 66 0f 29 45 d8 movapd %xmm0,0xffffffd8(%ebp)
401021: 66 0f 28 45 d8 movapd 0xffffffd8(%ebp),%xmm0 //assign
401026: 66 0f 51 c0 sqrtpd %xmm0,%xmm0 //_mm_sqrt_pd
40102a: 66 0f 29 45 d8 movapd %xmm0,0xffffffd8(%ebp) //assign
40102f: 66 0f 28 45 d8 movapd 0xffffffd8(%ebp),%xmm0
401034: 66 0f 29 45 c8 movapd %xmm0,0xffffffc8(%ebp)
401039: 83 c4 ec add $0xffffffec,%esp
40103c: c7 04 24 00 20 41 00 movl $0x412000,(%esp)
401043: dd 45 c8 fldl 0xffffffc8(%ebp)
401046: dd 5c 24 04 fstpl 0x4(%esp)

我觉得完成_mm_rsqrt_pd指令的代码应该就是
401026: 66 0f 51 c0 sqrtpd %xmm0,%xmm0
这一行代码,与这行相邻的代码看起来应该都是完成类似赋值的操作.因此我的代码里面就只有那三条汇编指令,根据我的理解,housisong(HouSisong)的意思是rsqrtpd的opcode就是66 0f 52 c0,我也不知道对不对,只能让高手们给看看了
flyingdog 2006-12-22
  • 打赏
  • 举报
回复
rsqrtps xmm0,xmm0
的机器码应该是 0F 52 C0
你前面那个66,映像中好像是32位模式下进行16位指令的前导码。


但是rsqrtps是单精度类型呀。rsqrtpd在指令集文档中从来没有出现过,硬写也是没有这个操作码的。
至于icc的编译器,_mm_rsqrt_pd可能还有点问题。即使没有问题。icc的一条_mm_rsqrt_pd指令也可以对应几条汇编码啊。
flyingdog 2006-12-22
  • 打赏
  • 举报
回复
SSE4就是文档中提到的SSSE3,根据文档上的说明,我不认为core4不完整支持SSSE3。但是我这里没有core2做实验。
m2213231 2006-12-22
  • 打赏
  • 举报
回复
我试了,在conroe上似乎不能跑
__m128d d;
d=_mm_set_pd(16,23);

__asm{
movapd xmm0,d;

//rsqrtps xmm0,xmm0;
_EMIT 0x66;
_EMIT 0x0f;
_EMIT 0x52;
_EMIT 0xc0;

movapd d,xmm0;
}
m2213231 2006-12-22
  • 打赏
  • 举报
回复
我用cpu-z看了一下conroe,有SSE4指令集,事实可能是cpu里面有sse4的实现,但编译器没有跟上
能问一下二楼的是做什么工作的么,感觉好专业。
赖勇浩 2006-12-22
  • 打赏
  • 举报
回复
有必要自己写汇编甚至机器码吗?
不知道楼上两位大牛现在多少秒了?
housisong 2006-12-22
  • 打赏
  • 举报
回复
Core2不支持完整的SSE4

rsqrtpd 的码点 0x66+rsqrtps

硬编码就可以编译过了,但我不知道是否能在Core2上执行:)

568

社区成员

发帖
与我相关
我的任务
社区描述
英特尔® 边缘计算,聚焦于边缘计算、AI、IoT等领域,为开发者提供丰富的开发资源、创新技术、解决方案与行业活动。
社区管理员
  • 英特尔技术社区
  • shere_lin
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧