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