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]