summaryrefslogblamecommitdiff
path: root/sources/scalac/backend/Primitive.java
blob: 5cc6f491069ae84f781d109fac7677c745546b81 (plain) (tree)




















                                                                          

                               
                                                                

                                  


                                                   

                                   




                                                      

                         


                                                      

                       


                                                        

                            






                                                       

                               
                                                   

                                

                                                       

                       


                                                         
 
                     




                                                             
 


                                                                  
                        
                                                                                    

                           
                                                        
 


                                                           
                         























































































                                                                         
 


























                                                                  
/*     ____ ____  ____ ____  ______                                     *\
**    / __// __ \/ __// __ \/ ____/    SOcos COmpiles Scala             **
**  __\_ \/ /_/ / /__/ /_/ /\_ \       (c) 2002, LAMP/EPFL              **
** /_____/\____/\___/\____/____/                                        **
\*                                                                      */

// Old$Id$
// $Id$

package scalac.backend;

import scalac.util.Debug;

/**
 * Primitive functions.
 *
 * @author Michel Schinz, Philippe Altherr
 * @version 1.0
 */

public class Primitive {

    // Non-primitive operations
    public case NOT_A_PRIMITIVE;              // not a primitive

    // Arithmetic unary operations
    public case POS;                          // +x
    public case NEG;                          // -x
    public case NOT;                          // ~x

    // Arithmetic binary operations
    public case ADD;                          // x + y
    public case SUB;                          // x - y
    public case MUL;                          // x * y
    public case DIV;                          // x / y
    public case MOD;                          // x % y

    // Bitwise operations
    public case OR;                           // x | y
    public case XOR;                          // x ^ y
    public case AND;                          // x & y

    // Shift operations
    public case LSL;                          // x << y
    public case LSR;                          // x >>> y
    public case ASR;                          // x >> y

    // Comparison operations
    public case ID;                           // x eq y
    public case EQ;                           // x == y
    public case NE;                           // x != y
    public case LT;                           // x < y
    public case LE;                           // x <= y
    public case GE;                           // x > y
    public case GT;                           // x >= y

    // Boolean unary operations
    public case ZNOT;                         // !x

    // Boolean binary operations
    public case ZOR;                          // x || y
    public case ZAND;                         // x && y

    // Array operations
    public case LENGTH;                       // x.length
    public case APPLY;                        // x(y)
    public case UPDATE;                       // x(y) = z

    // Any operations
    public case IS;                           // x.is[y]
    public case AS;                           // x.as[y]
    public case EQUALS;                       // x.equals(y)
    public case HASHCODE;                     // x.hashcode()
    public case TOSTRING;                     // x.toString()

    // AnyRef operations
    public case SYNCHRONIZED;                 // x.synchronized(y)

    // String operations
    public case CONCAT;                       // String.valueOf(x)+String.valueOf(y)

    // Throwable operations
    public case THROW;                        // throw x

    // Value types conversions
    public case COERCE;                       // x.coerce()

    // RunTime operations
    public case BOX;                          // RunTime.box_<X>(x)
    public case UNBOX;                        // RunTime.unbox_<X>(x)
    public case NEW_ZARRAY;                   // RunTime.zarray(x)
    public case NEW_BARRAY;                   // RunTime.barray(x)
    public case NEW_SARRAY;                   // RunTime.sarray(x)
    public case NEW_CARRAY;                   // RunTime.carray(x)
    public case NEW_IARRAY;                   // RunTime.iarray(x)
    public case NEW_LARRAY;                   // RunTime.larray(x)
    public case NEW_FARRAY;                   // RunTime.farray(x)
    public case NEW_DARRAY;                   // RunTime.darray(x)
    public case NEW_OARRAY;                   // RunTime.oarray(x)
    public case ZARRAY_LENGTH;                // RunTime.zarray_length(x)
    public case BARRAY_LENGTH;                // RunTime.barray_length(x)
    public case SARRAY_LENGTH;                // RunTime.sarray_length(x)
    public case CARRAY_LENGTH;                // RunTime.carray_length(x)
    public case IARRAY_LENGTH;                // RunTime.iarray_length(x)
    public case LARRAY_LENGTH;                // RunTime.larray_length(x)
    public case FARRAY_LENGTH;                // RunTime.farray_length(x)
    public case DARRAY_LENGTH;                // RunTime.darray_length(x)
    public case OARRAY_LENGTH;                // RunTime.oarray_length(x)
    public case ZARRAY_GET;                   // RunTime.zarray_get(x,y)
    public case BARRAY_GET;                   // RunTime.barray_get(x,y)
    public case SARRAY_GET;                   // RunTime.sarray_get(x,y)
    public case CARRAY_GET;                   // RunTime.carray_get(x,y)
    public case IARRAY_GET;                   // RunTime.iarray_get(x,y)
    public case LARRAY_GET;                   // RunTime.larray_get(x,y)
    public case FARRAY_GET;                   // RunTime.farray_get(x,y)
    public case DARRAY_GET;                   // RunTime.darray_get(x,y)
    public case OARRAY_GET;                   // RunTime.oarray_get(x,y)
    public case ZARRAY_SET;                   // RunTime.zarray(x,y,z)
    public case BARRAY_SET;                   // RunTime.barray(x,y,z)
    public case SARRAY_SET;                   // RunTime.sarray(x,y,z)
    public case CARRAY_SET;                   // RunTime.carray(x,y,z)
    public case IARRAY_SET;                   // RunTime.iarray(x,y,z)
    public case LARRAY_SET;                   // RunTime.larray(x,y,z)
    public case FARRAY_SET;                   // RunTime.farray(x,y,z)
    public case DARRAY_SET;                   // RunTime.darray(x,y,z)
    public case OARRAY_SET;                   // RunTime.oarray(x,y,z)

    public case B2B;                          // RunTime.b2b(x)
    public case B2S;                          // RunTime.b2s(x)
    public case B2C;                          // RunTime.b2c(x)
    public case B2I;                          // RunTime.b2i(x)
    public case B2L;                          // RunTime.b2l(x)
    public case B2F;                          // RunTime.b2f(x)
    public case B2D;                          // RunTime.b2d(x)
    public case S2B;                          // RunTime.s2b(x)
    public case S2S;                          // RunTime.s2s(x)
    public case S2C;                          // RunTime.s2c(x)
    public case S2I;                          // RunTime.s2i(x)
    public case S2L;                          // RunTime.s2l(x)
    public case S2F;                          // RunTime.s2f(x)
    public case S2D;                          // RunTime.s2d(x)
    public case C2B;                          // RunTime.c2b(x)
    public case C2S;                          // RunTime.c2s(x)
    public case C2C;                          // RunTime.c2c(x)
    public case C2I;                          // RunTime.c2i(x)
    public case C2L;                          // RunTime.c2l(x)
    public case C2F;                          // RunTime.c2f(x)
    public case C2D;                          // RunTime.c2d(x)
    public case I2B;                          // RunTime.i2b(x)
    public case I2S;                          // RunTime.i2s(x)
    public case I2C;                          // RunTime.i2c(x)
    public case I2I;                          // RunTime.i2i(x)
    public case I2L;                          // RunTime.i2l(x)
    public case I2F;                          // RunTime.i2f(x)
    public case I2D;                          // RunTime.i2d(x)
    public case L2B;                          // RunTime.l2b(x)
    public case L2S;                          // RunTime.l2s(x)
    public case L2C;                          // RunTime.l2c(x)
    public case L2I;                          // RunTime.l2i(x)
    public case L2L;                          // RunTime.l2l(x)
    public case L2F;                          // RunTime.l2f(x)
    public case L2D;                          // RunTime.l2d(x)
    public case F2B;                          // RunTime.f2b(x)
    public case F2S;                          // RunTime.f2s(x)
    public case F2C;                          // RunTime.f2c(x)
    public case F2I;                          // RunTime.f2i(x)
    public case F2L;                          // RunTime.f2l(x)
    public case F2F;                          // RunTime.f2f(x)
    public case F2D;                          // RunTime.f2d(x)
    public case D2B;                          // RunTime.d2b(x)
    public case D2S;                          // RunTime.d2s(x)
    public case D2C;                          // RunTime.d2c(x)
    public case D2I;                          // RunTime.d2i(x)
    public case D2L;                          // RunTime.d2l(x)
    public case D2F;                          // RunTime.d2f(x)
    public case D2D;                          // RunTime.d2d(x)

    /** Return negated version of comparison primitive. */
    public Primitive negate() {
        switch (this) {
        case LT: return Primitive.GE;
        case LE: return Primitive.GT;
        case EQ: return Primitive.NE;
        case NE: return Primitive.EQ;
        case GE: return Primitive.LT;
        case GT: return Primitive.LE;
        default: throw Debug.abort("unknown primitive", this);
        }
    }

    /** Return primitive with arguments swapped (e.g. <= is turned
     ** into =>). */
    public Primitive swap() {
        switch (this) {
        case LT: return Primitive.GT;
        case LE: return Primitive.GE;
        case EQ: return Primitive.EQ;
        case NE: return Primitive.NE;
        case GE: return Primitive.LE;
        case GT: return Primitive.LT;
        default: throw Debug.abort("unknown primitive", this);
        }
    }
}