UPGRADE YOUR BROWSER

We have detected your current browser version is not the latest one. Xilinx.com uses the latest web technologies to bring you the best online experience possible. Please upgrade to a Xilinx.com supported browser:Chrome, Firefox, Internet Explorer 11, Safari. Thank you!

AR# 21265

7.1 EDK-GNU - mb-gcc - abs() 関数でワード アライメントが実行されない

説明

キーワード : mb-gcc, abs, shift_temp, bss, word alignment, ワード アライメント

重要度 : 標準

概要 :
GCC 3.4.1 への移行に伴い、バグが発生します。

GCC は、宣言 int <var> = 0; を最適化として BSS に移動します。 しかし、BSS シンボルにアライメント指示子を送るコードにバグが含まれています。 アセンブラ指示子 .comm の代わりに、アセンブラ指示子 .space が使用されます。 この指示子にはアライメントの必要がないため、リンカにより調整されません。 _shift_temp_loc では、アライメントがうまくいっていません。

EDK63 と EDK71

abs() 関数は、EDK 71 を使用した場合と EDK 63 を使用した場合でコンパイル方法が異なります。

EDK 71 に移行してから、EDK 63 で使用していたのと同じコードを変更せずに使用すると、 EDK 63 では実行されていたアルゴリズムが EDK 71 では実行されません。 SWI コマンドが EDK 71 でワード アラインメントされない理由を教えてください。
- ReXpMag と ReXp は、両方ともザイリンクス タイプ Xint16 です。 これらは、ローカルで関数内で宣言されます。
- 最適化設定は、[No optimization] です。
- ZeroDlyCnt は、グローバル変数、タイプ Xuint8 で、すべての関数とメインの外で宣言されます。
符号なし文字 (バイト) 変数がアドレス 0x1a84 にあります。アドレス 0x1384 の行は、アドレス 0x1a85 への SWI ですが、SWI にはワード アラインメントを行う必要があります。 つまり、この変数が上書きされます。
古い分解コードでは、SWI のターゲット アドレスが 0x1b4c で、変数は 0x1b94 でした。
いずれの分解コードも 1 つの C コードにコンパイルされます。
------------------------------------------------------------------------------------------------
EDK 71 mb-gcc non working algorithm
-----------------------------------------------------------------------------------------------
C-code snippet
ReXpMag = abs(ReXp);
ImXpMag = abs(ImXp);
Objectdump snippet
if (ZeroDlyCnt == 0)
12ac: e0601a84 lbui r3, r0, 6788 // 1a84
<ZeroDlyCnt>
12b0: bc23001c bnei r3, 28 // 12cc
.
.
.
ReXpMag = abs(ReXp);
137c: e4730004 lhui r3, r19, 4
1380: 90630061 sext16 r3, r3
1384: f8601a85 swi r3, r0, 6789 // 1a85
<_shift_temp_loc>
1388: e2401a85 lbui r18, r0, 6789 // 1a85
<_shift_temp_loc>
138c: 90920060 sext8 r4, r18
1390: 90840001 sra r4, r4
1394: 90840001 sra r4, r4
1398: 90840001 sra r4, r4
139c: 90840001 sra r4, r4
13a0: 90840001 sra r4, r4
13a4: 90840001 sra r4, r4
13a8: 90840001 sra r4, r4
13ac: 88641800 xor r3, r4, r3
13b0: 14641800 rsubk r3, r4, r3
13b4: f4730008 shi r3, r19, 8
-----------------------------------------------------------------------------------------------
EDK 63 mb-gcc working algorithm
-----------------------------------------------------------------------------------------------
C-code snippet
ReXpMag = abs(ReXp);
ImXpMag = abs(ImXp);
Objectdump snippet
13b8: e0601b94 lbui r3, r0, 7060 // 1b94 <ZeroDlyCnt>
13bc: bc23001c bnei r3, 28 // 13d8
1488: c4809800 lhu r4, r0, r19
148c: 90640061 sext16 r3, r4
1490: f8601b4c swi r3, r0, 6988 // 1b4c <_shift_temp_loc>
1494: e2401b4c lbui r18, r0, 6988 // 1b4c <_shift_temp_loc>
1498: 90920060 sext8 r4, r18
149c: 90840001 sra r4, r4
14a0: 90840001 sra r4, r4
14a4: 90840001 sra r4, r4
14a8: 90840001 sra r4, r4
14ac: 90840001 sra r4, r4
14b0: 90840001 sra r4, r4
14b4: 90840001 sra r4, r4
14b8: 88641800 xor r3, r4, r3
14bc: 14841800 rsubk r4, r4, r3
14c0: f4930004 shi r4, r19, 4

ソリューション

1

当面、この問題を回避するには、次のテキストを使用して新しいファイルを作成し、ユーザー C ソースでコンパイルしてください。


//////////////////////////////////////////////////////////////////////
//Start of file
//////////////////////////////////////////////////////////////////////
//
// Copyright (c) 2001 Xilinx, Inc. All rights reserved.
//
// mb_variables.c
//
// MicroBlaze specific variables required by certain operations
// a) shift
//
// $Header: /devl/xcs/repo/env/Jobs/MDT/sw/ThirdParty/gnu/src/gcc/src-3.4/gcc/config/microblaze/mb_variables.c,v 1.1 2005/03/18 20:00:25 vasanth Exp $
//
///////////////////////////////////////////////////////////////////////////////

/* This variable is need by shift operations */
int _shift_temp_loc;

// End of file
///////////////////////////////////////////////////////////////////////////////

2

この問題は、最新版の 7.1i サービス パックで修正されています。サービス パックは次のサイトから入手できます。
http://www.xilinx.co.jp/xlnx/xil_sw_updates_home.jsp
この修正は、7.1i サービス パック 1 以降に含まれます。
AR# 21265
日付 04/13/2007
ステータス アーカイブ
種類 一般
このページをブックマークに追加