From 2b0842ea5154135f863ea7a7e0d4cddf433da0f8 Mon Sep 17 00:00:00 2001 From: Afonso Bordado Date: Sun, 8 Jan 2023 15:32:54 +0000 Subject: [PATCH 1/4] cranelift: Add `adrp` encoding to AArch64 backend --- cranelift/codegen/src/isa/aarch64/inst.isle | 5 ++++ .../codegen/src/isa/aarch64/inst/emit.rs | 23 ++++++++++++++++--- .../src/isa/aarch64/inst/emit_tests.rs | 18 +++++++++++++++ cranelift/codegen/src/isa/aarch64/inst/mod.rs | 8 ++++++- 4 files changed, 50 insertions(+), 4 deletions(-) diff --git a/cranelift/codegen/src/isa/aarch64/inst.isle b/cranelift/codegen/src/isa/aarch64/inst.isle index 6e088c4ce416..b8bf2ef480b0 100644 --- a/cranelift/codegen/src/isa/aarch64/inst.isle +++ b/cranelift/codegen/src/isa/aarch64/inst.isle @@ -852,6 +852,11 @@ (rd WritableReg) ;; Offset in range -2^20 .. 2^20. (off i32)) + + ;; Compute the address (using a PC-relative offset) of a 4KB page. + (Adrp + (rd WritableReg) + (off i32)) ;; Raw 32-bit word, used for inline constants and jump-table entries. (Word4 diff --git a/cranelift/codegen/src/isa/aarch64/inst/emit.rs b/cranelift/codegen/src/isa/aarch64/inst/emit.rs index 94ba0d55848e..49084250ef25 100644 --- a/cranelift/codegen/src/isa/aarch64/inst/emit.rs +++ b/cranelift/codegen/src/isa/aarch64/inst/emit.rs @@ -334,11 +334,21 @@ pub(crate) fn enc_br(rn: Reg) -> u32 { 0b1101011_0000_11111_000000_00000_00000 | (machreg_to_gpr(rn) << 5) } -pub(crate) fn enc_adr(off: i32, rd: Writable) -> u32 { +pub(crate) fn enc_adr_inst(opcode: u32, off: i32, rd: Writable) -> u32 { let off = u32::try_from(off).unwrap(); let immlo = off & 3; let immhi = (off >> 2) & ((1 << 19) - 1); - (0b00010000 << 24) | (immlo << 29) | (immhi << 5) | machreg_to_gpr(rd.to_reg()) + opcode | (immlo << 29) | (immhi << 5) | machreg_to_gpr(rd.to_reg()) +} + +pub(crate) fn enc_adr(off: i32, rd: Writable) -> u32 { + let opcode = 0b00010000 << 24; + enc_adr_inst(opcode, off, rd) +} + +pub(crate) fn enc_adrp(off: i32, rd: Writable) -> u32 { + let opcode = 0b10010000 << 24; + enc_adr_inst(opcode, off, rd) } fn enc_csel(rd: Writable, rn: Reg, rm: Reg, cond: Cond, op: u32, o2: u32) -> u32 { @@ -3143,6 +3153,12 @@ impl MachInstEmit for Inst { assert!(off < (1 << 20)); sink.put4(enc_adr(off, rd)); } + &Inst::Adrp { rd, off } => { + let rd = allocs.next_writable(rd); + assert!(off > -(1 << 20)); + assert!(off < (1 << 20)); + sink.put4(enc_adrp(off, rd)); + } &Inst::Word4 { data } => { sink.put4(data); } @@ -3395,7 +3411,8 @@ impl MachInstEmit for Inst { // adrp x0,