1; RUN: llc -march=hexagon -mcpu=hexagonv5 -hexagon-bit=0 < %s | FileCheck %s 2; Optimized bitwise operations. 3 4define i32 @my_clrbit(i32 %x) nounwind { 5entry: 6; CHECK: r{{[0-9]+}} = clrbit(r{{[0-9]+}}, #31) 7 %x.addr = alloca i32, align 4 8 store i32 %x, i32* %x.addr, align 4 9 %0 = load i32, i32* %x.addr, align 4 10 %and = and i32 %0, 2147483647 11 ret i32 %and 12} 13 14define i64 @my_clrbit2(i64 %x) nounwind { 15entry: 16; CHECK: r{{[0-9]+}} = clrbit(r{{[0-9]+}}, #31) 17 %x.addr = alloca i64, align 8 18 store i64 %x, i64* %x.addr, align 8 19 %0 = load i64, i64* %x.addr, align 8 20 %and = and i64 %0, -2147483649 21 ret i64 %and 22} 23 24define i64 @my_clrbit3(i64 %x) nounwind { 25entry: 26; CHECK: r{{[0-9]+}} = clrbit(r{{[0-9]+}}, #31) 27 %x.addr = alloca i64, align 8 28 store i64 %x, i64* %x.addr, align 8 29 %0 = load i64, i64* %x.addr, align 8 30 %and = and i64 %0, 9223372036854775807 31 ret i64 %and 32} 33 34define i32 @my_clrbit4(i32 %x) nounwind { 35entry: 36; CHECK: r{{[0-9]+}} = clrbit(r{{[0-9]+}}, #13) 37 %x.addr = alloca i32, align 4 38 store i32 %x, i32* %x.addr, align 4 39 %0 = load i32, i32* %x.addr, align 4 40 %and = and i32 %0, -8193 41 ret i32 %and 42} 43 44define i64 @my_clrbit5(i64 %x) nounwind { 45entry: 46; CHECK: r{{[0-9]+}} = clrbit(r{{[0-9]+}}, #13) 47 %x.addr = alloca i64, align 8 48 store i64 %x, i64* %x.addr, align 8 49 %0 = load i64, i64* %x.addr, align 8 50 %and = and i64 %0, -8193 51 ret i64 %and 52} 53 54define i64 @my_clrbit6(i64 %x) nounwind { 55entry: 56; CHECK: r{{[0-9]+}} = clrbit(r{{[0-9]+}}, #27) 57 %x.addr = alloca i64, align 8 58 store i64 %x, i64* %x.addr, align 8 59 %0 = load i64, i64* %x.addr, align 8 60 %and = and i64 %0, -576460752303423489 61 ret i64 %and 62} 63 64define zeroext i16 @my_setbit(i16 zeroext %crc) nounwind { 65entry: 66; CHECK: memh(r{{[0-9]+}}+#0){{ *}}={{ *}}setbit(#15) 67 %crc.addr = alloca i16, align 2 68 store i16 %crc, i16* %crc.addr, align 2 69 %0 = load i16, i16* %crc.addr, align 2 70 %conv = zext i16 %0 to i32 71 %or = or i32 %conv, 32768 72 %conv1 = trunc i32 %or to i16 73 store i16 %conv1, i16* %crc.addr, align 2 74 %1 = load i16, i16* %crc.addr, align 2 75 ret i16 %1 76} 77 78define i32 @my_setbit2(i32 %x) nounwind { 79entry: 80; CHECK: r{{[0-9]+}}{{ *}}={{ *}}setbit(r{{[0-9]+}}, #15) 81 %x.addr = alloca i32, align 4 82 store i32 %x, i32* %x.addr, align 4 83 %0 = load i32, i32* %x.addr, align 4 84 %or = or i32 %0, 32768 85 ret i32 %or 86} 87 88define i64 @my_setbit3(i64 %x) nounwind { 89entry: 90; CHECK: r{{[0-9]+}}{{ *}}={{ *}}setbit(r{{[0-9]+}}, #15) 91 %x.addr = alloca i64, align 8 92 store i64 %x, i64* %x.addr, align 8 93 %0 = load i64, i64* %x.addr, align 8 94 %or = or i64 %0, 32768 95 ret i64 %or 96} 97 98define i32 @my_setbit4(i32 %x) nounwind { 99entry: 100; CHECK: r{{[0-9]+}}{{ *}}={{ *}}setbit(r{{[0-9]+}}, #31) 101 %x.addr = alloca i32, align 4 102 store i32 %x, i32* %x.addr, align 4 103 %0 = load i32, i32* %x.addr, align 4 104 %or = or i32 %0, -2147483648 105 ret i32 %or 106} 107 108define i64 @my_setbit5(i64 %x) nounwind { 109entry: 110; CHECK: r{{[0-9]+}}{{ *}}={{ *}}setbit(r{{[0-9]+}}, #13) 111 %x.addr = alloca i64, align 8 112 store i64 %x, i64* %x.addr, align 8 113 %0 = load i64, i64* %x.addr, align 8 114 %or = or i64 %0, 35184372088832 115 ret i64 %or 116} 117 118define zeroext i16 @my_togglebit(i16 zeroext %crc) nounwind { 119entry: 120; CHECK: r{{[0-9]+}} = togglebit(r{{[0-9]+}}, #15) 121 %crc.addr = alloca i16, align 2 122 store i16 %crc, i16* %crc.addr, align 2 123 %0 = load i16, i16* %crc.addr, align 2 124 %conv = zext i16 %0 to i32 125 %xor = xor i32 %conv, 32768 126 %conv1 = trunc i32 %xor to i16 127 store i16 %conv1, i16* %crc.addr, align 2 128 %1 = load i16, i16* %crc.addr, align 2 129 ret i16 %1 130} 131 132define i32 @my_togglebit2(i32 %x) nounwind { 133entry: 134; CHECK: r{{[0-9]+}} = togglebit(r{{[0-9]+}}, #15) 135 %x.addr = alloca i32, align 4 136 store i32 %x, i32* %x.addr, align 4 137 %0 = load i32, i32* %x.addr, align 4 138 %xor = xor i32 %0, 32768 139 ret i32 %xor 140} 141 142define i64 @my_togglebit3(i64 %x) nounwind { 143entry: 144; CHECK: r{{[0-9]+}} = togglebit(r{{[0-9]+}}, #15) 145 %x.addr = alloca i64, align 8 146 store i64 %x, i64* %x.addr, align 8 147 %0 = load i64, i64* %x.addr, align 8 148 %xor = xor i64 %0, 32768 149 ret i64 %xor 150} 151 152define i64 @my_togglebit4(i64 %x) nounwind { 153entry: 154; CHECK: r{{[0-9]+}} = togglebit(r{{[0-9]+}}, #20) 155 %x.addr = alloca i64, align 8 156 store i64 %x, i64* %x.addr, align 8 157 %0 = load i64, i64* %x.addr, align 8 158 %xor = xor i64 %0, 4503599627370496 159 ret i64 %xor 160} 161