# 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: "fdiv2"
    isa:
      title: Two address floating-point binary operation on accumulator
      description: >
        Perform specified floating-point binary operation on accumulator and register and store result into accumulator.
        The results of instructions correspond IEEE-754 arithmetic rules.
      exceptions:
        - x_none
    commands:
      - file-name: "op_vs_8_nan"
        isa:
          instructions:
            - sig: fdiv2 v:in:f32
              acc: inout:f32
              format: [op_v_8]
          description: Any operation with NaN results to NaN value.
        check-type: check-acc-nan-f32
        tags: ['irtoc_ignore']
        code-template: |
          #
              fldai %s
              fmovi v0, *s
              fdiv2 v0
        description: >
          Check fdiv2 results in NaN when acc or v0 is NaN
        template-cases:
          - values:
              # NaN
              - "0x7fc00000"
          - values:
              # NaN representation
              - "0xFFFFFFFF"
          - values:
              # Positive zero
              - "0"
            bugid: ["966", "965"]
            exclude: [hasval]
          - values:
              # Negative zero
              - "0x80000000"
            bugid: ["966", "965"]
            exclude: [hasval]
          - values:
              # 1d
              - "1.0"
            bugid: ["966", "965"]
            exclude: [hasval]
          - values:
              - "-1"
            exclude: [hasval]
          - values:
              # +Inf
              - "0x7f800000"
            exclude: [hasval]
          - values:
              # -Inf
              - "0xff800000"
            exclude: [hasval]
          - values:
            # +max
            - "0x7f7fffff"
            exclude: [hasval]
          - values:
            # -max
            - "0xff7fffff"
            exclude: [hasval]
          - values:
            # +min
            - "0x00000001"
            exclude: [hasval]
          - values:
            # -min
            - "0x80000001"
            exclude: [hasval]
          - values:
              # Some FP value, 3.14159265358979323846
              - "0x40490fdb"
            exclude: [hasval]
          - values:
              # Some FP value
              - "1234567890"
            exclude: [hasval]
        cases:
          - values:
              # NaN
              - "0x7fc00000"
          - values:
              # NaN representation
              - "0xFFFFFFFF"
          - values:
              # Positive zero
              - "0"
            bugid: ["966", "965"]
            id: hasval
          - values:
              # Negative zero
              - "0x8000000"
            bugid: ["966", "965"]
            id: hasval
          - values:
              # 1d
              - "1.0"
            bugid: ["966", "965"]
            id: hasval
          - values:
              - "-1"
            id: hasval
          - values:
              # +Inf
              - "0x7f800000"
            id: hasval
          - values:
              # -Inf
              - "0xff800000"
            id: hasval
          - values:
            # +max
            - "0x7f7ffffff"
            id: hasval
          - values:
            # -max
            - "0xff7ffffff"
            id: hasval
          - values:
            # +min
            - "0x000000001"
            id: hasval
          - values:
            # -min
            - "0x800000001"
            id: hasval
          - values:
              # Some FP value, 3.1415927
              - "0x40490fdb"
            id: hasval
          - values:
              # Some FP value
              - "1234567890"
            id: hasval

      - file-name: "op_vs_8_pinf"
        isa:
          instructions:
            - sig: fdiv2 v:in:f32
              acc: inout:f32
              format: [op_v_8]
          description: Division is infinity if any non zero value is divided by zero.
        check-type: check-positive
        tags: ['irtoc_ignore']
        code-template: |
            #
                fldai 0x7f800000 # +Inf
                fmovi v0, %s
            # Div of +Inf and value
                fdiv2 v0
                fmovi v1, %s
                fcmpg v1
        description: Check fdiv2 with positive Inf and various values (NaN, Inf, min, max, numbers).
        cases:
          - values:
              - "0"
              # Inf
              - "0x7f800000"
            bugid: ["966", "965"]
          - values:
              # -0.0d
              - "0x80000000"
              # -Inf
              - "0xFF800000"
            bugid: ["966", "965"]
          - values:
              # 1d
              - "1"
              # Inf
              - "0x7f800000"
          - values:
              - "-1"
              # -Inf
              - "0xFF800000"
          - values:
              # +max
              - "0x7f7fffff"
              # Inf
              - "0x7F800000"
          - values:
              # -max
              - "0xff7fffff"
              # -Inf
              - "0xFF800000"
          - values:
              # +min
              - "0x00000001"
              # Inf
              - "0x7F800000"
          - values:
              # -min
              - "0x80000001"
              # -Inf
              - "0xFF800000"
          - values:
              # Some FP value, 3.1415927
              - "0x40490fdb"
              # Inf
              - "0x7F800000"
          - values:
              - "1234567890"
              # Inf
              - "0x7F800000"

      - file-name: "op_vs_8_ninf"
        isa:
          instructions:
            - sig: fdiv2 v:in:f32
              acc: inout:f32
              format: [op_v_8]
          description: Division is infinity if any non zero value is divided by zero.
        check-type: check-positive
        tags: ['irtoc_ignore']
        code-template: |
            #
                fldai 0xff800000 # -Inf
                fmovi v0, %s
            # Div of -Inf and value
                fdiv2 v0
                fmovi v1, %s
                fcmpg v1
        description: Check fdiv2 with negative Inf and various values (NaN, Inf, min, max, numbers).
        cases:
            - values:
                - "0"
                # -Inf
                - "0xff800000"
              bugid: ["966", "965"]
            - values:
                # -0.0d
                - "0x80000000"
                # +Inf
                - "0x7F800000"
              bugid: ["966", "965"]
            - values:
                # 1d
                - "1"
                # -Inf
                - "0xff800000"
            - values:
                - "-1"
                # +Inf
                - "0x7F800000"
            - values:
                # +max
                - "0x7f7fffff"
                # -Inf
                - "0xff800000"
            - values:
                # -max
                - "0xff7fffff"
                # +Inf
                - "0x7F800000"
            - values:
                # +min
                # - "0x00000001"
                - "1"
                # -Inf
                - "0xff800000"
            - values:
                # -min
                - "0x80000001"
                # +Inf
                - "0x7F800000"
            - values:
                # Some FP value, 3.14159265358979323846
                - "0x40490fdb"
                # -Inf
                - "0xff800000"

            - values:
                - "1234567890"
                # -Inf
                - "0xff800000"

      - file-name: "op_vs_8_inf_nan"
        isa:
          instructions:
            - sig: fdiv2 v:in:f32
              acc: inout:f32
              format: [op_v_8]
          description: >
            Division is NaN if Infinity is divided by Infinity.
        check-type: check-acc-nan-f32
        tags: ['irtoc_ignore']
        code-template: |
            #
                fldai %s
                fmovi v0, *s
            # Div of Inf by Inf
                fdiv2 v0
        description: >
          Check fdiv2 of Inf by Inf is NaN.
        template-cases:
          - values: ["0x7f800000"]
          - values: ["0xff800000"]
        cases:
          - values: ["0x7f800000"]
          - values: ["0xff800000"]

      - file-name: "op_vs_8_pzero"
        isa:
          instructions:
            - sig: fdiv2 v:in:f32
              acc: inout:f32
              format: [op_v_8]
        check-type: check-positive
        tags: ['irtoc_ignore']
        code-template: |
            #
                fldai 0.0 #
                fmovi v0, %s
            # Div of +0.0 and value
                fdiv2 v0
                fmovi v1, %s
                fcmpg v1
        description: Check fdiv2 with +0 and various values (NaN, Inf, min, max, numbers).
        cases:
            - values:
                # +Inf
                - "0x7f800000"
                - "0"
            - values:
                # -Inf
                - "0xff800000"
                # -0.0
                - "0x80000000"
            - values:
                # 1d
                - "1"
                - "0"
            - values:
                # -1d
                - "-1"
                - "-0.0"
            - values:
                # +max
                - "0x7f7fffff"
                - "0"
            - values:
                # -max
                - "0xff7fffff"
                # -0.0
                - "0x80000000"
            - values:
                # +min
                - "0x00000001"
                - "0"
            - values:
                # -min
                - "0x80000001"
                # -0.0
                - "0x80000000"
            - values:
                # Some FP value,
                - "3.1415927"
                - "0"

      - file-name: "op_vs_8_nzero"
        isa:
          instructions:
            - sig: fdiv2 v:in:f32
              acc: inout:f32
              format: [op_v_8]
        check-type: check-positive
        tags: ['irtoc_ignore']
        code-template: |
            #
                fldai -0.0 #
                fmovi v0, %s
            # Div of -0.0 and value
                fdiv2 v0
                fmovi v1, %s
                fcmpg v1
        description: Check fdiv2 with -0 and various values (NaN, Inf, min, max, numbers).
        cases:
          - values:
              # +Inf
              - "0x7f800000"
              # -0.0d
              - "0x80000000"
          - values:
              # -Inf
              - "0xff800000"
              - "0"
          - values:
              # 1d
              - "1"
              - "0"
          - values:
              - "-1"
              - "0"
          - values:
              # +max
              - "0x7f7fffff"
              - "0"
          - values:
              # -max
              - "0xff7fffff"
              - "0"
          - values:
              # +min
              - "0x00000001"
              # -0.0d
              - "0x80000000"
          - values:
              # -min
              - "0x80000001"
              - "0"
          - values:
              - "3.1415927"
              - "0"
          - values:
              # Some FP value,
              - "-3.1415927"
              - "0"
      - file-name: "op_vs_8_pone"
        isa:
          instructions:
            - sig: fdiv2 v:in:f32
              acc: inout:f32
              format: [op_v_8]
          description: Division is infinity if any non zero value is divided by zero.
        check-type: check-positive
        tags: ['irtoc_ignore']
        code-template: |
            #
                fldai 1.0 #
                fmovi v0, %s
            # Div of 1.0 and value
                fdiv2 v0
                fmovi v1, %s
                fcmpg v1
        description: Check fdiv2 with +1 and various values (NaN, Inf, min, max, numbers).
        cases:
          - values:
              # +0.0d
              - "0"
              # +Inf
              - "0x7f800000"
            bugid: ["966", "965"]
          - values:
              # -0.0d
              - "0x80000000"
              # -Inf
              - "0xff800000"
            bugid: ["966", "965"]
          - values:
              - "1"
              - "1"
          - values:
              - "-1"
              - "-1"
          - values:
              # +Inf
              - "0x7f800000"
              - "0"
          - values:
              # -Inf
              - "0xff800000"
              # -0.0d
              - "0x80000000"
          - values:
              # +max
              - "0x7f7fffff"
              - "0x00200000"
          - values:
              # -max
              - "0xff7fffff"
              - "0x80200000"
          - values:
              # +min
              - "0x00000001"
              # +Inf
              - "0x7F800000"
          - values:
              # -min
              - "0x80000001"
              # -Inf
              - "0xFF800000"
          - values:
              - "3.1415927"
              - "0x3ea2f983"
          - values:
              - "-3.1415927"
              - "0xbea2f983"

          - values:
              # Some FP value
              - "1234.9876"
              - "0x3a5443b5"

      - file-name: "op_vs_8_none"
        isa:
          instructions:
            - sig: fdiv2 v:in:f32
              acc: inout:f32
              format: [op_v_8]
          description: Division is infinity if any non zero value is divided by zero.
        check-type: check-positive
        tags: ['irtoc_ignore']
        code-template: |
            #
                fldai -1.0 #
                fmovi v0, %s
            # Div of -1.0 and value
                fdiv2 v0
                fmovi v1, %s
                fcmpg v1
        description: Check fdiv2 with -1 and various values (NaN, Inf, min, max, numbers).
        cases:
          - values:
              # +0.0d
              - "0"
              # -Inf
              - "0xFF800000"
            bugid: ["966", "965"]
          - values:
              # -0.0d
              - "0x80000000"
              # +Inf
              - "0x7F800000"
            bugid: ["966", "965"]
          - values:
              # 1d
              - "1"
              - "-1"
          - values:
              - "-1"
              - "1"
            bugid: ["966", "965"]
          - values:
              # +Inf
              - "0x7f800000"
              - "0x80000000"
          - values:
              # -Inf
              - "0xFF800000"
              - "0"
          - values:
              # +max
              - "0x7f7fffff"
              - "0x80200000"
          - values:
              # -max
              - "0xff7fffff"
              - "0x00200000"
          - values:
              # +min
              - "0x00000001"
              # -Inf
              - "0xFF800000"
          - values:
              # -min
              - "0x80000001"
              # +Inf
              - "0x7F800000"
          - values:
              # Some FP value, 3.1415927
              - "0x40490fdb"
              - "0xbea2f983"
          - values:
              # Some FP value, -3.1415927
              - "0xc0490fdb"
              - "0x3ea2f983"
          - values:
              # Some FP value
              - "1234.9876"
              - "0xba5443b5"

      - file-name: "op_vs_8"
        isa:
          instructions:
            - sig: fdiv2 v:in:f32
              acc: inout:f32
              format: [op_v_8]
        check-type: check-positive
        tags: ['irtoc_ignore']
        code-template: |
            #
                fldai %s #
                fmovi v0, %s
            # Div of -1.0 and value
                fdiv2 v0
                fmovi v1, %s
                fcmpg v1
        description: Check fdiv2 with various values.
        cases:
            - values:
                - "1.0"
                - "-1.0"
                - "-1.0"
            - values:
                - "1.0"
                - "1.0"
                - "1.0"
            - values:
                - "-1.0"
                - "1.0"
                - "-1.0"
            - values:
                - "1.0e10"
                - "1.0e10"
                - "1.0"
            - values:
                - "1.0e10"
                - "-1.0e10"
                - "-1.0"
            - values:
                - "1.0e+10"
                - "1.0e-10"
                - "1.0e+20"
            - values:
                - "-1.0e10"
                - "1.0e10"
                - "-1.0"
            - values:
                - "-1.0e-10"
                - "1.0e-10"
                - "-1.0"
            - values:
                - "-1.0e+10"
                - "-1.0e-10"
                - "1.0e+20"
            - values:
                - "3.1415927"
                - "-3.1415927"
                - "-1.0"
            - values:
                - "3.1415927e10"
                - "-3.1415927e10"
                - "-1.0"
#            - values:
#              # TODO add test cases for maximal and minimal FP value in decimal scientific literal
      - file-name: "op_vs_8_max"
        isa:
          instructions:
            - sig: fdiv2 v:in:f32
              acc: inout:f32
              format: [op_v_8]
        check-type: check-positive
        tags: ['irtoc_ignore']
        code-template: |
            #
                fldai %s
                fmovi v0, %s
            # Div of two values
                fdiv2 v0
                fmovi v1, %s
                fcmpg v1
        description: Check fdiv2 with various max values.
        cases:
          - values:
              # +max
              - "0x7f7fffff"
              # +max
              - "0x7f7fffff"
              - "1"
          - values:
              # -max
              - "0xff7fffff"
              # -max
              - "0xff7fffff"
              - "1"
          - values:
              # +max
              - "0x7f7fffff"
              # -max
              - "0xff7fffff"
              - "-1"
          - values:
              # -max
              - "0xff7fffff"
              # +max
              - "0x7f7fffff"
              - "-1"

          - values:
              # +max
              - "0x7f7fffff"
              # 1d
              - "1"
              # +max
              - "0x7f7fffff"

          - values:
              # +max
              - "0x7f7fffff"
              - "-1"
             # -max
              - "0xff7fffff"
          - values:
              # -max
              - "0xff7fffff"
              # 1d
              - "1"
              # -max
              - "0xff7fffff"
          - values:
              # -max
              - "0xff7fffff"
              - "-1"
              # +max
              - "0x7f7fffff"

      - file-name: "op_vs_8_zeroes_nan"
        bugid: ["966", "965"]
        isa:
          instructions:
            - sig: fdiv2 v:in:f32
              acc: inout:f32
              format: [op_v_8]
          description: Division is NaN if zero is divided by zero.
        check-type: check-acc-nan-f32
        tags: ['irtoc_ignore']
        code-template: |
            #
                fldai %s #
                fmovi v0, %s
            # Div of zero by zero
                fdiv2 v0
        cases:
            - values:
                - "0.0"
                - "0.0"
            - values:
                - "0.0"
                - "-0.0"
            - values:
                - "-0.0"
                - "0.0"
            - values:
                - "-0.0"
                - "-0.0"

      - file-name: "incorrect_reg"
        isa:
          instructions:
            - sig: fdiv2 v:in:f32
              acc: inout:f32
              format: [op_v_8]
        check-type: none
        runner-options: [compile-failure]
        description: Check fdiv2 with incorrect register numbers.
        code-template: |
          #
              fdiv2 %s
        cases:
          - values: [v256]
          - values: [v65535]
          - values: [a0]
          - values: [a255]
          - values: ['null']
          - values: [0]
          - values: [1.1]
          - values: ['2.2']

      - file-name: "reg_number"
        isa:
          instructions:
            - sig: fdiv2 v:in:f32
              acc: inout:f32
              format: [op_v_8]
        check-type: none
        runner-options: [compile-only]
        description: Check fdiv2 with correct register numbers.
        code-template: |
          #
              fdiv2 %s
        cases:
          - values: [v0]
          - values: [v16]
          - values: [v128]
          - values: [v255]

      - file-name: "calc"
        isa:
          instructions:
            - sig: fdiv2 v:in:f32
              acc: inout:f32
              format: [op_v_8]
        check-type: check-positive
        code-template: |
            #
                fldai %s #
                fmovi v0, %s
                fdiv2 v0
                fmovi v1, %s
                fcmpg v1
        description: Check fdiv2 with various values.
        tags: ['tsan', 'irtoc_ignore']
        cases:
            - values:
                - "0.2163294"
                - "-0.3406104"
                - "-0.63512266"
            - values:
                - "0.3657011"
                - "0.0702997"
                - "5.202029"
            - values:
                - "0.4505041"
                - "0.2904757"
                - "1.5509183"
            - values:
                - "0.2148952"
                - "0.3347885"
                - "0.6418835"
            - values:
                - "0.3553113"
                - "0.4460468"
                - "0.7965785"
            - values:
                - "-0.2411176"
                - "-0.3790812"
                - "0.6360579"
            - values:
                - "-0.2518421"
                - "-0.3539177"
                - "0.71158385"
            - values:
                - "0.0714281"
                - "0.3986848"
                - "0.17915931"
            - values:
                - "-0.0423414"
                - "-0.3715421"
                - "0.11396124"
            - values:
                - "0.39756609"
                - "0.10346800"
                - "3.842406"
            - values:
                - "5.6565e-19"
                - "2751435.14"
                - "2.0558361e-25"
      - file-name: "type"
        isa:
            instructions:
              - sig: fdiv2 v:in:f32
                acc: inout:f32
                format: [op_v_8]
            verification:
              - acc_type
              - v1_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
              fdiv2 v0
        check-type: exit-positive
        description: Check 'fdiv2' with incorrect register and accumulator type.
        template-cases:
          - values:
              - movi v0, 0
          - values:
              - movi.64 v0, 0
          - values:
              - fmovi v0, 0
            exclude: [val]
          - 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.str "string"
                    sta.obj v0
          - values:
              - |
                #
                    movi v0, 10
                    newarr v0, v0, i32[]
          - values:
              - mov.null v0

        cases:
          - values:
              - ldai 0
          - values:
              - ldai.64 0
          - values:
              - fldai 0
            id: val
          - values:
              - fldai.64 0
          - values:
              - |
                #
                    lda.type A
          - values:
              - |
                #
                    lda.type A[]
          - values:
              - |
                #
                    lda.type panda.String
          - values:
              - |
                #
                    lda.str "string"
          - values:
              - |
                #
                    movi v1, 10
                    newarr v1, v1, f32[]
                    lda.obj v1
          - values:
              - lda.null

      - file-name: uninitialized_regs
        isa:
          instructions:
            - sig: fdiv2 v:in:f32
              acc: inout:f32
              format: [op_v_8]
        description: Check 'fdiv2' with uninitialized register and accumulator.
        tags: ['verifier']
        runner-options: ['verifier-failure', 'verifier-config']
        code-template: |
            #
                %s
                *s
                fdiv2 %s
        check-type: exit-positive
        template-cases:
          - values:
              - ''
              - v0
          - values:
              - fmovi v0, 0
              - v0
            exclude: [init]
          - values:
              - ''
              - v7
          - values:
              - ''
              - v15
          - values:
              - fmovi v15, 0
              - v15
            exclude: [init]
          - values:
              - ''
              - v128
          - values:
              - fmovi v128, 0
              - v128
            exclude: [init]
          - values:
              - ''
              - v255
          - values:
              - fmovi v255, 0
              - v255
            exclude: [init]
        cases:
          - values:
              - ''
          - values:
              - fldai 0
            id: init