From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 3836 invoked by alias); 20 Jun 2003 02:35:32 -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 3779 invoked from network); 20 Jun 2003 02:35:29 -0000 Received: from unknown (HELO tiktok.the-meissners.org) (130.105.39.7) by sources.redhat.com with SMTP; 20 Jun 2003 02:35:29 -0000 Received: from tiktok.the-meissners.org (localhost [127.0.0.1]) by tiktok.the-meissners.org (8.12.8/8.12.8) with ESMTP id h5K2ZRm0024037 for ; Thu, 19 Jun 2003 22:35:27 -0400 Received: (from meissner@localhost) by tiktok.the-meissners.org (8.12.8/8.12.8/Submit) id h5K2ZRwP024035 for cgen@sources.redhat.com; Thu, 19 Jun 2003 22:35:27 -0400 Date: Fri, 20 Jun 2003 02:35:00 -0000 From: Michael Meissner To: cgen@sources.redhat.com Subject: Nested define-pmacro's Message-ID: <20030620023527.GA24021@tiktok.the-meissners.org> Mail-Followup-To: Michael Meissner , cgen@sources.redhat.com Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.4.1i X-SW-Source: 2003-q2/txt/msg00119.txt.bz2 My machine has lots of instructions, but most of them are fairly regular, so I've been trying to use nested define-pmacro's to avoid excessive amounts of typing. For example, there are 8 different add varients (4 sizes and 2 formats for each size). Here is a cut-down example that won't run, but shows you the flavor of what I'm doing. When I run it with -v -v -v, I see by the trace that only the second function is defined. I see pmacros.scm has this little comment in it: ; ??? Nested pmacros don't bind their arguments the way nested lambda's do. ; Should they? I'm hoping tomorrow to go into MIT and get a real book on scheme, but pointers and online sources would be appreciated. Here the source. I've tried various different ways of coding the define-pmacro call. ;; name: base function name ;; comment: base comment string ;; attrs: attribute list ;; syntax1: initial part of syntax string before the size field ;; syntax2: syntax string after adding the size field, not including $DREG=$S1REG,$S2REG or $DREG=$S1REG,IMM8 ;; format: format list of the instruction fields, not include the 2 sources or destination ;; imm-bit: bit to set for the immediate form of the instruction ;; u: "U" if unsigned, "" if signed ;; semantics: macro that when expanded does the operation, args are result, arg1, arg2, and mode ;; timing: timing list (define-pmacro (expand-osize name comment attrs syntax1 syntax2 format imm-bit bit-21 u semantics timing) (begin ;; 64-bit reg/reg format (dni (.sym name "-64bit-reg-reg") (.str comment ", 64 bit, reg,reg format") attrs (.str syntax1 syntax2 " " "$DREG" "=" "$S1REG" "," "$S2REG") (.splice + (.unsplice format) OSIZE_64 DREG S2REG S1REG ) (sequence () (semantics DREG S1REG S2REG (.sym u DI)) ) timing ) ;; 32-bit reg/reg format (dni (.sym name "-32bit-reg-reg") (.str comment ", 32 bit, reg,reg format") attrs (.str syntax1 ".32" syntax2 " " "$DREG" "=" "$S1REG" "," "$S2REG"") (.splice + (.unsplice format) OSIZE_32 DREG S2REG S1REG ) (sequence () (semantics (subword (.sym u SI) DREG 0) (subword (.sym u SI) S1REG 0) (subword (.sym u SI) S2REG 0) (.sym u SI)) (semantics (subword (.sym u SI) DREG 1) (subword (.sym u SI) S1REG 1) (subword (.sym u SI) S2REG 1) (.sym u SI)) ) timing ) ;; other 6 formats deleted in the name of brevity ) ) (define-pmacro (macro-add ret arg1 arg2 mode) (begin (set ret (add mode arg1 arg2)))) (expand-osize add "add operation" ; comment () ; attrs "add" ; syntax before size field "" ; syntax after size field, without args ; format (OPCODE_ADD OTHER_BITS) BIT_35_1 ; bit 35 is the immediate bit "" ; signed operation macro-add ; macro to do add operation () ; timing attributes ) -- Michael Meissner email: gnu@the-meissners.org http://www.the-meissners.org