summaryrefslogtreecommitdiff
path: root/cgen/play.cpu
diff options
context:
space:
mode:
Diffstat (limited to 'cgen/play.cpu')
-rw-r--r--cgen/play.cpu265
1 files changed, 265 insertions, 0 deletions
diff --git a/cgen/play.cpu b/cgen/play.cpu
new file mode 100644
index 00000000000..3ef3775f22a
--- /dev/null
+++ b/cgen/play.cpu
@@ -0,0 +1,265 @@
+; cpu description for debugging and experimental purposes. -*- Scheme -*-
+; This file is part of CGEN.
+; See file COPYING.CGEN for details.
+; Copyright (C) 2000 Red Hat, Inc.
+;
+; This file is for experimental purposes. Don't expect it to be correct
+; or up to date.
+
+(include "simplify.inc")
+
+(define-arch
+ (name play) ; name of cpu
+ (comment "experimental .cpu file")
+ (insn-lsb0? #f)
+ (machs playb)
+ (isas play)
+)
+
+(define-isa
+ (name play)
+ (base-insn-bitsize 16)
+ (decode-assist (0 1 2 3))
+)
+
+(define-cpu
+ (name cpuf)
+ (comment "experimental cpu family")
+ (endian little)
+ (word-bitsize 32)
+)
+
+(define-mach
+ (name playb)
+ (comment "experimental mach")
+ (cpu cpuf)
+)
+
+(define-model
+ (name test) (comment "test") (attrs)
+ (mach playb)
+ ;(pipeline all "" () ((fetch) (decode) (execute) (writeback)))
+ (unit u-exec "Execution Unit" () 1 1
+ () () () ())
+)
+
+; Instruction fields.
+
+(dnf f-op1 "op1" () 0 4)
+(dnf f-op2 "op2" () 4 4)
+(dnf f-op3 "op3" () 8 4)
+(dnf f-op4 "op4" () 12 4)
+(dnf f-r1 "r1" () 8 4)
+(dnf f-r2 "r2" () 12 4)
+(df f-simm16 "simm16" () 16 16 INT #f #f)
+
+(define-normal-insn-enum insn-op1 "insn format enums" () OP1_ f-op1
+ (.map .str (.iota 16))
+)
+
+(define-normal-insn-enum insn-op2 "insn format enums (2)" () OP2_ f-op2
+ (.map .str (.iota 16))
+)
+
+(define-normal-insn-enum insn-op3 "insn format enums (3)" () OP3_ f-op3
+ (.map .str (.iota 16))
+)
+
+(define-normal-insn-enum insn-op4 "insn format enums (4)" () OP4_ f-op4
+ (.map .str (.iota 16))
+)
+
+; Hardware.
+
+(dnh h-pc "program counter" (PC PROFILE) (pc) () () ())
+
+(define-hardware
+ (name h-gr)
+ (comment "general registers")
+ (attrs PROFILE );CACHE-ADDR)
+ (type register WI (16))
+ (indices keyword ""
+ ( (fp 13) (lr 14) (sp 15)
+ (r0 0) (r1 1) (r2 2) (r3 3) (r4 4) (r5 5) (r6 6) (r7 7)
+ (r8 8) (r9 9) (r10 10) (r11 11) (r12 12) (r13 13) (r14 14) (r15 15)
+ ))
+)
+
+(define-hardware
+ (name h-status)
+ (comment "status reg")
+ (type register SI)
+ (get () (const 0))
+ (set (newval) (nop))
+)
+
+; These bits are actualy part of the PS register
+(dsh h-nbit "negative bit" () (register BI))
+(dsh h-zbit "zero bit" () (register BI))
+(dsh h-vbit "overflow bit" () (register BI))
+(dsh h-cbit "carry bit" () (register BI))
+
+(dsh h-df "df test" () (register DF))
+(dsh h-tf "tf test" () (register TF))
+
+; Operand attributes.
+
+(define-attr
+ (for operand)
+ (type boolean)
+ (name HASH-PREFIX)
+ (comment "immediates have a '#' prefix")
+)
+
+; Operands.
+
+(dnop nbit "negative bit" (SEM-ONLY) h-nbit f-nil)
+(dnop vbit "overflow bit" (SEM-ONLY) h-vbit f-nil)
+(dnop zbit "zero bit" (SEM-ONLY) h-zbit f-nil)
+(dnop cbit "carry bit" (SEM-ONLY) h-cbit f-nil)
+
+(dnop dr "destination register" () h-gr f-r1)
+(dnop sr "source register" () h-gr f-r2)
+(dnop simm-16 "16 bit signed immediate" (HASH-PREFIX) h-sint f-simm16)
+
+; Note that `df' doesn't work as that is a pmacro.
+(dnop df-reg "df reg" () h-df f-nil)
+(dnop tf-reg "tf reg" () h-tf f-nil)
+
+; Instructions.
+
+(dni add "add"
+ ()
+ "add $dr,$sr"
+ (+ OP1_4 OP2_0 dr sr)
+ (sequence ()
+ (set vbit (add-oflag dr sr (const 0)))
+ (set cbit (add-cflag dr sr (const 0)))
+ (set dr (add dr sr))
+ (set zbit (zflag dr))
+ (set nbit (nflag dr)))
+ ()
+)
+
+(dni addv2 "add version 2"
+ ()
+ "add $dr,$sr"
+ (+ OP1_4 OP2_1 dr sr)
+ (sequence ((WI tmp1))
+ (parallel ()
+ (set tmp1 (add dr sr))
+ (set vbit (add-oflag dr sr (const 0)))
+ (set cbit (add-cflag dr sr (const 0))))
+ (set zbit (zflag tmp1))
+ (set nbit (nflag tmp1))
+ (set dr tmp1)
+ )
+ ()
+)
+
+(dni addi "addi"
+ ()
+ "addi $dr,$sr,$simm-16"
+ (+ OP1_4 OP2_2 dr sr simm-16)
+ (set dr (add sr simm-16))
+ ()
+)
+
+(define-pmacro (reg+ oprnd n)
+ (reg h-gr (add (index-of oprnd) (const n)))
+)
+
+(dni ldm "ldm"
+ ()
+ "ldm $dr,$sr"
+ (+ OP1_5 OP2_2 dr sr)
+ (sequence ()
+ (set dr sr)
+ (set (reg+ dr 1) (reg+ sr 1))
+ )
+ ()
+)
+
+(dni use-ifield "use-ifield"
+ ()
+ "foo $dr,$sr"
+ (+ OP1_5 OP2_3 dr sr)
+ (sequence ()
+ (set dr (ifield f-r2))
+ )
+ ()
+)
+
+(dni use-index-of "index-of"
+ ()
+ "index-of $dr,$sr"
+ (+ OP1_5 OP2_4 dr sr)
+ (set dr (reg h-gr (add (index-of sr) (const 1))))
+ ()
+)
+
+(dni load-df "use df"
+ ()
+ "load-df df,[$sr]"
+ (+ OP1_6 OP2_0 OP3_0 sr)
+ (set df-reg (mem DF sr))
+ ()
+)
+
+(dni make-df "use df"
+ ()
+ "make-df df,[$sr]"
+ (+ OP1_6 OP2_1 OP3_0 sr)
+ (set df-reg (join DF SI (mem SI sr) (mem SI (add sr (const 4)))))
+ ()
+)
+
+(dni split-df "use df"
+ ()
+ "split-df df,[$sr]"
+ (+ OP1_6 OP2_2 OP3_0 sr)
+ (sequence ((DF temp))
+ (set temp df-reg)
+ (set (concat (SI SI)
+ sr
+ (reg h-gr (add (regno sr) (const 1))))
+ (split DF SI temp))
+ )
+ ()
+)
+
+(dni load-tf "use tf"
+ ()
+ "load-tf tf,[$sr]"
+ (+ OP1_6 OP2_3 OP3_0 sr)
+ (set tf-reg (mem TF sr))
+ ()
+)
+
+(dni make-tf "use tf"
+ ()
+ "make-tf tf,[$sr]"
+ (+ OP1_6 OP2_4 OP3_0 sr)
+ (set tf-reg (join TF SI
+ sr
+ (reg h-gr (add (regno sr) (const 1)))
+ (reg h-gr (add (regno sr) (const 2)))
+ (reg h-gr (add (regno sr) (const 3)))))
+ ()
+)
+
+(dni split-tf "use tf"
+ ()
+ "split-tf tf,[$sr]"
+ (+ OP1_6 OP2_5 OP3_0 sr)
+ (sequence ((TF temp))
+ (set temp tf-reg)
+ (set (concat (SI SI SI SI)
+ sr
+ (reg h-gr (add (regno sr) (const 1)))
+ (reg h-gr (add (regno sr) (const 2)))
+ (reg h-gr (add (regno sr) (const 3))))
+ (split TF SI temp))
+ )
+ ()
+)