forked from hborders/JavaInJava
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathWordWidth.java
More file actions
136 lines (116 loc) · 4.5 KB
/
Copy pathWordWidth.java
File metadata and controls
136 lines (116 loc) · 4.5 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
/*
* Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
*
* Sun Microsystems, Inc. has intellectual property rights relating to technology embodied in the product
* that is described in this document. In particular, and without limitation, these intellectual property
* rights may include one or more of the U.S. patents listed at http://www.sun.com/patents and one or
* more additional patents or pending patent applications in the U.S. and in other countries.
*
* U.S. Government Rights - Commercial software. Government users are subject to the Sun
* Microsystems, Inc. standard license agreement and applicable provisions of the FAR and its
* supplements.
*
* Use is subject to license terms. Sun, Sun Microsystems, the Sun logo, Java and Solaris are trademarks or
* registered trademarks of Sun Microsystems, Inc. in the U.S. and other countries. All SPARC trademarks
* are used under license and are trademarks or registered trademarks of SPARC International, Inc. in the
* U.S. and other countries.
*
* UNIX is a registered trademark in the U.S. and other countries, exclusively licensed through X/Open
* Company, Ltd.
*/
package com.sun.max.lang;
import java.util.*;
/**
* A word width value describes how many bits there are in a machine word.
*
* @author Bernd Mathiske
*/
public enum WordWidth {
BITS_8(8, byte.class, Byte.MIN_VALUE, Byte.MAX_VALUE, 3),
BITS_16(16, short.class, Short.MIN_VALUE, Short.MAX_VALUE, 4),
BITS_32(32, int.class, Integer.MIN_VALUE, Integer.MAX_VALUE, 5),
BITS_64(64, long.class, Long.MIN_VALUE, Long.MAX_VALUE, 6);
public static final List<WordWidth> VALUES = java.util.Arrays.asList(values());
/**
* Number of bits in a Word.
* This must be a positive power of two.
*/
public final int numberOfBits;
/**
* Log2 of the number of bits.
*/
public final int log2numberOfBits;
/**
* Log2 of the number of bytes.
*/
public final int log2numberOfBytes;
/**
* Number of bytes in a Word.
* This must be a positive power of two.
*/
public final int numberOfBytes;
public final Class canonicalPrimitiveType;
public final long min;
public final long max;
private WordWidth(int numberOfBits, Class canonicalPrimitiveType, long min, long max, int log2numberOfBits) {
this.numberOfBits = numberOfBits;
this.numberOfBytes = numberOfBits / 8;
this.canonicalPrimitiveType = canonicalPrimitiveType;
this.min = min;
this.max = max;
this.log2numberOfBits = log2numberOfBits;
this.log2numberOfBytes = log2numberOfBits - 3;
}
public boolean lessThan(WordWidth other) {
return numberOfBits < other.numberOfBits;
}
public boolean lessEqual(WordWidth other) {
return numberOfBits <= other.numberOfBits;
}
public boolean greaterThan(WordWidth other) {
return numberOfBits > other.numberOfBits;
}
public boolean greaterEqual(WordWidth other) {
return numberOfBits >= other.numberOfBits;
}
@Override
public String toString() {
return Integer.toString(numberOfBits);
}
public static WordWidth fromInt(int wordWidth) {
if (wordWidth <= 8) {
return WordWidth.BITS_8;
}
if (wordWidth <= 16) {
return WordWidth.BITS_16;
}
if (wordWidth <= 32) {
return WordWidth.BITS_32;
}
return WordWidth.BITS_64;
}
/**
* @return which word width is minimally required to represent all the non-one bits in the signed argument, and a sign bit
*/
public static WordWidth signedEffective(int signed) {
return fromInt(Ints.numberOfEffectiveSignedBits(signed));
}
/**
* @return which word width is minimally required to represent all the non-zero bits in the unsigned argument
*/
public static WordWidth unsignedEffective(int unsigned) {
return fromInt(Ints.numberOfEffectiveUnsignedBits(unsigned));
}
/**
* @return which word width is minimally required to represent all the non-one bits in the signed argument, and a sign bit
*/
public static WordWidth signedEffective(long signed) {
return fromInt(Longs.numberOfEffectiveSignedBits(signed));
}
/**
* @return which word width is minimally required to represent all the non-zero bits in the unsigned argument
*/
public static WordWidth unsignedEffective(long unsigned) {
return fromInt(Longs.numberOfEffectiveUnsignedBits(unsigned));
}
}