| // Copyright 2016, VIXL authors |
| // All rights reserved. |
| // |
| // Redistribution and use in source and binary forms, with or without |
| // modification, are permitted provided that the following conditions are met: |
| // |
| // * Redistributions of source code must retain the above copyright notice, |
| // this list of conditions and the following disclaimer. |
| // * Redistributions in binary form must reproduce the above copyright notice, |
| // this list of conditions and the following disclaimer in the documentation |
| // and/or other materials provided with the distribution. |
| // * Neither the name of ARM Limited nor the names of its contributors may be |
| // used to endorse or promote products derived from this software without |
| // specific prior written permission. |
| // |
| // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS CONTRIBUTORS "AS IS" AND |
| // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
| // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
| // DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE |
| // FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
| // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR |
| // SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER |
| // CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, |
| // OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
| // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| |
| // Test description for instructions with the following operands: |
| // MNEMONIC<c> <rd>, <rn>, <rm> |
| // |
| // The instructions covered in this test do not write to the `Q` and `GE` flags, |
| // these are covered in other description files. |
| |
| { |
| "mnemonics": [ |
| "Mul", // MUL{<c>}{<q>} <Rd>, <Rn>, {<Rm>} ; A1 |
| "Muls", // MULS{<c>}{<q>} <Rd>, <Rn>, {<Rm>} ; A1 |
| "Qadd16", // QADD16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1 |
| "Qadd8", // QADD8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1 |
| "Qasx", // QASX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1 |
| "Qsax", // QSAX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1 |
| "Qsub16", // QSUB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1 |
| "Qsub8", // QSUB8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1 |
| "Sdiv", // SDIV{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1 |
| "Shadd16", // SHADD16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1 |
| "Shadd8", // SHADD8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1 |
| "Shasx", // SHASX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1 |
| "Shsax", // SHSAX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1 |
| "Shsub16", // SHSUB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1 |
| "Shsub8", // SHSUB8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1 |
| "Smmul", // SMMUL{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1 |
| "Smmulr", // SMMULR{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1 |
| "Smuad", // SMUAD{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1 |
| "Smuadx", // SMUADX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1 |
| "Smulbb", // SMULBB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1 |
| "Smulbt", // SMULBT{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1 |
| "Smultb", // SMULTB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1 |
| "Smultt", // SMULTT{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1 |
| "Smulwb", // SMULWB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1 |
| "Smulwt", // SMULWT{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1 |
| "Smusd", // SMUSD{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1 |
| "Smusdx", // SMUSDX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1 |
| "Udiv", // UDIV{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1 |
| "Uhadd16", // UHADD16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1 |
| "Uhadd8", // UHADD8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1 |
| "Uhasx", // UHASX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1 |
| "Uhsax", // UHSAX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1 |
| "Uhsub16", // UHSUB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1 |
| "Uhsub8", // UHSUB8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1 |
| "Uqadd16", // UQADD16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1 |
| "Uqadd8", // UQADD8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1 |
| "Uqasx", // UQASX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1 |
| "Uqsax", // UQSAX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1 |
| "Uqsub16", // UQSUB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1 |
| "Uqsub8", // UQSUB8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1 |
| "Usad8", // USAD8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1 |
| |
| // Instructions affecting the GE bits. |
| "Sadd16", // SADD16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1 |
| "Sadd8", // SADD8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1 |
| "Sasx", // SASX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1 |
| "Sel", // SEL{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1 |
| "Ssax", // SSAX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1 |
| "Ssub16", // SSUB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1 |
| "Ssub8", // SSUB8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1 |
| "Uadd16", // UADD16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1 |
| "Uadd8", // UADD8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1 |
| "Uasx", // UASX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1 |
| "Usax", // USAX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1 |
| "Usub16", // USUB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1 |
| "Usub8", // USUB8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1 |
| |
| // Instructions affecting the Q bit. |
| "Qadd", // QADD{<c>}{<q>} {<Rd>}, <Rm>, <Rn> ; A1 |
| "Qdadd", // QDADD{<c>}{<q>} {<Rd>}, <Rm>, <Rn> ; A1 |
| "Qdsub", // QDSUB{<c>}{<q>} {<Rd>}, <Rm>, <Rn> ; A1 |
| "Qsub" // QSUB{<c>}{<q>} {<Rd>}, <Rm>, <Rn> ; A1 |
| ], |
| "description": { |
| "operands": [ |
| { |
| "name": "cond", |
| "type": "Condition" |
| }, |
| { |
| "name": "rd", |
| "type": "AllRegistersButPC" |
| }, |
| { |
| "name": "rn", |
| "type": "AllRegistersButPC" |
| }, |
| { |
| "name": "rm", |
| "type": "AllRegistersButPC" |
| } |
| ], |
| "inputs": [ |
| { |
| "name": "apsr", |
| "type": "NZCV" |
| }, |
| { |
| "name": "qbit", |
| "type": "Q" |
| }, |
| { |
| "name": "ge", |
| "type": "GE" |
| }, |
| { |
| "name": "rd", |
| "type": "Register" |
| }, |
| { |
| "name": "rn", |
| "type": "Register" |
| }, |
| { |
| "name": "rm", |
| "type": "Register" |
| } |
| ] |
| }, |
| "test-files": [ |
| { |
| "type": "assembler", |
| "test-cases": [ |
| { |
| "name": "Operands", |
| "operands": [ |
| "cond", "rd", "rn", "rm" |
| ], |
| "operand-limit": 300 |
| } |
| ] |
| }, |
| { |
| "type": "simulator", |
| "test-cases": [ |
| { |
| "name": "Condition", |
| "operands": [ |
| "cond" |
| ], |
| "inputs": [ |
| "apsr" |
| ] |
| }, |
| { |
| "name": "RdIsRnIsRm", |
| "operands": [ |
| "rd", "rn", "rm" |
| ], |
| "inputs": [ |
| "rd", "rn", "rm" |
| ], |
| "operand-filter": "(rd == rn) and (rd == rm)", |
| "input-filter": "(rd == rn) and (rd == rm)" |
| }, |
| { |
| "name": "RdIsRn", |
| "operands": [ |
| "rd", "rn", "rm" |
| ], |
| "inputs": [ |
| "rd", "rn", "rm" |
| ], |
| "operand-filter": "(rd == rn) and (rn != rm)", |
| "operand-limit": 10, |
| "input-filter": "rd == rn", |
| "input-limit": 200 |
| }, |
| { |
| "name": "RdIsRm", |
| "operands": [ |
| "rd", "rn", "rm" |
| ], |
| "inputs": [ |
| "rd", "rn", "rm" |
| ], |
| "operand-filter": "(rd == rm) and (rn != rm)", |
| "operand-limit": 10, |
| "input-filter": "rd == rm", |
| "input-limit": 200 |
| }, |
| { |
| "name": "RnIsRm", |
| "operands": [ |
| "rd", "rn", "rm" |
| ], |
| "inputs": [ |
| "rd", "rn", "rm" |
| ], |
| "operand-filter": "(rn == rm) and (rm != rd)", |
| "operand-limit": 10, |
| "input-filter": "rn == rm", |
| "input-limit": 200 |
| }, |
| { |
| "name": "RdIsNotRnIsNotRm", |
| "operands": [ |
| "rd", "rn", "rm" |
| ], |
| "inputs": [ |
| "rd", "rn", "rm" |
| ], |
| "operand-filter": "(rd != rn) and (rd != rm)", |
| "operand-limit": 10, |
| "input-limit": 200 |
| } |
| ] |
| }, |
| { |
| "name": "ge", |
| "type": "simulator", |
| "mnemonics": [ |
| "Sadd16", |
| "Sadd8", |
| "Sasx", |
| "Ssax", |
| "Ssub16", |
| "Ssub8", |
| "Uadd16", |
| "Uadd8", |
| "Uasx", |
| "Usax", |
| "Usub16", |
| "Usub8" |
| ], |
| "test-cases": [ |
| { |
| "name": "GE", |
| "operands": [ |
| "rd", "rn", "rm" |
| ], |
| "inputs": [ |
| "ge", "rn", "rm" |
| ], |
| "operand-filter": "(rd != rn) and (rn != rm)", |
| "operand-limit": 1, |
| // Only use "all set" and "all cleared" as inputs. |
| "input-filter": "ge == 'NoFlag' or ge == 'GE0123Flag'", |
| "input-limit": 200 |
| } |
| ] |
| }, |
| { |
| "name": "sel", |
| "type": "simulator", |
| "mnemonics": [ |
| "Sel" |
| ], |
| "test-cases": [ |
| { |
| "name": "GE", |
| "operands": [ |
| "rd", "rn", "rm" |
| ], |
| "inputs": [ |
| "ge", "rn", "rm" |
| ], |
| "operand-filter": "(rd != rn) and (rn != rm)", |
| "operand-limit": 1, |
| "input-limit": 200 |
| } |
| ] |
| }, |
| { |
| "name": "q", |
| "type": "simulator", |
| "mnemonics": [ |
| "Qadd", |
| "Qdadd", |
| "Qdsub", |
| "Qsub" |
| ], |
| "test-cases": [ |
| { |
| "name": "QOutput", |
| "operands": [ |
| "rn", "rm" |
| ], |
| "inputs": [ |
| "qbit", "rn", "rm" |
| ], |
| "operand-limit": 1, |
| "operand-filter": "rn != rm", |
| "input-limit": 200 |
| } |
| ] |
| } |
| ] |
| } |