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;