summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMaxime Chevalier-Boisvert <maxime.chevalierboisvert@shopify.com>2022-05-19 13:32:56 -0400
committerTakashi Kokubun <takashikkbn@gmail.com>2022-08-29 08:46:53 -0700
commit564f9503603ae261561193f69f1fbdef6a140aa1 (patch)
tree3d262af2a45e74df2098c5510ae33fe6d2e31893
parent99cfbdca6b7c2dd167137e7256cc861961969ffd (diff)
Make assembler methods public, sketch gen_dup with new backend
-rw-r--r--yjit/src/backend/ir.rs18
-rw-r--r--yjit/src/codegen.rs36
2 files changed, 45 insertions, 9 deletions
diff --git a/yjit/src/backend/ir.rs b/yjit/src/backend/ir.rs
index 7971f69842..d26eb289c6 100644
--- a/yjit/src/backend/ir.rs
+++ b/yjit/src/backend/ir.rs
@@ -311,7 +311,7 @@ pub struct Assembler
impl Assembler
{
- fn new() -> Assembler {
+ pub fn new() -> Assembler {
Assembler {
insns: Vec::default(),
live_ranges: Vec::default()
@@ -348,7 +348,7 @@ impl Assembler
}
/// Add a comment at the current position
- fn comment(&mut self, text: &str)
+ pub fn comment(&mut self, text: &str)
{
let insn = Insn {
op: Op::Comment,
@@ -363,7 +363,7 @@ impl Assembler
}
/// Add a label at the current position
- fn label(&mut self, name: &str) -> Target
+ pub fn label(&mut self, name: &str) -> Target
{
let insn_idx = self.insns.len();
@@ -553,7 +553,7 @@ impl Assembler
}
// Optimize and compile the stored instructions
- fn compile(self, cb: &mut CodeBlock)
+ pub fn compile(self, cb: &mut CodeBlock)
{
// NOTE: for arm we're going to want to split loads but also stores
// This can be done in a platform-agnostic way, but the set of passes
@@ -577,12 +577,12 @@ impl fmt::Debug for Assembler {
impl Assembler
{
// Jump if not zero
- fn jnz(&mut self, target: Target)
+ pub fn jnz(&mut self, target: Target)
{
self.push_insn(Op::Jnz, vec![], Some(target));
}
- fn jbe(&mut self, target: Target)
+ pub fn jbe(&mut self, target: Target)
{
self.push_insn(Op::Jbe, vec![], Some(target));
}
@@ -592,7 +592,7 @@ macro_rules! def_push_1_opnd {
($op_name:ident, $opcode:expr) => {
impl Assembler
{
- fn $op_name(&mut self, opnd0: Opnd) -> Opnd
+ pub fn $op_name(&mut self, opnd0: Opnd) -> Opnd
{
self.push_insn($opcode, vec![opnd0], None)
}
@@ -604,7 +604,7 @@ macro_rules! def_push_2_opnd {
($op_name:ident, $opcode:expr) => {
impl Assembler
{
- fn $op_name(&mut self, opnd0: Opnd, opnd1: Opnd) -> Opnd
+ pub fn $op_name(&mut self, opnd0: Opnd, opnd1: Opnd) -> Opnd
{
self.push_insn($opcode, vec![opnd0, opnd1], None)
}
@@ -616,7 +616,7 @@ macro_rules! def_push_2_opnd_no_out {
($op_name:ident, $opcode:expr) => {
impl Assembler
{
- fn $op_name(&mut self, opnd0: Opnd, opnd1: Opnd)
+ pub fn $op_name(&mut self, opnd0: Opnd, opnd1: Opnd)
{
self.push_insn($opcode, vec![opnd0, opnd1], None);
}
diff --git a/yjit/src/codegen.rs b/yjit/src/codegen.rs
index 67d3ecd573..22e3c45438 100644
--- a/yjit/src/codegen.rs
+++ b/yjit/src/codegen.rs
@@ -901,6 +901,42 @@ fn gen_dup(
KeepCompiling
}
+
+
+
+
+
+
+use crate::backend::ir::*;
+
+#[allow(dead_code)]
+fn gen_dup_ir(
+ _jit: &mut JITState,
+ ctx: &mut Context,
+ cb: &mut CodeBlock,
+ _ocb: &mut OutlinedCb,
+) -> CodegenStatus {
+
+ let mut asm = Assembler::new();
+
+ let dup_val = ctx.ir_stack_pop(0);
+ let (mapping, tmp_type) = ctx.get_opnd_mapping(StackOpnd(0));
+
+ let loc0 = ctx.ir_stack_push_mapping((mapping, tmp_type));
+ asm.mov(loc0, dup_val);
+
+ asm.compile(cb);
+
+ KeepCompiling
+}
+
+
+
+
+
+
+
+
// duplicate stack top n elements
fn gen_dupn(
jit: &mut JITState,