aa
TypeFlt.java
Go to the documentation of this file.
1 package com.cliffc.aa.type;
2 
3 import com.cliffc.aa.util.SB;
4 import com.cliffc.aa.util.VBitSet;
5 
6 import java.util.HashMap;
7 import java.util.function.Predicate;
8 
9 public class TypeFlt extends Type<TypeFlt> {
10  byte _x; // -2 bot, -1 not-null, 0 con, +1 not-null-top +2 top
11  byte _z; // bitsiZe, one of: 32,64
12  double _con;
13  private TypeFlt init(int x, int z, double con ) { super.init(TFLT,""); _x=(byte)x; _z=(byte)z; _con = con; return this; }
14  // Hash does not depend on other types
15  @Override int compute_hash() { return super.compute_hash()+_x+_z+(int)_con; }
16  @Override public boolean equals( Object o ) {
17  if( this==o ) return true;
18  if( !(o instanceof TypeFlt) ) return false;
19  TypeFlt t2 = (TypeFlt)o;
20  return super.equals(o) && _x==t2._x && _z==t2._z && _con==t2._con;
21  }
22  @Override public boolean cycle_equals( Type o ) { return equals(o); }
23  @Override public SB str( SB sb, VBitSet dups, TypeMem mem, boolean debug ) {
24  sb.p(_name);
25  if( _x==0 ) return sb.p(_con);
26  return sb.p(_x>0?"~":"").p(Math.abs(_x)==1?"n":"").p("flt").p(_z);
27  }
28 
29  static { new Pool(TFLT,new TypeFlt()); }
30  public static Type make( int x, int z, double con ) {
31  if( x==0 && (double)((long)con)==con ) return TypeInt.con((long)con);
32  TypeFlt t1 = POOLS[TFLT].malloc();
33  return t1.init(x,z,con).hashcons_free();
34  }
35 
36  public static Type con(double con) { return make(0,log(con),con); }
37 
38  public static final TypeFlt FLT64 = (TypeFlt)make(-2,64,0);
39  public static final TypeFlt FLT32 = (TypeFlt)make(-2,32,0);
40  public static final TypeFlt PI = (TypeFlt)con(Math.PI);
41  public static final TypeFlt NFLT64= (TypeFlt)make(-1,64,0);
42  public static final TypeFlt[] TYPES = new TypeFlt[]{FLT64,FLT32,PI,NFLT64};
43  static void init1( HashMap<String,Type> types ) {
44  types.put("flt32",FLT32);
45  types.put("flt64",FLT64);
46  types.put("flt" ,FLT64);
47  }
48  // Return a double from a TypeFlt constant; assert otherwise.
49  @Override public double getd() { assert is_con(); return _con; }
50  @Override public long getl() { assert is_con() && ((long)_con)==_con; return (long)_con; }
51 
52  @Override protected TypeFlt xdual() { return _x==0 ? this : new TypeFlt().init(-_x,_z,_con); }
53  @Override protected Type xmeet( Type t ) {
54  assert t != this;
55  switch( t._type ) {
56  case TFLT: break;
57  case TINT: return ((TypeInt)t).xmeetf(this);
58  case TFUNPTR:
59  case TMEMPTR:
60  case TRPC: return cross_nil(t);
61  case TFUNSIG:
62  case TARY:
63  case TLIVE:
64  case TOBJ:
65  case TSTR:
66  case TSTRUCT:
67  case TTUPLE:
68  case TMEM: return ALL;
69  default: throw typerr(t);
70  }
71  TypeFlt tf = (TypeFlt)t;
72  assert !equals(tf); // Already covered by interning
73  int maxz = Math.max(_z,tf._z);
74  int minz = Math.min(_z,tf._z);
75  if( _x== 0 && tf._x== 0 && _con==tf._con ) return make(0,maxz,_con);
76  if( _x<= 0 && tf._x<= 0 ) return make(Math.min(nn(),tf.nn()),maxz,0); // Both bottom, widen size
77  if( _x > 0 && tf._x > 0 ) return make(Math.min(_x,tf._x),minz,0); // Both top, narrow size
78  if( _x==-2 && tf._x== 2 ) return this; // Top loses to other guy
79  if( _x== 2 && tf._x==-2 ) return tf; // Top loses to other guy
80 
81  // ttop==+1,+2 and that is 0,-1,-2
82  TypeFlt that = _x>0 ? tf : this;
83  TypeFlt ttop = _x>0 ? this : tf;
84  if( that._x<0 ) return that; // Return low value
85  if( log(that._con) <= ttop._z && (that._con!=0 || ttop._x==2) )
86  return that; // Keep a fitting constant
87  return make(that.nn(),that._z,0); // No longer a constant
88  }
89  private int nn() { assert _x <=0; return _con!=0 || _x== -1 ? -1 : -2; }
90  static int log( double con ) { return ((double)(float)con)==con ? 32 : 64; }
91 
92  @Override public boolean above_center() { return _x>0; }
93  @Override public boolean may_be_con() { return _x>=0; }
94  @Override public boolean is_con() { return _x==0; }
95  @Override public boolean must_nil() { return _x==-2 || (_x==0 && _con==0); }
96  @Override public boolean may_nil() { return _x > 0 || (_x==0 && _con==0); }
97  @Override Type not_nil() { return _x==2 ? make(1,_z,_con) : this; }
98  @Override public Type meet_nil(Type nil) {
99  if( _x==2 ) return nil;
100  if( _x==0 && _con==0 ) return nil==Type.XNIL ? this : Type.NIL;
101  return TypeFlt.make(-2,_z,0);
102  }
103 
104  // Lattice of conversions:
105  // -1 unknown; top; might fail, might be free (Scalar->Int); Scalar might lift
106  // to e.g. Float and require a user-provided rounding conversion from F64->Int.
107  // 0 requires no/free conversion (Int8->Int64, F32->F64)
108  // +1 requires a bit-changing conversion (Int->Flt)
109  // 99 Bottom; No free converts; e.g. Flt->Int requires explicit rounding
110  @Override public byte isBitShape(Type t) {
111  // TODO: Allow loss-less conversions (e.g. small float integer constants convert to ints just fine)
112  if( t._type == Type.TFLT ) return (byte)(_z<=((TypeFlt)t)._z ? 0 : 99);
113  if( t._type == Type.TINT ) return 99; // Flt->Int always requires user intervention
114  if( t._type == Type.TMEMPTR ) return 99; // No flt->ptr conversion
115  if( t._type == Type.TFUNPTR ) return 99; // No flt->ptr conversion
116  if( t._type == Type.TALL ) return 99;
117  if( t._type == Type.TREAL ) return 1;
118  if( t._type == TSCALAR ) return 9; // Might have to autobox
119  throw com.cliffc.aa.AA.unimpl();
120  }
121  @Override public Type widen() {
122  assert _x <= 0;
123  return FLT64;
124  }
125  @Override public void walk( Predicate<Type> p ) { p.test(this); }
126 }
com.cliffc.aa.type.Type< TypeFlt >::TLIVE
static final byte TLIVE
Definition: Type.java:276
com.cliffc.aa.type.TypeFlt._x
byte _x
Definition: TypeFlt.java:10
com.cliffc.aa.type.TypeFlt.FLT32
static final TypeFlt FLT32
Definition: TypeFlt.java:39
com.cliffc.aa.type.Type< TypeFlt >::TMEMPTR
static final byte TMEMPTR
Definition: Type.java:273
com.cliffc.aa.type.TypeFlt.init1
static void init1(HashMap< String, Type > types)
Definition: TypeFlt.java:43
com.cliffc.aa.type.TypeFlt.cycle_equals
boolean cycle_equals(Type o)
Definition: TypeFlt.java:22
com.cliffc.aa.type.Type.TREAL
static final byte TREAL
Definition: Type.java:255
com.cliffc.aa.type.Type< TypeFlt >::typerr
RuntimeException typerr(Type t)
Definition: Type.java:947
com.cliffc.aa.type.TypeMem
Memory type; the state of all of memory; memory edges order memory ops.
Definition: TypeMem.java:53
com.cliffc
com.cliffc.aa.util
Definition: AbstractEntry.java:1
com.cliffc.aa.type.TypeInt
Definition: TypeInt.java:9
com.cliffc.aa.type.TypeFlt._con
double _con
Definition: TypeFlt.java:12
com.cliffc.aa.type.Type
an implementation of language AA
Definition: Type.java:94
com.cliffc.aa.type.TypeFlt.widen
Type widen()
Definition: TypeFlt.java:121
com.cliffc.aa.type.TypeFlt
Definition: TypeFlt.java:9
com.cliffc.aa.type.Type< TypeFlt >::TSTR
static final byte TSTR
Definition: Type.java:270
com.cliffc.aa.type.Type._type
byte _type
Definition: Type.java:98
com.cliffc.aa.type.TypeInt.con
static TypeInt con(long con)
Definition: TypeInt.java:37
com.cliffc.aa.type.TypeFlt.PI
static final TypeFlt PI
Definition: TypeFlt.java:40
com.cliffc.aa.AA.unimpl
static RuntimeException unimpl()
Definition: AA.java:10
com.cliffc.aa.type.Type< TypeFlt >::TFUNPTR
static final byte TFUNPTR
Definition: Type.java:274
com.cliffc.aa.type.Type< TypeFlt >::TINT
static final byte TINT
Definition: Type.java:263
com.cliffc.aa.type.TypeFlt.equals
boolean equals(Object o)
Definition: TypeFlt.java:16
com.cliffc.aa.type.Type< TypeFlt >::ALL
static final Type ALL
Definition: Type.java:324
com.cliffc.aa.type.TypeFlt.getd
double getd()
Definition: TypeFlt.java:49
com.cliffc.aa.type.Type< TypeFlt >::TMEM
static final byte TMEM
Definition: Type.java:272
com.cliffc.aa.type.Type< TypeFlt >::TTUPLE
static final byte TTUPLE
Definition: Type.java:266
com.cliffc.aa.type.TypeFlt.compute_hash
int compute_hash()
Definition: TypeFlt.java:15
com.cliffc.aa.type.TypeFlt.con
static Type con(double con)
Definition: TypeFlt.java:36
com.cliffc.aa.type.TypeFlt.TYPES
static final TypeFlt[] TYPES
Definition: TypeFlt.java:42
com.cliffc.aa.type.Type< TypeFlt >::TSTRUCT
static final byte TSTRUCT
Definition: Type.java:268
com.cliffc.aa.type.Type.TALL
static final byte TALL
Definition: Type.java:239
com.cliffc.aa.type.TypeFlt.make
static Type make(int x, int z, double con)
Definition: TypeFlt.java:30
com.cliffc.aa.type.TypeFlt.meet_nil
Type meet_nil(Type nil)
Definition: TypeFlt.java:98
com.cliffc.aa.type.TypeFlt.init
TypeFlt init(int x, int z, double con)
Definition: TypeFlt.java:13
com.cliffc.aa.type.Type< TypeFlt >::cross_nil
final Type cross_nil(Type t)
Definition: Type.java:865
com.cliffc.aa.type.TypeFlt.log
static int log(double con)
Definition: TypeFlt.java:90
com.cliffc.aa.type.Type< TypeFlt >::TSCALAR
static final byte TSCALAR
Definition: Type.java:246
com.cliffc.aa.type.TypeFlt.may_be_con
boolean may_be_con()
Definition: TypeFlt.java:93
com.cliffc.aa.type.Type< TypeFlt >::TRPC
static final byte TRPC
Definition: Type.java:265
com.cliffc.aa.util.VBitSet
Definition: VBitSet.java:5
com.cliffc.aa.type.TypeFlt.not_nil
Type not_nil()
Definition: TypeFlt.java:97
com.cliffc.aa.type.Type.hashcons_free
final T hashcons_free()
Definition: Type.java:153
com.cliffc.aa.util.SB
Tight/tiny StringBuilder wrapper.
Definition: SB.java:8
com.cliffc.aa.type.TypeFlt.str
SB str(SB sb, VBitSet dups, TypeMem mem, boolean debug)
Definition: TypeFlt.java:23
com.cliffc.aa.type.Type.NIL
static final Type NIL
Definition: Type.java:332
com.cliffc.aa.AA
an implementation of language AA
Definition: AA.java:9
com.cliffc.aa.type.TypeFlt._z
byte _z
Definition: TypeFlt.java:11
com.cliffc.aa
Definition: AA.java:1
com.cliffc.aa.type.TypeFlt.may_nil
boolean may_nil()
Definition: TypeFlt.java:96
com.cliffc.aa.type.TypeFlt.nn
int nn()
Definition: TypeFlt.java:89
com.cliffc.aa.type.TypeFlt.xmeet
Type xmeet(Type t)
Definition: TypeFlt.java:53
com.cliffc.aa.util.SB.p
SB p(String s)
Definition: SB.java:13
com.cliffc.aa.type.Type< TypeFlt >::_name
String _name
Definition: Type.java:99
com.cliffc.aa.type.TypeFlt.is_con
boolean is_con()
Definition: TypeFlt.java:94
com.cliffc.aa.type.TypeFlt.must_nil
boolean must_nil()
Definition: TypeFlt.java:95
com.cliffc.aa.type.TypeFlt.xdual
TypeFlt xdual()
Definition: TypeFlt.java:52
com.cliffc.aa.type.TypeFlt.getl
long getl()
Definition: TypeFlt.java:50
com.cliffc.aa.type.Type.XNIL
static final Type XNIL
Definition: Type.java:333
com.cliffc.aa.type.Type< TypeFlt >::POOLS
static final Pool[] POOLS
Definition: Type.java:281
com.cliffc.aa.type.Type< TypeFlt >::TOBJ
static final byte TOBJ
Definition: Type.java:267
com.cliffc.aa.type.TypeFlt.isBitShape
byte isBitShape(Type t)
Definition: TypeFlt.java:110
com
com.cliffc.aa.type.TypeFlt.walk
void walk(Predicate< Type > p)
Definition: TypeFlt.java:125
com.cliffc.aa.type.TypeFlt.NFLT64
static final TypeFlt NFLT64
Definition: TypeFlt.java:41
com.cliffc.aa.type.Type< TypeFlt >::TFUNSIG
static final byte TFUNSIG
Definition: Type.java:275
com.cliffc.aa.type.Type< TypeFlt >::TARY
static final byte TARY
Definition: Type.java:269
com.cliffc.aa.type.TypeFlt.FLT64
static final TypeFlt FLT64
Definition: TypeFlt.java:38
com.cliffc.aa.type.TypeFlt.above_center
boolean above_center()
Definition: TypeFlt.java:92
com.cliffc.aa.type.Type< TypeFlt >::TFLT
static final byte TFLT
Definition: Type.java:264