diff --git a/CMakeLists.txt b/CMakeLists.txt index 783af079c767b..a291359b9c517 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -439,6 +439,8 @@ else() set(SWIFT_HOST_VARIANT_ARCH_default "powerpc64") elseif("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "ppc64le") set(SWIFT_HOST_VARIANT_ARCH_default "powerpc64le") + elseif("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "s390x") + set(SWIFT_HOST_VARIANT_ARCH_default "s390x") # FIXME: Only matches v6l/v7l - by far the most common variants elseif("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "armv6l") set(SWIFT_HOST_VARIANT_ARCH_default "armv6") @@ -507,6 +509,8 @@ if("${SWIFT_HOST_VARIANT_SDK}" STREQUAL "LINUX") set(SWIFT_HOST_TRIPLE "aarch64-unknown-linux-gnu") elseif("${SWIFT_HOST_VARIANT_ARCH}" MATCHES "(powerpc64|powerpc64le)") set(SWIFT_HOST_TRIPLE "${SWIFT_HOST_VARIANT_ARCH}-unknown-linux-gnu") + elseif("${SWIFT_HOST_VARIANT_ARCH}" MATCHES "s390x") + set(SWIFT_HOST_TRIPLE "s390x-unknown-linux-gnu") elseif("${SWIFT_HOST_VARIANT_ARCH}" MATCHES "(armv6|armv7)") set(SWIFT_HOST_TRIPLE "${SWIFT_HOST_VARIANT_ARCH}-unknown-linux-gnueabihf") else() diff --git a/cmake/modules/SwiftSetIfArchBitness.cmake b/cmake/modules/SwiftSetIfArchBitness.cmake index 5dc03cc89a6cc..1849ee0d884f4 100644 --- a/cmake/modules/SwiftSetIfArchBitness.cmake +++ b/cmake/modules/SwiftSetIfArchBitness.cmake @@ -16,7 +16,8 @@ function(set_if_arch_bitness var_name) "${SIA_ARCH}" STREQUAL "arm64" OR "${SIA_ARCH}" STREQUAL "aarch64" OR "${SIA_ARCH}" STREQUAL "powerpc64" OR - "${SIA_ARCH}" STREQUAL "powerpc64le") + "${SIA_ARCH}" STREQUAL "powerpc64le" OR + "${SIA_ARCH}" STREQUAL "s390x") set("${var_name}" "${SIA_CASE_64_BIT}" PARENT_SCOPE) else() message(FATAL_ERROR "Unknown architecture: ${SIA_ARCH}") diff --git a/include/swift/ABI/System.h b/include/swift/ABI/System.h index f681b96b331bd..0753a0cbcd453 100644 --- a/include/swift/ABI/System.h +++ b/include/swift/ABI/System.h @@ -97,4 +97,9 @@ // Heap objects are pointer-aligned, so the low three bits are unused. #define SWIFT_ABI_POWERPC64_SWIFT_SPARE_BITS_MASK 0x0000000000000007ULL +/*********************************** s390x ************************************/ + +// Top byte of pointers is unused, and heap objects are eight-byte aligned. +#define SWIFT_ABI_S390X_SWIFT_SPARE_BITS_MASK 0x0000000000000007ULL + #endif /* SWIFT_ABI_SYSTEM_H */ diff --git a/include/swift/Basic/LangOptions.h b/include/swift/Basic/LangOptions.h index e06b89143bd03..b027f675240eb 100644 --- a/include/swift/Basic/LangOptions.h +++ b/include/swift/Basic/LangOptions.h @@ -233,6 +233,10 @@ namespace swift { /// a supported target architecture. static bool isPlatformConditionArchSupported(StringRef ArchName); + /// Returns true if the 'endian' platform condition argument represents + /// a supported target endianness. + static bool isPlatformConditionEndiannessSupported(StringRef endianness); + private: llvm::SmallVector, 3> PlatformConditionValues; diff --git a/include/swift/Runtime/Config.h b/include/swift/Runtime/Config.h index 3c22ecad8b4e2..187c1e5717175 100644 --- a/include/swift/Runtime/Config.h +++ b/include/swift/Runtime/Config.h @@ -33,8 +33,12 @@ /// Does the current Swift platform use LLVM's intrinsic "swiftcall" /// calling convention for Swift functions? #ifndef SWIFT_USE_SWIFTCALL +#ifdef __s390x__ +#define SWIFT_USE_SWIFTCALL 1 +#else #define SWIFT_USE_SWIFTCALL 0 #endif +#endif /// Does the current Swift platform allow information other than the /// class pointer to be stored in the isa field? If so, when deriving diff --git a/include/swift/Runtime/HeapObject.h b/include/swift/Runtime/HeapObject.h index 96b489e326a7a..e052feeccca28 100644 --- a/include/swift/Runtime/HeapObject.h +++ b/include/swift/Runtime/HeapObject.h @@ -157,10 +157,12 @@ using BoxPair = TwoWordPair; /// The heap object has an initial retain count of 1, and its metadata is set /// such that destroying the heap object destroys the contained value. SWIFT_RUNTIME_EXPORT -extern "C" BoxPair::Return swift_allocBox(Metadata const *type); +extern "C" BoxPair::Return swift_allocBox(Metadata const *type) + SWIFT_CC(swift); SWIFT_RUNTIME_EXPORT -extern "C" BoxPair::Return (*_swift_allocBox)(Metadata const *type); +extern "C" BoxPair::Return (*_swift_allocBox)(Metadata const *type) + SWIFT_CC(swift); // Allocate plain old memory. This is the generalized entry point diff --git a/include/swift/Runtime/Metadata.h b/include/swift/Runtime/Metadata.h index 077690563643d..1dd5998d62847 100644 --- a/include/swift/Runtime/Metadata.h +++ b/include/swift/Runtime/Metadata.h @@ -1046,6 +1046,17 @@ static const uintptr_t ObjCReservedBitsMask = static const unsigned ObjCReservedLowBits = SWIFT_ABI_DEFAULT_OBJC_NUM_RESERVED_LOW_BITS; +#elif defined(__s390x__) + +static const uintptr_t LeastValidPointerValue = + SWIFT_ABI_DEFAULT_LEAST_VALID_POINTER; +static const uintptr_t SwiftSpareBitsMask = + SWIFT_ABI_S390X_SWIFT_SPARE_BITS_MASK; +static const uintptr_t ObjCReservedBitsMask = + SWIFT_ABI_DEFAULT_OBJC_RESERVED_BITS_MASK; +static const unsigned ObjCReservedLowBits = + SWIFT_ABI_DEFAULT_OBJC_NUM_RESERVED_LOW_BITS; + #else static const uintptr_t LeastValidPointerValue = diff --git a/lib/Basic/LangOptions.cpp b/lib/Basic/LangOptions.cpp index 2d157d91a201c..eee99069e40ee 100644 --- a/lib/Basic/LangOptions.cpp +++ b/lib/Basic/LangOptions.cpp @@ -40,7 +40,13 @@ static const StringRef SupportedConditionalCompilationArches[] = { "i386", "x86_64", "powerpc64", - "powerpc64le" + "powerpc64le", + "s390x" +}; + +static const StringRef SupportedConditionalCompilationEndianness[] = { + "little", + "big" }; bool LangOptions::isPlatformConditionOSSupported(StringRef OSName) { @@ -58,6 +64,14 @@ LangOptions::isPlatformConditionArchSupported(StringRef ArchName) { return foundIt != std::end(SupportedConditionalCompilationArches); } +bool +LangOptions::isPlatformConditionEndiannessSupported(StringRef Endianness) { + auto foundIt = std::find(std::begin(SupportedConditionalCompilationEndianness), + std::end(SupportedConditionalCompilationEndianness), + Endianness); + return foundIt != std::end(SupportedConditionalCompilationEndianness); +} + StringRef LangOptions::getPlatformConditionValue(StringRef Name) const { // Last one wins. @@ -141,6 +155,9 @@ std::pair LangOptions::setTarget(llvm::Triple triple) { case llvm::Triple::ArchType::x86_64: addPlatformConditionValue("arch", "x86_64"); break; + case llvm::Triple::ArchType::systemz: + addPlatformConditionValue("arch", "s390x"); + break; default: UnsupportedArch = true; } @@ -148,6 +165,34 @@ std::pair LangOptions::setTarget(llvm::Triple triple) { if (UnsupportedOS || UnsupportedArch) return { UnsupportedOS, UnsupportedArch }; + // Set the "_endian" platform condition. + switch (Target.getArch()) { + case llvm::Triple::ArchType::arm: + case llvm::Triple::ArchType::thumb: + addPlatformConditionValue("_endian", "little"); + break; + case llvm::Triple::ArchType::aarch64: + addPlatformConditionValue("_endian", "little"); + break; + case llvm::Triple::ArchType::ppc64: + addPlatformConditionValue("_endian", "big"); + break; + case llvm::Triple::ArchType::ppc64le: + addPlatformConditionValue("_endian", "little"); + break; + case llvm::Triple::ArchType::x86: + addPlatformConditionValue("_endian", "little"); + break; + case llvm::Triple::ArchType::x86_64: + addPlatformConditionValue("_endian", "little"); + break; + case llvm::Triple::ArchType::systemz: + addPlatformConditionValue("_endian", "big"); + break; + default: + llvm_unreachable("undefined architecture endianness"); + } + // Set the "runtime" platform condition. if (EnableObjCInterop) addPlatformConditionValue("_runtime", "_ObjC"); diff --git a/lib/IRGen/GenMeta.cpp b/lib/IRGen/GenMeta.cpp index fc635d3b757bf..f094f2e2af4cc 100644 --- a/lib/IRGen/GenMeta.cpp +++ b/lib/IRGen/GenMeta.cpp @@ -4338,16 +4338,20 @@ irgen::emitClassResilientInstanceSizeAndAlignMask(IRGenFunction &IGF, && "didn't find size or alignment in metadata?!"); Address metadataAsBytes(IGF.Builder.CreateBitCast(metadata, IGF.IGM.Int8PtrTy), IGF.IGM.getPointerAlignment()); - auto loadZExtInt32AtOffset = [&](Size offset) { - Address slot = IGF.Builder.CreateConstByteArrayGEP(metadataAsBytes, offset); - slot = IGF.Builder.CreateBitCast(slot, IGF.IGM.Int32Ty->getPointerTo()); - llvm::Value *result = IGF.Builder.CreateLoad(slot); - if (IGF.IGM.SizeTy != IGF.IGM.Int32Ty) - result = IGF.Builder.CreateZExt(result, IGF.IGM.SizeTy); - return result; - }; - llvm::Value *size = loadZExtInt32AtOffset(scanner.InstanceSize); - llvm::Value *alignMask = loadZExtInt32AtOffset(scanner.InstanceAlignMask); + + Address slot = IGF.Builder.CreateConstByteArrayGEP(metadataAsBytes, + scanner.InstanceSize); + slot = IGF.Builder.CreateBitCast(slot, IGF.IGM.Int32Ty->getPointerTo()); + llvm::Value *size = IGF.Builder.CreateLoad(slot); + if (IGF.IGM.SizeTy != IGF.IGM.Int32Ty) + size = IGF.Builder.CreateZExt(size, IGF.IGM.SizeTy); + + slot = IGF.Builder.CreateConstByteArrayGEP(metadataAsBytes, + scanner.InstanceAlignMask); + slot = IGF.Builder.CreateBitCast(slot, IGF.IGM.Int16Ty->getPointerTo()); + llvm::Value *alignMask = IGF.Builder.CreateLoad(slot); + alignMask = IGF.Builder.CreateZExt(alignMask, IGF.IGM.SizeTy); + return {size, alignMask}; } diff --git a/lib/IRGen/SwiftTargetInfo.cpp b/lib/IRGen/SwiftTargetInfo.cpp index 9e033737db62b..1c587e0af4092 100644 --- a/lib/IRGen/SwiftTargetInfo.cpp +++ b/lib/IRGen/SwiftTargetInfo.cpp @@ -103,6 +103,13 @@ static void configurePowerPC64(IRGenModule &IGM, const llvm::Triple &triple, SWIFT_ABI_POWERPC64_SWIFT_SPARE_BITS_MASK); } +/// Configures target-specific information for SystemZ platforms. +static void configureSystemZ(IRGenModule &IGM, const llvm::Triple &triple, + SwiftTargetInfo &target) { + setToMask(target.PointerSpareBits, 64, + SWIFT_ABI_S390X_SWIFT_SPARE_BITS_MASK); +} + /// Configure a default target. SwiftTargetInfo::SwiftTargetInfo( llvm::Triple::ObjectFormatType outputObjectFormat, @@ -154,6 +161,10 @@ SwiftTargetInfo SwiftTargetInfo::get(IRGenModule &IGM) { configurePowerPC64(IGM, triple, target); break; + case llvm::Triple::systemz: + configureSystemZ(IGM, triple, target); + break; + default: // FIXME: Complain here? Default target info is unlikely to be correct. break; diff --git a/lib/Parse/ParseStmt.cpp b/lib/Parse/ParseStmt.cpp index b570d03f5855e..921cefbf82984 100644 --- a/lib/Parse/ParseStmt.cpp +++ b/lib/Parse/ParseStmt.cpp @@ -1608,7 +1608,7 @@ ParserResult Parser::parseStmtGuard() { // "_compiler_version"), and whose argument is a named decl ref expression ConditionalCompilationExprState Parser::evaluateConditionalCompilationExpr(Expr *condition) { - // Evaluate a ParenExpr. + // Evaluate a ParenExpr. if (auto *PE = dyn_cast(condition)) return evaluateConditionalCompilationExpr(PE->getSubExpr()); @@ -1709,6 +1709,7 @@ Parser::evaluateConditionalCompilationExpr(Expr *condition) { } if (!fnName.equals("arch") && !fnName.equals("os") && + !fnName.equals("_endian") && !fnName.equals("_runtime") && !fnName.equals("swift") && !fnName.equals("_compiler_version")) { @@ -1799,6 +1800,11 @@ Parser::evaluateConditionalCompilationExpr(Expr *condition) { "architecture", fnName); return ConditionalCompilationExprState::error(); } + } else if (fnName == "_endian") { + if (!LangOptions::isPlatformConditionEndiannessSupported(argument)) { + diagnose(UDRE->getLoc(), diag::unknown_platform_condition_argument, + "endianness", fnName); + } } auto target = Context.LangOpts.getPlatformConditionValue(fnName); return {target == argument, ConditionalCompilationExprKind::DeclRef}; diff --git a/stdlib/private/SwiftPrivate/PRNG.swift b/stdlib/private/SwiftPrivate/PRNG.swift index 335c9166c6975..f5a2276f25cc8 100644 --- a/stdlib/private/SwiftPrivate/PRNG.swift +++ b/stdlib/private/SwiftPrivate/PRNG.swift @@ -29,7 +29,7 @@ public func rand64() -> UInt64 { public func randInt() -> Int { #if arch(i386) || arch(arm) return Int(Int32(bitPattern: rand32())) -#elseif arch(x86_64) || arch(arm64) || arch(powerpc64) || arch(powerpc64le) +#elseif arch(x86_64) || arch(arm64) || arch(powerpc64) || arch(powerpc64le) || arch(s390x) return Int(Int64(bitPattern: rand64())) #else fatalError("unimplemented") diff --git a/stdlib/private/SwiftPrivateLibcExtras/SwiftPrivateLibcExtras.swift b/stdlib/private/SwiftPrivateLibcExtras/SwiftPrivateLibcExtras.swift index af20d7fbf65b5..52d6eccd2d2b3 100644 --- a/stdlib/private/SwiftPrivateLibcExtras/SwiftPrivateLibcExtras.swift +++ b/stdlib/private/SwiftPrivateLibcExtras/SwiftPrivateLibcExtras.swift @@ -38,13 +38,13 @@ public var _stdlib_FD_SETSIZE: CInt { } public struct _stdlib_fd_set { - var _data: [UInt32] + var _data: [UInt] static var _wordBits: Int { - return sizeof(UInt32) * 8 + return sizeof(UInt) * 8 } public init() { - _data = [UInt32]( + _data = [UInt]( repeating: 0, count: Int(_stdlib_FD_SETSIZE) / _stdlib_fd_set._wordBits) } @@ -53,20 +53,20 @@ public struct _stdlib_fd_set { let fdInt = Int(fd) return ( _data[fdInt / _stdlib_fd_set._wordBits] & - UInt32(1 << (fdInt % _stdlib_fd_set._wordBits)) + UInt(1 << (fdInt % _stdlib_fd_set._wordBits)) ) != 0 } public mutating func set(_ fd: CInt) { let fdInt = Int(fd) _data[fdInt / _stdlib_fd_set._wordBits] |= - UInt32(1 << (fdInt % _stdlib_fd_set._wordBits)) + UInt(1 << (fdInt % _stdlib_fd_set._wordBits)) } public mutating func clear(_ fd: CInt) { let fdInt = Int(fd) _data[fdInt / _stdlib_fd_set._wordBits] &= - ~UInt32(1 << (fdInt % _stdlib_fd_set._wordBits)) + ~UInt(1 << (fdInt % _stdlib_fd_set._wordBits)) } public mutating func zero() { diff --git a/stdlib/public/core/Builtin.swift b/stdlib/public/core/Builtin.swift index 000952169d283..2802b6aca2639 100644 --- a/stdlib/public/core/Builtin.swift +++ b/stdlib/public/core/Builtin.swift @@ -394,6 +394,19 @@ internal var _objectPointerLowSpareBitShift: UInt { internal var _objCTaggedPointerBits: UInt { @inline(__always) get { return 0 } } +#elseif arch(s390x) +internal var _objectPointerSpareBits: UInt { + @inline(__always) get { return 0x0000_0000_0000_0007 } +} +internal var _objectPointerIsObjCBit: UInt { + @inline(__always) get { return 0x0000_0000_0000_0002 } +} +internal var _objectPointerLowSpareBitShift: UInt { + @inline(__always) get { return 0 } +} +internal var _objCTaggedPointerBits: UInt { + @inline(__always) get { return 0 } +} #endif /// Extract the raw bits of `x`. diff --git a/stdlib/public/core/FixedPoint.swift.gyb b/stdlib/public/core/FixedPoint.swift.gyb index 7c76ad654ee60..61d5a09f881b0 100644 --- a/stdlib/public/core/FixedPoint.swift.gyb +++ b/stdlib/public/core/FixedPoint.swift.gyb @@ -265,12 +265,10 @@ public struct ${Self} /// byte order if necessary. @_transparent public init(bigEndian value: ${Self}) { -#if arch(i386) || arch(x86_64) || arch(arm) || arch(arm64) || arch(powerpc64le) - self = ${Self}(Builtin.int_bswap_${BuiltinName}(value._value) ) -#elseif arch(powerpc64) +#if _endian(big) self = value #else - _UnsupportedArchitectureError() + self = ${Self}(Builtin.int_bswap_${BuiltinName}(value._value) ) #endif } @@ -278,12 +276,10 @@ public struct ${Self} /// byte order if necessary. @_transparent public init(littleEndian value: ${Self}) { -#if arch(i386) || arch(x86_64) || arch(arm) || arch(arm64) || arch(powerpc64le) +#if _endian(little) self = value -#elseif arch(powerpc64) - self = ${Self}(Builtin.int_bswap_${BuiltinName}(value._value) ) #else - _UnsupportedArchitectureError() + self = ${Self}(Builtin.int_bswap_${BuiltinName}(value._value) ) #endif } % end @@ -303,23 +299,19 @@ public struct ${Self} /// Returns the big-endian representation of the integer, changing the /// byte order if necessary. public var bigEndian: ${Self} { -#if arch(i386) || arch(x86_64) || arch(arm) || arch(arm64) || arch(powerpc64le) - return ${Self}(Builtin.int_bswap_${BuiltinName}(_value)) -#elseif arch(powerpc64) +#if _endian(big) return self #else - _UnsupportedArchitectureError() + return ${Self}(Builtin.int_bswap_${BuiltinName}(_value)) #endif } /// Returns the little-endian representation of the integer, changing the /// byte order if necessary. public var littleEndian: ${Self} { -#if arch(i386) || arch(x86_64) || arch(arm) || arch(arm64) || arch(powerpc64le) +#if _endian(little) return self -#elseif arch(powerpc64) - return ${Self}(Builtin.int_bswap_${BuiltinName}(_value)) #else - _UnsupportedArchitectureError() + return ${Self}(Builtin.int_bswap_${BuiltinName}(_value)) #endif } % end diff --git a/stdlib/public/core/Hashing.swift b/stdlib/public/core/Hashing.swift index 94f1d3286a28b..c5b63f95bd955 100644 --- a/stdlib/public/core/Hashing.swift +++ b/stdlib/public/core/Hashing.swift @@ -111,7 +111,7 @@ public // @testable func _mixUInt(_ value: UInt) -> UInt { #if arch(i386) || arch(arm) return UInt(_mixUInt32(UInt32(value))) -#elseif arch(x86_64) || arch(arm64) || arch(powerpc64) || arch(powerpc64le) +#elseif arch(x86_64) || arch(arm64) || arch(powerpc64) || arch(powerpc64le) || arch(s390x) return UInt(_mixUInt64(UInt64(value))) #endif } @@ -121,7 +121,7 @@ public // @testable func _mixInt(_ value: Int) -> Int { #if arch(i386) || arch(arm) return Int(_mixInt32(Int32(value))) -#elseif arch(x86_64) || arch(arm64) || arch(powerpc64) || arch(powerpc64le) +#elseif arch(x86_64) || arch(arm64) || arch(powerpc64) || arch(powerpc64le) || arch(s390x) return Int(_mixInt64(Int64(value))) #endif } diff --git a/stdlib/public/core/Runtime.swift.gyb b/stdlib/public/core/Runtime.swift.gyb index 39ce694988329..1f91d1d3fc589 100644 --- a/stdlib/public/core/Runtime.swift.gyb +++ b/stdlib/public/core/Runtime.swift.gyb @@ -190,7 +190,7 @@ func _stdlib_atomicCompareExchangeStrongInt( object: UnsafeMutablePointer(target), expected: UnsafeMutablePointer(expected), desired: UInt32(bitPattern: Int32(desired))) -#elseif arch(x86_64) || arch(arm64) || arch(powerpc64) || arch(powerpc64le) +#elseif arch(x86_64) || arch(arm64) || arch(powerpc64) || arch(powerpc64le) || arch(s390x) return _stdlib_atomicCompareExchangeStrongUInt64( object: UnsafeMutablePointer(target), expected: UnsafeMutablePointer(expected), @@ -205,7 +205,7 @@ func _swift_stdlib_atomicStoreInt( return _swift_stdlib_atomicStoreUInt32( object: UnsafeMutablePointer(target), desired: UInt32(bitPattern: Int32(desired))) -#elseif arch(x86_64) || arch(arm64) || arch(powerpc64) || arch(powerpc64le) +#elseif arch(x86_64) || arch(arm64) || arch(powerpc64) || arch(powerpc64le) || arch(s390x) return _swift_stdlib_atomicStoreUInt64( object: UnsafeMutablePointer(target), desired: UInt64(bitPattern: Int64(desired))) @@ -219,7 +219,7 @@ public func _swift_stdlib_atomicLoadInt( return Int(Int32(bitPattern: _swift_stdlib_atomicLoadUInt32( object: UnsafeMutablePointer(target)))) -#elseif arch(x86_64) || arch(arm64) || arch(powerpc64) || arch(powerpc64le) +#elseif arch(x86_64) || arch(arm64) || arch(powerpc64) || arch(powerpc64le) || arch(s390x) return Int(Int64(bitPattern: _swift_stdlib_atomicLoadUInt64( object: UnsafeMutablePointer(target)))) @@ -259,7 +259,7 @@ public func _swift_stdlib_atomicFetch${operation}Int( _swift_stdlib_atomicFetch${operation}UInt32( object: UnsafeMutablePointer(target), operand: UInt32(bitPattern: Int32(operand))))) -#elseif arch(x86_64) || arch(arm64) || arch(powerpc64) || arch(powerpc64le) +#elseif arch(x86_64) || arch(arm64) || arch(powerpc64) || arch(powerpc64le) || arch(s390x) return Int(Int64(bitPattern: _swift_stdlib_atomicFetch${operation}UInt64( object: UnsafeMutablePointer(target), diff --git a/stdlib/public/core/StringUTF8.swift b/stdlib/public/core/StringUTF8.swift index e5e3955cbef19..0ffe78e974843 100644 --- a/stdlib/public/core/StringUTF8.swift +++ b/stdlib/public/core/StringUTF8.swift @@ -47,8 +47,10 @@ extension _StringCore { src: UnsafeMutablePointer(startASCII + i), size: numericCast(utf16Count)) - return (i + utf16Count, result) + // Convert the _UTF8Chunk into host endianness. + return (i + utf16Count, _UTF8Chunk(littleEndian: result)) } else if _fastPath(_baseAddress != nil) { + // Transcoding should return a _UTF8Chunk in host endianness. return _encodeSomeContiguousUTF16AsUTF8(from: i) } else { #if _runtime(_ObjC) diff --git a/stdlib/public/runtime/Enum.cpp b/stdlib/public/runtime/Enum.cpp index ca1b08f35e718..dd14e458c2ce7 100644 --- a/stdlib/public/runtime/Enum.cpp +++ b/stdlib/public/runtime/Enum.cpp @@ -154,12 +154,16 @@ swift::swift_getEnumCaseSinglePayload(const OpaqueValue *value, auto *valueAddr = reinterpret_cast(value); auto *extraTagBitAddr = valueAddr + payloadSize; unsigned extraTagBits = 0; - // FIXME: endianness unsigned numBytes = getNumTagBytes(payloadSize, emptyCases-payloadNumExtraInhabitants, 1 /*payload case*/); +#if defined(__BIG_ENDIAN__) + small_memcpy(reinterpret_cast(&extraTagBits) + 4 - numBytes, + extraTagBitAddr, numBytes); +#else small_memcpy(&extraTagBits, extraTagBitAddr, numBytes); +#endif // If the extra tag bits are zero, we have a valid payload or // extra inhabitant (checked below). If nonzero, form the case index from @@ -170,10 +174,15 @@ swift::swift_getEnumCaseSinglePayload(const OpaqueValue *value, // In practice we should need no more than four bytes from the payload // area. - // FIXME: endianness. unsigned caseIndexFromValue = 0; +#if defined(__BIG_ENDIAN__) + unsigned numPayloadTagBytes = std::min(size_t(4), payloadSize); + memcpy(reinterpret_cast(&caseIndexFromValue) + 4 - + numPayloadTagBytes, valueAddr, numPayloadTagBytes); +#else memcpy(&caseIndexFromValue, valueAddr, std::min(size_t(4), payloadSize)); +#endif return (caseIndexFromExtraTagBits | caseIndexFromValue) + payloadNumExtraInhabitants; } @@ -247,11 +256,22 @@ swift::swift_storeEnumTagSinglePayload(OpaqueValue *value, } // Store into the value. - // FIXME: endianness. +#if defined(__BIG_ENDIAN__) + unsigned numPayloadTagBytes = std::min(size_t(4), payloadSize); + memcpy(valueAddr, + reinterpret_cast(&payloadIndex) + 4 - numPayloadTagBytes, + numPayloadTagBytes); + if (payloadSize > 4) + memset(valueAddr + 4, 0, payloadSize - 4); + memcpy(extraTagBitAddr, + reinterpret_cast(&extraTagIndex) + 4 - numExtraTagBytes, + numExtraTagBytes); +#else memcpy(valueAddr, &payloadIndex, std::min(size_t(4), payloadSize)); if (payloadSize > 4) memset(valueAddr + 4, 0, payloadSize - 4); memcpy(extraTagBitAddr, &extraTagIndex, numExtraTagBytes); +#endif } void @@ -312,17 +332,29 @@ static void storeMultiPayloadTag(OpaqueValue *value, MultiPayloadLayout layout, unsigned tag) { auto tagBytes = reinterpret_cast(value) + layout.payloadSize; +#if defined(__BIG_ENDIAN__) + small_memcpy(tagBytes, + reinterpret_cast(&tag) + 4 - layout.numTagBytes, + layout.numTagBytes); +#else small_memcpy(tagBytes, &tag, layout.numTagBytes); +#endif } static void storeMultiPayloadValue(OpaqueValue *value, MultiPayloadLayout layout, unsigned payloadValue) { auto bytes = reinterpret_cast(value); - +#if defined(__BIG_ENDIAN__) + unsigned numPayloadValueBytes = + std::min(layout.payloadSize, sizeof(payloadValue)); + memcpy(bytes, + reinterpret_cast(&payloadValue) + 4 - numPayloadValueBytes, + numPayloadValueBytes); +#else memcpy(bytes, &payloadValue, std::min(layout.payloadSize, sizeof(payloadValue))); - +#endif // If the payload is larger than the value, zero out the rest. if (layout.payloadSize > sizeof(payloadValue)) memset(bytes + sizeof(payloadValue), 0, @@ -334,7 +366,12 @@ static unsigned loadMultiPayloadTag(const OpaqueValue *value, auto tagBytes = reinterpret_cast(value) + layout.payloadSize; unsigned tag = 0; +#if defined(__BIG_ENDIAN__) + small_memcpy(reinterpret_cast(&tag) + 4 - layout.numTagBytes, + tagBytes, layout.numTagBytes); +#else small_memcpy(&tag, tagBytes, layout.numTagBytes); +#endif return tag; } @@ -343,8 +380,15 @@ static unsigned loadMultiPayloadValue(const OpaqueValue *value, MultiPayloadLayout layout) { auto bytes = reinterpret_cast(value); unsigned payloadValue = 0; +#if defined(__BIG_ENDIAN__) + unsigned numPayloadValueBytes = + std::min(layout.payloadSize, sizeof(payloadValue)); + memcpy(reinterpret_cast(&payloadValue) + 4 - numPayloadValueBytes, + bytes, numPayloadValueBytes); +#else memcpy(&payloadValue, bytes, std::min(layout.payloadSize, sizeof(payloadValue))); +#endif return payloadValue; } diff --git a/stdlib/public/runtime/ErrorObject.cpp b/stdlib/public/runtime/ErrorObject.cpp index bb72cdea7edc8..31b721b667b2a 100644 --- a/stdlib/public/runtime/ErrorObject.cpp +++ b/stdlib/public/runtime/ErrorObject.cpp @@ -62,6 +62,8 @@ static const FullMetadata ErrorProtocolMetadata{ Metadata{MetadataKind::ErrorObject}, }; +SWIFT_CC(swift) SWIFT_RUNTIME_EXPORT +extern "C" BoxPair::Return swift::swift_allocError(const swift::Metadata *type, const swift::WitnessTable *errorConformance, diff --git a/stdlib/public/runtime/ErrorObject.h b/stdlib/public/runtime/ErrorObject.h index a2b4ad00af44d..431e3ba8a182b 100644 --- a/stdlib/public/runtime/ErrorObject.h +++ b/stdlib/public/runtime/ErrorObject.h @@ -142,7 +142,7 @@ struct SwiftError : SwiftErrorHeader { /// copied (or taken if \c isTake is true) into the newly-allocated error box. /// If value is null, the box's contents will be left uninitialized, and /// \c isTake should be false. -SWIFT_RUNTIME_EXPORT +SWIFT_CC(swift) SWIFT_RUNTIME_EXPORT extern "C" BoxPair::Return swift_allocError(const Metadata *type, const WitnessTable *errorConformance, OpaqueValue *value, bool isTake); diff --git a/stdlib/public/runtime/HeapObject.cpp b/stdlib/public/runtime/HeapObject.cpp index cc09828bc3cee..a241277c37301 100644 --- a/stdlib/public/runtime/HeapObject.cpp +++ b/stdlib/public/runtime/HeapObject.cpp @@ -176,13 +176,13 @@ class BoxCacheEntry : public CacheEntry { static Lazy> Boxes; -SWIFT_RUNTIME_EXPORT +SWIFT_CC(swift) SWIFT_RUNTIME_EXPORT BoxPair::Return swift::swift_allocBox(const Metadata *type) { return SWIFT_RT_ENTRY_REF(swift_allocBox)(type); } -SWIFT_RT_ENTRY_IMPL_VISIBILITY +SWIFT_CC(swift) SWIFT_RT_ENTRY_IMPL_VISIBILITY extern "C" BoxPair::Return SWIFT_RT_ENTRY_IMPL(swift_allocBox)(const Metadata *type) { // Get the heap metadata for the box. diff --git a/stdlib/public/runtime/SwiftObject.mm b/stdlib/public/runtime/SwiftObject.mm index adfee3ebe0f8d..b5073ca696fde 100644 --- a/stdlib/public/runtime/SwiftObject.mm +++ b/stdlib/public/runtime/SwiftObject.mm @@ -1510,7 +1510,7 @@ static bool usesNativeSwiftReferenceCounting_nonNull( using ClassExtents = TwoWordPair; -SWIFT_RUNTIME_EXPORT +SWIFT_CC(swift) SWIFT_RUNTIME_EXPORT extern "C" ClassExtents::Return swift_class_getInstanceExtents(const Metadata *c) { diff --git a/stdlib/public/stubs/Stubs.cpp b/stdlib/public/stubs/Stubs.cpp index d22044c027b61..f3119a9fe4eb3 100644 --- a/stdlib/public/stubs/Stubs.cpp +++ b/stdlib/public/stubs/Stubs.cpp @@ -283,6 +283,7 @@ extern "C" long double _swift_fmodl(long double lhs, long double rhs) { #if (defined(__linux__) && defined(__x86_64__)) || \ (defined(__linux__) && defined(__aarch64__)) || \ (defined(__linux__) && defined(__powerpc64__)) || \ + (defined(__linux__) && defined(__s390x__)) || \ (defined(__ANDROID__) && defined(__arm64__)) typedef int ti_int __attribute__((__mode__(TI))); diff --git a/test/1_stdlib/FloatingPointIR.swift b/test/1_stdlib/FloatingPointIR.swift index 938ae8547a499..17fb44aa57a15 100644 --- a/test/1_stdlib/FloatingPointIR.swift +++ b/test/1_stdlib/FloatingPointIR.swift @@ -53,3 +53,6 @@ func testConstantFoldFloatLiterals() { // powerpc64le: call void @{{.*}}_TF15FloatingPointIR13acceptFloat32FSfT_(float 1.000000e+00) // powerpc64le: call void @{{.*}}_TF15FloatingPointIR13acceptFloat64FSdT_(double 1.000000e+00) + +// s390x: call void @{{.*}}_TF15FloatingPointIR13acceptFloat32FSfT_(float 1.000000e+00) +// s390x: call void @{{.*}}_TF15FloatingPointIR13acceptFloat64FSdT_(double 1.000000e+00) diff --git a/test/1_stdlib/ReflectionHashing.swift b/test/1_stdlib/ReflectionHashing.swift index 6994e9f2ad190..c6b4235382643 100644 --- a/test/1_stdlib/ReflectionHashing.swift +++ b/test/1_stdlib/ReflectionHashing.swift @@ -49,7 +49,7 @@ Reflection.test("Dictionary") { expected += " ▿ (2 elements)\n" expected += " - .0: \"Three\"\n" expected += " - .1: 3\n" -#elseif arch(x86_64) || arch(arm64) || arch(powerpc64) || arch(powerpc64le) +#elseif arch(x86_64) || arch(arm64) || arch(powerpc64) || arch(powerpc64le) || arch(s390x) var expected = "" expected += "▿ 5 key/value pairs\n" expected += " ▿ (2 elements)\n" @@ -88,7 +88,7 @@ Reflection.test("Set") { expected += " - 5\n" expected += " - 2\n" expected += " - 4\n" -#elseif arch(x86_64) || arch(arm64) || arch(powerpc64) || arch(powerpc64le) +#elseif arch(x86_64) || arch(arm64) || arch(powerpc64) || arch(powerpc64le) || arch(s390x) var expected = "" expected += "▿ 5 members\n" expected += " - 5\n" diff --git a/test/1_stdlib/Runtime.swift b/test/1_stdlib/Runtime.swift index 96f0727262d20..6eba1320c8abc 100644 --- a/test/1_stdlib/Runtime.swift +++ b/test/1_stdlib/Runtime.swift @@ -1493,7 +1493,7 @@ BitTwiddlingTestSuite.test("_isPowerOf2/Int") { expectTrue(_isPowerOf2(asInt(1024))) #if arch(i386) || arch(arm) // Not applicable to 32-bit architectures. -#elseif arch(x86_64) || arch(arm64) || arch(powerpc64) || arch(powerpc64le) +#elseif arch(x86_64) || arch(arm64) || arch(powerpc64) || arch(powerpc64le) || arch(s390x) expectTrue(_isPowerOf2(asInt(0x8000_0000))) #else fatalError("implement") diff --git a/test/1_stdlib/UnsafePointer.swift.gyb b/test/1_stdlib/UnsafePointer.swift.gyb index e8fa3d0e7c96e..9a2f5cd772554 100644 --- a/test/1_stdlib/UnsafePointer.swift.gyb +++ b/test/1_stdlib/UnsafePointer.swift.gyb @@ -331,7 +331,7 @@ UnsafePointerTestSuite.test("customMirror") { expectEqual(1, mirror.children.count) #if arch(i386) || arch(arm) expectEqual("18446744071562067968", String(mirror.children.first!.1)) -#elseif arch(x86_64) || arch(arm64) || arch(powerpc64) || arch(powerpc64le) +#elseif arch(x86_64) || arch(arm64) || arch(powerpc64) || arch(powerpc64le) || arch(s390x) expectEqual("9223372036854775808", String(mirror.children.first!.1)) #else fatalError("Unimplemented") @@ -346,7 +346,7 @@ UnsafePointerTestSuite.test("customPlaygroundQuickLook") { if case let .text(desc) = ptr.customPlaygroundQuickLook { #if arch(i386) || arch(arm) expectEqual("UnsafePointer(0xFFFFFFFF80000000)", desc) -#elseif arch(x86_64) || arch(arm64) || arch(powerpc64) || arch(powerpc64le) +#elseif arch(x86_64) || arch(arm64) || arch(powerpc64) || arch(powerpc64le) || arch(s390x) expectEqual("UnsafePointer(0x8000000000000000)", desc) #else fatalError("Unimplemented") @@ -363,7 +363,7 @@ UnsafeMutablePointerTestSuite.test("customMirror") { expectEqual(1, mirror.children.count) #if arch(i386) || arch(arm) expectEqual("18446744071562067968", String(mirror.children.first!.1)) -#elseif arch(x86_64) || arch(arm64) || arch(powerpc64) || arch(powerpc64le) +#elseif arch(x86_64) || arch(arm64) || arch(powerpc64) || arch(powerpc64le) || arch(s390x) expectEqual("9223372036854775808", String(mirror.children.first!.1)) #else fatalError("Unimplemented") @@ -377,7 +377,7 @@ UnsafeMutablePointerTestSuite.test("customPlaygroundQuickLook") { if case let .text(desc) = ptr.customPlaygroundQuickLook { #if arch(i386) || arch(arm) expectEqual("UnsafeMutablePointer(0xFFFFFFFF80000000)", desc) -#elseif arch(x86_64) || arch(arm64) || arch(powerpc64) || arch(powerpc64le) +#elseif arch(x86_64) || arch(arm64) || arch(powerpc64) || arch(powerpc64le) || arch(s390x) expectEqual("UnsafeMutablePointer(0x8000000000000000)", desc) #else fatalError("Unimplemented") diff --git a/test/1_stdlib/tgmath.swift b/test/1_stdlib/tgmath.swift index c017031631ffc..6353dd8174065 100644 --- a/test/1_stdlib/tgmath.swift +++ b/test/1_stdlib/tgmath.swift @@ -7,7 +7,7 @@ // where they doesn't have CoreGraphics module. #if arch(i386) || arch(arm) typealias CGFloat = Float - #elseif arch(x86_64) || arch(arm64) || arch(powerpc64) || arch(powerpc64le) + #elseif arch(x86_64) || arch(arm64) || arch(powerpc64) || arch(powerpc64le) || arch(s390x) typealias CGFloat = Double #endif #else diff --git a/test/ClangModules/ctypes_parse.swift b/test/ClangModules/ctypes_parse.swift index a6f2a890597bf..30ce40c9c9ef7 100644 --- a/test/ClangModules/ctypes_parse.swift +++ b/test/ClangModules/ctypes_parse.swift @@ -32,7 +32,7 @@ func testAnonEnum() { a = AnonConst2 #if arch(i386) || arch(arm) _ = a as CUnsignedLongLong -#elseif arch(x86_64) || arch(arm64) || arch(powerpc64) || arch(powerpc64le) +#elseif arch(x86_64) || arch(arm64) || arch(powerpc64) || arch(powerpc64le) || arch(s390x) _ = a as CUnsignedLong #else __portMe() diff --git a/test/IRGen/c_layout.sil b/test/IRGen/c_layout.sil index bf30abf0da5d3..9ac50a6afc879 100644 --- a/test/IRGen/c_layout.sil +++ b/test/IRGen/c_layout.sil @@ -237,6 +237,22 @@ bb0: // CHECK-powerpc64le-LABEL: declare signext i32 @ints(i32 signext) // CHECK-powerpc64le-LABEL: declare zeroext i32 @unsigneds(i32 zeroext) +// CHECK-s390x-LABEL: define{{( protected)?}} void @testIntegerExtension +// CHECK-s390x: call zeroext i8 @chareth(i8 zeroext %0) +// CHECK-s390x: call zeroext i8 @signedChareth(i8 zeroext %1) +// CHECK-s390x: call zeroext i8 @unsignedChareth(i8 zeroext %2) +// CHECK-s390x: call signext i16 @eatMyShorts(i16 signext %3) +// CHECK-s390x: call zeroext i16 @eatMyUnsignedShorts(i16 zeroext %4) +// CHECK-s390x: call signext i32 @ints(i32 signext %5) +// CHECK-s390x: call zeroext i32 @unsigneds(i32 zeroext %6) +// CHECK-s390x-LABEL: declare zeroext i8 @chareth(i8 zeroext) +// CHECK-s390x-LABEL: declare zeroext i8 @signedChareth(i8 zeroext) +// CHECK-s390x-LABEL: declare zeroext i8 @unsignedChareth(i8 zeroext) +// CHECK-s390x-LABEL: declare signext i16 @eatMyShorts(i16 signext) +// CHECK-s390x-LABEL: declare zeroext i16 @eatMyUnsignedShorts(i16 zeroext) +// CHECK-s390x-LABEL: declare signext i32 @ints(i32 signext) +// CHECK-s390x-LABEL: declare zeroext i32 @unsigneds(i32 zeroext) + sil @testIntegerExtension : $@convention(thin) (CChar, CSignedChar, CUnsignedChar, CShort, CUnsignedShort, CInt, CUnsignedInt) -> () { entry(%a : $CChar, %b : $CSignedChar, %c : $CUnsignedChar, %d : $CShort, %e : $CUnsignedShort, %f : $CInt, %g : $CUnsignedInt): %h = function_ref @chareth : $@convention(c) (CChar) -> CChar diff --git a/test/IRGen/class.sil b/test/IRGen/class.sil index 87610530a0566..702c6dd337678 100644 --- a/test/IRGen/class.sil +++ b/test/IRGen/class.sil @@ -97,9 +97,9 @@ bb0(%0 : $@thick C.Type): // CHECK: [[SIZE32:%.*]] = load i32, i32* [[T1]], align 8 // CHECK: [[SIZE:%.*]] = zext i32 [[SIZE32]] to i64 // CHECK: [[T0:%.*]] = getelementptr inbounds i8, i8* [[META_PTR]], i32 52 - // CHECK: [[T1:%.*]] = bitcast i8* [[T0]] to i32* - // CHECK: [[ALIGN32:%.*]] = load i32, i32* [[T1]], align 4 - // CHECK: [[ALIGN:%.*]] = zext i32 [[ALIGN32]] to i64 + // CHECK: [[T1:%.*]] = bitcast i8* [[T0]] to i16* + // CHECK: [[ALIGN16:%.*]] = load i16, i16* [[T1]], align 4 + // CHECK: [[ALIGN:%.*]] = zext i16 [[ALIGN16]] to i64 // CHECK: [[RESULT:%[0-9]+]] = call noalias %swift.refcounted* @rt_swift_allocObject(%swift.type* %0, i64 [[SIZE]], i64 [[ALIGN]]) %1 = alloc_ref_dynamic %0 : $@thick C.Type, $C return %1 : $C diff --git a/test/IRGen/condfail.sil b/test/IRGen/condfail.sil index cf3c772ca98a9..eafaa7111b3d8 100644 --- a/test/IRGen/condfail.sil +++ b/test/IRGen/condfail.sil @@ -13,6 +13,7 @@ import Swift // CHECK-armv7: trap // CHECK-powerpc64: trap // CHECK-powerpc64le: trap +// CHECK-s390x: trap // CHECK-NOT: .cfi_endproc // CHECK-x86_64: ud2 // CHECK-i386: ud2 @@ -20,6 +21,7 @@ import Swift // CHECK-armv7: trap // CHECK-powerpc64: trap // CHECK-powerpc64le: trap +// CHECK-s390x: trap // CHECK: .cfi_endproc sil hidden @test_cond_fail : $@convention(thin) (Int32) -> Int32 { bb0(%0 : $Int32): diff --git a/test/IRGen/generic_classes.sil b/test/IRGen/generic_classes.sil index fc17c994063d2..1a7a0ea609103 100644 --- a/test/IRGen/generic_classes.sil +++ b/test/IRGen/generic_classes.sil @@ -211,9 +211,9 @@ sil @_TFC15generic_classes31RecursiveGenericInheritsGenericD : $@convention(meth // CHECK: [[SIZE32:%.*]] = load i32, i32* [[T1]], align 8 // CHECK: [[SIZE:%.*]] = zext i32 [[SIZE32]] to i64 // CHECK: [[T0:%.*]] = getelementptr inbounds i8, i8* [[METADATA_ARRAY]], i32 52 -// CHECK: [[T1:%.*]] = bitcast i8* [[T0]] to i32* -// CHECK: [[ALIGN32:%.*]] = load i32, i32* [[T1]], align 4 -// CHECK: [[ALIGN:%.*]] = zext i32 [[ALIGN32]] to i64 +// CHECK: [[T1:%.*]] = bitcast i8* [[T0]] to i16* +// CHECK: [[ALIGN16:%.*]] = load i16, i16* [[T1]], align 4 +// CHECK: [[ALIGN:%.*]] = zext i16 [[ALIGN16]] to i64 // CHECK: call noalias %swift.refcounted* @rt_swift_allocObject(%swift.type* [[METADATA]], i64 [[SIZE]], i64 [[ALIGN]]) sil @RootGeneric_fragile_dependent_alloc : $ () -> RootGeneric { entry: diff --git a/test/IRGen/objc_simd.sil b/test/IRGen/objc_simd.sil index e346dfa59f4db..676d2f7353783 100644 --- a/test/IRGen/objc_simd.sil +++ b/test/IRGen/objc_simd.sil @@ -22,6 +22,7 @@ func forceStuff(x: float4, y: float3) -> (Float, Float, Float, Float) { // armv7k-LABEL: define{{( protected)?}} <4 x float> @simd_c_args(<4 x float>) // powerpc64-LABEL: define{{( protected)?}} <4 x float> @simd_c_args(<4 x float>) // powerpc64le-LABEL: define{{( protected)?}} <4 x float> @simd_c_args(<4 x float>) +// s390x-LABEL: define{{( protected)?}} <4 x float> @simd_c_args(<4 x float>) sil @simd_c_args : $@convention(c) (float4) -> float4 { entry(%x : $float4): return %x : $float4 @@ -36,6 +37,7 @@ entry(%x : $float4): // armv7k-LABEL: define{{( protected)?}} <3 x float> @simd_c_args_float3(<4 x i32>) // powerpc64-LABEL: define{{( protected)?}} <3 x float> @simd_c_args_float3(<3 x float>) // powerpc64le-LABEL: define{{( protected)?}} <3 x float> @simd_c_args_float3(<3 x float>) +// s390x-LABEL: define{{( protected)?}} <3 x float> @simd_c_args_float3(<3 x float>) sil @simd_c_args_float3 : $@convention(c) (float3) -> float3 { entry(%x : $float3): // x86_64: [[COERCE:%.*]] = alloca <3 x float>, align 16 @@ -53,6 +55,7 @@ entry(%x : $float3): // armv7k-LABEL: define{{( protected)?}} void @simd_native_args(%V4simd6float4* noalias nocapture sret, %V4simd6float4* noalias nocapture dereferenceable({{.*}})) // powerpc64-LABEL: define{{( protected)?}} void @simd_native_args(%V4simd6float4* noalias nocapture sret, %V4simd6float4* noalias nocapture dereferenceable({{.*}})) // powerpc64le-LABEL: define{{( protected)?}} void @simd_native_args(%V4simd6float4* noalias nocapture sret, %V4simd6float4* noalias nocapture dereferenceable({{.*}})) +// s390x-LABEL: define{{( protected)?}} void @simd_native_args(%V4simd6float4* noalias nocapture sret, %V4simd6float4* noalias nocapture dereferenceable({{.*}})) sil @simd_native_args : $@convention(thin) (float4) -> float4 { entry(%x : $float4): %f = function_ref @simd_c_args : $@convention(c) (float4) -> float4 @@ -69,6 +72,7 @@ entry(%x : $float4): // armv7k-LABEL: define{{( protected)?}} { float, float, float } @simd_native_args_float3(float, float, float) // powerpc64-LABEL: define{{( protected)?}} { float, float, float } @simd_native_args_float3(float, float, float) // powerpc64le-LABEL: define{{( protected)?}} { float, float, float } @simd_native_args_float3(float, float, float) +// s390x-LABEL: define{{( protected)?}} { float, float, float } @simd_native_args_float3(float, float, float) sil @simd_native_args_float3 : $@convention(thin) (float3) -> float3 { entry(%x : $float3): %f = function_ref @simd_c_args_float3 : $@convention(c) (float3) -> float3 diff --git a/test/Interpreter/builtin_bridge_object.swift b/test/Interpreter/builtin_bridge_object.swift index f58562fada22d..427c90c51e2af 100644 --- a/test/Interpreter/builtin_bridge_object.swift +++ b/test/Interpreter/builtin_bridge_object.swift @@ -37,6 +37,12 @@ let OBJC_TAGGED_POINTER_BITS: UInt = 0x8000_0000_0000_0000 let NATIVE_SPARE_BITS: UInt = 0x0000_0000_0000_0007 let OBJC_TAGGED_POINTER_BITS: UInt = 0 +#elseif arch(s390x) + +// We have no ObjC tagged pointers, and three low spare bits due to alignment. +let NATIVE_SPARE_BITS: UInt = 0x0000_0000_0000_0007 +let OBJC_TAGGED_POINTER_BITS: UInt = 0 + #endif func bitPattern(_ x: Builtin.BridgeObject) -> UInt { diff --git a/test/Parse/ConditionalCompilation/arm64AppleTVOSTarget.swift b/test/Parse/ConditionalCompilation/arm64AppleTVOSTarget.swift index 43259400cc419..71e8574953fca 100644 --- a/test/Parse/ConditionalCompilation/arm64AppleTVOSTarget.swift +++ b/test/Parse/ConditionalCompilation/arm64AppleTVOSTarget.swift @@ -7,7 +7,7 @@ let i: Int = "Hello" #endif -#if arch(arm64) && os(tvOS) && _runtime(_ObjC) +#if arch(arm64) && os(tvOS) && _runtime(_ObjC) && _endian(little) class C {} var x = C() #endif diff --git a/test/Parse/ConditionalCompilation/arm64IOSTarget.swift b/test/Parse/ConditionalCompilation/arm64IOSTarget.swift index b6087aaa13665..6f744fc6e32d3 100644 --- a/test/Parse/ConditionalCompilation/arm64IOSTarget.swift +++ b/test/Parse/ConditionalCompilation/arm64IOSTarget.swift @@ -7,7 +7,7 @@ let i: Int = "Hello" #endif -#if arch(arm64) && os(iOS) && _runtime(_ObjC) +#if arch(arm64) && os(iOS) && _runtime(_ObjC) && _endian(little) class C {} var x = C() #endif diff --git a/test/Parse/ConditionalCompilation/armAndroidTarget.swift b/test/Parse/ConditionalCompilation/armAndroidTarget.swift index de4bcb4032946..975c33f190c99 100644 --- a/test/Parse/ConditionalCompilation/armAndroidTarget.swift +++ b/test/Parse/ConditionalCompilation/armAndroidTarget.swift @@ -7,7 +7,7 @@ let i: Int = "Hello" #endif -#if arch(arm) && os(Android) && _runtime(_Native) +#if arch(arm) && os(Android) && _runtime(_Native) && _endian(little) class C {} var x = C() #endif diff --git a/test/Parse/ConditionalCompilation/armIOSTarget.swift b/test/Parse/ConditionalCompilation/armIOSTarget.swift index f8dbdec68b855..3d01c07a4407d 100644 --- a/test/Parse/ConditionalCompilation/armIOSTarget.swift +++ b/test/Parse/ConditionalCompilation/armIOSTarget.swift @@ -7,7 +7,7 @@ let i: Int = "Hello" #endif -#if arch(arm) && os(iOS) && _runtime(_ObjC) +#if arch(arm) && os(iOS) && _runtime(_ObjC) && _endian(little) class C {} var x = C() #endif diff --git a/test/Parse/ConditionalCompilation/armWatchOSTarget.swift b/test/Parse/ConditionalCompilation/armWatchOSTarget.swift index 2d382fff8f433..7df504d7eb27f 100644 --- a/test/Parse/ConditionalCompilation/armWatchOSTarget.swift +++ b/test/Parse/ConditionalCompilation/armWatchOSTarget.swift @@ -7,7 +7,7 @@ let i: Int = "Hello" #endif -#if arch(arm) && os(watchOS) && _runtime(_ObjC) +#if arch(arm) && os(watchOS) && _runtime(_ObjC) && _endian(little) class C {} var x = C() #endif diff --git a/test/Parse/ConditionalCompilation/basicParseErrors.swift b/test/Parse/ConditionalCompilation/basicParseErrors.swift index 206710f36e51f..3462756e1ef37 100644 --- a/test/Parse/ConditionalCompilation/basicParseErrors.swift +++ b/test/Parse/ConditionalCompilation/basicParseErrors.swift @@ -61,3 +61,6 @@ struct S { #if arch(leg) // expected-warning {{unknown architecture for build configuration 'arch'}} #endif + +#if _endian(mid) // expected-warning {{unknown endianness for build configuration '_endian'}} +#endif diff --git a/test/Parse/ConditionalCompilation/i386AppleTVOSTarget.swift b/test/Parse/ConditionalCompilation/i386AppleTVOSTarget.swift index 0a4183945bd52..94273fb2f3c3a 100644 --- a/test/Parse/ConditionalCompilation/i386AppleTVOSTarget.swift +++ b/test/Parse/ConditionalCompilation/i386AppleTVOSTarget.swift @@ -7,7 +7,7 @@ let i: Int = "Hello" #endif -#if arch(i386) && os(tvOS) && _runtime(_ObjC) +#if arch(i386) && os(tvOS) && _runtime(_ObjC) && _endian(little) class C {} var x = C() #endif diff --git a/test/Parse/ConditionalCompilation/i386IOSTarget.swift b/test/Parse/ConditionalCompilation/i386IOSTarget.swift index 73866cd92d950..9c965c5957535 100644 --- a/test/Parse/ConditionalCompilation/i386IOSTarget.swift +++ b/test/Parse/ConditionalCompilation/i386IOSTarget.swift @@ -7,7 +7,7 @@ let i: Int = "Hello" #endif -#if arch(i386) && os(iOS) && _runtime(_ObjC) +#if arch(i386) && os(iOS) && _runtime(_ObjC) && _endian(little) class C {} var x = C() #endif diff --git a/test/Parse/ConditionalCompilation/i386WatchOSTarget.swift b/test/Parse/ConditionalCompilation/i386WatchOSTarget.swift index 9d855322207ea..0e4614ac14ba9 100644 --- a/test/Parse/ConditionalCompilation/i386WatchOSTarget.swift +++ b/test/Parse/ConditionalCompilation/i386WatchOSTarget.swift @@ -7,7 +7,7 @@ let i: Int = "Hello" #endif -#if arch(i386) && os(watchOS) && _runtime(_ObjC) +#if arch(i386) && os(watchOS) && _runtime(_ObjC) && _endian(little) class C {} var x = C() #endif diff --git a/test/Parse/ConditionalCompilation/powerpc64LinuxTarget.swift b/test/Parse/ConditionalCompilation/powerpc64LinuxTarget.swift index 186766473e2cc..874ad8dec39be 100644 --- a/test/Parse/ConditionalCompilation/powerpc64LinuxTarget.swift +++ b/test/Parse/ConditionalCompilation/powerpc64LinuxTarget.swift @@ -1,7 +1,7 @@ // RUN: %swift -parse %s -verify -D FOO -D BAR -target powerpc64-unknown-linux-gnu -disable-objc-interop -D FOO -parse-stdlib // RUN: %swift-ide-test -test-input-complete -source-filename=%s -target powerpc64-unknown-linux-gnu -#if arch(powerpc64) && os(Linux) && _runtime(_Native) +#if arch(powerpc64) && os(Linux) && _runtime(_Native) && _endian(big) class C {} var x = C() #endif diff --git a/test/Parse/ConditionalCompilation/powerpc64leLinuxTarget.swift b/test/Parse/ConditionalCompilation/powerpc64leLinuxTarget.swift index 586972fa83706..d8973a8e357ed 100644 --- a/test/Parse/ConditionalCompilation/powerpc64leLinuxTarget.swift +++ b/test/Parse/ConditionalCompilation/powerpc64leLinuxTarget.swift @@ -1,7 +1,7 @@ // RUN: %swift -parse %s -verify -D FOO -D BAR -target powerpc64le-unknown-linux-gnu -disable-objc-interop -D FOO -parse-stdlib // RUN: %swift-ide-test -test-input-complete -source-filename=%s -target powerpc64le-unknown-linux-gnu -#if arch(powerpc64le) && os(Linux) && _runtime(_Native) +#if arch(powerpc64le) && os(Linux) && _runtime(_Native) && _endian(little) class C {} var x = C() #endif diff --git a/test/Parse/ConditionalCompilation/s390xLinuxTarget.swift b/test/Parse/ConditionalCompilation/s390xLinuxTarget.swift new file mode 100644 index 0000000000000..d2c56f3373e98 --- /dev/null +++ b/test/Parse/ConditionalCompilation/s390xLinuxTarget.swift @@ -0,0 +1,8 @@ +// RUN: %swift -parse %s -verify -D FOO -D BAR -target s390x-unknown-linux-gnu -disable-objc-interop -D FOO -parse-stdlib +// RUN: %swift-ide-test -test-input-complete -source-filename=%s -target s390x-unknown-linux-gnu + +#if arch(s390x) && os(Linux) && _runtime(_Native) && _endian(big) +class C {} +var x = C() +#endif +var y = x diff --git a/test/Parse/ConditionalCompilation/x64AppleTVOSTarget.swift b/test/Parse/ConditionalCompilation/x64AppleTVOSTarget.swift index 4f240ae010f5b..2c82025321dde 100644 --- a/test/Parse/ConditionalCompilation/x64AppleTVOSTarget.swift +++ b/test/Parse/ConditionalCompilation/x64AppleTVOSTarget.swift @@ -7,7 +7,7 @@ let i: Int = "Hello" #endif -#if arch(x86_64) && os(tvOS) && _runtime(_ObjC) +#if arch(x86_64) && os(tvOS) && _runtime(_ObjC) && _endian(little) class C {} var x = C() #endif diff --git a/test/Parse/ConditionalCompilation/x64FreeBSDTarget.swift b/test/Parse/ConditionalCompilation/x64FreeBSDTarget.swift index 284060fa6eb49..cd81bddcd2a6c 100644 --- a/test/Parse/ConditionalCompilation/x64FreeBSDTarget.swift +++ b/test/Parse/ConditionalCompilation/x64FreeBSDTarget.swift @@ -1,7 +1,7 @@ // RUN: %swift -parse %s -verify -D FOO -D BAR -target x86_64-unknown-freebsd10 -disable-objc-interop -D FOO -parse-stdlib // RUN: %swift-ide-test -test-input-complete -source-filename=%s -target x86_64-unknown-freebsd10 -#if arch(x86_64) && os(FreeBSD) && _runtime(_Native) +#if arch(x86_64) && os(FreeBSD) && _runtime(_Native) && _endian(little) class C {} var x = C() #endif diff --git a/test/Parse/ConditionalCompilation/x64IOSTarget.swift b/test/Parse/ConditionalCompilation/x64IOSTarget.swift index 65989f04a3733..9d8776a70fb01 100644 --- a/test/Parse/ConditionalCompilation/x64IOSTarget.swift +++ b/test/Parse/ConditionalCompilation/x64IOSTarget.swift @@ -7,7 +7,7 @@ let i: Int = "Hello" #endif -#if arch(x86_64) && os(iOS) && _runtime(_ObjC) +#if arch(x86_64) && os(iOS) && _runtime(_ObjC) && _endian(little) class C {} var x = C() #endif diff --git a/test/Parse/ConditionalCompilation/x64LinuxTarget.swift b/test/Parse/ConditionalCompilation/x64LinuxTarget.swift index 58c5bbb5e28c1..94e5d5856b323 100644 --- a/test/Parse/ConditionalCompilation/x64LinuxTarget.swift +++ b/test/Parse/ConditionalCompilation/x64LinuxTarget.swift @@ -1,7 +1,7 @@ // RUN: %swift -parse %s -verify -D FOO -D BAR -target x86_64-unknown-linux-gnu -disable-objc-interop -D FOO -parse-stdlib // RUN: %swift-ide-test -test-input-complete -source-filename=%s -target x86_64-unknown-linux-gnu -#if arch(x86_64) && os(Linux) && _runtime(_Native) +#if arch(x86_64) && os(Linux) && _runtime(_Native) && _endian(little) class C {} var x = C() #endif diff --git a/test/Parse/ConditionalCompilation/x64OSXTarget.swift b/test/Parse/ConditionalCompilation/x64OSXTarget.swift index 196fcbf060595..db6411f2de1be 100644 --- a/test/Parse/ConditionalCompilation/x64OSXTarget.swift +++ b/test/Parse/ConditionalCompilation/x64OSXTarget.swift @@ -1,7 +1,7 @@ // RUN: %swift -parse %s -verify -D FOO -D BAR -target x86_64-apple-macosx10.9 -D FOO -parse-stdlib // RUN: %swift-ide-test -test-input-complete -source-filename=%s -target x86_64-apple-macosx10.9 -#if arch(x86_64) && os(OSX) && _runtime(_ObjC) +#if arch(x86_64) && os(OSX) && _runtime(_ObjC) && _endian(little) class C {} var x = C() #endif diff --git a/test/Parse/ConditionalCompilation/x64WindowsTarget.swift b/test/Parse/ConditionalCompilation/x64WindowsTarget.swift index b4bd7d590eaa7..40a5552514a75 100644 --- a/test/Parse/ConditionalCompilation/x64WindowsTarget.swift +++ b/test/Parse/ConditionalCompilation/x64WindowsTarget.swift @@ -1,7 +1,7 @@ // RUN: %swift -parse %s -verify -D FOO -D BAR -target x86_64-unknown-windows-cygnus -disable-objc-interop -D FOO -parse-stdlib // RUN: %swift-ide-test -test-input-complete -source-filename=%s -target x86_64-unknown-windows-cygnus -#if arch(x86_64) && os(Windows) && _runtime(_Native) +#if arch(x86_64) && os(Windows) && _runtime(_Native) && _endian(little) class C {} var x = C() #endif diff --git a/test/SILOptimizer/diagnostic_constant_propagation_int.swift b/test/SILOptimizer/diagnostic_constant_propagation_int.swift index 65053fd98310d..b6b53fe573c49 100644 --- a/test/SILOptimizer/diagnostic_constant_propagation_int.swift +++ b/test/SILOptimizer/diagnostic_constant_propagation_int.swift @@ -265,7 +265,7 @@ func testArithmeticOverflow_UInt_32bit() { } } -#elseif arch(x86_64) || arch(arm64) || arch(powerpc64) || arch(powerpc64le) +#elseif arch(x86_64) || arch(arm64) || arch(powerpc64) || arch(powerpc64le) || arch(s390x) func testArithmeticOverflow_Int_64bit() { do { diff --git a/test/lit.cfg b/test/lit.cfg index d5347e07467a9..74254712ea7e9 100644 --- a/test/lit.cfg +++ b/test/lit.cfg @@ -305,7 +305,7 @@ lit_config.note('Using resource dir: ' + test_resource_dir) # Parse the variant triple. (run_cpu, run_vendor, run_os, run_vers) = re.match('([^-]+)-([^-]+)-([^0-9]+)(.*)', config.variant_triple).groups() -run_ptrsize = '64' if '64' in run_cpu else '32' +run_ptrsize = '64' if ('64' in run_cpu or run_cpu == "s390x") else '32' sdk_overlay_link_path = "" sdk_overlay_linker_opt = "" diff --git a/unittests/runtime/Enum.cpp b/unittests/runtime/Enum.cpp index 2bf7c0168513e..c30603946c441 100644 --- a/unittests/runtime/Enum.cpp +++ b/unittests/runtime/Enum.cpp @@ -76,9 +76,15 @@ TEST(EnumTest, getEnumCaseSinglePayload) { 128*1024)); ASSERT_EQ(-1, test_getEnumCaseSinglePayload({255, 0, 0}, _TMBi8_, 128*1024)); +#if defined(__BIG_ENDIAN__) + ASSERT_EQ(65535 - 255, + test_getEnumCaseSinglePayload({0, 1, 0}, _TMBi8_, + 128*1024)); +#else ASSERT_EQ(65535 - 255, test_getEnumCaseSinglePayload({0, 0, 1}, _TMBi8_, 128*1024)); +#endif // Test with XI. ASSERT_EQ(-1, test_getEnumCaseSinglePayload({0}, XI_TMBi8_, 2)); @@ -126,6 +132,16 @@ TEST(EnumTest, storeEnumTagSinglePayload) { ASSERT_TRUE(test_storeEnumTagSinglePayload({219, 0, 0}, {219, 123, 77}, _TMBi8_, -1, 128*1024)); +#if defined(__BIG_ENDIAN__) + ASSERT_TRUE(test_storeEnumTagSinglePayload({0, 0, 1}, {219, 123, 77}, + _TMBi8_, 0, 128*1024)); + ASSERT_TRUE(test_storeEnumTagSinglePayload({255, 0, 1}, {219, 123, 77}, + _TMBi8_, 255, 128*1024)); + ASSERT_TRUE(test_storeEnumTagSinglePayload({0, 0, 2}, {219, 123, 77}, + _TMBi8_, 256, 128*1024)); + ASSERT_TRUE(test_storeEnumTagSinglePayload({255, 2, 0}, {219, 123, 77}, + _TMBi8_, 128*1024 - 1, 128*1024)); +#else ASSERT_TRUE(test_storeEnumTagSinglePayload({0, 1, 0}, {219, 123, 77}, _TMBi8_, 0, 128*1024)); ASSERT_TRUE(test_storeEnumTagSinglePayload({255, 1, 0}, {219, 123, 77}, @@ -134,6 +150,7 @@ TEST(EnumTest, storeEnumTagSinglePayload) { _TMBi8_, 256, 128*1024)); ASSERT_TRUE(test_storeEnumTagSinglePayload({255, 0, 2}, {219, 123, 77}, _TMBi8_, 128*1024 - 1, 128*1024)); +#endif // Test with XI. ASSERT_TRUE(test_storeEnumTagSinglePayload({219}, {219}, diff --git a/utils/build-script-impl b/utils/build-script-impl index 54f34978de600..ba249ebab4678 100755 --- a/utils/build-script-impl +++ b/utils/build-script-impl @@ -30,7 +30,7 @@ umask 0022 # need to change any of these, you should do so on trunk or in a branch. # -LLVM_TARGETS_TO_BUILD="X86;ARM;AArch64;PowerPC" +LLVM_TARGETS_TO_BUILD="X86;ARM;AArch64;PowerPC;SystemZ" # # End of configurable options. @@ -346,6 +346,9 @@ function set_deployment_target_based_options() { USE_GOLD_LINKER=1 SWIFT_HOST_VARIANT_ARCH="powerpc64le" ;; + linux-s390x) + SWIFT_HOST_VARIANT_ARCH="s390x" + ;; cygwin-x86_64) SWIFT_HOST_VARIANT_ARCH="x86_64" ;; diff --git a/utils/swift-bench.py b/utils/swift-bench.py index 33a7bd6587e92..e783d7d6776c6 100644 --- a/utils/swift-bench.py +++ b/utils/swift-bench.py @@ -118,7 +118,7 @@ def process_source(self, name): public func getInt(x: Int) -> Int { #if arch(i386) || arch(arm) return _opaqueGetInt32(x) -#elseif arch(x86_64) || arch(arm64) || arch(powerpc64) || arch(powerpc64le) +#elseif arch(x86_64) || arch(arm64) || arch(powerpc64) || arch(powerpc64le) || arch(s390x) return _opaqueGetInt64(x) #else return x diff --git a/utils/swift_build_support/swift_build_support/targets.py b/utils/swift_build_support/swift_build_support/targets.py index b2a2f4513ba1a..8cfe2a0f4e1bf 100644 --- a/utils/swift_build_support/swift_build_support/targets.py +++ b/utils/swift_build_support/swift_build_support/targets.py @@ -35,6 +35,8 @@ def host_target(): return 'linux-powerpc64' elif machine == 'ppc64le': return 'linux-powerpc64le' + elif machine == 's390x': + return 'linux-s390x' elif system == 'Darwin': if machine == 'x86_64': @@ -77,6 +79,8 @@ def stdlib_deployment_targets(): return ['linux-powerpc64'] elif machine == 'ppc64le': return ['linux-powerpc64le'] + elif machine == 's390x': + return ['linux-s390x'] elif system == 'Darwin': if machine == 'x86_64': return [ diff --git a/validation-test/stdlib/FixedPoint.swift.gyb b/validation-test/stdlib/FixedPoint.swift.gyb index e917977d3736b..ba0b888d29140 100644 --- a/validation-test/stdlib/FixedPoint.swift.gyb +++ b/validation-test/stdlib/FixedPoint.swift.gyb @@ -118,7 +118,7 @@ FixedPoint.test("${Dst}(truncatingBitPattern:) from ${Src}(${bit_pattern})") { test_bit_patterns=test_bit_patterns, word_bits=32)} -#elseif arch(x86_64) || arch(arm64) || arch(powerpc64) || arch(powerpc64le) +#elseif arch(x86_64) || arch(arm64) || arch(powerpc64) || arch(powerpc64le) || arch(s390x) ${gyb.execute_template( truncating_bit_pattern_test_template, @@ -190,7 +190,7 @@ FixedPoint.test("${Dst}(bitPattern:) from ${Src}(${bit_pattern})") { test_bit_patterns=test_bit_patterns, word_bits=32)} -#elseif arch(x86_64) || arch(arm64) || arch(powerpc64) || arch(powerpc64le) +#elseif arch(x86_64) || arch(arm64) || arch(powerpc64) || arch(powerpc64le) || arch(s390x) ${gyb.execute_template( bit_pattern_test_template, @@ -248,7 +248,7 @@ FixedPoint.test("${Self}.hashValue") { test_bit_patterns=test_bit_patterns, word_bits=32)} -#elseif arch(x86_64) || arch(arm64) || arch(powerpc64) || arch(powerpc64le) +#elseif arch(x86_64) || arch(arm64) || arch(powerpc64) || arch(powerpc64le) || arch(s390x) ${gyb.execute_template( hash_value_test_template, @@ -307,10 +307,17 @@ FixedPoint.test("OverflowCheck") { FixedPoint.test("String.init") { let x: UInt32 = 0xdeadbeef +#if _endian(little) expectEqual("efbeadde", String(x.bigEndian, radix: 16)) let y = UInt32(bigEndian: 0xdeadbeef) expectEqual("deadbeef", String(y.bigEndian, radix: 16)) +#else + expectEqual("efbeadde", String(x.littleEndian, radix: 16)) + + let y = UInt32(littleEndian: 0xdeadbeef) + expectEqual("deadbeef", String(y.littleEndian, radix: 16)) +#endif } FixedPoint.test("byteSwapped") { @@ -426,5 +433,4 @@ BoolTestSuite.test("||") { expectFalse(getBool(false) || getBool(false)) } -runAllTests() - +runAllTests() \ No newline at end of file diff --git a/validation-test/stdlib/Hashing.swift b/validation-test/stdlib/Hashing.swift index b7c5a7076f58a..2f0b03f762b53 100644 --- a/validation-test/stdlib/Hashing.swift +++ b/validation-test/stdlib/Hashing.swift @@ -53,7 +53,7 @@ HashingTestSuite.test("_mixUInt64/GoldenValues") { HashingTestSuite.test("_mixUInt/GoldenValues") { #if arch(i386) || arch(arm) expectEqual(0x11b8_82c9, _mixUInt(0x0)) -#elseif arch(x86_64) || arch(arm64) || arch(powerpc64) || arch(powerpc64le) +#elseif arch(x86_64) || arch(arm64) || arch(powerpc64) || arch(powerpc64le) || arch(s390x) expectEqual(0xb2b2_4f68_8dc4_164d, _mixUInt(0x0)) #else fatalError("unimplemented") @@ -63,7 +63,7 @@ HashingTestSuite.test("_mixUInt/GoldenValues") { HashingTestSuite.test("_mixInt/GoldenValues") { #if arch(i386) || arch(arm) expectEqual(Int(bitPattern: 0x11b8_82c9), _mixInt(0x0)) -#elseif arch(x86_64) || arch(arm64) || arch(powerpc64) || arch(powerpc64le) +#elseif arch(x86_64) || arch(arm64) || arch(powerpc64) || arch(powerpc64le) || arch(s390x) expectEqual(Int(bitPattern: 0xb2b2_4f68_8dc4_164d), _mixInt(0x0)) #else fatalError("unimplemented") @@ -93,7 +93,7 @@ HashingTestSuite.test("_squeezeHashValue/Int") { #if arch(i386) || arch(arm) expectEqual(-0x6e477d37, _squeezeHashValue(0, Int.min..<(Int.max - 1))) expectEqual(0x38a3ea26, _squeezeHashValue(2, Int.min..<(Int.max - 1))) -#elseif arch(x86_64) || arch(arm64) || arch(powerpc64) || arch(powerpc64le) +#elseif arch(x86_64) || arch(arm64) || arch(powerpc64) || arch(powerpc64le) || arch(s390x) expectEqual(0x32b24f688dc4164d, _squeezeHashValue(0, Int.min..<(Int.max - 1))) expectEqual(-0x6d1cc14f97aa822, _squeezeHashValue(1, Int.min..<(Int.max - 1))) #else diff --git a/validation-test/stdlib/UnsafeBitMap.swift b/validation-test/stdlib/UnsafeBitMap.swift index 5f471da7499cf..a27cf495185d4 100644 --- a/validation-test/stdlib/UnsafeBitMap.swift +++ b/validation-test/stdlib/UnsafeBitMap.swift @@ -23,7 +23,7 @@ UnsafeBitMapTests.test("wordIndex(_:), bitIndex(_:)") { expectEqual(3, _UnsafeBitMap.wordIndex(i), "i=\(i)") expectEqual(i - 96, Int(_UnsafeBitMap.bitIndex(i)), "i=\(i)") } -#elseif arch(x86_64) || arch(arm64) || arch(powerpc64) || arch(powerpc64le) +#elseif arch(x86_64) || arch(arm64) || arch(powerpc64) || arch(powerpc64le) || arch(s390x) for i in 0...63 { expectEqual(0, _UnsafeBitMap.wordIndex(i), "i=\(i)") expectEqual(i, Int(_UnsafeBitMap.bitIndex(i)), "i=\(i)") @@ -56,7 +56,7 @@ UnsafeBitMapTests.test("sizeInWords(forSizeInBits:)") { for i in 97...128 { expectEqual(4, _UnsafeBitMap.sizeInWords(forSizeInBits: i), "i=\(i)") } -#elseif arch(x86_64) || arch(arm64) || arch(powerpc64) || arch(powerpc64le) +#elseif arch(x86_64) || arch(arm64) || arch(powerpc64) || arch(powerpc64le) || arch(s390x) for i in 1...64 { expectEqual(1, _UnsafeBitMap.sizeInWords(forSizeInBits: i), "i=\(i)") }