floating point in mamba

キャンセル
次の結果を表示 
表示  限定  | 次の代わりに検索 
もしかして: 

floating point in mamba

1,230件の閲覧回数
sadou
Contributor I

I am using mpc5674 mamba, and noticed there is no exception happens when dividing by 0:

 

int i=0;

  i=1/i

 

The result of above code is i=0x7fffffff, and no exception.

From assemble code, compiler uses divw for the division. divw does not update overflow flow.

 

If I expect to have exception for dividing by 0, what should I configure to enable this exception? or what kind of compiling option should be used to guarantee this exception?

 

Thanks,

0 件の賞賛
返信
1 返信

998件の閲覧回数
TomE
Specialist II

The Power architecture has never had a divide-by-zero exception. If you want one then the compiler has to generate code to check the divisor before performing the division. Possibly with "twequi".

 

> If I expect to have exception for dividing by 0, what should I configure to

> enable this exception?

 

If the CPU has floating point hardware, then there's an enable for a floating point divide-by-zero exception, but you're wanting the integer one to trap.

 

> or what kind of compiling option should be used to guarantee this exception?

 

Depends on the compiler. Read all the documentaiton on it, or ask in a forum specific to that compiler.

 

Of course you should have asked Google, which for "ppc divide zero trap gcc" finds:

 

http://fixunix.com/embedded/341544-divide-zero-does-not-crash.html

 

The behavior of integer division by 0 is undefined per the C Languagestandard and, hence, implementation-dependent. On x86, division by 0produces a hardware exception. On x86 linux, this exception is presentedto the program as a signal. However, a conforming implementation maychoose to do anything else that is convenient: nothing (leave quotientunmodified), produce random value for the quotient, kill the process.

---

Yes, that's a property of the PowerPC archictecture. AFAIK the theory
 of the hardware designers was that the compiler should produce code
 equivalent to:

 q=n/d;
 if (d == 0)
 raise(SIGFPE);

 The idea is that the check would be performed during the latency of
 the division, so it would usually not cost extra time. So one could
 make the hardware simpler by not putting in the check there. I may be
 confusing PowerPC with another RISC architecture (most likely MIPS)
 wrt this aspect, though.

If you want to have divide-by-zeros trap in conforming C code, then you have to add tests on the divisor, or call a function to perform all divides and have it check, or use C++ and overload the "/" operator.

 

Tom

 

0 件の賞賛
返信