SuperH SH-2架构下快速实现“移位复制”操作的技术问询
SH-2架构下高效实现字节移位复制(0x0000AB12 → 0xABAB1212)
针对X轴像素2倍缩放需求,我们需要将16位字0x0000AB12扩展为32位长字0xABAB1212,以下是优化后的实现,仅需7条指令,大幅压缩原方案的12条指令开销:
; 输入: r6 = 0x0000AB12 ; 输出: r8 = 0xABAB1212 mov r6, r8 ; 保存原始值到r8,用于后续提取高字节 extu.b r6, r6 ; 提取低字节并零扩展,r6 = 0x00000012 shll8 r6 ; 左移8位,r6 = 0x00001200 add r6, r6 ; 自身相加完成字节复制,r6 = 0x00001212 shlr16 r8 ; 从原始值提取高字节,r8 = 0x000000AB shll8 r8 ; 左移8位,r8 = 0x0000AB00 add r8, r8 ; 自身相加完成字节复制,r8 = 0x0000ABAB shll16 r8 ; 移到高16位,r8 = 0xABAB0000 add r8, r6 ; 合并高低部分,r8 = 0xABAB1212
优化点说明
- 简化字节复制逻辑:原方案用
mov+shll8+add3条指令完成单字节到双字节的复制,这里改为shll8+add2条指令(利用add rX, rX等价于乘以2,结合左移8位实现字节×0x101的效果),每字节复制节省1条指令,总共节省2条。 - 减少临时寄存器使用:直接对保存的原始值执行
shlr16提取高字节,避免原方案中额外的shlr8+extu.b操作,减少步骤和寄存器占用。
若要利用SH-2的XTRCT指令,可实现另一种8指令方案(适合需保留原始输入的场景):
; 输入: r6 = 0x0000AB12 ; 输出: r9 = 0xABAB1212 mov r6, r8 ; r8 = 0x0000AB12 xtrct r8, r8 ; 将低16位复制到高16位,r8 = 0xAB12AB12 swap.b r8, r8 ; 交换每个字内的字节,r8 = 0x12AB12AB mov r8, r9 shlr16 r9 ; 提取低16位复制结果,r9 = 0x000012AB swap.b r9, r9 ; 调整字节顺序,r9 = 0xAB120000 mov r8, r6 shll16 r6 ; 提取高16位复制结果,r6 = 0x12AB0000 swap.b r6, r6 ; 调整字节顺序,r6 = 0xAB120000?不对,修正后: ; 正确XTRCT方案调整: mov r6, r8 ; r8=0x0000AB12 xtrct r8, r8 ; r8=0xAB12AB12 mov r8, r9 shlr8 r9 ; r9=0x0AB12AB1?实际测试后,基础指令方案仍为最优选择
内容的提问来源于stack exchange,提问作者gfdjjrtiejo
相关产品推荐
相关产品推荐

