additive:加速Additive操作



如果你觉得你代码已经很快了或者已经先于我实现这个做法还是有更好算法请花时间看更重要文章

这是云风 w 中 16位 Additive 操作主要代码:

movq mm0,[esi]
movq mm3,[edi]
movq mm1,mm0
movq mm2,mm0
movq mm4,mm3
movq mm5,mm3
psllw mm1,5
psllw mm4,5
psllw mm2,11
psllw mm5,11
paddusw mm0,mm3  红色加
paddusw mm1,mm4  绿色加
paddusw mm2,mm5  蓝色加
psrlw mm1,5 
psrlw mm2,11 
pand mm0,[mask_r]
pand mm1,[mask_g]
por mm0,mm2
por mm0,mm1
movq [edi],mm0

代码整洁易懂但是没有交错排放指令如果对指令排放做进步优化可以有些提高不过不会超过5%提高直喜欢拿自己代码和云风做比较是他代码是公开 2是唯公开中够做参考这是几年前代码直没有在自己图形库中编写该操作最近重新整理代码想起加入这个操作

在动态执行cpu指令优化不是特别重要了减少指令才是优化关键废话少说先看代码:

movq mm0,[esi]
movq mm3,[edi]
movq mm1,mm0
movq mm2,mm3
pand mm0, maskRB
pand mm3, maskRB
pand mm1, maskG
pand mm2, maskG
paddusb mm0, mm3
paddusw mm1, mm2
paddusb mm0, addRB
paddusw mm1, addG
pand mm0, maskRB
pand mm1, maskG
por mm0, mm1
movq [edi],mm0

maskRB = 0xF81F * 4
maskG = 0x07E0 * 4
addRB = 0x00E0 * 4
addG = 0xF800 * 4

数数有几条代码少了很多是吗不是很好理解关键在于R B 两色利用 paddusb 同时处理了也是代码变少原因请先明白上面代码在做什么再考虑看下面代码我将进步提高效率代码如下:

movq mm0,[esi]
movq mm3,[edi]
movq mm1,mm0
movq mm2,mm3
pand mm0, maskRB
por mm3, maskG
pand mm1, maskG
por mm2, maskRB
paddusb mm0, mm3
paddusw mm1, mm2
pand mm0, mm1
movq [edi],mm0

maskRB = 0xF81F * 4
maskG = 0x07E0 * 4

比刚才还要少4条代码只有最初1/2多些代码将 src and maskG 取出 G
pand mm1, maskG
por mm2, maskRB
将 dest or maskRB 将非 G 位全置 1那么paddusw mm1, mm2 可以看出无论如何非 G 位都是 1同样R B处理也是如此最后使用 pand 来使两个结果合并至于为什么你已经知道了吧:D就算这样也不要希望有最初50%以上提高我没测试过估计能有个30%已经很不错了

代码使用常量请存在reg中
Tags:  carbonadditive additiveinverse foodadditive additive

延伸阅读

最新评论

发表评论