| ... | @@ -1072,7 +1072,7 @@ pub const Register = struct { | ... | @@ -1072,7 +1072,7 @@ pub const Register = struct { |
| 1072 | } | 1072 | } |
| 1073 | | 1073 | |
| 1074 | pub fn parse(reg: []const u8) ?Register { | 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 | else => null, | 1076 | else => null, |
| 1077 | 'r' => if (std.fmt.parseInt(u5, reg[1..], 10)) |n| switch (n) { | 1077 | 'r' => if (std.fmt.parseInt(u5, reg[1..], 10)) |n| switch (n) { |
| 1078 | 0...30 => .{ | 1078 | 0...30 => .{ |
| ... | @@ -1087,27 +1087,27 @@ pub const Register = struct { | ... | @@ -1087,27 +1087,27 @@ pub const Register = struct { |
| 1087 | .format = .{ .integer = .doubleword }, | 1087 | .format = .{ .integer = .doubleword }, |
| 1088 | }, | 1088 | }, |
| 1089 | 31 => null, | 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 | 'w' => if (std.fmt.parseInt(u5, reg[1..], 10)) |n| switch (n) { | 1091 | 'w' => if (std.fmt.parseInt(u5, reg[1..], 10)) |n| switch (n) { |
| 1092 | 0...30 => .{ | 1092 | 0...30 => .{ |
| 1093 | .alias = @enumFromInt(@intFromEnum(Alias.r0) + n), | 1093 | .alias = @enumFromInt(@intFromEnum(Alias.r0) + n), |
| 1094 | .format = .{ .integer = .word }, | 1094 | .format = .{ .integer = .word }, |
| 1095 | }, | 1095 | }, |
| 1096 | 31 => null, | 1096 | 31 => null, |
| 1097 | } else |_| if (std.mem.eql(u8, reg, "wzr")) | 1097 | } else |_| if (toLowerEqlAssertLower(reg, "wzr")) |
| 1098 | .wzr | 1098 | .wzr |
| 1099 | else if (std.mem.eql(u8, reg, "wsp")) | 1099 | else if (toLowerEqlAssertLower(reg, "wsp")) |
| 1100 | .wsp | 1100 | .wsp |
| 1101 | else | 1101 | else |
| 1102 | null, | 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 | .ip0 | 1104 | .ip0 |
| 1105 | else if (std.mem.eql(u8, reg, "ip1")) | 1105 | else if (toLowerEqlAssertLower(reg, "ip1")) |
| 1106 | .ip1 | 1106 | .ip1 |
| 1107 | else | 1107 | else |
| 1108 | null, | 1108 | null, |
| 1109 | 'f' => return if (std.mem.eql(u8, reg, "fp")) .fp else null, | 1109 | 'f' => return if (toLowerEqlAssertLower(reg, "fp")) .fp else null, |
| 1110 | 'p' => return if (std.mem.eql(u8, reg, "pc")) .pc else null, | 1110 | 'p' => return if (toLowerEqlAssertLower(reg, "pc")) .pc else null, |
| 1111 | 'v' => if (std.fmt.parseInt(u5, reg[1..], 10)) |n| .{ | 1111 | 'v' => if (std.fmt.parseInt(u5, reg[1..], 10)) |n| .{ |
| 1112 | .alias = @enumFromInt(@intFromEnum(Alias.v0) + n), | 1112 | .alias = @enumFromInt(@intFromEnum(Alias.v0) + n), |
| 1113 | .format = .alias, | 1113 | .format = .alias, |
| ... | @@ -1123,7 +1123,7 @@ pub const Register = struct { | ... | @@ -1123,7 +1123,7 @@ pub const Register = struct { |
| 1123 | 's' => if (std.fmt.parseInt(u5, reg[1..], 10)) |n| .{ | 1123 | 's' => if (std.fmt.parseInt(u5, reg[1..], 10)) |n| .{ |
| 1124 | .alias = @enumFromInt(@intFromEnum(Alias.v0) + n), | 1124 | .alias = @enumFromInt(@intFromEnum(Alias.v0) + n), |
| 1125 | .format = .{ .scalar = .single }, | 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 | 'h' => if (std.fmt.parseInt(u5, reg[1..], 10)) |n| .{ | 1127 | 'h' => if (std.fmt.parseInt(u5, reg[1..], 10)) |n| .{ |
| 1128 | .alias = @enumFromInt(@intFromEnum(Alias.v0) + n), | 1128 | .alias = @enumFromInt(@intFromEnum(Alias.v0) + n), |
| 1129 | .format = .{ .scalar = .half }, | 1129 | .format = .{ .scalar = .half }, |
| ... | @@ -1141,6 +1141,422 @@ pub const Register = struct { | ... | @@ -1141,6 +1141,422 @@ pub const Register = struct { |
| 1141 | pub fn fmtCase(reg: Register, case: aarch64.Disassemble.Case) aarch64.Disassemble.RegisterFormatter { | 1141 | pub fn fmtCase(reg: Register, case: aarch64.Disassemble.Case) aarch64.Disassemble.RegisterFormatter { |
| 1142 | return .{ .reg = reg, .case = case }; | 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 | /// C1.2.4 Condition code | 1562 | /// C1.2.4 Condition code |
| ... | @@ -2385,12 +2801,7 @@ pub const Instruction = packed union { | ... | @@ -2385,12 +2801,7 @@ pub const Instruction = packed union { |
| 2385 | | 2801 | |
| 2386 | pub const Group = packed struct { | 2802 | pub const Group = packed struct { |
| 2387 | Rt: Register.Encoded, | 2803 | Rt: Register.Encoded, |
| 2388 | op2: u3, | 2804 | systemreg: Register.System, |
| 2389 | CRm: u4, | | |
| 2390 | CRn: u4, | | |
| 2391 | op1: u3, | | |
| 2392 | o0: u1, | | |
| 2393 | decoded20: u1 = 0b1, | | |
| 2394 | L: L, | 2805 | L: L, |
| 2395 | decoded22: u10 = 0b1101010100, | 2806 | decoded22: u10 = 0b1101010100, |
| 2396 | }; | 2807 | }; |
| ... | @@ -2398,12 +2809,7 @@ pub const Instruction = packed union { | ... | @@ -2398,12 +2809,7 @@ pub const Instruction = packed union { |
| 2398 | /// C6.2.230 MSR (register) | 2809 | /// C6.2.230 MSR (register) |
| 2399 | pub const Msr = packed struct { | 2810 | pub const Msr = packed struct { |
| 2400 | Rt: Register.Encoded, | 2811 | Rt: Register.Encoded, |
| 2401 | op2: u3, | 2812 | systemreg: Register.System, |
| 2402 | CRm: u4, | | |
| 2403 | CRn: u4, | | |
| 2404 | op1: u3, | | |
| 2405 | o0: u1, | | |
| 2406 | decoded20: u1 = 0b1, | | |
| 2407 | L: L = .msr, | 2813 | L: L = .msr, |
| 2408 | decoded22: u10 = 0b1101010100, | 2814 | decoded22: u10 = 0b1101010100, |
| 2409 | }; | 2815 | }; |
| ... | @@ -2411,12 +2817,7 @@ pub const Instruction = packed union { | ... | @@ -2411,12 +2817,7 @@ pub const Instruction = packed union { |
| 2411 | /// C6.2.228 MRS | 2817 | /// C6.2.228 MRS |
| 2412 | pub const Mrs = packed struct { | 2818 | pub const Mrs = packed struct { |
| 2413 | Rt: Register.Encoded, | 2819 | Rt: Register.Encoded, |
| 2414 | op2: u3, | 2820 | systemreg: Register.System, |
| 2415 | CRm: u4, | | |
| 2416 | CRn: u4, | | |
| 2417 | op1: u3, | | |
| 2418 | o0: u1, | | |
| 2419 | decoded20: u1 = 0b1, | | |
| 2420 | L: L = .mrs, | 2821 | L: L = .mrs, |
| 2421 | decoded22: u10 = 0b1101010100, | 2822 | decoded22: u10 = 0b1101010100, |
| 2422 | }; | 2823 | }; |
| ... | @@ -10585,30 +10986,22 @@ pub const Instruction = packed union { | ... | @@ -10585,30 +10986,22 @@ pub const Instruction = packed union { |
| 10585 | } } }; | 10986 | } } }; |
| 10586 | } | 10987 | } |
| 10587 | /// C6.2.228 MRS | 10988 | /// C6.2.228 MRS |
| 10588 | pub fn mrs(t: Register, op0: u2, op1: u3, n: u4, m: u4, op2: u3) Instruction { | 10989 | pub fn mrs(t: Register, systemreg: Register.System) Instruction { |
| 10589 | assert(t.format.integer == .doubleword); | 10990 | assert(t.format.integer == .doubleword and systemreg.op0 >= 0b10); |
| 10590 | return .{ .branch_exception_generating_system = .{ .system_register_move = .{ | 10991 | return .{ .branch_exception_generating_system = .{ .system_register_move = .{ |
| 10591 | .mrs = .{ | 10992 | .mrs = .{ |
| 10592 | .Rt = t.alias.encode(.{}), | 10993 | .Rt = t.alias.encode(.{}), |
| 10593 | .op2 = op2, | 10994 | .systemreg = systemreg, |
| 10594 | .CRm = m, | | |
| 10595 | .CRn = n, | | |
| 10596 | .op1 = op1, | | |
| 10597 | .o0 = @intCast(op0 - 0b10), | | |
| 10598 | }, | 10995 | }, |
| 10599 | } } }; | 10996 | } } }; |
| 10600 | } | 10997 | } |
| 10601 | /// C6.2.230 MSR (register) | 10998 | /// C6.2.230 MSR (register) |
| 10602 | pub fn msr(op0: u2, op1: u3, n: u4, m: u4, op2: u3, t: Register) Instruction { | 10999 | pub fn msr(systemreg: Register.System, t: Register) Instruction { |
| 10603 | assert(t.format.integer == .doubleword); | 11000 | assert(systemreg.op0 >= 0b10 and t.format.integer == .doubleword); |
| 10604 | return .{ .branch_exception_generating_system = .{ .system_register_move = .{ | 11001 | return .{ .branch_exception_generating_system = .{ .system_register_move = .{ |
| 10605 | .msr = .{ | 11002 | .msr = .{ |
| 10606 | .Rt = t.alias.encode(.{}), | 11003 | .Rt = t.alias.encode(.{}), |
| 10607 | .op2 = op2, | 11004 | .systemreg = systemreg, |
| 10608 | .CRm = m, | | |
| 10609 | .CRn = n, | | |
| 10610 | .op1 = op1, | | |
| 10611 | .o0 = @intCast(op0 - 0b10), | | |
| 10612 | }, | 11005 | }, |
| 10613 | } } }; | 11006 | } } }; |
| 10614 | } | 11007 | } |