1 /* 2 * Copyright (c) 1997, 2020, Oracle and/or its affiliates. All rights reserved. 3 * Copyright (c) 2014, 2020 Red Hat Inc. All rights reserved. 4 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 5 * 6 * This code is free software; you can redistribute it and/or modify it 7 * under the terms of the GNU General Public License version 2 only, as 8 * published by the Free Software Foundation. 9 * 10 * This code is distributed in the hope that it will be useful, but WITHOUT 11 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 12 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 13 * version 2 for more details (a copy is included in the LICENSE file that 14 * accompanied this code). 15 * 16 * You should have received a copy of the GNU General Public License version 17 * 2 along with this work; if not, write to the Free Software Foundation, 18 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 19 * 20 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 21 * or visit www.oracle.com if you need additional information or have any 22 * questions. 23 */ 24 25 #include <stdio.h> 26 #include <sys/types.h> 27 28 #include "precompiled.hpp" 29 #include "asm/assembler.hpp" 30 #include "asm/assembler.inline.hpp" 31 #include "interpreter/interpreter.hpp" 32 33 #ifndef PRODUCT 34 const uintptr_t Assembler::asm_bp = 0x00007fffee09ac88; 35 #endif 36 37 #include "compiler/disassembler.hpp" 38 #include "memory/resourceArea.hpp" 39 #include "runtime/interfaceSupport.inline.hpp" 40 #include "runtime/sharedRuntime.hpp" 41 #include "immediate_aarch64.hpp" 42 43 extern "C" void entry(CodeBuffer *cb); 44 45 #define __ _masm. 46 #ifdef PRODUCT 47 #define BLOCK_COMMENT(str) /* nothing */ 48 #else 49 #define BLOCK_COMMENT(str) block_comment(str) 50 #endif 51 52 #define BIND(label) bind(label); __ BLOCK_COMMENT(#label ":") 53 54 static float unpack(unsigned value); 55 56 short Assembler::SIMD_Size_in_bytes[] = { 57 // T8B, T16B, T4H, T8H, T2S, T4S, T1D, T2D, T1Q 58 8, 16, 8, 16, 8, 16, 8, 16, 16 59 }; 60 61 #ifdef ASSERT 62 static void asm_check(const unsigned int *insns, const unsigned int *insns1, size_t len) { 63 bool ok = true; 64 for (unsigned int i = 0; i < len; i++) { 65 if (insns[i] != insns1[i]) { 66 ok = false; 67 printf("Ours:\n"); 68 Disassembler::decode((address)&insns1[i], (address)&insns1[i+1]); 69 printf("Theirs:\n"); 70 Disassembler::decode((address)&insns[i], (address)&insns[i+1]); 71 printf("\n"); 72 } 73 } 74 assert(ok, "Assembler smoke test failed"); 75 } 76 77 void entry(CodeBuffer *cb) { 78 79 // { 80 // for (int i = 0; i < 256; i+=16) 81 // { 82 // printf("\"%20.20g\", ", unpack(i)); 83 // printf("\"%20.20g\", ", unpack(i+1)); 84 // } 85 // printf("\n"); 86 // } 87 88 Assembler _masm(cb); 89 address entry = __ pc(); 90 91 // Smoke test for assembler 92 93 // BEGIN Generated code -- do not edit 94 // Generated by aarch64-asmtest.py 95 Label back, forth; 96 __ bind(back); 97 98 // ArithOp 99 __ add(r26, r23, r13, Assembler::LSL, 32); // add x26, x23, x13, LSL #32 100 __ sub(r12, r24, r9, Assembler::LSR, 37); // sub x12, x24, x9, LSR #37 101 __ adds(r28, r15, r8, Assembler::ASR, 39); // adds x28, x15, x8, ASR #39 102 __ subs(r7, r28, r30, Assembler::ASR, 57); // subs x7, x28, x30, ASR #57 103 __ addw(r9, r22, r27, Assembler::ASR, 15); // add w9, w22, w27, ASR #15 104 __ subw(r3, r13, r18, Assembler::ASR, 30); // sub w3, w13, w18, ASR #30 105 __ addsw(r14, r26, r8, Assembler::ASR, 17); // adds w14, w26, w8, ASR #17 106 __ subsw(r0, r22, r12, Assembler::ASR, 21); // subs w0, w22, w12, ASR #21 107 __ andr(r0, r15, r26, Assembler::LSL, 20); // and x0, x15, x26, LSL #20 108 __ orr(r26, r5, r17, Assembler::LSL, 61); // orr x26, x5, x17, LSL #61 109 __ eor(r24, r13, r2, Assembler::LSL, 32); // eor x24, x13, x2, LSL #32 110 __ ands(r28, r3, r17, Assembler::ASR, 35); // ands x28, x3, x17, ASR #35 111 __ andw(r25, r16, r29, Assembler::LSR, 18); // and w25, w16, w29, LSR #18 112 __ orrw(r13, r18, r11, Assembler::LSR, 9); // orr w13, w18, w11, LSR #9 113 __ eorw(r5, r5, r18, Assembler::LSR, 15); // eor w5, w5, w18, LSR #15 114 __ andsw(r2, r23, r27, Assembler::ASR, 26); // ands w2, w23, w27, ASR #26 115 __ bic(r27, r28, r16, Assembler::LSR, 45); // bic x27, x28, x16, LSR #45 116 __ orn(r8, r25, r26, Assembler::ASR, 37); // orn x8, x25, x26, ASR #37 117 __ eon(r29, r17, r13, Assembler::LSR, 63); // eon x29, x17, x13, LSR #63 118 __ bics(r28, r24, r2, Assembler::LSR, 31); // bics x28, x24, x2, LSR #31 119 __ bicw(r19, r26, r7, Assembler::ASR, 3); // bic w19, w26, w7, ASR #3 120 __ ornw(r6, r24, r10, Assembler::ASR, 3); // orn w6, w24, w10, ASR #3 121 __ eonw(r4, r21, r1, Assembler::LSR, 29); // eon w4, w21, w1, LSR #29 122 __ bicsw(r16, r21, r0, Assembler::LSR, 19); // bics w16, w21, w0, LSR #19 123 124 // AddSubImmOp 125 __ addw(r17, r12, 379u); // add w17, w12, #379 126 __ addsw(r30, r1, 22u); // adds w30, w1, #22 127 __ subw(r29, r5, 126u); // sub w29, w5, #126 128 __ subsw(r6, r24, 960u); // subs w6, w24, #960 129 __ add(r0, r13, 104u); // add x0, x13, #104 130 __ adds(r8, r6, 663u); // adds x8, x6, #663 131 __ sub(r10, r5, 516u); // sub x10, x5, #516 132 __ subs(r1, r3, 1012u); // subs x1, x3, #1012 133 134 // LogicalImmOp 135 __ andw(r6, r11, 4294049777ull); // and w6, w11, #0xfff1fff1 136 __ orrw(r28, r5, 4294966791ull); // orr w28, w5, #0xfffffe07 137 __ eorw(r1, r20, 134217216ull); // eor w1, w20, #0x7fffe00 138 __ andsw(r7, r18, 1048576ull); // ands w7, w18, #0x100000 139 __ andr(r14, r12, 9223372036854775808ull); // and x14, x12, #0x8000000000000000 140 __ orr(r9, r11, 562675075514368ull); // orr x9, x11, #0x1ffc000000000 141 __ eor(r17, r0, 18014398509481728ull); // eor x17, x0, #0x3fffffffffff00 142 __ ands(r1, r8, 18446744073705357315ull); // ands x1, x8, #0xffffffffffc00003 143 144 // AbsOp 145 __ b(__ pc()); // b . 146 __ b(back); // b back 147 __ b(forth); // b forth 148 __ bl(__ pc()); // bl . 149 __ bl(back); // bl back 150 __ bl(forth); // bl forth 151 152 // RegAndAbsOp 153 __ cbzw(r10, __ pc()); // cbz w10, . 154 __ cbzw(r10, back); // cbz w10, back 155 __ cbzw(r10, forth); // cbz w10, forth 156 __ cbnzw(r8, __ pc()); // cbnz w8, . 157 __ cbnzw(r8, back); // cbnz w8, back 158 __ cbnzw(r8, forth); // cbnz w8, forth 159 __ cbz(r11, __ pc()); // cbz x11, . 160 __ cbz(r11, back); // cbz x11, back 161 __ cbz(r11, forth); // cbz x11, forth 162 __ cbnz(r29, __ pc()); // cbnz x29, . 163 __ cbnz(r29, back); // cbnz x29, back 164 __ cbnz(r29, forth); // cbnz x29, forth 165 __ adr(r19, __ pc()); // adr x19, . 166 __ adr(r19, back); // adr x19, back 167 __ adr(r19, forth); // adr x19, forth 168 __ _adrp(r19, __ pc()); // adrp x19, . 169 170 // RegImmAbsOp 171 __ tbz(r22, 6, __ pc()); // tbz x22, #6, . 172 __ tbz(r22, 6, back); // tbz x22, #6, back 173 __ tbz(r22, 6, forth); // tbz x22, #6, forth 174 __ tbnz(r12, 11, __ pc()); // tbnz x12, #11, . 175 __ tbnz(r12, 11, back); // tbnz x12, #11, back 176 __ tbnz(r12, 11, forth); // tbnz x12, #11, forth 177 178 // MoveWideImmOp 179 __ movnw(r0, 6301, 0); // movn w0, #6301, lsl 0 180 __ movzw(r7, 20886, 0); // movz w7, #20886, lsl 0 181 __ movkw(r27, 18617, 0); // movk w27, #18617, lsl 0 182 __ movn(r12, 22998, 16); // movn x12, #22998, lsl 16 183 __ movz(r20, 1532, 16); // movz x20, #1532, lsl 16 184 __ movk(r8, 5167, 32); // movk x8, #5167, lsl 32 185 186 // BitfieldOp 187 __ sbfm(r15, r17, 24, 28); // sbfm x15, x17, #24, #28 188 __ bfmw(r15, r9, 14, 25); // bfm w15, w9, #14, #25 189 __ ubfmw(r27, r25, 6, 31); // ubfm w27, w25, #6, #31 190 __ sbfm(r19, r2, 23, 31); // sbfm x19, x2, #23, #31 191 __ bfm(r12, r21, 10, 6); // bfm x12, x21, #10, #6 192 __ ubfm(r22, r0, 26, 16); // ubfm x22, x0, #26, #16 193 194 // ExtractOp 195 __ extrw(r3, r3, r20, 27); // extr w3, w3, w20, #27 196 __ extr(r8, r30, r3, 54); // extr x8, x30, x3, #54 197 198 // CondBranchOp 199 __ br(Assembler::EQ, __ pc()); // b.EQ . 200 __ br(Assembler::EQ, back); // b.EQ back 201 __ br(Assembler::EQ, forth); // b.EQ forth 202 __ br(Assembler::NE, __ pc()); // b.NE . 203 __ br(Assembler::NE, back); // b.NE back 204 __ br(Assembler::NE, forth); // b.NE forth 205 __ br(Assembler::HS, __ pc()); // b.HS . 206 __ br(Assembler::HS, back); // b.HS back 207 __ br(Assembler::HS, forth); // b.HS forth 208 __ br(Assembler::CS, __ pc()); // b.CS . 209 __ br(Assembler::CS, back); // b.CS back 210 __ br(Assembler::CS, forth); // b.CS forth 211 __ br(Assembler::LO, __ pc()); // b.LO . 212 __ br(Assembler::LO, back); // b.LO back 213 __ br(Assembler::LO, forth); // b.LO forth 214 __ br(Assembler::CC, __ pc()); // b.CC . 215 __ br(Assembler::CC, back); // b.CC back 216 __ br(Assembler::CC, forth); // b.CC forth 217 __ br(Assembler::MI, __ pc()); // b.MI . 218 __ br(Assembler::MI, back); // b.MI back 219 __ br(Assembler::MI, forth); // b.MI forth 220 __ br(Assembler::PL, __ pc()); // b.PL . 221 __ br(Assembler::PL, back); // b.PL back 222 __ br(Assembler::PL, forth); // b.PL forth 223 __ br(Assembler::VS, __ pc()); // b.VS . 224 __ br(Assembler::VS, back); // b.VS back 225 __ br(Assembler::VS, forth); // b.VS forth 226 __ br(Assembler::VC, __ pc()); // b.VC . 227 __ br(Assembler::VC, back); // b.VC back 228 __ br(Assembler::VC, forth); // b.VC forth 229 __ br(Assembler::HI, __ pc()); // b.HI . 230 __ br(Assembler::HI, back); // b.HI back 231 __ br(Assembler::HI, forth); // b.HI forth 232 __ br(Assembler::LS, __ pc()); // b.LS . 233 __ br(Assembler::LS, back); // b.LS back 234 __ br(Assembler::LS, forth); // b.LS forth 235 __ br(Assembler::GE, __ pc()); // b.GE . 236 __ br(Assembler::GE, back); // b.GE back 237 __ br(Assembler::GE, forth); // b.GE forth 238 __ br(Assembler::LT, __ pc()); // b.LT . 239 __ br(Assembler::LT, back); // b.LT back 240 __ br(Assembler::LT, forth); // b.LT forth 241 __ br(Assembler::GT, __ pc()); // b.GT . 242 __ br(Assembler::GT, back); // b.GT back 243 __ br(Assembler::GT, forth); // b.GT forth 244 __ br(Assembler::LE, __ pc()); // b.LE . 245 __ br(Assembler::LE, back); // b.LE back 246 __ br(Assembler::LE, forth); // b.LE forth 247 __ br(Assembler::AL, __ pc()); // b.AL . 248 __ br(Assembler::AL, back); // b.AL back 249 __ br(Assembler::AL, forth); // b.AL forth 250 __ br(Assembler::NV, __ pc()); // b.NV . 251 __ br(Assembler::NV, back); // b.NV back 252 __ br(Assembler::NV, forth); // b.NV forth 253 254 // ImmOp 255 __ svc(12999); // svc #12999 256 __ hvc(2665); // hvc #2665 257 __ smc(9002); // smc #9002 258 __ brk(14843); // brk #14843 259 __ hlt(25964); // hlt #25964 260 261 // Op 262 __ nop(); // nop 263 __ eret(); // eret 264 __ drps(); // drps 265 __ isb(); // isb 266 267 // SystemOp 268 __ dsb(Assembler::ST); // dsb ST 269 __ dmb(Assembler::OSHST); // dmb OSHST 270 271 // OneRegOp 272 __ br(r16); // br x16 273 __ blr(r20); // blr x20 274 275 // LoadStoreExclusiveOp 276 __ stxr(r10, r27, r8); // stxr w10, x27, [x8] 277 __ stlxr(r0, r1, r21); // stlxr w0, x1, [x21] 278 __ ldxr(r17, r29); // ldxr x17, [x29] 279 __ ldaxr(r29, r28); // ldaxr x29, [x28] 280 __ stlr(r1, r23); // stlr x1, [x23] 281 __ ldar(r21, r20); // ldar x21, [x20] 282 283 // LoadStoreExclusiveOp 284 __ stxrw(r22, r27, r19); // stxr w22, w27, [x19] 285 __ stlxrw(r11, r16, r6); // stlxr w11, w16, [x6] 286 __ ldxrw(r18, r0); // ldxr w18, [x0] 287 __ ldaxrw(r4, r10); // ldaxr w4, [x10] 288 __ stlrw(r24, r22); // stlr w24, [x22] 289 __ ldarw(r10, r19); // ldar w10, [x19] 290 291 // LoadStoreExclusiveOp 292 __ stxrh(r1, r5, r30); // stxrh w1, w5, [x30] 293 __ stlxrh(r8, r12, r17); // stlxrh w8, w12, [x17] 294 __ ldxrh(r9, r14); // ldxrh w9, [x14] 295 __ ldaxrh(r7, r1); // ldaxrh w7, [x1] 296 __ stlrh(r5, r16); // stlrh w5, [x16] 297 __ ldarh(r2, r12); // ldarh w2, [x12] 298 299 // LoadStoreExclusiveOp 300 __ stxrb(r10, r12, r3); // stxrb w10, w12, [x3] 301 __ stlxrb(r28, r14, r26); // stlxrb w28, w14, [x26] 302 __ ldxrb(r30, r10); // ldxrb w30, [x10] 303 __ ldaxrb(r14, r21); // ldaxrb w14, [x21] 304 __ stlrb(r13, r9); // stlrb w13, [x9] 305 __ ldarb(r22, r27); // ldarb w22, [x27] 306 307 // LoadStoreExclusiveOp 308 __ ldxp(r28, r19, r11); // ldxp x28, x19, [x11] 309 __ ldaxp(r30, r19, r2); // ldaxp x30, x19, [x2] 310 __ stxp(r2, r23, r1, r0); // stxp w2, x23, x1, [x0] 311 __ stlxp(r12, r16, r13, r15); // stlxp w12, x16, x13, [x15] 312 313 // LoadStoreExclusiveOp 314 __ ldxpw(r18, r21, r13); // ldxp w18, w21, [x13] 315 __ ldaxpw(r11, r30, r8); // ldaxp w11, w30, [x8] 316 __ stxpw(r24, r13, r11, r1); // stxp w24, w13, w11, [x1] 317 __ stlxpw(r26, r21, r27, r13); // stlxp w26, w21, w27, [x13] 318 319 // base_plus_unscaled_offset 320 // LoadStoreOp 321 __ str(r11, Address(r20, -103)); // str x11, [x20, -103] 322 __ strw(r28, Address(r16, 62)); // str w28, [x16, 62] 323 __ strb(r27, Address(r9, -9)); // strb w27, [x9, -9] 324 __ strh(r2, Address(r25, -50)); // strh w2, [x25, -50] 325 __ ldr(r4, Address(r2, -241)); // ldr x4, [x2, -241] 326 __ ldrw(r30, Address(r20, -31)); // ldr w30, [x20, -31] 327 __ ldrb(r18, Address(r23, -23)); // ldrb w18, [x23, -23] 328 __ ldrh(r29, Address(r26, -1)); // ldrh w29, [x26, -1] 329 __ ldrsb(r1, Address(r9, 6)); // ldrsb x1, [x9, 6] 330 __ ldrsh(r11, Address(r12, 19)); // ldrsh x11, [x12, 19] 331 __ ldrshw(r11, Address(r1, -50)); // ldrsh w11, [x1, -50] 332 __ ldrsw(r19, Address(r24, 41)); // ldrsw x19, [x24, 41] 333 __ ldrd(v24, Address(r24, 95)); // ldr d24, [x24, 95] 334 __ ldrs(v15, Address(r5, -43)); // ldr s15, [x5, -43] 335 __ strd(v21, Address(r27, 1)); // str d21, [x27, 1] 336 __ strs(v23, Address(r13, -107)); // str s23, [x13, -107] 337 338 // pre 339 // LoadStoreOp 340 __ str(r11, Address(__ pre(r0, 8))); // str x11, [x0, 8]! 341 __ strw(r3, Address(__ pre(r0, 29))); // str w3, [x0, 29]! 342 __ strb(r11, Address(__ pre(r14, 9))); // strb w11, [x14, 9]! 343 __ strh(r29, Address(__ pre(r24, -3))); // strh w29, [x24, -3]! 344 __ ldr(r13, Address(__ pre(r17, -144))); // ldr x13, [x17, -144]! 345 __ ldrw(r12, Address(__ pre(r22, -6))); // ldr w12, [x22, -6]! 346 __ ldrb(r13, Address(__ pre(r12, -10))); // ldrb w13, [x12, -10]! 347 __ ldrh(r0, Address(__ pre(r21, -21))); // ldrh w0, [x21, -21]! 348 __ ldrsb(r23, Address(__ pre(r7, 4))); // ldrsb x23, [x7, 4]! 349 __ ldrsh(r3, Address(__ pre(r7, -53))); // ldrsh x3, [x7, -53]! 350 __ ldrshw(r28, Address(__ pre(r5, -7))); // ldrsh w28, [x5, -7]! 351 __ ldrsw(r24, Address(__ pre(r9, -18))); // ldrsw x24, [x9, -18]! 352 __ ldrd(v14, Address(__ pre(r11, 12))); // ldr d14, [x11, 12]! 353 __ ldrs(v19, Address(__ pre(r12, -67))); // ldr s19, [x12, -67]! 354 __ strd(v20, Address(__ pre(r0, -253))); // str d20, [x0, -253]! 355 __ strs(v8, Address(__ pre(r0, 64))); // str s8, [x0, 64]! 356 357 // post 358 // LoadStoreOp 359 __ str(r4, Address(__ post(r28, -94))); // str x4, [x28], -94 360 __ strw(r12, Address(__ post(r7, -54))); // str w12, [x7], -54 361 __ strb(r27, Address(__ post(r10, -24))); // strb w27, [x10], -24 362 __ strh(r6, Address(__ post(r8, 27))); // strh w6, [x8], 27 363 __ ldr(r14, Address(__ post(r10, -202))); // ldr x14, [x10], -202 364 __ ldrw(r16, Address(__ post(r5, -41))); // ldr w16, [x5], -41 365 __ ldrb(r2, Address(__ post(r14, 9))); // ldrb w2, [x14], 9 366 __ ldrh(r28, Address(__ post(r13, -20))); // ldrh w28, [x13], -20 367 __ ldrsb(r9, Address(__ post(r13, -31))); // ldrsb x9, [x13], -31 368 __ ldrsh(r3, Address(__ post(r24, -36))); // ldrsh x3, [x24], -36 369 __ ldrshw(r20, Address(__ post(r3, 6))); // ldrsh w20, [x3], 6 370 __ ldrsw(r7, Address(__ post(r19, -1))); // ldrsw x7, [x19], -1 371 __ ldrd(v30, Address(__ post(r8, -130))); // ldr d30, [x8], -130 372 __ ldrs(v25, Address(__ post(r15, 21))); // ldr s25, [x15], 21 373 __ strd(v14, Address(__ post(r23, 90))); // str d14, [x23], 90 374 __ strs(v8, Address(__ post(r0, -33))); // str s8, [x0], -33 375 376 // base_plus_reg 377 // LoadStoreOp 378 __ str(r10, Address(r18, r21, Address::sxtw(3))); // str x10, [x18, w21, sxtw #3] 379 __ strw(r4, Address(r13, r22, Address::sxtw(2))); // str w4, [x13, w22, sxtw #2] 380 __ strb(r13, Address(r0, r19, Address::uxtw(0))); // strb w13, [x0, w19, uxtw #0] 381 __ strh(r12, Address(r27, r6, Address::sxtw(0))); // strh w12, [x27, w6, sxtw #0] 382 __ ldr(r0, Address(r8, r16, Address::lsl(0))); // ldr x0, [x8, x16, lsl #0] 383 __ ldrw(r0, Address(r4, r26, Address::sxtx(0))); // ldr w0, [x4, x26, sxtx #0] 384 __ ldrb(r14, Address(r25, r5, Address::sxtw(0))); // ldrb w14, [x25, w5, sxtw #0] 385 __ ldrh(r9, Address(r4, r18, Address::uxtw(0))); // ldrh w9, [x4, w18, uxtw #0] 386 __ ldrsb(r27, Address(r4, r7, Address::lsl(0))); // ldrsb x27, [x4, x7, lsl #0] 387 __ ldrsh(r15, Address(r17, r30, Address::sxtw(0))); // ldrsh x15, [x17, w30, sxtw #0] 388 __ ldrshw(r16, Address(r0, r22, Address::sxtw(0))); // ldrsh w16, [x0, w22, sxtw #0] 389 __ ldrsw(r22, Address(r10, r30, Address::sxtx(2))); // ldrsw x22, [x10, x30, sxtx #2] 390 __ ldrd(v29, Address(r21, r10, Address::sxtx(3))); // ldr d29, [x21, x10, sxtx #3] 391 __ ldrs(v3, Address(r11, r19, Address::uxtw(0))); // ldr s3, [x11, w19, uxtw #0] 392 __ strd(v13, Address(r28, r29, Address::uxtw(3))); // str d13, [x28, w29, uxtw #3] 393 __ strs(v23, Address(r29, r5, Address::sxtx(2))); // str s23, [x29, x5, sxtx #2] 394 395 // base_plus_scaled_offset 396 // LoadStoreOp 397 __ str(r5, Address(r8, 12600)); // str x5, [x8, 12600] 398 __ strw(r29, Address(r24, 7880)); // str w29, [x24, 7880] 399 __ strb(r19, Address(r17, 1566)); // strb w19, [x17, 1566] 400 __ strh(r13, Address(r19, 3984)); // strh w13, [x19, 3984] 401 __ ldr(r19, Address(r23, 13632)); // ldr x19, [x23, 13632] 402 __ ldrw(r23, Address(r29, 6264)); // ldr w23, [x29, 6264] 403 __ ldrb(r22, Address(r11, 2012)); // ldrb w22, [x11, 2012] 404 __ ldrh(r3, Address(r10, 3784)); // ldrh w3, [x10, 3784] 405 __ ldrsb(r8, Address(r16, 1951)); // ldrsb x8, [x16, 1951] 406 __ ldrsh(r23, Address(r20, 3346)); // ldrsh x23, [x20, 3346] 407 __ ldrshw(r2, Address(r1, 3994)); // ldrsh w2, [x1, 3994] 408 __ ldrsw(r4, Address(r17, 7204)); // ldrsw x4, [x17, 7204] 409 __ ldrd(v20, Address(r27, 14400)); // ldr d20, [x27, 14400] 410 __ ldrs(v25, Address(r14, 8096)); // ldr s25, [x14, 8096] 411 __ strd(v26, Address(r10, 15024)); // str d26, [x10, 15024] 412 __ strs(v9, Address(r3, 6936)); // str s9, [x3, 6936] 413 414 // pcrel 415 // LoadStoreOp 416 __ ldr(r27, forth); // ldr x27, forth 417 __ ldrw(r11, __ pc()); // ldr w11, . 418 419 // LoadStoreOp 420 __ prfm(Address(r3, -187)); // prfm PLDL1KEEP, [x3, -187] 421 422 // LoadStoreOp 423 __ prfm(__ pc()); // prfm PLDL1KEEP, . 424 425 // LoadStoreOp 426 __ prfm(Address(r29, r14, Address::lsl(0))); // prfm PLDL1KEEP, [x29, x14, lsl #0] 427 428 // LoadStoreOp 429 __ prfm(Address(r4, 13312)); // prfm PLDL1KEEP, [x4, 13312] 430 431 // AddSubCarryOp 432 __ adcw(r21, r1, r7); // adc w21, w1, w7 433 __ adcsw(r8, r5, r7); // adcs w8, w5, w7 434 __ sbcw(r7, r27, r14); // sbc w7, w27, w14 435 __ sbcsw(r27, r4, r17); // sbcs w27, w4, w17 436 __ adc(r0, r28, r0); // adc x0, x28, x0 437 __ adcs(r12, r24, r30); // adcs x12, x24, x30 438 __ sbc(r0, r25, r15); // sbc x0, x25, x15 439 __ sbcs(r1, r24, r3); // sbcs x1, x24, x3 440 441 // AddSubExtendedOp 442 __ addw(r18, r24, r20, ext::uxtb, 2); // add w18, w24, w20, uxtb #2 443 __ addsw(r13, r28, r10, ext::uxth, 1); // adds w13, w28, w10, uxth #1 444 __ sub(r15, r16, r2, ext::sxth, 2); // sub x15, x16, x2, sxth #2 445 __ subsw(r29, r13, r13, ext::uxth, 2); // subs w29, w13, w13, uxth #2 446 __ add(r12, r20, r12, ext::sxtw, 3); // add x12, x20, x12, sxtw #3 447 __ adds(r30, r27, r11, ext::sxtb, 1); // adds x30, x27, x11, sxtb #1 448 __ sub(r14, r7, r1, ext::sxtw, 2); // sub x14, x7, x1, sxtw #2 449 __ subs(r29, r3, r27, ext::sxth, 1); // subs x29, x3, x27, sxth #1 450 451 // ConditionalCompareOp 452 __ ccmnw(r0, r13, 14u, Assembler::MI); // ccmn w0, w13, #14, MI 453 __ ccmpw(r22, r18, 6u, Assembler::CC); // ccmp w22, w18, #6, CC 454 __ ccmn(r18, r30, 14u, Assembler::VS); // ccmn x18, x30, #14, VS 455 __ ccmp(r10, r19, 12u, Assembler::HI); // ccmp x10, x19, #12, HI 456 457 // ConditionalCompareImmedOp 458 __ ccmnw(r6, 18, 2, Assembler::LE); // ccmn w6, #18, #2, LE 459 __ ccmpw(r9, 13, 4, Assembler::HI); // ccmp w9, #13, #4, HI 460 __ ccmn(r21, 11, 11, Assembler::LO); // ccmn x21, #11, #11, LO 461 __ ccmp(r4, 13, 2, Assembler::VC); // ccmp x4, #13, #2, VC 462 463 // ConditionalSelectOp 464 __ cselw(r12, r2, r22, Assembler::HI); // csel w12, w2, w22, HI 465 __ csincw(r24, r16, r17, Assembler::HS); // csinc w24, w16, w17, HS 466 __ csinvw(r6, r7, r16, Assembler::LT); // csinv w6, w7, w16, LT 467 __ csnegw(r11, r27, r22, Assembler::LS); // csneg w11, w27, w22, LS 468 __ csel(r10, r3, r29, Assembler::LT); // csel x10, x3, x29, LT 469 __ csinc(r12, r26, r27, Assembler::CC); // csinc x12, x26, x27, CC 470 __ csinv(r15, r10, r21, Assembler::GT); // csinv x15, x10, x21, GT 471 __ csneg(r30, r23, r9, Assembler::GT); // csneg x30, x23, x9, GT 472 473 // TwoRegOp 474 __ rbitw(r30, r10); // rbit w30, w10 475 __ rev16w(r29, r15); // rev16 w29, w15 476 __ revw(r29, r30); // rev w29, w30 477 __ clzw(r25, r21); // clz w25, w21 478 __ clsw(r4, r0); // cls w4, w0 479 __ rbit(r18, r21); // rbit x18, x21 480 __ rev16(r29, r16); // rev16 x29, x16 481 __ rev32(r21, r20); // rev32 x21, x20 482 __ rev(r6, r19); // rev x6, x19 483 __ clz(r30, r3); // clz x30, x3 484 __ cls(r21, r19); // cls x21, x19 485 486 // ThreeRegOp 487 __ udivw(r11, r24, r0); // udiv w11, w24, w0 488 __ sdivw(r27, r25, r14); // sdiv w27, w25, w14 489 __ lslvw(r3, r14, r18); // lslv w3, w14, w18 490 __ lsrvw(r7, r15, r24); // lsrv w7, w15, w24 491 __ asrvw(r28, r17, r25); // asrv w28, w17, w25 492 __ rorvw(r2, r26, r28); // rorv w2, w26, w28 493 __ udiv(r5, r25, r26); // udiv x5, x25, x26 494 __ sdiv(r27, r16, r18); // sdiv x27, x16, x18 495 __ lslv(r6, r21, r12); // lslv x6, x21, x12 496 __ lsrv(r0, r4, r12); // lsrv x0, x4, x12 497 __ asrv(r27, r17, r28); // asrv x27, x17, x28 498 __ rorv(r28, r2, r18); // rorv x28, x2, x18 499 __ umulh(r10, r15, r14); // umulh x10, x15, x14 500 __ smulh(r14, r3, r25); // smulh x14, x3, x25 501 502 // FourRegMulOp 503 __ maddw(r15, r19, r14, r5); // madd w15, w19, w14, w5 504 __ msubw(r16, r4, r26, r25); // msub w16, w4, w26, w25 505 __ madd(r4, r2, r2, r12); // madd x4, x2, x2, x12 506 __ msub(r29, r17, r8, r7); // msub x29, x17, x8, x7 507 __ smaddl(r3, r4, r25, r4); // smaddl x3, w4, w25, x4 508 __ smsubl(r26, r25, r4, r17); // smsubl x26, w25, w4, x17 509 __ umaddl(r0, r26, r17, r23); // umaddl x0, w26, w17, x23 510 __ umsubl(r15, r21, r28, r17); // umsubl x15, w21, w28, x17 511 512 // ThreeRegFloatOp 513 __ fmuls(v27, v10, v3); // fmul s27, s10, s3 514 __ fdivs(v0, v7, v25); // fdiv s0, s7, s25 515 __ fadds(v9, v6, v15); // fadd s9, s6, s15 516 __ fsubs(v29, v15, v10); // fsub s29, s15, s10 517 __ fmuls(v2, v17, v7); // fmul s2, s17, s7 518 __ fmuld(v11, v11, v23); // fmul d11, d11, d23 519 __ fdivd(v7, v29, v23); // fdiv d7, d29, d23 520 __ faddd(v14, v27, v11); // fadd d14, d27, d11 521 __ fsubd(v11, v4, v24); // fsub d11, d4, d24 522 __ fmuld(v12, v15, v14); // fmul d12, d15, d14 523 524 // FourRegFloatOp 525 __ fmadds(v20, v11, v28, v13); // fmadd s20, s11, s28, s13 526 __ fmsubs(v11, v12, v23, v30); // fmsub s11, s12, s23, s30 527 __ fnmadds(v26, v14, v9, v13); // fnmadd s26, s14, s9, s13 528 __ fnmadds(v10, v7, v5, v29); // fnmadd s10, s7, s5, s29 529 __ fmaddd(v15, v3, v11, v12); // fmadd d15, d3, d11, d12 530 __ fmsubd(v15, v30, v30, v17); // fmsub d15, d30, d30, d17 531 __ fnmaddd(v19, v20, v15, v15); // fnmadd d19, d20, d15, d15 532 __ fnmaddd(v9, v21, v2, v9); // fnmadd d9, d21, d2, d9 533 534 // TwoRegFloatOp 535 __ fmovs(v27, v7); // fmov s27, s7 536 __ fabss(v29, v30); // fabs s29, s30 537 __ fnegs(v17, v1); // fneg s17, s1 538 __ fsqrts(v2, v6); // fsqrt s2, s6 539 __ fcvts(v10, v3); // fcvt d10, s3 540 __ fmovd(v24, v11); // fmov d24, d11 541 __ fabsd(v7, v1); // fabs d7, d1 542 __ fnegd(v11, v0); // fneg d11, d0 543 __ fsqrtd(v3, v18); // fsqrt d3, d18 544 __ fcvtd(v28, v6); // fcvt s28, d6 545 546 // FloatConvertOp 547 __ fcvtzsw(r22, v6); // fcvtzs w22, s6 548 __ fcvtzs(r0, v27); // fcvtzs x0, s27 549 __ fcvtzdw(r26, v2); // fcvtzs w26, d2 550 __ fcvtzd(r5, v7); // fcvtzs x5, d7 551 __ scvtfws(v28, r11); // scvtf s28, w11 552 __ scvtfs(v25, r13); // scvtf s25, x13 553 __ scvtfwd(v11, r23); // scvtf d11, w23 554 __ scvtfd(v19, r8); // scvtf d19, x8 555 __ fmovs(r18, v21); // fmov w18, s21 556 __ fmovd(r25, v20); // fmov x25, d20 557 __ fmovs(v19, r18); // fmov s19, w18 558 __ fmovd(v2, r29); // fmov d2, x29 559 560 // TwoRegFloatOp 561 __ fcmps(v22, v8); // fcmp s22, s8 562 __ fcmpd(v21, v19); // fcmp d21, d19 563 __ fcmps(v20, 0.0); // fcmp s20, #0.0 564 __ fcmpd(v11, 0.0); // fcmp d11, #0.0 565 566 // LoadStorePairOp 567 __ stpw(r20, r6, Address(r15, -32)); // stp w20, w6, [x15, #-32] 568 __ ldpw(r27, r14, Address(r3, -208)); // ldp w27, w14, [x3, #-208] 569 __ ldpsw(r17, r10, Address(r11, -80)); // ldpsw x17, x10, [x11, #-80] 570 __ stp(r7, r7, Address(r14, 64)); // stp x7, x7, [x14, #64] 571 __ ldp(r12, r23, Address(r0, 112)); // ldp x12, x23, [x0, #112] 572 573 // LoadStorePairOp 574 __ stpw(r13, r7, Address(__ pre(r6, -80))); // stp w13, w7, [x6, #-80]! 575 __ ldpw(r30, r16, Address(__ pre(r2, -144))); // ldp w30, w16, [x2, #-144]! 576 __ ldpsw(r4, r1, Address(__ pre(r26, -144))); // ldpsw x4, x1, [x26, #-144]! 577 __ stp(r23, r14, Address(__ pre(r11, 64))); // stp x23, x14, [x11, #64]! 578 __ ldp(r29, r27, Address(__ pre(r21, -192))); // ldp x29, x27, [x21, #-192]! 579 580 // LoadStorePairOp 581 __ stpw(r22, r5, Address(__ post(r21, -48))); // stp w22, w5, [x21], #-48 582 __ ldpw(r27, r17, Address(__ post(r6, -32))); // ldp w27, w17, [x6], #-32 583 __ ldpsw(r17, r6, Address(__ post(r1, -80))); // ldpsw x17, x6, [x1], #-80 584 __ stp(r13, r20, Address(__ post(r21, -208))); // stp x13, x20, [x21], #-208 585 __ ldp(r30, r27, Address(__ post(r10, 80))); // ldp x30, x27, [x10], #80 586 587 // LoadStorePairOp 588 __ stnpw(r5, r17, Address(r11, 16)); // stnp w5, w17, [x11, #16] 589 __ ldnpw(r14, r4, Address(r26, -96)); // ldnp w14, w4, [x26, #-96] 590 __ stnp(r23, r29, Address(r12, 32)); // stnp x23, x29, [x12, #32] 591 __ ldnp(r0, r6, Address(r21, -80)); // ldnp x0, x6, [x21, #-80] 592 593 // LdStSIMDOp 594 __ ld1(v15, __ T8B, Address(r26)); // ld1 {v15.8B}, [x26] 595 __ ld1(v23, v24, __ T16B, Address(__ post(r11, 32))); // ld1 {v23.16B, v24.16B}, [x11], 32 596 __ ld1(v8, v9, v10, __ T1D, Address(__ post(r23, r7))); // ld1 {v8.1D, v9.1D, v10.1D}, [x23], x7 597 __ ld1(v19, v20, v21, v22, __ T8H, Address(__ post(r25, 64))); // ld1 {v19.8H, v20.8H, v21.8H, v22.8H}, [x25], 64 598 __ ld1r(v29, __ T8B, Address(r17)); // ld1r {v29.8B}, [x17] 599 __ ld1r(v24, __ T4S, Address(__ post(r23, 4))); // ld1r {v24.4S}, [x23], 4 600 __ ld1r(v10, __ T1D, Address(__ post(r5, r25))); // ld1r {v10.1D}, [x5], x25 601 __ ld2(v18, v19, __ T2D, Address(r10)); // ld2 {v18.2D, v19.2D}, [x10] 602 __ ld2(v12, v13, __ T4H, Address(__ post(r15, 16))); // ld2 {v12.4H, v13.4H}, [x15], 16 603 __ ld2r(v25, v26, __ T16B, Address(r18)); // ld2r {v25.16B, v26.16B}, [x18] 604 __ ld2r(v1, v2, __ T2S, Address(__ post(r30, 8))); // ld2r {v1.2S, v2.2S}, [x30], 8 605 __ ld2r(v16, v17, __ T2D, Address(__ post(r18, r9))); // ld2r {v16.2D, v17.2D}, [x18], x9 606 __ ld3(v25, v26, v27, __ T4S, Address(__ post(r12, r2))); // ld3 {v25.4S, v26.4S, v27.4S}, [x12], x2 607 __ ld3(v26, v27, v28, __ T2S, Address(r19)); // ld3 {v26.2S, v27.2S, v28.2S}, [x19] 608 __ ld3r(v15, v16, v17, __ T8H, Address(r21)); // ld3r {v15.8H, v16.8H, v17.8H}, [x21] 609 __ ld3r(v25, v26, v27, __ T4S, Address(__ post(r13, 12))); // ld3r {v25.4S, v26.4S, v27.4S}, [x13], 12 610 __ ld3r(v14, v15, v16, __ T1D, Address(__ post(r28, r29))); // ld3r {v14.1D, v15.1D, v16.1D}, [x28], x29 611 __ ld4(v17, v18, v19, v20, __ T8H, Address(__ post(r29, 64))); // ld4 {v17.8H, v18.8H, v19.8H, v20.8H}, [x29], 64 612 __ ld4(v27, v28, v29, v30, __ T8B, Address(__ post(r7, r0))); // ld4 {v27.8B, v28.8B, v29.8B, v30.8B}, [x7], x0 613 __ ld4r(v24, v25, v26, v27, __ T8B, Address(r18)); // ld4r {v24.8B, v25.8B, v26.8B, v27.8B}, [x18] 614 __ ld4r(v0, v1, v2, v3, __ T4H, Address(__ post(r26, 8))); // ld4r {v0.4H, v1.4H, v2.4H, v3.4H}, [x26], 8 615 __ ld4r(v12, v13, v14, v15, __ T2S, Address(__ post(r25, r2))); // ld4r {v12.2S, v13.2S, v14.2S, v15.2S}, [x25], x2 616 617 // SHA512SIMDOp 618 __ sha512h(v22, __ T2D, v27, v4); // sha512h q22, q27, v4.2D 619 __ sha512h2(v7, __ T2D, v6, v1); // sha512h2 q7, q6, v1.2D 620 __ sha512su0(v26, __ T2D, v15); // sha512su0 v26.2D, v15.2D 621 __ sha512su1(v2, __ T2D, v13, v13); // sha512su1 v2.2D, v13.2D, v13.2D 622 623 // SpecialCases 624 __ ccmn(zr, zr, 3u, Assembler::LE); // ccmn xzr, xzr, #3, LE 625 __ ccmnw(zr, zr, 5u, Assembler::EQ); // ccmn wzr, wzr, #5, EQ 626 __ ccmp(zr, 1, 4u, Assembler::NE); // ccmp xzr, 1, #4, NE 627 __ ccmpw(zr, 2, 2, Assembler::GT); // ccmp wzr, 2, #2, GT 628 __ extr(zr, zr, zr, 0); // extr xzr, xzr, xzr, 0 629 __ stlxp(r0, zr, zr, sp); // stlxp w0, xzr, xzr, [sp] 630 __ stlxpw(r2, zr, zr, r3); // stlxp w2, wzr, wzr, [x3] 631 __ stxp(r4, zr, zr, r5); // stxp w4, xzr, xzr, [x5] 632 __ stxpw(r6, zr, zr, sp); // stxp w6, wzr, wzr, [sp] 633 __ dup(v0, __ T16B, zr); // dup v0.16b, wzr 634 __ mov(v1, __ T1D, 0, zr); // mov v1.d[0], xzr 635 __ mov(v1, __ T2S, 1, zr); // mov v1.s[1], wzr 636 __ mov(v1, __ T4H, 2, zr); // mov v1.h[2], wzr 637 __ mov(v1, __ T8B, 3, zr); // mov v1.b[3], wzr 638 __ ld1(v31, v0, __ T2D, Address(__ post(r1, r0))); // ld1 {v31.2d, v0.2d}, [x1], x0 639 640 // FloatImmediateOp 641 __ fmovd(v0, 2.0); // fmov d0, #2.0 642 __ fmovd(v0, 2.125); // fmov d0, #2.125 643 __ fmovd(v0, 4.0); // fmov d0, #4.0 644 __ fmovd(v0, 4.25); // fmov d0, #4.25 645 __ fmovd(v0, 8.0); // fmov d0, #8.0 646 __ fmovd(v0, 8.5); // fmov d0, #8.5 647 __ fmovd(v0, 16.0); // fmov d0, #16.0 648 __ fmovd(v0, 17.0); // fmov d0, #17.0 649 __ fmovd(v0, 0.125); // fmov d0, #0.125 650 __ fmovd(v0, 0.1328125); // fmov d0, #0.1328125 651 __ fmovd(v0, 0.25); // fmov d0, #0.25 652 __ fmovd(v0, 0.265625); // fmov d0, #0.265625 653 __ fmovd(v0, 0.5); // fmov d0, #0.5 654 __ fmovd(v0, 0.53125); // fmov d0, #0.53125 655 __ fmovd(v0, 1.0); // fmov d0, #1.0 656 __ fmovd(v0, 1.0625); // fmov d0, #1.0625 657 __ fmovd(v0, -2.0); // fmov d0, #-2.0 658 __ fmovd(v0, -2.125); // fmov d0, #-2.125 659 __ fmovd(v0, -4.0); // fmov d0, #-4.0 660 __ fmovd(v0, -4.25); // fmov d0, #-4.25 661 __ fmovd(v0, -8.0); // fmov d0, #-8.0 662 __ fmovd(v0, -8.5); // fmov d0, #-8.5 663 __ fmovd(v0, -16.0); // fmov d0, #-16.0 664 __ fmovd(v0, -17.0); // fmov d0, #-17.0 665 __ fmovd(v0, -0.125); // fmov d0, #-0.125 666 __ fmovd(v0, -0.1328125); // fmov d0, #-0.1328125 667 __ fmovd(v0, -0.25); // fmov d0, #-0.25 668 __ fmovd(v0, -0.265625); // fmov d0, #-0.265625 669 __ fmovd(v0, -0.5); // fmov d0, #-0.5 670 __ fmovd(v0, -0.53125); // fmov d0, #-0.53125 671 __ fmovd(v0, -1.0); // fmov d0, #-1.0 672 __ fmovd(v0, -1.0625); // fmov d0, #-1.0625 673 674 // LSEOp 675 __ swp(Assembler::xword, r24, r24, r4); // swp x24, x24, [x4] 676 __ ldadd(Assembler::xword, r20, r16, r0); // ldadd x20, x16, [x0] 677 __ ldbic(Assembler::xword, r4, r21, r11); // ldclr x4, x21, [x11] 678 __ ldeor(Assembler::xword, r30, r16, r22); // ldeor x30, x16, [x22] 679 __ ldorr(Assembler::xword, r4, r15, r23); // ldset x4, x15, [x23] 680 __ ldsmin(Assembler::xword, r26, r6, r12); // ldsmin x26, x6, [x12] 681 __ ldsmax(Assembler::xword, r15, r14, r15); // ldsmax x15, x14, [x15] 682 __ ldumin(Assembler::xword, r9, r25, r29); // ldumin x9, x25, [x29] 683 __ ldumax(Assembler::xword, r11, r20, r12); // ldumax x11, x20, [x12] 684 685 // LSEOp 686 __ swpa(Assembler::xword, r18, r22, r16); // swpa x18, x22, [x16] 687 __ ldadda(Assembler::xword, r21, r24, r26); // ldadda x21, x24, [x26] 688 __ ldbica(Assembler::xword, r6, r6, r16); // ldclra x6, x6, [x16] 689 __ ldeora(Assembler::xword, r16, r25, r16); // ldeora x16, x25, [x16] 690 __ ldorra(Assembler::xword, r28, r24, r16); // ldseta x28, x24, [x16] 691 __ ldsmina(Assembler::xword, r26, r15, r10); // ldsmina x26, x15, [x10] 692 __ ldsmaxa(Assembler::xword, r13, r14, r20); // ldsmaxa x13, x14, [x20] 693 __ ldumina(Assembler::xword, r1, r23, r30); // ldumina x1, x23, [x30] 694 __ ldumaxa(Assembler::xword, r14, r2, r6); // ldumaxa x14, x2, [x6] 695 696 // LSEOp 697 __ swpal(Assembler::xword, r3, r8, r25); // swpal x3, x8, [x25] 698 __ ldaddal(Assembler::xword, r0, r27, r30); // ldaddal x0, x27, [x30] 699 __ ldbical(Assembler::xword, r5, r5, r30); // ldclral x5, x5, [x30] 700 __ ldeoral(Assembler::xword, r11, r25, r0); // ldeoral x11, x25, [x0] 701 __ ldorral(Assembler::xword, zr, r0, r19); // ldsetal xzr, x0, [x19] 702 __ ldsminal(Assembler::xword, r29, r26, r9); // ldsminal x29, x26, [x9] 703 __ ldsmaxal(Assembler::xword, r26, r12, r15); // ldsmaxal x26, x12, [x15] 704 __ lduminal(Assembler::xword, r11, r11, r18); // lduminal x11, x11, [x18] 705 __ ldumaxal(Assembler::xword, r25, r22, r24); // ldumaxal x25, x22, [x24] 706 707 // LSEOp 708 __ swpl(Assembler::xword, r0, r17, r11); // swpl x0, x17, [x11] 709 __ ldaddl(Assembler::xword, r6, r29, r6); // ldaddl x6, x29, [x6] 710 __ ldbicl(Assembler::xword, r5, r5, r21); // ldclrl x5, x5, [x21] 711 __ ldeorl(Assembler::xword, r19, r16, r18); // ldeorl x19, x16, [x18] 712 __ ldorrl(Assembler::xword, r30, r27, r28); // ldsetl x30, x27, [x28] 713 __ ldsminl(Assembler::xword, r1, r28, r1); // ldsminl x1, x28, [x1] 714 __ ldsmaxl(Assembler::xword, r20, r29, r16); // ldsmaxl x20, x29, [x16] 715 __ lduminl(Assembler::xword, r13, r10, r29); // lduminl x13, x10, [x29] 716 __ ldumaxl(Assembler::xword, r29, r19, r22); // ldumaxl x29, x19, [x22] 717 718 // LSEOp 719 __ swp(Assembler::word, r10, r4, sp); // swp w10, w4, [sp] 720 __ ldadd(Assembler::word, r21, r8, sp); // ldadd w21, w8, [sp] 721 __ ldbic(Assembler::word, r19, r10, r28); // ldclr w19, w10, [x28] 722 __ ldeor(Assembler::word, r2, r25, r5); // ldeor w2, w25, [x5] 723 __ ldorr(Assembler::word, r3, r8, r22); // ldset w3, w8, [x22] 724 __ ldsmin(Assembler::word, r19, r13, r5); // ldsmin w19, w13, [x5] 725 __ ldsmax(Assembler::word, r29, r24, r21); // ldsmax w29, w24, [x21] 726 __ ldumin(Assembler::word, r26, r24, r3); // ldumin w26, w24, [x3] 727 __ ldumax(Assembler::word, r24, r26, r23); // ldumax w24, w26, [x23] 728 729 // LSEOp 730 __ swpa(Assembler::word, r15, r21, r3); // swpa w15, w21, [x3] 731 __ ldadda(Assembler::word, r24, r8, r25); // ldadda w24, w8, [x25] 732 __ ldbica(Assembler::word, r20, r16, r17); // ldclra w20, w16, [x17] 733 __ ldeora(Assembler::word, r2, r1, r0); // ldeora w2, w1, [x0] 734 __ ldorra(Assembler::word, r24, r4, r3); // ldseta w24, w4, [x3] 735 __ ldsmina(Assembler::word, r12, zr, r28); // ldsmina w12, wzr, [x28] 736 __ ldsmaxa(Assembler::word, r10, r26, r2); // ldsmaxa w10, w26, [x2] 737 __ ldumina(Assembler::word, r12, r18, sp); // ldumina w12, w18, [sp] 738 __ ldumaxa(Assembler::word, r1, r13, r29); // ldumaxa w1, w13, [x29] 739 740 // LSEOp 741 __ swpal(Assembler::word, r0, r19, r12); // swpal w0, w19, [x12] 742 __ ldaddal(Assembler::word, r17, r22, r13); // ldaddal w17, w22, [x13] 743 __ ldbical(Assembler::word, r28, r30, sp); // ldclral w28, w30, [sp] 744 __ ldeoral(Assembler::word, r1, r26, r28); // ldeoral w1, w26, [x28] 745 __ ldorral(Assembler::word, r4, r30, r4); // ldsetal w4, w30, [x4] 746 __ ldsminal(Assembler::word, r6, r30, r26); // ldsminal w6, w30, [x26] 747 __ ldsmaxal(Assembler::word, r18, r9, r8); // ldsmaxal w18, w9, [x8] 748 __ lduminal(Assembler::word, r12, r0, r20); // lduminal w12, w0, [x20] 749 __ ldumaxal(Assembler::word, r1, r24, r2); // ldumaxal w1, w24, [x2] 750 751 // LSEOp 752 __ swpl(Assembler::word, r0, r9, r24); // swpl w0, w9, [x24] 753 __ ldaddl(Assembler::word, r26, r16, r30); // ldaddl w26, w16, [x30] 754 __ ldbicl(Assembler::word, r3, r10, r23); // ldclrl w3, w10, [x23] 755 __ ldeorl(Assembler::word, r10, r4, r18); // ldeorl w10, w4, [x18] 756 __ ldorrl(Assembler::word, r2, r11, r8); // ldsetl w2, w11, [x8] 757 __ ldsminl(Assembler::word, r10, r15, r17); // ldsminl w10, w15, [x17] 758 __ ldsmaxl(Assembler::word, r2, r10, r12); // ldsmaxl w2, w10, [x12] 759 __ lduminl(Assembler::word, r12, r15, r13); // lduminl w12, w15, [x13] 760 __ ldumaxl(Assembler::word, r2, r7, r20); // ldumaxl w2, w7, [x20] 761 762 __ bind(forth); 763 764 /* 765 aarch64ops.o: file format elf64-littleaarch64 766 767 768 Disassembly of section .text: 769 770 0000000000000000 <back>: 771 0: 8b0d82fa add x26, x23, x13, lsl #32 772 4: cb49970c sub x12, x24, x9, lsr #37 773 8: ab889dfc adds x28, x15, x8, asr #39 774 c: eb9ee787 subs x7, x28, x30, asr #57 775 10: 0b9b3ec9 add w9, w22, w27, asr #15 776 14: 4b9279a3 sub w3, w13, w18, asr #30 777 18: 2b88474e adds w14, w26, w8, asr #17 778 1c: 6b8c56c0 subs w0, w22, w12, asr #21 779 20: 8a1a51e0 and x0, x15, x26, lsl #20 780 24: aa11f4ba orr x26, x5, x17, lsl #61 781 28: ca0281b8 eor x24, x13, x2, lsl #32 782 2c: ea918c7c ands x28, x3, x17, asr #35 783 30: 0a5d4a19 and w25, w16, w29, lsr #18 784 34: 2a4b264d orr w13, w18, w11, lsr #9 785 38: 4a523ca5 eor w5, w5, w18, lsr #15 786 3c: 6a9b6ae2 ands w2, w23, w27, asr #26 787 40: 8a70b79b bic x27, x28, x16, lsr #45 788 44: aaba9728 orn x8, x25, x26, asr #37 789 48: ca6dfe3d eon x29, x17, x13, lsr #63 790 4c: ea627f1c bics x28, x24, x2, lsr #31 791 50: 0aa70f53 bic w19, w26, w7, asr #3 792 54: 2aaa0f06 orn w6, w24, w10, asr #3 793 58: 4a6176a4 eon w4, w21, w1, lsr #29 794 5c: 6a604eb0 bics w16, w21, w0, lsr #19 795 60: 1105ed91 add w17, w12, #0x17b 796 64: 3100583e adds w30, w1, #0x16 797 68: 5101f8bd sub w29, w5, #0x7e 798 6c: 710f0306 subs w6, w24, #0x3c0 799 70: 9101a1a0 add x0, x13, #0x68 800 74: b10a5cc8 adds x8, x6, #0x297 801 78: d10810aa sub x10, x5, #0x204 802 7c: f10fd061 subs x1, x3, #0x3f4 803 80: 120cb166 and w6, w11, #0xfff1fff1 804 84: 321764bc orr w28, w5, #0xfffffe07 805 88: 52174681 eor w1, w20, #0x7fffe00 806 8c: 720c0247 ands w7, w18, #0x100000 807 90: 9241018e and x14, x12, #0x8000000000000000 808 94: b25a2969 orr x9, x11, #0x1ffc000000000 809 98: d278b411 eor x17, x0, #0x3fffffffffff00 810 9c: f26aad01 ands x1, x8, #0xffffffffffc00003 811 a0: 14000000 b a0 <back+0xa0> 812 a4: 17ffffd7 b 0 <back> 813 a8: 140001f2 b 870 <forth> 814 ac: 94000000 bl ac <back+0xac> 815 b0: 97ffffd4 bl 0 <back> 816 b4: 940001ef bl 870 <forth> 817 b8: 3400000a cbz w10, b8 <back+0xb8> 818 bc: 34fffa2a cbz w10, 0 <back> 819 c0: 34003d8a cbz w10, 870 <forth> 820 c4: 35000008 cbnz w8, c4 <back+0xc4> 821 c8: 35fff9c8 cbnz w8, 0 <back> 822 cc: 35003d28 cbnz w8, 870 <forth> 823 d0: b400000b cbz x11, d0 <back+0xd0> 824 d4: b4fff96b cbz x11, 0 <back> 825 d8: b4003ccb cbz x11, 870 <forth> 826 dc: b500001d cbnz x29, dc <back+0xdc> 827 e0: b5fff91d cbnz x29, 0 <back> 828 e4: b5003c7d cbnz x29, 870 <forth> 829 e8: 10000013 adr x19, e8 <back+0xe8> 830 ec: 10fff8b3 adr x19, 0 <back> 831 f0: 10003c13 adr x19, 870 <forth> 832 f4: 90000013 adrp x19, 0 <back> 833 f8: 36300016 tbz w22, #6, f8 <back+0xf8> 834 fc: 3637f836 tbz w22, #6, 0 <back> 835 100: 36303b96 tbz w22, #6, 870 <forth> 836 104: 3758000c tbnz w12, #11, 104 <back+0x104> 837 108: 375ff7cc tbnz w12, #11, 0 <back> 838 10c: 37583b2c tbnz w12, #11, 870 <forth> 839 110: 128313a0 mov w0, #0xffffe762 // #-6302 840 114: 528a32c7 mov w7, #0x5196 // #20886 841 118: 7289173b movk w27, #0x48b9 842 11c: 92ab3acc mov x12, #0xffffffffa629ffff // #-1507196929 843 120: d2a0bf94 mov x20, #0x5fc0000 // #100401152 844 124: f2c285e8 movk x8, #0x142f, lsl #32 845 128: 9358722f sbfx x15, x17, #24, #5 846 12c: 330e652f bfxil w15, w9, #14, #12 847 130: 53067f3b lsr w27, w25, #6 848 134: 93577c53 sbfx x19, x2, #23, #9 849 138: b34a1aac bfi x12, x21, #54, #7 850 13c: d35a4016 ubfiz x22, x0, #38, #17 851 140: 13946c63 extr w3, w3, w20, #27 852 144: 93c3dbc8 extr x8, x30, x3, #54 853 148: 54000000 b.eq 148 <back+0x148> // b.none 854 14c: 54fff5a0 b.eq 0 <back> // b.none 855 150: 54003900 b.eq 870 <forth> // b.none 856 154: 54000001 b.ne 154 <back+0x154> // b.any 857 158: 54fff541 b.ne 0 <back> // b.any 858 15c: 540038a1 b.ne 870 <forth> // b.any 859 160: 54000002 b.cs 160 <back+0x160> // b.hs, b.nlast 860 164: 54fff4e2 b.cs 0 <back> // b.hs, b.nlast 861 168: 54003842 b.cs 870 <forth> // b.hs, b.nlast 862 16c: 54000002 b.cs 16c <back+0x16c> // b.hs, b.nlast 863 170: 54fff482 b.cs 0 <back> // b.hs, b.nlast 864 174: 540037e2 b.cs 870 <forth> // b.hs, b.nlast 865 178: 54000003 b.cc 178 <back+0x178> // b.lo, b.ul, b.last 866 17c: 54fff423 b.cc 0 <back> // b.lo, b.ul, b.last 867 180: 54003783 b.cc 870 <forth> // b.lo, b.ul, b.last 868 184: 54000003 b.cc 184 <back+0x184> // b.lo, b.ul, b.last 869 188: 54fff3c3 b.cc 0 <back> // b.lo, b.ul, b.last 870 18c: 54003723 b.cc 870 <forth> // b.lo, b.ul, b.last 871 190: 54000004 b.mi 190 <back+0x190> // b.first 872 194: 54fff364 b.mi 0 <back> // b.first 873 198: 540036c4 b.mi 870 <forth> // b.first 874 19c: 54000005 b.pl 19c <back+0x19c> // b.nfrst 875 1a0: 54fff305 b.pl 0 <back> // b.nfrst 876 1a4: 54003665 b.pl 870 <forth> // b.nfrst 877 1a8: 54000006 b.vs 1a8 <back+0x1a8> 878 1ac: 54fff2a6 b.vs 0 <back> 879 1b0: 54003606 b.vs 870 <forth> 880 1b4: 54000007 b.vc 1b4 <back+0x1b4> 881 1b8: 54fff247 b.vc 0 <back> 882 1bc: 540035a7 b.vc 870 <forth> 883 1c0: 54000008 b.hi 1c0 <back+0x1c0> // b.pmore 884 1c4: 54fff1e8 b.hi 0 <back> // b.pmore 885 1c8: 54003548 b.hi 870 <forth> // b.pmore 886 1cc: 54000009 b.ls 1cc <back+0x1cc> // b.plast 887 1d0: 54fff189 b.ls 0 <back> // b.plast 888 1d4: 540034e9 b.ls 870 <forth> // b.plast 889 1d8: 5400000a b.ge 1d8 <back+0x1d8> // b.tcont 890 1dc: 54fff12a b.ge 0 <back> // b.tcont 891 1e0: 5400348a b.ge 870 <forth> // b.tcont 892 1e4: 5400000b b.lt 1e4 <back+0x1e4> // b.tstop 893 1e8: 54fff0cb b.lt 0 <back> // b.tstop 894 1ec: 5400342b b.lt 870 <forth> // b.tstop 895 1f0: 5400000c b.gt 1f0 <back+0x1f0> 896 1f4: 54fff06c b.gt 0 <back> 897 1f8: 540033cc b.gt 870 <forth> 898 1fc: 5400000d b.le 1fc <back+0x1fc> 899 200: 54fff00d b.le 0 <back> 900 204: 5400336d b.le 870 <forth> 901 208: 5400000e b.al 208 <back+0x208> 902 20c: 54ffefae b.al 0 <back> 903 210: 5400330e b.al 870 <forth> 904 214: 5400000f b.nv 214 <back+0x214> 905 218: 54ffef4f b.nv 0 <back> 906 21c: 540032af b.nv 870 <forth> 907 220: d40658e1 svc #0x32c7 908 224: d4014d22 hvc #0xa69 909 228: d4046543 smc #0x232a 910 22c: d4273f60 brk #0x39fb 911 230: d44cad80 hlt #0x656c 912 234: d503201f nop 913 238: d69f03e0 eret 914 23c: d6bf03e0 drps 915 240: d5033fdf isb 916 244: d5033e9f dsb st 917 248: d50332bf dmb oshst 918 24c: d61f0200 br x16 919 250: d63f0280 blr x20 920 254: c80a7d1b stxr w10, x27, [x8] 921 258: c800fea1 stlxr w0, x1, [x21] 922 25c: c85f7fb1 ldxr x17, [x29] 923 260: c85fff9d ldaxr x29, [x28] 924 264: c89ffee1 stlr x1, [x23] 925 268: c8dffe95 ldar x21, [x20] 926 26c: 88167e7b stxr w22, w27, [x19] 927 270: 880bfcd0 stlxr w11, w16, [x6] 928 274: 885f7c12 ldxr w18, [x0] 929 278: 885ffd44 ldaxr w4, [x10] 930 27c: 889ffed8 stlr w24, [x22] 931 280: 88dffe6a ldar w10, [x19] 932 284: 48017fc5 stxrh w1, w5, [x30] 933 288: 4808fe2c stlxrh w8, w12, [x17] 934 28c: 485f7dc9 ldxrh w9, [x14] 935 290: 485ffc27 ldaxrh w7, [x1] 936 294: 489ffe05 stlrh w5, [x16] 937 298: 48dffd82 ldarh w2, [x12] 938 29c: 080a7c6c stxrb w10, w12, [x3] 939 2a0: 081cff4e stlxrb w28, w14, [x26] 940 2a4: 085f7d5e ldxrb w30, [x10] 941 2a8: 085ffeae ldaxrb w14, [x21] 942 2ac: 089ffd2d stlrb w13, [x9] 943 2b0: 08dfff76 ldarb w22, [x27] 944 2b4: c87f4d7c ldxp x28, x19, [x11] 945 2b8: c87fcc5e ldaxp x30, x19, [x2] 946 2bc: c8220417 stxp w2, x23, x1, [x0] 947 2c0: c82cb5f0 stlxp w12, x16, x13, [x15] 948 2c4: 887f55b2 ldxp w18, w21, [x13] 949 2c8: 887ff90b ldaxp w11, w30, [x8] 950 2cc: 88382c2d stxp w24, w13, w11, [x1] 951 2d0: 883aedb5 stlxp w26, w21, w27, [x13] 952 2d4: f819928b stur x11, [x20, #-103] 953 2d8: b803e21c stur w28, [x16, #62] 954 2dc: 381f713b sturb w27, [x9, #-9] 955 2e0: 781ce322 sturh w2, [x25, #-50] 956 2e4: f850f044 ldur x4, [x2, #-241] 957 2e8: b85e129e ldur w30, [x20, #-31] 958 2ec: 385e92f2 ldurb w18, [x23, #-23] 959 2f0: 785ff35d ldurh w29, [x26, #-1] 960 2f4: 39801921 ldrsb x1, [x9, #6] 961 2f8: 7881318b ldursh x11, [x12, #19] 962 2fc: 78dce02b ldursh w11, [x1, #-50] 963 300: b8829313 ldursw x19, [x24, #41] 964 304: fc45f318 ldur d24, [x24, #95] 965 308: bc5d50af ldur s15, [x5, #-43] 966 30c: fc001375 stur d21, [x27, #1] 967 310: bc1951b7 stur s23, [x13, #-107] 968 314: f8008c0b str x11, [x0, #8]! 969 318: b801dc03 str w3, [x0, #29]! 970 31c: 38009dcb strb w11, [x14, #9]! 971 320: 781fdf1d strh w29, [x24, #-3]! 972 324: f8570e2d ldr x13, [x17, #-144]! 973 328: b85faecc ldr w12, [x22, #-6]! 974 32c: 385f6d8d ldrb w13, [x12, #-10]! 975 330: 785ebea0 ldrh w0, [x21, #-21]! 976 334: 38804cf7 ldrsb x23, [x7, #4]! 977 338: 789cbce3 ldrsh x3, [x7, #-53]! 978 33c: 78df9cbc ldrsh w28, [x5, #-7]! 979 340: b89eed38 ldrsw x24, [x9, #-18]! 980 344: fc40cd6e ldr d14, [x11, #12]! 981 348: bc5bdd93 ldr s19, [x12, #-67]! 982 34c: fc103c14 str d20, [x0, #-253]! 983 350: bc040c08 str s8, [x0, #64]! 984 354: f81a2784 str x4, [x28], #-94 985 358: b81ca4ec str w12, [x7], #-54 986 35c: 381e855b strb w27, [x10], #-24 987 360: 7801b506 strh w6, [x8], #27 988 364: f853654e ldr x14, [x10], #-202 989 368: b85d74b0 ldr w16, [x5], #-41 990 36c: 384095c2 ldrb w2, [x14], #9 991 370: 785ec5bc ldrh w28, [x13], #-20 992 374: 389e15a9 ldrsb x9, [x13], #-31 993 378: 789dc703 ldrsh x3, [x24], #-36 994 37c: 78c06474 ldrsh w20, [x3], #6 995 380: b89ff667 ldrsw x7, [x19], #-1 996 384: fc57e51e ldr d30, [x8], #-130 997 388: bc4155f9 ldr s25, [x15], #21 998 38c: fc05a6ee str d14, [x23], #90 999 390: bc1df408 str s8, [x0], #-33 1000 394: f835da4a str x10, [x18, w21, sxtw #3] 1001 398: b836d9a4 str w4, [x13, w22, sxtw #2] 1002 39c: 3833580d strb w13, [x0, w19, uxtw #0] 1003 3a0: 7826cb6c strh w12, [x27, w6, sxtw] 1004 3a4: f8706900 ldr x0, [x8, x16] 1005 3a8: b87ae880 ldr w0, [x4, x26, sxtx] 1006 3ac: 3865db2e ldrb w14, [x25, w5, sxtw #0] 1007 3b0: 78724889 ldrh w9, [x4, w18, uxtw] 1008 3b4: 38a7789b ldrsb x27, [x4, x7, lsl #0] 1009 3b8: 78beca2f ldrsh x15, [x17, w30, sxtw] 1010 3bc: 78f6c810 ldrsh w16, [x0, w22, sxtw] 1011 3c0: b8bef956 ldrsw x22, [x10, x30, sxtx #2] 1012 3c4: fc6afabd ldr d29, [x21, x10, sxtx #3] 1013 3c8: bc734963 ldr s3, [x11, w19, uxtw] 1014 3cc: fc3d5b8d str d13, [x28, w29, uxtw #3] 1015 3d0: bc25fbb7 str s23, [x29, x5, sxtx #2] 1016 3d4: f9189d05 str x5, [x8, #12600] 1017 3d8: b91ecb1d str w29, [x24, #7880] 1018 3dc: 39187a33 strb w19, [x17, #1566] 1019 3e0: 791f226d strh w13, [x19, #3984] 1020 3e4: f95aa2f3 ldr x19, [x23, #13632] 1021 3e8: b9587bb7 ldr w23, [x29, #6264] 1022 3ec: 395f7176 ldrb w22, [x11, #2012] 1023 3f0: 795d9143 ldrh w3, [x10, #3784] 1024 3f4: 399e7e08 ldrsb x8, [x16, #1951] 1025 3f8: 799a2697 ldrsh x23, [x20, #3346] 1026 3fc: 79df3422 ldrsh w2, [x1, #3994] 1027 400: b99c2624 ldrsw x4, [x17, #7204] 1028 404: fd5c2374 ldr d20, [x27, #14400] 1029 408: bd5fa1d9 ldr s25, [x14, #8096] 1030 40c: fd1d595a str d26, [x10, #15024] 1031 410: bd1b1869 str s9, [x3, #6936] 1032 414: 580022fb ldr x27, 870 <forth> 1033 418: 1800000b ldr w11, 418 <back+0x418> 1034 41c: f8945060 prfum pldl1keep, [x3, #-187] 1035 420: d8000000 prfm pldl1keep, 420 <back+0x420> 1036 424: f8ae6ba0 prfm pldl1keep, [x29, x14] 1037 428: f99a0080 prfm pldl1keep, [x4, #13312] 1038 42c: 1a070035 adc w21, w1, w7 1039 430: 3a0700a8 adcs w8, w5, w7 1040 434: 5a0e0367 sbc w7, w27, w14 1041 438: 7a11009b sbcs w27, w4, w17 1042 43c: 9a000380 adc x0, x28, x0 1043 440: ba1e030c adcs x12, x24, x30 1044 444: da0f0320 sbc x0, x25, x15 1045 448: fa030301 sbcs x1, x24, x3 1046 44c: 0b340b12 add w18, w24, w20, uxtb #2 1047 450: 2b2a278d adds w13, w28, w10, uxth #1 1048 454: cb22aa0f sub x15, x16, w2, sxth #2 1049 458: 6b2d29bd subs w29, w13, w13, uxth #2 1050 45c: 8b2cce8c add x12, x20, w12, sxtw #3 1051 460: ab2b877e adds x30, x27, w11, sxtb #1 1052 464: cb21c8ee sub x14, x7, w1, sxtw #2 1053 468: eb3ba47d subs x29, x3, w27, sxth #1 1054 46c: 3a4d400e ccmn w0, w13, #0xe, mi // mi = first 1055 470: 7a5232c6 ccmp w22, w18, #0x6, cc // cc = lo, ul, last 1056 474: ba5e624e ccmn x18, x30, #0xe, vs 1057 478: fa53814c ccmp x10, x19, #0xc, hi // hi = pmore 1058 47c: 3a52d8c2 ccmn w6, #0x12, #0x2, le 1059 480: 7a4d8924 ccmp w9, #0xd, #0x4, hi // hi = pmore 1060 484: ba4b3aab ccmn x21, #0xb, #0xb, cc // cc = lo, ul, last 1061 488: fa4d7882 ccmp x4, #0xd, #0x2, vc 1062 48c: 1a96804c csel w12, w2, w22, hi // hi = pmore 1063 490: 1a912618 csinc w24, w16, w17, cs // cs = hs, nlast 1064 494: 5a90b0e6 csinv w6, w7, w16, lt // lt = tstop 1065 498: 5a96976b csneg w11, w27, w22, ls // ls = plast 1066 49c: 9a9db06a csel x10, x3, x29, lt // lt = tstop 1067 4a0: 9a9b374c csinc x12, x26, x27, cc // cc = lo, ul, last 1068 4a4: da95c14f csinv x15, x10, x21, gt 1069 4a8: da89c6fe csneg x30, x23, x9, gt 1070 4ac: 5ac0015e rbit w30, w10 1071 4b0: 5ac005fd rev16 w29, w15 1072 4b4: 5ac00bdd rev w29, w30 1073 4b8: 5ac012b9 clz w25, w21 1074 4bc: 5ac01404 cls w4, w0 1075 4c0: dac002b2 rbit x18, x21 1076 4c4: dac0061d rev16 x29, x16 1077 4c8: dac00a95 rev32 x21, x20 1078 4cc: dac00e66 rev x6, x19 1079 4d0: dac0107e clz x30, x3 1080 4d4: dac01675 cls x21, x19 1081 4d8: 1ac00b0b udiv w11, w24, w0 1082 4dc: 1ace0f3b sdiv w27, w25, w14 1083 4e0: 1ad221c3 lsl w3, w14, w18 1084 4e4: 1ad825e7 lsr w7, w15, w24 1085 4e8: 1ad92a3c asr w28, w17, w25 1086 4ec: 1adc2f42 ror w2, w26, w28 1087 4f0: 9ada0b25 udiv x5, x25, x26 1088 4f4: 9ad20e1b sdiv x27, x16, x18 1089 4f8: 9acc22a6 lsl x6, x21, x12 1090 4fc: 9acc2480 lsr x0, x4, x12 1091 500: 9adc2a3b asr x27, x17, x28 1092 504: 9ad22c5c ror x28, x2, x18 1093 508: 9bce7dea umulh x10, x15, x14 1094 50c: 9b597c6e smulh x14, x3, x25 1095 510: 1b0e166f madd w15, w19, w14, w5 1096 514: 1b1ae490 msub w16, w4, w26, w25 1097 518: 9b023044 madd x4, x2, x2, x12 1098 51c: 9b089e3d msub x29, x17, x8, x7 1099 520: 9b391083 smaddl x3, w4, w25, x4 1100 524: 9b24c73a smsubl x26, w25, w4, x17 1101 528: 9bb15f40 umaddl x0, w26, w17, x23 1102 52c: 9bbcc6af umsubl x15, w21, w28, x17 1103 530: 1e23095b fmul s27, s10, s3 1104 534: 1e3918e0 fdiv s0, s7, s25 1105 538: 1e2f28c9 fadd s9, s6, s15 1106 53c: 1e2a39fd fsub s29, s15, s10 1107 540: 1e270a22 fmul s2, s17, s7 1108 544: 1e77096b fmul d11, d11, d23 1109 548: 1e771ba7 fdiv d7, d29, d23 1110 54c: 1e6b2b6e fadd d14, d27, d11 1111 550: 1e78388b fsub d11, d4, d24 1112 554: 1e6e09ec fmul d12, d15, d14 1113 558: 1f1c3574 fmadd s20, s11, s28, s13 1114 55c: 1f17f98b fmsub s11, s12, s23, s30 1115 560: 1f2935da fnmadd s26, s14, s9, s13 1116 564: 1f2574ea fnmadd s10, s7, s5, s29 1117 568: 1f4b306f fmadd d15, d3, d11, d12 1118 56c: 1f5ec7cf fmsub d15, d30, d30, d17 1119 570: 1f6f3e93 fnmadd d19, d20, d15, d15 1120 574: 1f6226a9 fnmadd d9, d21, d2, d9 1121 578: 1e2040fb fmov s27, s7 1122 57c: 1e20c3dd fabs s29, s30 1123 580: 1e214031 fneg s17, s1 1124 584: 1e21c0c2 fsqrt s2, s6 1125 588: 1e22c06a fcvt d10, s3 1126 58c: 1e604178 fmov d24, d11 1127 590: 1e60c027 fabs d7, d1 1128 594: 1e61400b fneg d11, d0 1129 598: 1e61c243 fsqrt d3, d18 1130 59c: 1e6240dc fcvt s28, d6 1131 5a0: 1e3800d6 fcvtzs w22, s6 1132 5a4: 9e380360 fcvtzs x0, s27 1133 5a8: 1e78005a fcvtzs w26, d2 1134 5ac: 9e7800e5 fcvtzs x5, d7 1135 5b0: 1e22017c scvtf s28, w11 1136 5b4: 9e2201b9 scvtf s25, x13 1137 5b8: 1e6202eb scvtf d11, w23 1138 5bc: 9e620113 scvtf d19, x8 1139 5c0: 1e2602b2 fmov w18, s21 1140 5c4: 9e660299 fmov x25, d20 1141 5c8: 1e270253 fmov s19, w18 1142 5cc: 9e6703a2 fmov d2, x29 1143 5d0: 1e2822c0 fcmp s22, s8 1144 5d4: 1e7322a0 fcmp d21, d19 1145 5d8: 1e202288 fcmp s20, #0.0 1146 5dc: 1e602168 fcmp d11, #0.0 1147 5e0: 293c19f4 stp w20, w6, [x15, #-32] 1148 5e4: 2966387b ldp w27, w14, [x3, #-208] 1149 5e8: 69762971 ldpsw x17, x10, [x11, #-80] 1150 5ec: a9041dc7 stp x7, x7, [x14, #64] 1151 5f0: a9475c0c ldp x12, x23, [x0, #112] 1152 5f4: 29b61ccd stp w13, w7, [x6, #-80]! 1153 5f8: 29ee405e ldp w30, w16, [x2, #-144]! 1154 5fc: 69ee0744 ldpsw x4, x1, [x26, #-144]! 1155 600: a9843977 stp x23, x14, [x11, #64]! 1156 604: a9f46ebd ldp x29, x27, [x21, #-192]! 1157 608: 28ba16b6 stp w22, w5, [x21], #-48 1158 60c: 28fc44db ldp w27, w17, [x6], #-32 1159 610: 68f61831 ldpsw x17, x6, [x1], #-80 1160 614: a8b352ad stp x13, x20, [x21], #-208 1161 618: a8c56d5e ldp x30, x27, [x10], #80 1162 61c: 28024565 stnp w5, w17, [x11, #16] 1163 620: 2874134e ldnp w14, w4, [x26, #-96] 1164 624: a8027597 stnp x23, x29, [x12, #32] 1165 628: a87b1aa0 ldnp x0, x6, [x21, #-80] 1166 62c: 0c40734f ld1 {v15.8b}, [x26] 1167 630: 4cdfa177 ld1 {v23.16b, v24.16b}, [x11], #32 1168 634: 0cc76ee8 ld1 {v8.1d-v10.1d}, [x23], x7 1169 638: 4cdf2733 ld1 {v19.8h-v22.8h}, [x25], #64 1170 63c: 0d40c23d ld1r {v29.8b}, [x17] 1171 640: 4ddfcaf8 ld1r {v24.4s}, [x23], #4 1172 644: 0dd9ccaa ld1r {v10.1d}, [x5], x25 1173 648: 4c408d52 ld2 {v18.2d, v19.2d}, [x10] 1174 64c: 0cdf85ec ld2 {v12.4h, v13.4h}, [x15], #16 1175 650: 4d60c259 ld2r {v25.16b, v26.16b}, [x18] 1176 654: 0dffcbc1 ld2r {v1.2s, v2.2s}, [x30], #8 1177 658: 4de9ce50 ld2r {v16.2d, v17.2d}, [x18], x9 1178 65c: 4cc24999 ld3 {v25.4s-v27.4s}, [x12], x2 1179 660: 0c404a7a ld3 {v26.2s-v28.2s}, [x19] 1180 664: 4d40e6af ld3r {v15.8h-v17.8h}, [x21] 1181 668: 4ddfe9b9 ld3r {v25.4s-v27.4s}, [x13], #12 1182 66c: 0dddef8e ld3r {v14.1d-v16.1d}, [x28], x29 1183 670: 4cdf07b1 ld4 {v17.8h-v20.8h}, [x29], #64 1184 674: 0cc000fb ld4 {v27.8b-v30.8b}, [x7], x0 1185 678: 0d60e258 ld4r {v24.8b-v27.8b}, [x18] 1186 67c: 0dffe740 ld4r {v0.4h-v3.4h}, [x26], #8 1187 680: 0de2eb2c ld4r {v12.2s-v15.2s}, [x25], x2 1188 684: ce648376 sha512h q22, q27, v4.2d 1189 688: ce6184c7 sha512h2 q7, q6, v1.2d 1190 68c: cec081fa sha512su0 v26.2d, v15.2d 1191 690: ce6d89a2 sha512su1 v2.2d, v13.2d, v13.2d 1192 694: ba5fd3e3 ccmn xzr, xzr, #0x3, le 1193 698: 3a5f03e5 ccmn wzr, wzr, #0x5, eq // eq = none 1194 69c: fa411be4 ccmp xzr, #0x1, #0x4, ne // ne = any 1195 6a0: 7a42cbe2 ccmp wzr, #0x2, #0x2, gt 1196 6a4: 93df03ff ror xzr, xzr, #0 1197 6a8: c820ffff stlxp w0, xzr, xzr, [sp] 1198 6ac: 8822fc7f stlxp w2, wzr, wzr, [x3] 1199 6b0: c8247cbf stxp w4, xzr, xzr, [x5] 1200 6b4: 88267fff stxp w6, wzr, wzr, [sp] 1201 6b8: 4e010fe0 dup v0.16b, wzr 1202 6bc: 4e081fe1 mov v1.d[0], xzr 1203 6c0: 4e0c1fe1 mov v1.s[1], wzr 1204 6c4: 4e0a1fe1 mov v1.h[2], wzr 1205 6c8: 4e071fe1 mov v1.b[3], wzr 1206 6cc: 4cc0ac3f ld1 {v31.2d, v0.2d}, [x1], x0 1207 6d0: 1e601000 fmov d0, #2.000000000000000000e+00 1208 6d4: 1e603000 fmov d0, #2.125000000000000000e+00 1209 6d8: 1e621000 fmov d0, #4.000000000000000000e+00 1210 6dc: 1e623000 fmov d0, #4.250000000000000000e+00 1211 6e0: 1e641000 fmov d0, #8.000000000000000000e+00 1212 6e4: 1e643000 fmov d0, #8.500000000000000000e+00 1213 6e8: 1e661000 fmov d0, #1.600000000000000000e+01 1214 6ec: 1e663000 fmov d0, #1.700000000000000000e+01 1215 6f0: 1e681000 fmov d0, #1.250000000000000000e-01 1216 6f4: 1e683000 fmov d0, #1.328125000000000000e-01 1217 6f8: 1e6a1000 fmov d0, #2.500000000000000000e-01 1218 6fc: 1e6a3000 fmov d0, #2.656250000000000000e-01 1219 700: 1e6c1000 fmov d0, #5.000000000000000000e-01 1220 704: 1e6c3000 fmov d0, #5.312500000000000000e-01 1221 708: 1e6e1000 fmov d0, #1.000000000000000000e+00 1222 70c: 1e6e3000 fmov d0, #1.062500000000000000e+00 1223 710: 1e701000 fmov d0, #-2.000000000000000000e+00 1224 714: 1e703000 fmov d0, #-2.125000000000000000e+00 1225 718: 1e721000 fmov d0, #-4.000000000000000000e+00 1226 71c: 1e723000 fmov d0, #-4.250000000000000000e+00 1227 720: 1e741000 fmov d0, #-8.000000000000000000e+00 1228 724: 1e743000 fmov d0, #-8.500000000000000000e+00 1229 728: 1e761000 fmov d0, #-1.600000000000000000e+01 1230 72c: 1e763000 fmov d0, #-1.700000000000000000e+01 1231 730: 1e781000 fmov d0, #-1.250000000000000000e-01 1232 734: 1e783000 fmov d0, #-1.328125000000000000e-01 1233 738: 1e7a1000 fmov d0, #-2.500000000000000000e-01 1234 73c: 1e7a3000 fmov d0, #-2.656250000000000000e-01 1235 740: 1e7c1000 fmov d0, #-5.000000000000000000e-01 1236 744: 1e7c3000 fmov d0, #-5.312500000000000000e-01 1237 748: 1e7e1000 fmov d0, #-1.000000000000000000e+00 1238 74c: 1e7e3000 fmov d0, #-1.062500000000000000e+00 1239 750: f8388098 swp x24, x24, [x4] 1240 754: f8340010 ldadd x20, x16, [x0] 1241 758: f8241175 ldclr x4, x21, [x11] 1242 75c: f83e22d0 ldeor x30, x16, [x22] 1243 760: f82432ef ldset x4, x15, [x23] 1244 764: f83a5186 ldsmin x26, x6, [x12] 1245 768: f82f41ee ldsmax x15, x14, [x15] 1246 76c: f82973b9 ldumin x9, x25, [x29] 1247 770: f82b6194 ldumax x11, x20, [x12] 1248 774: f8b28216 swpa x18, x22, [x16] 1249 778: f8b50358 ldadda x21, x24, [x26] 1250 77c: f8a61206 ldclra x6, x6, [x16] 1251 780: f8b02219 ldeora x16, x25, [x16] 1252 784: f8bc3218 ldseta x28, x24, [x16] 1253 788: f8ba514f ldsmina x26, x15, [x10] 1254 78c: f8ad428e ldsmaxa x13, x14, [x20] 1255 790: f8a173d7 ldumina x1, x23, [x30] 1256 794: f8ae60c2 ldumaxa x14, x2, [x6] 1257 798: f8e38328 swpal x3, x8, [x25] 1258 79c: f8e003db ldaddal x0, x27, [x30] 1259 7a0: f8e513c5 ldclral x5, x5, [x30] 1260 7a4: f8eb2019 ldeoral x11, x25, [x0] 1261 7a8: f8ff3260 ldsetal xzr, x0, [x19] 1262 7ac: f8fd513a ldsminal x29, x26, [x9] 1263 7b0: f8fa41ec ldsmaxal x26, x12, [x15] 1264 7b4: f8eb724b lduminal x11, x11, [x18] 1265 7b8: f8f96316 ldumaxal x25, x22, [x24] 1266 7bc: f8608171 swpl x0, x17, [x11] 1267 7c0: f86600dd ldaddl x6, x29, [x6] 1268 7c4: f86512a5 ldclrl x5, x5, [x21] 1269 7c8: f8732250 ldeorl x19, x16, [x18] 1270 7cc: f87e339b ldsetl x30, x27, [x28] 1271 7d0: f861503c ldsminl x1, x28, [x1] 1272 7d4: f874421d ldsmaxl x20, x29, [x16] 1273 7d8: f86d73aa lduminl x13, x10, [x29] 1274 7dc: f87d62d3 ldumaxl x29, x19, [x22] 1275 7e0: b82a83e4 swp w10, w4, [sp] 1276 7e4: b83503e8 ldadd w21, w8, [sp] 1277 7e8: b833138a ldclr w19, w10, [x28] 1278 7ec: b82220b9 ldeor w2, w25, [x5] 1279 7f0: b82332c8 ldset w3, w8, [x22] 1280 7f4: b83350ad ldsmin w19, w13, [x5] 1281 7f8: b83d42b8 ldsmax w29, w24, [x21] 1282 7fc: b83a7078 ldumin w26, w24, [x3] 1283 800: b83862fa ldumax w24, w26, [x23] 1284 804: b8af8075 swpa w15, w21, [x3] 1285 808: b8b80328 ldadda w24, w8, [x25] 1286 80c: b8b41230 ldclra w20, w16, [x17] 1287 810: b8a22001 ldeora w2, w1, [x0] 1288 814: b8b83064 ldseta w24, w4, [x3] 1289 818: b8ac539f ldsmina w12, wzr, [x28] 1290 81c: b8aa405a ldsmaxa w10, w26, [x2] 1291 820: b8ac73f2 ldumina w12, w18, [sp] 1292 824: b8a163ad ldumaxa w1, w13, [x29] 1293 828: b8e08193 swpal w0, w19, [x12] 1294 82c: b8f101b6 ldaddal w17, w22, [x13] 1295 830: b8fc13fe ldclral w28, w30, [sp] 1296 834: b8e1239a ldeoral w1, w26, [x28] 1297 838: b8e4309e ldsetal w4, w30, [x4] 1298 83c: b8e6535e ldsminal w6, w30, [x26] 1299 840: b8f24109 ldsmaxal w18, w9, [x8] 1300 844: b8ec7280 lduminal w12, w0, [x20] 1301 848: b8e16058 ldumaxal w1, w24, [x2] 1302 84c: b8608309 swpl w0, w9, [x24] 1303 850: b87a03d0 ldaddl w26, w16, [x30] 1304 854: b86312ea ldclrl w3, w10, [x23] 1305 858: b86a2244 ldeorl w10, w4, [x18] 1306 85c: b862310b ldsetl w2, w11, [x8] 1307 860: b86a522f ldsminl w10, w15, [x17] 1308 864: b862418a ldsmaxl w2, w10, [x12] 1309 868: b86c71af lduminl w12, w15, [x13] 1310 86c: b8626287 ldumaxl w2, w7, [x20] 1311 */ 1312 1313 static const unsigned int insns[] = 1314 { 1315 0x8b0d82fa, 0xcb49970c, 0xab889dfc, 0xeb9ee787, 1316 0x0b9b3ec9, 0x4b9279a3, 0x2b88474e, 0x6b8c56c0, 1317 0x8a1a51e0, 0xaa11f4ba, 0xca0281b8, 0xea918c7c, 1318 0x0a5d4a19, 0x2a4b264d, 0x4a523ca5, 0x6a9b6ae2, 1319 0x8a70b79b, 0xaaba9728, 0xca6dfe3d, 0xea627f1c, 1320 0x0aa70f53, 0x2aaa0f06, 0x4a6176a4, 0x6a604eb0, 1321 0x1105ed91, 0x3100583e, 0x5101f8bd, 0x710f0306, 1322 0x9101a1a0, 0xb10a5cc8, 0xd10810aa, 0xf10fd061, 1323 0x120cb166, 0x321764bc, 0x52174681, 0x720c0247, 1324 0x9241018e, 0xb25a2969, 0xd278b411, 0xf26aad01, 1325 0x14000000, 0x17ffffd7, 0x140001f2, 0x94000000, 1326 0x97ffffd4, 0x940001ef, 0x3400000a, 0x34fffa2a, 1327 0x34003d8a, 0x35000008, 0x35fff9c8, 0x35003d28, 1328 0xb400000b, 0xb4fff96b, 0xb4003ccb, 0xb500001d, 1329 0xb5fff91d, 0xb5003c7d, 0x10000013, 0x10fff8b3, 1330 0x10003c13, 0x90000013, 0x36300016, 0x3637f836, 1331 0x36303b96, 0x3758000c, 0x375ff7cc, 0x37583b2c, 1332 0x128313a0, 0x528a32c7, 0x7289173b, 0x92ab3acc, 1333 0xd2a0bf94, 0xf2c285e8, 0x9358722f, 0x330e652f, 1334 0x53067f3b, 0x93577c53, 0xb34a1aac, 0xd35a4016, 1335 0x13946c63, 0x93c3dbc8, 0x54000000, 0x54fff5a0, 1336 0x54003900, 0x54000001, 0x54fff541, 0x540038a1, 1337 0x54000002, 0x54fff4e2, 0x54003842, 0x54000002, 1338 0x54fff482, 0x540037e2, 0x54000003, 0x54fff423, 1339 0x54003783, 0x54000003, 0x54fff3c3, 0x54003723, 1340 0x54000004, 0x54fff364, 0x540036c4, 0x54000005, 1341 0x54fff305, 0x54003665, 0x54000006, 0x54fff2a6, 1342 0x54003606, 0x54000007, 0x54fff247, 0x540035a7, 1343 0x54000008, 0x54fff1e8, 0x54003548, 0x54000009, 1344 0x54fff189, 0x540034e9, 0x5400000a, 0x54fff12a, 1345 0x5400348a, 0x5400000b, 0x54fff0cb, 0x5400342b, 1346 0x5400000c, 0x54fff06c, 0x540033cc, 0x5400000d, 1347 0x54fff00d, 0x5400336d, 0x5400000e, 0x54ffefae, 1348 0x5400330e, 0x5400000f, 0x54ffef4f, 0x540032af, 1349 0xd40658e1, 0xd4014d22, 0xd4046543, 0xd4273f60, 1350 0xd44cad80, 0xd503201f, 0xd69f03e0, 0xd6bf03e0, 1351 0xd5033fdf, 0xd5033e9f, 0xd50332bf, 0xd61f0200, 1352 0xd63f0280, 0xc80a7d1b, 0xc800fea1, 0xc85f7fb1, 1353 0xc85fff9d, 0xc89ffee1, 0xc8dffe95, 0x88167e7b, 1354 0x880bfcd0, 0x885f7c12, 0x885ffd44, 0x889ffed8, 1355 0x88dffe6a, 0x48017fc5, 0x4808fe2c, 0x485f7dc9, 1356 0x485ffc27, 0x489ffe05, 0x48dffd82, 0x080a7c6c, 1357 0x081cff4e, 0x085f7d5e, 0x085ffeae, 0x089ffd2d, 1358 0x08dfff76, 0xc87f4d7c, 0xc87fcc5e, 0xc8220417, 1359 0xc82cb5f0, 0x887f55b2, 0x887ff90b, 0x88382c2d, 1360 0x883aedb5, 0xf819928b, 0xb803e21c, 0x381f713b, 1361 0x781ce322, 0xf850f044, 0xb85e129e, 0x385e92f2, 1362 0x785ff35d, 0x39801921, 0x7881318b, 0x78dce02b, 1363 0xb8829313, 0xfc45f318, 0xbc5d50af, 0xfc001375, 1364 0xbc1951b7, 0xf8008c0b, 0xb801dc03, 0x38009dcb, 1365 0x781fdf1d, 0xf8570e2d, 0xb85faecc, 0x385f6d8d, 1366 0x785ebea0, 0x38804cf7, 0x789cbce3, 0x78df9cbc, 1367 0xb89eed38, 0xfc40cd6e, 0xbc5bdd93, 0xfc103c14, 1368 0xbc040c08, 0xf81a2784, 0xb81ca4ec, 0x381e855b, 1369 0x7801b506, 0xf853654e, 0xb85d74b0, 0x384095c2, 1370 0x785ec5bc, 0x389e15a9, 0x789dc703, 0x78c06474, 1371 0xb89ff667, 0xfc57e51e, 0xbc4155f9, 0xfc05a6ee, 1372 0xbc1df408, 0xf835da4a, 0xb836d9a4, 0x3833580d, 1373 0x7826cb6c, 0xf8706900, 0xb87ae880, 0x3865db2e, 1374 0x78724889, 0x38a7789b, 0x78beca2f, 0x78f6c810, 1375 0xb8bef956, 0xfc6afabd, 0xbc734963, 0xfc3d5b8d, 1376 0xbc25fbb7, 0xf9189d05, 0xb91ecb1d, 0x39187a33, 1377 0x791f226d, 0xf95aa2f3, 0xb9587bb7, 0x395f7176, 1378 0x795d9143, 0x399e7e08, 0x799a2697, 0x79df3422, 1379 0xb99c2624, 0xfd5c2374, 0xbd5fa1d9, 0xfd1d595a, 1380 0xbd1b1869, 0x580022fb, 0x1800000b, 0xf8945060, 1381 0xd8000000, 0xf8ae6ba0, 0xf99a0080, 0x1a070035, 1382 0x3a0700a8, 0x5a0e0367, 0x7a11009b, 0x9a000380, 1383 0xba1e030c, 0xda0f0320, 0xfa030301, 0x0b340b12, 1384 0x2b2a278d, 0xcb22aa0f, 0x6b2d29bd, 0x8b2cce8c, 1385 0xab2b877e, 0xcb21c8ee, 0xeb3ba47d, 0x3a4d400e, 1386 0x7a5232c6, 0xba5e624e, 0xfa53814c, 0x3a52d8c2, 1387 0x7a4d8924, 0xba4b3aab, 0xfa4d7882, 0x1a96804c, 1388 0x1a912618, 0x5a90b0e6, 0x5a96976b, 0x9a9db06a, 1389 0x9a9b374c, 0xda95c14f, 0xda89c6fe, 0x5ac0015e, 1390 0x5ac005fd, 0x5ac00bdd, 0x5ac012b9, 0x5ac01404, 1391 0xdac002b2, 0xdac0061d, 0xdac00a95, 0xdac00e66, 1392 0xdac0107e, 0xdac01675, 0x1ac00b0b, 0x1ace0f3b, 1393 0x1ad221c3, 0x1ad825e7, 0x1ad92a3c, 0x1adc2f42, 1394 0x9ada0b25, 0x9ad20e1b, 0x9acc22a6, 0x9acc2480, 1395 0x9adc2a3b, 0x9ad22c5c, 0x9bce7dea, 0x9b597c6e, 1396 0x1b0e166f, 0x1b1ae490, 0x9b023044, 0x9b089e3d, 1397 0x9b391083, 0x9b24c73a, 0x9bb15f40, 0x9bbcc6af, 1398 0x1e23095b, 0x1e3918e0, 0x1e2f28c9, 0x1e2a39fd, 1399 0x1e270a22, 0x1e77096b, 0x1e771ba7, 0x1e6b2b6e, 1400 0x1e78388b, 0x1e6e09ec, 0x1f1c3574, 0x1f17f98b, 1401 0x1f2935da, 0x1f2574ea, 0x1f4b306f, 0x1f5ec7cf, 1402 0x1f6f3e93, 0x1f6226a9, 0x1e2040fb, 0x1e20c3dd, 1403 0x1e214031, 0x1e21c0c2, 0x1e22c06a, 0x1e604178, 1404 0x1e60c027, 0x1e61400b, 0x1e61c243, 0x1e6240dc, 1405 0x1e3800d6, 0x9e380360, 0x1e78005a, 0x9e7800e5, 1406 0x1e22017c, 0x9e2201b9, 0x1e6202eb, 0x9e620113, 1407 0x1e2602b2, 0x9e660299, 0x1e270253, 0x9e6703a2, 1408 0x1e2822c0, 0x1e7322a0, 0x1e202288, 0x1e602168, 1409 0x293c19f4, 0x2966387b, 0x69762971, 0xa9041dc7, 1410 0xa9475c0c, 0x29b61ccd, 0x29ee405e, 0x69ee0744, 1411 0xa9843977, 0xa9f46ebd, 0x28ba16b6, 0x28fc44db, 1412 0x68f61831, 0xa8b352ad, 0xa8c56d5e, 0x28024565, 1413 0x2874134e, 0xa8027597, 0xa87b1aa0, 0x0c40734f, 1414 0x4cdfa177, 0x0cc76ee8, 0x4cdf2733, 0x0d40c23d, 1415 0x4ddfcaf8, 0x0dd9ccaa, 0x4c408d52, 0x0cdf85ec, 1416 0x4d60c259, 0x0dffcbc1, 0x4de9ce50, 0x4cc24999, 1417 0x0c404a7a, 0x4d40e6af, 0x4ddfe9b9, 0x0dddef8e, 1418 0x4cdf07b1, 0x0cc000fb, 0x0d60e258, 0x0dffe740, 1419 0x0de2eb2c, 0xce648376, 0xce6184c7, 0xcec081fa, 1420 0xce6d89a2, 0xba5fd3e3, 0x3a5f03e5, 0xfa411be4, 1421 0x7a42cbe2, 0x93df03ff, 0xc820ffff, 0x8822fc7f, 1422 0xc8247cbf, 0x88267fff, 0x4e010fe0, 0x4e081fe1, 1423 0x4e0c1fe1, 0x4e0a1fe1, 0x4e071fe1, 0x4cc0ac3f, 1424 0x1e601000, 0x1e603000, 0x1e621000, 0x1e623000, 1425 0x1e641000, 0x1e643000, 0x1e661000, 0x1e663000, 1426 0x1e681000, 0x1e683000, 0x1e6a1000, 0x1e6a3000, 1427 0x1e6c1000, 0x1e6c3000, 0x1e6e1000, 0x1e6e3000, 1428 0x1e701000, 0x1e703000, 0x1e721000, 0x1e723000, 1429 0x1e741000, 0x1e743000, 0x1e761000, 0x1e763000, 1430 0x1e781000, 0x1e783000, 0x1e7a1000, 0x1e7a3000, 1431 0x1e7c1000, 0x1e7c3000, 0x1e7e1000, 0x1e7e3000, 1432 0xf8388098, 0xf8340010, 0xf8241175, 0xf83e22d0, 1433 0xf82432ef, 0xf83a5186, 0xf82f41ee, 0xf82973b9, 1434 0xf82b6194, 0xf8b28216, 0xf8b50358, 0xf8a61206, 1435 0xf8b02219, 0xf8bc3218, 0xf8ba514f, 0xf8ad428e, 1436 0xf8a173d7, 0xf8ae60c2, 0xf8e38328, 0xf8e003db, 1437 0xf8e513c5, 0xf8eb2019, 0xf8ff3260, 0xf8fd513a, 1438 0xf8fa41ec, 0xf8eb724b, 0xf8f96316, 0xf8608171, 1439 0xf86600dd, 0xf86512a5, 0xf8732250, 0xf87e339b, 1440 0xf861503c, 0xf874421d, 0xf86d73aa, 0xf87d62d3, 1441 0xb82a83e4, 0xb83503e8, 0xb833138a, 0xb82220b9, 1442 0xb82332c8, 0xb83350ad, 0xb83d42b8, 0xb83a7078, 1443 0xb83862fa, 0xb8af8075, 0xb8b80328, 0xb8b41230, 1444 0xb8a22001, 0xb8b83064, 0xb8ac539f, 0xb8aa405a, 1445 0xb8ac73f2, 0xb8a163ad, 0xb8e08193, 0xb8f101b6, 1446 0xb8fc13fe, 0xb8e1239a, 0xb8e4309e, 0xb8e6535e, 1447 0xb8f24109, 0xb8ec7280, 0xb8e16058, 0xb8608309, 1448 0xb87a03d0, 0xb86312ea, 0xb86a2244, 0xb862310b, 1449 0xb86a522f, 0xb862418a, 0xb86c71af, 0xb8626287, 1450 1451 }; 1452 // END Generated code -- do not edit 1453 1454 asm_check((unsigned int *)entry, insns, sizeof insns / sizeof insns[0]); 1455 1456 { 1457 address PC = __ pc(); 1458 __ ld1(v0, __ T16B, Address(r16)); // No offset 1459 __ ld1(v0, __ T8H, __ post(r16, 16)); // Post-index 1460 __ ld2(v0, v1, __ T8H, __ post(r24, 16 * 2)); // Post-index 1461 __ ld1(v0, __ T16B, __ post(r16, r17)); // Register post-index 1462 static const unsigned int vector_insns[] = { 1463 0x4c407200, // ld1 {v0.16b}, [x16] 1464 0x4cdf7600, // ld1 {v0.8h}, [x16], #16 1465 0x4cdf8700, // ld2 {v0.8h, v1.8h}, [x24], #32 1466 0x4cd17200, // ld1 {v0.16b}, [x16], x17 1467 }; 1468 asm_check((unsigned int *)PC, vector_insns, 1469 sizeof vector_insns / sizeof vector_insns[0]); 1470 } 1471 } 1472 #endif // ASSERT 1473 1474 #undef __ 1475 1476 void Assembler::emit_data64(jlong data, 1477 relocInfo::relocType rtype, 1478 int format) { 1479 if (rtype == relocInfo::none) { 1480 emit_int64(data); 1481 } else { 1482 emit_data64(data, Relocation::spec_simple(rtype), format); 1483 } 1484 } 1485 1486 void Assembler::emit_data64(jlong data, 1487 RelocationHolder const& rspec, 1488 int format) { 1489 1490 assert(inst_mark() != NULL, "must be inside InstructionMark"); 1491 // Do not use AbstractAssembler::relocate, which is not intended for 1492 // embedded words. Instead, relocate to the enclosing instruction. 1493 code_section()->relocate(inst_mark(), rspec, format); 1494 emit_int64(data); 1495 } 1496 1497 extern "C" { 1498 void das(uint64_t start, int len) { 1499 ResourceMark rm; 1500 len <<= 2; 1501 if (len < 0) 1502 Disassembler::decode((address)start + len, (address)start); 1503 else 1504 Disassembler::decode((address)start, (address)start + len); 1505 } 1506 1507 JNIEXPORT void das1(uintptr_t insn) { 1508 das(insn, 1); 1509 } 1510 } 1511 1512 #define gas_assert(ARG1) assert(ARG1, #ARG1) 1513 1514 #define __ as-> 1515 1516 void Address::lea(MacroAssembler *as, Register r) const { 1517 Relocation* reloc = _rspec.reloc(); 1518 relocInfo::relocType rtype = (relocInfo::relocType) reloc->type(); 1519 1520 switch(_mode) { 1521 case base_plus_offset: { 1522 if (_offset == 0 && _base == r) // it's a nop 1523 break; 1524 if (_offset > 0) 1525 __ add(r, _base, _offset); 1526 else 1527 __ sub(r, _base, -_offset); 1528 break; 1529 } 1530 case base_plus_offset_reg: { 1531 __ add(r, _base, _index, _ext.op(), MAX2(_ext.shift(), 0)); 1532 break; 1533 } 1534 case literal: { 1535 if (rtype == relocInfo::none) 1536 __ mov(r, target()); 1537 else 1538 __ movptr(r, (uint64_t)target()); 1539 break; 1540 } 1541 default: 1542 ShouldNotReachHere(); 1543 } 1544 } 1545 1546 void Assembler::adrp(Register reg1, const Address &dest, uintptr_t &byte_offset) { 1547 ShouldNotReachHere(); 1548 } 1549 1550 #undef __ 1551 1552 #define starti Instruction_aarch64 do_not_use(this); set_current(&do_not_use) 1553 1554 void Assembler::adr(Register Rd, address adr) { 1555 intptr_t offset = adr - pc(); 1556 int offset_lo = offset & 3; 1557 offset >>= 2; 1558 starti; 1559 f(0, 31), f(offset_lo, 30, 29), f(0b10000, 28, 24), sf(offset, 23, 5); 1560 rf(Rd, 0); 1561 } 1562 1563 void Assembler::_adrp(Register Rd, address adr) { 1564 uint64_t pc_page = (uint64_t)pc() >> 12; 1565 uint64_t adr_page = (uint64_t)adr >> 12; 1566 intptr_t offset = adr_page - pc_page; 1567 int offset_lo = offset & 3; 1568 offset >>= 2; 1569 starti; 1570 f(1, 31), f(offset_lo, 30, 29), f(0b10000, 28, 24), sf(offset, 23, 5); 1571 rf(Rd, 0); 1572 } 1573 1574 #undef starti 1575 1576 Address::Address(address target, relocInfo::relocType rtype) : _mode(literal){ 1577 _is_lval = false; 1578 _target = target; 1579 switch (rtype) { 1580 case relocInfo::oop_type: 1581 case relocInfo::metadata_type: 1582 // Oops are a special case. Normally they would be their own section 1583 // but in cases like icBuffer they are literals in the code stream that 1584 // we don't have a section for. We use none so that we get a literal address 1585 // which is always patchable. 1586 break; 1587 case relocInfo::external_word_type: 1588 _rspec = external_word_Relocation::spec(target); 1589 break; 1590 case relocInfo::internal_word_type: 1591 _rspec = internal_word_Relocation::spec(target); 1592 break; 1593 case relocInfo::opt_virtual_call_type: 1594 _rspec = opt_virtual_call_Relocation::spec(); 1595 break; 1596 case relocInfo::static_call_type: 1597 _rspec = static_call_Relocation::spec(); 1598 break; 1599 case relocInfo::runtime_call_type: 1600 _rspec = runtime_call_Relocation::spec(); 1601 break; 1602 case relocInfo::poll_type: 1603 case relocInfo::poll_return_type: 1604 _rspec = Relocation::spec_simple(rtype); 1605 break; 1606 case relocInfo::none: 1607 _rspec = RelocationHolder::none; 1608 break; 1609 default: 1610 ShouldNotReachHere(); 1611 break; 1612 } 1613 } 1614 1615 void Assembler::b(const Address &dest) { 1616 code_section()->relocate(pc(), dest.rspec()); 1617 b(dest.target()); 1618 } 1619 1620 void Assembler::bl(const Address &dest) { 1621 code_section()->relocate(pc(), dest.rspec()); 1622 bl(dest.target()); 1623 } 1624 1625 void Assembler::adr(Register r, const Address &dest) { 1626 code_section()->relocate(pc(), dest.rspec()); 1627 adr(r, dest.target()); 1628 } 1629 1630 void Assembler::br(Condition cc, Label &L) { 1631 if (L.is_bound()) { 1632 br(cc, target(L)); 1633 } else { 1634 L.add_patch_at(code(), locator()); 1635 br(cc, pc()); 1636 } 1637 } 1638 1639 void Assembler::wrap_label(Label &L, 1640 Assembler::uncond_branch_insn insn) { 1641 if (L.is_bound()) { 1642 (this->*insn)(target(L)); 1643 } else { 1644 L.add_patch_at(code(), locator()); 1645 (this->*insn)(pc()); 1646 } 1647 } 1648 1649 void Assembler::wrap_label(Register r, Label &L, 1650 compare_and_branch_insn insn) { 1651 if (L.is_bound()) { 1652 (this->*insn)(r, target(L)); 1653 } else { 1654 L.add_patch_at(code(), locator()); 1655 (this->*insn)(r, pc()); 1656 } 1657 } 1658 1659 void Assembler::wrap_label(Register r, int bitpos, Label &L, 1660 test_and_branch_insn insn) { 1661 if (L.is_bound()) { 1662 (this->*insn)(r, bitpos, target(L)); 1663 } else { 1664 L.add_patch_at(code(), locator()); 1665 (this->*insn)(r, bitpos, pc()); 1666 } 1667 } 1668 1669 void Assembler::wrap_label(Label &L, prfop op, prefetch_insn insn) { 1670 if (L.is_bound()) { 1671 (this->*insn)(target(L), op); 1672 } else { 1673 L.add_patch_at(code(), locator()); 1674 (this->*insn)(pc(), op); 1675 } 1676 } 1677 1678 // An "all-purpose" add/subtract immediate, per ARM documentation: 1679 // A "programmer-friendly" assembler may accept a negative immediate 1680 // between -(2^24 -1) and -1 inclusive, causing it to convert a 1681 // requested ADD operation to a SUB, or vice versa, and then encode 1682 // the absolute value of the immediate as for uimm24. 1683 void Assembler::add_sub_immediate(Register Rd, Register Rn, unsigned uimm, int op, 1684 int negated_op) { 1685 bool sets_flags = op & 1; // this op sets flags 1686 union { 1687 unsigned u; 1688 int imm; 1689 }; 1690 u = uimm; 1691 bool shift = false; 1692 bool neg = imm < 0; 1693 if (neg) { 1694 imm = -imm; 1695 op = negated_op; 1696 } 1697 assert(Rd != sp || imm % 16 == 0, "misaligned stack"); 1698 if (imm >= (1 << 11) 1699 && ((imm >> 12) << 12 == imm)) { 1700 imm >>= 12; 1701 shift = true; 1702 } 1703 f(op, 31, 29), f(0b10001, 28, 24), f(shift, 23, 22), f(imm, 21, 10); 1704 1705 // add/subtract immediate ops with the S bit set treat r31 as zr; 1706 // with S unset they use sp. 1707 if (sets_flags) 1708 zrf(Rd, 0); 1709 else 1710 srf(Rd, 0); 1711 1712 srf(Rn, 5); 1713 } 1714 1715 bool Assembler::operand_valid_for_add_sub_immediate(int64_t imm) { 1716 bool shift = false; 1717 uint64_t uimm = (uint64_t)uabs(imm); 1718 if (uimm < (1 << 12)) 1719 return true; 1720 if (uimm < (1 << 24) 1721 && ((uimm >> 12) << 12 == uimm)) { 1722 return true; 1723 } 1724 return false; 1725 } 1726 1727 bool Assembler::operand_valid_for_logical_immediate(bool is32, uint64_t imm) { 1728 return encode_logical_immediate(is32, imm) != 0xffffffff; 1729 } 1730 1731 static uint64_t doubleTo64Bits(jdouble d) { 1732 union { 1733 jdouble double_value; 1734 uint64_t double_bits; 1735 }; 1736 1737 double_value = d; 1738 return double_bits; 1739 } 1740 1741 bool Assembler::operand_valid_for_float_immediate(double imm) { 1742 // If imm is all zero bits we can use ZR as the source of a 1743 // floating-point value. 1744 if (doubleTo64Bits(imm) == 0) 1745 return true; 1746 1747 // Otherwise try to encode imm then convert the encoded value back 1748 // and make sure it's the exact same bit pattern. 1749 unsigned result = encoding_for_fp_immediate(imm); 1750 return doubleTo64Bits(imm) == fp_immediate_for_encoding(result, true); 1751 } 1752 1753 int AbstractAssembler::code_fill_byte() { 1754 return 0; 1755 } 1756 1757 // n.b. this is implemented in subclass MacroAssembler 1758 void Assembler::bang_stack_with_offset(int offset) { Unimplemented(); } 1759 1760 1761 // and now the routines called by the assembler which encapsulate the 1762 // above encode and decode functions 1763 1764 uint32_t 1765 asm_util::encode_logical_immediate(bool is32, uint64_t imm) 1766 { 1767 if (is32) { 1768 /* Allow all zeros or all ones in top 32-bits, so that 1769 constant expressions like ~1 are permitted. */ 1770 if (imm >> 32 != 0 && imm >> 32 != 0xffffffff) 1771 return 0xffffffff; 1772 /* Replicate the 32 lower bits to the 32 upper bits. */ 1773 imm &= 0xffffffff; 1774 imm |= imm << 32; 1775 } 1776 1777 return encoding_for_logical_immediate(imm); 1778 } 1779 1780 unsigned Assembler::pack(double value) { 1781 float val = (float)value; 1782 unsigned result = encoding_for_fp_immediate(val); 1783 guarantee(unpack(result) == value, 1784 "Invalid floating-point immediate operand"); 1785 return result; 1786 } 1787 1788 // Packed operands for Floating-point Move (immediate) 1789 1790 static float unpack(unsigned value) { 1791 union { 1792 unsigned ival; 1793 float val; 1794 }; 1795 ival = fp_immediate_for_encoding(value, 0); 1796 return val; 1797 }