1 /* 2 * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. 3 * Copyright (c) 2014, 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 unsigned long Assembler::asm_bp = 0x00007fffee09ac88; 35 #endif 36 37 #include "compiler/disassembler.hpp" 38 #include "memory/resourceArea.hpp" 39 #include "runtime/interfaceSupport.hpp" 40 #include "runtime/sharedRuntime.hpp" 41 42 // for the moment we reuse the logical/floating point immediate encode 43 // and decode functiosn provided by the simulator. when we move to 44 // real hardware we will need to pull taht code into here 45 46 #include "immediate_aarch64.hpp" 47 48 extern "C" void entry(CodeBuffer *cb); 49 50 #define __ _masm. 51 #ifdef PRODUCT 52 #define BLOCK_COMMENT(str) /* nothing */ 53 #else 54 #define BLOCK_COMMENT(str) block_comment(str) 55 #endif 56 57 #define BIND(label) bind(label); __ BLOCK_COMMENT(#label ":") 58 59 static float unpack(unsigned value); 60 61 void entry(CodeBuffer *cb) { 62 63 // { 64 // for (int i = 0; i < 256; i+=16) 65 // { 66 // printf("\"%20.20g\", ", unpack(i)); 67 // printf("\"%20.20g\", ", unpack(i+1)); 68 // } 69 // printf("\n"); 70 // } 71 72 Assembler _masm(cb); 73 address entry = __ pc(); 74 75 // Smoke test for assembler 76 77 #ifdef ASSERT 78 // BEGIN Generated code -- do not edit 79 // Generated by aarch64-asmtest.py 80 Label back, forth; 81 __ bind(back); 82 83 // ArithOp 84 __ add(r19, r22, r7, Assembler::LSL, 28); // add x19, x22, x7, LSL #28 85 __ sub(r16, r11, r10, Assembler::LSR, 13); // sub x16, x11, x10, LSR #13 86 __ adds(r27, r13, r28, Assembler::ASR, 2); // adds x27, x13, x28, ASR #2 87 __ subs(r20, r28, r26, Assembler::ASR, 41); // subs x20, x28, x26, ASR #41 88 __ addw(r8, r19, r19, Assembler::ASR, 19); // add w8, w19, w19, ASR #19 89 __ subw(r4, r9, r10, Assembler::LSL, 14); // sub w4, w9, w10, LSL #14 90 __ addsw(r8, r11, r30, Assembler::LSL, 13); // adds w8, w11, w30, LSL #13 91 __ subsw(r0, r25, r19, Assembler::LSL, 9); // subs w0, w25, w19, LSL #9 92 __ andr(r20, r0, r21, Assembler::LSL, 19); // and x20, x0, x21, LSL #19 93 __ orr(r21, r14, r20, Assembler::LSL, 17); // orr x21, x14, x20, LSL #17 94 __ eor(r25, r28, r1, Assembler::LSL, 51); // eor x25, x28, x1, LSL #51 95 __ ands(r10, r27, r11, Assembler::ASR, 15); // ands x10, x27, x11, ASR #15 96 __ andw(r25, r5, r12, Assembler::ASR, 23); // and w25, w5, w12, ASR #23 97 __ orrw(r18, r14, r10, Assembler::LSR, 4); // orr w18, w14, w10, LSR #4 98 __ eorw(r4, r21, r5, Assembler::ASR, 22); // eor w4, w21, w5, ASR #22 99 __ andsw(r21, r0, r5, Assembler::ASR, 29); // ands w21, w0, w5, ASR #29 100 __ bic(r26, r30, r6, Assembler::ASR, 37); // bic x26, x30, x6, ASR #37 101 __ orn(r3, r1, r13, Assembler::LSR, 29); // orn x3, x1, x13, LSR #29 102 __ eon(r0, r28, r9, Assembler::LSL, 47); // eon x0, x28, x9, LSL #47 103 __ bics(r29, r5, r28, Assembler::LSL, 46); // bics x29, x5, x28, LSL #46 104 __ bicw(r9, r18, r7, Assembler::LSR, 20); // bic w9, w18, w7, LSR #20 105 __ ornw(r26, r13, r25, Assembler::ASR, 24); // orn w26, w13, w25, ASR #24 106 __ eonw(r25, r4, r19, Assembler::LSL, 6); // eon w25, w4, w19, LSL #6 107 __ bicsw(r5, r26, r4, Assembler::LSR, 24); // bics w5, w26, w4, LSR #24 108 109 // AddSubImmOp 110 __ addw(r7, r19, 340u); // add w7, w19, #340 111 __ addsw(r8, r0, 401u); // adds w8, w0, #401 112 __ subw(r29, r20, 163u); // sub w29, w20, #163 113 __ subsw(r8, r23, 759u); // subs w8, w23, #759 114 __ add(r1, r12, 523u); // add x1, x12, #523 115 __ adds(r2, r11, 426u); // adds x2, x11, #426 116 __ sub(r14, r29, 716u); // sub x14, x29, #716 117 __ subs(r11, r5, 582u); // subs x11, x5, #582 118 119 // LogicalImmOp 120 __ andw(r23, r22, 32768ul); // and w23, w22, #0x8000 121 __ orrw(r4, r10, 4042322160ul); // orr w4, w10, #0xf0f0f0f0 122 __ eorw(r0, r24, 4042322160ul); // eor w0, w24, #0xf0f0f0f0 123 __ andsw(r19, r29, 2139127680ul); // ands w19, w29, #0x7f807f80 124 __ andr(r5, r10, 4503599627354112ul); // and x5, x10, #0xfffffffffc000 125 __ orr(r12, r30, 18445618178097414144ul); // orr x12, x30, #0xfffc0000fffc0000 126 __ eor(r30, r5, 262128ul); // eor x30, x5, #0x3fff0 127 __ ands(r26, r23, 4194300ul); // ands x26, x23, #0x3ffffc 128 129 // AbsOp 130 __ b(__ pc()); // b . 131 __ b(back); // b back 132 __ b(forth); // b forth 133 __ bl(__ pc()); // bl . 134 __ bl(back); // bl back 135 __ bl(forth); // bl forth 136 137 // RegAndAbsOp 138 __ cbzw(r12, __ pc()); // cbz w12, . 139 __ cbzw(r12, back); // cbz w12, back 140 __ cbzw(r12, forth); // cbz w12, forth 141 __ cbnzw(r20, __ pc()); // cbnz w20, . 142 __ cbnzw(r20, back); // cbnz w20, back 143 __ cbnzw(r20, forth); // cbnz w20, forth 144 __ cbz(r12, __ pc()); // cbz x12, . 145 __ cbz(r12, back); // cbz x12, back 146 __ cbz(r12, forth); // cbz x12, forth 147 __ cbnz(r24, __ pc()); // cbnz x24, . 148 __ cbnz(r24, back); // cbnz x24, back 149 __ cbnz(r24, forth); // cbnz x24, forth 150 __ adr(r6, __ pc()); // adr x6, . 151 __ adr(r6, back); // adr x6, back 152 __ adr(r6, forth); // adr x6, forth 153 __ _adrp(r21, __ pc()); // adrp x21, . 154 155 // RegImmAbsOp 156 __ tbz(r1, 1, __ pc()); // tbz x1, #1, . 157 __ tbz(r1, 1, back); // tbz x1, #1, back 158 __ tbz(r1, 1, forth); // tbz x1, #1, forth 159 __ tbnz(r8, 9, __ pc()); // tbnz x8, #9, . 160 __ tbnz(r8, 9, back); // tbnz x8, #9, back 161 __ tbnz(r8, 9, forth); // tbnz x8, #9, forth 162 163 // MoveWideImmOp 164 __ movnw(r12, 23175, 0); // movn w12, #23175, lsl 0 165 __ movzw(r11, 20476, 16); // movz w11, #20476, lsl 16 166 __ movkw(r21, 3716, 0); // movk w21, #3716, lsl 0 167 __ movn(r29, 28661, 48); // movn x29, #28661, lsl 48 168 __ movz(r3, 6927, 0); // movz x3, #6927, lsl 0 169 __ movk(r22, 9828, 16); // movk x22, #9828, lsl 16 170 171 // BitfieldOp 172 __ sbfm(r12, r8, 6, 22); // sbfm x12, x8, #6, #22 173 __ bfmw(r19, r25, 25, 19); // bfm w19, w25, #25, #19 174 __ ubfmw(r9, r12, 29, 15); // ubfm w9, w12, #29, #15 175 __ sbfm(r28, r25, 16, 16); // sbfm x28, x25, #16, #16 176 __ bfm(r12, r5, 4, 25); // bfm x12, x5, #4, #25 177 __ ubfm(r0, r10, 6, 8); // ubfm x0, x10, #6, #8 178 179 // ExtractOp 180 __ extrw(r4, r13, r26, 24); // extr w4, w13, w26, #24 181 __ extr(r23, r30, r24, 31); // extr x23, x30, x24, #31 182 183 // CondBranchOp 184 __ br(Assembler::EQ, __ pc()); // b.EQ . 185 __ br(Assembler::EQ, back); // b.EQ back 186 __ br(Assembler::EQ, forth); // b.EQ forth 187 __ br(Assembler::NE, __ pc()); // b.NE . 188 __ br(Assembler::NE, back); // b.NE back 189 __ br(Assembler::NE, forth); // b.NE forth 190 __ br(Assembler::HS, __ pc()); // b.HS . 191 __ br(Assembler::HS, back); // b.HS back 192 __ br(Assembler::HS, forth); // b.HS forth 193 __ br(Assembler::CS, __ pc()); // b.CS . 194 __ br(Assembler::CS, back); // b.CS back 195 __ br(Assembler::CS, forth); // b.CS forth 196 __ br(Assembler::LO, __ pc()); // b.LO . 197 __ br(Assembler::LO, back); // b.LO back 198 __ br(Assembler::LO, forth); // b.LO forth 199 __ br(Assembler::CC, __ pc()); // b.CC . 200 __ br(Assembler::CC, back); // b.CC back 201 __ br(Assembler::CC, forth); // b.CC forth 202 __ br(Assembler::MI, __ pc()); // b.MI . 203 __ br(Assembler::MI, back); // b.MI back 204 __ br(Assembler::MI, forth); // b.MI forth 205 __ br(Assembler::PL, __ pc()); // b.PL . 206 __ br(Assembler::PL, back); // b.PL back 207 __ br(Assembler::PL, forth); // b.PL forth 208 __ br(Assembler::VS, __ pc()); // b.VS . 209 __ br(Assembler::VS, back); // b.VS back 210 __ br(Assembler::VS, forth); // b.VS forth 211 __ br(Assembler::VC, __ pc()); // b.VC . 212 __ br(Assembler::VC, back); // b.VC back 213 __ br(Assembler::VC, forth); // b.VC forth 214 __ br(Assembler::HI, __ pc()); // b.HI . 215 __ br(Assembler::HI, back); // b.HI back 216 __ br(Assembler::HI, forth); // b.HI forth 217 __ br(Assembler::LS, __ pc()); // b.LS . 218 __ br(Assembler::LS, back); // b.LS back 219 __ br(Assembler::LS, forth); // b.LS forth 220 __ br(Assembler::GE, __ pc()); // b.GE . 221 __ br(Assembler::GE, back); // b.GE back 222 __ br(Assembler::GE, forth); // b.GE forth 223 __ br(Assembler::LT, __ pc()); // b.LT . 224 __ br(Assembler::LT, back); // b.LT back 225 __ br(Assembler::LT, forth); // b.LT forth 226 __ br(Assembler::GT, __ pc()); // b.GT . 227 __ br(Assembler::GT, back); // b.GT back 228 __ br(Assembler::GT, forth); // b.GT forth 229 __ br(Assembler::LE, __ pc()); // b.LE . 230 __ br(Assembler::LE, back); // b.LE back 231 __ br(Assembler::LE, forth); // b.LE forth 232 __ br(Assembler::AL, __ pc()); // b.AL . 233 __ br(Assembler::AL, back); // b.AL back 234 __ br(Assembler::AL, forth); // b.AL forth 235 __ br(Assembler::NV, __ pc()); // b.NV . 236 __ br(Assembler::NV, back); // b.NV back 237 __ br(Assembler::NV, forth); // b.NV forth 238 239 // ImmOp 240 __ svc(12729); // svc #12729 241 __ hvc(6788); // hvc #6788 242 __ smc(1535); // smc #1535 243 __ brk(16766); // brk #16766 244 __ hlt(9753); // hlt #9753 245 246 // Op 247 __ nop(); // nop 248 __ eret(); // eret 249 __ drps(); // drps 250 __ isb(); // isb 251 252 // SystemOp 253 __ dsb(Assembler::SY); // dsb SY 254 __ dmb(Assembler::ISHST); // dmb ISHST 255 256 // OneRegOp 257 __ br(r2); // br x2 258 __ blr(r5); // blr x5 259 260 // LoadStoreExclusiveOp 261 __ stxr(r20, r21, r2); // stxr w20, x21, [x2] 262 __ stlxr(r5, r29, r7); // stlxr w5, x29, [x7] 263 __ ldxr(r5, r16); // ldxr x5, [x16] 264 __ ldaxr(r27, r29); // ldaxr x27, [x29] 265 __ stlr(r0, r29); // stlr x0, [x29] 266 __ ldar(r21, r28); // ldar x21, [x28] 267 268 // LoadStoreExclusiveOp 269 __ stxrw(r21, r24, r7); // stxr w21, w24, [x7] 270 __ stlxrw(r21, r26, r28); // stlxr w21, w26, [x28] 271 __ ldxrw(r21, r6); // ldxr w21, [x6] 272 __ ldaxrw(r15, r30); // ldaxr w15, [x30] 273 __ stlrw(r19, r3); // stlr w19, [x3] 274 __ ldarw(r22, r2); // ldar w22, [x2] 275 276 // LoadStoreExclusiveOp 277 __ stxrh(r18, r15, r0); // stxrh w18, w15, [x0] 278 __ stlxrh(r11, r5, r28); // stlxrh w11, w5, [x28] 279 __ ldxrh(r29, r6); // ldxrh w29, [x6] 280 __ ldaxrh(r18, r7); // ldaxrh w18, [x7] 281 __ stlrh(r25, r28); // stlrh w25, [x28] 282 __ ldarh(r2, r19); // ldarh w2, [x19] 283 284 // LoadStoreExclusiveOp 285 __ stxrb(r10, r30, r1); // stxrb w10, w30, [x1] 286 __ stlxrb(r20, r21, r22); // stlxrb w20, w21, [x22] 287 __ ldxrb(r25, r2); // ldxrb w25, [x2] 288 __ ldaxrb(r24, r5); // ldaxrb w24, [x5] 289 __ stlrb(r16, r3); // stlrb w16, [x3] 290 __ ldarb(r22, r29); // ldarb w22, [x29] 291 292 // LoadStoreExclusiveOp 293 __ ldxp(r8, r2, r19); // ldxp x8, x2, [x19] 294 __ ldaxp(r7, r19, r14); // ldaxp x7, x19, [x14] 295 __ stxp(r8, r27, r28, r5); // stxp w8, x27, x28, [x5] 296 __ stlxp(r5, r8, r14, r6); // stlxp w5, x8, x14, [x6] 297 298 // LoadStoreExclusiveOp 299 __ ldxpw(r25, r4, r22); // ldxp w25, w4, [x22] 300 __ ldaxpw(r13, r14, r15); // ldaxp w13, w14, [x15] 301 __ stxpw(r20, r26, r8, r10); // stxp w20, w26, w8, [x10] 302 __ stlxpw(r23, r18, r18, r18); // stlxp w23, w18, w18, [x18] 303 304 // base_plus_unscaled_offset 305 // LoadStoreOp 306 __ str(r30, Address(r11, 99)); // str x30, [x11, 99] 307 __ strw(r23, Address(r25, -77)); // str w23, [x25, -77] 308 __ strb(r2, Address(r14, 3)); // strb w2, [x14, 3] 309 __ strh(r9, Address(r10, 5)); // strh w9, [x10, 5] 310 __ ldr(r20, Address(r15, 57)); // ldr x20, [x15, 57] 311 __ ldrw(r12, Address(r16, -78)); // ldr w12, [x16, -78] 312 __ ldrb(r22, Address(r26, -3)); // ldrb w22, [x26, -3] 313 __ ldrh(r30, Address(r19, -47)); // ldrh w30, [x19, -47] 314 __ ldrsb(r9, Address(r10, -12)); // ldrsb x9, [x10, -12] 315 __ ldrsh(r28, Address(r17, 14)); // ldrsh x28, [x17, 14] 316 __ ldrshw(r3, Address(r5, 10)); // ldrsh w3, [x5, 10] 317 __ ldrsw(r17, Address(r17, -91)); // ldrsw x17, [x17, -91] 318 __ ldrd(v2, Address(r20, -17)); // ldr d2, [x20, -17] 319 __ ldrs(v22, Address(r7, -10)); // ldr s22, [x7, -10] 320 __ strd(v30, Address(r18, -223)); // str d30, [x18, -223] 321 __ strs(v13, Address(r22, 21)); // str s13, [x22, 21] 322 323 // pre 324 // LoadStoreOp 325 __ str(r9, Address(__ pre(r18, -112))); // str x9, [x18, -112]! 326 __ strw(r29, Address(__ pre(r23, 11))); // str w29, [x23, 11]! 327 __ strb(r18, Address(__ pre(r12, -1))); // strb w18, [x12, -1]! 328 __ strh(r16, Address(__ pre(r20, -23))); // strh w16, [x20, -23]! 329 __ ldr(r3, Address(__ pre(r29, 9))); // ldr x3, [x29, 9]! 330 __ ldrw(r25, Address(__ pre(r3, 19))); // ldr w25, [x3, 19]! 331 __ ldrb(r1, Address(__ pre(r29, -1))); // ldrb w1, [x29, -1]! 332 __ ldrh(r8, Address(__ pre(r29, -57))); // ldrh w8, [x29, -57]! 333 __ ldrsb(r5, Address(__ pre(r14, -13))); // ldrsb x5, [x14, -13]! 334 __ ldrsh(r10, Address(__ pre(r27, 1))); // ldrsh x10, [x27, 1]! 335 __ ldrshw(r11, Address(__ pre(r10, 25))); // ldrsh w11, [x10, 25]! 336 __ ldrsw(r4, Address(__ pre(r22, -92))); // ldrsw x4, [x22, -92]! 337 __ ldrd(v11, Address(__ pre(r23, 8))); // ldr d11, [x23, 8]! 338 __ ldrs(v25, Address(__ pre(r19, 54))); // ldr s25, [x19, 54]! 339 __ strd(v1, Address(__ pre(r7, -174))); // str d1, [x7, -174]! 340 __ strs(v8, Address(__ pre(r25, 54))); // str s8, [x25, 54]! 341 342 // post 343 // LoadStoreOp 344 __ str(r5, Address(__ post(r11, 37))); // str x5, [x11], 37 345 __ strw(r24, Address(__ post(r15, 19))); // str w24, [x15], 19 346 __ strb(r15, Address(__ post(r26, -1))); // strb w15, [x26], -1 347 __ strh(r18, Address(__ post(r18, -6))); // strh w18, [x18], -6 348 __ ldr(r7, Address(__ post(r2, -230))); // ldr x7, [x2], -230 349 __ ldrw(r27, Address(__ post(r11, -27))); // ldr w27, [x11], -27 350 __ ldrb(r18, Address(__ post(r3, -25))); // ldrb w18, [x3], -25 351 __ ldrh(r10, Address(__ post(r24, -32))); // ldrh w10, [x24], -32 352 __ ldrsb(r22, Address(__ post(r10, 4))); // ldrsb x22, [x10], 4 353 __ ldrsh(r17, Address(__ post(r12, 25))); // ldrsh x17, [x12], 25 354 __ ldrshw(r8, Address(__ post(r7, -62))); // ldrsh w8, [x7], -62 355 __ ldrsw(r23, Address(__ post(r22, -51))); // ldrsw x23, [x22], -51 356 __ ldrd(v24, Address(__ post(r25, 48))); // ldr d24, [x25], 48 357 __ ldrs(v21, Address(__ post(r12, -10))); // ldr s21, [x12], -10 358 __ strd(v18, Address(__ post(r13, -222))); // str d18, [x13], -222 359 __ strs(v16, Address(__ post(r1, -41))); // str s16, [x1], -41 360 361 // base_plus_reg 362 // LoadStoreOp 363 __ str(r2, Address(r22, r15, Address::sxtw(0))); // str x2, [x22, w15, sxtw #0] 364 __ strw(r2, Address(r16, r29, Address::lsl(0))); // str w2, [x16, x29, lsl #0] 365 __ strb(r20, Address(r18, r14, Address::uxtw(0))); // strb w20, [x18, w14, uxtw #0] 366 __ strh(r6, Address(r19, r20, Address::sxtx(1))); // strh w6, [x19, x20, sxtx #1] 367 __ ldr(r14, Address(r29, r14, Address::sxtw(0))); // ldr x14, [x29, w14, sxtw #0] 368 __ ldrw(r16, Address(r20, r12, Address::sxtw(2))); // ldr w16, [x20, w12, sxtw #2] 369 __ ldrb(r9, Address(r12, r0, Address::sxtw(0))); // ldrb w9, [x12, w0, sxtw #0] 370 __ ldrh(r12, Address(r17, r3, Address::lsl(1))); // ldrh w12, [x17, x3, lsl #1] 371 __ ldrsb(r2, Address(r17, r3, Address::sxtx(0))); // ldrsb x2, [x17, x3, sxtx #0] 372 __ ldrsh(r7, Address(r1, r17, Address::uxtw(1))); // ldrsh x7, [x1, w17, uxtw #1] 373 __ ldrshw(r25, Address(r15, r18, Address::sxtw(1))); // ldrsh w25, [x15, w18, sxtw #1] 374 __ ldrsw(r23, Address(r21, r12, Address::lsl(0))); // ldrsw x23, [x21, x12, lsl #0] 375 __ ldrd(v5, Address(r13, r8, Address::lsl(3))); // ldr d5, [x13, x8, lsl #3] 376 __ ldrs(v3, Address(r10, r22, Address::lsl(2))); // ldr s3, [x10, x22, lsl #2] 377 __ strd(v14, Address(r2, r27, Address::sxtw(0))); // str d14, [x2, w27, sxtw #0] 378 __ strs(v20, Address(r6, r25, Address::lsl(0))); // str s20, [x6, x25, lsl #0] 379 380 // base_plus_scaled_offset 381 // LoadStoreOp 382 __ str(r30, Address(r7, 16256)); // str x30, [x7, 16256] 383 __ strw(r15, Address(r8, 7588)); // str w15, [x8, 7588] 384 __ strb(r11, Address(r0, 1866)); // strb w11, [x0, 1866] 385 __ strh(r3, Address(r17, 3734)); // strh w3, [x17, 3734] 386 __ ldr(r2, Address(r7, 14224)); // ldr x2, [x7, 14224] 387 __ ldrw(r5, Address(r9, 7396)); // ldr w5, [x9, 7396] 388 __ ldrb(r28, Address(r9, 1721)); // ldrb w28, [x9, 1721] 389 __ ldrh(r2, Address(r20, 3656)); // ldrh w2, [x20, 3656] 390 __ ldrsb(r22, Address(r14, 1887)); // ldrsb x22, [x14, 1887] 391 __ ldrsh(r8, Address(r0, 4080)); // ldrsh x8, [x0, 4080] 392 __ ldrshw(r0, Address(r30, 3916)); // ldrsh w0, [x30, 3916] 393 __ ldrsw(r24, Address(r19, 6828)); // ldrsw x24, [x19, 6828] 394 __ ldrd(v24, Address(r12, 13032)); // ldr d24, [x12, 13032] 395 __ ldrs(v8, Address(r8, 7452)); // ldr s8, [x8, 7452] 396 __ strd(v10, Address(r15, 15992)); // str d10, [x15, 15992] 397 __ strs(v26, Address(r19, 6688)); // str s26, [x19, 6688] 398 399 // pcrel 400 // LoadStoreOp 401 __ ldr(r10, forth); // ldr x10, forth 402 __ ldrw(r3, __ pc()); // ldr w3, . 403 404 // LoadStoreOp 405 __ prfm(Address(r23, 9)); // prfm PLDL1KEEP, [x23, 9] 406 407 // LoadStoreOp 408 __ prfm(back); // prfm PLDL1KEEP, back 409 410 // LoadStoreOp 411 __ prfm(Address(r3, r8, Address::uxtw(0))); // prfm PLDL1KEEP, [x3, w8, uxtw #0] 412 413 // LoadStoreOp 414 __ prfm(Address(r11, 15080)); // prfm PLDL1KEEP, [x11, 15080] 415 416 // AddSubCarryOp 417 __ adcw(r13, r9, r28); // adc w13, w9, w28 418 __ adcsw(r27, r19, r28); // adcs w27, w19, w28 419 __ sbcw(r19, r18, r6); // sbc w19, w18, w6 420 __ sbcsw(r14, r20, r3); // sbcs w14, w20, w3 421 __ adc(r16, r14, r8); // adc x16, x14, x8 422 __ adcs(r0, r29, r8); // adcs x0, x29, x8 423 __ sbc(r8, r24, r20); // sbc x8, x24, x20 424 __ sbcs(r12, r28, r0); // sbcs x12, x28, x0 425 426 // AddSubExtendedOp 427 __ addw(r23, r6, r16, ext::uxtb, 4); // add w23, w6, w16, uxtb #4 428 __ addsw(r25, r25, r23, ext::sxth, 2); // adds w25, w25, w23, sxth #2 429 __ sub(r26, r22, r4, ext::uxtx, 1); // sub x26, x22, x4, uxtx #1 430 __ subsw(r17, r29, r19, ext::sxtx, 3); // subs w17, w29, w19, sxtx #3 431 __ add(r11, r30, r21, ext::uxtb, 3); // add x11, x30, x21, uxtb #3 432 __ adds(r16, r19, r0, ext::sxtb, 2); // adds x16, x19, x0, sxtb #2 433 __ sub(r11, r9, r25, ext::sxtx, 1); // sub x11, x9, x25, sxtx #1 434 __ subs(r17, r20, r12, ext::sxtb, 4); // subs x17, x20, x12, sxtb #4 435 436 // ConditionalCompareOp 437 __ ccmnw(r13, r11, 3u, Assembler::LE); // ccmn w13, w11, #3, LE 438 __ ccmpw(r13, r12, 2u, Assembler::HI); // ccmp w13, w12, #2, HI 439 __ ccmn(r3, r2, 12u, Assembler::NE); // ccmn x3, x2, #12, NE 440 __ ccmp(r7, r21, 3u, Assembler::VS); // ccmp x7, x21, #3, VS 441 442 // ConditionalCompareImmedOp 443 __ ccmnw(r2, 14, 4, Assembler::CC); // ccmn w2, #14, #4, CC 444 __ ccmpw(r17, 17, 6, Assembler::PL); // ccmp w17, #17, #6, PL 445 __ ccmn(r10, 12, 0, Assembler::CS); // ccmn x10, #12, #0, CS 446 __ ccmp(r21, 18, 14, Assembler::GE); // ccmp x21, #18, #14, GE 447 448 // ConditionalSelectOp 449 __ cselw(r21, r13, r12, Assembler::GT); // csel w21, w13, w12, GT 450 __ csincw(r10, r27, r15, Assembler::LS); // csinc w10, w27, w15, LS 451 __ csinvw(r0, r13, r9, Assembler::HI); // csinv w0, w13, w9, HI 452 __ csnegw(r18, r4, r26, Assembler::VS); // csneg w18, w4, w26, VS 453 __ csel(r12, r29, r7, Assembler::LS); // csel x12, x29, x7, LS 454 __ csinc(r6, r7, r20, Assembler::VC); // csinc x6, x7, x20, VC 455 __ csinv(r22, r21, r3, Assembler::LE); // csinv x22, x21, x3, LE 456 __ csneg(r19, r12, r27, Assembler::LS); // csneg x19, x12, x27, LS 457 458 // TwoRegOp 459 __ rbitw(r0, r16); // rbit w0, w16 460 __ rev16w(r17, r23); // rev16 w17, w23 461 __ revw(r17, r14); // rev w17, w14 462 __ clzw(r24, r30); // clz w24, w30 463 __ clsw(r24, r22); // cls w24, w22 464 __ rbit(r3, r17); // rbit x3, x17 465 __ rev16(r12, r13); // rev16 x12, x13 466 __ rev32(r9, r22); // rev32 x9, x22 467 __ rev(r0, r0); // rev x0, x0 468 __ clz(r5, r16); // clz x5, x16 469 __ cls(r25, r22); // cls x25, x22 470 471 // ThreeRegOp 472 __ udivw(r29, r4, r0); // udiv w29, w4, w0 473 __ sdivw(r0, r29, r29); // sdiv w0, w29, w29 474 __ lslvw(r5, r17, r21); // lslv w5, w17, w21 475 __ lsrvw(r9, r9, r18); // lsrv w9, w9, w18 476 __ asrvw(r1, r27, r8); // asrv w1, w27, w8 477 __ rorvw(r18, r20, r13); // rorv w18, w20, w13 478 __ udiv(r8, r25, r12); // udiv x8, x25, x12 479 __ sdiv(r7, r5, r28); // sdiv x7, x5, x28 480 __ lslv(r5, r17, r27); // lslv x5, x17, x27 481 __ lsrv(r23, r26, r20); // lsrv x23, x26, x20 482 __ asrv(r28, r8, r28); // asrv x28, x8, x28 483 __ rorv(r3, r29, r4); // rorv x3, x29, x4 484 485 // FourRegMulOp 486 __ maddw(r17, r14, r26, r21); // madd w17, w14, w26, w21 487 __ msubw(r1, r30, r11, r11); // msub w1, w30, w11, w11 488 __ madd(r1, r17, r6, r28); // madd x1, x17, x6, x28 489 __ msub(r30, r6, r30, r8); // msub x30, x6, x30, x8 490 __ smaddl(r21, r6, r14, r8); // smaddl x21, w6, w14, x8 491 __ smsubl(r10, r10, r24, r19); // smsubl x10, w10, w24, x19 492 __ umaddl(r20, r18, r14, r24); // umaddl x20, w18, w14, x24 493 __ umsubl(r18, r2, r5, r5); // umsubl x18, w2, w5, x5 494 495 // ThreeRegFloatOp 496 __ fmuls(v8, v18, v13); // fmul s8, s18, s13 497 __ fdivs(v2, v14, v28); // fdiv s2, s14, s28 498 __ fadds(v15, v12, v28); // fadd s15, s12, s28 499 __ fsubs(v0, v12, v1); // fsub s0, s12, s1 500 __ fmuls(v15, v29, v4); // fmul s15, s29, s4 501 __ fmuld(v12, v1, v23); // fmul d12, d1, d23 502 __ fdivd(v27, v8, v18); // fdiv d27, d8, d18 503 __ faddd(v23, v20, v11); // fadd d23, d20, d11 504 __ fsubd(v8, v12, v18); // fsub d8, d12, d18 505 __ fmuld(v26, v24, v23); // fmul d26, d24, d23 506 507 // FourRegFloatOp 508 __ fmadds(v21, v23, v13, v25); // fmadd s21, s23, s13, s25 509 __ fmsubs(v22, v10, v1, v14); // fmsub s22, s10, s1, s14 510 __ fnmadds(v14, v20, v2, v30); // fnmadd s14, s20, s2, s30 511 __ fnmadds(v7, v29, v22, v22); // fnmadd s7, s29, s22, s22 512 __ fmaddd(v13, v5, v15, v5); // fmadd d13, d5, d15, d5 513 __ fmsubd(v14, v12, v5, v10); // fmsub d14, d12, d5, d10 514 __ fnmaddd(v10, v19, v0, v1); // fnmadd d10, d19, d0, d1 515 __ fnmaddd(v20, v2, v2, v0); // fnmadd d20, d2, d2, d0 516 517 // TwoRegFloatOp 518 __ fmovs(v25, v9); // fmov s25, s9 519 __ fabss(v20, v4); // fabs s20, s4 520 __ fnegs(v3, v27); // fneg s3, s27 521 __ fsqrts(v1, v2); // fsqrt s1, s2 522 __ fcvts(v30, v0); // fcvt d30, s0 523 __ fmovd(v12, v4); // fmov d12, d4 524 __ fabsd(v1, v27); // fabs d1, d27 525 __ fnegd(v8, v22); // fneg d8, d22 526 __ fsqrtd(v11, v11); // fsqrt d11, d11 527 __ fcvtd(v22, v28); // fcvt s22, d28 528 529 // FloatConvertOp 530 __ fcvtzsw(r28, v22); // fcvtzs w28, s22 531 __ fcvtzs(r20, v27); // fcvtzs x20, s27 532 __ fcvtzdw(r14, v0); // fcvtzs w14, d0 533 __ fcvtzd(r26, v11); // fcvtzs x26, d11 534 __ scvtfws(v28, r22); // scvtf s28, w22 535 __ scvtfs(v16, r10); // scvtf s16, x10 536 __ scvtfwd(v8, r21); // scvtf d8, w21 537 __ scvtfd(v21, r28); // scvtf d21, x28 538 __ fmovs(r24, v24); // fmov w24, s24 539 __ fmovd(r8, v19); // fmov x8, d19 540 __ fmovs(v8, r12); // fmov s8, w12 541 __ fmovd(v6, r7); // fmov d6, x7 542 543 // TwoRegFloatOp 544 __ fcmps(v30, v16); // fcmp s30, s16 545 __ fcmpd(v25, v11); // fcmp d25, d11 546 __ fcmps(v11, 0.0); // fcmp s11, #0.0 547 __ fcmpd(v11, 0.0); // fcmp d11, #0.0 548 549 // LoadStorePairOp 550 __ stpw(r29, r12, Address(r17, 128)); // stp w29, w12, [x17, #128] 551 __ ldpw(r22, r18, Address(r14, -96)); // ldp w22, w18, [x14, #-96] 552 __ ldpsw(r11, r16, Address(r1, 64)); // ldpsw x11, x16, [x1, #64] 553 __ stp(r0, r11, Address(r26, 112)); // stp x0, x11, [x26, #112] 554 __ ldp(r7, r1, Address(r26, 16)); // ldp x7, x1, [x26, #16] 555 556 // LoadStorePairOp 557 __ stpw(r10, r7, Address(__ pre(r24, 0))); // stp w10, w7, [x24, #0]! 558 __ ldpw(r7, r28, Address(__ pre(r24, -256))); // ldp w7, w28, [x24, #-256]! 559 __ ldpsw(r25, r28, Address(__ pre(r21, -240))); // ldpsw x25, x28, [x21, #-240]! 560 __ stp(r20, r18, Address(__ pre(r14, -16))); // stp x20, x18, [x14, #-16]! 561 __ ldp(r8, r10, Address(__ pre(r13, 80))); // ldp x8, x10, [x13, #80]! 562 563 // LoadStorePairOp 564 __ stpw(r26, r24, Address(__ post(r2, -128))); // stp w26, w24, [x2], #-128 565 __ ldpw(r2, r25, Address(__ post(r21, -192))); // ldp w2, w25, [x21], #-192 566 __ ldpsw(r17, r2, Address(__ post(r21, -144))); // ldpsw x17, x2, [x21], #-144 567 __ stp(r12, r10, Address(__ post(r11, 96))); // stp x12, x10, [x11], #96 568 __ ldp(r24, r6, Address(__ post(r17, -32))); // ldp x24, x6, [x17], #-32 569 570 // LoadStorePairOp 571 __ stnpw(r3, r30, Address(r14, -224)); // stnp w3, w30, [x14, #-224] 572 __ ldnpw(r15, r20, Address(r26, -144)); // ldnp w15, w20, [x26, #-144] 573 __ stnp(r22, r25, Address(r12, -128)); // stnp x22, x25, [x12, #-128] 574 __ ldnp(r27, r22, Address(r17, -176)); // ldnp x27, x22, [x17, #-176] 575 576 // FloatImmediateOp 577 __ fmovd(v0, 2.0); // fmov d0, #2.0 578 __ fmovd(v0, 2.125); // fmov d0, #2.125 579 __ fmovd(v0, 4.0); // fmov d0, #4.0 580 __ fmovd(v0, 4.25); // fmov d0, #4.25 581 __ fmovd(v0, 8.0); // fmov d0, #8.0 582 __ fmovd(v0, 8.5); // fmov d0, #8.5 583 __ fmovd(v0, 16.0); // fmov d0, #16.0 584 __ fmovd(v0, 17.0); // fmov d0, #17.0 585 __ fmovd(v0, 0.125); // fmov d0, #0.125 586 __ fmovd(v0, 0.1328125); // fmov d0, #0.1328125 587 __ fmovd(v0, 0.25); // fmov d0, #0.25 588 __ fmovd(v0, 0.265625); // fmov d0, #0.265625 589 __ fmovd(v0, 0.5); // fmov d0, #0.5 590 __ fmovd(v0, 0.53125); // fmov d0, #0.53125 591 __ fmovd(v0, 1.0); // fmov d0, #1.0 592 __ fmovd(v0, 1.0625); // fmov d0, #1.0625 593 __ fmovd(v0, -2.0); // fmov d0, #-2.0 594 __ fmovd(v0, -2.125); // fmov d0, #-2.125 595 __ fmovd(v0, -4.0); // fmov d0, #-4.0 596 __ fmovd(v0, -4.25); // fmov d0, #-4.25 597 __ fmovd(v0, -8.0); // fmov d0, #-8.0 598 __ fmovd(v0, -8.5); // fmov d0, #-8.5 599 __ fmovd(v0, -16.0); // fmov d0, #-16.0 600 __ fmovd(v0, -17.0); // fmov d0, #-17.0 601 __ fmovd(v0, -0.125); // fmov d0, #-0.125 602 __ fmovd(v0, -0.1328125); // fmov d0, #-0.1328125 603 __ fmovd(v0, -0.25); // fmov d0, #-0.25 604 __ fmovd(v0, -0.265625); // fmov d0, #-0.265625 605 __ fmovd(v0, -0.5); // fmov d0, #-0.5 606 __ fmovd(v0, -0.53125); // fmov d0, #-0.53125 607 __ fmovd(v0, -1.0); // fmov d0, #-1.0 608 __ fmovd(v0, -1.0625); // fmov d0, #-1.0625 609 610 __ bind(forth); 611 612 /* 613 aarch64ops.o: file format elf64-littleaarch64 614 615 616 Disassembly of section .text: 617 618 0000000000000000 <back>: 619 0: 8b0772d3 add x19, x22, x7, lsl #28 620 4: cb4a3570 sub x16, x11, x10, lsr #13 621 8: ab9c09bb adds x27, x13, x28, asr #2 622 c: eb9aa794 subs x20, x28, x26, asr #41 623 10: 0b934e68 add w8, w19, w19, asr #19 624 14: 4b0a3924 sub w4, w9, w10, lsl #14 625 18: 2b1e3568 adds w8, w11, w30, lsl #13 626 1c: 6b132720 subs w0, w25, w19, lsl #9 627 20: 8a154c14 and x20, x0, x21, lsl #19 628 24: aa1445d5 orr x21, x14, x20, lsl #17 629 28: ca01cf99 eor x25, x28, x1, lsl #51 630 2c: ea8b3f6a ands x10, x27, x11, asr #15 631 30: 0a8c5cb9 and w25, w5, w12, asr #23 632 34: 2a4a11d2 orr w18, w14, w10, lsr #4 633 38: 4a855aa4 eor w4, w21, w5, asr #22 634 3c: 6a857415 ands w21, w0, w5, asr #29 635 40: 8aa697da bic x26, x30, x6, asr #37 636 44: aa6d7423 orn x3, x1, x13, lsr #29 637 48: ca29bf80 eon x0, x28, x9, lsl #47 638 4c: ea3cb8bd bics x29, x5, x28, lsl #46 639 50: 0a675249 bic w9, w18, w7, lsr #20 640 54: 2ab961ba orn w26, w13, w25, asr #24 641 58: 4a331899 eon w25, w4, w19, lsl #6 642 5c: 6a646345 bics w5, w26, w4, lsr #24 643 60: 11055267 add w7, w19, #0x154 644 64: 31064408 adds w8, w0, #0x191 645 68: 51028e9d sub w29, w20, #0xa3 646 6c: 710bdee8 subs w8, w23, #0x2f7 647 70: 91082d81 add x1, x12, #0x20b 648 74: b106a962 adds x2, x11, #0x1aa 649 78: d10b33ae sub x14, x29, #0x2cc 650 7c: f10918ab subs x11, x5, #0x246 651 80: 121102d7 and w23, w22, #0x8000 652 84: 3204cd44 orr w4, w10, #0xf0f0f0f0 653 88: 5204cf00 eor w0, w24, #0xf0f0f0f0 654 8c: 72099fb3 ands w19, w29, #0x7f807f80 655 90: 92729545 and x5, x10, #0xfffffffffc000 656 94: b20e37cc orr x12, x30, #0xfffc0000fffc0000 657 98: d27c34be eor x30, x5, #0x3fff0 658 9c: f27e4efa ands x26, x23, #0x3ffffc 659 a0: 14000000 b a0 <back+0xa0> 660 a4: 17ffffd7 b 0 <back> 661 a8: 1400017f b 6a4 <forth> 662 ac: 94000000 bl ac <back+0xac> 663 b0: 97ffffd4 bl 0 <back> 664 b4: 9400017c bl 6a4 <forth> 665 b8: 3400000c cbz w12, b8 <back+0xb8> 666 bc: 34fffa2c cbz w12, 0 <back> 667 c0: 34002f2c cbz w12, 6a4 <forth> 668 c4: 35000014 cbnz w20, c4 <back+0xc4> 669 c8: 35fff9d4 cbnz w20, 0 <back> 670 cc: 35002ed4 cbnz w20, 6a4 <forth> 671 d0: b400000c cbz x12, d0 <back+0xd0> 672 d4: b4fff96c cbz x12, 0 <back> 673 d8: b4002e6c cbz x12, 6a4 <forth> 674 dc: b5000018 cbnz x24, dc <back+0xdc> 675 e0: b5fff918 cbnz x24, 0 <back> 676 e4: b5002e18 cbnz x24, 6a4 <forth> 677 e8: 10000006 adr x6, e8 <back+0xe8> 678 ec: 10fff8a6 adr x6, 0 <back> 679 f0: 10002da6 adr x6, 6a4 <forth> 680 f4: 90000015 adrp x21, 0 <back> 681 f8: 36080001 tbz w1, #1, f8 <back+0xf8> 682 fc: 360ff821 tbz w1, #1, 0 <back> 683 100: 36082d21 tbz w1, #1, 6a4 <forth> 684 104: 37480008 tbnz w8, #9, 104 <back+0x104> 685 108: 374ff7c8 tbnz w8, #9, 0 <back> 686 10c: 37482cc8 tbnz w8, #9, 6a4 <forth> 687 110: 128b50ec movn w12, #0x5a87 688 114: 52a9ff8b movz w11, #0x4ffc, lsl #16 689 118: 7281d095 movk w21, #0xe84 690 11c: 92edfebd movn x29, #0x6ff5, lsl #48 691 120: d28361e3 movz x3, #0x1b0f 692 124: f2a4cc96 movk x22, #0x2664, lsl #16 693 128: 9346590c sbfx x12, x8, #6, #17 694 12c: 33194f33 bfi w19, w25, #7, #20 695 130: 531d3d89 ubfiz w9, w12, #3, #16 696 134: 9350433c sbfx x28, x25, #16, #1 697 138: b34464ac bfxil x12, x5, #4, #22 698 13c: d3462140 ubfx x0, x10, #6, #3 699 140: 139a61a4 extr w4, w13, w26, #24 700 144: 93d87fd7 extr x23, x30, x24, #31 701 148: 54000000 b.eq 148 <back+0x148> 702 14c: 54fff5a0 b.eq 0 <back> 703 150: 54002aa0 b.eq 6a4 <forth> 704 154: 54000001 b.ne 154 <back+0x154> 705 158: 54fff541 b.ne 0 <back> 706 15c: 54002a41 b.ne 6a4 <forth> 707 160: 54000002 b.cs 160 <back+0x160> 708 164: 54fff4e2 b.cs 0 <back> 709 168: 540029e2 b.cs 6a4 <forth> 710 16c: 54000002 b.cs 16c <back+0x16c> 711 170: 54fff482 b.cs 0 <back> 712 174: 54002982 b.cs 6a4 <forth> 713 178: 54000003 b.cc 178 <back+0x178> 714 17c: 54fff423 b.cc 0 <back> 715 180: 54002923 b.cc 6a4 <forth> 716 184: 54000003 b.cc 184 <back+0x184> 717 188: 54fff3c3 b.cc 0 <back> 718 18c: 540028c3 b.cc 6a4 <forth> 719 190: 54000004 b.mi 190 <back+0x190> 720 194: 54fff364 b.mi 0 <back> 721 198: 54002864 b.mi 6a4 <forth> 722 19c: 54000005 b.pl 19c <back+0x19c> 723 1a0: 54fff305 b.pl 0 <back> 724 1a4: 54002805 b.pl 6a4 <forth> 725 1a8: 54000006 b.vs 1a8 <back+0x1a8> 726 1ac: 54fff2a6 b.vs 0 <back> 727 1b0: 540027a6 b.vs 6a4 <forth> 728 1b4: 54000007 b.vc 1b4 <back+0x1b4> 729 1b8: 54fff247 b.vc 0 <back> 730 1bc: 54002747 b.vc 6a4 <forth> 731 1c0: 54000008 b.hi 1c0 <back+0x1c0> 732 1c4: 54fff1e8 b.hi 0 <back> 733 1c8: 540026e8 b.hi 6a4 <forth> 734 1cc: 54000009 b.ls 1cc <back+0x1cc> 735 1d0: 54fff189 b.ls 0 <back> 736 1d4: 54002689 b.ls 6a4 <forth> 737 1d8: 5400000a b.ge 1d8 <back+0x1d8> 738 1dc: 54fff12a b.ge 0 <back> 739 1e0: 5400262a b.ge 6a4 <forth> 740 1e4: 5400000b b.lt 1e4 <back+0x1e4> 741 1e8: 54fff0cb b.lt 0 <back> 742 1ec: 540025cb b.lt 6a4 <forth> 743 1f0: 5400000c b.gt 1f0 <back+0x1f0> 744 1f4: 54fff06c b.gt 0 <back> 745 1f8: 5400256c b.gt 6a4 <forth> 746 1fc: 5400000d b.le 1fc <back+0x1fc> 747 200: 54fff00d b.le 0 <back> 748 204: 5400250d b.le 6a4 <forth> 749 208: 5400000e b.al 208 <back+0x208> 750 20c: 54ffefae b.al 0 <back> 751 210: 540024ae b.al 6a4 <forth> 752 214: 5400000f b.nv 214 <back+0x214> 753 218: 54ffef4f b.nv 0 <back> 754 21c: 5400244f b.nv 6a4 <forth> 755 220: d4063721 svc #0x31b9 756 224: d4035082 hvc #0x1a84 757 228: d400bfe3 smc #0x5ff 758 22c: d4282fc0 brk #0x417e 759 230: d444c320 hlt #0x2619 760 234: d503201f nop 761 238: d69f03e0 eret 762 23c: d6bf03e0 drps 763 240: d5033fdf isb 764 244: d5033f9f dsb sy 765 248: d5033abf dmb ishst 766 24c: d61f0040 br x2 767 250: d63f00a0 blr x5 768 254: c8147c55 stxr w20, x21, [x2] 769 258: c805fcfd stlxr w5, x29, [x7] 770 25c: c85f7e05 ldxr x5, [x16] 771 260: c85fffbb ldaxr x27, [x29] 772 264: c89fffa0 stlr x0, [x29] 773 268: c8dfff95 ldar x21, [x28] 774 26c: 88157cf8 stxr w21, w24, [x7] 775 270: 8815ff9a stlxr w21, w26, [x28] 776 274: 885f7cd5 ldxr w21, [x6] 777 278: 885fffcf ldaxr w15, [x30] 778 27c: 889ffc73 stlr w19, [x3] 779 280: 88dffc56 ldar w22, [x2] 780 284: 48127c0f stxrh w18, w15, [x0] 781 288: 480bff85 stlxrh w11, w5, [x28] 782 28c: 485f7cdd ldxrh w29, [x6] 783 290: 485ffcf2 ldaxrh w18, [x7] 784 294: 489fff99 stlrh w25, [x28] 785 298: 48dffe62 ldarh w2, [x19] 786 29c: 080a7c3e stxrb w10, w30, [x1] 787 2a0: 0814fed5 stlxrb w20, w21, [x22] 788 2a4: 085f7c59 ldxrb w25, [x2] 789 2a8: 085ffcb8 ldaxrb w24, [x5] 790 2ac: 089ffc70 stlrb w16, [x3] 791 2b0: 08dfffb6 ldarb w22, [x29] 792 2b4: c87f0a68 ldxp x8, x2, [x19] 793 2b8: c87fcdc7 ldaxp x7, x19, [x14] 794 2bc: c82870bb stxp w8, x27, x28, [x5] 795 2c0: c825b8c8 stlxp w5, x8, x14, [x6] 796 2c4: 887f12d9 ldxp w25, w4, [x22] 797 2c8: 887fb9ed ldaxp w13, w14, [x15] 798 2cc: 8834215a stxp w20, w26, w8, [x10] 799 2d0: 8837ca52 stlxp w23, w18, w18, [x18] 800 2d4: f806317e str x30, [x11,#99] 801 2d8: b81b3337 str w23, [x25,#-77] 802 2dc: 39000dc2 strb w2, [x14,#3] 803 2e0: 78005149 strh w9, [x10,#5] 804 2e4: f84391f4 ldr x20, [x15,#57] 805 2e8: b85b220c ldr w12, [x16,#-78] 806 2ec: 385fd356 ldrb w22, [x26,#-3] 807 2f0: 785d127e ldrh w30, [x19,#-47] 808 2f4: 389f4149 ldrsb x9, [x10,#-12] 809 2f8: 79801e3c ldrsh x28, [x17,#14] 810 2fc: 79c014a3 ldrsh w3, [x5,#10] 811 300: b89a5231 ldrsw x17, [x17,#-91] 812 304: fc5ef282 ldr d2, [x20,#-17] 813 308: bc5f60f6 ldr s22, [x7,#-10] 814 30c: fc12125e str d30, [x18,#-223] 815 310: bc0152cd str s13, [x22,#21] 816 314: f8190e49 str x9, [x18,#-112]! 817 318: b800befd str w29, [x23,#11]! 818 31c: 381ffd92 strb w18, [x12,#-1]! 819 320: 781e9e90 strh w16, [x20,#-23]! 820 324: f8409fa3 ldr x3, [x29,#9]! 821 328: b8413c79 ldr w25, [x3,#19]! 822 32c: 385fffa1 ldrb w1, [x29,#-1]! 823 330: 785c7fa8 ldrh w8, [x29,#-57]! 824 334: 389f3dc5 ldrsb x5, [x14,#-13]! 825 338: 78801f6a ldrsh x10, [x27,#1]! 826 33c: 78c19d4b ldrsh w11, [x10,#25]! 827 340: b89a4ec4 ldrsw x4, [x22,#-92]! 828 344: fc408eeb ldr d11, [x23,#8]! 829 348: bc436e79 ldr s25, [x19,#54]! 830 34c: fc152ce1 str d1, [x7,#-174]! 831 350: bc036f28 str s8, [x25,#54]! 832 354: f8025565 str x5, [x11],#37 833 358: b80135f8 str w24, [x15],#19 834 35c: 381ff74f strb w15, [x26],#-1 835 360: 781fa652 strh w18, [x18],#-6 836 364: f851a447 ldr x7, [x2],#-230 837 368: b85e557b ldr w27, [x11],#-27 838 36c: 385e7472 ldrb w18, [x3],#-25 839 370: 785e070a ldrh w10, [x24],#-32 840 374: 38804556 ldrsb x22, [x10],#4 841 378: 78819591 ldrsh x17, [x12],#25 842 37c: 78dc24e8 ldrsh w8, [x7],#-62 843 380: b89cd6d7 ldrsw x23, [x22],#-51 844 384: fc430738 ldr d24, [x25],#48 845 388: bc5f6595 ldr s21, [x12],#-10 846 38c: fc1225b2 str d18, [x13],#-222 847 390: bc1d7430 str s16, [x1],#-41 848 394: f82fcac2 str x2, [x22,w15,sxtw] 849 398: b83d6a02 str w2, [x16,x29] 850 39c: 382e5a54 strb w20, [x18,w14,uxtw #0] 851 3a0: 7834fa66 strh w6, [x19,x20,sxtx #1] 852 3a4: f86ecbae ldr x14, [x29,w14,sxtw] 853 3a8: b86cda90 ldr w16, [x20,w12,sxtw #2] 854 3ac: 3860d989 ldrb w9, [x12,w0,sxtw #0] 855 3b0: 78637a2c ldrh w12, [x17,x3,lsl #1] 856 3b4: 38a3fa22 ldrsb x2, [x17,x3,sxtx #0] 857 3b8: 78b15827 ldrsh x7, [x1,w17,uxtw #1] 858 3bc: 78f2d9f9 ldrsh w25, [x15,w18,sxtw #1] 859 3c0: b8ac6ab7 ldrsw x23, [x21,x12] 860 3c4: fc6879a5 ldr d5, [x13,x8,lsl #3] 861 3c8: bc767943 ldr s3, [x10,x22,lsl #2] 862 3cc: fc3bc84e str d14, [x2,w27,sxtw] 863 3d0: bc3968d4 str s20, [x6,x25] 864 3d4: f91fc0fe str x30, [x7,#16256] 865 3d8: b91da50f str w15, [x8,#7588] 866 3dc: 391d280b strb w11, [x0,#1866] 867 3e0: 791d2e23 strh w3, [x17,#3734] 868 3e4: f95bc8e2 ldr x2, [x7,#14224] 869 3e8: b95ce525 ldr w5, [x9,#7396] 870 3ec: 395ae53c ldrb w28, [x9,#1721] 871 3f0: 795c9282 ldrh w2, [x20,#3656] 872 3f4: 399d7dd6 ldrsb x22, [x14,#1887] 873 3f8: 799fe008 ldrsh x8, [x0,#4080] 874 3fc: 79de9bc0 ldrsh w0, [x30,#3916] 875 400: b99aae78 ldrsw x24, [x19,#6828] 876 404: fd597598 ldr d24, [x12,#13032] 877 408: bd5d1d08 ldr s8, [x8,#7452] 878 40c: fd1f3dea str d10, [x15,#15992] 879 410: bd1a227a str s26, [x19,#6688] 880 414: 5800148a ldr x10, 6a4 <forth> 881 418: 18000003 ldr w3, 418 <back+0x418> 882 41c: f88092e0 prfm pldl1keep, [x23,#9] 883 420: d8ffdf00 prfm pldl1keep, 0 <back> 884 424: f8a84860 prfm pldl1keep, [x3,w8,uxtw] 885 428: f99d7560 prfm pldl1keep, [x11,#15080] 886 42c: 1a1c012d adc w13, w9, w28 887 430: 3a1c027b adcs w27, w19, w28 888 434: 5a060253 sbc w19, w18, w6 889 438: 7a03028e sbcs w14, w20, w3 890 43c: 9a0801d0 adc x16, x14, x8 891 440: ba0803a0 adcs x0, x29, x8 892 444: da140308 sbc x8, x24, x20 893 448: fa00038c sbcs x12, x28, x0 894 44c: 0b3010d7 add w23, w6, w16, uxtb #4 895 450: 2b37ab39 adds w25, w25, w23, sxth #2 896 454: cb2466da sub x26, x22, x4, uxtx #1 897 458: 6b33efb1 subs w17, w29, w19, sxtx #3 898 45c: 8b350fcb add x11, x30, w21, uxtb #3 899 460: ab208a70 adds x16, x19, w0, sxtb #2 900 464: cb39e52b sub x11, x9, x25, sxtx #1 901 468: eb2c9291 subs x17, x20, w12, sxtb #4 902 46c: 3a4bd1a3 ccmn w13, w11, #0x3, le 903 470: 7a4c81a2 ccmp w13, w12, #0x2, hi 904 474: ba42106c ccmn x3, x2, #0xc, ne 905 478: fa5560e3 ccmp x7, x21, #0x3, vs 906 47c: 3a4e3844 ccmn w2, #0xe, #0x4, cc 907 480: 7a515a26 ccmp w17, #0x11, #0x6, pl 908 484: ba4c2940 ccmn x10, #0xc, #0x0, cs 909 488: fa52aaae ccmp x21, #0x12, #0xe, ge 910 48c: 1a8cc1b5 csel w21, w13, w12, gt 911 490: 1a8f976a csinc w10, w27, w15, ls 912 494: 5a8981a0 csinv w0, w13, w9, hi 913 498: 5a9a6492 csneg w18, w4, w26, vs 914 49c: 9a8793ac csel x12, x29, x7, ls 915 4a0: 9a9474e6 csinc x6, x7, x20, vc 916 4a4: da83d2b6 csinv x22, x21, x3, le 917 4a8: da9b9593 csneg x19, x12, x27, ls 918 4ac: 5ac00200 rbit w0, w16 919 4b0: 5ac006f1 rev16 w17, w23 920 4b4: 5ac009d1 rev w17, w14 921 4b8: 5ac013d8 clz w24, w30 922 4bc: 5ac016d8 cls w24, w22 923 4c0: dac00223 rbit x3, x17 924 4c4: dac005ac rev16 x12, x13 925 4c8: dac00ac9 rev32 x9, x22 926 4cc: dac00c00 rev x0, x0 927 4d0: dac01205 clz x5, x16 928 4d4: dac016d9 cls x25, x22 929 4d8: 1ac0089d udiv w29, w4, w0 930 4dc: 1add0fa0 sdiv w0, w29, w29 931 4e0: 1ad52225 lsl w5, w17, w21 932 4e4: 1ad22529 lsr w9, w9, w18 933 4e8: 1ac82b61 asr w1, w27, w8 934 4ec: 1acd2e92 ror w18, w20, w13 935 4f0: 9acc0b28 udiv x8, x25, x12 936 4f4: 9adc0ca7 sdiv x7, x5, x28 937 4f8: 9adb2225 lsl x5, x17, x27 938 4fc: 9ad42757 lsr x23, x26, x20 939 500: 9adc291c asr x28, x8, x28 940 504: 9ac42fa3 ror x3, x29, x4 941 508: 1b1a55d1 madd w17, w14, w26, w21 942 50c: 1b0bafc1 msub w1, w30, w11, w11 943 510: 9b067221 madd x1, x17, x6, x28 944 514: 9b1ea0de msub x30, x6, x30, x8 945 518: 9b2e20d5 smaddl x21, w6, w14, x8 946 51c: 9b38cd4a smsubl x10, w10, w24, x19 947 520: 9bae6254 umaddl x20, w18, w14, x24 948 524: 9ba59452 umsubl x18, w2, w5, x5 949 528: 1e2d0a48 fmul s8, s18, s13 950 52c: 1e3c19c2 fdiv s2, s14, s28 951 530: 1e3c298f fadd s15, s12, s28 952 534: 1e213980 fsub s0, s12, s1 953 538: 1e240baf fmul s15, s29, s4 954 53c: 1e77082c fmul d12, d1, d23 955 540: 1e72191b fdiv d27, d8, d18 956 544: 1e6b2a97 fadd d23, d20, d11 957 548: 1e723988 fsub d8, d12, d18 958 54c: 1e770b1a fmul d26, d24, d23 959 550: 1f0d66f5 fmadd s21, s23, s13, s25 960 554: 1f01b956 fmsub s22, s10, s1, s14 961 558: 1f227a8e fnmadd s14, s20, s2, s30 962 55c: 1f365ba7 fnmadd s7, s29, s22, s22 963 560: 1f4f14ad fmadd d13, d5, d15, d5 964 564: 1f45a98e fmsub d14, d12, d5, d10 965 568: 1f60066a fnmadd d10, d19, d0, d1 966 56c: 1f620054 fnmadd d20, d2, d2, d0 967 570: 1e204139 fmov s25, s9 968 574: 1e20c094 fabs s20, s4 969 578: 1e214363 fneg s3, s27 970 57c: 1e21c041 fsqrt s1, s2 971 580: 1e22c01e fcvt d30, s0 972 584: 1e60408c fmov d12, d4 973 588: 1e60c361 fabs d1, d27 974 58c: 1e6142c8 fneg d8, d22 975 590: 1e61c16b fsqrt d11, d11 976 594: 1e624396 fcvt s22, d28 977 598: 1e3802dc fcvtzs w28, s22 978 59c: 9e380374 fcvtzs x20, s27 979 5a0: 1e78000e fcvtzs w14, d0 980 5a4: 9e78017a fcvtzs x26, d11 981 5a8: 1e2202dc scvtf s28, w22 982 5ac: 9e220150 scvtf s16, x10 983 5b0: 1e6202a8 scvtf d8, w21 984 5b4: 9e620395 scvtf d21, x28 985 5b8: 1e260318 fmov w24, s24 986 5bc: 9e660268 fmov x8, d19 987 5c0: 1e270188 fmov s8, w12 988 5c4: 9e6700e6 fmov d6, x7 989 5c8: 1e3023c0 fcmp s30, s16 990 5cc: 1e6b2320 fcmp d25, d11 991 5d0: 1e202168 fcmp s11, #0.0 992 5d4: 1e602168 fcmp d11, #0.0 993 5d8: 2910323d stp w29, w12, [x17,#128] 994 5dc: 297449d6 ldp w22, w18, [x14,#-96] 995 5e0: 6948402b ldpsw x11, x16, [x1,#64] 996 5e4: a9072f40 stp x0, x11, [x26,#112] 997 5e8: a9410747 ldp x7, x1, [x26,#16] 998 5ec: 29801f0a stp w10, w7, [x24,#0]! 999 5f0: 29e07307 ldp w7, w28, [x24,#-256]! 1000 5f4: 69e272b9 ldpsw x25, x28, [x21,#-240]! 1001 5f8: a9bf49d4 stp x20, x18, [x14,#-16]! 1002 5fc: a9c529a8 ldp x8, x10, [x13,#80]! 1003 600: 28b0605a stp w26, w24, [x2],#-128 1004 604: 28e866a2 ldp w2, w25, [x21],#-192 1005 608: 68ee0ab1 ldpsw x17, x2, [x21],#-144 1006 60c: a886296c stp x12, x10, [x11],#96 1007 610: a8fe1a38 ldp x24, x6, [x17],#-32 1008 614: 282479c3 stnp w3, w30, [x14,#-224] 1009 618: 286e534f ldnp w15, w20, [x26,#-144] 1010 61c: a8386596 stnp x22, x25, [x12,#-128] 1011 620: a8755a3b ldnp x27, x22, [x17,#-176] 1012 624: 1e601000 fmov d0, #2.000000000000000000e+00 1013 628: 1e603000 fmov d0, #2.125000000000000000e+00 1014 62c: 1e621000 fmov d0, #4.000000000000000000e+00 1015 630: 1e623000 fmov d0, #4.250000000000000000e+00 1016 634: 1e641000 fmov d0, #8.000000000000000000e+00 1017 638: 1e643000 fmov d0, #8.500000000000000000e+00 1018 63c: 1e661000 fmov d0, #1.600000000000000000e+01 1019 640: 1e663000 fmov d0, #1.700000000000000000e+01 1020 644: 1e681000 fmov d0, #1.250000000000000000e-01 1021 648: 1e683000 fmov d0, #1.328125000000000000e-01 1022 64c: 1e6a1000 fmov d0, #2.500000000000000000e-01 1023 650: 1e6a3000 fmov d0, #2.656250000000000000e-01 1024 654: 1e6c1000 fmov d0, #5.000000000000000000e-01 1025 658: 1e6c3000 fmov d0, #5.312500000000000000e-01 1026 65c: 1e6e1000 fmov d0, #1.000000000000000000e+00 1027 660: 1e6e3000 fmov d0, #1.062500000000000000e+00 1028 664: 1e701000 fmov d0, #-2.000000000000000000e+00 1029 668: 1e703000 fmov d0, #-2.125000000000000000e+00 1030 66c: 1e721000 fmov d0, #-4.000000000000000000e+00 1031 670: 1e723000 fmov d0, #-4.250000000000000000e+00 1032 674: 1e741000 fmov d0, #-8.000000000000000000e+00 1033 678: 1e743000 fmov d0, #-8.500000000000000000e+00 1034 67c: 1e761000 fmov d0, #-1.600000000000000000e+01 1035 680: 1e763000 fmov d0, #-1.700000000000000000e+01 1036 684: 1e781000 fmov d0, #-1.250000000000000000e-01 1037 688: 1e783000 fmov d0, #-1.328125000000000000e-01 1038 68c: 1e7a1000 fmov d0, #-2.500000000000000000e-01 1039 690: 1e7a3000 fmov d0, #-2.656250000000000000e-01 1040 694: 1e7c1000 fmov d0, #-5.000000000000000000e-01 1041 698: 1e7c3000 fmov d0, #-5.312500000000000000e-01 1042 69c: 1e7e1000 fmov d0, #-1.000000000000000000e+00 1043 6a0: 1e7e3000 fmov d0, #-1.062500000000000000e+00 1044 */ 1045 1046 static const unsigned int insns[] = 1047 { 1048 0x8b0772d3, 0xcb4a3570, 0xab9c09bb, 0xeb9aa794, 1049 0x0b934e68, 0x4b0a3924, 0x2b1e3568, 0x6b132720, 1050 0x8a154c14, 0xaa1445d5, 0xca01cf99, 0xea8b3f6a, 1051 0x0a8c5cb9, 0x2a4a11d2, 0x4a855aa4, 0x6a857415, 1052 0x8aa697da, 0xaa6d7423, 0xca29bf80, 0xea3cb8bd, 1053 0x0a675249, 0x2ab961ba, 0x4a331899, 0x6a646345, 1054 0x11055267, 0x31064408, 0x51028e9d, 0x710bdee8, 1055 0x91082d81, 0xb106a962, 0xd10b33ae, 0xf10918ab, 1056 0x121102d7, 0x3204cd44, 0x5204cf00, 0x72099fb3, 1057 0x92729545, 0xb20e37cc, 0xd27c34be, 0xf27e4efa, 1058 0x14000000, 0x17ffffd7, 0x1400017f, 0x94000000, 1059 0x97ffffd4, 0x9400017c, 0x3400000c, 0x34fffa2c, 1060 0x34002f2c, 0x35000014, 0x35fff9d4, 0x35002ed4, 1061 0xb400000c, 0xb4fff96c, 0xb4002e6c, 0xb5000018, 1062 0xb5fff918, 0xb5002e18, 0x10000006, 0x10fff8a6, 1063 0x10002da6, 0x90000015, 0x36080001, 0x360ff821, 1064 0x36082d21, 0x37480008, 0x374ff7c8, 0x37482cc8, 1065 0x128b50ec, 0x52a9ff8b, 0x7281d095, 0x92edfebd, 1066 0xd28361e3, 0xf2a4cc96, 0x9346590c, 0x33194f33, 1067 0x531d3d89, 0x9350433c, 0xb34464ac, 0xd3462140, 1068 0x139a61a4, 0x93d87fd7, 0x54000000, 0x54fff5a0, 1069 0x54002aa0, 0x54000001, 0x54fff541, 0x54002a41, 1070 0x54000002, 0x54fff4e2, 0x540029e2, 0x54000002, 1071 0x54fff482, 0x54002982, 0x54000003, 0x54fff423, 1072 0x54002923, 0x54000003, 0x54fff3c3, 0x540028c3, 1073 0x54000004, 0x54fff364, 0x54002864, 0x54000005, 1074 0x54fff305, 0x54002805, 0x54000006, 0x54fff2a6, 1075 0x540027a6, 0x54000007, 0x54fff247, 0x54002747, 1076 0x54000008, 0x54fff1e8, 0x540026e8, 0x54000009, 1077 0x54fff189, 0x54002689, 0x5400000a, 0x54fff12a, 1078 0x5400262a, 0x5400000b, 0x54fff0cb, 0x540025cb, 1079 0x5400000c, 0x54fff06c, 0x5400256c, 0x5400000d, 1080 0x54fff00d, 0x5400250d, 0x5400000e, 0x54ffefae, 1081 0x540024ae, 0x5400000f, 0x54ffef4f, 0x5400244f, 1082 0xd4063721, 0xd4035082, 0xd400bfe3, 0xd4282fc0, 1083 0xd444c320, 0xd503201f, 0xd69f03e0, 0xd6bf03e0, 1084 0xd5033fdf, 0xd5033f9f, 0xd5033abf, 0xd61f0040, 1085 0xd63f00a0, 0xc8147c55, 0xc805fcfd, 0xc85f7e05, 1086 0xc85fffbb, 0xc89fffa0, 0xc8dfff95, 0x88157cf8, 1087 0x8815ff9a, 0x885f7cd5, 0x885fffcf, 0x889ffc73, 1088 0x88dffc56, 0x48127c0f, 0x480bff85, 0x485f7cdd, 1089 0x485ffcf2, 0x489fff99, 0x48dffe62, 0x080a7c3e, 1090 0x0814fed5, 0x085f7c59, 0x085ffcb8, 0x089ffc70, 1091 0x08dfffb6, 0xc87f0a68, 0xc87fcdc7, 0xc82870bb, 1092 0xc825b8c8, 0x887f12d9, 0x887fb9ed, 0x8834215a, 1093 0x8837ca52, 0xf806317e, 0xb81b3337, 0x39000dc2, 1094 0x78005149, 0xf84391f4, 0xb85b220c, 0x385fd356, 1095 0x785d127e, 0x389f4149, 0x79801e3c, 0x79c014a3, 1096 0xb89a5231, 0xfc5ef282, 0xbc5f60f6, 0xfc12125e, 1097 0xbc0152cd, 0xf8190e49, 0xb800befd, 0x381ffd92, 1098 0x781e9e90, 0xf8409fa3, 0xb8413c79, 0x385fffa1, 1099 0x785c7fa8, 0x389f3dc5, 0x78801f6a, 0x78c19d4b, 1100 0xb89a4ec4, 0xfc408eeb, 0xbc436e79, 0xfc152ce1, 1101 0xbc036f28, 0xf8025565, 0xb80135f8, 0x381ff74f, 1102 0x781fa652, 0xf851a447, 0xb85e557b, 0x385e7472, 1103 0x785e070a, 0x38804556, 0x78819591, 0x78dc24e8, 1104 0xb89cd6d7, 0xfc430738, 0xbc5f6595, 0xfc1225b2, 1105 0xbc1d7430, 0xf82fcac2, 0xb83d6a02, 0x382e5a54, 1106 0x7834fa66, 0xf86ecbae, 0xb86cda90, 0x3860d989, 1107 0x78637a2c, 0x38a3fa22, 0x78b15827, 0x78f2d9f9, 1108 0xb8ac6ab7, 0xfc6879a5, 0xbc767943, 0xfc3bc84e, 1109 0xbc3968d4, 0xf91fc0fe, 0xb91da50f, 0x391d280b, 1110 0x791d2e23, 0xf95bc8e2, 0xb95ce525, 0x395ae53c, 1111 0x795c9282, 0x399d7dd6, 0x799fe008, 0x79de9bc0, 1112 0xb99aae78, 0xfd597598, 0xbd5d1d08, 0xfd1f3dea, 1113 0xbd1a227a, 0x5800148a, 0x18000003, 0xf88092e0, 1114 0xd8ffdf00, 0xf8a84860, 0xf99d7560, 0x1a1c012d, 1115 0x3a1c027b, 0x5a060253, 0x7a03028e, 0x9a0801d0, 1116 0xba0803a0, 0xda140308, 0xfa00038c, 0x0b3010d7, 1117 0x2b37ab39, 0xcb2466da, 0x6b33efb1, 0x8b350fcb, 1118 0xab208a70, 0xcb39e52b, 0xeb2c9291, 0x3a4bd1a3, 1119 0x7a4c81a2, 0xba42106c, 0xfa5560e3, 0x3a4e3844, 1120 0x7a515a26, 0xba4c2940, 0xfa52aaae, 0x1a8cc1b5, 1121 0x1a8f976a, 0x5a8981a0, 0x5a9a6492, 0x9a8793ac, 1122 0x9a9474e6, 0xda83d2b6, 0xda9b9593, 0x5ac00200, 1123 0x5ac006f1, 0x5ac009d1, 0x5ac013d8, 0x5ac016d8, 1124 0xdac00223, 0xdac005ac, 0xdac00ac9, 0xdac00c00, 1125 0xdac01205, 0xdac016d9, 0x1ac0089d, 0x1add0fa0, 1126 0x1ad52225, 0x1ad22529, 0x1ac82b61, 0x1acd2e92, 1127 0x9acc0b28, 0x9adc0ca7, 0x9adb2225, 0x9ad42757, 1128 0x9adc291c, 0x9ac42fa3, 0x1b1a55d1, 0x1b0bafc1, 1129 0x9b067221, 0x9b1ea0de, 0x9b2e20d5, 0x9b38cd4a, 1130 0x9bae6254, 0x9ba59452, 0x1e2d0a48, 0x1e3c19c2, 1131 0x1e3c298f, 0x1e213980, 0x1e240baf, 0x1e77082c, 1132 0x1e72191b, 0x1e6b2a97, 0x1e723988, 0x1e770b1a, 1133 0x1f0d66f5, 0x1f01b956, 0x1f227a8e, 0x1f365ba7, 1134 0x1f4f14ad, 0x1f45a98e, 0x1f60066a, 0x1f620054, 1135 0x1e204139, 0x1e20c094, 0x1e214363, 0x1e21c041, 1136 0x1e22c01e, 0x1e60408c, 0x1e60c361, 0x1e6142c8, 1137 0x1e61c16b, 0x1e624396, 0x1e3802dc, 0x9e380374, 1138 0x1e78000e, 0x9e78017a, 0x1e2202dc, 0x9e220150, 1139 0x1e6202a8, 0x9e620395, 0x1e260318, 0x9e660268, 1140 0x1e270188, 0x9e6700e6, 0x1e3023c0, 0x1e6b2320, 1141 0x1e202168, 0x1e602168, 0x2910323d, 0x297449d6, 1142 0x6948402b, 0xa9072f40, 0xa9410747, 0x29801f0a, 1143 0x29e07307, 0x69e272b9, 0xa9bf49d4, 0xa9c529a8, 1144 0x28b0605a, 0x28e866a2, 0x68ee0ab1, 0xa886296c, 1145 0xa8fe1a38, 0x282479c3, 0x286e534f, 0xa8386596, 1146 0xa8755a3b, 0x1e601000, 0x1e603000, 0x1e621000, 1147 0x1e623000, 0x1e641000, 0x1e643000, 0x1e661000, 1148 0x1e663000, 0x1e681000, 0x1e683000, 0x1e6a1000, 1149 0x1e6a3000, 0x1e6c1000, 0x1e6c3000, 0x1e6e1000, 1150 0x1e6e3000, 0x1e701000, 0x1e703000, 0x1e721000, 1151 0x1e723000, 0x1e741000, 0x1e743000, 0x1e761000, 1152 0x1e763000, 0x1e781000, 0x1e783000, 0x1e7a1000, 1153 0x1e7a3000, 0x1e7c1000, 0x1e7c3000, 0x1e7e1000, 1154 0x1e7e3000, 1155 }; 1156 // END Generated code -- do not edit 1157 1158 { 1159 bool ok = true; 1160 unsigned int *insns1 = (unsigned int *)entry; 1161 for (unsigned int i = 0; i < sizeof insns / sizeof insns[0]; i++) { 1162 if (insns[i] != insns1[i]) { 1163 ok = false; 1164 printf("Ours:\n"); 1165 Disassembler::decode((address)&insns1[i], (address)&insns1[i+1]); 1166 printf("Theirs:\n"); 1167 Disassembler::decode((address)&insns[i], (address)&insns[i+1]); 1168 printf("\n"); 1169 } 1170 } 1171 assert(ok, "Assembler smoke test failed"); 1172 } 1173 1174 #ifndef PRODUCT 1175 1176 address PC = __ pc(); 1177 __ ld1(v0, __ T16B, Address(r16)); // No offset 1178 __ ld1(v0, __ T16B, __ post(r16, 0)); // Post-index 1179 __ ld1(v0, __ T16B, Address(r16, r17)); // 1180 1181 1182 #endif // PRODUCT 1183 #endif // ASSERT 1184 } 1185 1186 #undef __ 1187 1188 void Assembler::emit_data64(jlong data, 1189 relocInfo::relocType rtype, 1190 int format) { 1191 if (rtype == relocInfo::none) { 1192 emit_int64(data); 1193 } else { 1194 emit_data64(data, Relocation::spec_simple(rtype), format); 1195 } 1196 } 1197 1198 void Assembler::emit_data64(jlong data, 1199 RelocationHolder const& rspec, 1200 int format) { 1201 1202 assert(inst_mark() != NULL, "must be inside InstructionMark"); 1203 // Do not use AbstractAssembler::relocate, which is not intended for 1204 // embedded words. Instead, relocate to the enclosing instruction. 1205 code_section()->relocate(inst_mark(), rspec, format); 1206 emit_int64(data); 1207 } 1208 1209 extern "C" { 1210 void das(uint64_t start, int len) { 1211 ResourceMark rm; 1212 len <<= 2; 1213 if (len < 0) 1214 Disassembler::decode((address)start + len, (address)start); 1215 else 1216 Disassembler::decode((address)start, (address)start + len); 1217 } 1218 1219 JNIEXPORT void das1(unsigned long insn) { 1220 das(insn, 1); 1221 } 1222 } 1223 1224 #define gas_assert(ARG1) assert(ARG1, #ARG1) 1225 1226 #define __ as-> 1227 1228 void Address::lea(MacroAssembler *as, Register r) const { 1229 Relocation* reloc = _rspec.reloc(); 1230 relocInfo::relocType rtype = (relocInfo::relocType) reloc->type(); 1231 1232 switch(_mode) { 1233 case base_plus_offset: { 1234 if (_offset == 0 && _base == r) // it's a nop 1235 break; 1236 if (_offset > 0) 1237 __ add(r, _base, _offset); 1238 else 1239 __ sub(r, _base, -_offset); 1240 break; 1241 } 1242 case base_plus_offset_reg: { 1243 __ add(r, _base, _index, _ext.op(), MAX(_ext.shift(), 0)); 1244 break; 1245 } 1246 case literal: { 1247 if (rtype == relocInfo::none) 1248 __ mov(r, target()); 1249 else 1250 __ movptr(r, (uint64_t)target()); 1251 break; 1252 } 1253 default: 1254 ShouldNotReachHere(); 1255 } 1256 } 1257 1258 void Assembler::adrp(Register reg1, const Address &dest, unsigned long &byte_offset) { 1259 ShouldNotReachHere(); 1260 } 1261 1262 #undef __ 1263 1264 #define starti Instruction_aarch64 do_not_use(this); set_current(&do_not_use) 1265 1266 void Assembler::adr(Register Rd, address adr) { 1267 long offset = adr - pc(); 1268 int offset_lo = offset & 3; 1269 offset >>= 2; 1270 starti; 1271 f(0, 31), f(offset_lo, 30, 29), f(0b10000, 28, 24), sf(offset, 23, 5); 1272 rf(Rd, 0); 1273 } 1274 1275 void Assembler::_adrp(Register Rd, address adr) { 1276 uint64_t pc_page = (uint64_t)pc() >> 12; 1277 uint64_t adr_page = (uint64_t)adr >> 12; 1278 long offset = adr_page - pc_page; 1279 int offset_lo = offset & 3; 1280 offset >>= 2; 1281 starti; 1282 f(1, 31), f(offset_lo, 30, 29), f(0b10000, 28, 24), sf(offset, 23, 5); 1283 rf(Rd, 0); 1284 } 1285 1286 #undef starti 1287 1288 Address::Address(address target, relocInfo::relocType rtype) : _mode(literal){ 1289 _is_lval = false; 1290 _target = target; 1291 switch (rtype) { 1292 case relocInfo::oop_type: 1293 case relocInfo::metadata_type: 1294 // Oops are a special case. Normally they would be their own section 1295 // but in cases like icBuffer they are literals in the code stream that 1296 // we don't have a section for. We use none so that we get a literal address 1297 // which is always patchable. 1298 break; 1299 case relocInfo::external_word_type: 1300 _rspec = external_word_Relocation::spec(target); 1301 break; 1302 case relocInfo::internal_word_type: 1303 _rspec = internal_word_Relocation::spec(target); 1304 break; 1305 case relocInfo::opt_virtual_call_type: 1306 _rspec = opt_virtual_call_Relocation::spec(); 1307 break; 1308 case relocInfo::static_call_type: 1309 _rspec = static_call_Relocation::spec(); 1310 break; 1311 case relocInfo::runtime_call_type: 1312 _rspec = runtime_call_Relocation::spec(); 1313 break; 1314 case relocInfo::poll_type: 1315 case relocInfo::poll_return_type: 1316 _rspec = Relocation::spec_simple(rtype); 1317 break; 1318 case relocInfo::none: 1319 _rspec = RelocationHolder::none; 1320 break; 1321 default: 1322 ShouldNotReachHere(); 1323 break; 1324 } 1325 } 1326 1327 void Assembler::b(const Address &dest) { 1328 code_section()->relocate(pc(), dest.rspec()); 1329 b(dest.target()); 1330 } 1331 1332 void Assembler::bl(const Address &dest) { 1333 code_section()->relocate(pc(), dest.rspec()); 1334 bl(dest.target()); 1335 } 1336 1337 void Assembler::adr(Register r, const Address &dest) { 1338 code_section()->relocate(pc(), dest.rspec()); 1339 adr(r, dest.target()); 1340 } 1341 1342 void Assembler::br(Condition cc, Label &L) { 1343 if (L.is_bound()) { 1344 br(cc, target(L)); 1345 } else { 1346 L.add_patch_at(code(), locator()); 1347 br(cc, pc()); 1348 } 1349 } 1350 1351 void Assembler::wrap_label(Label &L, 1352 Assembler::uncond_branch_insn insn) { 1353 if (L.is_bound()) { 1354 (this->*insn)(target(L)); 1355 } else { 1356 L.add_patch_at(code(), locator()); 1357 (this->*insn)(pc()); 1358 } 1359 } 1360 1361 void Assembler::wrap_label(Register r, Label &L, 1362 compare_and_branch_insn insn) { 1363 if (L.is_bound()) { 1364 (this->*insn)(r, target(L)); 1365 } else { 1366 L.add_patch_at(code(), locator()); 1367 (this->*insn)(r, pc()); 1368 } 1369 } 1370 1371 void Assembler::wrap_label(Register r, int bitpos, Label &L, 1372 test_and_branch_insn insn) { 1373 if (L.is_bound()) { 1374 (this->*insn)(r, bitpos, target(L)); 1375 } else { 1376 L.add_patch_at(code(), locator()); 1377 (this->*insn)(r, bitpos, pc()); 1378 } 1379 } 1380 1381 void Assembler::wrap_label(Label &L, prfop op, prefetch_insn insn) { 1382 if (L.is_bound()) { 1383 (this->*insn)(target(L), op); 1384 } else { 1385 L.add_patch_at(code(), locator()); 1386 (this->*insn)(pc(), op); 1387 } 1388 } 1389 1390 // An "all-purpose" add/subtract immediate, per ARM documentation: 1391 // A "programmer-friendly" assembler may accept a negative immediate 1392 // between -(2^24 -1) and -1 inclusive, causing it to convert a 1393 // requested ADD operation to a SUB, or vice versa, and then encode 1394 // the absolute value of the immediate as for uimm24. 1395 void Assembler::add_sub_immediate(Register Rd, Register Rn, unsigned uimm, int op, 1396 int negated_op) { 1397 bool sets_flags = op & 1; // this op sets flags 1398 union { 1399 unsigned u; 1400 int imm; 1401 }; 1402 u = uimm; 1403 bool shift = false; 1404 bool neg = imm < 0; 1405 if (neg) { 1406 imm = -imm; 1407 op = negated_op; 1408 } 1409 assert(Rd != sp || imm % 16 == 0, "misaligned stack"); 1410 if (imm >= (1 << 11) 1411 && ((imm >> 12) << 12 == imm)) { 1412 imm >>= 12; 1413 shift = true; 1414 } 1415 f(op, 31, 29), f(0b10001, 28, 24), f(shift, 23, 22), f(imm, 21, 10); 1416 1417 // add/subtract immediate ops with the S bit set treat r31 as zr; 1418 // with S unset they use sp. 1419 if (sets_flags) 1420 zrf(Rd, 0); 1421 else 1422 srf(Rd, 0); 1423 1424 srf(Rn, 5); 1425 } 1426 1427 bool Assembler::operand_valid_for_add_sub_immediate(long imm) { 1428 bool shift = false; 1429 unsigned long uimm = uabs(imm); 1430 if (uimm < (1 << 12)) 1431 return true; 1432 if (uimm < (1 << 24) 1433 && ((uimm >> 12) << 12 == uimm)) { 1434 return true; 1435 } 1436 return false; 1437 } 1438 1439 bool Assembler::operand_valid_for_logical_immediate(bool is32, uint64_t imm) { 1440 return encode_logical_immediate(is32, imm) != 0xffffffff; 1441 } 1442 1443 static uint64_t doubleTo64Bits(jdouble d) { 1444 union { 1445 jdouble double_value; 1446 uint64_t double_bits; 1447 }; 1448 1449 double_value = d; 1450 return double_bits; 1451 } 1452 1453 bool Assembler::operand_valid_for_float_immediate(double imm) { 1454 // If imm is all zero bits we can use ZR as the source of a 1455 // floating-point value. 1456 if (doubleTo64Bits(imm) == 0) 1457 return true; 1458 1459 // Otherwise try to encode imm then convert the encoded value back 1460 // and make sure it's the exact same bit pattern. 1461 unsigned result = encoding_for_fp_immediate(imm); 1462 return doubleTo64Bits(imm) == fp_immediate_for_encoding(result, true); 1463 } 1464 1465 int AbstractAssembler::code_fill_byte() { 1466 return 0; 1467 } 1468 1469 // n.b. this is implemented in subclass MacroAssembler 1470 void Assembler::bang_stack_with_offset(int offset) { Unimplemented(); } 1471 1472 1473 // these are the functions provided by the simulator which are used to 1474 // encode and decode logical immediates and floating point immediates 1475 // 1476 // u_int64_t logical_immediate_for_encoding(u_int32_t encoding); 1477 // 1478 // u_int32_t encoding_for_logical_immediate(u_int64_t immediate); 1479 // 1480 // u_int64_t fp_immediate_for_encoding(u_int32_t imm8, int is_dp); 1481 // 1482 // u_int32_t encoding_for_fp_immediate(float immediate); 1483 // 1484 // we currently import these from the simulator librray but the 1485 // definitions will need to be moved to here when we switch to real 1486 // hardware. 1487 1488 // and now the routines called by the assembler which encapsulate the 1489 // above encode and decode functions 1490 1491 uint32_t 1492 asm_util::encode_logical_immediate(bool is32, uint64_t imm) 1493 { 1494 if (is32) { 1495 /* Allow all zeros or all ones in top 32-bits, so that 1496 constant expressions like ~1 are permitted. */ 1497 if (imm >> 32 != 0 && imm >> 32 != 0xffffffff) 1498 return 0xffffffff; 1499 /* Replicate the 32 lower bits to the 32 upper bits. */ 1500 imm &= 0xffffffff; 1501 imm |= imm << 32; 1502 } 1503 1504 return encoding_for_logical_immediate(imm); 1505 } 1506 1507 unsigned Assembler::pack(double value) { 1508 float val = (float)value; 1509 unsigned result = encoding_for_fp_immediate(val); 1510 guarantee(unpack(result) == value, 1511 "Invalid floating-point immediate operand"); 1512 return result; 1513 } 1514 1515 // Packed operands for Floating-point Move (immediate) 1516 1517 static float unpack(unsigned value) { 1518 union { 1519 unsigned ival; 1520 float val; 1521 }; 1522 ival = fp_immediate_for_encoding(value, 0); 1523 return val; 1524 }