免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3583 | 回复: 10
打印 上一主题 下一主题

x86有没有这样的指令? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-02-17 15:53 |只看该作者 |倒序浏览
满足这3个条件:

1, 两个操作数, 一个是寄存器, 一个是内存;
2, 指令的结果写到固定的寄存器, 而且不是输入操作数;
3, 该指令的两个操作数,语义上是可以交换的(例如 a+b和b+a)

谢谢

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
2 [报告]
发表于 2009-02-17 16:06 |只看该作者
乘法有点像,但指令不是两个操作数,乘项的寄存器是固定的

论坛徽章:
0
3 [报告]
发表于 2009-02-17 18:00 |只看该作者

回复 #2 cjaizss 的帖子

i386.md里有这样的指令定义:
(define_insn "addhi3_carry"
  [(set (match_operand:HI 0 "nonimmediate_operand" "=rm,r")
          (plus:HI (plus:HI (match_operand:HI 3 "ix86_carry_flag_operator" "")
                            (match_operand:HI 1 "nonimmediate_operand" "%0,0"))
                   (match_operand:HI 2 "general_operand" "ri,rm")))
   (clobber (reg:CC FLAGS_REG))]
  "ix86_binary_operator_ok (PLUS, HImode, operands)"
  "adc{w}\t{%2, %0|%0, %2}"
  [(set_attr "type" "alu")
   (set_attr "pent_pair" "pu")
   (set_attr "mode" "HI")])

(

我想知道, 在我们写汇编代码时,如何能使gcc使用这个定义? 现在想做个实验,真是太困难了:

就是让gcc智能的判断, 加法(乘法)等符合交换律的指令, 我不介意结果写到哪里, 但是如果它发现交换两个操作数会更高效,那么就交换一下。

论坛徽章:
0
4 [报告]
发表于 2009-02-17 18:24 |只看该作者
可能没有,如果同时满足的话,可能没有。

论坛徽章:
0
5 [报告]
发表于 2009-02-17 18:53 |只看该作者
过去的CPU指令系统有。如早期的IBM的CPU,很典型的CISC。
MPU出现后,指令中的寻址方式安排形成一个惯例:如果有两个源操作数,则其中一个与目的操作数合二为一。按这种设计,楼主的要求没法满足。

论坛徽章:
0
6 [报告]
发表于 2009-02-18 10:42 |只看该作者

回复 #5 beepbug 的帖子

那gcc里的addhi3指令, 是在什么场合下使用的? 我都不知道向谁请教这x86 backend的问题了, 到新闻组问, 回答言简意赅, 看不懂!

论坛徽章:
0
7 [报告]
发表于 2009-02-18 16:05 |只看该作者
原帖由 albcamus 于 2009-2-18 10:42 发表
那gcc里的addhi3指令, 是在什么场合下使用的? 我都不知道向谁请教这x86 backend的问题了, 到新闻组问, 回答言简意赅, 看不懂!

gcc里的addhi3指令?你说的到底是编译器里的伪指令、宏指令,还是CPU的机器指令?

论坛徽章:
0
8 [报告]
发表于 2009-02-18 17:37 |只看该作者
原帖由 beepbug 于 2009-2-18 16:05 发表

gcc里的addhi3指令?你说的到底是编译器里的伪指令、宏指令,还是CPU的机器指令?


编译器里的定义。 何种场合下, gcc会用上这个定义?

论坛徽章:
0
9 [报告]
发表于 2009-02-19 12:59 |只看该作者
(define_insn "addhi3_carry" 我可以确定的这个 rtl 绝对不是 GCC 内部使用的,一定是对应 汇编指令 的一个 rtl ,因为这是 define_insn 而不是 define_expand 。至于意思就不清楚了。这个 carry 不知道有什么意思在里面。
顺便请教lz,知道[(set (match_operand:HI 0 "nonimmediate_operand" "=rm,r") 中的 "=rm,r" 定义在哪里么? (match_operand:HI 1 "nonimmediate_operand" "%0,0")) 中的"%0,0"又是什么意思?谢谢。

论坛徽章:
0
10 [报告]
发表于 2009-02-19 15:40 |只看该作者
原帖由 prolj 于 2009-2-19 12:59 发表 [url=http://linux.chinaunix.net/bbs/redirect.php?goto=findpost&pid=6902400&



(define_insn "addhi3_carry" 我可以确定的这个 rtl 绝对不是 GCC 内部使用的,一定是对应 汇编指令 的一个 rtl ,因为这是 define_insn 而不是 define_expand 。至于意思就不清楚了。这个 carry 不知道有什么意思在里面。
顺便请教lz,知道[(set (match_operand:HI 0 "nonimmediate_operand" "=rm,r") 中的 "=rm,r" 定义在哪里么? (match_operand:HI 1 "nonimmediate_operand" "%0,0")) 中的"%0,0"又是什么意思?谢谢。




仔细看了一下, 果然是对应adc{w}指令的。 carry指的是把eflags寄存器里的CF标志也加上。

后面的不怎么清楚,猜测“rm“是可以为寄存器也可以为内存地址, 这就是目的operand。 而HI表示byte-addressable 寄存器的[8:15]比特,例如ah、bh寄存器。  gcc为adcl定义的则是addsi, SI指SINGLE INTEGER, 完整的32bit。 这条指令定义中有3个操作数, %0, %1, %2, 其中%0和%1必须是同一个,我是这么猜测的。 FIXME。


PS, 您有时间帮我看看DJ大牛的回答吗? 我水平太差了,还是没看懂(尤其最后一封mail):

http://groups.google.com/group/c ... 5015e247271c5?pli=1
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP