A64 ASM

Сегодня мы напишем минимальный ассемблер для компиляции объектного кода, который получается на выходе clang от компиляции C-шной программы Hello World.

Возможно первый формальный гипервизор который будет написан на Эрланге или на подобии Эрланга будет написан с использованием этого ассеблера. Как вы знаете LLVM совершенно не поддаётся нужнам верификации так как его спецификация очень громоздкая. Гланая мотивация этой работы снизить количественные рамки формализации ассемблирования. Благодаря встроенному синтаксису Эрланга для работы с битовыми строками задача конструирования 32-битной инструкции из набора битовых строк перемнной длинны не составляет труда и может быть легко формализирована в MLTT языках.

Таким образом мы убегаем от пробелемы верифакации компилятора и переносим всю работу по оптимизации и дизайну на авторов библиотеки, которые будут строить свои функции используя компиляцию в формальный ассемблер. Такой подход в использовании MLTT язка как макросистемы для компилировать один из перспективных методов формальной верификации, который в отличие от VST и других сложных путей верификации, позволяет насладиться минималистичностью и по дороге убрать все ненужные слои абстрации включая MIR и LLVM и использовать векторную компиляция в NEON как это формально делает система Spiral, только намного лайтовее.

Начнём с простого, с Hello World:

#include <stdio.h> int main( ) { printf("Hello, world!\n"); }

Откомпилируем это под ARM64 на вашем Macbook и посмотрим, что получилось:

$ clang -isysroot $(xcrun --sdk iphoneos --show-sdk-path) \ -arch arm64 asm.c -o asm.o

Ассемблеровский текст результата (без меток, адресов и хекса) сохраняем в фафл asm.s.

$ objdump -disassemble asm.o _main: 100007f40: ff 83 00 d1 sub sp, sp, #32 100007f44: fd 7b 01 a9 stp x29, x30, [sp, #16] 100007f48: fd 43 00 91 add x29, sp, #16 100007f4c: 08 00 00 90 adrp x8, #0 100007f50: 08 a1 3e 91 add x8, x8, #4008 100007f54: 00 00 80 52 mov w0, #0 100007f58: a0 c3 1f b8 stur w0, [x29, #-4] 100007f5c: e0 03 08 aa mov x0, x8 100007f60: 06 00 00 94 bl #24 <dyld_stub_binder+0x100007f78> 100007f64: a9 c3 5f b8 ldur w9, [x29, #-4] 100007f68: e0 03 09 aa mov x0, x9 100007f6c: fd 7b 41 a9 ldp x29, x30, [sp, #16] 100007f70: ff 83 00 91 add sp, sp, #32 100007f74: c0 03 5f d6 ret

Хотим в распарсаном виде иметь такой стрим (в основном всё из атомов, так как они меньше всего загрязняют эрланг синтаксис):

[{sub,sp,sp,32}, {stp,x29,x30,[sp,16]}, {add,x29,sp,16}, {adrp,x8,0} {add,x8,x8,4008}, {mov,w0,0}, {stur,w0,[x29,-4]}, {mov,x0,x8} {bl,[24,'0x100007f78']}, {ldur,w9,[x29,-4]}, {mov,x0,x9}, {ldp,x29,x30,[sp,16]}, {add,sp,sp,32} {ret}]

Попробуем написать парсер этого асм стрима:

atom("#"++X) -> list_to_integer(X); atom(X) -> list_to_atom(X). last(X,Y,A) -> case lists:reverse(X) of "]"++Z -> [lists:reverse([atom(lists:reverse(Z))|Y])|A]; _ -> {[atom(X)|Y],A} end. code(Bin) -> [ lists:reverse( lists:foldl( fun([$[|X],A) -> last(X,[],A); (X,{Y,A}) -> last(X,Y,A); (X,A) -> [atom(X)|A] end,[],string:tokens(C," ,"))) || C <- string:tokens(binary_to_list(Bin),"\n") ]. compile(Code) -> {0,iolist_to_binary([ success(?MODULE,hd(I),tl(I)) || I <- Code])}.

Теперь представим как выглядит компиляция первых инструкций (для 32-битных и 64-битных регистров). Приводим тут только кейс для 64-битных регистров, но в файл аккуратно вкатываем всю доку (в предыдущей статье 60МБ-документ):

stur(R1,[R2,Im]) when ?x(R1), ?x(R2), ?imm(Im) -> Rt = reg(R1), Rn = reg(R2), I = <<Im:9>>, <<3:2,7:3,0:6,I/bitstring,0:2,Rn/bitstring,Rt/bitstring>>; mov(R1,Im) when ?x(R1), ?imm(Im) -> R = reg(R1), I = <<Im:16>>, <<1:1,2:2,37:6,0:2,I/bitstring,R/bitstring>>; adrp(R1,Im) when ?x(R1), ?imm(Im) -> Dst = reg(R1), I = <<(Im bsr 2):19>>, J = <<Im:2>>, <<1:1,J:2/bitstring,16:5,I:19/bitstring,Dst:5/bitstring>>. sub(R1,R2,Im) when ?x(R1), ?x(R2), ?imm(Im) -> Dst = reg(R1), Src = reg(R2), I = <<Im:12>>, <<1:1,1:1,0:1,34:6,0:1,I/bitstring,Src/bitstring,Dst/bitstring>>; add(R1,R2,Im) when ?x(R1), ?x(R2), ?imm(Im) -> Dst = reg(R1), Src = reg(R2), I = <<Im:12>>, <<1:1,0:1,0:1,34:6,0:1,I/bitstring,Src/bitstring,Dst/bitstring>>; stp(R1,R2,[R3,Im]) when ?x(R1), ?x(R2), ?x(R3), ?imm(Im) -> Dst = reg(R1), Src = reg(R2), Rn = reg(R3), I = <<(Im div 8):7>>, <<2:2,5:3,0:1,2:3,0:1,I/bitstring,Src/bitstring,Rn/bitstring,Dst/bitstring>>;

Любая армовская инструкция занимает ровно 3 строчки: 1) параметры и матчинг; 2) декодирование литералов; 3) составление схемы битвектора. Я сделал так, что те инструкции которые пока не поддерживаются тихо фейлятся (success, для громкого фейла включите success_):

$ ./a64 asm.s $ hexdump asm 0000000 d1 00 83 ff a9 01 7b fd 91 00 43 fd 90 00 00 08 0000010 91 3e a1 08 52 80 00 00 b8 1f c3 a0 91 00 83 ff

5HT/a64

APPENDIX A

Here are A64 ISA main 152 cases for 11-bit pattern matching. To fulfill the gaps we'll need additional bits lookup as we do for SIMD cases.

+---------------------= 32/64-bit | | | +-+-+-+---------= Opcode | 0 0 0 0 --------= UDF | 0 0 0 1 --------= N/A | 0 0 1 x --------= N/A | 1 0 0 x --------= Data Processing Immediate | 1 0 1 x --------= Branching, System, Exceptions | x 1 x 0 --------= Loads and Stores | x 1 0 1 --------= Data Processing Register | x 1 1 1 --------= Data Processing Scalar FPU and SIMD | | | | | | | | | | 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 +-------------+ +-------------+ +-------------+ +-------------+ | MSB | | | | | | LSB | +-------------+ +-------------+ +-------------+ +-------------+

0 0 0 0 0 0 0 0 0 0 0 % C6.2.312 UDF 0 x 0 0 1 0 0 0 0 0 0 % C6.2.286 STXRB % C6.2.253 STLXRB % C6.2.254 STLXRH 0 x 0 0 1 0 0 0 0 i 1 % C6.2.039 CASP, CASPA, CASPAL, CASPL 0 x 0 0 1 0 0 0 0 1 0 % C6.2.106 LDAXRH % C6.2.105 LDAXRB % C6.2.163 LDXRB 0 0 0 0 1 0 0 0 1 0 0 % C6.2.246 STLRB 0 0 0 0 1 0 0 0 1 1 0 % C6.2.101 LDARB % C6.2.113 LDLARB 0 0 0 0 1 0 0 0 1 0 0 % C6.2.242 STLLRB % C6.2.243 STLLRH 0 0 0 0 1 0 0 0 1 i 1 % C6.2.037 CASB, CASAB, CASALB, CASLB 0 1 0 0 1 0 0 0 0 1 0 % C6.2.164 LDXRH 0 1 0 0 1 0 0 0 1 0 0 % C6.2.247 STLRH 0 1 0 0 1 0 0 0 1 1 0 % C6.2.102 LDARH % C6.2.114 LDLARH 0 1 0 0 1 0 0 0 1 i 1 % C6.2.038 CASH, CASAH, CASALH, CASLH 0 1 1 0 1 0 0 i i 1 _ % C6.2.118 LDPSW x 0 1 0 1 0 0 0 0 0 _ % C6.2.255 STNP x 0 1 0 1 0 0 0 0 1 _ % C6.2.116 LDNP x 0 1 0 1 0 0 0 1 0 _ % C6.2.256 STP x 0 1 0 1 0 0 0 1 1 _ % C6.2.117 LDP 1 x 0 0 1 0 0 0 0 0 0 % C6.2.252 STLXR % C6.2.285 STXR 1 x 0 0 1 0 0 0 0 0 1 % C6.2.251 STLXP % C6.2.284 STXP 1 x 0 0 1 0 0 0 0 1 0 % C6.2.104 LDAXR % C6.2.162 LDXR 1 x 0 0 1 0 0 0 0 1 1 % C6.2.103 LDAXP % C6.2.161 LDXP 1 x 0 0 1 0 0 0 1 0 0 % C6.2.244 STLLR % C6.2.245 STLR 1 x 0 0 1 0 0 0 1 1 0 % C6.2.100 LDAR % C6.2.115 LDLAR 1 x 0 0 1 0 0 0 1 i 1 % C6.2.040 CAS, CASA, CASAL, CASL x 0 0 0 1 0 1 0 s s 0 % C6.2.012 AND (shifted register) x 0 0 0 1 0 1 0 s s 1 % C6.2.029 BIC (shifted register) x 0 1 0 1 0 1 0 0 0 0 % C6.2.177 MOV (register) x 0 1 0 1 0 1 0 s s 1 % C6.2.186 MVN % C6.2.192 ORN (shifted register) x 1 0 0 1 0 1 0 s s 0 % C6.2.078 EOR (shifted register) x 1 0 0 1 0 1 0 s s 1 % C6.2.076 EON (shifted register) x 1 1 0 1 0 1 0 s s 0 % C6.2.014 ANDS (shifted register) % C6.2.308 TST (shifted register) x 1 1 0 1 0 1 0 s s 1 % C6.2.030 BICS (shifted register) x 0 0 0 1 0 1 1 0 0 1 % C6.2.001 ADC % C6.2.003 ADD (extended register) x 0 0 0 1 0 1 1 s s 0 % C6.2.005 ADD (shifted register) x 0 1 0 1 0 1 1 0 0 1 % C6.2.006 ADDS (extended register) % C6.2.53 CMN (extended register) x 0 1 0 1 0 1 1 s s 0 % C6.2.008 ADDS (shifted register) % C6.2.55 CMN (shifted register) x 1 0 0 1 0 1 1 0 0 1 % C6.2.288 SUB (extended register) x 1 0 0 1 0 1 1 s s 0 % C6.2.290 SUB (shifted register) % C6.2.187 NEG (shifted register) x 1 1 0 1 0 1 1 0 0 1 % C6.2.056 CMP (extended register) % C6.2.291 SUBS (extended register) x 1 1 0 1 0 1 1 s s 0 % C6.2.058 CMP (shifted register) % C6.2.293 SUBS (shifted register) % C6.2.188 NEGS x i i 1 0 0 0 0 _ _ _ % C6.2.009 ADR % C6.2.010 ADRP x 0 0 1 0 0 0 1 0 s _ % C6.2.004 ADD (immediate) % C6.2.173 MOV (to/from SP) x 1 0 1 0 0 0 1 0 s _ % C6.2.289 SUB (immediate) x 0 1 1 0 0 0 1 0 s _ % C6.2.007 ADDS (immediate) % C6.2.54 CMN (immediate) x 1 1 1 0 0 0 1 0 s _ % C6.2.057 CMP (immediate) % C6.2.292 SUBS (immediate) x 0 0 1 0 0 1 0 0 n _ % C6.2.011 AND (immediate) x 0 0 1 0 0 1 0 1 h w % C6.2.174 MOV (inverted wide immediate) % C6.2.179 MOVN % C6.2.221 SBFX % C6.2.298 SXTB % C6.2.299 SXTH % C6.2.300 SXTW x 0 0 1 0 0 1 1 0 n _ % C6.2.016 ASR (immediate) % C6.2.219 SBFIZ % C6.2.220 SBFM % C6.2.221 SBFX % C6.2.298 SXTB % C6.2.299 SXTH % C6.2.300 SXTW x 0 0 1 0 0 1 1 1 n 0 % C6.2.082 EXTR % C6.2.214 ROR (immediate) x 0 1 1 0 0 1 0 0 n _ % C6.2.176 MOV (bitmask immediate) % C6.2.193 ORR (immediate) x 0 1 1 0 0 1 1 0 n _ % C6.2.025 BFC % C6.2.26 BFI % C6.2.27 BFM % C6.2.28 BFXIL x 1 0 1 0 0 1 0 0 n _ % C6.2.077 EOR (immediate) x 1 0 1 0 0 1 0 1 h w % C6.2.175 MOV (wide immediate) % C6.2.180 MOVZ x 1 0 1 0 0 1 1 0 n _ % C6.2.166 LSL (immediate) % C6.2.169 LSR (immediate) % C6.2.309 UBFIZ % C6.2.310 UBFM % C6.2.311 UBFX % C6.2.319 UXTB % C6.2.320 UXTH x 1 1 1 0 0 1 0 0 n _ % C6.2.013 ANDS (immediate) % C6.2.307 TST (immediate) x 1 1 1 0 0 1 0 1 h w % C6.2.178 MOVK 0 0 0 1 0 1 _ _ _ _ _ % C6.2.024 B 0 1 0 1 0 1 0 0 _ _ _ % C6.2.023 B.cond x 0 1 1 0 1 0 0 _ _ _ % C6.2.042 CBZ x 0 1 1 0 1 0 1 _ _ _ % C6.2.041 CBNZ 1 0 0 1 0 1 _ _ _ _ _ % C6.2.031 BL 1 1 0 1 0 1 0 0 0 0 0 % C6.2.085 HVC % C6.2.227 SMC % C6.2.294 SVC 1 1 0 1 0 1 0 0 0 0 1 % C6.2.036 BRK 1 1 0 1 0 1 0 0 0 1 0 % C6.2.084 HLT 1 1 0 1 0 1 0 0 1 0 1 % C6.2.070 DCPS1 % C6.2.071 DCPS2 % C6.2.072 DCPS3 % C6.2.073 DMB 1 1 0 1 0 1 0 1 0 0 0 % C6.2.018 AT % C6.2.047 CFINV % C6.2.050 CLREX % C6.2.021 AUTIA, AUTIA1716, AUTIASP, AUTIAZ, AUTIZA % C6.2.022 AUTIB, AUTIB1716, AUTIBSP, AUTIBZ, AUTIZB % C6.2.062 CSDB % C6.2.069 DC % C6.2.075 DSB % C6.2.081 ESB % C6.2.083 HINT % C6.2.086 IC % C6.2.087 ISB % C6.2.182 MSR (immediate) % C6.2.183 MSR (register) % C6.2.198 PACIA, PACIA1716, PACIASP, PACIAZ, PACIZA % C6.2.204 PSB CSYNC % C6.2.205 PSSBB % C6.2.224 SEV % C6.2.225 SEVL % C6.2.232 SSBB % C6.2.301 SYS % C6.2.305 TLBI % C6.2.306 TSB CSYNC % C6.2.321 WFE % C6.2.322 WFI % C6.2.324 YIELD % C6.2.191 NOP 1 1 0 1 0 1 0 1 0 0 1 % C6.2.181 MRS % C6.2.302 SYSL x 0 1 1 0 1 1 0 _ _ _ % C6.2.304 TBZ x 0 1 1 0 1 1 1 _ _ _ % C6.2.303 TBNZ 1 1 0 1 0 1 1 0 0 0 0 % C6.2.034 BR 1 1 0 1 0 1 1 0 0 0 1 % C6.2.032 BLR 1 1 0 1 0 1 1 0 0 1 0 % C6.2.207 RET % C6.2.208 RETAA, RETAB 1 1 0 1 0 1 1 0 1 0 0 % C6.2.079 ERET % C6.2.080 ERETAA, ERETAB 1 1 0 1 0 1 1 0 1 0 1 % C6.2.074 DRPS 1 1 0 1 0 1 1 z 0 0 0 % C6.2.035 BRAA, BRAAZ, BRAB, BRABZ 1 1 0 1 0 1 1 z 0 0 1 % C6.2.033 BLRAA, BLRAAZ, BLRAB, BLRABZ 0 x 0 1 1 0 0 0 _ _ _ % C6.2.120 LDR (literal) 0 0 1 1 1 0 0 0 0 0 0 % C6.2.273 STTRB % C6.2.282 STURB 0 0 1 1 1 0 0 0 0 0 1 % C6.2.260 STRB (register) 0 0 1 1 1 0 0 0 0 1 0 % C6.2.144 LDTRB % C6.2.156 LDURB 0 0 1 1 1 0 0 0 0 1 1 % C6.2.124 LDRB (register) 0 0 1 1 1 0 0 0 1 0 1 % C6.2.092 LDAPRB 0 0 1 1 1 0 0 0 1 i 1 % C6.2.128 LDRSB (register) 0 0 1 1 1 0 0 0 1 x 0 % C6.2.146 LDTRSB % C6.2.158 LDURSB 0 0 1 1 1 0 0 0 a r 1 % C6.2.088 LDADDB, LDADDAB, LDADDALB, LDADDLB % C6.2.233 STADDB, STADDLB % C6.2.107 LDCLRB, LDCLRAB, LDCLRALB, LDCLRLB % C6.2.236 STCLRB, STCLRLB % C6.2.110 LDEORB, LDEORAB, LDEORALB, LDEORLB % C6.2.239 STEORB, STEORLB % C6.2.134 LDSETB, LDSETAB, LDSETALB, LDSETLB % C6.2.263 STSETB, STSETLB % C6.2.137 LDSMAXB, LDSMAXAB, LDSMAXALB, LDSMAXLB % C6.2.266 STSMAXB, STSMAXLB % C6.2.140 LDSMINB, LDSMINAB, LDSMINALB, LDSMINLB % C6.2.269 STSMINB, STSMINLB % C6.2.149 LDUMAXB, LDUMAXAB, LDUMAXALB, LDUMAXLB % C6.2.275 STUMAXB, STUMAXLB % C6.2.152 LDUMINB, LDUMINAB, LDUMINALB, LDUMINLB % C6.2.278 STUMINB, STUMINLB % C6.2.295 SWPB, SWPAB, SWPALB, SWPLB 0 0 1 1 1 0 0 i 0 0 _ % C6.2.259 STRB (immediate) 0 0 1 1 1 0 0 i 0 1 i % C6.2.123 LDRB (immediate) 0 0 1 1 1 0 0 i 1 i i % C6.2.127 LDRSB (immediate) 0 1 1 1 1 0 0 0 0 0 0 % C6.2.274 STTRH % C6.2.283 STURH 0 1 1 1 1 0 0 0 0 0 1 % C6.2.262 STRH (register) 0 1 1 1 1 0 0 0 0 1 0 % C6.2.145 LDTRH % C6.2.157 LDURH 0 1 1 1 1 0 0 0 0 1 1 % C6.2.126 LDRH (register) 0 1 1 1 1 0 0 0 1 0 1 % C6.2.093 LDAPRH 0 1 1 1 1 0 0 0 1 x 0 % C6.2.147 LDTRSH % C6.2.159 LDURSH 0 1 1 1 1 0 0 0 1 x 1 % C6.2.130 LDRSH (register) 0 1 1 1 1 0 0 0 a r 1 % C6.2.089 LDADDH, LDADDAH, LDADDALH, LDADDLH % C6.2.234 STADDH, STADDLH % C6.2.108 LDCLRH, LDCLRAH, LDCLRALH, LDCLRLH % C6.2.237 STCLRH, STCLRLH % C6.2.111 LDEORH, LDEORAH, LDEORALH, LDEORLH % C6.2.240 STEORH, STEORLH % C6.2.135 LDSETH, LDSETAH, LDSETALH, LDSETLH % C6.2.264 STSETH, STSETLH % C6.2.138 LDSMAXH, LDSMAXAH, LDSMAXALH, LDSMAXLH % C6.2.267 STSMAXH, STSMAXLH % C6.2.141 LDSMINH, LDSMINAH, LDSMINALH, LDSMINLH % C6.2.270 STSMINH, STSMINLH % C6.2.150 LDUMAXH, LDUMAXAH, LDUMAXALH, LDUMAXLH % C6.2.276 STUMAXH, STUMAXLH % C6.2.153 LDUMINH, LDUMINAH, LDUMINALH, LDUMINLH % C6.2.279 STUMINH, STUMINLH % C6.2.296 SWPH, SWPAH, SWPALH, SWPLH 0 1 1 1 1 0 0 i 0 0 _ % C6.2.261 STRH (immediate) 0 1 1 1 1 0 0 i 0 1 i % C6.2.125 LDRH (immediate) 0 1 1 1 1 0 0 i 1 x i % C6.2.129 LDRSH (immediate) 0 1 1 1 1 0 0 i 0 0 _ % C6.2.261 STRH (immediate) 0 1 1 1 1 0 0 i 0 1 i % C6.2.125 LDRH (immediate) 0 1 1 1 1 0 0 i 1 x i % C6.2.129 LDRSH (immediate) 0 1 0 1 1 0 0 1 0 0 0 % C6.2.250 STLURH 0 1 0 1 1 0 0 1 0 1 0 % C6.2.096 LDAPURH 0 1 0 1 1 0 0 1 1 i 0 % C6.2.098 LDAPURSH 0 0 0 1 1 0 0 1 0 0 0 % C6.2.249 STLURB 0 0 0 1 1 0 0 1 0 1 0 % C6.2.095 LDAPURB 0 0 0 1 1 0 0 1 1 i 0 % C6.2.097 LDAPURSB 1 0 1 1 1 0 0 0 1 0 0 % C6.2.148 LDTRSW % C6.2.160 LDURSW 1 0 1 1 1 0 0 i 1 0 i % C6.2.131 LDRSW (immediate) % C6.2.133 LDRSW (register) 1 0 0 1 1 0 0 0 _ _ _ % C6.2.132 LDRSW (literal) 1 0 0 1 1 0 0 1 1 0 0 % C6.2.099 LDAPURSW 1 x 0 1 1 0 0 1 0 0 0 % C6.2.248 STLUR 1 x 0 1 1 0 0 1 0 1 0 % C6.2.094 LDAPUR 1 x 1 1 1 0 0 0 0 0 0 % C6.2.272 STTR % C6.2.281 STUR 1 x 1 1 1 0 0 0 0 0 1 % C6.2.258 STR (register) 1 x 1 1 1 0 0 0 0 1 0 % C6.2.143 LDTR % C6.2.155 LDUR 1 x 1 1 1 0 0 0 0 1 1 % C6.2.121 LDR (register) 1 x 1 1 1 0 0 0 1 0 1 % C6.2.091 LDAPR 1 x 1 1 1 0 0 0 a r 1 % C6.2.090 LDADD, LDADDA, LDADDAL, LDADDL % C6.2.235 STADD, STADDL % C6.2.109 LDCLR, LDCLRA, LDCLRAL, LDCLRL % C6.2.238 STCLR, STCLRL % C6.2.112 LDEOR, LDEORA, LDEORAL, LDEORL % C6.2.241 STEOR, STEORL % C6.2.136 LDSET, LDSETA, LDSETAL, LDSETL % C6.2.265 STSET, STSETL % C6.2.139 LDSMAX, LDSMAXA, LDSMAXAL, LDSMAXL % C6.2.268 STSMAX, STSMAXL % C6.2.142 LDSMIN, LDSMINA, LDSMINAL, LDSMINL % C6.2.271 STSMIN, STSMINL % C6.2.151 LDUMAX, LDUMAXA, LDUMAXAL, LDUMAXL % C6.2.277 STUMAX, STUMAXL % C6.2.154 LDUMIN, LDUMINA, LDUMINAL, LDUMINL % C6.2.280 STUMIN, STUMINL % C6.2.297 SWP, SWPA, SWPAL, SWPL 1 x 1 1 1 0 0 i 0 0 _ % C6.2.257 STR (immediate) 1 x 1 1 1 0 0 i 0 1 i % C6.2.119 LDR (immediate) 1 1 0 1 1 0 0 0 _ _ _ % C6.2.201 PRFM (literal) 1 1 1 1 1 0 0 0 1 0 0 % C6.2.203 PRFUM 1 1 1 1 1 0 0 0 1 0 1 % C6.2.202 PRFM (register) 1 1 1 1 1 0 0 0 m s 1 % C6.2.122 LDRAA, LDRAB 1 1 1 1 1 0 0 0 m s 1 % C6.2.122 LDRAA, LDRAB 1 1 1 1 1 0 0 1 1 0 _ % C6.2.200 PRFM (immediate) 0 0 1 1 1 0 1 0 0 0 0 % C6.2.223 SETF8, SETF16 x 0 0 1 1 0 1 0 1 0 0 % C6.2.048 CINC % C6.2.66 CSINC % C6.2.64 CSET % C6.2.063 CSEL x 0 0 1 1 0 1 0 1 1 0 % C6.2.015 ASR (register) % C6.2.17 ASRV % C6.2.060 CRC32B, CRC32H, CRC32W, CRC32X % C6.2.061 CRC32CB, CRC32CH, CRC32CW, CRC32CX % C6.2.165 LSL (register) % C6.2.167 LSLV % C6.2.168 LSR (register) % C6.2.170 LSRV % C6.2.215 ROR (register) % C6.2.216 RORV % C6.2.222 SDIV % C6.2.313 UDIV x 0 0 1 1 0 1 1 0 0 0 % C6.2.171 MADD % C6.2.185 MUL % C6.2.172 MNEG % C6.2.184 MSUB x 0 1 1 1 0 1 0 0 0 0 % C6.2.002 ADCS x 0 1 1 1 0 1 0 0 1 0 % C6.2.043 CCMN (immediate) % C6.2.044 CCMN (register) x 0 1 1 1 0 1 0 0 0 0 % C6.2.002 ADCS x 1 0 1 1 0 1 0 0 0 0 % C6.2.189 NGC % C6.2.217 SBC x 1 0 1 1 0 1 0 1 0 0 % C6.2.049 CINV % C6.2.65 CSETM % C6.2.67 CSINV x 1 0 1 1 0 1 0 1 0 0 % C6.2.059 CNEG % C6.2.68 CSNEG x 1 0 1 1 0 1 0 1 1 0 % C6.2.051 CLS x 1 0 1 1 0 1 0 1 1 0 % C6.2.052 CLZ x 1 0 1 1 0 1 0 1 1 0 % C6.2.206 RBIT x 1 0 1 1 0 1 0 1 1 0 % C6.2.209 REV % C6.2.210 REV16 % C6.2.212 REV64 x 1 0 1 1 0 1 0 0 0 0 % C6.2.189 NGC % C6.2.217 SBC x 1 1 1 1 0 1 0 0 0 0 % C6.2.190 NGCS % C6.2.218 SBCS x 1 1 1 1 0 1 0 0 1 0 % C6.2.045 CCMP (immediate) % C6.2.046 CCMP (register) 1 0 0 1 1 0 1 0 1 1 0 % C6.2.197 PACGA 1 0 0 1 1 0 1 1 0 0 1 % C6.2.226 SMADDL % C6.2.231 SMULL % C6.2.228 SMNEGL % C6.2.229 SMSUBL 1 0 0 1 1 0 1 1 0 1 0 % C6.2.230 SMULH 1 0 0 1 1 0 1 1 1 0 1 % C6.2.314 UMADDL % C6.2.318 UMULL % C6.2.315 UMNEGL % C6.2.316 UMSUBL 1 0 0 1 1 0 1 1 1 1 0 % C6.2.317 UMULH 1 0 1 1 1 0 1 0 0 0 0 % C6.2.213 RMIF 1 1 0 1 1 0 1 0 1 1 0 % C6.2.019 AUTDA, AUTDZA % C6.2.020 AUTDB, AUTDZB % C6.2.021 AUTIA, AUTIA1716, AUTIASP, AUTIAZ, AUTIZA % C6.2.022 AUTIB, AUTIB1716, AUTIBSP, AUTIBZ, AUTIZB % C6.2.195 PACDA, PACDZA % C6.2.196 PACDB, PACDZB % C6.2.211 REV32 % C6.2.323 XPACD, XPACI, XPACLRI 1 1 0 1 1 0 1 0 1 1 1 % C6.2.199 PACIB, PACIB1716, PACIBSP, PACIBZ, PACIZB

APPENDIX B

Advanced SIMD and FPU ISA aka NEON:

0 x 0 s 1 1 1 0 s s 1 ... 0 | 1 0 1 1 1 0 % C7.2.001 ABS 0 x 0 s 1 1 1 0 s s 1 ... _ | 1 0 0 0 0 1 % C7.2 002 ADD (vector) 0 x 0 0 1 1 1 0 s s 1 ... _ | 0 1 0 0 0 0 % C7.2.003 ADDHN, ADDHN2 0 1 0 1 1 1 1 0 s s 1 ... 1 | 1 0 1 1 1 0 % C7.2.004 ADDP (scalar) 0 x 0 0 1 1 1 0 s s 1 ... _ | 1 0 1 1 1 1 % C7.2.005 ADDP (vector) 0 x 0 0 1 1 1 0 s s 1 ... 1 | 1 0 1 1 1 0 % C7.2.006 ADDV 0 1 0 0 1 1 1 0 0 0 1 ... 0 | 0 1 0 1 1 0 % C7.2.007 AESD - AES single round decryption. 0 1 0 0 1 1 1 0 0 0 1 ... 0 | 0 1 0 0 1 0 % C7.2.008 AESE - AES single round encryption. 0 1 0 0 1 1 1 0 0 0 1 ... 0 | 0 1 1 1 1 0 % C7.2.009 AESIMC - AES inverse mix columns. 0 1 0 0 1 1 1 0 0 0 1 ... 0 | 0 1 1 0 1 0 % C7.2.010 AESMC - AES mix columns. 0 x 0 0 1 1 1 0 0 0 1 ... _ | 0 0 0 1 1 1 % C7.2.011 AND (vector) 1 1 0 0 1 1 1 0 0 0 1 ... _ | 0 _ _ _ _ _ % C7.2.012 BCAX 0 x 1 0 1 1 1 1 0 0 0 ... c | x x x 1 0 1 % C7.2.013 BIC (vector, immediate) 0 x 0 0 1 1 1 0 0 1 1 ... _ | 0 0 0 1 1 1 % C7.2.014 BIC (vector, register) 0 x 1 0 1 1 1 0 s s 1 ... _ | 1 0 1 0 0 0 % C7.2.352 UMLSL, UMLSL2 (vector) 0 x 0 0 1 1 1 0 0 0 0 ... _ | 0 0 1 1 1 1 % C7.2.353 UMOV 0 x 1 0 1 1 1 1 s s i ... _ | 1 0 1 0 h 0 % C7.2.354 UMULL, UMULL2 (by element) 0 x 1 0 1 1 1 0 s s 1 ... _ | 1 1 0 0 0 0 % C7.2.355 UMULL, UMULL2 (vector) 0 x 1 0 1 1 1 0 s s 1 ... _ | 0 0 0 0 1 1 % C7.2.356 UQADD 0 x 1 0 1 1 1 0 s s 1 ... _ | 0 1 0 1 1 1 % C7.2.357 UQRSHL 0 x 1 0 1 1 1 1 0 _ _ ... _ | 1 0 0 1 1 1 % C7.2.358 UQRSHRN, UQRSHRN2 0 x 1 i 1 1 1 1 0 _ _ ... _ | 0 1 1 1 0 1 % C7.2.359 UQSHL (immediate) 0 x 1 i 1 1 1 0 s s 1 ... _ | 0 1 0 0 1 1 % C7.2.360 UQSHL (register) 0 x 1 0 1 1 1 1 0 _ _ ... _ | 1 0 0 1 0 1 % C7.2.361 UQSHRN, UQSHRN2 0 x 1 i 1 1 1 0 s s 1 ... _ | 0 0 1 0 1 1 % C7.2.362 UQSUB - Unsigned saturating Subtract. 0 x 1 i 1 1 1 0 s s 1 ... 1 | 0 1 0 0 1 0 % C7.2.363 UQXTN, UQXTN2 - Unsigned saturating extract Narrow. 0 x 0 0 1 1 1 0 1 s 1 ... 1 | 1 1 0 0 1 0 % C7.2.364 URECPE - Unsigned Reciprocal Estimate. 0 x 1 0 1 1 1 0 s s 1 ... _ | 0 0 0 1 0 1 % C7.2.365 URHADD Unsigned Rounding Halving Add. 0 x 1 i 1 1 1 0 s s 1 ... _ | 0 1 0 1 0 1 % C7.2.366 URSHL - Unsigned Rounding Shift Left (register). 0 1 1 1 1 1 1 1 0 _ _ ... _ | 0 0 1 0 0 1 % C7.2.367 URSHR - Unsigned Rounding Shift Right (immediate). 0 x 1 0 1 1 1 0 1 s 1 ... 1 | 1 1 0 0 1 0 % C7.2.368 URSQRTE - Unsigned Reciprocal Square Root Estimate. 0 1 1 1 1 1 1 1 0 _ _ ... _ | 0 0 1 1 0 1 % C7.2.369 URSRA 0 1 1 1 1 1 1 0 s s 1 ... _ | 0 1 0 0 0 1 % C7.2.370 USHL - Unsigned Shift Left (register). 0 x 1 0 1 1 1 1 0 _ _ ... 0 | 1 0 1 0 0 1 % C7.2.371 USHLL, USHLL2 % C7.2.377 UXTL, UXTL2 0 1 1 1 1 1 1 1 0 _ _ ... _ | 0 0 0 0 0 1 % C7.2.372 USHR - Unsigned Shift Right (immediate). 0 x 1 s 1 1 1 0 s s 1 ... 0 | 0 0 0 1 1 1 % C7.2.373 USQADD 0 1 1 1 1 1 1 1 0 _ _ ... _ | 0 0 0 1 0 1 % C7.2.374 USRA 0 x 1 0 1 1 1 0 s s 1 ... _ | 0 0 1 0 0 0 % C7.2.375 USUBL, USUBL2 0 x 1 0 1 1 1 0 s s 1 ... _ | 0 0 1 1 0 0 % C7.2.376 USUBW, USUBW2 - Unsigned Subtract Wide. 0 x 0 0 1 1 1 0 s s 0 ... _ | 0 0 0 1 1 0 % C7.2.378 UZP1 - Unzip vectors (primary). 0 x 0 0 1 1 1 0 s s 0 ... _ | 0 1 0 1 1 0 % C7.2.379 UZP2 - Unzip vectors (secondary). 1 1 0 0 1 1 1 0 1 0 0 ... _ | _ _ _ _ _ _ % C7.2.380 XAR - Exclusive OR and Rotate. 0 x 0 0 1 1 1 0 s s 1 ... 1 | 0 0 1 0 1 0 % C7.2.381 XTN, XTN2 - Extract Narrow. 0 x 0 0 1 1 1 0 s s 0 ... _ | 0 0 1 1 1 0 % C7.2.382 ZIP1 - Zip vectors (primary). 0 x 0 0 1 1 1 0 s s 0 ... _ | 0 1 1 1 1 0 % C7.2.383 ZIP2 - Zip vectors (secondary).