The Square Root Coprocessor (Overview)

The DS has accelerators for division and square-root computations. This section describes the square root coprocessor.


Registers for Square-Root Calculations

The following data registers are available for the calculation parameters and calculation results.

Also, a control register is available to control the square root coprocessor.


Operations of the Square Root Coprocessor

To perform calculations, the square root coprocessor sets the parameters for the square-root calculation in the data register SQRT_PARAM. After the control register SQRTCNT is appropriately set, the results of the calculation are saved in SQRT_RESULT. (The calculation actually begins as soon as a value is set in either SQRT_PARAM or SQRTCNT. If data get written to the registers during the calculation, the calculation restarts from the beginning.)

There are two modes for square-root calculations:

You can switch between these two modes by changing the value set in the MODE bit of the SQRTCNT register.

When the square root coprocessor begins a calculation, the SQRTCNT register's BUSY bit becomes 1. The bit remains 1 until the result is computed. When this bit becomes 0, the value in the SQRT_RESULT register holds the correct computation result.


Calculation Cycles

The number of cycles required by the square root coprocessor to perform a calculation is the same, regardless of the mode.

To make more efficient use of the square root coprocessor, you can perform another task while waiting for the results after setting the parameters in the registers of the coprocessor.


Setting the Parameters

The parameters for square-root calculations are set using CP_SetSqrtImm*() and CP_SetSqrt*(). The latter function can also set the SQRTCNT register's calculation mode.

Thus, if you plan to perform a succession of square-root calculations in the same mode, you can use CP_SetSqrt*() the first time and then use CP_SetSqrtImm*() all subsequent times.


Waiting for Calculation to End

To check whether or not the calculation has ended, call CP_IsSqrtBusy().

To wait for the calculation to end, call CP_WaitSqrt().


Getting the Calculation Result

To get the result of the square-root calculation, call either CP_GetSqrtResult*() or CP_GetSqrtResultImm*(). The former waits until SQRTCNT is no longer in the BUSY state before getting the result. The latter acts immediately.


Note

If you are using the thread system, the square-root calculations are thread safe by default.


Example

In this example, the square root coprocessor is used to calculate the square root and the result are displayed.

u32 result;

//---- set parameter and sqrt-mode
CP_SetSqrt( 0x12345678, CP_SQRT_32BIT_MODE );

//---- wait for sqrt operation to finish
CP_WaitSqrt();

//---- display result
result = CP_GetSqrtResultImm32();
OS_Printf( "result=%x\n", result );

Revision History

12/27/2004 Initial version.