/* * Copyright (C) 2016-2018 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 INC. ``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 INC. OR * 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. */ "use strict"; // This file is for misc symbols. // B3 types const Void = Symbol("Void"); const Int32 = Symbol("Int32"); const Int64 = Symbol("Int64"); const Float = Symbol("Float"); const Double = Symbol("Double"); // Arg type const GP = Symbol("GP"); const FP = Symbol("FP"); // Stack slot kind const Locked = Symbol("Locked"); const Spill = Symbol("Spill"); // Frequency class const Normal = Symbol("Normal"); const Rare = Symbol("Rare"); // Relational conditions const Equal = Symbol("Equal"); const NotEqual = Symbol("NotEqual"); const Above = Symbol("Above"); const AboveOrEqual = Symbol("AboveOrEqual"); const Below = Symbol("Below"); const BelowOrEqual = Symbol("BelowOrEqual"); const GreaterThan = Symbol("GreaterThan"); 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"); 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"); const DoubleGreaterThan = Symbol("DoubleGreaterThan"); const DoubleGreaterThanOrEqual = Symbol("DoubleGreaterThanOrEqual"); const DoubleLessThan = Symbol("DoubleLessThan"); const DoubleLessThanOrEqual = Symbol("DoubleLessThanOrEqual"); const DoubleEqualOrUnordered = Symbol("DoubleEqualOrUnordered"); const DoubleNotEqualOrUnordered = Symbol("DoubleNotEqualOrUnordered"); const DoubleGreaterThanOrUnordered = Symbol("DoubleGreaterThanOrUnordered"); const DoubleGreaterThanOrEqualOrUnordered = Symbol("DoubleGreaterThanOrEqualOrUnordered"); 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; class TmpBase { get isGP() { return this.type == GP; } get isFP() { return this.type == FP; } get isGPR() { return this.isReg && this.isGP; } get isFPR() { return this.isReg && this.isFP; } get reg() { if (!this.isReg) throw new Error("Called .reg on non-Reg"); return this; } get gpr() { if (!this.isGPR) throw new Error("Called .gpr on non-GPR"); return this; } get fpr() { if (!this.isFPR) throw new Error("Called .fpr on non-FPR"); return this; } } class Arg { constructor() { this._kind = Arg.Invalid; } static isAnyUse(role) { switch (role) { case Arg.Use: case Arg.ColdUse: case Arg.UseDef: case Arg.UseZDef: case Arg.LateUse: case Arg.LateColdUse: case Arg.Scratch: return true; case Arg.Def: case Arg.ZDef: case Arg.UseAddr: case Arg.EarlyDef: return false; default: throw new Error("Bad role"); } } static isColdUse(role) { switch (role) { case Arg.ColdUse: case Arg.LateColdUse: return true; case Arg.Use: case Arg.UseDef: case Arg.UseZDef: case Arg.LateUse: case Arg.Def: case Arg.ZDef: case Arg.UseAddr: case Arg.Scratch: case Arg.EarlyDef: return false; default: throw new Error("Bad role"); } } static isWarmUse(role) { return Arg.isAnyUse(role) && !Arg.isColdUse(role); } static cooled(role) { switch (role) { case Arg.ColdUse: case Arg.LateColdUse: case Arg.UseDef: case Arg.UseZDef: case Arg.Def: case Arg.ZDef: case Arg.UseAddr: case Arg.Scratch: case Arg.EarlyDef: return role; case Arg.Use: return Arg.ColdUse; case Arg.LateUse: return Arg.LateColdUse; default: throw new Error("Bad role"); } } static isEarlyUse(role) { switch (role) { case Arg.Use: case Arg.ColdUse: case Arg.UseDef: case Arg.UseZDef: return true; case Arg.Def: case Arg.ZDef: case Arg.UseAddr: case Arg.LateUse: case Arg.LateColdUse: case Arg.Scratch: case Arg.EarlyDef: return false; default: throw new Error("Bad role"); } } static isLateUse(role) { switch (role) { case Arg.LateUse: case Arg.LateColdUse: case Arg.Scratch: return true; case Arg.ColdUse: case Arg.Use: case Arg.UseDef: case Arg.UseZDef: case Arg.Def: case Arg.ZDef: case Arg.UseAddr: case Arg.EarlyDef: return false; default: throw new Error("Bad role"); } } static isAnyDef(role) { switch (role) { case Arg.Use: case Arg.ColdUse: case Arg.UseAddr: case Arg.LateUse: case Arg.LateColdUse: return false; case Arg.Def: case Arg.UseDef: case Arg.ZDef: case Arg.UseZDef: case Arg.EarlyDef: case Arg.Scratch: return true; default: throw new Error("Bad role"); } } static isEarlyDef(role) { switch (role) { case Arg.Use: case Arg.ColdUse: case Arg.UseAddr: case Arg.LateUse: case Arg.Def: case Arg.UseDef: case Arg.ZDef: case Arg.UseZDef: case Arg.LateColdUse: return false; case Arg.EarlyDef: case Arg.Scratch: return true; default: throw new Error("Bad role"); } } static isLateDef(role) { switch (role) { case Arg.Use: case Arg.ColdUse: case Arg.UseAddr: case Arg.LateUse: case Arg.EarlyDef: case Arg.Scratch: case Arg.LateColdUse: return false; case Arg.Def: case Arg.UseDef: case Arg.ZDef: case Arg.UseZDef: return true; default: throw new Error("Bad role"); } } static isZDef(role) { switch (role) { case Arg.Use: case Arg.ColdUse: case Arg.UseAddr: case Arg.LateUse: case Arg.Def: case Arg.UseDef: case Arg.EarlyDef: case Arg.Scratch: case Arg.LateColdUse: return false; case Arg.ZDef: case Arg.UseZDef: return true; default: throw new Error("Bad role"); } } static typeForB3Type(type) { switch (type) { case Int32: case Int64: return GP; case Float: case Double: return FP; default: throw new Error("Bad B3 type"); } } static widthForB3Type(type) { switch (type) { case Int32: case Float: return 32; case Int64: case Double: return 64; default: throw new Error("Bad B3 type"); } } static conservativeWidth(type) { return type == GP ? Ptr : 64; } static minimumWidth(type) { return type == GP ? 8 : 32; } static bytes(width) { return width / 8; } static widthForBytes(bytes) { switch (bytes) { case 0: case 1: return 8; case 2: return 16; case 3: case 4: return 32; default: if (bytes > 8) throw new Error("Bad number of bytes"); return 64; } } static createTmp(tmp) { let result = new Arg(); result._kind = Arg.Tmp; result._tmp = tmp; return result; } static fromReg(reg) { return Arg.createTmp(reg); } static createImm(value) { let result = new Arg(); result._kind = Arg.Imm; result._value = value; return result; } static createBigImm(lowValue, highValue = 0) { let result = new Arg(); result._kind = Arg.BigImm; result._lowValue = lowValue; result._highValue = highValue; return result; } static createBitImm(value) { let result = new Arg(); result._kind = Arg.BitImm; result._value = value; return result; } static createBitImm64(lowValue, highValue = 0) { let result = new Arg(); result._kind = Arg.BitImm64; result._lowValue = lowValue; result._highValue = highValue; return result; } static createAddr(base, offset = 0) { let result = new Arg(); result._kind = Arg.Addr; result._base = base; result._offset = offset; return result; } static createStack(slot, offset = 0) { let result = new Arg(); result._kind = Arg.Stack; result._slot = slot; result._offset = offset; return result; } static createCallArg(offset) { let result = new Arg(); result._kind = Arg.CallArg; result._offset = offset; return result; } static createStackAddr(offsetFromFP, frameSize, width) { let result = Arg.createAddr(Reg.callFrameRegister, offsetFromFP); if (!result.isValidForm(width)) result = Arg.createAddr(Reg.stackPointerRegister, offsetFromFP + frameSize); return result; } static isValidScale(scale, width) { switch (scale) { case 1: case 2: case 4: case 8: return true; default: return false; } } static logScale(scale) { switch (scale) { case 1: return 0; case 2: return 1; case 4: return 2; case 8: return 3; default: throw new Error("Bad scale"); } } static createIndex(base, index, scale = 1, offset = 0) { let result = new Arg(); result._kind = Arg.Index; result._base = base; result._index = index; result._scale = scale; result._offset = offset; return result; } static createRelCond(condition) { let result = new Arg(); result._kind = Arg.RelCond; result._condition = condition; return result; } static createResCond(condition) { let result = new Arg(); result._kind = Arg.ResCond; result._condition = condition; return result; } static createDoubleCond(condition) { let result = new Arg(); result._kind = Arg.DoubleCond; result._condition = condition; return result; } static createWidth(width) { let result = new Arg(); result._kind = Arg.Width; result._width = width; 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; } get isBigImm() { return this._kind == Arg.BigImm; } get isBitImm() { return this._kind == Arg.BitImm; } get isBitImm64() { return this._kind == Arg.BitImm64; } get isSomeImm() { switch (this._kind) { case Arg.Imm: case Arg.BitImm: return true; default: return false; } } get isSomeBigImm() { switch (this._kind) { case Arg.BigImm: case Arg.BitImm64: return true; default: return false; } } get isAddr() { return this._kind == Arg.Addr; } get isStack() { return this._kind == Arg.Stack; } get isCallArg() { return this._kind == Arg.CallArg; } get isIndex() { return this._kind == Arg.Index; } get isMemory() { switch (this._kind) { case Arg.Addr: case Arg.Stack: case Arg.CallArg: case Arg.Index: return true; default: return false; } } get isStackMemory() { switch (this._kind) { case Arg.Addr: return this._base == Reg.callFrameRegister || this._base == Reg.stackPointerRegister; case Arg.Stack: case Arg.CallArg: return true; default: return false; } } get isRelCond() { return this._kind == Arg.RelCond; } get isResCond() { return this._kind == Arg.ResCond; } get isDoubleCond() { return this._kind == Arg.DoubleCond; } get isCondition() { switch (this._kind) { case Arg.RelCond: case Arg.ResCond: case Arg.DoubleCond: return true; default: return false; } } get isWidth() { return this._kind == Arg.Width; } get isSpecial() { return this._kind == Arg.Special; } get isAlive() { return this.isTmp || this.isStack; } get tmp() { if (this._kind != Arg.Tmp) throw new Error("Called .tmp for non-tmp"); return this._tmp; } get value() { if (!this.isSomeImm) throw new Error("Called .value for non-imm"); 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) { case Arg.Addr: case Arg.Index: return this._base; default: throw new Error("Called .base for non-address"); } } get hasOffset() { return this.isMemory; } get offset() { switch (this._kind) { case Arg.Addr: case Arg.Index: case Arg.Stack: case Arg.CallArg: return this._offset; default: throw new Error("Called .offset for non-address"); } } get stackSlot() { if (this._kind != Arg.Stack) throw new Error("Called .stackSlot for non-address"); return this._slot; } get index() { if (this._kind != Arg.Index) throw new Error("Called .index for non-Index"); return this._index; } get scale() { if (this._kind != Arg.Index) throw new Error("Called .scale for non-Index"); return this._scale; } get logScale() { return Arg.logScale(this.scale); } get width() { if (this._kind != Arg.Width) throw new Error("Called .width for non-Width"); return this._width; } get isGPTmp() { return this.isTmp && this.tmp.isGP; } get isFPTmp() { return this.isTmp && this.tmp.isFP; } get isGP() { switch (this._kind) { case Arg.Imm: case Arg.BigImm: case Arg.BitImm: case Arg.BitImm64: case Arg.Addr: case Arg.Index: case Arg.Stack: case Arg.CallArg: case Arg.RelCond: case Arg.ResCond: case Arg.DoubleCond: case Arg.Width: case Arg.Special: return true; case Arg.Tmp: return this.isGPTmp; case Arg.Invalid: return false; default: throw new Error("Bad kind"); } } get isFP() { switch (this._kind) { case Arg.Imm: case Arg.BitImm: case Arg.BitImm64: case Arg.RelCond: case Arg.ResCond: case Arg.DoubleCond: case Arg.Width: case Arg.Special: case Arg.Invalid: return false; case Arg.Addr: case Arg.Index: case Arg.Stack: case Arg.CallArg: case Arg.BigImm: return true; case Arg.Tmp: return this.isFPTmp; default: throw new Error("Bad kind"); } } get hasType() { switch (this._kind) { case Arg.Imm: case Arg.BitImm: case Arg.BitImm64: case Arg.Tmp: return true; default: return false; } } get type() { return this.isGP ? GP : FP; } isType(type) { switch (type) { case Arg.GP: return this.isGP; case Arg.FP: return this.isFP; default: throw new Error("Bad type"); } } isCompatibleType(other) { if (this.hasType) return other.isType(this.type); if (other.hasType) return this.isType(other.type); return true; } get isGPR() { return this.isTmp && this.tmp.isGPR; } get gpr() { return this.tmp.gpr; } get isFPR() { return this.isTmp && this.tmp.isFPR; } get fpr() { return this.tmp.fpr; } get isReg() { return this.isTmp && this.tmp.isReg; } get reg() { return this.tmp.reg; } static isValidImmForm(value) { return isRepresentableAsInt32(value); } static isValidBitImmForm(value) { return isRepresentableAsInt32(value); } static isValidBitImm64Form(value) { return isRepresentableAsInt32(value); } static isValidAddrForm(offset, width) { return true; } static isValidIndexForm(scale, offset, width) { if (!isValidScale(scale, width)) return false; return true; } isValidForm(width) { switch (this._kind) { case Arg.Invalid: return false; case Arg.Tmp: return true; case Arg.Imm: return Arg.isValidImmForm(this.value); case Arg.BigImm: return true; case Arg.BitImm: return Arg.isValidBitImmForm(this.value); case Arg.BitImm64: return Arg.isValidBitImm64Form(this.value); case Arg.Addr: case Arg.Stack: case Arg.CallArg: return Arg.isValidAddrForm(this.offset, width); case Arg.Index: return Arg.isValidIndexForm(this.scale, this.offset, width); case Arg.RelCond: case Arg.ResCond: case Arg.DoubleCond: case Arg.Width: case Arg.Special: return true; default: throw new Error("Bad kind"); } } forEachTmpFast(func) { switch (this._kind) { case Arg.Tmp: { let replacement; if (replacement = func(this._tmp)) return Arg.createTmp(replacement); break; } case Arg.Addr: { let replacement; if (replacement = func(this._base)) return Arg.createAddr(replacement, this._offset); break; } case Arg.Index: { let baseReplacement = func(this._base); let indexReplacement = func(this._index); if (baseReplacement || indexReplacement) { return Arg.createIndex( baseReplacement ? baseReplacement : this._base, indexReplacement ? indexReplacement : this._index, this._scale, this._offset); } break; } default: break; } } usesTmp(expectedTmp) { let usesTmp = false; forEachTmpFast(tmp => { usesTmp |= tmp == expectedTmp; }); return usesTmp; } forEachTmp(role, type, width, func) { switch (this._kind) { case Arg.Tmp: { let replacement; if (replacement = func(this._tmp, role, type, width)) return Arg.createTmp(replacement); break; } case Arg.Addr: { let replacement; if (replacement = func(this._base, Arg.Use, GP, role == Arg.UseAddr ? width : Ptr)) return Arg.createAddr(replacement, this._offset); break; } case Arg.Index: { let baseReplacement = func(this._base, Arg.Use, GP, role == Arg.UseAddr ? width : Ptr); let indexReplacement = func(this._index, Arg.Use, GP, role == Arg.UseAddr ? width : Ptr); if (baseReplacement || indexReplacement) { return Arg.createIndex( baseReplacement ? baseReplacement : this._base, indexReplacement ? indexReplacement : this._index, this._scale, this._offset); } break; } default: break; } } is(thing) { return !!thing.extract(this); } as(thing) { return thing.extract(this); } // This lets you say things like: // arg.forEach(Tmp | Reg | Arg | StackSlot, ...) // // It's used for abstract liveness analysis. forEachFast(thing, func) { return thing.forEachFast(this, func); } forEach(thing, role, type, width, func) { return thing.forEach(this, role, type, width, func); } static extract(arg) { return arg; } static forEachFast(arg, func) { return func(arg); } static forEach(arg, role, type, width, func) { return func(arg, role, type, width); } get condition() { switch (this._kind) { case Arg.RelCond: case Arg.ResCond: case Arg.DoubleCond: return this._condition; default: throw new Error("Called .condition for non-condition"); } } get isInvertible() { switch (this._kind) { case Arg.RelCond: case Arg.DoubleCold: return true; case Arg.ResCond: switch (this._condition) { case Zero: case NonZero: case Signed: case PositiveOrZero: return true; default: return false; } default: return false; } } 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) { case Arg.Invalid: return ""; case Arg.Tmp: return this._tmp.toString(); case Arg.Imm: return "$" + this._value; case Arg.BigImm: case Arg.BitImm64: return "$0x" + this._highValue.toString(16) + ":" + this._lowValue.toString(16); case Arg.Addr: return "" + (this._offset ? this._offset : "") + "(" + this._base + ")"; case Arg.Index: return "" + (this._offset ? this._offset : "") + "(" + this._base + "," + this._index + (this._scale == 1 ? "" : "," + this._scale) + ")"; case Arg.Stack: return "" + (this._offset ? this._offset : "") + "(" + this._slot + ")"; case Arg.CallArg: return "" + (this._offset ? this._offset : "") + "(callArg)"; case Arg.RelCond: case Arg.ResCond: case Arg.DoubleCond: return symbolName(this._condition); case Arg.Special: return "special"; case Arg.Width: return "" + this._value; default: throw new Error("Bad kind"); } } } // Arg kinds Arg.Invalid = Symbol("Invalid"); Arg.Tmp = Symbol("Tmp"); Arg.Imm = Symbol("Imm"); Arg.BigImm = Symbol("BigImm"); Arg.BitImm = Symbol("BitImm"); Arg.BitImm64 = Symbol("BitImm64"); Arg.Addr = Symbol("Addr"); Arg.Stack = Symbol("Stack"); Arg.CallArg = Symbol("CallArg"); 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 Arg.Use = Symbol("Use"); Arg.ColdUse = Symbol("ColdUse"); Arg.LateUse = Symbol("LateUse"); Arg.LateColdUse = Symbol("LateColdUse"); Arg.Def = Symbol("Def"); Arg.ZDef = Symbol("ZDef"); Arg.UseDef = Symbol("UseDef"); Arg.UseZDef = Symbol("UseZDef"); Arg.EarlyDef = Symbol("EarlyDef"); Arg.Scratch = Symbol("Scratch"); Arg.UseAddr = Symbol("UseAddr"); class BasicBlock { constructor(index, frequency) { this._index = index; this._frequency = frequency; this._insts = []; this._successors = []; this._predecessors = []; } get index() { return this._index; } get size() { return this._insts.length; } [Symbol.iterator]() { return this._insts[Symbol.iterator](); } at(index) { if (index >= this._insts.length) throw new Error("Out of bounds access"); return this._insts[index]; } get(index) { if (index < 0 || index >= this._insts.length) return null; return this._insts[index]; } get last() { return this._insts[this._insts.length - 1]; } get insts() { return this._insts; } append(inst) { this._insts.push(inst); } get numSuccessors() { return this._successors.length; } successor(index) { return this._successors[index]; } get successors() { return this._successors; } successorBlock(index) { return this._successors[index].block; } get successorBlocks() { return new Proxy(this._successors, { get(target, property) { if (typeof property == "string" && (property | 0) == property) return target[property].block; return target[property]; }, set(target, property, value) { if (typeof property == "string" && (property | 0) == property) { var oldValue = target[property]; target[property] = new FrequentedBlock( value, oldValue ? oldValue.frequency : Normal); return; } target[property] = value; } }); } get numPredecessors() { return this._predecessors.length; } predecessor(index) { return this._predecessors[index]; } get predecessors() { return this._predecessors; } get frequency() { return this._frequency; } toString() { return "#" + this._index; } get headerString() { let result = ""; result += `BB${this}: ; frequency = ${this._frequency}\n`; if (this._predecessors.length) result += " Predecessors: " + this._predecessors.join(", ") + "\n"; return result; } get footerString() { let result = ""; if (this._successors.length) result += " Successors: " + this._successors.join(", ") + "\n"; return result; } toStringDeep() { let result = ""; result += this.headerString; for (let inst of this) result += ` ${inst}\n`; result += this.footerString; return result; } } class Code { constructor() { this._blocks = []; this._stackSlots = []; this._gpTmps = []; this._fpTmps = []; this._callArgAreaSize = 0; this._frameSize = 0; } addBlock(frequency = 1) { return addIndexed(this._blocks, BasicBlock, frequency); } addStackSlot(byteSize, kind) { return addIndexed(this._stackSlots, StackSlot, byteSize, kind); } newTmp(type) { return addIndexed(this[`_${lowerSymbolName(type)}Tmps`], Tmp, type); } get size() { return this._blocks.length; } at(index) { return this._blocks[index]; } [Symbol.iterator]() { return this._blocks[Symbol.iterator](); } get blocks() { return this._blocks; } get stackSlots() { return this._stackSlots; } tmps(type) { return this[`_${lowerSymbolName(type)}Tmps`]; } get callArgAreaSize() { return this._callArgAreaSize; } requestCallArgAreaSize(size) { this._callArgAreaSize = Math.max(this._callArgAreaSize, roundUpToMultipleOf(stackAlignmentBytes, size)); } get frameSize() { return this._frameSize; } 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 = ""; for (let block of this) { result += block.toStringDeep(); } if (this.stackSlots.length) { result += "Stack slots:\n"; for (let slot of this.stackSlots) result += ` ${slot}\n`; } if (this._frameSize) result += `Frame size: ${this._frameSize}\n`; if (this._callArgAreaSize) result += `Call arg area size: ${this._callArgAreaSize}\n`; return result; } } class FrequentedBlock { constructor(block, frequency) { this.block = block; this.frequency = frequency; } toString() { return (this.frequency == Normal ? "" : "Rare:") + this.block; } } class Inst { constructor(opcode, args = []) { this._opcode = opcode; this._args = args; } append(...args) { this._args.push(...args); } clear() { this._opcode = Nop; this._args = []; } get opcode() { return this._opcode; } get args() { return this._args; } visitArg(index, func, ...args) { let replacement = func(this._args[index], ...args); if (replacement) this._args[index] = replacement; } forEachTmpFast(func) { for (let i = 0; i < this._args.length; ++i) { let replacement; if (replacement = this._args[i].forEachTmpFast(func)) this._args[i] = replacement; } } forEachArg(func) { Inst_forEachArg(this, func); } forEachTmp(func) { this.forEachArg((arg, role, type, width) => { return arg.forEachTmp(role, type, width, func); }); } forEach(thing, func) { this.forEachArg((arg, role, type, width) => { return arg.forEach(thing, role, type, width, func); }); } static forEachDef(thing, prevInst, nextInst, func) { if (prevInst) { prevInst.forEach( thing, (value, role, type, width) => { if (Arg.isLateDef(role)) return func(value, role, type, width); }); } if (nextInst) { nextInst.forEach( thing, (value, role, type, width) => { if (Arg.isEarlyDef(role)) return func(value, role, type, width); }); } } static forEachDefWithExtraClobberedRegs(thing, prevInst, nextInst, func) { forEachDef(thing, prevInst, nextInst, func); let regDefRole; let reportReg = reg => { let type = reg.isGPR ? GP : FP; func(thing.fromReg(reg), regDefRole, type, Arg.conservativeWidth(type)); }; if (prevInst && prevInst.opcode == Patch) { regDefRole = Arg.Def; prevInst.extraClobberedRegs.forEach(reportReg); } if (nextInst && nextInst.opcode == Patch) { regDefRole = Arg.EarlyDef; nextInst.extraEarlyClobberedRegs.forEach(reportReg); } } 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(", "); } } "use strict"; // Generated by opcode_generator.rb from JavaScriptCore/b3/air/AirOpcode.opcodes -- do not edit! const Nop = Symbol("Nop"); const Add32 = Symbol("Add32"); const Add8 = Symbol("Add8"); const Add16 = Symbol("Add16"); const Add64 = Symbol("Add64"); const AddDouble = Symbol("AddDouble"); const AddFloat = Symbol("AddFloat"); const Sub32 = Symbol("Sub32"); const Sub64 = Symbol("Sub64"); const SubDouble = Symbol("SubDouble"); const SubFloat = Symbol("SubFloat"); const Neg32 = Symbol("Neg32"); const Neg64 = Symbol("Neg64"); const NegateDouble = Symbol("NegateDouble"); const Mul32 = Symbol("Mul32"); const Mul64 = Symbol("Mul64"); const MultiplyAdd32 = Symbol("MultiplyAdd32"); const MultiplyAdd64 = Symbol("MultiplyAdd64"); const MultiplySub32 = Symbol("MultiplySub32"); const MultiplySub64 = Symbol("MultiplySub64"); const MultiplyNeg32 = Symbol("MultiplyNeg32"); const MultiplyNeg64 = Symbol("MultiplyNeg64"); const Div32 = Symbol("Div32"); const Div64 = Symbol("Div64"); const MulDouble = Symbol("MulDouble"); const MulFloat = Symbol("MulFloat"); const DivDouble = Symbol("DivDouble"); const DivFloat = Symbol("DivFloat"); const X86ConvertToDoubleWord32 = Symbol("X86ConvertToDoubleWord32"); const X86ConvertToQuadWord64 = Symbol("X86ConvertToQuadWord64"); const X86Div32 = Symbol("X86Div32"); const X86Div64 = Symbol("X86Div64"); const Lea = Symbol("Lea"); const And32 = Symbol("And32"); const And64 = Symbol("And64"); const AndDouble = Symbol("AndDouble"); const AndFloat = Symbol("AndFloat"); const XorDouble = Symbol("XorDouble"); const XorFloat = Symbol("XorFloat"); const Lshift32 = Symbol("Lshift32"); const Lshift64 = Symbol("Lshift64"); const Rshift32 = Symbol("Rshift32"); const Rshift64 = Symbol("Rshift64"); const Urshift32 = Symbol("Urshift32"); const Urshift64 = Symbol("Urshift64"); const Or32 = Symbol("Or32"); const Or64 = Symbol("Or64"); const Xor32 = Symbol("Xor32"); const Xor64 = Symbol("Xor64"); const Not32 = Symbol("Not32"); const Not64 = Symbol("Not64"); const AbsDouble = Symbol("AbsDouble"); const AbsFloat = Symbol("AbsFloat"); const CeilDouble = Symbol("CeilDouble"); const CeilFloat = Symbol("CeilFloat"); const FloorDouble = Symbol("FloorDouble"); const FloorFloat = Symbol("FloorFloat"); const SqrtDouble = Symbol("SqrtDouble"); const SqrtFloat = Symbol("SqrtFloat"); const ConvertInt32ToDouble = Symbol("ConvertInt32ToDouble"); const ConvertInt64ToDouble = Symbol("ConvertInt64ToDouble"); const ConvertInt32ToFloat = Symbol("ConvertInt32ToFloat"); const ConvertInt64ToFloat = Symbol("ConvertInt64ToFloat"); const CountLeadingZeros32 = Symbol("CountLeadingZeros32"); const CountLeadingZeros64 = Symbol("CountLeadingZeros64"); const ConvertDoubleToFloat = Symbol("ConvertDoubleToFloat"); const ConvertFloatToDouble = Symbol("ConvertFloatToDouble"); const Move = Symbol("Move"); const Swap32 = Symbol("Swap32"); const Swap64 = Symbol("Swap64"); const Move32 = Symbol("Move32"); const StoreZero32 = Symbol("StoreZero32"); const SignExtend32ToPtr = Symbol("SignExtend32ToPtr"); const ZeroExtend8To32 = Symbol("ZeroExtend8To32"); const SignExtend8To32 = Symbol("SignExtend8To32"); const ZeroExtend16To32 = Symbol("ZeroExtend16To32"); const SignExtend16To32 = Symbol("SignExtend16To32"); const MoveFloat = Symbol("MoveFloat"); const MoveDouble = Symbol("MoveDouble"); const MoveZeroToDouble = Symbol("MoveZeroToDouble"); const Move64ToDouble = Symbol("Move64ToDouble"); const Move32ToFloat = Symbol("Move32ToFloat"); const MoveDoubleTo64 = Symbol("MoveDoubleTo64"); const MoveFloatTo32 = Symbol("MoveFloatTo32"); const Load8 = Symbol("Load8"); const Store8 = Symbol("Store8"); const Load8SignedExtendTo32 = Symbol("Load8SignedExtendTo32"); const Load16 = Symbol("Load16"); const Load16SignedExtendTo32 = Symbol("Load16SignedExtendTo32"); const Store16 = Symbol("Store16"); const Compare32 = Symbol("Compare32"); const Compare64 = Symbol("Compare64"); const Test32 = Symbol("Test32"); const Test64 = Symbol("Test64"); const CompareDouble = Symbol("CompareDouble"); const CompareFloat = Symbol("CompareFloat"); const Branch8 = Symbol("Branch8"); const Branch32 = Symbol("Branch32"); const Branch64 = Symbol("Branch64"); const BranchTest8 = Symbol("BranchTest8"); const BranchTest32 = Symbol("BranchTest32"); const BranchTest64 = Symbol("BranchTest64"); const BranchDouble = Symbol("BranchDouble"); const BranchFloat = Symbol("BranchFloat"); const BranchAdd32 = Symbol("BranchAdd32"); const BranchAdd64 = Symbol("BranchAdd64"); const BranchMul32 = Symbol("BranchMul32"); const BranchMul64 = Symbol("BranchMul64"); const BranchSub32 = Symbol("BranchSub32"); const BranchSub64 = Symbol("BranchSub64"); const BranchNeg32 = Symbol("BranchNeg32"); const BranchNeg64 = Symbol("BranchNeg64"); const MoveConditionally32 = Symbol("MoveConditionally32"); const MoveConditionally64 = Symbol("MoveConditionally64"); const MoveConditionallyTest32 = Symbol("MoveConditionallyTest32"); const MoveConditionallyTest64 = Symbol("MoveConditionallyTest64"); const MoveConditionallyDouble = Symbol("MoveConditionallyDouble"); const MoveConditionallyFloat = Symbol("MoveConditionallyFloat"); const MoveDoubleConditionally32 = Symbol("MoveDoubleConditionally32"); const MoveDoubleConditionally64 = Symbol("MoveDoubleConditionally64"); const MoveDoubleConditionallyTest32 = Symbol("MoveDoubleConditionallyTest32"); const MoveDoubleConditionallyTest64 = Symbol("MoveDoubleConditionallyTest64"); const MoveDoubleConditionallyDouble = Symbol("MoveDoubleConditionallyDouble"); const MoveDoubleConditionallyFloat = Symbol("MoveDoubleConditionallyFloat"); const Jump = Symbol("Jump"); const Ret32 = Symbol("Ret32"); const Ret64 = Symbol("Ret64"); const RetFloat = Symbol("RetFloat"); const RetDouble = Symbol("RetDouble"); const Oops = Symbol("Oops"); const Shuffle = Symbol("Shuffle"); const Patch = Symbol("Patch"); const CCall = Symbol("CCall"); const ColdCCall = Symbol("ColdCCall"); function Inst_forEachArg(inst, func) { let replacement; switch (inst.opcode) { case Nop: break; break; case Add32: switch (inst.args.length) { case 3: inst.visitArg(0, func, Arg.Use, GP, 32); inst.visitArg(1, func, Arg.Use, GP, 32); inst.visitArg(2, func, Arg.ZDef, GP, 32); break; case 2: inst.visitArg(0, func, Arg.Use, GP, 32); inst.visitArg(1, func, Arg.UseZDef, GP, 32); break; default: throw new Error("Bad overload"); break; } break; case Add8: inst.visitArg(0, func, Arg.Use, GP, 8); inst.visitArg(1, func, Arg.UseDef, GP, 8); break; break; case Add16: inst.visitArg(0, func, Arg.Use, GP, 16); inst.visitArg(1, func, Arg.UseDef, GP, 16); break; break; case Add64: switch (inst.args.length) { case 2: inst.visitArg(0, func, Arg.Use, GP, 64); inst.visitArg(1, func, Arg.UseDef, GP, 64); break; case 3: inst.visitArg(0, func, Arg.Use, GP, 64); inst.visitArg(1, func, Arg.Use, GP, 64); inst.visitArg(2, func, Arg.Def, GP, 64); break; default: throw new Error("Bad overload"); break; } break; case AddDouble: switch (inst.args.length) { case 3: inst.visitArg(0, func, Arg.Use, FP, 64); inst.visitArg(1, func, Arg.Use, FP, 64); inst.visitArg(2, func, Arg.Def, FP, 64); break; case 2: inst.visitArg(0, func, Arg.Use, FP, 64); inst.visitArg(1, func, Arg.UseDef, FP, 64); break; default: throw new Error("Bad overload"); break; } break; case AddFloat: switch (inst.args.length) { case 3: inst.visitArg(0, func, Arg.Use, FP, 32); inst.visitArg(1, func, Arg.Use, FP, 32); inst.visitArg(2, func, Arg.Def, FP, 32); break; case 2: inst.visitArg(0, func, Arg.Use, FP, 32); inst.visitArg(1, func, Arg.UseDef, FP, 32); break; default: throw new Error("Bad overload"); break; } break; case Sub32: inst.visitArg(0, func, Arg.Use, GP, 32); inst.visitArg(1, func, Arg.UseZDef, GP, 32); break; break; case Sub64: inst.visitArg(0, func, Arg.Use, GP, 64); inst.visitArg(1, func, Arg.UseDef, GP, 64); break; break; case SubDouble: switch (inst.args.length) { case 3: inst.visitArg(0, func, Arg.Use, FP, 64); inst.visitArg(1, func, Arg.Use, FP, 64); inst.visitArg(2, func, Arg.Def, FP, 64); break; case 2: inst.visitArg(0, func, Arg.Use, FP, 64); inst.visitArg(1, func, Arg.UseDef, FP, 64); break; default: throw new Error("Bad overload"); break; } break; case SubFloat: switch (inst.args.length) { case 3: inst.visitArg(0, func, Arg.Use, FP, 32); inst.visitArg(1, func, Arg.Use, FP, 32); inst.visitArg(2, func, Arg.Def, FP, 32); break; case 2: inst.visitArg(0, func, Arg.Use, FP, 32); inst.visitArg(1, func, Arg.UseDef, FP, 32); break; default: throw new Error("Bad overload"); break; } break; case Neg32: inst.visitArg(0, func, Arg.UseZDef, GP, 32); break; break; case Neg64: inst.visitArg(0, func, Arg.UseDef, GP, 64); break; break; case NegateDouble: inst.visitArg(0, func, Arg.Use, FP, 64); inst.visitArg(1, func, Arg.Def, FP, 64); break; break; case Mul32: switch (inst.args.length) { case 2: inst.visitArg(0, func, Arg.Use, GP, 32); inst.visitArg(1, func, Arg.UseZDef, GP, 32); break; case 3: inst.visitArg(0, func, Arg.Use, GP, 32); inst.visitArg(1, func, Arg.Use, GP, 32); inst.visitArg(2, func, Arg.ZDef, GP, 32); break; default: throw new Error("Bad overload"); break; } break; case Mul64: switch (inst.args.length) { case 2: inst.visitArg(0, func, Arg.Use, GP, 64); inst.visitArg(1, func, Arg.UseDef, GP, 64); break; case 3: inst.visitArg(0, func, Arg.Use, GP, 64); inst.visitArg(1, func, Arg.Use, GP, 64); inst.visitArg(2, func, Arg.Def, GP, 64); break; default: throw new Error("Bad overload"); break; } break; case MultiplyAdd32: inst.visitArg(0, func, Arg.Use, GP, 32); inst.visitArg(1, func, Arg.Use, GP, 32); inst.visitArg(2, func, Arg.Use, GP, 32); inst.visitArg(3, func, Arg.ZDef, GP, 32); break; break; case MultiplyAdd64: inst.visitArg(0, func, Arg.Use, GP, 64); inst.visitArg(1, func, Arg.Use, GP, 64); inst.visitArg(2, func, Arg.Use, GP, 64); inst.visitArg(3, func, Arg.Def, GP, 64); break; break; case MultiplySub32: inst.visitArg(0, func, Arg.Use, GP, 32); inst.visitArg(1, func, Arg.Use, GP, 32); inst.visitArg(2, func, Arg.Use, GP, 32); inst.visitArg(3, func, Arg.ZDef, GP, 32); break; break; case MultiplySub64: inst.visitArg(0, func, Arg.Use, GP, 64); inst.visitArg(1, func, Arg.Use, GP, 64); inst.visitArg(2, func, Arg.Use, GP, 64); inst.visitArg(3, func, Arg.Def, GP, 64); break; break; case MultiplyNeg32: inst.visitArg(0, func, Arg.Use, GP, 32); inst.visitArg(1, func, Arg.Use, GP, 32); inst.visitArg(2, func, Arg.ZDef, GP, 32); break; break; case MultiplyNeg64: inst.visitArg(0, func, Arg.Use, GP, 64); inst.visitArg(1, func, Arg.Use, GP, 64); inst.visitArg(2, func, Arg.ZDef, GP, 64); break; break; case Div32: inst.visitArg(0, func, Arg.Use, GP, 32); inst.visitArg(1, func, Arg.Use, GP, 32); inst.visitArg(2, func, Arg.ZDef, GP, 32); break; break; case Div64: inst.visitArg(0, func, Arg.Use, GP, 64); inst.visitArg(1, func, Arg.Use, GP, 64); inst.visitArg(2, func, Arg.Def, GP, 64); break; break; case MulDouble: switch (inst.args.length) { case 3: inst.visitArg(0, func, Arg.Use, FP, 64); inst.visitArg(1, func, Arg.Use, FP, 64); inst.visitArg(2, func, Arg.Def, FP, 64); break; case 2: inst.visitArg(0, func, Arg.Use, FP, 64); inst.visitArg(1, func, Arg.UseDef, FP, 64); break; default: throw new Error("Bad overload"); break; } break; case MulFloat: switch (inst.args.length) { case 3: inst.visitArg(0, func, Arg.Use, FP, 32); inst.visitArg(1, func, Arg.Use, FP, 32); inst.visitArg(2, func, Arg.Def, FP, 32); break; case 2: inst.visitArg(0, func, Arg.Use, FP, 32); inst.visitArg(1, func, Arg.UseDef, FP, 32); break; default: throw new Error("Bad overload"); break; } break; case DivDouble: switch (inst.args.length) { case 3: inst.visitArg(0, func, Arg.Use, FP, 64); inst.visitArg(1, func, Arg.Use, FP, 32); inst.visitArg(2, func, Arg.Def, FP, 64); break; case 2: inst.visitArg(0, func, Arg.Use, FP, 64); inst.visitArg(1, func, Arg.UseDef, FP, 64); break; default: throw new Error("Bad overload"); break; } break; case DivFloat: switch (inst.args.length) { case 3: inst.visitArg(0, func, Arg.Use, FP, 32); inst.visitArg(1, func, Arg.Use, FP, 32); inst.visitArg(2, func, Arg.Def, FP, 32); break; case 2: inst.visitArg(0, func, Arg.Use, FP, 32); inst.visitArg(1, func, Arg.UseDef, FP, 32); break; default: throw new Error("Bad overload"); break; } break; case X86ConvertToDoubleWord32: inst.visitArg(0, func, Arg.Use, GP, 32); inst.visitArg(1, func, Arg.ZDef, GP, 32); break; break; case X86ConvertToQuadWord64: inst.visitArg(0, func, Arg.Use, GP, 64); inst.visitArg(1, func, Arg.Def, GP, 64); break; break; case X86Div32: inst.visitArg(0, func, Arg.UseZDef, GP, 32); inst.visitArg(1, func, Arg.UseZDef, GP, 32); inst.visitArg(2, func, Arg.Use, GP, 32); break; break; case X86Div64: inst.visitArg(0, func, Arg.UseZDef, GP, 64); inst.visitArg(1, func, Arg.UseZDef, GP, 64); inst.visitArg(2, func, Arg.Use, GP, 64); break; break; case Lea: inst.visitArg(0, func, Arg.UseAddr, GP, Ptr); inst.visitArg(1, func, Arg.Def, GP, Ptr); break; break; case And32: switch (inst.args.length) { case 3: inst.visitArg(0, func, Arg.Use, GP, 32); inst.visitArg(1, func, Arg.Use, GP, 32); inst.visitArg(2, func, Arg.ZDef, GP, 32); break; case 2: inst.visitArg(0, func, Arg.Use, GP, 32); inst.visitArg(1, func, Arg.UseZDef, GP, 32); break; default: throw new Error("Bad overload"); break; } break; case And64: switch (inst.args.length) { case 3: inst.visitArg(0, func, Arg.Use, GP, 64); inst.visitArg(1, func, Arg.Use, GP, 64); inst.visitArg(2, func, Arg.Def, GP, 64); break; case 2: inst.visitArg(0, func, Arg.Use, GP, 64); inst.visitArg(1, func, Arg.UseDef, GP, 64); break; default: throw new Error("Bad overload"); break; } break; case AndDouble: switch (inst.args.length) { case 3: inst.visitArg(0, func, Arg.Use, FP, 64); inst.visitArg(1, func, Arg.Use, FP, 64); inst.visitArg(2, func, Arg.Def, FP, 64); break; case 2: inst.visitArg(0, func, Arg.Use, FP, 64); inst.visitArg(1, func, Arg.UseDef, FP, 64); break; default: throw new Error("Bad overload"); break; } break; case AndFloat: switch (inst.args.length) { case 3: inst.visitArg(0, func, Arg.Use, FP, 32); inst.visitArg(1, func, Arg.Use, FP, 32); inst.visitArg(2, func, Arg.Def, FP, 32); break; case 2: inst.visitArg(0, func, Arg.Use, FP, 32); inst.visitArg(1, func, Arg.UseDef, FP, 32); break; default: throw new Error("Bad overload"); break; } break; case XorDouble: switch (inst.args.length) { case 3: inst.visitArg(0, func, Arg.Use, FP, 64); inst.visitArg(1, func, Arg.Use, FP, 64); inst.visitArg(2, func, Arg.Def, FP, 64); break; case 2: inst.visitArg(0, func, Arg.Use, FP, 64); inst.visitArg(1, func, Arg.UseDef, FP, 64); break; default: throw new Error("Bad overload"); break; } break; case XorFloat: switch (inst.args.length) { case 3: inst.visitArg(0, func, Arg.Use, FP, 32); inst.visitArg(1, func, Arg.Use, FP, 32); inst.visitArg(2, func, Arg.Def, FP, 32); break; case 2: inst.visitArg(0, func, Arg.Use, FP, 32); inst.visitArg(1, func, Arg.UseDef, FP, 32); break; default: throw new Error("Bad overload"); break; } break; case Lshift32: switch (inst.args.length) { case 3: inst.visitArg(0, func, Arg.Use, GP, 32); inst.visitArg(1, func, Arg.Use, GP, 32); inst.visitArg(2, func, Arg.ZDef, GP, 32); break; case 2: inst.visitArg(0, func, Arg.Use, GP, 32); inst.visitArg(1, func, Arg.UseZDef, GP, 32); break; default: throw new Error("Bad overload"); break; } break; case Lshift64: switch (inst.args.length) { case 3: inst.visitArg(0, func, Arg.Use, GP, 64); inst.visitArg(1, func, Arg.Use, GP, 64); inst.visitArg(2, func, Arg.ZDef, GP, 64); break; case 2: inst.visitArg(0, func, Arg.Use, GP, 64); inst.visitArg(1, func, Arg.UseDef, GP, 64); break; default: throw new Error("Bad overload"); break; } break; case Rshift32: switch (inst.args.length) { case 3: inst.visitArg(0, func, Arg.Use, GP, 32); inst.visitArg(1, func, Arg.Use, GP, 32); inst.visitArg(2, func, Arg.ZDef, GP, 32); break; case 2: inst.visitArg(0, func, Arg.Use, GP, 32); inst.visitArg(1, func, Arg.UseZDef, GP, 32); break; default: throw new Error("Bad overload"); break; } break; case Rshift64: switch (inst.args.length) { case 3: inst.visitArg(0, func, Arg.Use, GP, 64); inst.visitArg(1, func, Arg.Use, GP, 64); inst.visitArg(2, func, Arg.ZDef, GP, 64); break; case 2: inst.visitArg(0, func, Arg.Use, GP, 64); inst.visitArg(1, func, Arg.UseDef, GP, 64); break; default: throw new Error("Bad overload"); break; } break; case Urshift32: switch (inst.args.length) { case 3: inst.visitArg(0, func, Arg.Use, GP, 32); inst.visitArg(1, func, Arg.Use, GP, 32); inst.visitArg(2, func, Arg.ZDef, GP, 32); break; case 2: inst.visitArg(0, func, Arg.Use, GP, 32); inst.visitArg(1, func, Arg.UseZDef, GP, 32); break; default: throw new Error("Bad overload"); break; } break; case Urshift64: switch (inst.args.length) { case 3: inst.visitArg(0, func, Arg.Use, GP, 64); inst.visitArg(1, func, Arg.Use, GP, 64); inst.visitArg(2, func, Arg.ZDef, GP, 64); break; case 2: inst.visitArg(0, func, Arg.Use, GP, 64); inst.visitArg(1, func, Arg.UseDef, GP, 64); break; default: throw new Error("Bad overload"); break; } break; case Or32: switch (inst.args.length) { case 3: inst.visitArg(0, func, Arg.Use, GP, 32); inst.visitArg(1, func, Arg.Use, GP, 32); inst.visitArg(2, func, Arg.ZDef, GP, 32); break; case 2: inst.visitArg(0, func, Arg.Use, GP, 32); inst.visitArg(1, func, Arg.UseZDef, GP, 32); break; default: throw new Error("Bad overload"); break; } break; case Or64: switch (inst.args.length) { case 3: inst.visitArg(0, func, Arg.Use, GP, 64); inst.visitArg(1, func, Arg.Use, GP, 64); inst.visitArg(2, func, Arg.Def, GP, 64); break; case 2: inst.visitArg(0, func, Arg.Use, GP, 64); inst.visitArg(1, func, Arg.UseDef, GP, 64); break; default: throw new Error("Bad overload"); break; } break; case Xor32: switch (inst.args.length) { case 3: inst.visitArg(0, func, Arg.Use, GP, 32); inst.visitArg(1, func, Arg.Use, GP, 32); inst.visitArg(2, func, Arg.ZDef, GP, 32); break; case 2: inst.visitArg(0, func, Arg.Use, GP, 32); inst.visitArg(1, func, Arg.UseZDef, GP, 32); break; default: throw new Error("Bad overload"); break; } break; case Xor64: switch (inst.args.length) { case 3: inst.visitArg(0, func, Arg.Use, GP, 64); inst.visitArg(1, func, Arg.Use, GP, 64); inst.visitArg(2, func, Arg.Def, GP, 64); break; case 2: inst.visitArg(0, func, Arg.Use, GP, 64); inst.visitArg(1, func, Arg.UseDef, GP, 64); break; default: throw new Error("Bad overload"); break; } break; case Not32: switch (inst.args.length) { case 2: inst.visitArg(0, func, Arg.Use, GP, 32); inst.visitArg(1, func, Arg.ZDef, GP, 32); break; case 1: inst.visitArg(0, func, Arg.UseZDef, GP, 32); break; default: throw new Error("Bad overload"); break; } break; case Not64: switch (inst.args.length) { case 2: inst.visitArg(0, func, Arg.Use, GP, 64); inst.visitArg(1, func, Arg.Def, GP, 64); break; case 1: inst.visitArg(0, func, Arg.UseDef, GP, 64); break; default: throw new Error("Bad overload"); break; } break; case AbsDouble: inst.visitArg(0, func, Arg.Use, FP, 64); inst.visitArg(1, func, Arg.Def, FP, 64); break; break; case AbsFloat: inst.visitArg(0, func, Arg.Use, FP, 32); inst.visitArg(1, func, Arg.Def, FP, 32); break; break; case CeilDouble: inst.visitArg(0, func, Arg.Use, FP, 64); inst.visitArg(1, func, Arg.Def, FP, 64); break; break; case CeilFloat: inst.visitArg(0, func, Arg.Use, FP, 32); inst.visitArg(1, func, Arg.Def, FP, 32); break; break; case FloorDouble: inst.visitArg(0, func, Arg.Use, FP, 64); inst.visitArg(1, func, Arg.Def, FP, 64); break; break; case FloorFloat: inst.visitArg(0, func, Arg.Use, FP, 32); inst.visitArg(1, func, Arg.Def, FP, 32); break; break; case SqrtDouble: inst.visitArg(0, func, Arg.Use, FP, 64); inst.visitArg(1, func, Arg.Def, FP, 64); break; break; case SqrtFloat: inst.visitArg(0, func, Arg.Use, FP, 32); inst.visitArg(1, func, Arg.Def, FP, 32); break; break; case ConvertInt32ToDouble: inst.visitArg(0, func, Arg.Use, GP, 32); inst.visitArg(1, func, Arg.Def, FP, 64); break; break; case ConvertInt64ToDouble: inst.visitArg(0, func, Arg.Use, GP, 64); inst.visitArg(1, func, Arg.Def, FP, 64); break; break; case ConvertInt32ToFloat: inst.visitArg(0, func, Arg.Use, GP, 32); inst.visitArg(1, func, Arg.Def, FP, 32); break; break; case ConvertInt64ToFloat: inst.visitArg(0, func, Arg.Use, GP, 64); inst.visitArg(1, func, Arg.Def, FP, 32); break; break; case CountLeadingZeros32: inst.visitArg(0, func, Arg.Use, GP, 32); inst.visitArg(1, func, Arg.ZDef, GP, 32); break; break; case CountLeadingZeros64: inst.visitArg(0, func, Arg.Use, GP, 64); inst.visitArg(1, func, Arg.Def, GP, 64); break; break; case ConvertDoubleToFloat: inst.visitArg(0, func, Arg.Use, FP, 64); inst.visitArg(1, func, Arg.Def, FP, 32); break; break; case ConvertFloatToDouble: inst.visitArg(0, func, Arg.Use, FP, 32); inst.visitArg(1, func, Arg.Def, FP, 64); break; break; case Move: inst.visitArg(0, func, Arg.Use, GP, Ptr); inst.visitArg(1, func, Arg.Def, GP, Ptr); break; break; case Swap32: inst.visitArg(0, func, Arg.UseDef, GP, 32); inst.visitArg(1, func, Arg.UseDef, GP, 32); break; break; case Swap64: inst.visitArg(0, func, Arg.UseDef, GP, 64); inst.visitArg(1, func, Arg.UseDef, GP, 64); break; break; case Move32: inst.visitArg(0, func, Arg.Use, GP, 32); inst.visitArg(1, func, Arg.ZDef, GP, 32); break; break; case StoreZero32: inst.visitArg(0, func, Arg.Use, GP, 32); break; break; case SignExtend32ToPtr: inst.visitArg(0, func, Arg.Use, GP, 32); inst.visitArg(1, func, Arg.Def, GP, Ptr); break; break; case ZeroExtend8To32: inst.visitArg(0, func, Arg.Use, GP, 8); inst.visitArg(1, func, Arg.ZDef, GP, 32); break; break; case SignExtend8To32: inst.visitArg(0, func, Arg.Use, GP, 8); inst.visitArg(1, func, Arg.ZDef, GP, 32); break; break; case ZeroExtend16To32: inst.visitArg(0, func, Arg.Use, GP, 16); inst.visitArg(1, func, Arg.ZDef, GP, 32); break; break; case SignExtend16To32: inst.visitArg(0, func, Arg.Use, GP, 16); inst.visitArg(1, func, Arg.ZDef, GP, 32); break; break; case MoveFloat: inst.visitArg(0, func, Arg.Use, FP, 32); inst.visitArg(1, func, Arg.Def, FP, 32); break; break; case MoveDouble: inst.visitArg(0, func, Arg.Use, FP, 64); inst.visitArg(1, func, Arg.Def, FP, 64); break; break; case MoveZeroToDouble: inst.visitArg(0, func, Arg.Def, FP, 64); break; break; case Move64ToDouble: inst.visitArg(0, func, Arg.Use, GP, 64); inst.visitArg(1, func, Arg.Def, FP, 64); break; break; case Move32ToFloat: inst.visitArg(0, func, Arg.Use, GP, 32); inst.visitArg(1, func, Arg.Def, FP, 32); break; break; case MoveDoubleTo64: inst.visitArg(0, func, Arg.Use, FP, 64); inst.visitArg(1, func, Arg.Def, GP, 64); break; break; case MoveFloatTo32: inst.visitArg(0, func, Arg.Use, FP, 32); inst.visitArg(1, func, Arg.Def, GP, 32); break; break; case Load8: inst.visitArg(0, func, Arg.Use, GP, 8); inst.visitArg(1, func, Arg.ZDef, GP, 32); break; break; case Store8: inst.visitArg(0, func, Arg.Use, GP, 8); inst.visitArg(1, func, Arg.Def, GP, 8); break; break; case Load8SignedExtendTo32: inst.visitArg(0, func, Arg.Use, GP, 8); inst.visitArg(1, func, Arg.ZDef, GP, 32); break; break; case Load16: inst.visitArg(0, func, Arg.Use, GP, 16); inst.visitArg(1, func, Arg.ZDef, GP, 32); break; break; case Load16SignedExtendTo32: inst.visitArg(0, func, Arg.Use, GP, 16); inst.visitArg(1, func, Arg.ZDef, GP, 32); break; break; case Store16: inst.visitArg(0, func, Arg.Use, GP, 16); inst.visitArg(1, func, Arg.Def, GP, 16); break; break; case Compare32: inst.visitArg(0, func, Arg.Use, GP, 32); inst.visitArg(1, func, Arg.Use, GP, 32); inst.visitArg(2, func, Arg.Use, GP, 32); inst.visitArg(3, func, Arg.ZDef, GP, 32); break; break; case Compare64: inst.visitArg(0, func, Arg.Use, GP, 32); inst.visitArg(1, func, Arg.Use, GP, 64); inst.visitArg(2, func, Arg.Use, GP, 64); inst.visitArg(3, func, Arg.ZDef, GP, 32); break; break; case Test32: inst.visitArg(0, func, Arg.Use, GP, 32); inst.visitArg(1, func, Arg.Use, GP, 32); inst.visitArg(2, func, Arg.Use, GP, 32); inst.visitArg(3, func, Arg.ZDef, GP, 32); break; break; case Test64: inst.visitArg(0, func, Arg.Use, GP, 32); inst.visitArg(1, func, Arg.Use, GP, 64); inst.visitArg(2, func, Arg.Use, GP, 64); inst.visitArg(3, func, Arg.ZDef, GP, 32); break; break; case CompareDouble: inst.visitArg(0, func, Arg.Use, GP, 32); inst.visitArg(1, func, Arg.Use, FP, 64); inst.visitArg(2, func, Arg.Use, FP, 64); inst.visitArg(3, func, Arg.ZDef, GP, 32); break; break; case CompareFloat: inst.visitArg(0, func, Arg.Use, GP, 32); inst.visitArg(1, func, Arg.Use, FP, 32); inst.visitArg(2, func, Arg.Use, FP, 32); inst.visitArg(3, func, Arg.ZDef, GP, 32); break; break; case Branch8: inst.visitArg(0, func, Arg.Use, GP, 32); inst.visitArg(1, func, Arg.Use, GP, 8); inst.visitArg(2, func, Arg.Use, GP, 8); break; break; case Branch32: inst.visitArg(0, func, Arg.Use, GP, 32); inst.visitArg(1, func, Arg.Use, GP, 32); inst.visitArg(2, func, Arg.Use, GP, 32); break; break; case Branch64: inst.visitArg(0, func, Arg.Use, GP, 32); inst.visitArg(1, func, Arg.Use, GP, 64); inst.visitArg(2, func, Arg.Use, GP, 64); break; break; case BranchTest8: inst.visitArg(0, func, Arg.Use, GP, 32); inst.visitArg(1, func, Arg.Use, GP, 8); inst.visitArg(2, func, Arg.Use, GP, 8); break; break; case BranchTest32: inst.visitArg(0, func, Arg.Use, GP, 32); inst.visitArg(1, func, Arg.Use, GP, 32); inst.visitArg(2, func, Arg.Use, GP, 32); break; break; case BranchTest64: inst.visitArg(0, func, Arg.Use, GP, 32); inst.visitArg(1, func, Arg.Use, GP, 64); inst.visitArg(2, func, Arg.Use, GP, 64); break; break; case BranchDouble: inst.visitArg(0, func, Arg.Use, GP, 32); inst.visitArg(1, func, Arg.Use, FP, 64); inst.visitArg(2, func, Arg.Use, FP, 64); break; break; case BranchFloat: inst.visitArg(0, func, Arg.Use, GP, 32); inst.visitArg(1, func, Arg.Use, FP, 32); inst.visitArg(2, func, Arg.Use, FP, 32); break; break; case BranchAdd32: switch (inst.args.length) { case 4: inst.visitArg(0, func, Arg.Use, GP, 32); inst.visitArg(1, func, Arg.Use, GP, 32); inst.visitArg(2, func, Arg.Use, GP, 32); inst.visitArg(3, func, Arg.ZDef, GP, 32); break; case 3: inst.visitArg(0, func, Arg.Use, GP, 32); inst.visitArg(1, func, Arg.Use, GP, 32); inst.visitArg(2, func, Arg.UseZDef, GP, 32); break; default: throw new Error("Bad overload"); break; } break; case BranchAdd64: switch (inst.args.length) { case 4: inst.visitArg(0, func, Arg.Use, GP, 32); inst.visitArg(1, func, Arg.Use, GP, 64); inst.visitArg(2, func, Arg.Use, GP, 64); inst.visitArg(3, func, Arg.ZDef, GP, 64); break; case 3: inst.visitArg(0, func, Arg.Use, GP, 32); inst.visitArg(1, func, Arg.Use, GP, 64); inst.visitArg(2, func, Arg.UseDef, GP, 64); break; default: throw new Error("Bad overload"); break; } break; case BranchMul32: switch (inst.args.length) { case 3: inst.visitArg(0, func, Arg.Use, GP, 32); inst.visitArg(1, func, Arg.Use, GP, 32); inst.visitArg(2, func, Arg.UseZDef, GP, 32); break; case 4: inst.visitArg(0, func, Arg.Use, GP, 32); inst.visitArg(1, func, Arg.Use, GP, 32); inst.visitArg(2, func, Arg.Use, GP, 32); inst.visitArg(3, func, Arg.ZDef, GP, 32); break; case 6: inst.visitArg(0, func, Arg.Use, GP, 32); inst.visitArg(1, func, Arg.Use, GP, 32); inst.visitArg(2, func, Arg.Use, GP, 32); inst.visitArg(3, func, Arg.Scratch, GP, 32); inst.visitArg(4, func, Arg.Scratch, GP, 32); inst.visitArg(5, func, Arg.ZDef, GP, 32); break; default: throw new Error("Bad overload"); break; } break; case BranchMul64: switch (inst.args.length) { case 3: inst.visitArg(0, func, Arg.Use, GP, 32); inst.visitArg(1, func, Arg.Use, GP, 64); inst.visitArg(2, func, Arg.UseZDef, GP, 64); break; case 6: inst.visitArg(0, func, Arg.Use, GP, 32); inst.visitArg(1, func, Arg.Use, GP, 64); inst.visitArg(2, func, Arg.Use, GP, 64); inst.visitArg(3, func, Arg.Scratch, GP, 64); inst.visitArg(4, func, Arg.Scratch, GP, 64); inst.visitArg(5, func, Arg.ZDef, GP, 64); break; default: throw new Error("Bad overload"); break; } break; case BranchSub32: inst.visitArg(0, func, Arg.Use, GP, 32); inst.visitArg(1, func, Arg.Use, GP, 32); inst.visitArg(2, func, Arg.UseZDef, GP, 32); break; break; case BranchSub64: inst.visitArg(0, func, Arg.Use, GP, 32); inst.visitArg(1, func, Arg.Use, GP, 64); inst.visitArg(2, func, Arg.UseDef, GP, 64); break; break; case BranchNeg32: inst.visitArg(0, func, Arg.Use, GP, 32); inst.visitArg(1, func, Arg.UseZDef, GP, 32); break; break; case BranchNeg64: inst.visitArg(0, func, Arg.Use, GP, 32); inst.visitArg(1, func, Arg.UseZDef, GP, 64); break; break; case MoveConditionally32: switch (inst.args.length) { case 5: inst.visitArg(0, func, Arg.Use, GP, 32); inst.visitArg(1, func, Arg.Use, GP, 32); inst.visitArg(2, func, Arg.Use, GP, 32); inst.visitArg(3, func, Arg.Use, GP, Ptr); inst.visitArg(4, func, Arg.UseDef, GP, Ptr); break; case 6: inst.visitArg(0, func, Arg.Use, GP, 32); inst.visitArg(1, func, Arg.Use, GP, 32); inst.visitArg(2, func, Arg.Use, GP, 32); inst.visitArg(3, func, Arg.Use, GP, Ptr); inst.visitArg(4, func, Arg.Use, GP, Ptr); inst.visitArg(5, func, Arg.Def, GP, Ptr); break; default: throw new Error("Bad overload"); break; } break; case MoveConditionally64: switch (inst.args.length) { case 5: inst.visitArg(0, func, Arg.Use, GP, 32); inst.visitArg(1, func, Arg.Use, GP, 64); inst.visitArg(2, func, Arg.Use, GP, 64); inst.visitArg(3, func, Arg.Use, GP, Ptr); inst.visitArg(4, func, Arg.UseDef, GP, Ptr); break; case 6: inst.visitArg(0, func, Arg.Use, GP, 32); inst.visitArg(1, func, Arg.Use, GP, 64); inst.visitArg(2, func, Arg.Use, GP, 64); inst.visitArg(3, func, Arg.Use, GP, Ptr); inst.visitArg(4, func, Arg.Use, GP, Ptr); inst.visitArg(5, func, Arg.Def, GP, Ptr); break; default: throw new Error("Bad overload"); break; } break; case MoveConditionallyTest32: switch (inst.args.length) { case 5: inst.visitArg(0, func, Arg.Use, GP, 32); inst.visitArg(1, func, Arg.Use, GP, 32); inst.visitArg(2, func, Arg.Use, GP, 32); inst.visitArg(3, func, Arg.Use, GP, Ptr); inst.visitArg(4, func, Arg.UseDef, GP, Ptr); break; case 6: inst.visitArg(0, func, Arg.Use, GP, 32); inst.visitArg(1, func, Arg.Use, GP, 32); inst.visitArg(2, func, Arg.Use, GP, 32); inst.visitArg(3, func, Arg.Use, GP, Ptr); inst.visitArg(4, func, Arg.Use, GP, Ptr); inst.visitArg(5, func, Arg.Def, GP, Ptr); break; default: throw new Error("Bad overload"); break; } break; case MoveConditionallyTest64: switch (inst.args.length) { case 5: inst.visitArg(0, func, Arg.Use, GP, 32); inst.visitArg(1, func, Arg.Use, GP, 64); inst.visitArg(2, func, Arg.Use, GP, 64); inst.visitArg(3, func, Arg.Use, GP, Ptr); inst.visitArg(4, func, Arg.UseDef, GP, Ptr); break; case 6: inst.visitArg(0, func, Arg.Use, GP, 32); inst.visitArg(1, func, Arg.Use, GP, 32); inst.visitArg(2, func, Arg.Use, GP, 32); inst.visitArg(3, func, Arg.Use, GP, Ptr); inst.visitArg(4, func, Arg.Use, GP, Ptr); inst.visitArg(5, func, Arg.Def, GP, Ptr); break; default: throw new Error("Bad overload"); break; } break; case MoveConditionallyDouble: switch (inst.args.length) { case 6: inst.visitArg(0, func, Arg.Use, GP, 32); inst.visitArg(1, func, Arg.Use, FP, 64); inst.visitArg(2, func, Arg.Use, FP, 64); inst.visitArg(3, func, Arg.Use, GP, Ptr); inst.visitArg(4, func, Arg.Use, GP, Ptr); inst.visitArg(5, func, Arg.Def, GP, Ptr); break; case 5: inst.visitArg(0, func, Arg.Use, GP, 32); inst.visitArg(1, func, Arg.Use, FP, 64); inst.visitArg(2, func, Arg.Use, FP, 64); inst.visitArg(3, func, Arg.Use, GP, Ptr); inst.visitArg(4, func, Arg.UseDef, GP, Ptr); break; default: throw new Error("Bad overload"); break; } break; case MoveConditionallyFloat: switch (inst.args.length) { case 6: inst.visitArg(0, func, Arg.Use, GP, 32); inst.visitArg(1, func, Arg.Use, FP, 32); inst.visitArg(2, func, Arg.Use, FP, 32); inst.visitArg(3, func, Arg.Use, GP, Ptr); inst.visitArg(4, func, Arg.Use, GP, Ptr); inst.visitArg(5, func, Arg.Def, GP, Ptr); break; case 5: inst.visitArg(0, func, Arg.Use, GP, 32); inst.visitArg(1, func, Arg.Use, FP, 32); inst.visitArg(2, func, Arg.Use, FP, 32); inst.visitArg(3, func, Arg.Use, GP, Ptr); inst.visitArg(4, func, Arg.UseDef, GP, Ptr); break; default: throw new Error("Bad overload"); break; } break; case MoveDoubleConditionally32: inst.visitArg(0, func, Arg.Use, GP, 32); inst.visitArg(1, func, Arg.Use, GP, 32); inst.visitArg(2, func, Arg.Use, GP, 32); inst.visitArg(3, func, Arg.Use, FP, 64); inst.visitArg(4, func, Arg.Use, FP, 64); inst.visitArg(5, func, Arg.Def, FP, 64); break; break; case MoveDoubleConditionally64: inst.visitArg(0, func, Arg.Use, GP, 32); inst.visitArg(1, func, Arg.Use, GP, 64); inst.visitArg(2, func, Arg.Use, GP, 64); inst.visitArg(3, func, Arg.Use, FP, 64); inst.visitArg(4, func, Arg.Use, FP, 64); inst.visitArg(5, func, Arg.Def, FP, 64); break; break; case MoveDoubleConditionallyTest32: inst.visitArg(0, func, Arg.Use, GP, 32); inst.visitArg(1, func, Arg.Use, GP, 32); inst.visitArg(2, func, Arg.Use, GP, 32); inst.visitArg(3, func, Arg.Use, FP, 64); inst.visitArg(4, func, Arg.Use, FP, 64); inst.visitArg(5, func, Arg.Def, FP, 64); break; break; case MoveDoubleConditionallyTest64: inst.visitArg(0, func, Arg.Use, GP, 32); inst.visitArg(1, func, Arg.Use, GP, 64); inst.visitArg(2, func, Arg.Use, GP, 64); inst.visitArg(3, func, Arg.Use, FP, 64); inst.visitArg(4, func, Arg.Use, FP, 64); inst.visitArg(5, func, Arg.Def, FP, 64); break; break; case MoveDoubleConditionallyDouble: inst.visitArg(0, func, Arg.Use, GP, 32); inst.visitArg(1, func, Arg.Use, FP, 64); inst.visitArg(2, func, Arg.Use, FP, 64); inst.visitArg(3, func, Arg.Use, FP, 64); inst.visitArg(4, func, Arg.Use, FP, 64); inst.visitArg(5, func, Arg.Def, FP, 64); break; break; case MoveDoubleConditionallyFloat: inst.visitArg(0, func, Arg.Use, GP, 32); inst.visitArg(1, func, Arg.Use, FP, 32); inst.visitArg(2, func, Arg.Use, FP, 32); inst.visitArg(3, func, Arg.Use, FP, 64); inst.visitArg(4, func, Arg.Use, FP, 64); inst.visitArg(5, func, Arg.Def, FP, 64); break; break; case Jump: break; break; case Ret32: inst.visitArg(0, func, Arg.Use, GP, 32); break; break; case Ret64: inst.visitArg(0, func, Arg.Use, GP, 64); break; break; case RetFloat: inst.visitArg(0, func, Arg.Use, FP, 32); break; break; case RetDouble: inst.visitArg(0, func, Arg.Use, FP, 64); break; break; case Oops: break; break; case Shuffle: ShuffleCustom.forEachArg(inst, func); break; case Patch: PatchCustom.forEachArg(inst, func); break; case CCall: CCallCustom.forEachArg(inst, func); break; case ColdCCall: ColdCCallCustom.forEachArg(inst, func); break; default: throw "Bad opcode"; } } function Inst_hasNonArgEffects(inst) { switch (inst.opcode) { case Branch8: case Branch32: case Branch64: case BranchTest8: case BranchTest32: case BranchTest64: case BranchDouble: case BranchFloat: case BranchAdd32: case BranchAdd64: case BranchMul32: case BranchMul64: case BranchSub32: case BranchSub64: case BranchNeg32: case BranchNeg64: case Jump: case Ret32: case Ret64: case RetFloat: case RetDouble: case Oops: return true; case Shuffle: return ShuffleCustom.hasNonArgNonControlEffects(inst); case Patch: return PatchCustom.hasNonArgNonControlEffects(inst); case CCall: return CCallCustom.hasNonArgNonControlEffects(inst); case ColdCCall: return ColdCCallCustom.hasNonArgNonControlEffects(inst); default: 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"); } } class Reg extends TmpBase { constructor(index, type, name, isCalleeSave) { super(); this._index = index; this._type = type; this._name = name; this._isCalleeSave = !!isCalleeSave; } static fromReg(reg) { return reg; } get index() { return this._index; } get type() { return this._type; } get name() { return this._name; } get isCalleeSave() { return this._isCalleeSave; } get isReg() { return true; } hash() { if (this.isGP) return 1 + this._index; return -1 - this._index; } toString() { return `%${this._name}`; } static extract(arg) { if (arg.isReg) return arg.reg; return null; } static forEachFast(arg, func) { return arg.forEachTmpFast(tmp => { if (!tmp.isReg) return; return func(tmp); }); } static forEach(arg, argRole, argType, argWidth, func) { return arg.forEachTmp( argRole, argType, argWidth, (tmp, role, type, width) => { if (!tmp.isReg) return; return func(tmp, role, type, width); }); } } { Reg.regs = []; function newReg(...args) { let result = new Reg(...args); Reg.regs.push(result); return result; } // Define X86_64 GPRs { let index = 0; function newGPR(name, isCalleeSave) { return newReg(index++, GP, name, isCalleeSave); } Reg.rax = newGPR("rax"); Reg.rcx = newGPR("rcx"); Reg.rdx = newGPR("rdx"); Reg.rbx = newGPR("rbx", true); Reg.rsp = newGPR("rsp"); Reg.rbp = newGPR("rbp", true); Reg.rsi = newGPR("rsi"); Reg.rdi = newGPR("rdi"); for (let i = 8; i <= 15; ++i) Reg[`r${i}`] = newGPR(`r${i}`, i >= 12); } // Define X86_64 FPRs. for (let i = 0; i <= 15; ++i) Reg[`xmm${i}`] = newReg(i, FP, `xmm${i}`); Reg.gprs = [] Reg.fprs = [] Reg.calleeSaveGPRs = [] Reg.calleeSaveFPRs = [] Reg.calleeSaves = [] for (let reg of Reg.regs) { if (reg.isGP) { Reg.gprs.push(reg); if (reg.isCalleeSave) Reg.calleeSaveGPRs.push(reg); } else { Reg.fprs.push(reg); if (reg.isCalleeSave) Reg.calleeSaveFPRS.push(reg); } if (reg.isCalleeSave) Reg.calleeSaves.push(reg); } Reg.callFrameRegister = Reg.rbp; Reg.stackPointerRegister = Reg.rsp; } class StackSlot { constructor(index, byteSize, kind) { this._index = index; this._byteSize = byteSize; this._kind = kind; } get byteSize() { return this._byteSize; } get kind() { return this._kind; } get isLocked() { return this._kind == Locked; } get isSpill() { return this._kind == Spill; } get index() { return this._index; } ensureSize(size) { if (this._offsetFromFP) throw new Error("Stack slot already allocated"); this._byteSize = Math.max(this._byteSize, size); } get alignment() { if (this._byteSize <= 1) return 1; if (this._byteSize <= 2) return 2; if (this._byteSize <= 4) return 4; return 8; } get offsetFromFP() { return this._offsetFromFP; } 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 + (this._offsetFromFP ? ", offset = " + this._offsetFromFP : "") + ">"; } static extract(arg) { if (arg.isStack) return arg.stackSlot; return null; } static forEachFast(arg, func) { if (!arg.isStack) return; let replacement; if (replacement = func(arg.stackSlot)) return Arg.createStack(replacement, this._offset); } static forEach(arg, role, type, width, func) { if (!arg.isStack) return; let replacement; if (replacement = func(arg.stackSlot, role, type, width)) return Arg.createStack(replacement, this._offset); } } class Tmp extends TmpBase { constructor(index, type) { super(); this._index = index; this._type = type; } static fromReg(reg) { return reg; } get index() { return this._index; } get type() { return this._type; } 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; } static extract(arg) { if (arg.isTmp) return arg.tmp; return null; } static forEachFast(arg, func) { return arg.forEachTmpFast(func); } static forEach(arg, role, type, width, func) { return arg.forEachTmp(role, type, width, func); } } function isRepresentableAsInt32(value) { return (value | 0) === value; } function addIndexed(list, cons, ...args) { let result = new cons(list.length, ...args); list.push(result); return result; } const stackAlignmentBytes = 16; function roundUpToMultipleOf(amount, value) { return Math.ceil(value / amount) * amount; } function symbolName(symbol) { let fullString = symbol.toString(); return fullString.substring("Symbol(".length, fullString.length - ")".length); } function lowerSymbolName(symbol) { return symbolName(symbol).toLowerCase(); } function setToString(set) { let result = ""; for (let value of set) { if (result) result += ", "; result += value; } return result; } function mergeIntoSet(target, source) { let didAdd = false; for (let value of source) { if (target.has(value)) continue; target.add(value); didAdd = true; } return didAdd; } function nonEmptyRangesOverlap(leftMin, leftMax, rightMin, rightMax) { if (leftMin >= leftMax) throw new Error("Bad left range"); if (rightMin >= rightMax) throw new Error("Bad right range"); if (leftMin <= rightMin && leftMax > rightMin) return true; if (rightMin <= leftMin && rightMax > leftMin) return true; return false; } function rangesOverlap(leftMin, leftMax, rightMin, rightMax) { if (leftMin > leftMax) throw new Error("Bad left range"); if (rightMin > rightMax) throw new Error("Bad right range"); if (leftMin == leftMax) return false; if (rightMin == rightMax) return false; return nonEmptyRangesOverlap(leftMin, leftMax, rightMin, rightMax); } function removeAllMatching(array, func) { let srcIndex = 0; let dstIndex = 0; while (srcIndex < array.length) { let value = array[srcIndex++]; if (!func(value)) array[dstIndex++] = value; } array.length = dstIndex; } function bubbleSort(array, lessThan) { function swap(i, j) { var tmp = array[i]; array[i] = array[j]; array[j] = tmp; } let begin = 0; let end = array.length; for (;;) { let changed = false; function bubble(i, j) { if (lessThan(array[i], array[j])) { swap(i, j); changed = true; } } if (end < begin) throw new Error("Begin and end are messed up"); let limit = end - begin; for (let i = limit; i-- > 1;) bubble(begin + i, begin + i - 1); if (!changed) return; // After one run, the first element in the list is guaranteed to be the smallest. begin++; // Now go in the other direction. This eliminates most sorting pathologies. changed = false; if (end < begin) throw new Error("Begin and end are messed up"); limit = end - begin; for (let i = 1; i < limit; ++i) bubble(begin + i, begin + i - 1); if (!changed) return; // Now the last element is guaranteed to be the largest. end--; } } let currentTime; if (this.performance && performance.now) currentTime = function() { return performance.now() }; else if (this.preciseTime) currentTime = function() { return preciseTime() * 1000; }; else currentTime = function() { return +new Date(); }; const ShuffleCustom = { forEachArg(inst, func) { var limit = Math.floor(inst.args.length / 3) * 3; for (let i = 0; i < limit; i += 3) { let src = inst.args[i + 0]; let dst = inst.args[i + 1]; let widthArg = inst.args[i + 2]; let width = widthArg.width; let type = src.isGP && dst.isGP ? GP : FP; inst.visitArg(i + 0, func, Arg.Use, type, width); inst.visitArg(i + 1, func, Arg.Def, type, width); inst.visitArg(i + 2, func, Arg.Use, GP, 8); } }, hasNonArgNonControlEffects(inst) { return false; } }; const PatchCustom = { forEachArg(inst, func) { for (let i = 0; i < inst.args.length; ++i) { let {type, role, width} = inst.patchArgData[i]; inst.visitArg(i, func, role, type, width); } }, hasNonArgNonControlEffects(inst) { return inst.patchHasNonArgEffects; } }; const CCallCustom = { forEachArg(inst, func) { let index = 0; inst.visitArg(index++, func, Arg.Use, GP, Ptr); // callee if (inst.cCallType != Void) { inst.visitArg( index++, func, Arg.Def, Arg.typeForB3Type(inst.cCallType), Arg.widthForB3Type(inst.cCallType)); } for (let type of inst.cCallArgTypes) { inst.visitArg( index++, func, Arg.Use, Arg.typeForB3Type(type), Arg.widthForB3Type(type)); } }, hasNonArgNonControlEffects(inst) { return true; } }; const ColdCCallCustom = { forEachArg(inst, func) { CCallCustom.forEachArg( inst, (arg, role, type, width) => { return func(arg, Arg.cooled(role), type, width); }); }, hasNonArgNonControlEffects(inst) { return true; } }; class Liveness { constructor(thing, code) { this._thing = thing; this._code = code; this._liveAtHead = new Map(); this._liveAtTail = new Map(); for (let block of code) { this._liveAtHead.set(block, new Set()); let liveAtTail = new Set(); this._liveAtTail.set(block, liveAtTail); block.last.forEach( thing, (value, role, type, width) => { if (Arg.isLateUse(role)) liveAtTail.add(value); }); } let dirtyBlocks = new Set(code); let changed; do { changed = false; for (let blockIndex = code.size; blockIndex--;) { let block = code.at(blockIndex); if (!block) continue; if (!dirtyBlocks.delete(block)) continue; let localCalc = this.localCalc(block); for (let instIndex = block.size; instIndex--;) localCalc.execute(instIndex); // Handle the early def's of the first instruction. block.at(0).forEach( thing, (value, role, type, width) => { if (Arg.isEarlyDef(role)) localCalc.liveSet.remove(value); }); let liveAtHead = this._liveAtHead.get(block); if (!mergeIntoSet(liveAtHead, localCalc.liveSet)) continue; for (let predecessor of block.predecessors) { if (mergeIntoSet(this._liveAtTail.get(predecessor), liveAtHead)) { dirtyBlocks.add(predecessor); changed = true; } } } } while (changed); } get thing() { return this._thing; } get code() { return this._code; } get liveAtHead() { return this._liveAtHead; } get liveAtTail() { return this._liveAtTail; } localCalc(block) { let liveness = this; class LocalCalc { constructor() { this._liveSet = new Set(liveness.liveAtTail.get(block)); } get liveSet() { return this._liveSet; } execute(instIndex) { let inst = block.at(instIndex); // First handle the early defs of the next instruction. if (instIndex + 1 < block.size) { block.at(instIndex + 1).forEach( liveness.thing, (value, role, type, width) => { if (Arg.isEarlyDef(role)) this._liveSet.delete(value); }); } // Then handle defs. inst.forEach( liveness.thing, (value, role, type, width) => { if (Arg.isLateDef(role)) this._liveSet.delete(value); }); // Then handle uses. inst.forEach( liveness.thing, (value, role, type, width) => { if (Arg.isEarlyUse(role)) this._liveSet.add(value); }); // Finally handle the late uses of the previous instruction. if (instIndex - 1 >= 0) { block.at(instIndex - 1).forEach( liveness.thing, (value, role, type, width) => { if (Arg.isLateUse(role)) this._liveSet.add(value); }); } } } return new LocalCalc(); } } class Insertion { constructor(index, element) { this._index = index; this._element = element; } get index() { return this._index; } get element() { return this._element; } lessThan(other) { return this._index < other._index; } } class InsertionSet { constructor() { this._insertions = [] } appendInsertion(insertion) { this._insertions.push(insertion); } append(index, element) { this.appendInsertion(new Insertion(index, element)); } execute(target) { // We bubble-sort because that's what the C++ code, and for the same reason as we do it: // the stdlib doesn't have a stable sort and mergesort is slower in the common case of the // array usually being sorted. This array is usually sorted. bubbleSort(this._insertions, (a, b) => (a.lessThan(b))); let numInsertions = this._insertions.length; if (!numInsertions) return 0; let originalTargetSize = target.length; target.length += numInsertions; let lastIndex = target.length; for (let indexInInsertions = numInsertions; indexInInsertions--;) { let insertion = this._insertions[indexInInsertions]; if (indexInInsertions && insertion.index < this._insertions[indexInInsertions - 1].index) throw new Error("Insertions out of order"); if (insertion.index > originalTargetSize) throw new Error("Out-of-bounds insertion"); let firstIndex = insertion.index + indexInInsertions; let indexOffset = indexInInsertions + 1; for (let i = lastIndex; --i > firstIndex;) target[i] = target[i - indexOffset]; target[firstIndex] = insertion.element; lastIndex = firstIndex; } this._insertions = []; return numInsertions; } } function allocateStack(code) { if (code.frameSize) throw new Error("Frame size already determined"); function attemptAssignment(slot, offsetFromFP, otherSlots) { if (offsetFromFP > 0) throw new Error("Expect negative offset"); offsetFromFP = -roundUpToMultipleOf(slot.alignment, -offsetFromFP); for (let otherSlot of otherSlots) { if (!otherSlot.offsetFromFP) continue; let overlap = rangesOverlap( offsetFromFP, offsetFromFP + slot.byteSize, otherSlot.offsetFromFP, otherSlot.offsetFromFP + otherSlot.byteSize); if (overlap) return false; } slot.setOffsetFromFP(offsetFromFP); return true; } function assign(slot, otherSlots) { if (attemptAssignment(slot, -slot.byteSize, otherSlots)) return; for (let otherSlot of otherSlots) { if (!otherSlot.offsetFromFP) continue; if (attemptAssignment(slot, otherSlot.offsetFromFP - slot.byteSize, otherSlots)) return; } throw new Error("Assignment failed"); } // Allocate all of the escaped slots in order. This is kind of a crazy algorithm to allow for // the possibility of stack slots being assigned frame offsets before we even get here. let assignedEscapedStackSlots = []; let escapedStackSlotsWorklist = []; for (let slot of code.stackSlots) { if (slot.isLocked) { if (slot.offsetFromFP) assignedEscapedStackSlots.push(slot); else escapedStackSlotsWorklist.push(slot); } else { if (slot.offsetFromFP) throw new Error("Offset already assigned"); } } // This is a fairly espensive loop, but it's OK because we'll usually only have a handful of // escaped stack slots. while (escapedStackSlotsWorklist.length) { let slot = escapedStackSlotsWorklist.pop(); assign(slot, assignedEscapedStackSlots); assignedEscapedStackSlots.push(slot); } // Now we handle the spill slots. let liveness = new Liveness(StackSlot, code); let interference = new Map(); for (let slot of code.stackSlots) interference.set(slot, new Set()); let slots = []; for (let block of code) { let localCalc = liveness.localCalc(block); function interfere(instIndex) { Inst.forEachDef( StackSlot, block.get(instIndex), block.get(instIndex + 1), (slot, role, type, width) => { if (!slot.isSpill) return; for (let otherSlot of localCalc.liveSet) { interference.get(slot).add(otherSlot); interference.get(otherSlot).add(slot); } }); } for (let instIndex = block.size; instIndex--;) { // Kill dead stores. For simplicity we say that a store is killable if it has only late // defs and those late defs are to things that are dead right now. We only do that // because that's the only kind of dead stack store we will see here. let inst = block.at(instIndex); if (!inst.hasNonArgEffects) { let ok = true; inst.forEachArg((arg, role, type, width) => { if (Arg.isEarlyDef(role)) { ok = false; return; } if (!Arg.isLateDef(role)) return; if (!arg.isStack) { ok = false; return; } let slot = arg.stackSlot; if (!slot.isSpill) { ok = false; return; } if (localCalc.liveSet.has(slot)) { ok = false; return; } }); if (ok) inst.clear(); } interfere(instIndex); localCalc.execute(instIndex); } interfere(-1); removeAllMatching(block.insts, inst => inst.opcode == Nop); } // Now we assign stack locations. At its heart this algorithm is just first-fit. For each // StackSlot we just want to find the offsetFromFP that is closest to zero while ensuring no // overlap with other StackSlots that this overlaps with. for (let slot of code.stackSlots) { if (slot.offsetFromFP) continue; assign(slot, assignedEscapedStackSlots.concat(Array.from(interference.get(slot)))); } // Figure out how much stack we're using for stack slots. let frameSizeForStackSlots = 0; for (let slot of code.stackSlots) { frameSizeForStackSlots = Math.max( frameSizeForStackSlots, -slot.offsetFromFP); } frameSizeForStackSlots = roundUpToMultipleOf(stackAlignmentBytes, frameSizeForStackSlots); // No we need to deduce how much argument area we need. for (let block of code) { for (let inst of block) { for (let arg of inst.args) { if (arg.isCallArg) { // For now, we assume that we use 8 bytes of the call arg. But that's not // such an awesome assumption. // FIXME: https://bugs.webkit.org/show_bug.cgi?id=150454 if (arg.offset < 0) throw new Error("Did not expect negative offset for callArg"); code.requestCallArgAreaSize(arg.offset + 8); } } } } code.setFrameSize(frameSizeForStackSlots + code.callArgAreaSize); // Finally transform the code to use Addrs instead of StackSlots. This is a lossless // transformation since we can search the StackSlots array to figure out which StackSlot any // offset-from-FP refers to. // FIXME: This may produce addresses that aren't valid if we end up with a ginormous stack frame. // We would have to scavenge for temporaries if this happened. Fortunately, this case will be // extremely rare so we can do crazy things when it arises. // https://bugs.webkit.org/show_bug.cgi?id=152530 let insertionSet = new InsertionSet(); for (let block of code) { for (let instIndex = 0; instIndex < block.size; ++instIndex) { let inst = block.at(instIndex); inst.forEachArg((arg, role, type, width) => { function stackAddr(offset) { return Arg.createStackAddr(offset, code.frameSize, width); } switch (arg.kind) { case Arg.Stack: { let slot = arg.stackSlot; if (Arg.isZDef(role) && slot.isSpill && slot.byteSize > Arg.bytes(width)) { // Currently we only handle this simple case because it's the only one // that arises: ZDef's are only 32-bit right now. So, when we hit these // assertions it means that we need to implement those other kinds of // zero fills. if (slot.byteSize != 8) { throw new Error( `Bad spill slot size for ZDef: ${slot.byteSize}, width is ${width}`); } if (width != 32) throw new Error("Bad width for ZDef"); insertionSet.insert( instIndex + 1, new Inst( StoreZero32, [stackAddr(arg.offset + 4 + slot.offsetFromFP)])); } return stackAddr(arg.offset + slot.offsetFromFP); } case Arg.CallArg: return stackAddr(arg.offset - code.frameSize); default: break; } }); } insertionSet.execute(block.insts); } } "use strict"; // Generated by Air::dumpAsJS from executeIteration#EVx8pJ in Octane/gbemu function createPayloadGbemuExecuteIteration() { let code = new Code(); let bb0 = code.addBlock(); let bb1 = code.addBlock(); let bb2 = code.addBlock(); let bb3 = code.addBlock(); let bb4 = code.addBlock(); let bb5 = code.addBlock(); let bb6 = code.addBlock(); let bb7 = code.addBlock(); let bb8 = code.addBlock(); let bb9 = code.addBlock(); let bb10 = code.addBlock(); let bb11 = code.addBlock(); let bb12 = code.addBlock(); let bb13 = code.addBlock(); let bb14 = code.addBlock(); let bb15 = code.addBlock(); let bb16 = code.addBlock(); let bb17 = code.addBlock(); let bb18 = code.addBlock(); let bb19 = code.addBlock(); let bb20 = code.addBlock(); let bb21 = code.addBlock(); let bb22 = code.addBlock(); let bb23 = code.addBlock(); let bb24 = code.addBlock(); let bb25 = code.addBlock(); let bb26 = code.addBlock(); let bb27 = code.addBlock(); let bb28 = code.addBlock(); let bb29 = code.addBlock(); let bb30 = code.addBlock(); let bb31 = code.addBlock(); let bb32 = code.addBlock(); let bb33 = code.addBlock(); let bb34 = code.addBlock(); let bb35 = code.addBlock(); let bb36 = code.addBlock(); let bb37 = code.addBlock(); let bb38 = code.addBlock(); let bb39 = code.addBlock(); let bb40 = code.addBlock(); let bb41 = code.addBlock(); let bb42 = code.addBlock(); let slot0 = code.addStackSlot(64, Locked); let slot1 = code.addStackSlot(8, Spill); let slot2 = code.addStackSlot(8, Spill); let slot3 = code.addStackSlot(8, Spill); let slot4 = code.addStackSlot(8, Spill); let slot5 = code.addStackSlot(8, Spill); let slot6 = code.addStackSlot(8, Spill); let slot7 = code.addStackSlot(8, Spill); let slot8 = code.addStackSlot(8, Spill); let slot9 = code.addStackSlot(8, Spill); 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); let tmp187 = code.newTmp(GP); let tmp186 = code.newTmp(GP); let tmp185 = code.newTmp(GP); let tmp184 = code.newTmp(GP); let tmp183 = code.newTmp(GP); let tmp182 = code.newTmp(GP); let tmp181 = code.newTmp(GP); let tmp180 = code.newTmp(GP); let tmp179 = code.newTmp(GP); let tmp178 = code.newTmp(GP); let tmp177 = code.newTmp(GP); let tmp176 = code.newTmp(GP); let tmp175 = code.newTmp(GP); let tmp174 = code.newTmp(GP); let tmp173 = code.newTmp(GP); let tmp172 = code.newTmp(GP); let tmp171 = code.newTmp(GP); let tmp170 = code.newTmp(GP); let tmp169 = code.newTmp(GP); let tmp168 = code.newTmp(GP); let tmp167 = code.newTmp(GP); let tmp166 = code.newTmp(GP); let tmp165 = code.newTmp(GP); let tmp164 = code.newTmp(GP); let tmp163 = code.newTmp(GP); let tmp162 = code.newTmp(GP); let tmp161 = code.newTmp(GP); let tmp160 = code.newTmp(GP); let tmp159 = code.newTmp(GP); let tmp158 = code.newTmp(GP); let tmp157 = code.newTmp(GP); let tmp156 = code.newTmp(GP); let tmp155 = code.newTmp(GP); let tmp154 = code.newTmp(GP); let tmp153 = code.newTmp(GP); let tmp152 = code.newTmp(GP); let tmp151 = code.newTmp(GP); let tmp150 = code.newTmp(GP); let tmp149 = code.newTmp(GP); let tmp148 = code.newTmp(GP); let tmp147 = code.newTmp(GP); let tmp146 = code.newTmp(GP); let tmp145 = code.newTmp(GP); let tmp144 = code.newTmp(GP); let tmp143 = code.newTmp(GP); let tmp142 = code.newTmp(GP); let tmp141 = code.newTmp(GP); let tmp140 = code.newTmp(GP); let tmp139 = code.newTmp(GP); let tmp138 = code.newTmp(GP); let tmp137 = code.newTmp(GP); let tmp136 = code.newTmp(GP); let tmp135 = code.newTmp(GP); let tmp134 = code.newTmp(GP); let tmp133 = code.newTmp(GP); let tmp132 = code.newTmp(GP); let tmp131 = code.newTmp(GP); let tmp130 = code.newTmp(GP); let tmp129 = code.newTmp(GP); let tmp128 = code.newTmp(GP); let tmp127 = code.newTmp(GP); let tmp126 = code.newTmp(GP); let tmp125 = code.newTmp(GP); let tmp124 = code.newTmp(GP); let tmp123 = code.newTmp(GP); let tmp122 = code.newTmp(GP); let tmp121 = code.newTmp(GP); let tmp120 = code.newTmp(GP); let tmp119 = code.newTmp(GP); let tmp118 = code.newTmp(GP); let tmp117 = code.newTmp(GP); let tmp116 = code.newTmp(GP); let tmp115 = code.newTmp(GP); let tmp114 = code.newTmp(GP); let tmp113 = code.newTmp(GP); let tmp112 = code.newTmp(GP); let tmp111 = code.newTmp(GP); let tmp110 = code.newTmp(GP); let tmp109 = code.newTmp(GP); let tmp108 = code.newTmp(GP); let tmp107 = code.newTmp(GP); let tmp106 = code.newTmp(GP); let tmp105 = code.newTmp(GP); let tmp104 = code.newTmp(GP); let tmp103 = code.newTmp(GP); let tmp102 = code.newTmp(GP); let tmp101 = code.newTmp(GP); let tmp100 = code.newTmp(GP); let tmp99 = code.newTmp(GP); let tmp98 = code.newTmp(GP); let tmp97 = code.newTmp(GP); let tmp96 = code.newTmp(GP); let tmp95 = code.newTmp(GP); let tmp94 = code.newTmp(GP); let tmp93 = code.newTmp(GP); let tmp92 = code.newTmp(GP); let tmp91 = code.newTmp(GP); let tmp90 = code.newTmp(GP); let tmp89 = code.newTmp(GP); let tmp88 = code.newTmp(GP); let tmp87 = code.newTmp(GP); let tmp86 = code.newTmp(GP); let tmp85 = code.newTmp(GP); let tmp84 = code.newTmp(GP); let tmp83 = code.newTmp(GP); let tmp82 = code.newTmp(GP); let tmp81 = code.newTmp(GP); let tmp80 = code.newTmp(GP); let tmp79 = code.newTmp(GP); let tmp78 = code.newTmp(GP); let tmp77 = code.newTmp(GP); let tmp76 = code.newTmp(GP); let tmp75 = code.newTmp(GP); let tmp74 = code.newTmp(GP); let tmp73 = code.newTmp(GP); let tmp72 = code.newTmp(GP); let tmp71 = code.newTmp(GP); let tmp70 = code.newTmp(GP); let tmp69 = code.newTmp(GP); let tmp68 = code.newTmp(GP); let tmp67 = code.newTmp(GP); let tmp66 = code.newTmp(GP); let tmp65 = code.newTmp(GP); let tmp64 = code.newTmp(GP); let tmp63 = code.newTmp(GP); let tmp62 = code.newTmp(GP); let tmp61 = code.newTmp(GP); let tmp60 = code.newTmp(GP); let tmp59 = code.newTmp(GP); let tmp58 = code.newTmp(GP); let tmp57 = code.newTmp(GP); let tmp56 = code.newTmp(GP); let tmp55 = code.newTmp(GP); let tmp54 = code.newTmp(GP); let tmp53 = code.newTmp(GP); let tmp52 = code.newTmp(GP); let tmp51 = code.newTmp(GP); let tmp50 = code.newTmp(GP); let tmp49 = code.newTmp(GP); let tmp48 = code.newTmp(GP); let tmp47 = code.newTmp(GP); let tmp46 = code.newTmp(GP); let tmp45 = code.newTmp(GP); let tmp44 = code.newTmp(GP); let tmp43 = code.newTmp(GP); let tmp42 = code.newTmp(GP); let tmp41 = code.newTmp(GP); let tmp40 = code.newTmp(GP); let tmp39 = code.newTmp(GP); let tmp38 = code.newTmp(GP); let tmp37 = code.newTmp(GP); let tmp36 = code.newTmp(GP); let tmp35 = code.newTmp(GP); let tmp34 = code.newTmp(GP); let tmp33 = code.newTmp(GP); let tmp32 = code.newTmp(GP); let tmp31 = code.newTmp(GP); let tmp30 = code.newTmp(GP); let tmp29 = code.newTmp(GP); let tmp28 = code.newTmp(GP); let tmp27 = code.newTmp(GP); let tmp26 = code.newTmp(GP); let tmp25 = code.newTmp(GP); let tmp24 = code.newTmp(GP); let tmp23 = code.newTmp(GP); let tmp22 = code.newTmp(GP); let tmp21 = code.newTmp(GP); let tmp20 = code.newTmp(GP); let tmp19 = code.newTmp(GP); let tmp18 = code.newTmp(GP); let tmp17 = code.newTmp(GP); let tmp16 = code.newTmp(GP); let tmp15 = code.newTmp(GP); let tmp14 = code.newTmp(GP); let tmp13 = code.newTmp(GP); let tmp12 = code.newTmp(GP); let tmp11 = code.newTmp(GP); let tmp10 = code.newTmp(GP); let tmp9 = code.newTmp(GP); let tmp8 = code.newTmp(GP); let tmp7 = code.newTmp(GP); let tmp6 = code.newTmp(GP); let tmp5 = code.newTmp(GP); let tmp4 = code.newTmp(GP); let tmp3 = code.newTmp(GP); let tmp2 = code.newTmp(GP); let tmp1 = code.newTmp(GP); let tmp0 = code.newTmp(GP); let ftmp7 = code.newTmp(FP); let ftmp6 = code.newTmp(FP); let ftmp5 = code.newTmp(FP); let ftmp4 = code.newTmp(FP); let ftmp3 = code.newTmp(FP); let ftmp2 = code.newTmp(FP); let ftmp1 = code.newTmp(FP); let ftmp0 = code.newTmp(FP); let inst; let arg; bb0.successors.push(new FrequentedBlock(bb2, Normal)); bb0.successors.push(new FrequentedBlock(bb1, Normal)); inst = new Inst(Move); arg = Arg.createBigImm(286904960, 1); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); bb0.append(inst); inst = new Inst(Move); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createAddr(Reg.rbp, 16); 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); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.extraEarlyClobberedRegs.add(Reg.r11); inst.extraClobberedRegs.add(Reg.r11); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Scratch, type: GP, width: 64}); bb0.append(inst); inst = new Inst(Move); arg = Arg.createAddr(Reg.rbp, 40); inst.args.push(arg); arg = Arg.createTmp(Reg.rbx); inst.args.push(arg); bb0.append(inst); inst = new Inst(Move); 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); arg = Arg.createTmp(Reg.rbx); inst.args.push(arg); arg = Arg.createTmp(Reg.r15); inst.args.push(arg); arg = Arg.createTmp(Reg.rbx); inst.args.push(arg); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); 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.rbx, 5); inst.args.push(arg); arg = Arg.createImm(21); inst.args.push(arg); arg = Arg.createTmp(Reg.rbx); inst.args.push(arg); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 8}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 8}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); bb0.append(inst); inst = new Inst(Move32); arg = Arg.createAddr(Reg.rbx, 0); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); bb0.append(inst); inst = new Inst(Move); arg = Arg.createBigImm(286506544, 1); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); bb0.append(inst); inst = new Inst(Move); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); arg = Arg.createStack(slot10, 0); inst.args.push(arg); bb0.append(inst); inst = new Inst(Move); arg = Arg.createBigImm(286455168, 1); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); bb0.append(inst); inst = new Inst(Move); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); arg = Arg.createStack(slot4, 0); inst.args.push(arg); bb0.append(inst); inst = new Inst(Move); arg = Arg.createBigImm(287131344, 1); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); bb0.append(inst); inst = new Inst(Move); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); arg = Arg.createStack(slot6, 0); inst.args.push(arg); bb0.append(inst); inst = new Inst(Move); arg = Arg.createImm(10); inst.args.push(arg); arg = Arg.createStack(slot3, 0); inst.args.push(arg); bb0.append(inst); inst = new Inst(Move); arg = Arg.createBigImm(286474592, 1); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); bb0.append(inst); inst = new Inst(Move); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); arg = Arg.createStack(slot2, 0); inst.args.push(arg); bb0.append(inst); inst = new Inst(Move); arg = Arg.createBigImm(287209728, 1); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); bb0.append(inst); inst = new Inst(Move); 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.createImm(1); inst.args.push(arg); arg = Arg.createStack(slot1, 0); inst.args.push(arg); bb0.append(inst); inst = new Inst(Move); 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(287112728, 1); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); bb0.append(inst); inst = new Inst(Move); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); arg = Arg.createStack(slot8, 0); inst.args.push(arg); bb0.append(inst); inst = new Inst(Move); arg = Arg.createBigImm(0, 65536); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); bb0.append(inst); inst = new Inst(Move); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); arg = Arg.createStack(slot9, 0); inst.args.push(arg); bb0.append(inst); inst = new Inst(Move); arg = Arg.createBigImm(287112720, 1); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); bb0.append(inst); inst = new Inst(Move); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); arg = Arg.createStack(slot5, 0); inst.args.push(arg); bb0.append(inst); inst = new Inst(Move); arg = Arg.createBigImm(286506192, 1); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); bb0.append(inst); inst = new Inst(Move); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); arg = Arg.createStack(slot7, 0); inst.args.push(arg); bb0.append(inst); inst = new Inst(Branch32); arg = Arg.createRelCond(Equal); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createImm(862); inst.args.push(arg); bb0.append(inst); bb1.successors.push(new FrequentedBlock(bb41, Normal)); 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); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createImm(881); inst.args.push(arg); arg = Arg.createTmp(Reg.rbx); inst.args.push(arg); arg = Arg.createTmp(Reg.rbx); inst.args.push(arg); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); bb1.append(inst); inst = new Inst(Move); arg = Arg.createAddr(Reg.rbx, 224); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); bb1.append(inst); inst = new Inst(BranchTest32); arg = Arg.createResCond(NonZero); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); bb1.append(inst); bb2.successors.push(new FrequentedBlock(bb41, Normal)); bb2.successors.push(new FrequentedBlock(bb3, Normal)); bb2.predecessors.push(bb0); inst = new Inst(Move); arg = Arg.createAddr(Reg.rbx, 224); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); bb2.append(inst); inst = new Inst(BranchTest32); arg = Arg.createResCond(NonZero); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); bb2.append(inst); bb3.successors.push(new FrequentedBlock(bb5, Normal)); bb3.successors.push(new FrequentedBlock(bb4, Normal)); bb3.predecessors.push(bb1); bb3.predecessors.push(bb40); bb3.predecessors.push(bb39); bb3.predecessors.push(bb2); inst = new Inst(Move); arg = Arg.createAddr(Reg.rbx, 8); inst.args.push(arg); arg = Arg.createTmp(Reg.rsi); inst.args.push(arg); bb3.append(inst); inst = new Inst(Move); arg = Arg.createAddr(Reg.rsi, -1144); inst.args.push(arg); arg = Arg.createTmp(Reg.rdx); inst.args.push(arg); bb3.append(inst); inst = new Inst(Branch32); arg = Arg.createRelCond(Equal); inst.args.push(arg); arg = Arg.createTmp(Reg.rdx); inst.args.push(arg); arg = Arg.createImm(1); inst.args.push(arg); bb3.append(inst); bb4.successors.push(new FrequentedBlock(bb6, Normal)); bb4.successors.push(new FrequentedBlock(bb7, Normal)); bb4.predecessors.push(bb3); inst = new Inst(Branch32); arg = Arg.createRelCond(Equal); inst.args.push(arg); arg = Arg.createTmp(Reg.rdx); inst.args.push(arg); arg = Arg.createImm(2); inst.args.push(arg); bb4.append(inst); bb5.successors.push(new FrequentedBlock(bb6, Normal)); bb5.predecessors.push(bb3); inst = new Inst(Move); arg = Arg.createImm(7); inst.args.push(arg); arg = Arg.createAddr(Reg.rbx, 232); inst.args.push(arg); bb5.append(inst); inst = new Inst(Move); arg = Arg.createAddr(Reg.rbx, 256); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); bb5.append(inst); inst = new Inst(Move); arg = Arg.createAddr(Reg.rbx, 248); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); bb5.append(inst); inst = new Inst(And32); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); bb5.append(inst); inst = new Inst(And32); arg = Arg.createImm(31); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); bb5.append(inst); inst = new Inst(Add64); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); arg = Arg.createTmp(Reg.r14); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); bb5.append(inst); inst = new Inst(Move); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); arg = Arg.createAddr(Reg.rbx, 240); inst.args.push(arg); bb5.append(inst); inst = new Inst(Jump); bb5.append(inst); bb6.successors.push(new FrequentedBlock(bb7, Normal)); bb6.predecessors.push(bb4); bb6.predecessors.push(bb5); inst = new Inst(Add32); arg = Arg.createImm(-1); inst.args.push(arg); arg = Arg.createTmp(Reg.rdx); inst.args.push(arg); arg = Arg.createTmp(Reg.rdx); inst.args.push(arg); bb6.append(inst); inst = new Inst(Add64); arg = Arg.createTmp(Reg.rdx); inst.args.push(arg); arg = Arg.createTmp(Reg.r14); inst.args.push(arg); arg = Arg.createTmp(Reg.rdx); inst.args.push(arg); bb6.append(inst); inst = new Inst(Move); arg = Arg.createTmp(Reg.rdx); inst.args.push(arg); arg = Arg.createAddr(Reg.rsi, -1144); inst.args.push(arg); bb6.append(inst); inst = new Inst(Jump); bb6.append(inst); bb7.successors.push(new FrequentedBlock(bb8, Normal)); bb7.successors.push(new FrequentedBlock(bb9, Normal)); bb7.predecessors.push(bb4); bb7.predecessors.push(bb6); inst = new Inst(Move); arg = Arg.createAddr(Reg.rbx, 240); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); bb7.append(inst); inst = new Inst(Branch32); arg = Arg.createRelCond(GreaterThan); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createImm(0); inst.args.push(arg); bb7.append(inst); bb8.successors.push(new FrequentedBlock(bb9, Normal)); bb8.predecessors.push(bb7); inst = new Inst(Move); 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(286455168, 1); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); bb8.append(inst); inst = new Inst(Move); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); arg = Arg.createCallArg(8); inst.args.push(arg); bb8.append(inst); inst = new Inst(Move32); arg = Arg.createImm(1); inst.args.push(arg); arg = Arg.createCallArg(16); inst.args.push(arg); bb8.append(inst); inst = new Inst(Move); arg = Arg.createTmp(Reg.rbx); inst.args.push(arg); arg = Arg.createCallArg(24); 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); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createCallArg(8); inst.args.push(arg); arg = Arg.createCallArg(16); inst.args.push(arg); arg = Arg.createCallArg(24); inst.args.push(arg); arg = Arg.createTmp(Reg.r15); inst.args.push(arg); arg = Arg.createTmp(Reg.r14); inst.args.push(arg); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.extraEarlyClobberedRegs.add(Reg.r11); inst.extraClobberedRegs.add(Reg.rcx); inst.extraClobberedRegs.add(Reg.rdx); inst.extraClobberedRegs.add(Reg.rsi); inst.extraClobberedRegs.add(Reg.rdi); inst.extraClobberedRegs.add(Reg.r8); inst.extraClobberedRegs.add(Reg.r9); inst.extraClobberedRegs.add(Reg.r10); inst.extraClobberedRegs.add(Reg.r11); inst.extraClobberedRegs.add(Reg.xmm0); inst.extraClobberedRegs.add(Reg.xmm1); inst.extraClobberedRegs.add(Reg.xmm2); inst.extraClobberedRegs.add(Reg.xmm3); inst.extraClobberedRegs.add(Reg.xmm4); inst.extraClobberedRegs.add(Reg.xmm5); inst.extraClobberedRegs.add(Reg.xmm6); inst.extraClobberedRegs.add(Reg.xmm7); inst.extraClobberedRegs.add(Reg.xmm8); inst.extraClobberedRegs.add(Reg.xmm9); inst.extraClobberedRegs.add(Reg.xmm10); inst.extraClobberedRegs.add(Reg.xmm11); inst.extraClobberedRegs.add(Reg.xmm12); inst.extraClobberedRegs.add(Reg.xmm13); inst.extraClobberedRegs.add(Reg.xmm14); inst.extraClobberedRegs.add(Reg.xmm15); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Def, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); 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); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); bb8.append(inst); inst = new Inst(Jump); bb8.append(inst); bb9.successors.push(new FrequentedBlock(bb12, Normal)); bb9.successors.push(new FrequentedBlock(bb10, Normal)); bb9.predecessors.push(bb7); bb9.predecessors.push(bb8); inst = new Inst(Move); arg = Arg.createAddr(Reg.rbx, 304); inst.args.push(arg); arg = Arg.createTmp(Reg.r8); inst.args.push(arg); bb9.append(inst); inst = new Inst(Move); arg = Arg.createAddr(Reg.rbx, 128); inst.args.push(arg); arg = Arg.createTmp(Reg.rdx); 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); arg = Arg.createAddr(Reg.r8, 0); inst.args.push(arg); arg = Arg.createImm(80); inst.args.push(arg); arg = Arg.createTmp(Reg.r8); inst.args.push(arg); arg = Arg.createTmp(Reg.rbx); inst.args.push(arg); arg = Arg.createTmp(Reg.r8); inst.args.push(arg); arg = Arg.createTmp(Reg.rdx); inst.args.push(arg); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); bb9.append(inst); inst = new Inst(Move); arg = Arg.createAddr(Reg.r8, 8); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); 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); arg = Arg.createTmp(Reg.rdx); inst.args.push(arg); arg = Arg.createAddr(Reg.rax, -8); inst.args.push(arg); arg = Arg.createTmp(Reg.rbx); inst.args.push(arg); arg = Arg.createTmp(Reg.r8); inst.args.push(arg); arg = Arg.createTmp(Reg.rdx); inst.args.push(arg); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32}); bb9.append(inst); inst = new Inst(Move32); arg = Arg.createTmp(Reg.rdx); inst.args.push(arg); arg = Arg.createTmp(Reg.rsi); inst.args.push(arg); bb9.append(inst); inst = new Inst(Move); arg = Arg.createIndex(Reg.rax, Reg.rsi, 8, 0); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); bb9.append(inst); inst = new Inst(Move); arg = Arg.createImm(10); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); bb9.append(inst); inst = new Inst(MoveConditionallyTest64); arg = Arg.createResCond(NonZero); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createImm(-1); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); 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); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); arg = Arg.createTmp(Reg.r15); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); arg = Arg.createTmp(Reg.rbx); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); arg = Arg.createTmp(Reg.rdx); inst.args.push(arg); arg = Arg.createTmp(Reg.rbx); inst.args.push(arg); arg = Arg.createTmp(Reg.r8); inst.args.push(arg); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); 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); arg = Arg.createAddr(Reg.rcx, 5); inst.args.push(arg); arg = Arg.createImm(23); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); arg = Arg.createTmp(Reg.rbx); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); arg = Arg.createTmp(Reg.rdx); inst.args.push(arg); arg = Arg.createTmp(Reg.rbx); inst.args.push(arg); arg = Arg.createTmp(Reg.r8); inst.args.push(arg); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 8}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 8}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); bb9.append(inst); inst = new Inst(Move); arg = Arg.createAddr(Reg.rcx, 24); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); bb9.append(inst); inst = new Inst(Branch64); arg = Arg.createRelCond(Equal); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createStack(slot7, 0); inst.args.push(arg); bb9.append(inst); bb10.successors.push(new FrequentedBlock(bb11, Normal)); bb10.successors.push(new FrequentedBlock(bb13, Normal)); bb10.predecessors.push(bb9); inst = new Inst(Branch64); arg = Arg.createRelCond(Equal); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createStack(slot10, 0); inst.args.push(arg); bb10.append(inst); bb11.successors.push(new FrequentedBlock(bb14, Normal)); bb11.predecessors.push(bb10); inst = new Inst(Move); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); arg = Arg.createStack(slot0, 0); inst.args.push(arg); bb11.append(inst); inst = new Inst(Move); arg = Arg.createAddr(Reg.rbx, 344); inst.args.push(arg); arg = Arg.createTmp(Reg.rdi); 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); arg = Arg.createAddr(Reg.rdi, 0); inst.args.push(arg); arg = Arg.createImm(502); inst.args.push(arg); arg = Arg.createTmp(Reg.rdi); inst.args.push(arg); arg = Arg.createTmp(Reg.rbx); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); arg = Arg.createTmp(Reg.rdx); inst.args.push(arg); arg = Arg.createTmp(Reg.rbx); inst.args.push(arg); arg = Arg.createTmp(Reg.r8); inst.args.push(arg); arg = Arg.createTmp(Reg.rdi); inst.args.push(arg); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); bb11.append(inst); inst = new Inst(Move); arg = Arg.createAddr(Reg.rdi, 16); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); 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); arg = Arg.createTmp(Reg.rdx); inst.args.push(arg); arg = Arg.createAddr(Reg.rdi, 24); inst.args.push(arg); arg = Arg.createTmp(Reg.rbx); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); arg = Arg.createTmp(Reg.rdx); inst.args.push(arg); arg = Arg.createTmp(Reg.rbx); inst.args.push(arg); arg = Arg.createTmp(Reg.r8); inst.args.push(arg); arg = Arg.createTmp(Reg.rdi); inst.args.push(arg); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); bb11.append(inst); inst = new Inst(Load8); arg = Arg.createIndex(Reg.rsi, Reg.rax, 1, 0); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); bb11.append(inst); inst = new Inst(Jump); bb11.append(inst); bb12.successors.push(new FrequentedBlock(bb14, Normal)); bb12.predecessors.push(bb9); inst = new Inst(Move); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); arg = Arg.createStack(slot0, 0); inst.args.push(arg); bb12.append(inst); inst = new Inst(Move); arg = Arg.createAddr(Reg.rbx, 336); inst.args.push(arg); arg = Arg.createTmp(Reg.rdi); inst.args.push(arg); bb12.append(inst); inst = new Inst(Move); arg = Arg.createAddr(Reg.rbx, 456); inst.args.push(arg); arg = Arg.createTmp(Reg.rsi); 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); arg = Arg.createTmp(Reg.rdx); inst.args.push(arg); arg = Arg.createTmp(Reg.rsi); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createTmp(Reg.rbx); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); arg = Arg.createTmp(Reg.rdx); inst.args.push(arg); arg = Arg.createTmp(Reg.rbx); inst.args.push(arg); arg = Arg.createTmp(Reg.r8); inst.args.push(arg); arg = Arg.createTmp(Reg.rdi); inst.args.push(arg); arg = Arg.createTmp(Reg.rsi); inst.args.push(arg); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ZDef, type: GP, width: 32}); inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32}); inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 64}); 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); arg = Arg.createAddr(Reg.rdi, 0); inst.args.push(arg); arg = Arg.createImm(502); inst.args.push(arg); arg = Arg.createTmp(Reg.rdi); inst.args.push(arg); arg = Arg.createTmp(Reg.rbx); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); arg = Arg.createTmp(Reg.rdx); inst.args.push(arg); arg = Arg.createTmp(Reg.rbx); inst.args.push(arg); arg = Arg.createTmp(Reg.r8); inst.args.push(arg); arg = Arg.createTmp(Reg.rdi); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32}); bb12.append(inst); inst = new Inst(Move); arg = Arg.createAddr(Reg.rdi, 16); inst.args.push(arg); arg = Arg.createTmp(Reg.rsi); 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); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createAddr(Reg.rdi, 24); inst.args.push(arg); arg = Arg.createTmp(Reg.rbx); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); arg = Arg.createTmp(Reg.rdx); inst.args.push(arg); arg = Arg.createTmp(Reg.rbx); inst.args.push(arg); arg = Arg.createTmp(Reg.r8); inst.args.push(arg); arg = Arg.createTmp(Reg.rdi); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32}); bb12.append(inst); inst = new Inst(Load8); arg = Arg.createIndex(Reg.rsi, Reg.rax, 1, 0); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); bb12.append(inst); inst = new Inst(Jump); 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); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); arg = Arg.createTmp(Reg.rdx); inst.args.push(arg); arg = Arg.createTmp(Reg.rbx); inst.args.push(arg); arg = Arg.createTmp(Reg.r8); inst.args.push(arg); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); bb13.append(inst); inst = new Inst(Oops); bb13.append(inst); bb14.successors.push(new FrequentedBlock(bb15, Normal)); bb14.successors.push(new FrequentedBlock(bb16, Normal)); bb14.predecessors.push(bb11); bb14.predecessors.push(bb12); inst = new Inst(Add32); arg = Arg.createImm(1); inst.args.push(arg); arg = Arg.createTmp(Reg.rdx); inst.args.push(arg); arg = Arg.createTmp(Reg.rdx); inst.args.push(arg); bb14.append(inst); inst = new Inst(ZeroExtend16To32); arg = Arg.createTmp(Reg.rdx); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); bb14.append(inst); inst = new Inst(Add64); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createTmp(Reg.r14); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); bb14.append(inst); inst = new Inst(Move); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createAddr(Reg.rbx, 128); inst.args.push(arg); bb14.append(inst); inst = new Inst(BranchTest32); arg = Arg.createResCond(NonZero); inst.args.push(arg); arg = Arg.createAddr(Reg.rbx, 216); inst.args.push(arg); arg = Arg.createImm(1); inst.args.push(arg); 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); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); arg = Arg.createTmp(Reg.rbx); inst.args.push(arg); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); bb15.append(inst); inst = new Inst(Oops); bb15.append(inst); bb16.successors.push(new FrequentedBlock(bb18, Normal)); bb16.successors.push(new FrequentedBlock(bb17, Normal)); bb16.predecessors.push(bb14); inst = new Inst(Move); arg = Arg.createAddr(Reg.rbx, 8); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); bb16.append(inst); inst = new Inst(Move); arg = Arg.createAddr(Reg.rax, -1752); inst.args.push(arg); arg = Arg.createTmp(Reg.rdx); inst.args.push(arg); bb16.append(inst); inst = new Inst(Move); arg = Arg.createAddr(Reg.rdx, 16); 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(AboveOrEqual); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); arg = Arg.createAddr(Reg.rdx, 24); inst.args.push(arg); arg = Arg.createTmp(Reg.rbx); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); arg = Arg.createTmp(Reg.rbx); inst.args.push(arg); arg = Arg.createTmp(Reg.rdx); inst.args.push(arg); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); bb16.append(inst); inst = new Inst(Load8); arg = Arg.createIndex(Reg.rax, Reg.rcx, 1, 0); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); bb16.append(inst); inst = new Inst(Add64); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createTmp(Reg.r14); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); bb16.append(inst); inst = new Inst(Move); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createAddr(Reg.rbx, 272); inst.args.push(arg); bb16.append(inst); inst = new Inst(Move); 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); arg = Arg.createAddr(Reg.rax, 0); inst.args.push(arg); arg = Arg.createImm(80); inst.args.push(arg); arg = Arg.createBigImm(287112720, 1); inst.args.push(arg); arg = Arg.createTmp(Reg.rbx); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32}); bb16.append(inst); inst = new Inst(Move); arg = Arg.createBigImm(287112728, 1); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); bb16.append(inst); inst = new Inst(Move); arg = Arg.createAddr(Reg.rax, 0); 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(AboveOrEqual); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); arg = Arg.createAddr(Reg.rax, -8); inst.args.push(arg); arg = Arg.createTmp(Reg.rbx); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32}); bb16.append(inst); inst = new Inst(Move); arg = Arg.createIndex(Reg.rax, Reg.rcx, 8, 0); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); bb16.append(inst); inst = new Inst(Move); arg = Arg.createImm(10); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); bb16.append(inst); inst = new Inst(MoveConditionallyTest64); arg = Arg.createResCond(NonZero); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createImm(-1); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); bb16.append(inst); inst = new Inst(Move); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createCallArg(8); inst.args.push(arg); bb16.append(inst); inst = new Inst(Move32); arg = Arg.createImm(2); inst.args.push(arg); arg = Arg.createCallArg(16); inst.args.push(arg); bb16.append(inst); inst = new Inst(Move); arg = Arg.createBigImm(287112720, 1); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); bb16.append(inst); inst = new Inst(Move); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); arg = Arg.createCallArg(24); inst.args.push(arg); bb16.append(inst); inst = new Inst(Move); arg = Arg.createTmp(Reg.rbx); inst.args.push(arg); arg = Arg.createCallArg(32); 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); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createCallArg(8); inst.args.push(arg); arg = Arg.createCallArg(16); inst.args.push(arg); arg = Arg.createCallArg(24); inst.args.push(arg); arg = Arg.createCallArg(32); inst.args.push(arg); arg = Arg.createTmp(Reg.r15); inst.args.push(arg); arg = Arg.createTmp(Reg.r14); inst.args.push(arg); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.extraEarlyClobberedRegs.add(Reg.r11); inst.extraClobberedRegs.add(Reg.rcx); inst.extraClobberedRegs.add(Reg.rdx); inst.extraClobberedRegs.add(Reg.rsi); inst.extraClobberedRegs.add(Reg.rdi); inst.extraClobberedRegs.add(Reg.r8); inst.extraClobberedRegs.add(Reg.r9); inst.extraClobberedRegs.add(Reg.r10); inst.extraClobberedRegs.add(Reg.r11); inst.extraClobberedRegs.add(Reg.xmm0); inst.extraClobberedRegs.add(Reg.xmm1); inst.extraClobberedRegs.add(Reg.xmm2); inst.extraClobberedRegs.add(Reg.xmm3); inst.extraClobberedRegs.add(Reg.xmm4); inst.extraClobberedRegs.add(Reg.xmm5); inst.extraClobberedRegs.add(Reg.xmm6); inst.extraClobberedRegs.add(Reg.xmm7); inst.extraClobberedRegs.add(Reg.xmm8); inst.extraClobberedRegs.add(Reg.xmm9); inst.extraClobberedRegs.add(Reg.xmm10); inst.extraClobberedRegs.add(Reg.xmm11); inst.extraClobberedRegs.add(Reg.xmm12); inst.extraClobberedRegs.add(Reg.xmm13); inst.extraClobberedRegs.add(Reg.xmm14); inst.extraClobberedRegs.add(Reg.xmm15); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Def, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); 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); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); bb16.append(inst); inst = new Inst(Move); arg = Arg.createAddr(Reg.rbx, 8); inst.args.push(arg); arg = Arg.createTmp(Reg.rdx); inst.args.push(arg); bb16.append(inst); inst = new Inst(Move); arg = Arg.createAddr(Reg.rdx, -1088); inst.args.push(arg); arg = Arg.createTmp(Reg.rsi); inst.args.push(arg); bb16.append(inst); inst = new Inst(Move); arg = Arg.createAddr(Reg.rbx, 272); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); bb16.append(inst); inst = new Inst(Move); arg = Arg.createAddr(Reg.rbx, 280); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); bb16.append(inst); inst = new Inst(Rshift32); arg = Arg.createTmp(Reg.rcx); 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.createResCond(Overflow); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createTmp(Reg.rsi); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createTmp(Reg.rbx); inst.args.push(arg); arg = Arg.createTmp(Reg.rbx); inst.args.push(arg); arg = Arg.createTmp(Reg.rsi); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ZDef, type: GP, width: 32}); inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32}); bb16.append(inst); inst = new Inst(Add64); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createTmp(Reg.r14); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); bb16.append(inst); inst = new Inst(Move); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createAddr(Reg.rdx, -1088); inst.args.push(arg); bb16.append(inst); inst = new Inst(Move); arg = Arg.createAddr(Reg.rdx, -88); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); bb16.append(inst); inst = new Inst(Move); arg = Arg.createAddr(Reg.rdx, -1176); inst.args.push(arg); arg = Arg.createTmp(Reg.rdx); 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); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); arg = Arg.createTmp(Reg.r15); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); arg = Arg.createTmp(Reg.rbx); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); arg = Arg.createTmp(Reg.rdx); inst.args.push(arg); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); 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); arg = Arg.createAddr(Reg.rcx, 0); inst.args.push(arg); arg = Arg.createImm(80); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); arg = Arg.createTmp(Reg.rbx); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); arg = Arg.createTmp(Reg.rdx); inst.args.push(arg); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); bb16.append(inst); inst = new Inst(Move); arg = Arg.createAddr(Reg.rcx, 8); 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(AboveOrEqual); inst.args.push(arg); arg = Arg.createTmp(Reg.rdx); inst.args.push(arg); arg = Arg.createAddr(Reg.rax, -8); inst.args.push(arg); arg = Arg.createTmp(Reg.rbx); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); arg = Arg.createTmp(Reg.rdx); inst.args.push(arg); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32}); bb16.append(inst); inst = new Inst(Move32); arg = Arg.createTmp(Reg.rdx); inst.args.push(arg); arg = Arg.createTmp(Reg.rdx); inst.args.push(arg); bb16.append(inst); inst = new Inst(Move); arg = Arg.createIndex(Reg.rax, Reg.rdx, 8, 0); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); bb16.append(inst); inst = new Inst(Move); arg = Arg.createImm(10); inst.args.push(arg); arg = Arg.createTmp(Reg.rdx); inst.args.push(arg); bb16.append(inst); inst = new Inst(MoveConditionallyTest64); arg = Arg.createResCond(NonZero); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createImm(-1); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createTmp(Reg.rdx); 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.createResCond(NonZero); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createTmp(Reg.r15); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createTmp(Reg.rbx); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createTmp(Reg.rbx); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); 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); arg = Arg.createAddr(Reg.rax, 5); inst.args.push(arg); arg = Arg.createImm(23); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createTmp(Reg.rbx); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createTmp(Reg.rbx); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 8}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 8}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); bb16.append(inst); inst = new Inst(Move); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createCallArg(8); inst.args.push(arg); bb16.append(inst); inst = new Inst(Move32); arg = Arg.createImm(2); inst.args.push(arg); arg = Arg.createCallArg(16); inst.args.push(arg); bb16.append(inst); inst = new Inst(Move); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); arg = Arg.createCallArg(24); inst.args.push(arg); bb16.append(inst); inst = new Inst(Move); arg = Arg.createTmp(Reg.rbx); inst.args.push(arg); arg = Arg.createCallArg(32); 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); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createCallArg(8); inst.args.push(arg); arg = Arg.createCallArg(16); inst.args.push(arg); arg = Arg.createCallArg(24); inst.args.push(arg); arg = Arg.createCallArg(32); inst.args.push(arg); arg = Arg.createTmp(Reg.r15); inst.args.push(arg); arg = Arg.createTmp(Reg.r14); inst.args.push(arg); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.extraEarlyClobberedRegs.add(Reg.r11); inst.extraClobberedRegs.add(Reg.rcx); inst.extraClobberedRegs.add(Reg.rdx); inst.extraClobberedRegs.add(Reg.rsi); inst.extraClobberedRegs.add(Reg.rdi); inst.extraClobberedRegs.add(Reg.r8); inst.extraClobberedRegs.add(Reg.r9); inst.extraClobberedRegs.add(Reg.r10); inst.extraClobberedRegs.add(Reg.r11); inst.extraClobberedRegs.add(Reg.xmm0); inst.extraClobberedRegs.add(Reg.xmm1); inst.extraClobberedRegs.add(Reg.xmm2); inst.extraClobberedRegs.add(Reg.xmm3); inst.extraClobberedRegs.add(Reg.xmm4); inst.extraClobberedRegs.add(Reg.xmm5); inst.extraClobberedRegs.add(Reg.xmm6); inst.extraClobberedRegs.add(Reg.xmm7); inst.extraClobberedRegs.add(Reg.xmm8); inst.extraClobberedRegs.add(Reg.xmm9); inst.extraClobberedRegs.add(Reg.xmm10); inst.extraClobberedRegs.add(Reg.xmm11); inst.extraClobberedRegs.add(Reg.xmm12); inst.extraClobberedRegs.add(Reg.xmm13); inst.extraClobberedRegs.add(Reg.xmm14); inst.extraClobberedRegs.add(Reg.xmm15); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Def, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); 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); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); bb16.append(inst); inst = new Inst(Move); arg = Arg.createAddr(Reg.rbx, 272); inst.args.push(arg); arg = Arg.createTmp(Reg.rdx); inst.args.push(arg); bb16.append(inst); inst = new Inst(Move); arg = Arg.createAddr(Reg.rbx, 280); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); bb16.append(inst); inst = new Inst(Move32); arg = Arg.createTmp(Reg.rdx); inst.args.push(arg); arg = Arg.createTmp(Reg.rdi); inst.args.push(arg); bb16.append(inst); inst = new Inst(Rshift32); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); arg = Arg.createTmp(Reg.rdi); inst.args.push(arg); bb16.append(inst); inst = new Inst(Move); arg = Arg.createAddr(Reg.rbx, 8); inst.args.push(arg); arg = Arg.createTmp(Reg.rsi); inst.args.push(arg); bb16.append(inst); inst = new Inst(Move); arg = Arg.createAddr(Reg.rsi, -1048); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); 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); arg = Arg.createTmp(Reg.rdi); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createTmp(Reg.rbx); inst.args.push(arg); arg = Arg.createTmp(Reg.rdi); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ZDef, type: GP, width: 32}); inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32}); inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 32}); bb16.append(inst); inst = new Inst(Add64); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createTmp(Reg.r14); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); bb16.append(inst); inst = new Inst(Move); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createAddr(Reg.rsi, -1048); inst.args.push(arg); bb16.append(inst); inst = new Inst(Move); arg = Arg.createAddr(Reg.rsi, -1072); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); bb16.append(inst); inst = new Inst(Branch64); arg = Arg.createRelCond(Below); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createTmp(Reg.r14); inst.args.push(arg); bb16.append(inst); bb17.successors.push(new FrequentedBlock(bb19, Normal)); bb17.predecessors.push(bb16); inst = new Inst(ConvertInt32ToDouble); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm0); inst.args.push(arg); bb17.append(inst); inst = new Inst(Jump); bb17.append(inst); bb18.successors.push(new FrequentedBlock(bb19, Normal)); bb18.predecessors.push(bb16); inst = new Inst(Add64); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createTmp(Reg.r14); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); bb18.append(inst); inst = new Inst(Move64ToDouble); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm0); inst.args.push(arg); bb18.append(inst); inst = new Inst(Jump); bb18.append(inst); bb19.successors.push(new FrequentedBlock(bb20, Normal)); bb19.successors.push(new FrequentedBlock(bb32, Normal)); bb19.predecessors.push(bb17); bb19.predecessors.push(bb18); inst = new Inst(ConvertInt32ToDouble); arg = Arg.createTmp(Reg.rdi); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm1); inst.args.push(arg); bb19.append(inst); inst = new Inst(AddDouble); arg = Arg.createTmp(Reg.xmm0); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm1); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm1); inst.args.push(arg); bb19.append(inst); inst = new Inst(MoveDoubleTo64); arg = Arg.createTmp(Reg.xmm1); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); bb19.append(inst); inst = new Inst(Move); arg = Arg.createBigImm(0, 65536); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); bb19.append(inst); inst = new Inst(Add64); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); bb19.append(inst); inst = new Inst(Move); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); arg = Arg.createAddr(Reg.rsi, -1072); inst.args.push(arg); bb19.append(inst); inst = new Inst(Move); arg = Arg.createAddr(Reg.rsi, -1080); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); 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); arg = Arg.createTmp(Reg.rdx); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createTmp(Reg.rbx); inst.args.push(arg); arg = Arg.createTmp(Reg.rbx); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); arg = Arg.createTmp(Reg.rdx); inst.args.push(arg); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ZDef, type: GP, width: 32}); inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32}); bb19.append(inst); inst = new Inst(Add64); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createTmp(Reg.r14); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); bb19.append(inst); inst = new Inst(Move); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createAddr(Reg.rsi, -1080); inst.args.push(arg); bb19.append(inst); inst = new Inst(BranchTest32); arg = Arg.createResCond(NonZero); inst.args.push(arg); arg = Arg.createAddr(Reg.rsi, -1104); inst.args.push(arg); arg = Arg.createImm(1); inst.args.push(arg); bb19.append(inst); bb20.successors.push(new FrequentedBlock(bb21, Normal)); bb20.successors.push(new FrequentedBlock(bb32, Normal)); bb20.predecessors.push(bb19); inst = new Inst(Move); arg = Arg.createAddr(Reg.rsi, -1096); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); 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); arg = Arg.createTmp(Reg.rdx); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createTmp(Reg.rdx); inst.args.push(arg); arg = Arg.createTmp(Reg.rbx); inst.args.push(arg); arg = Arg.createTmp(Reg.rbx); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createTmp(Reg.rdx); inst.args.push(arg); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ZDef, type: GP, width: 32}); inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32}); bb20.append(inst); inst = new Inst(Add64); arg = Arg.createTmp(Reg.rdx); inst.args.push(arg); arg = Arg.createTmp(Reg.r14); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); bb20.append(inst); inst = new Inst(Move); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createAddr(Reg.rsi, -1096); inst.args.push(arg); bb20.append(inst); inst = new Inst(Move); arg = Arg.createAddr(Reg.rsi, -1112); inst.args.push(arg); arg = Arg.createTmp(Reg.r11); inst.args.push(arg); bb20.append(inst); inst = new Inst(Branch32); arg = Arg.createRelCond(GreaterThanOrEqual); inst.args.push(arg); arg = Arg.createTmp(Reg.rdx); inst.args.push(arg); arg = Arg.createTmp(Reg.r11); inst.args.push(arg); bb20.append(inst); bb21.successors.push(new FrequentedBlock(bb23, Normal)); bb21.predecessors.push(bb20); inst = new Inst(Move); arg = Arg.createAddr(Reg.rbx, 344); inst.args.push(arg); arg = Arg.createTmp(Reg.r12); 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); arg = Arg.createAddr(Reg.r12, 0); inst.args.push(arg); arg = Arg.createImm(502); inst.args.push(arg); arg = Arg.createTmp(Reg.r12); inst.args.push(arg); arg = Arg.createTmp(Reg.rbx); inst.args.push(arg); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); bb21.append(inst); inst = new Inst(Move); arg = Arg.createAddr(Reg.r12, 16); inst.args.push(arg); arg = Arg.createTmp(Reg.rdi); inst.args.push(arg); bb21.append(inst); inst = new Inst(Move32); arg = Arg.createAddr(Reg.r12, 24); inst.args.push(arg); arg = Arg.createTmp(Reg.r9); 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); arg = Arg.createTmp(Reg.r9); inst.args.push(arg); arg = Arg.createImm(65286); inst.args.push(arg); arg = Arg.createTmp(Reg.rbx); inst.args.push(arg); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); bb21.append(inst); inst = new Inst(Move); arg = Arg.createAddr(Reg.rbx, 232); inst.args.push(arg); arg = Arg.createTmp(Reg.r10); inst.args.push(arg); bb21.append(inst); inst = new Inst(Move); arg = Arg.createAddr(Reg.rbx, 256); inst.args.push(arg); arg = Arg.createTmp(Reg.r8); inst.args.push(arg); bb21.append(inst); inst = new Inst(Jump); bb21.append(inst); bb22.successors.push(new FrequentedBlock(bb23, Normal)); bb22.predecessors.push(bb30); bb22.predecessors.push(bb31); bb22.predecessors.push(bb29); inst = new Inst(Move32); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); bb22.append(inst); inst = new Inst(Jump); bb22.append(inst); bb23.successors.push(new FrequentedBlock(bb25, Normal)); bb23.successors.push(new FrequentedBlock(bb24, Normal)); 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); arg = Arg.createTmp(Reg.r11); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createTmp(Reg.rbx); inst.args.push(arg); arg = Arg.createTmp(Reg.rbx); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createTmp(Reg.r11); inst.args.push(arg); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.UseZDef, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32}); bb23.append(inst); inst = new Inst(Move32); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); bb23.append(inst); inst = new Inst(Add64); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); arg = Arg.createTmp(Reg.r14); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); bb23.append(inst); inst = new Inst(Move); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); arg = Arg.createAddr(Reg.rsi, -1096); inst.args.push(arg); bb23.append(inst); inst = new Inst(Load8); arg = Arg.createAddr(Reg.rdi, 65285); inst.args.push(arg); arg = Arg.createTmp(Reg.rdx); inst.args.push(arg); bb23.append(inst); inst = new Inst(Move32); arg = Arg.createTmp(Reg.rdx); inst.args.push(arg); arg = Arg.createTmp(Reg.r13); 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); arg = Arg.createImm(1); inst.args.push(arg); arg = Arg.createTmp(Reg.r13); inst.args.push(arg); arg = Arg.createTmp(Reg.rbx); inst.args.push(arg); arg = Arg.createTmp(Reg.r12); inst.args.push(arg); arg = Arg.createTmp(Reg.rdx); inst.args.push(arg); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.UseZDef, type: GP, width: 32}); inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 32}); bb23.append(inst); inst = new Inst(Branch32); arg = Arg.createRelCond(BelowOrEqual); inst.args.push(arg); arg = Arg.createTmp(Reg.r9); inst.args.push(arg); arg = Arg.createImm(65285); inst.args.push(arg); bb23.append(inst); bb24.successors.push(new FrequentedBlock(bb26, Normal)); bb24.successors.push(new FrequentedBlock(bb30, Normal)); bb24.predecessors.push(bb23); inst = new Inst(Store8); arg = Arg.createTmp(Reg.r13); inst.args.push(arg); arg = Arg.createAddr(Reg.rdi, 65285); inst.args.push(arg); bb24.append(inst); inst = new Inst(Branch32); arg = Arg.createRelCond(Equal); inst.args.push(arg); arg = Arg.createTmp(Reg.r13); inst.args.push(arg); arg = Arg.createImm(256); inst.args.push(arg); bb24.append(inst); bb25.successors.push(new FrequentedBlock(bb26, Normal)); bb25.successors.push(new FrequentedBlock(bb30, Normal)); bb25.predecessors.push(bb23); inst = new Inst(Branch32); arg = Arg.createRelCond(Equal); inst.args.push(arg); arg = Arg.createTmp(Reg.r13); inst.args.push(arg); arg = Arg.createImm(256); inst.args.push(arg); bb25.append(inst); bb26.successors.push(new FrequentedBlock(bb28, Normal)); bb26.successors.push(new FrequentedBlock(bb27, Normal)); bb26.predecessors.push(bb24); bb26.predecessors.push(bb25); inst = new Inst(Load8); arg = Arg.createAddr(Reg.rdi, 65286); inst.args.push(arg); arg = Arg.createTmp(Reg.rdx); inst.args.push(arg); bb26.append(inst); inst = new Inst(Branch32); arg = Arg.createRelCond(BelowOrEqual); inst.args.push(arg); arg = Arg.createTmp(Reg.r9); inst.args.push(arg); arg = Arg.createImm(65285); inst.args.push(arg); bb26.append(inst); bb27.successors.push(new FrequentedBlock(bb28, Normal)); bb27.predecessors.push(bb26); inst = new Inst(Store8); arg = Arg.createTmp(Reg.rdx); inst.args.push(arg); arg = Arg.createAddr(Reg.rdi, 65285); inst.args.push(arg); bb27.append(inst); inst = new Inst(Jump); bb27.append(inst); bb28.successors.push(new FrequentedBlock(bb29, Normal)); bb28.successors.push(new FrequentedBlock(bb31, Normal)); bb28.predecessors.push(bb26); bb28.predecessors.push(bb27); inst = new Inst(Move); arg = Arg.createAddr(Reg.rbx, 248); inst.args.push(arg); arg = Arg.createTmp(Reg.rdx); inst.args.push(arg); bb28.append(inst); inst = new Inst(Or32); arg = Arg.createImm(4); inst.args.push(arg); arg = Arg.createTmp(Reg.rdx); inst.args.push(arg); bb28.append(inst); inst = new Inst(Move32); arg = Arg.createTmp(Reg.rdx); inst.args.push(arg); arg = Arg.createTmp(Reg.r13); inst.args.push(arg); bb28.append(inst); inst = new Inst(Add64); arg = Arg.createTmp(Reg.r13); inst.args.push(arg); arg = Arg.createTmp(Reg.r14); inst.args.push(arg); arg = Arg.createTmp(Reg.r13); inst.args.push(arg); bb28.append(inst); inst = new Inst(Move); arg = Arg.createTmp(Reg.r13); inst.args.push(arg); arg = Arg.createAddr(Reg.rbx, 248); inst.args.push(arg); bb28.append(inst); inst = new Inst(Move); arg = Arg.createImm(1); inst.args.push(arg); arg = Arg.createTmp(Reg.r13); inst.args.push(arg); bb28.append(inst); inst = new Inst(BranchTest64); arg = Arg.createResCond(NonZero); inst.args.push(arg); arg = Arg.createTmp(Reg.r10); inst.args.push(arg); arg = Arg.createTmp(Reg.r13); inst.args.push(arg); bb28.append(inst); bb29.successors.push(new FrequentedBlock(bb22, Normal)); bb29.successors.push(new FrequentedBlock(bb32, Normal)); bb29.predecessors.push(bb28); inst = new Inst(And32); arg = Arg.createTmp(Reg.rdx); inst.args.push(arg); arg = Arg.createTmp(Reg.r8); inst.args.push(arg); arg = Arg.createTmp(Reg.rdx); inst.args.push(arg); bb29.append(inst); inst = new Inst(And32); arg = Arg.createImm(31); inst.args.push(arg); arg = Arg.createTmp(Reg.rdx); inst.args.push(arg); bb29.append(inst); inst = new Inst(Add64); arg = Arg.createTmp(Reg.rdx); inst.args.push(arg); arg = Arg.createTmp(Reg.r14); inst.args.push(arg); arg = Arg.createTmp(Reg.rdx); inst.args.push(arg); bb29.append(inst); inst = new Inst(Move); arg = Arg.createTmp(Reg.rdx); inst.args.push(arg); arg = Arg.createAddr(Reg.rbx, 240); inst.args.push(arg); bb29.append(inst); inst = new Inst(Branch32); arg = Arg.createRelCond(GreaterThanOrEqual); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createTmp(Reg.r11); inst.args.push(arg); bb29.append(inst); bb30.successors.push(new FrequentedBlock(bb22, Normal)); bb30.successors.push(new FrequentedBlock(bb32, Normal)); bb30.predecessors.push(bb24); bb30.predecessors.push(bb25); inst = new Inst(Branch32); arg = Arg.createRelCond(GreaterThanOrEqual); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createTmp(Reg.r11); inst.args.push(arg); bb30.append(inst); bb31.successors.push(new FrequentedBlock(bb22, Normal)); bb31.successors.push(new FrequentedBlock(bb32, Normal)); bb31.predecessors.push(bb28); inst = new Inst(Branch32); arg = Arg.createRelCond(GreaterThanOrEqual); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createTmp(Reg.r11); inst.args.push(arg); bb31.append(inst); bb32.successors.push(new FrequentedBlock(bb33, Normal)); bb32.successors.push(new FrequentedBlock(bb34, Normal)); bb32.predecessors.push(bb19); bb32.predecessors.push(bb20); bb32.predecessors.push(bb30); bb32.predecessors.push(bb31); bb32.predecessors.push(bb29); inst = new Inst(Move); arg = Arg.createAddr(Reg.rsi, -1120); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); bb32.append(inst); inst = new Inst(Branch32); arg = Arg.createRelCond(GreaterThan); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createImm(0); inst.args.push(arg); 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); arg = Arg.createTmp(Reg.rbx); inst.args.push(arg); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); bb33.append(inst); inst = new Inst(Oops); bb33.append(inst); bb34.successors.push(new FrequentedBlock(bb36, Normal)); bb34.successors.push(new FrequentedBlock(bb35, Normal)); bb34.predecessors.push(bb32); inst = new Inst(Move); arg = Arg.createAddr(Reg.rbx, 136); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); bb34.append(inst); inst = new Inst(Branch64); arg = Arg.createRelCond(Below); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createTmp(Reg.r14); inst.args.push(arg); bb34.append(inst); bb35.successors.push(new FrequentedBlock(bb37, Normal)); bb35.successors.push(new FrequentedBlock(bb38, Normal)); bb35.predecessors.push(bb34); inst = new Inst(ConvertInt32ToDouble); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm0); inst.args.push(arg); bb35.append(inst); inst = new Inst(BranchDouble); arg = Arg.createDoubleCond(DoubleGreaterThanOrEqual); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm1); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm0); inst.args.push(arg); bb35.append(inst); bb36.successors.push(new FrequentedBlock(bb37, Normal)); bb36.successors.push(new FrequentedBlock(bb38, Normal)); bb36.predecessors.push(bb34); inst = new Inst(Add64); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createTmp(Reg.r14); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); bb36.append(inst); inst = new Inst(Move64ToDouble); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm0); inst.args.push(arg); bb36.append(inst); inst = new Inst(BranchDouble); arg = Arg.createDoubleCond(DoubleGreaterThanOrEqual); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm1); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm0); inst.args.push(arg); bb36.append(inst); bb37.successors.push(new FrequentedBlock(bb38, Normal)); bb37.predecessors.push(bb35); bb37.predecessors.push(bb36); inst = new Inst(Move); 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(286474592, 1); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); bb37.append(inst); inst = new Inst(Move); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); arg = Arg.createCallArg(8); inst.args.push(arg); bb37.append(inst); inst = new Inst(Move32); arg = Arg.createImm(1); inst.args.push(arg); arg = Arg.createCallArg(16); inst.args.push(arg); bb37.append(inst); inst = new Inst(Move); arg = Arg.createTmp(Reg.rbx); inst.args.push(arg); arg = Arg.createCallArg(24); 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); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createCallArg(8); inst.args.push(arg); arg = Arg.createCallArg(16); inst.args.push(arg); arg = Arg.createCallArg(24); inst.args.push(arg); arg = Arg.createTmp(Reg.r15); inst.args.push(arg); arg = Arg.createTmp(Reg.r14); inst.args.push(arg); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.extraEarlyClobberedRegs.add(Reg.r11); inst.extraClobberedRegs.add(Reg.rcx); inst.extraClobberedRegs.add(Reg.rdx); inst.extraClobberedRegs.add(Reg.rsi); inst.extraClobberedRegs.add(Reg.rdi); inst.extraClobberedRegs.add(Reg.r8); inst.extraClobberedRegs.add(Reg.r9); inst.extraClobberedRegs.add(Reg.r10); inst.extraClobberedRegs.add(Reg.r11); inst.extraClobberedRegs.add(Reg.xmm0); inst.extraClobberedRegs.add(Reg.xmm1); inst.extraClobberedRegs.add(Reg.xmm2); inst.extraClobberedRegs.add(Reg.xmm3); inst.extraClobberedRegs.add(Reg.xmm4); inst.extraClobberedRegs.add(Reg.xmm5); inst.extraClobberedRegs.add(Reg.xmm6); inst.extraClobberedRegs.add(Reg.xmm7); inst.extraClobberedRegs.add(Reg.xmm8); inst.extraClobberedRegs.add(Reg.xmm9); inst.extraClobberedRegs.add(Reg.xmm10); inst.extraClobberedRegs.add(Reg.xmm11); inst.extraClobberedRegs.add(Reg.xmm12); inst.extraClobberedRegs.add(Reg.xmm13); inst.extraClobberedRegs.add(Reg.xmm14); inst.extraClobberedRegs.add(Reg.xmm15); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Def, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); 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); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); bb37.append(inst); inst = new Inst(Jump); bb37.append(inst); bb38.successors.push(new FrequentedBlock(bb39, Normal)); bb38.successors.push(new FrequentedBlock(bb40, Normal)); bb38.predecessors.push(bb35); 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); arg = Arg.createAddr(Reg.rbx, 0); inst.args.push(arg); arg = Arg.createImm(881); inst.args.push(arg); arg = Arg.createTmp(Reg.rbx); inst.args.push(arg); arg = Arg.createTmp(Reg.rbx); inst.args.push(arg); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); bb38.append(inst); inst = new Inst(Move); arg = Arg.createAddr(Reg.rbx, 8); inst.args.push(arg); arg = Arg.createTmp(Reg.rdx); inst.args.push(arg); bb38.append(inst); inst = new Inst(Move); arg = Arg.createAddr(Reg.rdx, -1824); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); bb38.append(inst); inst = new Inst(Move32); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); 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); arg = Arg.createImm(1); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); arg = Arg.createTmp(Reg.rbx); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.UseZDef, type: GP, width: 32}); inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 32}); bb38.append(inst); inst = new Inst(Move32); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); bb38.append(inst); inst = new Inst(Add64); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createTmp(Reg.r14); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); bb38.append(inst); inst = new Inst(Move); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createAddr(Reg.rdx, -1824); inst.args.push(arg); bb38.append(inst); inst = new Inst(Move); arg = Arg.createAddr(Reg.rdx, -1832); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); bb38.append(inst); inst = new Inst(Branch32); arg = Arg.createRelCond(GreaterThan); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); bb38.append(inst); bb39.successors.push(new FrequentedBlock(bb42, Normal)); bb39.successors.push(new FrequentedBlock(bb3, Normal)); bb39.predecessors.push(bb38); inst = new Inst(Move); 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(286474592, 1); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); bb39.append(inst); inst = new Inst(Move); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); arg = Arg.createCallArg(8); inst.args.push(arg); bb39.append(inst); inst = new Inst(Move32); arg = Arg.createImm(1); inst.args.push(arg); arg = Arg.createCallArg(16); inst.args.push(arg); bb39.append(inst); inst = new Inst(Move); arg = Arg.createTmp(Reg.rbx); inst.args.push(arg); arg = Arg.createCallArg(24); 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); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createCallArg(8); inst.args.push(arg); arg = Arg.createCallArg(16); inst.args.push(arg); arg = Arg.createCallArg(24); inst.args.push(arg); arg = Arg.createTmp(Reg.r15); inst.args.push(arg); arg = Arg.createTmp(Reg.r14); inst.args.push(arg); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.extraEarlyClobberedRegs.add(Reg.r11); inst.extraClobberedRegs.add(Reg.rcx); inst.extraClobberedRegs.add(Reg.rdx); inst.extraClobberedRegs.add(Reg.rsi); inst.extraClobberedRegs.add(Reg.rdi); inst.extraClobberedRegs.add(Reg.r8); inst.extraClobberedRegs.add(Reg.r9); inst.extraClobberedRegs.add(Reg.r10); inst.extraClobberedRegs.add(Reg.r11); inst.extraClobberedRegs.add(Reg.xmm0); inst.extraClobberedRegs.add(Reg.xmm1); inst.extraClobberedRegs.add(Reg.xmm2); inst.extraClobberedRegs.add(Reg.xmm3); inst.extraClobberedRegs.add(Reg.xmm4); inst.extraClobberedRegs.add(Reg.xmm5); inst.extraClobberedRegs.add(Reg.xmm6); inst.extraClobberedRegs.add(Reg.xmm7); inst.extraClobberedRegs.add(Reg.xmm8); inst.extraClobberedRegs.add(Reg.xmm9); inst.extraClobberedRegs.add(Reg.xmm10); inst.extraClobberedRegs.add(Reg.xmm11); inst.extraClobberedRegs.add(Reg.xmm12); inst.extraClobberedRegs.add(Reg.xmm13); inst.extraClobberedRegs.add(Reg.xmm14); inst.extraClobberedRegs.add(Reg.xmm15); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Def, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); 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); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); bb39.append(inst); inst = new Inst(Move); arg = Arg.createAddr(Reg.rbx, 224); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); bb39.append(inst); inst = new Inst(Or32); arg = Arg.createImm(2); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); bb39.append(inst); inst = new Inst(Move32); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); bb39.append(inst); inst = new Inst(Add64); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createTmp(Reg.r14); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); bb39.append(inst); inst = new Inst(Move); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createAddr(Reg.rbx, 224); inst.args.push(arg); bb39.append(inst); inst = new Inst(Move); 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(287131344, 1); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); bb39.append(inst); inst = new Inst(Move); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); arg = Arg.createCallArg(8); inst.args.push(arg); bb39.append(inst); inst = new Inst(Move32); arg = Arg.createImm(1); inst.args.push(arg); arg = Arg.createCallArg(16); inst.args.push(arg); bb39.append(inst); inst = new Inst(Move); arg = Arg.createBigImm(287209728, 1); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); bb39.append(inst); inst = new Inst(Move); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); arg = Arg.createCallArg(24); 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); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createCallArg(8); inst.args.push(arg); arg = Arg.createCallArg(16); inst.args.push(arg); arg = Arg.createCallArg(24); inst.args.push(arg); arg = Arg.createTmp(Reg.r15); inst.args.push(arg); arg = Arg.createTmp(Reg.r14); inst.args.push(arg); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.extraEarlyClobberedRegs.add(Reg.r11); inst.extraClobberedRegs.add(Reg.rcx); inst.extraClobberedRegs.add(Reg.rdx); inst.extraClobberedRegs.add(Reg.rsi); inst.extraClobberedRegs.add(Reg.rdi); inst.extraClobberedRegs.add(Reg.r8); inst.extraClobberedRegs.add(Reg.r9); inst.extraClobberedRegs.add(Reg.r10); inst.extraClobberedRegs.add(Reg.r11); inst.extraClobberedRegs.add(Reg.xmm0); inst.extraClobberedRegs.add(Reg.xmm1); inst.extraClobberedRegs.add(Reg.xmm2); inst.extraClobberedRegs.add(Reg.xmm3); inst.extraClobberedRegs.add(Reg.xmm4); inst.extraClobberedRegs.add(Reg.xmm5); inst.extraClobberedRegs.add(Reg.xmm6); inst.extraClobberedRegs.add(Reg.xmm7); inst.extraClobberedRegs.add(Reg.xmm8); inst.extraClobberedRegs.add(Reg.xmm9); inst.extraClobberedRegs.add(Reg.xmm10); inst.extraClobberedRegs.add(Reg.xmm11); inst.extraClobberedRegs.add(Reg.xmm12); inst.extraClobberedRegs.add(Reg.xmm13); inst.extraClobberedRegs.add(Reg.xmm14); inst.extraClobberedRegs.add(Reg.xmm15); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Def, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); 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); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); bb39.append(inst); inst = new Inst(Move); arg = Arg.createAddr(Reg.rbx, 224); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); bb39.append(inst); inst = new Inst(BranchTest32); arg = Arg.createResCond(NonZero); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); bb39.append(inst); bb40.successors.push(new FrequentedBlock(bb42, Normal)); bb40.successors.push(new FrequentedBlock(bb3, Normal)); bb40.predecessors.push(bb38); inst = new Inst(Move); arg = Arg.createAddr(Reg.rbx, 224); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); bb40.append(inst); inst = new Inst(BranchTest32); arg = Arg.createResCond(NonZero); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); bb40.append(inst); bb41.predecessors.push(bb1); bb41.predecessors.push(bb2); inst = new Inst(Move); arg = Arg.createImm(10); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); bb41.append(inst); inst = new Inst(Ret64); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); bb41.append(inst); bb42.predecessors.push(bb40); bb42.predecessors.push(bb39); inst = new Inst(Move); arg = Arg.createImm(10); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); bb42.append(inst); inst = new Inst(Ret64); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); bb42.append(inst); return code; } "use strict"; // Generated by Air::dumpAsJS from gaussianBlur#A8vcYg in Kraken/imaging-gaussian-blur function createPayloadImagingGaussianBlurGaussianBlur() { let code = new Code(); let bb0 = code.addBlock(); let bb1 = code.addBlock(); let bb2 = code.addBlock(); let bb3 = code.addBlock(); let bb4 = code.addBlock(); let bb5 = code.addBlock(); let bb6 = code.addBlock(); let bb7 = code.addBlock(); let bb8 = code.addBlock(); let bb9 = code.addBlock(); let bb10 = code.addBlock(); let bb11 = code.addBlock(); let bb12 = code.addBlock(); let bb13 = code.addBlock(); let bb14 = code.addBlock(); let bb15 = code.addBlock(); let bb16 = code.addBlock(); let bb17 = code.addBlock(); let bb18 = code.addBlock(); let bb19 = code.addBlock(); let bb20 = code.addBlock(); let bb21 = code.addBlock(); let bb22 = code.addBlock(); let bb23 = code.addBlock(); let bb24 = code.addBlock(); let bb25 = code.addBlock(); let bb26 = code.addBlock(); let bb27 = code.addBlock(); let bb28 = code.addBlock(); let bb29 = code.addBlock(); let bb30 = code.addBlock(); let bb31 = code.addBlock(); let bb32 = code.addBlock(); let bb33 = code.addBlock(); let bb34 = code.addBlock(); let bb35 = code.addBlock(); let bb36 = code.addBlock(); let slot0 = code.addStackSlot(40, Locked); let slot1 = code.addStackSlot(8, Spill); let slot2 = code.addStackSlot(8, Spill); let slot3 = code.addStackSlot(4, Spill); 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); let tmp138 = code.newTmp(GP); let tmp137 = code.newTmp(GP); let tmp136 = code.newTmp(GP); let tmp135 = code.newTmp(GP); let tmp134 = code.newTmp(GP); let tmp133 = code.newTmp(GP); let tmp132 = code.newTmp(GP); let tmp131 = code.newTmp(GP); let tmp130 = code.newTmp(GP); let tmp129 = code.newTmp(GP); let tmp128 = code.newTmp(GP); let tmp127 = code.newTmp(GP); let tmp126 = code.newTmp(GP); let tmp125 = code.newTmp(GP); let tmp124 = code.newTmp(GP); let tmp123 = code.newTmp(GP); let tmp122 = code.newTmp(GP); let tmp121 = code.newTmp(GP); let tmp120 = code.newTmp(GP); let tmp119 = code.newTmp(GP); let tmp118 = code.newTmp(GP); let tmp117 = code.newTmp(GP); let tmp116 = code.newTmp(GP); let tmp115 = code.newTmp(GP); let tmp114 = code.newTmp(GP); let tmp113 = code.newTmp(GP); let tmp112 = code.newTmp(GP); let tmp111 = code.newTmp(GP); let tmp110 = code.newTmp(GP); let tmp109 = code.newTmp(GP); let tmp108 = code.newTmp(GP); let tmp107 = code.newTmp(GP); let tmp106 = code.newTmp(GP); let tmp105 = code.newTmp(GP); let tmp104 = code.newTmp(GP); let tmp103 = code.newTmp(GP); let tmp102 = code.newTmp(GP); let tmp101 = code.newTmp(GP); let tmp100 = code.newTmp(GP); let tmp99 = code.newTmp(GP); let tmp98 = code.newTmp(GP); let tmp97 = code.newTmp(GP); let tmp96 = code.newTmp(GP); let tmp95 = code.newTmp(GP); let tmp94 = code.newTmp(GP); let tmp93 = code.newTmp(GP); let tmp92 = code.newTmp(GP); let tmp91 = code.newTmp(GP); let tmp90 = code.newTmp(GP); let tmp89 = code.newTmp(GP); let tmp88 = code.newTmp(GP); let tmp87 = code.newTmp(GP); let tmp86 = code.newTmp(GP); let tmp85 = code.newTmp(GP); let tmp84 = code.newTmp(GP); let tmp83 = code.newTmp(GP); let tmp82 = code.newTmp(GP); let tmp81 = code.newTmp(GP); let tmp80 = code.newTmp(GP); let tmp79 = code.newTmp(GP); let tmp78 = code.newTmp(GP); let tmp77 = code.newTmp(GP); let tmp76 = code.newTmp(GP); let tmp75 = code.newTmp(GP); let tmp74 = code.newTmp(GP); let tmp73 = code.newTmp(GP); let tmp72 = code.newTmp(GP); let tmp71 = code.newTmp(GP); let tmp70 = code.newTmp(GP); let tmp69 = code.newTmp(GP); let tmp68 = code.newTmp(GP); let tmp67 = code.newTmp(GP); let tmp66 = code.newTmp(GP); let tmp65 = code.newTmp(GP); let tmp64 = code.newTmp(GP); let tmp63 = code.newTmp(GP); let tmp62 = code.newTmp(GP); let tmp61 = code.newTmp(GP); let tmp60 = code.newTmp(GP); let tmp59 = code.newTmp(GP); let tmp58 = code.newTmp(GP); let tmp57 = code.newTmp(GP); let tmp56 = code.newTmp(GP); let tmp55 = code.newTmp(GP); let tmp54 = code.newTmp(GP); let tmp53 = code.newTmp(GP); let tmp52 = code.newTmp(GP); let tmp51 = code.newTmp(GP); let tmp50 = code.newTmp(GP); let tmp49 = code.newTmp(GP); let tmp48 = code.newTmp(GP); let tmp47 = code.newTmp(GP); let tmp46 = code.newTmp(GP); let tmp45 = code.newTmp(GP); let tmp44 = code.newTmp(GP); let tmp43 = code.newTmp(GP); let tmp42 = code.newTmp(GP); let tmp41 = code.newTmp(GP); let tmp40 = code.newTmp(GP); let tmp39 = code.newTmp(GP); let tmp38 = code.newTmp(GP); let tmp37 = code.newTmp(GP); let tmp36 = code.newTmp(GP); let tmp35 = code.newTmp(GP); let tmp34 = code.newTmp(GP); let tmp33 = code.newTmp(GP); let tmp32 = code.newTmp(GP); let tmp31 = code.newTmp(GP); let tmp30 = code.newTmp(GP); let tmp29 = code.newTmp(GP); let tmp28 = code.newTmp(GP); let tmp27 = code.newTmp(GP); let tmp26 = code.newTmp(GP); let tmp25 = code.newTmp(GP); let tmp24 = code.newTmp(GP); let tmp23 = code.newTmp(GP); let tmp22 = code.newTmp(GP); let tmp21 = code.newTmp(GP); let tmp20 = code.newTmp(GP); let tmp19 = code.newTmp(GP); let tmp18 = code.newTmp(GP); let tmp17 = code.newTmp(GP); let tmp16 = code.newTmp(GP); let tmp15 = code.newTmp(GP); let tmp14 = code.newTmp(GP); let tmp13 = code.newTmp(GP); let tmp12 = code.newTmp(GP); let tmp11 = code.newTmp(GP); let tmp10 = code.newTmp(GP); let tmp9 = code.newTmp(GP); let tmp8 = code.newTmp(GP); let tmp7 = code.newTmp(GP); let tmp6 = code.newTmp(GP); let tmp5 = code.newTmp(GP); let tmp4 = code.newTmp(GP); let tmp3 = code.newTmp(GP); let tmp2 = code.newTmp(GP); let tmp1 = code.newTmp(GP); let tmp0 = code.newTmp(GP); let ftmp74 = code.newTmp(FP); let ftmp73 = code.newTmp(FP); let ftmp72 = code.newTmp(FP); let ftmp71 = code.newTmp(FP); let ftmp70 = code.newTmp(FP); let ftmp69 = code.newTmp(FP); let ftmp68 = code.newTmp(FP); let ftmp67 = code.newTmp(FP); let ftmp66 = code.newTmp(FP); let ftmp65 = code.newTmp(FP); let ftmp64 = code.newTmp(FP); let ftmp63 = code.newTmp(FP); let ftmp62 = code.newTmp(FP); let ftmp61 = code.newTmp(FP); let ftmp60 = code.newTmp(FP); let ftmp59 = code.newTmp(FP); let ftmp58 = code.newTmp(FP); let ftmp57 = code.newTmp(FP); let ftmp56 = code.newTmp(FP); let ftmp55 = code.newTmp(FP); let ftmp54 = code.newTmp(FP); let ftmp53 = code.newTmp(FP); let ftmp52 = code.newTmp(FP); let ftmp51 = code.newTmp(FP); let ftmp50 = code.newTmp(FP); let ftmp49 = code.newTmp(FP); let ftmp48 = code.newTmp(FP); let ftmp47 = code.newTmp(FP); let ftmp46 = code.newTmp(FP); let ftmp45 = code.newTmp(FP); let ftmp44 = code.newTmp(FP); let ftmp43 = code.newTmp(FP); let ftmp42 = code.newTmp(FP); let ftmp41 = code.newTmp(FP); let ftmp40 = code.newTmp(FP); let ftmp39 = code.newTmp(FP); let ftmp38 = code.newTmp(FP); let ftmp37 = code.newTmp(FP); let ftmp36 = code.newTmp(FP); let ftmp35 = code.newTmp(FP); let ftmp34 = code.newTmp(FP); let ftmp33 = code.newTmp(FP); let ftmp32 = code.newTmp(FP); let ftmp31 = code.newTmp(FP); let ftmp30 = code.newTmp(FP); let ftmp29 = code.newTmp(FP); let ftmp28 = code.newTmp(FP); let ftmp27 = code.newTmp(FP); let ftmp26 = code.newTmp(FP); let ftmp25 = code.newTmp(FP); let ftmp24 = code.newTmp(FP); let ftmp23 = code.newTmp(FP); let ftmp22 = code.newTmp(FP); let ftmp21 = code.newTmp(FP); let ftmp20 = code.newTmp(FP); let ftmp19 = code.newTmp(FP); let ftmp18 = code.newTmp(FP); let ftmp17 = code.newTmp(FP); let ftmp16 = code.newTmp(FP); let ftmp15 = code.newTmp(FP); let ftmp14 = code.newTmp(FP); let ftmp13 = code.newTmp(FP); let ftmp12 = code.newTmp(FP); let ftmp11 = code.newTmp(FP); let ftmp10 = code.newTmp(FP); let ftmp9 = code.newTmp(FP); let ftmp8 = code.newTmp(FP); let ftmp7 = code.newTmp(FP); let ftmp6 = code.newTmp(FP); let ftmp5 = code.newTmp(FP); let ftmp4 = code.newTmp(FP); let ftmp3 = code.newTmp(FP); let ftmp2 = code.newTmp(FP); let ftmp1 = code.newTmp(FP); let ftmp0 = code.newTmp(FP); let inst; let arg; bb0.successors.push(new FrequentedBlock(bb2, Normal)); bb0.successors.push(new FrequentedBlock(bb1, Rare)); inst = new Inst(Move); arg = Arg.createBigImm(144305904, 1); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); bb0.append(inst); inst = new Inst(Move); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createAddr(Reg.rbp, 16); 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); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.extraEarlyClobberedRegs.add(Reg.r11); inst.extraClobberedRegs.add(Reg.r11); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Scratch, type: GP, width: 64}); bb0.append(inst); inst = new Inst(Move); arg = Arg.createBigImm(142547168, 1); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); bb0.append(inst); inst = new Inst(Move); arg = Arg.createAddr(Reg.rax, 0); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); bb0.append(inst); inst = new Inst(Move); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createStack(slot5, 0); inst.args.push(arg); bb0.append(inst); inst = new Inst(Move); arg = Arg.createBigImm(142547184, 1); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); bb0.append(inst); inst = new Inst(Move); arg = Arg.createAddr(Reg.rax, 0); inst.args.push(arg); arg = Arg.createTmp(Reg.r12); inst.args.push(arg); bb0.append(inst); inst = new Inst(Move); arg = Arg.createBigImm(142547192, 1); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); bb0.append(inst); inst = new Inst(Move); arg = Arg.createAddr(Reg.rax, 0); inst.args.push(arg); arg = Arg.createTmp(Reg.rsi); inst.args.push(arg); bb0.append(inst); inst = new Inst(Move); arg = Arg.createBigImm(142547200, 1); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); bb0.append(inst); inst = new Inst(Move); arg = Arg.createAddr(Reg.rax, 0); inst.args.push(arg); arg = Arg.createTmp(Reg.rdx); inst.args.push(arg); bb0.append(inst); inst = new Inst(Move); arg = Arg.createBigImm(142547208, 1); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); bb0.append(inst); inst = new Inst(Move); arg = Arg.createAddr(Reg.rax, 0); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); bb0.append(inst); inst = new Inst(Move); arg = Arg.createBigImm(142547216, 1); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); bb0.append(inst); inst = new Inst(Move); arg = Arg.createAddr(Reg.rax, 0); inst.args.push(arg); arg = Arg.createTmp(Reg.r10); inst.args.push(arg); bb0.append(inst); inst = new Inst(Move); arg = Arg.createBigImm(142547224, 1); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); bb0.append(inst); inst = new Inst(Move); arg = Arg.createAddr(Reg.rax, 0); inst.args.push(arg); arg = Arg.createTmp(Reg.r11); inst.args.push(arg); bb0.append(inst); inst = new Inst(Move); arg = Arg.createBigImm(142547232, 1); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); bb0.append(inst); inst = new Inst(Move); arg = Arg.createAddr(Reg.rax, 0); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); bb0.append(inst); inst = new Inst(Move); arg = Arg.createBigImm(142547240, 1); inst.args.push(arg); arg = Arg.createTmp(Reg.rdi); inst.args.push(arg); bb0.append(inst); inst = new Inst(Move); arg = Arg.createAddr(Reg.rdi, 0); inst.args.push(arg); arg = Arg.createTmp(Reg.rbx); inst.args.push(arg); bb0.append(inst); inst = new Inst(Move); arg = Arg.createBigImm(0, -65536); inst.args.push(arg); arg = Arg.createTmp(Reg.rdi); inst.args.push(arg); bb0.append(inst); inst = new Inst(Add64); arg = Arg.createTmp(Reg.r12); inst.args.push(arg); arg = Arg.createTmp(Reg.rdi); inst.args.push(arg); arg = Arg.createTmp(Reg.r8); inst.args.push(arg); bb0.append(inst); inst = new Inst(Move64ToDouble); arg = Arg.createTmp(Reg.r8); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm2); inst.args.push(arg); bb0.append(inst); inst = new Inst(BranchDouble); arg = Arg.createDoubleCond(DoubleEqual); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm2); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm2); inst.args.push(arg); bb0.append(inst); 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); arg = Arg.createTmp(Reg.r12); inst.args.push(arg); arg = Arg.createTmp(Reg.rdi); inst.args.push(arg); arg = Arg.createTmp(Reg.r12); inst.args.push(arg); arg = Arg.createStack(slot5, 0); inst.args.push(arg); arg = Arg.createTmp(Reg.r12); inst.args.push(arg); arg = Arg.createTmp(Reg.rsi); inst.args.push(arg); arg = Arg.createTmp(Reg.rdx); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); arg = Arg.createTmp(Reg.r10); inst.args.push(arg); arg = Arg.createTmp(Reg.r11); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createTmp(Reg.rbx); inst.args.push(arg); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); bb1.append(inst); inst = new Inst(ConvertInt32ToDouble); arg = Arg.createTmp(Reg.r12); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm2); inst.args.push(arg); bb1.append(inst); inst = new Inst(Jump); bb1.append(inst); bb2.successors.push(new FrequentedBlock(bb4, Normal)); bb2.successors.push(new FrequentedBlock(bb3, Rare)); 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); arg = Arg.createTmp(Reg.rsi); inst.args.push(arg); arg = Arg.createTmp(Reg.rdi); inst.args.push(arg); arg = Arg.createTmp(Reg.rsi); inst.args.push(arg); arg = Arg.createStack(slot5, 0); inst.args.push(arg); arg = Arg.createTmp(Reg.r12); inst.args.push(arg); arg = Arg.createTmp(Reg.rsi); inst.args.push(arg); arg = Arg.createTmp(Reg.rdx); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); arg = Arg.createTmp(Reg.r10); inst.args.push(arg); arg = Arg.createTmp(Reg.r11); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createTmp(Reg.rbx); inst.args.push(arg); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); 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); arg = Arg.createTmp(Reg.rdx); inst.args.push(arg); arg = Arg.createTmp(Reg.rdi); inst.args.push(arg); arg = Arg.createTmp(Reg.rdx); inst.args.push(arg); arg = Arg.createStack(slot5, 0); inst.args.push(arg); arg = Arg.createTmp(Reg.r12); inst.args.push(arg); arg = Arg.createTmp(Reg.rsi); inst.args.push(arg); arg = Arg.createTmp(Reg.rdx); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); arg = Arg.createTmp(Reg.r10); inst.args.push(arg); arg = Arg.createTmp(Reg.r11); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createTmp(Reg.rbx); inst.args.push(arg); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); 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); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); arg = Arg.createTmp(Reg.rdi); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); arg = Arg.createStack(slot5, 0); inst.args.push(arg); arg = Arg.createTmp(Reg.r12); inst.args.push(arg); arg = Arg.createTmp(Reg.rsi); inst.args.push(arg); arg = Arg.createTmp(Reg.rdx); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); arg = Arg.createTmp(Reg.r10); inst.args.push(arg); arg = Arg.createTmp(Reg.r11); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createTmp(Reg.rbx); inst.args.push(arg); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); bb2.append(inst); inst = new Inst(Add64); arg = Arg.createTmp(Reg.r10); inst.args.push(arg); arg = Arg.createTmp(Reg.rdi); inst.args.push(arg); arg = Arg.createTmp(Reg.r8); inst.args.push(arg); bb2.append(inst); inst = new Inst(Move64ToDouble); arg = Arg.createTmp(Reg.r8); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm3); inst.args.push(arg); bb2.append(inst); inst = new Inst(BranchDouble); arg = Arg.createDoubleCond(DoubleEqual); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm3); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm3); inst.args.push(arg); bb2.append(inst); 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); arg = Arg.createTmp(Reg.r10); inst.args.push(arg); arg = Arg.createTmp(Reg.rdi); inst.args.push(arg); arg = Arg.createTmp(Reg.r10); inst.args.push(arg); arg = Arg.createStack(slot5, 0); inst.args.push(arg); arg = Arg.createTmp(Reg.r12); inst.args.push(arg); arg = Arg.createTmp(Reg.rsi); inst.args.push(arg); arg = Arg.createTmp(Reg.rdx); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); arg = Arg.createTmp(Reg.r10); inst.args.push(arg); arg = Arg.createTmp(Reg.r11); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createTmp(Reg.rbx); inst.args.push(arg); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); bb3.append(inst); inst = new Inst(ConvertInt32ToDouble); arg = Arg.createTmp(Reg.r10); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm3); inst.args.push(arg); bb3.append(inst); inst = new Inst(Jump); bb3.append(inst); bb4.successors.push(new FrequentedBlock(bb6, Normal)); bb4.successors.push(new FrequentedBlock(bb5, Rare)); bb4.predecessors.push(bb2); bb4.predecessors.push(bb3); inst = new Inst(Add64); arg = Arg.createTmp(Reg.r11); inst.args.push(arg); arg = Arg.createTmp(Reg.rdi); inst.args.push(arg); arg = Arg.createTmp(Reg.r8); inst.args.push(arg); bb4.append(inst); inst = new Inst(Move64ToDouble); arg = Arg.createTmp(Reg.r8); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm1); inst.args.push(arg); bb4.append(inst); inst = new Inst(BranchDouble); arg = Arg.createDoubleCond(DoubleEqual); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm1); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm1); inst.args.push(arg); bb4.append(inst); 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); arg = Arg.createTmp(Reg.r11); inst.args.push(arg); arg = Arg.createTmp(Reg.rdi); inst.args.push(arg); arg = Arg.createTmp(Reg.r11); inst.args.push(arg); arg = Arg.createStack(slot5, 0); inst.args.push(arg); arg = Arg.createTmp(Reg.r12); inst.args.push(arg); arg = Arg.createTmp(Reg.rsi); inst.args.push(arg); arg = Arg.createTmp(Reg.rdx); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); arg = Arg.createTmp(Reg.r10); inst.args.push(arg); arg = Arg.createTmp(Reg.r11); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createTmp(Reg.rbx); inst.args.push(arg); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); bb5.append(inst); inst = new Inst(ConvertInt32ToDouble); arg = Arg.createTmp(Reg.r11); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm1); inst.args.push(arg); bb5.append(inst); inst = new Inst(Jump); bb5.append(inst); bb6.successors.push(new FrequentedBlock(bb8, Normal)); bb6.successors.push(new FrequentedBlock(bb7, Rare)); 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); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createTmp(Reg.rdi); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createStack(slot5, 0); inst.args.push(arg); arg = Arg.createTmp(Reg.r12); inst.args.push(arg); arg = Arg.createTmp(Reg.rsi); inst.args.push(arg); arg = Arg.createTmp(Reg.rdx); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); arg = Arg.createTmp(Reg.r10); inst.args.push(arg); arg = Arg.createTmp(Reg.r11); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createTmp(Reg.rbx); inst.args.push(arg); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); bb6.append(inst); inst = new Inst(Add64); arg = Arg.createTmp(Reg.rbx); inst.args.push(arg); arg = Arg.createTmp(Reg.rdi); inst.args.push(arg); arg = Arg.createTmp(Reg.r8); inst.args.push(arg); bb6.append(inst); inst = new Inst(Move64ToDouble); arg = Arg.createTmp(Reg.r8); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm5); inst.args.push(arg); bb6.append(inst); inst = new Inst(BranchDouble); arg = Arg.createDoubleCond(DoubleEqual); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm5); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm5); inst.args.push(arg); bb6.append(inst); 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); arg = Arg.createTmp(Reg.rbx); inst.args.push(arg); arg = Arg.createTmp(Reg.rdi); inst.args.push(arg); arg = Arg.createTmp(Reg.rbx); inst.args.push(arg); arg = Arg.createStack(slot5, 0); inst.args.push(arg); arg = Arg.createTmp(Reg.r12); inst.args.push(arg); arg = Arg.createTmp(Reg.rsi); inst.args.push(arg); arg = Arg.createTmp(Reg.rdx); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); arg = Arg.createTmp(Reg.r10); inst.args.push(arg); arg = Arg.createTmp(Reg.r11); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createTmp(Reg.rbx); inst.args.push(arg); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); bb7.append(inst); inst = new Inst(ConvertInt32ToDouble); arg = Arg.createTmp(Reg.rbx); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm5); inst.args.push(arg); bb7.append(inst); inst = new Inst(Jump); bb7.append(inst); bb8.successors.push(new FrequentedBlock(bb10, Normal)); bb8.successors.push(new FrequentedBlock(bb9, Rare)); bb8.predecessors.push(bb6); bb8.predecessors.push(bb7); inst = new Inst(Move); arg = Arg.createBigImm(117076488, 1); inst.args.push(arg); arg = Arg.createTmp(Reg.r8); inst.args.push(arg); bb8.append(inst); inst = new Inst(Move); arg = Arg.createAddr(Reg.r8, 0); inst.args.push(arg); arg = Arg.createTmp(Reg.r9); inst.args.push(arg); bb8.append(inst); inst = new Inst(Add64); arg = Arg.createTmp(Reg.r9); inst.args.push(arg); arg = Arg.createTmp(Reg.rdi); inst.args.push(arg); arg = Arg.createTmp(Reg.r8); inst.args.push(arg); bb8.append(inst); inst = new Inst(Move64ToDouble); arg = Arg.createTmp(Reg.r8); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm6); inst.args.push(arg); bb8.append(inst); inst = new Inst(BranchDouble); arg = Arg.createDoubleCond(DoubleEqual); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm6); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm6); inst.args.push(arg); bb8.append(inst); 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); arg = Arg.createTmp(Reg.r9); inst.args.push(arg); arg = Arg.createTmp(Reg.rdi); inst.args.push(arg); arg = Arg.createTmp(Reg.r9); inst.args.push(arg); arg = Arg.createStack(slot5, 0); inst.args.push(arg); arg = Arg.createTmp(Reg.r12); inst.args.push(arg); arg = Arg.createTmp(Reg.rsi); inst.args.push(arg); arg = Arg.createTmp(Reg.rdx); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); arg = Arg.createTmp(Reg.r10); inst.args.push(arg); arg = Arg.createTmp(Reg.r11); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createTmp(Reg.rbx); inst.args.push(arg); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); bb9.append(inst); inst = new Inst(ConvertInt32ToDouble); arg = Arg.createTmp(Reg.r9); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm6); inst.args.push(arg); bb9.append(inst); inst = new Inst(Jump); bb9.append(inst); bb10.successors.push(new FrequentedBlock(bb18, Normal)); bb10.predecessors.push(bb8); bb10.predecessors.push(bb9); inst = new Inst(Move); arg = Arg.createBigImm(144506584, 1); inst.args.push(arg); arg = Arg.createTmp(Reg.rdi); inst.args.push(arg); bb10.append(inst); inst = new Inst(Move); arg = Arg.createAddr(Reg.rdi, 0); inst.args.push(arg); arg = Arg.createTmp(Reg.r9); inst.args.push(arg); bb10.append(inst); inst = new Inst(Move32); arg = Arg.createAddr(Reg.r9, -8); inst.args.push(arg); arg = Arg.createTmp(Reg.r8); inst.args.push(arg); bb10.append(inst); inst = new Inst(Move); 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); arg = Arg.createAddr(Reg.rdi, 0); inst.args.push(arg); arg = Arg.createImm(80); inst.args.push(arg); arg = Arg.createBigImm(144506544, 1); inst.args.push(arg); arg = Arg.createStack(slot5, 0); inst.args.push(arg); arg = Arg.createTmp(Reg.r12); inst.args.push(arg); arg = Arg.createTmp(Reg.rsi); inst.args.push(arg); arg = Arg.createTmp(Reg.rdx); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); arg = Arg.createTmp(Reg.r10); inst.args.push(arg); arg = Arg.createTmp(Reg.r11); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createTmp(Reg.rbx); inst.args.push(arg); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); bb10.append(inst); inst = new Inst(Move); arg = Arg.createBigImm(144506552, 1); inst.args.push(arg); arg = Arg.createTmp(Reg.rdi); inst.args.push(arg); bb10.append(inst); inst = new Inst(Move); arg = Arg.createAddr(Reg.rdi, 0); inst.args.push(arg); arg = Arg.createTmp(Reg.rdi); inst.args.push(arg); bb10.append(inst); inst = new Inst(Move); arg = Arg.createTmp(Reg.rdi); inst.args.push(arg); arg = Arg.createStack(slot2, 0); inst.args.push(arg); bb10.append(inst); inst = new Inst(Move); arg = Arg.createTmp(Reg.rdi); inst.args.push(arg); arg = Arg.createTmp(Reg.rdi); inst.args.push(arg); bb10.append(inst); inst = new Inst(Move32); arg = Arg.createAddr(Reg.rdi, -8); inst.args.push(arg); arg = Arg.createTmp(Reg.rdi); inst.args.push(arg); bb10.append(inst); inst = new Inst(Move32); arg = Arg.createTmp(Reg.rdi); inst.args.push(arg); arg = Arg.createStack(slot3, 0); inst.args.push(arg); bb10.append(inst); inst = new Inst(MoveZeroToDouble); arg = Arg.createTmp(Reg.xmm7); inst.args.push(arg); bb10.append(inst); inst = new Inst(Move); arg = Arg.createImm(10); inst.args.push(arg); arg = Arg.createStack(slot4, 0); inst.args.push(arg); bb10.append(inst); inst = new Inst(Move); arg = Arg.createBigImm(2, -65536); inst.args.push(arg); arg = Arg.createTmp(Reg.r10); inst.args.push(arg); bb10.append(inst); inst = new Inst(Jump); bb10.append(inst); bb11.successors.push(new FrequentedBlock(bb13, Normal)); bb11.predecessors.push(bb35); inst = new Inst(Move); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); bb11.append(inst); inst = new Inst(Move); arg = Arg.createImm(0); inst.args.push(arg); arg = Arg.createTmp(Reg.rdx); inst.args.push(arg); bb11.append(inst); inst = new Inst(Jump); bb11.append(inst); bb12.successors.push(new FrequentedBlock(bb13, Normal)); bb12.predecessors.push(bb34); inst = new Inst(Move32); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createTmp(Reg.rdx); inst.args.push(arg); bb12.append(inst); inst = new Inst(Jump); bb12.append(inst); bb13.successors.push(new FrequentedBlock(bb15, Normal)); bb13.predecessors.push(bb11); bb13.predecessors.push(bb12); inst = new Inst(Move); arg = Arg.createImm(-6); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); bb13.append(inst); inst = new Inst(MoveDouble); arg = Arg.createTmp(Reg.xmm7); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm1); inst.args.push(arg); bb13.append(inst); inst = new Inst(MoveDouble); arg = Arg.createTmp(Reg.xmm7); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm2); inst.args.push(arg); bb13.append(inst); inst = new Inst(MoveDouble); arg = Arg.createTmp(Reg.xmm7); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm3); inst.args.push(arg); bb13.append(inst); inst = new Inst(MoveDouble); arg = Arg.createTmp(Reg.xmm7); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm5); inst.args.push(arg); bb13.append(inst); inst = new Inst(Jump); bb13.append(inst); bb14.successors.push(new FrequentedBlock(bb15, Normal)); bb14.predecessors.push(bb31); inst = new Inst(Move32); arg = Arg.createTmp(Reg.rsi); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); bb14.append(inst); inst = new Inst(Jump); bb14.append(inst); bb15.successors.push(new FrequentedBlock(bb28, Normal)); bb15.successors.push(new FrequentedBlock(bb16, Normal)); 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); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); arg = Arg.createTmp(Reg.rsi); inst.args.push(arg); arg = Arg.createStack(slot5, 0); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm2); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); arg = Arg.createTmp(Reg.rdx); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm3); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm1); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm5); inst.args.push(arg); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ZDef, type: GP, width: 32}); inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.LateColdUse, type: FP, width: 64}); inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 32}); inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 32}); inst.patchArgData.push({role: Arg.LateColdUse, type: FP, width: 64}); inst.patchArgData.push({role: Arg.LateColdUse, type: FP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32}); inst.patchArgData.push({role: Arg.LateColdUse, type: FP, width: 64}); bb15.append(inst); inst = new Inst(Branch32); arg = Arg.createRelCond(LessThan); inst.args.push(arg); arg = Arg.createTmp(Reg.rsi); inst.args.push(arg); arg = Arg.createImm(0); inst.args.push(arg); bb15.append(inst); bb16.successors.push(new FrequentedBlock(bb29, Normal)); bb16.successors.push(new FrequentedBlock(bb17, Normal)); bb16.predecessors.push(bb15); inst = new Inst(Branch32); arg = Arg.createRelCond(GreaterThanOrEqual); inst.args.push(arg); arg = Arg.createTmp(Reg.rsi); inst.args.push(arg); arg = Arg.createImm(267); inst.args.push(arg); bb16.append(inst); bb17.successors.push(new FrequentedBlock(bb18, Normal)); bb17.predecessors.push(bb16); inst = new Inst(Move); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); arg = Arg.createTmp(Reg.rsi); inst.args.push(arg); bb17.append(inst); inst = new Inst(Move); arg = Arg.createImm(-6); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); bb17.append(inst); inst = new Inst(Jump); bb17.append(inst); bb18.successors.push(new FrequentedBlock(bb20, Normal)); bb18.successors.push(new FrequentedBlock(bb19, Rare)); bb18.predecessors.push(bb10); bb18.predecessors.push(bb17); inst = new Inst(Move); arg = Arg.createTmp(Reg.rsi); inst.args.push(arg); arg = Arg.createStack(slot1, 0); 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); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createTmp(Reg.rsi); inst.args.push(arg); arg = Arg.createTmp(Reg.rsi); inst.args.push(arg); arg = Arg.createStack(slot5, 0); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm2); inst.args.push(arg); arg = Arg.createStack(slot1, 0); inst.args.push(arg); arg = Arg.createTmp(Reg.rdx); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm3); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm1); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm5); inst.args.push(arg); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ZDef, type: GP, width: 32}); inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.LateColdUse, type: FP, width: 64}); inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 32}); inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 32}); inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 32}); inst.patchArgData.push({role: Arg.LateColdUse, type: FP, width: 64}); inst.patchArgData.push({role: Arg.LateColdUse, type: FP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32}); 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); arg = Arg.createTmp(Reg.rsi); inst.args.push(arg); arg = Arg.createImm(400); inst.args.push(arg); arg = Arg.createTmp(Reg.r11); inst.args.push(arg); arg = Arg.createStack(slot5, 0); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm2); inst.args.push(arg); arg = Arg.createStack(slot1, 0); inst.args.push(arg); arg = Arg.createTmp(Reg.rdx); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm3); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm1); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm5); inst.args.push(arg); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ZDef, type: GP, width: 32}); inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.LateColdUse, type: FP, width: 64}); inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 32}); inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 32}); inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 32}); inst.patchArgData.push({role: Arg.LateColdUse, type: FP, width: 64}); inst.patchArgData.push({role: Arg.LateColdUse, type: FP, width: 64}); inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 32}); inst.patchArgData.push({role: Arg.LateColdUse, type: FP, width: 64}); bb18.append(inst); inst = new Inst(BranchTest32); arg = Arg.createResCond(NonZero); inst.args.push(arg); arg = Arg.createTmp(Reg.r11); inst.args.push(arg); arg = Arg.createTmp(Reg.r11); inst.args.push(arg); bb18.append(inst); 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); arg = Arg.createTmp(Reg.rsi); inst.args.push(arg); arg = Arg.createImm(0); inst.args.push(arg); arg = Arg.createStack(slot5, 0); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm2); inst.args.push(arg); arg = Arg.createStack(slot1, 0); inst.args.push(arg); arg = Arg.createTmp(Reg.rdx); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm3); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm1); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm5); inst.args.push(arg); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: FP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ColdUse, type: FP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: FP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ColdUse, type: FP, width: 64}); bb19.append(inst); inst = new Inst(Jump); bb19.append(inst); bb20.successors.push(new FrequentedBlock(bb22, Normal)); bb20.predecessors.push(bb18); bb20.predecessors.push(bb19); inst = new Inst(Move32); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createTmp(Reg.rsi); inst.args.push(arg); bb20.append(inst); inst = new Inst(Rshift32); arg = Arg.createImm(31); inst.args.push(arg); arg = Arg.createTmp(Reg.rsi); inst.args.push(arg); bb20.append(inst); inst = new Inst(Add32); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createTmp(Reg.rsi); inst.args.push(arg); arg = Arg.createTmp(Reg.rdi); inst.args.push(arg); bb20.append(inst); inst = new Inst(Xor32); arg = Arg.createTmp(Reg.rsi); inst.args.push(arg); arg = Arg.createTmp(Reg.rdi); inst.args.push(arg); arg = Arg.createTmp(Reg.rdi); 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); arg = Arg.createTmp(Reg.rdi); inst.args.push(arg); arg = Arg.createImm(0); inst.args.push(arg); arg = Arg.createStack(slot5, 0); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm2); inst.args.push(arg); arg = Arg.createStack(slot1, 0); inst.args.push(arg); arg = Arg.createTmp(Reg.rdx); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm3); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm1); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm5); inst.args.push(arg); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: FP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ColdUse, type: FP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: FP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32}); 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); arg = Arg.createTmp(Reg.rdi); inst.args.push(arg); arg = Arg.createStack(slot3, 0); inst.args.push(arg); arg = Arg.createStack(slot5, 0); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm2); inst.args.push(arg); arg = Arg.createStack(slot1, 0); inst.args.push(arg); arg = Arg.createTmp(Reg.rdx); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm3); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm1); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm5); inst.args.push(arg); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: FP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ColdUse, type: FP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: FP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ColdUse, type: FP, width: 64}); bb20.append(inst); inst = new Inst(Move); arg = Arg.createStack(slot2, 0); inst.args.push(arg); arg = Arg.createTmp(Reg.rsi); inst.args.push(arg); bb20.append(inst); inst = new Inst(Move); arg = Arg.createIndex(Reg.rsi, Reg.rdi, 8, 0); inst.args.push(arg); arg = Arg.createTmp(Reg.rsi); inst.args.push(arg); bb20.append(inst); inst = new Inst(Move); arg = Arg.createImm(10); inst.args.push(arg); arg = Arg.createTmp(Reg.rdi); inst.args.push(arg); bb20.append(inst); inst = new Inst(MoveConditionallyTest64); arg = Arg.createResCond(NonZero); inst.args.push(arg); arg = Arg.createTmp(Reg.rsi); inst.args.push(arg); arg = Arg.createImm(-1); inst.args.push(arg); arg = Arg.createTmp(Reg.rsi); inst.args.push(arg); arg = Arg.createTmp(Reg.rdi); inst.args.push(arg); arg = Arg.createTmp(Reg.rdi); 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); arg = Arg.createTmp(Reg.rdi); inst.args.push(arg); arg = Arg.createTmp(Reg.r10); inst.args.push(arg); arg = Arg.createTmp(Reg.rdi); inst.args.push(arg); arg = Arg.createStack(slot5, 0); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm2); inst.args.push(arg); arg = Arg.createStack(slot1, 0); inst.args.push(arg); arg = Arg.createTmp(Reg.rdx); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm3); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm1); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm5); inst.args.push(arg); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: FP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ColdUse, type: FP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: FP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32}); 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); arg = Arg.createAddr(Reg.rdi, 0); inst.args.push(arg); arg = Arg.createImm(79); inst.args.push(arg); arg = Arg.createTmp(Reg.rdi); inst.args.push(arg); arg = Arg.createStack(slot5, 0); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm2); inst.args.push(arg); arg = Arg.createStack(slot1, 0); inst.args.push(arg); arg = Arg.createTmp(Reg.rdx); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm3); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm1); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm5); inst.args.push(arg); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: FP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ColdUse, type: FP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: FP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ColdUse, type: FP, width: 64}); bb20.append(inst); inst = new Inst(Move); arg = Arg.createAddr(Reg.rdi, 8); inst.args.push(arg); arg = Arg.createTmp(Reg.r12); inst.args.push(arg); bb20.append(inst); inst = new Inst(Move32); arg = Arg.createAddr(Reg.r12, -8); inst.args.push(arg); arg = Arg.createTmp(Reg.r13); inst.args.push(arg); bb20.append(inst); inst = new Inst(Jump); bb20.append(inst); bb21.successors.push(new FrequentedBlock(bb22, Normal)); bb21.predecessors.push(bb27); inst = new Inst(Move32); arg = Arg.createTmp(Reg.rsi); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); bb21.append(inst); inst = new Inst(Jump); bb21.append(inst); bb22.successors.push(new FrequentedBlock(bb25, Normal)); bb22.successors.push(new FrequentedBlock(bb23, Normal)); 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); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); arg = Arg.createTmp(Reg.rdx); inst.args.push(arg); arg = Arg.createTmp(Reg.rsi); inst.args.push(arg); arg = Arg.createStack(slot5, 0); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm2); inst.args.push(arg); arg = Arg.createStack(slot1, 0); inst.args.push(arg); arg = Arg.createTmp(Reg.rdx); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm3); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm1); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm5); inst.args.push(arg); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ZDef, type: GP, width: 32}); inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.LateColdUse, type: FP, width: 64}); inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 32}); inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32}); inst.patchArgData.push({role: Arg.LateColdUse, type: FP, width: 64}); inst.patchArgData.push({role: Arg.LateColdUse, type: FP, width: 64}); inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 32}); inst.patchArgData.push({role: Arg.LateColdUse, type: FP, width: 64}); bb22.append(inst); inst = new Inst(Branch32); arg = Arg.createRelCond(LessThan); inst.args.push(arg); arg = Arg.createTmp(Reg.rsi); inst.args.push(arg); arg = Arg.createImm(0); inst.args.push(arg); bb22.append(inst); bb23.successors.push(new FrequentedBlock(bb26, Normal)); bb23.successors.push(new FrequentedBlock(bb24, Normal)); bb23.predecessors.push(bb22); inst = new Inst(Branch32); arg = Arg.createRelCond(GreaterThanOrEqual); inst.args.push(arg); arg = Arg.createTmp(Reg.rsi); inst.args.push(arg); arg = Arg.createImm(400); inst.args.push(arg); bb23.append(inst); 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); arg = Arg.createTmp(Reg.r11); inst.args.push(arg); arg = Arg.createTmp(Reg.rsi); inst.args.push(arg); arg = Arg.createTmp(Reg.rbx); inst.args.push(arg); arg = Arg.createStack(slot5, 0); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm2); inst.args.push(arg); arg = Arg.createStack(slot1, 0); inst.args.push(arg); arg = Arg.createTmp(Reg.rdx); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm3); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm5); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm1); inst.args.push(arg); arg = Arg.createTmp(Reg.r11); inst.args.push(arg); arg = Arg.createTmp(Reg.rsi); inst.args.push(arg); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ZDef, type: GP, width: 32}); inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.LateColdUse, type: FP, width: 64}); inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 32}); inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 32}); inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 32}); inst.patchArgData.push({role: Arg.LateColdUse, type: FP, width: 64}); inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 32}); inst.patchArgData.push({role: Arg.LateColdUse, type: FP, width: 64}); inst.patchArgData.push({role: Arg.LateColdUse, type: FP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32}); 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); arg = Arg.createTmp(Reg.rbx); inst.args.push(arg); arg = Arg.createImm(4); inst.args.push(arg); arg = Arg.createTmp(Reg.r15); inst.args.push(arg); arg = Arg.createStack(slot5, 0); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm2); inst.args.push(arg); arg = Arg.createStack(slot1, 0); inst.args.push(arg); arg = Arg.createTmp(Reg.rdx); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm3); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm5); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm1); inst.args.push(arg); arg = Arg.createTmp(Reg.rbx); inst.args.push(arg); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ZDef, type: GP, width: 32}); inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.LateColdUse, type: FP, width: 64}); inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 32}); inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 32}); inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 32}); inst.patchArgData.push({role: Arg.LateColdUse, type: FP, width: 64}); inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 32}); inst.patchArgData.push({role: Arg.LateColdUse, type: FP, width: 64}); inst.patchArgData.push({role: Arg.LateColdUse, type: FP, width: 64}); inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 32}); bb24.append(inst); inst = new Inst(Add32); arg = Arg.createImm(3); inst.args.push(arg); arg = Arg.createTmp(Reg.r15); inst.args.push(arg); arg = Arg.createTmp(Reg.r14); 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); arg = Arg.createTmp(Reg.r15); inst.args.push(arg); arg = Arg.createTmp(Reg.r8); inst.args.push(arg); arg = Arg.createStack(slot5, 0); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm2); inst.args.push(arg); arg = Arg.createStack(slot1, 0); inst.args.push(arg); arg = Arg.createTmp(Reg.rdx); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm3); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm5); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm1); inst.args.push(arg); arg = Arg.createTmp(Reg.r15); inst.args.push(arg); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: FP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ColdUse, type: FP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ColdUse, type: FP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: FP, width: 64}); 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); arg = Arg.createTmp(Reg.r14); inst.args.push(arg); arg = Arg.createTmp(Reg.r8); inst.args.push(arg); arg = Arg.createStack(slot5, 0); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm2); inst.args.push(arg); arg = Arg.createStack(slot1, 0); inst.args.push(arg); arg = Arg.createTmp(Reg.rdx); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm3); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm5); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm1); inst.args.push(arg); arg = Arg.createTmp(Reg.r15); inst.args.push(arg); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: FP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ColdUse, type: FP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ColdUse, type: FP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: FP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32}); bb24.append(inst); inst = new Inst(MoveDouble); arg = Arg.createIndex(Reg.r9, Reg.r15, 8, 0); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm0); inst.args.push(arg); bb24.append(inst); inst = new Inst(Move32); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); arg = Arg.createTmp(Reg.rsi); inst.args.push(arg); bb24.append(inst); inst = new Inst(Rshift32); arg = Arg.createImm(31); inst.args.push(arg); arg = Arg.createTmp(Reg.rsi); inst.args.push(arg); bb24.append(inst); inst = new Inst(Add32); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); arg = Arg.createTmp(Reg.rsi); inst.args.push(arg); arg = Arg.createTmp(Reg.rbx); inst.args.push(arg); bb24.append(inst); inst = new Inst(Xor32); arg = Arg.createTmp(Reg.rsi); inst.args.push(arg); arg = Arg.createTmp(Reg.rbx); inst.args.push(arg); arg = Arg.createTmp(Reg.rbx); 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); arg = Arg.createTmp(Reg.rbx); inst.args.push(arg); arg = Arg.createImm(0); inst.args.push(arg); arg = Arg.createStack(slot5, 0); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm2); inst.args.push(arg); arg = Arg.createStack(slot1, 0); inst.args.push(arg); arg = Arg.createTmp(Reg.rdx); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm3); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm5); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm1); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm0); inst.args.push(arg); arg = Arg.createTmp(Reg.rdi); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: FP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ColdUse, type: FP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ColdUse, type: FP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: FP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: FP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); 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); arg = Arg.createTmp(Reg.rbx); inst.args.push(arg); arg = Arg.createTmp(Reg.r13); inst.args.push(arg); arg = Arg.createStack(slot5, 0); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm2); inst.args.push(arg); arg = Arg.createStack(slot1, 0); inst.args.push(arg); arg = Arg.createTmp(Reg.rdx); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm3); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm5); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm1); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm0); inst.args.push(arg); arg = Arg.createTmp(Reg.rdi); inst.args.push(arg); arg = Arg.createTmp(Reg.rbx); inst.args.push(arg); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: FP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ColdUse, type: FP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ColdUse, type: FP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: FP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: FP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32}); bb24.append(inst); inst = new Inst(MoveDouble); arg = Arg.createIndex(Reg.r12, Reg.rbx, 8, 0); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm4); inst.args.push(arg); bb24.append(inst); inst = new Inst(MulDouble); arg = Arg.createTmp(Reg.xmm0); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm4); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm0); inst.args.push(arg); bb24.append(inst); inst = new Inst(AddDouble); arg = Arg.createTmp(Reg.xmm1); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm0); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm1); inst.args.push(arg); bb24.append(inst); inst = new Inst(Add32); arg = Arg.createImm(1); inst.args.push(arg); arg = Arg.createTmp(Reg.r15); inst.args.push(arg); arg = Arg.createTmp(Reg.rsi); inst.args.push(arg); bb24.append(inst); inst = new Inst(MulDouble); arg = Arg.createIndex(Reg.r9, Reg.rsi, 8, 0); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm4); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm0); inst.args.push(arg); bb24.append(inst); inst = new Inst(AddDouble); arg = Arg.createTmp(Reg.xmm2); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm0); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm2); inst.args.push(arg); bb24.append(inst); inst = new Inst(Add32); arg = Arg.createImm(2); inst.args.push(arg); arg = Arg.createTmp(Reg.r15); inst.args.push(arg); arg = Arg.createTmp(Reg.r15); inst.args.push(arg); bb24.append(inst); inst = new Inst(MulDouble); arg = Arg.createIndex(Reg.r9, Reg.r15, 8, 0); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm4); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm0); inst.args.push(arg); bb24.append(inst); inst = new Inst(AddDouble); arg = Arg.createTmp(Reg.xmm3); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm0); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm3); inst.args.push(arg); bb24.append(inst); inst = new Inst(MulDouble); arg = Arg.createIndex(Reg.r9, Reg.r14, 8, 0); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm4); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm4); inst.args.push(arg); bb24.append(inst); inst = new Inst(AddDouble); arg = Arg.createTmp(Reg.xmm5); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm4); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm5); inst.args.push(arg); bb24.append(inst); inst = new Inst(Jump); bb24.append(inst); bb25.successors.push(new FrequentedBlock(bb27, Normal)); bb25.predecessors.push(bb22); inst = new Inst(Jump); bb25.append(inst); bb26.successors.push(new FrequentedBlock(bb27, Normal)); bb26.predecessors.push(bb23); inst = new Inst(Jump); bb26.append(inst); bb27.successors.push(new FrequentedBlock(bb21, Normal)); bb27.successors.push(new FrequentedBlock(bb30, Normal)); bb27.predecessors.push(bb24); bb27.predecessors.push(bb26); bb27.predecessors.push(bb25); inst = new Inst(Move32); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); arg = Arg.createTmp(Reg.rsi); 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); arg = Arg.createImm(1); inst.args.push(arg); arg = Arg.createTmp(Reg.rsi); inst.args.push(arg); arg = Arg.createStack(slot5, 0); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm2); inst.args.push(arg); arg = Arg.createStack(slot1, 0); inst.args.push(arg); arg = Arg.createTmp(Reg.rdx); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm3); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm1); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm5); inst.args.push(arg); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.UseZDef, type: GP, width: 32}); inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.LateColdUse, type: FP, width: 64}); inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 32}); inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 32}); inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 32}); inst.patchArgData.push({role: Arg.LateColdUse, type: FP, width: 64}); inst.patchArgData.push({role: Arg.LateColdUse, type: FP, width: 64}); inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 32}); inst.patchArgData.push({role: Arg.LateColdUse, type: FP, width: 64}); bb27.append(inst); inst = new Inst(Branch32); arg = Arg.createRelCond(LessThan); inst.args.push(arg); arg = Arg.createTmp(Reg.rsi); inst.args.push(arg); arg = Arg.createImm(7); inst.args.push(arg); bb27.append(inst); bb28.successors.push(new FrequentedBlock(bb31, Normal)); bb28.predecessors.push(bb15); inst = new Inst(Jump); bb28.append(inst); bb29.successors.push(new FrequentedBlock(bb31, Normal)); bb29.predecessors.push(bb16); inst = new Inst(Jump); bb29.append(inst); bb30.successors.push(new FrequentedBlock(bb31, Normal)); bb30.predecessors.push(bb27); inst = new Inst(Move); arg = Arg.createStack(slot1, 0); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); bb30.append(inst); inst = new Inst(Jump); bb30.append(inst); bb31.successors.push(new FrequentedBlock(bb14, Normal)); bb31.successors.push(new FrequentedBlock(bb32, Normal)); bb31.predecessors.push(bb30); bb31.predecessors.push(bb29); bb31.predecessors.push(bb28); inst = new Inst(Move32); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createTmp(Reg.rsi); 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); arg = Arg.createImm(1); inst.args.push(arg); arg = Arg.createTmp(Reg.rsi); inst.args.push(arg); arg = Arg.createStack(slot5, 0); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm2); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); arg = Arg.createTmp(Reg.rdx); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm3); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm1); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm5); inst.args.push(arg); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.UseZDef, type: GP, width: 32}); inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.LateColdUse, type: FP, width: 64}); inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 32}); inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 32}); inst.patchArgData.push({role: Arg.LateColdUse, type: FP, width: 64}); inst.patchArgData.push({role: Arg.LateColdUse, type: FP, width: 64}); inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 32}); inst.patchArgData.push({role: Arg.LateColdUse, type: FP, width: 64}); bb31.append(inst); inst = new Inst(Branch32); arg = Arg.createRelCond(LessThan); inst.args.push(arg); arg = Arg.createTmp(Reg.rsi); inst.args.push(arg); arg = Arg.createImm(7); inst.args.push(arg); bb31.append(inst); bb32.successors.push(new FrequentedBlock(bb34, Normal)); 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); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); arg = Arg.createImm(400); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createStack(slot5, 0); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm2); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); arg = Arg.createTmp(Reg.rdx); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm3); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm1); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm5); inst.args.push(arg); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ZDef, type: GP, width: 32}); inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.LateColdUse, type: FP, width: 64}); inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 32}); inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 32}); inst.patchArgData.push({role: Arg.LateColdUse, type: FP, width: 64}); inst.patchArgData.push({role: Arg.LateColdUse, type: FP, width: 64}); inst.patchArgData.push({role: Arg.LateColdUse, type: FP, width: 64}); bb32.append(inst); inst = new Inst(BranchTest32); arg = Arg.createResCond(NonZero); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); bb32.append(inst); 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); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); arg = Arg.createImm(0); inst.args.push(arg); arg = Arg.createStack(slot5, 0); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm2); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); arg = Arg.createTmp(Reg.rdx); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm3); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm1); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm5); inst.args.push(arg); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: FP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ColdUse, type: FP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: FP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: FP, width: 64}); bb33.append(inst); inst = new Inst(Jump); bb33.append(inst); bb34.successors.push(new FrequentedBlock(bb12, Normal)); bb34.successors.push(new FrequentedBlock(bb35, Normal)); 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); arg = Arg.createTmp(Reg.rdx); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createTmp(Reg.rdi); inst.args.push(arg); arg = Arg.createStack(slot5, 0); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm2); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); arg = Arg.createTmp(Reg.rdx); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm3); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm1); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm5); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ZDef, type: GP, width: 32}); inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.LateColdUse, type: FP, width: 64}); inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32}); inst.patchArgData.push({role: Arg.LateColdUse, type: FP, width: 64}); inst.patchArgData.push({role: Arg.LateColdUse, type: FP, width: 64}); inst.patchArgData.push({role: Arg.LateColdUse, type: FP, width: 64}); 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); arg = Arg.createTmp(Reg.rdi); inst.args.push(arg); arg = Arg.createImm(4); inst.args.push(arg); arg = Arg.createTmp(Reg.rsi); inst.args.push(arg); arg = Arg.createStack(slot5, 0); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm2); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); arg = Arg.createTmp(Reg.rdx); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm3); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm1); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm5); inst.args.push(arg); arg = Arg.createTmp(Reg.rdi); inst.args.push(arg); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ZDef, type: GP, width: 32}); inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.LateColdUse, type: FP, width: 64}); inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 32}); inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 32}); inst.patchArgData.push({role: Arg.LateColdUse, type: FP, width: 64}); inst.patchArgData.push({role: Arg.LateColdUse, type: FP, width: 64}); inst.patchArgData.push({role: Arg.LateColdUse, type: FP, width: 64}); inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 32}); bb34.append(inst); inst = new Inst(DivDouble); arg = Arg.createTmp(Reg.xmm6); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm1); 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); arg = Arg.createTmp(Reg.rsi); inst.args.push(arg); arg = Arg.createTmp(Reg.r8); inst.args.push(arg); arg = Arg.createStack(slot5, 0); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm2); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); arg = Arg.createTmp(Reg.rdx); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm3); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm5); inst.args.push(arg); arg = Arg.createTmp(Reg.rsi); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm1); inst.args.push(arg); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: FP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ColdUse, type: FP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: FP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32}); 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); arg = Arg.createTmp(Reg.xmm1); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm1); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm1); inst.args.push(arg); arg = Arg.createStack(slot5, 0); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm2); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); arg = Arg.createTmp(Reg.rdx); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm3); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm5); inst.args.push(arg); arg = Arg.createTmp(Reg.rsi); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm1); inst.args.push(arg); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: FP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: FP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: FP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: FP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ColdUse, type: FP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: FP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ColdUse, type: FP, width: 64}); bb34.append(inst); inst = new Inst(MoveDouble); arg = Arg.createTmp(Reg.xmm1); inst.args.push(arg); arg = Arg.createIndex(Reg.r9, Reg.rsi, 8, 0); inst.args.push(arg); bb34.append(inst); inst = new Inst(Move32); arg = Arg.createTmp(Reg.rsi); inst.args.push(arg); arg = Arg.createTmp(Reg.rdi); 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); arg = Arg.createImm(1); inst.args.push(arg); arg = Arg.createTmp(Reg.rdi); inst.args.push(arg); arg = Arg.createStack(slot5, 0); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm2); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); arg = Arg.createTmp(Reg.rdx); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm3); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm5); inst.args.push(arg); arg = Arg.createTmp(Reg.rsi); inst.args.push(arg); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.UseZDef, type: GP, width: 32}); inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.LateColdUse, type: FP, width: 64}); inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 32}); inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 32}); inst.patchArgData.push({role: Arg.LateColdUse, type: FP, width: 64}); inst.patchArgData.push({role: Arg.LateColdUse, type: FP, width: 64}); inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 32}); bb34.append(inst); inst = new Inst(DivDouble); arg = Arg.createTmp(Reg.xmm6); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm2); inst.args.push(arg); bb34.append(inst); inst = new Inst(Add32); arg = Arg.createImm(1); inst.args.push(arg); arg = Arg.createTmp(Reg.rsi); inst.args.push(arg); arg = Arg.createTmp(Reg.r11); inst.args.push(arg); bb34.append(inst); inst = new Inst(Add32); arg = Arg.createImm(3); inst.args.push(arg); arg = Arg.createTmp(Reg.rsi); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); 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); arg = Arg.createTmp(Reg.r11); inst.args.push(arg); arg = Arg.createTmp(Reg.r8); inst.args.push(arg); arg = Arg.createStack(slot5, 0); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); arg = Arg.createTmp(Reg.rdx); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm3); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm5); inst.args.push(arg); arg = Arg.createTmp(Reg.rdi); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm2); inst.args.push(arg); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ColdUse, type: FP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: FP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32}); 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); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createTmp(Reg.r8); inst.args.push(arg); arg = Arg.createStack(slot5, 0); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); arg = Arg.createTmp(Reg.rdx); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm3); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm5); inst.args.push(arg); arg = Arg.createTmp(Reg.rdi); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm2); inst.args.push(arg); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ColdUse, type: FP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: FP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32}); 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); arg = Arg.createTmp(Reg.xmm2); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm2); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm2); inst.args.push(arg); arg = Arg.createStack(slot5, 0); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); arg = Arg.createTmp(Reg.rdx); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm3); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm5); inst.args.push(arg); arg = Arg.createTmp(Reg.rdi); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm2); inst.args.push(arg); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: FP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: FP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: FP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ColdUse, type: FP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: FP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ColdUse, type: FP, width: 64}); bb34.append(inst); inst = new Inst(MoveDouble); arg = Arg.createTmp(Reg.xmm2); inst.args.push(arg); arg = Arg.createIndex(Reg.r9, Reg.rdi, 8, 0); inst.args.push(arg); bb34.append(inst); inst = new Inst(Add32); arg = Arg.createImm(2); inst.args.push(arg); arg = Arg.createTmp(Reg.rsi); inst.args.push(arg); arg = Arg.createTmp(Reg.rsi); inst.args.push(arg); bb34.append(inst); inst = new Inst(DivDouble); arg = Arg.createTmp(Reg.xmm6); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm3); 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); arg = Arg.createTmp(Reg.xmm3); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm3); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm3); inst.args.push(arg); arg = Arg.createStack(slot5, 0); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); arg = Arg.createTmp(Reg.rdx); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm5); inst.args.push(arg); arg = Arg.createTmp(Reg.rsi); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm3); inst.args.push(arg); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: FP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: FP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: FP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ColdUse, type: FP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ColdUse, type: FP, width: 64}); bb34.append(inst); inst = new Inst(MoveDouble); arg = Arg.createTmp(Reg.xmm3); inst.args.push(arg); arg = Arg.createIndex(Reg.r9, Reg.rsi, 8, 0); inst.args.push(arg); bb34.append(inst); inst = new Inst(DivDouble); arg = Arg.createTmp(Reg.xmm6); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm5); 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); arg = Arg.createTmp(Reg.xmm5); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm5); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm5); inst.args.push(arg); arg = Arg.createStack(slot5, 0); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); arg = Arg.createTmp(Reg.rdx); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm5); inst.args.push(arg); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: FP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: FP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: FP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ColdUse, type: FP, width: 64}); bb34.append(inst); inst = new Inst(MoveDouble); arg = Arg.createTmp(Reg.xmm5); inst.args.push(arg); arg = Arg.createIndex(Reg.r9, Reg.rax, 8, 0); inst.args.push(arg); bb34.append(inst); inst = new Inst(Move32); arg = Arg.createTmp(Reg.rdx); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); 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); arg = Arg.createImm(1); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createStack(slot5, 0); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); arg = Arg.createTmp(Reg.rdx); inst.args.push(arg); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.UseZDef, type: GP, width: 32}); inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 32}); inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 32}); bb34.append(inst); inst = new Inst(Branch32); arg = Arg.createRelCond(LessThan); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createImm(400); inst.args.push(arg); bb34.append(inst); bb35.successors.push(new FrequentedBlock(bb11, Normal)); bb35.successors.push(new FrequentedBlock(bb36, Normal)); bb35.predecessors.push(bb34); inst = new Inst(Move); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); 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); arg = Arg.createImm(1); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createStack(slot5, 0); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.UseZDef, type: GP, width: 32}); inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 32}); bb35.append(inst); inst = new Inst(Branch32); arg = Arg.createRelCond(LessThan); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createImm(267); inst.args.push(arg); bb35.append(inst); bb36.predecessors.push(bb35); inst = new Inst(Move); arg = Arg.createBigImm(144506576, 1); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); bb36.append(inst); inst = new Inst(Ret64); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); bb36.append(inst); return code; } "use strict"; // Generated by Air::dumpAsJS from #ACLj8C in Air.js function createPayloadAirJSACLj8C() { let code = new Code(); let bb0 = code.addBlock(); let bb1 = code.addBlock(); let bb2 = code.addBlock(); let bb3 = code.addBlock(); let bb4 = code.addBlock(); let bb5 = code.addBlock(); let bb6 = code.addBlock(); let bb7 = code.addBlock(); let bb8 = code.addBlock(); let bb9 = code.addBlock(); let bb10 = code.addBlock(); let bb11 = code.addBlock(); let bb12 = code.addBlock(); let bb13 = code.addBlock(); let bb14 = code.addBlock(); let bb15 = code.addBlock(); let slot0 = code.addStackSlot(160, Locked); let slot1 = code.addStackSlot(8, Spill); 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); let tmp58 = code.newTmp(GP); let tmp57 = code.newTmp(GP); let tmp56 = code.newTmp(GP); let tmp55 = code.newTmp(GP); let tmp54 = code.newTmp(GP); let tmp53 = code.newTmp(GP); let tmp52 = code.newTmp(GP); let tmp51 = code.newTmp(GP); let tmp50 = code.newTmp(GP); let tmp49 = code.newTmp(GP); let tmp48 = code.newTmp(GP); let tmp47 = code.newTmp(GP); let tmp46 = code.newTmp(GP); let tmp45 = code.newTmp(GP); let tmp44 = code.newTmp(GP); let tmp43 = code.newTmp(GP); let tmp42 = code.newTmp(GP); let tmp41 = code.newTmp(GP); let tmp40 = code.newTmp(GP); let tmp39 = code.newTmp(GP); let tmp38 = code.newTmp(GP); let tmp37 = code.newTmp(GP); let tmp36 = code.newTmp(GP); let tmp35 = code.newTmp(GP); let tmp34 = code.newTmp(GP); let tmp33 = code.newTmp(GP); let tmp32 = code.newTmp(GP); let tmp31 = code.newTmp(GP); let tmp30 = code.newTmp(GP); let tmp29 = code.newTmp(GP); let tmp28 = code.newTmp(GP); let tmp27 = code.newTmp(GP); let tmp26 = code.newTmp(GP); let tmp25 = code.newTmp(GP); let tmp24 = code.newTmp(GP); let tmp23 = code.newTmp(GP); let tmp22 = code.newTmp(GP); let tmp21 = code.newTmp(GP); let tmp20 = code.newTmp(GP); let tmp19 = code.newTmp(GP); let tmp18 = code.newTmp(GP); let tmp17 = code.newTmp(GP); let tmp16 = code.newTmp(GP); let tmp15 = code.newTmp(GP); let tmp14 = code.newTmp(GP); let tmp13 = code.newTmp(GP); let tmp12 = code.newTmp(GP); let tmp11 = code.newTmp(GP); let tmp10 = code.newTmp(GP); let tmp9 = code.newTmp(GP); let tmp8 = code.newTmp(GP); let tmp7 = code.newTmp(GP); let tmp6 = code.newTmp(GP); let tmp5 = code.newTmp(GP); let tmp4 = code.newTmp(GP); let tmp3 = code.newTmp(GP); let tmp2 = code.newTmp(GP); let tmp1 = code.newTmp(GP); let tmp0 = code.newTmp(GP); let inst; let arg; bb0.successors.push(new FrequentedBlock(bb1, Normal)); bb0.successors.push(new FrequentedBlock(bb15, Normal)); inst = new Inst(Move); arg = Arg.createBigImm(276424800, 1); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); bb0.append(inst); inst = new Inst(Move); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createAddr(Reg.rbp, 16); 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); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.extraEarlyClobberedRegs.add(Reg.r11); inst.extraClobberedRegs.add(Reg.r11); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Scratch, type: GP, width: 64}); bb0.append(inst); inst = new Inst(Move); arg = Arg.createAddr(Reg.rbp, 72); inst.args.push(arg); arg = Arg.createTmp(Reg.rdi); inst.args.push(arg); bb0.append(inst); inst = new Inst(Move); arg = Arg.createAddr(Reg.rbp, 64); inst.args.push(arg); arg = Arg.createTmp(Reg.rdx); inst.args.push(arg); bb0.append(inst); inst = new Inst(Move); arg = Arg.createAddr(Reg.rbp, 56); inst.args.push(arg); arg = Arg.createTmp(Reg.rsi); inst.args.push(arg); bb0.append(inst); inst = new Inst(Move); arg = Arg.createAddr(Reg.rbp, 48); inst.args.push(arg); arg = Arg.createTmp(Reg.r8); inst.args.push(arg); bb0.append(inst); inst = new Inst(Move); 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); arg = Arg.createTmp(Reg.r8); inst.args.push(arg); arg = Arg.createTmp(Reg.r15); inst.args.push(arg); arg = Arg.createTmp(Reg.r8); inst.args.push(arg); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); bb0.append(inst); inst = new Inst(Move); arg = Arg.createAddr(Reg.rbp, 24); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); bb0.append(inst); inst = new Inst(Move); arg = Arg.createAddr(Reg.rax, 16); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); bb0.append(inst); inst = new Inst(Move); 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); arg = Arg.createTmp(Reg.r8); inst.args.push(arg); arg = Arg.createTmp(Reg.r15); inst.args.push(arg); arg = Arg.createTmp(Reg.r14); inst.args.push(arg); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.extraEarlyClobberedRegs.add(Reg.r11); inst.extraClobberedRegs.add(Reg.r11); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Def, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.LateUse, type: GP, width: 64}); 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); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createTmp(Reg.r8); inst.args.push(arg); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); bb0.append(inst); inst = new Inst(Move); arg = Arg.createAddr(Reg.rcx, 32); inst.args.push(arg); arg = Arg.createTmp(Reg.r12); inst.args.push(arg); bb0.append(inst); inst = new Inst(Move); arg = Arg.createAddr(Reg.rcx, 40); inst.args.push(arg); arg = Arg.createTmp(Reg.rbx); 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); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createTmp(Reg.r15); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createTmp(Reg.rbx); inst.args.push(arg); arg = Arg.createTmp(Reg.rdi); inst.args.push(arg); arg = Arg.createTmp(Reg.rdx); inst.args.push(arg); arg = Arg.createTmp(Reg.rsi); inst.args.push(arg); arg = Arg.createTmp(Reg.r12); inst.args.push(arg); arg = Arg.createTmp(Reg.r8); inst.args.push(arg); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); bb0.append(inst); inst = new Inst(Move); 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); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createTmp(Reg.rbx); inst.args.push(arg); arg = Arg.createTmp(Reg.rdi); inst.args.push(arg); arg = Arg.createTmp(Reg.rdx); inst.args.push(arg); arg = Arg.createTmp(Reg.rsi); inst.args.push(arg); arg = Arg.createTmp(Reg.r12); inst.args.push(arg); arg = Arg.createTmp(Reg.r8); inst.args.push(arg); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); 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.r8, 5); inst.args.push(arg); arg = Arg.createImm(21); inst.args.push(arg); arg = Arg.createTmp(Reg.r8); inst.args.push(arg); arg = Arg.createTmp(Reg.rbx); inst.args.push(arg); arg = Arg.createTmp(Reg.rdi); inst.args.push(arg); arg = Arg.createTmp(Reg.rdx); inst.args.push(arg); arg = Arg.createTmp(Reg.rsi); inst.args.push(arg); arg = Arg.createTmp(Reg.r12); inst.args.push(arg); arg = Arg.createTmp(Reg.r8); inst.args.push(arg); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 8}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 8}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); 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); arg = Arg.createTmp(Reg.r12); inst.args.push(arg); arg = Arg.createTmp(Reg.r15); inst.args.push(arg); arg = Arg.createTmp(Reg.r12); inst.args.push(arg); arg = Arg.createTmp(Reg.rbx); inst.args.push(arg); arg = Arg.createTmp(Reg.rdi); inst.args.push(arg); arg = Arg.createTmp(Reg.rdx); inst.args.push(arg); arg = Arg.createTmp(Reg.rsi); inst.args.push(arg); arg = Arg.createTmp(Reg.r12); inst.args.push(arg); arg = Arg.createTmp(Reg.r8); inst.args.push(arg); arg = Arg.createTmp(Reg.r12); inst.args.push(arg); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); 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(372); inst.args.push(arg); arg = Arg.createTmp(Reg.r12); inst.args.push(arg); arg = Arg.createTmp(Reg.rbx); inst.args.push(arg); arg = Arg.createTmp(Reg.rdi); inst.args.push(arg); arg = Arg.createTmp(Reg.rdx); inst.args.push(arg); arg = Arg.createTmp(Reg.rsi); inst.args.push(arg); arg = Arg.createTmp(Reg.r12); inst.args.push(arg); arg = Arg.createTmp(Reg.r8); inst.args.push(arg); arg = Arg.createTmp(Reg.r12); inst.args.push(arg); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); bb0.append(inst); inst = new Inst(Move); arg = Arg.createAddr(Reg.r12, 8); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); bb0.append(inst); inst = new Inst(Move); arg = Arg.createAddr(Reg.rax, -40); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); 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); arg = Arg.createTmp(Reg.rbx); inst.args.push(arg); arg = Arg.createTmp(Reg.r15); inst.args.push(arg); arg = Arg.createTmp(Reg.rbx); inst.args.push(arg); arg = Arg.createTmp(Reg.rbx); inst.args.push(arg); arg = Arg.createTmp(Reg.rdi); inst.args.push(arg); arg = Arg.createTmp(Reg.rdx); inst.args.push(arg); arg = Arg.createTmp(Reg.rsi); inst.args.push(arg); arg = Arg.createTmp(Reg.r12); inst.args.push(arg); arg = Arg.createTmp(Reg.r8); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createTmp(Reg.rbx); inst.args.push(arg); arg = Arg.createTmp(Reg.rdi); inst.args.push(arg); arg = Arg.createTmp(Reg.rdx); inst.args.push(arg); arg = Arg.createTmp(Reg.rsi); inst.args.push(arg); arg = Arg.createTmp(Reg.r8); inst.args.push(arg); arg = Arg.createTmp(Reg.r12); inst.args.push(arg); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); 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); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createTmp(Reg.r15); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createTmp(Reg.rbx); inst.args.push(arg); arg = Arg.createTmp(Reg.rdi); inst.args.push(arg); arg = Arg.createTmp(Reg.rdx); inst.args.push(arg); arg = Arg.createTmp(Reg.rsi); inst.args.push(arg); arg = Arg.createTmp(Reg.r12); inst.args.push(arg); arg = Arg.createTmp(Reg.r8); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createTmp(Reg.rbx); inst.args.push(arg); arg = Arg.createTmp(Reg.rdi); inst.args.push(arg); arg = Arg.createTmp(Reg.rdx); inst.args.push(arg); arg = Arg.createTmp(Reg.rsi); inst.args.push(arg); arg = Arg.createTmp(Reg.r8); inst.args.push(arg); arg = Arg.createTmp(Reg.r12); inst.args.push(arg); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); bb0.append(inst); inst = new Inst(Move); 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); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createTmp(Reg.rbx); inst.args.push(arg); arg = Arg.createTmp(Reg.rdi); inst.args.push(arg); arg = Arg.createTmp(Reg.rdx); inst.args.push(arg); arg = Arg.createTmp(Reg.rsi); inst.args.push(arg); arg = Arg.createTmp(Reg.r12); inst.args.push(arg); arg = Arg.createTmp(Reg.r8); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createTmp(Reg.rbx); inst.args.push(arg); arg = Arg.createTmp(Reg.rdi); inst.args.push(arg); arg = Arg.createTmp(Reg.rdx); inst.args.push(arg); arg = Arg.createTmp(Reg.rsi); inst.args.push(arg); arg = Arg.createTmp(Reg.r8); inst.args.push(arg); arg = Arg.createTmp(Reg.r12); inst.args.push(arg); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); bb0.append(inst); inst = new Inst(Move); arg = Arg.createTmp(Reg.rbx); inst.args.push(arg); arg = Arg.createStack(slot0, 72); inst.args.push(arg); bb0.append(inst); inst = new Inst(Move); arg = Arg.createTmp(Reg.rdi); inst.args.push(arg); arg = Arg.createStack(slot0, 64); inst.args.push(arg); bb0.append(inst); inst = new Inst(Move); arg = Arg.createTmp(Reg.rdx); inst.args.push(arg); arg = Arg.createStack(slot0, 56); inst.args.push(arg); bb0.append(inst); inst = new Inst(Move); arg = Arg.createTmp(Reg.rsi); inst.args.push(arg); arg = Arg.createStack(slot0, 48); inst.args.push(arg); bb0.append(inst); inst = new Inst(Move); arg = Arg.createTmp(Reg.r8); inst.args.push(arg); arg = Arg.createStack(slot0, 40); 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); arg = Arg.createTmp(Reg.r8); inst.args.push(arg); arg = Arg.createTmp(Reg.r15); inst.args.push(arg); arg = Arg.createTmp(Reg.r14); inst.args.push(arg); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.extraEarlyClobberedRegs.add(Reg.r11); inst.extraClobberedRegs.add(Reg.r11); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Def, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.LateUse, type: GP, width: 64}); 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); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); bb0.append(inst); inst = new Inst(Move); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); bb0.append(inst); inst = new Inst(Xor64); arg = Arg.createImm(6); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); bb0.append(inst); inst = new Inst(Move); arg = Arg.createImm(-2); inst.args.push(arg); arg = Arg.createStack(slot2, 0); inst.args.push(arg); bb0.append(inst); inst = new Inst(Move); arg = Arg.createImm(-2); inst.args.push(arg); arg = Arg.createTmp(Reg.r9); 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); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); arg = Arg.createTmp(Reg.r9); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createTmp(Reg.r12); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); bb0.append(inst); inst = new Inst(Move); arg = Arg.createImm(1); inst.args.push(arg); arg = Arg.createStack(slot3, 0); inst.args.push(arg); bb0.append(inst); inst = new Inst(Move); arg = Arg.createImm(1); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); bb0.append(inst); inst = new Inst(BranchTest64); arg = Arg.createResCond(NonZero); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); bb0.append(inst); bb1.successors.push(new FrequentedBlock(bb3, Normal)); 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(468); inst.args.push(arg); arg = Arg.createTmp(Reg.r8); inst.args.push(arg); arg = Arg.createTmp(Reg.r12); inst.args.push(arg); arg = Arg.createTmp(Reg.rbx); inst.args.push(arg); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); bb1.append(inst); inst = new Inst(Move); arg = Arg.createAddr(Reg.r8, 16); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); bb1.append(inst); inst = new Inst(Move); arg = Arg.createBigImm(276741160, 1); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); bb1.append(inst); inst = new Inst(Move); arg = Arg.createAddr(Reg.rcx, 0); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); bb1.append(inst); inst = new Inst(Branch64); arg = Arg.createRelCond(Equal); inst.args.push(arg); arg = Arg.createAddr(Reg.rax, 8); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); 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); arg = Arg.createTmp(Reg.rbx); inst.args.push(arg); arg = Arg.createTmp(Reg.r8); inst.args.push(arg); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); bb2.append(inst); inst = new Inst(Oops); bb2.append(inst); bb3.successors.push(new FrequentedBlock(bb4, Normal)); bb3.successors.push(new FrequentedBlock(bb7, Normal)); bb3.predecessors.push(bb1); inst = new Inst(Move); arg = Arg.createAddr(Reg.r8, 24); inst.args.push(arg); arg = Arg.createTmp(Reg.r13); 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); arg = Arg.createAddr(Reg.rbx, 5); inst.args.push(arg); arg = Arg.createImm(23); inst.args.push(arg); arg = Arg.createTmp(Reg.rbx); inst.args.push(arg); arg = Arg.createTmp(Reg.r12); inst.args.push(arg); arg = Arg.createTmp(Reg.rbx); inst.args.push(arg); arg = Arg.createTmp(Reg.rdi); inst.args.push(arg); arg = Arg.createTmp(Reg.rdx); inst.args.push(arg); arg = Arg.createTmp(Reg.rsi); inst.args.push(arg); arg = Arg.createTmp(Reg.r13); inst.args.push(arg); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 8}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 8}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); bb3.append(inst); inst = new Inst(Move); arg = Arg.createBigImm(275739616, 1); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); bb3.append(inst); inst = new Inst(Branch64); arg = Arg.createRelCond(Equal); inst.args.push(arg); arg = Arg.createAddr(Reg.rbx, 24); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); bb3.append(inst); bb4.successors.push(new FrequentedBlock(bb5, Normal)); bb4.successors.push(new FrequentedBlock(bb6, Normal)); bb4.predecessors.push(bb3); inst = new Inst(Move); arg = Arg.createTmp(Reg.rbx); inst.args.push(arg); arg = Arg.createStack(slot0, 0); inst.args.push(arg); bb4.append(inst); inst = new Inst(Move); arg = Arg.createAddr(Reg.rbx, 16); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); bb4.append(inst); inst = new Inst(Move); arg = Arg.createAddr(Reg.rax, 32); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); bb4.append(inst); inst = new Inst(Move); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); arg = Arg.createStack(slot1, 0); 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); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); arg = Arg.createTmp(Reg.r15); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); arg = Arg.createTmp(Reg.r12); inst.args.push(arg); arg = Arg.createTmp(Reg.rbx); inst.args.push(arg); arg = Arg.createTmp(Reg.rdi); inst.args.push(arg); arg = Arg.createTmp(Reg.rdx); inst.args.push(arg); arg = Arg.createTmp(Reg.rsi); inst.args.push(arg); arg = Arg.createTmp(Reg.r13); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); bb4.append(inst); inst = new Inst(Move); arg = Arg.createTmp(Reg.rdi); inst.args.push(arg); arg = Arg.createStack(slot0, 32); inst.args.push(arg); bb4.append(inst); inst = new Inst(Move); arg = Arg.createTmp(Reg.rdx); inst.args.push(arg); arg = Arg.createStack(slot0, 24); inst.args.push(arg); bb4.append(inst); inst = new Inst(Move); arg = Arg.createTmp(Reg.rsi); inst.args.push(arg); arg = Arg.createStack(slot0, 16); inst.args.push(arg); bb4.append(inst); inst = new Inst(Move); arg = Arg.createTmp(Reg.r13); inst.args.push(arg); arg = Arg.createStack(slot0, 8); inst.args.push(arg); bb4.append(inst); inst = new Inst(Move); 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(276646496, 1); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); bb4.append(inst); inst = new Inst(Move); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createCallArg(8); inst.args.push(arg); bb4.append(inst); inst = new Inst(Move32); arg = Arg.createImm(2); inst.args.push(arg); arg = Arg.createCallArg(16); inst.args.push(arg); bb4.append(inst); inst = new Inst(Move); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); arg = Arg.createCallArg(24); inst.args.push(arg); bb4.append(inst); inst = new Inst(Move); arg = Arg.createTmp(Reg.rsi); inst.args.push(arg); arg = Arg.createCallArg(32); 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); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createCallArg(8); inst.args.push(arg); arg = Arg.createCallArg(16); inst.args.push(arg); arg = Arg.createCallArg(24); inst.args.push(arg); arg = Arg.createCallArg(32); inst.args.push(arg); arg = Arg.createTmp(Reg.r15); inst.args.push(arg); arg = Arg.createTmp(Reg.r14); inst.args.push(arg); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.extraEarlyClobberedRegs.add(Reg.r11); inst.extraClobberedRegs.add(Reg.rcx); inst.extraClobberedRegs.add(Reg.rdx); inst.extraClobberedRegs.add(Reg.rsi); inst.extraClobberedRegs.add(Reg.rdi); inst.extraClobberedRegs.add(Reg.r8); inst.extraClobberedRegs.add(Reg.r9); inst.extraClobberedRegs.add(Reg.r10); inst.extraClobberedRegs.add(Reg.r11); inst.extraClobberedRegs.add(Reg.xmm0); inst.extraClobberedRegs.add(Reg.xmm1); inst.extraClobberedRegs.add(Reg.xmm2); inst.extraClobberedRegs.add(Reg.xmm3); inst.extraClobberedRegs.add(Reg.xmm4); inst.extraClobberedRegs.add(Reg.xmm5); inst.extraClobberedRegs.add(Reg.xmm6); inst.extraClobberedRegs.add(Reg.xmm7); inst.extraClobberedRegs.add(Reg.xmm8); inst.extraClobberedRegs.add(Reg.xmm9); inst.extraClobberedRegs.add(Reg.xmm10); inst.extraClobberedRegs.add(Reg.xmm11); inst.extraClobberedRegs.add(Reg.xmm12); inst.extraClobberedRegs.add(Reg.xmm13); inst.extraClobberedRegs.add(Reg.xmm14); inst.extraClobberedRegs.add(Reg.xmm15); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Def, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); 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); arg = Arg.createTmp(Reg.rbx); inst.args.push(arg); arg = Arg.createStack(slot1, 0); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); bb4.append(inst); inst = new Inst(Move); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); bb4.append(inst); inst = new Inst(Xor64); arg = Arg.createImm(6); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); bb4.append(inst); inst = new Inst(Move); arg = Arg.createImm(-2); inst.args.push(arg); arg = Arg.createTmp(Reg.rdx); 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); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); arg = Arg.createTmp(Reg.rdx); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createTmp(Reg.r12); inst.args.push(arg); arg = Arg.createTmp(Reg.rbx); inst.args.push(arg); arg = Arg.createStack(slot1, 0); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); bb4.append(inst); inst = new Inst(Move); arg = Arg.createImm(1); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); bb4.append(inst); inst = new Inst(BranchTest64); arg = Arg.createResCond(NonZero); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); bb4.append(inst); bb5.successors.push(new FrequentedBlock(bb8, Normal)); bb5.predecessors.push(bb4); inst = new Inst(Move); arg = Arg.createStack(slot1, 0); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); 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); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createTmp(Reg.r15); inst.args.push(arg); arg = Arg.createTmp(Reg.r14); inst.args.push(arg); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.extraEarlyClobberedRegs.add(Reg.r11); inst.extraClobberedRegs.add(Reg.r11); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Def, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.LateUse, type: GP, width: 64}); 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); arg = Arg.createTmp(Reg.rbx); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); 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); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); arg = Arg.createTmp(Reg.r15); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); arg = Arg.createTmp(Reg.r12); inst.args.push(arg); arg = Arg.createTmp(Reg.rbx); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); 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(419); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); arg = Arg.createTmp(Reg.r12); inst.args.push(arg); arg = Arg.createTmp(Reg.rbx); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); bb5.append(inst); inst = new Inst(Move); arg = Arg.createBigImm(276168608, 1); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); bb5.append(inst); inst = new Inst(Move); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createCallArg(8); inst.args.push(arg); bb5.append(inst); inst = new Inst(Move32); arg = Arg.createImm(2); inst.args.push(arg); arg = Arg.createCallArg(16); inst.args.push(arg); bb5.append(inst); inst = new Inst(Move); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); arg = Arg.createCallArg(24); inst.args.push(arg); bb5.append(inst); inst = new Inst(Move); arg = Arg.createTmp(Reg.r13); inst.args.push(arg); arg = Arg.createCallArg(32); 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); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createCallArg(8); inst.args.push(arg); arg = Arg.createCallArg(16); inst.args.push(arg); arg = Arg.createCallArg(24); inst.args.push(arg); arg = Arg.createCallArg(32); inst.args.push(arg); arg = Arg.createTmp(Reg.r15); inst.args.push(arg); arg = Arg.createTmp(Reg.r14); inst.args.push(arg); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.extraEarlyClobberedRegs.add(Reg.r11); inst.extraClobberedRegs.add(Reg.rcx); inst.extraClobberedRegs.add(Reg.rdx); inst.extraClobberedRegs.add(Reg.rsi); inst.extraClobberedRegs.add(Reg.rdi); inst.extraClobberedRegs.add(Reg.r8); inst.extraClobberedRegs.add(Reg.r9); inst.extraClobberedRegs.add(Reg.r10); inst.extraClobberedRegs.add(Reg.r11); inst.extraClobberedRegs.add(Reg.xmm0); inst.extraClobberedRegs.add(Reg.xmm1); inst.extraClobberedRegs.add(Reg.xmm2); inst.extraClobberedRegs.add(Reg.xmm3); inst.extraClobberedRegs.add(Reg.xmm4); inst.extraClobberedRegs.add(Reg.xmm5); inst.extraClobberedRegs.add(Reg.xmm6); inst.extraClobberedRegs.add(Reg.xmm7); inst.extraClobberedRegs.add(Reg.xmm8); inst.extraClobberedRegs.add(Reg.xmm9); inst.extraClobberedRegs.add(Reg.xmm10); inst.extraClobberedRegs.add(Reg.xmm11); inst.extraClobberedRegs.add(Reg.xmm12); inst.extraClobberedRegs.add(Reg.xmm13); inst.extraClobberedRegs.add(Reg.xmm14); inst.extraClobberedRegs.add(Reg.xmm15); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Def, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); 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); arg = Arg.createTmp(Reg.rbx); inst.args.push(arg); arg = Arg.createStack(slot1, 0); inst.args.push(arg); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); bb5.append(inst); inst = new Inst(Move); arg = Arg.createImm(10); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); bb5.append(inst); inst = new Inst(Jump); bb5.append(inst); bb6.successors.push(new FrequentedBlock(bb8, Normal)); bb6.predecessors.push(bb4); inst = new Inst(Move); arg = Arg.createImm(10); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); bb6.append(inst); inst = new Inst(Jump); bb6.append(inst); bb7.successors.push(new FrequentedBlock(bb12, Normal)); bb7.successors.push(new FrequentedBlock(bb9, Normal)); bb7.predecessors.push(bb3); inst = new Inst(Move); arg = Arg.createTmp(Reg.rbx); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); bb7.append(inst); inst = new Inst(Move); arg = Arg.createTmp(Reg.rbx); inst.args.push(arg); arg = Arg.createCallArg(8); inst.args.push(arg); bb7.append(inst); inst = new Inst(Move32); arg = Arg.createImm(5); inst.args.push(arg); arg = Arg.createCallArg(16); inst.args.push(arg); bb7.append(inst); inst = new Inst(Move); arg = Arg.createImm(10); inst.args.push(arg); arg = Arg.createCallArg(24); inst.args.push(arg); bb7.append(inst); inst = new Inst(Move); arg = Arg.createTmp(Reg.r13); inst.args.push(arg); arg = Arg.createCallArg(32); inst.args.push(arg); bb7.append(inst); inst = new Inst(Move); arg = Arg.createTmp(Reg.rsi); inst.args.push(arg); arg = Arg.createCallArg(40); inst.args.push(arg); bb7.append(inst); inst = new Inst(Move); arg = Arg.createTmp(Reg.rdx); inst.args.push(arg); arg = Arg.createCallArg(48); inst.args.push(arg); bb7.append(inst); inst = new Inst(Move); arg = Arg.createTmp(Reg.rdi); inst.args.push(arg); arg = Arg.createCallArg(56); 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); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createCallArg(8); inst.args.push(arg); arg = Arg.createCallArg(16); inst.args.push(arg); arg = Arg.createCallArg(24); inst.args.push(arg); arg = Arg.createCallArg(32); inst.args.push(arg); arg = Arg.createCallArg(40); inst.args.push(arg); arg = Arg.createCallArg(48); inst.args.push(arg); arg = Arg.createCallArg(56); inst.args.push(arg); arg = Arg.createTmp(Reg.r15); inst.args.push(arg); arg = Arg.createTmp(Reg.r14); inst.args.push(arg); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.extraEarlyClobberedRegs.add(Reg.r11); inst.extraClobberedRegs.add(Reg.rcx); inst.extraClobberedRegs.add(Reg.rdx); inst.extraClobberedRegs.add(Reg.rsi); inst.extraClobberedRegs.add(Reg.rdi); inst.extraClobberedRegs.add(Reg.r8); inst.extraClobberedRegs.add(Reg.r9); inst.extraClobberedRegs.add(Reg.r10); inst.extraClobberedRegs.add(Reg.r11); inst.extraClobberedRegs.add(Reg.xmm0); inst.extraClobberedRegs.add(Reg.xmm1); inst.extraClobberedRegs.add(Reg.xmm2); inst.extraClobberedRegs.add(Reg.xmm3); inst.extraClobberedRegs.add(Reg.xmm4); inst.extraClobberedRegs.add(Reg.xmm5); inst.extraClobberedRegs.add(Reg.xmm6); inst.extraClobberedRegs.add(Reg.xmm7); inst.extraClobberedRegs.add(Reg.xmm8); inst.extraClobberedRegs.add(Reg.xmm9); inst.extraClobberedRegs.add(Reg.xmm10); inst.extraClobberedRegs.add(Reg.xmm11); inst.extraClobberedRegs.add(Reg.xmm12); inst.extraClobberedRegs.add(Reg.xmm13); inst.extraClobberedRegs.add(Reg.xmm14); inst.extraClobberedRegs.add(Reg.xmm15); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Def, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); 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); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); bb7.append(inst); inst = new Inst(BranchTest64); arg = Arg.createResCond(NonZero); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createTmp(Reg.r15); inst.args.push(arg); bb7.append(inst); bb8.successors.push(new FrequentedBlock(bb13, Normal)); bb8.successors.push(new FrequentedBlock(bb10, Normal)); bb8.predecessors.push(bb6); bb8.predecessors.push(bb5); inst = new Inst(BranchTest64); arg = Arg.createResCond(NonZero); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createTmp(Reg.r15); inst.args.push(arg); bb8.append(inst); bb9.successors.push(new FrequentedBlock(bb11, Normal)); bb9.predecessors.push(bb7); inst = new Inst(Jump); bb9.append(inst); bb10.successors.push(new FrequentedBlock(bb11, Normal)); bb10.predecessors.push(bb8); inst = new Inst(Jump); bb10.append(inst); 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); arg = Arg.createAddr(Reg.rax, 5); inst.args.push(arg); arg = Arg.createImm(20); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createTmp(Reg.r12); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 8}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 8}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); 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); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); bb11.append(inst); inst = new Inst(Oops); bb11.append(inst); bb12.successors.push(new FrequentedBlock(bb14, Normal)); bb12.predecessors.push(bb7); inst = new Inst(Jump); bb12.append(inst); bb13.successors.push(new FrequentedBlock(bb14, Normal)); bb13.predecessors.push(bb8); inst = new Inst(Jump); bb13.append(inst); bb14.predecessors.push(bb12); bb14.predecessors.push(bb13); inst = new Inst(Move); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); bb14.append(inst); inst = new Inst(And64); arg = Arg.createImm(-9); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); 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); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); arg = Arg.createImm(2); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createTmp(Reg.r12); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); bb14.append(inst); inst = new Inst(Move); arg = Arg.createImm(10); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); bb14.append(inst); inst = new Inst(Ret64); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); bb14.append(inst); bb15.predecessors.push(bb0); inst = new Inst(Move); arg = Arg.createImm(10); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); bb15.append(inst); inst = new Inst(Ret64); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); bb15.append(inst); return code; } "use strict"; // Generated by Air::dumpAsJS from scanIdentifier#EPcFQe in Octane/typescript function createPayloadTypescriptScanIdentifier() { let code = new Code(); let bb0 = code.addBlock(); let bb1 = code.addBlock(); let bb2 = code.addBlock(); let bb3 = code.addBlock(); let bb4 = code.addBlock(); let bb5 = code.addBlock(); let bb6 = code.addBlock(); let bb7 = code.addBlock(); let bb8 = code.addBlock(); let bb9 = code.addBlock(); let bb10 = code.addBlock(); let bb11 = code.addBlock(); let bb12 = code.addBlock(); let bb13 = code.addBlock(); let bb14 = code.addBlock(); let bb15 = code.addBlock(); let bb16 = code.addBlock(); let bb17 = code.addBlock(); let bb18 = code.addBlock(); let bb19 = code.addBlock(); let bb20 = code.addBlock(); let bb21 = code.addBlock(); let bb22 = code.addBlock(); let bb23 = code.addBlock(); let bb24 = code.addBlock(); let bb25 = code.addBlock(); let bb26 = code.addBlock(); let bb27 = code.addBlock(); let bb28 = code.addBlock(); let bb29 = code.addBlock(); let bb30 = code.addBlock(); let bb31 = code.addBlock(); let bb32 = code.addBlock(); let bb33 = code.addBlock(); let bb34 = code.addBlock(); let slot0 = code.addStackSlot(56, Locked); let slot1 = code.addStackSlot(8, Spill); let slot2 = code.addStackSlot(8, Spill); let slot3 = code.addStackSlot(8, Spill); let slot4 = code.addStackSlot(8, Spill); let slot5 = code.addStackSlot(4, Spill); let slot6 = code.addStackSlot(8, Spill); 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); let tmp95 = code.newTmp(GP); let tmp94 = code.newTmp(GP); let tmp93 = code.newTmp(GP); let tmp92 = code.newTmp(GP); let tmp91 = code.newTmp(GP); let tmp90 = code.newTmp(GP); let tmp89 = code.newTmp(GP); let tmp88 = code.newTmp(GP); let tmp87 = code.newTmp(GP); let tmp86 = code.newTmp(GP); let tmp85 = code.newTmp(GP); let tmp84 = code.newTmp(GP); let tmp83 = code.newTmp(GP); let tmp82 = code.newTmp(GP); let tmp81 = code.newTmp(GP); let tmp80 = code.newTmp(GP); let tmp79 = code.newTmp(GP); let tmp78 = code.newTmp(GP); let tmp77 = code.newTmp(GP); let tmp76 = code.newTmp(GP); let tmp75 = code.newTmp(GP); let tmp74 = code.newTmp(GP); let tmp73 = code.newTmp(GP); let tmp72 = code.newTmp(GP); let tmp71 = code.newTmp(GP); let tmp70 = code.newTmp(GP); let tmp69 = code.newTmp(GP); let tmp68 = code.newTmp(GP); let tmp67 = code.newTmp(GP); let tmp66 = code.newTmp(GP); let tmp65 = code.newTmp(GP); let tmp64 = code.newTmp(GP); let tmp63 = code.newTmp(GP); let tmp62 = code.newTmp(GP); let tmp61 = code.newTmp(GP); let tmp60 = code.newTmp(GP); let tmp59 = code.newTmp(GP); let tmp58 = code.newTmp(GP); let tmp57 = code.newTmp(GP); let tmp56 = code.newTmp(GP); let tmp55 = code.newTmp(GP); let tmp54 = code.newTmp(GP); let tmp53 = code.newTmp(GP); let tmp52 = code.newTmp(GP); let tmp51 = code.newTmp(GP); let tmp50 = code.newTmp(GP); let tmp49 = code.newTmp(GP); let tmp48 = code.newTmp(GP); let tmp47 = code.newTmp(GP); let tmp46 = code.newTmp(GP); let tmp45 = code.newTmp(GP); let tmp44 = code.newTmp(GP); let tmp43 = code.newTmp(GP); let tmp42 = code.newTmp(GP); let tmp41 = code.newTmp(GP); let tmp40 = code.newTmp(GP); let tmp39 = code.newTmp(GP); let tmp38 = code.newTmp(GP); let tmp37 = code.newTmp(GP); let tmp36 = code.newTmp(GP); let tmp35 = code.newTmp(GP); let tmp34 = code.newTmp(GP); let tmp33 = code.newTmp(GP); let tmp32 = code.newTmp(GP); let tmp31 = code.newTmp(GP); let tmp30 = code.newTmp(GP); let tmp29 = code.newTmp(GP); let tmp28 = code.newTmp(GP); let tmp27 = code.newTmp(GP); let tmp26 = code.newTmp(GP); let tmp25 = code.newTmp(GP); let tmp24 = code.newTmp(GP); let tmp23 = code.newTmp(GP); let tmp22 = code.newTmp(GP); let tmp21 = code.newTmp(GP); let tmp20 = code.newTmp(GP); let tmp19 = code.newTmp(GP); let tmp18 = code.newTmp(GP); let tmp17 = code.newTmp(GP); let tmp16 = code.newTmp(GP); let tmp15 = code.newTmp(GP); let tmp14 = code.newTmp(GP); let tmp13 = code.newTmp(GP); let tmp12 = code.newTmp(GP); let tmp11 = code.newTmp(GP); let tmp10 = code.newTmp(GP); let tmp9 = code.newTmp(GP); let tmp8 = code.newTmp(GP); let tmp7 = code.newTmp(GP); let tmp6 = code.newTmp(GP); let tmp5 = code.newTmp(GP); let tmp4 = code.newTmp(GP); let tmp3 = code.newTmp(GP); let tmp2 = code.newTmp(GP); let tmp1 = code.newTmp(GP); let tmp0 = code.newTmp(GP); let inst; let arg; bb0.successors.push(new FrequentedBlock(bb5, Normal)); bb0.successors.push(new FrequentedBlock(bb4, Normal)); inst = new Inst(Move); arg = Arg.createBigImm(177329888, 1); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); bb0.append(inst); inst = new Inst(Move); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createAddr(Reg.rbp, 16); 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); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.extraEarlyClobberedRegs.add(Reg.r11); inst.extraClobberedRegs.add(Reg.r11); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Scratch, type: GP, width: 64}); bb0.append(inst); inst = new Inst(Move); arg = Arg.createAddr(Reg.rbp, 40); inst.args.push(arg); arg = Arg.createTmp(Reg.rbx); inst.args.push(arg); bb0.append(inst); inst = new Inst(Move); 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); arg = Arg.createTmp(Reg.rbx); inst.args.push(arg); arg = Arg.createTmp(Reg.r15); inst.args.push(arg); arg = Arg.createTmp(Reg.rbx); inst.args.push(arg); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); 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.rbx, 5); inst.args.push(arg); arg = Arg.createImm(21); inst.args.push(arg); arg = Arg.createTmp(Reg.rbx); inst.args.push(arg); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 8}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 8}); 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.rbx, 0); inst.args.push(arg); arg = Arg.createImm(2540); inst.args.push(arg); arg = Arg.createTmp(Reg.rbx); inst.args.push(arg); arg = Arg.createTmp(Reg.rbx); inst.args.push(arg); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); bb0.append(inst); inst = new Inst(Move); arg = Arg.createAddr(Reg.rbx, 72); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); bb0.append(inst); inst = new Inst(Compare32); arg = Arg.createRelCond(Equal); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createImm(92); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); bb0.append(inst); inst = new Inst(Move32); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); arg = Arg.createStack(slot5, 0); inst.args.push(arg); bb0.append(inst); inst = new Inst(Move); 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); arg = Arg.createAddr(Reg.rcx, 0); inst.args.push(arg); arg = Arg.createImm(80); inst.args.push(arg); arg = Arg.createBigImm(154991936, 1); inst.args.push(arg); arg = Arg.createTmp(Reg.rbx); inst.args.push(arg); arg = Arg.createStack(slot5, 0); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32}); bb0.append(inst); inst = new Inst(Move); arg = Arg.createBigImm(154991944, 1); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); bb0.append(inst); inst = new Inst(Move); arg = Arg.createAddr(Reg.rcx, 0); inst.args.push(arg); arg = Arg.createTmp(Reg.r12); inst.args.push(arg); bb0.append(inst); inst = new Inst(Move32); arg = Arg.createAddr(Reg.r12, -8); inst.args.push(arg); arg = Arg.createTmp(Reg.r8); 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); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createTmp(Reg.r8); inst.args.push(arg); arg = Arg.createTmp(Reg.rbx); inst.args.push(arg); arg = Arg.createStack(slot5, 0); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32}); bb0.append(inst); inst = new Inst(Move32); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); bb0.append(inst); inst = new Inst(Move); arg = Arg.createIndex(Reg.r12, Reg.rax, 8, 0); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); bb0.append(inst); inst = new Inst(Move); arg = Arg.createImm(10); inst.args.push(arg); arg = Arg.createTmp(Reg.r13); inst.args.push(arg); bb0.append(inst); inst = new Inst(MoveConditionallyTest64); arg = Arg.createResCond(NonZero); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createImm(-1); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createTmp(Reg.r13); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); bb0.append(inst); inst = new Inst(Move); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); bb0.append(inst); inst = new Inst(Xor64); arg = Arg.createImm(6); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); bb0.append(inst); inst = new Inst(Move); arg = Arg.createImm(-2); inst.args.push(arg); arg = Arg.createStack(slot2, 0); inst.args.push(arg); bb0.append(inst); inst = new Inst(Move); arg = Arg.createImm(-2); inst.args.push(arg); arg = Arg.createTmp(Reg.rdx); 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); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); arg = Arg.createTmp(Reg.rdx); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createTmp(Reg.rbx); inst.args.push(arg); arg = Arg.createStack(slot5, 0); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); bb0.append(inst); inst = new Inst(Move); arg = Arg.createImm(1); inst.args.push(arg); arg = Arg.createStack(slot1, 0); inst.args.push(arg); bb0.append(inst); inst = new Inst(Move); arg = Arg.createBigImm(129987312, 1); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); bb0.append(inst); inst = new Inst(Move); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); arg = Arg.createStack(slot4, 0); inst.args.push(arg); bb0.append(inst); inst = new Inst(Move); 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(0, -65536); inst.args.push(arg); arg = Arg.createTmp(Reg.r14); inst.args.push(arg); bb0.append(inst); inst = new Inst(Move); arg = Arg.createImm(1); inst.args.push(arg); arg = Arg.createTmp(Reg.rdx); inst.args.push(arg); bb0.append(inst); inst = new Inst(BranchTest64); arg = Arg.createResCond(NonZero); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createTmp(Reg.rdx); inst.args.push(arg); 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(); inst.extraClobberedRegs = new Set(); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); bb1.append(inst); inst = new Inst(Oops); 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(); inst.extraClobberedRegs = new Set(); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); bb2.append(inst); inst = new Inst(Oops); 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(); inst.extraClobberedRegs = new Set(); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); bb3.append(inst); inst = new Inst(Oops); 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); arg = Arg.createStack(slot5, 0); inst.args.push(arg); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32}); bb4.append(inst); inst = new Inst(Oops); bb4.append(inst); bb5.successors.push(new FrequentedBlock(bb8, Normal)); bb5.successors.push(new FrequentedBlock(bb6, Rare)); bb5.predecessors.push(bb0); inst = new Inst(Move); arg = Arg.createAddr(Reg.rbx, 56); inst.args.push(arg); arg = Arg.createTmp(Reg.rdi); inst.args.push(arg); bb5.append(inst); inst = new Inst(Move); arg = Arg.createAddr(Reg.rbx, 8); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); bb5.append(inst); inst = new Inst(Move); arg = Arg.createAddr(Reg.rax, -24); inst.args.push(arg); arg = Arg.createTmp(Reg.r10); inst.args.push(arg); bb5.append(inst); inst = new Inst(Move); arg = Arg.createAddr(Reg.r10, 16); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); bb5.append(inst); inst = new Inst(BranchTest64); arg = Arg.createResCond(NonZero); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); bb5.append(inst); bb6.successors.push(new FrequentedBlock(bb1, Rare)); bb6.successors.push(new FrequentedBlock(bb7, Normal)); bb6.predecessors.push(bb5); inst = new Inst(Move32); arg = Arg.createImm(1); inst.args.push(arg); arg = Arg.createAddr(Reg.rbp, 36); inst.args.push(arg); bb6.append(inst); inst = new Inst(Move); arg = Arg.createTmp(Reg.r10); inst.args.push(arg); arg = Arg.createStack(slot8, 0); inst.args.push(arg); bb6.append(inst); inst = new Inst(Move); arg = Arg.createTmp(Reg.r10); inst.args.push(arg); arg = Arg.createTmp(Reg.rsi); inst.args.push(arg); bb6.append(inst); inst = new Inst(Move); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); arg = Arg.createTmp(Reg.r10); inst.args.push(arg); bb6.append(inst); inst = new Inst(Move); arg = Arg.createTmp(Reg.r8); inst.args.push(arg); arg = Arg.createStack(slot7, 0); inst.args.push(arg); bb6.append(inst); inst = new Inst(Move); arg = Arg.createTmp(Reg.rdi); inst.args.push(arg); arg = Arg.createStack(slot6, 0); inst.args.push(arg); bb6.append(inst); inst = new Inst(Move); arg = Arg.createTmp(Reg.rbp); inst.args.push(arg); arg = Arg.createTmp(Reg.rdi); 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); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createTmp(Reg.rdx); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm0); inst.args.push(arg); arg = Arg.createTmp(Reg.rdi); inst.args.push(arg); arg = Arg.createTmp(Reg.rsi); inst.args.push(arg); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.extraClobberedRegs.add(Reg.rcx); inst.extraClobberedRegs.add(Reg.rsi); inst.extraClobberedRegs.add(Reg.rdi); inst.extraClobberedRegs.add(Reg.r8); inst.extraClobberedRegs.add(Reg.r9); inst.extraClobberedRegs.add(Reg.r10); inst.extraClobberedRegs.add(Reg.r11); inst.extraClobberedRegs.add(Reg.xmm1); inst.extraClobberedRegs.add(Reg.xmm2); inst.extraClobberedRegs.add(Reg.xmm3); inst.extraClobberedRegs.add(Reg.xmm4); inst.extraClobberedRegs.add(Reg.xmm5); inst.extraClobberedRegs.add(Reg.xmm6); inst.extraClobberedRegs.add(Reg.xmm7); inst.extraClobberedRegs.add(Reg.xmm8); inst.extraClobberedRegs.add(Reg.xmm9); inst.extraClobberedRegs.add(Reg.xmm10); inst.extraClobberedRegs.add(Reg.xmm11); inst.extraClobberedRegs.add(Reg.xmm12); inst.extraClobberedRegs.add(Reg.xmm13); inst.extraClobberedRegs.add(Reg.xmm14); inst.extraClobberedRegs.add(Reg.xmm15); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Def, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Def, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Def, type: FP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); bb6.append(inst); inst = new Inst(Move); arg = Arg.createStack(slot8, 0); inst.args.push(arg); arg = Arg.createTmp(Reg.r10); inst.args.push(arg); bb6.append(inst); inst = new Inst(Move); arg = Arg.createStack(slot7, 0); inst.args.push(arg); arg = Arg.createTmp(Reg.r8); inst.args.push(arg); bb6.append(inst); inst = new Inst(Move); arg = Arg.createStack(slot6, 0); inst.args.push(arg); arg = Arg.createTmp(Reg.rdi); inst.args.push(arg); bb6.append(inst); inst = new Inst(Move); arg = Arg.createBigImm(129987312, 1); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); bb6.append(inst); inst = new Inst(BranchTest64); arg = Arg.createResCond(NonZero); inst.args.push(arg); arg = Arg.createAddr(Reg.rcx, 0); inst.args.push(arg); arg = Arg.createImm(-1); inst.args.push(arg); bb6.append(inst); bb7.successors.push(new FrequentedBlock(bb11, Normal)); bb7.predecessors.push(bb6); inst = new Inst(Move); arg = Arg.createAddr(Reg.rax, 8); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); bb7.append(inst); inst = new Inst(Jump); bb7.append(inst); bb8.successors.push(new FrequentedBlock(bb11, Normal)); bb8.predecessors.push(bb5); inst = new Inst(Move); arg = Arg.createAddr(Reg.rax, 8); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); bb8.append(inst); inst = new Inst(Jump); bb8.append(inst); bb9.successors.push(new FrequentedBlock(bb11, Normal)); bb9.predecessors.push(bb15); inst = new Inst(Move); arg = Arg.createTmp(Reg.r9); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); bb9.append(inst); inst = new Inst(Jump); bb9.append(inst); bb10.successors.push(new FrequentedBlock(bb11, Normal)); bb10.predecessors.push(bb18); inst = new Inst(Move); arg = Arg.createTmp(Reg.r9); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); bb10.append(inst); inst = new Inst(Jump); bb10.append(inst); bb11.successors.push(new FrequentedBlock(bb12, Normal)); bb11.successors.push(new FrequentedBlock(bb16, Normal)); bb11.predecessors.push(bb7); bb11.predecessors.push(bb10); bb11.predecessors.push(bb9); bb11.predecessors.push(bb8); inst = new Inst(Move); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createTmp(Reg.r9); inst.args.push(arg); bb11.append(inst); inst = new Inst(Move); arg = Arg.createAddr(Reg.rbx, 40); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); bb11.append(inst); inst = new Inst(Move32); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createTmp(Reg.rsi); 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); arg = Arg.createImm(1); inst.args.push(arg); arg = Arg.createTmp(Reg.rsi); inst.args.push(arg); arg = Arg.createTmp(Reg.rbx); inst.args.push(arg); arg = Arg.createStack(slot5, 0); inst.args.push(arg); arg = Arg.createTmp(Reg.rbx); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.UseZDef, type: GP, width: 32}); inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 32}); inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 32}); bb11.append(inst); inst = new Inst(Move32); arg = Arg.createTmp(Reg.rsi); inst.args.push(arg); arg = Arg.createTmp(Reg.rdx); inst.args.push(arg); bb11.append(inst); inst = new Inst(Add64); arg = Arg.createTmp(Reg.rdx); inst.args.push(arg); arg = Arg.createTmp(Reg.r14); inst.args.push(arg); arg = Arg.createTmp(Reg.r11); inst.args.push(arg); bb11.append(inst); inst = new Inst(Move); arg = Arg.createTmp(Reg.r11); inst.args.push(arg); arg = Arg.createAddr(Reg.rbx, 40); inst.args.push(arg); bb11.append(inst); inst = new Inst(Move); arg = Arg.createAddr(Reg.rbx, 32); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); bb11.append(inst); inst = new Inst(Move32); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); 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); arg = Arg.createImm(1); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createTmp(Reg.rbx); inst.args.push(arg); arg = Arg.createStack(slot5, 0); inst.args.push(arg); arg = Arg.createTmp(Reg.rbx); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.UseZDef, type: GP, width: 32}); inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 32}); inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 32}); bb11.append(inst); inst = new Inst(Move32); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); bb11.append(inst); inst = new Inst(Add64); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createTmp(Reg.r14); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); bb11.append(inst); inst = new Inst(Move); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createAddr(Reg.rbx, 32); inst.args.push(arg); bb11.append(inst); inst = new Inst(Branch32); arg = Arg.createRelCond(LessThan); inst.args.push(arg); arg = Arg.createTmp(Reg.rsi); inst.args.push(arg); arg = Arg.createTmp(Reg.rdi); inst.args.push(arg); bb11.append(inst); bb12.successors.push(new FrequentedBlock(bb13, Normal)); 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); arg = Arg.createTmp(Reg.rsi); inst.args.push(arg); arg = Arg.createAddr(Reg.r10, 12); inst.args.push(arg); arg = Arg.createTmp(Reg.rbx); inst.args.push(arg); arg = Arg.createStack(slot5, 0); inst.args.push(arg); arg = Arg.createTmp(Reg.rbx); inst.args.push(arg); arg = Arg.createTmp(Reg.rbx); inst.args.push(arg); arg = Arg.createTmp(Reg.rbx); inst.args.push(arg); arg = Arg.createTmp(Reg.rsi); inst.args.push(arg); arg = Arg.createTmp(Reg.r10); inst.args.push(arg); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); bb12.append(inst); inst = new Inst(Move); arg = Arg.createAddr(Reg.r10, 16); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); bb12.append(inst); inst = new Inst(BranchTest32); arg = Arg.createResCond(NonZero); inst.args.push(arg); arg = Arg.createAddr(Reg.rax, 16); inst.args.push(arg); arg = Arg.createImm(8); inst.args.push(arg); bb12.append(inst); bb13.successors.push(new FrequentedBlock(bb15, Normal)); bb13.predecessors.push(bb12); inst = new Inst(Load8); arg = Arg.createIndex(Reg.r9, Reg.rdx, 1, 0); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); bb13.append(inst); inst = new Inst(Jump); bb13.append(inst); bb14.successors.push(new FrequentedBlock(bb15, Normal)); bb14.predecessors.push(bb12); inst = new Inst(Load16); arg = Arg.createIndex(Reg.r9, Reg.rdx, 2, 0); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); bb14.append(inst); inst = new Inst(Jump); bb14.append(inst); bb15.successors.push(new FrequentedBlock(bb9, Normal)); bb15.successors.push(new FrequentedBlock(bb17, Normal)); bb15.predecessors.push(bb14); bb15.predecessors.push(bb13); inst = new Inst(Move32); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createTmp(Reg.rsi); inst.args.push(arg); bb15.append(inst); inst = new Inst(Move32); arg = Arg.createTmp(Reg.rsi); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); bb15.append(inst); inst = new Inst(Add64); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createTmp(Reg.r14); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); bb15.append(inst); inst = new Inst(Move); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); arg = Arg.createAddr(Reg.rbx, 72); 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); arg = Arg.createTmp(Reg.rsi); inst.args.push(arg); arg = Arg.createTmp(Reg.r8); inst.args.push(arg); arg = Arg.createTmp(Reg.rbx); inst.args.push(arg); arg = Arg.createStack(slot5, 0); inst.args.push(arg); arg = Arg.createTmp(Reg.rsi); inst.args.push(arg); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32}); bb15.append(inst); inst = new Inst(Move); arg = Arg.createIndex(Reg.r12, Reg.rax, 8, 0); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); bb15.append(inst); inst = new Inst(MoveConditionallyTest64); arg = Arg.createResCond(NonZero); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createImm(-1); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createTmp(Reg.r13); inst.args.push(arg); arg = Arg.createTmp(Reg.rdx); inst.args.push(arg); bb15.append(inst); inst = new Inst(Move); arg = Arg.createTmp(Reg.rdx); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); bb15.append(inst); inst = new Inst(Xor64); arg = Arg.createImm(6); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); bb15.append(inst); inst = new Inst(Move); arg = Arg.createImm(-2); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); 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); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createTmp(Reg.rdx); inst.args.push(arg); arg = Arg.createTmp(Reg.rbx); inst.args.push(arg); arg = Arg.createStack(slot5, 0); inst.args.push(arg); arg = Arg.createTmp(Reg.rdx); inst.args.push(arg); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); bb15.append(inst); inst = new Inst(Move); arg = Arg.createImm(1); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); bb15.append(inst); inst = new Inst(BranchTest64); arg = Arg.createResCond(NonZero); inst.args.push(arg); arg = Arg.createTmp(Reg.rdx); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); 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); arg = Arg.createStack(slot5, 0); inst.args.push(arg); arg = Arg.createTmp(Reg.rbx); inst.args.push(arg); arg = Arg.createTmp(Reg.rbx); inst.args.push(arg); arg = Arg.createTmp(Reg.rbx); inst.args.push(arg); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); bb16.append(inst); inst = new Inst(Oops); bb16.append(inst); bb17.successors.push(new FrequentedBlock(bb18, Normal)); bb17.successors.push(new FrequentedBlock(bb19, Normal)); bb17.predecessors.push(bb15); inst = new Inst(Branch32); arg = Arg.createRelCond(GreaterThanOrEqual); inst.args.push(arg); arg = Arg.createTmp(Reg.rsi); inst.args.push(arg); arg = Arg.createImm(48); inst.args.push(arg); bb17.append(inst); bb18.successors.push(new FrequentedBlock(bb10, Normal)); bb18.successors.push(new FrequentedBlock(bb19, Normal)); bb18.predecessors.push(bb17); inst = new Inst(Branch32); arg = Arg.createRelCond(LessThanOrEqual); inst.args.push(arg); arg = Arg.createTmp(Reg.rsi); inst.args.push(arg); arg = Arg.createImm(57); inst.args.push(arg); bb18.append(inst); bb19.successors.push(new FrequentedBlock(bb20, Normal)); bb19.successors.push(new FrequentedBlock(bb21, Normal)); bb19.predecessors.push(bb17); bb19.predecessors.push(bb18); inst = new Inst(Branch32); arg = Arg.createRelCond(GreaterThanOrEqual); inst.args.push(arg); arg = Arg.createTmp(Reg.rsi); inst.args.push(arg); arg = Arg.createImm(128); inst.args.push(arg); 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); arg = Arg.createStack(slot5, 0); inst.args.push(arg); arg = Arg.createTmp(Reg.rbx); inst.args.push(arg); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); bb20.append(inst); inst = new Inst(Oops); bb20.append(inst); bb21.successors.push(new FrequentedBlock(bb22, Normal)); 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); arg = Arg.createStack(slot5, 0); inst.args.push(arg); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32}); bb21.append(inst); inst = new Inst(Branch32); arg = Arg.createRelCond(Equal); inst.args.push(arg); arg = Arg.createTmp(Reg.rsi); inst.args.push(arg); arg = Arg.createImm(92); inst.args.push(arg); 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); arg = Arg.createStack(slot5, 0); inst.args.push(arg); arg = Arg.createTmp(Reg.rbx); inst.args.push(arg); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); bb22.append(inst); inst = new Inst(Oops); bb22.append(inst); bb23.successors.push(new FrequentedBlock(bb2, Rare)); bb23.successors.push(new FrequentedBlock(bb24, Normal)); bb23.predecessors.push(bb21); inst = new Inst(Move); arg = Arg.createAddr(Reg.rbx, 48); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); bb23.append(inst); inst = new Inst(Move); arg = Arg.createBigImm(155021568, 1); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); bb23.append(inst); inst = new Inst(Move); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createCallArg(8); inst.args.push(arg); bb23.append(inst); inst = new Inst(Move32); arg = Arg.createImm(3); inst.args.push(arg); arg = Arg.createCallArg(16); inst.args.push(arg); bb23.append(inst); inst = new Inst(Move); arg = Arg.createTmp(Reg.r10); inst.args.push(arg); arg = Arg.createCallArg(24); inst.args.push(arg); bb23.append(inst); inst = new Inst(Move); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); arg = Arg.createCallArg(32); inst.args.push(arg); bb23.append(inst); inst = new Inst(Move); arg = Arg.createTmp(Reg.r11); inst.args.push(arg); arg = Arg.createCallArg(40); 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); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createCallArg(8); inst.args.push(arg); arg = Arg.createCallArg(16); inst.args.push(arg); arg = Arg.createCallArg(24); inst.args.push(arg); arg = Arg.createCallArg(32); inst.args.push(arg); arg = Arg.createCallArg(40); inst.args.push(arg); arg = Arg.createTmp(Reg.r15); inst.args.push(arg); arg = Arg.createTmp(Reg.r14); inst.args.push(arg); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.extraEarlyClobberedRegs.add(Reg.r11); inst.extraClobberedRegs.add(Reg.rcx); inst.extraClobberedRegs.add(Reg.rdx); inst.extraClobberedRegs.add(Reg.rsi); inst.extraClobberedRegs.add(Reg.rdi); inst.extraClobberedRegs.add(Reg.r8); inst.extraClobberedRegs.add(Reg.r9); inst.extraClobberedRegs.add(Reg.r10); inst.extraClobberedRegs.add(Reg.r11); inst.extraClobberedRegs.add(Reg.xmm0); inst.extraClobberedRegs.add(Reg.xmm1); inst.extraClobberedRegs.add(Reg.xmm2); inst.extraClobberedRegs.add(Reg.xmm3); inst.extraClobberedRegs.add(Reg.xmm4); inst.extraClobberedRegs.add(Reg.xmm5); inst.extraClobberedRegs.add(Reg.xmm6); inst.extraClobberedRegs.add(Reg.xmm7); inst.extraClobberedRegs.add(Reg.xmm8); inst.extraClobberedRegs.add(Reg.xmm9); inst.extraClobberedRegs.add(Reg.xmm10); inst.extraClobberedRegs.add(Reg.xmm11); inst.extraClobberedRegs.add(Reg.xmm12); inst.extraClobberedRegs.add(Reg.xmm13); inst.extraClobberedRegs.add(Reg.xmm14); inst.extraClobberedRegs.add(Reg.xmm15); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Def, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); bb23.append(inst); inst = new Inst(Move); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createTmp(Reg.r12); 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); arg = Arg.createTmp(Reg.r12); inst.args.push(arg); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); bb23.append(inst); inst = new Inst(Move); arg = Arg.createBigImm(155041288, 1); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); bb23.append(inst); inst = new Inst(Move); arg = Arg.createAddr(Reg.rax, 0); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); bb23.append(inst); inst = new Inst(Move); arg = Arg.createAddr(Reg.rax, -1336); inst.args.push(arg); arg = Arg.createTmp(Reg.r13); 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); arg = Arg.createTmp(Reg.r13); inst.args.push(arg); arg = Arg.createTmp(Reg.r15); inst.args.push(arg); arg = Arg.createTmp(Reg.r13); inst.args.push(arg); arg = Arg.createTmp(Reg.rbx); inst.args.push(arg); arg = Arg.createTmp(Reg.r12); inst.args.push(arg); arg = Arg.createTmp(Reg.r13); inst.args.push(arg); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); bb23.append(inst); inst = new Inst(Move); arg = Arg.createAddr(Reg.r13, 24); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); bb23.append(inst); inst = new Inst(Move); arg = Arg.createTmp(Reg.r12); inst.args.push(arg); arg = Arg.createStack(slot0, 0); inst.args.push(arg); bb23.append(inst); inst = new Inst(Move32); arg = Arg.createImm(2); inst.args.push(arg); arg = Arg.createAddr(Reg.rbp, 36); inst.args.push(arg); bb23.append(inst); inst = new Inst(Move); arg = Arg.createBigImm(108356304, 1); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); bb23.append(inst); inst = new Inst(Move); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); arg = Arg.createStack(slot3, 0); inst.args.push(arg); bb23.append(inst); inst = new Inst(Move); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createTmp(Reg.rsi); inst.args.push(arg); bb23.append(inst); inst = new Inst(Move); arg = Arg.createTmp(Reg.r12); inst.args.push(arg); arg = Arg.createTmp(Reg.rdx); inst.args.push(arg); bb23.append(inst); inst = new Inst(Move); arg = Arg.createTmp(Reg.rbp); inst.args.push(arg); arg = Arg.createTmp(Reg.rdi); 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); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createTmp(Reg.rdx); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm0); inst.args.push(arg); arg = Arg.createTmp(Reg.rdi); inst.args.push(arg); arg = Arg.createTmp(Reg.rsi); inst.args.push(arg); arg = Arg.createTmp(Reg.rdx); inst.args.push(arg); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.extraClobberedRegs.add(Reg.rcx); inst.extraClobberedRegs.add(Reg.rsi); inst.extraClobberedRegs.add(Reg.rdi); inst.extraClobberedRegs.add(Reg.r8); inst.extraClobberedRegs.add(Reg.r9); inst.extraClobberedRegs.add(Reg.r10); inst.extraClobberedRegs.add(Reg.r11); inst.extraClobberedRegs.add(Reg.xmm1); inst.extraClobberedRegs.add(Reg.xmm2); inst.extraClobberedRegs.add(Reg.xmm3); inst.extraClobberedRegs.add(Reg.xmm4); inst.extraClobberedRegs.add(Reg.xmm5); inst.extraClobberedRegs.add(Reg.xmm6); inst.extraClobberedRegs.add(Reg.xmm7); inst.extraClobberedRegs.add(Reg.xmm8); inst.extraClobberedRegs.add(Reg.xmm9); inst.extraClobberedRegs.add(Reg.xmm10); inst.extraClobberedRegs.add(Reg.xmm11); inst.extraClobberedRegs.add(Reg.xmm12); inst.extraClobberedRegs.add(Reg.xmm13); inst.extraClobberedRegs.add(Reg.xmm14); inst.extraClobberedRegs.add(Reg.xmm15); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Def, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Def, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Def, type: FP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); bb23.append(inst); inst = new Inst(Move); arg = Arg.createBigImm(129987312, 1); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); bb23.append(inst); inst = new Inst(BranchTest64); arg = Arg.createResCond(NonZero); inst.args.push(arg); arg = Arg.createAddr(Reg.rcx, 0); inst.args.push(arg); arg = Arg.createImm(-1); inst.args.push(arg); bb23.append(inst); bb24.successors.push(new FrequentedBlock(bb25, Normal)); 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); arg = Arg.createTmp(Reg.r12); inst.args.push(arg); arg = Arg.createTmp(Reg.r13); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); bb24.append(inst); inst = new Inst(BranchTest64); arg = Arg.createResCond(NonZero); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createTmp(Reg.r15); inst.args.push(arg); bb24.append(inst); bb25.successors.push(new FrequentedBlock(bb27, Normal)); bb25.successors.push(new FrequentedBlock(bb26, Normal)); bb25.predecessors.push(bb24); inst = new Inst(Move); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); bb25.append(inst); inst = new Inst(And64); arg = Arg.createImm(-9); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); bb25.append(inst); inst = new Inst(Branch64); arg = Arg.createRelCond(Equal); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); arg = Arg.createImm(2); inst.args.push(arg); bb25.append(inst); bb26.successors.push(new FrequentedBlock(bb29, Normal)); bb26.successors.push(new FrequentedBlock(bb28, Normal)); bb26.predecessors.push(bb24); bb26.predecessors.push(bb25); inst = new Inst(BranchTest64); arg = Arg.createResCond(NonZero); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createTmp(Reg.r15); inst.args.push(arg); bb26.append(inst); bb27.successors.push(new FrequentedBlock(bb30, Normal)); bb27.predecessors.push(bb25); inst = new Inst(Move); arg = Arg.createImm(2); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); bb27.append(inst); inst = new Inst(Jump); bb27.append(inst); bb28.successors.push(new FrequentedBlock(bb32, Normal)); bb28.predecessors.push(bb26); inst = new Inst(Jump); bb28.append(inst); bb29.successors.push(new FrequentedBlock(bb30, Normal)); bb29.predecessors.push(bb26); inst = new Inst(Jump); bb29.append(inst); bb30.successors.push(new FrequentedBlock(bb34, Normal)); bb30.successors.push(new FrequentedBlock(bb31, Normal)); bb30.predecessors.push(bb29); bb30.predecessors.push(bb27); inst = new Inst(Move); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); bb30.append(inst); inst = new Inst(And64); arg = Arg.createImm(-9); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); bb30.append(inst); inst = new Inst(Branch64); arg = Arg.createRelCond(Equal); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); arg = Arg.createImm(2); inst.args.push(arg); bb30.append(inst); bb31.successors.push(new FrequentedBlock(bb32, Normal)); bb31.predecessors.push(bb30); inst = new Inst(Jump); bb31.append(inst); bb32.successors.push(new FrequentedBlock(bb3, Rare)); bb32.successors.push(new FrequentedBlock(bb33, Normal)); bb32.predecessors.push(bb28); bb32.predecessors.push(bb31); inst = new Inst(Move32); arg = Arg.createImm(3); inst.args.push(arg); arg = Arg.createAddr(Reg.rbp, 36); inst.args.push(arg); bb32.append(inst); inst = new Inst(Move); arg = Arg.createBigImm(154991632, 1); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); bb32.append(inst); inst = new Inst(Move); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createTmp(Reg.rdx); inst.args.push(arg); bb32.append(inst); inst = new Inst(Move); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); arg = Arg.createTmp(Reg.rsi); inst.args.push(arg); bb32.append(inst); inst = new Inst(Move); arg = Arg.createTmp(Reg.rbp); inst.args.push(arg); arg = Arg.createTmp(Reg.rdi); inst.args.push(arg); bb32.append(inst); inst = new Inst(Patch); arg = Arg.createSpecial(); inst.args.push(arg); arg = Arg.createBigImm(108356304, 1); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createTmp(Reg.rdx); inst.args.push(arg); arg = Arg.createTmp(Reg.xmm0); inst.args.push(arg); arg = Arg.createTmp(Reg.rdi); inst.args.push(arg); arg = Arg.createTmp(Reg.rsi); inst.args.push(arg); arg = Arg.createTmp(Reg.rdx); inst.args.push(arg); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.extraClobberedRegs.add(Reg.rcx); inst.extraClobberedRegs.add(Reg.rsi); inst.extraClobberedRegs.add(Reg.rdi); inst.extraClobberedRegs.add(Reg.r8); inst.extraClobberedRegs.add(Reg.r9); inst.extraClobberedRegs.add(Reg.r10); inst.extraClobberedRegs.add(Reg.r11); inst.extraClobberedRegs.add(Reg.xmm1); inst.extraClobberedRegs.add(Reg.xmm2); inst.extraClobberedRegs.add(Reg.xmm3); inst.extraClobberedRegs.add(Reg.xmm4); inst.extraClobberedRegs.add(Reg.xmm5); inst.extraClobberedRegs.add(Reg.xmm6); inst.extraClobberedRegs.add(Reg.xmm7); inst.extraClobberedRegs.add(Reg.xmm8); inst.extraClobberedRegs.add(Reg.xmm9); inst.extraClobberedRegs.add(Reg.xmm10); inst.extraClobberedRegs.add(Reg.xmm11); inst.extraClobberedRegs.add(Reg.xmm12); inst.extraClobberedRegs.add(Reg.xmm13); inst.extraClobberedRegs.add(Reg.xmm14); inst.extraClobberedRegs.add(Reg.xmm15); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Def, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Def, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Def, type: FP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); bb32.append(inst); inst = new Inst(Move); arg = Arg.createBigImm(129987312, 1); inst.args.push(arg); arg = Arg.createTmp(Reg.rcx); inst.args.push(arg); bb32.append(inst); inst = new Inst(BranchTest64); arg = Arg.createResCond(NonZero); inst.args.push(arg); arg = Arg.createAddr(Reg.rcx, 0); inst.args.push(arg); arg = Arg.createImm(-1); inst.args.push(arg); 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); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); bb33.append(inst); inst = new Inst(Ret64); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); bb33.append(inst); bb34.predecessors.push(bb30); inst = new Inst(Move); arg = Arg.createBigImm(153835296, 1); inst.args.push(arg); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); bb34.append(inst); inst = new Inst(Move); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createCallArg(8); inst.args.push(arg); bb34.append(inst); inst = new Inst(Move32); arg = Arg.createImm(3); inst.args.push(arg); arg = Arg.createCallArg(16); inst.args.push(arg); bb34.append(inst); inst = new Inst(Move); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createCallArg(24); inst.args.push(arg); bb34.append(inst); inst = new Inst(Move); arg = Arg.createTmp(Reg.r12); inst.args.push(arg); arg = Arg.createCallArg(32); inst.args.push(arg); bb34.append(inst); inst = new Inst(Move); arg = Arg.createImm(6); inst.args.push(arg); arg = Arg.createCallArg(40); 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); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); arg = Arg.createCallArg(8); inst.args.push(arg); arg = Arg.createCallArg(16); inst.args.push(arg); arg = Arg.createCallArg(24); inst.args.push(arg); arg = Arg.createCallArg(32); inst.args.push(arg); arg = Arg.createCallArg(40); inst.args.push(arg); arg = Arg.createTmp(Reg.r15); inst.args.push(arg); arg = Arg.createTmp(Reg.r14); inst.args.push(arg); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.extraEarlyClobberedRegs.add(Reg.r11); inst.extraClobberedRegs.add(Reg.rcx); inst.extraClobberedRegs.add(Reg.rdx); inst.extraClobberedRegs.add(Reg.rsi); inst.extraClobberedRegs.add(Reg.rdi); inst.extraClobberedRegs.add(Reg.r8); inst.extraClobberedRegs.add(Reg.r9); inst.extraClobberedRegs.add(Reg.r10); inst.extraClobberedRegs.add(Reg.r11); inst.extraClobberedRegs.add(Reg.xmm0); inst.extraClobberedRegs.add(Reg.xmm1); inst.extraClobberedRegs.add(Reg.xmm2); inst.extraClobberedRegs.add(Reg.xmm3); inst.extraClobberedRegs.add(Reg.xmm4); inst.extraClobberedRegs.add(Reg.xmm5); inst.extraClobberedRegs.add(Reg.xmm6); inst.extraClobberedRegs.add(Reg.xmm7); inst.extraClobberedRegs.add(Reg.xmm8); inst.extraClobberedRegs.add(Reg.xmm9); inst.extraClobberedRegs.add(Reg.xmm10); inst.extraClobberedRegs.add(Reg.xmm11); inst.extraClobberedRegs.add(Reg.xmm12); inst.extraClobberedRegs.add(Reg.xmm13); inst.extraClobberedRegs.add(Reg.xmm14); inst.extraClobberedRegs.add(Reg.xmm15); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Def, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 32}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); 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); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); inst.patchHasNonArgEffects = true; inst.extraEarlyClobberedRegs = new Set(); inst.extraClobberedRegs = new Set(); inst.patchArgData = []; inst.patchArgData.push({role: Arg.Use, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64}); bb34.append(inst); inst = new Inst(Ret64); arg = Arg.createTmp(Reg.rax); inst.args.push(arg); bb34.append(inst); return code; } class AirBenchmark { constructor(verbose = 0) { this._verbose = verbose; this._payloads = [ {generate: createPayloadGbemuExecuteIteration, earlyHash: 632653144, lateHash: 372715518}, {generate: createPayloadImagingGaussianBlurGaussianBlur, earlyHash: 3677819581, lateHash: 1252116304}, {generate: createPayloadTypescriptScanIdentifier, earlyHash: 1914852601, lateHash: 837339551}, {generate: createPayloadAirJSACLj8C, earlyHash: 1373599940, lateHash: 3981283600} ]; } runIteration() { for (let payload of this._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 (this._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 (this._verbose) { print("After allocateStack:"); print(code); } hash = code.hash(); if (hash != payload.lateHash) throw new Error(`Wrong late hash for ${payload.generate.name}: ${hash}`); } } } function runBenchmark() { const verbose = 0; const numIterations = 5; let before = currentTime(); let benchmark = new AirBenchmark(verbose); for (let iteration = 0; iteration < numIterations; ++iteration) benchmark.runIteration(); let after = currentTime(); return after - before; } runBenchmark();