ARM

Boost.Coroutine を組み込み環境向けに移植してみた

ある程度動いてる感じがするので公開してみます。 BREW で人柱になってくれる方を募集中です。 ソースとか いつもの場所に置いときました。 http://melpon.tank.jp/pukiwiki147/index.php?cmd=read&page=Memo%2F%CA%AA%C3%D6%2Fmoost 移植にあたって Boost.C…

無名 enum をテンプレートに渡す

とエラー吐く。 enum { hoge }; template<class T> void foo(T) { } foo(hoge); // エラー: テンプレート引数は無名の型を参照できません ARM コンパイラの標準の準拠度が高くて目から鱗が落ちまくり。</class>

Visual Studio から実機用のバイナリを作る方法

実機用のバイナリを作る方法についてはstd::vector と例外と+αを使ってる状態で実機用のバイナリを作る方法を参考にして貰うとして、ここでは Visual Studio でどうやって実機用バイナリを作るかというのを説明します。 といっても単純にカスタムビルドを使…

std::vector と例外と+αを使ってる状態で実機用のバイナリを作る方法

とりあえず実機でも一通り動くような感じになってきたので、RVCT3.0 で実機用のバイナリを作る方法をまとめてみようと思います。 事前知識 ずっと勘違いしていたのですが、BREW ではもはやグローバル変数は使えます。 elf2mod というツールが Qualcomm から…

RVCT3.0 のエラー形式

RVCT3.0 の ARM コンパイラは、ちゃんとコンパイラオプションを指定することで日本語エラーを出力してくれます。英語を直訳したような日本語な感じもするけど、それでも自分にはとっても便利。 以下のフラグを設定すると日本語になります。 --message_locale…

std::vector と例外を使ってる状態でコンパイルを通す方法

まだ実機で動かせないので、とりあえずコンパイルを通すだけ。 まず当然のごとく new と delete は再定義するべき。 void* operator new(std::size_t size) throw(std::bad_alloc) { return MALLOC(size); } void* operator new[](std::size_t size) throw(s…

BREW の高速転送

昔、RGB565 から RGB565 へ高速に転送するルーチンを書きました。 ふと思い出したので貼り付けておきます。

BREW の高速パレット転送

昔、8 ビットインデックスのパレットから RGB565 へ高速に転送するルーチンを書きました。 ふと思い出したので貼り付けておきます。

BREW で MicroThread(3)

晒されてたので現れてみるテスト http://pc11.2ch.net/test/read.cgi/tech/1195449992/ 416 :403 [sage] :2008/04/11(金) 04:33:47 >>406,407,409,410,411,412,413 おまいらありがとう。 静的な変数はELF2MODでいけるってことね。 例外はRVCT3.0で>>9みた…

ARM 役立ち情報

「ARMで使用する効率的なCの記述」が ARM 本家にあることを、id:sakuneko さんに教えて頂きました。感謝感謝。 アプリケーションノート34 ARMで使用する効率的なCの記述 https://www.jp.arm.com/document/manual/files/C_34pdf.pdf 自分は基本的に ADS と AR…

ARM7TDMI 勉強中

ARM7TDMI の仕様書を読んで、いろいろ勉強中。 こいつは命令パイプラインを持っていて、フェッチ、デコード、実行の3段パイプラインになっているらしい。 なので、メモリからロードしたりストアしたりするときは、ロード・ストア命令の1クロック前にそのメ…

ARM での software packed 演算による飽和加算(3)

昨日のやつ、ちゃんと動いてませんでしたorz

ARM での software packed 演算による飽和加算(2)

とりあえず RGB565 の飽和加算でのレジスタの数を出来る限り少なくしてみることにします。

ARM での software packed 演算による飽和加算

id:yaneurao:20060916 で、ちょっとアホなコメントしちゃいました。 # melpon 『ARMなら条件実行があるので、素直にif文書いた方が速かったり……。 C言語で書く利点はCPU依存の問題だけでは無いのでアセンブラに頼らないのは賛成ですが、携帯の場合は本気の最…

Elf2mod(4)

id:youandi さんが、GCC(GNU ARM) でElf2modを利用する方法を調べてくれました。 id:youandi:20060712#p6 スクリプト……GCC は難しすぎてよくわかりません(;´Д`)

Elf2mod(2)

ARM での mod ファイルの作り方。 armlink でのいつも使ってるオプションに、-reloc -split を追加してから実行。 armlink で elf ファイルが作れたなら、それを elf2mod で mod に変換する。 以上(`・ω・´) ちなみに armlink のバージョンは 1.2 以上じゃな…

ARM Assembler Tips(2)

ARM アセンブラでライトバックを使うと、なんか偉くなった気分になれるので非常に爽快だ。 例えば x86 系の PUSH にあたる命令は、 STR r0,[sp] ADD sp,sp,#-4 って書くよりは、 STR r0,[sp,#-4]! こうやって書く方がカッコイイ。あとついでに効率が良い。 …

BREW で MicroThread(2)

MicroThread は、スタック切り替えで関数を実行途中で停止出来るようにすることによって実現出来ます。 id:yaneurao さんのやね本2にこの実装が詳しく書かれています。 Windowsプロフェッショナルゲームプログラミング2【CD-ROM付】 (Game developer books)…

ARM の、テンポラリオブジェクトの参照

class Object{}; class Test{ void func1( Object obj ){}; void func2( Object& obj ){}; void func3( const Object obj ){}; void func4( const Object& obj ){}; void test(){ func1( Object() ); func2( Object() ); func3( Object() ); func4( Object()…

ARM の、テンポラリオブジェクトのポインタ(2)

func( &(Hoge)Hoge() ); こうすればコンパイルが通ったヽ(´ー`)ノ でもこれ、キャストするときにコピーが発生してるのかな? 追記: この程度なら最適化されるっぽい?

ARM の、テンポラリオブジェクトのポインタ

void func( Hoge* hoge ); この関数に対して、 funt( &Hoge() ); ってやると、ARM コンパイラでエラーが出る(;´Д`) これが使えないと結構不便なんですが……orz

0x5C

次から ARM でコンパイルする前に、 [―ソЫ?噂浬欺圭構蚕十申曾箪貼能表暴予禄兔喀媾彌拿杤歃濬畚秉綵臀藹觸軆鐔饅鷭]\n こいつで正規表現検索します(´・ω・`) 追記: いや待てよ……バイナリエディタで、 0x5C 0x0D 0x0A → 0x5C 0x20 0x0D 0x0A こういう変換…

ARM の enum の動作

enum ETest1{ t1 = 0 , t2 = 255 , }; enum ETest2{ t3 = 256 , }; enum ETest3{ t4 = 65536 , }; enum ETest4{ t5 = -10 , // ARM ではコンパイルエラー t6 = 0xffffffff , }; ETest1 e1; ETest2 e2; ETest3 e3; ETest4 e4; DBGPRINTF( "e1 : %d" , sizeof(…

ARM Assembler Tips

よく、下位 1bit が 1 である時は〜をするっていう処理を、こうやって書く。 if( (b & 1) != 0 ){ // 処理 } これは、AND と CMP の2命令に変換される AND r0,b,#1 CMP r0,#0 ... 比較のために2命令を使うのは、ちょっと勿体ない。 これを短くするには、次…

BREW でのライブラリの作り方

自分はてっきり armar を使わないと一つにまとめられないと思ってたんだけど、.o ファイルをリンクするときに、-partial を指定すると、定義していないシンボルがあってもリンクできるみたい。 で、ライブラリを使う側は、.o ファイルをリンクするときに、ラ…

ARMの平方根(3)

よく見てみると、1bit毎に3クロックで収束出来るルーチンがあった(;´Д`) ; IN : n 32 bit unsigned integer ; OUT: root = INT (SQRT (n)) ; TMP: offset MOV offset, #3 ROR #2 * i SUBHS n, n, root, ROR #2 * i ADC root, offset, root, LSL #1 ] BIC…

ARMの平方根(2)

ふと思った。 s = (x / s + s) >> 1; この部分、除算を使っているんだけれども、ARMの命令には除算命令がない。 どうやって計算してるんだろう?と思ってアセンブラを吐き出してみると……。 BL __rt_udiv 除算演算ライブラリを使ってるよ(ノ∀`)アチャー こりゃ考…

ARMの平方根

id:yattaさんのページを覗いてみると…… http://d.hatena.ne.jp/yatta/20041005 (・∀・)イイ!! 自分の平方根を求めるプログラムは、 s = (x / s + s) >> 1; s = (x / s + s) >> 1; s = (x / s + s) >> 1; s = (x / s + s) >> 1; s = (x / s + s) >> 1; こんな風…

ARMアセンブラ勉強中(5)

遅い! 今日、実機で速度を測ってみたんですけど(やっとかよ!)、メモリの転送速度が限界なのかしらん、速度に大した差がなかったです(´・ェ・`) ショボン 最新の端末(BREW3.1)でも20〜30%程度しか速くならなかったという……。 アセンブラはLDR,STRをあまり使…

ARMアセンブラ勉強中(4)

さらに高速化です(`へ´)。