From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: Mattias =?UTF-8?Q?Engdeg=C3=A5rd?= Newsgroups: gmane.emacs.bugs Subject: bug#42597: 27.1; (+ -0.0) returns +0.0 when compiled Date: Mon, 3 Aug 2020 17:36:03 +0200 Message-ID: <045AEB54-0FC5-40D8-BC8F-D550670BD2AF@acm.org> References: <20200729133532.21725.qmail@mail.muc.de> Mime-Version: 1.0 (Mac OS X Mail 12.4 \(3445.104.15\)) Content-Type: multipart/mixed; boundary="Apple-Mail=_ED3C32FC-7395-4167-8EF0-53313C747201" Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="36130"; mail-complaints-to="usenet@ciao.gmane.io" Cc: 42597@debbugs.co.uk To: Alan Mackenzie Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Mon Aug 03 17:52:13 2020 Return-path: Envelope-to: geb-bug-gnu-emacs@m.gmane-mx.org Original-Received: from lists.gnu.org ([209.51.188.17]) by ciao.gmane.io with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1k2cl3-0009HM-7w for geb-bug-gnu-emacs@m.gmane-mx.org; Mon, 03 Aug 2020 17:52:13 +0200 Original-Received: from localhost ([::1]:50376 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1k2cl1-0005Yj-N1 for geb-bug-gnu-emacs@m.gmane-mx.org; Mon, 03 Aug 2020 11:52:11 -0400 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]:36976) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1k2cks-0005YN-6H for bug-gnu-emacs@gnu.org; Mon, 03 Aug 2020 11:52:02 -0400 Original-Received: from debbugs.gnu.org ([209.51.188.43]:34368) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1k2ckr-0000fY-Tm for bug-gnu-emacs@gnu.org; Mon, 03 Aug 2020 11:52:01 -0400 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1k2ckr-000330-Sn for bug-gnu-emacs@gnu.org; Mon, 03 Aug 2020 11:52:01 -0400 X-Loop: help-debbugs@gnu.org Resent-From: Mattias =?UTF-8?Q?Engdeg=C3=A5rd?= Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Mon, 03 Aug 2020 15:52:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 42597 X-GNU-PR-Package: emacs Original-Received: via spool by 42597-submit@debbugs.gnu.org id=B42597.159646991111692 (code B ref 42597); Mon, 03 Aug 2020 15:52:01 +0000 Original-Received: (at 42597) by debbugs.gnu.org; 3 Aug 2020 15:51:51 +0000 Original-Received: from localhost ([127.0.0.1]:45914 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1k2ckg-00032V-Uc for submit@debbugs.gnu.org; Mon, 03 Aug 2020 11:51:51 -0400 Original-Received: from mail179c50.megamailservers.eu ([91.136.10.189]:38720 helo=mail18c50.megamailservers.eu) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1k2ckb-00032I-5f for 42597@debbugs.gnu.org; Mon, 03 Aug 2020 11:51:49 -0400 X-Authenticated-User: mattiase@bredband.net DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=megamailservers.eu; s=maildub; t=1596469903; bh=0iFQ1sL/XAlIWp2Z4z/tsmQdlC18Dri5XHlQ9dwyC+Q=; h=Subject:From:Resent-Cc:Resent-From:In-Reply-To:Date:Cc: Resent-Date:Resent-To:References:To:From; b=je3sV017KZwemCI7/QR4VOFy6f/iGGIgtL5sbJF52/dq2gqtKbBojGwNExW5Vf50z OsEFyvNgAglI7MyuOeSuojqEhcZV7IV258e/aQi4sdTX9o4cQjSjGVv8J2SJE8HWWA W6Cp+qM/sdhRYFaO/mg8I637XebC5lH/DHXlj33Q= Feedback-ID: mattiase@acm.or Original-Received: from [192.168.0.4] (c188-150-171-71.bredband.comhem.se [188.150.171.71]) (authenticated bits=0) by mail18c50.megamailservers.eu (8.14.9/8.13.1) with ESMTP id 073FpeUi023414; Mon, 3 Aug 2020 15:51:42 +0000 Resent-Message-Id: <202008031551.073FpeUi023414@mail18c50.megamailservers.eu> Resent-Cc: Alan Mackenzie Resent-From: Mattias =?UTF-8?Q?Engdeg=C3=A5rd?= In-Reply-To: <20200729133532.21725.qmail@mail.muc.de> Resent-Date: Mon, 3 Aug 2020 17:51:40 +0200 Resent-To: 42597@debbugs.gnu.org X-Mailer: Apple Mail (2.3445.104.15) X-CTCH-RefID: str=0001.0A782F20.5F28328F.001C, ss=1, re=0.000, recu=0.000, reip=0.000, cl=1, cld=1, fgs=0 X-CTCH-VOD: Unknown X-CTCH-Spam: Unknown X-CTCH-Score: 0.000 X-CTCH-Flags: 0 X-CTCH-ScoreCust: 0.000 X-CSC: 0 X-CHA: v=2.3 cv=K8Zc4BeI c=1 sm=1 tr=0 a=SF+I6pRkHZhrawxbOkkvaA==:117 a=SF+I6pRkHZhrawxbOkkvaA==:17 a=M51BFTxLslgA:10 a=jHXeqeKlcSZx5K_ZZZcA:9 a=CjuIK1q_8ugA:10 a=Ms0hgN6XpexoEyWL4h0A:9 a=B2y7HmGcmWMA:10 a=Sqhs8MLHaK0zslS-bRcA:9 X-Origin-Country: SE X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list X-BeenThere: bug-gnu-emacs@gnu.org List-Id: "Bug reports for GNU Emacs, the Swiss army knife of text editors" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Original-Sender: "bug-gnu-emacs" Xref: news.gmane.io gmane.emacs.bugs:183948 Archived-At: --Apple-Mail=_ED3C32FC-7395-4167-8EF0-53313C747201 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset=us-ascii 29 juli 2020 kl. 15.35 skrev Alan Mackenzie : > This is an example of what happens when ignorant people rule the = roost. > -0.0 and +0.0 are identically the same thing. It should not take a > degree in mathematics (which I have) to realise this. When you put > mathematical nonsense into you = cannot > help but get nonsense back out. Thanks Alan -- there are good arguments both for and against negative = zero and I would happily discuss them over a little glass of something = once it is possible to meet in person again. Now we don't have much = choice since IEEE-754 is what it is and we should have very strong = reasons for making changes that conflict with that standard. At the very least we should be consistent. The effort is small enough = (first patch below, I went with the (* x 1) variant). The code did contain a fair amount of obsolete and/or incorrect comments = and decisions, some relating to bug#1334 which is no longer relevant = (Emacs didn't have bignums at the time). Today, the N-arg semantics of = +, - (except for N=3D1), *, min and max (but notably not /) are = equivalent to the corresponding left-folds of binary operations, which = helps a lot. The second patch cleans up and improves optimisation for = arithmetic operations generally. --Apple-Mail=_ED3C32FC-7395-4167-8EF0-53313C747201 Content-Disposition: attachment; filename=0001-Fix-byte-compilation-of-0.0-bug-42597.patch Content-Type: application/octet-stream; x-unix-mode=0644; name="0001-Fix-byte-compilation-of-0.0-bug-42597.patch" Content-Transfer-Encoding: quoted-printable =46rom=20793e9252e3e946dd0d70cb5d461f7a29244b8811=20Mon=20Sep=2017=20= 00:00:00=202001=0AFrom:=20=3D?UTF-8?q?Mattias=3D20Engdeg=3DC3=3DA5rd?=3D=20= =0ADate:=20Mon,=203=20Aug=202020=2015:29:41=20+0200=0A= Subject:=20[PATCH=201/2]=20Fix=20byte-compilation=20of=20(+=20-0.0)=20= (bug#42597)=0A=0A*=20lisp/emacs-lisp/bytecomp.el=20= (byte-compile-associative):=0ATranslate=20numerical=20identity=20= expressions,=20such=20as=20(+=20x)=20and=20(*=20x),=0Ainto=20(*=20x=201)=20= since=20the=20previous=20translation=20(+=20x=200)=20gets=20it=20wrong=0A= for=20x=20=3D=20-0.0.=0A*=20test/lisp/emacs-lisp/bytecomp-tests.el=0A= (byte-opt-testsuite-arith-data):=20Add=20test=20cases.=0A---=0A=20= lisp/emacs-lisp/bytecomp.el=20=20=20=20=20=20=20=20=20=20=20=20|=206=20= +++---=0A=20test/lisp/emacs-lisp/bytecomp-tests.el=20|=205=20+++++=0A=20= 2=20files=20changed,=208=20insertions(+),=203=20deletions(-)=0A=0Adiff=20= --git=20a/lisp/emacs-lisp/bytecomp.el=20b/lisp/emacs-lisp/bytecomp.el=0A= index=2022e648e44b..8f76a3abb9=20100644=0A---=20= a/lisp/emacs-lisp/bytecomp.el=0A+++=20b/lisp/emacs-lisp/bytecomp.el=0A@@=20= -3733,7=20+3733,7=20@@=20byte-compile-get-closed-var=0A=20;;=20Compile=20= a=20function=20that=20accepts=20one=20or=20more=20args=20and=20is=20= right-associative.=0A=20;;=20We=20do=20it=20by=20left-associativity=20so=20= that=20the=20operations=0A=20;;=20are=20done=20in=20the=20same=20order=20= as=20in=20interpreted=20code.=0A-;;=20We=20treat=20the=20one-arg=20case,=20= as=20in=20(+=20x),=20like=20(+=20x=200).=0A+;;=20We=20treat=20the=20= one-arg=20case,=20as=20in=20(+=20x),=20like=20(*=20x=201).=0A=20;;=20in=20= order=20to=20convert=20markers=20to=20numbers,=20and=20trigger=20= expected=20errors.=0A=20(defun=20byte-compile-associative=20(form)=0A=20=20= =20(if=20(cdr=20form)=0A@@=20-3748,8=20+3748,8=20@@=20= byte-compile-associative=0A=20=09=20=20(setq=20args=20(copy-sequence=20= (cdr=20form)))=0A=20=09=20=20(byte-compile-form=20(car=20args))=0A=20=09=20= =20(setq=20args=20(cdr=20args))=0A-=09=20=20(or=20args=20(setq=20args=20= '(0)=0A-=09=09=09=20opcode=20(get=20'+=20'byte-opcode)))=0A+=09=20=20(or=20= args=20(setq=20args=20'(1)=0A+=09=09=09=20opcode=20(get=20'*=20= 'byte-opcode)))=0A=20=09=20=20(dolist=20(arg=20args)=0A=20=09=20=20=20=20= (byte-compile-form=20arg)=0A=20=09=20=20=20=20(byte-compile-out=20opcode=20= 0))))=0Adiff=20--git=20a/test/lisp/emacs-lisp/bytecomp-tests.el=20= b/test/lisp/emacs-lisp/bytecomp-tests.el=0Aindex=20= c235dd43fc..894914300a=20100644=0A---=20= a/test/lisp/emacs-lisp/bytecomp-tests.el=0A+++=20= b/test/lisp/emacs-lisp/bytecomp-tests.el=0A@@=20-47,6=20+47,11=20@@=20= byte-opt-testsuite-arith-data=0A=20=20=20=20=20(let=20((a=201.0))=09=09=09= =09=20=20=20(/=203=20a=202))=0A=20=20=20=20=20(let=20((a=20= most-positive-fixnum)=20(b=202.0))=09=20=20=20(*=20a=202=20b))=0A=20=20=20= =20=20(let=20((a=203)=20(b=202))=09=09=09=09=20=20=20(/=20a=20b=201.0))=0A= +=20=20=20=20(let=20((a=20-0.0))=20(+=20a))=0A+=20=20=20=20(let=20((a=20= -0.0))=20(-=20a))=0A+=20=20=20=20(let=20((a=20-0.0))=20(*=20a))=0A+=20=20= =20=20(let=20((a=20-0.0))=20(min=20a))=0A+=20=20=20=20(let=20((a=20= -0.0))=20(max=20a))=0A=20=20=20=20=20(/=203=20-1)=0A=20=20=20=20=20(+=20= 4=203=202=201)=0A=20=20=20=20=20(+=204=203=202.0=201)=0A--=20=0A2.21.1=20= (Apple=20Git-122.3)=0A=0A= --Apple-Mail=_ED3C32FC-7395-4167-8EF0-53313C747201 Content-Disposition: attachment; filename=0002-Clean-up-and-improve-compilation-of-arithmetic-opera.patch Content-Type: application/octet-stream; x-unix-mode=0644; name="0002-Clean-up-and-improve-compilation-of-arithmetic-opera.patch" Content-Transfer-Encoding: quoted-printable =46rom=208c1a405b2a39b03d167a744f63ac4c5504b9e9ad=20Mon=20Sep=2017=20= 00:00:00=202001=0AFrom:=20=3D?UTF-8?q?Mattias=3D20Engdeg=3DC3=3DA5rd?=3D=20= =0ADate:=20Mon,=203=20Aug=202020=2016:29:06=20+0200=0A= Subject:=20[PATCH=202/2]=20Clean=20up=20and=20improve=20compilation=20of=20= arithmetic=20operations=0A=0A(Bug#42597)=0A=0A*=20= lisp/emacs-lisp/byte-opt.el=20(byte-optimize-associative-math)=0A= (byte-optimize-min-max):=20Transform=203-arg=20min/max=20call=20to=20two=20= 2-arg=0Acalls,=20which=20is=20faster.=0A*=20lisp/emacs-lisp/bytecomp.el=20= (byte-compile-associative):=20Rename=20to...=0A= (byte-compile-variadic-numeric):=20...this=20function=20and=20simplify,=0A= fixing=20incorrect=20comments.=20=20The=203-arg=20strength=20reduction=20= is=20now=0Aalways=20done=20in=20the=20optimisers=20and=20is=20no=20= longer=20needed=20here.=0A(byte-compile-min-max):=20New=20function.=0A= (byte-compile-minus):=20Simplify,=20remove=20incorrect=20comment,=20and=20= use=0Abyte-compile-variadic-numeric.=0A(byte-compile-quo):=20Simplify=20= and=20fix=20comment.=0A---=0A=20lisp/emacs-lisp/byte-opt.el=20|=2029=20= ++++++++----=0A=20lisp/emacs-lisp/bytecomp.el=20|=2093=20= +++++++++++++++++--------------------=0A=202=20files=20changed,=2062=20= insertions(+),=2060=20deletions(-)=0A=0Adiff=20--git=20= a/lisp/emacs-lisp/byte-opt.el=20b/lisp/emacs-lisp/byte-opt.el=0Aindex=20= 0d9c449b3b..4987596bf9=20100644=0A---=20a/lisp/emacs-lisp/byte-opt.el=0A= +++=20b/lisp/emacs-lisp/byte-opt.el=0A@@=20-648,14=20+648,23=20@@=20= byte-optimize-associative-math=0A=20=09=20=20(setq=20args=20(cons=20(car=20= rest)=20args)))=0A=20=20=20=20=20=20=20(setq=20rest=20(cdr=20rest)))=0A=20= =20=20=20=20(if=20(cdr=20constants)=0A-=09(if=20args=0A-=09=20=20=20=20= (list=20(car=20form)=0A-=09=09=20=20(apply=20(car=20form)=20constants)=0A= -=09=09=20=20(if=20(cdr=20args)=0A-=09=09=20=20=20=20=20=20(cons=20(car=20= form)=20(nreverse=20args))=0A-=09=09=20=20=20=20=20=20(car=20args)))=0A-=09= =20=20=20=20(apply=20(car=20form)=20constants))=0A-=09form)))=0A+=20=20=20= =20=20=20=20=20(let=20((const=20(apply=20(car=20form)=20(nreverse=20= constants))))=0A+=09=20=20(if=20args=0A+=09=20=20=20=20=20=20(append=20= (list=20(car=20form)=20const)=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20(nreverse=20args))=0A+=09=20=20=20=20const))=0A+=20= =20=20=20=20=20form)))=0A+=0A+(defun=20byte-optimize-min-max=20(form)=0A= +=20=20"Optimize=20`min'=20and=20`max'."=0A+=20=20(let=20((opt=20= (byte-optimize-associative-math=20form)))=0A+=20=20=20=20(if=20(and=20= (consp=20opt)=20(memq=20(car=20opt)=20'(min=20max))=0A+=20=20=20=20=20=20= =20=20=20=20=20=20=20(=3D=20(length=20opt)=204))=0A+=20=20=20=20=20=20=20= =20;;=20(OP=20x=20y=20z)=20->=20(OP=20(OP=20x=20y)=20z),=20in=20order=20= to=20use=20binary=20byte=20ops.=0A+=20=20=20=20=20=20=20=20(list=20(car=20= opt)=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20(list=20(car=20opt)=20= (nth=201=20opt)=20(nth=202=20opt))=0A+=20=20=20=20=20=20=20=20=20=20=20=20= =20=20(nth=203=20opt))=0A+=20=20=20=20=20=20opt)))=0A=20=0A=20;;=20Use=20= OP=20to=20reduce=20any=20leading=20prefix=20of=20constant=20numbers=20in=20= the=20list=0A=20;;=20(cons=20ACCUM=20ARGS)=20down=20to=20a=20single=20= number,=20and=20return=20the=0A@@=20-878,8=20+887,8=20@@=20= byte-optimize-concat=0A=20(put=20'*=20=20=20'byte-optimizer=20= #'byte-optimize-multiply)=0A=20(put=20'-=20=20=20'byte-optimizer=20= #'byte-optimize-minus)=0A=20(put=20'/=20=20=20'byte-optimizer=20= #'byte-optimize-divide)=0A-(put=20'max=20'byte-optimizer=20= #'byte-optimize-associative-math)=0A-(put=20'min=20'byte-optimizer=20= #'byte-optimize-associative-math)=0A+(put=20'max=20'byte-optimizer=20= #'byte-optimize-min-max)=0A+(put=20'min=20'byte-optimizer=20= #'byte-optimize-min-max)=0A=20=0A=20(put=20'=3D=20=20=20'byte-optimizer=20= #'byte-optimize-binary-predicate)=0A=20(put=20'eq=20=20'byte-optimizer=20= #'byte-optimize-binary-predicate)=0Adiff=20--git=20= a/lisp/emacs-lisp/bytecomp.el=20b/lisp/emacs-lisp/bytecomp.el=0Aindex=20= 8f76a3abb9..7ae8749ab4=20100644=0A---=20a/lisp/emacs-lisp/bytecomp.el=0A= +++=20b/lisp/emacs-lisp/bytecomp.el=0A@@=20-3580,10=20+3580,10=20@@=20= narrow-to-region=0A=20(byte-defop-compiler=20(%=20byte-rem)=092)=0A=20= (byte-defop-compiler=20aset=09=093)=0A=20=0A-(byte-defop-compiler=20max=09= =09byte-compile-associative)=0A-(byte-defop-compiler=20min=09=09= byte-compile-associative)=0A-(byte-defop-compiler=20(+=20byte-plus)=09= byte-compile-associative)=0A-(byte-defop-compiler=20(*=20byte-mult)=09= byte-compile-associative)=0A+(byte-defop-compiler=20max=09=09= byte-compile-min-max)=0A+(byte-defop-compiler=20min=09=09= byte-compile-min-max)=0A+(byte-defop-compiler=20(+=20byte-plus)=09= byte-compile-variadic-numeric)=0A+(byte-defop-compiler=20(*=20byte-mult)=09= byte-compile-variadic-numeric)=0A=20=0A=20;;####(byte-defop-compiler=20= move-to-column=091)=0A=20(byte-defop-compiler-1=20interactive=20= byte-compile-noop)=0A@@=20-3730,30=20+3730,36=20@@=20= byte-compile-get-closed-var=0A=20=20=20(if=20byte-compile--for-effect=20= (setq=20byte-compile--for-effect=20nil)=0A=20=20=20=20=20= (byte-compile-out=20'byte-constant=20(nth=201=20form))))=0A=20=0A-;;=20= Compile=20a=20function=20that=20accepts=20one=20or=20more=20args=20and=20= is=20right-associative.=0A-;;=20We=20do=20it=20by=20left-associativity=20= so=20that=20the=20operations=0A-;;=20are=20done=20in=20the=20same=20= order=20as=20in=20interpreted=20code.=0A-;;=20We=20treat=20the=20one-arg=20= case,=20as=20in=20(+=20x),=20like=20(*=20x=201).=0A-;;=20in=20order=20to=20= convert=20markers=20to=20numbers,=20and=20trigger=20expected=20errors.=0A= -(defun=20byte-compile-associative=20(form)=0A+;;=20Compile=20a=20pure=20= function=20that=20accepts=20zero=20or=20more=20numeric=20arguments=0A+;;=20= and=20has=20an=20opcode=20for=20the=20binary=20case.=0A+;;=20= Single-argument=20calls=20are=20assumed=20to=20be=20numeric=20identity=20= and=20are=0A+;;=20compiled=20as=20(*=20x=201)=20in=20order=20to=20= convert=20markers=20to=20numbers=20and=0A+;;=20trigger=20type=20errors.=0A= +(defun=20byte-compile-variadic-numeric=20(form)=0A+=20=20(pcase=20= (length=20form)=0A+=20=20=20=20(1=0A+=20=20=20=20=20;;=20No=20args:=20= use=20the=20identity=20value=20for=20the=20operation.=0A+=20=20=20=20=20= (byte-compile-constant=20(eval=20form)))=0A+=20=20=20=20(2=0A+=20=20=20=20= =20;;=20One=20arg:=20compile=20(OP=20x)=20as=20(*=20x=201).=20This=20is=20= identity=20for=0A+=20=20=20=20=20;;=20all=20numerical=20values=20= including=20-0.0,=20infinities=20and=20NaNs.=0A+=20=20=20=20=20= (byte-compile-form=20(nth=201=20form))=0A+=20=20=20=20=20= (byte-compile-constant=201)=0A+=20=20=20=20=20(byte-compile-out=20(get=20= '*=20'byte-opcode)=200))=0A+=20=20=20=20(3=0A+=20=20=20=20=20= (byte-compile-form=20(nth=201=20form))=0A+=20=20=20=20=20= (byte-compile-form=20(nth=202=20form))=0A+=20=20=20=20=20= (byte-compile-out=20(get=20(car=20form)=20'byte-opcode)=200))=0A+=20=20=20= =20(_=0A+=20=20=20=20=20;;=20>2=20args:=20compile=20as=20a=20single=20= function=20call.=0A+=20=20=20=20=20(byte-compile-normal-call=20form))))=0A= +=0A+(defun=20byte-compile-min-max=20(form)=0A+=20=20"Byte-compile=20= calls=20to=20`min'=20or=20`max'."=0A=20=20=20(if=20(cdr=20form)=0A-=20=20= =20=20=20=20(let=20((opcode=20(get=20(car=20form)=20'byte-opcode))=0A-=09= =20=20=20=20args)=0A-=09(if=20(and=20(<=203=20(length=20form))=0A-=09=09=20= (memq=20opcode=20(list=20(get=20'+=20'byte-opcode)=0A-=09=09=09=09=20=20=20= =20(get=20'*=20'byte-opcode))))=0A-=09=20=20=20=20;;=20Don't=20use=20= binary=20operations=20for=20>=202=20operands,=20as=20that=0A-=09=20=20=20= =20;;=20may=20cause=20overflow/truncation=20in=20float=20operations.=0A-=09= =20=20=20=20(byte-compile-normal-call=20form)=0A-=09=20=20(setq=20args=20= (copy-sequence=20(cdr=20form)))=0A-=09=20=20(byte-compile-form=20(car=20= args))=0A-=09=20=20(setq=20args=20(cdr=20args))=0A-=09=20=20(or=20args=20= (setq=20args=20'(1)=0A-=09=09=09=20opcode=20(get=20'*=20'byte-opcode)))=0A= -=09=20=20(dolist=20(arg=20args)=0A-=09=20=20=20=20(byte-compile-form=20= arg)=0A-=09=20=20=20=20(byte-compile-out=20opcode=200))))=0A-=20=20=20=20= (byte-compile-constant=20(eval=20form))))=0A+=20=20=20=20=20=20= (byte-compile-variadic-numeric=20form)=0A+=20=20=20=20;;=20No=20args:=20= warn=20and=20emit=20code=20that=20raises=20an=20error=20when=20executed.=0A= +=20=20=20=20(byte-compile-normal-call=20form)))=0A=20=0A=20=0C=0A=20;;=20= more=20complicated=20compiler=20macros=0A@@=20-3768,7=20+3774,7=20@@=20= fset=0A=20(byte-defop-compiler=20indent-to)=0A=20(byte-defop-compiler=20= insert)=0A=20(byte-defop-compiler-1=20function=20= byte-compile-function-form)=0A-(byte-defop-compiler-1=20-=20= byte-compile-minus)=0A+(byte-defop-compiler=20(-=20byte-diff)=20= byte-compile-minus)=0A=20(byte-defop-compiler=20(/=20byte-quo)=20= byte-compile-quo)=0A=20(byte-defop-compiler=20nconc)=0A=20=0A@@=20= -3835,30=20+3841,17=20@@=20byte-compile-concat=0A=20=09=20=20= ((byte-compile-normal-call=20form)))))=0A=20=0A=20(defun=20= byte-compile-minus=20(form)=0A-=20=20(let=20((len=20(length=20form)))=0A= -=20=20=20=20(cond=0A-=20=20=20=20=20((=3D=201=20len)=20= (byte-compile-constant=200))=0A-=20=20=20=20=20((=3D=202=20len)=0A-=20=20= =20=20=20=20(byte-compile-form=20(cadr=20form))=0A-=20=20=20=20=20=20= (byte-compile-out=20'byte-negate=200))=0A-=20=20=20=20=20((=3D=203=20= len)=0A-=20=20=20=20=20=20(byte-compile-form=20(nth=201=20form))=0A-=20=20= =20=20=20=20(byte-compile-form=20(nth=202=20form))=0A-=20=20=20=20=20=20= (byte-compile-out=20'byte-diff=200))=0A-=20=20=20=20=20;;=20Don't=20use=20= binary=20operations=20for=20>=202=20operands,=20as=20that=20may=0A-=20=20= =20=20=20;;=20cause=20overflow/truncation=20in=20float=20operations.=0A-=20= =20=20=20=20(t=20(byte-compile-normal-call=20form)))))=0A+=20=20(if=20= (/=3D=20(length=20form)=202)=0A+=20=20=20=20=20=20= (byte-compile-variadic-numeric=20form)=0A+=20=20=20=20(byte-compile-form=20= (cadr=20form))=0A+=20=20=20=20(byte-compile-out=20'byte-negate=200)))=0A=20= =0A=20(defun=20byte-compile-quo=20(form)=0A-=20=20(let=20((len=20(length=20= form)))=0A-=20=20=20=20(cond=20((<=20len=202)=0A-=09=20=20=20= (byte-compile-subr-wrong-args=20form=20"1=20or=20more"))=0A-=09=20=20((=3D= =20len=203)=0A-=09=20=20=20(byte-compile-two-args=20form))=0A-=09=20=20= (t=0A-=09=20=20=20;;=20Don't=20use=20binary=20operations=20for=20>=202=20= operands,=20as=20that=0A-=09=20=20=20;;=20may=20cause=20= overflow/truncation=20in=20float=20operations.=0A-=09=20=20=20= (byte-compile-normal-call=20form)))))=0A+=20=20(if=20(=3D=20(length=20= form)=203)=0A+=20=20=20=20=20=20(byte-compile-two-args=20form)=0A+=20=20=20= =20;;=20N-ary=20`/'=20is=20not=20the=20left-reduction=20of=20binary=20= `/'=20because=20if=20any=0A+=20=20=20=20;;=20argument=20is=20a=20float,=20= then=20everything=20is=20done=20in=20floating-point.=0A+=20=20=20=20= (byte-compile-normal-call=20form)))=0A=20=0A=20(defun=20= byte-compile-nconc=20(form)=0A=20=20=20(let=20((len=20(length=20form)))=0A= --=20=0A2.21.1=20(Apple=20Git-122.3)=0A=0A= --Apple-Mail=_ED3C32FC-7395-4167-8EF0-53313C747201--