From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 13055 invoked by alias); 23 Sep 2014 06:43:24 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Received: (qmail 13045 invoked by uid 89); 23 Sep 2014 06:43:23 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.8 required=5.0 tests=AWL,BAYES_00,SPF_PASS autolearn=ham version=3.3.2 X-HELO: service87.mimecast.com Received: from service87.mimecast.com (HELO service87.mimecast.com) (91.220.42.44) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Tue, 23 Sep 2014 06:43:13 +0000 Received: from cam-owa1.Emea.Arm.com (fw-tnat.cambridge.arm.com [217.140.96.21]) by service87.mimecast.com; Tue, 23 Sep 2014 07:43:10 +0100 Received: from shawin003 ([10.164.2.46]) by cam-owa1.Emea.Arm.com with Microsoft SMTPSVC(6.0.3790.3959); Tue, 23 Sep 2014 07:43:09 +0100 From: "Zhenqiang Chen" To: Subject: [Ping] [PATCH, 1/10] two hooks for conditional compare (ccmp) Date: Tue, 23 Sep 2014 06:43:00 -0000 Message-ID: <000001cfd6f9$a085fc90$e191f5b0$@arm.com> MIME-Version: 1.0 X-MC-Unique: 114092307431000501 Content-Type: multipart/mixed; boundary="----=_NextPart_000_0001_01CFD73C.AEADD070" X-IsSubscribed: yes X-SW-Source: 2014-09/txt/msg01906.txt.bz2 This is a multipart message in MIME format. ------=_NextPart_000_0001_01CFD73C.AEADD070 Content-Type: text/plain; charset=WINDOWS-1252 Content-Transfer-Encoding: quoted-printable Content-length: 6391 Ping? Patch is attached for easy to apply. Thanks! -Zhenqiang > -----Original Message----- > From: gcc-patches-owner@gcc.gnu.org [mailto:gcc-patches- > owner@gcc.gnu.org] On Behalf Of Zhenqiang Chen > Sent: Monday, June 23, 2014 2:57 PM > To: gcc-patches@gcc.gnu.org > Subject: [PATCH, 1/10] two hooks for conditional compare (ccmp) >=20 > Hi, >=20 > The patch adds two hooks for backends to generate conditional compare > instructions. >=20 > * gen_ccmp_first is for the first compare. > * gen_ccmp_next is for for the following compares. >=20 > The patch is separated from > https://gcc.gnu.org/ml/gcc-patches/2014-02/msg01407.html. >=20 > And the original discussion about the hooks was in thread: >=20 > https://gcc.gnu.org/ml/gcc-patches/2013-10/msg02601.html >=20 > OK for trunk? >=20 > Thanks! > -Zhenqiang >=20 > ChangeLog: > 2014-06-23 Zhenqiang Chen >=20 > * doc/md.texi (ccmp): Add description about conditional compare > instruction pattern. > (TARGET_GEN_CCMP_FIRST): Define. > (TARGET_GEN_CCMP_NEXT): Define. > * doc/tm.texi.in (TARGET_GEN_CCMP_FIRST, > TARGET_GEN_CCMP_NEXT): New. > * target.def (gen_ccmp_first, gen_ccmp_first): Add two new hooks. >=20 > diff --git a/gcc/doc/md.texi b/gcc/doc/md.texi index e17ffca..988c288 100644 > --- a/gcc/doc/md.texi > +++ b/gcc/doc/md.texi > @@ -6216,6 +6216,42 @@ A typical @code{ctrap} pattern looks like > "@dots{}") > @end smallexample >=20 > +@cindex @code{ccmp} instruction pattern @item @samp{ccmp} > Conditional > +compare instruction. Operand 2 and 5 are RTLs which perform two > +comparisons. Operand 1 is AND or IOR, which operates on the result of > +operand 2 and 5. > +It uses recursive method to support more than two compares. e.g. > + > + CC0 =3D CMP (a, b); > + CC1 =3D CCMP (NE (CC0, 0), CMP (e, f)); ... > + CCn =3D CCMP (NE (CCn-1, 0), CMP (...)); > + > +Two target hooks are used to generate conditional compares. > +GEN_CCMP_FISRT is used to generate the first CMP. And > GEN_CCMP_NEXT is > +used to generate the following CCMPs. Operand 1 is AND or IOR. > +Operand 3 is the result of GEN_CCMP_FISRT or a previous > GEN_CCMP_NEXT. Operand 2 is NE. > +Operand 4, 5 and 6 is another compare expression. > + > +A typical CCMP pattern looks like > + > +@smallexample > +(define_insn "*ccmp_and_ior" > + [(set (match_operand 0 "dominant_cc_register" "") > + (compare > + (match_operator 1 > + (match_operator 2 "comparison_operator" > + [(match_operand 3 "dominant_cc_register") > + (const_int 0)]) > + (match_operator 4 "comparison_operator" > + [(match_operand 5 "register_operand") > + (match_operand 6 "compare_operand"])) > + (const_int 0)))] > + "" > + "@dots{}") > +@end smallexample > + > @cindex @code{prefetch} instruction pattern @item @samp{prefetch} diff > --git a/gcc/doc/tm.texi b/gcc/doc/tm.texi index c272630..93f7c74 100644 > --- a/gcc/doc/tm.texi > +++ b/gcc/doc/tm.texi > @@ -11021,6 +11021,23 @@ This target hook is required only when the > target has several different modes and they have different conditional > execution capability, such as ARM. > @end deftypefn >=20 > +@deftypefn {Target Hook} rtx TARGET_GEN_CCMP_FIRST (int @var{code}, > rtx @var{op0}, rtx @var{op1}) > +This function emits a comparison insn for the first of a sequence of > +conditional comparisions. It returns a comparison expression > +appropriate for passing to @code{gen_ccmp_next} or to > @code{cbranch_optab}. > + @code{unsignedp} is used when converting @code{op0} and > @code{op1}'s mode. > +@end deftypefn > + > +@deftypefn {Target Hook} rtx TARGET_GEN_CCMP_NEXT (rtx @var{prev}, > int @var{cmp_code}, rtx @var{op0}, rtx @var{op1}, int @var{bit_code}) > +This function emits a conditional comparison within a sequence of > +conditional comparisons. The @code{prev} expression is the result of a > +prior call to @code{gen_ccmp_first} or @code{gen_ccmp_next}. It may > +return @code{NULL} if the combination of @code{prev} and this > +comparison is not supported, otherwise the result must be appropriate > +for passing to @code{gen_ccmp_next} or @code{cbranch_optab}. > +@code{bit_code} is AND or IOR, which is the op on the two compares. > +@end deftypefn > + > @deftypefn {Target Hook} unsigned TARGET_LOOP_UNROLL_ADJUST > (unsigned @var{nunroll}, struct loop *@var{loop}) This target hook returns a > new value for the number of times @var{loop} should be unrolled. The > parameter @var{nunroll} is the number of times diff --git > a/gcc/doc/tm.texi.in b/gcc/doc/tm.texi.in index dd72b98..e49f8f5 100644 > --- a/gcc/doc/tm.texi.in > +++ b/gcc/doc/tm.texi.in > @@ -8107,6 +8107,10 @@ build_type_attribute_variant (@var{mdecl}, >=20 > @hook TARGET_HAVE_CONDITIONAL_EXECUTION >=20 > +@hook TARGET_GEN_CCMP_FIRST > + > +@hook TARGET_GEN_CCMP_NEXT > + > @hook TARGET_LOOP_UNROLL_ADJUST >=20 > @defmac POWI_MAX_MULTS > diff --git a/gcc/target.def b/gcc/target.def index e455211..6bbb907 100644 > --- a/gcc/target.def > +++ b/gcc/target.def > @@ -2320,6 +2320,27 @@ modes and they have different conditional > execution capability, such as ARM.", > bool, (void), > default_have_conditional_execution) >=20 > +DEFHOOK > +(gen_ccmp_first, > + "This function emits a comparison insn for the first of a sequence > +of\n\ conditional comparisions. It returns a comparison expression > +appropriate\n\ for passing to @code{gen_ccmp_next} or to > +@code{cbranch_optab}.\n\ @code{unsignedp} is used when converting > +@code{op0} and @code{op1}'s mode.", rtx, (int code, rtx op0, rtx op1), > + NULL) > + > +DEFHOOK > +(gen_ccmp_next, > + "This function emits a conditional comparison within a sequence of\n\ > +conditional comparisons. The @code{prev} expression is the result of > +a\n\:q prior call to @code{gen_ccmp_first} or @code{gen_ccmp_next}. > +It may return\n\ @code{NULL} if the combination of @code{prev} and > +this comparison is\n\ not supported, otherwise the result must be > +appropriate for passing to\n\ @code{gen_ccmp_next} or > +@code{cbranch_optab}. @code{bit_code}\n\ is AND or IOR, which is the > +op on the two compares.", rtx, (rtx prev, int cmp_code, rtx op0, rtx > +op1, int bit_code), > + NULL) > + > /* Return a new value for loop unroll size. */ DEFHOOK (loop_unroll_adjust, ------=_NextPart_000_0001_01CFD73C.AEADD070 Content-Transfer-Encoding: base64 Content-Type: application/octet-stream; name="1-hooks.patch" Content-Disposition: attachment; filename="1-hooks.patch" Content-length: 6731 ZGlmZiAtLWdpdCBhL2djYy9kb2MvbWQudGV4aSBiL2djYy9kb2MvbWQudGV4 aQppbmRleCA4MGU4YmQ2Li43OGM0MGRjIDEwMDY0NAotLS0gYS9nY2MvZG9j L21kLnRleGkKKysrIGIvZ2NjL2RvYy9tZC50ZXhpCkBAIC02MjA5LDYgKzYy MDksNDIgQEAgQSB0eXBpY2FsIEBjb2Rle2N0cmFwfSBwYXR0ZXJuIGxvb2tz IGxpa2UKICAgIkBkb3Rze30iKQogQGVuZCBzbWFsbGV4YW1wbGUKIAorQGNp bmRleCBAY29kZXtjY21wfSBpbnN0cnVjdGlvbiBwYXR0ZXJuCitAaXRlbSBA c2FtcHtjY21wfQorQ29uZGl0aW9uYWwgY29tcGFyZSBpbnN0cnVjdGlvbi4g IE9wZXJhbmQgMiBhbmQgNSBhcmUgUlRMcyB3aGljaCBwZXJmb3JtCit0d28g Y29tcGFyaXNvbnMuICBPcGVyYW5kIDEgaXMgQU5EIG9yIElPUiwgd2hpY2gg b3BlcmF0ZXMgb24gdGhlIHJlc3VsdCBvZgorb3BlcmFuZCAyIGFuZCA1Lgor SXQgdXNlcyByZWN1cnNpdmUgbWV0aG9kIHRvIHN1cHBvcnQgbW9yZSB0aGFu IHR3byBjb21wYXJlcy4gIGUuZy4KKworICBDQzAgPSBDTVAgKGEsIGIpOwor ICBDQzEgPSBDQ01QIChORSAoQ0MwLCAwKSwgQ01QIChlLCBmKSk7CisgIC4u LgorICBDQ24gPSBDQ01QIChORSAoQ0NuLTEsIDApLCBDTVAgKC4uLikpOwor CitUd28gdGFyZ2V0IGhvb2tzIGFyZSB1c2VkIHRvIGdlbmVyYXRlIGNvbmRp dGlvbmFsIGNvbXBhcmVzLiAgR0VOX0NDTVBfRklTUlQKK2lzIHVzZWQgdG8g Z2VuZXJhdGUgdGhlIGZpcnN0IENNUC4gIEFuZCBHRU5fQ0NNUF9ORVhUIGlz IHVzZWQgdG8gZ2VuZXJhdGUgdGhlCitmb2xsb3dpbmcgQ0NNUHMuICBPcGVy YW5kIDEgaXMgQU5EIG9yIElPUi4gIE9wZXJhbmQgMyBpcyB0aGUgcmVzdWx0 IG9mCitHRU5fQ0NNUF9GSVNSVCBvciBhIHByZXZpb3VzIEdFTl9DQ01QX05F WFQuICBPcGVyYW5kIDIgaXMgTkUuCitPcGVyYW5kIDQsIDUgYW5kIDYgaXMg YW5vdGhlciBjb21wYXJlIGV4cHJlc3Npb24uCisKK0EgdHlwaWNhbCBDQ01Q IHBhdHRlcm4gbG9va3MgbGlrZQorCitAc21hbGxleGFtcGxlCisoZGVmaW5l X2luc24gIipjY21wX2FuZF9pb3IiCisgIFsoc2V0IChtYXRjaF9vcGVyYW5k IDAgImRvbWluYW50X2NjX3JlZ2lzdGVyIiAiIikKKyAgICAgICAgKGNvbXBh cmUKKyAgICAgICAgIChtYXRjaF9vcGVyYXRvciAxCisgICAgICAgICAgKG1h dGNoX29wZXJhdG9yIDIgImNvbXBhcmlzb25fb3BlcmF0b3IiCisgICAgICAg ICAgIFsobWF0Y2hfb3BlcmFuZCAzICJkb21pbmFudF9jY19yZWdpc3RlciIp CisgICAgICAgICAgICAoY29uc3RfaW50IDApXSkKKyAgICAgICAgICAobWF0 Y2hfb3BlcmF0b3IgNCAiY29tcGFyaXNvbl9vcGVyYXRvciIKKyAgICAgICAg ICAgWyhtYXRjaF9vcGVyYW5kIDUgInJlZ2lzdGVyX29wZXJhbmQiKQorICAg ICAgICAgICAgKG1hdGNoX29wZXJhbmQgNiAiY29tcGFyZV9vcGVyYW5kIl0p KQorICAgICAgICAgKGNvbnN0X2ludCAwKSkpXQorICAiIgorICAiQGRvdHN7 fSIpCitAZW5kIHNtYWxsZXhhbXBsZQorCiBAY2luZGV4IEBjb2Rle3ByZWZl dGNofSBpbnN0cnVjdGlvbiBwYXR0ZXJuCiBAaXRlbSBAc2FtcHtwcmVmZXRj aH0KIFRoaXMgcGF0dGVybiwgaWYgZGVmaW5lZCwgZW1pdHMgY29kZSBmb3Ig YSBub24tZmF1bHRpbmcgZGF0YSBwcmVmZXRjaApkaWZmIC0tZ2l0IGEvZ2Nj L2RvYy90bS50ZXhpIGIvZ2NjL2RvYy90bS50ZXhpCmluZGV4IDM5NjkwOWYu LjRlYzdiOWIgMTAwNjQ0Ci0tLSBhL2djYy9kb2MvdG0udGV4aQorKysgYi9n Y2MvZG9jL3RtLnRleGkKQEAgLTEwOTY4LDYgKzEwOTY4LDIzIEBAIFRoaXMg dGFyZ2V0IGhvb2sgaXMgcmVxdWlyZWQgb25seSB3aGVuIHRoZSB0YXJnZXQg aGFzIHNldmVyYWwgZGlmZmVyZW50CiBtb2RlcyBhbmQgdGhleSBoYXZlIGRp ZmZlcmVudCBjb25kaXRpb25hbCBleGVjdXRpb24gY2FwYWJpbGl0eSwgc3Vj aCBhcyBBUk0uCiBAZW5kIGRlZnR5cGVmbgogCitAZGVmdHlwZWZuIHtUYXJn ZXQgSG9va30gcnR4IFRBUkdFVF9HRU5fQ0NNUF9GSVJTVCAoaW50IEB2YXJ7 Y29kZX0sIHJ0eCBAdmFye29wMH0sIHJ0eCBAdmFye29wMX0pCitUaGlzIGZ1 bmN0aW9uIGVtaXRzIGEgY29tcGFyaXNvbiBpbnNuIGZvciB0aGUgZmlyc3Qg b2YgYSBzZXF1ZW5jZSBvZgorIGNvbmRpdGlvbmFsIGNvbXBhcmlzaW9ucy4g IEl0IHJldHVybnMgYSBjb21wYXJpc29uIGV4cHJlc3Npb24gYXBwcm9wcmlh dGUKKyBmb3IgcGFzc2luZyB0byBAY29kZXtnZW5fY2NtcF9uZXh0fSBvciB0 byBAY29kZXtjYnJhbmNoX29wdGFifS4KKyBAY29kZXt1bnNpZ25lZHB9IGlz IHVzZWQgd2hlbiBjb252ZXJ0aW5nIEBjb2Rle29wMH0gYW5kIEBjb2Rle29w MX0ncyBtb2RlLgorQGVuZCBkZWZ0eXBlZm4KKworQGRlZnR5cGVmbiB7VGFy Z2V0IEhvb2t9IHJ0eCBUQVJHRVRfR0VOX0NDTVBfTkVYVCAocnR4IEB2YXJ7 cHJldn0sIGludCBAdmFye2NtcF9jb2RlfSwgcnR4IEB2YXJ7b3AwfSwgcnR4 IEB2YXJ7b3AxfSwgaW50IEB2YXJ7Yml0X2NvZGV9KQorVGhpcyBmdW5jdGlv biBlbWl0cyBhIGNvbmRpdGlvbmFsIGNvbXBhcmlzb24gd2l0aGluIGEgc2Vx dWVuY2Ugb2YKKyBjb25kaXRpb25hbCBjb21wYXJpc29ucy4gIFRoZSBAY29k ZXtwcmV2fSBleHByZXNzaW9uIGlzIHRoZSByZXN1bHQgb2YgYQorIHByaW9y IGNhbGwgdG8gQGNvZGV7Z2VuX2NjbXBfZmlyc3R9IG9yIEBjb2Rle2dlbl9j Y21wX25leHR9LiAgSXQgbWF5IHJldHVybgorIEBjb2Rle05VTEx9IGlmIHRo ZSBjb21iaW5hdGlvbiBvZiBAY29kZXtwcmV2fSBhbmQgdGhpcyBjb21wYXJp c29uIGlzCisgbm90IHN1cHBvcnRlZCwgb3RoZXJ3aXNlIHRoZSByZXN1bHQg bXVzdCBiZSBhcHByb3ByaWF0ZSBmb3IgcGFzc2luZyB0bworIEBjb2Rle2dl bl9jY21wX25leHR9IG9yIEBjb2Rle2NicmFuY2hfb3B0YWJ9LiAgQGNvZGV7 Yml0X2NvZGV9CisgaXMgQU5EIG9yIElPUiwgd2hpY2ggaXMgdGhlIG9wIG9u IHRoZSB0d28gY29tcGFyZXMuCitAZW5kIGRlZnR5cGVmbgorCiBAZGVmdHlw ZWZuIHtUYXJnZXQgSG9va30gdW5zaWduZWQgVEFSR0VUX0xPT1BfVU5ST0xM X0FESlVTVCAodW5zaWduZWQgQHZhcntudW5yb2xsfSwgc3RydWN0IGxvb3Ag KkB2YXJ7bG9vcH0pCiBUaGlzIHRhcmdldCBob29rIHJldHVybnMgYSBuZXcg dmFsdWUgZm9yIHRoZSBudW1iZXIgb2YgdGltZXMgQHZhcntsb29wfQogc2hv dWxkIGJlIHVucm9sbGVkLiBUaGUgcGFyYW1ldGVyIEB2YXJ7bnVucm9sbH0g aXMgdGhlIG51bWJlciBvZiB0aW1lcwpkaWZmIC0tZ2l0IGEvZ2NjL2RvYy90 bS50ZXhpLmluIGIvZ2NjL2RvYy90bS50ZXhpLmluCmluZGV4IDc5OGMxYWEu LmVjNGUwZDcgMTAwNjQ0Ci0tLSBhL2djYy9kb2MvdG0udGV4aS5pbgorKysg Yi9nY2MvZG9jL3RtLnRleGkuaW4KQEAgLTgwNDMsNiArODA0MywxMCBAQCBi dWlsZF90eXBlX2F0dHJpYnV0ZV92YXJpYW50IChAdmFye21kZWNsfSwKIAog QGhvb2sgVEFSR0VUX0hBVkVfQ09ORElUSU9OQUxfRVhFQ1VUSU9OCiAKK0Bo b29rIFRBUkdFVF9HRU5fQ0NNUF9GSVJTVAorCitAaG9vayBUQVJHRVRfR0VO X0NDTVBfTkVYVAorCiBAaG9vayBUQVJHRVRfTE9PUF9VTlJPTExfQURKVVNU CiAKIEBkZWZtYWMgUE9XSV9NQVhfTVVMVFMKZGlmZiAtLWdpdCBhL2djYy90 YXJnZXQuZGVmIGIvZ2NjL3RhcmdldC5kZWYKaW5kZXggY2UxMWVhZS4uYzQ5 Mjk1ZCAxMDA2NDQKLS0tIGEvZ2NjL3RhcmdldC5kZWYKKysrIGIvZ2NjL3Rh cmdldC5kZWYKQEAgLTIzMjIsNiArMjMyMiwyNyBAQCBtb2RlcyBhbmQgdGhl eSBoYXZlIGRpZmZlcmVudCBjb25kaXRpb25hbCBleGVjdXRpb24gY2FwYWJp bGl0eSwgc3VjaCBhcyBBUk0uIiwKICBib29sLCAodm9pZCksCiAgZGVmYXVs dF9oYXZlX2NvbmRpdGlvbmFsX2V4ZWN1dGlvbikKIAorREVGSE9PSworKGdl bl9jY21wX2ZpcnN0LAorICJUaGlzIGZ1bmN0aW9uIGVtaXRzIGEgY29tcGFy aXNvbiBpbnNuIGZvciB0aGUgZmlyc3Qgb2YgYSBzZXF1ZW5jZSBvZlxuXAor IGNvbmRpdGlvbmFsIGNvbXBhcmlzaW9ucy4gIEl0IHJldHVybnMgYSBjb21w YXJpc29uIGV4cHJlc3Npb24gYXBwcm9wcmlhdGVcblwKKyBmb3IgcGFzc2lu ZyB0byBAY29kZXtnZW5fY2NtcF9uZXh0fSBvciB0byBAY29kZXtjYnJhbmNo X29wdGFifS5cblwKKyBAY29kZXt1bnNpZ25lZHB9IGlzIHVzZWQgd2hlbiBj b252ZXJ0aW5nIEBjb2Rle29wMH0gYW5kIEBjb2Rle29wMX0ncyBtb2RlLiIs CisgcnR4LCAoaW50IGNvZGUsIHJ0eCBvcDAsIHJ0eCBvcDEpLAorIE5VTEwp CisKK0RFRkhPT0sKKyhnZW5fY2NtcF9uZXh0LAorICJUaGlzIGZ1bmN0aW9u IGVtaXRzIGEgY29uZGl0aW9uYWwgY29tcGFyaXNvbiB3aXRoaW4gYSBzZXF1 ZW5jZSBvZlxuXAorIGNvbmRpdGlvbmFsIGNvbXBhcmlzb25zLiAgVGhlIEBj b2Rle3ByZXZ9IGV4cHJlc3Npb24gaXMgdGhlIHJlc3VsdCBvZiBhXG5cCisg cHJpb3IgY2FsbCB0byBAY29kZXtnZW5fY2NtcF9maXJzdH0gb3IgQGNvZGV7 Z2VuX2NjbXBfbmV4dH0uICBJdCBtYXkgcmV0dXJuXG5cCisgQGNvZGV7TlVM TH0gaWYgdGhlIGNvbWJpbmF0aW9uIG9mIEBjb2Rle3ByZXZ9IGFuZCB0aGlz IGNvbXBhcmlzb24gaXNcblwKKyBub3Qgc3VwcG9ydGVkLCBvdGhlcndpc2Ug dGhlIHJlc3VsdCBtdXN0IGJlIGFwcHJvcHJpYXRlIGZvciBwYXNzaW5nIHRv XG5cCisgQGNvZGV7Z2VuX2NjbXBfbmV4dH0gb3IgQGNvZGV7Y2JyYW5jaF9v cHRhYn0uICBAY29kZXtiaXRfY29kZX1cblwKKyBpcyBBTkQgb3IgSU9SLCB3 aGljaCBpcyB0aGUgb3Agb24gdGhlIHR3byBjb21wYXJlcy4iLAorIHJ0eCwg KHJ0eCBwcmV2LCBpbnQgY21wX2NvZGUsIHJ0eCBvcDAsIHJ0eCBvcDEsIGlu dCBiaXRfY29kZSksCisgTlVMTCkKKwogLyogUmV0dXJuIGEgbmV3IHZhbHVl IGZvciBsb29wIHVucm9sbCBzaXplLiAgKi8KIERFRkhPT0sKIChsb29wX3Vu cm9sbF9hZGp1c3QsCg== ------=_NextPart_000_0001_01CFD73C.AEADD070--