Implement rdar://7860110 (also in target/readme.txt) narrowing
[oota-llvm.git] / test / CodeGen / X86 / store-narrow.ll
1 ; rdar://7860110
2 ; RUN: llc < %s | FileCheck %s
3 target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"
4 target triple = "x86_64-apple-darwin10.2"
5
6 define void @test1(i32* nocapture %a0, i8 zeroext %a1) nounwind ssp {
7 entry:
8   %A = load i32* %a0, align 4
9   %B = and i32 %A, -256     ; 0xFFFFFF00
10   %C = zext i8 %a1 to i32
11   %D = or i32 %C, %B
12   store i32 %D, i32* %a0, align 4
13   ret void
14   
15 ; CHECK: test1:
16 ; CHECK: movb   %sil, (%rdi)
17 }
18
19 define void @test2(i32* nocapture %a0, i8 zeroext %a1) nounwind ssp {
20 entry:
21   %A = load i32* %a0, align 4
22   %B = and i32 %A, -65281    ; 0xFFFF00FF
23   %C = zext i8 %a1 to i32
24   %CS = shl i32 %C, 8
25   %D = or i32 %B, %CS
26   store i32 %D, i32* %a0, align 4
27   ret void
28 ; CHECK: test2:
29 ; CHECK: movb   %sil, 1(%rdi)
30 }
31
32 define void @test3(i32* nocapture %a0, i16 zeroext %a1) nounwind ssp {
33 entry:
34   %A = load i32* %a0, align 4
35   %B = and i32 %A, -65536    ; 0xFFFF0000
36   %C = zext i16 %a1 to i32
37   %D = or i32 %B, %C
38   store i32 %D, i32* %a0, align 4
39   ret void
40 ; CHECK: test3:
41 ; CHECK: movw   %si, (%rdi)
42 }
43
44 define void @test4(i32* nocapture %a0, i16 zeroext %a1) nounwind ssp {
45 entry:
46   %A = load i32* %a0, align 4
47   %B = and i32 %A, 65535    ; 0x0000FFFF
48   %C = zext i16 %a1 to i32
49   %CS = shl i32 %C, 16
50   %D = or i32 %B, %CS
51   store i32 %D, i32* %a0, align 4
52   ret void
53 ; CHECK: test4:
54 ; CHECK: movw   %si, 2(%rdi)
55 }
56
57 define void @test5(i64* nocapture %a0, i16 zeroext %a1) nounwind ssp {
58 entry:
59   %A = load i64* %a0, align 4
60   %B = and i64 %A, -4294901761    ; 0xFFFFFFFF0000FFFF
61   %C = zext i16 %a1 to i64
62   %CS = shl i64 %C, 16
63   %D = or i64 %B, %CS
64   store i64 %D, i64* %a0, align 4
65   ret void
66 ; CHECK: test5:
67 ; CHECK: movw   %si, 2(%rdi)
68 }
69
70 define void @test6(i64* nocapture %a0, i8 zeroext %a1) nounwind ssp {
71 entry:
72   %A = load i64* %a0, align 4
73   %B = and i64 %A, -280375465082881    ; 0xFFFF00FFFFFFFFFF
74   %C = zext i8 %a1 to i64
75   %CS = shl i64 %C, 40
76   %D = or i64 %B, %CS
77   store i64 %D, i64* %a0, align 4
78   ret void
79 ; CHECK: test6:
80 ; CHECK: movb   %sil, 5(%rdi)
81 }