Mercurial > projects > ldc
comparison dmd/mtype.c @ 742:05e7657a7811
Fix REALSIZE, REALPAD and alignment of double and real for x86-64.
author | Christian Kamm <kamm incasoftware de> |
---|---|
date | Thu, 30 Oct 2008 15:58:58 +0100 |
parents | 1ae94fb1dbbd |
children | bfabbac8e705 |
comparison
equal
deleted
inserted
replaced
741:4ac97ec7c18e | 742:05e7657a7811 |
---|---|
229 tvoidptr = tvoid->pointerTo(); | 229 tvoidptr = tvoid->pointerTo(); |
230 | 230 |
231 // set size_t / ptrdiff_t types and pointer size | 231 // set size_t / ptrdiff_t types and pointer size |
232 if (global.params.is64bit) | 232 if (global.params.is64bit) |
233 { | 233 { |
234 Tsize_t = Tuns64; | 234 Tsize_t = Tuns64; |
235 Tptrdiff_t = Tint64; | 235 Tptrdiff_t = Tint64; |
236 PTRSIZE = 8; | 236 PTRSIZE = 8; |
237 } | 237 } |
238 else | 238 else |
239 { | 239 { |
240 Tsize_t = Tuns32; | 240 Tsize_t = Tuns32; |
241 Tptrdiff_t = Tint32; | 241 Tptrdiff_t = Tint32; |
242 PTRSIZE = 4; | 242 PTRSIZE = 4; |
243 } | 243 } |
244 | 244 |
245 // set real size and padding | 245 // set real size and padding |
246 if (global.params.cpu == ARCHx86) | 246 if (global.params.cpu == ARCHx86) |
247 { | 247 { |
248 REALSIZE = 12; | 248 REALSIZE = 12; |
249 REALPAD = 2; | 249 REALPAD = 2; |
250 } | |
251 else if (global.params.cpu == ARCHx86_64) | |
252 { | |
253 REALSIZE = 16; | |
254 REALPAD = 6; | |
250 } | 255 } |
251 else | 256 else |
252 { | 257 { |
253 REALSIZE = 8; | 258 REALSIZE = 8; |
254 REALPAD = 0; | 259 REALPAD = 0; |
255 } | 260 } |
256 } | 261 } |
257 | 262 |
258 d_uns64 Type::size() | 263 d_uns64 Type::size() |
259 { | 264 { |
989 } | 994 } |
990 | 995 |
991 unsigned TypeBasic::alignsize() | 996 unsigned TypeBasic::alignsize() |
992 { unsigned sz; | 997 { unsigned sz; |
993 | 998 |
999 //LDC: it's bad that we always have to check LLVM's align and | |
1000 // dmd's align info match. Can't we somehow get at LLVM's align | |
1001 // here? | |
1002 | |
994 switch (ty) | 1003 switch (ty) |
995 { | 1004 { |
996 //LDC: llvm aligns 12 byte reals to 4 byte | |
997 case Tfloat80: | 1005 case Tfloat80: |
998 case Timaginary80: | 1006 case Timaginary80: |
999 case Tcomplex80: | 1007 case Tcomplex80: |
1000 //sz = REALSIZE; | 1008 if (global.params.cpu == ARCHx86_64) |
1001 sz = 4; | 1009 sz = 16; |
1010 else | |
1011 sz = 4; | |
1002 break; | 1012 break; |
1003 | 1013 |
1004 //LDC: llvm aligns these to 4 byte boundaries | |
1005 case Tint64: | 1014 case Tint64: |
1006 case Tuns64: | 1015 case Tuns64: |
1007 case Tfloat64: | 1016 case Tfloat64: |
1008 case Timaginary64: | 1017 case Timaginary64: |
1009 sz = 4; | 1018 if (global.params.cpu == ARCHx86_64) |
1019 sz = 8; | |
1020 else | |
1021 sz = 4; | |
1010 break; | 1022 break; |
1011 | 1023 |
1012 default: | 1024 default: |
1013 sz = size(0); | 1025 sz = size(0); |
1014 break; | 1026 break; |