| /* |
| * Copyright (c) 1997, 2020, Oracle and/or its affiliates. All rights reserved. |
| * Copyright (c) 2014, 2020 Red Hat Inc. All rights reserved. |
| * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
| * |
| * This code is free software; you can redistribute it and/or modify it |
| * under the terms of the GNU General Public License version 2 only, as |
| * published by the Free Software Foundation. |
| * |
| * This code is distributed in the hope that it will be useful, but WITHOUT |
| * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
| * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
| * version 2 for more details (a copy is included in the LICENSE file that |
| * accompanied this code). |
| * |
| * You should have received a copy of the GNU General Public License version |
| * 2 along with this work; if not, write to the Free Software Foundation, |
| * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
| * |
| * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
| * or visit www.oracle.com if you need additional information or have any |
| * questions. |
| */ |
| |
| #include <stdio.h> |
| #include <sys/types.h> |
| |
| #include "precompiled.hpp" |
| #include "asm/assembler.hpp" |
| #include "asm/assembler.inline.hpp" |
| #include "interpreter/interpreter.hpp" |
| |
| #ifndef PRODUCT |
| const uintptr_t Assembler::asm_bp = 0x00007fffee09ac88; |
| #endif |
| |
| #include "compiler/disassembler.hpp" |
| #include "memory/resourceArea.hpp" |
| #include "runtime/interfaceSupport.inline.hpp" |
| #include "runtime/sharedRuntime.hpp" |
| #include "immediate_aarch64.hpp" |
| |
| extern "C" void entry(CodeBuffer *cb); |
| |
| #define __ _masm. |
| #ifdef PRODUCT |
| #define BLOCK_COMMENT(str) /* nothing */ |
| #else |
| #define BLOCK_COMMENT(str) block_comment(str) |
| #endif |
| |
| #define BIND(label) bind(label); __ BLOCK_COMMENT(#label ":") |
| |
| static float unpack(unsigned value); |
| |
| short Assembler::SIMD_Size_in_bytes[] = { |
| // T8B, T16B, T4H, T8H, T2S, T4S, T1D, T2D, T1Q |
| 8, 16, 8, 16, 8, 16, 8, 16, 16 |
| }; |
| |
| #ifdef ASSERT |
| static void asm_check(const unsigned int *insns, const unsigned int *insns1, size_t len) { |
| bool ok = true; |
| for (unsigned int i = 0; i < len; i++) { |
| if (insns[i] != insns1[i]) { |
| ok = false; |
| printf("Ours:\n"); |
| Disassembler::decode((address)&insns1[i], (address)&insns1[i+1]); |
| printf("Theirs:\n"); |
| Disassembler::decode((address)&insns[i], (address)&insns[i+1]); |
| printf("\n"); |
| } |
| } |
| assert(ok, "Assembler smoke test failed"); |
| } |
| |
| void entry(CodeBuffer *cb) { |
| |
| // { |
| // for (int i = 0; i < 256; i+=16) |
| // { |
| // printf("\"%20.20g\", ", unpack(i)); |
| // printf("\"%20.20g\", ", unpack(i+1)); |
| // } |
| // printf("\n"); |
| // } |
| |
| Assembler _masm(cb); |
| address entry = __ pc(); |
| |
| // Smoke test for assembler |
| |
| // BEGIN Generated code -- do not edit |
| // Generated by aarch64-asmtest.py |
| Label back, forth; |
| __ bind(back); |
| |
| // ArithOp |
| __ add(r15, r12, r16, Assembler::LSR, 30); // add x15, x12, x16, LSR #30 |
| __ sub(r1, r15, r3, Assembler::LSR, 32); // sub x1, x15, x3, LSR #32 |
| __ adds(r13, r25, r5, Assembler::LSL, 13); // adds x13, x25, x5, LSL #13 |
| __ subs(r22, r28, r6, Assembler::ASR, 17); // subs x22, x28, x6, ASR #17 |
| __ addw(r0, r9, r22, Assembler::ASR, 6); // add w0, w9, w22, ASR #6 |
| __ subw(r19, r3, r25, Assembler::LSL, 21); // sub w19, w3, w25, LSL #21 |
| __ addsw(r4, r19, r11, Assembler::LSL, 20); // adds w4, w19, w11, LSL #20 |
| __ subsw(r24, r7, r19, Assembler::ASR, 0); // subs w24, w7, w19, ASR #0 |
| __ andr(r30, r7, r11, Assembler::LSL, 48); // and x30, x7, x11, LSL #48 |
| __ orr(r24, r8, r15, Assembler::LSL, 12); // orr x24, x8, x15, LSL #12 |
| __ eor(r17, r9, r23, Assembler::LSL, 1); // eor x17, x9, x23, LSL #1 |
| __ ands(r14, r11, r4, Assembler::LSR, 55); // ands x14, x11, x4, LSR #55 |
| __ andw(r19, r7, r12, Assembler::LSR, 17); // and w19, w7, w12, LSR #17 |
| __ orrw(r19, r27, r11, Assembler::ASR, 28); // orr w19, w27, w11, ASR #28 |
| __ eorw(r30, r3, r22, Assembler::LSR, 31); // eor w30, w3, w22, LSR #31 |
| __ andsw(r19, r26, r28, Assembler::ASR, 0); // ands w19, w26, w28, ASR #0 |
| __ bic(r29, r6, r26, Assembler::LSL, 51); // bic x29, x6, x26, LSL #51 |
| __ orn(r26, r27, r17, Assembler::LSL, 35); // orn x26, x27, x17, LSL #35 |
| __ eon(r21, r4, r14, Assembler::LSL, 5); // eon x21, x4, x14, LSL #5 |
| __ bics(r2, r15, r0, Assembler::ASR, 5); // bics x2, x15, x0, ASR #5 |
| __ bicw(r2, r7, r2, Assembler::LSL, 29); // bic w2, w7, w2, LSL #29 |
| __ ornw(r24, r12, r21, Assembler::LSR, 5); // orn w24, w12, w21, LSR #5 |
| __ eonw(r30, r15, r19, Assembler::LSL, 2); // eon w30, w15, w19, LSL #2 |
| __ bicsw(r30, r23, r17, Assembler::ASR, 28); // bics w30, w23, w17, ASR #28 |
| |
| // AddSubImmOp |
| __ addw(r4, r20, 660u); // add w4, w20, #660 |
| __ addsw(r2, r10, 710u); // adds w2, w10, #710 |
| __ subw(r19, r26, 244u); // sub w19, w26, #244 |
| __ subsw(r28, r13, 73u); // subs w28, w13, #73 |
| __ add(r2, r30, 862u); // add x2, x30, #862 |
| __ adds(r27, r16, 574u); // adds x27, x16, #574 |
| __ sub(r22, r9, 589u); // sub x22, x9, #589 |
| __ subs(r4, r1, 698u); // subs x4, x1, #698 |
| |
| // LogicalImmOp |
| __ andw(r28, r19, 4294709247ull); // and w28, w19, #0xfffc0fff |
| __ orrw(r27, r5, 536870910ull); // orr w27, w5, #0x1ffffffe |
| __ eorw(r30, r20, 4294840319ull); // eor w30, w20, #0xfffe0fff |
| __ andsw(r22, r26, 4294959615ull); // ands w22, w26, #0xffffe1ff |
| __ andr(r5, r7, 4194300ull); // and x5, x7, #0x3ffffc |
| __ orr(r13, r7, 18014398509481728ull); // orr x13, x7, #0x3fffffffffff00 |
| __ eor(r7, r9, 18442240474082197503ull); // eor x7, x9, #0xfff0000000003fff |
| __ ands(r3, r0, 18374686479671656447ull); // ands x3, x0, #0xff00000000007fff |
| |
| // AbsOp |
| __ b(__ pc()); // b . |
| __ b(back); // b back |
| __ b(forth); // b forth |
| __ bl(__ pc()); // bl . |
| __ bl(back); // bl back |
| __ bl(forth); // bl forth |
| |
| // RegAndAbsOp |
| __ cbzw(r16, __ pc()); // cbz w16, . |
| __ cbzw(r16, back); // cbz w16, back |
| __ cbzw(r16, forth); // cbz w16, forth |
| __ cbnzw(r19, __ pc()); // cbnz w19, . |
| __ cbnzw(r19, back); // cbnz w19, back |
| __ cbnzw(r19, forth); // cbnz w19, forth |
| __ cbz(r5, __ pc()); // cbz x5, . |
| __ cbz(r5, back); // cbz x5, back |
| __ cbz(r5, forth); // cbz x5, forth |
| __ cbnz(r4, __ pc()); // cbnz x4, . |
| __ cbnz(r4, back); // cbnz x4, back |
| __ cbnz(r4, forth); // cbnz x4, forth |
| __ adr(r27, __ pc()); // adr x27, . |
| __ adr(r27, back); // adr x27, back |
| __ adr(r27, forth); // adr x27, forth |
| __ _adrp(r16, __ pc()); // adrp x16, . |
| |
| // RegImmAbsOp |
| __ tbz(r28, 8, __ pc()); // tbz x28, #8, . |
| __ tbz(r28, 8, back); // tbz x28, #8, back |
| __ tbz(r28, 8, forth); // tbz x28, #8, forth |
| __ tbnz(r1, 1, __ pc()); // tbnz x1, #1, . |
| __ tbnz(r1, 1, back); // tbnz x1, #1, back |
| __ tbnz(r1, 1, forth); // tbnz x1, #1, forth |
| |
| // MoveWideImmOp |
| __ movnw(r20, 8639, 16); // movn w20, #8639, lsl 16 |
| __ movzw(r7, 25835, 0); // movz w7, #25835, lsl 0 |
| __ movkw(r17, 7261, 0); // movk w17, #7261, lsl 0 |
| __ movn(r14, 2097, 32); // movn x14, #2097, lsl 32 |
| __ movz(r9, 16082, 0); // movz x9, #16082, lsl 0 |
| __ movk(r19, 13962, 16); // movk x19, #13962, lsl 16 |
| |
| // BitfieldOp |
| __ sbfm(r9, r22, 6, 22); // sbfm x9, x22, #6, #22 |
| __ bfmw(r19, r0, 11, 0); // bfm w19, w0, #11, #0 |
| __ ubfmw(r10, r19, 11, 19); // ubfm w10, w19, #11, #19 |
| __ sbfm(r4, r15, 5, 17); // sbfm x4, x15, #5, #17 |
| __ bfm(r3, r5, 19, 28); // bfm x3, x5, #19, #28 |
| __ ubfm(r12, r28, 17, 2); // ubfm x12, x28, #17, #2 |
| |
| // ExtractOp |
| __ extrw(r15, r0, r22, 3); // extr w15, w0, w22, #3 |
| __ extr(r6, r14, r14, 55); // extr x6, x14, x14, #55 |
| |
| // CondBranchOp |
| __ br(Assembler::EQ, __ pc()); // b.EQ . |
| __ br(Assembler::EQ, back); // b.EQ back |
| __ br(Assembler::EQ, forth); // b.EQ forth |
| __ br(Assembler::NE, __ pc()); // b.NE . |
| __ br(Assembler::NE, back); // b.NE back |
| __ br(Assembler::NE, forth); // b.NE forth |
| __ br(Assembler::HS, __ pc()); // b.HS . |
| __ br(Assembler::HS, back); // b.HS back |
| __ br(Assembler::HS, forth); // b.HS forth |
| __ br(Assembler::CS, __ pc()); // b.CS . |
| __ br(Assembler::CS, back); // b.CS back |
| __ br(Assembler::CS, forth); // b.CS forth |
| __ br(Assembler::LO, __ pc()); // b.LO . |
| __ br(Assembler::LO, back); // b.LO back |
| __ br(Assembler::LO, forth); // b.LO forth |
| __ br(Assembler::CC, __ pc()); // b.CC . |
| __ br(Assembler::CC, back); // b.CC back |
| __ br(Assembler::CC, forth); // b.CC forth |
| __ br(Assembler::MI, __ pc()); // b.MI . |
| __ br(Assembler::MI, back); // b.MI back |
| __ br(Assembler::MI, forth); // b.MI forth |
| __ br(Assembler::PL, __ pc()); // b.PL . |
| __ br(Assembler::PL, back); // b.PL back |
| __ br(Assembler::PL, forth); // b.PL forth |
| __ br(Assembler::VS, __ pc()); // b.VS . |
| __ br(Assembler::VS, back); // b.VS back |
| __ br(Assembler::VS, forth); // b.VS forth |
| __ br(Assembler::VC, __ pc()); // b.VC . |
| __ br(Assembler::VC, back); // b.VC back |
| __ br(Assembler::VC, forth); // b.VC forth |
| __ br(Assembler::HI, __ pc()); // b.HI . |
| __ br(Assembler::HI, back); // b.HI back |
| __ br(Assembler::HI, forth); // b.HI forth |
| __ br(Assembler::LS, __ pc()); // b.LS . |
| __ br(Assembler::LS, back); // b.LS back |
| __ br(Assembler::LS, forth); // b.LS forth |
| __ br(Assembler::GE, __ pc()); // b.GE . |
| __ br(Assembler::GE, back); // b.GE back |
| __ br(Assembler::GE, forth); // b.GE forth |
| __ br(Assembler::LT, __ pc()); // b.LT . |
| __ br(Assembler::LT, back); // b.LT back |
| __ br(Assembler::LT, forth); // b.LT forth |
| __ br(Assembler::GT, __ pc()); // b.GT . |
| __ br(Assembler::GT, back); // b.GT back |
| __ br(Assembler::GT, forth); // b.GT forth |
| __ br(Assembler::LE, __ pc()); // b.LE . |
| __ br(Assembler::LE, back); // b.LE back |
| __ br(Assembler::LE, forth); // b.LE forth |
| __ br(Assembler::AL, __ pc()); // b.AL . |
| __ br(Assembler::AL, back); // b.AL back |
| __ br(Assembler::AL, forth); // b.AL forth |
| __ br(Assembler::NV, __ pc()); // b.NV . |
| __ br(Assembler::NV, back); // b.NV back |
| __ br(Assembler::NV, forth); // b.NV forth |
| |
| // ImmOp |
| __ svc(22064); // svc #22064 |
| __ hvc(533); // hvc #533 |
| __ smc(9942); // smc #9942 |
| __ brk(4714); // brk #4714 |
| __ hlt(4302); // hlt #4302 |
| |
| // Op |
| __ nop(); // nop |
| __ eret(); // eret |
| __ drps(); // drps |
| __ isb(); // isb |
| |
| // SystemOp |
| __ dsb(Assembler::OSH); // dsb OSH |
| __ dmb(Assembler::NSHLD); // dmb NSHLD |
| |
| // OneRegOp |
| __ br(r20); // br x20 |
| __ blr(r2); // blr x2 |
| |
| // LoadStoreExclusiveOp |
| __ stxr(r18, r23, r0); // stxr w18, x23, [x0] |
| __ stlxr(r30, r5, r22); // stlxr w30, x5, [x22] |
| __ ldxr(r5, r8); // ldxr x5, [x8] |
| __ ldaxr(r20, r16); // ldaxr x20, [x16] |
| __ stlr(r6, r11); // stlr x6, [x11] |
| __ ldar(r6, r27); // ldar x6, [x27] |
| |
| // LoadStoreExclusiveOp |
| __ stxrw(r10, r17, r5); // stxr w10, w17, [x5] |
| __ stlxrw(r22, r9, r12); // stlxr w22, w9, [x12] |
| __ ldxrw(r27, r8); // ldxr w27, [x8] |
| __ ldaxrw(r23, r2); // ldaxr w23, [x2] |
| __ stlrw(r26, r29); // stlr w26, [x29] |
| __ ldarw(r13, r10); // ldar w13, [x10] |
| |
| // LoadStoreExclusiveOp |
| __ stxrh(r25, r28, r27); // stxrh w25, w28, [x27] |
| __ stlxrh(r29, r22, r12); // stlxrh w29, w22, [x12] |
| __ ldxrh(r22, r28); // ldxrh w22, [x28] |
| __ ldaxrh(r3, r30); // ldaxrh w3, [x30] |
| __ stlrh(r24, r15); // stlrh w24, [x15] |
| __ ldarh(r27, r26); // ldarh w27, [x26] |
| |
| // LoadStoreExclusiveOp |
| __ stxrb(r11, r10, r19); // stxrb w11, w10, [x19] |
| __ stlxrb(r23, r27, r22); // stlxrb w23, w27, [x22] |
| __ ldxrb(r24, r16); // ldxrb w24, [x16] |
| __ ldaxrb(r24, r1); // ldaxrb w24, [x1] |
| __ stlrb(r5, r29); // stlrb w5, [x29] |
| __ ldarb(r24, r16); // ldarb w24, [x16] |
| |
| // LoadStoreExclusiveOp |
| __ ldxp(r25, r24, r17); // ldxp x25, x24, [x17] |
| __ ldaxp(r22, r12, r19); // ldaxp x22, x12, [x19] |
| __ stxp(r0, r26, r21, r25); // stxp w0, x26, x21, [x25] |
| __ stlxp(r1, r6, r11, r5); // stlxp w1, x6, x11, [x5] |
| |
| // LoadStoreExclusiveOp |
| __ ldxpw(r13, r14, r4); // ldxp w13, w14, [x4] |
| __ ldaxpw(r17, r2, r6); // ldaxp w17, w2, [x6] |
| __ stxpw(r15, r3, r9, r18); // stxp w15, w3, w9, [x18] |
| __ stlxpw(r18, r17, r4, r9); // stlxp w18, w17, w4, [x9] |
| |
| // base_plus_unscaled_offset |
| // LoadStoreOp |
| __ str(r23, Address(r21, -49)); // str x23, [x21, -49] |
| __ strw(r21, Address(r2, 63)); // str w21, [x2, 63] |
| __ strb(r27, Address(r28, 11)); // strb w27, [x28, 11] |
| __ strh(r29, Address(r15, -13)); // strh w29, [x15, -13] |
| __ ldr(r14, Address(r30, -45)); // ldr x14, [x30, -45] |
| __ ldrw(r29, Address(r28, 53)); // ldr w29, [x28, 53] |
| __ ldrb(r20, Address(r26, 7)); // ldrb w20, [x26, 7] |
| __ ldrh(r25, Address(r2, -50)); // ldrh w25, [x2, -50] |
| __ ldrsb(r3, Address(r10, -15)); // ldrsb x3, [x10, -15] |
| __ ldrsh(r14, Address(r15, 19)); // ldrsh x14, [x15, 19] |
| __ ldrshw(r29, Address(r11, -5)); // ldrsh w29, [x11, -5] |
| __ ldrsw(r15, Address(r5, -71)); // ldrsw x15, [x5, -71] |
| __ ldrd(v19, Address(r12, 3)); // ldr d19, [x12, 3] |
| __ ldrs(v12, Address(r27, 42)); // ldr s12, [x27, 42] |
| __ strd(v22, Address(r28, 125)); // str d22, [x28, 125] |
| __ strs(v24, Address(r15, -20)); // str s24, [x15, -20] |
| |
| // pre |
| // LoadStoreOp |
| __ str(r8, Address(__ pre(r28, -24))); // str x8, [x28, -24]! |
| __ strw(r6, Address(__ pre(r15, 37))); // str w6, [x15, 37]! |
| __ strb(r7, Address(__ pre(r1, 7))); // strb w7, [x1, 7]! |
| __ strh(r0, Address(__ pre(r17, 30))); // strh w0, [x17, 30]! |
| __ ldr(r25, Address(__ pre(r29, 84))); // ldr x25, [x29, 84]! |
| __ ldrw(r26, Address(__ pre(r20, -52))); // ldr w26, [x20, -52]! |
| __ ldrb(r26, Address(__ pre(r29, -25))); // ldrb w26, [x29, -25]! |
| __ ldrh(r4, Address(__ pre(r25, 26))); // ldrh w4, [x25, 26]! |
| __ ldrsb(r28, Address(__ pre(r8, -21))); // ldrsb x28, [x8, -21]! |
| __ ldrsh(r17, Address(__ pre(r14, -6))); // ldrsh x17, [x14, -6]! |
| __ ldrshw(r28, Address(__ pre(r23, 10))); // ldrsh w28, [x23, 10]! |
| __ ldrsw(r30, Address(__ pre(r27, -64))); // ldrsw x30, [x27, -64]! |
| __ ldrd(v20, Address(__ pre(r30, -242))); // ldr d20, [x30, -242]! |
| __ ldrs(v17, Address(__ pre(r27, 20))); // ldr s17, [x27, 20]! |
| __ strd(v7, Address(__ pre(r3, 17))); // str d7, [x3, 17]! |
| __ strs(v13, Address(__ pre(r11, -16))); // str s13, [x11, -16]! |
| |
| // post |
| // LoadStoreOp |
| __ str(r6, Address(__ post(r9, -61))); // str x6, [x9], -61 |
| __ strw(r16, Address(__ post(r5, -29))); // str w16, [x5], -29 |
| __ strb(r29, Address(__ post(r29, 15))); // strb w29, [x29], 15 |
| __ strh(r4, Address(__ post(r20, 18))); // strh w4, [x20], 18 |
| __ ldr(r19, Address(__ post(r18, 46))); // ldr x19, [x18], 46 |
| __ ldrw(r22, Address(__ post(r2, 23))); // ldr w22, [x2], 23 |
| __ ldrb(r7, Address(__ post(r3, -30))); // ldrb w7, [x3], -30 |
| __ ldrh(r11, Address(__ post(r12, -29))); // ldrh w11, [x12], -29 |
| __ ldrsb(r8, Address(__ post(r6, -29))); // ldrsb x8, [x6], -29 |
| __ ldrsh(r24, Address(__ post(r23, 4))); // ldrsh x24, [x23], 4 |
| __ ldrshw(r17, Address(__ post(r16, 0))); // ldrsh w17, [x16], 0 |
| __ ldrsw(r0, Address(__ post(r20, -8))); // ldrsw x0, [x20], -8 |
| __ ldrd(v20, Address(__ post(r2, -126))); // ldr d20, [x2], -126 |
| __ ldrs(v19, Address(__ post(r30, -104))); // ldr s19, [x30], -104 |
| __ strd(v4, Address(__ post(r17, 118))); // str d4, [x17], 118 |
| __ strs(v21, Address(__ post(r19, -112))); // str s21, [x19], -112 |
| |
| // base_plus_reg |
| // LoadStoreOp |
| __ str(r26, Address(r2, r19, Address::lsl(3))); // str x26, [x2, x19, lsl #3] |
| __ strw(r9, Address(r0, r15, Address::sxtw(2))); // str w9, [x0, w15, sxtw #2] |
| __ strb(r26, Address(r12, r1, Address::lsl(0))); // strb w26, [x12, x1, lsl #0] |
| __ strh(r21, Address(r11, r10, Address::lsl(1))); // strh w21, [x11, x10, lsl #1] |
| __ ldr(r16, Address(r23, r16, Address::sxtx(0))); // ldr x16, [x23, x16, sxtx #0] |
| __ ldrw(r10, Address(r11, r17, Address::sxtw(2))); // ldr w10, [x11, w17, sxtw #2] |
| __ ldrb(r13, Address(r23, r11, Address::lsl(0))); // ldrb w13, [x23, x11, lsl #0] |
| __ ldrh(r27, Address(r4, r21, Address::lsl(0))); // ldrh w27, [x4, x21, lsl #0] |
| __ ldrsb(r26, Address(r8, r15, Address::sxtw(0))); // ldrsb x26, [x8, w15, sxtw #0] |
| __ ldrsh(r21, Address(r10, r2, Address::sxtw(0))); // ldrsh x21, [x10, w2, sxtw #0] |
| __ ldrshw(r8, Address(r30, r14, Address::lsl(0))); // ldrsh w8, [x30, x14, lsl #0] |
| __ ldrsw(r29, Address(r14, r20, Address::sxtx(2))); // ldrsw x29, [x14, x20, sxtx #2] |
| __ ldrd(v30, Address(r27, r22, Address::sxtx(0))); // ldr d30, [x27, x22, sxtx #0] |
| __ ldrs(v13, Address(r9, r22, Address::lsl(0))); // ldr s13, [x9, x22, lsl #0] |
| __ strd(v8, Address(r25, r17, Address::sxtw(3))); // str d8, [x25, w17, sxtw #3] |
| __ strs(v1, Address(r24, r5, Address::uxtw(2))); // str s1, [x24, w5, uxtw #2] |
| |
| // base_plus_scaled_offset |
| // LoadStoreOp |
| __ str(r10, Address(r21, 14496)); // str x10, [x21, 14496] |
| __ strw(r18, Address(r29, 7228)); // str w18, [x29, 7228] |
| __ strb(r23, Address(r3, 2018)); // strb w23, [x3, 2018] |
| __ strh(r28, Address(r11, 3428)); // strh w28, [x11, 3428] |
| __ ldr(r24, Address(r26, 14376)); // ldr x24, [x26, 14376] |
| __ ldrw(r21, Address(r2, 6972)); // ldr w21, [x2, 6972] |
| __ ldrb(r4, Address(r5, 1848)); // ldrb w4, [x5, 1848] |
| __ ldrh(r14, Address(r14, 3112)); // ldrh w14, [x14, 3112] |
| __ ldrsb(r4, Address(r27, 1959)); // ldrsb x4, [x27, 1959] |
| __ ldrsh(r4, Address(r27, 3226)); // ldrsh x4, [x27, 3226] |
| __ ldrshw(r10, Address(r28, 3286)); // ldrsh w10, [x28, 3286] |
| __ ldrsw(r10, Address(r17, 7912)); // ldrsw x10, [x17, 7912] |
| __ ldrd(v13, Address(r28, 13400)); // ldr d13, [x28, 13400] |
| __ ldrs(v24, Address(r3, 7596)); // ldr s24, [x3, 7596] |
| __ strd(v2, Address(r12, 15360)); // str d2, [x12, 15360] |
| __ strs(v17, Address(r1, 6492)); // str s17, [x1, 6492] |
| |
| // pcrel |
| // LoadStoreOp |
| __ ldr(r16, __ pc()); // ldr x16, . |
| __ ldrw(r13, __ pc()); // ldr w13, . |
| |
| // LoadStoreOp |
| __ prfm(Address(r18, -127)); // prfm PLDL1KEEP, [x18, -127] |
| |
| // LoadStoreOp |
| __ prfm(back); // prfm PLDL1KEEP, back |
| |
| // LoadStoreOp |
| __ prfm(Address(r20, r2, Address::lsl(3))); // prfm PLDL1KEEP, [x20, x2, lsl #3] |
| |
| // LoadStoreOp |
| __ prfm(Address(r9, 13808)); // prfm PLDL1KEEP, [x9, 13808] |
| |
| // AddSubCarryOp |
| __ adcw(r8, r23, r2); // adc w8, w23, w2 |
| __ adcsw(r24, r3, r19); // adcs w24, w3, w19 |
| __ sbcw(r22, r24, r29); // sbc w22, w24, w29 |
| __ sbcsw(r12, r27, r3); // sbcs w12, w27, w3 |
| __ adc(r11, r23, r1); // adc x11, x23, x1 |
| __ adcs(r29, r5, r23); // adcs x29, x5, x23 |
| __ sbc(r9, r25, r12); // sbc x9, x25, x12 |
| __ sbcs(r12, r0, r22); // sbcs x12, x0, x22 |
| |
| // AddSubExtendedOp |
| __ addw(r26, r12, r3, ext::uxtw, 1); // add w26, w12, w3, uxtw #1 |
| __ addsw(r20, r16, r18, ext::sxtb, 2); // adds w20, w16, w18, sxtb #2 |
| __ sub(r30, r30, r7, ext::uxtw, 2); // sub x30, x30, x7, uxtw #2 |
| __ subsw(r11, r21, r2, ext::uxth, 3); // subs w11, w21, w2, uxth #3 |
| __ add(r2, r26, r1, ext::uxtw, 2); // add x2, x26, x1, uxtw #2 |
| __ adds(r18, r29, r20, ext::sxth, 1); // adds x18, x29, x20, sxth #1 |
| __ sub(r14, r16, r4, ext::uxtw, 4); // sub x14, x16, x4, uxtw #4 |
| __ subs(r0, r17, r23, ext::sxtb, 3); // subs x0, x17, x23, sxtb #3 |
| |
| // ConditionalCompareOp |
| __ ccmnw(r20, r22, 3u, Assembler::PL); // ccmn w20, w22, #3, PL |
| __ ccmpw(r25, r2, 1u, Assembler::EQ); // ccmp w25, w2, #1, EQ |
| __ ccmn(r18, r24, 7u, Assembler::GT); // ccmn x18, x24, #7, GT |
| __ ccmp(r8, r13, 6u, Assembler::PL); // ccmp x8, x13, #6, PL |
| |
| // ConditionalCompareImmedOp |
| __ ccmnw(r9, 2, 4, Assembler::VS); // ccmn w9, #2, #4, VS |
| __ ccmpw(r2, 27, 7, Assembler::EQ); // ccmp w2, #27, #7, EQ |
| __ ccmn(r16, 1, 2, Assembler::CC); // ccmn x16, #1, #2, CC |
| __ ccmp(r17, 31, 3, Assembler::LT); // ccmp x17, #31, #3, LT |
| |
| // ConditionalSelectOp |
| __ cselw(r23, r27, r23, Assembler::LS); // csel w23, w27, w23, LS |
| __ csincw(r10, r0, r6, Assembler::VS); // csinc w10, w0, w6, VS |
| __ csinvw(r11, r0, r9, Assembler::CC); // csinv w11, w0, w9, CC |
| __ csnegw(r17, r27, r18, Assembler::LO); // csneg w17, w27, w18, LO |
| __ csel(r12, r16, r11, Assembler::VC); // csel x12, x16, x11, VC |
| __ csinc(r6, r28, r6, Assembler::HI); // csinc x6, x28, x6, HI |
| __ csinv(r13, r27, r26, Assembler::VC); // csinv x13, x27, x26, VC |
| __ csneg(r29, r22, r18, Assembler::PL); // csneg x29, x22, x18, PL |
| |
| // TwoRegOp |
| __ rbitw(r12, r19); // rbit w12, w19 |
| __ rev16w(r23, r18); // rev16 w23, w18 |
| __ revw(r9, r28); // rev w9, w28 |
| __ clzw(r2, r19); // clz w2, w19 |
| __ clsw(r25, r29); // cls w25, w29 |
| __ rbit(r4, r23); // rbit x4, x23 |
| __ rev16(r29, r18); // rev16 x29, x18 |
| __ rev32(r7, r8); // rev32 x7, x8 |
| __ rev(r13, r17); // rev x13, x17 |
| __ clz(r17, r0); // clz x17, x0 |
| __ cls(r18, r26); // cls x18, x26 |
| |
| // ThreeRegOp |
| __ udivw(r11, r12, r16); // udiv w11, w12, w16 |
| __ sdivw(r4, r9, r7); // sdiv w4, w9, w7 |
| __ lslvw(r12, r7, r16); // lslv w12, w7, w16 |
| __ lsrvw(r19, r16, r23); // lsrv w19, w16, w23 |
| __ asrvw(r7, r4, r6); // asrv w7, w4, w6 |
| __ rorvw(r21, r20, r23); // rorv w21, w20, w23 |
| __ udiv(r16, r12, r28); // udiv x16, x12, x28 |
| __ sdiv(r4, r12, r13); // sdiv x4, x12, x13 |
| __ lslv(r9, r13, r7); // lslv x9, x13, x7 |
| __ lsrv(r28, r27, r15); // lsrv x28, x27, x15 |
| __ asrv(r20, r30, r14); // asrv x20, x30, x14 |
| __ rorv(r14, r18, r30); // rorv x14, x18, x30 |
| __ umulh(r3, r11, r7); // umulh x3, x11, x7 |
| __ smulh(r23, r20, r24); // smulh x23, x20, x24 |
| |
| // FourRegMulOp |
| __ maddw(r2, r5, r21, r9); // madd w2, w5, w21, w9 |
| __ msubw(r24, r24, r4, r8); // msub w24, w24, w4, w8 |
| __ madd(r11, r12, r15, r19); // madd x11, x12, x15, x19 |
| __ msub(r29, r25, r12, r25); // msub x29, x25, x12, x25 |
| __ smaddl(r17, r11, r12, r22); // smaddl x17, w11, w12, x22 |
| __ smsubl(r28, r3, r20, r18); // smsubl x28, w3, w20, x18 |
| __ umaddl(r7, r4, r28, r26); // umaddl x7, w4, w28, x26 |
| __ umsubl(r22, r10, r17, r5); // umsubl x22, w10, w17, x5 |
| |
| // ThreeRegFloatOp |
| __ fmuls(v17, v3, v17); // fmul s17, s3, s17 |
| __ fdivs(v11, v17, v6); // fdiv s11, s17, s6 |
| __ fadds(v29, v7, v9); // fadd s29, s7, s9 |
| __ fsubs(v7, v12, v19); // fsub s7, s12, s19 |
| __ fmuls(v0, v23, v3); // fmul s0, s23, s3 |
| __ fmuld(v26, v3, v21); // fmul d26, d3, d21 |
| __ fdivd(v0, v19, v5); // fdiv d0, d19, d5 |
| __ faddd(v0, v26, v9); // fadd d0, d26, d9 |
| __ fsubd(v25, v21, v21); // fsub d25, d21, d21 |
| __ fmuld(v16, v13, v19); // fmul d16, d13, d19 |
| |
| // FourRegFloatOp |
| __ fmadds(v29, v18, v0, v16); // fmadd s29, s18, s0, s16 |
| __ fmsubs(v23, v13, v29, v5); // fmsub s23, s13, s29, s5 |
| __ fnmadds(v9, v7, v10, v14); // fnmadd s9, s7, s10, s14 |
| __ fnmadds(v25, v28, v15, v23); // fnmadd s25, s28, s15, s23 |
| __ fmaddd(v6, v13, v21, v17); // fmadd d6, d13, d21, d17 |
| __ fmsubd(v3, v21, v2, v7); // fmsub d3, d21, d2, d7 |
| __ fnmaddd(v10, v25, v5, v17); // fnmadd d10, d25, d5, d17 |
| __ fnmaddd(v14, v14, v20, v18); // fnmadd d14, d14, d20, d18 |
| |
| // TwoRegFloatOp |
| __ fmovs(v15, v2); // fmov s15, s2 |
| __ fabss(v18, v7); // fabs s18, s7 |
| __ fnegs(v3, v6); // fneg s3, s6 |
| __ fsqrts(v12, v1); // fsqrt s12, s1 |
| __ fcvts(v9, v0); // fcvt d9, s0 |
| __ fmovd(v4, v5); // fmov d4, d5 |
| __ fabsd(v3, v15); // fabs d3, d15 |
| __ fnegd(v17, v25); // fneg d17, d25 |
| __ fsqrtd(v12, v24); // fsqrt d12, d24 |
| __ fcvtd(v21, v5); // fcvt s21, d5 |
| |
| // FloatConvertOp |
| __ fcvtzsw(r4, v21); // fcvtzs w4, s21 |
| __ fcvtzs(r27, v3); // fcvtzs x27, s3 |
| __ fcvtzdw(r29, v8); // fcvtzs w29, d8 |
| __ fcvtzd(r9, v21); // fcvtzs x9, d21 |
| __ scvtfws(v20, r29); // scvtf s20, w29 |
| __ scvtfs(v7, r8); // scvtf s7, x8 |
| __ scvtfwd(v12, r21); // scvtf d12, w21 |
| __ scvtfd(v16, r21); // scvtf d16, x21 |
| __ fmovs(r18, v5); // fmov w18, s5 |
| __ fmovd(r25, v8); // fmov x25, d8 |
| __ fmovs(v18, r26); // fmov s18, w26 |
| __ fmovd(v0, r11); // fmov d0, x11 |
| |
| // TwoRegFloatOp |
| __ fcmps(v16, v6); // fcmp s16, s6 |
| __ fcmpd(v16, v29); // fcmp d16, d29 |
| __ fcmps(v30, 0.0); // fcmp s30, #0.0 |
| __ fcmpd(v9, 0.0); // fcmp d9, #0.0 |
| |
| // LoadStorePairOp |
| __ stpw(r27, r4, Address(r12, -16)); // stp w27, w4, [x12, #-16] |
| __ ldpw(r3, r9, Address(r10, 80)); // ldp w3, w9, [x10, #80] |
| __ ldpsw(r16, r3, Address(r3, 64)); // ldpsw x16, x3, [x3, #64] |
| __ stp(r10, r28, Address(r19, -192)); // stp x10, x28, [x19, #-192] |
| __ ldp(r19, r18, Address(r7, -192)); // ldp x19, x18, [x7, #-192] |
| |
| // LoadStorePairOp |
| __ stpw(r10, r16, Address(__ pre(r30, 16))); // stp w10, w16, [x30, #16]! |
| __ ldpw(r2, r4, Address(__ pre(r18, -240))); // ldp w2, w4, [x18, #-240]! |
| __ ldpsw(r24, r19, Address(__ pre(r13, 48))); // ldpsw x24, x19, [x13, #48]! |
| __ stp(r17, r0, Address(__ pre(r24, 0))); // stp x17, x0, [x24, #0]! |
| __ ldp(r14, r26, Address(__ pre(r3, -192))); // ldp x14, x26, [x3, #-192]! |
| |
| // LoadStorePairOp |
| __ stpw(r22, r1, Address(__ post(r0, 80))); // stp w22, w1, [x0], #80 |
| __ ldpw(r18, r10, Address(__ post(r0, -16))); // ldp w18, w10, [x0], #-16 |
| __ ldpsw(r24, r24, Address(__ post(r22, -16))); // ldpsw x24, x24, [x22], #-16 |
| __ stp(r12, r12, Address(__ post(r4, 80))); // stp x12, x12, [x4], #80 |
| __ ldp(r4, r9, Address(__ post(r19, -240))); // ldp x4, x9, [x19], #-240 |
| |
| // LoadStorePairOp |
| __ stnpw(r18, r26, Address(r6, -224)); // stnp w18, w26, [x6, #-224] |
| __ ldnpw(r21, r20, Address(r1, 112)); // ldnp w21, w20, [x1, #112] |
| __ stnp(r25, r29, Address(r20, -224)); // stnp x25, x29, [x20, #-224] |
| __ ldnp(r1, r5, Address(r23, 112)); // ldnp x1, x5, [x23, #112] |
| |
| // LdStSIMDOp |
| __ ld1(v4, __ T8B, Address(r20)); // ld1 {v4.8B}, [x20] |
| __ ld1(v24, v25, __ T16B, Address(__ post(r10, 32))); // ld1 {v24.16B, v25.16B}, [x10], 32 |
| __ ld1(v24, v25, v26, __ T1D, Address(__ post(r6, r15))); // ld1 {v24.1D, v25.1D, v26.1D}, [x6], x15 |
| __ ld1(v3, v4, v5, v6, __ T8H, Address(__ post(r4, 64))); // ld1 {v3.8H, v4.8H, v5.8H, v6.8H}, [x4], 64 |
| __ ld1r(v2, __ T8B, Address(r6)); // ld1r {v2.8B}, [x6] |
| __ ld1r(v13, __ T4S, Address(__ post(r14, 4))); // ld1r {v13.4S}, [x14], 4 |
| __ ld1r(v15, __ T1D, Address(__ post(r21, r24))); // ld1r {v15.1D}, [x21], x24 |
| __ ld2(v9, v10, __ T2D, Address(r21)); // ld2 {v9.2D, v10.2D}, [x21] |
| __ ld2(v29, v30, __ T4H, Address(__ post(r21, 16))); // ld2 {v29.4H, v30.4H}, [x21], 16 |
| __ ld2r(v8, v9, __ T16B, Address(r14)); // ld2r {v8.16B, v9.16B}, [x14] |
| __ ld2r(v7, v8, __ T2S, Address(__ post(r20, 8))); // ld2r {v7.2S, v8.2S}, [x20], 8 |
| __ ld2r(v28, v29, __ T2D, Address(__ post(r3, r3))); // ld2r {v28.2D, v29.2D}, [x3], x3 |
| __ ld3(v27, v28, v29, __ T4S, Address(__ post(r11, r29))); // ld3 {v27.4S, v28.4S, v29.4S}, [x11], x29 |
| __ ld3(v16, v17, v18, __ T2S, Address(r10)); // ld3 {v16.2S, v17.2S, v18.2S}, [x10] |
| __ ld3r(v21, v22, v23, __ T8H, Address(r12)); // ld3r {v21.8H, v22.8H, v23.8H}, [x12] |
| __ ld3r(v4, v5, v6, __ T4S, Address(__ post(r29, 12))); // ld3r {v4.4S, v5.4S, v6.4S}, [x29], 12 |
| __ ld3r(v24, v25, v26, __ T1D, Address(__ post(r9, r19))); // ld3r {v24.1D, v25.1D, v26.1D}, [x9], x19 |
| __ ld4(v10, v11, v12, v13, __ T8H, Address(__ post(r3, 64))); // ld4 {v10.8H, v11.8H, v12.8H, v13.8H}, [x3], 64 |
| __ ld4(v27, v28, v29, v30, __ T8B, Address(__ post(r28, r9))); // ld4 {v27.8B, v28.8B, v29.8B, v30.8B}, [x28], x9 |
| __ ld4r(v21, v22, v23, v24, __ T8B, Address(r30)); // ld4r {v21.8B, v22.8B, v23.8B, v24.8B}, [x30] |
| __ ld4r(v23, v24, v25, v26, __ T4H, Address(__ post(r14, 8))); // ld4r {v23.4H, v24.4H, v25.4H, v26.4H}, [x14], 8 |
| __ ld4r(v4, v5, v6, v7, __ T2S, Address(__ post(r13, r20))); // ld4r {v4.2S, v5.2S, v6.2S, v7.2S}, [x13], x20 |
| |
| // SpecialCases |
| __ ccmn(zr, zr, 3u, Assembler::LE); // ccmn xzr, xzr, #3, LE |
| __ ccmnw(zr, zr, 5u, Assembler::EQ); // ccmn wzr, wzr, #5, EQ |
| __ ccmp(zr, 1, 4u, Assembler::NE); // ccmp xzr, 1, #4, NE |
| __ ccmpw(zr, 2, 2, Assembler::GT); // ccmp wzr, 2, #2, GT |
| __ extr(zr, zr, zr, 0); // extr xzr, xzr, xzr, 0 |
| __ stlxp(r0, zr, zr, sp); // stlxp w0, xzr, xzr, [sp] |
| __ stlxpw(r2, zr, zr, r3); // stlxp w2, wzr, wzr, [x3] |
| __ stxp(r4, zr, zr, r5); // stxp w4, xzr, xzr, [x5] |
| __ stxpw(r6, zr, zr, sp); // stxp w6, wzr, wzr, [sp] |
| __ dup(v0, __ T16B, zr); // dup v0.16b, wzr |
| __ mov(v1, __ T1D, 0, zr); // mov v1.d[0], xzr |
| __ mov(v1, __ T2S, 1, zr); // mov v1.s[1], wzr |
| __ mov(v1, __ T4H, 2, zr); // mov v1.h[2], wzr |
| __ mov(v1, __ T8B, 3, zr); // mov v1.b[3], wzr |
| __ ld1(v31, v0, __ T2D, Address(__ post(r1, r0))); // ld1 {v31.2d, v0.2d}, [x1], x0 |
| |
| // FloatImmediateOp |
| __ fmovd(v0, 2.0); // fmov d0, #2.0 |
| __ fmovd(v0, 2.125); // fmov d0, #2.125 |
| __ fmovd(v0, 4.0); // fmov d0, #4.0 |
| __ fmovd(v0, 4.25); // fmov d0, #4.25 |
| __ fmovd(v0, 8.0); // fmov d0, #8.0 |
| __ fmovd(v0, 8.5); // fmov d0, #8.5 |
| __ fmovd(v0, 16.0); // fmov d0, #16.0 |
| __ fmovd(v0, 17.0); // fmov d0, #17.0 |
| __ fmovd(v0, 0.125); // fmov d0, #0.125 |
| __ fmovd(v0, 0.1328125); // fmov d0, #0.1328125 |
| __ fmovd(v0, 0.25); // fmov d0, #0.25 |
| __ fmovd(v0, 0.265625); // fmov d0, #0.265625 |
| __ fmovd(v0, 0.5); // fmov d0, #0.5 |
| __ fmovd(v0, 0.53125); // fmov d0, #0.53125 |
| __ fmovd(v0, 1.0); // fmov d0, #1.0 |
| __ fmovd(v0, 1.0625); // fmov d0, #1.0625 |
| __ fmovd(v0, -2.0); // fmov d0, #-2.0 |
| __ fmovd(v0, -2.125); // fmov d0, #-2.125 |
| __ fmovd(v0, -4.0); // fmov d0, #-4.0 |
| __ fmovd(v0, -4.25); // fmov d0, #-4.25 |
| __ fmovd(v0, -8.0); // fmov d0, #-8.0 |
| __ fmovd(v0, -8.5); // fmov d0, #-8.5 |
| __ fmovd(v0, -16.0); // fmov d0, #-16.0 |
| __ fmovd(v0, -17.0); // fmov d0, #-17.0 |
| __ fmovd(v0, -0.125); // fmov d0, #-0.125 |
| __ fmovd(v0, -0.1328125); // fmov d0, #-0.1328125 |
| __ fmovd(v0, -0.25); // fmov d0, #-0.25 |
| __ fmovd(v0, -0.265625); // fmov d0, #-0.265625 |
| __ fmovd(v0, -0.5); // fmov d0, #-0.5 |
| __ fmovd(v0, -0.53125); // fmov d0, #-0.53125 |
| __ fmovd(v0, -1.0); // fmov d0, #-1.0 |
| __ fmovd(v0, -1.0625); // fmov d0, #-1.0625 |
| |
| // LSEOp |
| __ swp(Assembler::xword, r21, r5, r24); // swp x21, x5, [x24] |
| __ ldadd(Assembler::xword, r13, r13, r15); // ldadd x13, x13, [x15] |
| __ ldbic(Assembler::xword, r22, r19, r26); // ldclr x22, x19, [x26] |
| __ ldeor(Assembler::xword, r25, r10, r26); // ldeor x25, x10, [x26] |
| __ ldorr(Assembler::xword, r5, r27, r15); // ldset x5, x27, [x15] |
| __ ldsmin(Assembler::xword, r19, r5, r11); // ldsmin x19, x5, [x11] |
| __ ldsmax(Assembler::xword, r26, r0, r4); // ldsmax x26, x0, [x4] |
| __ ldumin(Assembler::xword, r22, r23, r30); // ldumin x22, x23, [x30] |
| __ ldumax(Assembler::xword, r18, r28, r8); // ldumax x18, x28, [x8] |
| |
| // LSEOp |
| __ swpa(Assembler::xword, r13, r29, r27); // swpa x13, x29, [x27] |
| __ ldadda(Assembler::xword, r11, r5, r13); // ldadda x11, x5, [x13] |
| __ ldbica(Assembler::xword, r1, r24, r21); // ldclra x1, x24, [x21] |
| __ ldeora(Assembler::xword, r27, r17, r24); // ldeora x27, x17, [x24] |
| __ ldorra(Assembler::xword, r18, r30, r5); // ldseta x18, x30, [x5] |
| __ ldsmina(Assembler::xword, r7, r22, r25); // ldsmina x7, x22, [x25] |
| __ ldsmaxa(Assembler::xword, r4, r26, r19); // ldsmaxa x4, x26, [x19] |
| __ ldumina(Assembler::xword, r6, r30, r3); // ldumina x6, x30, [x3] |
| __ ldumaxa(Assembler::xword, r24, r23, r5); // ldumaxa x24, x23, [x5] |
| |
| // LSEOp |
| __ swpal(Assembler::xword, r24, r18, r28); // swpal x24, x18, [x28] |
| __ ldaddal(Assembler::xword, r19, zr, r7); // ldaddal x19, xzr, [x7] |
| __ ldbical(Assembler::xword, r13, r6, r28); // ldclral x13, x6, [x28] |
| __ ldeoral(Assembler::xword, r8, r15, r21); // ldeoral x8, x15, [x21] |
| __ ldorral(Assembler::xword, r2, r13, r1); // ldsetal x2, x13, [x1] |
| __ ldsminal(Assembler::xword, r17, r29, r25); // ldsminal x17, x29, [x25] |
| __ ldsmaxal(Assembler::xword, r25, r18, r14); // ldsmaxal x25, x18, [x14] |
| __ lduminal(Assembler::xword, zr, r6, r27); // lduminal xzr, x6, [x27] |
| __ ldumaxal(Assembler::xword, r16, r5, r15); // ldumaxal x16, x5, [x15] |
| |
| // LSEOp |
| __ swpl(Assembler::xword, r11, r18, r3); // swpl x11, x18, [x3] |
| __ ldaddl(Assembler::xword, r26, r20, r2); // ldaddl x26, x20, [x2] |
| __ ldbicl(Assembler::xword, r11, r4, r11); // ldclrl x11, x4, [x11] |
| __ ldeorl(Assembler::xword, r30, r19, r23); // ldeorl x30, x19, [x23] |
| __ ldorrl(Assembler::xword, r3, r15, r14); // ldsetl x3, x15, [x14] |
| __ ldsminl(Assembler::xword, r30, r22, r20); // ldsminl x30, x22, [x20] |
| __ ldsmaxl(Assembler::xword, r7, r5, r24); // ldsmaxl x7, x5, [x24] |
| __ lduminl(Assembler::xword, r23, r16, r15); // lduminl x23, x16, [x15] |
| __ ldumaxl(Assembler::xword, r11, r19, r0); // ldumaxl x11, x19, [x0] |
| |
| // LSEOp |
| __ swp(Assembler::word, r28, r28, r1); // swp w28, w28, [x1] |
| __ ldadd(Assembler::word, r11, r21, r12); // ldadd w11, w21, [x12] |
| __ ldbic(Assembler::word, r29, r0, r18); // ldclr w29, w0, [x18] |
| __ ldeor(Assembler::word, r5, r0, r25); // ldeor w5, w0, [x25] |
| __ ldorr(Assembler::word, r14, r0, r26); // ldset w14, w0, [x26] |
| __ ldsmin(Assembler::word, r28, r18, r29); // ldsmin w28, w18, [x29] |
| __ ldsmax(Assembler::word, r15, r1, r29); // ldsmax w15, w1, [x29] |
| __ ldumin(Assembler::word, r8, r26, r28); // ldumin w8, w26, [x28] |
| __ ldumax(Assembler::word, r17, r14, r4); // ldumax w17, w14, [x4] |
| |
| // LSEOp |
| __ swpa(Assembler::word, r24, r25, r1); // swpa w24, w25, [x1] |
| __ ldadda(Assembler::word, r10, r17, r17); // ldadda w10, w17, [x17] |
| __ ldbica(Assembler::word, r29, r20, r21); // ldclra w29, w20, [x21] |
| __ ldeora(Assembler::word, r29, r9, r12); // ldeora w29, w9, [x12] |
| __ ldorra(Assembler::word, r11, r6, r5); // ldseta w11, w6, [x5] |
| __ ldsmina(Assembler::word, r21, r7, r21); // ldsmina w21, w7, [x21] |
| __ ldsmaxa(Assembler::word, r10, r23, r12); // ldsmaxa w10, w23, [x12] |
| __ ldumina(Assembler::word, r21, r5, r10); // ldumina w21, w5, [x10] |
| __ ldumaxa(Assembler::word, r30, r20, r18); // ldumaxa w30, w20, [x18] |
| |
| // LSEOp |
| __ swpal(Assembler::word, r13, r23, r5); // swpal w13, w23, [x5] |
| __ ldaddal(Assembler::word, r15, r24, r5); // ldaddal w15, w24, [x5] |
| __ ldbical(Assembler::word, r9, r10, r25); // ldclral w9, w10, [x25] |
| __ ldeoral(Assembler::word, r20, r17, r17); // ldeoral w20, w17, [x17] |
| __ ldorral(Assembler::word, r12, r18, r30); // ldsetal w12, w18, [x30] |
| __ ldsminal(Assembler::word, r3, r3, r25); // ldsminal w3, w3, [x25] |
| __ ldsmaxal(Assembler::word, r26, r25, r10); // ldsmaxal w26, w25, [x10] |
| __ lduminal(Assembler::word, r2, r11, sp); // lduminal w2, w11, [sp] |
| __ ldumaxal(Assembler::word, r7, r2, r5); // ldumaxal w7, w2, [x5] |
| |
| // LSEOp |
| __ swpl(Assembler::word, r0, r7, r20); // swpl w0, w7, [x20] |
| __ ldaddl(Assembler::word, r5, zr, r2); // ldaddl w5, wzr, [x2] |
| __ ldbicl(Assembler::word, r27, r25, r27); // ldclrl w27, w25, [x27] |
| __ ldeorl(Assembler::word, r30, r24, r26); // ldeorl w30, w24, [x26] |
| __ ldorrl(Assembler::word, r15, r2, r22); // ldsetl w15, w2, [x22] |
| __ ldsminl(Assembler::word, r0, r3, sp); // ldsminl w0, w3, [sp] |
| __ ldsmaxl(Assembler::word, r15, r20, r10); // ldsmaxl w15, w20, [x10] |
| __ lduminl(Assembler::word, r22, r21, r14); // lduminl w22, w21, [x14] |
| __ ldumaxl(Assembler::word, r6, r30, r2); // ldumaxl w6, w30, [x2] |
| |
| __ bind(forth); |
| |
| /* |
| aarch64ops.o: file format elf64-littleaarch64 |
| |
| |
| Disassembly of section .text: |
| |
| 0000000000000000 <back>: |
| 0: 8b50798f add x15, x12, x16, lsr #30 |
| 4: cb4381e1 sub x1, x15, x3, lsr #32 |
| 8: ab05372d adds x13, x25, x5, lsl #13 |
| c: eb864796 subs x22, x28, x6, asr #17 |
| 10: 0b961920 add w0, w9, w22, asr #6 |
| 14: 4b195473 sub w19, w3, w25, lsl #21 |
| 18: 2b0b5264 adds w4, w19, w11, lsl #20 |
| 1c: 6b9300f8 subs w24, w7, w19, asr #0 |
| 20: 8a0bc0fe and x30, x7, x11, lsl #48 |
| 24: aa0f3118 orr x24, x8, x15, lsl #12 |
| 28: ca170531 eor x17, x9, x23, lsl #1 |
| 2c: ea44dd6e ands x14, x11, x4, lsr #55 |
| 30: 0a4c44f3 and w19, w7, w12, lsr #17 |
| 34: 2a8b7373 orr w19, w27, w11, asr #28 |
| 38: 4a567c7e eor w30, w3, w22, lsr #31 |
| 3c: 6a9c0353 ands w19, w26, w28, asr #0 |
| 40: 8a3accdd bic x29, x6, x26, lsl #51 |
| 44: aa318f7a orn x26, x27, x17, lsl #35 |
| 48: ca2e1495 eon x21, x4, x14, lsl #5 |
| 4c: eaa015e2 bics x2, x15, x0, asr #5 |
| 50: 0a2274e2 bic w2, w7, w2, lsl #29 |
| 54: 2a751598 orn w24, w12, w21, lsr #5 |
| 58: 4a3309fe eon w30, w15, w19, lsl #2 |
| 5c: 6ab172fe bics w30, w23, w17, asr #28 |
| 60: 110a5284 add w4, w20, #0x294 |
| 64: 310b1942 adds w2, w10, #0x2c6 |
| 68: 5103d353 sub w19, w26, #0xf4 |
| 6c: 710125bc subs w28, w13, #0x49 |
| 70: 910d7bc2 add x2, x30, #0x35e |
| 74: b108fa1b adds x27, x16, #0x23e |
| 78: d1093536 sub x22, x9, #0x24d |
| 7c: f10ae824 subs x4, x1, #0x2ba |
| 80: 120e667c and w28, w19, #0xfffc0fff |
| 84: 321f6cbb orr w27, w5, #0x1ffffffe |
| 88: 520f6a9e eor w30, w20, #0xfffe0fff |
| 8c: 72136f56 ands w22, w26, #0xffffe1ff |
| 90: 927e4ce5 and x5, x7, #0x3ffffc |
| 94: b278b4ed orr x13, x7, #0x3fffffffffff00 |
| 98: d24c6527 eor x7, x9, #0xfff0000000003fff |
| 9c: f2485803 ands x3, x0, #0xff00000000007fff |
| a0: 14000000 b a0 <back+0xa0> |
| a4: 17ffffd7 b 0 <back> |
| a8: 140001ee b 860 <forth> |
| ac: 94000000 bl ac <back+0xac> |
| b0: 97ffffd4 bl 0 <back> |
| b4: 940001eb bl 860 <forth> |
| b8: 34000010 cbz w16, b8 <back+0xb8> |
| bc: 34fffa30 cbz w16, 0 <back> |
| c0: 34003d10 cbz w16, 860 <forth> |
| c4: 35000013 cbnz w19, c4 <back+0xc4> |
| c8: 35fff9d3 cbnz w19, 0 <back> |
| cc: 35003cb3 cbnz w19, 860 <forth> |
| d0: b4000005 cbz x5, d0 <back+0xd0> |
| d4: b4fff965 cbz x5, 0 <back> |
| d8: b4003c45 cbz x5, 860 <forth> |
| dc: b5000004 cbnz x4, dc <back+0xdc> |
| e0: b5fff904 cbnz x4, 0 <back> |
| e4: b5003be4 cbnz x4, 860 <forth> |
| e8: 1000001b adr x27, e8 <back+0xe8> |
| ec: 10fff8bb adr x27, 0 <back> |
| f0: 10003b9b adr x27, 860 <forth> |
| f4: 90000010 adrp x16, 0 <back> |
| f8: 3640001c tbz w28, #8, f8 <back+0xf8> |
| fc: 3647f83c tbz w28, #8, 0 <back> |
| 100: 36403b1c tbz w28, #8, 860 <forth> |
| 104: 37080001 tbnz w1, #1, 104 <back+0x104> |
| 108: 370ff7c1 tbnz w1, #1, 0 <back> |
| 10c: 37083aa1 tbnz w1, #1, 860 <forth> |
| 110: 12a437f4 mov w20, #0xde40ffff // #-566165505 |
| 114: 528c9d67 mov w7, #0x64eb // #25835 |
| 118: 72838bb1 movk w17, #0x1c5d |
| 11c: 92c1062e mov x14, #0xfffff7ceffffffff // #-9006546419713 |
| 120: d287da49 mov x9, #0x3ed2 // #16082 |
| 124: f2a6d153 movk x19, #0x368a, lsl #16 |
| 128: 93465ac9 sbfx x9, x22, #6, #17 |
| 12c: 330b0013 bfi w19, w0, #21, #1 |
| 130: 530b4e6a ubfx w10, w19, #11, #9 |
| 134: 934545e4 sbfx x4, x15, #5, #13 |
| 138: b35370a3 bfxil x3, x5, #19, #10 |
| 13c: d3510b8c ubfiz x12, x28, #47, #3 |
| 140: 13960c0f extr w15, w0, w22, #3 |
| 144: 93ceddc6 ror x6, x14, #55 |
| 148: 54000000 b.eq 148 <back+0x148> // b.none |
| 14c: 54fff5a0 b.eq 0 <back> // b.none |
| 150: 54003880 b.eq 860 <forth> // b.none |
| 154: 54000001 b.ne 154 <back+0x154> // b.any |
| 158: 54fff541 b.ne 0 <back> // b.any |
| 15c: 54003821 b.ne 860 <forth> // b.any |
| 160: 54000002 b.cs 160 <back+0x160> // b.hs, b.nlast |
| 164: 54fff4e2 b.cs 0 <back> // b.hs, b.nlast |
| 168: 540037c2 b.cs 860 <forth> // b.hs, b.nlast |
| 16c: 54000002 b.cs 16c <back+0x16c> // b.hs, b.nlast |
| 170: 54fff482 b.cs 0 <back> // b.hs, b.nlast |
| 174: 54003762 b.cs 860 <forth> // b.hs, b.nlast |
| 178: 54000003 b.cc 178 <back+0x178> // b.lo, b.ul, b.last |
| 17c: 54fff423 b.cc 0 <back> // b.lo, b.ul, b.last |
| 180: 54003703 b.cc 860 <forth> // b.lo, b.ul, b.last |
| 184: 54000003 b.cc 184 <back+0x184> // b.lo, b.ul, b.last |
| 188: 54fff3c3 b.cc 0 <back> // b.lo, b.ul, b.last |
| 18c: 540036a3 b.cc 860 <forth> // b.lo, b.ul, b.last |
| 190: 54000004 b.mi 190 <back+0x190> // b.first |
| 194: 54fff364 b.mi 0 <back> // b.first |
| 198: 54003644 b.mi 860 <forth> // b.first |
| 19c: 54000005 b.pl 19c <back+0x19c> // b.nfrst |
| 1a0: 54fff305 b.pl 0 <back> // b.nfrst |
| 1a4: 540035e5 b.pl 860 <forth> // b.nfrst |
| 1a8: 54000006 b.vs 1a8 <back+0x1a8> |
| 1ac: 54fff2a6 b.vs 0 <back> |
| 1b0: 54003586 b.vs 860 <forth> |
| 1b4: 54000007 b.vc 1b4 <back+0x1b4> |
| 1b8: 54fff247 b.vc 0 <back> |
| 1bc: 54003527 b.vc 860 <forth> |
| 1c0: 54000008 b.hi 1c0 <back+0x1c0> // b.pmore |
| 1c4: 54fff1e8 b.hi 0 <back> // b.pmore |
| 1c8: 540034c8 b.hi 860 <forth> // b.pmore |
| 1cc: 54000009 b.ls 1cc <back+0x1cc> // b.plast |
| 1d0: 54fff189 b.ls 0 <back> // b.plast |
| 1d4: 54003469 b.ls 860 <forth> // b.plast |
| 1d8: 5400000a b.ge 1d8 <back+0x1d8> // b.tcont |
| 1dc: 54fff12a b.ge 0 <back> // b.tcont |
| 1e0: 5400340a b.ge 860 <forth> // b.tcont |
| 1e4: 5400000b b.lt 1e4 <back+0x1e4> // b.tstop |
| 1e8: 54fff0cb b.lt 0 <back> // b.tstop |
| 1ec: 540033ab b.lt 860 <forth> // b.tstop |
| 1f0: 5400000c b.gt 1f0 <back+0x1f0> |
| 1f4: 54fff06c b.gt 0 <back> |
| 1f8: 5400334c b.gt 860 <forth> |
| 1fc: 5400000d b.le 1fc <back+0x1fc> |
| 200: 54fff00d b.le 0 <back> |
| 204: 540032ed b.le 860 <forth> |
| 208: 5400000e b.al 208 <back+0x208> |
| 20c: 54ffefae b.al 0 <back> |
| 210: 5400328e b.al 860 <forth> |
| 214: 5400000f b.nv 214 <back+0x214> |
| 218: 54ffef4f b.nv 0 <back> |
| 21c: 5400322f b.nv 860 <forth> |
| 220: d40ac601 svc #0x5630 |
| 224: d40042a2 hvc #0x215 |
| 228: d404dac3 smc #0x26d6 |
| 22c: d4224d40 brk #0x126a |
| 230: d44219c0 hlt #0x10ce |
| 234: d503201f nop |
| 238: d69f03e0 eret |
| 23c: d6bf03e0 drps |
| 240: d5033fdf isb |
| 244: d503339f dsb osh |
| 248: d50335bf dmb nshld |
| 24c: d61f0280 br x20 |
| 250: d63f0040 blr x2 |
| 254: c8127c17 stxr w18, x23, [x0] |
| 258: c81efec5 stlxr w30, x5, [x22] |
| 25c: c85f7d05 ldxr x5, [x8] |
| 260: c85ffe14 ldaxr x20, [x16] |
| 264: c89ffd66 stlr x6, [x11] |
| 268: c8dfff66 ldar x6, [x27] |
| 26c: 880a7cb1 stxr w10, w17, [x5] |
| 270: 8816fd89 stlxr w22, w9, [x12] |
| 274: 885f7d1b ldxr w27, [x8] |
| 278: 885ffc57 ldaxr w23, [x2] |
| 27c: 889fffba stlr w26, [x29] |
| 280: 88dffd4d ldar w13, [x10] |
| 284: 48197f7c stxrh w25, w28, [x27] |
| 288: 481dfd96 stlxrh w29, w22, [x12] |
| 28c: 485f7f96 ldxrh w22, [x28] |
| 290: 485fffc3 ldaxrh w3, [x30] |
| 294: 489ffdf8 stlrh w24, [x15] |
| 298: 48dfff5b ldarh w27, [x26] |
| 29c: 080b7e6a stxrb w11, w10, [x19] |
| 2a0: 0817fedb stlxrb w23, w27, [x22] |
| 2a4: 085f7e18 ldxrb w24, [x16] |
| 2a8: 085ffc38 ldaxrb w24, [x1] |
| 2ac: 089fffa5 stlrb w5, [x29] |
| 2b0: 08dffe18 ldarb w24, [x16] |
| 2b4: c87f6239 ldxp x25, x24, [x17] |
| 2b8: c87fb276 ldaxp x22, x12, [x19] |
| 2bc: c820573a stxp w0, x26, x21, [x25] |
| 2c0: c821aca6 stlxp w1, x6, x11, [x5] |
| 2c4: 887f388d ldxp w13, w14, [x4] |
| 2c8: 887f88d1 ldaxp w17, w2, [x6] |
| 2cc: 882f2643 stxp w15, w3, w9, [x18] |
| 2d0: 88329131 stlxp w18, w17, w4, [x9] |
| 2d4: f81cf2b7 stur x23, [x21, #-49] |
| 2d8: b803f055 stur w21, [x2, #63] |
| 2dc: 39002f9b strb w27, [x28, #11] |
| 2e0: 781f31fd sturh w29, [x15, #-13] |
| 2e4: f85d33ce ldur x14, [x30, #-45] |
| 2e8: b843539d ldur w29, [x28, #53] |
| 2ec: 39401f54 ldrb w20, [x26, #7] |
| 2f0: 785ce059 ldurh w25, [x2, #-50] |
| 2f4: 389f1143 ldursb x3, [x10, #-15] |
| 2f8: 788131ee ldursh x14, [x15, #19] |
| 2fc: 78dfb17d ldursh w29, [x11, #-5] |
| 300: b89b90af ldursw x15, [x5, #-71] |
| 304: fc403193 ldur d19, [x12, #3] |
| 308: bc42a36c ldur s12, [x27, #42] |
| 30c: fc07d396 stur d22, [x28, #125] |
| 310: bc1ec1f8 stur s24, [x15, #-20] |
| 314: f81e8f88 str x8, [x28, #-24]! |
| 318: b8025de6 str w6, [x15, #37]! |
| 31c: 38007c27 strb w7, [x1, #7]! |
| 320: 7801ee20 strh w0, [x17, #30]! |
| 324: f8454fb9 ldr x25, [x29, #84]! |
| 328: b85cce9a ldr w26, [x20, #-52]! |
| 32c: 385e7fba ldrb w26, [x29, #-25]! |
| 330: 7841af24 ldrh w4, [x25, #26]! |
| 334: 389ebd1c ldrsb x28, [x8, #-21]! |
| 338: 789fadd1 ldrsh x17, [x14, #-6]! |
| 33c: 78c0aefc ldrsh w28, [x23, #10]! |
| 340: b89c0f7e ldrsw x30, [x27, #-64]! |
| 344: fc50efd4 ldr d20, [x30, #-242]! |
| 348: bc414f71 ldr s17, [x27, #20]! |
| 34c: fc011c67 str d7, [x3, #17]! |
| 350: bc1f0d6d str s13, [x11, #-16]! |
| 354: f81c3526 str x6, [x9], #-61 |
| 358: b81e34b0 str w16, [x5], #-29 |
| 35c: 3800f7bd strb w29, [x29], #15 |
| 360: 78012684 strh w4, [x20], #18 |
| 364: f842e653 ldr x19, [x18], #46 |
| 368: b8417456 ldr w22, [x2], #23 |
| 36c: 385e2467 ldrb w7, [x3], #-30 |
| 370: 785e358b ldrh w11, [x12], #-29 |
| 374: 389e34c8 ldrsb x8, [x6], #-29 |
| 378: 788046f8 ldrsh x24, [x23], #4 |
| 37c: 78c00611 ldrsh w17, [x16], #0 |
| 380: b89f8680 ldrsw x0, [x20], #-8 |
| 384: fc582454 ldr d20, [x2], #-126 |
| 388: bc5987d3 ldr s19, [x30], #-104 |
| 38c: fc076624 str d4, [x17], #118 |
| 390: bc190675 str s21, [x19], #-112 |
| 394: f833785a str x26, [x2, x19, lsl #3] |
| 398: b82fd809 str w9, [x0, w15, sxtw #2] |
| 39c: 3821799a strb w26, [x12, x1, lsl #0] |
| 3a0: 782a7975 strh w21, [x11, x10, lsl #1] |
| 3a4: f870eaf0 ldr x16, [x23, x16, sxtx] |
| 3a8: b871d96a ldr w10, [x11, w17, sxtw #2] |
| 3ac: 386b7aed ldrb w13, [x23, x11, lsl #0] |
| 3b0: 7875689b ldrh w27, [x4, x21] |
| 3b4: 38afd91a ldrsb x26, [x8, w15, sxtw #0] |
| 3b8: 78a2c955 ldrsh x21, [x10, w2, sxtw] |
| 3bc: 78ee6bc8 ldrsh w8, [x30, x14] |
| 3c0: b8b4f9dd ldrsw x29, [x14, x20, sxtx #2] |
| 3c4: fc76eb7e ldr d30, [x27, x22, sxtx] |
| 3c8: bc76692d ldr s13, [x9, x22] |
| 3cc: fc31db28 str d8, [x25, w17, sxtw #3] |
| 3d0: bc255b01 str s1, [x24, w5, uxtw #2] |
| 3d4: f91c52aa str x10, [x21, #14496] |
| 3d8: b91c3fb2 str w18, [x29, #7228] |
| 3dc: 391f8877 strb w23, [x3, #2018] |
| 3e0: 791ac97c strh w28, [x11, #3428] |
| 3e4: f95c1758 ldr x24, [x26, #14376] |
| 3e8: b95b3c55 ldr w21, [x2, #6972] |
| 3ec: 395ce0a4 ldrb w4, [x5, #1848] |
| 3f0: 795851ce ldrh w14, [x14, #3112] |
| 3f4: 399e9f64 ldrsb x4, [x27, #1959] |
| 3f8: 79993764 ldrsh x4, [x27, #3226] |
| 3fc: 79d9af8a ldrsh w10, [x28, #3286] |
| 400: b99eea2a ldrsw x10, [x17, #7912] |
| 404: fd5a2f8d ldr d13, [x28, #13400] |
| 408: bd5dac78 ldr s24, [x3, #7596] |
| 40c: fd1e0182 str d2, [x12, #15360] |
| 410: bd195c31 str s17, [x1, #6492] |
| 414: 58000010 ldr x16, 414 <back+0x414> |
| 418: 1800000d ldr w13, 418 <back+0x418> |
| 41c: f8981240 prfum pldl1keep, [x18, #-127] |
| 420: d8ffdf00 prfm pldl1keep, 0 <back> |
| 424: f8a27a80 prfm pldl1keep, [x20, x2, lsl #3] |
| 428: f99af920 prfm pldl1keep, [x9, #13808] |
| 42c: 1a0202e8 adc w8, w23, w2 |
| 430: 3a130078 adcs w24, w3, w19 |
| 434: 5a1d0316 sbc w22, w24, w29 |
| 438: 7a03036c sbcs w12, w27, w3 |
| 43c: 9a0102eb adc x11, x23, x1 |
| 440: ba1700bd adcs x29, x5, x23 |
| 444: da0c0329 sbc x9, x25, x12 |
| 448: fa16000c sbcs x12, x0, x22 |
| 44c: 0b23459a add w26, w12, w3, uxtw #1 |
| 450: 2b328a14 adds w20, w16, w18, sxtb #2 |
| 454: cb274bde sub x30, x30, w7, uxtw #2 |
| 458: 6b222eab subs w11, w21, w2, uxth #3 |
| 45c: 8b214b42 add x2, x26, w1, uxtw #2 |
| 460: ab34a7b2 adds x18, x29, w20, sxth #1 |
| 464: cb24520e sub x14, x16, w4, uxtw #4 |
| 468: eb378e20 subs x0, x17, w23, sxtb #3 |
| 46c: 3a565283 ccmn w20, w22, #0x3, pl // pl = nfrst |
| 470: 7a420321 ccmp w25, w2, #0x1, eq // eq = none |
| 474: ba58c247 ccmn x18, x24, #0x7, gt |
| 478: fa4d5106 ccmp x8, x13, #0x6, pl // pl = nfrst |
| 47c: 3a426924 ccmn w9, #0x2, #0x4, vs |
| 480: 7a5b0847 ccmp w2, #0x1b, #0x7, eq // eq = none |
| 484: ba413a02 ccmn x16, #0x1, #0x2, cc // cc = lo, ul, last |
| 488: fa5fba23 ccmp x17, #0x1f, #0x3, lt // lt = tstop |
| 48c: 1a979377 csel w23, w27, w23, ls // ls = plast |
| 490: 1a86640a csinc w10, w0, w6, vs |
| 494: 5a89300b csinv w11, w0, w9, cc // cc = lo, ul, last |
| 498: 5a923771 csneg w17, w27, w18, cc // cc = lo, ul, last |
| 49c: 9a8b720c csel x12, x16, x11, vc |
| 4a0: 9a868786 csinc x6, x28, x6, hi // hi = pmore |
| 4a4: da9a736d csinv x13, x27, x26, vc |
| 4a8: da9256dd csneg x29, x22, x18, pl // pl = nfrst |
| 4ac: 5ac0026c rbit w12, w19 |
| 4b0: 5ac00657 rev16 w23, w18 |
| 4b4: 5ac00b89 rev w9, w28 |
| 4b8: 5ac01262 clz w2, w19 |
| 4bc: 5ac017b9 cls w25, w29 |
| 4c0: dac002e4 rbit x4, x23 |
| 4c4: dac0065d rev16 x29, x18 |
| 4c8: dac00907 rev32 x7, x8 |
| 4cc: dac00e2d rev x13, x17 |
| 4d0: dac01011 clz x17, x0 |
| 4d4: dac01752 cls x18, x26 |
| 4d8: 1ad0098b udiv w11, w12, w16 |
| 4dc: 1ac70d24 sdiv w4, w9, w7 |
| 4e0: 1ad020ec lsl w12, w7, w16 |
| 4e4: 1ad72613 lsr w19, w16, w23 |
| 4e8: 1ac62887 asr w7, w4, w6 |
| 4ec: 1ad72e95 ror w21, w20, w23 |
| 4f0: 9adc0990 udiv x16, x12, x28 |
| 4f4: 9acd0d84 sdiv x4, x12, x13 |
| 4f8: 9ac721a9 lsl x9, x13, x7 |
| 4fc: 9acf277c lsr x28, x27, x15 |
| 500: 9ace2bd4 asr x20, x30, x14 |
| 504: 9ade2e4e ror x14, x18, x30 |
| 508: 9bc77d63 umulh x3, x11, x7 |
| 50c: 9b587e97 smulh x23, x20, x24 |
| 510: 1b1524a2 madd w2, w5, w21, w9 |
| 514: 1b04a318 msub w24, w24, w4, w8 |
| 518: 9b0f4d8b madd x11, x12, x15, x19 |
| 51c: 9b0ce73d msub x29, x25, x12, x25 |
| 520: 9b2c5971 smaddl x17, w11, w12, x22 |
| 524: 9b34c87c smsubl x28, w3, w20, x18 |
| 528: 9bbc6887 umaddl x7, w4, w28, x26 |
| 52c: 9bb19556 umsubl x22, w10, w17, x5 |
| 530: 1e310871 fmul s17, s3, s17 |
| 534: 1e261a2b fdiv s11, s17, s6 |
| 538: 1e2928fd fadd s29, s7, s9 |
| 53c: 1e333987 fsub s7, s12, s19 |
| 540: 1e230ae0 fmul s0, s23, s3 |
| 544: 1e75087a fmul d26, d3, d21 |
| 548: 1e651a60 fdiv d0, d19, d5 |
| 54c: 1e692b40 fadd d0, d26, d9 |
| 550: 1e753ab9 fsub d25, d21, d21 |
| 554: 1e7309b0 fmul d16, d13, d19 |
| 558: 1f00425d fmadd s29, s18, s0, s16 |
| 55c: 1f1d95b7 fmsub s23, s13, s29, s5 |
| 560: 1f2a38e9 fnmadd s9, s7, s10, s14 |
| 564: 1f2f5f99 fnmadd s25, s28, s15, s23 |
| 568: 1f5545a6 fmadd d6, d13, d21, d17 |
| 56c: 1f429ea3 fmsub d3, d21, d2, d7 |
| 570: 1f65472a fnmadd d10, d25, d5, d17 |
| 574: 1f7449ce fnmadd d14, d14, d20, d18 |
| 578: 1e20404f fmov s15, s2 |
| 57c: 1e20c0f2 fabs s18, s7 |
| 580: 1e2140c3 fneg s3, s6 |
| 584: 1e21c02c fsqrt s12, s1 |
| 588: 1e22c009 fcvt d9, s0 |
| 58c: 1e6040a4 fmov d4, d5 |
| 590: 1e60c1e3 fabs d3, d15 |
| 594: 1e614331 fneg d17, d25 |
| 598: 1e61c30c fsqrt d12, d24 |
| 59c: 1e6240b5 fcvt s21, d5 |
| 5a0: 1e3802a4 fcvtzs w4, s21 |
| 5a4: 9e38007b fcvtzs x27, s3 |
| 5a8: 1e78011d fcvtzs w29, d8 |
| 5ac: 9e7802a9 fcvtzs x9, d21 |
| 5b0: 1e2203b4 scvtf s20, w29 |
| 5b4: 9e220107 scvtf s7, x8 |
| 5b8: 1e6202ac scvtf d12, w21 |
| 5bc: 9e6202b0 scvtf d16, x21 |
| 5c0: 1e2600b2 fmov w18, s5 |
| 5c4: 9e660119 fmov x25, d8 |
| 5c8: 1e270352 fmov s18, w26 |
| 5cc: 9e670160 fmov d0, x11 |
| 5d0: 1e262200 fcmp s16, s6 |
| 5d4: 1e7d2200 fcmp d16, d29 |
| 5d8: 1e2023c8 fcmp s30, #0.0 |
| 5dc: 1e602128 fcmp d9, #0.0 |
| 5e0: 293e119b stp w27, w4, [x12, #-16] |
| 5e4: 294a2543 ldp w3, w9, [x10, #80] |
| 5e8: 69480c70 ldpsw x16, x3, [x3, #64] |
| 5ec: a934726a stp x10, x28, [x19, #-192] |
| 5f0: a97448f3 ldp x19, x18, [x7, #-192] |
| 5f4: 298243ca stp w10, w16, [x30, #16]! |
| 5f8: 29e21242 ldp w2, w4, [x18, #-240]! |
| 5fc: 69c64db8 ldpsw x24, x19, [x13, #48]! |
| 600: a9800311 stp x17, x0, [x24, #0]! |
| 604: a9f4686e ldp x14, x26, [x3, #-192]! |
| 608: 288a0416 stp w22, w1, [x0], #80 |
| 60c: 28fe2812 ldp w18, w10, [x0], #-16 |
| 610: 68fe62d8 .inst 0x68fe62d8 ; undefined |
| 614: a885308c stp x12, x12, [x4], #80 |
| 618: a8f12664 ldp x4, x9, [x19], #-240 |
| 61c: 282468d2 stnp w18, w26, [x6, #-224] |
| 620: 284e5035 ldnp w21, w20, [x1, #112] |
| 624: a8327699 stnp x25, x29, [x20, #-224] |
| 628: a84716e1 ldnp x1, x5, [x23, #112] |
| 62c: 0c407284 ld1 {v4.8b}, [x20] |
| 630: 4cdfa158 ld1 {v24.16b, v25.16b}, [x10], #32 |
| 634: 0ccf6cd8 ld1 {v24.1d-v26.1d}, [x6], x15 |
| 638: 4cdf2483 ld1 {v3.8h-v6.8h}, [x4], #64 |
| 63c: 0d40c0c2 ld1r {v2.8b}, [x6] |
| 640: 4ddfc9cd ld1r {v13.4s}, [x14], #4 |
| 644: 0dd8ceaf ld1r {v15.1d}, [x21], x24 |
| 648: 4c408ea9 ld2 {v9.2d, v10.2d}, [x21] |
| 64c: 0cdf86bd ld2 {v29.4h, v30.4h}, [x21], #16 |
| 650: 4d60c1c8 ld2r {v8.16b, v9.16b}, [x14] |
| 654: 0dffca87 ld2r {v7.2s, v8.2s}, [x20], #8 |
| 658: 4de3cc7c ld2r {v28.2d, v29.2d}, [x3], x3 |
| 65c: 4cdd497b ld3 {v27.4s-v29.4s}, [x11], x29 |
| 660: 0c404950 ld3 {v16.2s-v18.2s}, [x10] |
| 664: 4d40e595 ld3r {v21.8h-v23.8h}, [x12] |
| 668: 4ddfeba4 ld3r {v4.4s-v6.4s}, [x29], #12 |
| 66c: 0dd3ed38 ld3r {v24.1d-v26.1d}, [x9], x19 |
| 670: 4cdf046a ld4 {v10.8h-v13.8h}, [x3], #64 |
| 674: 0cc9039b ld4 {v27.8b-v30.8b}, [x28], x9 |
| 678: 0d60e3d5 ld4r {v21.8b-v24.8b}, [x30] |
| 67c: 0dffe5d7 ld4r {v23.4h-v26.4h}, [x14], #8 |
| 680: 0df4e9a4 ld4r {v4.2s-v7.2s}, [x13], x20 |
| 684: ba5fd3e3 ccmn xzr, xzr, #0x3, le |
| 688: 3a5f03e5 ccmn wzr, wzr, #0x5, eq // eq = none |
| 68c: fa411be4 ccmp xzr, #0x1, #0x4, ne // ne = any |
| 690: 7a42cbe2 ccmp wzr, #0x2, #0x2, gt |
| 694: 93df03ff ror xzr, xzr, #0 |
| 698: c820ffff stlxp w0, xzr, xzr, [sp] |
| 69c: 8822fc7f stlxp w2, wzr, wzr, [x3] |
| 6a0: c8247cbf stxp w4, xzr, xzr, [x5] |
| 6a4: 88267fff stxp w6, wzr, wzr, [sp] |
| 6a8: 4e010fe0 dup v0.16b, wzr |
| 6ac: 4e081fe1 mov v1.d[0], xzr |
| 6b0: 4e0c1fe1 mov v1.s[1], wzr |
| 6b4: 4e0a1fe1 mov v1.h[2], wzr |
| 6b8: 4e071fe1 mov v1.b[3], wzr |
| 6bc: 4cc0ac3f ld1 {v31.2d, v0.2d}, [x1], x0 |
| 6c0: 1e601000 fmov d0, #2.000000000000000000e+00 |
| 6c4: 1e603000 fmov d0, #2.125000000000000000e+00 |
| 6c8: 1e621000 fmov d0, #4.000000000000000000e+00 |
| 6cc: 1e623000 fmov d0, #4.250000000000000000e+00 |
| 6d0: 1e641000 fmov d0, #8.000000000000000000e+00 |
| 6d4: 1e643000 fmov d0, #8.500000000000000000e+00 |
| 6d8: 1e661000 fmov d0, #1.600000000000000000e+01 |
| 6dc: 1e663000 fmov d0, #1.700000000000000000e+01 |
| 6e0: 1e681000 fmov d0, #1.250000000000000000e-01 |
| 6e4: 1e683000 fmov d0, #1.328125000000000000e-01 |
| 6e8: 1e6a1000 fmov d0, #2.500000000000000000e-01 |
| 6ec: 1e6a3000 fmov d0, #2.656250000000000000e-01 |
| 6f0: 1e6c1000 fmov d0, #5.000000000000000000e-01 |
| 6f4: 1e6c3000 fmov d0, #5.312500000000000000e-01 |
| 6f8: 1e6e1000 fmov d0, #1.000000000000000000e+00 |
| 6fc: 1e6e3000 fmov d0, #1.062500000000000000e+00 |
| 700: 1e701000 fmov d0, #-2.000000000000000000e+00 |
| 704: 1e703000 fmov d0, #-2.125000000000000000e+00 |
| 708: 1e721000 fmov d0, #-4.000000000000000000e+00 |
| 70c: 1e723000 fmov d0, #-4.250000000000000000e+00 |
| 710: 1e741000 fmov d0, #-8.000000000000000000e+00 |
| 714: 1e743000 fmov d0, #-8.500000000000000000e+00 |
| 718: 1e761000 fmov d0, #-1.600000000000000000e+01 |
| 71c: 1e763000 fmov d0, #-1.700000000000000000e+01 |
| 720: 1e781000 fmov d0, #-1.250000000000000000e-01 |
| 724: 1e783000 fmov d0, #-1.328125000000000000e-01 |
| 728: 1e7a1000 fmov d0, #-2.500000000000000000e-01 |
| 72c: 1e7a3000 fmov d0, #-2.656250000000000000e-01 |
| 730: 1e7c1000 fmov d0, #-5.000000000000000000e-01 |
| 734: 1e7c3000 fmov d0, #-5.312500000000000000e-01 |
| 738: 1e7e1000 fmov d0, #-1.000000000000000000e+00 |
| 73c: 1e7e3000 fmov d0, #-1.062500000000000000e+00 |
| 740: f8358305 swp x21, x5, [x24] |
| 744: f82d01ed ldadd x13, x13, [x15] |
| 748: f8361353 ldclr x22, x19, [x26] |
| 74c: f839234a ldeor x25, x10, [x26] |
| 750: f82531fb ldset x5, x27, [x15] |
| 754: f8335165 ldsmin x19, x5, [x11] |
| 758: f83a4080 ldsmax x26, x0, [x4] |
| 75c: f83673d7 ldumin x22, x23, [x30] |
| 760: f832611c ldumax x18, x28, [x8] |
| 764: f8ad837d swpa x13, x29, [x27] |
| 768: f8ab01a5 ldadda x11, x5, [x13] |
| 76c: f8a112b8 ldclra x1, x24, [x21] |
| 770: f8bb2311 ldeora x27, x17, [x24] |
| 774: f8b230be ldseta x18, x30, [x5] |
| 778: f8a75336 ldsmina x7, x22, [x25] |
| 77c: f8a4427a ldsmaxa x4, x26, [x19] |
| 780: f8a6707e ldumina x6, x30, [x3] |
| 784: f8b860b7 ldumaxa x24, x23, [x5] |
| 788: f8f88392 swpal x24, x18, [x28] |
| 78c: f8f300ff ldaddal x19, xzr, [x7] |
| 790: f8ed1386 ldclral x13, x6, [x28] |
| 794: f8e822af ldeoral x8, x15, [x21] |
| 798: f8e2302d ldsetal x2, x13, [x1] |
| 79c: f8f1533d ldsminal x17, x29, [x25] |
| 7a0: f8f941d2 ldsmaxal x25, x18, [x14] |
| 7a4: f8ff7366 lduminal xzr, x6, [x27] |
| 7a8: f8f061e5 ldumaxal x16, x5, [x15] |
| 7ac: f86b8072 swpl x11, x18, [x3] |
| 7b0: f87a0054 ldaddl x26, x20, [x2] |
| 7b4: f86b1164 ldclrl x11, x4, [x11] |
| 7b8: f87e22f3 ldeorl x30, x19, [x23] |
| 7bc: f86331cf ldsetl x3, x15, [x14] |
| 7c0: f87e5296 ldsminl x30, x22, [x20] |
| 7c4: f8674305 ldsmaxl x7, x5, [x24] |
| 7c8: f87771f0 lduminl x23, x16, [x15] |
| 7cc: f86b6013 ldumaxl x11, x19, [x0] |
| 7d0: b83c803c swp w28, w28, [x1] |
| 7d4: b82b0195 ldadd w11, w21, [x12] |
| 7d8: b83d1240 ldclr w29, w0, [x18] |
| 7dc: b8252320 ldeor w5, w0, [x25] |
| 7e0: b82e3340 ldset w14, w0, [x26] |
| 7e4: b83c53b2 ldsmin w28, w18, [x29] |
| 7e8: b82f43a1 ldsmax w15, w1, [x29] |
| 7ec: b828739a ldumin w8, w26, [x28] |
| 7f0: b831608e ldumax w17, w14, [x4] |
| 7f4: b8b88039 swpa w24, w25, [x1] |
| 7f8: b8aa0231 ldadda w10, w17, [x17] |
| 7fc: b8bd12b4 ldclra w29, w20, [x21] |
| 800: b8bd2189 ldeora w29, w9, [x12] |
| 804: b8ab30a6 ldseta w11, w6, [x5] |
| 808: b8b552a7 ldsmina w21, w7, [x21] |
| 80c: b8aa4197 ldsmaxa w10, w23, [x12] |
| 810: b8b57145 ldumina w21, w5, [x10] |
| 814: b8be6254 ldumaxa w30, w20, [x18] |
| 818: b8ed80b7 swpal w13, w23, [x5] |
| 81c: b8ef00b8 ldaddal w15, w24, [x5] |
| 820: b8e9132a ldclral w9, w10, [x25] |
| 824: b8f42231 ldeoral w20, w17, [x17] |
| 828: b8ec33d2 ldsetal w12, w18, [x30] |
| 82c: b8e35323 ldsminal w3, w3, [x25] |
| 830: b8fa4159 ldsmaxal w26, w25, [x10] |
| 834: b8e273eb lduminal w2, w11, [sp] |
| 838: b8e760a2 ldumaxal w7, w2, [x5] |
| 83c: b8608287 swpl w0, w7, [x20] |
| 840: b865005f staddl w5, [x2] |
| 844: b87b1379 ldclrl w27, w25, [x27] |
| 848: b87e2358 ldeorl w30, w24, [x26] |
| 84c: b86f32c2 ldsetl w15, w2, [x22] |
| 850: b86053e3 ldsminl w0, w3, [sp] |
| 854: b86f4154 ldsmaxl w15, w20, [x10] |
| 858: b87671d5 lduminl w22, w21, [x14] |
| 85c: b866605e ldumaxl w6, w30, [x2] |
| */ |
| |
| static const unsigned int insns[] = |
| { |
| 0x8b50798f, 0xcb4381e1, 0xab05372d, 0xeb864796, |
| 0x0b961920, 0x4b195473, 0x2b0b5264, 0x6b9300f8, |
| 0x8a0bc0fe, 0xaa0f3118, 0xca170531, 0xea44dd6e, |
| 0x0a4c44f3, 0x2a8b7373, 0x4a567c7e, 0x6a9c0353, |
| 0x8a3accdd, 0xaa318f7a, 0xca2e1495, 0xeaa015e2, |
| 0x0a2274e2, 0x2a751598, 0x4a3309fe, 0x6ab172fe, |
| 0x110a5284, 0x310b1942, 0x5103d353, 0x710125bc, |
| 0x910d7bc2, 0xb108fa1b, 0xd1093536, 0xf10ae824, |
| 0x120e667c, 0x321f6cbb, 0x520f6a9e, 0x72136f56, |
| 0x927e4ce5, 0xb278b4ed, 0xd24c6527, 0xf2485803, |
| 0x14000000, 0x17ffffd7, 0x140001ee, 0x94000000, |
| 0x97ffffd4, 0x940001eb, 0x34000010, 0x34fffa30, |
| 0x34003d10, 0x35000013, 0x35fff9d3, 0x35003cb3, |
| 0xb4000005, 0xb4fff965, 0xb4003c45, 0xb5000004, |
| 0xb5fff904, 0xb5003be4, 0x1000001b, 0x10fff8bb, |
| 0x10003b9b, 0x90000010, 0x3640001c, 0x3647f83c, |
| 0x36403b1c, 0x37080001, 0x370ff7c1, 0x37083aa1, |
| 0x12a437f4, 0x528c9d67, 0x72838bb1, 0x92c1062e, |
| 0xd287da49, 0xf2a6d153, 0x93465ac9, 0x330b0013, |
| 0x530b4e6a, 0x934545e4, 0xb35370a3, 0xd3510b8c, |
| 0x13960c0f, 0x93ceddc6, 0x54000000, 0x54fff5a0, |
| 0x54003880, 0x54000001, 0x54fff541, 0x54003821, |
| 0x54000002, 0x54fff4e2, 0x540037c2, 0x54000002, |
| 0x54fff482, 0x54003762, 0x54000003, 0x54fff423, |
| 0x54003703, 0x54000003, 0x54fff3c3, 0x540036a3, |
| 0x54000004, 0x54fff364, 0x54003644, 0x54000005, |
| 0x54fff305, 0x540035e5, 0x54000006, 0x54fff2a6, |
| 0x54003586, 0x54000007, 0x54fff247, 0x54003527, |
| 0x54000008, 0x54fff1e8, 0x540034c8, 0x54000009, |
| 0x54fff189, 0x54003469, 0x5400000a, 0x54fff12a, |
| 0x5400340a, 0x5400000b, 0x54fff0cb, 0x540033ab, |
| 0x5400000c, 0x54fff06c, 0x5400334c, 0x5400000d, |
| 0x54fff00d, 0x540032ed, 0x5400000e, 0x54ffefae, |
| 0x5400328e, 0x5400000f, 0x54ffef4f, 0x5400322f, |
| 0xd40ac601, 0xd40042a2, 0xd404dac3, 0xd4224d40, |
| 0xd44219c0, 0xd503201f, 0xd69f03e0, 0xd6bf03e0, |
| 0xd5033fdf, 0xd503339f, 0xd50335bf, 0xd61f0280, |
| 0xd63f0040, 0xc8127c17, 0xc81efec5, 0xc85f7d05, |
| 0xc85ffe14, 0xc89ffd66, 0xc8dfff66, 0x880a7cb1, |
| 0x8816fd89, 0x885f7d1b, 0x885ffc57, 0x889fffba, |
| 0x88dffd4d, 0x48197f7c, 0x481dfd96, 0x485f7f96, |
| 0x485fffc3, 0x489ffdf8, 0x48dfff5b, 0x080b7e6a, |
| 0x0817fedb, 0x085f7e18, 0x085ffc38, 0x089fffa5, |
| 0x08dffe18, 0xc87f6239, 0xc87fb276, 0xc820573a, |
| 0xc821aca6, 0x887f388d, 0x887f88d1, 0x882f2643, |
| 0x88329131, 0xf81cf2b7, 0xb803f055, 0x39002f9b, |
| 0x781f31fd, 0xf85d33ce, 0xb843539d, 0x39401f54, |
| 0x785ce059, 0x389f1143, 0x788131ee, 0x78dfb17d, |
| 0xb89b90af, 0xfc403193, 0xbc42a36c, 0xfc07d396, |
| 0xbc1ec1f8, 0xf81e8f88, 0xb8025de6, 0x38007c27, |
| 0x7801ee20, 0xf8454fb9, 0xb85cce9a, 0x385e7fba, |
| 0x7841af24, 0x389ebd1c, 0x789fadd1, 0x78c0aefc, |
| 0xb89c0f7e, 0xfc50efd4, 0xbc414f71, 0xfc011c67, |
| 0xbc1f0d6d, 0xf81c3526, 0xb81e34b0, 0x3800f7bd, |
| 0x78012684, 0xf842e653, 0xb8417456, 0x385e2467, |
| 0x785e358b, 0x389e34c8, 0x788046f8, 0x78c00611, |
| 0xb89f8680, 0xfc582454, 0xbc5987d3, 0xfc076624, |
| 0xbc190675, 0xf833785a, 0xb82fd809, 0x3821799a, |
| 0x782a7975, 0xf870eaf0, 0xb871d96a, 0x386b7aed, |
| 0x7875689b, 0x38afd91a, 0x78a2c955, 0x78ee6bc8, |
| 0xb8b4f9dd, 0xfc76eb7e, 0xbc76692d, 0xfc31db28, |
| 0xbc255b01, 0xf91c52aa, 0xb91c3fb2, 0x391f8877, |
| 0x791ac97c, 0xf95c1758, 0xb95b3c55, 0x395ce0a4, |
| 0x795851ce, 0x399e9f64, 0x79993764, 0x79d9af8a, |
| 0xb99eea2a, 0xfd5a2f8d, 0xbd5dac78, 0xfd1e0182, |
| 0xbd195c31, 0x58000010, 0x1800000d, 0xf8981240, |
| 0xd8ffdf00, 0xf8a27a80, 0xf99af920, 0x1a0202e8, |
| 0x3a130078, 0x5a1d0316, 0x7a03036c, 0x9a0102eb, |
| 0xba1700bd, 0xda0c0329, 0xfa16000c, 0x0b23459a, |
| 0x2b328a14, 0xcb274bde, 0x6b222eab, 0x8b214b42, |
| 0xab34a7b2, 0xcb24520e, 0xeb378e20, 0x3a565283, |
| 0x7a420321, 0xba58c247, 0xfa4d5106, 0x3a426924, |
| 0x7a5b0847, 0xba413a02, 0xfa5fba23, 0x1a979377, |
| 0x1a86640a, 0x5a89300b, 0x5a923771, 0x9a8b720c, |
| 0x9a868786, 0xda9a736d, 0xda9256dd, 0x5ac0026c, |
| 0x5ac00657, 0x5ac00b89, 0x5ac01262, 0x5ac017b9, |
| 0xdac002e4, 0xdac0065d, 0xdac00907, 0xdac00e2d, |
| 0xdac01011, 0xdac01752, 0x1ad0098b, 0x1ac70d24, |
| 0x1ad020ec, 0x1ad72613, 0x1ac62887, 0x1ad72e95, |
| 0x9adc0990, 0x9acd0d84, 0x9ac721a9, 0x9acf277c, |
| 0x9ace2bd4, 0x9ade2e4e, 0x9bc77d63, 0x9b587e97, |
| 0x1b1524a2, 0x1b04a318, 0x9b0f4d8b, 0x9b0ce73d, |
| 0x9b2c5971, 0x9b34c87c, 0x9bbc6887, 0x9bb19556, |
| 0x1e310871, 0x1e261a2b, 0x1e2928fd, 0x1e333987, |
| 0x1e230ae0, 0x1e75087a, 0x1e651a60, 0x1e692b40, |
| 0x1e753ab9, 0x1e7309b0, 0x1f00425d, 0x1f1d95b7, |
| 0x1f2a38e9, 0x1f2f5f99, 0x1f5545a6, 0x1f429ea3, |
| 0x1f65472a, 0x1f7449ce, 0x1e20404f, 0x1e20c0f2, |
| 0x1e2140c3, 0x1e21c02c, 0x1e22c009, 0x1e6040a4, |
| 0x1e60c1e3, 0x1e614331, 0x1e61c30c, 0x1e6240b5, |
| 0x1e3802a4, 0x9e38007b, 0x1e78011d, 0x9e7802a9, |
| 0x1e2203b4, 0x9e220107, 0x1e6202ac, 0x9e6202b0, |
| 0x1e2600b2, 0x9e660119, 0x1e270352, 0x9e670160, |
| 0x1e262200, 0x1e7d2200, 0x1e2023c8, 0x1e602128, |
| 0x293e119b, 0x294a2543, 0x69480c70, 0xa934726a, |
| 0xa97448f3, 0x298243ca, 0x29e21242, 0x69c64db8, |
| 0xa9800311, 0xa9f4686e, 0x288a0416, 0x28fe2812, |
| 0x68fe62d8, 0xa885308c, 0xa8f12664, 0x282468d2, |
| 0x284e5035, 0xa8327699, 0xa84716e1, 0x0c407284, |
| 0x4cdfa158, 0x0ccf6cd8, 0x4cdf2483, 0x0d40c0c2, |
| 0x4ddfc9cd, 0x0dd8ceaf, 0x4c408ea9, 0x0cdf86bd, |
| 0x4d60c1c8, 0x0dffca87, 0x4de3cc7c, 0x4cdd497b, |
| 0x0c404950, 0x4d40e595, 0x4ddfeba4, 0x0dd3ed38, |
| 0x4cdf046a, 0x0cc9039b, 0x0d60e3d5, 0x0dffe5d7, |
| 0x0df4e9a4, 0xba5fd3e3, 0x3a5f03e5, 0xfa411be4, |
| 0x7a42cbe2, 0x93df03ff, 0xc820ffff, 0x8822fc7f, |
| 0xc8247cbf, 0x88267fff, 0x4e010fe0, 0x4e081fe1, |
| 0x4e0c1fe1, 0x4e0a1fe1, 0x4e071fe1, 0x4cc0ac3f, |
| 0x1e601000, 0x1e603000, 0x1e621000, 0x1e623000, |
| 0x1e641000, 0x1e643000, 0x1e661000, 0x1e663000, |
| 0x1e681000, 0x1e683000, 0x1e6a1000, 0x1e6a3000, |
| 0x1e6c1000, 0x1e6c3000, 0x1e6e1000, 0x1e6e3000, |
| 0x1e701000, 0x1e703000, 0x1e721000, 0x1e723000, |
| 0x1e741000, 0x1e743000, 0x1e761000, 0x1e763000, |
| 0x1e781000, 0x1e783000, 0x1e7a1000, 0x1e7a3000, |
| 0x1e7c1000, 0x1e7c3000, 0x1e7e1000, 0x1e7e3000, |
| 0xf8358305, 0xf82d01ed, 0xf8361353, 0xf839234a, |
| 0xf82531fb, 0xf8335165, 0xf83a4080, 0xf83673d7, |
| 0xf832611c, 0xf8ad837d, 0xf8ab01a5, 0xf8a112b8, |
| 0xf8bb2311, 0xf8b230be, 0xf8a75336, 0xf8a4427a, |
| 0xf8a6707e, 0xf8b860b7, 0xf8f88392, 0xf8f300ff, |
| 0xf8ed1386, 0xf8e822af, 0xf8e2302d, 0xf8f1533d, |
| 0xf8f941d2, 0xf8ff7366, 0xf8f061e5, 0xf86b8072, |
| 0xf87a0054, 0xf86b1164, 0xf87e22f3, 0xf86331cf, |
| 0xf87e5296, 0xf8674305, 0xf87771f0, 0xf86b6013, |
| 0xb83c803c, 0xb82b0195, 0xb83d1240, 0xb8252320, |
| 0xb82e3340, 0xb83c53b2, 0xb82f43a1, 0xb828739a, |
| 0xb831608e, 0xb8b88039, 0xb8aa0231, 0xb8bd12b4, |
| 0xb8bd2189, 0xb8ab30a6, 0xb8b552a7, 0xb8aa4197, |
| 0xb8b57145, 0xb8be6254, 0xb8ed80b7, 0xb8ef00b8, |
| 0xb8e9132a, 0xb8f42231, 0xb8ec33d2, 0xb8e35323, |
| 0xb8fa4159, 0xb8e273eb, 0xb8e760a2, 0xb8608287, |
| 0xb865005f, 0xb87b1379, 0xb87e2358, 0xb86f32c2, |
| 0xb86053e3, 0xb86f4154, 0xb87671d5, 0xb866605e, |
| |
| }; |
| // END Generated code -- do not edit |
| |
| asm_check((unsigned int *)entry, insns, sizeof insns / sizeof insns[0]); |
| |
| { |
| address PC = __ pc(); |
| __ ld1(v0, __ T16B, Address(r16)); // No offset |
| __ ld1(v0, __ T8H, __ post(r16, 16)); // Post-index |
| __ ld2(v0, v1, __ T8H, __ post(r24, 16 * 2)); // Post-index |
| __ ld1(v0, __ T16B, __ post(r16, r17)); // Register post-index |
| static const unsigned int vector_insns[] = { |
| 0x4c407200, // ld1 {v0.16b}, [x16] |
| 0x4cdf7600, // ld1 {v0.8h}, [x16], #16 |
| 0x4cdf8700, // ld2 {v0.8h, v1.8h}, [x24], #32 |
| 0x4cd17200, // ld1 {v0.16b}, [x16], x17 |
| }; |
| asm_check((unsigned int *)PC, vector_insns, |
| sizeof vector_insns / sizeof vector_insns[0]); |
| } |
| } |
| #endif // ASSERT |
| |
| #undef __ |
| |
| void Assembler::emit_data64(jlong data, |
| relocInfo::relocType rtype, |
| int format) { |
| if (rtype == relocInfo::none) { |
| emit_int64(data); |
| } else { |
| emit_data64(data, Relocation::spec_simple(rtype), format); |
| } |
| } |
| |
| void Assembler::emit_data64(jlong data, |
| RelocationHolder const& rspec, |
| int format) { |
| |
| assert(inst_mark() != NULL, "must be inside InstructionMark"); |
| // Do not use AbstractAssembler::relocate, which is not intended for |
| // embedded words. Instead, relocate to the enclosing instruction. |
| code_section()->relocate(inst_mark(), rspec, format); |
| emit_int64(data); |
| } |
| |
| extern "C" { |
| void das(uint64_t start, int len) { |
| ResourceMark rm; |
| len <<= 2; |
| if (len < 0) |
| Disassembler::decode((address)start + len, (address)start); |
| else |
| Disassembler::decode((address)start, (address)start + len); |
| } |
| |
| JNIEXPORT void das1(uintptr_t insn) { |
| das(insn, 1); |
| } |
| } |
| |
| #define gas_assert(ARG1) assert(ARG1, #ARG1) |
| |
| #define __ as-> |
| |
| void Address::lea(MacroAssembler *as, Register r) const { |
| Relocation* reloc = _rspec.reloc(); |
| relocInfo::relocType rtype = (relocInfo::relocType) reloc->type(); |
| |
| switch(_mode) { |
| case base_plus_offset: { |
| if (_offset == 0 && _base == r) // it's a nop |
| break; |
| if (_offset > 0) |
| __ add(r, _base, _offset); |
| else |
| __ sub(r, _base, -_offset); |
| break; |
| } |
| case base_plus_offset_reg: { |
| __ add(r, _base, _index, _ext.op(), MAX2(_ext.shift(), 0)); |
| break; |
| } |
| case literal: { |
| if (rtype == relocInfo::none) |
| __ mov(r, target()); |
| else |
| __ movptr(r, (uint64_t)target()); |
| break; |
| } |
| default: |
| ShouldNotReachHere(); |
| } |
| } |
| |
| void Assembler::adrp(Register reg1, const Address &dest, uintptr_t &byte_offset) { |
| ShouldNotReachHere(); |
| } |
| |
| #undef __ |
| |
| #define starti Instruction_aarch64 do_not_use(this); set_current(&do_not_use) |
| |
| void Assembler::adr(Register Rd, address adr) { |
| intptr_t offset = adr - pc(); |
| int offset_lo = offset & 3; |
| offset >>= 2; |
| starti; |
| f(0, 31), f(offset_lo, 30, 29), f(0b10000, 28, 24), sf(offset, 23, 5); |
| rf(Rd, 0); |
| } |
| |
| void Assembler::_adrp(Register Rd, address adr) { |
| uint64_t pc_page = (uint64_t)pc() >> 12; |
| uint64_t adr_page = (uint64_t)adr >> 12; |
| intptr_t offset = adr_page - pc_page; |
| int offset_lo = offset & 3; |
| offset >>= 2; |
| starti; |
| f(1, 31), f(offset_lo, 30, 29), f(0b10000, 28, 24), sf(offset, 23, 5); |
| rf(Rd, 0); |
| } |
| |
| #undef starti |
| |
| Address::Address(address target, relocInfo::relocType rtype) : _mode(literal){ |
| _is_lval = false; |
| _target = target; |
| switch (rtype) { |
| case relocInfo::oop_type: |
| case relocInfo::metadata_type: |
| // Oops are a special case. Normally they would be their own section |
| // but in cases like icBuffer they are literals in the code stream that |
| // we don't have a section for. We use none so that we get a literal address |
| // which is always patchable. |
| break; |
| case relocInfo::external_word_type: |
| _rspec = external_word_Relocation::spec(target); |
| break; |
| case relocInfo::internal_word_type: |
| _rspec = internal_word_Relocation::spec(target); |
| break; |
| case relocInfo::opt_virtual_call_type: |
| _rspec = opt_virtual_call_Relocation::spec(); |
| break; |
| case relocInfo::static_call_type: |
| _rspec = static_call_Relocation::spec(); |
| break; |
| case relocInfo::runtime_call_type: |
| _rspec = runtime_call_Relocation::spec(); |
| break; |
| case relocInfo::poll_type: |
| case relocInfo::poll_return_type: |
| _rspec = Relocation::spec_simple(rtype); |
| break; |
| case relocInfo::none: |
| _rspec = RelocationHolder::none; |
| break; |
| default: |
| ShouldNotReachHere(); |
| break; |
| } |
| } |
| |
| void Assembler::b(const Address &dest) { |
| code_section()->relocate(pc(), dest.rspec()); |
| b(dest.target()); |
| } |
| |
| void Assembler::bl(const Address &dest) { |
| code_section()->relocate(pc(), dest.rspec()); |
| bl(dest.target()); |
| } |
| |
| void Assembler::adr(Register r, const Address &dest) { |
| code_section()->relocate(pc(), dest.rspec()); |
| adr(r, dest.target()); |
| } |
| |
| void Assembler::br(Condition cc, Label &L) { |
| if (L.is_bound()) { |
| br(cc, target(L)); |
| } else { |
| L.add_patch_at(code(), locator()); |
| br(cc, pc()); |
| } |
| } |
| |
| void Assembler::wrap_label(Label &L, |
| Assembler::uncond_branch_insn insn) { |
| if (L.is_bound()) { |
| (this->*insn)(target(L)); |
| } else { |
| L.add_patch_at(code(), locator()); |
| (this->*insn)(pc()); |
| } |
| } |
| |
| void Assembler::wrap_label(Register r, Label &L, |
| compare_and_branch_insn insn) { |
| if (L.is_bound()) { |
| (this->*insn)(r, target(L)); |
| } else { |
| L.add_patch_at(code(), locator()); |
| (this->*insn)(r, pc()); |
| } |
| } |
| |
| void Assembler::wrap_label(Register r, int bitpos, Label &L, |
| test_and_branch_insn insn) { |
| if (L.is_bound()) { |
| (this->*insn)(r, bitpos, target(L)); |
| } else { |
| L.add_patch_at(code(), locator()); |
| (this->*insn)(r, bitpos, pc()); |
| } |
| } |
| |
| void Assembler::wrap_label(Label &L, prfop op, prefetch_insn insn) { |
| if (L.is_bound()) { |
| (this->*insn)(target(L), op); |
| } else { |
| L.add_patch_at(code(), locator()); |
| (this->*insn)(pc(), op); |
| } |
| } |
| |
| // An "all-purpose" add/subtract immediate, per ARM documentation: |
| // A "programmer-friendly" assembler may accept a negative immediate |
| // between -(2^24 -1) and -1 inclusive, causing it to convert a |
| // requested ADD operation to a SUB, or vice versa, and then encode |
| // the absolute value of the immediate as for uimm24. |
| void Assembler::add_sub_immediate(Register Rd, Register Rn, unsigned uimm, int op, |
| int negated_op) { |
| bool sets_flags = op & 1; // this op sets flags |
| union { |
| unsigned u; |
| int imm; |
| }; |
| u = uimm; |
| bool shift = false; |
| bool neg = imm < 0; |
| if (neg) { |
| imm = -imm; |
| op = negated_op; |
| } |
| assert(Rd != sp || imm % 16 == 0, "misaligned stack"); |
| if (imm >= (1 << 11) |
| && ((imm >> 12) << 12 == imm)) { |
| imm >>= 12; |
| shift = true; |
| } |
| f(op, 31, 29), f(0b10001, 28, 24), f(shift, 23, 22), f(imm, 21, 10); |
| |
| // add/subtract immediate ops with the S bit set treat r31 as zr; |
| // with S unset they use sp. |
| if (sets_flags) |
| zrf(Rd, 0); |
| else |
| srf(Rd, 0); |
| |
| srf(Rn, 5); |
| } |
| |
| bool Assembler::operand_valid_for_add_sub_immediate(int64_t imm) { |
| uint64_t uimm = (uint64_t)uabs(imm); |
| if (uimm < (1 << 12)) |
| return true; |
| if (uimm < (1 << 24) |
| && ((uimm >> 12) << 12 == uimm)) { |
| return true; |
| } |
| return false; |
| } |
| |
| bool Assembler::operand_valid_for_logical_immediate(bool is32, uint64_t imm) { |
| return encode_logical_immediate(is32, imm) != 0xffffffff; |
| } |
| |
| static uint64_t doubleTo64Bits(jdouble d) { |
| union { |
| jdouble double_value; |
| uint64_t double_bits; |
| }; |
| |
| double_value = d; |
| return double_bits; |
| } |
| |
| bool Assembler::operand_valid_for_float_immediate(double imm) { |
| // If imm is all zero bits we can use ZR as the source of a |
| // floating-point value. |
| if (doubleTo64Bits(imm) == 0) |
| return true; |
| |
| // Otherwise try to encode imm then convert the encoded value back |
| // and make sure it's the exact same bit pattern. |
| unsigned result = encoding_for_fp_immediate(imm); |
| return doubleTo64Bits(imm) == fp_immediate_for_encoding(result, true); |
| } |
| |
| int AbstractAssembler::code_fill_byte() { |
| return 0; |
| } |
| |
| // n.b. this is implemented in subclass MacroAssembler |
| void Assembler::bang_stack_with_offset(int offset) { Unimplemented(); } |
| |
| |
| // and now the routines called by the assembler which encapsulate the |
| // above encode and decode functions |
| |
| uint32_t |
| asm_util::encode_logical_immediate(bool is32, uint64_t imm) |
| { |
| if (is32) { |
| /* Allow all zeros or all ones in top 32-bits, so that |
| constant expressions like ~1 are permitted. */ |
| if (imm >> 32 != 0 && imm >> 32 != 0xffffffff) |
| return 0xffffffff; |
| /* Replicate the 32 lower bits to the 32 upper bits. */ |
| imm &= 0xffffffff; |
| imm |= imm << 32; |
| } |
| |
| return encoding_for_logical_immediate(imm); |
| } |
| |
| unsigned Assembler::pack(double value) { |
| float val = (float)value; |
| unsigned result = encoding_for_fp_immediate(val); |
| guarantee(unpack(result) == value, |
| "Invalid floating-point immediate operand"); |
| return result; |
| } |
| |
| // Packed operands for Floating-point Move (immediate) |
| |
| static float unpack(unsigned value) { |
| union { |
| unsigned ival; |
| float val; |
| }; |
| ival = fp_immediate_for_encoding(value, 0); |
| return val; |
| } |