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

yarv-dev:1145

From: SASADA Koichi <ko1 atdot.net>
Date: Wed, 21 Nov 2007 19:44:04 +0900
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 命令を使うようなコードを出してた
んですよね.凄い.

 実際に速度比較やってみないとなんとも言えませんが,メモリアクセスが
なくなる分,速くなったりしないかなー.



miura wrote:
> 三浦です
> 
> (3) の細々とした計算はどのくらいのオーバヘッドが許されるんでしょうか?
> ちょっと変換方法を考えてみました。
> こういう話すきなのですが、ちょっと見当違いな話をしているような気もします。
> 見当違いやご迷惑であれば遠慮なく教えてください。
> 
> レジスタ上ではポインタと区別するため下位1ビットが1であるとします。
> 
> 64ビット全部書くと長くなるので、指数部を7bit, 仮数部を8bitとします
> 
> S  指数       仮数
> 1 1000110  1110011
> 
> Floatの値を3bit左ロールします。
> 
> 指数        仮数        S  指数
> 00110      1110011   1   10
> 
> 下位1ビットを1にします
> 
> 指数1        仮数     S     指数2  タグ
> 00110    1110011  1         1        1
> 
> もちろん、この内部表現は何の意味もないのですが、次のようにしたら
> 元の浮動小数点表現に戻ります。
> 
> 指数2が1のときはタグ部を0に、指数2が0のときはタグ部を1にします
> 
> 指数1        仮数     S     指数2  タグ
> 00110    1110011   1         1        0
> 
> 3ビット右ロールします。
> 
> S        指数         仮数
> 1     100110       1110011
> 
> ロール数を変えるとタグのビット数が変えられます。
> 
> ----- Original Message ----- From: "SASADA Koichi" <ko1 atdot.net>
> To: <yarv-dev quickml.atdot.net>
> Sent: Tuesday, November 20, 2007 7:46 PM
> Subject: [yarv-dev:1126] Re: 考えている案
> 
> 
>>  ささだです.
>>
>> miura wrote:
>>> (2) の1bit犠牲にするのを指数部にして、もし演算結果が7bitの指数で表せない
>>> ときはIEEE 754のちゃんとしたフォーマットをヒープにとるというのはどうで
>>> しょうか?
>>
>>  (3) は,まさにそれを考えていました.exp は 11bit だから,10bit に
>> なりますね.
>>
>> -- 
>> // SASADA Koichi at atdot dot net
>>
>> -- 
>> ML: yarv-dev quickml.atdot.net
>> Info: http://www.atdot.net/~ko1/quickml
>>
> 
> 
> 
> -- 
> ML: yarv-dev quickml.atdot.net
> Info: http://www.atdot.net/~ko1/quickml


-- 
// SASADA Koichi at atdot dot net

--
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]