summaryrefslogtreecommitdiffstats
path: root/tests/tcg/xtensa/test_fp1.S
blob: 77336a3fcf2c5ec6c6905dd1152c95982d4cf817 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
#include "macros.inc"
#include "fpu.h"

test_suite fp1

#if XCHAL_HAVE_FP

.macro movfp fr, v
    movi    a2, \v
    wfr     \fr, a2
.endm

.macro test_ord_ex op, br, fr0, fr1, v0, v1, r, sr
    movi    a2, 0
    wur     a2, fsr
    movfp   \fr0, \v0
    movfp   \fr1, \v1
    \op     \br, \fr0, \fr1
    movi    a2, 0
    movi    a3, 1
    movt    a2, a3, \br
    assert  eqi, a2, \r
    rur     a2, fsr
#if DFPU
    movi    a3, \sr
    assert  eq, a2, a3
#else
    assert  eqi, a2, 0
#endif
.endm

.macro test_ord op, br, fr0, fr1, v0, v1, r, sr
    movi    a2, 0
    wur     a2, fcr
    test_ord_ex \op, \br, \fr0, \fr1, \v0, \v1, \r, \sr
    movi    a2, 0x7c
    wur     a2, fcr
    test_ord_ex \op, \br, \fr0, \fr1, \v0, \v1, \r, \sr
.endm

.macro test_ord_all op, aa, ab, ba, aPI, PIa, aN, Na, II, IN, NI, qnan_sr
    test_ord \op  b0,  f0,  f1, 0x3f800000, 0x3f800000, \aa,  FSR__    /*   ord == ord */
    test_ord \op  b1,  f2,  f3, 0x3f800000, 0x3fc00000, \ab,  FSR__    /*   ord <  ord */
    test_ord \op  b2,  f4,  f5, 0x3fc00000, 0x3f800000, \ba,  FSR__    /*   ord >  ord */
    test_ord \op  b3,  f6,  f7, 0x3f800000, 0x7f800000, \aPI, FSR__    /*   ord   +INF */
    test_ord \op  b4,  f8,  f9, 0x7f800000, 0x3f800000, \PIa, FSR__    /*  +INF    ord */
    test_ord \op  b5, f10, f11, 0x3f800000, 0xffc00001, \aN,  \qnan_sr /*   ord  -QNaN */
    test_ord \op  b6, f12, f13, 0x3f800000, 0xff800001, \aN,  FSR_V    /*   ord  -SNaN */
    test_ord \op  b7, f14, f15, 0x3f800000, 0x7f800001, \aN,  FSR_V    /*   ord  +SNaN */
    test_ord \op  b8,  f0,  f1, 0x3f800000, 0x7fc00000, \aN,  \qnan_sr /*   ord  +QNaN */
    test_ord \op  b9,  f2,  f3, 0xffc00001, 0x3f800000, \Na,  \qnan_sr /* -QNaN    ord */
    test_ord \op b10,  f4,  f5, 0xff800001, 0x3f800000, \Na,  FSR_V    /* -SNaN    ord */
    test_ord \op b11,  f6,  f7, 0x7f800001, 0x3f800000, \Na,  FSR_V    /* +SNaN    ord */
    test_ord \op b12,  f8,  f9, 0x7fc00000, 0x3f800000, \Na,  \qnan_sr /* +QNaN    ord */
    test_ord \op b13, f10, f11, 0x7f800000, 0x7f800000, \II,  FSR__    /*  +INF   +INF */
    test_ord \op b14, f12, f13, 0x7f800000, 0x7fc00000, \IN,  \qnan_sr /*  +INF  +QNaN */
    test_ord \op b15, f14, f15, 0x7fc00000, 0x7f800000, \NI,  \qnan_sr /* +QNaN   +INF */
.endm

test un_s
    movi    a2, 1
    wsr     a2, cpenable
    test_ord_all un.s, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, FSR__
test_end

test oeq_s
    test_ord_all oeq.s, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, FSR__
test_end

test ueq_s
    test_ord_all ueq.s, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, FSR__
test_end

test olt_s
    test_ord_all olt.s, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, FSR_V
test_end

test ult_s
    test_ord_all ult.s, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, FSR__
test_end

test ole_s
    test_ord_all ole.s, 1, 1, 0, 1, 0, 0, 0, 1, 0, 0, FSR_V
test_end

test ule_s
    test_ord_all ule.s, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, FSR__
test_end

.macro test_cond op, fr0, fr1, cr, v0, v1, r
    movfp   \fr0, \v0
    movfp   \fr1, \v1
    \op     \fr0, \fr1, \cr
    rfr     a2, \fr0
    movi    a3, \r
    assert  eq, a2, a3
.endm

test moveqz_s
    movi    a3, 0
    test_cond moveqz.s, f0, f1, a3, 0, 0x3f800000, 0x3f800000
    movi    a3, 1
    test_cond moveqz.s, f0, f1, a3, 0, 0x3f800000, 0
test_end

test movnez_s
    movi    a3, 0
    test_cond movnez.s, f0, f1, a3, 0, 0x3f800000, 0
    movi    a3, 1
    test_cond movnez.s, f0, f1, a3, 0, 0x3f800000, 0x3f800000
test_end

test movltz_s
    movi    a3, -1
    test_cond movltz.s, f0, f1, a3, 0, 0x3f800000, 0x3f800000
    movi    a3, 0
    test_cond movltz.s, f0, f1, a3, 0, 0x3f800000, 0
    movi    a3, 1
    test_cond movltz.s, f0, f1, a3, 0, 0x3f800000, 0
test_end

test movgez_s
    movi    a3, -1
    test_cond movgez.s, f0, f1, a3, 0, 0x3f800000, 0
    movi    a3, 0
    test_cond movgez.s, f0, f1, a3, 0, 0x3f800000, 0x3f800000
    movi    a3, 1
    test_cond movgez.s, f0, f1, a3, 0, 0x3f800000, 0x3f800000
test_end

test movf_s
    olt.s   b0, f0, f0
    test_cond movf.s, f0, f1, b0, 0, 0x3f800000, 0x3f800000
    ueq.s   b0, f0, f0
    test_cond movf.s, f0, f1, b0, 0, 0x3f800000, 0
test_end

test movt_s
    ueq.s   b0, f0, f0
    test_cond movt.s, f0, f1, b0, 0, 0x3f800000, 0x3f800000
    olt.s   b0, f0, f0
    test_cond movt.s, f0, f1, b0, 0, 0x3f800000, 0
test_end

#endif

test_suite_end