floating point in mamba

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

floating point in mamba

523 Views
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 Kudos
1 Reply

291 Views
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 Kudos