8000 Fix remaining tests (#150) · kddnewton/ruby@ebce71a · GitHub
[go: up one dir, main page]

Skip to content

Commit ebce71a

Browse files
authored
Fix remaining tests (ruby#150)
1 parent 310bfae commit ebce71a

File tree

2 files changed

+55
-28
lines changed

2 files changed

+55
-28
lines changed

yjit/src/asm/x86_64/mod.rs

Lines changed: 30 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ pub struct X86UImm
7373
value: u64
7474
}
7575

76-
#[derive(Clone, Copy, Debug)]
76+
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
7777
pub enum RegType
7878
{
7979
GP,
@@ -323,15 +323,19 @@ pub fn mem_opnd(num_bits: u8, base_reg: X86Opnd, disp: i32) -> X86Opnd
323323
_ => unreachable!()
324324
};
325325

326-
return X86Opnd::Mem(
327-
X86Mem {
328-
num_bits: num_bits,
329-
base_reg_no: base_reg.reg_no,
330-
idx_reg_no: None,
331-
scale_exp: 0,
332-
disp: disp,
333-
}
334-
);
326+
if base_reg.reg_type == RegType::IP {
327+
X86Opnd::IPRel(disp)
328+
} else {
329+
X86Opnd::Mem(
330+
X86Mem {
331+
num_bits: num_bits,
332+
base_reg_no: base_reg.reg_no,
333+
idx_reg_no: None,
334+
scale_exp: 0,
335+
disp: disp,
336+
}
337+
)
338+
}
335339
}
336340

337341
/// Memory operand with SIB (Scale Index Base) indexing
@@ -746,6 +750,7 @@ fn write_rm(cb: &mut CodeBlock, sz_pref: bool, rex_w: bool, r_opnd: X86Opnd, rm_
746750
let rm = match rm_opnd {
747751
X86Opnd::Reg(reg) => reg.reg_no & 7,
748752
X86Opnd::Mem(mem) => if need_sib { 4 } else { mem.base_reg_no & 7 },
753+
X86Opnd::IPRel(_) => 0b101,
749754
_ => unreachable!()
750755
};
751756

@@ -779,12 +784,18 @@ fn write_rm(cb: &mut CodeBlock, sz_pref: bool, rex_w: bool, r_opnd: X86Opnd, rm_
779784
}
780785

781786
// Add the displacement
782-
if let X86Opnd::Mem(mem) = rm_opnd {
783-
let disp_size = rm_opnd.disp_size();
784-
if disp_size > 0 {
785-
cb.write_int(mem.disp as u64, disp_size);
786-
}
787-
}
787+
match rm_opnd {
788+
X86Opnd::Mem(mem) => {
789+
let disp_size = rm_opnd.disp_size();
790+
if disp_size > 0 {
791+
cb.write_int(mem.disp as u64, disp_size);
792+
}
793+
},
794+
X86Opnd::IPRel(rel) => {
795+
cb.write_int(rel as u64, 32);
796+
},
797+
_ => ()
798+
};
788799
}
789800

790801
// Encode a mul-like single-operand RM instruction
@@ -832,8 +843,8 @@ fn write_rm_multi(cb: &mut CodeBlock, op_mem_reg8: u8, op_mem_reg_pref: u8, op_r
832843
write_rm(cb, sz_pref, rex_w, opnd1, opnd0, 0xff, &[op_mem_reg_pref]);
833844
}
834845
},
835-
// Reg + R/M
836-
(X86Opnd::Reg(_), X86Opnd::Mem(_)) => {
846+
// Reg + R/M/IPRel
847+
(X86Opnd::Reg(_), X86Opnd::Mem(_) | X86Opnd::IPRel(_)) => {
837848
if opnd_size == 8 {
838849
write_rm(cb, false, false, opnd0, opnd1, 0xff, &[op_reg_mem8]);
839850
} else {
@@ -1594,7 +1605,7 @@ pub fn test(cb: &mut CodeBlock, rm_opnd: X86Opnd, test_opnd: X86Opnd) {
15941605
assert!(rm_num_bits == 64);
15951606

15961607
write_rm(cb, false, true, X86Opnd::None, rm_opnd, 0x00, &[0xf7]);
1597-
cb.write_int(imm.value.try_into().unwrap(), 32);
1608+
cb.write_int(imm.value as u64, 32);
15981609
},
15991610
X86Opnd::Reg(reg) => {
16001611
assert!(reg.num_bits == rm_num_bits);

yjit/src/asm/x86_64/tests.rs

Lines changed: 25 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -151,11 +151,9 @@ fn test_jo_label() {
151151
#[test]
152152
fn test_lea() {
153153
check_bytes("488d5108", |cb| lea(cb, RDX, mem_opnd(64, RCX, 8)));
154-
155-
// TODO(kevin)
156-
// check_bytes("488d0500000000", |cb| lea(cb, RAX, mem_opnd(8, RIP, 0)));
157-
// check_bytes("488d0505000000", |cb| lea(cb, RAX, mem_opnd(8, RIP, 5)));
158-
// check_bytes("488d3d05000000", |cb| lea(cb, RDI, mem_opnd(8, RIP, 5)));
154+
check_bytes("488d0500000000", |cb| lea(cb, RAX, mem_opnd(8, RIP, 0)));
155+
check_bytes("488d0505000000", |cb| lea(cb, RAX, mem_opnd(8, RIP, 5)));
156+
check_bytes("488d3d05000000", |cb| lea(cb, RDI, mem_opnd(8, RIP, 5)));
159157
}
160158

161159
#[test]
@@ -235,6 +233,16 @@ fn test_mov_unsigned() {
235233
check_bytes("49b8ffffffffffffffff", |cb| mov(cb, R8, uimm_opnd(u64::MAX)));
236234
}
237235

236+
#[test]
237+
fn test_mov_iprel() {
238+
check_bytes("8b0500000000", |cb| mov(cb, EAX, mem_opnd(32, RIP, 0)));
239+
check_bytes("8b0505000000", |cb| mov(cb, EAX, mem_opnd(32, RIP, 5)));
240+
241+
check_bytes("488b0500000000", |cb| mov(cb, RAX, mem_opnd(64, RIP, 0)));
242+
check_bytes("488b0505000000", |cb| mov(cb, RAX, mem_opnd(64, RIP, 5)));
243+
check_bytes("488b3d05000000", |cb| mov(cb, RDI, mem_opnd(64, RIP, 5)));
244+
}
245+
238246
#[test]
239247
fn test_movsx() {
240248
check_bytes("660fbec0", |cb| movsx(cb, AX, AL));
@@ -250,7 +258,17 @@ fn test_movsx() {
250258
#[test]
251259
fn test_nop() {
252260
check_bytes("90", |cb| nop(cb, 1));
253-
// TODO: we should test some multibyte nop encodings
261+
check_bytes("6690", |cb| nop(cb, 2));
262+
check_bytes("0f1f00", |cb| nop(cb, 3));
263+
check_bytes("0f1f4000", |cb| nop(cb, 4));
264+
check_bytes("0f1f440000", |cb| nop(cb, 5));
265+
check_bytes("660f1f440000", |cb| nop(cb, 6));
266+
check_bytes("0f1f8000000000", |cb| nop(cb, 7));
267+
check_bytes("0f1f840000000000", |cb| nop(cb, 8));
268+
check_bytes("660f1f840000000000", |cb| nop(cb, 9));
269+
check_bytes("660f1f84000000000090", |cb| nop(cb, 10));
270+
check_bytes("660f1f8400000000006690", |cb| nop(cb, 11));
271+
check_bytes("660f1f8400000000000f1f00", |cb| nop(cb, 12));
254272
}
255273

256274
#[test]
@@ -352,9 +370,7 @@ fn test_test() {
352370
check_bytes("4885472a", |cb| test(cb, mem_opnd(64, RDI, 42), RAX));
353371
check_bytes("4885c0", |cb| test(cb, RAX, RAX));
354372
check_bytes("4885f0", |cb| test(cb, RAX, RSI));
355-
356-
// TODO(kevin)
357-
// check_bytes("48f74640f7ffffff", |cb| test(cb, mem_opnd(64, RSI, 64), imm_opnd(!0x08)));
373+
check_bytes("48f74640f7ffffff", |cb| test(cb, mem_opnd(64, RSI, 64), imm_opnd(!0x08)));
358374
}
359375

360376
#[test]

0 commit comments

Comments
 (0)
0