< prev index next >
src/hotspot/cpu/aarch64/assembler_aarch64.cpp
Print this page
8248238: Adding Windows support to OpenJDK on AArch64
Summary: LP64 vs LLP64 changes to add Windows support
Contributed-by: Monica Beckwith <monica.beckwith@microsoft.com>, Ludovic Henry <luhenry@microsoft.com>
Reviewed-by:
8248238: Adding Windows support to OpenJDK on AArch64
Summary: Adding Windows support for AArch64
Contributed-by: Ludovic Henry <luhenry@microsoft.com>, Monica Beckwith <monica.beckwith@microsoft.com>
Reviewed-by:
*** 29,39 ****
#include "asm/assembler.hpp"
#include "asm/assembler.inline.hpp"
#include "interpreter/interpreter.hpp"
#ifndef PRODUCT
! const unsigned long Assembler::asm_bp = 0x00007fffee09ac88;
#endif
#include "compiler/disassembler.hpp"
#include "memory/resourceArea.hpp"
#include "runtime/interfaceSupport.inline.hpp"
--- 29,39 ----
#include "asm/assembler.hpp"
#include "asm/assembler.inline.hpp"
#include "interpreter/interpreter.hpp"
#ifndef PRODUCT
! const uint64_t Assembler::asm_bp = 0x00007fffee09ac88;
#endif
#include "compiler/disassembler.hpp"
#include "memory/resourceArea.hpp"
#include "runtime/interfaceSupport.inline.hpp"
*** 1491,1501 ****
Disassembler::decode((address)start + len, (address)start);
else
Disassembler::decode((address)start, (address)start + len);
}
! JNIEXPORT void das1(unsigned long insn) {
das(insn, 1);
}
}
#define gas_assert(ARG1) assert(ARG1, #ARG1)
--- 1491,1501 ----
Disassembler::decode((address)start + len, (address)start);
else
Disassembler::decode((address)start, (address)start + len);
}
! JNIEXPORT void das1(uint64_t insn) {
das(insn, 1);
}
}
#define gas_assert(ARG1) assert(ARG1, #ARG1)
*** 1515,1525 ****
else
__ sub(r, _base, -_offset);
break;
}
case base_plus_offset_reg: {
! __ add(r, _base, _index, _ext.op(), MAX(_ext.shift(), 0));
break;
}
case literal: {
if (rtype == relocInfo::none)
__ mov(r, target());
--- 1515,1525 ----
else
__ sub(r, _base, -_offset);
break;
}
case base_plus_offset_reg: {
! __ add(r, _base, _index, _ext.op(), MAX2(_ext.shift(), 0));
break;
}
case literal: {
if (rtype == relocInfo::none)
__ mov(r, target());
*** 1530,1560 ****
default:
ShouldNotReachHere();
}
}
! void Assembler::adrp(Register reg1, const Address &dest, unsigned long &byte_offset) {
ShouldNotReachHere();
}
#undef __
#define starti Instruction_aarch64 do_not_use(this); set_current(&do_not_use)
void Assembler::adr(Register Rd, address adr) {
! long offset = adr - pc();
int offset_lo = offset & 3;
offset >>= 2;
starti;
f(0, 31), f(offset_lo, 30, 29), f(0b10000, 28, 24), sf(offset, 23, 5);
rf(Rd, 0);
}
void Assembler::_adrp(Register Rd, address adr) {
uint64_t pc_page = (uint64_t)pc() >> 12;
uint64_t adr_page = (uint64_t)adr >> 12;
! long offset = adr_page - pc_page;
int offset_lo = offset & 3;
offset >>= 2;
starti;
f(1, 31), f(offset_lo, 30, 29), f(0b10000, 28, 24), sf(offset, 23, 5);
rf(Rd, 0);
--- 1530,1560 ----
default:
ShouldNotReachHere();
}
}
! void Assembler::adrp(Register reg1, const Address &dest, uint64_t &byte_offset) {
ShouldNotReachHere();
}
#undef __
#define starti Instruction_aarch64 do_not_use(this); set_current(&do_not_use)
void Assembler::adr(Register Rd, address adr) {
! int64_t offset = adr - pc();
int offset_lo = offset & 3;
offset >>= 2;
starti;
f(0, 31), f(offset_lo, 30, 29), f(0b10000, 28, 24), sf(offset, 23, 5);
rf(Rd, 0);
}
void Assembler::_adrp(Register Rd, address adr) {
uint64_t pc_page = (uint64_t)pc() >> 12;
uint64_t adr_page = (uint64_t)adr >> 12;
! int64_t offset = adr_page - pc_page;
int offset_lo = offset & 3;
offset >>= 2;
starti;
f(1, 31), f(offset_lo, 30, 29), f(0b10000, 28, 24), sf(offset, 23, 5);
rf(Rd, 0);
*** 1699,1711 ****
srf(Rd, 0);
srf(Rn, 5);
}
! bool Assembler::operand_valid_for_add_sub_immediate(long imm) {
bool shift = false;
! unsigned long uimm = uabs(imm);
if (uimm < (1 << 12))
return true;
if (uimm < (1 << 24)
&& ((uimm >> 12) << 12 == uimm)) {
return true;
--- 1699,1711 ----
srf(Rd, 0);
srf(Rn, 5);
}
! bool Assembler::operand_valid_for_add_sub_immediate(int64_t imm) {
bool shift = false;
! uint64_t uimm = uabs(imm);
if (uimm < (1 << 12))
return true;
if (uimm < (1 << 24)
&& ((uimm >> 12) << 12 == uimm)) {
return true;
*** 1782,1786 ****
--- 1782,1790 ----
float val;
};
ival = fp_immediate_for_encoding(value, 0);
return val;
}
+
+ address Assembler::locate_next_instruction(address inst) {
+ return inst + Assembler::instruction_size;
+ }
< prev index next >