diff options
author | zedarider <ymherklotz@gmail.com> | 2016-02-26 21:40:24 +0000 |
---|---|---|
committer | zedarider <ymherklotz@gmail.com> | 2016-02-26 21:40:24 +0000 |
commit | 6d8f08b4727e5630e547d0afbf39c819a43945f6 (patch) | |
tree | 1f3fcb0185e339aa7cd7a14ece31c4fa474de9a1 /ARM_assembly/MultProject/testbench-opt1.s | |
parent | 110c42733ff3decdb62bc4347626489a2677d99b (diff) | |
download | imperial_2015-6d8f08b4727e5630e547d0afbf39c819a43945f6.tar.gz imperial_2015-6d8f08b4727e5630e547d0afbf39c819a43945f6.zip |
Adding ARM Assembly files
Diffstat (limited to 'ARM_assembly/MultProject/testbench-opt1.s')
-rw-r--r-- | ARM_assembly/MultProject/testbench-opt1.s | 140 |
1 files changed, 140 insertions, 0 deletions
diff --git a/ARM_assembly/MultProject/testbench-opt1.s b/ARM_assembly/MultProject/testbench-opt1.s new file mode 100644 index 0000000..6940a78 --- /dev/null +++ b/ARM_assembly/MultProject/testbench-opt1.s @@ -0,0 +1,140 @@ + ; Test 0: simple diagnostic +INA0 DCD 0X30,0X2 +INB0 DCD 0X7000,0X500 +OUTAxB0 DCD 0X150000,0X1D000,0XA00,0X0 + + ; Test 1: carries +INA1 DCD 0X7FFFFFFF,0X0 +INB1 DCD 0X7FFFFFFF,0X0 +OUTAxB1 DCD 0X1,0X3FFFFFFF,0X0,0X0 + + ; Test 2: all zeros +INA2 DCD 0X0,0X0 +INB2 DCD 0X0,0X0 +OUTAxB2 DCD 0X0,0X0,0X0,0X0 + + ; Test 3: both negative +INA3 DCD 0XFFFFFFFF,0XFFFFFFFF +INB3 DCD 0XFFFFFFFF,0XFFFFFFFF +OUTAxB3 DCD 0X1,0X0,0X0,0X0 + + ; Test 4: A negative +INA4 DCD 0XFFFFFFFF,0XFFFFFFFF +INB4 DCD 0X1,0X0 +OUTAxB4 DCD 0XFFFFFFFF,0XFFFFFFFF,0XFFFFFFFF,0XFFFFFFFF + + ; Test 5: B negative +INA5 DCD 0X1,0X0 +INB5 DCD 0XFFFFFFFF,0XFFFFFFFF +OUTAxB5 DCD 0XFFFFFFFF,0XFFFFFFFF,0XFFFFFFFF,0XFFFFFFFF + + ; Test 6: Random bits +INA6 DCD 0X802A5B62,0XE705271E +INB6 DCD 0XB7353E54,0X2E4456B5 +OUTAxB6 DCD 0X4951B828,0XAEC6916E,0XDF0A0C3D,0XFB7C41EF + + ; Test 7: Random bits +INA7 DCD 0X73F1A0B6,0X9B6FDBB8 +INB7 DCD 0X3D1AA608,0XACA790C3 +OUTAxB7 DCD 0XFE3F09B0,0X2829D69,0X913A81B,0X20BD7902 +OUTVEC FILL 4*4 +REGVEC FILL 8*4 +STACKSAVE FILL 4 +IN_TEMP FILL 4*4 + + ; +LAST_TEST EQU 7 + MOV R5, #0 ; test number + ; Loop to test code with different data +TLOOP + BL DODATATEST + ADD R5, R5, #1 + CMP R5, #LAST_TEST + BLE TLOOP + ; + ; +SUCCESS MOV R0, #123 ; 123 (0x7B) in R0 indicates successful completion of all tests + END + + +DODATATEST STMED R13!, {R12,R14} + LDR R12, =INA0 + ADD R12, R12, R5, LSL #5 ; get offset to correct data + MOV R0, R12 ; pointer to INA & INB + LDR R1, =IN_TEMP + BL COPY4W + MOV R0, R1 ; now R0 points to INA and INB copy + ADD R1, R0, #2*4 ; pointer to INB copy + LDR R2, =OUTVEC + BL SMUL_SHIELD + ADD R0, R12, #4*4 ; pointer to correct output + LDR R1, =OUTVEC ; pointer to actual 128 bit output + MOV R2, #4 ; length of vectors in words + BL VECTOREQ ; sets EQ cond if the two vectors are equal + LDMEDEQ R13!, {R12,PC} ; return + ; +DATA_ERROR + MOV R0, #-1 + ; we get here if we have found an error in the test + ; R5 is the number of the test that failed + ; R0 = -1 as error indication + END + + +SMUL_SHIELD ; protect testbench registers ans stack from rogue SMUL behaviour + ; check whether SMUL changes R4-R12 + STMED R13!, {R4-R12, R14} ; save + LDR R3, =STACKSAVE + STR R13, [R3] ; save SP in case this gets corrupted + LDR R12, =INA6 ; the next 16 words of data are random + AND R3, R5, #1 ; extract LS bit of R5 which will change from test to test + ADD R12, R12, R3, LSL #2 ; add it onto R3 to make data in registers vary + LDMIA R12, {R4-R11} + BL SMUL64X64 + LDR R0, =REGVEC + STMIA R0, {R4-R11} + MOV R1, R12 + MOV R2, #8 + BL VECTOREQ + BNE REG_ERROR + LDR R3, =STACKSAVE + LDR R3, [R3] + MOV R0, R13 + CMP R3, R0 + LDMEDEQ R13!, {R4-R12,R15} ; restore and return if no stack error + + +STACK_ERROR ; We get here if SMUL64X64 does not correctly restore the SP to its + ; old value on exit (for example by using different push and pop register sets) + MOV R0, #-3 + LDMED R13!, {R4-R12} + END + + + + +REG_ERROR ; we get here if the test code changes registers R4-R12, which is not allowed + MOV R0, #-2 + LDMED R13!, {R4-R12} + END + + + ; return EQ if vectors of R2 words with LSWs at addresses R0 and R1 are equal +VECTOREQ STMED R13!, {R0,R1,R2,R4,R5,R14} +VLOOP LDR R5, [R0], #4 + LDR R4, [R1], #4 + CMP R5, R4 + LDMEDNE R13!, {R0, R1,R2,R4,R5,PC} ; return with NE if the vectors do not match + SUBS R2, R2, #1 + BNE VLOOP + LDMED R13!, {R0,R1,R2,R4,R5,PC} ; return with EQ if vectors match + + + ; copy vector of 4 words from address R0 to address R1 +COPY4W STMED R13!, {R4-R7,R14} + LDMIA R0, {R4-R7} + STMIA R1, {R4-R7} + LDMED R13!, {R4-R7, PC} + + + ;; add your SMUL64X64 code from here onwards |