Add result validation to JSAir
authorfpizlo@apple.com <fpizlo@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 8 Jun 2016 17:21:52 +0000 (17:21 +0000)
committerfpizlo@apple.com <fpizlo@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 8 Jun 2016 17:21:52 +0000 (17:21 +0000)
https://bugs.webkit.org/show_bug.cgi?id=158493

Reviewed by Saam Barati.

PerformanceTests:

This adds the ability to hash a Code in a way that matches the C++ code's hashing of Code.
This allows us to check if the Code that JSAir sees is the code that C++ saw. We use this to
check the Code before and after allocateStack, and compare against hashes we got from C++.

Doing this uncovered bugs. roundUpToMultipleOf wasn't doing anything. allocateStack was not
allocating things correctly because I was concatting a Set to an Array, which doesn't really
work. Now these bugs are fixed.

The checking step adds to the running time so I reduced the number of iterations. The
benchmark spends a decent amount of its time computing Code hashes; I think it's around 1/3
total. This is probably OK. It's better to verify the results even if the running time is
not all in the "core" of the algorithm.

Also add a run-jsc-stress-tests yaml file to allow this to run as a test.

* JSAir/allocate_stack.js:
* JSAir/arg.js:
(Arg.createImm):
(Arg.createBigImm):
(Arg.createBitImm):
(Arg.createBitImm64):
(Arg.createWidth):
(Arg.createSpecial):
(Arg.prototype.get kind):
(Arg.prototype.get isTmp):
(Arg.prototype.get isImm):
(Arg.prototype.get isSomeImm):
(Arg.prototype.get isSomeBigImm):
(Arg.prototype.get isCondition):
(Arg.prototype.get isWidth):
(Arg.prototype.get isSpecial):
(Arg.prototype.get isAlive):
(Arg.prototype.get tmp):
(Arg.prototype.get value):
(Arg.prototype.get lowValue):
(Arg.prototype.get highValue):
(Arg.prototype.get base):
(Arg.prototype.get isGP):
(Arg.prototype.get isFP):
(Arg.prototype.isValidForm):
(Arg.prototype.get isInvertible):
(Arg.kindCode):
(Arg.prototype.hash):
(Arg.prototype.toString):
(Arg):
* JSAir/basic_block.js:
(BasicBlock.get successorBlocks):
* JSAir/benchmark.js:
(benchmark):
* JSAir/code.js:
(Code.prototype.setFrameSize):
(Code.prototype.hash):
(Code.prototype.toString):
(Code):
* JSAir/inst.js:
(Inst.prototype.get hasNonArgEffects):
(Inst.prototype.hash):
(Inst.prototype.toString):
(Inst):
* JSAir/jsair-tests.yaml: Added.
* JSAir/opcode.js:
(Inst_forEachArg):
(Inst_hasNonArgEffects):
(opcodeCode):
* JSAir/payload-gbemu-executeIteration.js:
(createPayloadGbemuExecuteIteration):
* JSAir/payload-imaging-gaussian-blur-gaussianBlur.js:
(createPayloadImagingGaussianBlurGaussianBlur):
* JSAir/payload-jsair-ACLj8C.js:
(createPayloadJSAirACLj8C):
* JSAir/payload-typescript-scanIdentifier.js:
(createPayloadTypescriptScanIdentifier):
* JSAir/reg.js:
(Reg.prototype.get isReg):
(Reg.prototype.hash):
(Reg.prototype.toString):
* JSAir/stack_slot.js:
(StackSlot.prototype.setOffsetFromFP):
(StackSlot.prototype.hash):
(StackSlot.prototype.toString):
* JSAir/symbols.js:
(relCondCode):
(resCondCode):
(doubleCondCode):
* JSAir/test.html:
* JSAir/tmp.js:
(Tmp.prototype.get isReg):
(Tmp.prototype.hash):
(Tmp.prototype.toString):
* JSAir/util.js:
(roundUpToMultipleOf):
(symbolName):

Source/JavaScriptCore:

Add a ::jsHash() method to some things, to compute a hash code that is suitable for
comparing a C++ Code to a JSAir Code. This is different from existing hashing functionality
because it errs on the side of easy reproducibility from JS rather than speed.

* b3/air/AirArg.cpp:
(JSC::B3::Air::Arg::isCompatibleType):
(JSC::B3::Air::Arg::jsHash):
(JSC::B3::Air::Arg::dump):
* b3/air/AirArg.h:
(JSC::B3::Air::Arg::asDoubleCondition):
(JSC::B3::Air::Arg::isInvertible):
(JSC::B3::Air::Arg::isUnsignedCond):
(JSC::B3::Air::Arg::Arg):
* b3/air/AirCode.cpp:
(JSC::B3::Air::Code::addFastTmp):
(JSC::B3::Air::Code::jsHash):
* b3/air/AirCode.h:
(JSC::B3::Air::Code::lastPhaseName):
* b3/air/AirDumpAsJS.cpp:
(JSC::B3::Air::dumpAsJS):
* b3/air/AirGenerate.cpp:
(JSC::B3::Air::prepareForGeneration):
* b3/air/AirInst.cpp:
(JSC::B3::Air::Inst::hasArgEffects):
(JSC::B3::Air::Inst::jsHash):
(JSC::B3::Air::Inst::dump):
* b3/air/AirInst.h:
* b3/air/AirStackSlot.cpp:
(JSC::B3::Air::StackSlot::setOffsetFromFP):
(JSC::B3::Air::StackSlot::jsHash):
(JSC::B3::Air::StackSlot::dump):
* b3/air/AirStackSlot.h:
* b3/air/opcode_generator.rb:

Tools:

Run JSAir.

* Scripts/run-javascriptcore-tests:
(runJSCStressTests):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@201807 268f45cc-cd09-0410-ab3c-d52691b4dbfc

33 files changed:
PerformanceTests/ChangeLog
PerformanceTests/JSAir/allocate_stack.js
PerformanceTests/JSAir/arg.js
PerformanceTests/JSAir/basic_block.js
PerformanceTests/JSAir/benchmark.js
PerformanceTests/JSAir/code.js
PerformanceTests/JSAir/inst.js
PerformanceTests/JSAir/jsair-tests.yaml [new file with mode: 0644]
PerformanceTests/JSAir/opcode.js
PerformanceTests/JSAir/payload-gbemu-executeIteration.js
PerformanceTests/JSAir/payload-imaging-gaussian-blur-gaussianBlur.js
PerformanceTests/JSAir/payload-jsair-ACLj8C.js
PerformanceTests/JSAir/payload-typescript-scanIdentifier.js
PerformanceTests/JSAir/reg.js
PerformanceTests/JSAir/stack_slot.js
PerformanceTests/JSAir/strip-hash.rb [new file with mode: 0644]
PerformanceTests/JSAir/symbols.js
PerformanceTests/JSAir/tmp.js
PerformanceTests/JSAir/util.js
Source/JavaScriptCore/ChangeLog
Source/JavaScriptCore/b3/air/AirArg.cpp
Source/JavaScriptCore/b3/air/AirArg.h
Source/JavaScriptCore/b3/air/AirCode.cpp
Source/JavaScriptCore/b3/air/AirCode.h
Source/JavaScriptCore/b3/air/AirDumpAsJS.cpp
Source/JavaScriptCore/b3/air/AirGenerate.cpp
Source/JavaScriptCore/b3/air/AirInst.cpp
Source/JavaScriptCore/b3/air/AirInst.h
Source/JavaScriptCore/b3/air/AirStackSlot.cpp
Source/JavaScriptCore/b3/air/AirStackSlot.h
Source/JavaScriptCore/b3/air/opcode_generator.rb
Tools/ChangeLog
Tools/Scripts/run-javascriptcore-tests

index a204481..b8a1295 100644 (file)
@@ -1,5 +1,105 @@
 2016-06-07  Filip Pizlo  <fpizlo@apple.com>
 
+        Add result validation to JSAir
+        https://bugs.webkit.org/show_bug.cgi?id=158493
+
+        Reviewed by Saam Barati.
+        
+        This adds the ability to hash a Code in a way that matches the C++ code's hashing of Code.
+        This allows us to check if the Code that JSAir sees is the code that C++ saw. We use this to
+        check the Code before and after allocateStack, and compare against hashes we got from C++.
+        
+        Doing this uncovered bugs. roundUpToMultipleOf wasn't doing anything. allocateStack was not
+        allocating things correctly because I was concatting a Set to an Array, which doesn't really
+        work. Now these bugs are fixed.
+        
+        The checking step adds to the running time so I reduced the number of iterations. The
+        benchmark spends a decent amount of its time computing Code hashes; I think it's around 1/3
+        total. This is probably OK. It's better to verify the results even if the running time is
+        not all in the "core" of the algorithm.
+        
+        Also add a run-jsc-stress-tests yaml file to allow this to run as a test.
+
+        * JSAir/allocate_stack.js:
+        * JSAir/arg.js:
+        (Arg.createImm):
+        (Arg.createBigImm):
+        (Arg.createBitImm):
+        (Arg.createBitImm64):
+        (Arg.createWidth):
+        (Arg.createSpecial):
+        (Arg.prototype.get kind):
+        (Arg.prototype.get isTmp):
+        (Arg.prototype.get isImm):
+        (Arg.prototype.get isSomeImm):
+        (Arg.prototype.get isSomeBigImm):
+        (Arg.prototype.get isCondition):
+        (Arg.prototype.get isWidth):
+        (Arg.prototype.get isSpecial):
+        (Arg.prototype.get isAlive):
+        (Arg.prototype.get tmp):
+        (Arg.prototype.get value):
+        (Arg.prototype.get lowValue):
+        (Arg.prototype.get highValue):
+        (Arg.prototype.get base):
+        (Arg.prototype.get isGP):
+        (Arg.prototype.get isFP):
+        (Arg.prototype.isValidForm):
+        (Arg.prototype.get isInvertible):
+        (Arg.kindCode):
+        (Arg.prototype.hash):
+        (Arg.prototype.toString):
+        (Arg):
+        * JSAir/basic_block.js:
+        (BasicBlock.get successorBlocks):
+        * JSAir/benchmark.js:
+        (benchmark):
+        * JSAir/code.js:
+        (Code.prototype.setFrameSize):
+        (Code.prototype.hash):
+        (Code.prototype.toString):
+        (Code):
+        * JSAir/inst.js:
+        (Inst.prototype.get hasNonArgEffects):
+        (Inst.prototype.hash):
+        (Inst.prototype.toString):
+        (Inst):
+        * JSAir/jsair-tests.yaml: Added.
+        * JSAir/opcode.js:
+        (Inst_forEachArg):
+        (Inst_hasNonArgEffects):
+        (opcodeCode):
+        * JSAir/payload-gbemu-executeIteration.js:
+        (createPayloadGbemuExecuteIteration):
+        * JSAir/payload-imaging-gaussian-blur-gaussianBlur.js:
+        (createPayloadImagingGaussianBlurGaussianBlur):
+        * JSAir/payload-jsair-ACLj8C.js:
+        (createPayloadJSAirACLj8C):
+        * JSAir/payload-typescript-scanIdentifier.js:
+        (createPayloadTypescriptScanIdentifier):
+        * JSAir/reg.js:
+        (Reg.prototype.get isReg):
+        (Reg.prototype.hash):
+        (Reg.prototype.toString):
+        * JSAir/stack_slot.js:
+        (StackSlot.prototype.setOffsetFromFP):
+        (StackSlot.prototype.hash):
+        (StackSlot.prototype.toString):
+        * JSAir/symbols.js:
+        (relCondCode):
+        (resCondCode):
+        (doubleCondCode):
+        * JSAir/test.html:
+        * JSAir/tmp.js:
+        (Tmp.prototype.get isReg):
+        (Tmp.prototype.hash):
+        (Tmp.prototype.toString):
+        * JSAir/util.js:
+        (roundUpToMultipleOf):
+        (symbolName):
+
+2016-06-07  Filip Pizlo  <fpizlo@apple.com>
+
         Implement Air::allocateStack() in ES6 to see how much of a bad idea that is
         https://bugs.webkit.org/show_bug.cgi?id=158318
 
index 03483ec..008f305 100644 (file)
@@ -165,7 +165,7 @@ function allocateStack(code)
         if (slot.offsetFromFP)
             continue;
         
-        assign(slot, assignedEscapedStackSlots.concat(interference.get(slot)));
+        assign(slot, assignedEscapedStackSlots.concat(Array.from(interference.get(slot))));
     }
     
     // Figure out how much stack we're using for stack slots.
index 1897c57..98a1ed3 100644 (file)
@@ -307,11 +307,12 @@ class Arg {
         return result;
     }
     
-    static createBigImm(value)
+    static createBigImm(lowValue, highValue = 0)
     {
         let result = new Arg();
         result._kind = Arg.BigImm;
-        result._value = value;
+        result._lowValue = lowValue;
+        result._highValue = highValue;
         return result;
     }
     
@@ -323,11 +324,12 @@ class Arg {
         return result;
     }
     
-    static createBitImm64(value)
+    static createBitImm64(lowValue, highValue = 0)
     {
         let result = new Arg();
         result._kind = Arg.BitImm64;
-        result._value = value;
+        result._lowValue = lowValue;
+        result._highValue = highValue;
         return result;
     }
     
@@ -445,6 +447,13 @@ class Arg {
         return result;
     }
     
+    static createSpecial()
+    {
+        let result = new Arg();
+        result._kind = Arg.Special;
+        return result;
+    }
+    
     get kind() { return this._kind; }
     get isTmp() { return this._kind == Arg.Tmp; }
     get isImm() { return this._kind == Arg.Imm; }
@@ -455,8 +464,16 @@ class Arg {
     {
         switch (this._kind) {
         case Arg.Imm:
-        case Arg.BigImm:
         case Arg.BitImm:
+            return true;
+        default:
+            return false;
+        }
+    }
+    get isSomeBigImm()
+    {
+        switch (this._kind) {
+        case Arg.BigImm:
         case Arg.BitImm64:
             return true;
         default:
@@ -507,6 +524,7 @@ class Arg {
         }
     }
     get isWidth() { return this._kind == Arg.Width; }
+    get isSpecial() { return this._kind == Arg.Special; }
     get isAlive() { return this.isTmp || this.isStack; }
     
     get tmp()
@@ -523,6 +541,20 @@ class Arg {
         return this._value;
     }
     
+    get lowValue()
+    {
+        if (!this.isSomeBigImm)
+            throw new Error("Called .lowValue for non-big-imm");
+        return this._lowValue;
+    }
+    
+    get highValue()
+    {
+        if (!this.isSomeBigImm)
+            throw new Error("Called .highValue for non-big-imm");
+        return this._highValue;
+    }
+    
     get base()
     {
         switch (this._kind) {
@@ -600,6 +632,7 @@ class Arg {
         case Arg.ResCond:
         case Arg.DoubleCond:
         case Arg.Width:
+        case Arg.Special:
             return true;
         case Arg.Tmp:
             return this.isGPTmp;
@@ -620,6 +653,7 @@ class Arg {
         case Arg.ResCond:
         case Arg.DoubleCond:
         case Arg.Width:
+        case Arg.Special:
         case Arg.Invalid:
             return false;
         case Arg.Addr:
@@ -731,6 +765,7 @@ class Arg {
         case Arg.ResCond:
         case Arg.DoubleCond:
         case Arg.Width:
+        case Arg.Special:
             return true;
         default:
             throw new Error("Bad kind");
@@ -861,6 +896,115 @@ class Arg {
         }
     }
     
+    static kindCode(kind)
+    {
+        switch (kind) {
+        case Arg.Invalid:
+            return 0;
+        case Arg.Tmp:
+            return 1;
+        case Arg.Imm:
+            return 2;
+        case Arg.BigImm:
+            return 3;
+        case Arg.BitImm:
+            return 4;
+        case Arg.BitImm64:
+            return 5;
+        case Arg.Addr:
+            return 6;
+        case Arg.Stack:
+            return 7;
+        case Arg.CallArg:
+            return 8;
+        case Arg.Index:
+            return 9;
+        case Arg.RelCond:
+            return 10;
+        case Arg.ResCond:
+            return 11;
+        case Arg.DoubleCond:
+            return 12;
+        case Arg.Special:
+            return 13;
+        case Arg.WidthArg:
+            return 14;
+        default:
+            throw new Error("Bad kind");
+        }
+    }
+    
+    hash()
+    {
+        let result = Arg.kindCode(this._kind);
+        
+        switch (this._kind) {
+        case Arg.Invalid:
+        case Arg.Special:
+            break;
+        case Arg.Tmp:
+            result += this._tmp.hash();
+            result |= 0;
+            break;
+        case Arg.Imm:
+        case Arg.BitImm:
+            result += this._value;
+            result |= 0;
+            break;
+        case Arg.BigImm:
+        case Arg.BitImm64:
+            result += this._lowValue;
+            result |= 0;
+            result += this._highValue;
+            result |= 0;
+            break;
+        case Arg.CallArg:
+            result += this._offset;
+            result |= 0;
+            break;
+        case Arg.RelCond:
+            result += relCondCode(this._condition);
+            result |= 0;
+            break;
+        case Arg.ResCond:
+            result += resCondCode(this._condition);
+            result |= 0;
+            break;
+        case Arg.DoubleCond:
+            result += doubleCondCode(this._condition);
+            result |= 0;
+            break;
+        case Arg.WidthArg:
+            result += this._width;
+            result |= 0;
+            break;
+        case Arg.Addr:
+            result += this._offset;
+            result |= 0;
+            result += this._base.hash();
+            result |= 0;
+            break;
+        case Arg.Index:
+            result += this._offset;
+            result |= 0;
+            result += this._scale;
+            result |= 0;
+            result += this._base.hash();
+            result |= 0;
+            result += this._index.hash();
+            result |= 0;
+            break;
+        case Arg.Stack:
+            result += this._offset;
+            result |= 0;
+            result += this.stackSlot.index;
+            result |= 0;
+            break;
+        }
+        
+        return result >>> 0;
+    }
+    
     toString()
     {
         switch (this._kind) {
@@ -869,11 +1013,10 @@ class Arg {
         case Arg.Tmp:
             return this._tmp.toString();
         case Arg.Imm:
-        case Arg.BitImm:
             return "$" + this._value;
         case Arg.BigImm:
         case Arg.BitImm64:
-            return "$0x" + this._value.toString(16);
+            return "$0x" + this._highValue.toString(16) + ":" + this._lowValue.toString(16);
         case Arg.Addr:
             return "" + (this._offset ? this._offset : "") + "(" + this._base + ")";
         case Arg.Index:
@@ -886,8 +1029,11 @@ class Arg {
         case Arg.RelCond:
         case Arg.ResCond:
         case Arg.DoubleCond:
-        case Arg.Width:
             return symbolName(this._condition);
+        case Arg.Special:
+            return "special";
+        case Arg.Width:
+            return "" + this._value;
         default:
             throw new Error("Bad kind");
         }
@@ -908,6 +1054,7 @@ Arg.Index = Symbol("Index");
 Arg.RelCond = Symbol("RelCond");
 Arg.ResCond = Symbol("ResCond");
 Arg.DoubleCond = Symbol("DoubleCond");
+Arg.Special = Symbol("Special");
 Arg.Width = Symbol("Width");
 
 // Arg roles
index ed4d984..c47d71b 100644 (file)
@@ -51,7 +51,7 @@ class BasicBlock {
     
     get(index)
     {
-        if (index >= this._insts.length)
+        if (index < 0 || index >= this._insts.length)
             return null;
         return this._insts[index];
     }
@@ -74,13 +74,15 @@ class BasicBlock {
     {
         return new Proxy(this._successors, {
             get(target, property) {
-                if ((property | 0) == property)
+                if (typeof property == "string"
+                    && (property | 0) == property)
                     return target[property].block;
                 return target[property];
             },
             
             set(target, property, value) {
-                if ((property | 0) == property) {
+                if (typeof property == "string"
+                    && (property | 0) == property) {
                     var oldValue = target[property];
                     target[property] = new FrequentedBlock(
                         value, oldValue ? oldValue.frequency : Normal);
index bf65048..67929eb 100644 (file)
 function benchmark()
 {
     const verbose = 0;
-    const numIterations = 200;
+    const numIterations = 150;
     
     let before = currentTime();
     
-    var codeGenerators = [
-        createPayloadGbemuExecuteIteration,
-        createPayloadImagingGaussianBlurGaussianBlur,
-        createPayloadTypescriptScanIdentifier,
-        createPayloadJSAirACLj8C
+    var payloads = [
+        {generate: createPayloadGbemuExecuteIteration, earlyHash: 632653144, lateHash: 372715518},
+        {generate: createPayloadImagingGaussianBlurGaussianBlur, earlyHash: 3677819581, lateHash: 1252116304},
+        {generate: createPayloadTypescriptScanIdentifier, earlyHash: 1914852601, lateHash: 837339551},
+        {generate: createPayloadJSAirACLj8C, earlyHash: 1373599940, lateHash: 3981283600}
     ];
     
     for (let iteration = 0; iteration < numIterations; ++iteration) {
-        for (let generateCode of codeGenerators) {
-            let code = generateCode();
+        for (let payload of payloads) {
+            // Sadly about 17% of our time is in generate. I don't think that's really avoidable,
+            // and I don't mind testing VMs' ability to run such "data definition" code quickly. I
+            // would not have expected it to be so slow from first principles!
+            let code = payload.generate();
             
             if (verbose) {
                 print("Before allocateStack:");
                 print(code);
             }
             
+            let hash = code.hash();
+            if (hash != payload.earlyHash)
+                throw new Error("Wrong early hash for " + payload.generate.name +": " + hash);
+            
             allocateStack(code);
             
             if (verbose) {
                 print("After allocateStack:");
                 print(code);
             }
+
+            hash = code.hash();
+            if (hash != payload.lateHash)
+                throw new Error("Wrong late hash for " + payload.generate.name +": " + hash);
         }
     }
     
index 1c48d2f..4d29409 100644 (file)
@@ -79,6 +79,34 @@ class Code {
     
     setFrameSize(frameSize) { this._frameSize = frameSize; }
     
+    hash()
+    {
+        let result = 0;
+        for (let block of this) {
+            result *= 1000001;
+            result |= 0;
+            for (let inst of block) {
+                result *= 97;
+                result |= 0;
+                result += inst.hash();
+                result |= 0;
+            }
+            for (let successor of block.successorBlocks) {
+                result *= 7;
+                result |= 0;
+                result += successor.index;
+                result |= 0;
+            }
+        }
+        for (let slot of this.stackSlots) {
+            result *= 101;
+            result |= 0;
+            result += slot.hash();
+            result |= 0;
+        }
+        return result >>> 0;
+    }
+    
     toString()
     {
         let result = "";
index 0080c65..d4cd497 100644 (file)
@@ -125,6 +125,16 @@ class Inst {
     
     get hasNonArgEffects() { return Inst_hasNonArgEffects(this); }
     
+    hash()
+    {
+        let result = opcodeCode(this.opcode);
+        for (let arg of this.args) {
+            result += arg.hash();
+            result |= 0;
+        }
+        return result >>> 0;
+    }
+    
     toString()
     {
         return "" + symbolName(this._opcode) + " " + this._args.join(", ");
diff --git a/PerformanceTests/JSAir/jsair-tests.yaml b/PerformanceTests/JSAir/jsair-tests.yaml
new file mode 100644 (file)
index 0000000..f815412
--- /dev/null
@@ -0,0 +1,28 @@
+# Copyright (C) 2016 Apple Inc. All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+# 1.  Redistributions of source code must retain the above copyright
+#     notice, this list of conditions and the following disclaimer. 
+# 2.  Redistributions in binary form must reproduce the above copyright
+#     notice, this list of conditions and the following disclaimer in the
+#     documentation and/or other materials provided with the distribution. 
+#
+# THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+# DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+- path: .
+  tests:
+    - test.js
+  cmd: defaultRunNoisyTest unless parseRunCommands
+
index 3c8c84d..0f05c31 100644 (file)
@@ -1378,3 +1378,278 @@ function Inst_hasNonArgEffects(inst)
         return false;
     }
 }
+function opcodeCode(opcode)
+{
+    switch (opcode) {
+    case AbsDouble:
+        return 0
+    case AbsFloat:
+        return 1
+    case Add16:
+        return 2
+    case Add32:
+        return 3
+    case Add64:
+        return 4
+    case Add8:
+        return 5
+    case AddDouble:
+        return 6
+    case AddFloat:
+        return 7
+    case And32:
+        return 8
+    case And64:
+        return 9
+    case AndDouble:
+        return 10
+    case AndFloat:
+        return 11
+    case Branch32:
+        return 12
+    case Branch64:
+        return 13
+    case Branch8:
+        return 14
+    case BranchAdd32:
+        return 15
+    case BranchAdd64:
+        return 16
+    case BranchDouble:
+        return 17
+    case BranchFloat:
+        return 18
+    case BranchMul32:
+        return 19
+    case BranchMul64:
+        return 20
+    case BranchNeg32:
+        return 21
+    case BranchNeg64:
+        return 22
+    case BranchSub32:
+        return 23
+    case BranchSub64:
+        return 24
+    case BranchTest32:
+        return 25
+    case BranchTest64:
+        return 26
+    case BranchTest8:
+        return 27
+    case CCall:
+        return 28
+    case CeilDouble:
+        return 29
+    case CeilFloat:
+        return 30
+    case ColdCCall:
+        return 31
+    case Compare32:
+        return 32
+    case Compare64:
+        return 33
+    case CompareDouble:
+        return 34
+    case CompareFloat:
+        return 35
+    case ConvertDoubleToFloat:
+        return 36
+    case ConvertFloatToDouble:
+        return 37
+    case ConvertInt32ToDouble:
+        return 38
+    case ConvertInt32ToFloat:
+        return 39
+    case ConvertInt64ToDouble:
+        return 40
+    case ConvertInt64ToFloat:
+        return 41
+    case CountLeadingZeros32:
+        return 42
+    case CountLeadingZeros64:
+        return 43
+    case Div32:
+        return 44
+    case Div64:
+        return 45
+    case DivDouble:
+        return 46
+    case DivFloat:
+        return 47
+    case FloorDouble:
+        return 48
+    case FloorFloat:
+        return 49
+    case Jump:
+        return 50
+    case Lea:
+        return 51
+    case Load16:
+        return 52
+    case Load16SignedExtendTo32:
+        return 53
+    case Load8:
+        return 54
+    case Load8SignedExtendTo32:
+        return 55
+    case Lshift32:
+        return 56
+    case Lshift64:
+        return 57
+    case Move:
+        return 58
+    case Move32:
+        return 59
+    case Move32ToFloat:
+        return 60
+    case Move64ToDouble:
+        return 61
+    case MoveConditionally32:
+        return 62
+    case MoveConditionally64:
+        return 63
+    case MoveConditionallyDouble:
+        return 64
+    case MoveConditionallyFloat:
+        return 65
+    case MoveConditionallyTest32:
+        return 66
+    case MoveConditionallyTest64:
+        return 67
+    case MoveDouble:
+        return 68
+    case MoveDoubleConditionally32:
+        return 69
+    case MoveDoubleConditionally64:
+        return 70
+    case MoveDoubleConditionallyDouble:
+        return 71
+    case MoveDoubleConditionallyFloat:
+        return 72
+    case MoveDoubleConditionallyTest32:
+        return 73
+    case MoveDoubleConditionallyTest64:
+        return 74
+    case MoveDoubleTo64:
+        return 75
+    case MoveFloat:
+        return 76
+    case MoveFloatTo32:
+        return 77
+    case MoveZeroToDouble:
+        return 78
+    case Mul32:
+        return 79
+    case Mul64:
+        return 80
+    case MulDouble:
+        return 81
+    case MulFloat:
+        return 82
+    case MultiplyAdd32:
+        return 83
+    case MultiplyAdd64:
+        return 84
+    case MultiplyNeg32:
+        return 85
+    case MultiplyNeg64:
+        return 86
+    case MultiplySub32:
+        return 87
+    case MultiplySub64:
+        return 88
+    case Neg32:
+        return 89
+    case Neg64:
+        return 90
+    case NegateDouble:
+        return 91
+    case Nop:
+        return 92
+    case Not32:
+        return 93
+    case Not64:
+        return 94
+    case Oops:
+        return 95
+    case Or32:
+        return 96
+    case Or64:
+        return 97
+    case Patch:
+        return 98
+    case Ret32:
+        return 99
+    case Ret64:
+        return 100
+    case RetDouble:
+        return 101
+    case RetFloat:
+        return 102
+    case Rshift32:
+        return 103
+    case Rshift64:
+        return 104
+    case Shuffle:
+        return 105
+    case SignExtend16To32:
+        return 106
+    case SignExtend32ToPtr:
+        return 107
+    case SignExtend8To32:
+        return 108
+    case SqrtDouble:
+        return 109
+    case SqrtFloat:
+        return 110
+    case Store16:
+        return 111
+    case Store8:
+        return 112
+    case StoreZero32:
+        return 113
+    case Sub32:
+        return 114
+    case Sub64:
+        return 115
+    case SubDouble:
+        return 116
+    case SubFloat:
+        return 117
+    case Swap32:
+        return 118
+    case Swap64:
+        return 119
+    case Test32:
+        return 120
+    case Test64:
+        return 121
+    case Urshift32:
+        return 122
+    case Urshift64:
+        return 123
+    case X86ConvertToDoubleWord32:
+        return 124
+    case X86ConvertToQuadWord64:
+        return 125
+    case X86Div32:
+        return 126
+    case X86Div64:
+        return 127
+    case Xor32:
+        return 128
+    case Xor64:
+        return 129
+    case XorDouble:
+        return 130
+    case XorFloat:
+        return 131
+    case ZeroExtend16To32:
+        return 132
+    case ZeroExtend8To32:
+        return 133
+    default:
+        throw new Error("bad opcode");
+    }
+}
index 37dea4d..2b0b80b 100644 (file)
@@ -59,6 +59,7 @@ function createPayloadGbemuExecuteIteration()
     let slot10 = code.addStackSlot(8, Spill);
     let slot11 = code.addStackSlot(8, Spill);
     let slot12 = code.addStackSlot(40, Locked);
+    slot12.setOffsetFromFP(-40);
     let tmp190 = code.newTmp(GP);
     let tmp189 = code.newTmp(GP);
     let tmp188 = code.newTmp(GP);
@@ -263,7 +264,7 @@ function createPayloadGbemuExecuteIteration()
     bb0.successors.push(new FrequentedBlock(bb2, Normal));
     bb0.successors.push(new FrequentedBlock(bb1, Normal));
     inst = new Inst(Move);
-    arg = Arg.createBigImm(4449751680);
+    arg = Arg.createBigImm(286904960, 1);
     inst.args.push(arg);
     arg = Arg.createTmp(Reg.rax);
     inst.args.push(arg);
@@ -275,6 +276,7 @@ function createPayloadGbemuExecuteIteration()
     inst.args.push(arg);
     bb0.append(inst);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createTmp(Reg.rbp);
     inst.args.push(arg);
@@ -297,12 +299,13 @@ function createPayloadGbemuExecuteIteration()
     inst.args.push(arg);
     bb0.append(inst);
     inst = new Inst(Move);
-    arg = Arg.createBigImm(-281474976710654);
+    arg = Arg.createBigImm(2, -65536);
     inst.args.push(arg);
     arg = Arg.createTmp(Reg.r15);
     inst.args.push(arg);
     bb0.append(inst);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createResCond(NonZero);
     inst.args.push(arg);
@@ -323,6 +326,7 @@ function createPayloadGbemuExecuteIteration()
     inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
     bb0.append(inst);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createRelCond(NotEqual);
     inst.args.push(arg);
@@ -349,7 +353,7 @@ function createPayloadGbemuExecuteIteration()
     inst.args.push(arg);
     bb0.append(inst);
     inst = new Inst(Move);
-    arg = Arg.createBigImm(4449353264);
+    arg = Arg.createBigImm(286506544, 1);
     inst.args.push(arg);
     arg = Arg.createTmp(Reg.rcx);
     inst.args.push(arg);
@@ -357,11 +361,11 @@ function createPayloadGbemuExecuteIteration()
     inst = new Inst(Move);
     arg = Arg.createTmp(Reg.rcx);
     inst.args.push(arg);
-    arg = Arg.createStack(slot7, 0);
+    arg = Arg.createStack(slot10, 0);
     inst.args.push(arg);
     bb0.append(inst);
     inst = new Inst(Move);
-    arg = Arg.createBigImm(4449959440);
+    arg = Arg.createBigImm(286455168, 1);
     inst.args.push(arg);
     arg = Arg.createTmp(Reg.rcx);
     inst.args.push(arg);
@@ -373,7 +377,7 @@ function createPayloadGbemuExecuteIteration()
     inst.args.push(arg);
     bb0.append(inst);
     inst = new Inst(Move);
-    arg = Arg.createBigImm(4449959448);
+    arg = Arg.createBigImm(287131344, 1);
     inst.args.push(arg);
     arg = Arg.createTmp(Reg.rcx);
     inst.args.push(arg);
@@ -381,7 +385,7 @@ function createPayloadGbemuExecuteIteration()
     inst = new Inst(Move);
     arg = Arg.createTmp(Reg.rcx);
     inst.args.push(arg);
-    arg = Arg.createStack(slot11, 0);
+    arg = Arg.createStack(slot6, 0);
     inst.args.push(arg);
     bb0.append(inst);
     inst = new Inst(Move);
@@ -391,7 +395,7 @@ function createPayloadGbemuExecuteIteration()
     inst.args.push(arg);
     bb0.append(inst);
     inst = new Inst(Move);
-    arg = Arg.createBigImm(4449352912);
+    arg = Arg.createBigImm(286474592, 1);
     inst.args.push(arg);
     arg = Arg.createTmp(Reg.rcx);
     inst.args.push(arg);
@@ -399,35 +403,35 @@ function createPayloadGbemuExecuteIteration()
     inst = new Inst(Move);
     arg = Arg.createTmp(Reg.rcx);
     inst.args.push(arg);
-    arg = Arg.createStack(slot8, 0);
+    arg = Arg.createStack(slot2, 0);
     inst.args.push(arg);
     bb0.append(inst);
     inst = new Inst(Move);
-    arg = Arg.createImm(1);
+    arg = Arg.createBigImm(287209728, 1);
     inst.args.push(arg);
-    arg = Arg.createStack(slot1, 0);
+    arg = Arg.createTmp(Reg.rcx);
     inst.args.push(arg);
     bb0.append(inst);
     inst = new Inst(Move);
-    arg = Arg.createBigImm(4450056448);
-    inst.args.push(arg);
     arg = Arg.createTmp(Reg.rcx);
     inst.args.push(arg);
+    arg = Arg.createStack(slot11, 0);
+    inst.args.push(arg);
     bb0.append(inst);
     inst = new Inst(Move);
-    arg = Arg.createTmp(Reg.rcx);
+    arg = Arg.createImm(1);
     inst.args.push(arg);
-    arg = Arg.createStack(slot10, 0);
+    arg = Arg.createStack(slot1, 0);
     inst.args.push(arg);
     bb0.append(inst);
     inst = new Inst(Move);
-    arg = Arg.createBigImm(-281474976710656);
+    arg = Arg.createBigImm(0, -65536);
     inst.args.push(arg);
     arg = Arg.createTmp(Reg.r14);
     inst.args.push(arg);
     bb0.append(inst);
     inst = new Inst(Move);
-    arg = Arg.createBigImm(4449301888);
+    arg = Arg.createBigImm(287112728, 1);
     inst.args.push(arg);
     arg = Arg.createTmp(Reg.rcx);
     inst.args.push(arg);
@@ -435,11 +439,11 @@ function createPayloadGbemuExecuteIteration()
     inst = new Inst(Move);
     arg = Arg.createTmp(Reg.rcx);
     inst.args.push(arg);
-    arg = Arg.createStack(slot6, 0);
+    arg = Arg.createStack(slot8, 0);
     inst.args.push(arg);
     bb0.append(inst);
     inst = new Inst(Move);
-    arg = Arg.createBigImm(281474976710656);
+    arg = Arg.createBigImm(0, 65536);
     inst.args.push(arg);
     arg = Arg.createTmp(Reg.rcx);
     inst.args.push(arg);
@@ -451,7 +455,7 @@ function createPayloadGbemuExecuteIteration()
     inst.args.push(arg);
     bb0.append(inst);
     inst = new Inst(Move);
-    arg = Arg.createBigImm(4449321312);
+    arg = Arg.createBigImm(287112720, 1);
     inst.args.push(arg);
     arg = Arg.createTmp(Reg.rcx);
     inst.args.push(arg);
@@ -459,11 +463,11 @@ function createPayloadGbemuExecuteIteration()
     inst = new Inst(Move);
     arg = Arg.createTmp(Reg.rcx);
     inst.args.push(arg);
-    arg = Arg.createStack(slot2, 0);
+    arg = Arg.createStack(slot5, 0);
     inst.args.push(arg);
     bb0.append(inst);
     inst = new Inst(Move);
-    arg = Arg.createBigImm(4449978064);
+    arg = Arg.createBigImm(286506192, 1);
     inst.args.push(arg);
     arg = Arg.createTmp(Reg.rcx);
     inst.args.push(arg);
@@ -471,7 +475,7 @@ function createPayloadGbemuExecuteIteration()
     inst = new Inst(Move);
     arg = Arg.createTmp(Reg.rcx);
     inst.args.push(arg);
-    arg = Arg.createStack(slot5, 0);
+    arg = Arg.createStack(slot7, 0);
     inst.args.push(arg);
     bb0.append(inst);
     inst = new Inst(Branch32);
@@ -486,6 +490,7 @@ function createPayloadGbemuExecuteIteration()
     bb1.successors.push(new FrequentedBlock(bb3, Normal));
     bb1.predecessors.push(bb0);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createRelCond(NotEqual);
     inst.args.push(arg);
@@ -674,13 +679,13 @@ function createPayloadGbemuExecuteIteration()
     bb8.successors.push(new FrequentedBlock(bb9, Normal));
     bb8.predecessors.push(bb7);
     inst = new Inst(Move);
-    arg = Arg.createBigImm(4449301888);
+    arg = Arg.createBigImm(286455168, 1);
     inst.args.push(arg);
     arg = Arg.createTmp(Reg.rax);
     inst.args.push(arg);
     bb8.append(inst);
     inst = new Inst(Move);
-    arg = Arg.createBigImm(4449301888);
+    arg = Arg.createBigImm(286455168, 1);
     inst.args.push(arg);
     arg = Arg.createTmp(Reg.rcx);
     inst.args.push(arg);
@@ -704,6 +709,7 @@ function createPayloadGbemuExecuteIteration()
     inst.args.push(arg);
     bb8.append(inst);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createTmp(Reg.rax);
     inst.args.push(arg);
@@ -758,6 +764,7 @@ function createPayloadGbemuExecuteIteration()
     inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
     bb8.append(inst);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createTmp(Reg.rbx);
     inst.args.push(arg);
@@ -787,6 +794,7 @@ function createPayloadGbemuExecuteIteration()
     inst.args.push(arg);
     bb9.append(inst);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createRelCond(NotEqual);
     inst.args.push(arg);
@@ -822,6 +830,7 @@ function createPayloadGbemuExecuteIteration()
     inst.args.push(arg);
     bb9.append(inst);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createRelCond(AboveOrEqual);
     inst.args.push(arg);
@@ -880,6 +889,7 @@ function createPayloadGbemuExecuteIteration()
     inst.args.push(arg);
     bb9.append(inst);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createResCond(NonZero);
     inst.args.push(arg);
@@ -915,6 +925,7 @@ function createPayloadGbemuExecuteIteration()
     inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
     bb9.append(inst);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createRelCond(NotEqual);
     inst.args.push(arg);
@@ -960,7 +971,7 @@ function createPayloadGbemuExecuteIteration()
     inst.args.push(arg);
     arg = Arg.createTmp(Reg.rax);
     inst.args.push(arg);
-    arg = Arg.createStack(slot8, 0);
+    arg = Arg.createStack(slot7, 0);
     inst.args.push(arg);
     bb9.append(inst);
     bb10.successors.push(new FrequentedBlock(bb11, Normal));
@@ -971,7 +982,7 @@ function createPayloadGbemuExecuteIteration()
     inst.args.push(arg);
     arg = Arg.createTmp(Reg.rax);
     inst.args.push(arg);
-    arg = Arg.createStack(slot7, 0);
+    arg = Arg.createStack(slot10, 0);
     inst.args.push(arg);
     bb10.append(inst);
     bb11.successors.push(new FrequentedBlock(bb14, Normal));
@@ -989,6 +1000,7 @@ function createPayloadGbemuExecuteIteration()
     inst.args.push(arg);
     bb11.append(inst);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createRelCond(NotEqual);
     inst.args.push(arg);
@@ -1033,6 +1045,7 @@ function createPayloadGbemuExecuteIteration()
     inst.args.push(arg);
     bb11.append(inst);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createRelCond(AboveOrEqual);
     inst.args.push(arg);
@@ -1096,6 +1109,7 @@ function createPayloadGbemuExecuteIteration()
     inst.args.push(arg);
     bb12.append(inst);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createResCond(Overflow);
     inst.args.push(arg);
@@ -1137,6 +1151,7 @@ function createPayloadGbemuExecuteIteration()
     inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 32});
     bb12.append(inst);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createRelCond(NotEqual);
     inst.args.push(arg);
@@ -1184,6 +1199,7 @@ function createPayloadGbemuExecuteIteration()
     inst.args.push(arg);
     bb12.append(inst);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createRelCond(AboveOrEqual);
     inst.args.push(arg);
@@ -1231,6 +1247,7 @@ function createPayloadGbemuExecuteIteration()
     bb12.append(inst);
     bb13.predecessors.push(bb10);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createTmp(Reg.rbx);
     inst.args.push(arg);
@@ -1297,6 +1314,7 @@ function createPayloadGbemuExecuteIteration()
     bb14.append(inst);
     bb15.predecessors.push(bb14);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createTmp(Reg.rbx);
     inst.args.push(arg);
@@ -1337,6 +1355,7 @@ function createPayloadGbemuExecuteIteration()
     inst.args.push(arg);
     bb16.append(inst);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createRelCond(AboveOrEqual);
     inst.args.push(arg);
@@ -1386,12 +1405,13 @@ function createPayloadGbemuExecuteIteration()
     inst.args.push(arg);
     bb16.append(inst);
     inst = new Inst(Move);
-    arg = Arg.createBigImm(4449959440);
+    arg = Arg.createBigImm(287112720, 1);
     inst.args.push(arg);
     arg = Arg.createTmp(Reg.rax);
     inst.args.push(arg);
     bb16.append(inst);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createRelCond(NotEqual);
     inst.args.push(arg);
@@ -1399,7 +1419,7 @@ function createPayloadGbemuExecuteIteration()
     inst.args.push(arg);
     arg = Arg.createImm(80);
     inst.args.push(arg);
-    arg = Arg.createBigImm(4449959440);
+    arg = Arg.createBigImm(287112720, 1);
     inst.args.push(arg);
     arg = Arg.createTmp(Reg.rbx);
     inst.args.push(arg);
@@ -1418,7 +1438,7 @@ function createPayloadGbemuExecuteIteration()
     inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32});
     bb16.append(inst);
     inst = new Inst(Move);
-    arg = Arg.createBigImm(4449959448);
+    arg = Arg.createBigImm(287112728, 1);
     inst.args.push(arg);
     arg = Arg.createTmp(Reg.rax);
     inst.args.push(arg);
@@ -1430,6 +1450,7 @@ function createPayloadGbemuExecuteIteration()
     inst.args.push(arg);
     bb16.append(inst);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createRelCond(AboveOrEqual);
     inst.args.push(arg);
@@ -1491,7 +1512,7 @@ function createPayloadGbemuExecuteIteration()
     inst.args.push(arg);
     bb16.append(inst);
     inst = new Inst(Move);
-    arg = Arg.createBigImm(4449959440);
+    arg = Arg.createBigImm(287112720, 1);
     inst.args.push(arg);
     arg = Arg.createTmp(Reg.rcx);
     inst.args.push(arg);
@@ -1509,6 +1530,7 @@ function createPayloadGbemuExecuteIteration()
     inst.args.push(arg);
     bb16.append(inst);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createTmp(Reg.rax);
     inst.args.push(arg);
@@ -1566,6 +1588,7 @@ function createPayloadGbemuExecuteIteration()
     inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
     bb16.append(inst);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createTmp(Reg.rbx);
     inst.args.push(arg);
@@ -1607,6 +1630,7 @@ function createPayloadGbemuExecuteIteration()
     inst.args.push(arg);
     bb16.append(inst);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createResCond(Overflow);
     inst.args.push(arg);
@@ -1665,6 +1689,7 @@ function createPayloadGbemuExecuteIteration()
     inst.args.push(arg);
     bb16.append(inst);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createResCond(NonZero);
     inst.args.push(arg);
@@ -1694,6 +1719,7 @@ function createPayloadGbemuExecuteIteration()
     inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
     bb16.append(inst);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createRelCond(NotEqual);
     inst.args.push(arg);
@@ -1729,6 +1755,7 @@ function createPayloadGbemuExecuteIteration()
     inst.args.push(arg);
     bb16.append(inst);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createRelCond(AboveOrEqual);
     inst.args.push(arg);
@@ -1787,6 +1814,7 @@ function createPayloadGbemuExecuteIteration()
     inst.args.push(arg);
     bb16.append(inst);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createResCond(NonZero);
     inst.args.push(arg);
@@ -1819,6 +1847,7 @@ function createPayloadGbemuExecuteIteration()
     inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
     bb16.append(inst);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createRelCond(NotEqual);
     inst.args.push(arg);
@@ -1875,6 +1904,7 @@ function createPayloadGbemuExecuteIteration()
     inst.args.push(arg);
     bb16.append(inst);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createTmp(Reg.rax);
     inst.args.push(arg);
@@ -1932,6 +1962,7 @@ function createPayloadGbemuExecuteIteration()
     inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
     bb16.append(inst);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createTmp(Reg.rbx);
     inst.args.push(arg);
@@ -1979,6 +2010,7 @@ function createPayloadGbemuExecuteIteration()
     inst.args.push(arg);
     bb16.append(inst);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createResCond(Overflow);
     inst.args.push(arg);
@@ -2088,7 +2120,7 @@ function createPayloadGbemuExecuteIteration()
     inst.args.push(arg);
     bb19.append(inst);
     inst = new Inst(Move);
-    arg = Arg.createBigImm(281474976710656);
+    arg = Arg.createBigImm(0, 65536);
     inst.args.push(arg);
     arg = Arg.createTmp(Reg.rcx);
     inst.args.push(arg);
@@ -2114,6 +2146,7 @@ function createPayloadGbemuExecuteIteration()
     inst.args.push(arg);
     bb19.append(inst);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createResCond(Overflow);
     inst.args.push(arg);
@@ -2177,6 +2210,7 @@ function createPayloadGbemuExecuteIteration()
     inst.args.push(arg);
     bb20.append(inst);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createResCond(Overflow);
     inst.args.push(arg);
@@ -2245,6 +2279,7 @@ function createPayloadGbemuExecuteIteration()
     inst.args.push(arg);
     bb21.append(inst);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createRelCond(NotEqual);
     inst.args.push(arg);
@@ -2280,6 +2315,7 @@ function createPayloadGbemuExecuteIteration()
     inst.args.push(arg);
     bb21.append(inst);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createRelCond(BelowOrEqual);
     inst.args.push(arg);
@@ -2330,6 +2366,7 @@ function createPayloadGbemuExecuteIteration()
     bb23.predecessors.push(bb21);
     bb23.predecessors.push(bb22);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createResCond(Overflow);
     inst.args.push(arg);
@@ -2391,6 +2428,7 @@ function createPayloadGbemuExecuteIteration()
     inst.args.push(arg);
     bb23.append(inst);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createResCond(Overflow);
     inst.args.push(arg);
@@ -2615,6 +2653,7 @@ function createPayloadGbemuExecuteIteration()
     bb32.append(inst);
     bb33.predecessors.push(bb32);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createTmp(Reg.rbx);
     inst.args.push(arg);
@@ -2693,13 +2732,13 @@ function createPayloadGbemuExecuteIteration()
     bb37.predecessors.push(bb35);
     bb37.predecessors.push(bb36);
     inst = new Inst(Move);
-    arg = Arg.createBigImm(4449321312);
+    arg = Arg.createBigImm(286474592, 1);
     inst.args.push(arg);
     arg = Arg.createTmp(Reg.rax);
     inst.args.push(arg);
     bb37.append(inst);
     inst = new Inst(Move);
-    arg = Arg.createBigImm(4449321312);
+    arg = Arg.createBigImm(286474592, 1);
     inst.args.push(arg);
     arg = Arg.createTmp(Reg.rcx);
     inst.args.push(arg);
@@ -2723,6 +2762,7 @@ function createPayloadGbemuExecuteIteration()
     inst.args.push(arg);
     bb37.append(inst);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createTmp(Reg.rax);
     inst.args.push(arg);
@@ -2777,6 +2817,7 @@ function createPayloadGbemuExecuteIteration()
     inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
     bb37.append(inst);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createTmp(Reg.rbx);
     inst.args.push(arg);
@@ -2795,6 +2836,7 @@ function createPayloadGbemuExecuteIteration()
     bb38.predecessors.push(bb37);
     bb38.predecessors.push(bb36);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createRelCond(NotEqual);
     inst.args.push(arg);
@@ -2836,6 +2878,7 @@ function createPayloadGbemuExecuteIteration()
     inst.args.push(arg);
     bb38.append(inst);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createResCond(Overflow);
     inst.args.push(arg);
@@ -2896,13 +2939,13 @@ function createPayloadGbemuExecuteIteration()
     bb39.successors.push(new FrequentedBlock(bb3, Normal));
     bb39.predecessors.push(bb38);
     inst = new Inst(Move);
-    arg = Arg.createBigImm(4449321312);
+    arg = Arg.createBigImm(286474592, 1);
     inst.args.push(arg);
     arg = Arg.createTmp(Reg.rax);
     inst.args.push(arg);
     bb39.append(inst);
     inst = new Inst(Move);
-    arg = Arg.createBigImm(4449321312);
+    arg = Arg.createBigImm(286474592, 1);
     inst.args.push(arg);
     arg = Arg.createTmp(Reg.rcx);
     inst.args.push(arg);
@@ -2926,6 +2969,7 @@ function createPayloadGbemuExecuteIteration()
     inst.args.push(arg);
     bb39.append(inst);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createTmp(Reg.rax);
     inst.args.push(arg);
@@ -2980,6 +3024,7 @@ function createPayloadGbemuExecuteIteration()
     inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
     bb39.append(inst);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createTmp(Reg.rbx);
     inst.args.push(arg);
@@ -3023,13 +3068,13 @@ function createPayloadGbemuExecuteIteration()
     inst.args.push(arg);
     bb39.append(inst);
     inst = new Inst(Move);
-    arg = Arg.createBigImm(4449978064);
+    arg = Arg.createBigImm(287131344, 1);
     inst.args.push(arg);
     arg = Arg.createTmp(Reg.rax);
     inst.args.push(arg);
     bb39.append(inst);
     inst = new Inst(Move);
-    arg = Arg.createBigImm(4449978064);
+    arg = Arg.createBigImm(287131344, 1);
     inst.args.push(arg);
     arg = Arg.createTmp(Reg.rcx);
     inst.args.push(arg);
@@ -3047,7 +3092,7 @@ function createPayloadGbemuExecuteIteration()
     inst.args.push(arg);
     bb39.append(inst);
     inst = new Inst(Move);
-    arg = Arg.createBigImm(4450056448);
+    arg = Arg.createBigImm(287209728, 1);
     inst.args.push(arg);
     arg = Arg.createTmp(Reg.rcx);
     inst.args.push(arg);
@@ -3059,6 +3104,7 @@ function createPayloadGbemuExecuteIteration()
     inst.args.push(arg);
     bb39.append(inst);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createTmp(Reg.rax);
     inst.args.push(arg);
@@ -3113,6 +3159,7 @@ function createPayloadGbemuExecuteIteration()
     inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
     bb39.append(inst);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createTmp(Reg.rbx);
     inst.args.push(arg);
index c4e7d04..0f16fee 100644 (file)
@@ -47,6 +47,7 @@ function createPayloadImagingGaussianBlurGaussianBlur()
     let slot4 = code.addStackSlot(8, Spill);
     let slot5 = code.addStackSlot(8, Spill);
     let slot6 = code.addStackSlot(40, Locked);
+    slot6.setOffsetFromFP(-40);
     let tmp141 = code.newTmp(GP);
     let tmp140 = code.newTmp(GP);
     let tmp139 = code.newTmp(GP);
@@ -269,7 +270,7 @@ function createPayloadImagingGaussianBlurGaussianBlur()
     bb0.successors.push(new FrequentedBlock(bb2, Normal));
     bb0.successors.push(new FrequentedBlock(bb1, Rare));
     inst = new Inst(Move);
-    arg = Arg.createBigImm(4374261488);
+    arg = Arg.createBigImm(144305904, 1);
     inst.args.push(arg);
     arg = Arg.createTmp(Reg.rax);
     inst.args.push(arg);
@@ -281,6 +282,7 @@ function createPayloadImagingGaussianBlurGaussianBlur()
     inst.args.push(arg);
     bb0.append(inst);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createTmp(Reg.rbp);
     inst.args.push(arg);
@@ -297,7 +299,7 @@ function createPayloadImagingGaussianBlurGaussianBlur()
     inst.patchArgData.push({role: Arg.Scratch, type: GP, width: 64});
     bb0.append(inst);
     inst = new Inst(Move);
-    arg = Arg.createBigImm(4372502752);
+    arg = Arg.createBigImm(142547168, 1);
     inst.args.push(arg);
     arg = Arg.createTmp(Reg.rax);
     inst.args.push(arg);
@@ -315,7 +317,7 @@ function createPayloadImagingGaussianBlurGaussianBlur()
     inst.args.push(arg);
     bb0.append(inst);
     inst = new Inst(Move);
-    arg = Arg.createBigImm(4372502768);
+    arg = Arg.createBigImm(142547184, 1);
     inst.args.push(arg);
     arg = Arg.createTmp(Reg.rax);
     inst.args.push(arg);
@@ -327,7 +329,7 @@ function createPayloadImagingGaussianBlurGaussianBlur()
     inst.args.push(arg);
     bb0.append(inst);
     inst = new Inst(Move);
-    arg = Arg.createBigImm(4372502776);
+    arg = Arg.createBigImm(142547192, 1);
     inst.args.push(arg);
     arg = Arg.createTmp(Reg.rax);
     inst.args.push(arg);
@@ -339,7 +341,7 @@ function createPayloadImagingGaussianBlurGaussianBlur()
     inst.args.push(arg);
     bb0.append(inst);
     inst = new Inst(Move);
-    arg = Arg.createBigImm(4372502784);
+    arg = Arg.createBigImm(142547200, 1);
     inst.args.push(arg);
     arg = Arg.createTmp(Reg.rax);
     inst.args.push(arg);
@@ -351,7 +353,7 @@ function createPayloadImagingGaussianBlurGaussianBlur()
     inst.args.push(arg);
     bb0.append(inst);
     inst = new Inst(Move);
-    arg = Arg.createBigImm(4372502792);
+    arg = Arg.createBigImm(142547208, 1);
     inst.args.push(arg);
     arg = Arg.createTmp(Reg.rax);
     inst.args.push(arg);
@@ -363,7 +365,7 @@ function createPayloadImagingGaussianBlurGaussianBlur()
     inst.args.push(arg);
     bb0.append(inst);
     inst = new Inst(Move);
-    arg = Arg.createBigImm(4372502800);
+    arg = Arg.createBigImm(142547216, 1);
     inst.args.push(arg);
     arg = Arg.createTmp(Reg.rax);
     inst.args.push(arg);
@@ -375,7 +377,7 @@ function createPayloadImagingGaussianBlurGaussianBlur()
     inst.args.push(arg);
     bb0.append(inst);
     inst = new Inst(Move);
-    arg = Arg.createBigImm(4372502808);
+    arg = Arg.createBigImm(142547224, 1);
     inst.args.push(arg);
     arg = Arg.createTmp(Reg.rax);
     inst.args.push(arg);
@@ -387,7 +389,7 @@ function createPayloadImagingGaussianBlurGaussianBlur()
     inst.args.push(arg);
     bb0.append(inst);
     inst = new Inst(Move);
-    arg = Arg.createBigImm(4372502816);
+    arg = Arg.createBigImm(142547232, 1);
     inst.args.push(arg);
     arg = Arg.createTmp(Reg.rax);
     inst.args.push(arg);
@@ -399,7 +401,7 @@ function createPayloadImagingGaussianBlurGaussianBlur()
     inst.args.push(arg);
     bb0.append(inst);
     inst = new Inst(Move);
-    arg = Arg.createBigImm(4372502824);
+    arg = Arg.createBigImm(142547240, 1);
     inst.args.push(arg);
     arg = Arg.createTmp(Reg.rdi);
     inst.args.push(arg);
@@ -411,7 +413,7 @@ function createPayloadImagingGaussianBlurGaussianBlur()
     inst.args.push(arg);
     bb0.append(inst);
     inst = new Inst(Move);
-    arg = Arg.createBigImm(-281474976710656);
+    arg = Arg.createBigImm(0, -65536);
     inst.args.push(arg);
     arg = Arg.createTmp(Reg.rdi);
     inst.args.push(arg);
@@ -441,6 +443,7 @@ function createPayloadImagingGaussianBlurGaussianBlur()
     bb1.successors.push(new FrequentedBlock(bb2, Normal));
     bb1.predecessors.push(bb0);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createRelCond(Below);
     inst.args.push(arg);
@@ -500,6 +503,7 @@ function createPayloadImagingGaussianBlurGaussianBlur()
     bb2.predecessors.push(bb0);
     bb2.predecessors.push(bb1);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createRelCond(Below);
     inst.args.push(arg);
@@ -547,6 +551,7 @@ function createPayloadImagingGaussianBlurGaussianBlur()
     inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
     bb2.append(inst);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createRelCond(Below);
     inst.args.push(arg);
@@ -594,6 +599,7 @@ function createPayloadImagingGaussianBlurGaussianBlur()
     inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
     bb2.append(inst);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createRelCond(Below);
     inst.args.push(arg);
@@ -665,6 +671,7 @@ function createPayloadImagingGaussianBlurGaussianBlur()
     bb3.successors.push(new FrequentedBlock(bb4, Normal));
     bb3.predecessors.push(bb2);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createRelCond(Below);
     inst.args.push(arg);
@@ -748,6 +755,7 @@ function createPayloadImagingGaussianBlurGaussianBlur()
     bb5.successors.push(new FrequentedBlock(bb6, Normal));
     bb5.predecessors.push(bb4);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createRelCond(Below);
     inst.args.push(arg);
@@ -807,6 +815,7 @@ function createPayloadImagingGaussianBlurGaussianBlur()
     bb6.predecessors.push(bb4);
     bb6.predecessors.push(bb5);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createRelCond(Below);
     inst.args.push(arg);
@@ -878,6 +887,7 @@ function createPayloadImagingGaussianBlurGaussianBlur()
     bb7.successors.push(new FrequentedBlock(bb8, Normal));
     bb7.predecessors.push(bb6);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createRelCond(Below);
     inst.args.push(arg);
@@ -937,7 +947,7 @@ function createPayloadImagingGaussianBlurGaussianBlur()
     bb8.predecessors.push(bb6);
     bb8.predecessors.push(bb7);
     inst = new Inst(Move);
-    arg = Arg.createBigImm(4347049352);
+    arg = Arg.createBigImm(117076488, 1);
     inst.args.push(arg);
     arg = Arg.createTmp(Reg.r8);
     inst.args.push(arg);
@@ -973,6 +983,7 @@ function createPayloadImagingGaussianBlurGaussianBlur()
     bb9.successors.push(new FrequentedBlock(bb10, Normal));
     bb9.predecessors.push(bb8);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createRelCond(Below);
     inst.args.push(arg);
@@ -1031,7 +1042,7 @@ function createPayloadImagingGaussianBlurGaussianBlur()
     bb10.predecessors.push(bb8);
     bb10.predecessors.push(bb9);
     inst = new Inst(Move);
-    arg = Arg.createBigImm(4374462168);
+    arg = Arg.createBigImm(144506584, 1);
     inst.args.push(arg);
     arg = Arg.createTmp(Reg.rdi);
     inst.args.push(arg);
@@ -1049,12 +1060,13 @@ function createPayloadImagingGaussianBlurGaussianBlur()
     inst.args.push(arg);
     bb10.append(inst);
     inst = new Inst(Move);
-    arg = Arg.createBigImm(4374462128);
+    arg = Arg.createBigImm(144506544, 1);
     inst.args.push(arg);
     arg = Arg.createTmp(Reg.rdi);
     inst.args.push(arg);
     bb10.append(inst);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createRelCond(NotEqual);
     inst.args.push(arg);
@@ -1062,7 +1074,7 @@ function createPayloadImagingGaussianBlurGaussianBlur()
     inst.args.push(arg);
     arg = Arg.createImm(80);
     inst.args.push(arg);
-    arg = Arg.createBigImm(4374462128);
+    arg = Arg.createBigImm(144506544, 1);
     inst.args.push(arg);
     arg = Arg.createStack(slot5, 0);
     inst.args.push(arg);
@@ -1102,7 +1114,7 @@ function createPayloadImagingGaussianBlurGaussianBlur()
     inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
     bb10.append(inst);
     inst = new Inst(Move);
-    arg = Arg.createBigImm(4374462136);
+    arg = Arg.createBigImm(144506552, 1);
     inst.args.push(arg);
     arg = Arg.createTmp(Reg.rdi);
     inst.args.push(arg);
@@ -1148,7 +1160,7 @@ function createPayloadImagingGaussianBlurGaussianBlur()
     inst.args.push(arg);
     bb10.append(inst);
     inst = new Inst(Move);
-    arg = Arg.createBigImm(-281474976710654);
+    arg = Arg.createBigImm(2, -65536);
     inst.args.push(arg);
     arg = Arg.createTmp(Reg.r10);
     inst.args.push(arg);
@@ -1231,6 +1243,7 @@ function createPayloadImagingGaussianBlurGaussianBlur()
     bb15.predecessors.push(bb13);
     bb15.predecessors.push(bb14);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createResCond(Overflow);
     inst.args.push(arg);
@@ -1320,6 +1333,7 @@ function createPayloadImagingGaussianBlurGaussianBlur()
     inst.args.push(arg);
     bb18.append(inst);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createResCond(Overflow);
     inst.args.push(arg);
@@ -1367,6 +1381,7 @@ function createPayloadImagingGaussianBlurGaussianBlur()
     inst.patchArgData.push({role: Arg.LateColdUse, type: FP, width: 64});
     bb18.append(inst);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createResCond(Overflow);
     inst.args.push(arg);
@@ -1424,6 +1439,7 @@ function createPayloadImagingGaussianBlurGaussianBlur()
     bb19.successors.push(new FrequentedBlock(bb20, Normal));
     bb19.predecessors.push(bb18);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createRelCond(LessThan);
     inst.args.push(arg);
@@ -1501,6 +1517,7 @@ function createPayloadImagingGaussianBlurGaussianBlur()
     inst.args.push(arg);
     bb20.append(inst);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createRelCond(LessThan);
     inst.args.push(arg);
@@ -1545,6 +1562,7 @@ function createPayloadImagingGaussianBlurGaussianBlur()
     inst.patchArgData.push({role: Arg.ColdUse, type: FP, width: 64});
     bb20.append(inst);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createRelCond(AboveOrEqual);
     inst.args.push(arg);
@@ -1621,6 +1639,7 @@ function createPayloadImagingGaussianBlurGaussianBlur()
     inst.args.push(arg);
     bb20.append(inst);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createResCond(NonZero);
     inst.args.push(arg);
@@ -1668,6 +1687,7 @@ function createPayloadImagingGaussianBlurGaussianBlur()
     inst.patchArgData.push({role: Arg.ColdUse, type: FP, width: 64});
     bb20.append(inst);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createRelCond(NotEqual);
     inst.args.push(arg);
@@ -1743,6 +1763,7 @@ function createPayloadImagingGaussianBlurGaussianBlur()
     bb22.predecessors.push(bb20);
     bb22.predecessors.push(bb21);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createResCond(Overflow);
     inst.args.push(arg);
@@ -1811,6 +1832,7 @@ function createPayloadImagingGaussianBlurGaussianBlur()
     bb24.successors.push(new FrequentedBlock(bb27, Normal));
     bb24.predecessors.push(bb23);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createResCond(Overflow);
     inst.args.push(arg);
@@ -1864,6 +1886,7 @@ function createPayloadImagingGaussianBlurGaussianBlur()
     inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 32});
     bb24.append(inst);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createResCond(Overflow);
     inst.args.push(arg);
@@ -1922,6 +1945,7 @@ function createPayloadImagingGaussianBlurGaussianBlur()
     inst.args.push(arg);
     bb24.append(inst);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createRelCond(AboveOrEqual);
     inst.args.push(arg);
@@ -1969,6 +1993,7 @@ function createPayloadImagingGaussianBlurGaussianBlur()
     inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32});
     bb24.append(inst);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createRelCond(AboveOrEqual);
     inst.args.push(arg);
@@ -2050,6 +2075,7 @@ function createPayloadImagingGaussianBlurGaussianBlur()
     inst.args.push(arg);
     bb24.append(inst);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createRelCond(LessThan);
     inst.args.push(arg);
@@ -2103,6 +2129,7 @@ function createPayloadImagingGaussianBlurGaussianBlur()
     inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32});
     bb24.append(inst);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createRelCond(AboveOrEqual);
     inst.args.push(arg);
@@ -2263,6 +2290,7 @@ function createPayloadImagingGaussianBlurGaussianBlur()
     inst.args.push(arg);
     bb27.append(inst);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createResCond(Overflow);
     inst.args.push(arg);
@@ -2344,6 +2372,7 @@ function createPayloadImagingGaussianBlurGaussianBlur()
     inst.args.push(arg);
     bb31.append(inst);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createResCond(Overflow);
     inst.args.push(arg);
@@ -2396,6 +2425,7 @@ function createPayloadImagingGaussianBlurGaussianBlur()
     bb32.successors.push(new FrequentedBlock(bb33, Rare));
     bb32.predecessors.push(bb31);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createResCond(Overflow);
     inst.args.push(arg);
@@ -2447,6 +2477,7 @@ function createPayloadImagingGaussianBlurGaussianBlur()
     bb33.successors.push(new FrequentedBlock(bb34, Normal));
     bb33.predecessors.push(bb32);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createRelCond(LessThan);
     inst.args.push(arg);
@@ -2491,6 +2522,7 @@ function createPayloadImagingGaussianBlurGaussianBlur()
     bb34.predecessors.push(bb32);
     bb34.predecessors.push(bb33);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createResCond(Overflow);
     inst.args.push(arg);
@@ -2535,6 +2567,7 @@ function createPayloadImagingGaussianBlurGaussianBlur()
     inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 32});
     bb34.append(inst);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createResCond(Overflow);
     inst.args.push(arg);
@@ -2585,6 +2618,7 @@ function createPayloadImagingGaussianBlurGaussianBlur()
     inst.args.push(arg);
     bb34.append(inst);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createRelCond(AboveOrEqual);
     inst.args.push(arg);
@@ -2626,6 +2660,7 @@ function createPayloadImagingGaussianBlurGaussianBlur()
     inst.patchArgData.push({role: Arg.ColdUse, type: FP, width: 64});
     bb34.append(inst);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createDoubleCond(DoubleNotEqualOrUnordered);
     inst.args.push(arg);
@@ -2682,6 +2717,7 @@ function createPayloadImagingGaussianBlurGaussianBlur()
     inst.args.push(arg);
     bb34.append(inst);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createResCond(Overflow);
     inst.args.push(arg);
@@ -2742,6 +2778,7 @@ function createPayloadImagingGaussianBlurGaussianBlur()
     inst.args.push(arg);
     bb34.append(inst);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createRelCond(AboveOrEqual);
     inst.args.push(arg);
@@ -2780,6 +2817,7 @@ function createPayloadImagingGaussianBlurGaussianBlur()
     inst.patchArgData.push({role: Arg.ColdUse, type: FP, width: 64});
     bb34.append(inst);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createRelCond(AboveOrEqual);
     inst.args.push(arg);
@@ -2818,6 +2856,7 @@ function createPayloadImagingGaussianBlurGaussianBlur()
     inst.patchArgData.push({role: Arg.ColdUse, type: FP, width: 64});
     bb34.append(inst);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createDoubleCond(DoubleNotEqualOrUnordered);
     inst.args.push(arg);
@@ -2879,6 +2918,7 @@ function createPayloadImagingGaussianBlurGaussianBlur()
     inst.args.push(arg);
     bb34.append(inst);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createDoubleCond(DoubleNotEqualOrUnordered);
     inst.args.push(arg);
@@ -2929,6 +2969,7 @@ function createPayloadImagingGaussianBlurGaussianBlur()
     inst.args.push(arg);
     bb34.append(inst);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createDoubleCond(DoubleNotEqualOrUnordered);
     inst.args.push(arg);
@@ -2976,6 +3017,7 @@ function createPayloadImagingGaussianBlurGaussianBlur()
     inst.args.push(arg);
     bb34.append(inst);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createResCond(Overflow);
     inst.args.push(arg);
@@ -3019,6 +3061,7 @@ function createPayloadImagingGaussianBlurGaussianBlur()
     inst.args.push(arg);
     bb35.append(inst);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createResCond(Overflow);
     inst.args.push(arg);
@@ -3051,7 +3094,7 @@ function createPayloadImagingGaussianBlurGaussianBlur()
     bb35.append(inst);
     bb36.predecessors.push(bb35);
     inst = new Inst(Move);
-    arg = Arg.createBigImm(4374462160);
+    arg = Arg.createBigImm(144506576, 1);
     inst.args.push(arg);
     arg = Arg.createTmp(Reg.rax);
     inst.args.push(arg);
index d099cd0..922ee56 100644 (file)
@@ -24,6 +24,7 @@ function createPayloadJSAirACLj8C()
     let slot2 = code.addStackSlot(8, Spill);
     let slot3 = code.addStackSlot(8, Spill);
     let slot4 = code.addStackSlot(40, Locked);
+    slot4.setOffsetFromFP(-40);
     let tmp61 = code.newTmp(GP);
     let tmp60 = code.newTmp(GP);
     let tmp59 = code.newTmp(GP);
@@ -91,7 +92,7 @@ function createPayloadJSAirACLj8C()
     bb0.successors.push(new FrequentedBlock(bb1, Normal));
     bb0.successors.push(new FrequentedBlock(bb15, Normal));
     inst = new Inst(Move);
-    arg = Arg.createBigImm(4346997392);
+    arg = Arg.createBigImm(276424800, 1);
     inst.args.push(arg);
     arg = Arg.createTmp(Reg.rax);
     inst.args.push(arg);
@@ -103,6 +104,7 @@ function createPayloadJSAirACLj8C()
     inst.args.push(arg);
     bb0.append(inst);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createTmp(Reg.rbp);
     inst.args.push(arg);
@@ -143,12 +145,13 @@ function createPayloadJSAirACLj8C()
     inst.args.push(arg);
     bb0.append(inst);
     inst = new Inst(Move);
-    arg = Arg.createBigImm(-281474976710654);
+    arg = Arg.createBigImm(2, -65536);
     inst.args.push(arg);
     arg = Arg.createTmp(Reg.r15);
     inst.args.push(arg);
     bb0.append(inst);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createResCond(NonZero);
     inst.args.push(arg);
@@ -181,12 +184,13 @@ function createPayloadJSAirACLj8C()
     inst.args.push(arg);
     bb0.append(inst);
     inst = new Inst(Move);
-    arg = Arg.createBigImm(-281474976710656);
+    arg = Arg.createBigImm(0, -65536);
     inst.args.push(arg);
     arg = Arg.createTmp(Reg.r14);
     inst.args.push(arg);
     bb0.append(inst);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createTmp(Reg.rax);
     inst.args.push(arg);
@@ -209,6 +213,7 @@ function createPayloadJSAirACLj8C()
     inst.patchArgData.push({role: Arg.LateUse, type: GP, width: 64});
     bb0.append(inst);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createTmp(Reg.rcx);
     inst.args.push(arg);
@@ -238,6 +243,7 @@ function createPayloadJSAirACLj8C()
     inst.args.push(arg);
     bb0.append(inst);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createResCond(NonZero);
     inst.args.push(arg);
@@ -279,12 +285,13 @@ function createPayloadJSAirACLj8C()
     inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
     bb0.append(inst);
     inst = new Inst(Move);
-    arg = Arg.createBigImm(4346916592);
+    arg = Arg.createBigImm(276327648, 1);
     inst.args.push(arg);
     arg = Arg.createTmp(Reg.rcx);
     inst.args.push(arg);
     bb0.append(inst);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createRelCond(NotEqual);
     inst.args.push(arg);
@@ -326,6 +333,7 @@ function createPayloadJSAirACLj8C()
     inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
     bb0.append(inst);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createRelCond(NotEqual);
     inst.args.push(arg);
@@ -364,6 +372,7 @@ function createPayloadJSAirACLj8C()
     inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
     bb0.append(inst);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createResCond(NonZero);
     inst.args.push(arg);
@@ -405,12 +414,13 @@ function createPayloadJSAirACLj8C()
     inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
     bb0.append(inst);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createRelCond(NotEqual);
     inst.args.push(arg);
     arg = Arg.createAddr(Reg.r12, 0);
     inst.args.push(arg);
-    arg = Arg.createImm(364);
+    arg = Arg.createImm(372);
     inst.args.push(arg);
     arg = Arg.createTmp(Reg.r12);
     inst.args.push(arg);
@@ -458,6 +468,7 @@ function createPayloadJSAirACLj8C()
     inst.args.push(arg);
     bb0.append(inst);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createResCond(NonZero);
     inst.args.push(arg);
@@ -517,6 +528,7 @@ function createPayloadJSAirACLj8C()
     inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
     bb0.append(inst);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createResCond(NonZero);
     inst.args.push(arg);
@@ -576,12 +588,13 @@ function createPayloadJSAirACLj8C()
     inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
     bb0.append(inst);
     inst = new Inst(Move);
-    arg = Arg.createBigImm(4346910400);
+    arg = Arg.createBigImm(276321024, 1);
     inst.args.push(arg);
     arg = Arg.createTmp(Reg.rcx);
     inst.args.push(arg);
     bb0.append(inst);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createRelCond(NotEqual);
     inst.args.push(arg);
@@ -671,6 +684,7 @@ function createPayloadJSAirACLj8C()
     inst.args.push(arg);
     bb0.append(inst);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createTmp(Reg.rax);
     inst.args.push(arg);
@@ -693,6 +707,7 @@ function createPayloadJSAirACLj8C()
     inst.patchArgData.push({role: Arg.LateUse, type: GP, width: 64});
     bb0.append(inst);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createTmp(Reg.r12);
     inst.args.push(arg);
@@ -731,6 +746,7 @@ function createPayloadJSAirACLj8C()
     inst.args.push(arg);
     bb0.append(inst);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createResCond(NonZero);
     inst.args.push(arg);
@@ -780,12 +796,13 @@ function createPayloadJSAirACLj8C()
     bb1.successors.push(new FrequentedBlock(bb2, Normal));
     bb1.predecessors.push(bb0);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createRelCond(NotEqual);
     inst.args.push(arg);
     arg = Arg.createAddr(Reg.r8, 0);
     inst.args.push(arg);
-    arg = Arg.createImm(452);
+    arg = Arg.createImm(468);
     inst.args.push(arg);
     arg = Arg.createTmp(Reg.r8);
     inst.args.push(arg);
@@ -812,7 +829,7 @@ function createPayloadJSAirACLj8C()
     inst.args.push(arg);
     bb1.append(inst);
     inst = new Inst(Move);
-    arg = Arg.createBigImm(4347313192);
+    arg = Arg.createBigImm(276741160, 1);
     inst.args.push(arg);
     arg = Arg.createTmp(Reg.rcx);
     inst.args.push(arg);
@@ -833,6 +850,7 @@ function createPayloadJSAirACLj8C()
     bb1.append(inst);
     bb2.predecessors.push(bb1);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createTmp(Reg.r12);
     inst.args.push(arg);
@@ -861,6 +879,7 @@ function createPayloadJSAirACLj8C()
     inst.args.push(arg);
     bb3.append(inst);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createRelCond(NotEqual);
     inst.args.push(arg);
@@ -899,7 +918,7 @@ function createPayloadJSAirACLj8C()
     inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
     bb3.append(inst);
     inst = new Inst(Move);
-    arg = Arg.createBigImm(4346778864);
+    arg = Arg.createBigImm(275739616, 1);
     inst.args.push(arg);
     arg = Arg.createTmp(Reg.rax);
     inst.args.push(arg);
@@ -940,6 +959,7 @@ function createPayloadJSAirACLj8C()
     inst.args.push(arg);
     bb4.append(inst);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createResCond(NonZero);
     inst.args.push(arg);
@@ -1008,13 +1028,13 @@ function createPayloadJSAirACLj8C()
     inst.args.push(arg);
     bb4.append(inst);
     inst = new Inst(Move);
-    arg = Arg.createBigImm(4347218048);
+    arg = Arg.createBigImm(276645872, 1);
     inst.args.push(arg);
     arg = Arg.createTmp(Reg.rax);
     inst.args.push(arg);
     bb4.append(inst);
     inst = new Inst(Move);
-    arg = Arg.createBigImm(4347218672);
+    arg = Arg.createBigImm(276646496, 1);
     inst.args.push(arg);
     arg = Arg.createTmp(Reg.rcx);
     inst.args.push(arg);
@@ -1044,6 +1064,7 @@ function createPayloadJSAirACLj8C()
     inst.args.push(arg);
     bb4.append(inst);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createTmp(Reg.rax);
     inst.args.push(arg);
@@ -1101,6 +1122,7 @@ function createPayloadJSAirACLj8C()
     inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
     bb4.append(inst);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createTmp(Reg.r12);
     inst.args.push(arg);
@@ -1139,6 +1161,7 @@ function createPayloadJSAirACLj8C()
     inst.args.push(arg);
     bb4.append(inst);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createResCond(NonZero);
     inst.args.push(arg);
@@ -1193,6 +1216,7 @@ function createPayloadJSAirACLj8C()
     inst.args.push(arg);
     bb5.append(inst);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createTmp(Reg.rcx);
     inst.args.push(arg);
@@ -1215,6 +1239,7 @@ function createPayloadJSAirACLj8C()
     inst.patchArgData.push({role: Arg.LateUse, type: GP, width: 64});
     bb5.append(inst);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createTmp(Reg.r12);
     inst.args.push(arg);
@@ -1235,6 +1260,7 @@ function createPayloadJSAirACLj8C()
     inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
     bb5.append(inst);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createResCond(NonZero);
     inst.args.push(arg);
@@ -1267,12 +1293,13 @@ function createPayloadJSAirACLj8C()
     inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
     bb5.append(inst);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createRelCond(NotEqual);
     inst.args.push(arg);
     arg = Arg.createAddr(Reg.rcx, 0);
     inst.args.push(arg);
-    arg = Arg.createImm(406);
+    arg = Arg.createImm(419);
     inst.args.push(arg);
     arg = Arg.createTmp(Reg.rcx);
     inst.args.push(arg);
@@ -1299,7 +1326,7 @@ function createPayloadJSAirACLj8C()
     inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
     bb5.append(inst);
     inst = new Inst(Move);
-    arg = Arg.createBigImm(4346906176);
+    arg = Arg.createBigImm(276168608, 1);
     inst.args.push(arg);
     arg = Arg.createTmp(Reg.rax);
     inst.args.push(arg);
@@ -1329,6 +1356,7 @@ function createPayloadJSAirACLj8C()
     inst.args.push(arg);
     bb5.append(inst);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createTmp(Reg.rax);
     inst.args.push(arg);
@@ -1386,6 +1414,7 @@ function createPayloadJSAirACLj8C()
     inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
     bb5.append(inst);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createTmp(Reg.r12);
     inst.args.push(arg);
@@ -1472,6 +1501,7 @@ function createPayloadJSAirACLj8C()
     inst.args.push(arg);
     bb7.append(inst);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createTmp(Reg.rax);
     inst.args.push(arg);
@@ -1538,6 +1568,7 @@ function createPayloadJSAirACLj8C()
     inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
     bb7.append(inst);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createTmp(Reg.r12);
     inst.args.push(arg);
@@ -1582,6 +1613,7 @@ function createPayloadJSAirACLj8C()
     bb11.predecessors.push(bb9);
     bb11.predecessors.push(bb10);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createRelCond(Below);
     inst.args.push(arg);
@@ -1608,6 +1640,7 @@ function createPayloadJSAirACLj8C()
     inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
     bb11.append(inst);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createTmp(Reg.r12);
     inst.args.push(arg);
@@ -1646,6 +1679,7 @@ function createPayloadJSAirACLj8C()
     inst.args.push(arg);
     bb14.append(inst);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createRelCond(NotEqual);
     inst.args.push(arg);
index b2b63b0..8c8becc 100644 (file)
@@ -48,6 +48,7 @@ function createPayloadTypescriptScanIdentifier()
     let slot7 = code.addStackSlot(8, Spill);
     let slot8 = code.addStackSlot(8, Spill);
     let slot9 = code.addStackSlot(40, Locked);
+    slot9.setOffsetFromFP(-40);
     let tmp98 = code.newTmp(GP);
     let tmp97 = code.newTmp(GP);
     let tmp96 = code.newTmp(GP);
@@ -152,7 +153,7 @@ function createPayloadTypescriptScanIdentifier()
     bb0.successors.push(new FrequentedBlock(bb5, Normal));
     bb0.successors.push(new FrequentedBlock(bb4, Normal));
     inst = new Inst(Move);
-    arg = Arg.createBigImm(4579251936);
+    arg = Arg.createBigImm(177329888, 1);
     inst.args.push(arg);
     arg = Arg.createTmp(Reg.rax);
     inst.args.push(arg);
@@ -164,6 +165,7 @@ function createPayloadTypescriptScanIdentifier()
     inst.args.push(arg);
     bb0.append(inst);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createTmp(Reg.rbp);
     inst.args.push(arg);
@@ -186,12 +188,13 @@ function createPayloadTypescriptScanIdentifier()
     inst.args.push(arg);
     bb0.append(inst);
     inst = new Inst(Move);
-    arg = Arg.createBigImm(-281474976710654);
+    arg = Arg.createBigImm(2, -65536);
     inst.args.push(arg);
     arg = Arg.createTmp(Reg.r15);
     inst.args.push(arg);
     bb0.append(inst);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createResCond(NonZero);
     inst.args.push(arg);
@@ -212,6 +215,7 @@ function createPayloadTypescriptScanIdentifier()
     inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
     bb0.append(inst);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createRelCond(NotEqual);
     inst.args.push(arg);
@@ -232,6 +236,7 @@ function createPayloadTypescriptScanIdentifier()
     inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
     bb0.append(inst);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createRelCond(NotEqual);
     inst.args.push(arg);
@@ -277,12 +282,13 @@ function createPayloadTypescriptScanIdentifier()
     inst.args.push(arg);
     bb0.append(inst);
     inst = new Inst(Move);
-    arg = Arg.createBigImm(4556913984);
+    arg = Arg.createBigImm(154991936, 1);
     inst.args.push(arg);
     arg = Arg.createTmp(Reg.rcx);
     inst.args.push(arg);
     bb0.append(inst);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createRelCond(NotEqual);
     inst.args.push(arg);
@@ -290,7 +296,7 @@ function createPayloadTypescriptScanIdentifier()
     inst.args.push(arg);
     arg = Arg.createImm(80);
     inst.args.push(arg);
-    arg = Arg.createBigImm(4556913984);
+    arg = Arg.createBigImm(154991936, 1);
     inst.args.push(arg);
     arg = Arg.createTmp(Reg.rbx);
     inst.args.push(arg);
@@ -312,7 +318,7 @@ function createPayloadTypescriptScanIdentifier()
     inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32});
     bb0.append(inst);
     inst = new Inst(Move);
-    arg = Arg.createBigImm(4556913992);
+    arg = Arg.createBigImm(154991944, 1);
     inst.args.push(arg);
     arg = Arg.createTmp(Reg.rcx);
     inst.args.push(arg);
@@ -330,6 +336,7 @@ function createPayloadTypescriptScanIdentifier()
     inst.args.push(arg);
     bb0.append(inst);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createRelCond(AboveOrEqual);
     inst.args.push(arg);
@@ -412,6 +419,7 @@ function createPayloadTypescriptScanIdentifier()
     inst.args.push(arg);
     bb0.append(inst);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createResCond(NonZero);
     inst.args.push(arg);
@@ -447,7 +455,7 @@ function createPayloadTypescriptScanIdentifier()
     inst.args.push(arg);
     bb0.append(inst);
     inst = new Inst(Move);
-    arg = Arg.createBigImm(4531909360);
+    arg = Arg.createBigImm(129987312, 1);
     inst.args.push(arg);
     arg = Arg.createTmp(Reg.rcx);
     inst.args.push(arg);
@@ -459,13 +467,13 @@ function createPayloadTypescriptScanIdentifier()
     inst.args.push(arg);
     bb0.append(inst);
     inst = new Inst(Move);
-    arg = Arg.createBigImm(4510266960);
+    arg = Arg.createBigImm(108418352, 1);
     inst.args.push(arg);
     arg = Arg.createTmp(Reg.rcx);
     inst.args.push(arg);
     bb0.append(inst);
     inst = new Inst(Move);
-    arg = Arg.createBigImm(-281474976710656);
+    arg = Arg.createBigImm(0, -65536);
     inst.args.push(arg);
     arg = Arg.createTmp(Reg.r14);
     inst.args.push(arg);
@@ -486,6 +494,7 @@ function createPayloadTypescriptScanIdentifier()
     bb0.append(inst);
     bb1.predecessors.push(bb6);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     inst.patchHasNonArgEffects = true;
     inst.extraEarlyClobberedRegs = new Set();
@@ -497,6 +506,7 @@ function createPayloadTypescriptScanIdentifier()
     bb1.append(inst);
     bb2.predecessors.push(bb23);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     inst.patchHasNonArgEffects = true;
     inst.extraEarlyClobberedRegs = new Set();
@@ -508,6 +518,7 @@ function createPayloadTypescriptScanIdentifier()
     bb2.append(inst);
     bb3.predecessors.push(bb32);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     inst.patchHasNonArgEffects = true;
     inst.extraEarlyClobberedRegs = new Set();
@@ -519,6 +530,7 @@ function createPayloadTypescriptScanIdentifier()
     bb3.append(inst);
     bb4.predecessors.push(bb0);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createTmp(Reg.rbx);
     inst.args.push(arg);
@@ -615,6 +627,7 @@ function createPayloadTypescriptScanIdentifier()
     inst.args.push(arg);
     bb6.append(inst);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createTmp(Reg.r10);
     inst.args.push(arg);
@@ -681,7 +694,7 @@ function createPayloadTypescriptScanIdentifier()
     inst.args.push(arg);
     bb6.append(inst);
     inst = new Inst(Move);
-    arg = Arg.createBigImm(4531909360);
+    arg = Arg.createBigImm(129987312, 1);
     inst.args.push(arg);
     arg = Arg.createTmp(Reg.rcx);
     inst.args.push(arg);
@@ -759,6 +772,7 @@ function createPayloadTypescriptScanIdentifier()
     inst.args.push(arg);
     bb11.append(inst);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createResCond(Overflow);
     inst.args.push(arg);
@@ -820,6 +834,7 @@ function createPayloadTypescriptScanIdentifier()
     inst.args.push(arg);
     bb11.append(inst);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createResCond(Overflow);
     inst.args.push(arg);
@@ -880,6 +895,7 @@ function createPayloadTypescriptScanIdentifier()
     bb12.successors.push(new FrequentedBlock(bb14, Normal));
     bb12.predecessors.push(bb11);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createRelCond(AboveOrEqual);
     inst.args.push(arg);
@@ -982,6 +998,7 @@ function createPayloadTypescriptScanIdentifier()
     inst.args.push(arg);
     bb15.append(inst);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createRelCond(AboveOrEqual);
     inst.args.push(arg);
@@ -1046,6 +1063,7 @@ function createPayloadTypescriptScanIdentifier()
     inst.args.push(arg);
     bb15.append(inst);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createResCond(NonZero);
     inst.args.push(arg);
@@ -1090,6 +1108,7 @@ function createPayloadTypescriptScanIdentifier()
     bb15.append(inst);
     bb16.predecessors.push(bb11);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createTmp(Reg.rbx);
     inst.args.push(arg);
@@ -1150,6 +1169,7 @@ function createPayloadTypescriptScanIdentifier()
     bb19.append(inst);
     bb20.predecessors.push(bb19);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createTmp(Reg.rbx);
     inst.args.push(arg);
@@ -1172,6 +1192,7 @@ function createPayloadTypescriptScanIdentifier()
     bb21.successors.push(new FrequentedBlock(bb23, Normal));
     bb21.predecessors.push(bb19);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createTmp(Reg.rbx);
     inst.args.push(arg);
@@ -1195,6 +1216,7 @@ function createPayloadTypescriptScanIdentifier()
     bb21.append(inst);
     bb22.predecessors.push(bb21);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createTmp(Reg.rbx);
     inst.args.push(arg);
@@ -1223,7 +1245,7 @@ function createPayloadTypescriptScanIdentifier()
     inst.args.push(arg);
     bb23.append(inst);
     inst = new Inst(Move);
-    arg = Arg.createBigImm(4556943616);
+    arg = Arg.createBigImm(155021568, 1);
     inst.args.push(arg);
     arg = Arg.createTmp(Reg.rax);
     inst.args.push(arg);
@@ -1259,6 +1281,7 @@ function createPayloadTypescriptScanIdentifier()
     inst.args.push(arg);
     bb23.append(inst);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createTmp(Reg.rax);
     inst.args.push(arg);
@@ -1325,6 +1348,7 @@ function createPayloadTypescriptScanIdentifier()
     inst.args.push(arg);
     bb23.append(inst);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createTmp(Reg.rbx);
     inst.args.push(arg);
@@ -1339,7 +1363,7 @@ function createPayloadTypescriptScanIdentifier()
     inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
     bb23.append(inst);
     inst = new Inst(Move);
-    arg = Arg.createBigImm(4556963336);
+    arg = Arg.createBigImm(155041288, 1);
     inst.args.push(arg);
     arg = Arg.createTmp(Reg.rax);
     inst.args.push(arg);
@@ -1357,6 +1381,7 @@ function createPayloadTypescriptScanIdentifier()
     inst.args.push(arg);
     bb23.append(inst);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createResCond(NonZero);
     inst.args.push(arg);
@@ -1404,7 +1429,7 @@ function createPayloadTypescriptScanIdentifier()
     inst.args.push(arg);
     bb23.append(inst);
     inst = new Inst(Move);
-    arg = Arg.createBigImm(4510204912);
+    arg = Arg.createBigImm(108356304, 1);
     inst.args.push(arg);
     arg = Arg.createTmp(Reg.rcx);
     inst.args.push(arg);
@@ -1434,6 +1459,7 @@ function createPayloadTypescriptScanIdentifier()
     inst.args.push(arg);
     bb23.append(inst);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createTmp(Reg.rcx);
     inst.args.push(arg);
@@ -1485,7 +1511,7 @@ function createPayloadTypescriptScanIdentifier()
     inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
     bb23.append(inst);
     inst = new Inst(Move);
-    arg = Arg.createBigImm(4531909360);
+    arg = Arg.createBigImm(129987312, 1);
     inst.args.push(arg);
     arg = Arg.createTmp(Reg.rcx);
     inst.args.push(arg);
@@ -1502,6 +1528,7 @@ function createPayloadTypescriptScanIdentifier()
     bb24.successors.push(new FrequentedBlock(bb26, Normal));
     bb24.predecessors.push(bb23);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createTmp(Reg.rbx);
     inst.args.push(arg);
@@ -1621,7 +1648,7 @@ function createPayloadTypescriptScanIdentifier()
     inst.args.push(arg);
     bb32.append(inst);
     inst = new Inst(Move);
-    arg = Arg.createBigImm(4556913680);
+    arg = Arg.createBigImm(154991632, 1);
     inst.args.push(arg);
     arg = Arg.createTmp(Reg.rcx);
     inst.args.push(arg);
@@ -1645,8 +1672,9 @@ function createPayloadTypescriptScanIdentifier()
     inst.args.push(arg);
     bb32.append(inst);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
-    arg = Arg.createBigImm(4510204912);
+    arg = Arg.createBigImm(108356304, 1);
     inst.args.push(arg);
     arg = Arg.createTmp(Reg.rax);
     inst.args.push(arg);
@@ -1696,7 +1724,7 @@ function createPayloadTypescriptScanIdentifier()
     inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
     bb32.append(inst);
     inst = new Inst(Move);
-    arg = Arg.createBigImm(4531909360);
+    arg = Arg.createBigImm(129987312, 1);
     inst.args.push(arg);
     arg = Arg.createTmp(Reg.rcx);
     inst.args.push(arg);
@@ -1711,6 +1739,7 @@ function createPayloadTypescriptScanIdentifier()
     bb32.append(inst);
     bb33.predecessors.push(bb32);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createTmp(Reg.rbx);
     inst.args.push(arg);
@@ -1730,7 +1759,7 @@ function createPayloadTypescriptScanIdentifier()
     bb33.append(inst);
     bb34.predecessors.push(bb30);
     inst = new Inst(Move);
-    arg = Arg.createBigImm(4555757344);
+    arg = Arg.createBigImm(153835296, 1);
     inst.args.push(arg);
     arg = Arg.createTmp(Reg.rax);
     inst.args.push(arg);
@@ -1766,6 +1795,7 @@ function createPayloadTypescriptScanIdentifier()
     inst.args.push(arg);
     bb34.append(inst);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createTmp(Reg.rax);
     inst.args.push(arg);
@@ -1826,6 +1856,7 @@ function createPayloadTypescriptScanIdentifier()
     inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
     bb34.append(inst);
     inst = new Inst(Patch);
+    arg = Arg.createSpecial();
     inst.args.push(arg);
     arg = Arg.createTmp(Reg.rbx);
     inst.args.push(arg);
index 8c72a65..36f7a14 100644 (file)
@@ -46,6 +46,13 @@ class Reg extends TmpBase {
     
     get isReg() { return true; }
     
+    hash()
+    {
+        if (this.isGP)
+            return 1 + this._index;
+        return -1 - this._index;
+    }
+    
     toString()
     {
         return "%" + this._name;
index f37d003..dafd87a 100644 (file)
@@ -62,6 +62,11 @@ class StackSlot {
     
     setOffsetFromFP(value) { this._offsetFromFP = value; }
     
+    hash()
+    {
+        return ((this._kind == Spill ? 1 : 0) + this._byteSize * 3 + (this._offsetFromFP ? this._offsetFromFP * 7 : 0)) >>> 0;
+    }
+    
     toString()
     {
         return "" + (this.isSpill ? "spill" : "stack") + this._index + "<" + this._byteSize +
diff --git a/PerformanceTests/JSAir/strip-hash.rb b/PerformanceTests/JSAir/strip-hash.rb
new file mode 100644 (file)
index 0000000..b5c2393
--- /dev/null
@@ -0,0 +1,10 @@
+# This is a useful hack for cleaning up the payloads generated by Air::dumpAsJS(). That will
+# generate code that computes the hash of insts and stack slots and checks it. This is useful for
+# debugging, but we probably don't want that overhead in the payloads we deploy. So, you can run
+# this script to remove all of the hashing code.
+
+ARGV.each {
+    | filename |
+    IO::write(filename, IO::read(filename).lines.reject{|v| v =~ /hash/i}.join())
+}
+
index 1939af3..4ef7c63 100644 (file)
@@ -57,6 +57,34 @@ const GreaterThanOrEqual = Symbol("GreaterThanOrEqual");
 const LessThan = Symbol("LessThan");
 const LessThanOrEqual = Symbol("LessThanOrEqual");
 
+function relCondCode(cond)
+{
+    switch (cond) {
+    case Equal:
+        return 4;
+    case NotEqual:
+        return 5;
+    case Above:
+        return 7;
+    case AboveOrEqual:
+        return 3;
+    case Below:
+        return 2;
+    case BelowOrEqual:
+        return 6;
+    case GreaterThan:
+        return 15;
+    case GreaterThanOrEqual:
+        return 13;
+    case LessThan:
+        return 12;
+    case LessThanOrEqual:
+        return 14;
+    default:
+        throw new Error("Bad rel cond");
+    }
+}
+
 // Result conditions
 const Overflow = Symbol("Overflow");
 const Signed = Symbol("Signed");
@@ -64,6 +92,24 @@ const PositiveOrZero = Symbol("PositiveOrZero");
 const Zero = Symbol("Zero");
 const NonZero = Symbol("NonZero");
 
+function resCondCode(cond)
+{
+    switch (cond) {
+    case Overflow:
+        return 0;
+    case Signed:
+        return 8;
+    case PositiveOrZero:
+        return 9;
+    case Zero:
+        return 4;
+    case NonZero:
+        return 5;
+    default:
+        throw new Error("Bad res cond: " + cond.toString());
+    }
+}
+
 // Double conditions
 const DoubleEqual = Symbol("DoubleEqual");
 const DoubleNotEqual = Symbol("DoubleNotEqual");
@@ -78,5 +124,39 @@ const DoubleGreaterThanOrEqualOrUnordered = Symbol("DoubleGreaterThanOrEqualOrUn
 const DoubleLessThanOrUnordered = Symbol("DoubleLessThanOrUnordered");
 const DoubleLessThanOrEqualOrUnordered = Symbol("DoubleLessThanOrEqualOrUnordered");
 
+function doubleCondCode(cond)
+{
+    const bitInvert = 0x10;
+    const bitSpecial = 0x20;
+    switch (cond) {
+    case DoubleEqual:
+        return 4 | bitSpecial;
+    case DoubleNotEqual:
+        return 5;
+    case DoubleGreaterThan:
+        return 7;
+    case DoubleGreaterThanOrEqual:
+        return 3;
+    case DoubleLessThan:
+        return 7 | bitInvert;
+    case DoubleLessThanOrEqual:
+        return 3 | bitInvert;
+    case DoubleEqualOrUnordered:
+        return 4;
+    case DoubleNotEqualOrUnordered:
+        return 5 | bitSpecial;
+    case DoubleGreaterThanOrUnordered:
+        return 2 | bitInvert;
+    case DoubleGreaterThanOrEqualOrUnordered:
+        return 6 | bitInvert;
+    case DoubleLessThanOrUnordered:
+        return 2;
+    case DoubleLessThanOrEqualOrUnordered:
+        return 6;
+    default:
+        throw new Error("Bad cond");
+    }
+}
+
 // Define pointerType()
 const Ptr = 64;
index 531d711..997219a 100644 (file)
@@ -42,6 +42,13 @@ class Tmp extends TmpBase {
     
     get isReg() { return false; }
     
+    hash()
+    {
+        if (isGP)
+            return Reg.gprs[Reg.gprs.length - 1].hash() + 1 + this._index;
+        return Reg.fprs[Reg.fprs.length - 1].hash() - 1 - this._index;
+    }
+
     toString()
     {
         return "%" + (this.isGP ? "" : "f") + "tmp" + this._index;
index 31ef7ea..5ee8e9c 100644 (file)
@@ -40,7 +40,7 @@ const stackAlignmentBytes = 16;
 
 function roundUpToMultipleOf(amount, value)
 {
-    return Math.ceil(value / amount * amount);
+    return Math.ceil(value / amount) * amount;
 }
 
 function symbolName(symbol)
index 85591de..7924323 100644 (file)
@@ -1,3 +1,44 @@
+2016-06-07  Filip Pizlo  <fpizlo@apple.com>
+
+        Add result validation to JSAir
+        https://bugs.webkit.org/show_bug.cgi?id=158493
+
+        Reviewed by Saam Barati.
+        
+        Add a ::jsHash() method to some things, to compute a hash code that is suitable for
+        comparing a C++ Code to a JSAir Code. This is different from existing hashing functionality
+        because it errs on the side of easy reproducibility from JS rather than speed.
+
+        * b3/air/AirArg.cpp:
+        (JSC::B3::Air::Arg::isCompatibleType):
+        (JSC::B3::Air::Arg::jsHash):
+        (JSC::B3::Air::Arg::dump):
+        * b3/air/AirArg.h:
+        (JSC::B3::Air::Arg::asDoubleCondition):
+        (JSC::B3::Air::Arg::isInvertible):
+        (JSC::B3::Air::Arg::isUnsignedCond):
+        (JSC::B3::Air::Arg::Arg):
+        * b3/air/AirCode.cpp:
+        (JSC::B3::Air::Code::addFastTmp):
+        (JSC::B3::Air::Code::jsHash):
+        * b3/air/AirCode.h:
+        (JSC::B3::Air::Code::lastPhaseName):
+        * b3/air/AirDumpAsJS.cpp:
+        (JSC::B3::Air::dumpAsJS):
+        * b3/air/AirGenerate.cpp:
+        (JSC::B3::Air::prepareForGeneration):
+        * b3/air/AirInst.cpp:
+        (JSC::B3::Air::Inst::hasArgEffects):
+        (JSC::B3::Air::Inst::jsHash):
+        (JSC::B3::Air::Inst::dump):
+        * b3/air/AirInst.h:
+        * b3/air/AirStackSlot.cpp:
+        (JSC::B3::Air::StackSlot::setOffsetFromFP):
+        (JSC::B3::Air::StackSlot::jsHash):
+        (JSC::B3::Air::StackSlot::dump):
+        * b3/air/AirStackSlot.h:
+        * b3/air/opcode_generator.rb:
+
 2016-06-07  Mark Lam  <mark.lam@apple.com>
 
         Need an exception check after constructEmptyArray().
index 2edd8e7..88cc26e 100644 (file)
@@ -109,6 +109,50 @@ bool Arg::isCompatibleType(const Arg& other) const
     return true;
 }
 
+unsigned Arg::jsHash() const
+{
+    unsigned result = static_cast<unsigned>(m_kind);
+    
+    switch (m_kind) {
+    case Invalid:
+    case Special:
+        break;
+    case Tmp:
+        result += m_base.internalValue();
+        break;
+    case Imm:
+    case BitImm:
+    case CallArg:
+    case RelCond:
+    case ResCond:
+    case DoubleCond:
+    case WidthArg:
+        result += static_cast<unsigned>(m_offset);
+        break;
+    case BigImm:
+    case BitImm64:
+        result += static_cast<unsigned>(m_offset);
+        result += static_cast<unsigned>(m_offset >> 32);
+        break;
+    case Addr:
+        result += m_offset;
+        result += m_base.internalValue();
+        break;
+    case Index:
+        result += static_cast<unsigned>(m_offset);
+        result += m_scale;
+        result += m_base.internalValue();
+        result += m_index.internalValue();
+        break;
+    case Stack:
+        result += static_cast<unsigned>(m_scale);
+        result += stackSlot()->index();
+        break;
+    }
+    
+    return result;
+}
+
 void Arg::dump(PrintStream& out) const
 {
     switch (m_kind) {
index 34ebd44..a693eb0 100644 (file)
@@ -1209,7 +1209,7 @@ public:
         ASSERT(isDoubleCond());
         return static_cast<MacroAssembler::DoubleCondition>(m_offset);
     }
-
+    
     // Tells you if the Arg is invertible. Only condition arguments are invertible, and even for those, there
     // are a few exceptions - notably Overflow and Signed.
     bool isInvertible() const
@@ -1260,6 +1260,9 @@ public:
         return isRelCond() && MacroAssembler::isUnsigned(asRelationalCondition());
     }
 
+    // This computes a hash for comparing this to JSAir's Arg.
+    unsigned jsHash() const;
+    
     void dump(PrintStream&) const;
 
     Arg(WTF::HashTableDeletedValueType)
index 6664186..e6b092f 100644 (file)
@@ -134,6 +134,29 @@ void Code::addFastTmp(Tmp tmp)
     m_fastTmps.add(tmp);
 }
 
+unsigned Code::jsHash() const
+{
+    unsigned result = 0;
+    
+    for (BasicBlock* block : *this) {
+        result *= 1000001;
+        for (Inst& inst : *block) {
+            result *= 97;
+            result += inst.jsHash();
+        }
+        for (BasicBlock* successor : block->successorBlocks()) {
+            result *= 7;
+            result += successor->index();
+        }
+    }
+    for (StackSlot* slot : stackSlots()) {
+        result *= 101;
+        result += slot->jsHash();
+    }
+    
+    return result;
+}
+
 } } } // namespace JSC::B3::Air
 
 #endif // ENABLE(B3_JIT)
index a647add..7c53c76 100644 (file)
@@ -211,6 +211,10 @@ public:
 
     const char* lastPhaseName() const { return m_lastPhaseName; }
 
+    // This is a hash of the code. You can use this if you want to put code into a hashtable, but
+    // it's mainly for validating the results from JSAir.
+    unsigned jsHash() const;
+
 private:
     friend class ::JSC::B3::Procedure;
     friend class BlockInsertionSet;
index fc2ef34..029101b 100644 (file)
@@ -81,11 +81,18 @@ void dumpAsJS(Code& code, PrintStream& out)
     for (unsigned i = 0; i < code.size(); ++i)
         out.println("let ", varNameForBlockAtIndex(i), " = code.addBlock();");
     
+    out.println("let hash;");
+
     for (unsigned i = 0; i < code.stackSlots().size(); ++i) {
         StackSlot* slot = code.stackSlots()[i];
-        if (slot)
+        if (slot) {
             out.println("let ", varName(slot), " = code.addStackSlot(", slot->byteSize(), ", ", slot->kind(), ");");
-        else
+            if (slot->offsetFromFP())
+                out.println(varName(slot), ".setOffsetFromFP(", slot->offsetFromFP(), ");");
+            out.println("hash = ", varName(slot), ".hash();");
+            out.println("if (hash != ", slot->jsHash(), ")");
+            out.println("    throw new Error(\"Bad hash: \" + hash);");
+        } else
             out.println("code.addStackSlot(1, Spill);");
     }
     
@@ -129,7 +136,10 @@ void dumpAsJS(Code& code, PrintStream& out)
                         break;
                         
                     case Arg::BigImm:
-                        out.println("arg = Arg.createBigImm(", arg.value(), ");");
+                        out.println(
+                            "arg = Arg.createBigImm(",
+                            static_cast<int32_t>(arg.value()), ", ",
+                            static_cast<int32_t>(arg.value() >> 32), ");");
                         break;
                         
                     case Arg::BitImm:
@@ -137,7 +147,10 @@ void dumpAsJS(Code& code, PrintStream& out)
                         break;
                         
                     case Arg::BitImm64:
-                        out.println("arg = Arg.createBitImm64(", arg.value(), ");");
+                        out.println(
+                            "arg = Arg.createBitImm64(",
+                            static_cast<int32_t>(arg.value()), ", ",
+                            static_cast<int32_t>(arg.value() >> 32), ");");
                         break;
                         
                     case Arg::Addr:
@@ -173,7 +186,7 @@ void dumpAsJS(Code& code, PrintStream& out)
                         break;
                         
                     case Arg::Special:
-                        // JS-Air doesn't have Specials.
+                        out.println("arg = Arg.createSpecial();");
                         break;
                         
                     case Arg::WidthArg:
@@ -215,6 +228,10 @@ void dumpAsJS(Code& code, PrintStream& out)
                     out.println("inst.cCallArgTypes.push(", inst.origin->child(i)->type(), ");");
             }
             
+            out.println("hash = inst.hash();");
+            out.println("if (hash != ", inst.jsHash(), ")");
+            out.println("    throw new Error(\"Bad hash: \" + hash);");
+            
             out.println(varName(block), ".append(inst);");
         }
     }
index 62a0c63..adc288e 100644 (file)
@@ -107,6 +107,7 @@ void prepareForGeneration(Code& code)
     if (Options::dumpAirAsJSBeforeAllocateStack()) {
         dataLog("Dumping Air as JS before allocateStack:\n");
         dumpAsJS(code, WTF::dataFile());
+        dataLog("Air hash: ", code.jsHash(), "\n");
     }
 
     // This turns all Stack and CallArg Args into Addr args that use the frame pointer. It does
@@ -117,6 +118,7 @@ void prepareForGeneration(Code& code)
     if (Options::dumpAirAfterAllocateStack()) {
         dataLog("Dumping Air after allocateStack:\n");
         dataLog(code);
+        dataLog("Air hash: ", code.jsHash(), "\n");
     }
 
     // If we coalesced moves then we can unbreak critical edges. This is the main reason for this
index 297e50d..e83c3a4 100644 (file)
@@ -45,6 +45,16 @@ bool Inst::hasArgEffects()
     return result;
 }
 
+unsigned Inst::jsHash() const
+{
+    unsigned result = static_cast<unsigned>(opcode);
+    
+    for (const Arg& arg : args)
+        result += arg.jsHash();
+    
+    return result;
+}
+
 void Inst::dump(PrintStream& out) const
 {
     out.print(opcode, " ", listDump(args));
index 88e5df7..7d97647 100644 (file)
@@ -187,6 +187,9 @@ public:
     //     Add Tmp1, Tmp2, Tmp3
     // returns 2 if 0 and 1 benefit from aliasing to Tmp3.
     Optional<unsigned> shouldTryAliasingDef();
+    
+    // This computes a hash for comparing this to JSAir's Inst.
+    unsigned jsHash() const;
 
     void dump(PrintStream&) const;
 
index d0ab082..58cac06 100644 (file)
@@ -39,6 +39,11 @@ void StackSlot::setOffsetFromFP(intptr_t value)
         m_b3Slot->m_offsetFromFP = value;
 }
 
+unsigned StackSlot::jsHash() const
+{
+    return static_cast<unsigned>(m_kind) + m_byteSize * 3 + m_offsetFromFP * 7;
+}
+
 void StackSlot::dump(PrintStream& out) const
 {
     if (isSpill())
index 6c07390..2215cee 100644 (file)
@@ -76,6 +76,9 @@ public:
     // This should usually just be called from phases that do stack allocation. But you can
     // totally force a stack slot to land at some offset.
     void setOffsetFromFP(intptr_t);
+    
+    // This computes a hash for comparing this to JSAir's StackSlot.
+    unsigned jsHash() const;
 
     void dump(PrintStream&) const;
     void deepDump(PrintStream&) const;
index 220a940..a7fa399 100644 (file)
@@ -1181,5 +1181,18 @@ File.open("JSAir_opcode.js", "w") {
     outp.puts "return false;"
     outp.puts "}"
     outp.puts "}"
+    
+    outp.puts "function opcodeCode(opcode)"
+    outp.puts "{"
+    outp.puts "switch (opcode) {"
+    $opcodes.keys.sort.each_with_index {
+        | opcode, index |
+        outp.puts "case #{opcode}:"
+        outp.puts "return #{index}"
+    }
+    outp.puts "default:"
+    outp.puts "throw new Error(\"bad opcode\");"
+    outp.puts "}"
+    outp.puts "}"
 }
 
index 0bfcdb4..f18a0b0 100644 (file)
@@ -1,3 +1,15 @@
+2016-06-07  Filip Pizlo  <fpizlo@apple.com>
+
+        Add result validation to JSAir
+        https://bugs.webkit.org/show_bug.cgi?id=158493
+
+        Reviewed by Saam Barati.
+        
+        Run JSAir.
+
+        * Scripts/run-javascriptcore-tests:
+        (runJSCStressTests):
+
 2016-06-08  Brady Eidson  <beidson@apple.com>
 
         Add an API test that confirms object constructor/destructor calls during creation of a CrossThreadTask.
index 936891e..a736f4a 100755 (executable)
@@ -234,6 +234,7 @@ sub runJSCStressTests
         @testList = (
             "PerformanceTests/SunSpider/tests/sunspider-1.0",
             "PerformanceTests/JetStream/cdjs/cdjs-tests.yaml",
+            "PerformanceTests/JSAir/jsair-tests.yaml",
             "Source/JavaScriptCore/tests/executableAllocationFuzz.yaml",
             "Source/JavaScriptCore/tests/exceptionFuzz.yaml",
             "PerformanceTests/SunSpider/no-architecture-specific-optimizations.yaml",