05.02.2013 Views

ARM Architecture Reference Manual ARMv7-A and ARMv7-R edition

ARM Architecture Reference Manual ARMv7-A and ARMv7-R edition

ARM Architecture Reference Manual ARMv7-A and ARMv7-R edition

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

Application Level Programmers’ Model<br />

result = FPDefaultNaN(N);<br />

FPProcessException(FPExc_InvalidOp, fpscr_val);<br />

elsif (inf1 && sign1 == ‘0’) || (inf2 && sign2 == ‘0’) then<br />

result = FPInfinity(‘0’, N);<br />

elsif (inf1 && sign1 == ‘1’) || (inf2 && sign2 == ‘1’) then<br />

result = FPInfinity(‘1’, N);<br />

elsif zero1 && zero2 && sign1 == sign2 then<br />

result = FPZero(sign1, N);<br />

else<br />

result_value = value1 + value2;<br />

if result_value == 0.0 then // Sign of exact zero result depends on rounding mode<br />

result_sign = if fpscr_val == ‘10’ then ‘1’ else ‘0’;<br />

result = FPZero(result_sign, N);<br />

else<br />

result = FPRound(result_value, N, fpscr_val);<br />

return result;<br />

// FPSub()<br />

// =======<br />

bits(N) FPSub(bits(N) op1, bits(N) op2, boolean fpscr_controlled)<br />

assert N == 32 || N == 64;<br />

fpscr_val = if fpscr_controlled then FPSCR else St<strong>and</strong>ardFPSCRValue();<br />

(type1,sign1,value1) = FPUnpack(op1, fpscr_val);<br />

(type2,sign2,value2) = FPUnpack(op2, fpscr_val);<br />

(done,result) = FPProcessNaNs(type1, type2, op1, op2, fpscr_val);<br />

if !done then<br />

inf1 = (type1 == FPType_Infinity); inf2 = (type2 == FPType_Infinity);<br />

zero1 = (type1 == FPType_Zero); zero2 = (type2 == FPType_Zero);<br />

if inf1 && inf2 && sign1 == sign2 then<br />

result = FPDefaultNaN(N);<br />

FPProcessException(FPExc_InvalidOp, fpscr_val);<br />

elsif (inf1 && sign1 == ‘0’) || (inf2 && sign2 == ‘1’) then<br />

result = FPInfinity(‘0’, N);<br />

elsif (inf1 && sign1 == ‘1’) || (inf2 && sign2 == ‘0’) then<br />

result = FPInfinity(‘1’, N);<br />

elsif zero1 && zero2 && sign1 == NOT(sign2) then<br />

result = FPZero(sign1, N);<br />

else<br />

result_value = value1 - value2;<br />

if result_value == 0.0 then // Sign of exact zero result depends on rounding mode<br />

result_sign = if fpscr_val == ‘10’ then ‘1’ else ‘0’;<br />

result = FPZero(result_sign, N);<br />

else<br />

result = FPRound(result_value, N, fpscr_val);<br />

return result;<br />

A2-56 Copyright © 1996-1998, 2000, 2004-2008 <strong>ARM</strong> Limited. All rights reserved. <strong>ARM</strong> DDI 0406B

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!