| ... | ... | @@ -1072,7 +1072,7 @@ pub const Register = struct { |
| 1072 | 1072 | } |
| 1073 | 1073 | |
| 1074 | 1074 | pub fn parse(reg: []const u8) ?Register { |
| 1075 | | return if (reg.len == 0) null else switch (reg[0]) { |
| 1075 | return if (reg.len == 0) null else switch (std.ascii.toLower(reg[0])) { |
| 1076 | 1076 | else => null, |
| 1077 | 1077 | 'r' => if (std.fmt.parseInt(u5, reg[1..], 10)) |n| switch (n) { |
| 1078 | 1078 | 0...30 => .{ |
| ... | ... | @@ -1087,27 +1087,27 @@ pub const Register = struct { |
| 1087 | 1087 | .format = .{ .integer = .doubleword }, |
| 1088 | 1088 | }, |
| 1089 | 1089 | 31 => null, |
| 1090 | | } else |_| if (std.mem.eql(u8, reg, "xzr")) .xzr else null, |
| 1090 | } else |_| if (toLowerEqlAssertLower(reg, "xzr")) .xzr else null, |
| 1091 | 1091 | 'w' => if (std.fmt.parseInt(u5, reg[1..], 10)) |n| switch (n) { |
| 1092 | 1092 | 0...30 => .{ |
| 1093 | 1093 | .alias = @enumFromInt(@intFromEnum(Alias.r0) + n), |
| 1094 | 1094 | .format = .{ .integer = .word }, |
| 1095 | 1095 | }, |
| 1096 | 1096 | 31 => null, |
| 1097 | | } else |_| if (std.mem.eql(u8, reg, "wzr")) |
| 1097 | } else |_| if (toLowerEqlAssertLower(reg, "wzr")) |
| 1098 | 1098 | .wzr |
| 1099 | | else if (std.mem.eql(u8, reg, "wsp")) |
| 1099 | else if (toLowerEqlAssertLower(reg, "wsp")) |
| 1100 | 1100 | .wsp |
| 1101 | 1101 | else |
| 1102 | 1102 | null, |
| 1103 | | 'i' => return if (std.mem.eql(u8, reg, "ip") or std.mem.eql(u8, reg, "ip0")) |
| 1103 | 'i' => return if (toLowerEqlAssertLower(reg, "ip") or toLowerEqlAssertLower(reg, "ip0")) |
| 1104 | 1104 | .ip0 |
| 1105 | | else if (std.mem.eql(u8, reg, "ip1")) |
| 1105 | else if (toLowerEqlAssertLower(reg, "ip1")) |
| 1106 | 1106 | .ip1 |
| 1107 | 1107 | else |
| 1108 | 1108 | null, |
| 1109 | | 'f' => return if (std.mem.eql(u8, reg, "fp")) .fp else null, |
| 1110 | | 'p' => return if (std.mem.eql(u8, reg, "pc")) .pc else null, |
| 1109 | 'f' => return if (toLowerEqlAssertLower(reg, "fp")) .fp else null, |
| 1110 | 'p' => return if (toLowerEqlAssertLower(reg, "pc")) .pc else null, |
| 1111 | 1111 | 'v' => if (std.fmt.parseInt(u5, reg[1..], 10)) |n| .{ |
| 1112 | 1112 | .alias = @enumFromInt(@intFromEnum(Alias.v0) + n), |
| 1113 | 1113 | .format = .alias, |
| ... | ... | @@ -1123,7 +1123,7 @@ pub const Register = struct { |
| 1123 | 1123 | 's' => if (std.fmt.parseInt(u5, reg[1..], 10)) |n| .{ |
| 1124 | 1124 | .alias = @enumFromInt(@intFromEnum(Alias.v0) + n), |
| 1125 | 1125 | .format = .{ .scalar = .single }, |
| 1126 | | } else |_| if (std.mem.eql(u8, reg, "sp")) .sp else null, |
| 1126 | } else |_| if (toLowerEqlAssertLower(reg, "sp")) .sp else null, |
| 1127 | 1127 | 'h' => if (std.fmt.parseInt(u5, reg[1..], 10)) |n| .{ |
| 1128 | 1128 | .alias = @enumFromInt(@intFromEnum(Alias.v0) + n), |
| 1129 | 1129 | .format = .{ .scalar = .half }, |
| ... | ... | @@ -1141,6 +1141,422 @@ pub const Register = struct { |
| 1141 | 1141 | pub fn fmtCase(reg: Register, case: aarch64.Disassemble.Case) aarch64.Disassemble.RegisterFormatter { |
| 1142 | 1142 | return .{ .reg = reg, .case = case }; |
| 1143 | 1143 | } |
| 1144 | |
| 1145 | pub const System = packed struct(u16) { |
| 1146 | op2: u3, |
| 1147 | CRm: u4, |
| 1148 | CRn: u4, |
| 1149 | op1: u3, |
| 1150 | op0: u2, |
| 1151 | |
| 1152 | // D19.2 General system control registers |
| 1153 | /// D19.2.1 ACCDATA_EL1, Accelerator Data |
| 1154 | pub const accdata_el1: System = .{ .op0 = 0b11, .op1 = 0b000, .CRn = 0b1101, .CRm = 0b0000, .op2 = 0b101 }; |
| 1155 | /// D19.2.2 ACTLR_EL1, Auxiliary Control Register (EL1) |
| 1156 | pub const actlr_el1: System = .{ .op0 = 0b11, .op1 = 0b000, .CRn = 0b0001, .CRm = 0b0000, .op2 = 0b001 }; |
| 1157 | /// D19.2.3 ACTLR_EL2, Auxiliary Control Register (EL2) |
| 1158 | pub const actlr_el2: System = .{ .op0 = 0b11, .op1 = 0b100, .CRn = 0b0001, .CRm = 0b0000, .op2 = 0b001 }; |
| 1159 | /// D19.2.4 ACTLR_EL3, Auxiliary Control Register (EL3) |
| 1160 | pub const actlr_el3: System = .{ .op0 = 0b11, .op1 = 0b110, .CRn = 0b0001, .CRm = 0b0000, .op2 = 0b001 }; |
| 1161 | /// D19.2.5 AFSR0_EL1, Auxiliary Fault Status Register 0 (EL1) |
| 1162 | pub const afsr0_el1: System = .{ .op0 = 0b11, .op1 = 0b000, .CRn = 0b0101, .CRm = 0b0001, .op2 = 0b000 }; |
| 1163 | /// D19.2.5 AFSR0_EL12, Auxiliary Fault Status Register 0 (EL12) |
| 1164 | pub const afsr0_el12: System = .{ .op0 = 0b11, .op1 = 0b101, .CRn = 0b0101, .CRm = 0b0001, .op2 = 0b000 }; |
| 1165 | /// D19.2.6 AFSR0_EL2, Auxiliary Fault Status Register 0 (EL2) |
| 1166 | pub const afsr0_el2: System = .{ .op0 = 0b11, .op1 = 0b100, .CRn = 0b0101, .CRm = 0b0001, .op2 = 0b000 }; |
| 1167 | /// D19.2.7 AFSR0_EL3, Auxiliary Fault Status Register 0 (EL3) |
| 1168 | pub const afsr0_el3: System = .{ .op0 = 0b11, .op1 = 0b110, .CRn = 0b0101, .CRm = 0b0001, .op2 = 0b000 }; |
| 1169 | /// D19.2.8 AFSR1_EL1, Auxiliary Fault Status Register 1 (EL1) |
| 1170 | pub const afsr1_el1: System = .{ .op0 = 0b11, .op1 = 0b000, .CRn = 0b0101, .CRm = 0b0001, .op2 = 0b001 }; |
| 1171 | /// D19.2.8 AFSR1_EL12, Auxiliary Fault Status Register 1 (EL12) |
| 1172 | pub const afsr1_el12: System = .{ .op0 = 0b11, .op1 = 0b101, .CRn = 0b0101, .CRm = 0b0001, .op2 = 0b001 }; |
| 1173 | /// D19.2.9 AFSR1_EL2, Auxiliary Fault Status Register 1 (EL2) |
| 1174 | pub const afsr1_el2: System = .{ .op0 = 0b11, .op1 = 0b100, .CRn = 0b0101, .CRm = 0b0001, .op2 = 0b001 }; |
| 1175 | /// D19.2.10 AFSR1_EL3, Auxiliary Fault Status Register 1 (EL3) |
| 1176 | pub const afsr1_el3: System = .{ .op0 = 0b11, .op1 = 0b110, .CRn = 0b0101, .CRm = 0b0001, .op2 = 0b001 }; |
| 1177 | /// D19.2.11 AIDR_EL1, Auxiliary ID Register |
| 1178 | pub const aidr_el1: System = .{ .op0 = 0b11, .op1 = 0b001, .CRn = 0b0000, .CRm = 0b0000, .op2 = 0b111 }; |
| 1179 | /// D19.2.12 AMAIR_EL1, Auxiliary Memory Attribute Indirection Register (EL1) |
| 1180 | pub const amair_el1: System = .{ .op0 = 0b11, .op1 = 0b000, .CRn = 0b1010, .CRm = 0b0011, .op2 = 0b000 }; |
| 1181 | /// D19.2.12 AMAIR_EL12, Auxiliary Memory Attribute Indirection Register (EL12) |
| 1182 | pub const amair_el12: System = .{ .op0 = 0b11, .op1 = 0b101, .CRn = 0b1010, .CRm = 0b0011, .op2 = 0b000 }; |
| 1183 | /// D19.2.13 AMAIR_EL2, Auxiliary Memory Attribute Indirection Register (EL2) |
| 1184 | pub const amair_el2: System = .{ .op0 = 0b11, .op1 = 0b100, .CRn = 0b1010, .CRm = 0b0011, .op2 = 0b000 }; |
| 1185 | /// D19.2.14 AMAIR_EL3, Auxiliary Memory Attribute Indirection Register (EL3) |
| 1186 | pub const amair_el3: System = .{ .op0 = 0b11, .op1 = 0b110, .CRn = 0b1010, .CRm = 0b0011, .op2 = 0b000 }; |
| 1187 | /// D19.2.15 APDAKeyHi_EL1, Pointer Authentication Key A for Data (bits[127:64]) |
| 1188 | pub const apdakeyhi_el1: System = .{ .op0 = 0b11, .op1 = 0b000, .CRn = 0b0010, .CRm = 0b0010, .op2 = 0b001 }; |
| 1189 | /// D19.2.16 APDAKeyLo_EL1, Pointer Authentication Key A for Data (bits[63:0]) |
| 1190 | pub const apdakeylo_el1: System = .{ .op0 = 0b11, .op1 = 0b000, .CRn = 0b0010, .CRm = 0b0010, .op2 = 0b000 }; |
| 1191 | /// D19.2.17 APDBKeyHi_EL1, Pointer Authentication Key B for Data (bits[127:64]) |
| 1192 | pub const apdbkeyhi_el1: System = .{ .op0 = 0b11, .op1 = 0b000, .CRn = 0b0010, .CRm = 0b0010, .op2 = 0b011 }; |
| 1193 | /// D19.2.18 APDAKeyHi_EL1, Pointer Authentication Key B for Data (bits[63:0]) |
| 1194 | pub const apdbkeylo_el1: System = .{ .op0 = 0b11, .op1 = 0b000, .CRn = 0b0010, .CRm = 0b0010, .op2 = 0b010 }; |
| 1195 | /// D19.2.19 APGAKeyHi_EL1, Pointer Authentication Key A for Code (bits[127:64]) |
| 1196 | pub const apgakeyhi_el1: System = .{ .op0 = 0b11, .op1 = 0b000, .CRn = 0b0010, .CRm = 0b0011, .op2 = 0b001 }; |
| 1197 | /// D19.2.20 APGAKeyLo_EL1, Pointer Authentication Key A for Code (bits[63:0]) |
| 1198 | pub const apgakeylo_el1: System = .{ .op0 = 0b11, .op1 = 0b000, .CRn = 0b0010, .CRm = 0b0011, .op2 = 0b000 }; |
| 1199 | /// D19.2.21 APIAKeyHi_EL1, Pointer Authentication Key A for Instruction (bits[127:64]) |
| 1200 | pub const apiakeyhi_el1: System = .{ .op0 = 0b11, .op1 = 0b000, .CRn = 0b0010, .CRm = 0b0001, .op2 = 0b001 }; |
| 1201 | /// D19.2.22 APIAKeyLo_EL1, Pointer Authentication Key A for Instruction (bits[63:0]) |
| 1202 | pub const apiakeylo_el1: System = .{ .op0 = 0b11, .op1 = 0b000, .CRn = 0b0010, .CRm = 0b0001, .op2 = 0b000 }; |
| 1203 | /// D19.2.23 APIBKeyHi_EL1, Pointer Authentication Key B for Instruction (bits[127:64]) |
| 1204 | pub const apibkeyhi_el1: System = .{ .op0 = 0b11, .op1 = 0b000, .CRn = 0b0010, .CRm = 0b0001, .op2 = 0b011 }; |
| 1205 | /// D19.2.24 APIBKeyLo_EL1, Pointer Authentication Key B for Instruction (bits[63:0]) |
| 1206 | pub const apibkeylo_el1: System = .{ .op0 = 0b11, .op1 = 0b000, .CRn = 0b0010, .CRm = 0b0001, .op2 = 0b010 }; |
| 1207 | /// D19.2.25 CCSIDR2_EL1, Current Cache Size ID Register 2 |
| 1208 | pub const ccsidr2_el1: System = .{ .op0 = 0b11, .op1 = 0b001, .CRn = 0b0000, .CRm = 0b0000, .op2 = 0b010 }; |
| 1209 | /// D19.2.26 CCSIDR_EL1, Current Cache Size ID Register |
| 1210 | pub const ccsidr_el1: System = .{ .op0 = 0b11, .op1 = 0b001, .CRn = 0b0000, .CRm = 0b0000, .op2 = 0b000 }; |
| 1211 | /// D19.2.27 CLIDR_EL1, Cache Level ID Register |
| 1212 | pub const clidr_el1: System = .{ .op0 = 0b11, .op1 = 0b001, .CRn = 0b0000, .CRm = 0b0000, .op2 = 0b001 }; |
| 1213 | /// D19.2.28 CONTEXTIDR_EL1, Context ID Register (EL1) |
| 1214 | pub const contextidr_el1: System = .{ .op0 = 0b11, .op1 = 0b000, .CRn = 0b1101, .CRm = 0b0000, .op2 = 0b001 }; |
| 1215 | /// D19.2.28 CONTEXTIDR_EL12, Context ID Register (EL12) |
| 1216 | pub const contextidr_el12: System = .{ .op0 = 0b11, .op1 = 0b101, .CRn = 0b1101, .CRm = 0b0000, .op2 = 0b001 }; |
| 1217 | /// D19.2.29 CONTEXTIDR_EL2, Context ID Register (EL2) |
| 1218 | pub const contextidr_el2: System = .{ .op0 = 0b11, .op1 = 0b100, .CRn = 0b1101, .CRm = 0b0000, .op2 = 0b001 }; |
| 1219 | /// D19.2.30 CPACR_EL1, Architectural Feature Access Control Register |
| 1220 | pub const cpacr_el1: System = .{ .op0 = 0b11, .op1 = 0b000, .CRn = 0b0001, .CRm = 0b0000, .op2 = 0b010 }; |
| 1221 | /// D19.2.30 CPACR_EL12, Architectural Feature Access Control Register |
| 1222 | pub const cpacr_el12: System = .{ .op0 = 0b11, .op1 = 0b101, .CRn = 0b0001, .CRm = 0b0000, .op2 = 0b010 }; |
| 1223 | /// D19.2.31 CPACR_EL2, Architectural Feature Trap Register (EL2) |
| 1224 | pub const cptr_el2: System = .{ .op0 = 0b11, .op1 = 0b100, .CRn = 0b0001, .CRm = 0b0001, .op2 = 0b010 }; |
| 1225 | /// D19.2.32 CPACR_EL3, Architectural Feature Trap Register (EL3) |
| 1226 | pub const cptr_el3: System = .{ .op0 = 0b11, .op1 = 0b110, .CRn = 0b0001, .CRm = 0b0001, .op2 = 0b010 }; |
| 1227 | /// D19.2.33 CSSELR_EL1, Cache Size Selection Register |
| 1228 | pub const csselr_el1: System = .{ .op0 = 0b11, .op1 = 0b010, .CRn = 0b0000, .CRm = 0b0000, .op2 = 0b000 }; |
| 1229 | /// D19.2.34 CTR_EL0, Cache Type Register |
| 1230 | pub const ctr_el0: System = .{ .op0 = 0b11, .op1 = 0b011, .CRn = 0b0000, .CRm = 0b0000, .op2 = 0b001 }; |
| 1231 | /// D19.2.35 DACR32_EL2, Domain Access Control Register |
| 1232 | pub const dacr32_el2: System = .{ .op0 = 0b11, .op1 = 0b100, .CRn = 0b0011, .CRm = 0b0000, .op2 = 0b000 }; |
| 1233 | /// D19.2.36 DCZID_EL0, Data Cache Zero ID Register |
| 1234 | pub const dczid_el0: System = .{ .op0 = 0b11, .op1 = 0b011, .CRn = 0b0000, .CRm = 0b0000, .op2 = 0b111 }; |
| 1235 | /// D19.2.37 ESR_EL1, Exception Syndrome Register (EL1) |
| 1236 | pub const esr_el1: System = .{ .op0 = 0b11, .op1 = 0b000, .CRn = 0b0101, .CRm = 0b0010, .op2 = 0b000 }; |
| 1237 | /// D19.2.37 ESR_EL12, Exception Syndrome Register (EL12) |
| 1238 | pub const esr_el12: System = .{ .op0 = 0b11, .op1 = 0b101, .CRn = 0b0101, .CRm = 0b0010, .op2 = 0b000 }; |
| 1239 | /// D19.2.38 ESR_EL2, Exception Syndrome Register (EL2) |
| 1240 | pub const esr_el2: System = .{ .op0 = 0b11, .op1 = 0b100, .CRn = 0b0101, .CRm = 0b0010, .op2 = 0b000 }; |
| 1241 | /// D19.2.39 ESR_EL3, Exception Syndrome Register (EL3) |
| 1242 | pub const esr_el3: System = .{ .op0 = 0b11, .op1 = 0b110, .CRn = 0b0101, .CRm = 0b0010, .op2 = 0b000 }; |
| 1243 | /// D19.2.40 FAR_EL1, Fault Address Register (EL1) |
| 1244 | pub const far_el1: System = .{ .op0 = 0b11, .op1 = 0b000, .CRn = 0b0110, .CRm = 0b0000, .op2 = 0b000 }; |
| 1245 | /// D19.2.40 FAR_EL12, Fault Address Register (EL12) |
| 1246 | pub const far_el12: System = .{ .op0 = 0b11, .op1 = 0b101, .CRn = 0b0110, .CRm = 0b0000, .op2 = 0b000 }; |
| 1247 | /// D19.2.41 FAR_EL2, Fault Address Register (EL2) |
| 1248 | pub const far_el2: System = .{ .op0 = 0b11, .op1 = 0b100, .CRn = 0b0110, .CRm = 0b0000, .op2 = 0b000 }; |
| 1249 | /// D19.2.42 FAR_EL3, Fault Address Register (EL3) |
| 1250 | pub const far_el3: System = .{ .op0 = 0b11, .op1 = 0b110, .CRn = 0b0110, .CRm = 0b0000, .op2 = 0b000 }; |
| 1251 | /// D19.2.43 FPEXC32_EL2, Floating-Point Exception Control Register |
| 1252 | pub const fpexc32_el2: System = .{ .op0 = 0b11, .op1 = 0b100, .CRn = 0b0101, .CRm = 0b0011, .op2 = 0b000 }; |
| 1253 | /// D19.2.44 GCR_EL1, Tag Control Register |
| 1254 | pub const gcr_el1: System = .{ .op0 = 0b11, .op1 = 0b000, .CRn = 0b0001, .CRm = 0b0000, .op2 = 0b110 }; |
| 1255 | /// D19.2.45 GMID_EL1, Tag Control Register |
| 1256 | pub const gmid_el1: System = .{ .op0 = 0b11, .op1 = 0b001, .CRn = 0b0000, .CRm = 0b0000, .op2 = 0b100 }; |
| 1257 | /// D19.2.46 HACR_EL2, Hypervisor Auxiliary Control Register |
| 1258 | pub const hacr_el2: System = .{ .op0 = 0b11, .op1 = 0b100, .CRn = 0b0001, .CRm = 0b0001, .op2 = 0b111 }; |
| 1259 | /// D19.2.47 HAFGRTR_EL2, Hypervisor Activity Monitors Fine-Grained Read Trap Register |
| 1260 | pub const hafgrtr_el2: System = .{ .op0 = 0b11, .op1 = 0b100, .CRn = 0b0011, .CRm = 0b0001, .op2 = 0b110 }; |
| 1261 | /// D19.2.48 HCR_EL2, Hypervisor Configuration Register |
| 1262 | pub const hcr_el2: System = .{ .op0 = 0b11, .op1 = 0b100, .CRn = 0b0001, .CRm = 0b0001, .op2 = 0b000 }; |
| 1263 | /// D19.2.49 HCRX_EL2, Extended Hypervisor Configuration Register |
| 1264 | pub const hcrx_el2: System = .{ .op0 = 0b11, .op1 = 0b100, .CRn = 0b0001, .CRm = 0b0010, .op2 = 0b010 }; |
| 1265 | /// D19.2.50 HDFGRTR_EL2, Hypervisor Debug Fine-Grained Read Trap Register |
| 1266 | pub const hdfgrtr_el2: System = .{ .op0 = 0b11, .op1 = 0b100, .CRn = 0b0011, .CRm = 0b0001, .op2 = 0b100 }; |
| 1267 | /// D19.2.51 HDFGWTR_EL2, Hypervisor Debug Fine-Grained Write Trap Register |
| 1268 | pub const hdfgwtr_el2: System = .{ .op0 = 0b11, .op1 = 0b100, .CRn = 0b0011, .CRm = 0b0001, .op2 = 0b101 }; |
| 1269 | /// D19.2.52 HFGITR_EL2, Hypervisor Fine-Grained Instruction Trap Register |
| 1270 | pub const hfgitr_el2: System = .{ .op0 = 0b11, .op1 = 0b100, .CRn = 0b0001, .CRm = 0b0001, .op2 = 0b110 }; |
| 1271 | /// D19.2.53 HFGRTR_EL2, Hypervisor Fine-Grained Read Trap Register |
| 1272 | pub const hfgrtr_el2: System = .{ .op0 = 0b11, .op1 = 0b100, .CRn = 0b0001, .CRm = 0b0001, .op2 = 0b100 }; |
| 1273 | /// D19.2.54 HFGWTR_EL2, Hypervisor Fine-Grained Write Trap Register |
| 1274 | pub const hfgwtr_el2: System = .{ .op0 = 0b11, .op1 = 0b100, .CRn = 0b0001, .CRm = 0b0001, .op2 = 0b101 }; |
| 1275 | /// D19.2.55 HPFAR_EL2, Hypervisor IPA Fault Address Register |
| 1276 | pub const hpfar_el2: System = .{ .op0 = 0b11, .op1 = 0b100, .CRn = 0b0110, .CRm = 0b0000, .op2 = 0b100 }; |
| 1277 | /// D19.2.56 HSTR_EL2, Hypervisor System Trap Register |
| 1278 | pub const hstr_el2: System = .{ .op0 = 0b11, .op1 = 0b100, .CRn = 0b0001, .CRm = 0b0001, .op2 = 0b011 }; |
| 1279 | /// D19.2.57 ID_AA64AFR0_EL1, AArch64 Auxiliary Feature Register 0 |
| 1280 | pub const id_aa64afr0_el1: System = .{ .op0 = 0b11, .op1 = 0b000, .CRn = 0b0000, .CRm = 0b0101, .op2 = 0b100 }; |
| 1281 | /// D19.2.58 ID_AA64AFR1_EL1, AArch64 Auxiliary Feature Register 1 |
| 1282 | pub const id_aa64afr1_el1: System = .{ .op0 = 0b11, .op1 = 0b000, .CRn = 0b0000, .CRm = 0b0101, .op2 = 0b101 }; |
| 1283 | /// D19.2.59 ID_AA64DFR0_EL1, AArch64 Debug Feature Register 0 |
| 1284 | pub const id_aa64dfr0_el1: System = .{ .op0 = 0b11, .op1 = 0b000, .CRn = 0b0000, .CRm = 0b0101, .op2 = 0b000 }; |
| 1285 | /// D19.2.60 ID_AA64DFR1_EL1, AArch64 Debug Feature Register 1 |
| 1286 | pub const id_aa64dfr1_el1: System = .{ .op0 = 0b11, .op1 = 0b000, .CRn = 0b0000, .CRm = 0b0101, .op2 = 0b001 }; |
| 1287 | /// D19.2.61 ID_AA64ISAR0_EL1, AArch64 Instruction Set Attribute Register 0 |
| 1288 | pub const id_aa64isar0_el1: System = .{ .op0 = 0b11, .op1 = 0b000, .CRn = 0b0000, .CRm = 0b0110, .op2 = 0b000 }; |
| 1289 | /// D19.2.62 ID_AA64ISAR1_EL1, AArch64 Instruction Set Attribute Register 1 |
| 1290 | pub const id_aa64isar1_el1: System = .{ .op0 = 0b11, .op1 = 0b000, .CRn = 0b0000, .CRm = 0b0110, .op2 = 0b001 }; |
| 1291 | /// D19.2.63 ID_AA64ISAR2_EL1, AArch64 Instruction Set Attribute Register 2 |
| 1292 | pub const id_aa64isar2_el1: System = .{ .op0 = 0b11, .op1 = 0b000, .CRn = 0b0000, .CRm = 0b0110, .op2 = 0b010 }; |
| 1293 | /// D19.2.64 ID_AA64MMFR0_EL1, AArch64 Memory Model Feature Register 0 |
| 1294 | pub const id_aa64mmfr0_el1: System = .{ .op0 = 0b11, .op1 = 0b000, .CRn = 0b0000, .CRm = 0b0111, .op2 = 0b000 }; |
| 1295 | /// D19.2.65 ID_AA64MMFR1_EL1, AArch64 Memory Model Feature Register 1 |
| 1296 | pub const id_aa64mmfr1_el1: System = .{ .op0 = 0b11, .op1 = 0b000, .CRn = 0b0000, .CRm = 0b0111, .op2 = 0b001 }; |
| 1297 | /// D19.2.66 ID_AA64MMFR2_EL1, AArch64 Memory Model Feature Register 2 |
| 1298 | pub const id_aa64mmfr2_el1: System = .{ .op0 = 0b11, .op1 = 0b000, .CRn = 0b0000, .CRm = 0b0111, .op2 = 0b010 }; |
| 1299 | /// D19.2.67 ID_AA64MMFR3_EL1, AArch64 Memory Model Feature Register 3 |
| 1300 | pub const id_aa64mmfr3_el1: System = .{ .op0 = 0b11, .op1 = 0b000, .CRn = 0b0000, .CRm = 0b0111, .op2 = 0b011 }; |
| 1301 | /// D19.2.68 ID_AA64MMFR4_EL1, AArch64 Memory Model Feature Register 4 |
| 1302 | pub const id_aa64mmfr4_el1: System = .{ .op0 = 0b11, .op1 = 0b000, .CRn = 0b0000, .CRm = 0b0111, .op2 = 0b100 }; |
| 1303 | /// D19.2.69 ID_AA64PFR0_EL1, AArch64 Processor Feature Register 0 |
| 1304 | pub const id_aa64pfr0_el1: System = .{ .op0 = 0b11, .op1 = 0b000, .CRn = 0b0000, .CRm = 0b0100, .op2 = 0b000 }; |
| 1305 | /// D19.2.70 ID_AA64PFR1_EL1, AArch64 Processor Feature Register 1 |
| 1306 | pub const id_aa64pfr1_el1: System = .{ .op0 = 0b11, .op1 = 0b000, .CRn = 0b0000, .CRm = 0b0100, .op2 = 0b001 }; |
| 1307 | /// D19.2.71 ID_AA64PFR2_EL1, AArch64 Processor Feature Register 2 |
| 1308 | pub const id_aa64pfr2_el1: System = .{ .op0 = 0b11, .op1 = 0b000, .CRn = 0b0000, .CRm = 0b0100, .op2 = 0b010 }; |
| 1309 | /// D19.2.72 ID_AA64SMFR0_EL1, SME Feature ID Register 0 |
| 1310 | pub const id_aa64smfr0_el1: System = .{ .op0 = 0b11, .op1 = 0b000, .CRn = 0b0000, .CRm = 0b0100, .op2 = 0b101 }; |
| 1311 | /// D19.2.73 ID_AA64ZFR0_EL1, SVE Feature ID Register 0 |
| 1312 | pub const id_aa64zfr0_el1: System = .{ .op0 = 0b11, .op1 = 0b000, .CRn = 0b0000, .CRm = 0b0100, .op2 = 0b100 }; |
| 1313 | /// D19.2.74 ID_AFR0_EL1, AArch32 Auxiliary Feature Register 0 |
| 1314 | pub const id_afr0_el1: System = .{ .op0 = 0b11, .op1 = 0b000, .CRn = 0b0000, .CRm = 0b0001, .op2 = 0b011 }; |
| 1315 | /// D19.2.75 ID_DFR0_EL1, AArch32 Debug Feature Register 0 |
| 1316 | pub const id_dfr0_el1: System = .{ .op0 = 0b11, .op1 = 0b000, .CRn = 0b0000, .CRm = 0b0001, .op2 = 0b010 }; |
| 1317 | /// D19.2.76 ID_DFR1_EL1, AArch32 Debug Feature Register 1 |
| 1318 | pub const id_dfr1_el1: System = .{ .op0 = 0b11, .op1 = 0b000, .CRn = 0b0000, .CRm = 0b0011, .op2 = 0b101 }; |
| 1319 | /// D19.2.77 ID_ISAR0_EL1, AArch32 Instruction Set Attribute Register 0 |
| 1320 | pub const id_isar0_el1: System = .{ .op0 = 0b11, .op1 = 0b000, .CRn = 0b0000, .CRm = 0b0010, .op2 = 0b000 }; |
| 1321 | /// D19.2.78 ID_ISAR1_EL1, AArch32 Instruction Set Attribute Register 1 |
| 1322 | pub const id_isar1_el1: System = .{ .op0 = 0b11, .op1 = 0b000, .CRn = 0b0000, .CRm = 0b0010, .op2 = 0b001 }; |
| 1323 | /// D19.2.79 ID_ISAR2_EL1, AArch32 Instruction Set Attribute Register 2 |
| 1324 | pub const id_isar2_el1: System = .{ .op0 = 0b11, .op1 = 0b000, .CRn = 0b0000, .CRm = 0b0010, .op2 = 0b010 }; |
| 1325 | /// D19.2.80 ID_ISAR3_EL1, AArch32 Instruction Set Attribute Register 3 |
| 1326 | pub const id_isar3_el1: System = .{ .op0 = 0b11, .op1 = 0b000, .CRn = 0b0000, .CRm = 0b0010, .op2 = 0b011 }; |
| 1327 | /// D19.2.81 ID_ISAR4_EL1, AArch32 Instruction Set Attribute Register 4 |
| 1328 | pub const id_isar4_el1: System = .{ .op0 = 0b11, .op1 = 0b000, .CRn = 0b0000, .CRm = 0b0010, .op2 = 0b100 }; |
| 1329 | /// D19.2.82 ID_ISAR5_EL1, AArch32 Instruction Set Attribute Register 5 |
| 1330 | pub const id_isar5_el1: System = .{ .op0 = 0b11, .op1 = 0b000, .CRn = 0b0000, .CRm = 0b0010, .op2 = 0b101 }; |
| 1331 | /// D19.2.83 ID_ISAR6_EL1, AArch32 Instruction Set Attribute Register 6 |
| 1332 | pub const id_isar6_el1: System = .{ .op0 = 0b11, .op1 = 0b000, .CRn = 0b0000, .CRm = 0b0010, .op2 = 0b111 }; |
| 1333 | /// D19.2.84 ID_MMFR0_EL1, AArch32 Memory Model Feature Register 0 |
| 1334 | pub const id_mmfr0_el1: System = .{ .op0 = 0b11, .op1 = 0b000, .CRn = 0b0000, .CRm = 0b0001, .op2 = 0b100 }; |
| 1335 | /// D19.2.85 ID_MMFR1_EL1, AArch32 Memory Model Feature Register 1 |
| 1336 | pub const id_mmfr1_el1: System = .{ .op0 = 0b11, .op1 = 0b000, .CRn = 0b0000, .CRm = 0b0001, .op2 = 0b101 }; |
| 1337 | /// D19.2.86 ID_MMFR2_EL1, AArch32 Memory Model Feature Register 2 |
| 1338 | pub const id_mmfr2_el1: System = .{ .op0 = 0b11, .op1 = 0b000, .CRn = 0b0000, .CRm = 0b0001, .op2 = 0b110 }; |
| 1339 | /// D19.2.87 ID_MMFR3_EL1, AArch32 Memory Model Feature Register 3 |
| 1340 | pub const id_mmfr3_el1: System = .{ .op0 = 0b11, .op1 = 0b000, .CRn = 0b0000, .CRm = 0b0001, .op2 = 0b111 }; |
| 1341 | /// D19.2.88 ID_MMFR4_EL1, AArch32 Memory Model Feature Register 4 |
| 1342 | pub const id_mmfr4_el1: System = .{ .op0 = 0b11, .op1 = 0b000, .CRn = 0b0000, .CRm = 0b0010, .op2 = 0b110 }; |
| 1343 | /// D19.2.89 ID_MMFR5_EL1, AArch32 Memory Model Feature Register 5 |
| 1344 | pub const id_mmfr5_el1: System = .{ .op0 = 0b11, .op1 = 0b000, .CRn = 0b0000, .CRm = 0b0011, .op2 = 0b110 }; |
| 1345 | /// D19.2.90 ID_PFR0_EL1, AArch32 Processor Feature Register 0 |
| 1346 | pub const id_pfr0_el1: System = .{ .op0 = 0b11, .op1 = 0b000, .CRn = 0b0000, .CRm = 0b0001, .op2 = 0b000 }; |
| 1347 | /// D19.2.91 ID_PFR1_EL1, AArch32 Processor Feature Register 1 |
| 1348 | pub const id_pfr1_el1: System = .{ .op0 = 0b11, .op1 = 0b000, .CRn = 0b0000, .CRm = 0b0001, .op2 = 0b001 }; |
| 1349 | /// D19.2.92 ID_PFR2_EL1, AArch32 Processor Feature Register 2 |
| 1350 | pub const id_pfr2_el1: System = .{ .op0 = 0b11, .op1 = 0b000, .CRn = 0b0000, .CRm = 0b0011, .op2 = 0b100 }; |
| 1351 | /// D19.2.93 IFSR32_EL2, Instruction Fault Status Register (EL2) |
| 1352 | pub const ifsr32_el2: System = .{ .op0 = 0b11, .op1 = 0b100, .CRn = 0b0101, .CRm = 0b0000, .op2 = 0b001 }; |
| 1353 | /// D19.2.94 ISR_EL1, Interrupt Status Register |
| 1354 | pub const isr_el1: System = .{ .op0 = 0b11, .op1 = 0b000, .CRn = 0b1100, .CRm = 0b0001, .op2 = 0b000 }; |
| 1355 | /// D19.2.95 LORC_EL1, LORegion Control (EL1) |
| 1356 | pub const lorc_el1: System = .{ .op0 = 0b11, .op1 = 0b000, .CRn = 0b1010, .CRm = 0b0100, .op2 = 0b011 }; |
| 1357 | /// D19.2.96 LOREA_EL1, LORegion End Address (EL1) |
| 1358 | pub const lorea_el1: System = .{ .op0 = 0b11, .op1 = 0b000, .CRn = 0b1010, .CRm = 0b0100, .op2 = 0b001 }; |
| 1359 | /// D19.2.97 SORID_EL1, LORegionID (EL1) |
| 1360 | pub const lorid_el1: System = .{ .op0 = 0b11, .op1 = 0b000, .CRn = 0b1010, .CRm = 0b0100, .op2 = 0b111 }; |
| 1361 | /// D19.2.98 LORN_EL1, LORegion Number (EL1) |
| 1362 | pub const lorn_el1: System = .{ .op0 = 0b11, .op1 = 0b000, .CRn = 0b1010, .CRm = 0b0100, .op2 = 0b010 }; |
| 1363 | /// D19.2.99 LORSA_EL1, LORegion Start Address (EL1) |
| 1364 | pub const lorsa_el1: System = .{ .op0 = 0b11, .op1 = 0b000, .CRn = 0b1010, .CRm = 0b0100, .op2 = 0b000 }; |
| 1365 | /// D19.2.100 MAIR_EL1, Memory Attribute Indirection Register (EL1) |
| 1366 | pub const mair_el1: System = .{ .op0 = 0b11, .op1 = 0b000, .CRn = 0b1010, .CRm = 0b0010, .op2 = 0b000 }; |
| 1367 | /// D19.2.100 MAIR_EL12, Memory Attribute Indirection Register (EL12) |
| 1368 | pub const mair_el12: System = .{ .op0 = 0b11, .op1 = 0b101, .CRn = 0b1010, .CRm = 0b0010, .op2 = 0b000 }; |
| 1369 | /// D19.2.101 MAIR_EL2, Memory Attribute Indirection Register (EL2) |
| 1370 | pub const mair_el2: System = .{ .op0 = 0b11, .op1 = 0b100, .CRn = 0b1010, .CRm = 0b0010, .op2 = 0b000 }; |
| 1371 | /// D19.2.102 MAIR_EL3, Memory Attribute Indirection Register (EL3) |
| 1372 | pub const mair_el3: System = .{ .op0 = 0b11, .op1 = 0b110, .CRn = 0b1010, .CRm = 0b0010, .op2 = 0b000 }; |
| 1373 | /// D19.2.103 MIDR_EL1, Main ID Register |
| 1374 | pub const midr_el1: System = .{ .op0 = 0b11, .op1 = 0b000, .CRn = 0b0000, .CRm = 0b0000, .op2 = 0b000 }; |
| 1375 | /// D19.2.104 MPIDR_EL1, Multiprocessor Affinity Register |
| 1376 | pub const mpidr_el1: System = .{ .op0 = 0b11, .op1 = 0b000, .CRn = 0b0000, .CRm = 0b0000, .op2 = 0b101 }; |
| 1377 | /// D19.2.105 MVFR0_EL1, AArch32 Media and VFP Feature Register 0 |
| 1378 | pub const mvfr0_el1: System = .{ .op0 = 0b11, .op1 = 0b000, .CRn = 0b0000, .CRm = 0b0011, .op2 = 0b000 }; |
| 1379 | /// D19.2.106 MVFR1_EL1, AArch32 Media and VFP Feature Register 1 |
| 1380 | pub const mvfr1_el1: System = .{ .op0 = 0b11, .op1 = 0b000, .CRn = 0b0000, .CRm = 0b0011, .op2 = 0b001 }; |
| 1381 | /// D19.2.107 MVFR2_EL1, AArch32 Media and VFP Feature Register 2 |
| 1382 | pub const mvfr2_el1: System = .{ .op0 = 0b11, .op1 = 0b000, .CRn = 0b0000, .CRm = 0b0011, .op2 = 0b010 }; |
| 1383 | /// D19.2.108 PAR_EL1, Physical Address Register |
| 1384 | pub const par_el1: System = .{ .op0 = 0b11, .op1 = 0b000, .CRn = 0b0111, .CRm = 0b0100, .op2 = 0b000 }; |
| 1385 | /// D19.2.109 REVIDR_EL1, Revision ID Register |
| 1386 | pub const revidr_el1: System = .{ .op0 = 0b11, .op1 = 0b000, .CRn = 0b0000, .CRm = 0b0000, .op2 = 0b110 }; |
| 1387 | /// D19.2.110 RGSR_EL1, Random Allocation Tag Seed Register |
| 1388 | pub const rgsr_el1: System = .{ .op0 = 0b11, .op1 = 0b000, .CRn = 0b0001, .CRm = 0b0000, .op2 = 0b101 }; |
| 1389 | /// D19.2.111 RMR_EL1, Reset Management Register (EL1) |
| 1390 | pub const rmr_el1: System = .{ .op0 = 0b11, .op1 = 0b000, .CRn = 0b1100, .CRm = 0b0000, .op2 = 0b010 }; |
| 1391 | /// D19.2.112 RMR_EL2, Reset Management Register (EL2) |
| 1392 | pub const rmr_el2: System = .{ .op0 = 0b11, .op1 = 0b100, .CRn = 0b1100, .CRm = 0b0000, .op2 = 0b010 }; |
| 1393 | /// D19.2.113 RMR_EL3, Reset Management Register (EL3) |
| 1394 | pub const rmr_el3: System = .{ .op0 = 0b11, .op1 = 0b110, .CRn = 0b1100, .CRm = 0b0000, .op2 = 0b010 }; |
| 1395 | /// D19.2.114 RNDR, Random Number |
| 1396 | pub const rndr: System = .{ .op0 = 0b11, .op1 = 0b011, .CRn = 0b0010, .CRm = 0b0100, .op2 = 0b000 }; |
| 1397 | /// D19.2.115 RNDRRS, Reseeded Random Number |
| 1398 | pub const rndrrs: System = .{ .op0 = 0b11, .op1 = 0b011, .CRn = 0b0010, .CRm = 0b0100, .op2 = 0b001 }; |
| 1399 | /// D19.2.116 RVBAR_EL1, Reset Vector Base Address Register (if EL2 and EL3 not implemented) |
| 1400 | pub const rvbar_el1: System = .{ .op0 = 0b11, .op1 = 0b000, .CRn = 0b1100, .CRm = 0b0000, .op2 = 0b001 }; |
| 1401 | /// D19.2.117 RVBAR_EL2, Reset Vector Base Address Register (if EL3 not implemented) |
| 1402 | pub const rvbar_el2: System = .{ .op0 = 0b11, .op1 = 0b100, .CRn = 0b1100, .CRm = 0b0000, .op2 = 0b001 }; |
| 1403 | /// D19.2.118 RVBAR_EL3, Reset Vector Base Address Register (if EL3 implemented) |
| 1404 | pub const rvbar_el3: System = .{ .op0 = 0b11, .op1 = 0b110, .CRn = 0b1100, .CRm = 0b0000, .op2 = 0b001 }; |
| 1405 | /// D19.2.120 SCR_EL3, Secure Configuration Register |
| 1406 | pub const scr_el3: System = .{ .op0 = 0b11, .op1 = 0b110, .CRn = 0b0001, .CRm = 0b0001, .op2 = 0b000 }; |
| 1407 | /// D19.2.121 SCTLR2_EL1, System Control Register (EL1) |
| 1408 | pub const sctlr2_el1: System = .{ .op0 = 0b11, .op1 = 0b000, .CRn = 0b0001, .CRm = 0b0000, .op2 = 0b011 }; |
| 1409 | /// D19.2.121 SCTLR2_EL12, System Control Register (EL12) |
| 1410 | pub const sctlr2_el12: System = .{ .op0 = 0b11, .op1 = 0b101, .CRn = 0b0001, .CRm = 0b0000, .op2 = 0b011 }; |
| 1411 | /// D19.2.122 SCTLR2_EL2, System Control Register (EL2) |
| 1412 | pub const sctlr2_el2: System = .{ .op0 = 0b11, .op1 = 0b100, .CRn = 0b0001, .CRm = 0b0000, .op2 = 0b011 }; |
| 1413 | /// D19.2.123 SCTLR2_EL3, System Control Register (EL3) |
| 1414 | pub const sctlr2_el3: System = .{ .op0 = 0b11, .op1 = 0b110, .CRn = 0b0001, .CRm = 0b0000, .op2 = 0b011 }; |
| 1415 | /// D19.2.124 SCTLR_EL1, System Control Register (EL1) |
| 1416 | pub const sctlr_el1: System = .{ .op0 = 0b11, .op1 = 0b000, .CRn = 0b0001, .CRm = 0b0000, .op2 = 0b000 }; |
| 1417 | /// D19.2.124 SCTLR_EL12, System Control Register (EL12) |
| 1418 | pub const sctlr_el12: System = .{ .op0 = 0b11, .op1 = 0b101, .CRn = 0b0001, .CRm = 0b0000, .op2 = 0b000 }; |
| 1419 | /// D19.2.125 SCTLR_EL2, System Control Register (EL2) |
| 1420 | pub const sctlr_el2: System = .{ .op0 = 0b11, .op1 = 0b100, .CRn = 0b0001, .CRm = 0b0000, .op2 = 0b000 }; |
| 1421 | /// D19.2.126 SCTLR_EL3, System Control Register (EL3) |
| 1422 | pub const sctlr_el3: System = .{ .op0 = 0b11, .op1 = 0b110, .CRn = 0b0001, .CRm = 0b0000, .op2 = 0b000 }; |
| 1423 | /// D19.2.127 SCXTNUM_EL0, EL0 Read/Write Software Context Number |
| 1424 | pub const scxtnum_el0: System = .{ .op0 = 0b11, .op1 = 0b011, .CRn = 0b1101, .CRm = 0b0000, .op2 = 0b111 }; |
| 1425 | /// D19.2.128 SCXTNUM_EL1, EL1 Read/Write Software Context Number |
| 1426 | pub const scxtnum_el1: System = .{ .op0 = 0b11, .op1 = 0b000, .CRn = 0b1101, .CRm = 0b0000, .op2 = 0b111 }; |
| 1427 | /// D19.2.128 SCXTNUM_EL12, EL12 Read/Write Software Context Number |
| 1428 | pub const scxtnum_el12: System = .{ .op0 = 0b11, .op1 = 0b101, .CRn = 0b1101, .CRm = 0b0000, .op2 = 0b111 }; |
| 1429 | /// D19.2.129 SCXTNUM_EL2, EL2 Read/Write Software Context Number |
| 1430 | pub const scxtnum_el2: System = .{ .op0 = 0b11, .op1 = 0b100, .CRn = 0b1101, .CRm = 0b0000, .op2 = 0b111 }; |
| 1431 | /// D19.2.130 SCXTNUM_EL3, EL3 Read/Write Software Context Number |
| 1432 | pub const scxtnum_el3: System = .{ .op0 = 0b11, .op1 = 0b110, .CRn = 0b1101, .CRm = 0b0000, .op2 = 0b111 }; |
| 1433 | /// D19.2.131 SMCR_EL1, SME Control Register (EL1) |
| 1434 | pub const smcr_el1: System = .{ .op0 = 0b11, .op1 = 0b000, .CRn = 0b0001, .CRm = 0b0010, .op2 = 0b110 }; |
| 1435 | /// D19.2.131 SMCR_EL12, SME Control Register (EL12) |
| 1436 | pub const smcr_el12: System = .{ .op0 = 0b11, .op1 = 0b101, .CRn = 0b0001, .CRm = 0b0010, .op2 = 0b110 }; |
| 1437 | /// D19.2.132 SMCR_EL2, SME Control Register (EL2) |
| 1438 | pub const smcr_el2: System = .{ .op0 = 0b11, .op1 = 0b100, .CRn = 0b0001, .CRm = 0b0010, .op2 = 0b110 }; |
| 1439 | /// D19.2.133 SMCR_EL3, SME Control Register (EL3) |
| 1440 | pub const smcr_el3: System = .{ .op0 = 0b11, .op1 = 0b110, .CRn = 0b0001, .CRm = 0b0010, .op2 = 0b110 }; |
| 1441 | /// D19.2.134 SMIDR_EL1, Streaming Mode Identification Register |
| 1442 | pub const smidr_el1: System = .{ .op0 = 0b11, .op1 = 0b001, .CRn = 0b0000, .CRm = 0b0000, .op2 = 0b110 }; |
| 1443 | /// D19.2.135 SMPRIMAP_EL2, Streaming Mode Priority Mapping Register |
| 1444 | pub const smprimap_el2: System = .{ .op0 = 0b11, .op1 = 0b100, .CRn = 0b0001, .CRm = 0b0010, .op2 = 0b101 }; |
| 1445 | /// D19.2.136 SMPRI_EL1, Streaming Mode Priority Register |
| 1446 | pub const smpri_el1: System = .{ .op0 = 0b11, .op1 = 0b000, .CRn = 0b0001, .CRm = 0b0010, .op2 = 0b100 }; |
| 1447 | /// D19.2.137 TCR2_EL1, Extended Translation Control Register (EL1) |
| 1448 | pub const tcr2_el1: System = .{ .op0 = 0b11, .op1 = 0b000, .CRn = 0b0010, .CRm = 0b0000, .op2 = 0b011 }; |
| 1449 | /// D19.2.137 TCR2_EL12, Extended Translation Control Register (EL12) |
| 1450 | pub const tcr2_el12: System = .{ .op0 = 0b11, .op1 = 0b101, .CRn = 0b0010, .CRm = 0b0000, .op2 = 0b011 }; |
| 1451 | /// D19.2.138 TCR2_EL2, Extended Translation Control Register (EL2) |
| 1452 | pub const tcr2_el2: System = .{ .op0 = 0b11, .op1 = 0b100, .CRn = 0b0010, .CRm = 0b0000, .op2 = 0b011 }; |
| 1453 | /// D19.2.139 TCR_EL1, Translation Control Register (EL1) |
| 1454 | pub const tcr_el1: System = .{ .op0 = 0b11, .op1 = 0b000, .CRn = 0b0010, .CRm = 0b0000, .op2 = 0b010 }; |
| 1455 | /// D19.2.139 TCR_EL12, Translation Control Register (EL12) |
| 1456 | pub const tcr_el12: System = .{ .op0 = 0b11, .op1 = 0b101, .CRn = 0b0010, .CRm = 0b0000, .op2 = 0b010 }; |
| 1457 | /// D19.2.140 TCR_EL2, Translation Control Register (EL2) |
| 1458 | pub const tcr_el2: System = .{ .op0 = 0b11, .op1 = 0b100, .CRn = 0b0010, .CRm = 0b0000, .op2 = 0b010 }; |
| 1459 | /// D19.2.141 TCR_EL3, Translation Control Register (EL3) |
| 1460 | pub const tcr_el3: System = .{ .op0 = 0b11, .op1 = 0b110, .CRn = 0b0010, .CRm = 0b0000, .op2 = 0b010 }; |
| 1461 | /// D19.2.142 TFSRE0_EL1, Tag Fault Status Register (EL0) |
| 1462 | pub const tfsre0_el1: System = .{ .op0 = 0b11, .op1 = 0b000, .CRn = 0b0101, .CRm = 0b0110, .op2 = 0b001 }; |
| 1463 | /// D19.2.143 TFSR_EL1, Tag Fault Status Register (EL1) |
| 1464 | pub const tfsr_el1: System = .{ .op0 = 0b11, .op1 = 0b000, .CRn = 0b0101, .CRm = 0b0110, .op2 = 0b000 }; |
| 1465 | /// D19.2.143 TFSR_EL12, Tag Fault Status Register (EL12) |
| 1466 | pub const tfsr_el12: System = .{ .op0 = 0b11, .op1 = 0b101, .CRn = 0b0101, .CRm = 0b0110, .op2 = 0b000 }; |
| 1467 | /// D19.2.144 TFSR_EL2, Tag Fault Status Register (EL2) |
| 1468 | pub const tfsr_el2: System = .{ .op0 = 0b11, .op1 = 0b100, .CRn = 0b0101, .CRm = 0b0110, .op2 = 0b000 }; |
| 1469 | /// D19.2.145 TFSR_EL3, Tag Fault Status Register (EL3) |
| 1470 | pub const tfsr_el3: System = .{ .op0 = 0b11, .op1 = 0b110, .CRn = 0b0101, .CRm = 0b0110, .op2 = 0b000 }; |
| 1471 | /// D19.2.146 TPIDR2_EL0, EL0 Read/Write Software Thread ID Register 2 |
| 1472 | pub const tpidr2_el0: System = .{ .op0 = 0b11, .op1 = 0b011, .CRn = 0b1101, .CRm = 0b0000, .op2 = 0b101 }; |
| 1473 | /// D19.2.147 TPIDR_EL0, EL0 Read/Write Software Thread ID Register |
| 1474 | pub const tpidr_el0: System = .{ .op0 = 0b11, .op1 = 0b011, .CRn = 0b1101, .CRm = 0b0000, .op2 = 0b010 }; |
| 1475 | /// D19.2.148 TPIDR_EL1, EL1 Read/Write Software Thread ID Register |
| 1476 | pub const tpidr_el1: System = .{ .op0 = 0b11, .op1 = 0b000, .CRn = 0b1101, .CRm = 0b0000, .op2 = 0b100 }; |
| 1477 | /// D19.2.149 TPIDR_EL2, EL2 Read/Write Software Thread ID Register |
| 1478 | pub const tpidr_el2: System = .{ .op0 = 0b11, .op1 = 0b100, .CRn = 0b1101, .CRm = 0b0000, .op2 = 0b010 }; |
| 1479 | /// D19.2.150 TPIDR_EL3, EL3 Read/Write Software Thread ID Register |
| 1480 | pub const tpidr_el3: System = .{ .op0 = 0b11, .op1 = 0b110, .CRn = 0b1101, .CRm = 0b0000, .op2 = 0b010 }; |
| 1481 | /// D19.2.151 TPIDRRO_EL0, EL0 Read-Only Software Thread ID Register |
| 1482 | pub const tpidrro_el3: System = .{ .op0 = 0b11, .op1 = 0b011, .CRn = 0b1101, .CRm = 0b0000, .op2 = 0b011 }; |
| 1483 | /// D19.2.152 TTBR0_EL1, Translation Table Base Register 0 (EL1) |
| 1484 | pub const ttbr0_el1: System = .{ .op0 = 0b11, .op1 = 0b000, .CRn = 0b0010, .CRm = 0b0000, .op2 = 0b000 }; |
| 1485 | /// D19.2.152 TTBR0_EL12, Translation Table Base Register 0 (EL12) |
| 1486 | pub const ttbr0_el12: System = .{ .op0 = 0b11, .op1 = 0b101, .CRn = 0b0010, .CRm = 0b0000, .op2 = 0b000 }; |
| 1487 | /// D19.2.153 TTBR0_EL2, Translation Table Base Register 0 (EL2) |
| 1488 | pub const ttbr0_el2: System = .{ .op0 = 0b11, .op1 = 0b100, .CRn = 0b0010, .CRm = 0b0000, .op2 = 0b000 }; |
| 1489 | /// D19.2.154 TTBR0_EL3, Translation Table Base Register 0 (EL3) |
| 1490 | pub const ttbr0_el3: System = .{ .op0 = 0b11, .op1 = 0b110, .CRn = 0b0010, .CRm = 0b0000, .op2 = 0b000 }; |
| 1491 | /// D19.2.155 TTBR1_EL1, Translation Table Base Register 1 (EL1) |
| 1492 | pub const ttbr1_el1: System = .{ .op0 = 0b11, .op1 = 0b000, .CRn = 0b0010, .CRm = 0b0000, .op2 = 0b001 }; |
| 1493 | /// D19.2.155 TTBR1_EL12, Translation Table Base Register 1 (EL12) |
| 1494 | pub const ttbr1_el12: System = .{ .op0 = 0b11, .op1 = 0b101, .CRn = 0b0010, .CRm = 0b0000, .op2 = 0b001 }; |
| 1495 | /// D19.2.156 TTBR1_EL2, Translation Table Base Register 1 (EL2) |
| 1496 | pub const ttbr1_el2: System = .{ .op0 = 0b11, .op1 = 0b100, .CRn = 0b0010, .CRm = 0b0000, .op2 = 0b001 }; |
| 1497 | /// D19.2.157 VBAR_EL1, Vector Base Address Register (EL1) |
| 1498 | pub const vbar_el1: System = .{ .op0 = 0b11, .op1 = 0b000, .CRn = 0b1100, .CRm = 0b0000, .op2 = 0b000 }; |
| 1499 | /// D19.2.157 VBAR_EL12, Vector Base Address Register (EL12) |
| 1500 | pub const vbar_el12: System = .{ .op0 = 0b11, .op1 = 0b101, .CRn = 0b1100, .CRm = 0b0000, .op2 = 0b000 }; |
| 1501 | /// D19.2.158 VBAR_EL2, Vector Base Address Register (EL2) |
| 1502 | pub const vbar_el2: System = .{ .op0 = 0b11, .op1 = 0b100, .CRn = 0b1100, .CRm = 0b0000, .op2 = 0b000 }; |
| 1503 | /// D19.2.159 VBAR_EL3, Vector Base Address Register (EL3) |
| 1504 | pub const vbar_el3: System = .{ .op0 = 0b11, .op1 = 0b110, .CRn = 0b1100, .CRm = 0b0000, .op2 = 0b000 }; |
| 1505 | /// D19.2.160 VMPIDR_EL2, Virtualization Multiprocessor ID Register |
| 1506 | pub const vmpidr_el2: System = .{ .op0 = 0b11, .op1 = 0b100, .CRn = 0b0000, .CRm = 0b0000, .op2 = 0b101 }; |
| 1507 | /// D19.2.161 VNCR_EL2, Virtual Nested Control Register |
| 1508 | pub const nvcr_el2: System = .{ .op0 = 0b11, .op1 = 0b100, .CRn = 0b0010, .CRm = 0b0010, .op2 = 0b000 }; |
| 1509 | /// D19.2.162 VPIDR_EL2, Virtualization Processor ID Register |
| 1510 | pub const vpidr_el2: System = .{ .op0 = 0b11, .op1 = 0b100, .CRn = 0b0000, .CRm = 0b0000, .op2 = 0b000 }; |
| 1511 | /// D19.2.163 VSTCR_EL2, Virtualization Secure Translation Control Register |
| 1512 | pub const vstcr_el2: System = .{ .op0 = 0b11, .op1 = 0b100, .CRn = 0b0010, .CRm = 0b0110, .op2 = 0b010 }; |
| 1513 | /// D19.2.164 VSTTBR_EL2, Virtualization Secure Translation Table Base Register |
| 1514 | pub const vsttbr_el2: System = .{ .op0 = 0b11, .op1 = 0b100, .CRn = 0b0010, .CRm = 0b0110, .op2 = 0b000 }; |
| 1515 | /// D19.2.165 VTCR_EL2, Virtualization Translation Control Register |
| 1516 | pub const vtcr_el2: System = .{ .op0 = 0b11, .op1 = 0b100, .CRn = 0b0010, .CRm = 0b0001, .op2 = 0b010 }; |
| 1517 | /// D19.2.166 VTTBR_EL2, Virtualization Translation Table Base Register |
| 1518 | pub const vttbr_el2: System = .{ .op0 = 0b11, .op1 = 0b100, .CRn = 0b0010, .CRm = 0b0001, .op2 = 0b000 }; |
| 1519 | /// D19.2.167 ZCR_EL1, SVE Control Register (EL1) |
| 1520 | pub const zcr_el1: System = .{ .op0 = 0b11, .op1 = 0b000, .CRn = 0b0001, .CRm = 0b0010, .op2 = 0b000 }; |
| 1521 | /// D19.2.167 ZCR_EL12, SVE Control Register (EL12) |
| 1522 | pub const zcr_el12: System = .{ .op0 = 0b11, .op1 = 0b101, .CRn = 0b0001, .CRm = 0b0010, .op2 = 0b000 }; |
| 1523 | /// D19.2.168 ZCR_EL2, SVE Control Register (EL2) |
| 1524 | pub const zcr_el2: System = .{ .op0 = 0b11, .op1 = 0b100, .CRn = 0b0001, .CRm = 0b0010, .op2 = 0b000 }; |
| 1525 | /// D19.2.169 ZCR_EL3, SVE Control Register (EL3) |
| 1526 | pub const zcr_el3: System = .{ .op0 = 0b11, .op1 = 0b110, .CRn = 0b0001, .CRm = 0b0010, .op2 = 0b000 }; |
| 1527 | |
| 1528 | pub fn parse(reg: []const u8) ?System { |
| 1529 | if (reg.len >= 10 and std.ascii.toLower(reg[0]) == 's') encoded: { |
| 1530 | var symbol_it = std.mem.splitScalar(u8, reg[1..], '_'); |
| 1531 | const op0 = std.fmt.parseInt(u2, symbol_it.next() orelse break :encoded, 10) catch break :encoded; |
| 1532 | if (op0 < 0b10) break :encoded; |
| 1533 | const op1 = std.fmt.parseInt(u3, symbol_it.next() orelse break :encoded, 10) catch break :encoded; |
| 1534 | const n = symbol_it.next() orelse break :encoded; |
| 1535 | if (n.len == 0 or std.ascii.toLower(n[0]) != 'c') break :encoded; |
| 1536 | const CRn = std.fmt.parseInt(u4, n[1..], 10) catch break :encoded; |
| 1537 | const m = symbol_it.next() orelse break :encoded; |
| 1538 | if (m.len == 0 or std.ascii.toLower(m[0]) != 'c') break :encoded; |
| 1539 | const CRm = std.fmt.parseInt(u4, m[1..], 10) catch break :encoded; |
| 1540 | const op2 = std.fmt.parseInt(u3, symbol_it.next() orelse break :encoded, 10) catch break :encoded; |
| 1541 | if (symbol_it.next() != null) break :encoded; |
| 1542 | return .{ .op0 = op0, .op1 = op1, .CRn = CRn, .CRm = CRm, .op2 = op2 }; |
| 1543 | } |
| 1544 | inline for (@typeInfo(System).@"struct".decls) |decl| { |
| 1545 | if (@TypeOf(@field(System, decl.name)) != System) continue; |
| 1546 | if (toLowerEqlAssertLower(reg, decl.name)) return @field(System, decl.name); |
| 1547 | } |
| 1548 | return null; |
| 1549 | } |
| 1550 | }; |
| 1551 | |
| 1552 | fn toLowerEqlAssertLower(lhs: []const u8, rhs: []const u8) bool { |
| 1553 | if (lhs.len != rhs.len) return false; |
| 1554 | for (lhs, rhs) |l, r| { |
| 1555 | assert(!std.ascii.isUpper(r)); |
| 1556 | if (std.ascii.toLower(l) != r) return false; |
| 1557 | } |
| 1558 | return true; |
| 1559 | } |
| 1144 | 1560 | }; |
| 1145 | 1561 | |
| 1146 | 1562 | /// C1.2.4 Condition code |
| ... | ... | @@ -2385,12 +2801,7 @@ pub const Instruction = packed union { |
| 2385 | 2801 | |
| 2386 | 2802 | pub const Group = packed struct { |
| 2387 | 2803 | Rt: Register.Encoded, |
| 2388 | | op2: u3, |
| 2389 | | CRm: u4, |
| 2390 | | CRn: u4, |
| 2391 | | op1: u3, |
| 2392 | | o0: u1, |
| 2393 | | decoded20: u1 = 0b1, |
| 2804 | systemreg: Register.System, |
| 2394 | 2805 | L: L, |
| 2395 | 2806 | decoded22: u10 = 0b1101010100, |
| 2396 | 2807 | }; |
| ... | ... | @@ -2398,12 +2809,7 @@ pub const Instruction = packed union { |
| 2398 | 2809 | /// C6.2.230 MSR (register) |
| 2399 | 2810 | pub const Msr = packed struct { |
| 2400 | 2811 | Rt: Register.Encoded, |
| 2401 | | op2: u3, |
| 2402 | | CRm: u4, |
| 2403 | | CRn: u4, |
| 2404 | | op1: u3, |
| 2405 | | o0: u1, |
| 2406 | | decoded20: u1 = 0b1, |
| 2812 | systemreg: Register.System, |
| 2407 | 2813 | L: L = .msr, |
| 2408 | 2814 | decoded22: u10 = 0b1101010100, |
| 2409 | 2815 | }; |
| ... | ... | @@ -2411,12 +2817,7 @@ pub const Instruction = packed union { |
| 2411 | 2817 | /// C6.2.228 MRS |
| 2412 | 2818 | pub const Mrs = packed struct { |
| 2413 | 2819 | Rt: Register.Encoded, |
| 2414 | | op2: u3, |
| 2415 | | CRm: u4, |
| 2416 | | CRn: u4, |
| 2417 | | op1: u3, |
| 2418 | | o0: u1, |
| 2419 | | decoded20: u1 = 0b1, |
| 2820 | systemreg: Register.System, |
| 2420 | 2821 | L: L = .mrs, |
| 2421 | 2822 | decoded22: u10 = 0b1101010100, |
| 2422 | 2823 | }; |
| ... | ... | @@ -10585,30 +10986,22 @@ pub const Instruction = packed union { |
| 10585 | 10986 | } } }; |
| 10586 | 10987 | } |
| 10587 | 10988 | /// C6.2.228 MRS |
| 10588 | | pub fn mrs(t: Register, op0: u2, op1: u3, n: u4, m: u4, op2: u3) Instruction { |
| 10589 | | assert(t.format.integer == .doubleword); |
| 10989 | pub fn mrs(t: Register, systemreg: Register.System) Instruction { |
| 10990 | assert(t.format.integer == .doubleword and systemreg.op0 >= 0b10); |
| 10590 | 10991 | return .{ .branch_exception_generating_system = .{ .system_register_move = .{ |
| 10591 | 10992 | .mrs = .{ |
| 10592 | 10993 | .Rt = t.alias.encode(.{}), |
| 10593 | | .op2 = op2, |
| 10594 | | .CRm = m, |
| 10595 | | .CRn = n, |
| 10596 | | .op1 = op1, |
| 10597 | | .o0 = @intCast(op0 - 0b10), |
| 10994 | .systemreg = systemreg, |
| 10598 | 10995 | }, |
| 10599 | 10996 | } } }; |
| 10600 | 10997 | } |
| 10601 | 10998 | /// C6.2.230 MSR (register) |
| 10602 | | pub fn msr(op0: u2, op1: u3, n: u4, m: u4, op2: u3, t: Register) Instruction { |
| 10603 | | assert(t.format.integer == .doubleword); |
| 10999 | pub fn msr(systemreg: Register.System, t: Register) Instruction { |
| 11000 | assert(systemreg.op0 >= 0b10 and t.format.integer == .doubleword); |
| 10604 | 11001 | return .{ .branch_exception_generating_system = .{ .system_register_move = .{ |
| 10605 | 11002 | .msr = .{ |
| 10606 | 11003 | .Rt = t.alias.encode(.{}), |
| 10607 | | .op2 = op2, |
| 10608 | | .CRm = m, |
| 10609 | | .CRn = n, |
| 10610 | | .op1 = op1, |
| 10611 | | .o0 = @intCast(op0 - 0b10), |
| 11004 | .systemreg = systemreg, |
| 10612 | 11005 | }, |
| 10613 | 11006 | } } }; |
| 10614 | 11007 | } |