You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
107 lines
3.8 KiB
107 lines
3.8 KiB
/*
|
|
* Copyright 2002-2019 Intel Corporation.
|
|
*
|
|
* This software is provided to you as Sample Source Code as defined in the accompanying
|
|
* End User License Agreement for the Intel(R) Software Development Products ("Agreement")
|
|
* section 1.L.
|
|
*
|
|
* This software and the related documents are provided as is, with no express or implied
|
|
* warranties, other than those that are expressly stated in the License.
|
|
*/
|
|
|
|
//
|
|
// Code which includes examples of all the different cmov conditions.
|
|
//
|
|
#include <stdio.h>
|
|
|
|
static int executed = 0;
|
|
static int total = 0;
|
|
|
|
#define S1(s) #s
|
|
#define STRINGIZE(s) S1(s)
|
|
|
|
// In the tool we look for fnop and toggle counting, so that it only
|
|
// counts the cmov operations in this code, not elsewhere in the runtime.
|
|
static void toggleCollection()
|
|
{
|
|
__asm__ __volatile__ ("fnop");
|
|
}
|
|
|
|
// Iterate over each CMOVcc instruction (there are more mnemonics than this,
|
|
// but they're all synonyms for one of these)
|
|
#define FOREACH_CMOV(expand) \
|
|
expand(cmovb) \
|
|
expand(cmovbe) \
|
|
expand(cmovl) \
|
|
expand(cmovle) \
|
|
expand(cmovnb) \
|
|
expand(cmovnbe) \
|
|
expand(cmovnl) \
|
|
expand(cmovnle) \
|
|
expand(cmovno) \
|
|
expand(cmovnp) \
|
|
expand(cmovns) \
|
|
expand(cmovnz) \
|
|
expand(cmovo) \
|
|
expand(cmovp) \
|
|
expand(cmovs) \
|
|
expand(cmovz)
|
|
|
|
#define DeclareCounter(movOp) \
|
|
static int movOp##_total = 0; \
|
|
static int movOp##_executed = 0;
|
|
|
|
FOREACH_CMOV(DeclareCounter)
|
|
|
|
#define CMOVFunction(res, comparison, movOp) \
|
|
{ \
|
|
int one = 1; \
|
|
res = 0; \
|
|
if (comparison) \
|
|
__asm__ __volatile__ (STRINGIZE(movOp) " %1, %0" : "+r"(res) : "r"(one)); \
|
|
else \
|
|
__asm__ __volatile__ (STRINGIZE(movOp) " %1, %0" : "+r"(res) : "r"(one)); \
|
|
\
|
|
movOp##_total++; \
|
|
movOp##_executed += res; \
|
|
}
|
|
|
|
#define DefineTest(comparison, movOp) \
|
|
toggleCollection(); \
|
|
CMOVFunction(result, comparison, movOp) \
|
|
toggleCollection(); \
|
|
total++; \
|
|
if (result) { executed++; }
|
|
|
|
#define DefineEqual(movOp) DefineTest(a==b,movOp)
|
|
|
|
#define PrintStats(movOp) \
|
|
printf ("%-7s: %4d %4d\n", STRINGIZE(movOp), movOp##_total, movOp##_executed);
|
|
|
|
int main(int argc, char **argv)
|
|
{
|
|
static int aValues[] = {-2,-1,0,1,2};
|
|
static int bValues[] = {-2,-1,0,1,2};
|
|
int aIndex;
|
|
int bIndex;
|
|
|
|
for (aIndex = 0; aIndex<sizeof(aValues)/sizeof(aValues[0]); aIndex++)
|
|
{
|
|
int a = aValues[aIndex];
|
|
|
|
for (bIndex = 0; bIndex<sizeof(bValues)/sizeof(bValues[0]); bIndex++)
|
|
{
|
|
int b = bValues[bIndex];
|
|
int result;
|
|
|
|
FOREACH_CMOV (DefineEqual);
|
|
}
|
|
}
|
|
|
|
printf ("Total : %d Executed : %d\n", total, executed);
|
|
|
|
FOREACH_CMOV(PrintStats);
|
|
|
|
return 0;
|
|
}
|