龙芯开源社区

 找回密码
 注册新用户(newuser)
查看: 1322|回复: 2

龙芯3A2000上,发现 dsll 指令不能用于 at 寄存器

  [复制链接]
发表于 2016-5-30 14:32:16 | 显示全部楼层 |阅读模式
本帖最后由 Wiener 于 2016-5-31 09:00 编辑

and, or 两个指令,用32位立即数做参数时,我所用的GCC编译器,隐含用了 at寄存器。
例如:
and t0, 0xc0000000
实际展开为:
li $at, 0xc000
dsll $at,$at,0x10 //这一条指令会导致3A2000死机。如果 dsll 对别的寄存器操作,不会有问题。
and t0,t0, $at

后来做了等价转换:
#if defined(__GNUC__)  //这三条等价指令,可以正常启动单板。
         lui        $at,0xc000
         ori        $at,$at,0x0
         and        t0,t0,$at
#else        
        and        t0, 0xc0000000                /* 检查位 30 和 31 */
#endif

以上是实际调试的结果。我想知道这是硬件bug, 还是at寄存器就不能这样用?
发表于 2016-5-31 09:44:06 | 显示全部楼层
可以确定用户态 dsll $at, $at, 0x10 没有问题,以前经常用的。
 楼主| 发表于 2016-6-14 16:19:51 | 显示全部楼层
简直汗颜,今天在系统启动的第一个汇编文件里,用了 dsll $at, $at, 0x10竟然没有问题!
可是上次确实是在异常处理的汇编文件里,用dsll $at, $at, 0x10就是死机,而替换成等价指令就好了。
如果与硬件没有关系的话,那还能与什么有关系?真是没见过这种现象。

本版积分规则

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

GMT+8, 2019-3-21 19:35 , Processed in 0.182028 second(s), 19 queries .

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