blob: a7540aafa9b4a16dd0f5f23b28840ee2099c09c0 [file] [log] [blame]
Nate Begemand88fc032006-01-14 03:14:10 +00001; bswap should be constant folded when it is passed a constant argument
2
Evan Cheng9568e5c2011-06-21 06:01:08 +00003; RUN: llc < %s -march=x86 | FileCheck %s
Nate Begemand88fc032006-01-14 03:14:10 +00004
Tanya Lattner33eefff2008-02-21 07:42:26 +00005declare i16 @llvm.bswap.i16(i16)
Nate Begemand88fc032006-01-14 03:14:10 +00006
Tanya Lattner33eefff2008-02-21 07:42:26 +00007declare i32 @llvm.bswap.i32(i32)
8
9declare i64 @llvm.bswap.i64(i64)
10
11define i16 @W(i16 %A) {
Evan Cheng9568e5c2011-06-21 06:01:08 +000012; CHECK: W:
13; CHECK: rolw $8, %ax
Tanya Lattner33eefff2008-02-21 07:42:26 +000014 %Z = call i16 @llvm.bswap.i16( i16 %A ) ; <i16> [#uses=1]
15 ret i16 %Z
Nate Begemand88fc032006-01-14 03:14:10 +000016}
17
Tanya Lattner33eefff2008-02-21 07:42:26 +000018define i32 @X(i32 %A) {
Evan Cheng9568e5c2011-06-21 06:01:08 +000019; CHECK: X:
20; CHECK: bswapl %eax
Tanya Lattner33eefff2008-02-21 07:42:26 +000021 %Z = call i32 @llvm.bswap.i32( i32 %A ) ; <i32> [#uses=1]
22 ret i32 %Z
Nate Begemand88fc032006-01-14 03:14:10 +000023}
24
Tanya Lattner33eefff2008-02-21 07:42:26 +000025define i64 @Y(i64 %A) {
Evan Cheng9568e5c2011-06-21 06:01:08 +000026; CHECK: Y:
27; CHECK: bswapl %eax
28; CHECK: bswapl %edx
Tanya Lattner33eefff2008-02-21 07:42:26 +000029 %Z = call i64 @llvm.bswap.i64( i64 %A ) ; <i64> [#uses=1]
30 ret i64 %Z
Nate Begemand88fc032006-01-14 03:14:10 +000031}
Tanya Lattner33eefff2008-02-21 07:42:26 +000032
Evan Cheng9568e5c2011-06-21 06:01:08 +000033; rdar://9164521
34define i32 @test1(i32 %a) nounwind readnone {
35entry:
36; CHECK: test1
37; CHECK: bswapl %eax
38; CHECK: shrl $16, %eax
39 %and = lshr i32 %a, 8
40 %shr3 = and i32 %and, 255
41 %and2 = shl i32 %a, 8
42 %shl = and i32 %and2, 65280
43 %or = or i32 %shr3, %shl
44 ret i32 %or
45}
46
47define i32 @test2(i32 %a) nounwind readnone {
48entry:
49; CHECK: test2
50; CHECK: bswapl %eax
51; CHECK: sarl $16, %eax
52 %and = lshr i32 %a, 8
53 %shr4 = and i32 %and, 255
54 %and2 = shl i32 %a, 8
55 %or = or i32 %shr4, %and2
56 %sext = shl i32 %or, 16
57 %conv3 = ashr exact i32 %sext, 16
58 ret i32 %conv3
59}