This is the mail archive of the cgen@sourceware.org mailing list for the CGEN project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: How does CGEN decide what ifields to use for CGEN_IVALUE?


HI John,

Sorry to take so long to look at this....

The first potential problem I see is in the use of decode-assist. The bits specified here must be opcode bits for *every* insn. By using decide-assist, this is what you are telling the decoder and it will believe you. According to you, bits 2-0 are not always opcode bits. decode-assist is simply an optimization and I would recommend not using it at all unless the default generated decoder ends up being particularly inefficient.

I didn't see any glaring problems otherwise.

I hope this helps,
Dave

John Stubley wrote:
Hi Dave,

Thank you for your reply.  You asked for a few more details, so here
goes:

The CPU has 16-bit word and 32-bit instruction lengths.  The
instructions are mostly packed into bits 3-0 and 31-18, where lsb-0 is
true.  The significant bitfields are as follows:

Opcode family: 4-3
Opcode (for most instructions): 2-0
Subopcodes are opcode dependent.

The problem is that some instructions load immediate data in bits
2-0,31-18 and thus do not have an opcode field - only an opcode family.
I think what happens is that the immediate data is being used as a hash
in the CGEN_IVALUE part of the table, and so is dependent on the actual
data field. Thus sometimes the disassembler cannot identify the
instruction.

Below are some extracts from the CPU file (some of the comments need
updating, though). The last instruction shown is the one that will
disassemble oddly:
-----------------------------8<-----------------------------------------
----
(define-arch
(name proc16)
(comment "Proc16")
(insn-lsb0? #t)
(machs proc16)
(isas proc16)
)
(define-isa
; Name of the ISA.
(name proc16)


  ; Words size is 16 bits.
  (default-insn-word-bitsize 16)

  ; Default instrction length.  The insns are always 18 bits wide.
  (default-insn-bitsize 32)

  ; Base instruction length.  The insns are always 18 bits wide.
  (base-insn-bitsize 32)

  ; This may not be needed...
  (decode-assist (4 3 2 1 0))

  ; Fetches 1 insn at a time.
  (liw-insns 1)
  (parallel-insns 1)
)

; CPU family definitions.
(define-cpu
; CPU names must be distinct from the architecture name and machine
names.
; The "b" suffix stands for "base" and is the convention.
; The "f" suffix stands for "family" and is the convention.
(name proc16bf)
(comment "Proc16 base family")
(endian little)
(insn-chunk-bitsize 32)
(word-bitsize 16)
)


-----------------------------8<-----------------------------------------
----; Instruction classes.
(dnf f-padhead    "unused header"      (RESERVED)            15  11)
(dnf f-opfamily   "opcode family"      ()                    4   2)
(dnf f-padfoot    "unused footer"      (RESERVED)            17  2)
(dnf f-opcode     "opcode"             ()                    2   3)
(dnf f-padbit     "unused bit"         (RESERVED)            31  1)

; Immediates.
(dnf f-n4        "address offset (4)"  ()                    29  4)
(dnf f-a8        "address (8)"         (ABS-ADDR)            29  8)
(dnf f-k7        "imm data (7)"        ()                    28  7)

(dnf f-a16hi     "abs address (16) [15]"   ()                0   1)
(dnf f-a16lo     "abs address (16) [14:0]" ()                30  15)
(dnf f-k8hi      "imm data (8) [7]"        ()                30  1)
(dnf f-k8lo      "imm data (8) [0-6]"      ()                28  7)
(dnf f-k16hi     "imm data (16) [15:13]"   ()                2   3)
(dnf f-k16lo     "imm data (16) [12:0]"    ()                30  13)

(df f-a14        "rel address (14)"    (PCREL-ADDR)          29  14
                 INT
                 ((value pc) (sub WI value pc))
                 ((value pc) (add WI value pc))
)
(dnmf f-a16      "abs address (16)"    (ABS-ADDR)
      UINT
      (f-a16hi f-a16lo)
      ; insert
      (sequence ()
		   (set (ifield f-a16hi)  (srl (ifield f-a16) (const
15)))
		   (set (ifield f-a16lo)  (and (ifield f-a16) (const
#x7fff)))
		  )
      ; extract
      (sequence ()
		   (set (ifield f-a16)  (or (sll (ifield f-a16hi) (const
15))
                                     (ifield f-a16lo)))
		  )
)


(dnmf f-k8 "imm data (8)" () UINT (f-k8hi f-k8lo) ; insert (sequence () (set (ifield f-k8hi) (srl (ifield f-k8) (const 7))) (set (ifield f-k8lo) (and (ifield f-k8) (const #x7f))) ) ; extract (sequence () (set (ifield f-k8) (or (sll (ifield f-k8hi) (const 7)) (ifield f-k8lo))) ) )

(dnmf f-k16       "imm data (16)"        ()
      UINT
      (f-k16hi f-k16lo)
      ; insert
      (sequence ()
		   (set (ifield f-k16hi)  (srl (ifield f-k16) (const
13)))
		   (set (ifield f-k16lo)  (and (ifield f-k16) (const
#x1fff)))
		  )
      ; extract
      (sequence ()
		   (set (ifield f-k16)  (or (sll (ifield f-k16hi) (const
13))
                                     (ifield f-k16lo)))
		  )
)
-----------------------------8<-----------------------------------------
----; insn-opfamily: bits 2-3
(define-normal-insn-enum insn-opfamily "insn family enums" () OPF_
f-opfamily
 (("LOADSTORE" 0)
  ("ARITH" 1)
  ("BRANCH" 2)
  ("SPECIAL" 3))
)

; insn-opcode-loadstore: bits 31,0-1, Load/Store family
(define-normal-insn-enum insn-opcode-loadstore "l/s insn code enums" ()
OPL_ f-opcode
 (("LOAD" 0)
  ("Reserved1" 1)
  ("FETCH" 2)
  ("INPUT" 3)
  ("STORE" 4)
  ("OUTPUT" 5)
  ("LOADPC" 6)
  ("RET" 7))
)

; insn-opcode-arithmetic: bits 31,0-1, Arithmetic family
(define-normal-insn-enum insn-opcode-arithmetic "arith insn code enums"
() OPA_ f-opcode
 (("ADD" 0)
  ("ADC" 1)
  ("SUB" 2)
  ("SBC" 3)
  ("AND" 4)
  ("OR" 5)
  ("XOR" 6)
  ("BIT" 7))
)

-----------------------------8<-----------------------------------------
----
; Instruction operands.

(dnop k16     "16 bit unsigned immediate"  ()          h-uint  f-k16)
(dnop k8      "8 bit unsigned immediate"   ()          h-uint  f-k8)
(dnop k7      "7 bit unsigned immediate"   ()          h-uint  f-k7)
(dnop a16     "16 bit absolute address"    ()          h-iaddr f-a16)
(dnop a14     "14 bit relative address"    ()          h-iaddr f-a14)
(dnop a8      "8 bit absolute address"     ()          h-addr  f-a8)
(dnop n4      "4 bit address offset"       ()          h-addr  f-n4)

(dnop rX      "destination register"       ()          h-gr    f-rx)
(dnop rY      "source register"            ()          h-gr    f-ry)

-----------------------------8<-----------------------------------------
----; Load / Store instructions

(dni loadreg "load registers"
     ()
     "load $rX,$rY"
     (+ OPF_LOADSTORE OPL_LOAD (f-padhead 0) (f-padbit 0) (f-padfoot 0)
(f-pad5 0) rY rX)
     (set rX rY)
     ()
)

(dni loadimm "load immediate"
     ()
     "load $rX,$k8"
     (+ OPF_LOADSTORE OPL_LOAD OPAI_IMM (f-padhead 0) (f-padbit 0)
(f-padfoot 0) k8 rX)
     (set rX k8)
     ()
)

-----------------------------8<-----------------------------------------
----; Special instructions
(dni loadword "load word immediate"
     ()
     "load r0,$k16"
     (+ OPF_SPECIAL (f-padhead 0) (f-padbit 0) (f-padfoot 0) k16)
     (set (reg WI r0) k16)
     ()
)

-----------------------------8<-----------------------------------------
----

John


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]