summaryrefslogtreecommitdiff
path: root/tools/proxyclient/experiments/fptest.py
blob: 6c45bdc9aaceeab94411068c64cae0cded75a478 (plain)
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
#!/usr/bin/env python3
# SPDX-License-Identifier: MIT
import sys, pathlib
sys.path.append(str(pathlib.Path(__file__).resolve().parents[1]))

from m1n1.setup import *
from m1n1 import asm

FPCR_FZ = 1 << 24

ACTLR_DEFAULT = 0xc00
ACTLR_AFP = 1 << 5

AFPCR = (3,6,15,2,5)
AFPCR_DAZ = 1 << 0
AFPCR_FTZ = 1 << 1

code_buffer = p.malloc(0x1000)
data_buffer = p.malloc(0x1000)

code = asm.ARMAsm("""
    ldr s0, [x0, #0]
    ldr s1, [x0, #4]
    fmul s0, s1, s0
    str s0, [x0, #8]

    ldr s0, [x0, #12]
    ldr s1, [x0, #16]
    fmul s0, s1, s0
    str s0, [x0, #20]

    # to test EL0 access
    # mrs x0, s3_6_c15_c2_5
    ret
""", code_buffer)

iface.writemem(code_buffer, code.data)
p.dc_cvau(code_buffer, code.len)
p.ic_ivau(code_buffer, code.len)

def test_denormals():

    data = [
        0x00400000, # a denormal
        0x40000000, # 2
        0,
        0x00800000, # smallest non-denormal
        0x3f000000, # 0.5
        0,
    ]

    iface.writemem(data_buffer, struct.pack("<%dI" % len(data), *data))

    p.set_exc_guard(GUARD.SKIP)
    ret = p.el0_call(code_buffer, data_buffer | REGION_RW_EL0)
    p.set_exc_guard(GUARD.OFF)

    v1 = p.read32(data_buffer + 8)
    v2 = p.read32(data_buffer + 20)

    print(" Input:", end=" ")
    if v1 == 0:
        print("FLUSH ", end=" ")
    elif v1 == 0x00800000:
        print("NORMAL", end=" ")
    else:
        print("0x08x?" % v1, end=" ")

    print("Output:", end=" ")
    if v2 == 0:
        print("FLUSH ", end=" ")
    elif v2 == 0x00400000:
        print("NORMAL", end=" ")
    else:
        print("0x08x?" % v2, end=" ")
    print("r = 0x%x" % ret)


print("Testing normal mode")
u.msr(ACTLR_EL1, ACTLR_DEFAULT)
u.msr(AFPCR, 0)

u.msr(FPCR, 0)
print("FPCR.FZ = 0")
test_denormals()

u.msr(FPCR, FPCR_FZ)
print("FPCR.FZ = 1")
test_denormals()

print()
print("Testing Apple mode")
u.msr(ACTLR_EL1, ACTLR_DEFAULT | ACTLR_AFP)
u.msr(AFPCR, 0)

u.msr(FPCR, 0)
print("FPCR.FZ = 0")
test_denormals()

u.msr(FPCR, FPCR_FZ)
print("FPCR.FZ = 1")
test_denormals()

u.msr(AFPCR, AFPCR_DAZ)
print("AFPCR.<FTZ, DAZ> = 0, 1")
test_denormals()

u.msr(AFPCR, AFPCR_FTZ)
print("AFPCR.<FTZ, DAZ> = 1, 0")
test_denormals()

u.msr(AFPCR, AFPCR_FTZ | AFPCR_DAZ)
print("AFPCR.<FTZ, DAZ> = 1, 1")
test_denormals()