| # Test that unsigned widening multiplication of 32-bit operands to produce a |
| # 64-bit result is simulated correctly, when using 32-bit or F5series hardware |
| # multiply functionality. |
| # 0xffff fffc * 0x2 = 0x1 ffff fff8 |
| # mach: msp430 |
| |
| # 32-bit hwmult register addresses |
| .set MPY32L, 0x0140 |
| .set MPY32H, 0x0142 |
| .set OP2L, 0x0150 |
| .set OP2H, 0x0152 |
| .set RES0, 0x0154 |
| .set RES1, 0x0156 |
| .set RES2, 0x0158 |
| .set RES3, 0x015A |
| |
| # F5series hwmult register addresses |
| .set MPY32L_F5, 0x04D0 |
| .set MPY32H_F5, 0x04D2 |
| .set OP2L_F5, 0x04E0 |
| .set OP2H_F5, 0x04E2 |
| .set RES0_F5, 0x04E4 |
| .set RES1_F5, 0x04E6 |
| .set RES2_F5, 0x04E8 |
| .set RES3_F5, 0x04EA |
| |
| .include "testutils.inc" |
| |
| start |
| |
| ; Test 32bit hwmult |
| MOV.W #2, &MPY32L ; Load operand 1 Low into multiplier |
| MOV.W #0, &MPY32H ; Load operand 1 High into multiplier |
| MOV.W #-4, &OP2L ; Load operand 2 Low into multiplier |
| MOV.W #-1, &OP2H ; Load operand 2 High, trigger MPY |
| |
| CMP.W #-8, &RES0 { JNE .L5 |
| CMP.W #-1, &RES1 { JNE .L5 |
| CMP.W #1, &RES2 { JNE .L5 |
| CMP.W #0, &RES3 { JNE .L5 |
| |
| ; Test f5series hwmult |
| MOV.W #2, &MPY32L_F5 |
| MOV.W #0, &MPY32H_F5 |
| MOV.W #-4, &OP2L_F5 |
| MOV.W #-1, &OP2H_F5 |
| |
| CMP.W #-8, &RES0_F5 { JNE .L5 |
| CMP.W #-1, &RES1_F5 { JNE .L5 |
| CMP.W #1, &RES2_F5 { JNE .L5 |
| CMP.W #0, &RES3_F5 { JEQ .L6 |
| .L5: |
| fail |
| .L6: |
| pass |