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]