rename cast opcodes, fix for 32bit cast, fix python pretty printer (#12207)

This commit is contained in:
Arne Döring 2019-09-18 09:04:37 +02:00 • committed by GitHub
commit 638a4d9d9f
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 34 additions and 17 deletions

View file

@ -550,19 +550,19 @@ proc rawExecute(c: PCtx, start: int, tos: PStackFrame): TFullReg =
of opcAsgnFloat:
decodeB(rkFloat)
regs[ra].floatVal = regs[rb].floatVal
of opcAsgnIntFromFloat32:
of opcCastFloatToInt32:
let rb = instr.regB
ensureKind(rkInt)
regs[ra].intVal = cast[int32](float32(regs[rb].floatVal))
of opcAsgnIntFromFloat64:
of opcCastFloatToInt64:
let rb = instr.regB
ensureKind(rkInt)
regs[ra].intVal = cast[int64](regs[rb].floatVal)
of opcAsgnFloat32FromInt:
of opcCastIntToFloat32:
let rb = instr.regB
ensureKind(rkFloat)
regs[ra].floatVal = cast[float32](int32(regs[rb].intVal))
of opcAsgnFloat64FromInt:
of opcCastIntToFloat64:
let rb = instr.regB
ensureKind(rkFloat)
regs[ra].floatVal = cast[float64](int64(regs[rb].intVal))

View file

@ -33,11 +33,11 @@ type
opcAsgnInt,
opcAsgnFloat,
opcAsgnRef,
opcAsgnIntFromFloat32, # int and float must be of the same byte size
opcAsgnIntFromFloat64, # int and float must be of the same byte size
opcAsgnFloat32FromInt, # int and float must be of the same byte size
opcAsgnFloat64FromInt, # int and float must be of the same byte size
opcAsgnComplex,
opcCastIntToFloat32, # int and float must be of the same byte size
opcCastIntToFloat64, # int and float must be of the same byte size
opcCastFloatToInt32, # int and float must be of the same byte size
opcCastFloatToInt64, # int and float must be of the same byte size
opcFastAsgnComplex,
opcNodeToReg,

View file

@ -843,9 +843,9 @@ proc genCastIntFloat(c: PCtx; n: PNode; dest: var TDest) =
let tmp = c.genx(n[1])
if dest < 0: dest = c.getTemp(n[0].typ)
if dst.kind == tyFloat32:
c.gABC(n, opcAsgnFloat32FromInt, dest, tmp)
c.gABC(n, opcCastIntToFloat32, dest, tmp)
else:
c.gABC(n, opcAsgnFloat64FromInt, dest, tmp)
c.gABC(n, opcCastIntToFloat64, dest, tmp)
c.freeTemp(tmp)
elif srcSize == dstSize and src.kind in {tyFloat, tyFloat32, tyFloat64} and
@ -853,11 +853,15 @@ proc genCastIntFloat(c: PCtx; n: PNode; dest: var TDest) =
let tmp = c.genx(n[1])
if dest < 0: dest = c.getTemp(n[0].typ)
if src.kind == tyFloat32:
c.gABC(n, opcAsgnIntFromFloat32, dest, tmp)
c.gABC(n, opcCastFloatToInt32, dest, tmp)
if dst.kind in unsignedIntegers:
# integers are sign extended by default.
# since there is no opcCastFloatToUInt32, narrowing should do the trick.
c.gABC(n, opcNarrowU, dest, TRegister(32))
else:
c.gABC(n, opcAsgnIntFromFloat64, dest, tmp)
c.gABC(n, opcCastFloatToInt64, dest, tmp)
# narrowing for 64 bits not needed (no extended sign bits available).
c.freeTemp(tmp)
else:
globalError(c.config, n.info, "VM is only allowed to 'cast' between integers and/or floats of same size")