1 ; Test insertions of 16-bit constants into an i64. 2 ; 3 ; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s 4 5 ; Check the lowest useful IILL value. (We use NILL rather than IILL 6 ; to clear 16 bits.) 7 define i64 @f1(i64 %a) { 8 ; CHECK-LABEL: f1: 9 ; CHECK-NOT: ni 10 ; CHECK: iill %r2, 1 11 ; CHECK: br %r14 12 %and = and i64 %a, 18446744073709486080 13 %or = or i64 %and, 1 14 ret i64 %or 15 } 16 17 ; Check a middle value. 18 define i64 @f2(i64 %a) { 19 ; CHECK-LABEL: f2: 20 ; CHECK-NOT: ni 21 ; CHECK: iill %r2, 32769 22 ; CHECK: br %r14 23 %and = and i64 %a, -65536 24 %or = or i64 %and, 32769 25 ret i64 %or 26 } 27 28 ; Check the highest useful IILL value. (We use OILL rather than IILL 29 ; to set 16 bits.) 30 define i64 @f3(i64 %a) { 31 ; CHECK-LABEL: f3: 32 ; CHECK-NOT: ni 33 ; CHECK: iill %r2, 65534 34 ; CHECK: br %r14 35 %and = and i64 %a, 18446744073709486080 36 %or = or i64 %and, 65534 37 ret i64 %or 38 } 39 40 ; Check the lowest useful IILH value. 41 define i64 @f4(i64 %a) { 42 ; CHECK-LABEL: f4: 43 ; CHECK-NOT: ni 44 ; CHECK: iilh %r2, 1 45 ; CHECK: br %r14 46 %and = and i64 %a, 18446744069414649855 47 %or = or i64 %and, 65536 48 ret i64 %or 49 } 50 51 ; Check a middle value. 52 define i64 @f5(i64 %a) { 53 ; CHECK-LABEL: f5: 54 ; CHECK-NOT: ni 55 ; CHECK: iilh %r2, 32767 56 ; CHECK: br %r14 57 %and = and i64 %a, -4294901761 58 %or = or i64 %and, 2147418112 59 ret i64 %or 60 } 61 62 ; Check the highest useful IILH value. 63 define i64 @f6(i64 %a) { 64 ; CHECK-LABEL: f6: 65 ; CHECK-NOT: ni 66 ; CHECK: iilh %r2, 65534 67 ; CHECK: br %r14 68 %and = and i64 %a, 18446744069414649855 69 %or = or i64 %and, 4294836224 70 ret i64 %or 71 } 72 73 ; Check the lowest useful IIHL value. 74 define i64 @f7(i64 %a) { 75 ; CHECK-LABEL: f7: 76 ; CHECK-NOT: ni 77 ; CHECK: iihl %r2, 1 78 ; CHECK: br %r14 79 %and = and i64 %a, 18446462603027808255 80 %or = or i64 %and, 4294967296 81 ret i64 %or 82 } 83 84 ; Check a middle value. 85 define i64 @f8(i64 %a) { 86 ; CHECK-LABEL: f8: 87 ; CHECK-NOT: ni 88 ; CHECK: iihl %r2, 32767 89 ; CHECK: br %r14 90 %and = and i64 %a, -281470681743361 91 %or = or i64 %and, 140733193388032 92 ret i64 %or 93 } 94 95 ; Check the highest useful IIHL value. 96 define i64 @f9(i64 %a) { 97 ; CHECK-LABEL: f9: 98 ; CHECK-NOT: ni 99 ; CHECK: iihl %r2, 65534 100 ; CHECK: br %r14 101 %and = and i64 %a, 18446462603027808255 102 %or = or i64 %and, 281466386776064 103 ret i64 %or 104 } 105 106 ; Check the lowest useful IIHH value. 107 define i64 @f10(i64 %a) { 108 ; CHECK-LABEL: f10: 109 ; CHECK-NOT: ni 110 ; CHECK: iihh %r2, 1 111 ; CHECK: br %r14 112 %and = and i64 %a, 281474976710655 113 %or = or i64 %and, 281474976710656 114 ret i64 %or 115 } 116 117 ; Check a middle value. 118 define i64 @f11(i64 %a) { 119 ; CHECK-LABEL: f11: 120 ; CHECK-NOT: ni 121 ; CHECK: iihh %r2, 32767 122 ; CHECK: br %r14 123 %and = and i64 %a, 281474976710655 124 %or = or i64 %and, 9223090561878065152 125 ret i64 %or 126 } 127 128 ; Check the highest useful IIHH value. 129 define i64 @f12(i64 %a) { 130 ; CHECK-LABEL: f12: 131 ; CHECK-NOT: ni 132 ; CHECK: iihh %r2, 65534 133 ; CHECK: br %r14 134 %and = and i64 %a, 281474976710655 135 %or = or i64 %and, 18446181123756130304 136 ret i64 %or 137 } 138