Path: blob/aarch64-shenandoah-jdk8u272-b10/hotspot/src/cpu/aarch32/vm/assembler_aarch32.cpp
32285 views
/*1* Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights All rights reserved.2* Copyright (c) 2014, Red Hat Inc. All rights reserved.3* Copyright (c) 2015, Linaro Ltd. All rights reserved.4* reserved. DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE5* HEADER.6*7* This code is free software; you can redistribute it and/or modify it8* under the terms of the GNU General Public License version 2 only, as9* published by the Free Software Foundation.10*11* This code is distributed in the hope that it will be useful, but WITHOUT12* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or13* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License14* version 2 for more details (a copy is included in the LICENSE file that15* accompanied this code).16*17* You should have received a copy of the GNU General Public License version18* 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 USA22* or visit www.oracle.com if you need additional information or have any23* questions.24*25*/2627#include <stdio.h>28#include <sys/types.h>2930#include "precompiled.hpp"31#include "asm/assembler.hpp"32#include "asm/assembler.inline.hpp"33#include "compiler/disassembler.hpp"34#include "interpreter/interpreter.hpp"35#include "memory/resourceArea.hpp"36#include "runtime/interfaceSupport.hpp"37#include "runtime/sharedRuntime.hpp"38#include "register_aarch32.hpp"39#include "vm_version_aarch32.hpp"4041extern "C" void entry(CodeBuffer *cb);4243#define __ _masm.44#ifdef PRODUCT45#define BLOCK_COMMENT(str) /* nothing */46#else47#define BLOCK_COMMENT(str) block_comment(str)48#endif4950#define BIND(label) bind(label); __ BLOCK_COMMENT(#label ":")5152void entry(CodeBuffer *cb) {5354// {55// for (int i = 0; i < 256; i+=16)56// {57// printf("\"%20.20g\", ", unpack(i));58// printf("\"%20.20g\", ", unpack(i+1));59// }60// printf("\n");61// }6263#ifdef ASSERT64Assembler _masm(cb);65address entry = __ pc();6667// Smoke test for assembler68// we're checking the code generation, not applicability of the code to the actual target69// so temporarily override the detected cpu to allow emission of all instructions70const ProcessorFeatures detected_features = VM_Version::features();71VM_Version::features(FT_ALL);7273// BEGIN Generated code -- do not edit74// Generated by aarch32-asmtest.py75Label back, forth, near, near_post, near_flt, near_post_flt;76__ bind(back);7778// ThreeRegSft79__ add(r8, r2, r11, ::lsr(10)); // add r8, r2, r11, lsr #1080__ adds(r1, r3, r7, ::asr(1), Assembler::EQ); // addEQs r1, r3, r7, asr #181__ eor(r0, r9, r4, ::lsl(5)); // eor r0, r9, r4, lsl #582__ eors(r9, r2, r6, ::rrx(), Assembler::GT); // eorGTs r9, r2, r6, rrx83__ sub(r0, r12, lr, ::lsr(0), Assembler::GT); // subGT r0, r12, lr, lsr #084__ subs(r8, r2, r4, ::ror(6), Assembler::EQ); // subEQs r8, r2, r4, ror #685__ rsb(r8, r9, sp, ::lsl(3)); // rsb r8, r9, sp, lsl #386__ rsbs(r8, r0, r4, ::ror(16), Assembler::VS); // rsbVSs r8, r0, r4, ror #1687__ add(r9, r5, r1, ::lsr(15), Assembler::LE); // addLE r9, r5, r1, lsr #1588__ adds(r1, sp, r6, ::asr(5)); // adds r1, sp, r6, asr #589__ adc(r11, sp, r7, ::asr(1), Assembler::GT); // adcGT r11, sp, r7, asr #190__ adcs(r0, r8, r9, ::lsr(6)); // adcs r0, r8, r9, lsr #691__ sbc(r9, r3, r6, ::ror(5)); // sbc r9, r3, r6, ror #592__ sbcs(r1, sp, r5, ::asr(16), Assembler::HI); // sbcHIs r1, sp, r5, asr #1693__ rsc(r8, r2, r6, ::lsl(9), Assembler::CC); // rscCC r8, r2, r6, lsl #994__ rscs(r10, r4, sp, ::ror(14)); // rscs r10, r4, sp, ror #1495__ orr(r11, sp, r5, ::lsl(15), Assembler::NE); // orrNE r11, sp, r5, lsl #1596__ orrs(r9, r10, r4, ::ror(14)); // orrs r9, r10, r4, ror #1497__ bic(r9, sp, r5, ::ror(1)); // bic r9, sp, r5, ror #198__ bics(r0, r2, r7, ::asr(10)); // bics r0, r2, r7, asr #1099100// ThreeRegRSR101__ add(sp, r6, r7, ::ror(r7)); // add sp, r6, r7, ror r7102__ adds(r4, r12, r6, ::ror(r7), Assembler::HI); // addHIs r4, r12, r6, ror r7103__ eor(r5, r6, r7, ::asr(r12), Assembler::LS); // eorLS r5, r6, r7, asr r12104__ eors(r8, r5, sp, ::lsl(r4), Assembler::AL); // eorALs r8, r5, sp, lsl r4105__ sub(r2, r12, r5, ::asr(r0)); // sub r2, r12, r5, asr r0106__ subs(r9, r3, r7, ::lsl(r12), Assembler::HS); // subHSs r9, r3, r7, lsl r12107__ rsb(r9, r12, r4, ::lsl(r6), Assembler::GT); // rsbGT r9, r12, r4, lsl r6108__ rsbs(r8, r2, r12, ::lsl(r1)); // rsbs r8, r2, r12, lsl r1109__ add(r4, r12, sp, ::lsl(sp)); // add r4, r12, sp, lsl sp110__ adds(r8, r11, r6, ::ror(sp)); // adds r8, r11, r6, ror sp111__ adc(r0, r2, r5, ::lsl(r4), Assembler::NE); // adcNE r0, r2, r5, lsl r4112__ adcs(r11, lr, r6, ::asr(r2)); // adcs r11, lr, r6, asr r2113__ sbc(r8, r10, lr, ::asr(r3), Assembler::HI); // sbcHI r8, r10, lr, asr r3114__ sbcs(r1, r12, r5, ::lsl(r6)); // sbcs r1, r12, r5, lsl r6115__ rsc(r4, r5, lr, ::ror(r10), Assembler::VS); // rscVS r4, r5, lr, ror r10116__ rscs(r1, r12, sp, ::lsl(r8)); // rscs r1, r12, sp, lsl r8117__ orr(r8, r1, r6, ::ror(r0), Assembler::VS); // orrVS r8, r1, r6, ror r0118__ orrs(r11, sp, r7, ::ror(r5)); // orrs r11, sp, r7, ror r5119__ bic(r4, lr, r6, ::lsl(r2), Assembler::AL); // bicAL r4, lr, r6, lsl r2120__ bics(r10, r11, sp, ::lsl(r3)); // bics r10, r11, sp, lsl r3121122// TwoRegImm123__ add(r8, sp, (unsigned)268435462U, Assembler::HI); // addHI r8, sp, #268435462124__ adds(sp, lr, (unsigned)162529280U); // adds sp, lr, #162529280125__ eor(lr, r6, (unsigned)8192000U); // eor lr, r6, #8192000126__ eors(r2, r3, (unsigned)292U); // eors r2, r3, #292127__ sub(r4, sp, (unsigned)227540992U); // sub r4, sp, #227540992128__ subs(r1, lr, (unsigned)33554432U, Assembler::LT); // subLTs r1, lr, #33554432129__ rsb(r0, r5, (unsigned)2483027968U); // rsb r0, r5, #2483027968130__ rsbs(r8, r4, (unsigned)3080192U, Assembler::LO); // rsbLOs r8, r4, #3080192131__ add(r9, r4, (unsigned)2147483648U, Assembler::LT); // addLT r9, r4, #2147483648132__ adds(r8, r4, (unsigned)32768U, Assembler::AL); // addALs r8, r4, #32768133__ adc(r10, lr, (unsigned)10752U, Assembler::CS); // adcCS r10, lr, #10752134__ adcs(r10, r6, (unsigned)774144U); // adcs r10, r6, #774144135__ sbc(r2, r12, (unsigned)637534208U); // sbc r2, r12, #637534208136__ sbcs(r8, r10, (unsigned)692060160U); // sbcs r8, r10, #692060160137__ rsc(sp, r6, (unsigned)7405568U); // rsc sp, r6, #7405568138__ rscs(r10, r11, (unsigned)244318208U, Assembler::NE); // rscNEs r10, r11, #244318208139__ orr(r3, r7, (unsigned)66846720U, Assembler::VS); // orrVS r3, r7, #66846720140__ orrs(r2, r5, (unsigned)1327104U, Assembler::EQ); // orrEQs r2, r5, #1327104141__ bic(r8, r1, (unsigned)3744U, Assembler::VS); // bicVS r8, r1, #3744142__ bics(r0, r2, (unsigned)2684354560U, Assembler::LO); // bicLOs r0, r2, #2684354560143144// TwoRegSft145__ tst(r8, sp, ::lsl(5)); // tst r8, sp, lsl #5146__ teq(r6, r7, ::lsr(3)); // teq r6, r7, lsr #3147__ cmp(r12, r4, ::ror(2)); // cmp r12, r4, ror #2148__ cmn(r5, r7, ::lsl(16), Assembler::LT); // cmnLT r5, r7, lsl #16149150// TwoRegRSR151__ tst(r2, lr, ::lsr(r7)); // tst r2, lr, lsr r7152__ teq(r0, r2, ::ror(r5), Assembler::CC); // teqCC r0, r2, ror r5153__ cmp(lr, r7, ::lsr(r11), Assembler::LS); // cmpLS lr, r7, lsr r11154__ cmn(r10, r7, ::lsl(r11), Assembler::VS); // cmnVS r10, r7, lsl r11155156// OneRegImm157__ tst(r2, (unsigned)557842432U); // tst r2, #557842432158__ teq(lr, (unsigned)7077888U, Assembler::MI); // teqMI lr, #7077888159__ cmp(r5, (unsigned)939524096U); // cmp r5, #939524096160__ cmn(r7, (unsigned)2147483650U, Assembler::LO); // cmnLO r7, #2147483650161162// Shift op163__ lsl(r0, r4, (unsigned)23U); // lsl r0, r4, #23164__ lsls(r1, r4, (unsigned)9U); // lsls r1, r4, #9165__ lsr(r0, r10, (unsigned)3U); // lsr r0, r10, #3166__ lsrs(r0, r10, (unsigned)20U); // lsrs r0, r10, #20167__ asr(r1, r9, (unsigned)11U); // asr r1, r9, #11168__ asrs(r2, r11, (unsigned)10U, Assembler::VS); // asrVSs r2, r11, #10169170// shift op171__ ror(r8, r2, (unsigned)31U, Assembler::CC); // rorCC r8, r2, #31172__ rors(r9, r12, (unsigned)8U); // rors r9, r12, #8173174// ThreeRegNon175__ ror(r8, lr, r7); // ror r8, lr, r7176__ rors(r12, r3, r4); // rors r12, r3, r4177__ lsl(r12, sp, lr, Assembler::GT); // lslGT r12, sp, lr178__ lsls(r12, sp, r6, Assembler::AL); // lslALs r12, sp, r6179__ lsr(r0, r1, r9, Assembler::GT); // lsrGT r0, r1, r9180__ lsrs(r11, r3, r12, Assembler::GT); // lsrGTs r11, r3, r12181__ asr(r2, r12, r6, Assembler::LE); // asrLE r2, r12, r6182__ asrs(r1, r10, r6, Assembler::LT); // asrLTs r1, r10, r6183184// TwoRegNon185__ mov(r10, r3); // mov r10, r3186__ movs(r0, r9); // movs r0, r9187188// OneRegImm189__ mov_i(r3, (unsigned)656U, Assembler::VC); // movVC r3, #656190__ movs_i(r4, (unsigned)2064384U); // movs r4, #2064384191192// TwoRegSft193__ mov(r12, r6, ::lsr(3)); // mov r12, r6, lsr #3194__ movs(r5, sp, ::asr(10), Assembler::VC); // movVCs r5, sp, asr #10195196// TwoRegRSR197__ mov(r1, lr, ::ror(r3)); // mov r1, lr, ror r3198__ movs(r8, r12, ::ror(r9), Assembler::EQ); // movEQs r8, r12, ror r9199200// OneRegImm16201__ movw_i(r11, (unsigned)53041U, Assembler::LO); // movwLO r11, #53041202__ movt_i(r9, (unsigned)11255U, Assembler::LO); // movtLO r9, #11255203204// ThreeRegNon205__ mul(r1, sp, r5, Assembler::LE); // mulLE r1, sp, r5206__ muls(r0, r10, r11); // muls r0, r10, r11207208// FourRegNon209__ mla(r0, r3, r12, r7); // mla r0, r3, r12, r7210__ mlas(r8, r11, r3, r6, Assembler::EQ); // mlaEQs r8, r11, r3, r6211__ umull(lr, r4, r5, r6); // umull lr, r4, r5, r6212__ umulls(r0, r4, r6, r7); // umulls r0, r4, r6, r7213__ umlal(r8, r0, r11, lr); // umlal r8, r0, r11, lr214__ umlals(r11, r4, lr, r7); // umlals r11, r4, lr, r7215__ smull(r1, r5, r6, r7, Assembler::HS); // smullHS r1, r5, r6, r7216__ smulls(r0, r11, r12, r5, Assembler::MI); // smullMIs r0, r11, r12, r5217218// FourRegNon219__ umaal(r8, r9, r2, r5); // umaal r8, r9, r2, r5220__ mls(r0, r4, sp, lr, Assembler::EQ); // mlsEQ r0, r4, sp, lr221222// ThreeRegNon223__ qadd(r9, r4, sp, Assembler::PL); // qaddPL r9, r4, sp224__ qsub(r0, r12, r5, Assembler::MI); // qsubMI r0, r12, r5225__ qdadd(r3, r5, r7); // qdadd r3, r5, r7226__ qdsub(r9, r2, r4); // qdsub r9, r2, r4227228// FourRegNon229__ smlabb(r1, r12, r5, r6); // smlabb r1, r12, r5, r6230__ smlabt(r0, r10, r12, r6); // smlabt r0, r10, r12, r6231__ smlatb(r8, r1, r3, lr); // smlatb r8, r1, r3, lr232__ smlatt(r1, sp, r6, r7); // smlatt r1, sp, r6, r7233__ smlawb(r0, r3, r4, r6); // smlawb r0, r3, r4, r6234__ smlawt(r11, r4, lr, r7); // smlawt r11, r4, lr, r7235__ smlalbb(r0, r10, r6, r7); // smlalbb r0, r10, r6, r7236__ smlalbt(r3, r11, r4, lr, Assembler::LS); // smlalbtLS r3, r11, r4, lr237__ smlaltb(r8, r11, r3, r12); // smlaltb r8, r11, r3, r12238__ smlaltt(r8, r1, r3, r5); // smlaltt r8, r1, r3, r5239240// ThreeRegNon241__ smulwb(r2, r12, sp, Assembler::HS); // smulwbHS r2, r12, sp242__ smulwt(r8, r12, r6); // smulwt r8, r12, r6243__ smulbb(r2, r6, lr, Assembler::GE); // smulbbGE r2, r6, lr244__ smulbt(r8, r12, r7); // smulbt r8, r12, r7245__ smultb(r10, r3, lr, Assembler::EQ); // smultbEQ r10, r3, lr246__ smultt(r0, r3, sp); // smultt r0, r3, sp247248// MemoryOp249__ ldr(r10, Address(r7, r9, lsl(), Address::ADD, Address::post)); // ldr r10, [r7], r9250__ ldrb(r0, Address(r9, 196)); // ldrb r0, [r9, #196]251__ ldrh(lr, Address(r4, r6, lsl(), Address::ADD, Address::pre)); // ldrh lr, [r4, r6]!252__ ldrsb(r6, Address(__ pre(r9, 232))); // ldrsb r6, [r9, #232]!253__ ldrsh(r2, Address(r1, r1, lsl(), Address::ADD, Address::post)); // ldrsh r2, [r1], r1254__ str(r0, Address(r9, r4, lsl(), Address::ADD, Address::post)); // str r0, [r9], r4255__ strb(r3, Address(__ pre(r5, 92))); // strb r3, [r5, #92]!256__ strh(r2, Address(r8, 160)); // strh r2, [r8, #160]257258// MemoryOp259__ ldr(r8, Address(r12, r8, lsl(), Address::ADD, Address::off)); // ldr r8, [r12, r8]260__ ldrb(r11, Address(__ post(r10, 16))); // ldrb r11, [r10], #16261__ ldrh(r11, Address(r10, r6, lsl(), Address::ADD, Address::off)); // ldrh r11, [r10, r6]262__ ldrsb(r5, Address(r11, r10, lsl(), Address::ADD, Address::pre)); // ldrsb r5, [r11, r10]!263__ ldrsh(r6, Address(r3, r7, lsl(), Address::ADD, Address::off)); // ldrsh r6, [r3, r7]264__ str(r7, Address(sp, r5, lsl(), Address::ADD, Address::pre)); // str r7, [sp, r5]!265__ strb(r2, Address(r10)); // strb r2, [r10]266__ strh(r6, Address(r4, r3, lsl(), Address::ADD, Address::post)); // strh r6, [r4], r3267268// MemoryOp269__ ldr(r10, Address(r12)); // ldr r10, [r12]270__ ldrb(r4, Address(__ post(r11, 132))); // ldrb r4, [r11], #132271__ ldrh(r9, Address(r9, r12, lsl(), Address::ADD, Address::post)); // ldrh r9, [r9], r12272__ ldrsb(r9, Address(__ post(r3, 148))); // ldrsb r9, [r3], #148273__ ldrsh(r11, Address(__ pre(r2, 148))); // ldrsh r11, [r2, #148]!274__ str(r11, Address(sp, r11, lsl(), Address::ADD, Address::off)); // str r11, [sp, r11]275__ strb(r1, Address(sp, r10, lsl(), Address::ADD, Address::off)); // strb r1, [sp, r10]276__ strh(r10, Address(lr, r9, lsl(), Address::ADD, Address::post)); // strh r10, [lr], r9277278// MemoryOp279__ ldr(r6, Address(r3, r4, lsl(), Address::ADD, Address::pre)); // ldr r6, [r3, r4]!280__ ldrb(r4, Address(r6, sp, lsl(), Address::ADD, Address::pre)); // ldrb r4, [r6, sp]!281__ ldrh(r6, Address(r7, r10, lsl(), Address::ADD, Address::post)); // ldrh r6, [r7], r10282__ ldrsb(r0, Address(r6, r11, lsl(), Address::ADD, Address::pre)); // ldrsb r0, [r6, r11]!283__ ldrsh(r10, Address(r6, sp, lsl(), Address::ADD, Address::post)); // ldrsh r10, [r6], sp284__ str(r7, Address(r3, r12, lsl(), Address::ADD, Address::off)); // str r7, [r3, r12]285__ strb(r3, Address(r8, r1, lsl(), Address::ADD, Address::pre)); // strb r3, [r8, r1]!286__ strh(r4, Address(r12, 64)); // strh r4, [r12, #64]287288__ bind(near);289290// LitMemoryOp291__ ldr(r1, near); // ldr r1, near292__ ldrb(r7, __ pc()); // ldrb r7, .293__ ldrh(r2, near); // ldrh r2, near294__ ldrsb(r10, __ pc()); // ldrsb r10, .295__ ldrsh(lr, near_post); // ldrsh lr, near_post296297// LitMemoryOp298__ ldr(r2, __ pc()); // ldr r2, .299__ ldrb(r3, __ pc()); // ldrb r3, .300__ ldrh(r7, near_post); // ldrh r7, near_post301__ ldrsb(sp, __ pc()); // ldrsb sp, .302__ ldrsh(r10, near); // ldrsh r10, near303304// LitMemoryOp305__ ldr(r5, __ pc()); // ldr r5, .306__ ldrb(lr, near_post); // ldrb lr, near_post307__ ldrh(r5, near_post); // ldrh r5, near_post308__ ldrsb(r6, near); // ldrsb r6, near309__ ldrsh(r11, near); // ldrsh r11, near310311// LitMemoryOp312__ ldr(r7, near_post); // ldr r7, near_post313__ ldrb(r5, near_post); // ldrb r5, near_post314__ ldrh(r10, near); // ldrh r10, near315__ ldrsb(r6, near_post); // ldrsb r6, near_post316__ ldrsh(r9, __ pc()); // ldrsh r9, .317318__ bind(near_post);319320// MemoryRegRegSftOp321__ ldr(r0, Address(r0, r10, ::ror(6), Address::ADD, Address::post)); // ldr r0, [r0], r10, ror #6322__ ldrb(r3, Address(r8, lr, ::lsl(9), Address::ADD, Address::off)); // ldrb r3, [r8, lr, lsl #9]323__ str(r5, Address(sp, r3, ::lsl(15), Address::ADD, Address::off)); // str r5, [sp, r3, lsl #15]324__ strb(r9, Address(r9, r5, ::asr(2), Address::ADD, Address::post)); // strb r9, [r9], r5, asr #2325326// MemoryRegRegSftOp327__ ldr(r5, Address(r4, r0, ::ror(6), Address::ADD, Address::off)); // ldr r5, [r4, r0, ror #6]328__ ldrb(lr, Address(r0, r4, ::lsr(9), Address::ADD, Address::off)); // ldrb lr, [r0, r4, lsr #9]329__ str(r5, Address(r12, r12, ::asr(5), Address::ADD, Address::post)); // str r5, [r12], r12, asr #5330__ strb(r3, Address(r1, r7, ::ror(12), Address::ADD, Address::pre)); // strb r3, [r1, r7, ror #12]!331332// MemoryRegRegSftOp333__ ldr(r6, Address(r2, r3, ::rrx(), Address::ADD, Address::pre)); // ldr r6, [r2, r3, rrx]!334__ ldrb(r8, Address(lr, r2, ::asr(16), Address::ADD, Address::pre)); // ldrb r8, [lr, r2, asr #16]!335__ str(r6, Address(r3, r6, ::ror(7), Address::ADD, Address::pre)); // str r6, [r3, r6, ror #7]!336__ strb(r3, Address(r8, r2, ::lsl(10), Address::ADD, Address::off)); // strb r3, [r8, r2, lsl #10]337338// MemoryRegRegSftOp339__ ldr(r11, Address(sp, lr, ::lsl(8), Address::ADD, Address::off)); // ldr r11, [sp, lr, lsl #8]340__ ldrb(r10, Address(sp, r12, ::lsl(4), Address::ADD, Address::pre)); // ldrb r10, [sp, r12, lsl #4]!341__ str(sp, Address(r9, r2, ::asr(2), Address::ADD, Address::off)); // str sp, [r9, r2, asr #2]342__ strb(r7, Address(r11, lr, ::asr(14), Address::ADD, Address::pre)); // strb r7, [r11, lr, asr #14]!343344// LdStOne345__ ldrex(r12, r11); // ldrex r12, [r11]346__ ldrexb(r4, r12); // ldrexb r4, [r12]347__ ldrexh(r11, r11); // ldrexh r11, [r11]348349// LdStTwo350__ strex(r1, r7, lr); // strex r1, r7, [lr]351__ strexb(r12, r6, r4); // strexb r12, r6, [r4]352__ strexh(r4, r6, r7, Assembler::HS); // strexhHS r4, r6, [r7]353354// ThreeRegNon355__ sadd16(r3, r4, r7); // sadd16 r3, r4, r7356__ sasx(r9, r10, r3, Assembler::AL); // sasxAL r9, r10, r3357__ ssax(r12, r5, r6); // ssax r12, r5, r6358__ ssub16(r12, r5, lr); // ssub16 r12, r5, lr359__ sadd8(r0, r10, r7); // sadd8 r0, r10, r7360__ ssub8(r0, r8, r2, Assembler::VS); // ssub8VS r0, r8, r2361__ qadd16(r11, r4, r5, Assembler::PL); // qadd16PL r11, r4, r5362__ qasx(r11, r3, r12, Assembler::VS); // qasxVS r11, r3, r12363__ qsax(r0, r3, r5); // qsax r0, r3, r5364__ ssub16(r10, r12, r5, Assembler::AL); // ssub16AL r10, r12, r5365__ qadd8(r10, r6, lr, Assembler::CC); // qadd8CC r10, r6, lr366__ qsub8(r10, r11, r7); // qsub8 r10, r11, r7367__ shadd16(r9, r4, lr, Assembler::PL); // shadd16PL r9, r4, lr368__ shasx(r1, lr, r7); // shasx r1, lr, r7369__ shsax(r9, r11, r5, Assembler::LO); // shsaxLO r9, r11, r5370__ shsub16(r3, r1, r11, Assembler::GE); // shsub16GE r3, r1, r11371__ shadd8(sp, r5, r7, Assembler::GT); // shadd8GT sp, r5, r7372__ shsub8(r1, r5, r7); // shsub8 r1, r5, r7373374// ThreeRegNon375__ uadd16(r10, r4, r7); // uadd16 r10, r4, r7376__ uasx(r1, r9, r7, Assembler::HS); // uasxHS r1, r9, r7377__ usax(r11, sp, r7); // usax r11, sp, r7378__ usub16(r11, r4, lr); // usub16 r11, r4, lr379__ uadd8(r2, sp, r7, Assembler::LO); // uadd8LO r2, sp, r7380__ usub8(r8, r10, lr, Assembler::GT); // usub8GT r8, r10, lr381__ uqadd16(r3, r12, sp); // uqadd16 r3, r12, sp382__ uqasx(r4, sp, r6); // uqasx r4, sp, r6383__ uqsax(r1, r10, lr); // uqsax r1, r10, lr384__ uqsub16(r2, sp, lr, Assembler::LE); // uqsub16LE r2, sp, lr385__ uqadd8(r1, r12, r5); // uqadd8 r1, r12, r5386__ uqsub8(r0, r4, sp, Assembler::GT); // uqsub8GT r0, r4, sp387__ uhadd16(r0, r10, r5, Assembler::HI); // uhadd16HI r0, r10, r5388__ uhasx(r11, r4, r7, Assembler::LE); // uhasxLE r11, r4, r7389__ uhsax(r1, lr, r9, Assembler::GE); // uhsaxGE r1, lr, r9390__ uhsub16(r2, r11, lr); // uhsub16 r2, r11, lr391__ uhadd8(r9, r4, r5, Assembler::GE); // uhadd8GE r9, r4, r5392__ uhsub8(r2, sp, lr, Assembler::HI); // uhsub8HI r2, sp, lr393394// PKUPSATREV395__ sxtab16(r10, r3, r7, ::ror(16)); // sxtab16 r10, r3, r7, ROR #16396__ sxtab(r9, r5, r7, ::ror(24), Assembler::CS); // sxtabCS r9, r5, r7, ROR #24397__ sxtah(r3, r5, r7, ::ror(8)); // sxtah r3, r5, r7, ROR #8398__ uxtab16(r8, r4, r6, ::ror(8), Assembler::AL); // uxtab16AL r8, r4, r6, ROR #8399__ uxtab(r0, r11, sp, ::rrx(), Assembler::EQ); // uxtabEQ r0, r11, sp, ROR #0400__ uxtah(r9, r12, r5, ::rrx()); // uxtah r9, r12, r5, ROR #0401402// PKUPSATREV403__ sxtb16(r3, r11, ::ror(16), Assembler::GE); // sxtb16GE r3, r11, ROR #16404__ sxtb(r2, r6, ::rrx(), Assembler::HI); // sxtbHI r2, r6, ROR #0405__ sxth(r3, sp, ::ror(24), Assembler::GT); // sxthGT r3, sp, ROR #24406__ uxtb16(r12, r5, ::ror(16)); // uxtb16 r12, r5, ROR #16407__ uxtb(r12, r5, ::ror(16)); // uxtb r12, r5, ROR #16408__ uxth(r8, r5, ::ror(16)); // uxth r8, r5, ROR #16409410// TwoRegNon411__ rev(r10, r4, Assembler::EQ); // revEQ r10, r4412__ rev16(r8, r12, Assembler::GE); // rev16GE r8, r12413__ rbit(lr, r7); // rbit lr, r7414__ revsh(sp, r7, Assembler::GT); // revshGT sp, r7415416// ThreeRegNon417__ sdiv(r9, sp, lr); // sdiv r9, sp, lr418__ udiv(r2, r12, r6); // udiv r2, r12, r6419420// TwoRegTwoImm421__ sbfx(r0, r1, (unsigned)20U, (unsigned)3U, Assembler::MI); // sbfxMI r0, r1, #20, #3422__ ubfx(r9, r2, (unsigned)16U, (unsigned)15U); // ubfx r9, r2, #16, #15423__ bfi(r1, r11, (unsigned)27U, (unsigned)3U, Assembler::HI); // bfiHI r1, r11, #27, #3424425// TwoRegTwoImm426__ bfc(r3, (unsigned)7U, (unsigned)10U); // bfc r3, #7, #10427428// MultipleMemOp429__ stmda(r6, 3435U, false); // stmda r6, {r0, r1, r3, r5, r6, r8, r10, r11}430__ stmed(r4, 14559U, false); // stmed r4, {r0, r1, r2, r3, r4, r6, r7, r11, r12, sp}431__ ldmda(r0, 57812U, false); // ldmda r0, {r2, r4, r6, r7, r8, sp, lr, pc}432__ ldmfa(r12, 39027U, true); // ldmfa r12!, {r0, r1, r4, r5, r6, r11, r12, pc}433__ stmia(r9, 12733U, true); // stmia r9!, {r0, r2, r3, r4, r5, r7, r8, r12, sp}434__ stmea(r11, 21955U, false); // stmea r11, {r0, r1, r6, r7, r8, r10, r12, lr}435__ ldmia(r12, 48418U, true); // ldmia r12!, {r1, r5, r8, r10, r11, r12, sp, pc}436__ ldmfd(sp, 41226U, true); // ldmfd sp!, {r1, r3, r8, sp, pc}437__ stmdb(r11, 8729U, true); // stmdb r11!, {r0, r3, r4, r9, sp}438__ stmfd(r9, 36309U, true); // stmfd r9!, {r0, r2, r4, r6, r7, r8, r10, r11, pc}439__ ldmdb(r5, 24667U, true); // ldmdb r5!, {r0, r1, r3, r4, r6, sp, lr}440__ ldmea(r1, 37287U, false); // ldmea r1, {r0, r1, r2, r5, r7, r8, r12, pc}441__ stmib(r11, 28266U, true); // stmib r11!, {r1, r3, r5, r6, r9, r10, r11, sp, lr}442__ stmfa(r11, 17671U, false); // stmfa r11, {r0, r1, r2, r8, r10, lr}443__ ldmib(r0, 21452U, true); // ldmib r0!, {r2, r3, r6, r7, r8, r9, r12, lr}444__ ldmed(r1, 11751U, false); // ldmed r1, {r0, r1, r2, r5, r6, r7, r8, r10, r11, sp}445446// BranchLabel447__ b(forth, Assembler::CS); // bCS forth448__ bl(__ pc(), Assembler::MI); // blMI .449450// OneRegNon451__ b(r0, Assembler::VS); // bxVS r0452__ bl(r3); // blx r3453454// BranchLabel455__ b(__ pc(), Assembler::AL); // bAL .456__ bl(__ pc()); // bl .457458// OneRegNon459__ b(r0, Assembler::VS); // bxVS r0460__ bl(r5); // blx r5461462// BranchLabel463__ b(forth, Assembler::LE); // bLE forth464__ bl(__ pc(), Assembler::MI); // blMI .465466// OneRegNon467__ b(r9, Assembler::NE); // bxNE r9468__ bl(r12); // blx r12469470// BranchLabel471__ b(back); // b back472__ bl(__ pc(), Assembler::HI); // blHI .473474// OneRegNon475__ b(r1, Assembler::VC); // bxVC r1476__ bl(r7, Assembler::GT); // blxGT r7477478// BranchLabel479__ b(back, Assembler::GE); // bGE back480__ bl(__ pc(), Assembler::HI); // blHI .481482// OneRegNon483__ b(r12); // bx r12484__ bl(r7, Assembler::CC); // blxCC r7485486// BranchLabel487__ b(__ pc()); // b .488__ bl(back, Assembler::GT); // blGT back489490// OneRegNon491__ b(r1, Assembler::GE); // bxGE r1492__ bl(r0); // blx r0493494// BranchLabel495__ b(__ pc()); // b .496__ bl(forth); // bl forth497498// OneRegNon499__ b(lr, Assembler::GT); // bxGT lr500__ bl(r11, Assembler::NE); // blxNE r11501502// BranchLabel503__ b(__ pc(), Assembler::CS); // bCS .504__ bl(__ pc()); // bl .505506// OneRegNon507__ b(r10, Assembler::HS); // bxHS r10508__ bl(r4); // blx r4509510// BranchLabel511__ b(back, Assembler::AL); // bAL back512__ bl(__ pc()); // bl .513514// OneRegNon515__ b(r12, Assembler::LO); // bxLO r12516__ bl(r8); // blx r8517518// BranchLabel519__ b(forth); // b forth520__ bl(__ pc()); // bl .521522// OneRegNon523__ b(r10); // bx r10524__ bl(r1); // blx r1525526// ThreeFltNon527__ vmla_f32(f4, f8, f12, Assembler::MI); // vmlaMI.f32 s4, s8, s12528__ vmls_f32(f4, f10, f10); // vmls.f32 s4, s10, s10529__ vnmla_f32(f2, f10, f12); // vnmla.f32 s2, s10, s12530__ vnmls_f32(f8, f6, f8, Assembler::LT); // vnmlsLT.f32 s8, s6, s8531__ vnmul_f32(f6, f12, f14, Assembler::MI); // vnmulMI.f32 s6, s12, s14532__ vadd_f32(f0, f2, f0); // vadd.f32 s0, s2, s0533__ vsub_f32(f2, f4, f10, Assembler::AL); // vsubAL.f32 s2, s4, s10534__ vdiv_f32(f0, f2, f12, Assembler::CS); // vdivCS.f32 s0, s2, s12535536// ThreeFltNon537__ vmla_f64(d0, d3, d6); // vmla.f64 d0, d3, d6538__ vmls_f64(d0, d1, d5); // vmls.f64 d0, d1, d5539__ vnmla_f64(d1, d4, d6); // vnmla.f64 d1, d4, d6540__ vnmls_f64(d0, d1, d1, Assembler::NE); // vnmlsNE.f64 d0, d1, d1541__ vnmul_f64(d3, d5, d5, Assembler::NE); // vnmulNE.f64 d3, d5, d5542__ vadd_f64(d0, d2, d4, Assembler::LO); // vaddLO.f64 d0, d2, d4543__ vsub_f64(d1, d2, d4); // vsub.f64 d1, d2, d4544__ vdiv_f64(d0, d1, d5, Assembler::MI); // vdivMI.f64 d0, d1, d5545546// TwoFltNon547__ vabs_f32(f6, f6); // vabs.f32 s6, s6548__ vneg_f32(f6, f8, Assembler::PL); // vnegPL.f32 s6, s8549__ vsqrt_f32(f0, f8); // vsqrt.f32 s0, s8550551// TwoFltNon552__ vabs_f64(d0, d4); // vabs.f64 d0, d4553__ vneg_f64(d1, d4); // vneg.f64 d1, d4554__ vsqrt_f64(d0, d1); // vsqrt.f64 d0, d1555556// vmov_f32557__ vmov_f32(f0, lr, Assembler::PL); // vmovPL.f32 s0, lr558559// vmov_f32560__ vmov_f32(r11, f8); // vmov.f32 r11, s8561562// vmov_f64563__ vmov_f64(d1, r11, lr, Assembler::LT); // vmovLT.f64 d1, r11, lr564565// vmov_f64566__ vmov_f64(r7, r5, d5); // vmov.f64 r7, r5, d5567568// vmov_f32569__ vmov_f32(f8, f12); // vmov.f32 s8, s12570571// vmov_f64572__ vmov_f64(d1, d2, Assembler::HI); // vmovHI.f64 d1, d2573574// vmov_f32575__ vmov_f32(f4, 1.0f, Assembler::VS); // vmovVS.f32 s4, #1.0576577// vmov_f64578__ vmov_f64(d2, 1.0); // vmov.f64 d2, #1.0579580// vmov_f32581__ vmov_f32(f6, 2.0f); // vmov.f32 s6, #2.0582583// vmov_f64584__ vmov_f64(d1, 2.0); // vmov.f64 d1, #2.0585586// vector memory587__ vldr_f32(f4, Address(r5, 116)); // vldr.f32 s4, [r5, #116]588__ vstr_f32(f2, Address(r1, 56), Assembler::CC); // vstrCC.f32 s2, [r1, #56]589590// vector memory591__ vldr_f64(d7, Address(r5, 16), Assembler::NE); // vldrNE.f64 d7, [r5, #16]592__ vstr_f64(d6, Address(r1, 228)); // vstr.f64 d6, [r1, #228]593594__ bind(near_flt);595596// vector memory597__ vldr_f32(f2, near_post_flt); // vldr.f32 s2, near_post_flt598__ vstr_f32(f6, near_post_flt); // vstr.f32 s6, near_post_flt599600// vector memory601__ vldr_f64(d2, near_flt, Assembler::LT); // vldrLT.f64 d2, near_flt602__ vstr_f64(d3, __ pc(), Assembler::GT); // vstrGT.f64 d3, .603604// vector memory605__ vldr_f32(f4, near_post_flt, Assembler::CC); // vldrCC.f32 s4, near_post_flt606__ vstr_f32(f0, near_post_flt); // vstr.f32 s0, near_post_flt607608// vector memory609__ vldr_f64(d4, near_post_flt, Assembler::GT); // vldrGT.f64 d4, near_post_flt610__ vstr_f64(d0, near_flt); // vstr.f64 d0, near_flt611612// vector memory613__ vldr_f32(f8, near_post_flt); // vldr.f32 s8, near_post_flt614__ vstr_f32(f6, near_post_flt); // vstr.f32 s6, near_post_flt615616// vector memory617__ vldr_f64(d4, near_flt, Assembler::PL); // vldrPL.f64 d4, near_flt618__ vstr_f64(d5, near_flt); // vstr.f64 d5, near_flt619620// vector memory621__ vldr_f32(f8, near_post_flt, Assembler::LS); // vldrLS.f32 s8, near_post_flt622__ vstr_f32(f12, __ pc(), Assembler::CC); // vstrCC.f32 s12, .623624// vector memory625__ vldr_f64(d6, near_post_flt, Assembler::AL); // vldrAL.f64 d6, near_post_flt626__ vstr_f64(d1, near_post_flt, Assembler::LT); // vstrLT.f64 d1, near_post_flt627628__ bind(near_post_flt);629630// FltMultMemOp631__ vldmia_f32(r1, FloatRegSet::of(f4).bits(), false); // vldmia.f32 r1, {s4}632__ vstmia_f32(r6, FloatRegSet::of(f4).bits(), true, Assembler::CS); // vstmiaCS.f32 r6!, {s4}633634// DblMultMemOp635__ vldmia_f64(r9, DoubleFloatRegSet::of(d1, d2, d3, d4).bits(), true); // vldmia.f64 r9!, {d1, d2, d3, d4}636__ vstmia_f64(r3, DoubleFloatRegSet::of(d6, d7).bits(), true); // vstmia.f64 r3!, {d6, d7}637638// FltMultMemOp639__ vldmdb_f32(r2, FloatRegSet::of(f6).bits(), Assembler::VS); // vldmdbVS.f32 r2!, {s6}640__ vstmdb_f32(r6, FloatRegSet::of(f14).bits()); // vstmdb.f32 r6!, {s14}641642// DblMultMemOp643__ vldmdb_f64(sp, DoubleFloatRegSet::of(d4, d5, d6, d7).bits()); // vldmdb.f64 sp!, {d4, d5, d6, d7}644__ vstmdb_f64(r0, DoubleFloatRegSet::of(d5, d6, d7).bits()); // vstmdb.f64 r0!, {d5, d6, d7}645646// vcmp_f32647__ vcmp_f32(f2, f2); // vcmp.f32 s2, s2648649// vcmpe_f32650__ vcmpe_f32(f8, f8, Assembler::VC); // vcmpeVC.f32 s8, s8651652// vcmp_f64653__ vcmp_f64(d0, d6); // vcmp.f64 d0, d6654655// vcmpe_f64656__ vcmpe_f64(d3, d7, Assembler::GE); // vcmpeGE.f64 d3, d7657658// vcmp_f32659__ vcmp_f32(f2, 0.0f, Assembler::LT); // vcmpLT.f32 s2, #0.0660661// vcmpe_f32662__ vcmpe_f32(f14, 0.0f, Assembler::GT); // vcmpeGT.f32 s14, #0.0663664// vcmp_f64665__ vcmp_f64(d4, 0.0); // vcmp.f64 d4, #0.0666667// vcmpe_f64668__ vcmpe_f64(d1, 0.0); // vcmpe.f64 d1, #0.0669670// vcvt671__ vcvt_s32_f32(f2, f6, Assembler::VS); // vcvtVS.s32.f32 s2, s6672__ vcvt_u32_f32(f6, f14, Assembler::GT); // vcvtGT.u32.f32 s6, s14673__ vcvt_f32_s32(f0, f2, Assembler::CC); // vcvtCC.f32.s32 s0, s2674__ vcvt_f32_u32(f2, f4, Assembler::CC); // vcvtCC.f32.u32 s2, s4675676// vcvt677__ vcvt_s32_f64(f4, d4, Assembler::HI); // vcvtHI.s32.f64 s4, d4678__ vcvt_u32_f64(f6, d6, Assembler::HI); // vcvtHI.u32.f64 s6, d6679__ vcvt_f32_f64(f6, d7, Assembler::LS); // vcvtLS.f32.f64 s6, d7680681// vcvt682__ vcvt_f64_s32(d3, f8); // vcvt.f64.s32 d3, s8683__ vcvt_f64_u32(d5, f14, Assembler::EQ); // vcvtEQ.f64.u32 d5, s14684__ vcvt_f64_f32(d4, f10, Assembler::AL); // vcvtAL.f64.f32 d4, s10685686// BKPT687__ bkpt((unsigned)26U); // bkpt #26688689__ bind(forth);690691/*692aarch32ops.o: file format elf32-littlearm693694695Disassembly of section .text:69669700000000 <back>:6980: e082852b add r8, r2, fp, lsr #106994: 009310c7 addseq r1, r3, r7, asr #17008: e0290284 eor r0, r9, r4, lsl #5701c: c0329066 eorsgt r9, r2, r6, rrx70210: c04c000e subgt r0, ip, lr70314: 00528364 subseq r8, r2, r4, ror #670418: e069818d rsb r8, r9, sp, lsl #37051c: 60708864 rsbsvs r8, r0, r4, ror #1670620: d08597a1 addle r9, r5, r1, lsr #1570724: e09d12c6 adds r1, sp, r6, asr #570828: c0adb0c7 adcgt fp, sp, r7, asr #17092c: e0b80329 adcs r0, r8, r9, lsr #671030: e0c392e6 sbc r9, r3, r6, ror #571134: 80dd1845 sbcshi r1, sp, r5, asr #1671238: 30e28486 rsccc r8, r2, r6, lsl #97133c: e0f4a76d rscs sl, r4, sp, ror #1471440: 118db785 orrne fp, sp, r5, lsl #1571544: e19a9764 orrs r9, sl, r4, ror #1471648: e1cd90e5 bic r9, sp, r5, ror #17174c: e1d20547 bics r0, r2, r7, asr #1071850: e086d777 add sp, r6, r7, ror r771954: 809c4776 addshi r4, ip, r6, ror r772058: 90265c57 eorls r5, r6, r7, asr ip7215c: e035841d eors r8, r5, sp, lsl r472260: e04c2055 sub r2, ip, r5, asr r072364: 20539c17 subscs r9, r3, r7, lsl ip72468: c06c9614 rsbgt r9, ip, r4, lsl r67256c: e072811c rsbs r8, r2, ip, lsl r172670: e08c4d1d add r4, ip, sp, lsl sp72774: e09b8d76 adds r8, fp, r6, ror sp72878: 10a20415 adcne r0, r2, r5, lsl r47297c: e0beb256 adcs fp, lr, r6, asr r273080: 80ca835e sbchi r8, sl, lr, asr r373184: e0dc1615 sbcs r1, ip, r5, lsl r673288: 60e54a7e rscvs r4, r5, lr, ror sl7338c: e0fc181d rscs r1, ip, sp, lsl r873490: 61818076 orrvs r8, r1, r6, ror r073594: e19db577 orrs fp, sp, r7, ror r573698: e1ce4216 bic r4, lr, r6, lsl r27379c: e1dba31d bics sl, fp, sp, lsl r3738a0: 828d8261 addhi r8, sp, #268435462 ; 0x10000006739a4: e29ed69b adds sp, lr, #162529280 ; 0x9b00000740a8: e226e87d eor lr, r6, #8192000 ; 0x7d0000741ac: e2332f49 eors r2, r3, #292 ; 0x124742b0: e24d46d9 sub r4, sp, #227540992 ; 0xd900000743b4: b25e1402 subslt r1, lr, #33554432 ; 0x2000000744b8: e2650325 rsb r0, r5, #-1811939328 ; 0x94000000745bc: 3274882f rsbscc r8, r4, #3080192 ; 0x2f0000746c0: b2849102 addlt r9, r4, #-2147483648 ; 0x80000000747c4: e2948902 adds r8, r4, #32768 ; 0x8000748c8: 22aeac2a adccs sl, lr, #10752 ; 0x2a00749cc: e2b6aabd adcs sl, r6, #774144 ; 0xbd000750d0: e2cc2426 sbc r2, ip, #637534208 ; 0x26000000751d4: e2da85a5 sbcs r8, sl, #692060160 ; 0x29400000752d8: e2e6d871 rsc sp, r6, #7405568 ; 0x710000753dc: 12fba6e9 rscsne sl, fp, #244318208 ; 0xe900000754e0: 638737ff orrvs r3, r7, #66846720 ; 0x3fc0000755e4: 03952951 orrseq r2, r5, #1327104 ; 0x144000756e8: 63c18eea bicvs r8, r1, #3744 ; 0xea0757ec: 33d2020a bicscc r0, r2, #-1610612736 ; 0xa0000000758f0: e118028d tst r8, sp, lsl #5759f4: e13601a7 teq r6, r7, lsr #3760f8: e15c0164 cmp ip, r4, ror #2761fc: b1750807 cmnlt r5, r7, lsl #16762100: e112073e tst r2, lr, lsr r7763104: 31300572 teqcc r0, r2, ror r5764108: 915e0b37 cmpls lr, r7, lsr fp76510c: 617a0b17 cmnvs sl, r7, lsl fp766110: e3120585 tst r2, #557842432 ; 0x21400000767114: 433e071b teqmi lr, #7077888 ; 0x6c0000768118: e355030e cmp r5, #939524096 ; 0x3800000076911c: 3377010a cmncc r7, #-2147483646 ; 0x80000002770120: e1a00b84 lsl r0, r4, #23771124: e1b01484 lsls r1, r4, #9772128: e1a001aa lsr r0, sl, #377312c: e1b00a2a lsrs r0, sl, #20774130: e1a015c9 asr r1, r9, #11775134: 61b0254b asrsvs r2, fp, #10776138: 31a08fe2 rorcc r8, r2, #3177713c: e1b0946c rors r9, ip, #8778140: e1a0877e ror r8, lr, r7779144: e1b0c473 rors ip, r3, r4780148: c1a0ce1d lslgt ip, sp, lr78114c: e1b0c61d lsls ip, sp, r6782150: c1a00931 lsrgt r0, r1, r9783154: c1b0bc33 lsrsgt fp, r3, ip784158: d1a0265c asrle r2, ip, r678515c: b1b0165a asrslt r1, sl, r6786160: e1a0a003 mov sl, r3787164: e1b00009 movs r0, r9788168: 73a03e29 movvc r3, #656 ; 0x29078916c: e3b0497e movs r4, #2064384 ; 0x1f8000790170: e1a0c1a6 lsr ip, r6, #3791174: 71b0554d asrsvc r5, sp, #10792178: e1a0137e ror r1, lr, r379317c: 01b0897c rorseq r8, ip, r9794180: 330cbf31 movwcc fp, #53041 ; 0xcf31795184: 33429bf7 movtcc r9, #11255 ; 0x2bf7796188: d001059d mulle r1, sp, r579718c: e0100b9a muls r0, sl, fp798190: e0207c93 mla r0, r3, ip, r7799194: 0038639b mlaseq r8, fp, r3, r6800198: e084e695 umull lr, r4, r5, r680119c: e0940796 umulls r0, r4, r6, r78021a0: e0a08e9b umlal r8, r0, fp, lr8031a4: e0b4b79e umlals fp, r4, lr, r78041a8: 20c51796 smullcs r1, r5, r6, r78051ac: 40db059c smullsmi r0, fp, ip, r58061b0: e0498592 umaal r8, r9, r2, r58071b4: 0060ed94 mlseq r0, r4, sp, lr8081b8: 510d9054 qaddpl r9, r4, sp8091bc: 4125005c qsubmi r0, ip, r58101c0: e1473055 qdadd r3, r5, r78111c4: e1649052 qdsub r9, r2, r48121c8: e101658c smlabb r1, ip, r5, r68131cc: e1006cca smlabt r0, sl, ip, r68141d0: e108e3a1 smlatb r8, r1, r3, lr8151d4: e10176ed smlatt r1, sp, r6, r78161d8: e1206483 smlawb r0, r3, r4, r68171dc: e12b7ec4 smlawt fp, r4, lr, r78181e0: e14a0786 smlalbb r0, sl, r6, r78191e4: 914b3ec4 smlalbtls r3, fp, r4, lr8201e8: e14b8ca3 smlaltb r8, fp, r3, ip8211ec: e14185e3 smlaltt r8, r1, r3, r58221f0: 21220dac smulwbcs r2, ip, sp8231f4: e12806ec smulwt r8, ip, r68241f8: a1620e86 smulbbge r2, r6, lr8251fc: e16807cc smulbt r8, ip, r7826200: 016a0ea3 smultbeq sl, r3, lr827204: e1600de3 smultt r0, r3, sp828208: e697a009 ldr sl, [r7], r982920c: e5d900c4 ldrb r0, [r9, #196] ; 0xc4830210: e1b4e0b6 ldrh lr, [r4, r6]!831214: e1f96ed8 ldrsb r6, [r9, #232]! ; 0xe8832218: e09120f1 ldrsh r2, [r1], r183321c: e6890004 str r0, [r9], r4834220: e5e5305c strb r3, [r5, #92]! ; 0x5c835224: e1c82ab0 strh r2, [r8, #160] ; 0xa0836228: e79c8008 ldr r8, [ip, r8]83722c: e4dab010 ldrb fp, [sl], #16838230: e19ab0b6 ldrh fp, [sl, r6]839234: e1bb50da ldrsb r5, [fp, sl]!840238: e19360f7 ldrsh r6, [r3, r7]84123c: e7ad7005 str r7, [sp, r5]!842240: e5ca2000 strb r2, [sl]843244: e08460b3 strh r6, [r4], r3844248: e59ca000 ldr sl, [ip]84524c: e4db4084 ldrb r4, [fp], #132 ; 0x84846250: e09990bc ldrh r9, [r9], ip847254: e0d399d4 ldrsb r9, [r3], #148 ; 0x94848258: e1f2b9f4 ldrsh fp, [r2, #148]! ; 0x9484925c: e78db00b str fp, [sp, fp]850260: e7cd100a strb r1, [sp, sl]851264: e08ea0b9 strh sl, [lr], r9852268: e7b36004 ldr r6, [r3, r4]!85326c: e7f6400d ldrb r4, [r6, sp]!854270: e09760ba ldrh r6, [r7], sl855274: e1b600db ldrsb r0, [r6, fp]!856278: e096a0fd ldrsh sl, [r6], sp85727c: e783700c str r7, [r3, ip]858280: e7e83001 strb r3, [r8, r1]!859284: e1cc44b0 strh r4, [ip, #64] ; 0x4086086100000288 <near>:862288: e51f1008 ldr r1, [pc, #-8] ; 288 <near>86328c: e55f7008 ldrb r7, [pc, #-8] ; 28c <near+0x4>864290: e15f21b0 ldrh r2, [pc, #-16] ; 288 <near>865294: e15fa0d8 ldrsb sl, [pc, #-8] ; 294 <near+0xc>866298: e1dfe3f8 ldrsh lr, [pc, #56] ; 2d8 <near_post>86729c: e51f2008 ldr r2, [pc, #-8] ; 29c <near+0x14>8682a0: e55f3008 ldrb r3, [pc, #-8] ; 2a0 <near+0x18>8692a4: e1df72bc ldrh r7, [pc, #44] ; 2d8 <near_post>8702a8: e15fd0d8 ldrsb sp, [pc, #-8] ; 2a8 <near+0x20>8712ac: e15fa2fc ldrsh sl, [pc, #-44] ; 288 <near>8722b0: e51f5008 ldr r5, [pc, #-8] ; 2b0 <near+0x28>8732b4: e5dfe01c ldrb lr, [pc, #28] ; 2d8 <near_post>8742b8: e1df51b8 ldrh r5, [pc, #24] ; 2d8 <near_post>8752bc: e15f63dc ldrsb r6, [pc, #-60] ; 288 <near>8762c0: e15fb4f0 ldrsh fp, [pc, #-64] ; 288 <near>8772c4: e59f700c ldr r7, [pc, #12] ; 2d8 <near_post>8782c8: e5df5008 ldrb r5, [pc, #8] ; 2d8 <near_post>8792cc: e15fa4bc ldrh sl, [pc, #-76] ; 288 <near>8802d0: e1df60d0 ldrsb r6, [pc] ; 2d8 <near_post>8812d4: e15f90f8 ldrsh r9, [pc, #-8] ; 2d4 <near+0x4c>882883000002d8 <near_post>:8842d8: e690036a ldr r0, [r0], sl, ror #68852dc: e7d8348e ldrb r3, [r8, lr, lsl #9]8862e0: e78d5783 str r5, [sp, r3, lsl #15]8872e4: e6c99145 strb r9, [r9], r5, asr #28882e8: e7945360 ldr r5, [r4, r0, ror #6]8892ec: e7d0e4a4 ldrb lr, [r0, r4, lsr #9]8902f0: e68c52cc str r5, [ip], ip, asr #58912f4: e7e13667 strb r3, [r1, r7, ror #12]!8922f8: e7b26063 ldr r6, [r2, r3, rrx]!8932fc: e7fe8842 ldrb r8, [lr, r2, asr #16]!894300: e7a363e6 str r6, [r3, r6, ror #7]!895304: e7c83502 strb r3, [r8, r2, lsl #10]896308: e79db40e ldr fp, [sp, lr, lsl #8]89730c: e7fda20c ldrb sl, [sp, ip, lsl #4]!898310: e789d142 str sp, [r9, r2, asr #2]899314: e7eb774e strb r7, [fp, lr, asr #14]!900318: e19bcf9f ldrex r12, [fp]90131c: e1dc4f9f ldrexb r4, [ip]902320: e1fbbf9f ldrexh fp, [fp]903324: e18e1f97 strex r1, r7, [lr]904328: e1c4cf96 strexb ip, r6, [r4]90532c: 21e74f96 strexhcs r4, r6, [r7]906330: e6143f17 sadd16 r3, r4, r7907334: e61a9f33 sasx r9, sl, r3908338: e615cf56 ssax ip, r5, r690933c: e615cf7e ssub16 ip, r5, lr910340: e61a0f97 sadd8 r0, sl, r7911344: 66180ff2 ssub8vs r0, r8, r2912348: 5624bf15 qadd16pl fp, r4, r591334c: 6623bf3c qasxvs fp, r3, ip914350: e6230f55 qsax r0, r3, r5915354: e61caf75 ssub16 sl, ip, r5916358: 3626af9e qadd8cc sl, r6, lr91735c: e62baff7 qsub8 sl, fp, r7918360: 56349f1e shadd16pl r9, r4, lr919364: e63e1f37 shasx r1, lr, r7920368: 363b9f55 shsaxcc r9, fp, r592136c: a6313f7b shsub16ge r3, r1, fp922370: c635df97 shadd8gt sp, r5, r7923374: e6351ff7 shsub8 r1, r5, r7924378: e654af17 uadd16 sl, r4, r792537c: 26591f37 uasxcs r1, r9, r7926380: e65dbf57 usax fp, sp, r7927384: e654bf7e usub16 fp, r4, lr928388: 365d2f97 uadd8cc r2, sp, r792938c: c65a8ffe usub8gt r8, sl, lr930390: e66c3f1d uqadd16 r3, ip, sp931394: e66d4f36 uqasx r4, sp, r6932398: e66a1f5e uqsax r1, sl, lr93339c: d66d2f7e uqsub16le r2, sp, lr9343a0: e66c1f95 uqadd8 r1, ip, r59353a4: c6640ffd uqsub8gt r0, r4, sp9363a8: 867a0f15 uhadd16hi r0, sl, r59373ac: d674bf37 uhasxle fp, r4, r79383b0: a67e1f59 uhsaxge r1, lr, r99393b4: e67b2f7e uhsub16 r2, fp, lr9403b8: a6749f95 uhadd8ge r9, r4, r59413bc: 867d2ffe uhsub8hi r2, sp, lr9423c0: e683a877 sxtab16 sl, r3, r7, ror #169433c4: 26a59c77 sxtabcs r9, r5, r7, ror #249443c8: e6b53477 sxtah r3, r5, r7, ror #89453cc: e6c48476 uxtab16 r8, r4, r6, ror #89463d0: 06eb007d uxtabeq r0, fp, sp9473d4: e6fc9075 uxtah r9, ip, r59483d8: a68f387b sxtb16ge r3, fp, ror #169493dc: 86af2076 sxtbhi r2, r69503e0: c6bf3c7d sxthgt r3, sp, ror #249513e4: e6cfc875 uxtb16 ip, r5, ror #169523e8: e6efc875 uxtb ip, r5, ror #169533ec: e6ff8875 uxth r8, r5, ror #169543f0: 06bfaf34 reveq sl, r49553f4: a6bf8fbc rev16ge r8, ip9563f8: e6ffef37 rbit lr, r79573fc: c6ffdfb7 revshgt sp, r7958400: e719fe1d sdiv r9, sp, lr959404: e732f61c udiv r2, ip, r6960408: 47a20a51 sbfxmi r0, r1, #20, #396140c: e7ee9852 ubfx r9, r2, #16, #15962410: 87dd1d9b bfihi r1, fp, #27, #3963414: e7d0339f bfc r3, #7, #10964418: e8060d6b stmda r6, {r0, r1, r3, r5, r6, r8, sl, fp}96541c: e80438df stmda r4, {r0, r1, r2, r3, r4, r6, r7, fp, ip, sp}966420: e810e1d4 ldmda r0, {r2, r4, r6, r7, r8, sp, lr, pc}967424: e83c9873 ldmda ip!, {r0, r1, r4, r5, r6, fp, ip, pc}968428: e8a931bd stmia r9!, {r0, r2, r3, r4, r5, r7, r8, ip, sp}96942c: e88b55c3 stm fp, {r0, r1, r6, r7, r8, sl, ip, lr}970430: e8bcbd22 ldm ip!, {r1, r5, r8, sl, fp, ip, sp, pc}971434: e8bda10a pop {r1, r3, r8, sp, pc}972438: e92b2219 stmdb fp!, {r0, r3, r4, r9, sp}97343c: e9298dd5 stmdb r9!, {r0, r2, r4, r6, r7, r8, sl, fp, pc}974440: e935605b ldmdb r5!, {r0, r1, r3, r4, r6, sp, lr}975444: e91191a7 ldmdb r1, {r0, r1, r2, r5, r7, r8, ip, pc}976448: e9ab6e6a stmib fp!, {r1, r3, r5, r6, r9, sl, fp, sp, lr}97744c: e98b4507 stmib fp, {r0, r1, r2, r8, sl, lr}978450: e9b053cc ldmib r0!, {r2, r3, r6, r7, r8, r9, ip, lr}979454: e9912de7 ldmib r1, {r0, r1, r2, r5, r6, r7, r8, sl, fp, sp}980458: 2a000075 bcs 634 <forth>98145c: 4bfffffe blmi 45c <near_post+0x184>982460: 612fff10 bxvs r0983464: e12fff33 blx r3984468: eafffffe b 468 <near_post+0x190>98546c: ebfffffe bl 46c <near_post+0x194>986470: 612fff10 bxvs r0987474: e12fff35 blx r5988478: da00006d ble 634 <forth>98947c: 4bfffffe blmi 47c <near_post+0x1a4>990480: 112fff19 bxne r9991484: e12fff3c blx ip992488: eafffedc b 0 <back>99348c: 8bfffffe blhi 48c <near_post+0x1b4>994490: 712fff11 bxvc r1995494: c12fff37 blxgt r7996498: aafffed8 bge 0 <back>99749c: 8bfffffe blhi 49c <near_post+0x1c4>9984a0: e12fff1c bx ip9994a4: 312fff37 blxcc r710004a8: eafffffe b 4a8 <near_post+0x1d0>10014ac: cbfffed3 blgt 0 <back>10024b0: a12fff11 bxge r110034b4: e12fff30 blx r010044b8: eafffffe b 4b8 <near_post+0x1e0>10054bc: eb00005c bl 634 <forth>10064c0: c12fff1e bxgt lr10074c4: 112fff3b blxne fp10084c8: 2afffffe bcs 4c8 <near_post+0x1f0>10094cc: ebfffffe bl 4cc <near_post+0x1f4>10104d0: 212fff1a bxcs sl10114d4: e12fff34 blx r410124d8: eafffec8 b 0 <back>10134dc: ebfffffe bl 4dc <near_post+0x204>10144e0: 312fff1c bxcc ip10154e4: e12fff38 blx r810164e8: ea000051 b 634 <forth>10174ec: ebfffffe bl 4ec <near_post+0x214>10184f0: e12fff1a bx sl10194f4: e12fff31 blx r110204f8: 4e042a06 vmlami.f32 s4, s8, s1210214fc: ee052a45 vmls.f32 s4, s10, s101022500: ee151a46 vnmla.f32 s2, s10, s121023504: be134a04 vnmlslt.f32 s8, s6, s81024508: 4e263a47 vnmulmi.f32 s6, s12, s14102550c: ee310a00 vadd.f32 s0, s2, s01026510: ee321a45 vsub.f32 s2, s4, s101027514: 2e810a06 vdivcs.f32 s0, s2, s121028518: ee030b06 vmla.f64 d0, d3, d6102951c: ee010b45 vmls.f64 d0, d1, d51030520: ee141b46 vnmla.f64 d1, d4, d61031524: 1e110b01 vnmlsne.f64 d0, d1, d11032528: 1e253b45 vnmulne.f64 d3, d5, d5103352c: 3e320b04 vaddcc.f64 d0, d2, d41034530: ee321b44 vsub.f64 d1, d2, d41035534: 4e810b05 vdivmi.f64 d0, d1, d51036538: eeb03ac3 vabs.f32 s6, s6103753c: 5eb13a44 vnegpl.f32 s6, s81038540: eeb10ac4 vsqrt.f32 s0, s81039544: eeb00bc4 vabs.f64 d0, d41040548: eeb11b44 vneg.f64 d1, d4104154c: eeb10bc1 vsqrt.f64 d0, d11042550: 5e00ea10 vmovpl s0, lr1043554: ee14ba10 vmov fp, s81044558: bc4ebb11 vmovlt d1, fp, lr104555c: ec557b15 vmov r7, r5, d51046560: eeb04a46 vmov.f32 s8, s121047564: 8eb01b42 vmovhi.f64 d1, d21048568: 6eb72a00 vmovvs.f32 s4, #112 ; 0x70104956c: eeb72b00 vmov.f64 d2, #112 ; 0x701050570: eeb03a00 vmov.f32 s6, #01051574: eeb01b00 vmov.f64 d1, #01052578: ed952a1d vldr s4, [r5, #116] ; 0x74105357c: 3d811a0e vstrcc s2, [r1, #56] ; 0x381054580: 1d957b04 vldrne d7, [r5, #16]1055584: ed816b39 vstr d6, [r1, #228] ; 0xe41056105700000588 <near_flt>:1058588: ed9f1a0e vldr s2, [pc, #56] ; 5c8 <near_post_flt>105958c: ed8f3a0d vstr s6, [pc, #52] ; 5c8 <near_post_flt>1060590: bd1f2b04 vldrlt d2, [pc, #-16] ; 588 <near_flt>1061594: cd0f3b02 vstrgt d3, [pc, #-8] ; 594 <near_flt+0xc>1062598: 3d9f2a0a vldrcc s4, [pc, #40] ; 5c8 <near_post_flt>106359c: ed8f0a09 vstr s0, [pc, #36] ; 5c8 <near_post_flt>10645a0: cd9f4b08 vldrgt d4, [pc, #32] ; 5c8 <near_post_flt>10655a4: ed0f0b09 vstr d0, [pc, #-36] ; 588 <near_flt>10665a8: ed9f4a06 vldr s8, [pc, #24] ; 5c8 <near_post_flt>10675ac: ed8f3a05 vstr s6, [pc, #20] ; 5c8 <near_post_flt>10685b0: 5d1f4b0c vldrpl d4, [pc, #-48] ; 588 <near_flt>10695b4: ed0f5b0d vstr d5, [pc, #-52] ; 588 <near_flt>10705b8: 9d9f4a02 vldrls s8, [pc, #8] ; 5c8 <near_post_flt>10715bc: 3d0f6a02 vstrcc s12, [pc, #-8] ; 5bc <near_flt+0x34>10725c0: ed9f6b00 vldr d6, [pc] ; 5c8 <near_post_flt>10735c4: bd0f1b01 vstrlt d1, [pc, #-4] ; 5c8 <near_post_flt>10741075000005c8 <near_post_flt>:10765c8: ec912a01 vldmia r1, {s4}10775cc: 2ca62a01 vstmiacs r6!, {s4}10785d0: ecb91b08 vldmia r9!, {d1-d4}10795d4: eca36b04 vstmia r3!, {d6-d7}10805d8: 6d323a01 vldmdbvs r2!, {s6}10815dc: ed267a01 vstmdb r6!, {s14}10825e0: ed3d4b08 vldmdb sp!, {d4-d7}10835e4: ed205b06 vstmdb r0!, {d5-d7}10845e8: eeb41a41 vcmp.f32 s2, s210855ec: 7eb44ac4 vcmpevc.f32 s8, s810865f0: eeb40b46 vcmp.f64 d0, d610875f4: aeb43bc7 vcmpege.f64 d3, d710885f8: beb51a40 vcmplt.f32 s2, #0.010895fc: ceb57ac0 vcmpegt.f32 s14, #0.01090600: eeb54b40 vcmp.f64 d4, #0.01091604: eeb51bc0 vcmpe.f64 d1, #0.01092608: 6ebd1ac3 vcvtvs.s32.f32 s2, s6109360c: cebc3ac7 vcvtgt.u32.f32 s6, s141094610: 3eb80ac1 vcvtcc.f32.s32 s0, s21095614: 3eb81a42 vcvtcc.f32.u32 s2, s41096618: 8ebd2bc4 vcvthi.s32.f64 s4, d4109761c: 8ebc3bc6 vcvthi.u32.f64 s6, d61098620: 9eb73bc7 vcvtls.f32.f64 s6, d71099624: eeb83bc4 vcvt.f64.s32 d3, s81100628: 0eb85b47 vcvteq.f64.u32 d5, s14110162c: eeb74ac5 vcvt.f64.f32 d4, s101102630: e120017a bkpt 0x001a1103*/11041105static const unsigned int insns[] =1106{11070xe082852b, 0x009310c7, 0xe0290284, 0xc0329066,11080xc04c000e, 0x00528364, 0xe069818d, 0x60708864,11090xd08597a1, 0xe09d12c6, 0xc0adb0c7, 0xe0b80329,11100xe0c392e6, 0x80dd1845, 0x30e28486, 0xe0f4a76d,11110x118db785, 0xe19a9764, 0xe1cd90e5, 0xe1d20547,11120xe086d777, 0x809c4776, 0x90265c57, 0xe035841d,11130xe04c2055, 0x20539c17, 0xc06c9614, 0xe072811c,11140xe08c4d1d, 0xe09b8d76, 0x10a20415, 0xe0beb256,11150x80ca835e, 0xe0dc1615, 0x60e54a7e, 0xe0fc181d,11160x61818076, 0xe19db577, 0xe1ce4216, 0xe1dba31d,11170x828d8261, 0xe29ed69b, 0xe226e87d, 0xe2332f49,11180xe24d46d9, 0xb25e1402, 0xe2650325, 0x3274882f,11190xb2849102, 0xe2948902, 0x22aeac2a, 0xe2b6aabd,11200xe2cc2426, 0xe2da85a5, 0xe2e6d871, 0x12fba6e9,11210x638737ff, 0x03952951, 0x63c18eea, 0x33d2020a,11220xe118028d, 0xe13601a7, 0xe15c0164, 0xb1750807,11230xe112073e, 0x31300572, 0x915e0b37, 0x617a0b17,11240xe3120585, 0x433e071b, 0xe355030e, 0x3377010a,11250xe1a00b84, 0xe1b01484, 0xe1a001aa, 0xe1b00a2a,11260xe1a015c9, 0x61b0254b, 0x31a08fe2, 0xe1b0946c,11270xe1a0877e, 0xe1b0c473, 0xc1a0ce1d, 0xe1b0c61d,11280xc1a00931, 0xc1b0bc33, 0xd1a0265c, 0xb1b0165a,11290xe1a0a003, 0xe1b00009, 0x73a03e29, 0xe3b0497e,11300xe1a0c1a6, 0x71b0554d, 0xe1a0137e, 0x01b0897c,11310x330cbf31, 0x33429bf7, 0xd001059d, 0xe0100b9a,11320xe0207c93, 0x0038639b, 0xe084e695, 0xe0940796,11330xe0a08e9b, 0xe0b4b79e, 0x20c51796, 0x40db059c,11340xe0498592, 0x0060ed94, 0x510d9054, 0x4125005c,11350xe1473055, 0xe1649052, 0xe101658c, 0xe1006cca,11360xe108e3a1, 0xe10176ed, 0xe1206483, 0xe12b7ec4,11370xe14a0786, 0x914b3ec4, 0xe14b8ca3, 0xe14185e3,11380x21220dac, 0xe12806ec, 0xa1620e86, 0xe16807cc,11390x016a0ea3, 0xe1600de3, 0xe697a009, 0xe5d900c4,11400xe1b4e0b6, 0xe1f96ed8, 0xe09120f1, 0xe6890004,11410xe5e5305c, 0xe1c82ab0, 0xe79c8008, 0xe4dab010,11420xe19ab0b6, 0xe1bb50da, 0xe19360f7, 0xe7ad7005,11430xe5ca2000, 0xe08460b3, 0xe59ca000, 0xe4db4084,11440xe09990bc, 0xe0d399d4, 0xe1f2b9f4, 0xe78db00b,11450xe7cd100a, 0xe08ea0b9, 0xe7b36004, 0xe7f6400d,11460xe09760ba, 0xe1b600db, 0xe096a0fd, 0xe783700c,11470xe7e83001, 0xe1cc44b0, 0xe51f1008, 0xe55f7008,11480xe15f21b0, 0xe15fa0d8, 0xe1dfe3f8, 0xe51f2008,11490xe55f3008, 0xe1df72bc, 0xe15fd0d8, 0xe15fa2fc,11500xe51f5008, 0xe5dfe01c, 0xe1df51b8, 0xe15f63dc,11510xe15fb4f0, 0xe59f700c, 0xe5df5008, 0xe15fa4bc,11520xe1df60d0, 0xe15f90f8, 0xe690036a, 0xe7d8348e,11530xe78d5783, 0xe6c99145, 0xe7945360, 0xe7d0e4a4,11540xe68c52cc, 0xe7e13667, 0xe7b26063, 0xe7fe8842,11550xe7a363e6, 0xe7c83502, 0xe79db40e, 0xe7fda20c,11560xe789d142, 0xe7eb774e, 0xe19bcf9f, 0xe1dc4f9f,11570xe1fbbf9f, 0xe18e1f97, 0xe1c4cf96, 0x21e74f96,11580xe6143f17, 0xe61a9f33, 0xe615cf56, 0xe615cf7e,11590xe61a0f97, 0x66180ff2, 0x5624bf15, 0x6623bf3c,11600xe6230f55, 0xe61caf75, 0x3626af9e, 0xe62baff7,11610x56349f1e, 0xe63e1f37, 0x363b9f55, 0xa6313f7b,11620xc635df97, 0xe6351ff7, 0xe654af17, 0x26591f37,11630xe65dbf57, 0xe654bf7e, 0x365d2f97, 0xc65a8ffe,11640xe66c3f1d, 0xe66d4f36, 0xe66a1f5e, 0xd66d2f7e,11650xe66c1f95, 0xc6640ffd, 0x867a0f15, 0xd674bf37,11660xa67e1f59, 0xe67b2f7e, 0xa6749f95, 0x867d2ffe,11670xe683a877, 0x26a59c77, 0xe6b53477, 0xe6c48476,11680x06eb007d, 0xe6fc9075, 0xa68f387b, 0x86af2076,11690xc6bf3c7d, 0xe6cfc875, 0xe6efc875, 0xe6ff8875,11700x06bfaf34, 0xa6bf8fbc, 0xe6ffef37, 0xc6ffdfb7,11710xe719fe1d, 0xe732f61c, 0x47a20a51, 0xe7ee9852,11720x87dd1d9b, 0xe7d0339f, 0xe8060d6b, 0xe80438df,11730xe810e1d4, 0xe83c9873, 0xe8a931bd, 0xe88b55c3,11740xe8bcbd22, 0xe8bda10a, 0xe92b2219, 0xe9298dd5,11750xe935605b, 0xe91191a7, 0xe9ab6e6a, 0xe98b4507,11760xe9b053cc, 0xe9912de7, 0x2a000075, 0x4bfffffe,11770x612fff10, 0xe12fff33, 0xeafffffe, 0xebfffffe,11780x612fff10, 0xe12fff35, 0xda00006d, 0x4bfffffe,11790x112fff19, 0xe12fff3c, 0xeafffedc, 0x8bfffffe,11800x712fff11, 0xc12fff37, 0xaafffed8, 0x8bfffffe,11810xe12fff1c, 0x312fff37, 0xeafffffe, 0xcbfffed3,11820xa12fff11, 0xe12fff30, 0xeafffffe, 0xeb00005c,11830xc12fff1e, 0x112fff3b, 0x2afffffe, 0xebfffffe,11840x212fff1a, 0xe12fff34, 0xeafffec8, 0xebfffffe,11850x312fff1c, 0xe12fff38, 0xea000051, 0xebfffffe,11860xe12fff1a, 0xe12fff31, 0x4e042a06, 0xee052a45,11870xee151a46, 0xbe134a04, 0x4e263a47, 0xee310a00,11880xee321a45, 0x2e810a06, 0xee030b06, 0xee010b45,11890xee141b46, 0x1e110b01, 0x1e253b45, 0x3e320b04,11900xee321b44, 0x4e810b05, 0xeeb03ac3, 0x5eb13a44,11910xeeb10ac4, 0xeeb00bc4, 0xeeb11b44, 0xeeb10bc1,11920x5e00ea10, 0xee14ba10, 0xbc4ebb11, 0xec557b15,11930xeeb04a46, 0x8eb01b42, 0x6eb72a00, 0xeeb72b00,11940xeeb03a00, 0xeeb01b00, 0xed952a1d, 0x3d811a0e,11950x1d957b04, 0xed816b39, 0xed9f1a0e, 0xed8f3a0d,11960xbd1f2b04, 0xcd0f3b02, 0x3d9f2a0a, 0xed8f0a09,11970xcd9f4b08, 0xed0f0b09, 0xed9f4a06, 0xed8f3a05,11980x5d1f4b0c, 0xed0f5b0d, 0x9d9f4a02, 0x3d0f6a02,11990xed9f6b00, 0xbd0f1b01, 0xec912a01, 0x2ca62a01,12000xecb91b08, 0xeca36b04, 0x6d323a01, 0xed267a01,12010xed3d4b08, 0xed205b06, 0xeeb41a41, 0x7eb44ac4,12020xeeb40b46, 0xaeb43bc7, 0xbeb51a40, 0xceb57ac0,12030xeeb54b40, 0xeeb51bc0, 0x6ebd1ac3, 0xcebc3ac7,12040x3eb80ac1, 0x3eb81a42, 0x8ebd2bc4, 0x8ebc3bc6,12050x9eb73bc7, 0xeeb83bc4, 0x0eb85b47, 0xeeb74ac5,12060xe120017a,1207};1208// END Generated code -- do not edit12091210// reset the detected cpu feature set1211VM_Version::features(detected_features);12121213{1214bool ok = true;1215unsigned int *insns1 = (unsigned int *)entry;1216for (unsigned int i = 0; i < sizeof insns / sizeof insns[0]; i++) {1217if (insns[i] != insns1[i]) {1218ok = false;1219printf("Ours:\n");1220Disassembler::decode((address)&insns1[i], (address)&insns1[i+1]);1221printf(" Raw: 0x%x\n", insns1[i]);1222printf("Theirs:\n");1223Disassembler::decode((address)&insns[i], (address)&insns[i+1]);1224printf(" Raw: 0x%x\n", insns[i]);1225printf("\n");1226}1227}1228assert(ok, "Assembler smoke test failed");1229}1230#endif // ASSERT1231}12321233#undef __1234void Address::AddressConstruct(Register base, RegisterOrConstant index, enum reg_op op,1235shift_op shift, enum wb_mode mode) {1236_base = base;1237_wb_mode = mode;1238_shift = shift;1239_target = 0;1240if (index.is_register()) {1241_acc_mode = reg;1242_index = index.as_register();1243_offset = 0;1244_as_op = op;1245} else {1246assert(shift == lsl(), "should be");1247assert(index.is_constant(), "should be");1248_acc_mode = imm;1249// _index = no_reg;1250_offset = index.as_constant();1251if(SUB == _as_op)1252_offset = -_offset;1253}1254}12551256void Address::encode(Instruction_aarch32 *i, CodeSection *sec, address pc) const {1257long offset = _offset;1258access_mode mode = _acc_mode;12591260if(lit == mode) {1261//Create the offset from the address1262offset = _target - pc;1263mode = imm;1264}12651266//Correct the offset if the base is the PC1267if(r15_pc == _base && imm == mode) {1268offset -= 8;1269}12701271int U = (offset >= 0 && _acc_mode == imm) || (_as_op == ADD && _acc_mode == reg);1272int P = pre == _wb_mode || off == _wb_mode;1273int W = pre == _wb_mode;1274i->f(P, 24), i->f(U, 23), i->f(W, 21), i->rf(_base, 16);12751276offset = offset < 0 ? -offset : offset;1277int opc = i->get(27, 25);12781279if (imm == mode) {1280switch(opc) {1281case 0b010:1282// LDR, LDRB1283// STR, STRB1284i->f(offset, 11, 0);1285break;1286case 0b000:1287// LDRH, LDRSH, LDRSB, LDRD1288// STRH, STRD1289i->f(1, 22);1290assert(offset < (1 << 8), "Offset larger than a byte");1291i->f(offset & 0xF, 3, 0);1292i->f(offset >> 4, 11, 8);1293break;1294default:1295ShouldNotReachHere();1296}1297} else if (reg == mode) {1298assert(r15_pc->encoding_nocheck() !=1299_base->encoding_nocheck(), "Remove this if you have your offsets right");1300switch(opc) {1301case 0b010:1302// LDR, LDRB1303// STR, STRB1304//Need to set bit 25 as Register 0b0111305i->f(1, 25);1306i->f(_shift.shift(), 11, 7);1307i->f(_shift.kind(), 6, 5);1308i->f(0, 4);1309i->rf(_index, 0);1310break;1311case 0b000:1312// LDRH, LDRSH, LDRSB, LDRD1313// STRH, STRD1314//Need to clear bit 22 as Register1315i->f(0, 22);1316assert(_shift == lsl(), "Type of load/store does not support shift");1317i->f(0b0000, 11, 8);1318i->rf(_index, 0);1319break;1320default:1321ShouldNotReachHere();1322}1323} else {1324ShouldNotReachHere();1325}13261327if(lit == _acc_mode) {1328sec->relocate(pc, _rspec);1329}1330}13311332void Address::fp_encode(Instruction_aarch32 *i, CodeSection *sec, address pc) const {1333// ATM works only for immediate1334assert(_wb_mode == off, "Can't do pre or post addressing for vldr, vstr");1335long offset = _offset;1336if(imm == _acc_mode) {1337if(r15_pc == _base) {1338//Correct the offset if the base is the PC1339offset -= 8;1340}1341bool U = offset >= 0;1342assert(0 == (offset & 3), "Can only access aligned data");1343unsigned imm8 = uabs(offset) / 4;1344i->f(U, 23), i->rf(_base, 16), i->f(imm8, 7, 0);1345} else {1346ShouldNotReachHere();1347}1348}13491350#define __ as->1351void Address::lea(MacroAssembler *as, Register r) const {1352Relocation* reloc = _rspec.reloc();1353relocInfo::relocType rtype = (relocInfo::relocType) reloc->type();13541355//TODO Potentially remove this - added as aarch64 doesn't contain1356// any method of handling pre or post1357assert( _wb_mode != pre && _wb_mode != post, "Wrong wb mode");1358// could probably permit post however1359switch(_acc_mode) {1360case imm: {1361if (_offset == 0 && _base == r) // it's a nop1362break;1363if (_offset > 0)1364__ add(r, _base, _offset);1365else1366__ sub(r, _base, -_offset);1367break;1368}1369case reg: {1370__ add(r, _base, _index, _shift);1371break;1372}1373case lit: {1374if (rtype == relocInfo::none)1375__ mov(r, target());1376else1377__ movptr(r, (uint32_t)target());1378break;1379}1380default:1381ShouldNotReachHere();1382}1383}1384#undef __13851386#define __ as->1387class Address;13881389// Adapts given Address to the capabilities of instructions respective to the1390// provided data type. E.g. some of the instructions cannot use index register1391// while others cannot have an offset field.1392// Returns a copy of this Address is it's good or constructs a new Address1393// good for respective instructions by emitting necessary code to calculate1394// the address in tmp register1395Address Address::safe_for(InsnDataType type, MacroAssembler *as, Register tmp) {1396if (is_safe_for(type))1397return *this;1398assert(tmp->is_valid(), "must be");1399lea(as, tmp);1400return Address(tmp);1401}1402#undef __14031404bool Address::is_safe_for(InsnDataType type) {1405switch (_acc_mode) {1406case imm:1407case lit:1408return offset_ok_for_immed(_offset, type);1409case reg:1410return shift_ok_for_index(_shift, type);1411case no_mode:1412default:1413ShouldNotReachHere();1414return false;1415}1416}14171418bool Address::offset_ok_for_immed(long offset, InsnDataType type) {1419const int o = offset < 0 ? -offset : offset;1420switch (type) {1421case IDT_INT:1422case IDT_BOOLEAN:1423case IDT_OBJECT:1424case IDT_ADDRESS:1425case IDT_METADATA:1426case IDT_ARRAY:1427return o <= 0xfff;1428case IDT_BYTE:1429case IDT_SHORT:1430case IDT_LONG:1431case IDT_CHAR:1432return o <= 0xff;1433case IDT_FLOAT:1434case IDT_DOUBLE:1435return !(o & ~0x3fc);1436case IDT_LEA:1437return true;1438case IDT_MULTIWORD:1439return !o;1440default:1441ShouldNotReachHere();1442return false;1443}1444}14451446bool Address::shift_ok_for_index(shift_op shift, InsnDataType type) {1447switch (type) {1448case IDT_INT:1449case IDT_BOOLEAN:1450case IDT_OBJECT:1451case IDT_ADDRESS:1452case IDT_METADATA:1453case IDT_ARRAY:1454return !shift.is_register();1455case IDT_BYTE:1456case IDT_SHORT:1457case IDT_LONG:1458case IDT_CHAR:1459return !shift.is_register() && shift.shift() == 0;1460case IDT_LEA:1461return true;1462case IDT_FLOAT:1463case IDT_DOUBLE:1464case IDT_MULTIWORD:1465return false;1466default:1467ShouldNotReachHere();1468return false;1469}1470}14711472void Assembler::emit_data64(jlong data,1473relocInfo::relocType rtype,1474int format) {1475if (rtype == relocInfo::none) {1476emit_int64(data);1477} else {1478emit_data64(data, Relocation::spec_simple(rtype), format);1479}1480}14811482void Assembler::emit_data64(jlong data,1483RelocationHolder const& rspec,1484int format) {14851486assert(inst_mark() != NULL, "must be inside InstructionMark");1487// Do not use AbstractAssembler::relocate, which is not intended for1488// embedded words. Instead, relocate to the enclosing instruction.1489code_section()->relocate(inst_mark(), rspec, format);1490emit_int64(data);1491}14921493extern "C" {1494void das(uint64_t start, int len) {1495ResourceMark rm;1496len <<= 2;1497if (len < 0)1498Disassembler::decode((address)start + len, (address)start);1499else1500Disassembler::decode((address)start, (address)start + len);1501}15021503JNIEXPORT void das1(unsigned long insn) {1504das(insn, 1);1505}1506}15071508#define starti Instruction_aarch32 do_not_use(this); set_current(&do_not_use)15091510void Assembler::adr(Register Rd, address adr, Condition cond) {1511int offset = adr - pc() - 8;1512adr_encode(Rd, offset, cond);1513}15141515#undef starti15161517Address::Address(address target, relocInfo::relocType rtype)1518: _acc_mode(lit), _base(sp), _offset(0), _wb_mode(off) {1519//TODO we don't complete _wb_mode - what about Addresses that are pre/post accessed?1520_is_lval = false;1521_target = target;1522switch (rtype) {1523case relocInfo::oop_type:1524case relocInfo::metadata_type:1525// Oops are a special case. Normally they would be their own section1526// but in cases like icBuffer they are literals in the code stream that1527// we don't have a section for. We use none so that we get a literal address1528// which is always patchable.1529break;1530case relocInfo::external_word_type:1531_rspec = external_word_Relocation::spec(target);1532break;1533case relocInfo::internal_word_type:1534_rspec = internal_word_Relocation::spec(target);1535break;1536case relocInfo::opt_virtual_call_type:1537_rspec = opt_virtual_call_Relocation::spec();1538break;1539case relocInfo::static_call_type:1540_rspec = static_call_Relocation::spec();1541break;1542case relocInfo::runtime_call_type:1543_rspec = runtime_call_Relocation::spec();1544break;1545case relocInfo::poll_type:1546case relocInfo::poll_return_type:1547_rspec = Relocation::spec_simple(rtype);1548break;1549case relocInfo::none:1550_rspec = RelocationHolder::none;1551break;1552default:1553ShouldNotReachHere();1554break;1555}1556}15571558void Assembler::adr(Register r, const Address &dest, Condition cond) {1559code_section()->relocate(pc(), dest.rspec());1560adr(r, dest.target());1561}15621563void Assembler::wrap_label(Label &L, Assembler::uncond_branch_insn insn) {1564if (L.is_bound()) {1565(this->*insn)(target(L));1566} else {1567L.add_patch_at(code(), locator());1568(this->*insn)(pc());1569}1570}1571void Assembler::wrap_label(Label &L, Condition cond,1572Assembler::cond_branch_insn insn) {1573if (L.is_bound()) {1574(this->*insn)(target(L), cond);1575} else {1576L.add_patch_at(code(), locator());1577(this->*insn)(pc(), cond);1578}1579}15801581void Assembler::wrap_label(Register r, Label &L, Condition cond,1582Assembler::cond_ldst_insn insn) {1583if (L.is_bound()) {1584(this->*insn)(r, target(L), cond);1585} else {1586L.add_patch_at(code(), locator());1587(this->*insn)(r, pc(), cond);1588}1589}15901591void Assembler::wrap_label(FloatRegister r, Label &L, Condition cond,1592Assembler::cond_fp_ldst_insn insn) {1593if (L.is_bound()) {1594(this->*insn)(r, target(L), cond);1595} else {1596L.add_patch_at(code(), locator());1597(this->*insn)(r, pc(), cond);1598}1599}16001601uint32_t Assembler::encode_imm12(int imm) {1602assert(is_valid_for_imm12(imm),1603"only valid immediates allowed, call is_valid_for_imm12 first");1604uint32_t n = imm;1605if ((n & 0xFFFFFF00) == 0) {1606return n;1607}1608if ((n & 0xFC000000) == 0) {1609const int lshift = __builtin_ctz(n) & 0xFFFFFFFE;1610return ((32 - lshift) << 7) | (n >> lshift);1611}1612n = (n << 16) | (n >> 16);1613const int lshift = __builtin_ctz(n) & 0xFFFFFFFE;1614return ((16 - lshift) << 7) | (n >> lshift);1615}16161617int Assembler::decode_imm12(uint32_t imm12) {1618assert((imm12 & 0xFFFFF000) == 0, "bad imm12");1619uint32_t shift = (imm12 & 0x00000F00) >> 7;1620uint32_t value = imm12 & 0x000000FF;1621return (int) ((value >> shift) | (value << (32 - shift)));1622}16231624bool Assembler::is_valid_for_imm12(int imm) {1625uint32_t n = (uint32_t) imm;1626uint32_t shift = __builtin_clz(n) & 0xFFFFFFFE;1627uint32_t result = n << shift;1628if ((result & 0x00FFFFFF) == 0) {1629return true;1630}1631n = (n << 16) | (n >> 16);1632shift = __builtin_clz(n) & 0xFFFFFFFE;1633result = n << shift;1634if ((result & 0x00FFFFFF) == 0) {1635return true;1636}1637return false;1638}16391640bool Assembler::operand_valid_for_logical_immediate(bool is32, uint64_t imm) {1641return is32 && is_valid_for_imm12(imm);1642}16431644bool Assembler::operand_valid_for_add_sub_immediate(int imm) {1645return is_valid_for_imm12(imm);1646}16471648bool Assembler::operand_valid_for_add_sub_immediate(unsigned long imm) {1649return is_valid_for_imm12(imm);1650}16511652bool Assembler::operand_valid_for_add_sub_immediate(unsigned imm) {1653return is_valid_for_imm12(imm);1654}16551656bool Assembler::operand_valid_for_add_sub_immediate(jlong imm) {1657return is_valid_for_imm12(imm >> 32) && is_valid_for_imm12(imm);1658}16591660// n.b. this is implemented in subclass MacroAssembler1661void Assembler::bang_stack_with_offset(int offset) { Unimplemented(); }16621663int AbstractAssembler::code_fill_byte() {1664return 0;1665}16661667void Assembler::mov_immediate(Register dst, uint32_t imm32, Condition cond, bool s) {1668#ifndef PRODUCT1669{1670char buffer[64];1671snprintf(buffer, sizeof(buffer), "0x%"PRIX32, imm32);1672block_comment(buffer);1673}1674#endif1675if(is_valid_for_imm12(imm32)) {1676if(s) movs_i(dst, (unsigned)imm32, cond);1677else mov_i (dst, (unsigned)imm32, cond);1678} else if(is_valid_for_imm12(~imm32)) {1679if(s) mvns_i(dst, (unsigned)~imm32, cond);1680else mvn_i (dst, (unsigned)~imm32, cond);1681} else if (!s && VM_Version::features() & (FT_ARMV7 | FT_ARMV6T2) &&1682(imm32 < (1 << 16))) {1683movw_i(dst, (unsigned)imm32, cond);1684} else if (!s && VM_Version::features() & (FT_ARMV7 | FT_ARMV6T2) &&1685!(imm32 & ((1 << 16) - 1))) {1686movw_i(dst, (unsigned)0, cond);1687movt_i(dst, (unsigned)(imm32 >> 16), cond);1688} else { // TODO Could expand to varied numbers of mov and orrs1689//Need to do a full 32 bits1690mov_immediate32(dst, imm32, cond, s);1691}1692}16931694//This should really be in the macroassembler1695void Assembler::mov_immediate32(Register dst, uint32_t imm32, Condition cond, bool s)1696{1697// Need to move a full 32 bit immediate, for example if we're loading an address that1698// might change later and therefore need to be updated.1699if (VM_Version::features() & (FT_ARMV7 | FT_ARMV6T2)) {1700//Use a movw and a movt1701Assembler::movw_i(dst, (unsigned)(imm32 & 0xffff), cond);1702Assembler::movt_i(dst, (unsigned)(imm32 >> 16), cond);1703if(s) {1704//Additionally emit a cmp instruction1705Assembler::cmp(dst, 0);1706}1707} else {1708// Sadly we don't have movw, movt1709// instead emit a mov and three orr1710mov_i(dst, imm32 & (0xff ), cond);1711orr(dst, dst, imm32 & (0xff << 8 ), cond);1712orr(dst, dst, imm32 & (0xff << 16), cond);1713if(s) orrs(dst, dst, imm32 & (0xff << 24), cond);1714else orr (dst, dst, imm32 & (0xff << 24), cond);1715}1716}17171718#define starti Instruction_aarch32 do_not_use(this); set_current(&do_not_use)1719void Assembler::add_sub_imm(int decode, Register Rd, Register Rn, int imm,1720Condition cond, bool s) {1721int cpart = 0;1722switch(decode) {1723case 0b0100: cpart = 0b0010; break; // ADD -> SUB1724case 0b0010: // SUB -> ADD1725case 0b0011: cpart = 0b0100; break; // RSB -> ADD1726case 0b0101: cpart = 0b0110; break; // ADC -> SUBC1727case 0b0110: // SUBC -> ADC1728case 0b0111: cpart = 0b0101; break; // RSC -> ADC1729default: ShouldNotReachHere();1730}1731//try both possible imm_instrs1732if(imm_instr(decode, Rd, Rn, imm, cond, s)) return;1733if(imm_instr(cpart, Rd, Rn, -imm, cond, s)) return;17341735//Try plan B - a mov first - need to have destination that is not an arg1736assert(Rd != Rn, "Can't use imm and can't do a mov. I'm in a jam.");1737mov_immediate(Rd, (uint32_t)uabs(imm), cond, s);1738//Now do the non immediate version - copied from the immediate encodings1739{1740starti;1741reg_instr( imm < 0 ? cpart : decode, lsl(), cond, s);1742rf(Rn, 16), rf(Rd, 12), rf(Rd, 0);1743}1744}17451746void Assembler::vmov_imm(FloatRegister Rd, unsigned imm, bool is64bit,1747Condition cond) {1748starti;1749fp_instr_base(is64bit, cond);1750f(0b1011, 23, 20);1751// double register passed (see 'd0'-'dN' encoding), not reencode it's number1752fp_rencode(Rd, false, 12, 22);1753f(0b0000, 7, 4);1754f(imm & 0xf, 3, 0);1755f(imm >> 4, 19, 16);1756}17571758void Assembler::vmov_imm_zero(FloatRegister Rd, bool is64bit,1759Condition cond) {1760// Note that this is not a floating point vmov but instead1761// an integer vmov from the SIMD instructions.1762// cannot be conditional.1763assert(operand_valid_for_double_immediate(0), "operand should be valid for immediate");1764assert(is64bit, "SIMD loading available only for double registers");1765assert(cond == C_DFLT, "Unable to vmov #0 conditionally");1766//int cmod = is64bit? 0b1110 : 0b0000; // ? I64 : I321767int cmod = 0b1110;1768{1769starti;1770f(0b1111001, 31, 25);1771f(0, 24); // imm11772f(0b10000, 23, 19);1773// double register passed (see 'd0'-'dN' encoding), not reencode it's number1774fp_rencode(Rd, false, 12, 22);1775f(0b000, 18, 16); //imm31776f(cmod, 11, 8);1777f(0b00, 7, 6);1778f(is64bit, 5);1779f(1, 4);1780f(0b0000, 3, 0); //imm41781}1782}17831784bool Assembler::operand_valid_for_float_immediate(float v) {1785if (!(VM_Version::features() & FT_VFPV3)) {1786return false;1787}1788union ufloat {1789float f;1790uint32_t u;1791} imm;1792unsigned tmp;1793imm.f = v;17941795if (imm.u & ((1 << 19) - 1))1796return false;17971798tmp = (imm.u >> 25) & ((1 << 6) - 1);1799return tmp == 32 || tmp == 31;1800}18011802bool Assembler::operand_valid_for_double_immediate(double v) {1803if (!(VM_Version::features() & FT_VFPV3)) {1804return false;1805}1806union ufloat {1807double f;1808uint64_t u;1809} imm;1810unsigned tmp;1811imm.f = v;18121813if ((VM_Version::features() & FT_AdvSIMD) && imm.u == 0)1814return true;18151816if (imm.u & (uint64_t) 0xffffffffffffLL)1817return false;18181819imm.u >>= 48;18201821tmp = (imm.u >> 6) & ((1 << 9) - 1);1822return tmp == 0x100 || tmp == 0xff;1823}18241825unsigned Assembler::encode_float_fp_imm(float imm_f) {1826assert(operand_valid_for_float_immediate(imm_f), "operand should be valid for immediate");1827union ufloat {1828float f;1829uint32_t u;1830} imm;1831unsigned tmp, imm8;1832imm.f = imm_f;18331834assert(!(imm.u & ((1 << 19) - 1)), "Invalid float imm");1835tmp = (imm.u >> 25) & ((1 << 6) - 1);1836assert(tmp == 32 || tmp == 31, "Invalid float imm");18371838imm8 = (imm.u >> 24) & 0x80; // set a1839imm8 |= (imm.u >> 19) & 0x7F; // set bcdefgh1840return imm8;1841}18421843unsigned Assembler::encode_double_fp_imm(double imm_f) {1844assert(operand_valid_for_double_immediate(imm_f), "operand should be valid for immediate");1845union ufloat {1846double f;1847uint64_t u;1848} imm;1849unsigned tmp, imm8;1850imm.f = imm_f;18511852assert(!(imm.u & (uint64_t)0xffffffffffffLL), "Invalid float imm");1853imm.u >>= 48;18541855tmp = (imm.u >> 6) & ((1 << 9) - 1);1856assert(tmp == 0x100 || tmp == 0xff, "Invalid float imm");18571858imm8 = (imm.u >> 8) & 0x80; // set a1859imm8 |= imm.u & 0x7F; // set bcdefgh1860return imm8;1861}18621863unsigned Assembler::count_bits(unsigned val) {1864unsigned i, count;1865for(i = 0, count = 0; i < 8 * sizeof(val); val >>= 1, i++)1866if( val & 1 ) count++;1867return count;1868}1869bool Assembler::can_ldst_multiple( unsigned regset, const Address& adr) {1870int nbits = count_bits(regset);1871return adr.get_mode() == Address::imm &&1872!(adr.base()->bit() & regset) && // FIXME, this could be relaxed1873(((adr.offset() == 0 || adr.offset() == wordSize || adr.offset() == -nbits * wordSize) &&1874(adr.get_wb_mode() == Address::pre || adr.get_wb_mode() == Address::off)) ||1875((adr.offset() == 0 || adr.offset() == -wordSize || adr.offset() == nbits * wordSize) &&1876adr.get_wb_mode() == Address::post));1877}18781879void Assembler::fp_ldst_instr(int decode, bool is64bit, const Address& adr,1880Condition cond) {1881f(cond, 31, 28), f(0b110, 27, 25), f(decode, 24, 20);1882f(0b101, 11, 9), f(is64bit, 8);1883adr.fp_encode(current, code_section(), pc());1884}18851886void Assembler::fp_ldst_mul(Register Rn, int regset, bool load, bool is64bit,1887enum fp_mode mode, Condition cond) {1888starti;1889bool P = db_wb == mode;1890bool U = ia_wb == mode || ia == mode;1891bool W = ia_wb == mode || db_wb == mode;1892// Encode registers1893unsigned i, fp_first_reg, nregs = 1;1894bool enc_z = false;1895for(fp_first_reg = 0; !(regset & 1); regset >>= 1, fp_first_reg++);1896FloatRegister Rd = (FloatRegister) fp_first_reg;1897for(i = 0; i + fp_first_reg < 8 * sizeof(int); i++) {1898regset >>= 1;1899if(regset & 1) {1900assert(!enc_z, "Unable to encode non-consecutive registers in fp_ldst_mul");1901nregs++;1902} else {1903enc_z = true;1904}1905}1906assert(!is64bit || nregs <= 16, "Too many registers in a set");1907f(cond, 31, 28), f(0b110, 27, 25); f(P, 24), f(U, 23), f(W, 21), f(load, 20);1908// vstm/vstm uses double register number, not it's encoding. Should reencode it.1909rf(Rn, 16), fp_rencode(Rd, is64bit, 12, 22), f(0b101, 11, 9), f(is64bit, 8);1910f(is64bit ? nregs * 2 : nregs, 7, 0);1911}19121913void Assembler::simd_ld(FloatRegister Rd, unsigned type, unsigned size, unsigned num_regs,1914const Address &addr, enum SIMD_Align align) {1915starti;1916assert(addr.get_mode() == Address::imm &&1917(addr.get_wb_mode() == Address::off && addr.offset() == 0) ||1918(addr.get_wb_mode() == Address::post && addr.offset() == long(8*num_regs)), "Unsupported");1919assert(VM_Version::features() & FT_AdvSIMD, "SIMD coprocessor required");1920if (addr.get_wb_mode() == Address::post)1921f(0b1111, 31, 28), f(0b0100, 27, 24), f(0, 23), f(0b10, 21, 20);1922rf(addr.base(), 16), fp_rencode(Rd, false, 12, 22), f(type, 11, 8), f(size, 7, 6);1923f((unsigned)align, 5, 4), f(addr.get_wb_mode() == Address::post ? 0b1101 : 0b1111, 3, 0);1924}19251926void Assembler::simd_vmov(FloatRegister Dd, unsigned index, Register Rt, bool advsimd,1927unsigned index_bits, unsigned bit20, unsigned opc, Condition cond) {1928starti;1929assert(index < (1u<<index_bits), "Illegal element index");1930assert(!advsimd || (VM_Version::features() & FT_AdvSIMD), "SIMD coprocessor required");1931opc |= index << (3 - index_bits);1932f(cond, 31, 28), f(0b1110, 27, 24), f((opc>>2)&3, 22, 21), f(bit20, 20);1933fp_rencode(Dd, false, 16, 7), f(opc>>4, 23);1934rf(Rt, 12), f(0b1011, 11, 8), f(opc & 3, 6, 5), f(0b10000, 4, 0);1935}19361937void Assembler::simd_eor(FloatRegister Dd, FloatRegister Dn, FloatRegister Dm, unsigned q) {1938starti;1939assert(VM_Version::features() & FT_AdvSIMD, "SIMD coprocessor required");1940assert(!q || ((Dd->encoding() & 2) == 0 && (Dm->encoding() & 2) == 0), "Odd registers");1941f(0b111100110, 31, 23), f(0b00, 21, 20), fp_rencode(Dd, false, 12, 22);1942fp_rencode(Dn, false, 16, 7), f(0b0001, 11, 8), fp_rencode(Dm, false, 0, 5), f(q, 6), f(1, 4);1943}19441945void Assembler::simd_vmul(FloatRegister Dd, FloatRegister Dn, FloatRegister Dm,1946unsigned bit24, unsigned bit9, unsigned size, unsigned mul, unsigned bit6) {1947starti;1948assert(VM_Version::features() & FT_AdvSIMD, "SIMD coprocessor required");1949f(0b1111001, 31, 25), f(bit24, 24), f(size, 21, 20), fp_rencode(Dd, false, 12, 22);1950f(mul^1, 23), fp_rencode(Dn, false, 16, 7), f(1, 11), f(mul^1, 10), f(bit9, 9);1951f(mul, 8), f(bit6, 6), f(mul, 4), fp_rencode(Dm, false, 0, 5);1952}19531954void Assembler::simd_vuzp(FloatRegister Dd, FloatRegister Dm, unsigned size, unsigned q) {1955starti;1956assert(VM_Version::features() & FT_AdvSIMD, "SIMD coprocessor required");1957assert(!q || ((Dd->encoding() & 2) == 0 && (Dm->encoding() & 2) == 0), "Odd registers");1958f(0b111100111, 31, 23), fp_rencode(Dd, false, 12, 22), f(0b11, 21, 20), f(size, 19, 18);1959f(0b10, 17, 16), f(0b00010, 11, 7), f(q, 6), f(0, 4), fp_rencode(Dm, false, 0, 5);1960}19611962void Assembler::simd_vshl(FloatRegister Dd, FloatRegister Dm, unsigned imm, unsigned size,1963unsigned q, unsigned bit24, unsigned encode) {1964starti;1965assert(VM_Version::features() & FT_AdvSIMD, "SIMD coprocessor required");1966assert(imm < (1u << size), "Shift is too big");1967assert(!q || ((Dd->encoding() & 2) == 0 && (Dm->encoding() & 2) == 0), "Odd registers");1968f(0b1111001, 31, 25), f(bit24, 24), f(1, 23), fp_rencode(Dd, false, 12, 22);1969f(((1u << size) | imm) & 0b111111, 21, 16), f(size == 6 ? 1 : 0, 7), f(q, 6);1970f(encode, 11, 8), fp_rencode(Dm, false, 0, 5), f(1, 4);1971}19721973void Assembler::simd_rev(FloatRegister Dd, FloatRegister Dm, unsigned q, unsigned size,1974unsigned op) {1975starti;1976assert(!q || ((Dd->encoding() & 2) == 0 && (Dm->encoding() & 2) == 0), "Odd registers");1977f(0b111100111, 31, 23), fp_rencode(Dd, false, 12, 22), f(0b11, 21, 20);1978f(size, 19, 18), f(0b00, 17, 16), f(0b000, 11, 9), f(op, 8, 7);1979f(q, 6), fp_rencode(Dm, false, 0, 5), f(0, 4);1980}19811982void Assembler::v8_crc32(Register Rd, Register Rn, Register Rm, unsigned size, Condition cond) {1983starti;1984assert(VM_Version::features() & FT_CRC32, "Instruction is not supported by CPU");1985f(cond, 31, 28), f(0b00010, 27, 23), f(size, 22, 21), f(0, 20), rf(Rn, 16), rf(Rd, 12);1986f(0b00000100, 11, 4), rf(Rm, 0);1987}19881989#undef starti199019911992