From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 19814 invoked by alias); 27 Jun 2011 10:08:29 -0000 Received: (qmail 19691 invoked by uid 22791); 27 Jun 2011 10:08:25 -0000 X-SWARE-Spam-Status: No, hits=-2.4 required=5.0 tests=AWL,BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FROM,RCVD_IN_DNSWL_LOW X-Spam-Check-By: sourceware.org Received: from mail-ew0-f47.google.com (HELO mail-ew0-f47.google.com) (209.85.215.47) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Mon, 27 Jun 2011 10:08:08 +0000 Received: by ewy5 with SMTP id 5so1741288ewy.20 for ; Mon, 27 Jun 2011 03:08:07 -0700 (PDT) Received: by 10.14.17.129 with SMTP id j1mr3857124eej.121.1309169287148; Mon, 27 Jun 2011 03:08:07 -0700 (PDT) MIME-Version: 1.0 Received: by 10.14.101.12 with HTTP; Mon, 27 Jun 2011 03:07:47 -0700 (PDT) In-Reply-To: <4E084291.4030300@gjlay.de> References: <4DF0FAB5.6070704@gjlay.de> <4DF11D20.4030907@gjlay.de> <4DF1ED76.4030507@gjlay.de> <4DF650B7.3030705@gjlay.de> <4DF73490.2080709@gjlay.de> <4DF7D2B5.1090708@gjlay.de> <4DF8ED42.1030706@redhat.com> <4DF918A9.4070003@gjlay.de> <4DF92AEA.4000906@redhat.com> <4DF93B17.8020008@redhat.com> <4E03B658.8020509@redhat.com> <4E078F93.7060901@gjlay.de> <4E084291.4030300@gjlay.de> From: Denis Chertykov Date: Mon, 27 Jun 2011 10:17:00 -0000 Message-ID: Subject: Re: [Patch, AVR]: Fix PR46779 To: Georg-Johann Lay Cc: Richard Henderson , gcc-patches@gcc.gnu.org, Anatoly Sokolov , "Eric B. Weddington" Content-Type: multipart/mixed; boundary=0016e65a0c724fb4c304a6aeba91 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 X-SW-Source: 2011-06/txt/msg01968.txt.bz2 --0016e65a0c724fb4c304a6aeba91 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Content-length: 3064 2011/6/27 Georg-Johann Lay : > Denis Chertykov wrote: >> 2011/6/26 Georg-Johann Lay : >>> Denis Chertykov schrieb: >>>> 2011/6/24 Richard Henderson : >>>> >>>>> On 06/23/2011 01:15 PM, Denis Chertykov wrote: >>>>> >>>>>>> =C2=A0text =C2=A0 =C2=A0data =C2=A0 =C2=A0 bss =C2=A0 =C2=A0 dec = =C2=A0 =C2=A0 hex filename >>>>>>> 10032 =C2=A0 =C2=A0 =C2=A025 =C2=A0 =C2=A0 =C2=A0 0 =C2=A0 10057 = =C2=A0 =C2=A02749 bld-avr-orig/gcc/z.o >>>>>>> =C2=A05816 =C2=A0 =C2=A0 =C2=A025 =C2=A0 =C2=A0 =C2=A0 0 =C2=A0 =C2= =A05841 =C2=A0 =C2=A016d1 bld-avr-new/gcc/z.o >>>>>> Richard, can you send me this z.c file ? >>>>>> Right now I'm notice that new code is worse. >>>>> That's gcc.c-torture/compile/950612-1.c. >>>> I have founded that postreload optimizations can't handle results of >>>> new L_R_A code. >>>> I think that it's can be handled by CSE (postreload). >>> Did you try to add constraint alternative to *addhi3? >>> Like "*!d,d,n" or even "*!r,r,n" >>> >>> I saw some code improvement with that alternative. >> >> I'm trying: >> >> (define_insn "*addhi3" >> =C2=A0 [(set (match_operand:HI 0 "register_operand" "=3Dr,!w,!w,d,r,r,!d= ") >> =C2=A0 =C2=A0 =C2=A0 (plus:HI >> =C2=A0 =C2=A0 =C2=A0 =C2=A0(match_operand:HI 1 "register_operand" "%0,0,= 0,0,0,0,!r") >> =C2=A0 =C2=A0 =C2=A0 =C2=A0(match_operand:HI 2 "nonmemory_operand" "r,I,= J,i,P,N,!ri")))] >> =C2=A0 "" >> =C2=A0 "@ >> =C2=A0 =C2=A0 =C2=A0 add %A0,%A2\;adc %B0,%B2 >> =C2=A0 =C2=A0 =C2=A0 adiw %A0,%2 >> =C2=A0 =C2=A0 =C2=A0 sbiw %A0,%n2 >> =C2=A0 =C2=A0 =C2=A0 subi %A0,lo8(-(%2))\;sbci %B0,hi8(-(%2)) >> =C2=A0 =C2=A0 =C2=A0 sec\;adc %A0,__zero_reg__\;adc %B0,__zero_reg__ >> =C2=A0 =C2=A0 =C2=A0 sec\;sbc %A0,__zero_reg__\;sbc %B0,__zero_reg__ >> =C2=A0 =C2=A0 =C2=A0 =C2=A0 #" >> =C2=A0 [(set_attr "length" "2,1,1,2,3,3,4") >> =C2=A0 =C2=A0(set_attr "cc" "set_n,set_czn,set_czn,set_czn,set_n,set_n,s= et_n")]) >> > > That split will split always: > >> ;; Special split three addressing addhi3 >> ;; to make postreload optimization possible >> (define_split ; addhi3 !d,!r,!ri >> =C2=A0 [(set (match_operand:HI 0 "d_register_operand" "") >> =C2=A0 =C2=A0 =C2=A0 (plus:HI (match_operand:HI 1 "register_operand" "") >> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(match_operand:HI= 2 "nonmemory_operand" "")))] >> =C2=A0 "reload_completed" > =C2=A0 =C2=A0 && REGNO(operands[0]) !=3D REGNO(operands[1])" >> =C2=A0 [(set (match_dup 0) (match_dup 2)) >> =C2=A0 =C2=A0(set (match_dup 0) (plus:HI (match_dup 0) (match_dup 1)))] >> =C2=A0 "") > Maybe it can also restrict to const_int_operand in #2 and then it's > best to > =C2=A0 =C2=A0(set (match_dup 0) > =C2=A0 =C2=A0 =C2=A0 =C2=A0 (match_dup 1)) > =C2=A0 =C2=A0(set (match_dup 0) > =C2=A0 =C2=A0 =C2=A0 =C2=A0 (plus:HI (match_dup 0) > =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(match_dup = 2))) Thanks for suggestions. >> The main problem for me is that the new addressing mode produce a >> worse code in many tests. > > You have an example source? In attachment. Denis. --0016e65a0c724fb4c304a6aeba91 Content-Type: text/x-csrc; charset=US-ASCII; name="pr.c" Content-Disposition: attachment; filename="pr.c" Content-Transfer-Encoding: base64 X-Attachment-Id: f_gpf9iyim0 Content-length: 8292 I2luY2x1ZGUgPHN0ZGFyZy5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNs dWRlIDxzdGRpby5oPgoKI2lmIDAKdW5zaWduZWQgbG9uZyBzaW1wbGVfc3Ry dG91bChjb25zdCBjaGFyICpjcCxjaGFyICoqZW5kcCx1bnNpZ25lZCBpbnQg YmFzZSkKewoJdW5zaWduZWQgbG9uZyByZXN1bHQgPSAwLHZhbHVlOwoKCWlm ICghYmFzZSkgewoJCWJhc2UgPSAxMDsKCQlpZiAoKmNwID09ICcwJykgewoJ CQliYXNlID0gODsKCQkJY3ArKzsKCQkJaWYgKCgqY3AgPT0gJ3gnKSAmJiBp c3hkaWdpdChjcFsxXSkpIHsKCQkJCWNwKys7CgkJCQliYXNlID0gMTY7CgkJ CX0KCQl9Cgl9Cgl3aGlsZSAoaXN4ZGlnaXQoKmNwKSAmJiAodmFsdWUgPSBp c19kaWdpdCgqY3ApID8gKmNwLScwJyA6IChpc2xvd2VyKCpjcCkKCSAgICA/ IHRvdXBwZXIoKmNwKSA6ICpjcCktJ0EnKzEwKSA8IGJhc2UpIHsKCQlyZXN1 bHQgPSByZXN1bHQqYmFzZSArIHZhbHVlOwoJCWNwKys7Cgl9CglpZiAoZW5k cCkKCQkqZW5kcCA9IChjaGFyICopY3A7CglyZXR1cm4gcmVzdWx0Owp9CiNl bmRpZgoKLyogd2UgdXNlIHRoaXMgc28gdGhhdCB3ZSBjYW4gZG8gd2l0aG91 dCB0aGUgY3R5cGUgbGlicmFyeSAqLwoKc3RhdGljIGludCBza2lwX2F0b2ko Y29uc3QgY2hhciAqKnMpCnsKCWludCBpPTA7CgoJd2hpbGUgKGlzX2RpZ2l0 KCoqcykpCgkJaSA9IGkqMTAgKyAqKCgqcykrKykgLSAnMCc7CglyZXR1cm4g aTsKfQoKI2RlZmluZSBaRVJPUEFECTEJCS8qIHBhZCB3aXRoIHplcm8gKi8K I2RlZmluZSBTSUdOCTIJCS8qIHVuc2lnbmVkL3NpZ25lZCBsb25nICovCiNk ZWZpbmUgUExVUwk0CQkvKiBzaG93IHBsdXMgKi8KI2RlZmluZSBTUEFDRQk4 CQkvKiBzcGFjZSBpZiBwbHVzICovCiNkZWZpbmUgTEVGVAkxNgkJLyogbGVm dCBqdXN0aWZpZWQgKi8KI2RlZmluZSBTUEVDSUFMCTMyCQkvKiAweCAqLwoj ZGVmaW5lIExBUkdFCTY0CQkvKiB1c2UgJ0FCQ0RFRicgaW5zdGVhZCBvZiAn YWJjZGVmJyAqLwoKI2RlZmluZSBkb19kaXYobixiYXNlKSAoeyBcCmludCBf X3JlczsgXApfX3JlcyA9ICgodW5zaWduZWQgbG9uZyBsb25nKSBuKSAlICh1 bnNpZ25lZCkgYmFzZTsgXApuID0gKCh1bnNpZ25lZCBsb25nIGxvbmcpIG4p IC8gKHVuc2lnbmVkKSBiYXNlOyBcCl9fcmVzOyB9KQogICAgIApzdGF0aWMg Y2hhciAqIG51bWJlcihjaGFyICogc3RyLCBsb25nIGxvbmcgbnVtLCBpbnQg YmFzZSwgaW50IHNpemUsIGludCBwcmVjaXNpb24KCSxpbnQgdHlwZSkKewoJ Y2hhciBjLHNpZ24sdG1wWzIwXTsKCWNvbnN0IGNoYXIgKmRpZ2l0cz0iMDEy MzQ1Njc4OWFiY2RlZiI7CglpbnQgaTsKCS8qCglpZiAodHlwZSAmIExBUkdF KQoJCWRpZ2l0cyA9ICIwMTIzNDU2Nzg5QUJDREVGIjsKCSovCglpZiAodHlw ZSAmIExFRlQpCgkJdHlwZSAmPSB+WkVST1BBRDsKCWlmIChiYXNlIDwgMiB8 fCBiYXNlID4gMzYpCgkJcmV0dXJuIDA7CgljID0gKHR5cGUgJiBaRVJPUEFE KSA/ICcwJyA6ICcgJzsKCXNpZ24gPSAwOwoKCWlmICh0eXBlICYgU0lHTikg ewoJCWlmIChudW0gPCAwKSB7CgkJCXNpZ24gPSAnLSc7CgkJCW51bSA9IC1u dW07CgkJCXNpemUtLTsKCQl9IGVsc2UgaWYgKHR5cGUgJiBQTFVTKSB7CgkJ CXNpZ24gPSAnKyc7CgkJCXNpemUtLTsKCQl9IGVsc2UgaWYgKHR5cGUgJiBT UEFDRSkgewoJCQlzaWduID0gJyAnOwoJCQlzaXplLS07CgkJfQoJfQoJaWYg KHR5cGUgJiBTUEVDSUFMKSB7CgkJaWYgKGJhc2UgPT0gMTYpCgkJCXNpemUg LT0gMjsKCQllbHNlIGlmIChiYXNlID09IDgpCgkJCXNpemUtLTsKCX0KCWkg PSAwOwoJaWYgKG51bSA9PSAwKQoJCXRtcFtpKytdPScwJzsKCWVsc2Ugd2hp bGUgKG51bSAhPSAwKQoJICAgICAgICAgICAgdG1wW2krK10gPSBkaWdpdHNb ZG9fZGl2KG51bSxiYXNlKV07CglpZiAoaSA+IHByZWNpc2lvbikKCQlwcmVj aXNpb24gPSBpOwoJc2l6ZSAtPSBwcmVjaXNpb247CglpZiAoISh0eXBlJiha RVJPUEFEK0xFRlQpKSkKCQl3aGlsZShzaXplLS0+MCkKCQkJKnN0cisrID0g JyAnOwoJaWYgKHNpZ24pCgkJKnN0cisrID0gc2lnbjsKCWlmICh0eXBlICYg U1BFQ0lBTCkgewoJCWlmIChiYXNlPT04KQoJCQkqc3RyKysgPSAnMCc7CgkJ ZWxzZSBpZiAoYmFzZT09MTYpIHsKCQkJKnN0cisrID0gJzAnOwoJCQkqc3Ry KysgPSAneCc7CgkJfQoJfQoJaWYgKCEodHlwZSAmIExFRlQpKQoJCXdoaWxl IChzaXplLS0gPiAwKQoJCQkqc3RyKysgPSBjOwoJd2hpbGUgKGkgPCBwcmVj aXNpb24tLSkKCQkqc3RyKysgPSAnMCc7Cgl3aGlsZSAoaS0tID4gMCkKCQkq c3RyKysgPSB0bXBbaV07Cgl3aGlsZSAoc2l6ZS0tID4gMCkKCQkqc3RyKysg PSAnICc7CglyZXR1cm4gc3RyOwp9CgpzdGF0aWMgaW50IHZzcHJpbnRmKGNo YXIgKmJ1ZiwgY29uc3QgY2hhciAqZm10LCB2YV9saXN0IGFyZ3MpCnsKCWlu dCBsZW47Cgl1bnNpZ25lZCBsb25nIGxvbmcgbnVtOwoJaW50IGksIGJhc2U7 CgljaGFyICogc3RyOwoJY29uc3QgY2hhciAqczsKCglpbnQgZmxhZ3M7CQkv KiBmbGFncyB0byBudW1iZXIoKSAqLwoKCWludCBmaWVsZF93aWR0aDsJLyog d2lkdGggb2Ygb3V0cHV0IGZpZWxkICovCglpbnQgcHJlY2lzaW9uOwkJLyog bWluLiAjIG9mIGRpZ2l0cyBmb3IgaW50ZWdlcnM7IG1heAoJCQkJICAgbnVt YmVyIG9mIGNoYXJzIGZvciBmcm9tIHN0cmluZyAqLwoJaW50IHF1YWxpZmll cjsJCS8qICdoJywgJ2wnLCBvciAnTCcgZm9yIGludGVnZXIgZmllbGRzICov CgoJZm9yIChzdHI9YnVmIDsgKmZtdCA7ICsrZm10KSB7CgkJaWYgKCpmbXQg IT0gJyUnKSB7CgkJCSpzdHIrKyA9ICpmbXQ7CgkJCWNvbnRpbnVlOwoJCX0K CQkJCgkJLyogcHJvY2VzcyBmbGFncyAqLwoJCWZsYWdzID0gMDsKCQlyZXBl YXQ6CgkJCSsrZm10OwkJLyogdGhpcyBhbHNvIHNraXBzIGZpcnN0ICclJyAq LwoJCQlzd2l0Y2ggKCpmbXQpIHsKCQkJCWNhc2UgJy0nOiBmbGFncyB8PSBM RUZUOyBnb3RvIHJlcGVhdDsKCQkJCWNhc2UgJysnOiBmbGFncyB8PSBQTFVT OyBnb3RvIHJlcGVhdDsKCQkJCWNhc2UgJyAnOiBmbGFncyB8PSBTUEFDRTsg Z290byByZXBlYXQ7CgkJCQljYXNlICcjJzogZmxhZ3MgfD0gU1BFQ0lBTDsg Z290byByZXBlYXQ7CgkJCQljYXNlICcwJzogZmxhZ3MgfD0gWkVST1BBRDsg Z290byByZXBlYXQ7CgkJCQl9CgkJCgkJLyogZ2V0IGZpZWxkIHdpZHRoICov CgkJZmllbGRfd2lkdGggPSAtMTsKCQlpZiAoaXNfZGlnaXQoKmZtdCkpCgkJ CWZpZWxkX3dpZHRoID0gc2tpcF9hdG9pKCZmbXQpOwoJCWVsc2UgaWYgKCpm bXQgPT0gJyonKSB7CgkJCSsrZm10OwoJCQkvKiBpdCdzIHRoZSBuZXh0IGFy Z3VtZW50ICovCgkJCWZpZWxkX3dpZHRoID0gdmFfYXJnKGFyZ3MsIGludCk7 CgkJCWlmIChmaWVsZF93aWR0aCA8IDApIHsKCQkJCWZpZWxkX3dpZHRoID0g LWZpZWxkX3dpZHRoOwoJCQkJZmxhZ3MgfD0gTEVGVDsKCQkJfQoJCX0KCgkJ LyogZ2V0IHRoZSBwcmVjaXNpb24gKi8KCQlwcmVjaXNpb24gPSAtMTsKI2lm IDAKCQlpZiAoKmZtdCA9PSAnLicpIHsKCQkJKytmbXQ7CQoJCQlpZiAoaXNf ZGlnaXQoKmZtdCkpCgkJCQlwcmVjaXNpb24gPSBza2lwX2F0b2koJmZtdCk7 CgkJCWVsc2UgaWYgKCpmbXQgPT0gJyonKSB7CgkJCQkrK2ZtdDsKCQkJCS8q IGl0J3MgdGhlIG5leHQgYXJndW1lbnQgKi8KCQkJCXByZWNpc2lvbiA9IHZh X2FyZyhhcmdzLCBpbnQpOwoJCQl9CgkJCWlmIChwcmVjaXNpb24gPCAwKQoJ CQkJcHJlY2lzaW9uID0gMDsKCQl9CiNlbmRpZgoJCS8qIGdldCB0aGUgY29u dmVyc2lvbiBxdWFsaWZpZXIgKi8KCQlxdWFsaWZpZXIgPSAtMTsKCQlpZiAo KmZtdCA9PSAnaCcgfHwgKmZtdCA9PSAnbCcgfHwgKmZtdCA9PSAnTCcpIHsK CQkJcXVhbGlmaWVyID0gKmZtdDsKCQkJKytmbXQ7CgkJfQoKCQkvKiBkZWZh dWx0IGJhc2UgKi8KCQliYXNlID0gMTA7CgoJCXN3aXRjaCAoKmZtdCkgewoJ CSAgLyoKCQljYXNlICdjJzoKCQkJaWYgKCEoZmxhZ3MgJiBMRUZUKSkKCQkJ CXdoaWxlICgtLWZpZWxkX3dpZHRoID4gMCkKCQkJCQkqc3RyKysgPSAnICc7 CgkJCSpzdHIrKyA9ICh1bnNpZ25lZCBjaGFyKSB2YV9hcmcoYXJncywgaW50 KTsKCQkJd2hpbGUgKC0tZmllbGRfd2lkdGggPiAwKQoJCQkJKnN0cisrID0g JyAnOwoJCQljb250aW51ZTsKCQkgICovCgkJY2FzZSAncyc6CgkJCXMgPSB2 YV9hcmcoYXJncywgY2hhciAqKTsKCQkJaWYgKCFzKQoJCQkJcyA9ICI8TlVM TD4iOwoKCQkJbGVuID0gc3RybmxlbihzLCBwcmVjaXNpb24pOwoKCQkJaWYg KCEoZmxhZ3MgJiBMRUZUKSkKCQkJCXdoaWxlIChsZW4gPCBmaWVsZF93aWR0 aC0tKQoJCQkJCSpzdHIrKyA9ICcgJzsKCQkJZm9yIChpID0gMDsgaSA8IGxl bjsgKytpKQoJCQkJKnN0cisrID0gKnMrKzsKCQkJd2hpbGUgKGxlbiA8IGZp ZWxkX3dpZHRoLS0pCgkJCQkqc3RyKysgPSAnICc7CgkJCWNvbnRpbnVlOwoJ CQkvKgoJCWNhc2UgJ3AnOgoJCQlpZiAoZmllbGRfd2lkdGggPT0gLTEpIHsK CQkJCWZpZWxkX3dpZHRoID0gMipzaXplb2Yodm9pZCAqKTsKCQkJCWZsYWdz IHw9IFpFUk9QQUQ7CgkJCX0KCQkJc3RyID0gbnVtYmVyKHN0ciwKCQkJCSh1 bnNpZ25lZCBsb25nKSB2YV9hcmcoYXJncywgdm9pZCAqKSwgMTYsCgkJCQlm aWVsZF93aWR0aCwgcHJlY2lzaW9uLCBmbGFncyk7CgkJCWNvbnRpbnVlOwoJ CQkqLwoJCQkvKgoJCWNhc2UgJ24nOgoJCQlpZiAocXVhbGlmaWVyID09ICds JykgewoJCQkJbG9uZyAqIGlwID0gdmFfYXJnKGFyZ3MsIGxvbmcgKik7CgkJ CQkqaXAgPSAoc3RyIC0gYnVmKTsKCQkJfSBlbHNlIHsKCQkJCWludCAqIGlw ID0gdmFfYXJnKGFyZ3MsIGludCAqKTsKCQkJCSppcCA9IChzdHIgLSBidWYp OwoJCQl9CgkJCWNvbnRpbnVlOwoJCQkqLwoJCS8qIGludGVnZXIgbnVtYmVy IGZvcm1hdHMgLSBzZXQgdXAgdGhlIGZsYWdzIGFuZCAiYnJlYWsiICovCgkJ CS8qCgkJY2FzZSAnbyc6CgkJCWJhc2UgPSA4OwoJCQlicmVhazsKCQkJKi8K CQkJLyoKCQljYXNlICdYJzoKCQkJZmxhZ3MgfD0gTEFSR0U7CgkJCSovCgkJ Y2FzZSAneCc6CgkJCWJhc2UgPSAxNjsKCQkJYnJlYWs7CgoJCWNhc2UgJ2Qn OgoJCWNhc2UgJ2knOgoJCQlmbGFncyB8PSBTSUdOOwoJCWNhc2UgJ3UnOgoJ CQlicmVhazsKCgkJZGVmYXVsdDoKCQkJaWYgKCpmbXQgIT0gJyUnKQoJCQkJ KnN0cisrID0gJyUnOwoJCQlpZiAoKmZtdCkKCQkJCSpzdHIrKyA9ICpmbXQ7 CgkJCWVsc2UKCQkJCS0tZm10OwoJCQljb250aW51ZTsKCQl9CgkJaWYgKHF1 YWxpZmllciA9PSAnTCcpCgkJICBudW0gPSB2YV9hcmcoYXJncywgdW5zaWdu ZWQgbG9uZyBsb25nKTsKCQllbHNlIGlmIChxdWFsaWZpZXIgPT0gJ2wnKQoJ CQlpZiAoZmxhZ3MgJiBTSUdOKQoJCQkJbnVtID0gdmFfYXJnKGFyZ3MsIGxv bmcpOwoJCQllbHNlCgkJCQludW0gPSB2YV9hcmcoYXJncywgdW5zaWduZWQg bG9uZyk7CgkJZWxzZSBpZiAocXVhbGlmaWVyID09ICdoJykgewoJCQlpZiAo ZmxhZ3MgJiBTSUdOKQoJCQkJbnVtID0gdmFfYXJnKGFyZ3MsIHNob3J0KTsK CQkJZWxzZQoJCQkJbnVtID0gdmFfYXJnKGFyZ3MsIHVuc2lnbmVkIHNob3J0 KTsKCQl9IGVsc2UgaWYgKGZsYWdzICYgU0lHTikKCQkJbnVtID0gdmFfYXJn KGFyZ3MsIGludCk7CgkJZWxzZQoJCQludW0gPSB2YV9hcmcoYXJncywgdW5z aWduZWQgaW50KTsKCQlzdHIgPSBudW1iZXIoc3RyLCBudW0sIGJhc2UsIGZp ZWxkX3dpZHRoLCBwcmVjaXNpb24sIGZsYWdzKTsKCX0KCSpzdHIgPSAnXDAn OwoJcmV0dXJuIHN0ci1idWY7Cn0KCi8qCmludCBzcHJpbnRmKGNoYXIgKiBi dWYsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQp7Cgl2YV9saXN0IGFyZ3M7Cglp bnQgaTsKCgl2YV9zdGFydChhcmdzLCBmbXQpOwoJaT12c3ByaW50ZihidWYs Zm10LGFyZ3MpOwoJdmFfZW5kKGFyZ3MpOwoJcmV0dXJuIGk7Cn0KKi8KCmlu dCBwcmludGYoY29uc3QgY2hhciAqZm10LCAuLi4pCnsKICBjaGFyIGJ1Zlsx MDBdOwogIHZhX2xpc3QgYXJnczsKICBpbnQgaTsKCiAgdmFfc3RhcnQoYXJn cywgZm10KTsKICBpPXZzcHJpbnRmKGJ1ZixmbXQsYXJncyk7CiAgc2VuZF9z dHIgKGJ1Zik7CiAgdmFfZW5kKGFyZ3MpOwogIHJldHVybiBpOwp9Cgo= --0016e65a0c724fb4c304a6aeba91 Content-Type: text/x-csrc; charset=US-ASCII; name="sort.c" Content-Disposition: attachment; filename="sort.c" Content-Transfer-Encoding: base64 X-Attachment-Id: f_gpf9jeod1 Content-length: 1623 LyogVGhpcyBkZW1vbnN0cmF0ZXMgc29tZSBvZiB0aGUgY29tcGlsZXIncyBj b21tb24tc3ViZXhwcmVzc2lvbiovCi8qIGVsaW1pbmF0aW9uIGNhcGFiaWxp dGllcy4gIEZvciBleGFtcGxlLCBpbnNwZWN0IHRoZSBjb2RlICovCi8qIGdl bmVyYXRlZCBmb3IgcHJvY2VkdXJlIFNvcnRfYXJyYXkuICBTZWUgdGhlIFBy b2dyYW1tZXIncyAgICAqLwovKiBHdWlkZSBmb3IgaG93IHRvIHJlcXVlc3Qg YW4gYXNzZW1ibHkgbGlzdGluZyBvbiB5b3VyIGhvc3QuICAgKi8KCnR5cGVk ZWYgdW5zaWduZWQgY2hhciBib29sZWFuOwoKdm9pZCBTb3J0X2FycmF5KCk7 CmxvbmcgVGFiWzEwMF07CgptYWluICgpIHsKICAgbG9uZyBJLEosSyxMOwoK Zm9yIChMID0gMDsgTCA8IDEwMDA7IEwrKykgewogICAvKiBJbml0aWFsaXpl IHRoZSB0YWJsZSB0aGF0IHdpbGwgYmUgc29ydGVkLiAqLwogICBLID0gMDsK ICAgZm9yIChJID0gOTsgSSA+PSAwOyBJLS0pCiAgICAgIGZvciAoSiA9IEkq MTA7IEogPCAoSSsxKSoxMDsgSisrKQogICAgIFRhYltLKytdID0gSiYxID8g SisxIDogSi0xOwoKLyogICBQcmludF9hcnJheSgpOyAqLwogICBTb3J0X2Fy cmF5KFRhYiw5OSk7ICAgICAvKiBTb3J0IGl0LiAqLwovKiAgIFByaW50X2Fy cmF5KCk7ICovCn0KLyogKi8gZXhpdCgwKTsgLyogKi8KfQoKdm9pZApTb3J0 X2FycmF5IChUYWIsTGFzdCkKICAgICBpbnQgVGFiW107CiAgICAgbG9uZyBM YXN0Owp7CiAgIGJvb2xlYW4gU3dhcDsKICAgaW50IFRlbXAsSTsKCiAgIGRv CiAgICAgewogICAgICAgU3dhcCA9IDA7CiAgICAgICBmb3IgKEkgPSAwOyBJ IDwgTGFzdDsgSSsrKQoJIGlmIChUYWJbSV0gPiBUYWJbSSsxXSkKCSAgIHsK CSAgICAgVGVtcCA9IFRhYltJXTsKCSAgICAgVGFiW0ldID0gVGFiW0krMV07 CgkgICAgIFRhYltJKzFdID0gVGVtcDsKCSAgICAgU3dhcCA9IDE7CgkgICB9 CiAgICAgfSB3aGlsZSAoU3dhcCk7Cn0KCnZvaWQgUHJpbnRfYXJyYXkoKSB7 CiAgIGludCBJLEo7CiAgIC8qcHJpbnRmKCJcbkFycmF5IENvbnRlbnRzOlxu Iik7Ki8KICAgZm9yIChJPTA7IEk8PTk7IEkrKykgewogICAgICAvKnByaW50 ZigiJTVkOiIsMTAqSSk7ICovCiAgICAgIGZvciAoSj0wOyBKPD05OyBKKysp OyAvKnByaW50ZigiJTVkIixUYWJbMTAqSStKXSk7ICovCiAgICAgIC8qIHBy aW50ZigiXG4iKTsqLwogICAgICB9Cn0KCg== --0016e65a0c724fb4c304a6aeba91--