| /* |
| * 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 "<invalid>"; |
| 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(); |