aboutsummaryrefslogtreecommitdiff
path: root/cpu/or1korbis.cpu
diff options
context:
space:
mode:
Diffstat (limited to 'cpu/or1korbis.cpu')
-rw-r--r--cpu/or1korbis.cpu35
1 files changed, 34 insertions, 1 deletions
diff --git a/cpu/or1korbis.cpu b/cpu/or1korbis.cpu
index 535bd28..6fbf40a 100644
--- a/cpu/or1korbis.cpu
+++ b/cpu/or1korbis.cpu
@@ -74,10 +74,25 @@
25
26
INT
- ((value pc) (sra SI (sub IAI value pc) (const 2)))
+ ((value pc) (sra IAI (sub IAI value pc) (const 2)))
((value pc) (add IAI (sll IAI value (const 2)) pc))
)
+; PC relative, 21-bit, 13 shifted to right, aligned.
+; Note that the alignment means that we can't simplify relocations in the
+; same way as we do for pc-relative, so we use ABS-ADDR instead of PCREL-ADDR.
+(df f-disp21
+ "disp21"
+ ((MACH ORBIS-MACHS) ABS-ADDR)
+ 20
+ 21
+ INT
+ ((value pc)
+ (sub IAI (sra IAI value (const 13)) (sra IAI pc (const 13))))
+ ((value pc)
+ (sll IAI (add IAI value (sra IAI pc (const 13))) (const 13)))
+ )
+
; Immediates.
(dnf f-uimm16 "uimm16" ((MACH ORBIS-MACHS)) 15 16)
(df f-simm16 "simm16" ((MACH ORBIS-MACHS) SIGN-OPT) 15 16 INT #f #f)
@@ -134,6 +149,7 @@
insn-opcode "insn main opcode enums" ((MACH ORBIS-MACHS)) OPC_ f-opcode
(("J" #x00)
("JAL" #x01)
+ ("ADRP" #x02)
("BNF" #x03)
("BF" #x04)
("NOP" #x05)
@@ -312,6 +328,15 @@
)
(define-operand
+ (name disp21)
+ (comment "pc-rel 21 bit")
+ (attrs (MACH ORBIS-MACHS))
+ (type h-iaddr)
+ (index f-disp21)
+ (handlers (parse "disp21"))
+ )
+
+(define-operand
(name simm16)
(comment "16-bit signed immediate")
(attrs (MACH ORBIS-MACHS) SIGN-OPT)
@@ -403,6 +428,14 @@
)
)
+(dni l-adrp "adrp reg/disp21"
+ ((MACH ORBIS-MACHS))
+ "l.adrp $rD,${disp21}"
+ (+ OPC_ADRP rD disp21)
+ (set UWI rD disp21)
+ ()
+ )
+
(define-cti
l-jal
"jump and link (pc-relative iaddr)"