トップ «前の日記(2009-03-15) 最新 次の日記(2009-03-17)» 編集

はじめてのにき

ここの位置付け

2004|11|
2005|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|11|12|
2020|01|02|03|04|05|06|07|08|09|10|11|12|
2021|01|02|03|04|05|06|07|08|09|10|11|12|
2022|01|02|03|04|05|06|07|

ToDo:


2009-03-16

_ bitfield

typedef struct {
    unsigned long long a: 1;
    unsigned long long ll: 50;
    unsigned int r;
} S;

に対して

   S s;
   s.ll = 0x123456789aULL;

がこうなる。 こう長くなっちゃうと 最適化しないコンパイラの方が読みにくいとおもう

8048459:       48 b8 9a 78 56 34 12    mov    $0x123456789a,%rax
8048460:       00 00 00
8048463:       48 c7 c1 9a 78 56 34    mov    $0x3456789a,%rcx
804846a:       48 89 ca                mov    %rcx,%rdx
804846d:       89 55 ec                mov    %edx,-0x14(%rbp)
8048470:       48 89 c2                mov    %rax,%rdx
8048473:       89 4d e8                mov    %ecx,-0x18(%rbp)
8048476:       8b 4d ec                mov    -0x14(%rbp),%ecx
8048479:       48 89 55 e0             mov    %rdx,-0x20(%rbp)
804847d:       8b 55 e8                mov    -0x18(%rbp),%edx
8048480:       48 8b 4d e0             mov    -0x20(%rbp),%rcx
8048484:       48 89 45 d8             mov    %rax,-0x28(%rbp)
8048488:       48 b8 ff ff 03 00 00    mov    $0x3ffff,%rax
804848f:       00 00 00
8048492:       48 21 c1                and    %rax,%rcx
8048495:       48 89 c8                mov    %rcx,%rax
8048498:       48 c1 e0 01             shl    $0x1,%rax
804849c:       48 8b 4d f0             mov    -0x10(%rbp),%rcx
80484a0:       48 ba 01 00 f8 ff ff    mov    $0xfffffffffff80001,%rdx
80484a7:       ff ff ff
80484aa:       48 21 d1                and    %rdx,%rcx
80484ad:       48 89 c2                mov    %rax,%rdx
80484b0:       48 89 c8                mov    %rcx,%rax
80484b3:       48 09 c2                or     %rax,%rdx
80484b6:       48 89 d0                mov    %rdx,%rax
80484b9:       48 89 45 f0             mov    %rax,-0x10(%rbp)

(00:20)

_ マジメに追わんとわからん

8048459:       48 b8 9a 78 56 34 12    mov    $0x123456789a,%rax
8048460:       00 00 00
8048463:       48 c7 c1 9a 78 56 34    mov    $0x3456789a,%rcx
804846a:       48 89 ca                mov    %rcx,%rdx
804846d:       89 55 ec                mov    %edx,-0x14(%rbp) // 32, 0x3456789a
8048470:       48 89 c2                mov    %rax,%rdx
8048473:       89 4d e8                mov    %ecx,-0x18(%rbp) // 32, 0x3456789a
8048476:       8b 4d ec                mov    -0x14(%rbp),%ecx
8048479:       48 89 55 e0             mov    %rdx,-0x20(%rbp) // 64, 0x123456789a
// uint32 edx = 0x3456789a;
804847d:       8b 55 e8                mov    -0x18(%rbp),%edx
// uint64 rcx = 0x123456789a;
8048480:       48 8b 4d e0             mov    -0x20(%rbp),%rcx
8048484:       48 89 45 d8             mov    %rax,-0x28(%rbp) // 64, 0x123456789a
8048488:       48 b8 ff ff 03 00 00    mov    $0x3ffff,%rax
804848f:       00 00 00
// uint64 rcx = 0x3ffff & 0x123456789a; // 18bit from LSB
8048492:       48 21 c1                and    %rax,%rcx
8048495:       48 89 c8                mov    %rcx,%rax
// uint64 rax = (0x3ffff & 0x123456789a) << 1;
8048498:       48 c1 e0 01             shl    $0x1,%rax
804849c:       48 8b 4d f0             mov    -0x10(%rbp),%rcx
80484a0:       48 ba 01 00 f8 ff ff    mov    $0xfffffffffff80001,%rdx
80484a7:       ff ff ff
80484aa:       48 21 d1                and    %rdx,%rcx
80484ad:       48 89 c2                mov    %rax,%rdx
80484b0:       48 89 c8                mov    %rcx,%rax
80484b3:       48 09 c2                or     %rax,%rdx
80484b6:       48 89 d0                mov    %rdx,%rax
80484b9:       48 89 45 f0             mov    %rax,-0x10(%rbp)

なるほどね。 bitmask が根本的に間違ってるよ。 OK 一見 fix できてる。 つかたぶんこれ x86 でも動くな。

(01:13)

_ いやああ

> cat bitfield_ll2.c
#include <stdio.h>

int main() {
    struct sbf2 {
        long long f1 : 3;
    } st2;
    st2.f1 = 3;
    printf("%lld\n", st2.f1);
}
> gcc bitfield_ll2.c && ./a.out
3
> gcc -m32 bitfield_ll2.c && ./a.out
-18650500345888765

GCC ってこのへんどうなの…

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=7018

うーん int より小さいものに long long 使うなってか。

(02:28)

_ とりあえず

なおったことにしよう。

次は transcode.c のマクロか。 なんか思う存分回り道してるな…

他の TODO 忘れすぎだし

(02:49)

_ jaiku

http://code.google.com/p/jaikuengine/

opensource すか。

177348  642108 6749045 total

web service の OSS 化って珍しい気もするな。 OpenPNE とかあるか。

一見だからどうした感は否めないけど、 OpenPNE とかみたいにプラグインとかつくれるんなら なんかコミュニティごとに立てるとかできたりするんかいな。 ちなみに OpenPNE に本当にプラグインがあるかは知りません

(03:04)

_ 24

http://d.hatena.ne.jp/kazuhooku/20090216/1234771983

さすがに 24 はうざいかなあ… とループ書いてみたけど sscanf の方が良い気もした。

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

int main() {
    int i;
    char* buf = "1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24";
    unsigned hits[24];
    char* p;
    for (p = buf, i = 0;; i++) {
        hits[i] = strtol(p, &p, 10);
        if (!*p) break;
        assert(*p == ',');
        p++;
    }
    assert(i == 23);

    for (i = 0; i < 24; i++) {
        assert(i+1 == hits[i]);
    }
}

要は assert がうざいのだけど、 strtok は微妙だし strtok_r も標準じゃないしなぁとかいう。 やっぱ split/join は必要なんだよなぁ。

(10:30)

_ TCC のマクロ

#include <stdio.h>
int A = 1;
#define A 1+A
#define B(x) x
int main() {
    printf("%d\n", B(A));
}

で TCC が 3 とか出力しやがってこまる。 おそらく、 B(A) => B(1+A) => 1+A => 1+1+A の順番で展開されてそうに思える。

でも K&R にある

#define cat(x, y) x ## y
cat(cat(1,2), 3)

とかいう例でちゃんとコンパイルコケるってことは 外からやってるのかなぁ。

(11:18)

本日のツッコミ(全1件) [ツッコミを入れる]
_ Wcikoeqt (2014-05-24 10:42)

この間も俊太郎の詩をお http://www.stlouisbusinesslist.com/business/5021837.htm?info=viagra buy viagra :O

お名前:
E-mail:
コメント:
人生、宇宙、すべての答え
本日のリンク元

2009年
3月
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
1.shinh(2014-05-24 10:42) 2.団子厨(2014-05-24 10:42) 3.shinh(2014-05-24 10:42)
search / home / index

全てリンクフリーです。 コード片は自由に使用していただいて構いません。 その他のものはGPL扱いであればあらゆる使用に関して文句は言いません。 なにかあれば下記メールアドレスへ。

shinichiro.hamaji _at_ gmail.com / shinichiro.h