1# Copyright (c) 2021-2022 Huawei Device Co., Ltd.
2# Licensed under the Apache License, Version 2.0 (the "License");
3# you may not use this file except in compliance with the License.
4# You may obtain a copy of the License at
5#
6# http://www.apache.org/licenses/LICENSE-2.0
7#
8# Unless required by applicable law or agreed to in writing, software
9# distributed under the License is distributed on an "AS IS" BASIS,
10# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11# See the License for the specific language governing permissions and
12# limitations under the License.
13
14definitions: []
15tests:
16  - file-name: "fmul2"
17    isa:
18      title: Two address floating-point binary operation on accumulator
19      description: >
20        Perform specified floating-point binary operation on accumulator and register and store result into accumulator.
21        The results of instructions correspond IEEE-754 arithmetic rules.
22      exceptions:
23        - x_none
24    commands:
25      - file-name: "op_vs_8_nan"
26        isa:
27          instructions:
28            - sig: fmul2 v:in:f32
29              acc: inout:f32
30              format: [op_v_8]
31          description: Any operation with NaN results to NaN value.
32        check-type: check-acc-nan-f32
33        tags: ['irtoc_ignore']
34        code-template: |
35          #
36              fldai %s
37              fmovi v0, *s
38              fmul2 v0
39        description: >
40          Check fmul2 results in NaN when acc or v0 is NaN
41        template-cases:
42          - values:
43              # NaN
44              - "0x7ff80000"
45          - values:
46              # NaN representation
47              - "0xFFFFFFFF"
48          - values:
49              - "0"
50            exclude: [hasval]
51          - values:
52              # -0.0d
53              - "0x80000000"
54            exclude: [hasval]
55          - values:
56              - "1"
57            exclude: [hasval]
58          - values:
59              - "-1"
60            exclude: [hasval]
61          - values:
62              # +Inf
63              - "0x7f800000"
64            exclude: [hasval]
65          - values:
66              # -Inf
67              - "0xff800000"
68            exclude: [hasval]
69          - values:
70              # +max
71              - "0x7f7fffff"
72            exclude: [hasval]
73          - values:
74              # -max
75              - "0xff7fffff"
76            exclude: [hasval]
77          - values:
78              # +min
79              - "0x00000001"
80            exclude: [hasval]
81          - values:
82              # -min
83              - "0x80000001"
84            exclude: [hasval]
85          - values:
86              - "3.1415927"
87            exclude: [hasval]
88          - values:
89              - "1234567890"
90            exclude: [hasval]
91        cases:
92          - values:
93              # NaN
94              - "0x7ff80000"
95          - values:
96              # NaN
97              - "0xFFFFFFFF"
98          - values:
99              - "0"
100            id: hasval
101          - values:
102              # -0.0d
103              - "0x80000000"
104            id: hasval
105          - values:
106              - "1"
107            id: hasval
108          - values:
109              - "-1"
110            id: hasval
111          - values:
112              # +Inf
113              - "0x7f800000"
114            id: hasval
115          - values:
116              # -Inf
117              - "0xff800000"
118            id: hasval
119          - values:
120              # +max
121              - "0x7f7fffff"
122            id: hasval
123          - values:
124              # -max
125              - "0xff7fffff"
126            id: hasval
127          - values:
128              # +min
129              - "0x00000001"
130            id: hasval
131          - values:
132              # -min
133              - "0x80000001"
134            id: hasval
135          - values:
136              - "3.1415927"
137            id: hasval
138          - values:
139              - "1234567890"
140            id: hasval
141
142      - file-name: "op_vs_8_pinf"
143        isa:
144          instructions:
145            - sig: fmul2 v:in:f32
146              acc: inout:f32
147              format: [op_v_8]
148          description: Multiplication is infinity if any non zero value is multiplied by infinity.
149        check-type: check-positive
150        tags: ['irtoc_ignore']
151        code-template: |
152            #
153                fldai 0x7f800000 # +Inf
154                fmovi v0, %s
155            # Mult of +Inf and value
156                fmul2 v0
157                fmovi v1, %s
158                fcmpg v1
159        description: Check fmul2 with +Inf and various values (NaN, Inf, min, max, numbers).
160        cases:
161          - values:
162              - "1"
163              # Inf
164              - "0x7f800000"
165          - values:
166              - "-1"
167              # -Inf
168              - "0xFF800000"
169          - values:
170              # +Inf
171              - "0x7f800000"
172              # Inf
173              - "0x7f800000"
174          - values:
175              # -Inf
176              - "0xff800000"
177              # -Inf
178              - "0xFF800000"
179          - values:
180              # +max
181              - "0x7f7fffff"
182              # Inf
183              - "0x7F800000"
184          - values:
185              # -max
186              - "0xff7fffff"
187              # -Inf
188              - "0xFF800000"
189          - values:
190              # +min
191              - "0x00000001"
192              # Inf
193              - "0x7F800000"
194          - values:
195              # -min
196              - "0x80000001"
197              # -Inf
198              - "0xFF800000"
199          - values:
200              - "3.1415927"
201              # Inf
202              - "0x7F800000"
203          - values:
204              - "1234567890"
205              # Inf
206              - "0x7F800000"
207
208      - file-name: "op_vs_8_ninf"
209        isa:
210          instructions:
211            - sig: fmul2 v:in:f32
212              acc: inout:f32
213              format: [op_v_8]
214          description: Multiplication is infinity if any non zero value is multiplied by infinity.
215        tags: ['irtoc_ignore']
216        check-type: check-positive
217        code-template: |
218            #
219                fldai 0xff800000 # -Inf
220                fmovi v0, %s
221            # Mult of -Inf and value
222                fmul2 v0
223                fmovi v1, %s
224                fcmpg v1
225        description: Check fmul2 with -Inf and various values (NaN, Inf, min, max, numbers).
226        cases:
227            - values:
228                - "1"
229                # -Inf
230                - "0xff800000"
231            - values:
232                - "-1"
233                # +Inf
234                - "0x7F800000"
235            - values:
236                # +Inf
237                - "0x7f800000"
238                # -Inf
239                - "0xff800000"
240            - values:
241                # -Inf
242                - "0xff800000"
243                # +Inf
244                - "0x7F800000"
245            - values:
246                # +max
247                - "0x7f7fffff"
248                # -Inf
249                - "0xff800000"
250            - values:
251                # -max
252                - "0xff7fffff"
253                # +Inf
254                - "0x7F800000"
255            - values:
256                # +min
257                - "0x00000001"
258                # -Inf
259                - "0xff800000"
260            - values:
261                # -min
262                - "0x80000001"
263                # +Inf
264                - "0x7F800000"
265            - values:
266                - "3.1415927"
267                # -Inf
268                - "0xff800000"
269            - values:
270                - "1234567890"
271                # -Inf
272                - "0xff800000"
273
274      - file-name: "op_vs_8_pzero"
275        isa:
276          instructions:
277            - sig: fmul2 v:in:f32
278              acc: inout:f32
279              format: [op_v_8]
280          description: The sign of division or multiplication result is positive if both values have the same sign, negative if the values have different sign.
281        check-type: check-positive
282        tags: ['irtoc_ignore']
283        code-template: |
284            #
285                fldai 0.0 #
286                fmovi v0, %s
287            # Mult of +0.0 and value
288                fmul2 v0
289                fmovi v1, %s
290                fcmpg v1
291        description: Check fmul2 with +0 and various values (NaN, Inf, min, max, numbers).
292        cases:
293            - values:
294                - "0"
295                - "0"
296            - values:
297                - "-0.0"
298                - "-0.0"
299            - values:
300                - "1"
301                - "0"
302            - values:
303                - "-1"
304                - "-0.0"
305            - values:
306                # +max
307                - "0x7f7fffff"
308                - "0"
309            - values:
310                # -max
311                - "0xff7fffff"
312                - "-0.0"
313            - values:
314                # +min
315                - "0x00000001"
316                - "0"
317            - values:
318                # -min
319                - "0x80000001"
320                - "-0.0"
321            - values:
322                - "3.1415927"
323                - "0"
324
325      - file-name: "op_vs_8_nzero"
326        isa:
327          instructions:
328            - sig: fmul2 v:in:f32
329              acc: inout:f32
330              format: [op_v_8]
331          description: The sign of division or multiplication result is positive if both values have the same sign, negative if the values have different sign.
332        check-type: check-positive
333        tags: ['irtoc_ignore']
334        code-template: |
335            #
336                fldai -0.0 #
337                fmovi v0, %s
338            # Mult of -0.0 and value
339                fmul2 v0
340                fmovi v1, %s
341                fcmpg v1
342        description: Check fmul2 with -0 and various values (NaN, Inf, min, max, numbers).
343        cases:
344          - values:
345              - "0"
346              - "0"
347          - values:
348              - "-0.0"
349              - "0"
350          - values:
351              - "1"
352              - "-0.0"
353          - values:
354              - "-1"
355              - "0"
356          - values:
357              # +max
358              - "0x7f7fffff"
359              - "-0.0"
360          - values:
361              # -max
362              - "0xff7fffff"
363              - "0"
364          - values:
365              # +min
366              - "0x00000001"
367              - "-0.0"
368          - values:
369              # -min
370              - "0x80000001"
371              - "0"
372          - values:
373              - "3.1415927"
374              - "-0.0"
375          - values:
376              - "-3.1415927"
377              - "0"
378
379      - file-name: "op_vs_8_zero_inf"
380        isa:
381          instructions:
382            - sig: fmul2 v:in:f32
383              acc: inout:f32
384              format: [op_v_8]
385          description: >
386            Multiplication is NaN if zero is multiplied by infinity.
387        tags: ['irtoc_ignore']
388        check-type: check-acc-nan-f32
389        code-template: |
390            #
391                fldai %s
392                fmovi v0, *s
393            # Mult 0 by Inf
394                fmul2 v0
395        description: >
396          Check fmul2 of 0 and Inf is NaN.
397        template-cases:
398          - values:
399            - "0x7f800000"
400            exclude: [inf]
401          - values:
402            - "0xff800000"
403            exclude: [inf]
404          - values:
405            - "0"
406            exclude: [zero]
407          - values:
408            # Negative Zero
409            - "0x80000000"
410            exclude: [zero]
411        cases:
412          - values:
413            - "0x7f800000"
414            id: inf
415          - values:
416            - "0xff800000"
417            id: inf
418          - values:
419            - "0"
420            id: zero
421          - values:
422            # Negative Zero
423            - "0x80000000"
424            id: zero
425
426      - file-name: "op_vs_8_pone"
427        isa:
428          instructions:
429            - sig: fmul2 v:in:f32
430              acc: inout:f32
431              format: [op_v_8]
432        check-type: check-positive
433        tags: ['irtoc_ignore']
434        code-template: |
435            #
436                fldai 1.0 #
437                fmovi v0, %s
438            # Mult of 1.0 and value
439                fmul2 v0
440                fmovi v1, %s
441                fcmpg v1
442        description: Check fmul2 with +1 and various values (NaN, Inf, min, max, numbers).
443        cases:
444          - values:
445              # +0.0d
446              - "0"
447              - "0"
448          - values:
449              - "-0.0"
450              - "-0.0"
451          - values:
452              - "1"
453              - "1"
454          - values:
455              - "-1"
456              - "-1"
457          - values:
458              # +Inf
459              - "0x7f800000"
460              # +Inf
461              - "0x7F800000"
462          - values:
463              # -Inf
464              - "0xff800000"
465              # -Inf
466              - "0xFF800000"
467          - values:
468              # +max
469              - "0x7f7fffff"
470              # +max
471              - "0x7F7FFFFF"
472          - values:
473              # -max
474              - "0xFF7FFFFF"
475              # -max
476              - "0xFF7FFFFF"
477          - values:
478              # +min
479              - "0x00000001"
480              - "0x00000001"
481          - values:
482              # -min
483              - "0x80000001"
484              - "0x80000001"
485          - values:
486              - "3.1415927"
487              - "3.1415927"
488          - values:
489              - "-3.1415927"
490              - "-3.1415927"
491          - values:
492              - "1234.9876"
493              - "1234.9876"
494
495      - file-name: "op_vs_8_none"
496        isa:
497          instructions:
498            - sig: fmul2 v:in:f32
499              acc: inout:f32
500              format: [op_v_8]
501        check-type: check-positive
502        tags: ['irtoc_ignore']
503        code-template: |
504            #
505                fldai -1.0 #
506                fmovi v0, %s
507            # Mult of -1.0 and value
508                fmul2 v0
509                fmovi v1, %s
510                fcmpg v1
511        description: Check fmul2 with -1 and various values (NaN, Inf, min, max, numbers).
512        cases:
513          - values:
514              - "0"
515              - "-0.0"
516          - values:
517              - "-0.0"
518              - "0"
519          - values:
520              - "1"
521              - "-1"
522          - values:
523              - "-1"
524              - "1"
525          - values:
526              # +Inf
527              - "0x7f800000"
528              # -Inf
529              - "0xFF800000"
530          - values:
531              # -Inf
532              - "0xff800000"
533              # +Inf
534              - "0x7F800000"
535          - values:
536              # +max
537              - "0x7f7fffff"
538              - "0xFF7FFFFF"
539          - values:
540              # -max
541              - "0xFF7FFFFF"
542              - "0x7F7FFFFF"
543          - values:
544              # +min
545              - "0x00000001"
546              - "0x80000001"
547          - values:
548              # -min
549              - "0x80000001"
550              - "0x00000001"
551          - values:
552              - "3.1415927"
553              - "-3.1415927"
554          - values:
555              - "-3.1415927"
556              - "3.1415927"
557          - values:
558              - "1234.9876"
559              - "-1234.9876"
560
561      - file-name: "op_vs_8"
562        isa:
563          instructions:
564            - sig: fmul2 v:in:f32
565              acc: inout:f32
566              format: [op_v_8]
567          description: The sign of division or multiplication result is positive if both values have the same sign, negative if the values have different sign.
568        check-type: check-positive
569        tags: ['irtoc_ignore']
570        code-template: |
571            #
572                fldai %s #
573                fmovi v0, %s
574            # Mult of -1.0 and value
575                fmul2 v0
576                fmovi v1, %s
577                fcmpg v1
578        description: Check fmul2 with various values (zeroes, Infs, min, max, numbers).
579        cases:
580            - values:
581                - "0.0"
582                - "0.0"
583                - "0.0"
584            - values:
585                - "0.0"
586                - "-0.0"
587                - "-0.0"
588            - values:
589                - "-0.0"
590                - "0.0"
591                - "-0.0"
592            - values:
593                - "-0.0"
594                - "-0.0"
595                - "0.0"
596            - values:
597                - "1.0"
598                - "-1.0"
599                - "-1.0"
600            - values:
601                - "1.0"
602                - "1.0"
603                - "1.0"
604            - values:
605                - "-1.0"
606                - "1.0"
607                - "-1.0"
608            - values:
609                - "1.0e10"
610                - "1.0e10"
611                - "1.0e20"
612            - values:
613                - "1.0e10"
614                - "-1.0e10"
615                - "-1.0e20"
616            - values:
617                - "1.0e+10"
618                - "1.0e-10"
619                - "1.0"
620            - values:
621                - "-1.0e10"
622                - "1.0e10"
623                - "-1.0e20"
624            - values:
625                - "-1.0e-10"
626                - "1.0e-10"
627                - "0x9e3ce509"
628            - values:
629                - "-1.0e+10"
630                - "-1.0e-10"
631                - "1.0"
632            - values:
633                - "3.1415927"
634                - "-3.1415927"
635                - "-9.869605"
636            - values:
637                - "3.1415927e10"
638                - "-3.1415927e10"
639                - "-9.869605e20"
640#            - values:
641#              # TODO add test cases for maximal and minimal FP value in decimal scientific literal
642      - file-name: "op_vs_8_max"
643        isa:
644          instructions:
645            - sig: fmul2 v:in:f32
646              acc: inout:f32
647              format: [op_v_8]
648        check-type: check-positive
649        tags: ['irtoc_ignore']
650        code-template: |
651            #
652                fldai %s
653                fmovi v0, %s
654            # Mult of two values
655                fmul2 v0
656                fmovi v1, %s
657                fcmpg v1
658        description: Check fmul2 with various max values.
659        cases:
660          - values:
661              # +max
662              - "0x7f7fffff"
663              # +max
664              - "0x7f7fffff"
665              # +Inf
666              - "0x7f800000"
667          - values:
668              # -max
669              - "0xFF7FFFFF"
670              # -max
671              - "0xFF7FFFFF"
672              # +Inf
673              - "0x7f800000"
674          - values:
675              # +max
676              - "0x7f7fffff"
677              # -max
678              - "0xFF7FFFFF"
679              # -Inf
680              - "0xff800000"
681          - values:
682              # +max
683              - "0x7f7fffff"
684              # 1d
685              - "0x3ff00000"
686              # +max
687              - "0x7f800000"
688          - values:
689              # +max
690              - "0x7f7fffff"
691              - "-1"
692              # -max
693              - "0xFF7FFFFF"
694          - values:
695              # -max
696              - "0xFF7FFFFF"
697              - "1"
698              # -max
699              - "0xFF7FFFFF"
700          - values:
701              # -max
702              - "0xFF7FFFFF"
703              - "-1"
704              # +max
705              - "0x7f7fffff"
706
707      - file-name: "incorrect_reg"
708        isa:
709          instructions:
710            - sig: fmul2 v:in:f32
711              acc: inout:f32
712              format: [op_v_8]
713        check-type: none
714        runner-options: [compile-failure]
715        description: Check fmul2 with incorrect register numbers.
716        code-template: |
717          #
718              fmul2 %s
719        cases:
720          - values: [v256]
721          - values: [v65535]
722          - values: [a0]
723          - values: [a255]
724          - values: ['null']
725          - values: [0]
726          - values: [1.1]
727          - values: ['2.2']
728
729      - file-name: "reg_number"
730        isa:
731          instructions:
732            - sig: fmul2 v:in:f32
733              acc: inout:f32
734              format: [op_v_8]
735        check-type: none
736        runner-options: [compile-only]
737        description: Check fmul2 with correct register numbers.
738        code-template: |
739          #
740              fmul2 %s
741        cases:
742          - values: [v0]
743          - values: [v16]
744          - values: [v128]
745          - values: [v255]
746
747      - file-name: "calc"
748        isa:
749          instructions:
750            - sig: fmul2 v:in:f32
751              acc: inout:f32
752              format: [op_v_8]
753        check-type: check-positive
754        code-template: |
755            #
756                fldai %s #
757                fmovi v0, %s
758                fmul2 v0
759                fmovi v1, %s
760                fcmpg v1
761        description: Check fmul2 with various values.
762        tags: ['tsan', 'irtoc_ignore']
763        cases:
764            - values:
765                - "-0.9312987"
766                - "-0.5269885"
767                - "0.4907837"
768            - values:
769                - "-0.7473367"
770                - "0.5438369"
771                - "-0.40642926"
772            - values:
773                - "0.3164795"
774                - "-0.5745936"
775                - "-0.1818471"
776            - values:
777                - "-0.2103265"
778                - "0.3927316"
779                - "-0.08260186"
780            - values:
781                - "0.1012084"
782                - "0.8246991"
783                - "0.08346648"
784            - values:
785                - "-0.4343271"
786                - "0.7903281"
787                - "-0.3432609"
788            - values:
789                - "-0.206641"
790                - "0.3493545"
791                - "-0.07219096"
792            - values:
793                - "0.1333693"
794                - "0.3799164"
795                - "0.050669182"
796            - values:
797                - "0.5937602"
798                - "0.1781606"
799                - "0.10578467"
800            - values:
801                - "-0.8800125"
802                - "0.8179463"
803                - "-0.719803"
804            - values:
805                - "0.3629221"
806                - "-0.685815"
807                - "-0.24889742"
808      - file-name: "type"
809        isa:
810            instructions:
811              - sig: fmul2 v:in:f32
812                acc: inout:f32
813                format: [op_v_8]
814            verification:
815              - acc_type
816              - v1_type
817        tags: ['verifier']
818        runner-options: ['verifier-failure', 'verifier-config']
819        header-template: []
820        code-template: |
821          #
822          .record A {}
823          .record B {}
824          .record panda.String <external>
825          .record panda.Object <external>
826          .function i32 main() {
827              %s
828              *s
829              fmul2 v0
830        check-type: exit-positive
831        description: Check 'fmul2' with incorrect register and accumulator type.
832        template-cases:
833          - values:
834              - movi v0, 0
835          - values:
836              - movi.64 v0, 0
837          - values:
838              - fmovi v0, 0
839            exclude: [val]
840          - values:
841              - fmovi.64 v0, 0
842          - values:
843              - |
844                #
845                    lda.type B
846                    sta.obj v0
847          - values:
848              - |
849                #
850                    lda.type B[]
851                    sta.obj v0
852          - values:
853              - |
854                #
855                    lda.type panda.String
856                    sta.obj v0
857          - values:
858              - |
859                #
860                    lda.str "string"
861                    sta.obj v0
862          - values:
863              - |
864                #
865                    movi v0, 10
866                    newarr v0, v0, i32[]
867          - values:
868              - mov.null v0
869
870        cases:
871          - values:
872              - ldai 0
873          - values:
874              - ldai.64 0
875          - values:
876              - fldai 0
877            id: val
878          - values:
879              - fldai.64 0
880          - values:
881              - |
882                #
883                    lda.type A
884          - values:
885              - |
886                #
887                    lda.type A[]
888          - values:
889              - |
890                #
891                    lda.type panda.String
892          - values:
893              - |
894                #
895                    lda.str "string"
896          - values:
897              - |
898                #
899                    movi v1, 10
900                    newarr v1, v1, f32[]
901                    lda.obj v1
902          - values:
903              - lda.null
904
905      - file-name: uninitialized_regs
906        isa:
907          instructions:
908            - sig: fmul2 v:in:f32
909              acc: inout:f32
910              format: [op_v_8]
911        description: Check 'fmul2' with uninitialized register and accumulator.
912        tags: ['verifier']
913        runner-options: ['verifier-failure', 'verifier-config']
914        code-template: |
915            #
916                %s
917                *s
918                fmul2 %s
919        check-type: exit-positive
920        template-cases:
921          - values:
922              - ''
923              - v0
924          - values:
925              - fmovi v0, 0
926              - v0
927            exclude: [init]
928          - values:
929              - ''
930              - v7
931          - values:
932              - ''
933              - v15
934          - values:
935              - fmovi v15, 0
936              - v15
937            exclude: [init]
938          - values:
939              - ''
940              - v128
941          - values:
942              - fmovi v128, 0
943              - v128
944            exclude: [init]
945          - values:
946              - ''
947              - v255
948          - values:
949              - fmovi v255, 0
950              - v255
951            exclude: [init]
952        cases:
953          - values:
954              - ''
955          - values:
956              - fldai 0
957            id: init
958