Skip to content

Commit 61d373c

Browse files
committed
CLJCLR-101: part 6: Add instrinsic support for unsigned
1 parent a8e01aa commit 61d373c

File tree

2 files changed

+98
-25
lines changed

2 files changed

+98
-25
lines changed

Clojure/Clojure/CljCompiler/Ast/Intrinsics.cs

Lines changed: 92 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -62,49 +62,70 @@ static Intrinsics()
6262
{
6363
Type nt = typeof(Numbers);
6464
Type rtt = typeof(RT);
65-
Type ut = typeof(Util);
65+
Type utilt = typeof(Util);
6666

6767
Type it = typeof(int);
6868
Type dt = typeof(double);
6969
Type lt = typeof(long);
70+
Type ut = typeof(ulong);
7071

7172
Type boolt = typeof(bool);
7273

7374
Type[] ddta = new Type[] { dt, dt };
7475
Type[] llta = new Type[] { lt, lt };
7576
Type[] iita = new Type[] { it, it };
77+
Type[] uuta = new Type[] { ut, ut };
7678
Type[] bbta = new Type[] { boolt, boolt };
7779

7880
Type[] dta = new Type[] { dt };
7981
Type[] lta = new Type[] { lt };
8082
Type[] ita = new Type[] { it };
83+
Type[] uta = new Type[] { ut };
8184

8285
Type[] fta = new Type[] { typeof(float) };
8386
Type[] sta = new Type[] {typeof(short) };
8487
Type[] bta = new Type[] {typeof(byte) };
85-
Type[] ulta = new Type[] {typeof(ulong) };
8688
Type[] uita = new Type[] {typeof(uint) };
8789
Type[] usta = new Type[] {typeof(ushort) };
8890
Type[] sbta = new Type[] {typeof(sbyte) };
8991

90-
AddOp(nt, "add", ddta, OpCodes.Add);
92+
// bitwise
9193
AddOp(nt, "and", llta, OpCodes.And);
9294
AddOp(nt, "or", llta, OpCodes.Or);
9395
AddOp(nt, "xor", llta, OpCodes.Xor);
96+
AddOp(nt, "shiftLeft", llta, OpCodes.Shl);
97+
AddOp(nt, "shiftRight", llta, OpCodes.Shr);
98+
AddOp(nt, "unsignedShiftRight", llta, OpCodes.Shr_Un);
99+
AddOp(nt, "shiftLeftInt", iita, OpCodes.Shl);
100+
AddOp(nt, "shiftRightInt", iita, OpCodes.Shr);
101+
AddOp(nt, "unsignedShiftRightInt", iita, OpCodes.Shr_Un);
102+
// TODO: add ulong overloads in Numbers.
103+
//AddOp(nt, "and", uuta, OpCodes.And);
104+
//AddOp(nt, "or", uuta, OpCodes.Or);
105+
//AddOp(nt, "xor", uuta, OpCodes.Xor);
106+
//AddOp(nt, "shiftLeft", uuta, OpCodes.Shl);
107+
//AddOp(nt, "shiftRight", uuta, OpCodes.Shr);
108+
//AddOp(nt, "unsignedShiftRight", uuta, OpCodes.Shr_Un);
109+
110+
// arithmetic on doubles
111+
AddOp(nt, "add", ddta, OpCodes.Add);
94112
AddOp(nt, "multiply", ddta, OpCodes.Mul);
95113
AddOp(nt, "divide", ddta, OpCodes.Div);
96-
AddOp(nt, "remainder", llta, OpCodes.Rem);
97-
AddOp(nt, "shiftLeft", llta, OpCodes.Shl);
98-
AddOp(nt, "shiftRight", llta, OpCodes.Shr);
99-
AddOp(nt, "unsignedShiftRight", llta, OpCodes.Shr_Un);
100114
AddOp(nt, "minus", dta, OpCodes.Neg);
101115
AddOp(nt, "minus", ddta, OpCodes.Sub);
102116
AddOp(nt, "inc", dta, OpCodes.Ldc_I4_1, OpCodes.Conv_R8, OpCodes.Add);
103117
AddOp(nt, "dec", dta, OpCodes.Ldc_I4_1, OpCodes.Conv_R8, OpCodes.Sub);
118+
119+
120+
// integer ops
121+
AddOp(nt, "remainder", llta, OpCodes.Rem);
122+
AddOp(nt, "remainder", uuta, OpCodes.Rem_Un);
123+
104124
AddOp(nt, "quotient", llta, OpCodes.Div);
105-
AddOp(nt, "shiftLeftInt", iita, OpCodes.Shl);
106-
AddOp(nt, "shiftRightInt", iita, OpCodes.Shr);
107-
AddOp(nt, "unsignedShiftRightInt", iita, OpCodes.Shr_Un);
125+
AddOp(nt, "quotient", uuta, OpCodes.Div_Un);
126+
127+
128+
// unchecked int ops
108129
AddOp(nt, "unchecked_int_add", iita, OpCodes.Add );
109130
AddOp(nt, "unchecked_int_subtract", iita, OpCodes.Sub );
110131
AddOp(nt, "unchecked_int_negate", ita, OpCodes.Neg );
@@ -113,19 +134,35 @@ static Intrinsics()
113134
AddOp(nt, "unchecked_int_multiply", iita, OpCodes.Mul );
114135
AddOp(nt, "unchecked_int_divide", iita, OpCodes.Div );
115136
AddOp(nt, "unchecked_int_remainder", iita, OpCodes.Rem );
137+
138+
// long/ulong/double unchecked ops
116139
AddOp(nt, "unchecked_add", llta, OpCodes.Add );
117-
AddOp(nt, "unchecked_add", ddta, OpCodes.Add );
140+
AddOp(nt, "unchecked_add", uuta, OpCodes.Add);
141+
AddOp(nt, "unchecked_add", ddta, OpCodes.Add);
142+
118143
AddOp(nt, "unchecked_minus", lta, OpCodes.Neg );
119-
AddOp(nt, "unchecked_minus", dta, OpCodes.Neg );
144+
AddOp(nt, "unchecked_minus", uta, OpCodes.Neg);
145+
AddOp(nt, "unchecked_minus", dta, OpCodes.Neg);
146+
120147
AddOp(nt, "unchecked_minus", ddta, OpCodes.Sub );
121-
AddOp(nt, "unchecked_minus", llta, OpCodes.Sub );
122-
AddOp(nt, "unchecked_multiply", llta, OpCodes.Mul );
148+
AddOp(nt, "unchecked_minus", uuta, OpCodes.Sub);
149+
AddOp(nt, "unchecked_minus", llta, OpCodes.Sub);
150+
151+
123152
AddOp(nt, "unchecked_multiply", llta, OpCodes.Mul );
153+
AddOp(nt, "unchecked_multiply", uuta, OpCodes.Mul);
154+
AddOp(nt, "unchecked_multiply", llta, OpCodes.Mul);
155+
156+
124157
AddOp(nt, "unchecked_inc", lta, OpCodes.Ldc_I4_1, OpCodes.Conv_I8, OpCodes.Add );
125-
AddOp(nt, "unchecked_inc", dta, OpCodes.Ldc_I4_1, OpCodes.Conv_R8, OpCodes.Add );
158+
AddOp(nt, "unchecked_inc", uta, OpCodes.Ldc_I4_1, OpCodes.Conv_U8, OpCodes.Add);
159+
AddOp(nt, "unchecked_inc", dta, OpCodes.Ldc_I4_1, OpCodes.Conv_R8, OpCodes.Add);
160+
126161
AddOp(nt, "unchecked_dec", lta, OpCodes.Ldc_I4_1, OpCodes.Conv_I8, OpCodes.Sub );
127-
AddOp(nt, "unchecked_dec", dta, OpCodes.Ldc_I4_1, OpCodes.Conv_R8, OpCodes.Sub );
162+
AddOp(nt, "unchecked_dec", uta, OpCodes.Ldc_I4_1, OpCodes.Conv_U8, OpCodes.Sub);
163+
AddOp(nt, "unchecked_dec", dta, OpCodes.Ldc_I4_1, OpCodes.Conv_R8, OpCodes.Sub);
128164

165+
// Array ops
129166
AddOp(rtt, "aget", new Type[] { typeof(float[]), typeof(int) }, OpCodes.Ldelem_R4 );
130167
AddOp(rtt, "aget", new Type[] { typeof(double[]), typeof(int) }, OpCodes.Ldelem_R8 );
131168
AddOp(rtt, "aget", new Type[] { typeof(byte[]), typeof(int) }, OpCodes.Ldelem_U1 );
@@ -162,7 +199,7 @@ static Intrinsics()
162199
AddOp(rtt, "doubleCast", ita, OpCodes.Conv_R8 );
163200
AddOp(rtt, "doubleCast", sta, OpCodes.Conv_R8 );
164201
AddOp(rtt, "doubleCast", bta, OpCodes.Conv_R8 );
165-
AddOp(rtt, "doubleCast", ulta, OpCodes.Conv_R8 );
202+
AddOp(rtt, "doubleCast", uta, OpCodes.Conv_R8 );
166203
AddOp(rtt, "doubleCast", uita, OpCodes.Conv_R8 );
167204
AddOp(rtt, "doubleCast", usta, OpCodes.Conv_R8 );
168205
AddOp(rtt, "doubleCast", sbta, OpCodes.Conv_R8 );
@@ -173,7 +210,7 @@ static Intrinsics()
173210
AddOp(rtt, "uncheckedDoubleCast", ita, OpCodes.Conv_R8 );
174211
AddOp(rtt, "uncheckedDoubleCast", sta, OpCodes.Conv_R8 );
175212
AddOp(rtt, "uncheckedDoubleCast", bta, OpCodes.Conv_R8 );
176-
AddOp(rtt, "uncheckedDoubleCast", ulta, OpCodes.Conv_R8 );
213+
AddOp(rtt, "uncheckedDoubleCast", uta, OpCodes.Conv_R8 );
177214
AddOp(rtt, "uncheckedDoubleCast", uita, OpCodes.Conv_R8 );
178215
AddOp(rtt, "uncheckedDoubleCast", usta, OpCodes.Conv_R8 );
179216
AddOp(rtt, "uncheckedDoubleCast", sbta, OpCodes.Conv_R8 );
@@ -182,18 +219,20 @@ static Intrinsics()
182219
AddOp(rtt, "longCast", ita, OpCodes.Conv_I8 );
183220
AddOp(rtt, "longCast", sta, OpCodes.Conv_I8 );
184221
AddOp(rtt, "longCast", bta, OpCodes.Conv_I8 );
185-
AddOp(rtt, "longCast", ulta, OpCodes.Conv_I8 );
222+
AddOp(rtt, "longCast", uta, OpCodes.Conv_I8 );
186223
AddOp(rtt, "longCast", uita, OpCodes.Conv_I8 );
187224
AddOp(rtt, "longCast", usta, OpCodes.Conv_I8 );
188225
AddOp(rtt, "longCast", sbta, OpCodes.Conv_I8 );
189226

227+
// Todo: reimplement RT.ulongCast and implement these intrinsics
228+
190229
AddOp(rtt, "uncheckedIntCast", lta, OpCodes.Conv_I4 );
191230
AddOp(rtt, "uncheckedIntCast", dta, OpCodes.Conv_I4 );
192231
AddOp(rtt, "uncheckedIntCast", fta, OpCodes.Conv_I4 );
193232
AddOp(rtt, "uncheckedIntCast", ita, OpCodes.Nop );
194233
AddOp(rtt, "uncheckedIntCast", sta, OpCodes.Conv_I4 );
195234
AddOp(rtt, "uncheckedIntCast", bta, OpCodes.Conv_I4 );
196-
AddOp(rtt, "uncheckedIntCast", ulta, OpCodes.Conv_I4 );
235+
AddOp(rtt, "uncheckedIntCast", uta, OpCodes.Conv_I4 );
197236
AddOp(rtt, "uncheckedIntCast", uita, OpCodes.Conv_I4 );
198237
AddOp(rtt, "uncheckedIntCast", usta, OpCodes.Conv_I4 );
199238
AddOp(rtt, "uncheckedIntCast", sbta, OpCodes.Conv_I4 );
@@ -204,32 +243,60 @@ static Intrinsics()
204243
AddOp(rtt, "uncheckedLongCast", ita, OpCodes.Conv_I8 );
205244
AddOp(rtt, "uncheckedLongCast", sta, OpCodes.Conv_I8 );
206245
AddOp(rtt, "uncheckedLongCast", bta, OpCodes.Conv_I8 );
207-
AddOp(rtt, "uncheckedLongCast", ulta, OpCodes.Conv_I8 );
246+
AddOp(rtt, "uncheckedLongCast", uta, OpCodes.Conv_I8 );
208247
AddOp(rtt, "uncheckedLongCast", uita, OpCodes.Conv_I8 );
209248
AddOp(rtt, "uncheckedLongCast", usta, OpCodes.Conv_I8 );
210249
AddOp(rtt, "uncheckedLongCast", sbta, OpCodes.Conv_I8 );
211250

251+
AddOp(rtt, "uncheckedULongCast", lta, OpCodes.Conv_U8);
252+
AddOp(rtt, "uncheckedULongCast", dta, OpCodes.Conv_U8);
253+
AddOp(rtt, "uncheckedULongCast", fta, OpCodes.Conv_U8);
254+
AddOp(rtt, "uncheckedULongCast", ita, OpCodes.Conv_U8);
255+
AddOp(rtt, "uncheckedULongCast", sta, OpCodes.Conv_U8);
256+
AddOp(rtt, "uncheckedULongCast", bta, OpCodes.Conv_U8);
257+
AddOp(rtt, "uncheckedULongCast", uta, OpCodes.Nop);
258+
AddOp(rtt, "uncheckedULongCast", uita, OpCodes.Conv_U8);
259+
AddOp(rtt, "uncheckedULongCast", usta, OpCodes.Conv_U8);
260+
AddOp(rtt, "uncheckedULongCast", sbta, OpCodes.Conv_U8);
261+
262+
// Predicates
263+
212264
AddPred(nt, "lt", ddta, OpCodes.Bge );
265+
AddPred(nt, "lt", uuta, OpCodes.Bge_Un );
213266
AddPred(nt, "lt", llta, OpCodes.Bge );
267+
214268
AddPred(nt, "equiv", ddta, OpCodes.Ceq, OpCodes.Brfalse );
269+
AddPred(nt, "equiv", uuta, OpCodes.Ceq, OpCodes.Brfalse );
215270
AddPred(nt, "equiv", llta, OpCodes.Ceq, OpCodes.Brfalse );
271+
216272
AddPred(nt, "lte", ddta, OpCodes.Bgt );
273+
AddPred(nt, "lte", uuta, OpCodes.Bgt_Un );
217274
AddPred(nt, "lte", llta, OpCodes.Bgt );
275+
218276
AddPred(nt, "gt", ddta, OpCodes.Ble );
277+
AddPred(nt, "gt", uuta, OpCodes.Ble_Un);
219278
AddPred(nt, "gt", llta, OpCodes.Ble );
279+
220280
AddPred(nt, "gte", ddta, OpCodes.Blt );
281+
AddPred(nt, "gte", uuta, OpCodes.Blt_Un );
221282
AddPred(nt, "gte", llta, OpCodes.Blt );
222283

223-
AddPred(ut, "equiv", llta, OpCodes.Ceq, OpCodes.Brfalse);
224-
AddPred(ut, "equiv", ddta, OpCodes.Ceq, OpCodes.Brfalse);
225-
AddPred(ut, "equiv", bbta, OpCodes.Ceq, OpCodes.Brfalse);
284+
AddPred(utilt, "equiv", llta, OpCodes.Ceq, OpCodes.Brfalse);
285+
AddPred(utilt, "equiv", uuta, OpCodes.Ceq, OpCodes.Brfalse);
286+
AddPred(utilt, "equiv", ddta, OpCodes.Ceq, OpCodes.Brfalse);
287+
AddPred(utilt, "equiv", bbta, OpCodes.Ceq, OpCodes.Brfalse);
226288

227289
AddPred(nt, "isZero", dta, OpCodes.Ldc_I4_0, OpCodes.Conv_R8, OpCodes.Ceq, OpCodes.Brfalse );
290+
AddPred(nt, "isZero", uta,OpCodes.Ldc_I4_0, OpCodes.Conv_U8, OpCodes.Ceq, OpCodes.Brfalse );
228291
AddPred(nt, "isZero", lta,OpCodes.Ldc_I4_0, OpCodes.Conv_I8, OpCodes.Ceq, OpCodes.Brfalse );
292+
229293
AddPred(nt, "isPos", dta, OpCodes.Ldc_I4_0, OpCodes.Conv_R8, OpCodes.Ble );
294+
AddPred(nt, "isPos", uta, OpCodes.Ldc_I4_0, OpCodes.Conv_U8, OpCodes.Ble );
230295
AddPred(nt, "isPos", lta, OpCodes.Ldc_I4_0, OpCodes.Conv_I8, OpCodes.Ble );
296+
231297
AddPred(nt, "isNeg", dta, OpCodes.Ldc_I4_0, OpCodes.Conv_R8, OpCodes.Bge );
232-
AddPred(nt, "isNeg", lta, OpCodes.Ldc_I4_0, OpCodes.Conv_I8, OpCodes.Bge );
298+
AddPred(nt, "isNeg", uta, OpCodes.Ldc_I4_0, OpCodes.Conv_U8, OpCodes.Bge );
299+
AddPred(nt, "isNeg", lta, OpCodes.Ldc_I4_0, OpCodes.Conv_I8, OpCodes.Bge );
233300
}
234301

235302
#endregion

Clojure/Clojure/Lib/Util.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,12 @@ public static bool equiv(long x, long y)
116116
return x == y;
117117
}
118118

119+
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "equiv")]
120+
public static bool equiv(ulong x, ulong y)
121+
{
122+
return x == y;
123+
}
124+
119125
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "equiv")]
120126
public static bool equiv(double x, double y)
121127
{

0 commit comments

Comments
 (0)