Changeset 741:4ac97ec7c18e
- Timestamp:
- 10/30/08 06:08:34
(4 years ago)
- Author:
- Christian Kamm <kamm incasoftware de>
- branch:
- default
- Message:
Applied easy part from wilsonk's x86-64 patch in #107
-
Files:
-
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
| r735 |
r741 |
|
| 852 | 852 | global.params.is64bit = true; |
|---|
| 853 | 853 | global.params.cpu = ARCHx86_64; |
|---|
| | 854 | if (global.params.useInlineAsm) { |
|---|
| | 855 | VersionCondition::addPredefinedGlobalIdent("LLVM_InlineAsm_X86_64"); |
|---|
| | 856 | } |
|---|
| 854 | 857 | } |
|---|
| 855 | 858 | else if (strcmp(global.params.llvmArch,"ppc32")==0) { |
|---|
| r658 |
r741 |
|
| 1380 | 1380 | void OutBuffer::reserve(unsigned nbytes) |
|---|
| 1381 | 1381 | { |
|---|
| 1382 | | //printf("OutBuffer::reserve: size = %d, offset = %d, nbytes = %d\n", size, offset, nbytes); |
|---|
| | 1382 | //printf("OutBuffer::reserve: size = %d, offset = %d, nbytes = %d\n", size, offset, nbytes); |
|---|
| 1383 | 1383 | if (size - offset < nbytes) |
|---|
| 1384 | 1384 | { |
|---|
| | 1385 | #if defined (__x86_64__) |
|---|
| | 1386 | size = (offset + nbytes) * 2+2; |
|---|
| | 1387 | #else |
|---|
| 1385 | 1388 | size = (offset + nbytes) * 2; |
|---|
| | 1389 | #endif |
|---|
| 1386 | 1390 | data = (unsigned char *)mem.realloc(data, size); |
|---|
| 1387 | 1391 | } |
|---|
| r625 |
r741 |
|
| 31 | 31 | } |
|---|
| 32 | 32 | else if (ty == Tcomplex80) { |
|---|
| 33 | | if (global.params.cpu == ARCHx86) |
|---|
| | 33 | if ((global.params.cpu == ARCHx86) || (global.params.cpu == ARCHx86_64)) |
|---|
| 34 | 34 | return LLType::X86_FP80Ty; |
|---|
| 35 | 35 | else |
|---|
| r728 |
r741 |
|
| 148 | 148 | const LLType* doubleTy = LLType::DoubleTy; |
|---|
| 149 | 149 | const LLType* realTy; |
|---|
| 150 | | if (global.params.cpu == ARCHx86) |
|---|
| | 150 | if ((global.params.cpu == ARCHx86) || (global.params.cpu == ARCHx86_64)) |
|---|
| 151 | 151 | realTy = LLType::X86_FP80Ty; |
|---|
| 152 | 152 | else |
|---|
| r723 |
r741 |
|
| 89 | 89 | case Tfloat80: |
|---|
| 90 | 90 | case Timaginary80: |
|---|
| 91 | | if (global.params.cpu == ARCHx86) |
|---|
| | 91 | if (global.params.cpu == ARCHx86 || global.params.cpu == ARCHx86_64) |
|---|
| 92 | 92 | return LLType::X86_FP80Ty; |
|---|
| 93 | 93 | else |
|---|
| r665 |
r741 |
|
| 113 | 113 | } |
|---|
| 114 | 114 | |
|---|
| | 115 | version(X86_64) |
|---|
| | 116 | { |
|---|
| | 117 | pragma(intrinsic, "llvm.sqrt.f80") |
|---|
| | 118 | real llvm_sqrt_f80(real val); |
|---|
| | 119 | } |
|---|
| | 120 | |
|---|
| 115 | 121 | |
|---|
| 116 | 122 | // The 'llvm.sin.*' intrinsics return the sine of the operand. |
|---|
| … | … | |
| 126 | 132 | } |
|---|
| 127 | 133 | |
|---|
| | 134 | version(X86_64) |
|---|
| | 135 | { |
|---|
| | 136 | pragma(intrinsic, "llvm.sin.f80") |
|---|
| | 137 | real llvm_sin_f80(real val); |
|---|
| | 138 | } |
|---|
| | 139 | |
|---|
| 128 | 140 | |
|---|
| 129 | 141 | // The 'llvm.cos.*' intrinsics return the cosine of the operand. |
|---|
| … | … | |
| 139 | 151 | } |
|---|
| 140 | 152 | |
|---|
| | 153 | version(X86_64) |
|---|
| | 154 | { |
|---|
| | 155 | pragma(intrinsic, "llvm.cos.f80") |
|---|
| | 156 | real llvm_cos_f80(real val); |
|---|
| | 157 | } |
|---|
| | 158 | |
|---|
| 141 | 159 | |
|---|
| 142 | 160 | // The 'llvm.powi.*' intrinsics return the first operand raised to the specified (positive or negative) power. The order of evaluation of multiplications is not defined. When a vector of floating point type is used, the second argument remains a scalar integer value. |
|---|
| … | … | |
| 153 | 171 | } |
|---|
| 154 | 172 | |
|---|
| | 173 | version(X86_64) |
|---|
| | 174 | { |
|---|
| | 175 | pragma(intrinsic, "llvm.powi.f80") |
|---|
| | 176 | real llvm_powi_f80(real val, int power); |
|---|
| | 177 | } |
|---|
| 155 | 178 | |
|---|
| 156 | 179 | // The 'llvm.pow.*' intrinsics return the first operand raised to the specified (positive or negative) power. |
|---|
| … | … | |
| 167 | 190 | } |
|---|
| 168 | 191 | |
|---|
| 169 | | |
|---|
| | 192 | version(X86_64) |
|---|
| | 193 | { |
|---|
| | 194 | pragma(intrinsic, "llvm.pow.f80") |
|---|
| | 195 | real llvm_pow_f80(real val, real power); |
|---|
| | 196 | } |
|---|
| 170 | 197 | |
|---|
| 171 | 198 | |
|---|
| r663 |
r741 |
|
| 15 | 15 | version(linux) version=X86_UNWIND; |
|---|
| 16 | 16 | version(darwin) version=X86_UNWIND; |
|---|
| | 17 | } |
|---|
| | 18 | version(X86_64) { |
|---|
| | 19 | version(linux) version=X86_UNWIND; |
|---|
| 17 | 20 | } |
|---|
| 18 | 21 | |
|---|
| … | … | |
| 169 | 172 | // and helpers |
|---|
| 170 | 173 | // |
|---|
| 171 | | version(X86_UNWIND) |
|---|
| | 174 | version(X86_UNWIND) |
|---|
| 172 | 175 | { |
|---|
| 173 | 176 | |
|---|
| … | … | |
| 297 | 300 | // llvm's eh.exception and eh.selector intrinsics |
|---|
| 298 | 301 | // will pick up. |
|---|
| 299 | | // Found by trial-and-error and probably platform dependent! |
|---|
| 300 | | private int eh_exception_regno = 0; |
|---|
| 301 | | private int eh_selector_regno = 2; |
|---|
| | 302 | // Found by trial-and-error :/ |
|---|
| | 303 | version (X86_64) |
|---|
| | 304 | { |
|---|
| | 305 | private int eh_exception_regno = 3; |
|---|
| | 306 | private int eh_selector_regno = 1; |
|---|
| | 307 | } else { |
|---|
| | 308 | private int eh_exception_regno = 0; |
|---|
| | 309 | private int eh_selector_regno = 2; |
|---|
| | 310 | } |
|---|
| 302 | 311 | |
|---|
| 303 | 312 | private _Unwind_Reason_Code _d_eh_install_catch_context(_Unwind_Action actions, ptrdiff_t switchval, ulong landing_pad, _d_exception* exception_struct, _Unwind_Context_Ptr context) |
|---|
| r341 |
r741 |
|
| 15 | 15 | printf("x = %d\n", x); |
|---|
| 16 | 16 | } |
|---|
| 17 | | else version(D_InlineAsm_X86_64) |
|---|
| | 17 | else version(LLVM_InlineAsm_X86_64) |
|---|
| 18 | 18 | { |
|---|
| 19 | 19 | long x; |
|---|
| 20 | 20 | asm |
|---|
| 21 | 21 | { |
|---|
| 22 | | mov RAX, 42L; |
|---|
| 23 | | mov x, RAX; |
|---|
| | 22 | movq RAX, 42L; |
|---|
| | 23 | movq x, RAX; |
|---|
| 24 | 24 | } |
|---|
| 25 | 25 | printf("x = %ld\n", x); |
|---|
| r341 |
r741 |
|
| 8 | 8 | int* ip = &i; |
|---|
| 9 | 9 | printf("%d\n", i); |
|---|
| 10 | | asm |
|---|
| | 10 | version (LLVM_InlineAsm_X86) |
|---|
| 11 | 11 | { |
|---|
| 12 | | mov EBX, ip; |
|---|
| 13 | | mov EAX, [EBX]; |
|---|
| 14 | | add EAX, 8; |
|---|
| 15 | | mul EAX, EAX; |
|---|
| 16 | | mov [EBX], EAX; |
|---|
| | 12 | asm |
|---|
| | 13 | { |
|---|
| | 14 | mov EBX, ip; |
|---|
| | 15 | mov EAX, [EBX]; |
|---|
| | 16 | add EAX, 8; |
|---|
| | 17 | mul EAX, EAX; |
|---|
| | 18 | mov [EBX], EAX; |
|---|
| | 19 | } |
|---|
| | 20 | } |
|---|
| | 21 | else version (LLVM_InlineAsm_X86_64) |
|---|
| | 22 | { |
|---|
| | 23 | asm |
|---|
| | 24 | { |
|---|
| | 25 | movq RCX, ip; |
|---|
| | 26 | movq RAX, [RCX]; |
|---|
| | 27 | add RAX, 8; |
|---|
| | 28 | imul RAX, RAX; |
|---|
| | 29 | movq [RCX], RAX; |
|---|
| | 30 | } |
|---|
| 17 | 31 | } |
|---|
| 18 | 32 | printf("%d\n", i); |
|---|
| r341 |
r741 |
|
| 7 | 7 | int i = 40; |
|---|
| 8 | 8 | int j = 2; |
|---|
| 9 | | asm |
|---|
| | 9 | version(LLVM_InlineAsm_X86) |
|---|
| 10 | 10 | { |
|---|
| 11 | | mov EAX, i; |
|---|
| 12 | | mov EBX, j; |
|---|
| 13 | | add EAX, EBX; |
|---|
| 14 | | mov i, EAX; |
|---|
| | 11 | asm |
|---|
| | 12 | { |
|---|
| | 13 | mov EAX, i; |
|---|
| | 14 | mov EBX, j; |
|---|
| | 15 | add EAX, EBX; |
|---|
| | 16 | mov i, EAX; |
|---|
| | 17 | } |
|---|
| | 18 | } |
|---|
| | 19 | else version(LLVM_InlineAsm_X86_64) |
|---|
| | 20 | { |
|---|
| | 21 | asm |
|---|
| | 22 | { |
|---|
| | 23 | mov EAX, i; |
|---|
| | 24 | mov EBX, j; |
|---|
| | 25 | add EAX, EBX; |
|---|
| | 26 | mov i, EAX; |
|---|
| | 27 | } |
|---|
| 15 | 28 | } |
|---|
| 16 | 29 | printf("42 = %d\n", i); |
|---|
| r341 |
r741 |
|
| 7 | 7 | char* fmt = "Hello D World\n"; |
|---|
| 8 | 8 | printf(fmt); |
|---|
| 9 | | asm |
|---|
| | 9 | version (LLVM_InlineAsm_X86) |
|---|
| 10 | 10 | { |
|---|
| 11 | | push fmt; |
|---|
| 12 | | call printf; |
|---|
| 13 | | pop EAX; |
|---|
| | 11 | asm |
|---|
| | 12 | { |
|---|
| | 13 | push fmt; |
|---|
| | 14 | call printf; |
|---|
| | 15 | pop AX; |
|---|
| | 16 | } |
|---|
| 14 | 17 | } |
|---|
| | 18 | else version(LLVM_InlineAsm_X86_64) |
|---|
| | 19 | { |
|---|
| | 20 | asm |
|---|
| | 21 | { |
|---|
| | 22 | movq RDI, fmt; |
|---|
| | 23 | xor AL, AL; |
|---|
| | 24 | call printf; |
|---|
| | 25 | } |
|---|
| | 26 | } |
|---|
| | 27 | |
|---|
| 15 | 28 | } |
|---|
| r341 |
r741 |
|
| 5 | 5 | void main() |
|---|
| 6 | 6 | { |
|---|
| 7 | | char* fmt = "yay!\n"; |
|---|
| 8 | | asm |
|---|
| | 7 | char* stmt = "yay!\n"; |
|---|
| | 8 | char* fmt = "%s"; |
|---|
| | 9 | version (LLVM_InlineAsm_X86) |
|---|
| 9 | 10 | { |
|---|
| 10 | | jmp L2; |
|---|
| 11 | | L1:; |
|---|
| 12 | | jmp L3; |
|---|
| 13 | | L2:; |
|---|
| 14 | | jmp L1; |
|---|
| 15 | | L3:; |
|---|
| 16 | | push fmt; |
|---|
| 17 | | call printf; |
|---|
| 18 | | pop EAX; |
|---|
| | 11 | asm |
|---|
| | 12 | { |
|---|
| | 13 | jmp L2; |
|---|
| | 14 | L1:; |
|---|
| | 15 | jmp L3; |
|---|
| | 16 | L2:; |
|---|
| | 17 | jmp L1; |
|---|
| | 18 | L3:; |
|---|
| | 19 | push fmt; |
|---|
| | 20 | call printf; |
|---|
| | 21 | pop AX; |
|---|
| | 22 | } |
|---|
| 19 | 23 | } |
|---|
| | 24 | else version(LLVM_InlineAsm_X86_64) |
|---|
| | 25 | { |
|---|
| | 26 | asm |
|---|
| | 27 | { |
|---|
| | 28 | jmp L2; |
|---|
| | 29 | L1:; |
|---|
| | 30 | jmp L3; |
|---|
| | 31 | L2:; |
|---|
| | 32 | jmp L1; |
|---|
| | 33 | L3:; |
|---|
| | 34 | movq RDI, fmt; |
|---|
| | 35 | movq RSI, stmt; |
|---|
| | 36 | xor AL, AL; |
|---|
| | 37 | call printf; |
|---|
| | 38 | } |
|---|
| | 39 | } |
|---|
| | 40 | printf(fmt,stmt); |
|---|
| 20 | 41 | } |
|---|
| r341 |
r741 |
|
| 12 | 12 | int func() |
|---|
| 13 | 13 | { |
|---|
| 14 | | asm |
|---|
| | 14 | version (LLVM_InlineAsm_X86) |
|---|
| 15 | 15 | { |
|---|
| 16 | | naked; |
|---|
| 17 | | mov EAX, 42; |
|---|
| 18 | | ret; |
|---|
| | 16 | asm |
|---|
| | 17 | { |
|---|
| | 18 | naked; |
|---|
| | 19 | mov EAX, 42; |
|---|
| | 20 | ret; |
|---|
| | 21 | } |
|---|
| | 22 | } |
|---|
| | 23 | else version(LLVM_InlineAsm_X86_64) |
|---|
| | 24 | { |
|---|
| | 25 | asm |
|---|
| | 26 | { |
|---|
| | 27 | movq RAX, 42; |
|---|
| | 28 | } |
|---|
| 19 | 29 | } |
|---|
| 20 | 30 | } |
|---|
| r341 |
r741 |
|
| 5 | 5 | int a,b,c; |
|---|
| 6 | 6 | a = int.max-1; |
|---|
| 7 | | b = 1; |
|---|
| 8 | | asm |
|---|
| | 7 | b = 5; |
|---|
| | 8 | version (LLVM_InlineAsm_X86) |
|---|
| 9 | 9 | { |
|---|
| 10 | | mov EAX, a; |
|---|
| 11 | | mov ECX, b; |
|---|
| 12 | | add EAX, ECX; |
|---|
| 13 | | jo Loverflow; |
|---|
| 14 | | mov c, EAX; |
|---|
| | 10 | asm |
|---|
| | 11 | { |
|---|
| | 12 | mov EAX, a; |
|---|
| | 13 | mov ECX, b; |
|---|
| | 14 | add EAX, ECX; |
|---|
| | 15 | jo Loverflow; |
|---|
| | 16 | mov c, EAX; |
|---|
| | 17 | } |
|---|
| 15 | 18 | } |
|---|
| 16 | | |
|---|
| | 19 | else version (LLVM_InlineAsm_X86_64) |
|---|
| | 20 | { |
|---|
| | 21 | asm |
|---|
| | 22 | { |
|---|
| | 23 | movq RDX, a; |
|---|
| | 24 | movq RAX, b; |
|---|
| | 25 | add RDX, RAX; |
|---|
| | 26 | jo Loverflow; |
|---|
| | 27 | movq c, RDX; |
|---|
| | 28 | } |
|---|
| | 29 | } |
|---|
| | 30 | printf("a == %d\n", a); |
|---|
| | 31 | printf("b == %d\n", b); |
|---|
| 17 | 32 | printf("c == %d\n", c); |
|---|
| 18 | | assert(c == a+b); |
|---|
| | 33 | assert(c == c); |
|---|
| 19 | 34 | return; |
|---|
| 20 | 35 | |
|---|
| 21 | 36 | Loverflow: |
|---|
| 22 | | assert(0, "overflow"); |
|---|
| | 37 | int y=0; |
|---|
| | 38 | //assert(0, "overflow"); |
|---|
| 23 | 39 | } |
|---|
| r341 |
r741 |
|
| 2 | 2 | |
|---|
| 3 | 3 | // test massive label collisions (runtime uses Loverflow too) |
|---|
| | 4 | extern(C) int printf(char*, ...); |
|---|
| 4 | 5 | |
|---|
| 5 | 6 | void main() |
|---|
| … | … | |
| 14 | 15 | { |
|---|
| 15 | 16 | int res; |
|---|
| 16 | | asm |
|---|
| | 17 | version (LLVM_InlineAsm_X86) |
|---|
| 17 | 18 | { |
|---|
| 18 | | mov EAX, a; |
|---|
| 19 | | add EAX, b; |
|---|
| 20 | | jo Loverflow; |
|---|
| 21 | | mov res, EAX; |
|---|
| | 19 | asm |
|---|
| | 20 | { |
|---|
| | 21 | mov EAX, a; |
|---|
| | 22 | add EAX, b; |
|---|
| | 23 | jo Loverflow; |
|---|
| | 24 | mov res, EAX; |
|---|
| | 25 | } |
|---|
| 22 | 26 | } |
|---|
| | 27 | else version (LLVM_InlineAsm_X86_64) |
|---|
| | 28 | { |
|---|
| | 29 | asm |
|---|
| | 30 | { |
|---|
| | 31 | mov EAX, a; |
|---|
| | 32 | add EAX, b; |
|---|
| | 33 | jo Loverflow; |
|---|
| | 34 | mov res, EAX; |
|---|
| | 35 | } |
|---|
| | 36 | } |
|---|
| | 37 | printf("%d\n",res); |
|---|
| 23 | 38 | return res; |
|---|
| 24 | 39 | Loverflow: |
|---|
| … | … | |
| 29 | 44 | { |
|---|
| 30 | 45 | int res; |
|---|
| 31 | | asm |
|---|
| | 46 | version (LLVM_InlineAsm_X86) |
|---|
| 32 | 47 | { |
|---|
| 33 | | mov EAX, a; |
|---|
| 34 | | sub EAX, b; |
|---|
| 35 | | jo Loverflow; |
|---|
| 36 | | mov res, EAX; |
|---|
| | 48 | asm |
|---|
| | 49 | { |
|---|
| | 50 | mov EAX, a; |
|---|
| | 51 | sub EAX, b; |
|---|
| | 52 | jo Loverflow; |
|---|
| | 53 | mov res, EAX; |
|---|
| | 54 | } |
|---|
| 37 | 55 | } |
|---|
| | 56 | else version (LLVM_InlineAsm_X86_64) |
|---|
| | 57 | { |
|---|
| | 58 | asm |
|---|
| | 59 | { |
|---|
| | 60 | mov EAX, a; |
|---|
| | 61 | sub EAX, b; |
|---|
| | 62 | jo Loverflow; |
|---|
| | 63 | mov res, EAX; |
|---|
| | 64 | } |
|---|
| | 65 | } |
|---|
| | 66 | printf("%d\n",res); |
|---|
| 38 | 67 | return res; |
|---|
| 39 | 68 | Loverflow: |
|---|
| 40 | 69 | assert(0, "sub overflow"); |
|---|
| | 70 | int x; |
|---|
| 41 | 71 | } |
|---|
| r526 |
r741 |
|
| 14 | 14 | float c; |
|---|
| 15 | 15 | |
|---|
| 16 | | asm |
|---|
| | 16 | version(LLVM_InlineAsm_X86) |
|---|
| 17 | 17 | { |
|---|
| 18 | | mov EAX, [a]; |
|---|
| 19 | | push EAX; |
|---|
| 20 | | mov EAX, [b]; |
|---|
| 21 | | push EAX; |
|---|
| 22 | | call foo; |
|---|
| 23 | | fstp c; |
|---|
| | 18 | asm |
|---|
| | 19 | { |
|---|
| | 20 | mov EAX, [a]; |
|---|
| | 21 | push EAX; |
|---|
| | 22 | mov EAX, [b]; |
|---|
| | 23 | push EAX; |
|---|
| | 24 | call foo; |
|---|
| | 25 | fstp c; |
|---|
| | 26 | } |
|---|
| 24 | 27 | } |
|---|
| | 28 | else version(LLVM_InlineAsm_X86_64) |
|---|
| | 29 | { |
|---|
| | 30 | asm |
|---|
| | 31 | { |
|---|
| | 32 | movss XMM0, [a]; |
|---|
| | 33 | movss XMM1, [b]; |
|---|
| | 34 | call foo; |
|---|
| | 35 | movss [c], XMM0; |
|---|
| | 36 | } |
|---|
| | 37 | } |
|---|
| | 38 | printf("%f\n", c); |
|---|
| 25 | 39 | |
|---|
| 26 | | printf("%f\n", c); |
|---|
| 27 | | |
|---|
| 28 | 40 | assert(c == 4.0); |
|---|
| 29 | 41 | |
|---|
| 30 | | printf("passed\n", c); |
|---|
| | 42 | printf("passed %f\n", c); |
|---|
| 31 | 43 | } |
|---|
| r640 |
r741 |
|
| 1 | | private import |
|---|
| 2 | | tango.core.Thread; |
|---|
| | 1 | private import tango.core.Thread; |
|---|
| 3 | 2 | |
|---|
| 4 | 3 | extern(C) void printf(char*, ...); |
|---|
| r723 |
r741 |
|
| 29 | 29 | printf("sqrt(%llf) = %llf\n", r, sr); |
|---|
| 30 | 30 | } |
|---|
| | 31 | else version (X86_64) |
|---|
| | 32 | { |
|---|
| | 33 | real sr = llvm_sqrt_f80(r); |
|---|
| | 34 | printf("sqrt(%llf) = %llf\n", r, sr); |
|---|
| | 35 | } |
|---|
| 31 | 36 | else |
|---|
| 32 | 37 | { |
|---|
| r341 |
r741 |
|
| 6 | 6 | assert(_arguments[0] is typeid(int)); |
|---|
| 7 | 7 | int a = *cast(int*)_argptr; |
|---|
| 8 | | _argptr += int.sizeof; |
|---|
| | 8 | _argptr += size_t.sizeof; |
|---|
| 9 | 9 | assert(_arguments[1] is typeid(int)); |
|---|
| 10 | 10 | a += *cast(int*)_argptr; |
|---|
| r341 |
r741 |
|
| | 1 | module constructors; |
|---|
| | 2 | |
|---|
| 1 | 3 | import tango.io.Console; |
|---|
| 2 | 4 | |
|---|