龙芯开源社区

 找回密码
 注册新用户(newuser)
楼主: comcat

龙芯版memcpy 的实现

[复制链接]
发表于 2007-12-31 19:34:46 | 显示全部楼层
呵呵 fans也开始研究汇编了么

不考虑移植的话(铁了心用龙芯)  汇编是个不错的实现语言  听说求伯君就是汇编高手 可以刷刷地写出大把的汇编代码  即使在windows上  也有不少汇编的铁杆拥护者
发表于 2008-5-22 10:42:50 | 显示全部楼层
原帖由 comcat 于 2007-5-9 18:47 发表
A. 短循环展开

该改进的思想来源于前段时间的代码分析,参见《龙芯汇编语言的艺术》

65-73 行负责处理小于16字节的部分,可以展开成如下代码:

        last16:
                blez        a2, 2f
                addiu        a2, a2, -1
                sll                a2, a2, 2                                        # a2 <-- a2 * 4

                la                a3, 1f
                subu        a3, a3, a2

                lb                $15, 0(a1)

                jr                a3
                  addiu a3, 2f-1f
               
                lb                $16, 15(a1)
                lb                $17, 14(a1)
                lb                $18, 13(a1)
                lb                $19, 12(a1)
                lb                $20, 11(a1)
                lb                $21, 10(a1)
                lb                $22, 9(a1)
                lb                $23, 8(a1)
                lb                $8, 7(a1)
                lb                $9, 6(a1)
                lb                $10, 5(a1)
                lb                $11, 4(a1)
                lb                $12, 3(a1)
                lb                $13, 2(a1)
                lb                $14, 1(a1)
        1:        jr                a3
                  sw    $15, 0(a0)
               
                sb                $16, 15(a0)
                sb                $17, 14(a0)
                sb                $18, 13(a0)
                sb                $19, 12(a0)
                sb                $20, 11(a0)
                sb                $21, 10(a0)
                sb                $22, 9(a0)
                sb                $23, 8(a0)
                sb                $8, 7(a0)
                sb                $9, 6(a0)
                sb                $10, 5(a0)
                sb                $11, 4(a0)
                sb                $12, 3(a0)
                sb                $13, 2(a0)
                sb                $14, 1(a0)
        2:  jr                ra
                nop

注意:16~23 号寄存器,使用前需保存,完了要恢复。
...


最近我也在搞这个函数  如果把短循环展开的话  会用到s0~s7这8个须保存的寄存器  这样又会多出8条读存指令和8条写存指令  是不是有点得不偿失啊

真要展开的话 应把问题规模缩小  比如处理最后8字节而不是16字节 就可避免s0~s7的保存
发表于 2008-5-23 15:56:07 | 显示全部楼层
原帖由 water 于 2008-5-22 10:42 发表


最近我也在搞这个函数  如果把短循环展开的话  会用到s0~s7这8个须保存的寄存器  这样又会多出8条读存指令和8条写存指令  是不是有点得不偿失啊

真要展开的话 应把问题规模缩小  比如处理最后8字节而不是 ...


换一个思路  也可以保存s0~s7这8个寄存器  这样原先前面程序中每次只拷贝64字节 在增加可使用寄存器后可一次处理128个字节  应该可以节省不少时间

另  这个版块没人讨论技术了啊  呵呵  倒象是各种软件的消息发布平台
发表于 2008-8-28 09:08:42 | 显示全部楼层
读的快,写的慢,把mem*.S改改是有很大潜力的
发表于 2008-8-28 10:58:00 | 显示全部楼层

回复 #33 water 的帖子

写个lib吧, 把对 libc 的优化都放进去, 然后用环境变量挂在 libc前面.
类似于这样:
export LD_PRELOAD=$LD_PRELOAD:/usr/lib/libmemcopy.so
会取代libc里面的函数, debian的性能会有很大提升的.

debian软件库中的fl-cow软件就是个例子
fl-cow实现的是文件改前复制功能, 解决硬链接文件的修改.
发表于 2008-8-28 11:10:31 | 显示全部楼层

回复 #35 刘世伟 的帖子

呵呵  俺学习用的是纯汇编  不使用libc的  目前写的函数数量也很少  还不能成为新的lib  学习尚未成功啊
发表于 2008-8-28 17:34:03 | 显示全部楼层
只写个memcpy的函数,用外挂的方式替换掉libc里面的memcpy也好呀.
发表于 2008-8-28 18:42:26 | 显示全部楼层
呵呵  凑和着用吧
发表于 2008-8-29 17:25:37 | 显示全部楼层
原帖由 water 于 2008-5-23 15:56 发表


换一个思路  也可以保存s0~s7这8个寄存器  这样原先前面程序中每次只拷贝64字节 在增加可使用寄存器后可一次处理128个字节  应该可以节省不少时间

另  这个版块没人讨论技术了啊  呵呵  倒象是各种软 ...

是啊
发表于 2008-8-29 17:29:05 | 显示全部楼层
原帖由 water 于 2007-12-31 19:34 发表
呵呵 fans也开始研究汇编了么

不考虑移植的话(铁了心用龙芯)  汇编是个不错的实现语言  听说求伯君就是汇编高手 可以刷刷地写出大把的汇编代码  即使在windows上  也有不少汇编的铁杆拥护者

是挺好玩的,不过感觉没地用。

本版积分规则

小黑屋|手机版|Archiver|Lemote Inc.  

GMT+8, 2019-8-25 09:18 , Processed in 0.191427 second(s), 18 queries .

快速回复 返回顶部 返回列表