// Copyright 2019 the V8 project authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. intrinsic %FromConstexpr(b: From): To; macro FromConstexpr(o: From): To; // Conversions for IntegerLiteral FromConstexpr(i: constexpr IntegerLiteral): intptr { return ConstexprIntegerLiteralToIntptr(i); } FromConstexpr(i: constexpr IntegerLiteral): uintptr { return ConstexprIntegerLiteralToUintptr(i); } FromConstexpr(i: constexpr IntegerLiteral): int32 { return ConstexprIntegerLiteralToInt32(i); } FromConstexpr(i: constexpr IntegerLiteral): uint32 { return ConstexprIntegerLiteralToUint32(i); } FromConstexpr(i: constexpr IntegerLiteral): int31 { return ConstexprIntegerLiteralToInt31(i); } FromConstexpr(i: constexpr IntegerLiteral): int8 { return ConstexprIntegerLiteralToInt8(i); } FromConstexpr(i: constexpr IntegerLiteral): uint8 { return ConstexprIntegerLiteralToUint8(i); } FromConstexpr(i: constexpr IntegerLiteral): uint64 { return ConstexprIntegerLiteralToUint64(i); } FromConstexpr( i: constexpr IntegerLiteral): constexpr int31 { return ConstexprIntegerLiteralToInt31(i); } FromConstexpr( i: constexpr IntegerLiteral): constexpr int32 { return ConstexprIntegerLiteralToInt32(i); } FromConstexpr(i: constexpr IntegerLiteral): Number { return NumberConstant(ConstexprIntegerLiteralToFloat64(i)); } FromConstexpr(i: constexpr IntegerLiteral): Smi { return Convert(ConstexprIntegerLiteralToInt31(i)); } FromConstexpr(i: constexpr IntegerLiteral): char8 { return %RawDownCast(FromConstexpr(i)); } FromConstexpr(i: constexpr int31): int31 { return %FromConstexpr(i); } FromConstexpr(i: constexpr int31): int32 { return %FromConstexpr(i); } FromConstexpr(i: constexpr int32): int32 { return %FromConstexpr(i); } FromConstexpr(i: constexpr int31): intptr { return %FromConstexpr(i); } FromConstexpr(i: constexpr int32): intptr { return %FromConstexpr(i); } FromConstexpr(i: constexpr intptr): intptr { return %FromConstexpr(i); } FromConstexpr(i: constexpr uintptr): uintptr { return %FromConstexpr(i); } FromConstexpr(i: constexpr int31): Smi { return %FromConstexpr(i); } FromConstexpr(i: constexpr int31): PositiveSmi { dcheck(i >= 0); return %FromConstexpr(i); } FromConstexpr(s: constexpr string): String { return %FromConstexpr(s); } FromConstexpr(i: constexpr uint32): Number { return %FromConstexpr(i); } FromConstexpr(i: constexpr int32): Number { return %FromConstexpr(i); } FromConstexpr(f: constexpr float64): Number { return %FromConstexpr(f); } FromConstexpr(i: constexpr int31): Number { return %FromConstexpr(i); } FromConstexpr(i: constexpr int31): uint8 { const i: uint32 = i; static_assert(i <= 255); return %RawDownCast(i); } FromConstexpr(i: constexpr int31): int8 { const i: int32 = i; static_assert(-128 <= i && i <= 127); return %RawDownCast(i); } FromConstexpr(i: constexpr int31): char8 { return %RawDownCast(FromConstexpr(i)); } FromConstexpr(s: constexpr Smi): Number { return SmiConstant(s); } FromConstexpr(s: constexpr Smi): Smi { return SmiConstant(s); } FromConstexpr(i: constexpr int31): uint32 { return Unsigned(Int32Constant(i)); } FromConstexpr(i: constexpr uint8): uint8 { const i: uint32 = i; return %RawDownCast(i); } FromConstexpr(i: constexpr uint32): uint32 { return Unsigned(%FromConstexpr(i)); } FromConstexpr(i: constexpr uint64): uint64 { return Uint64Constant(i); } FromConstexpr(i: constexpr int31): uint64 { return Convert(Unsigned(Int32Constant(i))); } FromConstexpr(i: constexpr int31): uintptr { return ChangeUint32ToWord(i); } FromConstexpr(i: constexpr int31): float64 { return Float64Constant(i); } FromConstexpr(i: constexpr int32): float64 { return Float64Constant(i); } FromConstexpr(i: constexpr float64): float64 { return Float64Constant(i); } FromConstexpr(b: constexpr bool): bool { return BoolConstant(b); } FromConstexpr(s: constexpr string): Object { return StringConstant(s); } FromConstexpr(s: constexpr string): JSAny { return StringConstant(s); } FromConstexpr(c: constexpr ContextSlot): ContextSlot { return IntPtrConstant(c); } FromConstexpr( c: constexpr LanguageMode): LanguageModeSmi { return %RawDownCast(SmiConstant(c)); } FromConstexpr(c: constexpr PromiseState): PromiseState { return %RawDownCast(Int32Constant(c)); } FromConstexpr(c: constexpr InstanceType): InstanceType { return %RawDownCast(Uint16Constant(c)); } FromConstexpr( c: constexpr IterationKind): IterationKind { return %RawDownCast(Unsigned(%FromConstexpr(c))); } FromConstexpr( c: string::constexpr TrimMode): string::TrimMode { return %RawDownCast(Unsigned(%FromConstexpr(c))); } macro Convert(i: From): To { return i; } macro Convert(i: From): To labels Overflow { return i; } Convert(b: bool): Boolean { return b ? True : False; } Convert(b: bool): int32 { return ChangeBoolToInt32(b); } Convert(i: int32): Number { return ChangeInt32ToTagged(i); } Convert(i: int32): intptr { return ChangeInt32ToIntPtr(i); } Convert(i: int31): intptr { return ChangeInt32ToIntPtr(i); } Convert(i: uint32): intptr { return Signed(ChangeUint32ToWord(i)); } Convert(i: int32): Smi { return SmiFromInt32(i); } Convert(ui: uint32): Number { return ChangeUint32ToTagged(ui); } Convert(ui: uint32): Smi { return SmiFromUint32(ui); } Convert(ui: uint32): uintptr { return ChangeUint32ToWord(ui); } Convert(ui: uint32): uint64 { return ChangeUint32ToUint64(ui); } Convert(ui: uint16): intptr { return Signed(ChangeUint32ToWord(ui)); } Convert(ui: uint8): intptr { return Signed(ChangeUint32ToWord(ui)); } Convert(i: intptr): uint8 { return %RawDownCast(Unsigned(TruncateIntPtrToInt32(i)) & 0xFF); } Convert(i: intptr): int8 { return %RawDownCast(TruncateIntPtrToInt32(i) << 24 >> 24); } Convert(i: uint32): uint16 { return %RawDownCast(i & 0xFFFF); } Convert(i: uint8): int32 { return Signed(Convert(i)); } Convert(i: uint16): int32 { return Signed(Convert(i)); } Convert(i: char16|char8): int32 { return Signed(Convert(i)); } Convert(i: char16): intptr { return Convert(i); } Convert(i: char8): intptr { return Convert(i); } Convert(i: uint31): int32 { return Signed(Convert(i)); } Convert(i: intptr): int32 { return TruncateIntPtrToInt32(i); } Convert(i: int64): int32 { return TruncateInt64ToInt32(i); } Convert(n: Number): int32 { typeswitch (n) { case (s: Smi): { return Convert(s); } case (h: HeapNumber): { return TruncateHeapNumberValueToWord32(h); } } } Convert(i: intptr): Smi { return SmiTag(i); } Convert(ui: uintptr): uint32 { return Unsigned(TruncateIntPtrToInt32(Signed(ui))); } Convert(s: Smi): intptr { return SmiUntag(s); } Convert(ps: PositiveSmi): uintptr { return Unsigned(SmiUntag(ps)); } Convert(ti: TaggedIndex): intptr { return TaggedIndexToIntPtr(ti); } Convert(i: intptr): TaggedIndex { return IntPtrToTaggedIndex(i); } Convert(ui: uintptr): intptr { const i = Signed(ui); dcheck(i >= 0); return i; } Convert(i: intptr): PositiveSmi { dcheck(IsValidPositiveSmi(i)); return %RawDownCast(SmiTag(i)); } Convert(ui: uintptr): PositiveSmi labels IfOverflow { if (ui > kSmiMaxValue) deferred { goto IfOverflow; } return %RawDownCast(SmiTag(Signed(ui))); } Convert(i: intptr): PositiveSmi labels IfOverflow { if (IsValidPositiveSmi(i)) { return %RawDownCast(SmiTag(i)); } else deferred { goto IfOverflow; } } Convert(ui: uint32): PositiveSmi labels IfOverflow { return Convert(Convert(ui)) otherwise IfOverflow; } Convert(s: Smi): int32 { return SmiToInt32(s); } Convert(h: HeapNumber): float64 { return LoadHeapNumberValue(h); } Convert(n: Number): float64 { return ChangeNumberToFloat64(n); } Convert(n: Number): uintptr { return ChangeUintPtrNumberToUintPtr(n); } Convert(f: int32): float64 { return ChangeInt32ToFloat64(f); } Convert(f: float32): float64 { return ChangeFloat32ToFloat64(f); } Convert(f: float64): float64_or_hole { return float64_or_hole{is_hole: false, value: f}; } Convert(n: Number): float64_or_hole { return Convert(Convert(n)); } Convert(f: float64): float32 { return TruncateFloat64ToFloat32(f); } Convert(n: Number): float32 { return Convert(ChangeNumberToFloat64(n)); } Convert(d: float64): Number { return ChangeFloat64ToTagged(d); } Convert(ui: uintptr): float64 { return ChangeUintPtrToFloat64(ui); } Convert(ui: uintptr): Number { return ChangeUintPtrToTagged(ui); } Convert(i: intptr): Number { return ChangeUintPtrToTagged(Unsigned(i)); } Convert(d: float64): uintptr { return ChangeFloat64ToUintPtr(d); } Convert(i: intptr): uintptr { return Unsigned(i); } Convert(r: RawPtr): uintptr { return Unsigned(r); } Convert(r: RawPtr): intptr { return Signed(r); } Convert(n: Number): intptr { return ChangeFloat64ToIntPtr(ChangeNumberToFloat64(n)); } Convert(v: int32): bint { return IntPtrToBInt(Convert(v)); } FromConstexpr(v: constexpr IntegerLiteral): float64 { return ConstexprIntegerLiteralToFloat64(v); } extern macro IntPtrToBInt(intptr): bint; Convert(v: intptr): bint { return IntPtrToBInt(v); } extern macro BIntToIntPtr(bint): intptr; Convert(v: bint): intptr { return BIntToIntPtr(v); } extern macro SmiToBInt(Smi): bint; Convert(v: Smi): bint { return SmiToBInt(v); } extern macro BIntToSmi(bint): Smi; Convert(v: bint): Smi { return BIntToSmi(v); } Convert(s: int32): PromiseState { return %RawDownCast(s); } Convert(s: Smi): ScopeFlags { return %RawDownCast(Unsigned(SmiToInt32(s))); } Convert(s: Simd128): I8X16 { return %RawDownCast(s); }