FC2カウンター FPGAの部屋 Zynq

FPGAやCPLDの話題やFPGA用のツールの話題などです。 マニアックです。 日記も書きます。

FPGAの部屋

FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。Xilinx ISEの初心者の方には、FPGAリテラシーおよびチュートリアルのページをお勧めいたします。

新しいラプラシアンフィルタのソフトウェア実装

OpenMPを使ったラプラシアンフィルタの動作がおかしいという現象があった。ブログのコメント欄でも教えてもらったのだが、OpenMPのプラグマを書いた for 文のどの順に実行されるかわからない?ということで、元のラプラシアンフィルタをよりシンプルにしてみた。
laplacian_filter.c ~ laplacian_filter4.c までは、ラプラシアンフィルタ処理によって、画像の周りの1ピクセルのみ 0 にしていたが、今回は上と右の 2 ピクセルを 0 にしている。下にその図を示す。ブルーの画面がラプラシアンフィルタの出力画像で、黒い部分が 0 を出力している部分とする。
OpenMP_23_150720.png

ラプラシアンフィルタは3 ピクセル x 3 ラインのデータを元に真ん中の画像を出力しているので、今回のソフトウェアの方が if 文が少なくなる。
実際のラプラシアンフィルタのソフトウェアはGitHubにあげておいたので、marsee101/laplacian_filters を見て欲しい。
laplacian_filter5.c は laplacian_filter.c に対応する実装で、順に番号付けされていて、 laplacian_filter8.c は、 laplacian_filter4.c に対応する実装となっている。

下に gcc-4.8 で laplacian_filter5.c の性能を比較した時のスクリプトを示す。

gcc laplacian_filter5.c -o laplacian_filter5
gcc -O1 laplacian_filter5.c -o laplacian_filter5_O1
gcc -O2 laplacian_filter5.c -o laplacian_filter5_O2
gcc -O3 laplacian_filter5.c -o laplacian_filter5_O3
gcc -Os laplacian_filter5.c -o laplacian_filter5_Os
gcc -mcpu=cortex-a9 -mfpu=neon -ftree-vectorize -mvectorize-with-neon-quad -ffast-math laplacian_filter5.c -o laplacian_filter5_n
gcc -mcpu=cortex-a9 -mfpu=neon -ftree-vectorize -mvectorize-with-neon-quad -ffast-math -O1 laplacian_filter5.c -o laplacian_filter5_n1
gcc -mcpu=cortex-a9 -mfpu=neon -ftree-vectorize -mvectorize-with-neon-quad -ffast-math -O2 laplacian_filter5.c -o laplacian_filter5_n2
gcc -mcpu=cortex-a9 -mfpu=neon -ftree-vectorize -mvectorize-with-neon-quad -ffast-math -O3 laplacian_filter5.c -o laplacian_filter5_n3
gcc -mcpu=cortex-a9 -mfpu=neon -ftree-vectorize -mvectorize-with-neon-quad -ffast-math -Os laplacian_filter5.c -o laplacian_filter5_ns
./laplacian_filter5
./laplacian_filter5_O1
./laplacian_filter5_O2
./laplacian_filter5_O3
./laplacian_filter5_Os
./laplacian_filter5_n
./laplacian_filter5_n1
./laplacian_filter5_n2
./laplacian_filter5_n3
./laplacian_filter5_ns
objdump -S -d laplacian_filter5 | grep "vmov" -c
objdump -S -d laplacian_filter5_O1 | grep "vmov" -c
objdump -S -d laplacian_filter5_O2 | grep "vmov" -c
objdump -S -d laplacian_filter5_O3 | grep "vmov" -c
objdump -S -d laplacian_filter5_Os | grep "vmov" -c
objdump -S -d laplacian_filter5_n | grep "vmov" -c
objdump -S -d laplacian_filter5_n1 | grep "vmov" -c
objdump -S -d laplacian_filter5_n2 | grep "vmov" -c
objdump -S -d laplacian_filter5_n3 | grep "vmov" -c
objdump -S -d laplacian_filter5_ns | grep "vmov" -c


laplacian_filter5.c を他のラプラシアンフィルタの実装に切り替えながら性能を測定した。

laplacian_filter5.c の結果を示す。
OpenMP_24_150720.png

laplacian_filter6.c の結果を示す。
OpenMP_25_150720.png

laplacian_filter7.c の結果を示す。
OpenMP_26_150720.png

laplacian_filter8.c の結果を示す。
OpenMP_27_150720.png

次に、OpenMP を使った時の各ラプラシアンフィルタ処理時間を測定した。
下に gcc-4.8 の -fopenmp オプションを付けた時の性能を比較するためのスクリプトを示す。

gcc -fopenmp laplacian_filter5.c -o laplacian_filter5_mp
gcc -fopenmp -O1 laplacian_filter5.c -o laplacian_filter5_mpO1
gcc -fopenmp -O2 laplacian_filter5.c -o laplacian_filter5_mpO2
gcc -fopenmp -O3 laplacian_filter5.c -o laplacian_filter5_mpO3
gcc -fopenmp -Os laplacian_filter5.c -o laplacian_filter5_mpOs
gcc -fopenmp -mcpu=cortex-a9 -mfpu=neon -ftree-vectorize -mvectorize-with-neon-quad -ffast-math laplacian_filter5.c -o laplacian_filter5_mpn
gcc -fopenmp -mcpu=cortex-a9 -mfpu=neon -ftree-vectorize -mvectorize-with-neon-quad -ffast-math -O1 laplacian_filter5.c -o laplacian_filter5_mpn1
gcc -fopenmp -mcpu=cortex-a9 -mfpu=neon -ftree-vectorize -mvectorize-with-neon-quad -ffast-math -O2 laplacian_filter5.c -o laplacian_filter5_mpn2
gcc -fopenmp -mcpu=cortex-a9 -mfpu=neon -ftree-vectorize -mvectorize-with-neon-quad -ffast-math -O3 laplacian_filter5.c -o laplacian_filter5_mpn3
gcc -fopenmp -mcpu=cortex-a9 -mfpu=neon -ftree-vectorize -mvectorize-with-neon-quad -ffast-math -Os laplacian_filter5.c -o laplacian_filter5_mpns
./laplacian_filter5_mp
./laplacian_filter5_mpO1
./laplacian_filter5_mpO2
./laplacian_filter5_mpO3
./laplacian_filter5_mpOs
./laplacian_filter5_mpn
./laplacian_filter5_mpn1
./laplacian_filter5_mpn2
./laplacian_filter5_mpn3
./laplacian_filter5_mpns
objdump -S -d laplacian_filter5_mp | grep "vmov" -c
objdump -S -d laplacian_filter5_mpO1 | grep "vmov" -c
objdump -S -d laplacian_filter5_mpO2 | grep "vmov" -c
objdump -S -d laplacian_filter5_mpO3 | grep "vmov" -c
objdump -S -d laplacian_filter5_mpOs | grep "vmov" -c
objdump -S -d laplacian_filter5_mpn | grep "vmov" -c
objdump -S -d laplacian_filter5_mpn1 | grep "vmov" -c
objdump -S -d laplacian_filter5_mpn2 | grep "vmov" -c
objdump -S -d laplacian_filter5_mpn3 | grep "vmov" -c
objdump -S -d laplacian_filter5_mpns | grep "vmov" -c


OpenMP を使った時の新しく作ったラプラシアンフィルタの性能を測定した。
laplacian_filter5.c に OpenMP用のプラグマを入れた。
OpenMP_32_150720.png

laplacian_filter5.c の結果を示す。
OpenMP_28_150720.png

laplacian_filter5.c のラプラシアンフィルタ結果を示す。今回は正常だ。
OpenMP_36_150720.jpg

laplacian_filter6.c に OpenMP用のプラグマを入れた。
OpenMP_33_150720.png

laplacian_filter6.c の結果を示す。
OpenMP_29_150720.png

laplacian_filter6.c のラプラシアンフィルタ結果を示す。今回は正常だ。
OpenMP_37_150720.jpg

laplacian_filter7.c に OpenMP用のプラグマを入れた。
OpenMP_34_150720.png

laplacian_filter7.c の結果を示す。
OpenMP_30_150720.png

laplacian_filter7.c のラプラシアンフィルタ結果を示す。今回は正常だ。
OpenMP_38_150720.jpg

laplacian_filter8.c に OpenMP用のプラグマを入れた。
OpenMP_35_150720.png

laplacian_filter8.c の結果を示す。
OpenMP_31_150720.png

laplacian_filter8.c のラプラシアンフィルタ結果を示す。今回も真ん中に線が入ってしまった。
OpenMP_39_150720.jpg

gcc-4.8 の各最適化オプションとNEON命令を追加した時、gcc-4.8 の OpenMPで 2 スレッドにした場合の性能を表にした。表中で同じ色の背景は出力位置は違っても同じ実装であることを示す。
最初にgcc-4.8 の各最適化オプションとNEON命令を追加した時の表を示す。
OpenMP_40_150720.png

gcc-4.8 の OpenMPで 2 スレッドにした場合の性能の表を示す。
OpenMP_41_150720.png

gcc-4.8 の OpenMP、-O3、laplacian_filter8.c で最速値 72.5 ms が計測できた。まだ、laplacian_filter8.c は結果がおかしいが最速値を計測することができた。一方、ラプラシアンフィルタの実行に関しては、1 core 使用した時と、2 core 使用した時では、あまり速度差が無いと言える。
  1. 2015年07月20日 07:56 |
  2. Zynq
  3. | トラックバック:0
  4. | コメント:0

OpenMPでのラプラシアンフィルタの実行速度3

OpenMPでのラプラシアンフィルタの実行速度2”の続き。

前回は、laplacian_fiter1 と laplacian_fiter2 のOpenMP を使うようにコンパイルして、実行した結果をブログに書いた。今回は、laplacian_fiter3 と laplacian_fiter4 をやってみた。

laplacian_fiter3.c を下に示すように、Cソースコードを修正した。
OpenMP_20_150717.png

2つ目の for ループの前に、

#ifdef _OPENMP
#pragma omp parallel for private(lap_fil_val, a, b, cam_fb_addr, lap_fb_addr)
#endif

を置いた。

このCソースコードを以下のコマンドで、コンパイル、実行、NEON命令の有無を調査した。

gcc -fopenmp laplacian_filter3.c -o laplacian_filter3_mp
gcc -fopenmp -O1 laplacian_filter3.c -o laplacian_filter3_mpO1
gcc -fopenmp -O2 laplacian_filter3.c -o laplacian_filter3_mpO2
gcc -fopenmp -O3 laplacian_filter3.c -o laplacian_filter3_mpO3
gcc -fopenmp -Os laplacian_filter3.c -o laplacian_filter3_mpOs
gcc -fopenmp -mcpu=cortex-a9 -mfpu=neon -ftree-vectorize -mvectorize-with-neon-quad -ffast-math laplacian_filter3.c -o laplacian_filter3_mpn
gcc -fopenmp -mcpu=cortex-a9 -mfpu=neon -ftree-vectorize -mvectorize-with-neon-quad -ffast-math -O1 laplacian_filter3.c -o laplacian_filter3_mpn1
gcc -fopenmp -mcpu=cortex-a9 -mfpu=neon -ftree-vectorize -mvectorize-with-neon-quad -ffast-math -O2 laplacian_filter3.c -o laplacian_filter3_mpn2
gcc -fopenmp -mcpu=cortex-a9 -mfpu=neon -ftree-vectorize -mvectorize-with-neon-quad -ffast-math -O3 laplacian_filter3.c -o laplacian_filter3_mpn3
gcc -fopenmp -mcpu=cortex-a9 -mfpu=neon -ftree-vectorize -mvectorize-with-neon-quad -ffast-math -Os laplacian_filter3.c -o laplacian_filter3_mpns
./laplacian_filter3_mp
./laplacian_filter3_mpO1
./laplacian_filter3_mpO2
./laplacian_filter3_mpO3
./laplacian_filter3_mpOs
./laplacian_filter3_mpn
./laplacian_filter3_mpn1
./laplacian_filter3_mpn2
./laplacian_filter3_mpn3
./laplacian_filter3_mpns
objdump -S -d laplacian_filter3_mp | grep "vmov" -c
objdump -S -d laplacian_filter3_mpO1 | grep "vmov" -c
objdump -S -d laplacian_filter3_mpO2 | grep "vmov" -c
objdump -S -d laplacian_filter3_mpO3 | grep "vmov" -c
objdump -S -d laplacian_filter3_mpOs | grep "vmov" -c
objdump -S -d laplacian_filter3_mpn | grep "vmov" -c
objdump -S -d laplacian_filter3_mpn1 | grep "vmov" -c
objdump -S -d laplacian_filter3_mpn2 | grep "vmov" -c
objdump -S -d laplacian_filter3_mpn3 | grep "vmov" -c
objdump -S -d laplacian_filter3_mpns | grep "vmov" -c

を実行した。
結果を示す。
OpenMP_12_150717.png

laplacian_fiter2.c の時と同様に、ラプラシアンフィルタの画像的には、左側はそれなりだが、右側が強調されている気がする。
OpenMP_17_150717.jpg


laplacian_fiter4.c を下に示すように、Cソースコードを修正した。
OpenMP_21_150717.png

filter_line() 関数の for () 文の前に、

#ifdef _OPENMP
#pragma omp parallel for private(lap_fil_val, current, next, prev)
#endif

を置いた。

このCソースコードを以下のコマンドで、コンパイル、実行、NEON命令の有無を調査した。

gcc -fopenmp laplacian_filter4.c -o laplacian_filter4_mp
gcc -fopenmp -O1 laplacian_filter4.c -o laplacian_filter4_mpO1
gcc -fopenmp -O2 laplacian_filter4.c -o laplacian_filter4_mpO2
gcc -fopenmp -O3 laplacian_filter4.c -o laplacian_filter4_mpO3
gcc -fopenmp -Os laplacian_filter4.c -o laplacian_filter4_mpOs
gcc -fopenmp -mcpu=cortex-a9 -mfpu=neon -ftree-vectorize -mvectorize-with-neon-quad -ffast-math laplacian_filter4.c -o laplacian_filter4_mpn
gcc -fopenmp -mcpu=cortex-a9 -mfpu=neon -ftree-vectorize -mvectorize-with-neon-quad -ffast-math -O1 laplacian_filter4.c -o laplacian_filter4_mpn1
gcc -fopenmp -mcpu=cortex-a9 -mfpu=neon -ftree-vectorize -mvectorize-with-neon-quad -ffast-math -O2 laplacian_filter4.c -o laplacian_filter4_mpn2
gcc -fopenmp -mcpu=cortex-a9 -mfpu=neon -ftree-vectorize -mvectorize-with-neon-quad -ffast-math -O3 laplacian_filter4.c -o laplacian_filter4_mpn3
gcc -fopenmp -mcpu=cortex-a9 -mfpu=neon -ftree-vectorize -mvectorize-with-neon-quad -ffast-math -Os laplacian_filter4.c -o laplacian_filter4_mpns
./laplacian_filter4_mp
./laplacian_filter4_mpO1
./laplacian_filter4_mpO2
./laplacian_filter4_mpO3
./laplacian_filter4_mpOs
./laplacian_filter4_mpn
./laplacian_filter4_mpn1
./laplacian_filter4_mpn2
./laplacian_filter4_mpn3
./laplacian_filter4_mpns
objdump -S -d laplacian_filter4_mp | grep "vmov" -c
objdump -S -d laplacian_filter4_mpO1 | grep "vmov" -c
objdump -S -d laplacian_filter4_mpO2 | grep "vmov" -c
objdump -S -d laplacian_filter4_mpO3 | grep "vmov" -c
objdump -S -d laplacian_filter4_mpOs | grep "vmov" -c
objdump -S -d laplacian_filter4_mpn | grep "vmov" -c
objdump -S -d laplacian_filter4_mpn1 | grep "vmov" -c
objdump -S -d laplacian_filter4_mpn2 | grep "vmov" -c
objdump -S -d laplacian_filter4_mpn3 | grep "vmov" -c
objdump -S -d laplacian_filter4_mpns | grep "vmov" -c

を実行した。
結果を示す。
OpenMP_13_150717.png

ラプラシアンフィルタ処理後の画像は、真ん中に縦に線が入ってしまった。それ以外は普通だ。
OpenMP_18_150717.jpg

OpenMP を使用したラプラシアンフィルタのみの各最適化オプションでの実行時間を表にまとめたので、下に示す。使用したコンパイラは gcc-4.8 だ。
OpenMP_22_150717.png

OpenMP を使用しない gcc の各最適化オプションのラプラシアンフィルタのみの処理時間の表を下に示す。
NEON_48_150714.png

上の2つの表を比較してみると、-O無しの場合は OpenMP が明らかに速いが、それ以外の場合はあまり速くなっていないことが分かる。
  1. 2015年07月18日 04:31 |
  2. Zynq
  3. | トラックバック:0
  4. | コメント:0

OpenMPでのラプラシアンフィルタの実行速度2

OpenMPでのラプラシアンフィルタの実行速度”の続き。

Vengineer さんからツイッターで、”forループ内のローカル変数をプラグマ内で定義しないと、おかしくなりますよ”とのアドバイスを頂いた。調べてみると、”#pragma omp parallel for”の後に”private(list)”を付ける必要があるようだ。
C言語による OpenMP 入門 ”の12ページ、”5.1 private(list) ”を参照すると、各スレッドで独自の変数値を持つためには、private 指示子が必要なようだ。

最初に laplacian_filter.c だが、以下の図の様にCソースコードを修正した。
OpenMP_14_150717.png

2つ目の for ループの前に、

#ifdef _OPENMP
#pragma omp parallel for private(lap_fil_val, fl, sl, tl, a, b)
#endif

を置いた。

このCソースコードを以下のコマンドで、コンパイル、実行、NEON命令の有無を調査した。

gcc -fopenmp laplacian_filter.c -o laplacian_filter1_mp
gcc -fopenmp -O1 laplacian_filter.c -o laplacian_filter1_mpO1
gcc -fopenmp -O2 laplacian_filter.c -o laplacian_filter1_mpO2
gcc -fopenmp -O3 laplacian_filter.c -o laplacian_filter1_mpO3
gcc -fopenmp -Os laplacian_filter.c -o laplacian_filter1_mpOs
gcc -fopenmp -mcpu=cortex-a9 -mfpu=neon -ftree-vectorize -mvectorize-with-neon-quad -ffast-math laplacian_filter.c -o laplacian_filter1_mpn
gcc -fopenmp -mcpu=cortex-a9 -mfpu=neon -ftree-vectorize -mvectorize-with-neon-quad -ffast-math -O1 laplacian_filter.c -o laplacian_filter1_mpn1
gcc -fopenmp -mcpu=cortex-a9 -mfpu=neon -ftree-vectorize -mvectorize-with-neon-quad -ffast-math -O2 laplacian_filter.c -o laplacian_filter1_mpn2
gcc -fopenmp -mcpu=cortex-a9 -mfpu=neon -ftree-vectorize -mvectorize-with-neon-quad -ffast-math -O3 laplacian_filter.c -o laplacian_filter1_mpn3
gcc -fopenmp -mcpu=cortex-a9 -mfpu=neon -ftree-vectorize -mvectorize-with-neon-quad -ffast-math -Os laplacian_filter.c -o laplacian_filter1_mpns
./laplacian_filter1_mp
./laplacian_filter1_mpO1
./laplacian_filter1_mpO2
./laplacian_filter1_mpO3
./laplacian_filter1_mpOs
./laplacian_filter1_mpn
./laplacian_filter1_mpn1
./laplacian_filter1_mpn2
./laplacian_filter1_mpn3
./laplacian_filter1_mpns
objdump -S -d laplacian_filter1_mp | grep "vmov" -c
objdump -S -d laplacian_filter1_mpO1 | grep "vmov" -c
objdump -S -d laplacian_filter1_mpO2 | grep "vmov" -c
objdump -S -d laplacian_filter1_mpO3 | grep "vmov" -c
objdump -S -d laplacian_filter1_mpOs | grep "vmov" -c
objdump -S -d laplacian_filter1_mpn | grep "vmov" -c
objdump -S -d laplacian_filter1_mpn1 | grep "vmov" -c
objdump -S -d laplacian_filter1_mpn2 | grep "vmov" -c
objdump -S -d laplacian_filter1_mpn3 | grep "vmov" -c
objdump -S -d laplacian_filter1_mpns | grep "vmov" -c

を実行した。
結果を示す。
OpenMP_10_150717.png

ラプラシアンフィルタ処理後の画面はやはり、前回と同じで、最初に........が余計に出ている。
OpenMP_15_150717.jpg


次に、laplacian_filter2.c をOpenMP を使用するように gcc でオプション付けてコンパイルした。以下の様にCソースコードを修正した。
OpenMP_19_150717.png

同様に、2つ目の for ループの前に、

#ifdef _OPENMP
#pragma omp parallel for private(lap_fil_val, a, b, cam_fb_addr, lap_fb_addr)
#endif

を置いた。

このCソースコードを以下のコマンドで、コンパイル、実行、NEON命令の有無を調査した

。gcc -fopenmp laplacian_filter2.c -o laplacian_filter2_mp
gcc -fopenmp -O1 laplacian_filter2.c -o laplacian_filter2_mpO1
gcc -fopenmp -O2 laplacian_filter2.c -o laplacian_filter2_mpO2
gcc -fopenmp -O3 laplacian_filter2.c -o laplacian_filter2_mpO3
gcc -fopenmp -Os laplacian_filter2.c -o laplacian_filter2_mpOs
gcc -fopenmp -mcpu=cortex-a9 -mfpu=neon -ftree-vectorize -mvectorize-with-neon-quad -ffast-math laplacian_filter2.c -o laplacian_filter2_mpn
gcc -fopenmp -mcpu=cortex-a9 -mfpu=neon -ftree-vectorize -mvectorize-with-neon-quad -ffast-math -O1 laplacian_filter2.c -o laplacian_filter2_mpn1
gcc -fopenmp -mcpu=cortex-a9 -mfpu=neon -ftree-vectorize -mvectorize-with-neon-quad -ffast-math -O2 laplacian_filter2.c -o laplacian_filter2_mpn2
gcc -fopenmp -mcpu=cortex-a9 -mfpu=neon -ftree-vectorize -mvectorize-with-neon-quad -ffast-math -O3 laplacian_filter2.c -o laplacian_filter2_mpn3
gcc -fopenmp -mcpu=cortex-a9 -mfpu=neon -ftree-vectorize -mvectorize-with-neon-quad -ffast-math -Os laplacian_filter2.c -o laplacian_filter2_mpns
./laplacian_filter2_mp
./laplacian_filter2_mpO1
./laplacian_filter2_mpO2
./laplacian_filter2_mpO3
./laplacian_filter2_mpOs
./laplacian_filter2_mpn
./laplacian_filter2_mpn1
./laplacian_filter2_mpn2
./laplacian_filter2_mpn3
./laplacian_filter2_mpns
objdump -S -d laplacian_filter2_mp | grep "vmov" -c
objdump -S -d laplacian_filter2_mpO1 | grep "vmov" -c
objdump -S -d laplacian_filter2_mpO2 | grep "vmov" -c
objdump -S -d laplacian_filter2_mpO3 | grep "vmov" -c
objdump -S -d laplacian_filter2_mpOs | grep "vmov" -c
objdump -S -d laplacian_filter2_mpn | grep "vmov" -c
objdump -S -d laplacian_filter2_mpn1 | grep "vmov" -c
objdump -S -d laplacian_filter2_mpn2 | grep "vmov" -c
objdump -S -d laplacian_filter2_mpn3 | grep "vmov" -c
objdump -S -d laplacian_filter2_mpns | grep "vmov" -c

を実行した。
結果を示す。
OpenMP_11_150717.png

ラプラシアンフィルタの画像的には、左側はそれなりだが、右側が強調されている気がする。
OpenMP_16_150717.jpg
  1. 2015年07月17日 05:25 |
  2. Zynq
  3. | トラックバック:0
  4. | コメント:3

OpenMPでのラプラシアンフィルタの実行速度

今まで、NEON命令を使ってラプラシアンフィルタの実行速度を測ってきたが、今回はOpenMPを使って、高速化してみよう。
OpenMPとは複数のプロセッサを使ったマルチスレッディングを行うための API だそうだ。

参考にしたWebサイトは”OpenMP”と”gccのOpenMP実現について”だ。

まずは、”gccのOpenMP実現について”のhello.c をコンパイルして実行してみた。
ちなみに、”#incluce”だけではコンパイル・エラーだったので、”#incluede ”に変更した。

後は、同様に、gcc -fopenmp hello.c でコンパイルして、./a.out で実行した。
OpenMP_1_150716.png

Zynq は、Dual Core のCortex-A9 使用していて、2つのプロセッサなので、2プロセッサ使えるようだ。

次に laplacian_filter.c の 最初の for 文の前に”OpenMP”を参考にして、
#ifdef _OPENMP
#pragma omp parallel for
#endif

を入れてみた。
OpenMP_2_150716.png

gcc-4.8 で下のコマンドでコンパイルを行った。
gcc -fopenmp laplacian_filter.c -o laplacian_filter1_mp
コンパイルが正常に終了した。./laplacian_filter1_mp で動作させた。
OpenMP_3_150716.png

ラプラシアンフィルタ処理結果がおかしい。
OpenMP_7_150716.jpg

ラプラシアンフィルタのみの処理時間は、変動が大きいので、5回の平均を取った。その結果は、約 262 ms だった。
通常のlaplacian_filter1 のラプラシアンフィルタのみの処理時間は、425 ms なので、425 ms / 262 ms ≒ 1.62 倍速くなっているが、結果がおかしいのではしょうがない。

次に、laplacian_filter.c の次の for 文の前に
#ifdef _OPENMP
#pragma omp parallel for
#endif

を入れてみた。
OpenMP_4_150716.png

これで同様に、gcc -fopenmp laplacian_filter.c -o laplacian_filter1_mp
コンパイルが正常に終了した。./laplacian_filter1_mp で動作させた。
OpenMP_5_150716.png

今度は、ラプラシアンフィルタのみの処理時間は、約 243 ms だった。これも通常のラプラシアンフィルタのみの処理時間と比べてみよう。 425 ms / 243 ms ≒ 1.75 倍速かった。

今回のラプラシアンフィルタの処理画像は、最初に...... が入っているのが、バグのようだ。
OpenMP_8_150716.jpg

ちなみに、./laplacian_filter1 実行結果、つまり通常にコンパイルしたラプラシアンフィルタの処理画像を示す。
OpenMP_9_150716.jpg
  1. 2015年07月16日 05:28 |
  2. Zynq
  3. | トラックバック:0
  4. | コメント:0

gcc と clang で -Ofast 最適化オプションを付けた場合の実行速度

gcc-4.6, gcc-4.8, clang-3.4 とコンパイル時の最適化オプションによる速度の違いを検証してきた。
今回は、最適化オプションの -Ofast を gcc-4.6, gcc-4.8, clang-3.4 で試してみた。

最初は gcc-4.6 の -Ofast のみから。
NEON_40_150714.png

gcc-4.6 の自動ベクトル化の -Ofast
NEON_41_150714.png

gcc-4.8 の -Ofast のみ。
NEON_42_150714.png

gcc-4.8 の自動ベクトル化の -Ofast
NEON_43_150714.png

clang-3.4 でスクリプトを投入した。そのスクリプトを下に示す。

clang -Ofast laplacian_filter.c -o laplacian_filter1_Of
clang -Ofast laplacian_filter2.c -o laplacian_filter2_Of
clang -Ofast laplacian_filter3.c -o laplacian_filter3_Of
clang -Ofast laplacian_filter4.c -o laplacian_filter4_Of
clang -mcpu=cortex-a9 -mfpu=neon -mfloat-abi=hard -Ofast laplacian_filter.c -o laplacian_filter1_nf
clang -mcpu=cortex-a9 -mfpu=neon -mfloat-abi=hard -Ofast laplacian_filter2.c -o laplacian_filter2_nf
clang -mcpu=cortex-a9 -mfpu=neon -mfloat-abi=hard -Ofast laplacian_filter3.c -o laplacian_filter3_nf
clang -mcpu=cortex-a9 -mfpu=neon -mfloat-abi=hard -Ofast laplacian_filter4.c -o laplacian_filter4_nf
./laplacian_filter1_Of
./laplacian_filter2_Of
./laplacian_filter3_Of
./laplacian_filter4_Of
./laplacian_filter1_nf
./laplacian_filter2_nf
./laplacian_filter3_nf
./laplacian_filter4_nf


その結果を下に示す。
NEON_44_150714.png

gcc-4.6 でコンパイルした実行ファイルがNEON命令を使用しているか?を調べた。値が 0 でない実行ファイルがNEON命令を使用している。
NEON_45_150714.png

gcc-4.8 でコンパイルした実行ファイルがNEON命令を使用しているか?を調べた。値が 0 でない実行ファイルがNEON命令を使用している。
NEON_46_150714.png

clang-3.4 でコンパイルした実行ファイルがNEON命令を使用しているか?を調べた。値が 0 でない実行ファイルがNEON命令を使用している。
NEON_47_150714.png

gcc-4.6 と gcc-4.8 の -Ofast オプションのラプラシアンフィルタのみの処理時間を表に追加した。-Ofast は -O3 とほとんど変わらないようだ。
NEON_48_150714.png

clang-3.4 の -Ofast オプションのラプラシアンフィルタのみの処理時間を表に追加した。-Ofast は やはり -O3 とほとんど変わらないようだ。
NEON_49_150714.png
  1. 2015年07月14日 20:36 |
  2. Zynq
  3. | トラックバック:0
  4. | コメント:0

clang の最適化と自動ベクトル化を使用した時の性能

2015/07/14:修正 時間計測にバグがあったので、全面的に記事を修正しました。miyox さん、ありがとうございました)

ZYBOのUbuntu14.04 LTSにclangをインストールしてコンパイル”で、clang-3.4 + llvm-3.4 でC がコンパイルできるようになったので、clang の最適化オプションや自動ベクトル化・オプションを付けてコンパイルした時にどのくらいの性能向上があるのかを検証する。

実行環境はZYBOで、Dual Cortex-A9 650 MHz プロセッサを持ち、Ubuntu 14.04 LTS が動作している。

clang ではgcc の様に warning を取り除けなかったので、各最適化オプションの実行形式ファイルを個別に作製して、それを実行して、ラプラシアンフィルタ処理のみの時間を計測している。

最初に、laplacian_filter.c の最適化テストを行った。下にコンパイル・コマンドを示す。

clang laplacian_filter.c -o laplacian_filter1
clang -O1 laplacian_filter.c -o laplacian_filter1_O1
clang -O2 laplacian_filter.c -o laplacian_filter1_O2
clang -O3 laplacian_filter.c -o laplacian_filter1_O3
clang -Os laplacian_filter.c -o laplacian_filter1_Os
clang -mcpu=cortex-a9 -mfpu=neon -mfloat-abi=hard -O3 laplacian_filter.c -o laplacian_filter1_n3

実行結果を下に示す。自動ベクトル化オプションを付けてコンパイルした実行形式ファイルについては、以下のコマンドで、

objdump -S -d laplacian_filter1_n3 | grep "vmov"

NEONの命令の vmov があるかないかでベクトル化されているかどうかを調査した。
clang_2_150711.png
自動ベクトル化はされて無かった。

laplacian_filte2r.c の最適化テストを行った。下にコンパイル・コマンドを示す。

clang laplacian_filter2.c -o laplacian_filter2
clang -O1 laplacian_filter2.c -o laplacian_filter2_O1
clang -O2 laplacian_filter2.c -o laplacian_filter2_O2
clang -O3 laplacian_filter2.c -o laplacian_filter2_O3
clang -Os laplacian_filter2.c -o laplacian_filter2_Os
clang -mcpu=cortex-a9 -mfpu=neon -mfloat-abi=hard -O3 laplacian_filter2.c -o laplacian_filter2_n3

自動ベクトル化オプションを付けてコンパイルした実行形式ファイルについては、以下のコマンドで、

objdump -S -d laplacian_filter2_n3 | grep "vmov"

NEONの命令の vmov があるかないかでベクトル化されているかどうかを調査した。
clang_3_150711.png
自動ベクトル化されているようだ。

laplacian_filte3r.c の最適化テストを行った。下にコンパイル・コマンドを示す。

clang laplacian_filter3.c -o laplacian_filter3
clang -O1 laplacian_filter3.c -o laplacian_filter3_O1
clang -O2 laplacian_filter3.c -o laplacian_filter3_O2
clang -O3 laplacian_filter3.c -o laplacian_filter3_O3
clang -Os laplacian_filter3.c -o laplacian_filter3_Os
clang -mcpu=cortex-a9 -mfpu=neon -mfloat-abi=hard -O3 laplacian_filter3.c -o laplacian_filter3_n3

自動ベクトル化オプションを付けてコンパイルした実行形式ファイルについては、以下のコマンドで、

objdump -S -d laplacian_filter3_n3 | grep "vmov"

NEONの命令の vmov があるかないかでベクトル化されているかどうかを調査した。
clang_4_150711.png
こちらも自動ベクトル化されているようだ。

laplacian_filter4.c の最適化テストを行った。下にコンパイル・コマンドを示す。

clang laplacian_filter4.c -o laplacian_filter4
clang -O1 laplacian_filter4.c -o laplacian_filter4_O1
clang -O2 laplacian_filter4.c -o laplacian_filter4_O2
clang -O3 laplacian_filter4.c -o laplacian_filter4_O3
clang -Os laplacian_filter4.c -o laplacian_filter4_Os
clang -mcpu=cortex-a9 -mfpu=neon -mfloat-abi=hard -O3 laplacian_filter4.c -o laplacian_filter4_n3

自動ベクトル化オプションを付けてコンパイルした実行形式ファイルについては、以下のコマンドで、

objdump -S -d laplacian_filter4_n3 | grep "vmov"

NEONの命令の vmov があるかないかでベクトル化されているかどうかを調査した。
clang_5_150711.png
自動ベクトル化はされて無かった。

laplacian_filter.c の自動ベクトル化の-Oフラグによる違いを検証した。それぞれの実行形式ファイルはn の後の添字が最適化フラグ -O の値を示している。
更に、objdump -S -d laplacian_filter1_n? | grep "vmov" -Cをそれぞれの実行形式ファイルについて実行して自動ベクトル化されているかどうかを確認した。返り値が 0 でない数字の実行形式ファイルが自動ベクトル化されている。
clang_6_150711.png

laplacian_filte2r.c の自動ベクトル化の-Oフラグによる違いを検証した。それぞれの実行形式ファイルはn の後の添字が最適化フラグ -O の値を示している。
更に、objdump -S -d laplacian_filter2_n? | grep "vmov" -Cをそれぞれの実行形式ファイルについて実行して自動ベクトル化されているかどうかを確認した。返り値が 0 でない数字の実行形式ファイルが自動ベクトル化されている。
clang_7_150711.png

laplacian_filte3r.c の自動ベクトル化の-Oフラグによる違いを検証した。それぞれの実行形式ファイルはn の後の添字が最適化フラグ -O の値を示している。
更に、objdump -S -d laplacian_filter3_n? | grep "vmov" -Cをそれぞれの実行形式ファイルについて実行して自動ベクトル化されているかどうかを確認した。返り値が 0 でない数字の実行形式ファイルが自動ベクトル化されている。
clang_8_150711.png

laplacian_filter4.c の自動ベクトル化の-Oフラグによる違いを検証した。それぞれの実行形式ファイルはn の後の添字が最適化フラグ -O の値を示している。
更に、objdump -S -d laplacian_filter4_n? | grep "vmov" -Cをそれぞれの実行形式ファイルについて実行して自動ベクトル化されているかどうかを確認した。返り値が 0 でない数字の実行形式ファイルが自動ベクトル化されている。
clang_9_150711.png

以前の gcc 4.6 と 4.8 の結果を示す。自動ベクトル化された実行形式ファイルはフォントの色を赤に変更してある。
clang_10_150711.png

今回の clang-3.4, llvm-3.4 の結果を示す。自動ベクトル化された実行形式ファイルはフォントの色を赤に変更してある。
clang_11_150711.png

clang の実行時間データの中で最速のデータは、clang の 自動ベクトル化、-Osの時の laplacian_filter2 だったが、gcc-4.8 の実行時間が一番速いようだ。

自動ベクトル化すると、gcc, clang 共に速くなることがわかった。
gcc-4.6 で最速の77.7 ms が自動ベクトル化された時の実行時間だ。自動ベクトル化されていない時は 82.2 ms だったのが表からわかる。これは、83.6 ms / 77.7 ms ≒ 1.08 倍に速くなっている。

gcc-4.8 で、自動ベクトル化された最速の 74.4 ms の自動ベクトル化なしの場合は、82.2 ms だった。これは、82.2 ms / 74.4 ≒ 1.10 倍に速くなっている。

clang-3.4 で、自動ベクトル化された最速の 87.4 ms の自動ベクトル化なしの場合は、105 ms だった。これは、105 ms / 87.4 ms ≒ 1.20 倍速くなっている。

オプションによる実行時間の差が大きい事があるのが分かったので、少なくとも最適化オプションは全て確かめてみるべきだろうと思う。
  1. 2015年07月11日 20:07 |
  2. Zynq
  3. | トラックバック:0
  4. | コメント:0

gcc の最適化と自動ベクトル化を使用した時の性能3

(2015/07/11:タイトルが間違っていたので変更しました)

gcc の最適化と自動ベクトル化を使用した時の性能2”の続き。

前回は gcc 4.8 の時のコンパイル・オプションやNEON 最適化ライブラリを使用するためのコンパイラ・オプションを使った時の性能差を表にまとめた。
今回は、NEON最適化ライブラリを使用するコンパイラ・オプションを付けた時に本当のNEONを使用するアセンブラ・コードが出ているかを検証する。

実行環境はZYBOで、Dual Cortex-A9 650 MHz プロセッサを持ち、Ubuntu 14.04 LTS が動作している。

久しぶりにくりさんがコメントを寄せてくれて、ベクトル化の情報を表示するコンパイラ・オプション -ftree-vectorizer-verbose=1 を教えて頂いた。これを使ってベクトル化されているかどうかを検証してみたい。(Introducing NEON Development Article 1.4.3. Automatic vectorization を参照した)

最初に laplacian_filter.c
gcc -mcpu=cortex-a9 -mfpu=neon -mvectorize-with-neon-quad -ffast-math -O3 -ftree-vectorizer-verbose=1 laplacian_filter.c -o laplacian_filter1
でコンパイルした。
NEON_23_150709.png

ベクトル化されていない。初期化や終了処理を含まないラプラシアンフィルタ処理時間は、128 ms だった。

次に、laplacian_filter2.c
gcc -mcpu=cortex-a9 -mfpu=neon -mvectorize-with-neon-quad -ffast-math -O3 -ftree-vectorizer-verbose=1 laplacian_filter2.c -o laplacian_filter2
でコンパイルした。
NEON_24_150709.png

ベクトル化されている。初期化や終了処理を含まないラプラシアンフィルタ処理時間は、938 ms だった。

ちなみにベクトル化するには最適化レベル3 (-O3) でする必要があるようだ。laplacian_filter2.c で -O3 以外でコンパイルすると、メッセージが何も出てこない。
NEON_25_150709.png

laplacian_filter3.c
gcc -mcpu=cortex-a9 -mfpu=neon -mvectorize-with-neon-quad -ffast-math -O3 -ftree-vectorizer-verbose=1 laplacian_filter3.c -o laplacian_filter3
でコンパイルした。
NEON_26_150709.png

これもベクトル化されている。初期化や終了処理を含まないラプラシアンフィルタ処理時間は、747 ms だった。

laplacian_filter4.c
gcc -mcpu=cortex-a9 -mfpu=neon -mvectorize-with-neon-quad -ffast-math -O3 -ftree-vectorizer-verbose=1 laplacian_filter4.c -o laplacian_filter4
でコンパイルした。
NEON_27_150709.png

ベクトル化されていない。初期化や終了処理を含まないラプラシアンフィルタ処理時間は、888 ms だった。

ベクトル化されたのは、ソフトウェアのラプラシアンフィルタのCソースコードを memcpy() で置き換えて、Vivado HLS 対応にしたものだ。laplacian_filter4.c まで Vivado HLS に最適化すると、gcc はベクトル化できないようだ。

最後に、
objdump -S -d laplacian_filter3 > laplacian_filter3.asm
で、逆アセンブルした laplacian_filter3 のobjdump 結果を貼っておく。vshl や vaddi, vsub などのNEONを使用するコードが使われている。


laplacian_filter3:     file format elf32-littlearm


Disassembly of section .init:

00008428 <_init>:
    8428:    e92d4008     push    {r3, lr}
    842c:    eb0001a8     bl    8ad4 <call_weak_fn>
    8430:    e8bd8008     pop    {r3, pc}

Disassembly of section .plt:

00008434 <.plt>:
    8434:    e52de004     push    {lr}        ; (str lr, [sp, #-4]!)
    8438:    e59fe004     ldr    lr, [pc, #4]    ; 8444 <_init+0x1c>
    843c:    e08fe00e     add    lr, pc, lr
    8440:    e5bef008     ldr    pc, [lr, #8]!
    8444:    00008bbc     .word    0x00008bbc
    8448:    e28fc600     add    ip, pc, #0, 12
    844c:    e28cca08     add    ip, ip, #8, 20    ; 0x8000
    8450:    e5bcfbbc     ldr    pc, [ip, #3004]!    ; 0xbbc
    8454:    e28fc600     add    ip, pc, #0, 12
    8458:    e28cca08     add    ip, ip, #8, 20    ; 0x8000
    845c:    e5bcfbb4     ldr    pc, [ip, #2996]!    ; 0xbb4
    8460:    e28fc600     add    ip, pc, #0, 12
    8464:    e28cca08     add    ip, ip, #8, 20    ; 0x8000
    8468:    e5bcfbac     ldr    pc, [ip, #2988]!    ; 0xbac
    846c:    e28fc600     add    ip, pc, #0, 12
    8470:    e28cca08     add    ip, ip, #8, 20    ; 0x8000
    8474:    e5bcfba4     ldr    pc, [ip, #2980]!    ; 0xba4
    8478:    e28fc600     add    ip, pc, #0, 12
    847c:    e28cca08     add    ip, ip, #8, 20    ; 0x8000
    8480:    e5bcfb9c     ldr    pc, [ip, #2972]!    ; 0xb9c
    8484:    e28fc600     add    ip, pc, #0, 12
    8488:    e28cca08     add    ip, ip, #8, 20    ; 0x8000
    848c:    e5bcfb94     ldr    pc, [ip, #2964]!    ; 0xb94
    8490:    e28fc600     add    ip, pc, #0, 12
    8494:    e28cca08     add    ip, ip, #8, 20    ; 0x8000
    8498:    e5bcfb8c     ldr    pc, [ip, #2956]!    ; 0xb8c
    849c:    e28fc600     add    ip, pc, #0, 12
    84a0:    e28cca08     add    ip, ip, #8, 20    ; 0x8000
    84a4:    e5bcfb84     ldr    pc, [ip, #2948]!    ; 0xb84
    84a8:    e28fc600     add    ip, pc, #0, 12
    84ac:    e28cca08     add    ip, ip, #8, 20    ; 0x8000
    84b0:    e5bcfb7c     ldr    pc, [ip, #2940]!    ; 0xb7c
    84b4:    e28fc600     add    ip, pc, #0, 12
    84b8:    e28cca08     add    ip, ip, #8, 20    ; 0x8000
    84bc:    e5bcfb74     ldr    pc, [ip, #2932]!    ; 0xb74
    84c0:    e28fc600     add    ip, pc, #0, 12
    84c4:    e28cca08     add    ip, ip, #8, 20    ; 0x8000
    84c8:    e5bcfb6c     ldr    pc, [ip, #2924]!    ; 0xb6c
    84cc:    e28fc600     add    ip, pc, #0, 12
    84d0:    e28cca08     add    ip, ip, #8, 20    ; 0x8000
    84d4:    e5bcfb64     ldr    pc, [ip, #2916]!    ; 0xb64

Disassembly of section .text:

000084d8 <main>:
    84d8:    e92d 4ff0     stmdb    sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
    84dc:    f648 4044     movw    r0, #35908    ; 0x8c44
    84e0:    ed2d 8b04     vpush    {d8-d9}
    84e4:    f5ad 5d49     sub.w    sp, sp, #12864    ; 0x3240
    84e8:    b083          sub    sp, #12
    84ea:    2102          movs    r1, #2
    84ec:    f2c0 0000     movt    r0, #0
    84f0:    f7ff efce     blx    8490 <_init+0x68>
    84f4:    2800          cmp    r0, #0
    84f6:    bfdf          itttt    le
    84f8:    f241 0348     movwle    r3, #4168    ; 0x1048
    84fc:    f648 4050     movwle    r0, #35920    ; 0x8c50
    8500:    f2c0 0301     movtle    r3, #1
    8504:    f2c0 0000     movtle    r0, #0
    8508:    f340 812d     ble.w    8766 <main+0x28e>
    850c:    2400          movs    r4, #0
    850e:    f04f 7180     mov.w    r1, #16777216    ; 0x1000000
    8512:    e88d 0011     stmia.w    sp, {r0, r4}
    8516:    2203          movs    r2, #3
    8518:    4620          mov    r0, r4
    851a:    2301          movs    r3, #1
    851c:    f7ff efc4     blx    84a8 <_init+0x80>
    8520:    900a          str    r0, [sp, #40]    ; 0x28
    8522:    2800          cmp    r0, #0
    8524:    f000 80e4     beq.w    86f0 <main+0x218>
    8528:    f500 0500     add.w    r5, r0, #8388608    ; 0x800000
    852c:    f500 0620     add.w    r6, r0, #10485760    ; 0xa00000
    8530:    08b6          lsrs    r6, r6, #2
    8532:    08ad          lsrs    r5, r5, #2
    8534:    ff87 805f     vmov.i32    q4, #255    ; 0x000000ff
    8538:    a80e          add    r0, sp, #56    ; 0x38
    853a:    4621          mov    r1, r4
    853c:    f7ff ef96     blx    846c <_init+0x44>
    8540:    1bab          subs    r3, r5, r6
    8542:    f04f 0902     mov.w    r9, #2
    8546:    009b          lsls    r3, r3, #2
    8548:    ea4f 0c86     mov.w    ip, r6, lsl #2
    854c:    00ad          lsls    r5, r5, #2
    854e:    f503 6348     add.w    r3, r3, #3200    ; 0xc80
    8552:    9307          str    r3, [sp, #28]
    8554:    f10d 0b48     add.w    fp, sp, #72    ; 0x48
    8558:    464b          mov    r3, r9
    855a:    46a0          mov    r8, r4
    855c:    4626          mov    r6, r4
    855e:    2701          movs    r7, #1
    8560:    f240 3a1f     movw    sl, #799    ; 0x31f
    8564:    46a1          mov    r9, r4
    8566:    950b          str    r5, [sp, #44]    ; 0x2c
    8568:    9907          ldr    r1, [sp, #28]
    856a:    f240 2057     movw    r0, #599    ; 0x257
    856e:    f44f 6248     mov.w    r2, #3200    ; 0xc80
    8572:    f1b8 0f00     cmp.w    r8, #0
    8576:    bf18          it    ne
    8578:    4580          cmpne    r8, r0
    857a:    fb02 f203     mul.w    r2, r2, r3
    857e:    f44f 6048     mov.w    r0, #3200    ; 0xc80
    8582:    4461          add    r1, ip
    8584:    bf08          it    eq
    8586:    2301          moveq    r3, #1
    8588:    9106          str    r1, [sp, #24]
    858a:    f60d 41c8     addw    r1, sp, #3272    ; 0xcc8
    858e:    fb00 1606     mla    r6, r0, r6, r1
    8592:    f102 0504     add.w    r5, r2, #4
    8596:    bf18          it    ne
    8598:    2300          movne    r3, #0
    859a:    440a          add    r2, r1
    859c:    2400          movs    r4, #0
    859e:    3e04          subs    r6, #4
    85a0:    440d          add    r5, r1
    85a2:    9208          str    r2, [sp, #32]
    85a4:    fb00 1707     mla    r7, r0, r7, r1
    85a8:    f102 0020     add.w    r0, r2, #32
    85ac:    9005          str    r0, [sp, #20]
    85ae:    2200          movs    r2, #0
    85b0:    bb43          cbnz    r3, 8604 <main+0x12c>
    85b2:    2c00          cmp    r4, #0
    85b4:    bf18          it    ne
    85b6:    4554          cmpne    r4, sl
    85b8:    bf08          it    eq
    85ba:    461a          moveq    r2, r3
    85bc:    d022          beq.n    8604 <main+0x12c>
    85be:    2c01          cmp    r4, #1
    85c0:    f000 80da     beq.w    8778 <main+0x2a0>
    85c4:    6832          ldr    r2, [r6, #0]
    85c6:    6871          ldr    r1, [r6, #4]
    85c8:    68b0          ldr    r0, [r6, #8]
    85ca:    f1c2 0e00     rsb    lr, r2, #0
    85ce:    f857 2c04     ldr.w    r2, [r7, #-4]
    85d2:    ebc1 0e0e     rsb    lr, r1, lr
    85d6:    6839          ldr    r1, [r7, #0]
    85d8:    ebc0 0e0e     rsb    lr, r0, lr
    85dc:    ebc2 0e0e     rsb    lr, r2, lr
    85e0:    687a          ldr    r2, [r7, #4]
    85e2:    eb0e 0ec1     add.w    lr, lr, r1, lsl #3
    85e6:    e915 0003     ldmdb    r5, {r0, r1}
    85ea:    ebc2 0e0e     rsb    lr, r2, lr
    85ee:    682a          ldr    r2, [r5, #0]
    85f0:    ebc0 000e     rsb    r0, r0, lr
    85f4:    1a41          subs    r1, r0, r1
    85f6:    1a89          subs    r1, r1, r2
    85f8:    f381 0108     usat    r1, #8, r1
    85fc:    020a          lsls    r2, r1, #8
    85fe:    eb02 4201     add.w    r2, r2, r1, lsl #16
    8602:    440a          add    r2, r1
    8604:    f84b 2024     str.w    r2, [fp, r4, lsl #2]
    8608:    3401          adds    r4, #1
    860a:    f5b4 7f48     cmp.w    r4, #800    ; 0x320
    860e:    f106 0604     add.w    r6, r6, #4
    8612:    f107 0704     add.w    r7, r7, #4
    8616:    f105 0504     add.w    r5, r5, #4
    861a:    d1c8          bne.n    85ae <main+0xd6>
    861c:    f50c 6448     add.w    r4, ip, #3200    ; 0xc80
    8620:    f109 0901     add.w    r9, r9, #1
    8624:    4660          mov    r0, ip
    8626:    4659          mov    r1, fp
    8628:    f44f 6248     mov.w    r2, #3200    ; 0xc80
    862c:    f894 f000     pld    [r4]
    8630:    f7ff ef0a     blx    8448 <_init+0x20>
    8634:    f1b9 0f03     cmp.w    r9, #3
    8638:    dd0c          ble.n    8654 <main+0x17c>
    863a:    f240 2057     movw    r0, #599    ; 0x257
    863e:    4580          cmp    r8, r0
    8640:    d01a          beq.n    8678 <main+0x1a0>
    8642:    f04f 0901     mov.w    r9, #1
    8646:    2302          movs    r3, #2
    8648:    2701          movs    r7, #1
    864a:    2600          movs    r6, #0
    864c:    f108 0801     add.w    r8, r8, #1
    8650:    46a4          mov    ip, r4
    8652:    e789          b.n    8568 <main+0x90>
    8654:    f240 2357     movw    r3, #599    ; 0x257
    8658:    4598          cmp    r8, r3
    865a:    d00d          beq.n    8678 <main+0x1a0>
    865c:    f1b9 0f02     cmp.w    r9, #2
    8660:    d006          beq.n    8670 <main+0x198>
    8662:    f1b9 0f03     cmp.w    r9, #3
    8666:    d1ee          bne.n    8646 <main+0x16e>
    8668:    2301          movs    r3, #1
    866a:    2700          movs    r7, #0
    866c:    2602          movs    r6, #2
    866e:    e7ed          b.n    864c <main+0x174>
    8670:    2300          movs    r3, #0
    8672:    464f          mov    r7, r9
    8674:    2601          movs    r6, #1
    8676:    e7e9          b.n    864c <main+0x174>
    8678:    2100          movs    r1, #0
    867a:    a810          add    r0, sp, #64    ; 0x40
    867c:    f7ff eef6     blx    846c <_init+0x44>
    8680:    f04f 7180     mov.w    r1, #16777216    ; 0x1000000
    8684:    980a          ldr    r0, [sp, #40]    ; 0x28
    8686:    f7ff ef1c     blx    84c0 <_init+0x98>
    868a:    f648 4084     movw    r0, #35972    ; 0x8c84
    868e:    2102          movs    r1, #2
    8690:    f2c0 0000     movt    r0, #0
    8694:    f7ff eefc     blx    8490 <_init+0x68>
    8698:    1e03          subs    r3, r0, #0
    869a:    dd5c          ble.n    8756 <main+0x27e>
    869c:    2000          movs    r0, #0
    869e:    9300          str    r3, [sp, #0]
    86a0:    9001          str    r0, [sp, #4]
    86a2:    f44f 3180     mov.w    r1, #65536    ; 0x10000
    86a6:    2203          movs    r2, #3
    86a8:    2301          movs    r3, #1
    86aa:    f7ff eefe     blx    84a8 <_init+0x80>
    86ae:    2800          cmp    r0, #0
    86b0:    d040          beq.n    8734 <main+0x25c>
    86b2:    f04f 52c1     mov.w    r2, #404750336    ; 0x18200000
    86b6:    f44f 3180     mov.w    r1, #65536    ; 0x10000
    86ba:    6002          str    r2, [r0, #0]
    86bc:    f7ff ef00     blx    84c0 <_init+0x98>
    86c0:    9b0f          ldr    r3, [sp, #60]    ; 0x3c
    86c2:    9811          ldr    r0, [sp, #68]    ; 0x44
    86c4:    9c10          ldr    r4, [sp, #64]    ; 0x40
    86c6:    4298          cmp    r0, r3
    86c8:    db23          blt.n    8712 <main+0x23a>
    86ca:    f85b 2c10     ldr.w    r2, [fp, #-16]
    86ce:    f648 41c4     movw    r1, #36036    ; 0x8cc4
    86d2:    1ac3          subs    r3, r0, r3
    86d4:    f2c0 0100     movt    r1, #0
    86d8:    2001          movs    r0, #1
    86da:    1aa2          subs    r2, r4, r2
    86dc:    f7ff eeea     blx    84b4 <_init+0x8c>
    86e0:    2000          movs    r0, #0
    86e2:    f50d 5d49     add.w    sp, sp, #12864    ; 0x3240
    86e6:    b003          add    sp, #12
    86e8:    ecbd 8b04     vpop    {d8-d9}
    86ec:    e8bd 8ff0     ldmia.w    sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc}
    86f0:    f241 0348     movw    r3, #4168    ; 0x1048
    86f4:    f648 4068     movw    r0, #35944    ; 0x8c68
    86f8:    f2c0 0301     movt    r3, #1
    86fc:    f2c0 0000     movt    r0, #0
    8700:    681b          ldr    r3, [r3, #0]
    8702:    2101          movs    r1, #1
    8704:    2218          movs    r2, #24
    8706:    f7ff eeac     blx    8460 <_init+0x38>
    870a:    f04f 30ff     mov.w    r0, #4294967295
    870e:    f7ff eec6     blx    849c <_init+0x74>
    8712:    f85b 2c10     ldr.w    r2, [fp, #-16]
    8716:    f500 2074     add.w    r0, r0, #999424    ; 0xf4000
    871a:    f500 7010     add.w    r0, r0, #576    ; 0x240
    871e:    f648 41c4     movw    r1, #36036    ; 0x8cc4
    8722:    1ac3          subs    r3, r0, r3
    8724:    f2c0 0100     movt    r1, #0
    8728:    1aa2          subs    r2, r4, r2
    872a:    2001          movs    r0, #1
    872c:    3a01          subs    r2, #1
    872e:    f7ff eec2     blx    84b4 <_init+0x8c>
    8732:    e7d5          b.n    86e0 <main+0x208>
    8734:    f241 0348     movw    r3, #4168    ; 0x1048
    8738:    f648 40a8     movw    r0, #36008    ; 0x8ca8
    873c:    f2c0 0301     movt    r3, #1
    8740:    f2c0 0000     movt    r0, #0
    8744:    681b          ldr    r3, [r3, #0]
    8746:    2101          movs    r1, #1
    8748:    221a          movs    r2, #26
    874a:    f7ff ee8a     blx    8460 <_init+0x38>
    874e:    f04f 30ff     mov.w    r0, #4294967295
    8752:    f7ff eea4     blx    849c <_init+0x74>
    8756:    f241 0348     movw    r3, #4168    ; 0x1048
    875a:    f648 4090     movw    r0, #35984    ; 0x8c90
    875e:    f2c0 0301     movt    r3, #1
    8762:    f2c0 0000     movt    r0, #0
    8766:    681b          ldr    r3, [r3, #0]
    8768:    2101          movs    r1, #1
    876a:    2215          movs    r2, #21
    876c:    f7ff ee78     blx    8460 <_init+0x38>
    8770:    f04f 30ff     mov.w    r0, #4294967295
    8774:    f7ff ee92     blx    849c <_init+0x74>
    8778:    f1b8 0f01     cmp.w    r8, #1
    877c:    f000 80be     beq.w    88fc <main+0x424>
    8780:    9906          ldr    r1, [sp, #24]
    8782:    f44f 6248     mov.w    r2, #3200    ; 0xc80
    8786:    9808          ldr    r0, [sp, #32]
    8788:    9302          str    r3, [sp, #8]
    878a:    f8cd c00c     str.w    ip, [sp, #12]
    878e:    f7ff ee5c     blx    8448 <_init+0x20>
    8792:    9a05          ldr    r2, [sp, #20]
    8794:    9b02          ldr    r3, [sp, #8]
    8796:    f8dd c00c     ldr.w    ip, [sp, #12]
    879a:    4611          mov    r1, r2
    879c:    4618          mov    r0, r3
    879e:    ed52 0b08     vldr    d16, [r2, #-32]    ; 0xffffffe0
    87a2:    ed52 1b06     vldr    d17, [r2, #-24]    ; 0xffffffe8
    87a6:    eff0 2070     vshr.s32    q9, q8, #16
    87aa:    f892 f0a0     pld    [r2, #160]    ; 0xa0
    87ae:    3002          adds    r0, #2
    87b0:    eff8 4070     vshr.s32    q10, q8, #8
    87b4:    28c6          cmp    r0, #198    ; 0xc6
    87b6:    4696          mov    lr, r2
    87b8:    9109          str    r1, [sp, #36]    ; 0x24
    87ba:    ef42 21d8     vand    q9, q9, q4
    87be:    f102 0220     add.w    r2, r2, #32
    87c2:    ef44 41d8     vand    q10, q10, q4
    87c6:    f101 0120     add.w    r1, r1, #32
    87ca:    ef40 01d8     vand    q8, q8, q4
    87ce:    efe2 a572     vshl.s32    q13, q9, #2
    87d2:    efe2 6574     vshl.s32    q11, q10, #2
    87d6:    ef6a a8e2     vadd.i32    q13, q13, q9
    87da:    ef66 48e4     vadd.i32    q10, q11, q10
    87de:    efe3 6570     vshl.s32    q11, q8, #3
    87e2:    efe1 a57a     vshl.s32    q13, q13, #1
    87e6:    efe4 8574     vshl.s32    q12, q10, #4
    87ea:    ef6a 28e2     vadd.i32    q9, q13, q9
    87ee:    ff66 68e0     vsub.i32    q11, q11, q8
    87f2:    ff68 48e4     vsub.i32    q10, q12, q10
    87f6:    efe3 8572     vshl.s32    q12, q9, #3
    87fa:    efe1 4574     vshl.s32    q10, q10, #1
    87fe:    efe2 6576     vshl.s32    q11, q11, #2
    8802:    ff68 28e2     vsub.i32    q9, q12, q9
    8806:    ef66 08e0     vadd.i32    q8, q11, q8
    880a:    ef62 28e4     vadd.i32    q9, q9, q10
    880e:    ef62 08e0     vadd.i32    q8, q9, q8
    8812:    eff8 0070     vshr.s32    q8, q8, #8
    8816:    ed41 0b10     vstr    d16, [r1, #-64]    ; 0xffffffc0
    881a:    ed41 1b0e     vstr    d17, [r1, #-56]    ; 0xffffffc8
    881e:    ed52 0b0c     vldr    d16, [r2, #-48]    ; 0xffffffd0
    8822:    ed52 1b0a     vldr    d17, [r2, #-40]    ; 0xffffffd8
    8826:    eff0 2070     vshr.s32    q9, q8, #16
    882a:    eff8 4070     vshr.s32    q10, q8, #8
    882e:    ef42 21d8     vand    q9, q9, q4
    8832:    ef44 41d8     vand    q10, q10, q4
    8836:    ef40 01d8     vand    q8, q8, q4
    883a:    efe2 a572     vshl.s32    q13, q9, #2
    883e:    efe2 6574     vshl.s32    q11, q10, #2
    8842:    ef6a a8e2     vadd.i32    q13, q13, q9
    8846:    ef66 48e4     vadd.i32    q10, q11, q10
    884a:    efe3 6570     vshl.s32    q11, q8, #3
    884e:    efe1 a57a     vshl.s32    q13, q13, #1
    8852:    efe4 8574     vshl.s32    q12, q10, #4
    8856:    ef6a 28e2     vadd.i32    q9, q13, q9
    885a:    ff66 68e0     vsub.i32    q11, q11, q8
    885e:    ff68 48e4     vsub.i32    q10, q12, q10
    8862:    efe3 8572     vshl.s32    q12, q9, #3
    8866:    efe1 4574     vshl.s32    q10, q10, #1
    886a:    efe2 6576     vshl.s32    q11, q11, #2
    886e:    ff68 28e2     vsub.i32    q9, q12, q9
    8872:    ef66 08e0     vadd.i32    q8, q11, q8
    8876:    ef62 28e4     vadd.i32    q9, q9, q10
    887a:    ef62 08e0     vadd.i32    q8, q9, q8
    887e:    eff8 0070     vshr.s32    q8, q8, #8
    8882:    ed41 0b0c     vstr    d16, [r1, #-48]    ; 0xffffffd0
    8886:    ed41 1b0a     vstr    d17, [r1, #-40]    ; 0xffffffd8
    888a:    d188          bne.n    879e <main+0x2c6>
    888c:    9a09          ldr    r2, [sp, #36]    ; 0x24
    888e:    e000          b.n    8892 <main+0x3ba>
    8890:    20c7          movs    r0, #199    ; 0xc7
    8892:    f96e 0add     vld1.64    {d16-d17}, [lr :64]!
    8896:    eff0 2070     vshr.s32    q9, q8, #16
    889a:    28c6          cmp    r0, #198    ; 0xc6
    889c:    eff8 4070     vshr.s32    q10, q8, #8
    88a0:    ef42 21d8     vand    q9, q9, q4
    88a4:    ef44 41d8     vand    q10, q10, q4
    88a8:    ef40 01d8     vand    q8, q8, q4
    88ac:    efe2 a572     vshl.s32    q13, q9, #2
    88b0:    efe2 6574     vshl.s32    q11, q10, #2
    88b4:    ef6a a8e2     vadd.i32    q13, q13, q9
    88b8:    ef66 48e4     vadd.i32    q10, q11, q10
    88bc:    efe3 6570     vshl.s32    q11, q8, #3
    88c0:    efe1 a57a     vshl.s32    q13, q13, #1
    88c4:    efe4 8574     vshl.s32    q12, q10, #4
    88c8:    ef6a 28e2     vadd.i32    q9, q13, q9
    88cc:    ff66 68e0     vsub.i32    q11, q11, q8
    88d0:    ff68 48e4     vsub.i32    q10, q12, q10
    88d4:    efe3 8572     vshl.s32    q12, q9, #3
    88d8:    efe1 4574     vshl.s32    q10, q10, #1
    88dc:    efe2 6576     vshl.s32    q11, q11, #2
    88e0:    ff68 28e2     vsub.i32    q9, q12, q9
    88e4:    ef66 08e0     vadd.i32    q8, q11, q8
    88e8:    ef62 28e4     vadd.i32    q9, q9, q10
    88ec:    ef62 08e0     vadd.i32    q8, q9, q8
    88f0:    eff8 0070     vshr.s32    q8, q8, #8
    88f4:    f942 0add     vst1.64    {d16-d17}, [r2 :64]!
    88f8:    d0ca          beq.n    8890 <main+0x3b8>
    88fa:    e663          b.n    85c4 <main+0xec>
    88fc:    980b          ldr    r0, [sp, #44]    ; 0x2c
    88fe:    f50d 5149     add.w    r1, sp, #12864    ; 0x3240
    8902:    3128          adds    r1, #40    ; 0x28
    8904:    f60d 42e8     addw    r2, sp, #3304    ; 0xce8
    8908:    9104          str    r1, [sp, #16]
    890a:    940c          str    r4, [sp, #48]    ; 0x30
    890c:    4601          mov    r1, r0
    890e:    930d          str    r3, [sp, #52]    ; 0x34
    8910:    4664          mov    r4, ip
    8912:    4613          mov    r3, r2
    8914:    9009          str    r0, [sp, #36]    ; 0x24
    8916:    f1a3 0020     sub.w    r0, r3, #32
    891a:    f44f 6248     mov.w    r2, #3200    ; 0xc80
    891e:    9302          str    r3, [sp, #8]
    8920:    f7ff ed92     blx    8448 <_init+0x20>
    8924:    9b02          ldr    r3, [sp, #8]
    8926:    2000          movs    r0, #0
    8928:    461a          mov    r2, r3
    892a:    4619          mov    r1, r3
    892c:    ed52 0b08     vldr    d16, [r2, #-32]    ; 0xffffffe0
    8930:    ed52 1b06     vldr    d17, [r2, #-24]    ; 0xffffffe8
    8934:    eff0 2070     vshr.s32    q9, q8, #16
    8938:    f892 f0a0     pld    [r2, #160]    ; 0xa0
    893c:    3002          adds    r0, #2
    893e:    eff8 4070     vshr.s32    q10, q8, #8
    8942:    28c6          cmp    r0, #198    ; 0xc6
    8944:    4696          mov    lr, r2
    8946:    468c          mov    ip, r1
    8948:    ef42 21d8     vand    q9, q9, q4
    894c:    f102 0220     add.w    r2, r2, #32
    8950:    ef44 41d8     vand    q10, q10, q4
    8954:    f101 0120     add.w    r1, r1, #32
    8958:    ef40 01d8     vand    q8, q8, q4
    895c:    efe2 a572     vshl.s32    q13, q9, #2
    8960:    efe2 6574     vshl.s32    q11, q10, #2
    8964:    ef6a a8e2     vadd.i32    q13, q13, q9
    8968:    ef66 48e4     vadd.i32    q10, q11, q10
    896c:    efe3 6570     vshl.s32    q11, q8, #3
    8970:    efe1 a57a     vshl.s32    q13, q13, #1
    8974:    efe4 8574     vshl.s32    q12, q10, #4
    8978:    ef6a 28e2     vadd.i32    q9, q13, q9
    897c:    ff66 68e0     vsub.i32    q11, q11, q8
    8980:    ff68 48e4     vsub.i32    q10, q12, q10
    8984:    efe3 8572     vshl.s32    q12, q9, #3
    8988:    efe1 4574     vshl.s32    q10, q10, #1
    898c:    efe2 6576     vshl.s32    q11, q11, #2
    8990:    ff68 28e2     vsub.i32    q9, q12, q9
    8994:    ef66 08e0     vadd.i32    q8, q11, q8
    8998:    ef62 28e4     vadd.i32    q9, q9, q10
    899c:    ef62 08e0     vadd.i32    q8, q9, q8
    89a0:    eff8 0070     vshr.s32    q8, q8, #8
    89a4:    ed41 0b10     vstr    d16, [r1, #-64]    ; 0xffffffc0
    89a8:    ed41 1b0e     vstr    d17, [r1, #-56]    ; 0xffffffc8
    89ac:    ed52 0b0c     vldr    d16, [r2, #-48]    ; 0xffffffd0
    89b0:    ed52 1b0a     vldr    d17, [r2, #-40]    ; 0xffffffd8
    89b4:    eff0 2070     vshr.s32    q9, q8, #16
    89b8:    eff8 4070     vshr.s32    q10, q8, #8
    89bc:    ef42 21d8     vand    q9, q9, q4
    89c0:    ef44 41d8     vand    q10, q10, q4
    89c4:    ef40 01d8     vand    q8, q8, q4
    89c8:    efe2 a572     vshl.s32    q13, q9, #2
    89cc:    efe2 6574     vshl.s32    q11, q10, #2
    89d0:    ef6a a8e2     vadd.i32    q13, q13, q9
    89d4:    ef66 48e4     vadd.i32    q10, q11, q10
    89d8:    efe3 6570     vshl.s32    q11, q8, #3
    89dc:    efe1 a57a     vshl.s32    q13, q13, #1
    89e0:    efe4 8574     vshl.s32    q12, q10, #4
    89e4:    ef6a 28e2     vadd.i32    q9, q13, q9
    89e8:    ff66 68e0     vsub.i32    q11, q11, q8
    89ec:    ff68 48e4     vsub.i32    q10, q12, q10
    89f0:    efe3 8572     vshl.s32    q12, q9, #3
    89f4:    efe1 4574     vshl.s32    q10, q10, #1
    89f8:    efe2 6576     vshl.s32    q11, q11, #2
    89fc:    ff68 28e2     vsub.i32    q9, q12, q9
    8a00:    ef66 08e0     vadd.i32    q8, q11, q8
    8a04:    ef62 28e4     vadd.i32    q9, q9, q10
    8a08:    ef62 08e0     vadd.i32    q8, q9, q8
    8a0c:    eff8 0070     vshr.s32    q8, q8, #8
    8a10:    ed41 0b0c     vstr    d16, [r1, #-48]    ; 0xffffffd0
    8a14:    ed41 1b0a     vstr    d17, [r1, #-40]    ; 0xffffffd8
    8a18:    d188          bne.n    892c <main+0x454>
    8a1a:    4662          mov    r2, ip
    8a1c:    f96e 0add     vld1.64    {d16-d17}, [lr :64]!
    8a20:    eff0 2070     vshr.s32    q9, q8, #16
    8a24:    28c6          cmp    r0, #198    ; 0xc6
    8a26:    eff8 4070     vshr.s32    q10, q8, #8
    8a2a:    ef42 21d8     vand    q9, q9, q4
    8a2e:    ef44 41d8     vand    q10, q10, q4
    8a32:    ef40 01d8     vand    q8, q8, q4
    8a36:    efe2 a572     vshl.s32    q13, q9, #2
    8a3a:    efe2 6574     vshl.s32    q11, q10, #2
    8a3e:    ef6a a8e2     vadd.i32    q13, q13, q9
    8a42:    ef66 48e4     vadd.i32    q10, q11, q10
    8a46:    efe3 6570     vshl.s32    q11, q8, #3
    8a4a:    efe1 a57a     vshl.s32    q13, q13, #1
    8a4e:    efe4 8574     vshl.s32    q12, q10, #4
    8a52:    ef6a 28e2     vadd.i32    q9, q13, q9
    8a56:    ff66 68e0     vsub.i32    q11, q11, q8
    8a5a:    ff68 48e4     vsub.i32    q10, q12, q10
    8a5e:    efe3 8572     vshl.s32    q12, q9, #3
    8a62:    efe1 4574     vshl.s32    q10, q10, #1
    8a66:    efe2 6576     vshl.s32    q11, q11, #2
    8a6a:    ff68 28e2     vsub.i32    q9, q12, q9
    8a6e:    ef66 08e0     vadd.i32    q8, q11, q8
    8a72:    ef62 28e4     vadd.i32    q9, q9, q10
    8a76:    ef62 08e0     vadd.i32    q8, q9, q8
    8a7a:    eff8 0070     vshr.s32    q8, q8, #8
    8a7e:    f942 0add     vst1.64    {d16-d17}, [r2 :64]!
    8a82:    d101          bne.n    8a88 <main+0x5b0>
    8a84:    20c7          movs    r0, #199    ; 0xc7
    8a86:    e7c9          b.n    8a1c <main+0x544>
    8a88:    9a04          ldr    r2, [sp, #16]
    8a8a:    f503 6348     add.w    r3, r3, #3200    ; 0xc80
    8a8e:    9909          ldr    r1, [sp, #36]    ; 0x24
    8a90:    4293          cmp    r3, r2
    8a92:    f501 6148     add.w    r1, r1, #3200    ; 0xc80
    8a96:    9109          str    r1, [sp, #36]    ; 0x24
    8a98:    f47f af3d     bne.w    8916 <main+0x43e>
    8a9c:    46a4          mov    ip, r4
    8a9e:    9b0d          ldr    r3, [sp, #52]    ; 0x34
    8aa0:    9c0c          ldr    r4, [sp, #48]    ; 0x30
    8aa2:    e58f          b.n    85c4 <main+0xec>

00008aa4 <_start>:
    8aa4:    f04f 0b00     mov.w    fp, #0
    8aa8:    f04f 0e00     mov.w    lr, #0
    8aac:    bc02          pop    {r1}
    8aae:    466a          mov    r2, sp
    8ab0:    b404          push    {r2}
    8ab2:    b401          push    {r0}
    8ab4:    f8df c010     ldr.w    ip, [pc, #16]    ; 8ac8 <_start+0x24>
    8ab8:    f84d cd04     str.w    ip, [sp, #-4]!
    8abc:    4803          ldr    r0, [pc, #12]    ; (8acc <_start+0x28>)
    8abe:    4b04          ldr    r3, [pc, #16]    ; (8ad0 <_start+0x2c>)
    8ac0:    f7ff ecda     blx    8478 <_init+0x50>
    8ac4:    f7ff ed02     blx    84cc <_init+0xa4>
    8ac8:    00008c35     .word    0x00008c35
    8acc:    000084d9     .word    0x000084d9
    8ad0:    00008bf5     .word    0x00008bf5

00008ad4 <call_weak_fn>:
    8ad4:    e59f3014     ldr    r3, [pc, #20]    ; 8af0 <call_weak_fn+0x1c>
    8ad8:    e59f2014     ldr    r2, [pc, #20]    ; 8af4 <call_weak_fn+0x20>
    8adc:    e08f3003     add    r3, pc, r3
    8ae0:    e7932002     ldr    r2, [r3, r2]
    8ae4:    e3520000     cmp    r2, #0
    8ae8:    012fff1e     bxeq    lr
    8aec:    eafffe64     b    8484 <_init+0x5c>
    8af0:    0000851c     .word    0x0000851c
    8af4:    0000003c     .word    0x0000003c

00008af8 <deregister_tm_clones>:
    8af8:    4b07          ldr    r3, [pc, #28]    ; (8b18 <deregister_tm_clones+0x20>)
    8afa:    f241 0048     movw    r0, #4168    ; 0x1048
    8afe:    f2c0 0001     movt    r0, #1
    8b02:    1a1b          subs    r3, r3, r0
    8b04:    2b06          cmp    r3, #6
    8b06:    d800          bhi.n    8b0a <deregister_tm_clones+0x12>
    8b08:    4770          bx    lr
    8b0a:    f240 0300     movw    r3, #0
    8b0e:    f2c0 0300     movt    r3, #0
    8b12:    2b00          cmp    r3, #0
    8b14:    d0f8          beq.n    8b08 <deregister_tm_clones+0x10>
    8b16:    4718          bx    r3
    8b18:    0001104b     .word    0x0001104b

00008b1c <register_tm_clones>:
    8b1c:    f241 0348     movw    r3, #4168    ; 0x1048
    8b20:    f241 0048     movw    r0, #4168    ; 0x1048
    8b24:    f2c0 0301     movt    r3, #1
    8b28:    f2c0 0001     movt    r0, #1
    8b2c:    1a1b          subs    r3, r3, r0
    8b2e:    109b          asrs    r3, r3, #2
    8b30:    eb03 73d3     add.w    r3, r3, r3, lsr #31
    8b34:    1059          asrs    r1, r3, #1
    8b36:    d100          bne.n    8b3a <register_tm_clones+0x1e>
    8b38:    4770          bx    lr
    8b3a:    f240 0200     movw    r2, #0
    8b3e:    f2c0 0200     movt    r2, #0
    8b42:    2a00          cmp    r2, #0
    8b44:    d0f8          beq.n    8b38 <register_tm_clones+0x1c>
    8b46:    4710          bx    r2

00008b48 <__do_global_dtors_aux>:
    8b48:    b510          push    {r4, lr}
    8b4a:    f241 044c     movw    r4, #4172    ; 0x104c
    8b4e:    f2c0 0401     movt    r4, #1
    8b52:    7823          ldrb    r3, [r4, #0]
    8b54:    b91b          cbnz    r3, 8b5e <__do_global_dtors_aux+0x16>
    8b56:    f7ff ffcf     bl    8af8 <deregister_tm_clones>
    8b5a:    2301          movs    r3, #1
    8b5c:    7023          strb    r3, [r4, #0]
    8b5e:    bd10          pop    {r4, pc}

00008b60 <frame_dummy>:
    8b60:    f640 7014     movw    r0, #3860    ; 0xf14
    8b64:    f2c0 0001     movt    r0, #1
    8b68:    b508          push    {r3, lr}
    8b6a:    6803          ldr    r3, [r0, #0]
    8b6c:    b12b          cbz    r3, 8b7a <frame_dummy+0x1a>
    8b6e:    f240 0300     movw    r3, #0
    8b72:    f2c0 0300     movt    r3, #0
    8b76:    b103          cbz    r3, 8b7a <frame_dummy+0x1a>
    8b78:    4798          blx    r3
    8b7a:    e8bd 4008     ldmia.w    sp!, {r3, lr}
    8b7e:    e7cd          b.n    8b1c <register_tm_clones>

00008b80 <conv_rgb2y>:
    8b80:    2196          movs    r1, #150    ; 0x96
    8b82:    f3c0 2207     ubfx    r2, r0, #8, #8
    8b86:    fb01 f202     mul.w    r2, r1, r2
    8b8a:    b2c3          uxtb    r3, r0
    8b8c:    214d          movs    r1, #77    ; 0x4d
    8b8e:    f3c0 4007     ubfx    r0, r0, #16, #8
    8b92:    b410          push    {r4}
    8b94:    ebc3 04c3     rsb    r4, r3, r3, lsl #3
    8b98:    fb01 2000     mla    r0, r1, r0, r2
    8b9c:    eb03 0384     add.w    r3, r3, r4, lsl #2
    8ba0:    f85d 4b04     ldr.w    r4, [sp], #4
    8ba4:    4418          add    r0, r3
    8ba6:    1200          asrs    r0, r0, #8
    8ba8:    4770          bx    lr
    8baa:    bf00          nop

00008bac <laplacian_fil>:
    8bac:    b470          push    {r4, r5, r6}
    8bae:    4240          negs    r0, r0
    8bb0:    9c03          ldr    r4, [sp, #12]
    8bb2:    1a41          subs    r1, r0, r1
    8bb4:    1a8a          subs    r2, r1, r2
    8bb6:    9d04          ldr    r5, [sp, #16]
    8bb8:    1ad3          subs    r3, r2, r3
    8bba:    9e05          ldr    r6, [sp, #20]
    8bbc:    eb03 04c4     add.w    r4, r3, r4, lsl #3
    8bc0:    9906          ldr    r1, [sp, #24]
    8bc2:    9a07          ldr    r2, [sp, #28]
    8bc4:    1b65          subs    r5, r4, r5
    8bc6:    1bae          subs    r6, r5, r6
    8bc8:    1a71          subs    r1, r6, r1
    8bca:    bc70          pop    {r4, r5, r6}
    8bcc:    1a88          subs    r0, r1, r2
    8bce:    f380 0008     usat    r0, #8, r0
    8bd2:    4770          bx    lr

00008bd4 <chkhex>:
    8bd4:    b510          push    {r4, lr}
    8bd6:    4604          mov    r4, r0
    8bd8:    7800          ldrb    r0, [r0, #0]
    8bda:    b918          cbnz    r0, 8be4 <chkhex+0x10>
    8bdc:    e007          b.n    8bee <chkhex+0x1a>
    8bde:    f814 0f01     ldrb.w    r0, [r4, #1]!
    8be2:    b120          cbz    r0, 8bee <chkhex+0x1a>
    8be4:    f7ff ec36     blx    8454 <_init+0x2c>
    8be8:    2800          cmp    r0, #0
    8bea:    d1f8          bne.n    8bde <chkhex+0xa>
    8bec:    bd10          pop    {r4, pc}
    8bee:    2001          movs    r0, #1
    8bf0:    bd10          pop    {r4, pc}
    8bf2:    bf00          nop

00008bf4 <__libc_csu_init>:
    8bf4:    e92d 43f8     stmdb    sp!, {r3, r4, r5, r6, r7, r8, r9, lr}
    8bf8:    4607          mov    r7, r0
    8bfa:    4e0c          ldr    r6, [pc, #48]    ; (8c2c <__libc_csu_init+0x38>)
    8bfc:    4688          mov    r8, r1
    8bfe:    4d0c          ldr    r5, [pc, #48]    ; (8c30 <__libc_csu_init+0x3c>)
    8c00:    4691          mov    r9, r2
    8c02:    447e          add    r6, pc
    8c04:    f7ff ec10     blx    8428 <_init>
    8c08:    447d          add    r5, pc
    8c0a:    1b76          subs    r6, r6, r5
    8c0c:    10b6          asrs    r6, r6, #2
    8c0e:    d00a          beq.n    8c26 <__libc_csu_init+0x32>
    8c10:    3d04          subs    r5, #4
    8c12:    2400          movs    r4, #0
    8c14:    3401          adds    r4, #1
    8c16:    f855 3f04     ldr.w    r3, [r5, #4]!
    8c1a:    4638          mov    r0, r7
    8c1c:    4641          mov    r1, r8
    8c1e:    464a          mov    r2, r9
    8c20:    4798          blx    r3
    8c22:    42b4          cmp    r4, r6
    8c24:    d1f6          bne.n    8c14 <__libc_csu_init+0x20>
    8c26:    e8bd 83f8     ldmia.w    sp!, {r3, r4, r5, r6, r7, r8, r9, pc}
    8c2a:    bf00          nop
    8c2c:    0000830a     .word    0x0000830a
    8c30:    00008300     .word    0x00008300

00008c34 <__libc_csu_fini>:
    8c34:    4770          bx    lr
    8c36:    bf00          nop

Disassembly of section .fini:

00008c38 <_fini>:
    8c38:    e92d4008     push    {r3, lr}
    8c3c:    e8bd8008     pop    {r3, pc}

  1. 2015年07月09日 04:33 |
  2. Zynq
  3. | トラックバック:0
  4. | コメント:0
»