1
1
/*
2
- * Copyright (c) 2009, 2022 , Oracle and/or its affiliates. All rights reserved.
2
+ * Copyright (c) 2009, 2025 , Oracle and/or its affiliates. All rights reserved.
3
3
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4
4
*
5
5
* This code is free software; you can redistribute it and/or modify it
32
32
import jdk .graal .compiler .core .common .calc .FloatConvert ;
33
33
import jdk .graal .compiler .debug .Assertions ;
34
34
import jdk .graal .compiler .debug .GraalError ;
35
- import jdk .graal .compiler .lir .asm .CompilationResultBuilder ;
36
35
import jdk .graal .compiler .lir .LIRInstructionClass ;
37
-
36
+ import jdk . graal . compiler . lir . asm . CompilationResultBuilder ;
38
37
import jdk .vm .ci .code .Register ;
39
38
import jdk .vm .ci .meta .AllocatableValue ;
40
39
@@ -93,12 +92,24 @@ public void emitCode(CompilationResultBuilder crb, AArch64MacroAssembler masm) {
93
92
case D2L :
94
93
masm .fcvtzs (toSize , fromSize , result , input );
95
94
break ;
95
+ case F2UI :
96
+ case D2UI :
97
+ case F2UL :
98
+ case D2UL :
99
+ masm .fcvtzu (toSize , fromSize , result , input );
100
+ break ;
96
101
case I2F :
97
102
case I2D :
98
103
case L2F :
99
104
case L2D :
100
105
masm .scvtf (toSize , fromSize , result , input );
101
106
break ;
107
+ case UI2F :
108
+ case UI2D :
109
+ case UL2F :
110
+ case UL2D :
111
+ masm .ucvtf (toSize , fromSize , result , input );
112
+ break ;
102
113
case D2F :
103
114
case F2D :
104
115
masm .fcvt (toSize , fromSize , result , input );
@@ -229,18 +240,24 @@ private boolean verifyConversionSizes(ElementSize dstESize, ElementSize srcESize
229
240
switch (op ) {
230
241
case F2I :
231
242
case I2F :
243
+ case F2UI :
244
+ case UI2F :
232
245
assert srcESize == ElementSize .Word && dstESize == ElementSize .Word : Assertions .errorMessage (srcESize , dstESize );
233
246
break ;
234
247
case F2D :
235
248
case I2D :
249
+ case UI2D :
236
250
assert srcESize == ElementSize .Word && dstESize == ElementSize .DoubleWord : Assertions .errorMessage (srcESize , dstESize );
237
251
break ;
238
252
case D2F :
239
253
case D2I :
254
+ case D2UI :
240
255
assert srcESize == ElementSize .DoubleWord && dstESize == ElementSize .Word : Assertions .errorMessage (srcESize , dstESize );
241
256
break ;
242
257
case D2L :
243
258
case L2D :
259
+ case D2UL :
260
+ case UL2D :
244
261
assert srcESize == ElementSize .DoubleWord && dstESize == ElementSize .DoubleWord : Assertions .errorMessage (srcESize , dstESize );
245
262
break ;
246
263
}
@@ -258,17 +275,21 @@ public void emitCode(CompilationResultBuilder crb, AArch64MacroAssembler masm) {
258
275
Register input = asRegister (inputValue );
259
276
switch (op ) {
260
277
case F2I :
261
- masm .neon .fcvtzsVV (size , srcESize , result , input );
262
- break ;
263
278
case D2L :
264
279
masm .neon .fcvtzsVV (size , srcESize , result , input );
265
280
break ;
266
- case I2F :
267
- masm .neon .scvtfVV (size , srcESize , result , input );
281
+ case F2UI :
282
+ case D2UL :
283
+ masm .neon .fcvtzuVV (size , srcESize , result , input );
268
284
break ;
285
+ case I2F :
269
286
case L2D :
270
287
masm .neon .scvtfVV (size , srcESize , result , input );
271
288
break ;
289
+ case UI2F :
290
+ case UL2D :
291
+ masm .neon .ucvtfVV (size , srcESize , result , input );
292
+ break ;
272
293
case D2F :
273
294
masm .neon .fcvtnVV (srcESize , result , input );
274
295
break ;
@@ -280,16 +301,28 @@ public void emitCode(CompilationResultBuilder crb, AArch64MacroAssembler masm) {
280
301
masm .neon .sxtlVV (srcESize , result , input );
281
302
masm .neon .scvtfVV (size , ElementSize .fromKind (resultValue .getPlatformKind ()), result , result );
282
303
break ;
304
+ case UI2D :
305
+ /* First unsigned extend int to long, then unsigned convert to double */
306
+ masm .neon .uxtlVV (srcESize , result , input );
307
+ masm .neon .ucvtfVV (size , ElementSize .fromKind (resultValue .getPlatformKind ()), result , result );
308
+ break ;
283
309
case D2I :
284
- /* First convert double to long, then to int */
310
+ /* First convert double to long, then saturating extract int */
285
311
masm .neon .fcvtzsVV (size , srcESize , result , input );
286
- masm .neon .xtnVV (dstESize , result , result );
312
+ masm .neon .sqxtnVV (dstESize , result , result );
313
+ break ;
314
+ case D2UI :
315
+ /* First convert double to unsigned long, then saturating extract uint */
316
+ masm .neon .fcvtzuVV (size , srcESize , result , input );
317
+ masm .neon .uqxtnVV (dstESize , result , result );
287
318
break ;
288
319
/*
289
320
* It is not possible to handle these conversions correctly without losing fidelity.
290
321
*/
291
322
case F2L :
292
323
case L2F :
324
+ case F2UL :
325
+ case UL2F :
293
326
default :
294
327
throw GraalError .shouldNotReachHere ("Unsupported conversion requested." ); // ExcludeFromJacocoGeneratedReport
295
328
}
0 commit comments