# Copyright (c) 2021-2022 Huawei Device Co., Ltd.
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

---
definitions: []
tests:
  - file-name: add
    isa:
      title: Three address binary operation
      description: Perform specified binary operation on two registers and store result
        into accumulator
      exceptions:
        - x_none
    commands:
      - file-name: op_vs1_4_vs2_4_zero
        isa:
          instructions:
            - sig: add v1:in:i32, v2:in:i32
              acc: out:i32
              format: [op_v1_4_v2_4]
        code-template: |
          #
              movi v0, 0
              movi v1, %s
              add v0, v1
              movi v0, %s
              jne v0, set_failure
              ldai 0
              jmp fall_through
          set_failure:
              ldai 1
          fall_through:
        description: Check add with zero and various values.
        cases:
          - values:
              - '0'
              - '0'
          - values:
              - '1'
              - '1'
          - values:
              - "-1"
              - "-1"
          - values:
              - '0x7FFFFFFF'
              - '0x7FFFFFFF'
          - values:
              - '0x80000000'
              - '0x80000000'
          - values:
              - "-0x7FFFFFFF"
              - "-0x7FFFFFFF"
          - values:
              - "-0x80000000"
              - "-0x80000000"
          - values:
              - '0xFFFFFFFF'
              - '0xFFFFFFFF'
          - values:
              - "-0xFFFFFFFF"
              - "-0xFFFFFFFF"
      - file-name: op_vs1_4_vs2_4_pone
        isa:
          instructions:
            - sig: add v1:in:i32, v2:in:i32
              acc: out:i32
              format: [op_v1_4_v2_4]
        code-template: |
          #
              movi v0, 1
              movi v1, %s
              add v0, v1
              movi v0, %s
              jne v0, set_failure
              ldai 0
              jmp fall_through
          set_failure:
              ldai 1
          fall_through:
        description: Check add with +1 and various values.
        cases:
          - values:
              - '0'
              - '1'
          - values:
              - '1'
              - '2'
          - values:
              - "-1"
              - '0'
          - values:
              - '0x7FFFFFFF'
              - '0x80000000'
            bugid: ["966"]
          - values:
              - '0x80000000'
              - '0x80000001'
          - values:
              - "-0x7FFFFFFF"
              - "-0x7FFFFFFE"
          - values:
              - "-0x80000000"
              - "-0x7FFFFFFF"
          - values:
              - '0xFFFFFFFF'
              - '0'
          - values:
              - "-0xFFFFFFFF"
              - "-0xFFFFFFFE"
      - file-name: op_vs1_4_vs2_4_none
        isa:
          instructions:
            - sig: add v1:in:i32, v2:in:i32
              acc: out:i32
              format: [op_v1_4_v2_4]
        code-template: |
          #
              movi v0, -1
              movi v1, %s
              add v0, v1
              movi v0, %s
              jne v0, set_failure
              ldai 0
              jmp fall_through
          set_failure:
              ldai 1
          fall_through:
        description: Check add with -1 and various values.
        cases:
          - values:
              - '0'
              - "-1"
          - values:
              - '1'
              - '0'
          - values:
              - "-1"
              - "-2"
          - values:
              - '0x7FFFFFFF'
              - '0x7FFFFFFE'
          - values:
              - '0x80000000'
              - '0x7FFFFFFF'
            bugid: ["966"]
          - values:
              - "-0x7FFFFFFF"
              - "-0x80000000"
          - values:
              - "-0x80000000"
              - "-0x80000001"
            bugid: ["966"]
          - values:
              - '0xFFFFFFFF'
              - "-2"
          - values:
              - "-0xFFFFFFFF"
              - '0'
      - file-name: op_vs1_4_vs2_4_pmax
        isa:
          instructions:
            - sig: add v1:in:i32, v2:in:i32
              acc: out:i32
              format: [op_v1_4_v2_4]
        code-template: |
          #
              movi v0, 0x7FFFFFFF
              movi v1, %s
              add v0, v1
              movi v0, %s
              jne v0, set_failure
              ldai 0
              jmp fall_through
          set_failure:
              ldai 1
          fall_through:
        description: Check add with +max and various values.
        cases:
          - values:
              - '0'
              - '0x7fffffff'
          - values:
              - '1'
              - '0x80000000'
            bugid: ["966"]
          - values:
              - "-1"
              - '0x7FFFFFFE'
          - values:
              - '0x7FFFFFFF'
              - '0xFFFFFFFE'
            bugid: ["966"]
          - values:
              - '0x80000000'
              - '0xFFFFFFFF'
          - values:
              - "-0x7FFFFFFF"
              - '0'
          - values:
              - "-0x80000000"
              - '0xFFFFFFFF'
          - values:
              - '0xFFFFFFFF'
              - '0x7FFFFFFE'
          - values:
              - "-0xFFFFFFFF"
              - '0x80000000'
            bugid: ["966"]
      - file-name: op_vs1_4_vs2_4_nmax
        isa:
          instructions:
            - sig: add v1:in:i32, v2:in:i32
              acc: out:i32
              format: [op_v1_4_v2_4]
        code-template: |
          #
              movi v0, -0x80000000
              movi v1, %s
              add v0, v1
              movi v0, %s
              jne v0, set_failure
              ldai 0
              jmp fall_through
          set_failure:
              ldai 1
          fall_through:
        description: Check add with -max and various values.
        cases:
          - values:
              - '0'
              - '0x80000000'
          - values:
              - '1'
              - '0x80000001'
          - values:
              - "-1"
              - '0x7FFFFFFF'
            bugid: ["966"]
          - values:
              - '0x7FFFFFFF'
              - "-1"
          - values:
              - '0x80000000'
              - '0'
            bugid: ["966"]
          - values:
              - "-0x7FFFFFFF"
              - '1'
            bugid: ["966"]
          - values:
              - "-0x80000000"
              - '0'
            bugid: ["966"]
          - values:
              - '0xFFFFFFFF'
              - '0x7FFFFFFF'
            bugid: ["966"]
          - values:
              - "-0xFFFFFFFF"
              - "-0x7FFFFFFF"
      - file-name: vals
        isa:
          instructions:
            - sig: add v1:in:i32, v2:in:i32
              acc: out:i32
              format: [op_v1_4_v2_4]
        code-template: |
          #
              movi v0, %s
              movi v1, %s
              add v0, v1
              movi v0, %s
              jne v0, set_failure
              ldai 0
              jmp fall_through
          set_failure:
              ldai 1
          fall_through:
        description: Check add with various values.
        tags: ['tsan']
        cases:
          - values:
              - '0x455ed8f5'
              - '0xfe61fbdd'
              - '0x43c0d4d2'
          - values:
              - '0xc3e6a70'
              - '0xae9b1e98'
              - '0xbad98908'
          - values:
              - '0xd2670242'
              - '0xef691c0f'
              - '0xc1d01e51'
          - values:
              - '0xf6d0f4f8'
              - '0x4ee5e5df'
              - '0x45b6dad7'
          - values:
              - '0xded7f996'
              - '0xd94428a1'
              - '0xb81c2237'
          - values:
              - '0x262d5e15'
              - '0x1a85200d'
              - '0x40b27e22'
          - values:
              - '0x4bb930e4'
              - '0x416b3a07'
              - '0x8d246aeb'
            bugid: ["966"]
          - values:
              - '0x61a80560'
              - '0xb076ee9'
              - '0x6caf7449'
          - values:
              - '0x42bd8cd3'
              - '0x9e28b8b6'
              - '0xe0e64589'
          - values:
              - '0x3c0a62e1'
              - '0xb18cfa'
              - '0x3cbbefdb'
      - file-name: vals_mod32_1
        bugid: ['1324', '2072']
        tags: ['verifier']
        runner-options: ['verifier-failure', 'verifier-config']
        isa:
          instructions:
            - sig: add v1:in:i32, v2:in:i32
              acc: out:i32
              format: [op_v1_4_v2_4]
        code-template: |
          #
              movi v0, %s
              movi v1, %s
              add v0, v1
              movi.64 v0, %s
              cmp.64 v0
        description: Check add with incorrect register type.
        cases:
          - values:
              - '0x7FFFFFFF'
              - '0x7FFFFFFF'
              - '0xFFFFFFFFFFFFFFFE'
            bugid: ["966"]
          - values:
              - '0x7FFFFFFF'
              - '0x80000000'
              - '0xFFFFFFFFFFFFFFFF'
          - values:
              - '0x80000000'
              - '0x80000000'
              - '0'
            bugid: ["966"]
      - file-name: vals_mod32_2
        bugid: ['1324']
        tags: ['verifier']
        runner-options: ['verifier-failure', 'verifier-config']
        isa:
          instructions:
            - sig: add v1:in:i32, v2:in:i32
              acc: out:i32
              format: [op_v1_4_v2_4]
        code-template: |
          #
              movi.64 v0, %s
              movi.64 v1, %s
              add v0, v1
              movi.64 v0, %s
              cmp.64 v0
        description: Check add with incorrect register type.
        cases:
          - values:
              - '0x17FFFFFFF'
              - '0x17FFFFFFF'
              - '0xFFFFFFFFFFFFFFFE'
            bugid: ["966"]
          - values:
              - '0x777777777FFFFFFF'
              - '0x1111111180000000'
              - '0xFFFFFFFFFFFFFFFF'
          - values:
              - '0x180000000'
              - '0x180000000'
              - '0'
            bugid: ["966"]
      - file-name: regs
        isa:
          instructions:
            - sig: add v1:in:i32, v2:in:i32
              acc: out:i32
              format: [op_v1_4_v2_4]
        runner-options:
          - compile-only
        code-template: |
          #
              add %s, %s
        check-type: none
        description: Check add with various register numbers.
        cases:
          - values:
              - v0
              - v15
          - values:
              - v0
              - v16
            runner-options:
              - compile-failure
          - values:
              - v15
              - v0
          - values:
              - v16
              - v0
            runner-options:
              - compile-failure

      - file-name: type
        isa:
          verification:
            - v1_type
            - v2_type
        tags: ['verifier']
        runner-options: ['verifier-failure', 'verifier-config']
        header-template: []
        code-template: |
          #
          .record A {}
          .record B {}
          .record panda.String <external>
          .record panda.Object <external>
          .function i32 main() {
              %s
              *s
              add v0, v1
        check-type: exit-positive
        description: Check 'add' with incorrect register types.
        template-cases:
          - values:
              - movi v0, 0
            exclude: [val]
          - values:
              - movi.64 v0, 0
          - values:
              - fmovi v0, 0
          - values:
              - fmovi.64 v0, 0
          - values:
              - |
                #
                    lda.type B
                    sta.obj v0
          - values:
              - |
                #
                    lda.type B[]
                    sta.obj v0
          - values:
              - |
                #
                    lda.type panda.String
                    sta.obj v0
          - values:
              - |
                #
                    lda.type panda.Object
                    sta.obj v0
          - values:
              - |
                #
                    movi v0, 10
                    newarr v0, v0, i32[]
          - values:
              - mov.null v0
        cases:
          - values:
              - movi v1, 0
            id: val
          - values:
              - movi.64 v1, 0
          - values:
              - fmovi v1, 0
          - values:
              - fmovi.64 v1, 0
          - values:
              - |
                #
                    lda.type A
                    sta.obj v1
          - values:
              - |
                #
                    lda.type A[]
                    sta.obj v1

          - values:
              - |
                #
                    lda.type panda.String
                    sta.obj v1
          - values:
              - |
                #
                    lda.type panda.Object
                    sta.obj v1
          - values:
              - |
                #
                    movi v1, 10
                    newarr v1, v1, f64[]
          - values:
              - mov.null v1

      - file-name: uninitialized_regs
        isa:
          instructions:
            - sig: add v1:in:i32, v2:in:i32
              acc: out:i32
              format: [op_v1_4_v2_4]
        description: Check 'add' with uninitialized registers.
        tags: ['verifier']
        runner-options: ['verifier-failure', 'verifier-config']
        code-template: |
          #
              %s
              *s
              add %s, *s
        check-type: exit-positive
        template-cases:
          - values:
              - ''
              - v0
          - values:
              - movi v0, 0
              - v0
            exclude: [init]
          - values:
              - ''
              - v7
          - values:
              - ''
              - v15
          - values:
              - 'movi v15, 0'
              - v15
            exclude: [init]
        cases:
          - values:
              - ''
              - v1
          - values:
              - movi v1, 0
              - v1
            id: init
          - values:
              - ''
              - v8
          - values:
              - ''
              - v14