# 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: "fsub2" 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: fsub2 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 fsub2 v0 description: > Check fsub2 results in NaN when acc or v0 is NaN template-cases: - values: # NaN - "0x7ff80000" - values: # NaN representation - "0xFFFFFFFF" - values: - "0" exclude: [hasval] - values: - "-0.0" exclude: [hasval] - values: - "1" exclude: [hasval] - values: - "-1" exclude: [hasval] - values: # +Inf - "0x7ff00000" exclude: [hasval] - values: # -Inf - "0xfff00000" exclude: [hasval] - values: # +max - "0x7fefffff" exclude: [hasval] - values: # -max - "0xffefffff" exclude: [hasval] - values: # +min - "0x00000001" exclude: [hasval] - values: # -min - "0x80000001" exclude: [hasval] - values: - "3.1415927" exclude: [hasval] - values: - "1234567890" exclude: [hasval] cases: - values: # NaN - "0x7ff80000" - values: # NaN - "0xFFFFFFFF" - values: - "0" id: hasval - values: - "-0.0" id: hasval - values: - "1" id: hasval - values: - "-1" id: hasval - values: # +Inf - "0x7ff00000" id: hasval - values: # -Inf - "0xfff00000" id: hasval - values: # +max - "0x7fefffff" id: hasval - values: # -max - "0xffefffff" id: hasval - values: # +min - "0x00000001" id: hasval - values: # -min - "0x80000001" id: hasval - values: - "3.1415927" id: hasval - values: - "1234567890" id: hasval - file-name: "op_vs_8_pinf" isa: instructions: - sig: fsub2 v:in:f32 acc: inout:f32 format: [op_v_8] description: > The sum of two infinities of the same sign or the difference of two infinities of opposite sign is infinity. The sign of result matches the sign of accumulator value. The sum or the difference of infinity and any finite value is infinity. The sign of result matches the sign of infinity. check-type: check-positive tags: ['irtoc_ignore'] code-template: | # fldai 0x7f800000 # +Inf fmovi v0, %s # Sub of +Inf and value fsub2 v0 fmovi v1, %s fcmpg v1 description: Check fsub2 with positive Inf and various values (NaN, Inf, min, max, numbers). cases: - values: # -Inf - "0xff800000" - "0x7f800000" - values: - "0" - "0x7f800000" - values: - "-0.0" - "0x7f800000" - values: - "1" - "0x7f800000" - values: - "-1" - "0x7f800000" - values: # +max - "0x7f7fffff" - "0x7f800000" - values: # -max - "0xff7fffff" - "0x7f800000" - values: # +min - "0x00000001" - "0x7f800000" - values: # -min - "0x80000001" - "0x7f800000" - values: - "3.1415927" - "0x7f800000" - values: - "1234567890" - "0x7f800000" - file-name: "op_vs_8_ninf" isa: instructions: - sig: fsub2 v:in:f32 acc: inout:f32 format: [op_v_8] description: > The sum of two infinities of the same sign or the difference of two infinities of opposite sign is infinity. The sign of result matches the sign of accumulator value. The sum or the difference of infinity and any finite value is infinity. The sign of result matches the sign of infinity. check-type: check-positive tags: ['irtoc_ignore'] code-template: | # fldai 0xff800000 # -Inf fmovi v0, %s # Sub of -Inf and value fsub2 v0 fmovi v1, %s fcmpg v1 description: Check fsub2 with negative Inf and various values (NaN, Inf, min, max, numbers). cases: - values: # +Inf - "0x7f800000" # -Inf - "0xff800000" - values: - "0" # -Inf - "0xff800000" - values: - "-0.0" # -Inf - "0xff800000" - values: - "1" # -Inf - "0xff800000" - values: - "-1" # -Inf - "0xff800000" - values: # +max - "0x7f7fffff" # -Inf - "0xff800000" - values: # -max - "0xff7fffff" # -Inf - "0xff800000" - values: # +min - "0x00000001" # -Inf - "0xff800000" - values: # -min - "0x80000001" # -Inf - "0xff800000" - values: - "3.1415927" # -Inf - "0xff800000" - values: - "1234567890" # -Inf - "0xff800000" - file-name: "op_vs_8_inf_nan" isa: instructions: - sig: fsub2 v:in:f32 acc: inout:f32 format: [op_v_8] description: > The sum of opposite infinities or the difference of the same sign infinities is NaN. check-type: check-acc-nan-f32 tags: ['irtoc_ignore'] code-template: | # fldai %s fmovi v0, %s # Sub of same sign Inf-s fsub2 v0 description: > Check fsub2 with (-Inf, -Inf) and (+Inf, +Inf) is NaN. cases: - values: - "0x7ff00000" - "0x7ff00000" - values: - "0xfff00000" - "0xfff00000" - file-name: "op_vs_8_pzero" isa: instructions: - sig: fsub2 v:in:f32 acc: inout:f32 format: [op_v_8] description: > The sum or the difference of infinity and any finite value is infinity. The sign of result matches the sign of infinity. The sum or the difference of zeros is zero. Exceptions are the sum of two negative zeros and the difference of negative and positive zero - the result is negative zero. check-type: check-positive tags: ['irtoc_ignore'] code-template: | # fldai 0.0 # fmovi v0, %s # Sub of +0.0 and value fsub2 v0 fmovi v1, %s fcmpg v1 description: Check fsub2 with positive zero and various values (NaN, Inf, min, max, numbers). cases: - values: - "0" - "0" - values: - "-0.0" - "0" - values: - "1" - "-1" - values: - "-1" - "1" - values: # +Inf - "0x7f800000" - "0xff800000" - values: # -Inf - "0xff800000" # +Inf - "0x7f800000" - values: # +max - "0x7f7fffff" # -max - "0xff7fffff" - values: # -max - "0xff7fffff" # +max - "0x7f7fffff" - values: # +min - "0x00000001" - "0x80000001" - values: # -min - "0x80000001" - "0x00000001" - values: - "3.1415927" - "-3.1415927" - values: - "-3.1415927" - "3.1415927" - file-name: "op_vs_8_nzero" isa: instructions: - sig: fsub2 v:in:f32 acc: inout:f32 format: [op_v_8] description: > The sum or the difference of infinity and any finite value is infinity. The sign of result matches the sign of infinity. The sum or the difference of zeros is zero. Exceptions are the sum of two negative zeros and the difference of negative and positive zero - the result is negative zero. check-type: check-positive tags: ['irtoc_ignore'] code-template: | # fldai -0.0 # fmovi v0, %s # Sub of -0.0 and value fsub2 v0 fmovi v1, %s fcmpg v1 description: Check fsub2 with negative zero and various values (NaN, Inf, min, max, numbers). cases: # Commented because there is no direct way to compare 0.0 and -0.0 # - case-template: | # # # fldai -0.0 # # fmovi v0, +0.0 # # Sub of -0.0 and +0.0 should be -0.0 # fsub2 v0 # fmovi v1, -0.0 # fcmpg v1 # compare as binary values, due to +0.0 == -0.0, but 0x8000000000000000 != 0x0000000000000000 - values: - "0" - "0" - values: - "-0.0" - "0" - values: - "1" - "-1" - values: - "-1" - "1" - values: # +Inf - "0x7f800000" - "0xff800000" - values: # -Inf - "0xff800000" # +Inf - "0x7f800000" - values: # +max - "0x7f7fffff" # -max - "0xff7fffff" - values: # -max - "0xff7fffff" # +max - "0x7f7fffff" - values: # +min - "0x00000001" - "0x80000001" - values: # -min - "0x80000001" - "0x00000001" - values: - "3.1415927" - "-3.1415927" - values: - "-3.1415927" - "3.1415927" - file-name: "op_vs_8_pone" isa: instructions: - sig: fsub2 v:in:f32 acc: inout:f32 format: [op_v_8] description: > The sum or the difference of infinity and any finite value is infinity. The sign of result matches the sign of infinity. check-type: check-positive tags: ['irtoc_ignore'] code-template: | # fldai 1.0 # fmovi v0, %s # Sub of 1.0 and value fsub2 v0 fmovi v1, %s fcmpg v1 description: Check fsub2 with +1 and various values (NaN, Inf, min, max, numbers). cases: - values: - "0" - "1" - values: - "-0.0" - "1" - values: - "1" - "0" - values: - "-1" - "2" - values: # +Inf - "0x7f800000" - "0xFF800000" - values: # -Inf - "0xff800000" # +Inf - "0x7F800000" - values: # +max - "0x7f7fffff" - "0xFF7FFFFF" - values: # -max - "0xFF7FFFFF" # +max - "0x7F7FFFFF" - values: # +min - "0x00000001" - "1" - values: # -min - "0x80000001" - "1" - values: - "3.1415927" - "-2.1415927" - values: - "-3.1415927" - "4.141593" - values: - "1234.9876" - "-1233.9875" - file-name: "op_vs_8_none" isa: instructions: - sig: fsub2 v:in:f32 acc: inout:f32 format: [op_v_8] description: > The sum or the difference of infinity and any finite value is infinity. The sign of result matches the sign of infinity. check-type: check-positive tags: ['irtoc_ignore'] code-template: | # fldai -1.0 # fmovi v0, %s # Sub of -1.0 and value fsub2 v0 fmovi v1, %s fcmpg v1 description: Check fsub2 with -1 and various values (NaN, Inf, min, max, numbers). cases: - values: - "0" - "-1" - values: - "-0.0" - "-1" - values: - "1" - "-2" - values: - "-1" - "0" - values: # +Inf - "0x7f800000" - "0xff800000" - values: # -Inf - "0xff800000" # -Inf - "0x7F800000" - values: # +max - "0x7f7fffff" - "0xFF7FFFFF" - values: # -max - "0xFF7FFFFF" - "0x7F7FFFFF" - values: # +min - "0x00000001" - "-1" - values: # -min - "0x80000001" - "-1" - values: - "3.1415927" - "-4.141593" - values: - "-3.1415927" - "2.1415927" - values: - "1234.9876" - "-1235.9875" - file-name: "op_vs_8" isa: instructions: - sig: fsub2 v:in:f32 acc: inout:f32 format: [op_v_8] description: > The sum or the difference of zeros is zero. Exceptions are the sum of two negative zeros and the difference of negative and positive zero - the result is negative zero. check-type: check-positive tags: ['irtoc_ignore'] code-template: | # fldai %s # fmovi v0, %s # Sub of -1.0 and value fsub2 v0 fmovi v1, %s fcmpg v1 description: Check fsub2 with various values. cases: - values: - "0.0" - "0.0" - "0.0" - values: - "0.0" - "-0.0" - "0.0" - values: - "-0.0" - "0.0" - "0.0" - values: - "-0.0" - "-0.0" - "0.0" - values: - "1.0" - "-1.0" - "2.0" - values: - "1.0" - "1.0" - "0.0" - values: - "-1.0" - "1.0" - "-2.0" - values: - "1.0e10" - "1.0e10" - "0.0" - values: - "1.0e10" - "-1.0e10" - "2.0e10" - values: - "1.0e+10" - "1.0e-10" - "1.0e+10" - values: - "-1.0e10" - "1.0e10" - "-2.0e10" - values: - "-1.0e-10" - "1.0e-10" - "-2.0e-10" - values: - "-1.0e+10" - "-1.0e-10" - "-1.0e+10" - values: - "3.1415927" - "-3.1415927" - "6.2831854" - values: - "3.1415927e20" - "-3.1415927e20" - "6.2831854e20" # - values: # # TODO add test cases for maximal and minimal FP value in decimal scientific literal - file-name: "op_vs_8_max" isa: instructions: - sig: fsub2 v:in:f32 acc: inout:f32 format: [op_v_8] check-type: check-positive tags: ['irtoc_ignore'] code-template: | # fldai %s fmovi v0, %s # Sub of two values fsub2 v0 fmovi v1, %s fcmpg v1 description: Check fsub2 with various max values. cases: - values: # +max - "0x7f7fffff" # +max - "0x7f7fffff" - "0" - values: # -max - "0xFF7FFFFF" # -max - "0xFF7FFFFF" - "0" - values: # +max - "0x7f7fffff" # -max - "0xFF7FFFFF" # +Inf - "0x7f800000" - values: # +max - "0x7f7fffff" - "1" # +max - "0x7f7fffff" - values: # +max - "0x7f7fffff" - "-1" # +max - "0x7f7fffff" - values: # -max - "0xFF7FFFFF" - "1" # -max - "0xFF7FFFFF" - values: # -max - "0xFF7FFFFF" - "-1" # -max - "0xFF7FFFFF" - file-name: "incorrect_reg" isa: instructions: - sig: fsub2 v:in:f32 acc: inout:f32 format: [op_v_8] check-type: none runner-options: [compile-failure] description: Check fsub2 with incorrect register numbers. code-template: | # fsub2 %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: fsub2 v:in:f32 acc: inout:f32 format: [op_v_8] check-type: none runner-options: [compile-only] description: Check fsub2 with correct register numbers. code-template: | # fsub2 %s cases: - values: [v0] - values: [v16] - values: [v128] - values: [v255] - file-name: "calc" isa: instructions: - sig: fsub2 v:in:f32 acc: inout:f32 format: [op_v_8] check-type: check-positive code-template: | # fldai %s # fmovi v0, %s fsub2 v0 fmovi v1, %s fcmpg v1 description: Check fsub2 with various values. tags: ['tsan', 'irtoc_ignore'] cases: - values: - "-0.0567335" - "0.4165127" - "-0.4732462" - values: - "-0.2607618" - "0.0750908" - "-0.3358526" - values: - "-0.1367484" - "-0.3743675" - "0.2376191" - values: - "0.1286609" - "0.4168653" - "-0.28820437" - values: - "0.3796686" - "0.499001" - "-0.1193324" - values: - "0.1856411" - "0.2197109" - "-0.034069806" - values: - "0.40653" - "0.11364" - "0.29288998" - values: - "-0.1010416" - "-0.1119799" - "0.010938302" - values: - "0.3251595" - "-0.0959657" - "0.42112517" - values: - "0.2310778" - "-0.2677659" - "0.49884373" - values: - "2.2049776e-20" - "-8.691135e-21" - "3.074091e-20" - values: - "2.4603309e10" - "-3.5318111e9" - "2.81351188e10" - file-name: "type" isa: instructions: - sig: fsub2 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 .record panda.Object .function i32 main() { %s *s fsub2 v0 check-type: exit-positive description: Check 'fsub2' 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, f64[] lda.obj v1 - values: - lda.null - file-name: uninitialized_regs isa: instructions: - sig: fsub2 v:in:f32 acc: inout:f32 format: [op_v_8] description: Check 'fsub2' with uninitialized register and accumulator. tags: ['verifier'] runner-options: ['verifier-failure', 'verifier-config'] code-template: | # %s *s fsub2 %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