Changeset 0e6e90b


Ignore:
Timestamp:
Dec 15, 2015 5:29:58 AM (4 years ago)
Author:
dev <dev@…>
Branches:
master
Children:
93fbdcd
Parents:
2c8179f
Message:

Cleaned up BMI1/BMI2/AVX2/FMA3/MOVBE/ABM support.

Location:
core/java/src/freenet/support/CPUInformation
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • core/java/src/freenet/support/CPUInformation/CPUID.java

    r2c8179f r0e6e90b  
    325325        System.out.println("CPU model string: " + c.getCPUModelString());
    326326        System.out.println("CPU has MMX:    " + c.hasMMX());
    327         System.out.println("CPU has BMI2:   " + c.hasBMI2());
    328327        System.out.println("CPU has SSE:    " + c.hasSSE());
    329328        System.out.println("CPU has SSE2:   " + c.hasSSE2());
     
    337336        System.out.println("CPU has ADX:    " + c.hasADX());
    338337        System.out.println("CPU has TBM:    " + c.hasTBM());
     338        System.out.println("CPU has BMI1:   " + c.hasBMI1());
     339        System.out.println("CPU has BMI2:   " + c.hasBMI2());
     340        System.out.println("CPU has FMA3:   " + c.hasFMA3());
     341        System.out.println("CPU has MOVBE:  " + c.hasMOVBE());
     342        System.out.println("CPU has ABM:    " + c.hasABM());
    339343        if(c instanceof IntelCPUInfo){
    340344            System.out.println("\n **Intel-info**");
  • core/java/src/freenet/support/CPUInformation/CPUIDCPUInfo.java

    r2c8179f r0e6e90b  
    1616    {
    1717        return (CPUID.getEDXCPUFlags() & (1 << 23)) != 0; //EDX Bit 23
    18     }
    19 
    20     public boolean hasBMI2(){
    21         return (CPUID.getExtendedEBXFeatureFlags() & (1 << 8)) != 0; // Extended EBX Bit 8
    2218    }
    2319
     
    6662     * @since 0.9.21
    6763     */
    68     public boolean hasAVX2()
    69     {
    70         return (CPUID.getExtendedEBXFeatureFlags() & (1 << 5)) != 0; //Extended EBX Bit 5
     64    public boolean hasAVX2() {
     65        return this.hasABM() &&
     66               (CPUID.getExtendedEBXFeatureFlags() & (1 << 5)) != 0; //Extended EBX Feature Bit 5
    7167    }
    7268   
     
    123119        return (CPUID.getExtendedEDXCPUFlags() & (1 << 29)) != 0; //Extended EDX Bit 29
    124120    }
     121   
     122    /**
     123     * @return true iff the CPU supports the BMI1 instruction set.
     124     * @since 0.9.24
     125     */
     126    public boolean hasBMI1() {
     127        return this.hasABM() &&
     128               (CPUID.getExtendedEBXFeatureFlags() & (1 << 3)) != 0; // Extended EBX Feature Bit 3
     129    }
     130   
     131    /**
     132     * @return true iff the CPU supports the BMI2 instruction set.
     133     * @since 0.9.24
     134     */
     135    public boolean hasBMI2() {
     136        return this.hasABM() &&
     137               (CPUID.getExtendedEBXFeatureFlags() & (1 << 8)) != 0; // Extended EBX Feature Bit 8
     138    }
     139
     140    /**
     141     * @return true iff the CPU supports the FMA3 instruction set.
     142     * @since 0.9.24
     143     */
     144    public boolean hasFMA3() {
     145        return (CPUID.getECXCPUFlags() & (1 << 12)) != 0; // ECX Bit 12
     146    }
     147
     148    /**
     149     * @return true iff the CPU supports the MOVBE instruction set.
     150     * @since 0.9.24
     151     */
     152    public boolean hasMOVBE() {
     153        return (CPUID.getECXCPUFlags() & (1 << 22)) != 0; // ECX Bit 22
     154    }
     155
     156    /**
     157     * @return true iff the CPU supports the ABM instruction set.
     158     * @since 0.9.24
     159     */
     160    public boolean hasABM() {
     161        return this.hasFMA3() &&
     162               this.hasMOVBE() &&
     163               (CPUID.getExtendedECXCPUFlags() & (1 << 5)) != 0; // Extended EBX Bit 5
     164    }
    125165}
  • core/java/src/freenet/support/CPUInformation/CPUInfo.java

    r2c8179f r0e6e90b  
    3636     */
    3737    public boolean hasMMX();
    38 
    39     /**
    40      * @return true iff the CPU supports the BMI2 instruction set.
    41      */
    42     public boolean hasBMI2();
    4338
    4439    /**
     
    126121     */
    127122    public boolean hasX64();
     123   
     124    /**
     125     * @return true iff the CPU supports the BMI1 instruction set.
     126     * @since 0.9.24
     127     */
     128    public boolean hasBMI1();
     129   
     130    /**
     131     * @return true iff the CPU supports the BMI2 instruction set.
     132     * @since 0.9.24
     133     */
     134    public boolean hasBMI2();
     135   
     136    /**
     137     * @return true iff the CPU supports the FMA3 instruction set.
     138     * @since 0.9.24
     139     */
     140    public boolean hasFMA3();
     141
     142    /**
     143     * @return true iff the CPU supports the MOVBE instruction set.
     144     * @since 0.9.24
     145     */
     146    public boolean hasMOVBE();
     147
     148    /**
     149     * @return true iff the CPU supports the ABM instruction set.
     150     * @since 0.9.24
     151     */
     152    public boolean hasABM();
    128153}
  • core/java/src/freenet/support/CPUInformation/IntelInfoImpl.java

    r2c8179f r0e6e90b  
    383383                    case 0x45:
    384384                    case 0x46:
    385                         boolean hasNewInstructions = false;
    386                         int reg = CPUID.getECXCPUFlags();
    387                         boolean hasFMA3 = (reg & (1 << 12)) != 0;
    388                         boolean hasMOVBE = (reg & (1 << 22)) != 0;
    389                         // AVX is implied by AVX2, so we don't need to check the value here,
    390                         // but we will need it below to enable Sandy Bridge if the Haswell checks fail.
    391                         // This is the same as hasAVX().
    392                         boolean hasAVX = (reg & (1 << 28)) != 0 && (reg & (1 << 27)) != 0;
    393                         //System.out.println("FMA3 MOVBE: " +
    394                         //                   hasFMA3 + ' ' + hasMOVBE);
    395                         if (hasFMA3 && hasMOVBE) {
    396                             reg = CPUID.getExtendedECXCPUFlags();
    397                             boolean hasABM = (reg & (1 << 5)) != 0;  // aka LZCNT
    398                             //System.out.println("FMA3 MOVBE ABM: " +
    399                             //                   hasFMA3 + ' ' + hasMOVBE + ' ' + hasABM);
    400                             if (hasABM) {
    401                                 reg = CPUID.getExtendedEBXFeatureFlags();
    402                                 boolean hasAVX2 = (reg & (1 << 5)) != 0;
    403                                 boolean hasBMI1 = (reg & (1 << 3)) != 0;
    404                                 boolean hasBMI2 = (reg & (1 << 8)) != 0;
    405                                 //System.out.println("FMA3 MOVBE ABM AVX2 BMI1 BMI2: " +
    406                                 //                   hasFMA3 + ' ' + hasMOVBE + ' ' + hasABM + ' ' +
    407                                 //                   hasAVX2 + ' ' + hasBMI1 + ' ' + hasBMI2);
    408                                 if (hasAVX2 && hasBMI1 && hasBMI2)
    409                                     hasNewInstructions = true;
    410                             }
    411                         }
    412                         if (hasNewInstructions) {
     385                        CPUInfo c = CPUID.getInfo();
     386                        if (c.hasAVX2() && c.hasBMI1() && c.hasBMI2()) {
    413387                            isSandyCompatible = true;
    414388                            isIvyCompatible = true;
     
    418392                            // This processor is "corei" compatible, as we define it,
    419393                            // i.e. SSE4.2 but not necessarily AVX.
    420                             if (hasAVX) {
     394                            if (c.hasAVX()) {
    421395                                isSandyCompatible = true;
    422396                                isIvyCompatible = true;
Note: See TracChangeset for help on using the changeset viewer.