Skip to content

Commit 842d1e8

Browse files
committed
Merge remote-tracking branch 'upstream/master'
2 parents 7665b15 + ba5af9a commit 842d1e8

16 files changed

+928
-839
lines changed

3rdparty/ymfm/src/ymfm_opl.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -243,7 +243,7 @@ class opl_registers_base : public fm_registers_base
243243
uint32_t op_decay_rate(uint32_t opoffs) const { return byte(0x60, 0, 4, opoffs); }
244244
uint32_t op_sustain_level(uint32_t opoffs) const { return byte(0x80, 4, 4, opoffs); }
245245
uint32_t op_release_rate(uint32_t opoffs) const { return byte(0x80, 0, 4, opoffs); }
246-
uint32_t op_waveform(uint32_t opoffs) const { return (IsOpl2Plus && waveform_enable()) ? byte(0xe0, 0, newflag() ? 3 : 2, opoffs) : 0; }
246+
uint32_t op_waveform(uint32_t opoffs) const { return waveform_enable() ? byte(0xe0, 0, newflag() ? 3 : 2, opoffs) : 0; }
247247

248248
protected:
249249
// return a bitfield extracted from a byte

src/devices/cpu/drcbearm64.cpp

+50-62
Original file line numberDiff line numberDiff line change
@@ -196,21 +196,21 @@ class ThrowableErrorHandler : public ErrorHandler
196196

197197
// helper functions
198198

199-
a64::Vec select_register(a64::Vec const &reg, uint32_t regsize)
199+
inline a64::Vec select_register(a64::Vec const &reg, uint32_t regsize)
200200
{
201201
if (regsize == 4)
202202
return reg.s();
203203
return reg.d();
204204
}
205205

206-
a64::Gp select_register(a64::Gp const &reg, uint32_t regsize)
206+
inline a64::Gp select_register(a64::Gp const &reg, uint32_t regsize)
207207
{
208208
if (regsize == 4)
209209
return reg.w();
210210
return reg.x();
211211
}
212212

213-
bool is_valid_immediate_mask(uint64_t val, size_t bytes)
213+
inline bool is_valid_immediate_mask(uint64_t val, size_t bytes)
214214
{
215215
// all zeros and all ones aren't allowed, and disallow any value with bits outside of the max bit range
216216
if (val == 0 || val == make_bitmask<uint64_t>(bytes * 8))
@@ -231,18 +231,28 @@ bool is_valid_immediate_mask(uint64_t val, size_t bytes)
231231
return population_count_64(val) == head - tail;
232232
}
233233

234-
bool is_valid_immediate(uint64_t val, size_t bits)
234+
inline bool is_valid_immediate(uint64_t val, size_t bits)
235235
{
236236
assert(bits < 64);
237237
return val < (uint64_t(1) << bits);
238238
}
239239

240-
bool is_valid_immediate_signed(int64_t val, size_t bits)
240+
inline constexpr bool is_valid_immediate_signed(int64_t val, size_t bits)
241241
{
242242
return util::sext(val, bits) == val;
243243
}
244244

245-
bool emit_add_optimized(a64::Assembler &a, const a64::Gp &dst, const a64::Gp &src, int64_t val)
245+
inline constexpr bool is_valid_offset(int64_t diff, int max_shift)
246+
{
247+
if (is_valid_immediate_signed(diff, 9))
248+
return true; // 9-bit signed offset
249+
else if ((diff >= 0) && (diff < (1 << (12 + max_shift))) && !(diff & make_bitmask<int64_t>(max_shift)))
250+
return true; // 12-bit unsigned offset shifted by operand size
251+
else
252+
return false;
253+
}
254+
255+
inline bool emit_add_optimized(a64::Assembler &a, const a64::Gp &dst, const a64::Gp &src, int64_t val)
246256
{
247257
// If the bottom 12 bits are 0s then an optimized form can be used if the remaining bits are <= 12
248258
if (is_valid_immediate(val, 12) || ((val & 0xfff) == 0 && is_valid_immediate(val >> 12, 12)))
@@ -254,7 +264,7 @@ bool emit_add_optimized(a64::Assembler &a, const a64::Gp &dst, const a64::Gp &sr
254264
return false;
255265
}
256266

257-
bool emit_sub_optimized(a64::Assembler &a, const a64::Gp &dst, const a64::Gp &src, int64_t val)
267+
inline bool emit_sub_optimized(a64::Assembler &a, const a64::Gp &dst, const a64::Gp &src, int64_t val)
258268
{
259269
if (val < 0)
260270
val = -val;
@@ -509,11 +519,11 @@ void drcbe_arm64::get_imm_relative(a64::Assembler &a, const a64::Gp &reg, const
509519
a.mov(reg, val);
510520
}
511521

512-
void drcbe_arm64::emit_ldr_str_base_mem(a64::Assembler &a, a64::Inst::Id opcode, const a64::Reg &reg, const void *ptr) const
522+
inline void drcbe_arm64::emit_ldr_str_base_mem(a64::Assembler &a, a64::Inst::Id opcode, const a64::Reg &reg, int max_shift, const void *ptr) const
513523
{
514-
// If it can fit as a constant offset
524+
// If it can fit as an immediate offset
515525
const int64_t diff = (int64_t)ptr - (int64_t)m_baseptr;
516-
if (is_valid_immediate_signed(diff, 9))
526+
if (is_valid_offset(diff, max_shift))
517527
{
518528
a.emit(opcode, reg, arm::Mem(BASE_REG, diff));
519529
return;
@@ -547,31 +557,30 @@ void drcbe_arm64::emit_ldr_str_base_mem(a64::Assembler &a, a64::Inst::Id opcode,
547557
return;
548558
}
549559

550-
if (diff >= 0)
560+
// If it's in a nearby page
561+
const uint64_t pagebase = codeoffs & ~make_bitmask<uint64_t>(12);
562+
const int64_t pagerel = (int64_t)ptr - pagebase;
563+
if (is_valid_immediate_signed(pagerel, 21 + 12))
551564
{
552-
int shift = 0;
553-
int max_shift = 0;
565+
const uint64_t targetpage = (uint64_t)ptr & ~make_bitmask<uint64_t>(12);
566+
const uint64_t pageoffs = (uint64_t)ptr & util::make_bitmask<uint64_t>(12);
554567

555-
if (opcode == a64::Inst::kIdLdrb || opcode == a64::Inst::kIdLdrsb)
556-
max_shift = 0;
557-
else if (opcode == a64::Inst::kIdLdrh || opcode == a64::Inst::kIdLdrsh)
558-
max_shift = 1;
559-
else if (opcode == a64::Inst::kIdLdrsw)
560-
max_shift = 2;
568+
a.adrp(MEM_SCRATCH_REG, targetpage);
569+
if (is_valid_offset(pageoffs, max_shift))
570+
{
571+
a.emit(opcode, reg, arm::Mem(MEM_SCRATCH_REG, pageoffs));
572+
}
561573
else
562-
max_shift = (reg.isGpW() || reg.isVecS()) ? 2 : 3;
563-
564-
for (int i = 0; i < 64 && max_shift > 0; i++)
565574
{
566-
if ((uint64_t)ptr & ((uint64_t)(1) << i))
567-
{
568-
shift = i;
569-
break;
570-
}
575+
a.add(MEM_SCRATCH_REG, MEM_SCRATCH_REG, pageoffs);
576+
a.emit(opcode, reg, arm::Mem(MEM_SCRATCH_REG));
571577
}
578+
return;
579+
}
572580

573-
if (shift > max_shift)
574-
shift = max_shift;
581+
if (diff >= 0)
582+
{
583+
const int shift = (diff & make_bitmask<int64_t>(max_shift)) ? 0 : max_shift;
575584

576585
if (is_valid_immediate(diff >> shift, 32))
577586
{
@@ -586,44 +595,23 @@ void drcbe_arm64::emit_ldr_str_base_mem(a64::Assembler &a, a64::Inst::Id opcode,
586595
}
587596
}
588597

589-
const uint64_t pagebase = codeoffs & ~make_bitmask<uint64_t>(12);
590-
const int64_t pagerel = (int64_t)ptr - pagebase;
591-
if (is_valid_immediate_signed(pagerel, 21 + 12))
592-
{
593-
const uint64_t targetpage = (uint64_t)ptr & ~make_bitmask<uint64_t>(12);
594-
const uint64_t pageoffs = (uint64_t)ptr & util::make_bitmask<uint64_t>(12);
595-
596-
a.adrp(MEM_SCRATCH_REG, targetpage);
597-
598-
if (is_valid_immediate_signed(pageoffs, 9))
599-
{
600-
a.emit(opcode, reg, arm::Mem(MEM_SCRATCH_REG, pageoffs));
601-
return;
602-
}
603-
else if (emit_add_optimized(a, MEM_SCRATCH_REG, MEM_SCRATCH_REG, pageoffs))
604-
{
605-
a.emit(opcode, reg, arm::Mem(MEM_SCRATCH_REG));
606-
return;
607-
}
608-
}
609-
610598
// Can't optimize it at all, most likely becomes 4 MOV commands
611599
a.mov(MEM_SCRATCH_REG, ptr);
612600
a.emit(opcode, reg, arm::Mem(MEM_SCRATCH_REG));
613601
}
614602

615-
void drcbe_arm64::emit_ldr_mem(a64::Assembler &a, const a64::Gp &reg, const void *ptr) const { emit_ldr_str_base_mem(a, a64::Inst::kIdLdr, reg, ptr); }
616-
void drcbe_arm64::emit_ldrb_mem(a64::Assembler &a, const a64::Gp &reg, const void *ptr) const { emit_ldr_str_base_mem(a, a64::Inst::kIdLdrb, reg, ptr); }
617-
void drcbe_arm64::emit_ldrh_mem(a64::Assembler &a, const a64::Gp &reg, const void *ptr) const { emit_ldr_str_base_mem(a, a64::Inst::kIdLdrh, reg, ptr); }
618-
void drcbe_arm64::emit_ldrsb_mem(a64::Assembler &a, const a64::Gp &reg, const void *ptr) const { emit_ldr_str_base_mem(a, a64::Inst::kIdLdrsb, reg, ptr); }
619-
void drcbe_arm64::emit_ldrsh_mem(a64::Assembler &a, const a64::Gp &reg, const void *ptr) const { emit_ldr_str_base_mem(a, a64::Inst::kIdLdrsh, reg, ptr); }
620-
void drcbe_arm64::emit_ldrsw_mem(a64::Assembler &a, const a64::Gp &reg, const void *ptr) const { emit_ldr_str_base_mem(a, a64::Inst::kIdLdrsw, reg, ptr); }
621-
void drcbe_arm64::emit_str_mem(a64::Assembler &a, const a64::Gp &reg, const void *ptr) const { emit_ldr_str_base_mem(a, a64::Inst::kIdStr, reg, ptr); }
622-
void drcbe_arm64::emit_strb_mem(a64::Assembler &a, const a64::Gp &reg, const void *ptr) const { emit_ldr_str_base_mem(a, a64::Inst::kIdStrb, reg, ptr); }
623-
void drcbe_arm64::emit_strh_mem(a64::Assembler &a, const a64::Gp &reg, const void *ptr) const { emit_ldr_str_base_mem(a, a64::Inst::kIdStrh, reg, ptr); }
603+
void drcbe_arm64::emit_ldr_mem(a64::Assembler &a, const a64::Gp &reg, const void *ptr) const { emit_ldr_str_base_mem(a, a64::Inst::kIdLdr, reg, reg.isGpW() ? 2 : 3, ptr); }
604+
void drcbe_arm64::emit_ldrb_mem(a64::Assembler &a, const a64::Gp &reg, const void *ptr) const { emit_ldr_str_base_mem(a, a64::Inst::kIdLdrb, reg, 0, ptr); }
605+
void drcbe_arm64::emit_ldrh_mem(a64::Assembler &a, const a64::Gp &reg, const void *ptr) const { emit_ldr_str_base_mem(a, a64::Inst::kIdLdrh, reg, 1, ptr); }
606+
void drcbe_arm64::emit_ldrsb_mem(a64::Assembler &a, const a64::Gp &reg, const void *ptr) const { emit_ldr_str_base_mem(a, a64::Inst::kIdLdrsb, reg, 0, ptr); }
607+
void drcbe_arm64::emit_ldrsh_mem(a64::Assembler &a, const a64::Gp &reg, const void *ptr) const { emit_ldr_str_base_mem(a, a64::Inst::kIdLdrsh, reg, 1, ptr); }
608+
void drcbe_arm64::emit_ldrsw_mem(a64::Assembler &a, const a64::Gp &reg, const void *ptr) const { emit_ldr_str_base_mem(a, a64::Inst::kIdLdrsw, reg, 2, ptr); }
609+
void drcbe_arm64::emit_str_mem(a64::Assembler &a, const a64::Gp &reg, const void *ptr) const { emit_ldr_str_base_mem(a, a64::Inst::kIdStr, reg, reg.isGpW() ? 2 : 3, ptr); }
610+
void drcbe_arm64::emit_strb_mem(a64::Assembler &a, const a64::Gp &reg, const void *ptr) const { emit_ldr_str_base_mem(a, a64::Inst::kIdStrb, reg, 0, ptr); }
611+
void drcbe_arm64::emit_strh_mem(a64::Assembler &a, const a64::Gp &reg, const void *ptr) const { emit_ldr_str_base_mem(a, a64::Inst::kIdStrh, reg, 1, ptr); }
624612

625-
void drcbe_arm64::emit_float_ldr_mem(a64::Assembler &a, const a64::Vec &reg, const void *ptr) const { emit_ldr_str_base_mem(a, a64::Inst::kIdLdr_v, reg, ptr); }
626-
void drcbe_arm64::emit_float_str_mem(a64::Assembler &a, const a64::Vec &reg, const void *ptr) const { emit_ldr_str_base_mem(a, a64::Inst::kIdStr_v, reg, ptr); }
613+
void drcbe_arm64::emit_float_ldr_mem(a64::Assembler &a, const a64::Vec &reg, const void *ptr) const { emit_ldr_str_base_mem(a, a64::Inst::kIdLdr_v, reg, reg.isVecS() ? 2 : 3, ptr); }
614+
void drcbe_arm64::emit_float_str_mem(a64::Assembler &a, const a64::Vec &reg, const void *ptr) const { emit_ldr_str_base_mem(a, a64::Inst::kIdStr_v, reg, reg.isVecS() ? 2 : 3, ptr); }
627615

628616
void drcbe_arm64::mov_reg_param(a64::Assembler &a, uint32_t regsize, const a64::Gp &dst, const be_parameter &src) const
629617
{
@@ -803,7 +791,7 @@ void drcbe_arm64::call_arm_addr(a64::Assembler &a, const void *offs) const
803791
{
804792
const uint64_t codeoffs = a.code()->baseAddress() + a.offset();
805793
const int64_t reloffs = (int64_t)offs - codeoffs;
806-
if (is_valid_immediate_signed(reloffs, 26))
794+
if (is_valid_immediate_signed(reloffs, 26 + 2))
807795
{
808796
a.bl(offs);
809797
}

src/devices/cpu/drcbearm64.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,7 @@ class drcbe_arm64 : public drcbe_interface
169169
// helper functions
170170
void get_imm_relative(asmjit::a64::Assembler &a, const asmjit::a64::Gp &reg, const uint64_t ptr) const;
171171

172-
void emit_ldr_str_base_mem(asmjit::a64::Assembler &a, asmjit::a64::Inst::Id opcode, const asmjit::a64::Reg &reg, const void *ptr) const;
172+
void emit_ldr_str_base_mem(asmjit::a64::Assembler &a, asmjit::a64::Inst::Id opcode, const asmjit::a64::Reg &reg, int max_shift, const void *ptr) const;
173173
void emit_ldr_mem(asmjit::a64::Assembler &a, const asmjit::a64::Gp &reg, const void *ptr) const;
174174
void emit_ldrb_mem(asmjit::a64::Assembler &a, const asmjit::a64::Gp &reg, const void *ptr) const;
175175
void emit_ldrh_mem(asmjit::a64::Assembler &a, const asmjit::a64::Gp &reg, const void *ptr) const;

src/mame/amiga/agnus_copper.cpp

+2-1
Original file line numberDiff line numberDiff line change
@@ -251,7 +251,8 @@ void agnus_copper_device::vblank_sync(bool state)
251251
void agnus_copper_device::suspend_offset(int xpos, int hblank_width)
252252
{
253253
m_xpos_state = (xpos == 511) ? 0 : xpos - hblank_width;
254-
m_xpos_state += 6;
254+
// TODO: commented out, causes issues in too many places
255+
//m_xpos_state += 6;
255256
// assert(m_xpos_state > 0);
256257
}
257258

0 commit comments

Comments
 (0)