忍者ブログ

なんだか

知らないほうが幸せかもしれない

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

mingw32のmsys上でrx-elf-gcc(4.7.2)を作ってみた

mingw32およびmsysのインストール後、mingwのwgetをインストールする。

mingw32のshellを起動する
mingw-getでパケージ管理できるようになってました。(2013.01.22)

$ mingw-get install msys-wget msys-libbz2

$ cd /mingw
$ wget http://sourceforge.net/projects/mingw/files/MinGW/Base/gmp/gmp-5.0.1-1/gmp-5.0.1-1-mingw32-dev.tar.lzma/download
$ tar xJf gmp-5.0.1-1-mingw32-dev.tar.lzma
$ wget http://sourceforge.net/projects/mingw/files/MinGW/Base/mpfr/mpfr-2.4.1-1/mpfr-2.4.1-1-mingw32-dev.tar.lzma/download
$ tar xJf mpfr-2.4.1-1/mpfr-2.4.1-1-mingw32-dev.tar.lzma
$ wget http://sourceforge.net/projects/mingw/files/MinGW/Base/mpc/mpc-0.8.1-1/mpc-0.8.1-1-mingw32-dev.tar.lzma/download
$ tar xJf mpc-0.8.1-1-mingw32-dev.tar.lzma

$ mingw-get install mingw32-libiconv-dev mingw32-gmp-dev mingw32-mpfr-dev mingw32-mpc-dev

$ notepad /etc/fstab
C:\rx-elf /rx-elf
を追加する

$ cd ~
$ mkdir binutils
$ wget http://www.dnsbalance.ring.gr.jp/archives/GNU/binutils/binutils-2.23.1.tar.bz2
$ tar xjf binutils-2.23.1.tar.bz2
$ mkdir rx-elf
$ cd rx-elf
$ ../binutils-2.23.1/configure --prefix=/rx-elf --target=rx-elf
$ make
$ make install
$ export PATH=/rx-elf/bin:$PATH
$ cd ../..
$ mkdir gcc
$ cd gcc
$ wget http://www.dnsbalance.ring.gr.jp/archives/lang/egcs/releases/gcc-4.7.2/gcc-4.7.2.tar.bz2
$ tar xjf gcc-4.7.2.tar.bz2
$ mkdir rx-elf
$ cd rx-elf
$ ../gcc-4.7.2/configure --prefix=/rx-elf --target=rx-elf --enable-languages=c --disable-win32-registry
$ make all-gcc
$ make install-gcc
$ cd ../..
$ mkdir newlib
$ cd newlib
$ wget newlib-2.0.0.tar.gz
$ tar xf newlib-2.0.0.tar.gz
$ mkdir rx-elf
$ cd rx-elf
$ ../newlib-2.0.0/configure --prefix=/rx-elf  --target=rx-elf
$ make
$ make install
$ cd ../../gcc
$ rm rx-elf -fr
$ mkdir rx-elf
$ cd rx-elf
$ ../gcc-4.7.2/configure --prefix=/rx-elf --target=rx-elf --enable-languages=c,c++ --disable-win32-registry --with-newlib
$ make
$ make install
$ LANG=ja_JP@ rx-elf-gcc -v
組み込み spec を使用しています。
COLLECT_GCC=C:\rx-elf\bin\rx-elf-gcc.exe
COLLECT_LTO_WRAPPER=c:/rx-elf/bin/../libexec/gcc/rx-elf/4.7.2/lto-wrapper.exe
ターゲット: rx-elf
configure 設定: ../gcc-4.7.2/configure --prefix=/rx-elf --target=rx-elf --enable-languages=c,c++ --disable-win32-registry
スレッドモデル: single
gcc バージョン 4.7.2 (GCC)

拍手[0回]

PR

h8300-elf-gccでちょっと

h8300-elf-gccで-msx(h8sx)指定だとbtst命令をうまく使ってくれません。

例のごとく、h8300.mdを眺めて見つけました。

(define_insn ""
[(set (cc0) (compare
(zero_extract:HI (match_operand:HI 0 "register_operand" "r")
(const_int 1)
(match_operand 1 "const_int_operand" "n"))
(const_int 0)))]
"TARGET_H8300"
"btst %Z1,%Y0"
[(set_attr "length" "2")
(set_attr "cc" "set_zn")])

なぜか、-msxのときは、このパターンでないとbtstを使わないようです。

-ms,-mh指定の時はなぜか大丈夫なところがなんとなく納得できないところ

拍手[0回]

gccのコンパイルが早くならないかな

gccが4.4の頃に見つけた方法なんです。

>通常、 malloc() は、ヒープからメモリを割り当て、必要に応じてヒープのサイズを sbrk(2) を使って調節する。

sbrkの呼び出しが多いとkernelの負荷が馬鹿にならないようです。

先に大量にmallocしておいて、開放しておけば、sbrkの呼び出しが減らせるのではと考えたわけです。

早くなってるかどうかはわからないが、sbrkの呼び出しは減ってるかな。

--- a/libiberty/xmalloc.c.1024 2005-05-25 06:01:33.000000000 +0900
+++ b/libiberty/xmalloc.c 2009-11-17 17:42:36.901024875 +0900
@@ -100,6 +100,30 @@ static const char *name = "";
/* The initial sbrk, set when the program name is set. Not used for win32
ports other than cygwin32. */
static char *first_break = NULL;
+static
+inline
+void
+check_first_break(void)
+{
+ if(first_break) return;
+ /* Win32 ports other than cygwin32 don't have brk() */
+ first_break = (char *) sbrk (0);
+#ifdef HAVE_MMAP
+ {
+#define M2048 (2048*8/64)
+ void *ptr[M2048];
+ int i;
+ for (i=0;i+ {
+ ptr[i] = malloc (64*1024);
+ }
+ for (i=M2048;i;i--)
+ {
+ free (ptr[i-1]);
+ }
+ }
+#endif
+}
#endif /* HAVE_SBRK */

void
@@ -107,9 +131,7 @@ xmalloc_set_program_name (const char *s)
{
name = s;
#ifdef HAVE_SBRK
- /* Win32 ports other than cygwin32 don't have brk() */
- if (first_break == NULL)
- first_break = (char *) sbrk (0);
+ check_first_break();
#endif /* HAVE_SBRK */
}

@@ -142,6 +164,10 @@ xmalloc (size_t size)
{
PTR newmem;

+#ifdef HAVE_SBRK
+ check_first_break();
+#endif /* HAVE_SBRK */
+
if (size == 0)
size = 1;
newmem = malloc (size);
@@ -156,6 +182,10 @@ xcalloc (size_t nelem, size_t elsize)
{
PTR newmem;

+#ifdef HAVE_SBRK
+ check_first_break();
+#endif /* HAVE_SBRK */
+
if (nelem == 0 || elsize == 0)
nelem = elsize = 1;

@@ -171,6 +201,10 @@ xrealloc (PTR oldmem, size_t size)
{
PTR newmem;

+#ifdef HAVE_SBRK
+ check_first_break();
+#endif /* HAVE_SBRK */
+
if (size == 0)
size = 1;
if (!oldmem)

拍手[0回]

rx-elf-gcc(4.7.2)でbtst命令を使うようにしてみようという試み、その6

今回は、bit7の場合です。

0000 FB E2 00 00 00 00     mov.L   #_bar1, r14
0006 CC EE                 mov.B   [r14], r14
0008 61 0E                 cmp     #0, r14
000a FB E2 00 00 00 00     mov.L   #_bar, r14
0010 29 05                 blt     .L5
0012 F0 E7                 bset    #7, [r14].B
0014 02                    rts
                       .L5:
0015 F0 EF                 bclr    #7, [r14].B
0017 02                    rts

ちょっと違うやり方になります。

Failed to match this instruction:
(set (pc)
    (if_then_else (ge (subreg:SI (mem/c:QI (reg/f:SI 30) [0 bar1+0 S1 A8]) 0)
            (const_int 0 [0]))
        (label_ref 17)
        (pc)))


コンバインパターンはこうなっています。

(define_insn_and_split "*cbranchqi4_tst_ext_bitmem_msb"
  [(set (pc)
    (if_then_else
      (match_operator 2 "rx_zs_comparison_operator"
        [(subreg:SI
        (match_operand:QI 0 "rx_restricted_mem_operand" "Q") 0)
         (const_int 0)])
      (match_operand 1 "label_ref_operand" "")
      (pc)))]
  ""
  "#"
  "reload_completed"
  [(const_int 0)]
{
  rtx x;
  enum rtx_code code;

  x = gen_rtx_AND (SImode, operands[0], gen_int_mode (0x80, SImode));

  code = GET_CODE (operands[2]);
  if (code == GE) code = EQ;
  if (code == LT) code = NE;
  rx_split_cbranch (CC_ZSmode, code,
            x, const0_rtx, operands[1]);
  DONE;
})

rx.mdにこれを追加します。(*tstqi_bitmemをちょっと修正しています。)

コンパイルしたコードはこうなります。

0000 FB E2 00 00 00 00     mov.L   #_bar1, r14
0006 F4 E7                 btst    #7, [r14].B
0008 FB E2 00 00 00 00     mov.L   #_bar, r14
000e 1C                    bne     .L5
000f F0 E7                 bset    #7, [r14].B
0011 02                    rts
                       .L5:
0012 F0 EF                 bclr    #7, [r14].B
0014 02                    rts


btst-rx.patch  まとめたpatch

拍手[0回]

rx-elf-gcc(4.7.2)でbtst命令を使うようにしてみようという試み、その5

その2でこうなりましたが、

0000 FB E2 00 00 00 00     mov.L #_bar1, r14
0006 CC EE                 mov.B [r14], r14
0008 7C 1E                 btst #1, r14
000a FB E2 00 00 00 00     mov.L #_bar, r14
0010 1C                    bne .L5
0011 F0 E1                 bset #1, [r14].B
0013 02                    rts
                       .L5:
0014 F0 E9                 bclr #1, [r14].B
0016 02                    rts

色の付いたところをメモリに対してのbtstにします。

Failed to match this instruction:
(set (pc)
    (if_then_else (eq (if_then_else:SI (zero_extract:SI (mem/c:QI (reg/f:SI 30) [0 bar1+0 S1 A8])
                    (const_int 1 [0x1])
                    (const_int 1 [0x1]))
                (const_int 2 [0x2])
                (const_int 0 [0]))
            (const_int 0 [0]))
        (label_ref 20)
        (pc)))

このコンバインパターンを成功するようにrx.mdに以下を追加します。

(define_insn_and_split "*cbranchqi4_tst_ext_mem"
  [(set (pc)
    (if_then_else
      (match_operator 4 "rx_z_comparison_operator"
        [ (if_then_else:SI
               (zero_extract:SI
                 (match_operand:QI 0 "rx_restricted_mem_operand" "Q")
           (match_operand    1 "rx_constshift_operand" "")
           (match_operand    2 "rx_constshift_operand" ""))
               (match_operand 5 "const_int_operand" "")
               (const_int 0))
         (const_int 0)])
      (match_operand 3 "label_ref_operand" "")
      (pc)))]
  "INTVAL (operands[1]) == 1"
  "#"
  "reload_completed"
  [(const_int 0)]
{
  HOST_WIDE_INT mask;
  rtx x;

  mask = 1;
  mask <<= INTVAL (operands[1]);
  mask -= 1;
  mask <<= INTVAL (operands[2]);
  x = gen_rtx_AND (SImode, operands[0], gen_int_mode (mask, SImode));

  rx_split_cbranch (CC_ZSmode, GET_CODE (operands[4]),
            x, const0_rtx, operands[3]);
  DONE;
})

これでコンパイルするとこうなります。

0000 FB E2 00 00 00 00     mov.L   #_bar1, r14
0006 F4 E1                 btst    #1, [r14].B
0008 FB E2 00 00 00 00     mov.L   #_bar, r14
000e 1C                    bne     .L5
000f F0 E1                 bset    #1, [r14].B
0011 02                    rts
                       .L5:
0012 F0 E9                 bclr    #1, [r14].B
0014 02                    rts


拍手[0回]

カレンダー

12 2025/01 02
S M T W T F S
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

フリーエリア

最新CM

最新記事

(07/27)
(03/27)
(03/26)
(03/23)
(03/22)
(03/19)
(03/18)
(03/18)
(03/15)
(03/14)
(03/13)
(03/12)
(03/11)
(03/11)
(03/08)
(03/08)
(03/06)
(03/05)
(03/02)
(03/01)
(02/28)
(02/27)
(02/24)
(02/23)
(02/22)

プロフィール

HN:
kenrou
性別:
非公開

バーコード

ブログ内検索

最古記事

(12/15)
(12/16)
(12/17)
(12/18)
(12/19)
(12/20)
(12/21)
(12/22)
(12/23)
(12/24)
(12/25)
(12/26)
(12/27)
(12/28)
(12/29)
(12/30)
(12/31)
(01/01)
(01/02)
(01/21)
(01/22)
(01/23)
(01/24)
(01/24)
(01/28)

P R

忍者アナライズ

コガネモチ

忍者カウンター

カレンダー

12 2025/01 02
S M T W T F S
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