Skip to content

Commit 3eb9600

Browse files
committed
[SPARC] Align i128 to 16 bytes in SPARC datalayouts
Align i128s to 16 bytes, following the example at https://reviews.llvm.org/D86310. clang already does this, but do it in backend code too for the benefit of other frontends (see e.g llvm#102783).
1 parent 0fa78b6 commit 3eb9600

File tree

4 files changed

+36
-5
lines changed

4 files changed

+36
-5
lines changed

clang/lib/Basic/Targets/Sparc.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,7 @@ class LLVM_LIBRARY_VISIBILITY SparcV8TargetInfo : public SparcTargetInfo {
151151
public:
152152
SparcV8TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
153153
: SparcTargetInfo(Triple, Opts) {
154-
resetDataLayout("E-m:e-p:32:32-i64:64-f128:64-n32-S64");
154+
resetDataLayout("E-m:e-p:32:32-i64:64-i128:128-f128:64-n32-S64");
155155
// NetBSD / OpenBSD use long (same as llvm default); everyone else uses int.
156156
switch (getTriple().getOS()) {
157157
default:
@@ -188,7 +188,7 @@ class LLVM_LIBRARY_VISIBILITY SparcV8elTargetInfo : public SparcV8TargetInfo {
188188
public:
189189
SparcV8elTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
190190
: SparcV8TargetInfo(Triple, Opts) {
191-
resetDataLayout("e-m:e-p:32:32-i64:64-f128:64-n32-S64");
191+
resetDataLayout("e-m:e-p:32:32-i64:64-i128:128-f128:64-n32-S64");
192192
}
193193
};
194194

@@ -198,7 +198,7 @@ class LLVM_LIBRARY_VISIBILITY SparcV9TargetInfo : public SparcTargetInfo {
198198
SparcV9TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
199199
: SparcTargetInfo(Triple, Opts) {
200200
// FIXME: Support Sparc quad-precision long double?
201-
resetDataLayout("E-m:e-i64:64-n32:64-S128");
201+
resetDataLayout("E-m:e-i64:64-i128:128-n32:64-S128");
202202
// This is an LP64 platform.
203203
LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
204204

clang/test/CodeGen/target-data.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,11 +28,11 @@
2828

2929
// RUN: %clang_cc1 -triple sparc-sun-solaris -emit-llvm -o - %s | \
3030
// RUN: FileCheck %s --check-prefix=SPARC-V8
31-
// SPARC-V8: target datalayout = "E-m:e-p:32:32-i64:64-f128:64-n32-S64"
31+
// SPARC-V8: target datalayout = "E-m:e-p:32:32-i64:64-i128:128-f128:64-n32-S64"
3232

3333
// RUN: %clang_cc1 -triple sparcv9-sun-solaris -emit-llvm -o - %s | \
3434
// RUN: FileCheck %s --check-prefix=SPARC-V9
35-
// SPARC-V9: target datalayout = "E-m:e-i64:64-n32:64-S128"
35+
// SPARC-V9: target datalayout = "E-m:e-i64:64-i128:128-n32:64-S128"
3636

3737
// RUN: %clang_cc1 -triple mipsel-linux-gnu -o - -emit-llvm %s | \
3838
// RUN: FileCheck %s -check-prefix=MIPS-32EL

llvm/lib/Target/Sparc/SparcTargetMachine.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,10 @@ static std::string computeDataLayout(const Triple &T, bool is64Bit) {
4848
// Alignments for 64 bit integers.
4949
Ret += "-i64:64";
5050

51+
// Alignments for 128 bit integers.
52+
// This is not specified in the ABI document but is the de facto standard.
53+
Ret += "-i128:128";
54+
5155
// On SparcV9 128 floats are aligned to 128 bits, on others only to 64.
5256
// On SparcV9 registers can hold 64 or 32 bits, on others only 32.
5357
if (is64Bit)

llvm/test/CodeGen/SPARC/data-align.ll

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
; RUN: llc < %s -march=sparc | FileCheck %s
2+
; RUN: llc < %s -march=sparcel | FileCheck %s
3+
; RUN: llc < %s -march=sparcv9 | FileCheck %s
4+
5+
; CHECK: .Li8:
6+
; CHECK-DAG: .size .Li8, 1
7+
@i8 = private constant i8 42
8+
9+
; CHECK: .p2align 1
10+
; CHECK-NEXT: .Li16:
11+
; CHECK-DAG: .size .Li16, 2
12+
@i16 = private constant i16 42
13+
14+
; CHECK: .p2align 2
15+
; CHECK-NEXT: .Li32:
16+
; CHECK-DAG: .size .Li32, 4
17+
@i32 = private constant i32 42
18+
19+
; CHECK: .p2align 3
20+
; CHECK-NEXT: .Li64:
21+
; CHECK-DAG: .size .Li64, 8
22+
@i64 = private constant i64 42
23+
24+
; CHECK: .p2align 4
25+
; CHECK-NEXT: .Li128:
26+
; CHECK-DAG: .size .Li128, 16
27+
@i128 = private constant i128 42

0 commit comments

Comments
 (0)