@@ -76,36 +76,80 @@ let vfp3regs = Theory.Role.Register.[
76
76
77
77
let vars32_fp = vars32 @ untyped @@ array r64 " D" 16
78
78
79
- let gp64 = array r64 " X" 29
80
- let fp64 = array r128 " Q" 32
79
+ let rs = array r64 " R" 32
80
+ let xs = array r64 " X" 32
81
+ let ws = array r32 " W" 32
82
+ let vs = array r128 " V" 32
83
+ let qs = array r128 " Q" 32
84
+ let ds = array r64 " D" 32
85
+ let ss = array r32 " S" 32
86
+ let hs = array r16 " H" 32
87
+ let bs = array r8 " B" 32
81
88
let fp64 = reg r64 " FP" (* X29 *)
82
89
let lr64 = reg r64 " LR" (* X30 *)
83
90
let sp64 = reg r64 " SP" (* X31 *)
91
+ let sp32 = reg r32 " WSP" (* W31 *)
92
+ let zr = reg r64 " ZR"
84
93
let zr64 = reg r64 " XZR"
85
94
let zr32 = reg r32 " WZR"
86
- let mems64 = CT.Mem. define r64 r8
87
- let data64 = CT.Var. define mems64 " mem"
88
- let flags64 = [
95
+ let memsv8 = CT.Mem. define r64 r8
96
+ let datav8 = CT.Var. define memsv8 " mem"
97
+ let flagsv8 = [
89
98
reg bool " NF" ;
90
99
reg bool " ZF" ;
91
100
reg bool " CF" ;
92
101
reg bool " VF" ;
93
102
]
94
103
95
- let vars64 = gp64 @< [fp64; sp64; lr64] @< flags64 @< [data64]
96
-
97
- let regs64 = Theory.Role.Register. [
98
- [general; integer], gp64 @< [fp64; lr64; sp64];
99
- [general; floating], untyped [fp64];
100
- [stack_pointer], untyped [sp64];
101
- [frame_pointer], untyped [fp64];
102
- [function_argument], array r64 " X" 8 @< array r64 " Q" 8 ;
103
- [function_return], [reg r64 " X0" ] @< [reg r128 " Q0" ];
104
- [constant; zero; pseudo], [zr64] @< [zr32];
105
- [pseudo], array r32 " W" 31 @< [reg r32 " WSP" ];
106
- [link], untyped [lr64];
104
+ let (.$ () ) = List. nth_exn
105
+
106
+ let aliases =
107
+ xs @< ws @< qs @< ds @< ss @< hs @< bs
108
+ @< [fp64; lr64; sp64; zr; zr64]
109
+ @< [sp32; zr32]
110
+
111
+ let varsv8 = rs @< flagsv8 @< [datav8]
112
+
113
+ let regsv8 = Theory.Role.Register. [
114
+ [general; integer], untyped rs;
115
+ [general; floating], untyped xs;
116
+ [stack_pointer], untyped [reg r64 " R31" ];
117
+ [frame_pointer], untyped [reg r64 " R29" ];
118
+ [function_argument], array r64 " R" 8 @< array r64 " V" 8 ;
119
+ [function_return], [reg r64 " R0" ] @< [reg r128 " V0" ];
120
+ [constant; zero; pseudo], untyped [reg r64 " XZR" ; reg r64 " ZR" ];
121
+ [constant; zero; pseudo], untyped [reg r32 " WZR" ];
122
+ [link], untyped [reg r64 " R30" ];
123
+ [alias], aliases;
107
124
] @ status_regs
108
125
126
+ let equal xs ys =
127
+ List. map2_exn xs ys ~f: Theory.Alias. (fun x y -> def x [reg y])
128
+
129
+ let lower xs _ ys =
130
+ List. map2_exn xs ys ~f: Theory.Alias. (fun x y -> def x [unk; reg y])
131
+
132
+ let are f x y = f x y
133
+
134
+ let aliasing = Theory.Alias. [
135
+ [
136
+ def fp64 [reg xs.$ (29 )];
137
+ def lr64 [reg xs.$ (30 )];
138
+ def sp64 [reg xs.$ (31 )];
139
+ def sp64 [unk; reg sp32];
140
+ def zr [reg xs.$ (31 )];
141
+ def zr [reg zr64];
142
+ def zr [unk; reg zr32];
143
+ ];
144
+ are equal rs xs;
145
+ lower rs are ws;
146
+ are equal vs qs;
147
+ lower qs are ds;
148
+ lower ds are ss;
149
+ lower ss are hs;
150
+ lower hs are bs;
151
+ ] |> List. concat
152
+
109
153
110
154
let parent = CT.Target. declare ~package " arm"
111
155
@@ -211,11 +255,12 @@ module Family (Order : Endianness) = struct
211
255
let v8a =
212
256
CT.Target. declare ~package (ordered " armv8-a" ) ~parent: v7
213
257
~nicknames: [" armv8-a" ]
258
+ ~aliasing
214
259
~bits: 64
215
- ~code: data64
216
- ~data: data64
217
- ~vars: vars64
218
- ~regs: regs64
260
+ ~code: datav8
261
+ ~data: datav8
262
+ ~vars: varsv8
263
+ ~regs: regsv8
219
264
220
265
let v81a = v8a < : " armv8.1-a"
221
266
let v82a = v81a < : " armv8.2-a"
0 commit comments