From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 96742 invoked by alias); 4 Aug 2019 16:07:41 -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 96734 invoked by uid 89); 4 Aug 2019 16:07:41 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-6.5 required=5.0 tests=AWL,BAYES_20,GIT_PATCH_2,GIT_PATCH_3,KAM_ASCII_DIVIDERS,SPF_PASS autolearn=ham version=3.3.1 spammy=H*F:D*fr, H*i:sk:alpine., universal, PLUS_EXPR X-HELO: mail3-relais-sop.national.inria.fr Received: from mail3-relais-sop.national.inria.fr (HELO mail3-relais-sop.national.inria.fr) (192.134.164.104) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Sun, 04 Aug 2019 16:07:38 +0000 Received: from grove.saclay.inria.fr ([193.55.177.244]) by mail3-relais-sop.national.inria.fr with ESMTP/TLS/DHE-RSA-AES256-SHA; 04 Aug 2019 18:07:35 +0200 Date: Sun, 04 Aug 2019 16:07:00 -0000 From: Marc Glisse To: gcc-patches@gcc.gnu.org Subject: Re: Start implementing -frounding-math In-Reply-To: Message-ID: References: User-Agent: Alpine 2.02 (DEB 1266 2009-07-14) MIME-Version: 1.0 Content-Type: MULTIPART/MIXED; BOUNDARY="8323329-758562103-1564934855=:30902" X-SW-Source: 2019-08/txt/msg00214.txt.bz2 This message is in MIME format. The first part should be readable text, while the remaining parts are likely unreadable without MIME-aware tools. --8323329-758562103-1564934855=:30902 Content-Type: TEXT/PLAIN; format=flowed; charset=ISO-8859-15 Content-Transfer-Encoding: 8BIT Content-length: 2249 Hello, just posting the current version of this patch, in case people have comments. Some changes: the inline asm is introduced during expansion, and the thing is controlled by a different flag (it should be controlled by the pragma, but that's starting to be too many pieces to implement at the same time, and I didn't want to cause a regression for people using -frounding-math in the case where it actually works). I also added an extra parameter, currently always 0, to specify some properties of the operation : the first one I am thinking of is "don't care about exceptions" since I only care about rounding, but that will require even more flags / pragmas to specify the variants we want... For the inline asm, I hesitated between building a temporary GIMPLE_ASM just so I could pass it to the existing expansion, or "inlining" a simplified version. This version always goes through the stack, which matches well with the constraint "=m". One would have to modify the code to allow "=x". Using "=mx", the compiler does simplify things so we actually go through registers (it randomly leaves a dead store to the stack here or there, but not that many and it looks like an existing missed optimization), which makes me think it is not that important to write specific code to handle "=x". Some possible future work: - target hook to specify a constraint different from "=m" - target hook to expand the functions and/or the opaque pass-through - more operations (maybe comparisons, conversions, etc) - lowering generic vector operations, so I can enable them in the front-end - parsing the pragma - optimizations (at least exact constant folding) - constexpr? Disable in some contexts where a dynamic rounding mode makes less sense? - C front-end - Use caller's environment for always_inline callee? We would have to mark the call so we remember what the environment was, and it would be too late for some foldings, but we could still translate the operations that remain, which should be sufficient for the x86 *intrin.h files. To be safe we would have to assume fenv_access on for always_inline functions and only lower them to regular operations when we see the caller, but that might be too much. -- Marc Glisse --8323329-758562103-1564934855=:30902 Content-Type: TEXT/x-diff; name=fenv.patch Content-Transfer-Encoding: BASE64 Content-ID: Content-Description: Content-Disposition: inline; filename=fenv.patch Content-length: 18146 SW5kZXg6IGdjYy9jLWZhbWlseS9jLm9wdA0KPT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PQ0KLS0tIGdjYy9jLWZhbWlseS9jLm9wdAkocmV2aXNpb24gMjc0MDA3 KQ0KKysrIGdjYy9jLWZhbWlseS9jLm9wdAkod29ya2luZyBjb3B5KQ0KQEAg LTE0OTUsMjAgKzE0OTUsMjQgQEAgQyBPYmpDIEMrKyBPYmpDKysgSm9pbmVk IFJlamVjdE5lZ2F0aXZlDQogLWZleGVjLWNoYXJzZXQ9PGNzZXQ+CUNvbnZl cnQgYWxsIHN0cmluZ3MgYW5kIGNoYXJhY3RlciBjb25zdGFudHMgdG8gY2hh cmFjdGVyIHNldCA8Y3NldD4uDQogDQogZmV4dGVuZGVkLWlkZW50aWZpZXJz DQogQyBPYmpDIEMrKyBPYmpDKysNCiBQZXJtaXQgdW5pdmVyc2FsIGNoYXJh Y3RlciBuYW1lcyAoXFx1IGFuZCBcXFUpIGluIGlkZW50aWZpZXJzLg0KIA0K IGZpbnB1dC1jaGFyc2V0PQ0KIEMgT2JqQyBDKysgT2JqQysrIEpvaW5lZCBS ZWplY3ROZWdhdGl2ZQ0KIC1maW5wdXQtY2hhcnNldD08Y3NldD4JU3BlY2lm eSB0aGUgZGVmYXVsdCBjaGFyYWN0ZXIgc2V0IGZvciBzb3VyY2UgZmlsZXMu DQogDQorZmZlbnYtYWNjZXNzDQorQysrIE9iakMrKyBWYXIoZmxhZ19mZW52 X2FjY2VzcykNCitBc3N1bWUgI3ByYWdtYSBTVERDIEZFTlZfQUNDRVNTIE9O IGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHRyYW5zbGF0aW9uIHVuaXQgKGV4 cGVyaW1lbnRhbCBhbmQgaW5jb21wbGV0ZSBzdXBwb3J0KS4NCisNCiBmZXh0 ZXJuLXRscy1pbml0DQogQysrIE9iakMrKyBWYXIoZmxhZ19leHRlcm5fdGxz X2luaXQpIEluaXQoLTEpDQogU3VwcG9ydCBkeW5hbWljIGluaXRpYWxpemF0 aW9uIG9mIHRocmVhZC1sb2NhbCB2YXJpYWJsZXMgaW4gYSBkaWZmZXJlbnQg dHJhbnNsYXRpb24gdW5pdC4NCiANCiBmZXh0ZXJuYWwtdGVtcGxhdGVzDQog QysrIE9iakMrKyBEZXByZWNhdGVkDQogDQogZmZvci1zY29wZQ0KIEMrKyBP YmpDKysgRGVwcmVjYXRlZA0KIA0KSW5kZXg6IGdjYy9jcC9jYWxsLmMNCj09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT0NCi0tLSBnY2MvY3AvY2FsbC5jCShyZXZp c2lvbiAyNzQwMDcpDQorKysgZ2NjL2NwL2NhbGwuYwkod29ya2luZyBjb3B5 KQ0KQEAgLTkxMzcsMjEgKzkxMzcsMzMgQEAgbWF5YmVfd2Fybl9jbGFzc19t ZW1hY2Nlc3MgKGxvY2F0aW9uX3QgbA0KICAgIGhpZ2gtbGV2ZWwgb3BlcmF0 aW9ucy4gICovDQogDQogdHJlZQ0KIGJ1aWxkX2N4eF9jYWxsICh0cmVlIGZu LCBpbnQgbmFyZ3MsIHRyZWUgKmFyZ2FycmF5LA0KIAkJdHN1YnN0X2ZsYWdz X3QgY29tcGxhaW4pDQogew0KICAgdHJlZSBmbmRlY2w7DQogDQogICAvKiBS ZW1lbWJlciByb3VnaGx5IHdoZXJlIHRoaXMgY2FsbCBpcy4gICovDQogICBs b2NhdGlvbl90IGxvYyA9IGNwX2V4cHJfbG9jX29yX2xvYyAoZm4sIGlucHV0 X2xvY2F0aW9uKTsNCi0gIGZuID0gYnVpbGRfY2FsbF9hIChmbiwgbmFyZ3Ms IGFyZ2FycmF5KTsNCisNCisgIGlmIChmbGFnX2ZlbnZfYWNjZXNzICYmIFRS RUVfQ09ERSAoZm4pID09IEFERFJfRVhQUg0KKyAgICAgICYmIChmbmRlY2xf YnVpbHRfaW5fcCAoVFJFRV9PUEVSQU5EIChmbiwgMCksIEJVSUxUX0lOX1NR UlQpDQorCSAgfHwgZm5kZWNsX2J1aWx0X2luX3AgKFRSRUVfT1BFUkFORCAo Zm4sIDApLCBCVUlMVF9JTl9TUVJURikNCisJICB8fCBmbmRlY2xfYnVpbHRf aW5fcCAoVFJFRV9PUEVSQU5EIChmbiwgMCksIEJVSUxUX0lOX1NRUlRMKSkp DQorICAgIHsNCisgICAgICBmbiA9IGJ1aWxkX2NhbGxfZXhwcl9pbnRlcm5h bF9sb2MgKGxvYywgSUZOX0ZFTlZfU1FSVCwNCisJCQkJCSBUUkVFX1RZUEUg KGFyZ2FycmF5WzBdKSwgMiwNCisJCQkJCSBhcmdhcnJheVswXSwgaW50ZWdl cl96ZXJvX25vZGUpOw0KKyAgICAgIFRSRUVfU0lERV9FRkZFQ1RTIChmbikg PSAxOw0KKyAgICB9DQorICBlbHNlDQorICAgIGZuID0gYnVpbGRfY2FsbF9h IChmbiwgbmFyZ3MsIGFyZ2FycmF5KTsNCiAgIFNFVF9FWFBSX0xPQ0FUSU9O IChmbiwgbG9jKTsNCiANCiAgIGZuZGVjbCA9IGdldF9jYWxsZWVfZm5kZWNs IChmbik7DQogDQogICAvKiBDaGVjayB0aGF0IGFyZ3VtZW50cyB0byBidWls dGluIGZ1bmN0aW9ucyBtYXRjaCB0aGUgZXhwZWN0YXRpb25zLiAgKi8NCiAg IGlmIChmbmRlY2wNCiAgICAgICAmJiAhcHJvY2Vzc2luZ190ZW1wbGF0ZV9k ZWNsDQogICAgICAgJiYgZm5kZWNsX2J1aWx0X2luX3AgKGZuZGVjbCwgQlVJ TFRfSU5fTk9STUFMKSkNCiAgICAgew0KICAgICAgIGludCBpOw0KSW5kZXg6 IGdjYy9jcC90eXBlY2suYw0KPT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLS0t IGdjYy9jcC90eXBlY2suYwkocmV2aXNpb24gMjc0MDA3KQ0KKysrIGdjYy9j cC90eXBlY2suYwkod29ya2luZyBjb3B5KQ0KQEAgLTU1NDMsMjAgKzU1NDMs NTIgQEAgY3BfYnVpbGRfYmluYXJ5X29wIChjb25zdCBvcF9sb2NhdGlvbl90 DQogCSAgaWYgKFRSRUVfVFlQRSAoY29wMCkgIT0gb3JpZ190eXBlKQ0KIAkg ICAgY29wMCA9IGNwX2NvbnZlcnQgKG9yaWdfdHlwZSwgb3AwLCBjb21wbGFp bik7DQogCSAgaWYgKFRSRUVfVFlQRSAoY29wMSkgIT0gb3JpZ190eXBlKQ0K IAkgICAgY29wMSA9IGNwX2NvbnZlcnQgKG9yaWdfdHlwZSwgb3AxLCBjb21w bGFpbik7DQogCSAgaW5zdHJ1bWVudF9leHByID0gdWJzYW5faW5zdHJ1bWVu dF9kaXZpc2lvbiAobG9jYXRpb24sIGNvcDAsIGNvcDEpOw0KIAl9DQogICAg ICAgZWxzZSBpZiAoZG9pbmdfc2hpZnQgJiYgc2FuaXRpemVfZmxhZ3NfcCAo U0FOSVRJWkVfU0hJRlQpKQ0KIAlpbnN0cnVtZW50X2V4cHIgPSB1YnNhbl9p bnN0cnVtZW50X3NoaWZ0IChsb2NhdGlvbiwgY29kZSwgb3AwLCBvcDEpOw0K ICAgICB9DQogDQorICAvLyBGSVhNRTogdmVjdG9ycyAoYW5kIGNvbXBsZXg/ KSBhcyB3ZWxsDQorICBpZiAoZmxhZ19mZW52X2FjY2VzcyAmJiBTQ0FMQVJf RkxPQVRfVFlQRV9QIChidWlsZF90eXBlKSkNCisgICAgew0KKyAgICAgIGJv b2wgZG9fZmVudl9zdWJzdCA9IHRydWU7DQorICAgICAgaW50ZXJuYWxfZm4g aWZuOw0KKyAgICAgIHN3aXRjaCAocmVzdWx0Y29kZSkNCisJew0KKwljYXNl IFBMVVNfRVhQUjoNCisJICBpZm4gPSBJRk5fRkVOVl9QTFVTOw0KKwkgIGJy ZWFrOw0KKwljYXNlIE1JTlVTX0VYUFI6DQorCSAgaWZuID0gSUZOX0ZFTlZf TUlOVVM7DQorCSAgYnJlYWs7DQorCWNhc2UgTVVMVF9FWFBSOg0KKwkgIGlm biA9IElGTl9GRU5WX01VTFQ7DQorCSAgYnJlYWs7DQorCWNhc2UgUkRJVl9F WFBSOg0KKwkgIGlmbiA9IElGTl9GRU5WX1JESVY7DQorCSAgYnJlYWs7DQor CWRlZmF1bHQ6DQorCSAgZG9fZmVudl9zdWJzdCA9IGZhbHNlOw0KKwl9DQor ICAgICAgaWYgKGRvX2ZlbnZfc3Vic3QpDQorCXsNCisJICByZXN1bHQgPSBi dWlsZF9jYWxsX2V4cHJfaW50ZXJuYWxfbG9jIChsb2NhdGlvbiwgaWZuLCBi dWlsZF90eXBlLA0KKwkJCQkJCSAzLCBvcDAsIG9wMSwNCisJCQkJCQkgaW50 ZWdlcl96ZXJvX25vZGUpOw0KKwkgIFRSRUVfU0lERV9FRkZFQ1RTIChyZXN1 bHQpID0gMTsNCisJICByZXR1cm4gcmVzdWx0Ow0KKwl9DQorICAgIH0NCisN CiAgIHJlc3VsdCA9IGJ1aWxkMl9sb2MgKGxvY2F0aW9uLCByZXN1bHRjb2Rl LCBidWlsZF90eXBlLCBvcDAsIG9wMSk7DQogICBpZiAoZmluYWxfdHlwZSAh PSAwKQ0KICAgICByZXN1bHQgPSBjcF9jb252ZXJ0IChmaW5hbF90eXBlLCBy ZXN1bHQsIGNvbXBsYWluKTsNCiANCiAgIGlmIChpbnN0cnVtZW50X2V4cHIg IT0gTlVMTCkNCiAgICAgcmVzdWx0ID0gYnVpbGQyIChDT01QT1VORF9FWFBS LCBUUkVFX1RZUEUgKHJlc3VsdCksDQogCQkgICAgIGluc3RydW1lbnRfZXhw ciwgcmVzdWx0KTsNCiANCiAgIGlmICghcHJvY2Vzc2luZ190ZW1wbGF0ZV9k ZWNsKQ0KICAgICB7DQpAQCAtNjUwMSwyMCArNjUzMywzMiBAQCBjcF9idWls ZF91bmFyeV9vcCAoZW51bSB0cmVlX2NvZGUgY29kZSwNCiAgICAgICByZXR1 cm4gY3BfYnVpbGRfYWRkcl9leHByIChhcmcsIGNvbXBsYWluKTsNCiANCiAg ICAgZGVmYXVsdDoNCiAgICAgICBicmVhazsNCiAgICAgfQ0KIA0KICAgaWYg KCFlcnJzdHJpbmcpDQogICAgIHsNCiAgICAgICBpZiAoYXJndHlwZSA9PSAw KQ0KIAlhcmd0eXBlID0gVFJFRV9UWVBFIChhcmcpOw0KKyAgICAgIC8vIEZJ WE1FOiB2ZWN0b3JzIChhbmQgY29tcGxleD8pIGFzIHdlbGwNCisgICAgICBp ZiAoZmxhZ19mZW52X2FjY2Vzcw0KKwkgICYmIFNDQUxBUl9GTE9BVF9UWVBF X1AgKGFyZ3R5cGUpDQorCSAgJiYgY29kZSA9PSBORUdBVEVfRVhQUikNCisJ ew0KKwkgIHRyZWUgcmVzdWx0DQorCSAgICA9IGJ1aWxkX2NhbGxfZXhwcl9p bnRlcm5hbF9sb2MgKGxvY2F0aW9uLCBJRk5fRkVOVl9ORUdBVEUsDQorCQkJ CQkgICAgYXJndHlwZSwgMiwgYXJnLA0KKwkJCQkJICAgIGludGVnZXJfemVy b19ub2RlKTsNCisJICBUUkVFX1NJREVfRUZGRUNUUyAocmVzdWx0KSA9IDE7 DQorCSAgcmV0dXJuIHJlc3VsdDsNCisJfQ0KICAgICAgIHJldHVybiBidWls ZDEgKGNvZGUsIGFyZ3R5cGUsIGFyZyk7DQogICAgIH0NCiANCiAgIGlmIChj b21wbGFpbiAmIHRmX2Vycm9yKQ0KICAgICBlcnJvciAoIiVzIiwgZXJyc3Ry aW5nKTsNCiAgIHJldHVybiBlcnJvcl9tYXJrX25vZGU7DQogfQ0KIA0KIC8q IEhvb2sgZm9yIHRoZSBjLWNvbW1vbiBiaXRzIHRoYXQgYnVpbGQgYSB1bmFy eSBvcC4gICovDQogdHJlZQ0KSW5kZXg6IGdjYy9pbnRlcm5hbC1mbi5jDQo9 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09DQotLS0gZ2NjL2ludGVybmFsLWZuLmMJ KHJldmlzaW9uIDI3NDAwNykNCisrKyBnY2MvaW50ZXJuYWwtZm4uYwkod29y a2luZyBjb3B5KQ0KQEAgLTIzLDIwICsyMywyMSBAQCBhbG9uZyB3aXRoIEdD Qzsgc2VlIHRoZSBmaWxlIENPUFlJTkczLg0KICNpbmNsdWRlICJiYWNrZW5k LmgiDQogI2luY2x1ZGUgInRhcmdldC5oIg0KICNpbmNsdWRlICJydGwuaCIN CiAjaW5jbHVkZSAidHJlZS5oIg0KICNpbmNsdWRlICJnaW1wbGUuaCINCiAj aW5jbHVkZSAicHJlZGljdC5oIg0KICNpbmNsdWRlICJzdHJpbmdwb29sLmgi DQogI2luY2x1ZGUgInRyZWUtdnJwLmgiDQogI2luY2x1ZGUgInRyZWUtc3Nh bmFtZXMuaCINCiAjaW5jbHVkZSAiZXhwbWVkLmgiDQorI2luY2x1ZGUgImV4 cGxvdy5oIg0KICNpbmNsdWRlICJtZW1tb2RlbC5oIg0KICNpbmNsdWRlICJv cHRhYnMuaCINCiAjaW5jbHVkZSAiZW1pdC1ydGwuaCINCiAjaW5jbHVkZSAi ZGlhZ25vc3RpYy1jb3JlLmgiDQogI2luY2x1ZGUgImZvbGQtY29uc3QuaCIN CiAjaW5jbHVkZSAiaW50ZXJuYWwtZm4uaCINCiAjaW5jbHVkZSAic3Rvci1s YXlvdXQuaCINCiAjaW5jbHVkZSAiZG9qdW1wLmgiDQogI2luY2x1ZGUgImV4 cHIuaCINCiAjaW5jbHVkZSAic3RyaW5ncG9vbC5oIg0KQEAgLTI4NjksMjAg KzI4NzAsMjE0IEBAIGV4cGFuZF9ESVZNT0QgKGludGVybmFsX2ZuLCBnY2Fs bCAqY2FsbF8NCiB9DQogDQogLyogRXhwYW5kIGEgTk9QLiAgKi8NCiANCiBz dGF0aWMgdm9pZA0KIGV4cGFuZF9OT1AgKGludGVybmFsX2ZuLCBnY2FsbCAq KQ0KIHsNCiAgIC8qIE5vdGhpbmcuICBCdXQgaXQgc2hvdWxkbid0IHJlYWxs eSBwcmV2YWlsLiAgKi8NCiB9DQogDQorLyogQ2hlY2tzIGlmIE9QIGlzIGFs cmVhZHkgcHJvdGVjdGVkIChpbiBwYXJ0aWN1bGFyIHRoZSByZXN1bHQgb2Yg c29tZSBGRU5WDQorICAgYXJpdGhtZXRpYykgYW5kIHRodXMgY2FuIHNraXAg dGhlIGlubGluZSBhc20uICAqLw0KK3N0YXRpYyBib29sDQorYWxyZWFkeV9w cm90ZWN0ZWQgKHRyZWUgb3ApDQorew0KKyAgLy8gVE9ETzogZnVuY3Rpb24g cGFyYW1ldGVycy9yZXR1cm5zLCB2b2xhdGlsZSByZWFkcywgZXRjIG1heSBh bHNvIGJlIG9rPw0KKyAgZ2ltcGxlICpkZWZfc3RtdDsNCisgIGlmIChUUkVF X0NPREUgKG9wKSAhPSBTU0FfTkFNRQ0KKyAgICAgIHx8ICEoZGVmX3N0bXQg PSBTU0FfTkFNRV9ERUZfU1RNVCAob3ApKQ0KKyAgICAgIHx8IGdpbXBsZV9j b2RlIChkZWZfc3RtdCkgIT0gR0lNUExFX0NBTEwNCisgICAgICB8fCAhZ2lt cGxlX2NhbGxfaW50ZXJuYWxfcCAoZGVmX3N0bXQpKQ0KKyAgICByZXR1cm4g ZmFsc2U7DQorICBzd2l0Y2ggKGdpbXBsZV9jYWxsX2ludGVybmFsX2ZuIChk ZWZfc3RtdCkpDQorICAgIHsNCisgICAgY2FzZSBJRk5fRkVOVl9QTFVTOg0K KyAgICBjYXNlIElGTl9GRU5WX01JTlVTOg0KKyAgICBjYXNlIElGTl9GRU5W X01VTFQ6DQorICAgIGNhc2UgSUZOX0ZFTlZfUkRJVjoNCisgICAgY2FzZSBJ Rk5fRkVOVl9ORUdBVEU6DQorICAgIGNhc2UgSUZOX0ZFTlZfU1FSVDoNCisg ICAgICByZXR1cm4gdHJ1ZTsNCisgICAgZGVmYXVsdDoNCisgICAgICByZXR1 cm4gZmFsc2U7DQorICAgIH0NCit9DQorDQorLyogRW1pdCBhc20gdm9sYXRp bGUgd2l0aCBpbm91dCBtZW1vcnkgcGFyYW1ldGVyIFguICAqLw0KK3N0YXRp YyB2b2lkDQorZW1pdF9hc21fcHJvdGVjdGlvbiAocnR4IHgsIG1hY2hpbmVf bW9kZSBtb2RlLCBsb2NhdGlvbl90IGxvYykNCit7DQorICBjb25zdCBjaGFy KiBjb25zdHJhaW50ID0gIj1tIjsNCisgIHJ0dmVjIGFyZ3ZlYyA9IHJ0dmVj X2FsbG9jICgxKTsNCisgIHJ0dmVjIGNvbnN0cmFpbnR2ZWMgPSBydHZlY19h bGxvYyAoMSk7DQorICBydHZlYyBsYWJlbHZlYyA9IHJ0dmVjX2FsbG9jICgw KTsNCisgIHJ0eCBib2R5ID0gZ2VuX3J0eF9BU01fT1BFUkFORFMgKG1vZGUs ICIiLCAiIiwgMCwgYXJndmVjLCBjb25zdHJhaW50dmVjLA0KKwkJCQkgICBs YWJlbHZlYywgbG9jKTsNCisgIE1FTV9WT0xBVElMRV9QIChib2R5KSA9IHRy dWU7DQorICBBU01fT1BFUkFORFNfSU5QVVQgKGJvZHksIDApID0geDsNCisg IEFTTV9PUEVSQU5EU19JTlBVVF9DT05TVFJBSU5UX0VYUCAoYm9keSwgMCkN CisgICAgPSBnZW5fcnR4X0FTTV9JTlBVVF9sb2MgKG1vZGUsICIwIiwgbG9j KTsNCisgIEFTTV9PUEVSQU5EU19PVVRQVVRfQ09OU1RSQUlOVCAoYm9keSkg PSBjb25zdHJhaW50Ow0KKyAgZW1pdF9pbnNuIChnZW5fcnR4X1NFVCAoeCwg Ym9keSkpOw0KK30NCisNCisvKiBFeHBhbmQgRkVOVi1wcm90ZWN0ZWQgYXJp dGhtZXRpYy4gICovDQorc3RhdGljIHZvaWQNCitleHBhbmRfRkVOVl9iaW5v cCAoZ2NhbGwgKnN0bXQsIHRyZWVfY29kZSBjb2RlKQ0KK3sNCisgIHRyZWUg bGhzID0gZ2ltcGxlX2NhbGxfbGhzIChzdG10KTsNCisgIHRyZWUgb3AwID0g Z2ltcGxlX2NhbGxfYXJnIChzdG10LCAwKTsNCisgIHRyZWUgb3AxID0gZ2lt cGxlX2NhbGxfYXJnIChzdG10LCAxKTsNCisgIHRyZWUgZnR5cGUgPSBUUkVF X1RZUEUgKG9wMCk7DQorICBtYWNoaW5lX21vZGUgZm1vZGUgPSBUWVBFX01P REUgKGZ0eXBlKTsNCisgIGxvY2F0aW9uX3QgbG9jID0gZ2ltcGxlX2xvY2F0 aW9uIChzdG10KTsNCisgIHJ0eCB4MCwgeDE7DQorICBib29sIHNraXAwID0g ZmFsc2U7DQorDQorICBpZiAoYWxyZWFkeV9wcm90ZWN0ZWQgKG9wMCkpDQor ICAgIHsNCisgICAgICBza2lwMCA9IHRydWU7DQorICAgICAgeDAgPSBleHBh bmRfbm9ybWFsIChvcDApOw0KKyAgICB9DQorICBlbHNlDQorICAgIHsNCisg ICAgICB4MCA9IHZhbGlkaXplX21lbSAoYXNzaWduX3RlbXAgKGZ0eXBlLCB0 cnVlLCB0cnVlKSk7DQorICAgICAgZXhwYW5kX2Fzc2lnbm1lbnQgKG1ha2Vf dHJlZSAoZnR5cGUsIHgwKSwgb3AwLCBmYWxzZSk7DQorICAgICAgZW1pdF9h c21fcHJvdGVjdGlvbiAoeDAsIGZtb2RlLCBsb2MpOw0KKyAgICB9DQorDQor ICAvKiBDYXJlZnVsIG5vdCB0byBlbmQgdXAgd2l0aCBzb21ldGhpbmcgbGlr ZSBYIC0gWCwgd2hpY2ggY291bGQgZ2V0DQorICAgICBzaW1wbGlmaWVkLiAg Ki8NCisgIGlmICghc2tpcDAgJiYgYWxyZWFkeV9wcm90ZWN0ZWQgKG9wMSkp DQorICAgIHsNCisgICAgICB4MSA9IGV4cGFuZF9ub3JtYWwgKG9wMSk7DQor ICAgIH0NCisgIGVsc2UNCisgICAgew0KKyAgICAgIHgxID0gdmFsaWRpemVf bWVtIChhc3NpZ25fdGVtcCAoZnR5cGUsIHRydWUsIHRydWUpKTsNCisgICAg ICBleHBhbmRfYXNzaWdubWVudCAobWFrZV90cmVlIChmdHlwZSwgeDEpLCBv cDEsIGZhbHNlKTsNCisgICAgICBlbWl0X2FzbV9wcm90ZWN0aW9uICh4MSwg Zm1vZGUsIGxvYyk7DQorICAgIH0NCisNCisgIHJ0eCB4MiA9IHZhbGlkaXpl X21lbSAoYXNzaWduX3RlbXAgKGZ0eXBlLCB0cnVlLCB0cnVlKSk7DQorICAv LyBVc2luZyBzb21lIGludGVybWVkaWF0ZSByZWdpc3RlcnMgZm9yIHgwIGFu ZCB4MSBjb3VsZCBoZWxwIHg4NiBhdm9pZA0KKyAgLy8gcmVnK21lbSB3aGVu IGl0IGlzbid0IG5lY2Vzc2FyeS4gSXQgY291bGQgYWxzbyBzYXZlIGEgYml0 IG9mIHN0YWNrLg0KKyAgb3B0YWIgbyA9IG9wdGFiX2Zvcl90cmVlX2NvZGUg KGNvZGUsIGZ0eXBlLCBvcHRhYl9kZWZhdWx0KTsNCisgIHJ0eCB5MiA9IGV4 cGFuZF9iaW5vcCAoZm1vZGUsIG8sIHgwLCB4MSwgeDIsIGZhbHNlLCBPUFRB Ql9ESVJFQ1QpOw0KKyAgaWYgKHgyICE9IHkyKQ0KKyAgICBlbWl0X21vdmVf aW5zbiAoeDIsIHkyKTsNCisgIGVtaXRfYXNtX3Byb3RlY3Rpb24gKHgyLCBm bW9kZSwgbG9jKTsNCisgIGlmIChsaHMpDQorICAgIGV4cGFuZF9hc3NpZ25t ZW50IChsaHMsIG1ha2VfdHJlZSAoZnR5cGUsIHgyKSwgZmFsc2UpOw0KKyAg Y3J0bC0+aGFzX2FzbV9zdGF0ZW1lbnQgPSAxOw0KK30NCisNCitzdGF0aWMg dm9pZA0KK2V4cGFuZF9GRU5WX1BMVVMgKGludGVybmFsX2ZuLCBnY2FsbCAq c3RtdCkNCit7DQorICBleHBhbmRfRkVOVl9iaW5vcCAoc3RtdCwgUExVU19F WFBSKTsNCit9DQorDQorc3RhdGljIHZvaWQNCitleHBhbmRfRkVOVl9NSU5V UyAoaW50ZXJuYWxfZm4sIGdjYWxsICpzdG10KQ0KK3sNCisgIGV4cGFuZF9G RU5WX2Jpbm9wIChzdG10LCBNSU5VU19FWFBSKTsNCit9DQorDQorc3RhdGlj IHZvaWQNCitleHBhbmRfRkVOVl9NVUxUIChpbnRlcm5hbF9mbiwgZ2NhbGwg KnN0bXQpDQorew0KKyAgZXhwYW5kX0ZFTlZfYmlub3AgKHN0bXQsIE1VTFRf RVhQUik7DQorfQ0KKw0KK3N0YXRpYyB2b2lkDQorZXhwYW5kX0ZFTlZfUkRJ ViAoaW50ZXJuYWxfZm4sIGdjYWxsICpzdG10KQ0KK3sNCisgIGV4cGFuZF9G RU5WX2Jpbm9wIChzdG10LCBSRElWX0VYUFIpOw0KK30NCisNCitzdGF0aWMg dm9pZA0KK2V4cGFuZF9GRU5WX05FR0FURSAoaW50ZXJuYWxfZm4sIGdjYWxs ICpzdG10KQ0KK3sNCisgIHRyZWUgbGhzID0gZ2ltcGxlX2NhbGxfbGhzIChz dG10KTsNCisgIHRyZWUgb3AgPSBnaW1wbGVfY2FsbF9hcmcgKHN0bXQsIDAp Ow0KKyAgdHJlZSBmdHlwZSA9IFRSRUVfVFlQRSAob3ApOw0KKyAgbWFjaGlu ZV9tb2RlIGZtb2RlID0gVFlQRV9NT0RFIChmdHlwZSk7DQorICBsb2NhdGlv bl90IGxvYyA9IGdpbXBsZV9sb2NhdGlvbiAoc3RtdCk7DQorICBydHggeDsN CisNCisgIGlmIChhbHJlYWR5X3Byb3RlY3RlZCAob3ApKQ0KKyAgICB7DQor ICAgICAgeCA9IGV4cGFuZF9ub3JtYWwgKG9wKTsNCisgICAgfQ0KKyAgZWxz ZQ0KKyAgICB7DQorICAgICAgeCA9IHZhbGlkaXplX21lbSAoYXNzaWduX3Rl bXAgKGZ0eXBlLCB0cnVlLCB0cnVlKSk7DQorICAgICAgZXhwYW5kX2Fzc2ln bm1lbnQgKG1ha2VfdHJlZSAoZnR5cGUsIHgpLCBvcCwgZmFsc2UpOw0KKyAg ICAgIGVtaXRfYXNtX3Byb3RlY3Rpb24gKHgsIGZtb2RlLCBsb2MpOw0KKyAg ICB9DQorDQorICBydHggeDIgPSB2YWxpZGl6ZV9tZW0gKGFzc2lnbl90ZW1w IChmdHlwZSwgdHJ1ZSwgdHJ1ZSkpOw0KKyAgb3B0YWIgbyA9IG9wdGFiX2Zv cl90cmVlX2NvZGUgKE5FR0FURV9FWFBSLCBmdHlwZSwgb3B0YWJfZGVmYXVs dCk7DQorICBydHggeTIgPSBleHBhbmRfdW5vcCAoZm1vZGUsIG8sIHgsIHgy LCBmYWxzZSk7DQorICBpZiAoeDIgIT0geTIpDQorICAgIGVtaXRfbW92ZV9p bnNuICh4MiwgeTIpOw0KKyAgZW1pdF9hc21fcHJvdGVjdGlvbiAoeDIsIGZt b2RlLCBsb2MpOw0KKyAgaWYgKGxocykNCisgICAgZXhwYW5kX2Fzc2lnbm1l bnQgKGxocywgbWFrZV90cmVlIChmdHlwZSwgeDIpLCBmYWxzZSk7DQorICBj cnRsLT5oYXNfYXNtX3N0YXRlbWVudCA9IDE7DQorfQ0KKw0KK3N0YXRpYyB2 b2lkDQorZXhwYW5kX0ZFTlZfU1FSVCAoaW50ZXJuYWxfZm4sIGdjYWxsICpz dG10KQ0KK3sNCisgIC8vIFdlIGNhbm5vdCBkZWxlZ2F0ZSB0byBleHBhbmRf Y2FsbF9zdG10IG9mIGEgZHVtbXkgc3RtdCB3aXRoIEJVSUxUX0lOX1NRUlQN CisgIC8vIGJlY2F1c2UgaXQgZG9lcyBub3QgYWx3YXlzIGdlbmVyYXRlIGEg Y2FsbC4NCisgIHRyZWUgbGhzID0gZ2ltcGxlX2NhbGxfbGhzIChzdG10KTsN CisgIHRyZWUgb3AgPSBnaW1wbGVfY2FsbF9hcmcgKHN0bXQsIDApOw0KKyAg dHJlZSBmdHlwZSA9IFRSRUVfVFlQRSAob3ApOw0KKyAgbWFjaGluZV9tb2Rl IGZtb2RlID0gVFlQRV9NT0RFIChmdHlwZSk7DQorICBsb2NhdGlvbl90IGxv YyA9IGdpbXBsZV9sb2NhdGlvbiAoc3RtdCk7DQorICBidWlsdF9pbl9mdW5j dGlvbiBmOw0KKyAgaWYgKGZtb2RlID09IFRZUEVfTU9ERSAoZmxvYXRfdHlw ZV9ub2RlKSkNCisgICAgZiA9IEJVSUxUX0lOX1NRUlRGOw0KKyAgZWxzZSBp ZiAoZm1vZGUgPT0gVFlQRV9NT0RFIChkb3VibGVfdHlwZV9ub2RlKSkNCisg ICAgZiA9IEJVSUxUX0lOX1NRUlQ7DQorICBlbHNlIGlmIChmbW9kZSA9PSBU WVBFX01PREUgKGxvbmdfZG91YmxlX3R5cGVfbm9kZSkpDQorICAgIGYgPSBC VUlMVF9JTl9TUVJUTDsNCisgIGVsc2UNCisgICAgZ2NjX3VucmVhY2hhYmxl KCk7DQorICB0cmVlIHNxcnRmbiA9IG1hdGhmbl9idWlsdF9pbiAoZnR5cGUs IGYpOw0KKyAgdHJlZSBleHAgPSBidWlsZF92bF9leHAgKENBTExfRVhQUiwg MSArIDMpOw0KKyAgQ0FMTF9FWFBSX0ZOIChleHApDQorICAgID0gYnVpbGQx X2xvYyAobG9jLCBBRERSX0VYUFIsDQorCQkgIGJ1aWxkX3BvaW50ZXJfdHlw ZSAoVFJFRV9UWVBFIChzcXJ0Zm4pKSwgc3FydGZuKTsNCisgIFRSRUVfVFlQ RSAoZXhwKSA9IGZ0eXBlOw0KKyAgQ0FMTF9FWFBSX1NUQVRJQ19DSEFJTiAo ZXhwKSA9IGdpbXBsZV9jYWxsX2NoYWluIChzdG10KTsgLy8gPz8/DQorICBU UkVFX1NJREVfRUZGRUNUUyAoZXhwKSA9IDE7DQorICBUUkVFX05PVEhST1cg KGV4cCkgPSAxOw0KKyAgQ0FMTF9FWFBSX1RBSUxDQUxMIChleHApID0gZ2lt cGxlX2NhbGxfdGFpbF9wIChzdG10KTsNCisgIENBTExfRlJPTV9USFVOS19Q IChleHApID0gZ2ltcGxlX2NhbGxfZnJvbV90aHVua19wIChzdG10KTsNCisg IENBTExfRVhQUl9BUkcgKGV4cCwgMCkgPSBvcDsNCisgIFNFVF9FWFBSX0xP Q0FUSU9OIChleHAsIGxvYyk7DQorICAvLyBkZWJ1Zz8NCisNCisgIHJ0eCBy ZXMgPSB2YWxpZGl6ZV9tZW0gKGFzc2lnbl90ZW1wIChmdHlwZSwgdHJ1ZSwg dHJ1ZSkpOw0KKyAgdHJlZSB0bXAgPSBtYWtlX3RyZWUgKGZ0eXBlLCByZXMp Ow0KKyAgZXhwYW5kX2Fzc2lnbm1lbnQgKHRtcCwgZXhwLCBmYWxzZSk7DQor ICAvLyBTdGlsbCBuZWVkZWQgdG8gYXZvaWQgRENFIHdoZW4gdGhlIHJlc3Vs dCBpcyB1bnVzZWQuDQorICBlbWl0X2FzbV9wcm90ZWN0aW9uIChyZXMsIGZt b2RlLCBsb2MpOw0KKyAgaWYgKGxocykNCisgICAgZXhwYW5kX2Fzc2lnbm1l bnQgKGxocywgdG1wLCBmYWxzZSk7DQorfQ0KKw0KIC8qIEV4cGFuZCBhIGNh bGwgdG8gRk4gdXNpbmcgdGhlIG9wZXJhbmRzIGluIFNUTVQuICBGTiBoYXMg YSBzaW5nbGUNCiAgICBvdXRwdXQgb3BlcmFuZCBhbmQgTkFSR1MgaW5wdXQg b3BlcmFuZHMuICAqLw0KIA0KIHN0YXRpYyB2b2lkDQogZXhwYW5kX2RpcmVj dF9vcHRhYl9mbiAoaW50ZXJuYWxfZm4gZm4sIGdjYWxsICpzdG10LCBkaXJl Y3Rfb3B0YWIgb3B0YWIsDQogCQkJdW5zaWduZWQgaW50IG5hcmdzKQ0KIHsN CiAgIGV4cGFuZF9vcGVyYW5kICpvcHMgPSBYQUxMT0NBVkVDIChleHBhbmRf b3BlcmFuZCwgbmFyZ3MgKyAxKTsNCiANCiAgIHRyZWVfcGFpciB0eXBlcyA9 IGRpcmVjdF9pbnRlcm5hbF9mbl90eXBlcyAoZm4sIHN0bXQpOw0KSW5kZXg6 IGdjYy9pbnRlcm5hbC1mbi5kZWYNCj09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0N Ci0tLSBnY2MvaW50ZXJuYWwtZm4uZGVmCShyZXZpc2lvbiAyNzQwMDcpDQor KysgZ2NjL2ludGVybmFsLWZuLmRlZgkod29ya2luZyBjb3B5KQ0KQEAgLTM0 NSwxNiArMzQ1LDI0IEBAIERFRl9JTlRFUk5BTF9GTiAoRkFMTFRIUk9VR0gs IEVDRl9MRUFGIHwNCiANCiAvKiBUbyBpbXBsZW1lbnQgX19idWlsdGluX2xh dW5kZXIuICAqLw0KIERFRl9JTlRFUk5BTF9GTiAoTEFVTkRFUiwgRUNGX0xF QUYgfCBFQ0ZfTk9USFJPVyB8IEVDRl9OT1ZPUFMsIE5VTEwpDQogDQogLyog RGl2bW9kIGZ1bmN0aW9uLiAgKi8NCiBERUZfSU5URVJOQUxfRk4gKERJVk1P RCwgRUNGX0NPTlNUIHwgRUNGX0xFQUYsIE5VTEwpDQogDQogLyogQSBOT1Ag ZnVuY3Rpb24gd2l0aCBhcmJpdHJhcnkgYXJndW1lbnRzIGFuZCByZXR1cm4g dmFsdWUuICAqLw0KIERFRl9JTlRFUk5BTF9GTiAoTk9QLCBFQ0ZfQ09OU1Qg fCBFQ0ZfTEVBRiB8IEVDRl9OT1RIUk9XLCBOVUxMKQ0KIA0KKy8qIGZsb2F0 IG9wZXJhdGlvbnMgd2l0aCByb3VuZGluZyAvIGV4Y2VwdGlvbiBmbGFncy4g ICovDQorREVGX0lOVEVSTkFMX0ZOIChGRU5WX1BMVVMsIEVDRl9MRUFGIHwg RUNGX05PVEhST1csIE5VTEwpDQorREVGX0lOVEVSTkFMX0ZOIChGRU5WX01J TlVTLCBFQ0ZfTEVBRiB8IEVDRl9OT1RIUk9XLCBOVUxMKQ0KK0RFRl9JTlRF Uk5BTF9GTiAoRkVOVl9NVUxULCBFQ0ZfTEVBRiB8IEVDRl9OT1RIUk9XLCBO VUxMKQ0KK0RFRl9JTlRFUk5BTF9GTiAoRkVOVl9SRElWLCBFQ0ZfTEVBRiB8 IEVDRl9OT1RIUk9XLCBOVUxMKQ0KK0RFRl9JTlRFUk5BTF9GTiAoRkVOVl9O RUdBVEUsIEVDRl9MRUFGIHwgRUNGX05PVEhST1csIE5VTEwpDQorREVGX0lO VEVSTkFMX0ZOIChGRU5WX1NRUlQsIEVDRl9MRUFGIHwgRUNGX05PVEhST1cs IE5VTEwpDQorDQogI3VuZGVmIERFRl9JTlRFUk5BTF9JTlRfRk4NCiAjdW5k ZWYgREVGX0lOVEVSTkFMX0ZMVF9GTg0KICN1bmRlZiBERUZfSU5URVJOQUxf RkxUX0ZMT0FUTl9GTg0KICN1bmRlZiBERUZfSU5URVJOQUxfU0lHTkVEX09Q VEFCX0ZODQogI3VuZGVmIERFRl9JTlRFUk5BTF9PUFRBQl9GTg0KICN1bmRl ZiBERUZfSU5URVJOQUxfRk4NCg== --8323329-758562103-1564934855=:30902--