| /* |
| * Copyright (C) 2016 Apple Inc. All rights reserved. |
| * |
| * Redistribution and use in source and binary forms, with or without |
| * modification, are permitted provided that the following conditions |
| * are met: |
| * 1. Redistributions of source code must retain the above copyright |
| * notice, this list of conditions and the following disclaimer. |
| * 2. Redistributions in binary form must reproduce the above copyright |
| * notice, this list of conditions and the following disclaimer in the |
| * documentation and/or other materials provided with the distribution. |
| * |
| * THIS SOFTWARE IS PROVIDED BY APPLE 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; |