LGTM. I refactored the original patch, but I think your new CL came out cleaner.

I've attached stringSHA1.txt (rename to .js; our e-mail system rejects .js files). We have a shell-based driver script, but it would take a while to get through legal review, and it's probably faster if you write your own. Call the "run" method in a loop which terminates in 2000 iterations or 2000 ms, whichever comes first. The score is iterations per second.

On 10/01/2012 11:10 AM, [email protected] wrote:
Hi Jay,

While waiting for the new revision of this patch set, I started
prototyping
implementation of ROR for ia32 and x64 architectures, so that we can
get rid of
the ARM specific #ifdef in hydrogen.cc.

You can review the CL at https://chromiumcodereview.appspot.com/11033005/

Once you upload new patch set, we can combine both CLs to get
something in
landable state.

I also added some tests and moved detection of the ROR pattern to the
visitor of
the bitwise OR. This seems cleaner to me than adding a new hydrogen
phase just
to detect one specific pattern, WDYT?

Please note that I checked the generated code but didn't check
performance on
StringSHA1 yet. How can I do this?

https://chromiumcodereview.appspot.com/10984057/


--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
/** 
 * SHA-1 generating speed test.
 * Based on solution introduced in 
http://www.webtoolkit.info/javascript-sha1.html
 */
var stringSHA1 = {
        
        content: "scDfce",
        
        init: function() {
        },
        
        run: function() {
                this.SHA1(this.content);
        },
        
        SHA1: function(msg) {

            var blockstart;
            var i, j;
            var W = new Array(80);
            var H0 = 0x67452301;
            var H1 = 0xEFCDAB89;
            var H2 = 0x98BADCFE;
            var H3 = 0x10325476;
            var H4 = 0xC3D2E1F0;
            var A, B, C, D, E;
            var temp;
        
            msg = this.utf8Encode(msg);
        
            var msgLen = msg.length;
        
            var wordArray = new Array();
            for (i = 0; i < msgLen - 3; i += 4) {
                j = msg.charCodeAt(i) << 24 
                        | msg.charCodeAt(i+1) << 16 
                        | msg.charCodeAt(i+2)<<8 
                        | msg.charCodeAt(i+3);
                wordArray.push( j );
            }
        
            switch (msgLen % 4) {
                case 0:
                    i = 0x080000000;
                break;
                case 1:
                    i = msg.charCodeAt(msgLen - 1) << 24 | 0x0800000;
                break;
        
                case 2:
                    i = msg.charCodeAt(msgLen - 2) << 24 | 
msg.charCodeAt(msgLen - 1) << 16 | 0x08000;
                break;
        
                case 3:
                    i = msg.charCodeAt(msgLen - 3) << 24 
                        | msg.charCodeAt(msgLen-2) << 16 
                        | msg.charCodeAt(msgLen - 1) << 8 
                        | 0x80;
                break;
            }
        
            wordArray.push( i );
        
            while ((wordArray.length % 16) != 14 ) wordArray.push(0);
        
            wordArray.push(msgLen >>> 29);
            wordArray.push((msgLen << 3) &0x0ffffffff );
        
            for (blockstart = 0; blockstart < wordArray.length; blockstart += 
16 ) {
        
                for (i = 0; i < 16; i++) W[i] = wordArray[blockstart + i];
                for (i = 16; i <= 79; i++) W[i] = this.rotateLeft(W[i - 3] ^ 
W[i - 8] ^ W[i - 14] ^ W[i - 16], 1);
        
                A = H0;
                B = H1;
                C = H2;
                D = H3;
                E = H4;
        
                for( i = 0; i <= 19; i++ ) {
                    temp = (this.rotateLeft(A,5) + ((B&C) | (~B&D)) + E + W[i] 
+ 0x5A827999) & 0x0ffffffff;
                    E = D;
                    D = C;
                    C = this.rotateLeft(B, 30);
                    B = A;
                    A = temp;
                }
        
                for( i = 20; i <= 39; i++ ) {
                    temp = (this.rotateLeft(A,5) + (B ^ C ^ D) + E + W[i] + 
0x6ED9EBA1) & 0x0ffffffff;
                    E = D;
                    D = C;
                    C = this.rotateLeft(B, 30);
                    B = A;
                    A = temp;
                }
        
                for( i = 40; i <= 59; i++ ) {
                    temp = (this.rotateLeft(A,5) + ((B&C) | (B&D) | (C&D)) + E 
+ W[i] + 0x8F1BBCDC) & 0x0ffffffff;
                    E = D;
                    D = C;
                    C = this.rotateLeft(B, 30);
                    B = A;
                    A = temp;
                }
        
                for( i = 60; i <= 79; i++ ) {
                    temp = (this.rotateLeft(A,5) + (B ^ C ^ D) + E + W[i] + 
0xCA62C1D6) & 0x0ffffffff;
                    E = D;
                    D = C;
                    C = this.rotateLeft(B, 30);
                    B = A;
                    A = temp;
                }
        
                H0 = (H0 + A) & 0x0ffffffff;
                H1 = (H1 + B) & 0x0ffffffff;
                H2 = (H2 + C) & 0x0ffffffff;
                H3 = (H3 + D) & 0x0ffffffff;
                H4 = (H4 + E) & 0x0ffffffff;
        
            }
        
            var temp = this.cvtHex(H0) + this.cvtHex(H1) + this.cvtHex(H2) + 
this.cvtHex(H3) + this.cvtHex(H4);
        
            return temp.toLowerCase();
        
        },      

    rotateLeft: function(n, s) {
        var t4 = ( n << s ) | (n >>> (32 - s));
        return t4;
    },

    lsbHex: function(val) {
        var str = "";
        var i;
        var vh;
        var vl;

        for( i=0; i<=6; i+=2 ) {
            vh = (val>>>(i*4+4))&0x0f;
            vl = (val>>>(i*4))&0x0f;
            str += vh.toString(16) + vl.toString(16);
        }
        return str;
    },

    cvtHex: function(val) {
        var str="";
        var i;
        var v;

        for( i=7; i>=0; i-- ) {
            v = (val>>>(i*4))&0x0f;
            str += v.toString(16);
        }
        return str;
    },


    utf8Encode: function(string) {
        string = string.replace(/\r\n/g,"\n");
        var utftext = "";

        for (var n = 0; n < string.length; n++) {

            var c = string.charCodeAt(n);

            if (c < 128) {
                utftext += String.fromCharCode(c);
            }
            else if((c > 127) && (c < 2048)) {
                utftext += String.fromCharCode((c >> 6) | 192);
                utftext += String.fromCharCode((c & 63) | 128);
            }
            else {
                utftext += String.fromCharCode((c >> 12) | 224);
                utftext += String.fromCharCode(((c >> 6) & 63) | 128);
                utftext += String.fromCharCode((c & 63) | 128);
            }

        }

        return utftext;
    }
        
}

Reply via email to