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