From patchwork Thu Jun 1 23:10:49 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: James Almer X-Patchwork-Id: 3784 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.103.10.2 with SMTP id 2csp1023459vsk; Thu, 1 Jun 2017 16:19:58 -0700 (PDT) X-Received: by 10.28.206.70 with SMTP id e67mr876407wmg.37.1496359198171; Thu, 01 Jun 2017 16:19:58 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1496359198; cv=none; d=google.com; s=arc-20160816; b=UtRLoXkeAl+rK/szXy3gaMzghoivMLu5ABts8Qbr8MyWyYzlAnCwB9vyb6Vq32bf+p 7/4cBog6H8CqHr8V9jz82eJXN77lcgTW7lUCXF7Ds+zOKzKLG0XY7eGS38lyeFX3PIOw cHd7iIHf6bRXXzR/VqoW2oNwK6IA1SwTSEu+kbilUPXrDsjeD1nZz23JAvFH3QnTU86D GUqVsdrB6rV/7OxRFe7k6LMreDOgFbvjH+e+lp3AGX8Y/7pWIZWa/Wynfx6wp1waV1hc r2HyLq4tulZ3KCY1tZiv/Y4Glrg1Ir7MMCOTY7dbP+k4hze+rr2sOAwu3914/KWsLeao vyCg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:mime-version:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:message-id:date:to:from:dkim-signature :delivered-to:arc-authentication-results; bh=7WgyQUNg0V4zljbQmsSOvTVor/xQBxD4aGHHIqAEHnc=; b=tBQDPsnduS7MgrS43SmIi11JbV6vBIfnIK3eYEramuMjcy50CDLmAvhtQ9O4933Ynp CmIy/18VKgyiFNKhlKcl3Yz6atvp3eZkvZMjjSmPzseS6Q8aMccj19umqWssd4Olpi2M FNP2i7gsbIHjmLq1VEcbMBAOBtEY9HycXEj12SxR9QNw2oJ7lc6MdFSWFMF/4+SBCrv9 vtp9mMo62qR4JCFhO/Q3Y7uR6BEpqUsdG5XBL/RWSuCUWbrtVFIXFdsYEPWyVSUcGI4f DUowEUSzz19lTil/8Sb8761+4N7ba4Oif6kRJVEkLIQegNddDkvAskm5SDo51aoTY9ZB Jx8Q== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=gmail.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id y64si602584wmy.168.2017.06.01.16.19.57; Thu, 01 Jun 2017 16:19:58 -0700 (PDT) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=gmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 3CDFB689AA7; Fri, 2 Jun 2017 02:19:49 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-qk0-f195.google.com (mail-qk0-f195.google.com [209.85.220.195]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 0F8BE689A4C for ; Fri, 2 Jun 2017 02:19:43 +0300 (EEST) Received: by mail-qk0-f195.google.com with SMTP id d14so4491857qkb.1 for ; Thu, 01 Jun 2017 16:19:48 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id; bh=3u0T3Ppnnf2cIpI7fQ1b8+CTcYHtNxCqm4cIM0a4x8k=; b=GtVEH0bFsElI6l2tEI9dGiV4iM3kl7qFrmIRTiWOLZ8mgkYF/jqkBzNWQ1v7vwzSqQ I7iR2D8kSZcnB2YlSN3m5P3C7EKWZGkTH8QBIFrV/FqtfxmVODfsG6mYOfGxvxEwBacv mvY0IV9JjCWiYs1pIDoYBta6pYSdEcPPKhpnu+rblZ4bFHfcxmR8Wda4WMczzlGB3cdU 70yywXjih4N1dsXDWPOsjJumnN0IzmRkf4ay3XRHWB1lFF6RuLnYrOKEnvdBU43Wtp3A hQQoKmiiBRD0Xfq/liw3Wnbx4djRYKDftTmAUkyCdB5Jr/CnJbp8LmpMlGbslXIVRbtd BtHQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id; bh=3u0T3Ppnnf2cIpI7fQ1b8+CTcYHtNxCqm4cIM0a4x8k=; b=ajPg0Ggfqs9ydPKA5qVXWSrY33fM/kidmmrCvRwATtkVfOmAzfIsdBxz13oBS1S8Xy SO56NJJV3tGERTRJZo46CQomaDCpQdjYLqf8fh6TzbswaHVvLeILBXdCgwD6eB1ev+JD hrPSgCFO1rw+l/EaTjr6ZVPCC/bIjJe++Oi+2a22MkdRRGtWdaao6nLoOexPp2AkOuP3 86NucdL0FpA+d+qExyGLmQQ61iBvJGiyIOr5GtZTa9E3TUeoivDiAjdNMN4kPQSWsqI/ EQO7QT93Vnv3Tpf1EuK9MXfwLhkvZI3m5YzYk1BRSDykvmb5SIxnsKgQ3luUSiFr1Ny2 eDtQ== X-Gm-Message-State: AODbwcBtWPZju9NS6zJ/FFRFvlqLjdSdqLP3C6Ql2jeGqD+8PSwrIe/K mZIKPdhofWEyv9xu X-Received: by 10.55.27.97 with SMTP id b94mr4863491qkb.169.1496358810129; Thu, 01 Jun 2017 16:13:30 -0700 (PDT) Received: from localhost.localdomain ([181.231.116.134]) by smtp.gmail.com with ESMTPSA id d46sm14066341qte.21.2017.06.01.16.13.28 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Thu, 01 Jun 2017 16:13:29 -0700 (PDT) From: James Almer To: ffmpeg-devel@ffmpeg.org Date: Thu, 1 Jun 2017 20:10:49 -0300 Message-Id: <20170601231051.6880-1-jamrial@gmail.com> X-Mailer: git-send-email 2.12.1 Subject: [FFmpeg-devel] [PATCH 1/3] checkasm: add a checkasm_checked_call function that doesn't issue emms X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Meant for DSP functions returning a float or double, as they'd fail if emms is called after every run on x86_32. Signed-off-by: James Almer --- tests/checkasm/checkasm.h | 11 +++++++++++ tests/checkasm/x86/checkasm.asm | 13 +++++++------ 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/tests/checkasm/checkasm.h b/tests/checkasm/checkasm.h index 695d871220..03a1eda73e 100644 --- a/tests/checkasm/checkasm.h +++ b/tests/checkasm/checkasm.h @@ -84,6 +84,7 @@ static av_unused void *func_ref, *func_new; /* Declare the function prototype. The first argument is the return value, the remaining * arguments are the function parameters. Naming parameters is optional. */ #define declare_func(ret, ...) declare_new(ret, __VA_ARGS__) typedef ret func_type(__VA_ARGS__) +#define declare_func_float(ret, ...) declare_new_float(ret, __VA_ARGS__) typedef ret func_type(__VA_ARGS__) #define declare_func_emms(cpu_flags, ret, ...) declare_new_emms(cpu_flags, ret, __VA_ARGS__) typedef ret func_type(__VA_ARGS__) /* Indicate that the current test has failed */ @@ -102,6 +103,9 @@ void checkasm_checked_call(void *func, ...); /* Verifies that clobbered callee-saved registers are properly saved and restored * and issues emms for asm functions which are not required to do so */ void checkasm_checked_call_emms(void *func, ...); +/* Verifies that clobbered callee-saved registers are properly saved and restored + * but doesn't issue emms. Meant for dsp functions returning float or double */ +void checkasm_checked_call_float(void *func, ...); #if ARCH_X86_64 /* Evil hack: detect incorrect assumptions that 32-bit ints are zero-extended to 64-bit. @@ -116,6 +120,8 @@ void checkasm_checked_call_emms(void *func, ...); void checkasm_stack_clobber(uint64_t clobber, ...); #define declare_new(ret, ...) ret (*checked_call)(void *, int, int, int, int, int, __VA_ARGS__)\ = (void *)checkasm_checked_call; +#define declare_new_float(ret, ...) ret (*checked_call)(void *, int, int, int, int, int, __VA_ARGS__)\ + = (void *)checkasm_checked_call_float; #define declare_new_emms(cpu_flags, ret, ...) \ ret (*checked_call)(void *, int, int, int, int, int, __VA_ARGS__) = \ ((cpu_flags) & av_get_cpu_flags()) ? (void *)checkasm_checked_call_emms : \ @@ -126,6 +132,7 @@ void checkasm_stack_clobber(uint64_t clobber, ...); checked_call(func_new, 0, 0, 0, 0, 0, __VA_ARGS__)) #elif ARCH_X86_32 #define declare_new(ret, ...) ret (*checked_call)(void *, __VA_ARGS__) = (void *)checkasm_checked_call; +#define declare_new_float(ret, ...) ret (*checked_call)(void *, __VA_ARGS__) = (void *)checkasm_checked_call_float; #define declare_new_emms(cpu_flags, ret, ...) ret (*checked_call)(void *, __VA_ARGS__) = \ ((cpu_flags) & av_get_cpu_flags()) ? (void *)checkasm_checked_call_emms : \ (void *)checkasm_checked_call; @@ -151,6 +158,7 @@ void checkasm_checked_call(void *func, ...); checked_call(func_new, 0, 0, 0, 0, 0, 0, 0, __VA_ARGS__)) #else #define declare_new(ret, ...) +#define declare_new_float(ret, ...) #define declare_new_emms(cpu_flags, ret, ...) /* Call the function */ #define call_new(...) ((func_type *)func_new)(__VA_ARGS__) @@ -159,6 +167,9 @@ void checkasm_checked_call(void *func, ...); #ifndef declare_new_emms #define declare_new_emms(cpu_flags, ret, ...) declare_new(ret, __VA_ARGS__) #endif +#ifndef declare_new_float +#define declare_new_float(ret, ...) declare_new(ret, __VA_ARGS__) +#endif /* Benchmark the function */ #ifdef AV_READ_TIME diff --git a/tests/checkasm/x86/checkasm.asm b/tests/checkasm/x86/checkasm.asm index d12333b308..683aae80e3 100644 --- a/tests/checkasm/x86/checkasm.asm +++ b/tests/checkasm/x86/checkasm.asm @@ -169,15 +169,15 @@ cglobal checked_call%1, 2,15,16,max_args*8+8 jz .clobber_ok report_fail error_message .clobber_ok: -%ifnid %1, _emms +%ifidn %1, _emms + emms +%elifnidn %1, _float fstenv [rsp] cmp word [rsp + 8], 0xffff je .emms_ok report_fail error_message_emms emms .emms_ok: -%else - emms %endif RET %endmacro @@ -223,15 +223,15 @@ cglobal checked_call%1, 1,7 jz .clobber_ok report_fail error_message .clobber_ok: -%ifnid %1, _emms +%ifidn %1, _emms + emms +%elifnidn %1, _float fstenv [esp] cmp word [esp + 8], 0xffff je .emms_ok report_fail error_message_emms emms .emms_ok: -%else - emms %endif add esp, max_args*4 REP_RET @@ -241,3 +241,4 @@ cglobal checked_call%1, 1,7 CHECKED_CALL CHECKED_CALL _emms +CHECKED_CALL _float