1 ; RUN: llc -verify-machineinstrs -o - %s -mtriple=arm64-apple-ios7.0 | FileCheck %s --check-prefix=CHECK 2 3 define i64 @test0() { 4 ; CHECK-LABEL: test0: 5 ; Not produced by move wide instructions, but good to make sure we can return 0 anyway: 6 ; CHECK: mov x0, xzr 7 ret i64 0 8 } 9 10 define i64 @test1() { 11 ; CHECK-LABEL: test1: 12 ; CHECK: orr w0, wzr, #0x1 13 ret i64 1 14 } 15 16 define i64 @test2() { 17 ; CHECK-LABEL: test2: 18 ; CHECK: orr w0, wzr, #0xffff 19 ret i64 65535 20 } 21 22 define i64 @test3() { 23 ; CHECK-LABEL: test3: 24 ; CHECK: orr w0, wzr, #0x10000 25 ret i64 65536 26 } 27 28 define i64 @test4() { 29 ; CHECK-LABEL: test4: 30 ; CHECK: orr w0, wzr, #0xffff0000 31 ret i64 4294901760 32 } 33 34 define i64 @test5() { 35 ; CHECK-LABEL: test5: 36 ; CHECK: orr x0, xzr, #0x100000000 37 ret i64 4294967296 38 } 39 40 define i64 @test6() { 41 ; CHECK-LABEL: test6: 42 ; CHECK: orr x0, xzr, #0xffff00000000 43 ret i64 281470681743360 44 } 45 46 define i64 @test7() { 47 ; CHECK-LABEL: test7: 48 ; CHECK: orr x0, xzr, #0x1000000000000 49 ret i64 281474976710656 50 } 51 52 ; A 32-bit MOVN can generate some 64-bit patterns that a 64-bit one 53 ; couldn't. Useful even for i64 54 define i64 @test8() { 55 ; CHECK-LABEL: test8: 56 ; CHECK: movn w0, #{{60875|0xedcb}} 57 ret i64 4294906420 58 } 59 60 define i64 @test9() { 61 ; CHECK-LABEL: test9: 62 ; CHECK: movn x0, #0 63 ret i64 -1 64 } 65 66 define i64 @test10() { 67 ; CHECK-LABEL: test10: 68 ; CHECK: movn x0, #{{60875|0xedcb}}, lsl #16 69 ret i64 18446744069720047615 70 } 71 72 ; For reasonably legitimate reasons returning an i32 results in the 73 ; selection of an i64 constant, so we need a different idiom to test that selection 74 @var32 = global i32 0 75 76 define void @test11() { 77 ; CHECK-LABEL: test11: 78 ; CHECK: str wzr 79 store i32 0, i32* @var32 80 ret void 81 } 82 83 define void @test12() { 84 ; CHECK-LABEL: test12: 85 ; CHECK: orr {{w[0-9]+}}, wzr, #0x1 86 store i32 1, i32* @var32 87 ret void 88 } 89 90 define void @test13() { 91 ; CHECK-LABEL: test13: 92 ; CHECK: orr {{w[0-9]+}}, wzr, #0xffff 93 store i32 65535, i32* @var32 94 ret void 95 } 96 97 define void @test14() { 98 ; CHECK-LABEL: test14: 99 ; CHECK: orr {{w[0-9]+}}, wzr, #0x10000 100 store i32 65536, i32* @var32 101 ret void 102 } 103 104 define void @test15() { 105 ; CHECK-LABEL: test15: 106 ; CHECK: orr {{w[0-9]+}}, wzr, #0xffff0000 107 store i32 4294901760, i32* @var32 108 ret void 109 } 110 111 define void @test16() { 112 ; CHECK-LABEL: test16: 113 ; CHECK: movn {{w[0-9]+}}, #0 114 store i32 -1, i32* @var32 115 ret void 116 } 117 118 define i64 @test17() { 119 ; CHECK-LABEL: test17: 120 121 ; Mustn't MOVN w0 here. 122 ; CHECK: orr x0, xzr, #0xfffffffffffffffd 123 ret i64 -3 124 } 125