979
|
1 module asm9;
|
|
2
|
|
3 version(X86) version = DoSome;
|
|
4 else version(X86_64) version = DoSome;
|
|
5
|
|
6 T add(T, T t)(T a) {
|
|
7 asm {
|
|
8 add a, t;
|
|
9 }
|
|
10 return a;
|
|
11 }
|
|
12
|
|
13 void main() {
|
|
14 version (DoSome) {
|
|
15 assert(add!(ubyte, 20)(10) == 30);
|
|
16 assert(add!(ushort, 20_000)(10_000) == 30_000);
|
|
17 assert(add!(uint, 2_000_000)(1_000_000) == 3_000_000);
|
|
18 }
|
|
19 version(X86_64) {
|
|
20 // 64-bit immediates aren't allowed on "ADD", nor are
|
|
21 // unsigned 32-bit ones, so make the template parameter
|
|
22 // fit in a 32-bit signed int.
|
|
23 // These values were chosen so that the lower 32-bits overflow
|
|
24 // and we can see the upper half of the 64-bit input increment.
|
|
25 auto result = add!(long, 2_000_000_000)(21_000_000_000);
|
|
26 assert(result == 23_000_000_000);
|
|
27 }
|
|
28 }
|