[前][次][番号順一覧][スレッド一覧][生データ]

yarv-dev:1146

From: "miura" <m-72 tf6.so-net.ne.jp>
Date: Wed, 21 Nov 2007 20:34:17 +0900
Subject: [yarv-dev:1146] Re: 考えている案

三浦です

私のメールでプログラムまで作ってもらってありがとうございます。
ロールじゃなくてローテートですね。間違えて覚えていました。

ローテート命令はインラインアセンブラで直接書かないと出てこないかな
と思っていたのですが、出てくるんですね。びっくりしました。
それでも、アセンブルリストを見ると何行か削れそうな部分が出てきて
手を入れたくなります。Rubyではアセンブリ言語はご法度なんでしょ
うが。

昔、Green Hills Cで
 (x > 0) ? x : -x
みたいなコードが、
  (x >> 31) ^ x + ((unsigned)x >> 31)
みたいにコンパイルされてびっくりしたことがあります。


----- Original Message ----- 
From: "SASADA Koichi" <ko1 atdot.net>
To: <yarv-dev quickml.atdot.net>
Sent: Wednesday, November 21, 2007 7:44 PM
Subject: [yarv-dev:1145] Re: 考えている案


>  ささだです.
>
>  なるほど,rotate を使うと,うまいこと削りたいところが頭出しされる
> のですね.すごい.頭が悪いので,こういう bit 演算が苦手なんです.
>
>  というわけで,ちょっと作ってみました.
>
> typedef unsigned long long VALUE;
>
> VALUE
> d2v(double d)
> {
>    union {
> double d;
> VALUE v;
>    } u;
>    u.d = d;
>    return u.v;
> }
>
> double
> v2d(VALUE v)
> {
>    union {
> double d;
> VALUE v;
>    } u;
>    u.v = v;
>    return u.d;
> }
>
> #define ROTL(v, n) (((v) << (n)) | ((v) >> ((sizeof(v) * 8) - n)))
> #define ROTR(v, n) (((v) >> (n)) | ((v) << ((sizeof(v) * 8) - n)))
>
> VALUE
> DOUBLE2VALUE(double d)
> {
>    VALUE v1 = d2v(d);
>    VALUE v2 = ROTL(v1, 3);
>
>    if ((v2 & 0x01) ^ ((v2 >> 1) & 0x01)) {
> return v2 | 0x01;
>    }
>    else {
> /* from heap */
> return -1;
>    }
> }
>
> double
> VALUE2DOUBLE(VALUE v)
> {
>    VALUE v1 = v ^ ((v >> 1) & 0x01);
>    VALUE v2 = ROTR(v1, 3);
>    return v2d(v2);
> }
>
>  x64 用 gcc -O3 の結果です.
>
> DOUBLE2VALUE:
> .LFB16:
> movd %xmm0, %rcx
> movq $-1, %rax
> movq %xmm0, -8(%rsp)  # これ無駄では...
> rolq $3, %rcx
> movq %rcx, %rdx
> movq %rcx, %rsi
> orq $1, %rcx
> shrq %rdx
> andl $1, %esi
> andl $1, %edx
> cmpq %rdx, %rsi
> cmovne %rcx, %rax
> ret
>
> VALUE2DOUBLE:
> .LFB17:
> movq %rdi, %rax
> shrq %rax
> andl $1, %eax
> xorq %rax, %rdi
> rorq $3, %rdi
> movq %rdi, -8(%rsp)
> movlpd -8(%rsp), %xmm1
> movsd %xmm1, %xmm0
> ret
>
>
> 感動したところ:
> ・jmp 命令が無い!(まぁ,コード小さいから)
> ・rol, ror 命令使ってるよ!
> ・短い!
>
>  いやぁ,凄い.実は,rotate 命令を使うかどうか,昨日ちょっと調べて
> みると,gcc 2.95 でも -O0 で rotate 命令を使うようなコードを出してた
> んですよね.凄い.
>
>  実際に速度比較やってみないとなんとも言えませんが,メモリアクセスが
> なくなる分,速くなったりしないかなー.
>



--
ML: yarv-dev quickml.atdot.net
Info: http://www.atdot.net/~ko1/quickml

[前][次][番号順一覧][スレッド一覧][生データ]

      1122 2007-11-20 19:08 [ko1 atdot.net       ] 考えている案                            
      1123 2007-11-20 19:25 ┣[horinout rish.kyoto-]                                       
      1124 2007-11-20 19:33 ┃┣[ko1 atdot.net       ]                                     
      1127 2007-11-20 19:52 ┃┣[horinout rish.kyoto-]                                     
      1129 2007-11-20 20:05 ┃┃┗[ko1 atdot.net       ]                                   
      1130 2007-11-20 20:21 ┃┃ ┗[horinout rish.kyoto-]                                 
      1131 2007-11-20 20:24 ┃┃  ┗[ko1 atdot.net       ]                               
      1132 2007-11-20 20:32 ┃┗[2008 shudo.net      ]                                     
      1133 2007-11-20 20:53 ┃ ┗[horinout rish.kyoto-]                                   
      1137 2007-11-20 21:15 ┃  ┗[2008 shudo.net      ]                                 
      1125 2007-11-20 19:39 ┣[m-72 tf6.so-net.ne.j]                                       
      1126 2007-11-20 19:46 ┃┗[ko1 atdot.net       ]                                     
      1128 2007-11-20 19:58 ┃ ┣[m-72 tf6.so-net.ne.j]                                   
      1135 2007-11-20 20:59 ┃ ┗[m-72 tf6.so-net.ne.j]                                   
      1145 2007-11-21 19:44 ┃  ┗[ko1 atdot.net       ]                                 
->    1146 2007-11-21 20:34 ┃   ┗[m-72 tf6.so-net.ne.j]                               
      1134 2007-11-20 20:54 ┣[2008 shudo.net      ]                                       
      1144 2007-11-21 08:39 ┃┗[ko1 atdot.net       ]                                     
      1140 2007-11-21 03:52 ┣[t_nissie yahoo.co.jp] 富豪的 VALUE 型( Re: 考えている案)  
      1141 2007-11-21 04:57 ┃┗[ko1 atdot.net       ]                                     
      1142 2007-11-21 05:29 ┃ ┗[t_nissie yahoo.co.jp]                                   
      1143 2007-11-21 06:02 ┃  ┗[ko1 atdot.net       ]                                 
      1147 2007-11-24 12:56 ┗[m-72 tf6.so-net.ne.j]                                       
      1148 2007-11-24 13:10  ┣[ko1 atdot.net       ]                                     
      1152 2007-11-25 08:51  ┃┗[m-72 tf6.so-net.ne.j]                                   
      1149 2007-11-24 13:18  ┣[ko1 atdot.net       ]                                     
      1150 2007-11-24 13:21  ┗[ko1 atdot.net       ]                                     
      1151 2007-11-24 13:39   ┗[m-72 tf6.so-net.ne.j]