From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 21317 invoked by alias); 28 Jan 2004 19:34:51 -0000 Mailing-List: contact cgen-help@sources.redhat.com; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: cgen-owner@sources.redhat.com Received: (qmail 21300 invoked from network); 28 Jan 2004 19:34:50 -0000 Received: from unknown (HELO mx1.redhat.com) (66.187.233.31) by sources.redhat.com with SMTP; 28 Jan 2004 19:34:50 -0000 Received: from int-mx2.corp.redhat.com (nat-pool-rdu-dmz.redhat.com [172.16.52.200] (may be forged)) by mx1.redhat.com (8.11.6/8.11.6) with ESMTP id i0SJYib15265 for ; Wed, 28 Jan 2004 14:34:48 -0500 Received: from potter.sfbay.redhat.com (potter.sfbay.redhat.com [172.16.27.15]) by int-mx2.corp.redhat.com (8.11.6/8.11.6) with ESMTP id i0SJYgM19076 for ; Wed, 28 Jan 2004 14:34:43 -0500 Received: from redhat.com (IDENT:oR6MopXMy3KBPPbijHylNnxgIiuLPTXx@vpn50-49.rdu.redhat.com [172.16.50.49]) by potter.sfbay.redhat.com (8.11.6/8.11.6) with ESMTP id i0SJYYb04766; Wed, 28 Jan 2004 11:34:34 -0800 Message-ID: <40180ED9.7060104@redhat.com> Date: Wed, 28 Jan 2004 19:34:00 -0000 From: Dave Brolley User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.0.2) Gecko/20021216 MIME-Version: 1.0 To: Dave Brolley CC: cgen@sources.redhat.com Subject: Re: [patch][rfa] -opcode-slots: Handling of short insns References: <40180031.9040108@redhat.com> Content-Type: multipart/mixed; boundary="------------050508070601020904030808" X-SW-Source: 2004-q1/txt/msg00007.txt.bz2 This is a multi-part message in MIME format. --------------050508070601020904030808 Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit Content-length: 3616 Attached the wrong file..... Dave Brolley wrote: > Hi, > > This patch fixes a problem I ran across while working on an internal > port. Incorrect opcodes and masks were sometimes being generated for > the short insns of variable length ISAs because of two problems in > -opcode-slots: > > 1) The test of bit positions against the insn-length was off by one. > Thjs could lead to incorrect opcode bits being generated. > > 2) While the 'compute' function correctly generated zeroes for the > extra bits when computing 'opcode', it was also generating zeroes for > these bits when computing 'opcode-mask', thus rendering these bits > irrelevent. This could lead to the generation of numerous unreachable > cases in the generated decoder switch. > > The patch corrects the comparison of bit position against the > insn-length and also allows the caller of 'compute' to specify the > default bit value which should be generated bits beyond the length of > a short insn. This allows 0 to be specified when computing 'opcode' > and 1 to be specified when computing opcode-mask. The patch also > changes some of the logit calls to print values in hex which is more > appropriate when examining bitmasks > > This patch corrects the problem encountered with my internal port. I > know of no other port which is affected by this bug. I have tested it > against frv and xstormy16 and verified no changes to the generated > decoders. > > OK to commit? > > Dave > >------------------------------------------------------------------------ > >2004-01-28 Dave Brolley > > * decode.scm (-opcode-slots): For short insns, generate 'opcode' with > zeroes in the extra bit positions and generate 'opcode-mask' with ones > in the extra bit positions. > > > >------------------------------------------------------------------------ > >cgen/ChangeLog: >2004-01-26 Dave Brolley > > * decode.scm (-opcode-slots): For short insns, generate 'opcode' with > zeroes in the extra bit positions and generate 'opcode-mask' with ones > in the extra bit positions. > >cgen/cpu/ChangeLog.RedHat: >2004-01-26 Dave Brolley > > * mep.opc (OPTION_MASK): Remove dangerous whitspace following a > backslash intended as a line continuation. > >sid/main/dynamic/ChangeLog.RedHat: >2004-01-26 Dave Brolley > > * mepCfg.h (allocate_timer, configure_timer): New methods of MepBoardCfg. > (set_opt_timer_channel_bitw): New method of MepBoardCfg. > (timer_channel_bitw): New member of MepBoardCfg. > * mepCfg.cxx (MepBoardCfg): Initialize timer_channel_bitw. > (set_dmem_bank_num): Allow dmem_bank_num to be set to zero. > (map_imem_dmem): Correct fmem_base_address for case of no dmem. > Initialize dmem_base[0]. > (MepBoardCfg::write_config): Call configure_timer. Move setup of timer > interrupt pins to configure_timer. Handle case where dmem_bank_num is > zero. > (add_timer): Move allocation, scheduling and connection of timer to > allocate_timer and configure_timer. > (allocate_timer, configure_timer): New methods of MepBoardCfg. > (configure_dmac): Use timer_channel_bitw. > (set_opt_timer_channel_bitw): New method of MepBoardCfg. > * mainDynamic.cxx (usage): Document --timer-channel-bitw. > (option_num): Add opt_timer_channel_bitw. > (long_options): Add timer-channel-bitw. > (main): Handle opt_timer_channel_bitw. > * commonCfg.h (set_opt_timer_channel_bitw): New prototype. > >utils/mep/ChangeLog: >2004-01-26 Dave Brolley > > * mepcfgtool.c (generate_simulator_script): Generate > --timer-channel-bitw > > > --------------050508070601020904030808 Content-Type: text/plain; name="decode.patch.txt" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="decode.patch.txt" Content-length: 3255 Index: cgen/decode.scm =================================================================== RCS file: /cvs/src/src/cgen/decode.scm,v retrieving revision 1.9 diff -c -p -r1.9 decode.scm *** cgen/decode.scm 21 Oct 2003 16:42:00 -0000 1.9 --- cgen/decode.scm 28 Jan 2004 18:15:11 -0000 *************** *** 1,5 **** ; Application independent decoder support. ! ; Copyright (C) 2000 Red Hat, Inc. ; This file is part of CGEN. ; ; This file provides utilities for building instruction set decoders. --- 1,5 ---- ; Application independent decoder support. ! ; Copyright (C) 2000, 2004 Red Hat, Inc. ; This file is part of CGEN. ; ; This file provides utilities for building instruction set decoders. *************** *** 433,462 **** (letrec ((opcode (insn-value insn)) (insn-len (insn-base-mask-length insn)) (decode-len (length bitnums)) ! (compute (lambda (val insn-len decode-len bl) ;(display (list val insn-len decode-len bl)) (newline) ; Oh My God. This isn't tail recursive. (if (null? bl) 0 ! (+ (if (> (car bl) insn-len) ! 0 ! (if (bit-set? val ! (if lsb0? ! (car bl) ! (- insn-len (car bl) 1))) ! (integer-expt 2 (- (length bl) 1)) ! 0)) ! (compute val insn-len decode-len (cdr bl))))))) ! (let* ((opcode (compute (insn-value insn) insn-len decode-len bitnums)) ! (opcode-mask (compute (insn-base-mask insn) insn-len decode-len bitnums)) (indices (missing-bit-indices opcode-mask (- (integer-expt 2 decode-len) 1)))) (logit 3 "insn =" (obj:name insn) ! " insn-value=" (insn-value insn) ! " insn-base-mask=" (insn-base-mask insn) " insn-len=" insn-len " decode-len=" decode-len ! " opcode=" opcode ! " opcode-mask=" opcode-mask " indices=" indices "\n") (map (lambda (index) (+ opcode index)) indices))) ) --- 433,462 ---- (letrec ((opcode (insn-value insn)) (insn-len (insn-base-mask-length insn)) (decode-len (length bitnums)) ! (compute (lambda (val insn-len decode-len bl default) ;(display (list val insn-len decode-len bl)) (newline) ; Oh My God. This isn't tail recursive. (if (null? bl) 0 ! (+ (if (or (and (>= (car bl) insn-len) (= default 1)) ! (and (< (car bl) insn-len) ! (bit-set? val ! (if lsb0? ! (car bl) ! (- insn-len (car bl) 1))))) ! (integer-expt 2 (- (length bl) 1)) ! 0) ! (compute val insn-len decode-len (cdr bl) default)))))) ! (let* ((opcode (compute (insn-value insn) insn-len decode-len bitnums 0)) ! (opcode-mask (compute (insn-base-mask insn) insn-len decode-len bitnums 1)) (indices (missing-bit-indices opcode-mask (- (integer-expt 2 decode-len) 1)))) (logit 3 "insn =" (obj:name insn) ! " insn-value=" (number->hex (insn-value insn)) ! " insn-base-mask=" (number->hex (insn-base-mask insn)) " insn-len=" insn-len " decode-len=" decode-len ! " opcode=" (number->hex opcode) ! " opcode-mask=" (number->hex opcode-mask) " indices=" indices "\n") (map (lambda (index) (+ opcode index)) indices))) ) --------------050508070601020904030808--