assembler_arm32.h revision d56376cce54e7df976780ecbd03228f60d276433
165fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison/*
265fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison * Copyright (C) 2014 The Android Open Source Project
365fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison *
465fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison * Licensed under the Apache License, Version 2.0 (the "License");
565fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison * you may not use this file except in compliance with the License.
665fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison * You may obtain a copy of the License at
765fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison *
865fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison *      http://www.apache.org/licenses/LICENSE-2.0
965fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison *
1065fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison * Unless required by applicable law or agreed to in writing, software
1165fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison * distributed under the License is distributed on an "AS IS" BASIS,
1265fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1365fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison * See the License for the specific language governing permissions and
1465fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison * limitations under the License.
1565fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison */
1665fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
1765fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison#ifndef ART_COMPILER_UTILS_ARM_ASSEMBLER_ARM32_H_
1865fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison#define ART_COMPILER_UTILS_ARM_ASSEMBLER_ARM32_H_
1965fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
2065fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison#include <vector>
2165fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
2265fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison#include "base/logging.h"
2365fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison#include "constants_arm.h"
2465fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison#include "utils/arm/managed_register_arm.h"
2565fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison#include "utils/arm/assembler_arm.h"
2665fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison#include "offsets.h"
2765fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison#include "utils.h"
2865fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
2965fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allisonnamespace art {
3065fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allisonnamespace arm {
3165fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
3265fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allisonclass Arm32Assembler FINAL : public ArmAssembler {
3365fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison public:
3465fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  Arm32Assembler() {
3565fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  }
3665fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  virtual ~Arm32Assembler() {}
3765fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
3865fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  bool IsThumb() const OVERRIDE {
3965fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison    return false;
4065fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  }
4165fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
4265fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  // Data-processing instructions.
4365fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  void and_(Register rd, Register rn, const ShifterOperand& so, Condition cond = AL) OVERRIDE;
4465fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
4565fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  void eor(Register rd, Register rn, const ShifterOperand& so, Condition cond = AL) OVERRIDE;
4665fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
4765fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  void sub(Register rd, Register rn, const ShifterOperand& so, Condition cond = AL) OVERRIDE;
4865fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  void subs(Register rd, Register rn, const ShifterOperand& so, Condition cond = AL) OVERRIDE;
4965fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
5065fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  void rsb(Register rd, Register rn, const ShifterOperand& so, Condition cond = AL) OVERRIDE;
5165fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  void rsbs(Register rd, Register rn, const ShifterOperand& so, Condition cond = AL) OVERRIDE;
5265fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
5365fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  void add(Register rd, Register rn, const ShifterOperand& so, Condition cond = AL) OVERRIDE;
5465fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
5565fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  void adds(Register rd, Register rn, const ShifterOperand& so, Condition cond = AL) OVERRIDE;
5665fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
5765fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  void adc(Register rd, Register rn, const ShifterOperand& so, Condition cond = AL) OVERRIDE;
5865fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
5965fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  void sbc(Register rd, Register rn, const ShifterOperand& so, Condition cond = AL) OVERRIDE;
6065fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
6165fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  void rsc(Register rd, Register rn, const ShifterOperand& so, Condition cond = AL) OVERRIDE;
6265fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
6365fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  void tst(Register rn, const ShifterOperand& so, Condition cond = AL) OVERRIDE;
6465fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
6565fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  void teq(Register rn, const ShifterOperand& so, Condition cond = AL) OVERRIDE;
6665fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
6765fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  void cmp(Register rn, const ShifterOperand& so, Condition cond = AL) OVERRIDE;
6865fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
6965fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  void cmn(Register rn, const ShifterOperand& so, Condition cond = AL) OVERRIDE;
7065fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
7165fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  void orr(Register rd, Register rn, const ShifterOperand& so, Condition cond = AL) OVERRIDE;
7265fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  void orrs(Register rd, Register rn, const ShifterOperand& so, Condition cond = AL) OVERRIDE;
7365fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
7465fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  void mov(Register rd, const ShifterOperand& so, Condition cond = AL) OVERRIDE;
7565fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  void movs(Register rd, const ShifterOperand& so, Condition cond = AL) OVERRIDE;
7665fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
7765fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  void bic(Register rd, Register rn, const ShifterOperand& so, Condition cond = AL) OVERRIDE;
7865fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
7965fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  void mvn(Register rd, const ShifterOperand& so, Condition cond = AL) OVERRIDE;
8065fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  void mvns(Register rd, const ShifterOperand& so, Condition cond = AL) OVERRIDE;
8165fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
8265fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  // Miscellaneous data-processing instructions.
8365fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  void clz(Register rd, Register rm, Condition cond = AL) OVERRIDE;
8465fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  void movw(Register rd, uint16_t imm16, Condition cond = AL) OVERRIDE;
8565fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  void movt(Register rd, uint16_t imm16, Condition cond = AL) OVERRIDE;
8665fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
8765fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  // Multiply instructions.
8865fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  void mul(Register rd, Register rn, Register rm, Condition cond = AL) OVERRIDE;
8965fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  void mla(Register rd, Register rn, Register rm, Register ra,
9065fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison           Condition cond = AL) OVERRIDE;
9165fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  void mls(Register rd, Register rn, Register rm, Register ra,
9265fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison           Condition cond = AL) OVERRIDE;
93c66671076b12a0ee8b9d1ae782732cc91beacb73Zheng Xu  void smull(Register rd_lo, Register rd_hi, Register rn, Register rm,
94c66671076b12a0ee8b9d1ae782732cc91beacb73Zheng Xu             Condition cond = AL) OVERRIDE;
9565fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  void umull(Register rd_lo, Register rd_hi, Register rn, Register rm,
9665fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison             Condition cond = AL) OVERRIDE;
9765fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
9865fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  void sdiv(Register rd, Register rn, Register rm, Condition cond = AL) OVERRIDE;
9965fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  void udiv(Register rd, Register rn, Register rm, Condition cond = AL) OVERRIDE;
10065fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
101981e45424f52735b1c61ae0eac7e299ed313f8dbRoland Levillain  // Bit field extract instructions.
10251d3fc40637fc73d4156ad617cd451b844cbb75eRoland Levillain  void sbfx(Register rd, Register rn, uint32_t lsb, uint32_t width, Condition cond = AL) OVERRIDE;
103981e45424f52735b1c61ae0eac7e299ed313f8dbRoland Levillain  void ubfx(Register rd, Register rn, uint32_t lsb, uint32_t width, Condition cond = AL) OVERRIDE;
10451d3fc40637fc73d4156ad617cd451b844cbb75eRoland Levillain
10565fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  // Load/store instructions.
10665fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  void ldr(Register rd, const Address& ad, Condition cond = AL) OVERRIDE;
10765fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  void str(Register rd, const Address& ad, Condition cond = AL) OVERRIDE;
10865fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
10965fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  void ldrb(Register rd, const Address& ad, Condition cond = AL) OVERRIDE;
11065fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  void strb(Register rd, const Address& ad, Condition cond = AL) OVERRIDE;
11165fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
11265fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  void ldrh(Register rd, const Address& ad, Condition cond = AL) OVERRIDE;
11365fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  void strh(Register rd, const Address& ad, Condition cond = AL) OVERRIDE;
11465fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
11565fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  void ldrsb(Register rd, const Address& ad, Condition cond = AL) OVERRIDE;
11665fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  void ldrsh(Register rd, const Address& ad, Condition cond = AL) OVERRIDE;
11765fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
11865fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  void ldrd(Register rd, const Address& ad, Condition cond = AL) OVERRIDE;
11965fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  void strd(Register rd, const Address& ad, Condition cond = AL) OVERRIDE;
12065fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
12165fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  void ldm(BlockAddressMode am, Register base,
12265fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison           RegList regs, Condition cond = AL) OVERRIDE;
12365fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  void stm(BlockAddressMode am, Register base,
12465fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison           RegList regs, Condition cond = AL) OVERRIDE;
12565fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
12665fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  void ldrex(Register rd, Register rn, Condition cond = AL) OVERRIDE;
12765fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  void strex(Register rd, Register rt, Register rn, Condition cond = AL) OVERRIDE;
12852c489645b6e9ae33623f1ec24143cde5444906eCalin Juravle  void ldrexd(Register rt, Register rt2, Register rn, Condition cond = AL) OVERRIDE;
12952c489645b6e9ae33623f1ec24143cde5444906eCalin Juravle  void strexd(Register rd, Register rt, Register rt2, Register rn, Condition cond = AL) OVERRIDE;
13065fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
13165fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  // Miscellaneous instructions.
13265fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  void clrex(Condition cond = AL) OVERRIDE;
13365fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  void nop(Condition cond = AL) OVERRIDE;
13465fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
13565fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  // Note that gdb sets breakpoints using the undefined instruction 0xe7f001f0.
13665fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  void bkpt(uint16_t imm16) OVERRIDE;
13765fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  void svc(uint32_t imm24) OVERRIDE;
13865fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
13965fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  void cbz(Register rn, Label* target) OVERRIDE;
14065fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  void cbnz(Register rn, Label* target) OVERRIDE;
14165fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
14265fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  // Floating point instructions (VFPv3-D16 and VFPv3-D32 profiles).
14365fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  void vmovsr(SRegister sn, Register rt, Condition cond = AL) OVERRIDE;
14465fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  void vmovrs(Register rt, SRegister sn, Condition cond = AL) OVERRIDE;
14565fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  void vmovsrr(SRegister sm, Register rt, Register rt2, Condition cond = AL) OVERRIDE;
14665fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  void vmovrrs(Register rt, Register rt2, SRegister sm, Condition cond = AL) OVERRIDE;
14765fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  void vmovdrr(DRegister dm, Register rt, Register rt2, Condition cond = AL) OVERRIDE;
14865fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  void vmovrrd(Register rt, Register rt2, DRegister dm, Condition cond = AL) OVERRIDE;
14965fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  void vmovs(SRegister sd, SRegister sm, Condition cond = AL) OVERRIDE;
15065fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  void vmovd(DRegister dd, DRegister dm, Condition cond = AL) OVERRIDE;
15165fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
15265fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  // Returns false if the immediate cannot be encoded.
15365fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  bool vmovs(SRegister sd, float s_imm, Condition cond = AL) OVERRIDE;
15465fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  bool vmovd(DRegister dd, double d_imm, Condition cond = AL) OVERRIDE;
15565fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
15665fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  void vldrs(SRegister sd, const Address& ad, Condition cond = AL) OVERRIDE;
15765fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  void vstrs(SRegister sd, const Address& ad, Condition cond = AL) OVERRIDE;
15865fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  void vldrd(DRegister dd, const Address& ad, Condition cond = AL) OVERRIDE;
15965fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  void vstrd(DRegister dd, const Address& ad, Condition cond = AL) OVERRIDE;
16065fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
16165fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  void vadds(SRegister sd, SRegister sn, SRegister sm, Condition cond = AL) OVERRIDE;
16265fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  void vaddd(DRegister dd, DRegister dn, DRegister dm, Condition cond = AL) OVERRIDE;
16365fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  void vsubs(SRegister sd, SRegister sn, SRegister sm, Condition cond = AL) OVERRIDE;
16465fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  void vsubd(DRegister dd, DRegister dn, DRegister dm, Condition cond = AL) OVERRIDE;
16565fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  void vmuls(SRegister sd, SRegister sn, SRegister sm, Condition cond = AL) OVERRIDE;
16665fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  void vmuld(DRegister dd, DRegister dn, DRegister dm, Condition cond = AL) OVERRIDE;
16765fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  void vmlas(SRegister sd, SRegister sn, SRegister sm, Condition cond = AL) OVERRIDE;
16865fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  void vmlad(DRegister dd, DRegister dn, DRegister dm, Condition cond = AL) OVERRIDE;
16965fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  void vmlss(SRegister sd, SRegister sn, SRegister sm, Condition cond = AL) OVERRIDE;
17065fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  void vmlsd(DRegister dd, DRegister dn, DRegister dm, Condition cond = AL) OVERRIDE;
17165fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  void vdivs(SRegister sd, SRegister sn, SRegister sm, Condition cond = AL) OVERRIDE;
17265fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  void vdivd(DRegister dd, DRegister dn, DRegister dm, Condition cond = AL) OVERRIDE;
17365fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
17465fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  void vabss(SRegister sd, SRegister sm, Condition cond = AL) OVERRIDE;
17565fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  void vabsd(DRegister dd, DRegister dm, Condition cond = AL) OVERRIDE;
17665fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  void vnegs(SRegister sd, SRegister sm, Condition cond = AL) OVERRIDE;
17765fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  void vnegd(DRegister dd, DRegister dm, Condition cond = AL) OVERRIDE;
17865fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  void vsqrts(SRegister sd, SRegister sm, Condition cond = AL) OVERRIDE;
17965fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  void vsqrtd(DRegister dd, DRegister dm, Condition cond = AL) OVERRIDE;
18065fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
18165fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  void vcvtsd(SRegister sd, DRegister dm, Condition cond = AL) OVERRIDE;
18265fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  void vcvtds(DRegister dd, SRegister sm, Condition cond = AL) OVERRIDE;
18365fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  void vcvtis(SRegister sd, SRegister sm, Condition cond = AL) OVERRIDE;
18465fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  void vcvtid(SRegister sd, DRegister dm, Condition cond = AL) OVERRIDE;
18565fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  void vcvtsi(SRegister sd, SRegister sm, Condition cond = AL) OVERRIDE;
18665fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  void vcvtdi(DRegister dd, SRegister sm, Condition cond = AL) OVERRIDE;
18765fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  void vcvtus(SRegister sd, SRegister sm, Condition cond = AL) OVERRIDE;
18865fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  void vcvtud(SRegister sd, DRegister dm, Condition cond = AL) OVERRIDE;
18965fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  void vcvtsu(SRegister sd, SRegister sm, Condition cond = AL) OVERRIDE;
19065fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  void vcvtdu(DRegister dd, SRegister sm, Condition cond = AL) OVERRIDE;
19165fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
19265fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  void vcmps(SRegister sd, SRegister sm, Condition cond = AL) OVERRIDE;
19365fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  void vcmpd(DRegister dd, DRegister dm, Condition cond = AL) OVERRIDE;
19465fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  void vcmpsz(SRegister sd, Condition cond = AL) OVERRIDE;
19565fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  void vcmpdz(DRegister dd, Condition cond = AL) OVERRIDE;
19665fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  void vmstat(Condition cond = AL) OVERRIDE;  // VMRS APSR_nzcv, FPSCR
19765fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
19865fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  void vpushs(SRegister reg, int nregs, Condition cond = AL) OVERRIDE;
19965fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  void vpushd(DRegister reg, int nregs, Condition cond = AL) OVERRIDE;
20065fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  void vpops(SRegister reg, int nregs, Condition cond = AL) OVERRIDE;
20165fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  void vpopd(DRegister reg, int nregs, Condition cond = AL) OVERRIDE;
20265fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
20365fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  // Branch instructions.
204d56376cce54e7df976780ecbd03228f60d276433Nicolas Geoffray  void b(Label* label, Condition cond = AL) OVERRIDE;
205d56376cce54e7df976780ecbd03228f60d276433Nicolas Geoffray  void bl(Label* label, Condition cond = AL) OVERRIDE;
20665fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  void blx(Register rm, Condition cond = AL) OVERRIDE;
20765fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  void bx(Register rm, Condition cond = AL) OVERRIDE;
20845fdb93f04b981f70f7b6d98949ab3986b7331f8Dave Allison  void Lsl(Register rd, Register rm, uint32_t shift_imm, bool setcc = false,
20945fdb93f04b981f70f7b6d98949ab3986b7331f8Dave Allison           Condition cond = AL) OVERRIDE;
21045fdb93f04b981f70f7b6d98949ab3986b7331f8Dave Allison  void Lsr(Register rd, Register rm, uint32_t shift_imm, bool setcc = false,
21145fdb93f04b981f70f7b6d98949ab3986b7331f8Dave Allison           Condition cond = AL) OVERRIDE;
21245fdb93f04b981f70f7b6d98949ab3986b7331f8Dave Allison  void Asr(Register rd, Register rm, uint32_t shift_imm, bool setcc = false,
21345fdb93f04b981f70f7b6d98949ab3986b7331f8Dave Allison           Condition cond = AL) OVERRIDE;
21445fdb93f04b981f70f7b6d98949ab3986b7331f8Dave Allison  void Ror(Register rd, Register rm, uint32_t shift_imm, bool setcc = false,
21545fdb93f04b981f70f7b6d98949ab3986b7331f8Dave Allison           Condition cond = AL) OVERRIDE;
21645fdb93f04b981f70f7b6d98949ab3986b7331f8Dave Allison  void Rrx(Register rd, Register rm, bool setcc = false,
21745fdb93f04b981f70f7b6d98949ab3986b7331f8Dave Allison           Condition cond = AL) OVERRIDE;
21845fdb93f04b981f70f7b6d98949ab3986b7331f8Dave Allison
21945fdb93f04b981f70f7b6d98949ab3986b7331f8Dave Allison  void Lsl(Register rd, Register rm, Register rn, bool setcc = false,
22045fdb93f04b981f70f7b6d98949ab3986b7331f8Dave Allison           Condition cond = AL) OVERRIDE;
22145fdb93f04b981f70f7b6d98949ab3986b7331f8Dave Allison  void Lsr(Register rd, Register rm, Register rn, bool setcc = false,
22245fdb93f04b981f70f7b6d98949ab3986b7331f8Dave Allison           Condition cond = AL) OVERRIDE;
22345fdb93f04b981f70f7b6d98949ab3986b7331f8Dave Allison  void Asr(Register rd, Register rm, Register rn, bool setcc = false,
22445fdb93f04b981f70f7b6d98949ab3986b7331f8Dave Allison           Condition cond = AL) OVERRIDE;
22545fdb93f04b981f70f7b6d98949ab3986b7331f8Dave Allison  void Ror(Register rd, Register rm, Register rn, bool setcc = false,
22645fdb93f04b981f70f7b6d98949ab3986b7331f8Dave Allison           Condition cond = AL) OVERRIDE;
22765fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
22865fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  void Push(Register rd, Condition cond = AL) OVERRIDE;
22965fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  void Pop(Register rd, Condition cond = AL) OVERRIDE;
23065fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
23165fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  void PushList(RegList regs, Condition cond = AL) OVERRIDE;
23265fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  void PopList(RegList regs, Condition cond = AL) OVERRIDE;
23365fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
23465fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  void Mov(Register rd, Register rm, Condition cond = AL) OVERRIDE;
23565fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
23665fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  void CompareAndBranchIfZero(Register r, Label* label) OVERRIDE;
23765fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  void CompareAndBranchIfNonZero(Register r, Label* label) OVERRIDE;
23865fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
23919a19cffd197a28ae4c9c3e59eff6352fd392241Nicolas Geoffray  // Memory barriers.
24019a19cffd197a28ae4c9c3e59eff6352fd392241Nicolas Geoffray  void dmb(DmbOptions flavor) OVERRIDE;
24165fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
24265fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  // Macros.
24365fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  // Add signed constant value to rd. May clobber IP.
24465fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  void AddConstant(Register rd, int32_t value, Condition cond = AL) OVERRIDE;
24565fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  void AddConstant(Register rd, Register rn, int32_t value,
24665fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison                   Condition cond = AL) OVERRIDE;
24765fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  void AddConstantSetFlags(Register rd, Register rn, int32_t value,
24865fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison                           Condition cond = AL) OVERRIDE;
24965fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
25065fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  // Load and Store. May clobber IP.
25165fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  void LoadImmediate(Register rd, int32_t value, Condition cond = AL) OVERRIDE;
25265fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  void MarkExceptionHandler(Label* label) OVERRIDE;
25365fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  void LoadFromOffset(LoadOperandType type,
25465fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison                      Register reg,
25565fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison                      Register base,
25665fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison                      int32_t offset,
25765fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison                      Condition cond = AL) OVERRIDE;
25865fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  void StoreToOffset(StoreOperandType type,
25965fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison                     Register reg,
26065fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison                     Register base,
26165fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison                     int32_t offset,
26265fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison                     Condition cond = AL) OVERRIDE;
26365fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  void LoadSFromOffset(SRegister reg,
26465fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison                       Register base,
26565fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison                       int32_t offset,
26665fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison                       Condition cond = AL) OVERRIDE;
26765fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  void StoreSToOffset(SRegister reg,
26865fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison                      Register base,
26965fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison                      int32_t offset,
27065fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison                      Condition cond = AL) OVERRIDE;
27165fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  void LoadDFromOffset(DRegister reg,
27265fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison                       Register base,
27365fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison                       int32_t offset,
27465fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison                       Condition cond = AL) OVERRIDE;
27565fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  void StoreDToOffset(DRegister reg,
27665fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison                      Register base,
27765fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison                      int32_t offset,
27865fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison                      Condition cond = AL) OVERRIDE;
27965fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
2803bcc8ea079d867f26622defd0611d134a3b4ae49Nicolas Geoffray  bool ShifterOperandCanHold(Register rd,
2813bcc8ea079d867f26622defd0611d134a3b4ae49Nicolas Geoffray                             Register rn,
2823bcc8ea079d867f26622defd0611d134a3b4ae49Nicolas Geoffray                             Opcode opcode,
2833bcc8ea079d867f26622defd0611d134a3b4ae49Nicolas Geoffray                             uint32_t immediate,
2843bcc8ea079d867f26622defd0611d134a3b4ae49Nicolas Geoffray                             ShifterOperand* shifter_op) OVERRIDE;
2853bcc8ea079d867f26622defd0611d134a3b4ae49Nicolas Geoffray
28665fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
28713735955f39b3b304c37d2b2840663c131262c18Ian Rogers  static bool IsInstructionForExceptionHandling(uintptr_t pc);
28865fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
28965fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  // Emit data (e.g. encoded instruction or immediate) to the
29065fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  // instruction stream.
29165fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  void Emit(int32_t value);
29265fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  void Bind(Label* label) OVERRIDE;
29365fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
29465fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  void MemoryBarrier(ManagedRegister scratch) OVERRIDE;
29565fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
29665fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison private:
29765fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  void EmitType01(Condition cond,
29865fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison                  int type,
29965fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison                  Opcode opcode,
30065fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison                  int set_cc,
30165fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison                  Register rn,
30265fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison                  Register rd,
30365fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison                  const ShifterOperand& so);
30465fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
30565fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  void EmitType5(Condition cond, int offset, bool link);
30665fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
30765fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  void EmitMemOp(Condition cond,
30865fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison                 bool load,
30965fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison                 bool byte,
31065fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison                 Register rd,
31165fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison                 const Address& ad);
31265fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
31365fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  void EmitMemOpAddressMode3(Condition cond,
31465fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison                             int32_t mode,
31565fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison                             Register rd,
31665fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison                             const Address& ad);
31765fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
31865fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  void EmitMultiMemOp(Condition cond,
31965fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison                      BlockAddressMode am,
32065fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison                      bool load,
32165fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison                      Register base,
32265fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison                      RegList regs);
32365fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
32465fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  void EmitShiftImmediate(Condition cond,
32565fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison                          Shift opcode,
32665fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison                          Register rd,
32765fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison                          Register rm,
32865fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison                          const ShifterOperand& so);
32965fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
33065fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  void EmitShiftRegister(Condition cond,
33165fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison                         Shift opcode,
33265fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison                         Register rd,
33365fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison                         Register rm,
33465fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison                         const ShifterOperand& so);
33565fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
33665fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  void EmitMulOp(Condition cond,
33765fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison                 int32_t opcode,
33865fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison                 Register rd,
33965fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison                 Register rn,
34065fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison                 Register rm,
34165fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison                 Register rs);
34265fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
34365fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  void EmitVFPsss(Condition cond,
34465fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison                  int32_t opcode,
34565fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison                  SRegister sd,
34665fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison                  SRegister sn,
34765fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison                  SRegister sm);
34865fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
34965fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  void EmitVFPddd(Condition cond,
35065fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison                  int32_t opcode,
35165fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison                  DRegister dd,
35265fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison                  DRegister dn,
35365fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison                  DRegister dm);
35465fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
35565fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  void EmitVFPsd(Condition cond,
35665fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison                 int32_t opcode,
35765fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison                 SRegister sd,
35865fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison                 DRegister dm);
35965fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
36065fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  void EmitVFPds(Condition cond,
36165fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison                 int32_t opcode,
36265fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison                 DRegister dd,
36365fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison                 SRegister sm);
36465fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
36565fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  void EmitVPushPop(uint32_t reg, int nregs, bool push, bool dbl, Condition cond);
36665fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
36765fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  void EmitBranch(Condition cond, Label* label, bool link);
36865fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  static int32_t EncodeBranchOffset(int offset, int32_t inst);
36965fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  static int DecodeBranchOffset(int32_t inst);
37065fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  int32_t EncodeTstOffset(int offset, int32_t inst);
37165fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison  int DecodeTstOffset(int32_t inst);
3723bcc8ea079d867f26622defd0611d134a3b4ae49Nicolas Geoffray  bool ShifterOperandCanHoldArm32(uint32_t immediate, ShifterOperand* shifter_op);
37365fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison};
37465fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
37565fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison}  // namespace arm
37665fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison}  // namespace art
37765fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison
37865fcc2cf3c5cd97b84330c094908f3a6a7a8d4e7Dave Allison#endif  // ART_COMPILER_UTILS_ARM_ASSEMBLER_ARM32_H_
379