xyfree 发表于 2010-05-17 21:22

删帖吧

本帖最后由 xyfree 于 2012-01-21 03:36 编辑

EricFisher 发表于 2010-05-17 22:33

这是一个有意思的问题,回头编译一下,看看。

OwnWaterloo 发表于 2010-05-17 23:32

div, ldiv ……

jzhang918 发表于 2010-05-18 01:45

回复 1# xyfree


    有些编译器是会做这样的优化的。比如GCC的一些target。

aaaaa5aa 发表于 2010-05-18 08:00

优化也不可能改变算法吧

EricFisher 发表于 2010-05-18 09:14

$ cat mult.cextern int a, b, c, d;

void
fun (void)
{
a = c / d;
b = c % d;
}
$ mips64el-linux-gcc -S mult.c
$ cat mult.s      div   $0,$3,$2
      teq   $2,$0,7
      mfhi    $3
      mflo    $2
      move    $3,$2
      lw      $2,%got_disp(a)($4)
      sw      $3,0($2)
      lw      $2,%got_disp(c)($4)
      lw      $3,0($2)
      lw      $2,%got_disp(d)($4)
      lw      $2,0($2)
      div   $0,$3,$2
      teq   $2,$0,7
      mfhi    $2
      move    $3,$2
$ mips64el-linux-gcc -S mult.c -O3
$ cat mult.s      lui   $5,%hi(__gnu_local_gp)
      addiu   $5,$5,%lo(__gnu_local_gp)
      lw      $2,%got_disp(c)($5)
      lw      $4,%got_disp(a)($5)
      lw      $3,0($2)
      lw      $2,%got_disp(d)($5)
      lw      $2,0($2)
      div   $0,$3,$2
      teq   $2,$0,7
      mflo    $3
      sw      $3,0($4)
      lw      $3,%got_disp(b)($5)
      mfhi    $2
      j       $31
      sw      $2,0($3)

jzhang918 发表于 2010-05-18 12:22

回复 5# aaaaa5aa


    有些处理器有这样的指令,这个指令可以同时得到商和余数。如果你的处理器有这样的指令,编译器就有可能做这样的优化,把除法和取余两个运算合并成一条指令。

jzhang918 发表于 2010-05-18 12:36

回复 6# EricFisher


    我查了一下mips的指令手册,它的div就会同时产生商和余数。

EricFisher 发表于 2010-05-18 13:41

是的

aaaaa5aa 发表于 2010-05-18 19:08

有些处理器有这样的指令,这个指令可以同时得到商和余数。如果你的处理器有这样的指令,编译器就有可能做这样的优化,把除法和取余两个运算合并成一条指令。

哦,这样
页: [1] 2
查看完整版本: 删帖吧