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