1 /// Copyright: Copyright (c) 2017-2019 Andrey Penechko. 2 /// License: $(WEB boost.org/LICENSE_1_0.txt, Boost License 1.0). 3 /// Authors: Andrey Penechko. 4 module tests.reg_alloc; 5 6 import std.stdio; 7 import tester; 8 9 Test[] regAllocTests() { return collectTests!(tests.reg_alloc)(); } 10 11 extern(C) void external_void_func(){} 12 13 @TestInfo(&tester1, [HostSymbol("callee", cast(void*)&external_void_func)]) 14 immutable reg_alloc1 = q{--- reg_alloc1 15 // test register allocation 16 @extern(module, "host") 17 void callee(); // uses all registers causing spilling 18 i32 run(i32 a) 19 { 20 callee; 21 return a; 22 } 23 }; 24 void tester1(ref TestContext ctx) { 25 assert(ctx.getFunctionPtr!(int, int)("run")(1) == 1); 26 } 27 28 @TestInfo(&tester2, [HostSymbol("callee", cast(void*)&external_void_func)]) 29 immutable reg_alloc2 = q{--- reg_alloc2 30 // test register allocation 31 @extern(module, "host") 32 void callee(); 33 i32 run(i32 a, i32 b, i32 c, i32 d) 34 { 35 i32 e = b * c; 36 callee; 37 return a + b + c + d + e; 38 } 39 }; 40 void tester2(ref TestContext ctx) { 41 assert(ctx.getFunctionPtr!(int, int, int, int, int)("run")(1, 1, 1, 1) == 5); 42 } 43 44 @TestInfo(&tester3, [HostSymbol("callee", cast(void*)&external_void_func)]) 45 immutable reg_alloc3 = q{--- reg_alloc3 46 // test register allocation 47 @extern(module, "host") 48 void callee(); 49 i32 run(i32 a, i32 b, i32 c, i32 d) 50 { 51 i32 e = b * c; 52 return a + b + c + d + e; 53 } 54 }; 55 void tester3(ref TestContext ctx) { 56 assert(ctx.getFunctionPtr!(int, int, int, int, int)("run")(1, 1, 1, 1) == 5); 57 } 58 59 @TestInfo() 60 immutable reg_alloc4 = q{--- reg_alloc4 61 void setRangeu8(u8* slice, u64 from, u64 to, u8 value) {} 62 void formatInt(i64 i, u8[21]* output, u32 minSize, u8[]* result) 63 { 64 u32 numDigits = 0; 65 if (i == 0) 66 { 67 if (minSize == 0) 68 minSize = 1; 69 setRangeu8((*output).ptr, 21 - minSize, 21, '0'); 70 (*output)[20] = '0'; 71 numDigits = minSize; 72 } 73 else 74 { 75 bool neg = i < 0; 76 if (neg) { 77 i = -i; 78 } 79 bool overflow = i < 0; 80 if (overflow) 81 i = i64.max; 82 83 while (i) 84 { 85 u8 c = cast(u8)('0' + i % 10); 86 (*output)[21 - ++numDigits] = c; 87 i /= 10; 88 } 89 90 while (numDigits < minSize) { 91 (*output)[21 - ++numDigits] = '0'; 92 } 93 94 if (neg) { 95 (*output)[21 - ++numDigits] = '-'; 96 } 97 if (overflow) { 98 ++(*output)[20]; 99 } 100 } 101 (*result).ptr = (*output).ptr + (21 - numDigits); 102 (*result).length = numDigits; 103 } 104 };