blob: 85f09fd54da9bddde5d46a9b7d00599c7a53ecfd [file] [log] [blame]
Jim Stichnothf79d2cb2015-03-23 15:10:54 -07001; This test checks that when SSE instructions access memory and require full
2; alignment, memory operands are limited to properly aligned stack operands.
3; This would only happen when we fuse a load instruction with another
4; instruction, which currently only happens with non-scalarized Arithmetic
5; instructions.
6
7; RUN: %p2i -i %s --filetype=obj --disassemble --args -O2 | FileCheck %s
8; RUN: %p2i -i %s --filetype=obj --disassemble --args -Om1 | FileCheck %s
9
10define <4 x i32> @test_add(i32 %addr_i, <4 x i32> %addend) {
11entry:
12 %addr = inttoptr i32 %addr_i to <4 x i32>*
Jim Stichnothe5b58fb2015-06-01 15:17:20 -070013 %loaded = load <4 x i32>, <4 x i32>* %addr, align 4
Jim Stichnothf79d2cb2015-03-23 15:10:54 -070014 %result = add <4 x i32> %addend, %loaded
15 ret <4 x i32> %result
16}
17; CHECK-LABEL: test_add
18; CHECK-NOT: paddd xmm{{.}},XMMWORD PTR [e{{ax|cx|dx|di|si|bx|bp}}
19; CHECK: paddd xmm{{.}},
20
21define <4 x i32> @test_and(i32 %addr_i, <4 x i32> %addend) {
22entry:
23 %addr = inttoptr i32 %addr_i to <4 x i32>*
Jim Stichnothe5b58fb2015-06-01 15:17:20 -070024 %loaded = load <4 x i32>, <4 x i32>* %addr, align 4
Jim Stichnothf79d2cb2015-03-23 15:10:54 -070025 %result = and <4 x i32> %addend, %loaded
26 ret <4 x i32> %result
27}
28; CHECK-LABEL: test_and
29; CHECK-NOT: pand xmm{{.}},XMMWORD PTR [e{{ax|cx|dx|di|si|bx|bp}}
30; CHECK: pand xmm{{.}},
31
32define <4 x i32> @test_or(i32 %addr_i, <4 x i32> %addend) {
33entry:
34 %addr = inttoptr i32 %addr_i to <4 x i32>*
Jim Stichnothe5b58fb2015-06-01 15:17:20 -070035 %loaded = load <4 x i32>, <4 x i32>* %addr, align 4
Jim Stichnothf79d2cb2015-03-23 15:10:54 -070036 %result = or <4 x i32> %addend, %loaded
37 ret <4 x i32> %result
38}
39; CHECK-LABEL: test_or
40; CHECK-NOT: por xmm{{.}},XMMWORD PTR [e{{ax|cx|dx|di|si|bx|bp}}
41; CHECK: por xmm{{.}},
42
43define <4 x i32> @test_xor(i32 %addr_i, <4 x i32> %addend) {
44entry:
45 %addr = inttoptr i32 %addr_i to <4 x i32>*
Jim Stichnothe5b58fb2015-06-01 15:17:20 -070046 %loaded = load <4 x i32>, <4 x i32>* %addr, align 4
Jim Stichnothf79d2cb2015-03-23 15:10:54 -070047 %result = xor <4 x i32> %addend, %loaded
48 ret <4 x i32> %result
49}
50; CHECK-LABEL: test_xor
51; CHECK-NOT: pxor xmm{{.}},XMMWORD PTR [e{{ax|cx|dx|di|si|bx|bp}}
52; CHECK: pxor xmm{{.}},
53
54define <4 x i32> @test_sub(i32 %addr_i, <4 x i32> %addend) {
55entry:
56 %addr = inttoptr i32 %addr_i to <4 x i32>*
Jim Stichnothe5b58fb2015-06-01 15:17:20 -070057 %loaded = load <4 x i32>, <4 x i32>* %addr, align 4
Jim Stichnothf79d2cb2015-03-23 15:10:54 -070058 %result = sub <4 x i32> %addend, %loaded
59 ret <4 x i32> %result
60}
61; CHECK-LABEL: test_sub
62; CHECK-NOT: psubd xmm{{.}},XMMWORD PTR [e{{ax|cx|dx|di|si|bx|bp}}
63; CHECK: psubd xmm{{.}},
64
65define <4 x float> @test_fadd(i32 %addr_i, <4 x float> %addend) {
66entry:
67 %addr = inttoptr i32 %addr_i to <4 x float>*
Jim Stichnothe5b58fb2015-06-01 15:17:20 -070068 %loaded = load <4 x float>, <4 x float>* %addr, align 4
Jim Stichnothf79d2cb2015-03-23 15:10:54 -070069 %result = fadd <4 x float> %addend, %loaded
70 ret <4 x float> %result
71}
72; CHECK-LABEL: test_fadd
73; CHECK-NOT: addps xmm{{.}},XMMWORD PTR [e{{ax|cx|dx|di|si|bx|bp}}
74; CHECK: addps xmm{{.}},
75
76define <4 x float> @test_fsub(i32 %addr_i, <4 x float> %addend) {
77entry:
78 %addr = inttoptr i32 %addr_i to <4 x float>*
Jim Stichnothe5b58fb2015-06-01 15:17:20 -070079 %loaded = load <4 x float>, <4 x float>* %addr, align 4
Jim Stichnothf79d2cb2015-03-23 15:10:54 -070080 %result = fsub <4 x float> %addend, %loaded
81 ret <4 x float> %result
82}
83; CHECK-LABEL: test_fsub
84; CHECK-NOT: subps xmm{{.}},XMMWORD PTR [e{{ax|cx|dx|di|si|bx|bp}}
85; CHECK: subps xmm{{.}},