| # Blackfin testcase for factorial |
| # mach: bfin |
| |
| .include "testutils.inc" |
| |
| start |
| |
| .macro factorial num:req answer:req |
| R0 = \num (Z); |
| CALL _fact; |
| imm32 r1, \answer; |
| CC = R1 == R0; |
| if CC JUMP 1f; |
| fail |
| 1: |
| .endm |
| |
| _test: |
| factorial 1 1 |
| factorial 2 2 |
| factorial 3 6 |
| factorial 4 24 |
| factorial 5 120 |
| factorial 6 720 |
| factorial 7 5040 |
| factorial 8 40320 |
| factorial 9 362880 |
| factorial 10 3628800 |
| factorial 11 39916800 |
| factorial 12 479001600 |
| # This is the real answer, but it overflows 32bits. Since gas itself |
| # likes to choke on 64bit values when compiled for 32bit systems, just |
| # specify the truncated 32bit value since that's what the Blackfin will |
| # come up with too. |
| # factorial 13 6227020800 |
| factorial 13 1932053504 |
| pass |
| |
| _fact: |
| LINK 0; |
| [ -- SP ] = R7; |
| CC = R0 < 2; |
| IF CC JUMP 1f; |
| R7 = R0; |
| R0 += -1; |
| CALL _fact; |
| R0 *= R7; |
| 1: |
| R7 = [ SP ++ ]; |
| UNLINK; |
| RTS; |