173aed82e574b59039cd85be912ffe20b2c75bca0David 'Digit' Turner/*
273aed82e574b59039cd85be912ffe20b2c75bca0David 'Digit' Turner * Copyright (C) 2010 The Android Open Source Project
373aed82e574b59039cd85be912ffe20b2c75bca0David 'Digit' Turner *
473aed82e574b59039cd85be912ffe20b2c75bca0David 'Digit' Turner * Licensed under the Apache License, Version 2.0 (the "License");
573aed82e574b59039cd85be912ffe20b2c75bca0David 'Digit' Turner * you may not use this file except in compliance with the License.
673aed82e574b59039cd85be912ffe20b2c75bca0David 'Digit' Turner * You may obtain a copy of the License at
773aed82e574b59039cd85be912ffe20b2c75bca0David 'Digit' Turner *
873aed82e574b59039cd85be912ffe20b2c75bca0David 'Digit' Turner *      http://www.apache.org/licenses/LICENSE-2.0
973aed82e574b59039cd85be912ffe20b2c75bca0David 'Digit' Turner *
1073aed82e574b59039cd85be912ffe20b2c75bca0David 'Digit' Turner * Unless required by applicable law or agreed to in writing, software
1173aed82e574b59039cd85be912ffe20b2c75bca0David 'Digit' Turner * distributed under the License is distributed on an "AS IS" BASIS,
1273aed82e574b59039cd85be912ffe20b2c75bca0David 'Digit' Turner * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1373aed82e574b59039cd85be912ffe20b2c75bca0David 'Digit' Turner * See the License for the specific language governing permissions and
1473aed82e574b59039cd85be912ffe20b2c75bca0David 'Digit' Turner * limitations under the License.
1573aed82e574b59039cd85be912ffe20b2c75bca0David 'Digit' Turner */
1673aed82e574b59039cd85be912ffe20b2c75bca0David 'Digit' Turner#include <cpu-features.h>
1773aed82e574b59039cd85be912ffe20b2c75bca0David 'Digit' Turner#include <stdio.h>
1873aed82e574b59039cd85be912ffe20b2c75bca0David 'Digit' Turner
1973aed82e574b59039cd85be912ffe20b2c75bca0David 'Digit' Turnerint main(void)
2073aed82e574b59039cd85be912ffe20b2c75bca0David 'Digit' Turner{
2173aed82e574b59039cd85be912ffe20b2c75bca0David 'Digit' Turner    AndroidCpuFamily family = android_getCpuFamily();
2273aed82e574b59039cd85be912ffe20b2c75bca0David 'Digit' Turner    switch (family) {
2373aed82e574b59039cd85be912ffe20b2c75bca0David 'Digit' Turner    case ANDROID_CPU_FAMILY_ARM:
2473aed82e574b59039cd85be912ffe20b2c75bca0David 'Digit' Turner        printf("CPU family is ARM\n");
2573aed82e574b59039cd85be912ffe20b2c75bca0David 'Digit' Turner        break;
2673aed82e574b59039cd85be912ffe20b2c75bca0David 'Digit' Turner    case ANDROID_CPU_FAMILY_X86:
2773aed82e574b59039cd85be912ffe20b2c75bca0David 'Digit' Turner        printf("CPU family is x86\n");
2873aed82e574b59039cd85be912ffe20b2c75bca0David 'Digit' Turner        break;
29097812d190ebd3539c82c9c2b24161ae5e75cbb8Chao-Ying Fu    case ANDROID_CPU_FAMILY_MIPS:
30097812d190ebd3539c82c9c2b24161ae5e75cbb8Chao-Ying Fu        printf("CPU family is MIPS\n");
31097812d190ebd3539c82c9c2b24161ae5e75cbb8Chao-Ying Fu        break;
3273aed82e574b59039cd85be912ffe20b2c75bca0David 'Digit' Turner    default:
3373aed82e574b59039cd85be912ffe20b2c75bca0David 'Digit' Turner        fprintf(stderr, "Unsupported CPU family: %d\n", family);
3473aed82e574b59039cd85be912ffe20b2c75bca0David 'Digit' Turner        return 1;
3573aed82e574b59039cd85be912ffe20b2c75bca0David 'Digit' Turner    }
3673aed82e574b59039cd85be912ffe20b2c75bca0David 'Digit' Turner
3773aed82e574b59039cd85be912ffe20b2c75bca0David 'Digit' Turner    if (family == ANDROID_CPU_FAMILY_ARM) {
3873aed82e574b59039cd85be912ffe20b2c75bca0David 'Digit' Turner        uint64_t features = android_getCpuFeatures();
3973aed82e574b59039cd85be912ffe20b2c75bca0David 'Digit' Turner        printf( "Supported ARM features:\n");
4073aed82e574b59039cd85be912ffe20b2c75bca0David 'Digit' Turner        if ((features & ANDROID_CPU_ARM_FEATURE_ARMv7) != 0) {
4173aed82e574b59039cd85be912ffe20b2c75bca0David 'Digit' Turner            printf( "  ARMv7\n" );
4273aed82e574b59039cd85be912ffe20b2c75bca0David 'Digit' Turner        }
4373aed82e574b59039cd85be912ffe20b2c75bca0David 'Digit' Turner        if ((features & ANDROID_CPU_ARM_FEATURE_VFPv3) != 0) {
4473aed82e574b59039cd85be912ffe20b2c75bca0David 'Digit' Turner            printf( "  VFPv3\n" );
4573aed82e574b59039cd85be912ffe20b2c75bca0David 'Digit' Turner        }
4673aed82e574b59039cd85be912ffe20b2c75bca0David 'Digit' Turner        if ((features & ANDROID_CPU_ARM_FEATURE_NEON) != 0) {
4773aed82e574b59039cd85be912ffe20b2c75bca0David 'Digit' Turner            printf( "  NEON\n" );
4873aed82e574b59039cd85be912ffe20b2c75bca0David 'Digit' Turner        }
49914c9a4d759d07188c789a27cfe9c7306d7c731aDavid 'Digit' Turner        if ((features & ANDROID_CPU_ARM_FEATURE_LDREX_STREX) != 0) {
50914c9a4d759d07188c789a27cfe9c7306d7c731aDavid 'Digit' Turner            printf( "  ldrex/strex\n" );
51914c9a4d759d07188c789a27cfe9c7306d7c731aDavid 'Digit' Turner        }
52914c9a4d759d07188c789a27cfe9c7306d7c731aDavid 'Digit' Turner    }
53914c9a4d759d07188c789a27cfe9c7306d7c731aDavid 'Digit' Turner
54914c9a4d759d07188c789a27cfe9c7306d7c731aDavid 'Digit' Turner    if (family == ANDROID_CPU_FAMILY_X86) {
55914c9a4d759d07188c789a27cfe9c7306d7c731aDavid 'Digit' Turner        uint64_t features = android_getCpuFeatures();
56914c9a4d759d07188c789a27cfe9c7306d7c731aDavid 'Digit' Turner        printf( "Supported x86 features:\n");
57914c9a4d759d07188c789a27cfe9c7306d7c731aDavid 'Digit' Turner        if ((features & ANDROID_CPU_X86_FEATURE_SSSE3) != 0) {
58914c9a4d759d07188c789a27cfe9c7306d7c731aDavid 'Digit' Turner            printf( "  SSSE3\n");
59914c9a4d759d07188c789a27cfe9c7306d7c731aDavid 'Digit' Turner        }
60914c9a4d759d07188c789a27cfe9c7306d7c731aDavid 'Digit' Turner        if ((features & ANDROID_CPU_X86_FEATURE_POPCNT) != 0) {
61914c9a4d759d07188c789a27cfe9c7306d7c731aDavid 'Digit' Turner            printf( "  POPCNT\n");
62914c9a4d759d07188c789a27cfe9c7306d7c731aDavid 'Digit' Turner        }
63914c9a4d759d07188c789a27cfe9c7306d7c731aDavid 'Digit' Turner        if ((features & ANDROID_CPU_X86_FEATURE_MOVBE) != 0) {
64914c9a4d759d07188c789a27cfe9c7306d7c731aDavid 'Digit' Turner            printf( "  MOVBE\n");
65914c9a4d759d07188c789a27cfe9c7306d7c731aDavid 'Digit' Turner        }
6673aed82e574b59039cd85be912ffe20b2c75bca0David 'Digit' Turner    }
67914c9a4d759d07188c789a27cfe9c7306d7c731aDavid 'Digit' Turner
68914c9a4d759d07188c789a27cfe9c7306d7c731aDavid 'Digit' Turner    int count = android_getCpuCount();
69914c9a4d759d07188c789a27cfe9c7306d7c731aDavid 'Digit' Turner    printf( "Number of CPU cores: %d\n", count);
7073aed82e574b59039cd85be912ffe20b2c75bca0David 'Digit' Turner    return 0;
7173aed82e574b59039cd85be912ffe20b2c75bca0David 'Digit' Turner}
72