1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc < %s -mtriple=i686-unknown | FileCheck %s 3 4; These tests just check that the plumbing is in place for @llvm.bitreverse. The 5; actual output is massive at the moment as llvm.bitreverse is not yet legal. 6 7declare <2 x i16> @llvm.bitreverse.v2i16(<2 x i16>) readnone 8 9define <2 x i16> @test_bitreverse_v2i16(<2 x i16> %a) nounwind { 10; CHECK-LABEL: test_bitreverse_v2i16: 11; CHECK: # BB#0: 12; CHECK-NEXT: movw {{[0-9]+}}(%esp), %cx 13; CHECK-NEXT: movw {{[0-9]+}}(%esp), %ax 14; CHECK-NEXT: rolw $8, %ax 15; CHECK-NEXT: movl %eax, %edx 16; CHECK-NEXT: andl $3855, %edx # imm = 0xF0F 17; CHECK-NEXT: shll $4, %edx 18; CHECK-NEXT: andl $61680, %eax # imm = 0xF0F0 19; CHECK-NEXT: shrl $4, %eax 20; CHECK-NEXT: orl %edx, %eax 21; CHECK-NEXT: movl %eax, %edx 22; CHECK-NEXT: andl $13107, %edx # imm = 0x3333 23; CHECK-NEXT: andl $52428, %eax # imm = 0xCCCC 24; CHECK-NEXT: shrl $2, %eax 25; CHECK-NEXT: leal (%eax,%edx,4), %eax 26; CHECK-NEXT: movl %eax, %edx 27; CHECK-NEXT: andl $21845, %edx # imm = 0x5555 28; CHECK-NEXT: andl $43690, %eax # imm = 0xAAAA 29; CHECK-NEXT: shrl %eax 30; CHECK-NEXT: leal (%eax,%edx,2), %eax 31; CHECK-NEXT: rolw $8, %cx 32; CHECK-NEXT: movl %ecx, %edx 33; CHECK-NEXT: andl $3855, %edx # imm = 0xF0F 34; CHECK-NEXT: shll $4, %edx 35; CHECK-NEXT: andl $61680, %ecx # imm = 0xF0F0 36; CHECK-NEXT: shrl $4, %ecx 37; CHECK-NEXT: orl %edx, %ecx 38; CHECK-NEXT: movl %ecx, %edx 39; CHECK-NEXT: andl $13107, %edx # imm = 0x3333 40; CHECK-NEXT: andl $52428, %ecx # imm = 0xCCCC 41; CHECK-NEXT: shrl $2, %ecx 42; CHECK-NEXT: leal (%ecx,%edx,4), %ecx 43; CHECK-NEXT: movl %ecx, %edx 44; CHECK-NEXT: andl $21845, %edx # imm = 0x5555 45; CHECK-NEXT: andl $43690, %ecx # imm = 0xAAAA 46; CHECK-NEXT: shrl %ecx 47; CHECK-NEXT: leal (%ecx,%edx,2), %edx 48; CHECK-NEXT: # kill: %AX<def> %AX<kill> %EAX<kill> 49; CHECK-NEXT: # kill: %DX<def> %DX<kill> %EDX<kill> 50; CHECK-NEXT: retl 51 %b = call <2 x i16> @llvm.bitreverse.v2i16(<2 x i16> %a) 52 ret <2 x i16> %b 53} 54 55declare i24 @llvm.bitreverse.i24(i24) readnone 56 57define i24 @test_bitreverse_i24(i24 %a) nounwind { 58; CHECK-LABEL: test_bitreverse_i24: 59; CHECK: # BB#0: 60; CHECK-NEXT: movl {{[0-9]+}}(%esp), %eax 61; CHECK-NEXT: bswapl %eax 62; CHECK-NEXT: movl %eax, %ecx 63; CHECK-NEXT: andl $252645135, %ecx # imm = 0xF0F0F0F 64; CHECK-NEXT: shll $4, %ecx 65; CHECK-NEXT: andl $-252645136, %eax # imm = 0xF0F0F0F0 66; CHECK-NEXT: shrl $4, %eax 67; CHECK-NEXT: orl %ecx, %eax 68; CHECK-NEXT: movl %eax, %ecx 69; CHECK-NEXT: andl $858993459, %ecx # imm = 0x33333333 70; CHECK-NEXT: andl $-858993460, %eax # imm = 0xCCCCCCCC 71; CHECK-NEXT: shrl $2, %eax 72; CHECK-NEXT: leal (%eax,%ecx,4), %eax 73; CHECK-NEXT: movl %eax, %ecx 74; CHECK-NEXT: andl $1431655680, %ecx # imm = 0x55555500 75; CHECK-NEXT: andl $-1431655936, %eax # imm = 0xAAAAAA00 76; CHECK-NEXT: shrl %eax 77; CHECK-NEXT: leal (%eax,%ecx,2), %eax 78; CHECK-NEXT: shrl $8, %eax 79; CHECK-NEXT: retl 80 %b = call i24 @llvm.bitreverse.i24(i24 %a) 81 ret i24 %b 82} 83 84declare i8 @llvm.bitreverse.i8(i8) readnone 85 86define i8 @test_bitreverse_i8(i8 %a) { 87; CHECK-LABEL: test_bitreverse_i8: 88; CHECK: # BB#0: 89; CHECK-NEXT: movb {{[0-9]+}}(%esp), %al 90; CHECK-NEXT: rolb $4, %al 91; CHECK-NEXT: movl %eax, %ecx 92; CHECK-NEXT: andb $51, %cl 93; CHECK-NEXT: shlb $2, %cl 94; CHECK-NEXT: andb $-52, %al 95; CHECK-NEXT: shrb $2, %al 96; CHECK-NEXT: orb %cl, %al 97; CHECK-NEXT: movl %eax, %ecx 98; CHECK-NEXT: andb $85, %cl 99; CHECK-NEXT: addb %cl, %cl 100; CHECK-NEXT: andb $-86, %al 101; CHECK-NEXT: shrb %al 102; CHECK-NEXT: orb %cl, %al 103; CHECK-NEXT: retl 104 %b = call i8 @llvm.bitreverse.i8(i8 %a) 105 ret i8 %b 106} 107 108declare i4 @llvm.bitreverse.i4(i4) readnone 109 110define i4 @test_bitreverse_i4(i4 %a) { 111; CHECK-LABEL: test_bitreverse_i4: 112; CHECK: # BB#0: 113; CHECK-NEXT: movb {{[0-9]+}}(%esp), %al 114; CHECK-NEXT: rolb $4, %al 115; CHECK-NEXT: movl %eax, %ecx 116; CHECK-NEXT: andb $51, %cl 117; CHECK-NEXT: shlb $2, %cl 118; CHECK-NEXT: andb $-52, %al 119; CHECK-NEXT: shrb $2, %al 120; CHECK-NEXT: orb %cl, %al 121; CHECK-NEXT: movl %eax, %ecx 122; CHECK-NEXT: andb $80, %cl 123; CHECK-NEXT: addb %cl, %cl 124; CHECK-NEXT: andb $-96, %al 125; CHECK-NEXT: shrb %al 126; CHECK-NEXT: orb %cl, %al 127; CHECK-NEXT: shrb $4, %al 128; CHECK-NEXT: retl 129 %b = call i4 @llvm.bitreverse.i4(i4 %a) 130 ret i4 %b 131} 132 133; These tests check that bitreverse(constant) calls are folded 134 135define <2 x i16> @fold_v2i16() { 136; CHECK-LABEL: fold_v2i16: 137; CHECK: # BB#0: 138; CHECK-NEXT: movw $-4096, %ax # imm = 0xF000 139; CHECK-NEXT: movw $240, %dx 140; CHECK-NEXT: retl 141 %b = call <2 x i16> @llvm.bitreverse.v2i16(<2 x i16> <i16 15, i16 3840>) 142 ret <2 x i16> %b 143} 144 145define i24 @fold_i24() { 146; CHECK-LABEL: fold_i24: 147; CHECK: # BB#0: 148; CHECK-NEXT: movl $2048, %eax # imm = 0x800 149; CHECK-NEXT: retl 150 %b = call i24 @llvm.bitreverse.i24(i24 4096) 151 ret i24 %b 152} 153 154define i8 @fold_i8() { 155; CHECK-LABEL: fold_i8: 156; CHECK: # BB#0: 157; CHECK-NEXT: movb $-16, %al 158; CHECK-NEXT: retl 159 %b = call i8 @llvm.bitreverse.i8(i8 15) 160 ret i8 %b 161} 162 163define i4 @fold_i4() { 164; CHECK-LABEL: fold_i4: 165; CHECK: # BB#0: 166; CHECK-NEXT: movb $1, %al 167; CHECK-NEXT: retl 168 %b = call i4 @llvm.bitreverse.i4(i4 8) 169 ret i4 %b 170} 171 172; These tests check that bitreverse(bitreverse()) calls are removed 173 174define i8 @identity_i8(i8 %a) { 175; CHECK-LABEL: identity_i8: 176; CHECK: # BB#0: 177; CHECK-NEXT: movb {{[0-9]+}}(%esp), %al 178; CHECK-NEXT: retl 179 %b = call i8 @llvm.bitreverse.i8(i8 %a) 180 %c = call i8 @llvm.bitreverse.i8(i8 %b) 181 ret i8 %c 182} 183 184define <2 x i16> @identity_v2i16(<2 x i16> %a) { 185; CHECK-LABEL: identity_v2i16: 186; CHECK: # BB#0: 187; CHECK-NEXT: movzwl {{[0-9]+}}(%esp), %eax 188; CHECK-NEXT: movzwl {{[0-9]+}}(%esp), %edx 189; CHECK-NEXT: retl 190 %b = call <2 x i16> @llvm.bitreverse.v2i16(<2 x i16> %a) 191 %c = call <2 x i16> @llvm.bitreverse.v2i16(<2 x i16> %b) 192 ret <2 x i16> %c 193} 194 195; These tests check that bitreverse(undef) calls are removed 196 197define i8 @undef_i8() { 198; CHECK-LABEL: undef_i8: 199; CHECK: # BB#0: 200; CHECK-NEXT: retl 201 %b = call i8 @llvm.bitreverse.i8(i8 undef) 202 ret i8 %b 203} 204 205define <2 x i16> @undef_v2i16() { 206; CHECK-LABEL: undef_v2i16: 207; CHECK: # BB#0: 208; CHECK-NEXT: retl 209 %b = call <2 x i16> @llvm.bitreverse.v2i16(<2 x i16> undef) 210 ret <2 x i16> %b 211} 212