@@ -68,3 +68,81 @@ define <16 x i16> @zext_avgceilu_mismatch(<16 x i4> %a0, <16 x i8> %a1) {
68
68
%avg = sub <16 x i16 > %or , %shift
69
69
ret <16 x i16 > %avg
70
70
}
71
+
72
+ define <16 x i16 > @sext_avgfloors (<16 x i8 > %a0 , <16 x i8 > %a1 ) {
73
+ ; CHECK-LABEL: sext_avgfloors:
74
+ ; CHECK: // %bb.0:
75
+ ; CHECK-NEXT: shadd v0.16b, v0.16b, v1.16b
76
+ ; CHECK-NEXT: sshll2 v1.8h, v0.16b, #0
77
+ ; CHECK-NEXT: sshll v0.8h, v0.8b, #0
78
+ ; CHECK-NEXT: ret
79
+ %x0 = sext <16 x i8 > %a0 to <16 x i16 >
80
+ %x1 = sext <16 x i8 > %a1 to <16 x i16 >
81
+ %and = and <16 x i16 > %x0 , %x1
82
+ %xor = xor <16 x i16 > %x0 , %x1
83
+ %shift = ashr <16 x i16 > %xor , <i16 1 , i16 1 , i16 1 , i16 1 , i16 1 , i16 1 , i16 1 , i16 1 , i16 1 , i16 1 , i16 1 , i16 1 , i16 1 , i16 1 , i16 1 , i16 1 >
84
+ %avg = add <16 x i16 > %and , %shift
85
+ ret <16 x i16 > %avg
86
+ }
87
+
88
+ define <16 x i16 > @sext_avgfloors_mismatch (<16 x i8 > %a0 , <16 x i4 > %a1 ) {
89
+ ; CHECK-LABEL: sext_avgfloors_mismatch:
90
+ ; CHECK: // %bb.0:
91
+ ; CHECK-NEXT: ushll2 v2.8h, v1.16b, #0
92
+ ; CHECK-NEXT: ushll v1.8h, v1.8b, #0
93
+ ; CHECK-NEXT: sshll v3.8h, v0.8b, #0
94
+ ; CHECK-NEXT: sshll2 v0.8h, v0.16b, #0
95
+ ; CHECK-NEXT: shl v1.8h, v1.8h, #12
96
+ ; CHECK-NEXT: shl v2.8h, v2.8h, #12
97
+ ; CHECK-NEXT: sshr v4.8h, v1.8h, #12
98
+ ; CHECK-NEXT: sshr v1.8h, v2.8h, #12
99
+ ; CHECK-NEXT: shadd v1.8h, v0.8h, v1.8h
100
+ ; CHECK-NEXT: shadd v0.8h, v3.8h, v4.8h
101
+ ; CHECK-NEXT: ret
102
+ %x0 = sext <16 x i8 > %a0 to <16 x i16 >
103
+ %x1 = sext <16 x i4 > %a1 to <16 x i16 >
104
+ %and = and <16 x i16 > %x0 , %x1
105
+ %xor = xor <16 x i16 > %x0 , %x1
106
+ %shift = ashr <16 x i16 > %xor , <i16 1 , i16 1 , i16 1 , i16 1 , i16 1 , i16 1 , i16 1 , i16 1 , i16 1 , i16 1 , i16 1 , i16 1 , i16 1 , i16 1 , i16 1 , i16 1 >
107
+ %avg = add <16 x i16 > %and , %shift
108
+ ret <16 x i16 > %avg
109
+ }
110
+
111
+ define <16 x i16 > @sext_avgceils (<16 x i8 > %a0 , <16 x i8 > %a1 ) {
112
+ ; CHECK-LABEL: sext_avgceils:
113
+ ; CHECK: // %bb.0:
114
+ ; CHECK-NEXT: srhadd v0.16b, v0.16b, v1.16b
115
+ ; CHECK-NEXT: sshll2 v1.8h, v0.16b, #0
116
+ ; CHECK-NEXT: sshll v0.8h, v0.8b, #0
117
+ ; CHECK-NEXT: ret
118
+ %x0 = sext <16 x i8 > %a0 to <16 x i16 >
119
+ %x1 = sext <16 x i8 > %a1 to <16 x i16 >
120
+ %or = or <16 x i16 > %x0 , %x1
121
+ %xor = xor <16 x i16 > %x0 , %x1
122
+ %shift = ashr <16 x i16 > %xor , <i16 1 , i16 1 , i16 1 , i16 1 , i16 1 , i16 1 , i16 1 , i16 1 , i16 1 , i16 1 , i16 1 , i16 1 , i16 1 , i16 1 , i16 1 , i16 1 >
123
+ %avg = sub <16 x i16 > %or , %shift
124
+ ret <16 x i16 > %avg
125
+ }
126
+
127
+ define <16 x i16 > @sext_avgceils_mismatch (<16 x i4 > %a0 , <16 x i8 > %a1 ) {
128
+ ; CHECK-LABEL: sext_avgceils_mismatch:
129
+ ; CHECK: // %bb.0:
130
+ ; CHECK-NEXT: ushll v2.8h, v0.8b, #0
131
+ ; CHECK-NEXT: ushll2 v0.8h, v0.16b, #0
132
+ ; CHECK-NEXT: sshll v3.8h, v1.8b, #0
133
+ ; CHECK-NEXT: sshll2 v1.8h, v1.16b, #0
134
+ ; CHECK-NEXT: shl v2.8h, v2.8h, #12
135
+ ; CHECK-NEXT: shl v0.8h, v0.8h, #12
136
+ ; CHECK-NEXT: sshr v2.8h, v2.8h, #12
137
+ ; CHECK-NEXT: sshr v0.8h, v0.8h, #12
138
+ ; CHECK-NEXT: srhadd v1.8h, v0.8h, v1.8h
139
+ ; CHECK-NEXT: srhadd v0.8h, v2.8h, v3.8h
140
+ ; CHECK-NEXT: ret
141
+ %x0 = sext <16 x i4 > %a0 to <16 x i16 >
142
+ %x1 = sext <16 x i8 > %a1 to <16 x i16 >
143
+ %or = or <16 x i16 > %x0 , %x1
144
+ %xor = xor <16 x i16 > %x0 , %x1
145
+ %shift = ashr <16 x i16 > %xor , <i16 1 , i16 1 , i16 1 , i16 1 , i16 1 , i16 1 , i16 1 , i16 1 , i16 1 , i16 1 , i16 1 , i16 1 , i16 1 , i16 1 , i16 1 , i16 1 >
146
+ %avg = sub <16 x i16 > %or , %shift
147
+ ret <16 x i16 > %avg
148
+ }
0 commit comments