@@ -2151,30 +2151,27 @@ define i32 @bextr32_c0(i32 %val, i32 %numskipbits, i32 %numlowbits) nounwind {
2151
2151
;
2152
2152
; V7A-LABEL: bextr32_c0:
2153
2153
; V7A: @ %bb.0:
2154
- ; V7A-NEXT: rsb r2, r2, #32
2155
- ; V7A-NEXT: mvn r3, #0
2156
- ; V7A-NEXT: lsr r2, r3, r2
2157
- ; V7A-NEXT: and r0, r2, r0, lsr r1
2154
+ ; V7A-NEXT: lsr r0, r0, r1
2155
+ ; V7A-NEXT: rsb r1, r2, #32
2156
+ ; V7A-NEXT: lsl r0, r0, r1
2157
+ ; V7A-NEXT: lsr r0, r0, r1
2158
2158
; V7A-NEXT: bx lr
2159
2159
;
2160
2160
; V7A-T-LABEL: bextr32_c0:
2161
2161
; V7A-T: @ %bb.0:
2162
2162
; V7A-T-NEXT: lsrs r0, r1
2163
2163
; V7A-T-NEXT: rsb.w r1, r2, #32
2164
- ; V7A-T-NEXT: mov.w r2, #-1
2165
- ; V7A-T-NEXT: lsr.w r1, r2, r1
2166
- ; V7A-T-NEXT: ands r0, r1
2164
+ ; V7A-T-NEXT: lsls r0, r1
2165
+ ; V7A-T-NEXT: lsrs r0, r1
2167
2166
; V7A-T-NEXT: bx lr
2168
2167
;
2169
2168
; V6M-LABEL: bextr32_c0:
2170
2169
; V6M: @ %bb.0:
2170
+ ; V6M-NEXT: movs r3, #32
2171
+ ; V6M-NEXT: subs r2, r3, r2
2171
2172
; V6M-NEXT: lsrs r0, r1
2172
- ; V6M-NEXT: movs r1, #32
2173
- ; V6M-NEXT: subs r1, r1, r2
2174
- ; V6M-NEXT: movs r2, #0
2175
- ; V6M-NEXT: mvns r2, r2
2176
- ; V6M-NEXT: lsrs r2, r1
2177
- ; V6M-NEXT: ands r0, r2
2173
+ ; V6M-NEXT: lsls r0, r2
2174
+ ; V6M-NEXT: lsrs r0, r2
2178
2175
; V6M-NEXT: bx lr
2179
2176
%shifted = lshr i32 %val , %numskipbits
2180
2177
%numhighbits = sub i32 32 , %numlowbits
@@ -2196,23 +2193,22 @@ define i32 @bextr32_c1_indexzext(i32 %val, i8 %numskipbits, i8 %numlowbits) noun
2196
2193
;
2197
2194
; V7A-LABEL: bextr32_c1_indexzext:
2198
2195
; V7A: @ %bb.0:
2199
- ; V7A-NEXT: rsb r2, r2, #32
2200
- ; V7A-NEXT: mvn r3, #0
2201
2196
; V7A-NEXT: uxtb r1, r1
2202
- ; V7A-NEXT: uxtb r2, r2
2203
- ; V7A-NEXT: lsr r2, r3, r2
2204
- ; V7A-NEXT: and r0, r2, r0, lsr r1
2197
+ ; V7A-NEXT: lsr r0, r0, r1
2198
+ ; V7A-NEXT: rsb r1, r2, #32
2199
+ ; V7A-NEXT: uxtb r1, r1
2200
+ ; V7A-NEXT: lsl r0, r0, r1
2201
+ ; V7A-NEXT: lsr r0, r0, r1
2205
2202
; V7A-NEXT: bx lr
2206
2203
;
2207
2204
; V7A-T-LABEL: bextr32_c1_indexzext:
2208
2205
; V7A-T: @ %bb.0:
2209
2206
; V7A-T-NEXT: uxtb r1, r1
2210
2207
; V7A-T-NEXT: lsrs r0, r1
2211
2208
; V7A-T-NEXT: rsb.w r1, r2, #32
2212
- ; V7A-T-NEXT: mov.w r2, #-1
2213
2209
; V7A-T-NEXT: uxtb r1, r1
2214
- ; V7A-T-NEXT: lsr.w r1, r2 , r1
2215
- ; V7A-T-NEXT: ands r0, r1
2210
+ ; V7A-T-NEXT: lsls r0 , r1
2211
+ ; V7A-T-NEXT: lsrs r0, r1
2216
2212
; V7A-T-NEXT: bx lr
2217
2213
;
2218
2214
; V6M-LABEL: bextr32_c1_indexzext:
@@ -2222,10 +2218,8 @@ define i32 @bextr32_c1_indexzext(i32 %val, i8 %numskipbits, i8 %numlowbits) noun
2222
2218
; V6M-NEXT: movs r1, #32
2223
2219
; V6M-NEXT: subs r1, r1, r2
2224
2220
; V6M-NEXT: uxtb r1, r1
2225
- ; V6M-NEXT: movs r2, #0
2226
- ; V6M-NEXT: mvns r2, r2
2227
- ; V6M-NEXT: lsrs r2, r1
2228
- ; V6M-NEXT: ands r0, r2
2221
+ ; V6M-NEXT: lsls r0, r1
2222
+ ; V6M-NEXT: lsrs r0, r1
2229
2223
; V6M-NEXT: bx lr
2230
2224
%skip = zext i8 %numskipbits to i32
2231
2225
%shifted = lshr i32 %val , %skip
@@ -2249,32 +2243,29 @@ define i32 @bextr32_c2_load(ptr %w, i32 %numskipbits, i32 %numlowbits) nounwind
2249
2243
; V7A-LABEL: bextr32_c2_load:
2250
2244
; V7A: @ %bb.0:
2251
2245
; V7A-NEXT: ldr r0, [r0]
2252
- ; V7A-NEXT: rsb r2, r2, #32
2253
- ; V7A-NEXT: mvn r3, #0
2254
- ; V7A-NEXT: lsr r2, r3, r2
2255
- ; V7A-NEXT: and r0, r2, r0, lsr r1
2246
+ ; V7A-NEXT: lsr r0, r0, r1
2247
+ ; V7A-NEXT: rsb r1, r2, #32
2248
+ ; V7A-NEXT: lsl r0, r0, r1
2249
+ ; V7A-NEXT: lsr r0, r0, r1
2256
2250
; V7A-NEXT: bx lr
2257
2251
;
2258
2252
; V7A-T-LABEL: bextr32_c2_load:
2259
2253
; V7A-T: @ %bb.0:
2260
2254
; V7A-T-NEXT: ldr r0, [r0]
2261
- ; V7A-T-NEXT: rsb.w r2, r2, #32
2262
- ; V7A-T-NEXT: mov.w r3, #-1
2263
- ; V7A-T-NEXT: lsr.w r2, r3, r2
2264
2255
; V7A-T-NEXT: lsrs r0, r1
2265
- ; V7A-T-NEXT: ands r0, r2
2256
+ ; V7A-T-NEXT: rsb.w r1, r2, #32
2257
+ ; V7A-T-NEXT: lsls r0, r1
2258
+ ; V7A-T-NEXT: lsrs r0, r1
2266
2259
; V7A-T-NEXT: bx lr
2267
2260
;
2268
2261
; V6M-LABEL: bextr32_c2_load:
2269
2262
; V6M: @ %bb.0:
2270
- ; V6M-NEXT: ldr r3, [r0]
2271
- ; V6M-NEXT: lsrs r3, r1
2272
- ; V6M-NEXT: movs r0, #32
2273
- ; V6M-NEXT: subs r1, r0, r2
2274
- ; V6M-NEXT: movs r0, #0
2275
- ; V6M-NEXT: mvns r0, r0
2263
+ ; V6M-NEXT: movs r3, #32
2264
+ ; V6M-NEXT: subs r2, r3, r2
2265
+ ; V6M-NEXT: ldr r0, [r0]
2276
2266
; V6M-NEXT: lsrs r0, r1
2277
- ; V6M-NEXT: ands r0, r3
2267
+ ; V6M-NEXT: lsls r0, r2
2268
+ ; V6M-NEXT: lsrs r0, r2
2278
2269
; V6M-NEXT: bx lr
2279
2270
%val = load i32 , ptr %w
2280
2271
%shifted = lshr i32 %val , %numskipbits
@@ -2298,13 +2289,13 @@ define i32 @bextr32_c3_load_indexzext(ptr %w, i8 %numskipbits, i8 %numlowbits) n
2298
2289
;
2299
2290
; V7A-LABEL: bextr32_c3_load_indexzext:
2300
2291
; V7A: @ %bb.0:
2301
- ; V7A-NEXT: rsb r2, r2, #32
2302
2292
; V7A-NEXT: ldr r0, [r0]
2303
- ; V7A-NEXT: mvn r3, #0
2304
2293
; V7A-NEXT: uxtb r1, r1
2305
- ; V7A-NEXT: uxtb r2, r2
2306
- ; V7A-NEXT: lsr r2, r3, r2
2307
- ; V7A-NEXT: and r0, r2, r0, lsr r1
2294
+ ; V7A-NEXT: lsr r0, r0, r1
2295
+ ; V7A-NEXT: rsb r1, r2, #32
2296
+ ; V7A-NEXT: uxtb r1, r1
2297
+ ; V7A-NEXT: lsl r0, r0, r1
2298
+ ; V7A-NEXT: lsr r0, r0, r1
2308
2299
; V7A-NEXT: bx lr
2309
2300
;
2310
2301
; V7A-T-LABEL: bextr32_c3_load_indexzext:
@@ -2313,24 +2304,21 @@ define i32 @bextr32_c3_load_indexzext(ptr %w, i8 %numskipbits, i8 %numlowbits) n
2313
2304
; V7A-T-NEXT: uxtb r1, r1
2314
2305
; V7A-T-NEXT: lsrs r0, r1
2315
2306
; V7A-T-NEXT: rsb.w r1, r2, #32
2316
- ; V7A-T-NEXT: mov.w r2, #-1
2317
2307
; V7A-T-NEXT: uxtb r1, r1
2318
- ; V7A-T-NEXT: lsr.w r1, r2 , r1
2319
- ; V7A-T-NEXT: ands r0, r1
2308
+ ; V7A-T-NEXT: lsls r0 , r1
2309
+ ; V7A-T-NEXT: lsrs r0, r1
2320
2310
; V7A-T-NEXT: bx lr
2321
2311
;
2322
2312
; V6M-LABEL: bextr32_c3_load_indexzext:
2323
2313
; V6M: @ %bb.0:
2324
2314
; V6M-NEXT: uxtb r1, r1
2325
- ; V6M-NEXT: ldr r3, [r0]
2326
- ; V6M-NEXT: lsrs r3, r1
2327
- ; V6M-NEXT: movs r0, #32
2328
- ; V6M-NEXT: subs r0, r0, r2
2329
- ; V6M-NEXT: uxtb r1, r0
2330
- ; V6M-NEXT: movs r0, #0
2331
- ; V6M-NEXT: mvns r0, r0
2315
+ ; V6M-NEXT: ldr r0, [r0]
2316
+ ; V6M-NEXT: lsrs r0, r1
2317
+ ; V6M-NEXT: movs r1, #32
2318
+ ; V6M-NEXT: subs r1, r1, r2
2319
+ ; V6M-NEXT: uxtb r1, r1
2320
+ ; V6M-NEXT: lsls r0, r1
2332
2321
; V6M-NEXT: lsrs r0, r1
2333
- ; V6M-NEXT: ands r0, r3
2334
2322
; V6M-NEXT: bx lr
2335
2323
%val = load i32 , ptr %w
2336
2324
%skip = zext i8 %numskipbits to i32
@@ -2355,28 +2343,25 @@ define i32 @bextr32_c4_commutative(i32 %val, i32 %numskipbits, i32 %numlowbits)
2355
2343
; V7A: @ %bb.0:
2356
2344
; V7A-NEXT: lsr r0, r0, r1
2357
2345
; V7A-NEXT: rsb r1, r2, #32
2358
- ; V7A-NEXT: mvn r2, #0
2359
- ; V7A-NEXT: and r0, r0, r2, lsr r1
2346
+ ; V7A-NEXT: lsl r0, r0, r1
2347
+ ; V7A-NEXT: lsr r0, r0, r1
2360
2348
; V7A-NEXT: bx lr
2361
2349
;
2362
2350
; V7A-T-LABEL: bextr32_c4_commutative:
2363
2351
; V7A-T: @ %bb.0:
2364
2352
; V7A-T-NEXT: lsrs r0, r1
2365
2353
; V7A-T-NEXT: rsb.w r1, r2, #32
2366
- ; V7A-T-NEXT: mov.w r2, #-1
2367
- ; V7A-T-NEXT: lsr.w r1, r2, r1
2368
- ; V7A-T-NEXT: ands r0, r1
2354
+ ; V7A-T-NEXT: lsls r0, r1
2355
+ ; V7A-T-NEXT: lsrs r0, r1
2369
2356
; V7A-T-NEXT: bx lr
2370
2357
;
2371
2358
; V6M-LABEL: bextr32_c4_commutative:
2372
2359
; V6M: @ %bb.0:
2360
+ ; V6M-NEXT: movs r3, #32
2361
+ ; V6M-NEXT: subs r2, r3, r2
2373
2362
; V6M-NEXT: lsrs r0, r1
2374
- ; V6M-NEXT: movs r1, #32
2375
- ; V6M-NEXT: subs r1, r1, r2
2376
- ; V6M-NEXT: movs r2, #0
2377
- ; V6M-NEXT: mvns r2, r2
2378
- ; V6M-NEXT: lsrs r2, r1
2379
- ; V6M-NEXT: ands r0, r2
2363
+ ; V6M-NEXT: lsls r0, r2
2364
+ ; V6M-NEXT: lsrs r0, r2
2380
2365
; V6M-NEXT: bx lr
2381
2366
%shifted = lshr i32 %val , %numskipbits
2382
2367
%numhighbits = sub i32 32 , %numlowbits
@@ -3032,8 +3017,8 @@ define i32 @bextr64_32_c1(i64 %val, i64 %numskipbits, i32 %numlowbits) nounwind
3032
3017
; V7A-NEXT: orr r0, r0, r1, lsl r3
3033
3018
; V7A-NEXT: lsrpl r0, r1, r2
3034
3019
; V7A-NEXT: rsb r1, r12, #32
3035
- ; V7A-NEXT: mvn r2, #0
3036
- ; V7A-NEXT: and r0, r0, r2, lsr r1
3020
+ ; V7A-NEXT: lsl r0, r0, r1
3021
+ ; V7A-NEXT: lsr r0, r0, r1
3037
3022
; V7A-NEXT: bx lr
3038
3023
;
3039
3024
; V7A-T-LABEL: bextr64_32_c1:
@@ -3047,9 +3032,8 @@ define i32 @bextr64_32_c1(i64 %val, i64 %numskipbits, i32 %numlowbits) nounwind
3047
3032
; V7A-T-NEXT: it pl
3048
3033
; V7A-T-NEXT: lsrpl.w r0, r1, r2
3049
3034
; V7A-T-NEXT: rsb.w r1, r12, #32
3050
- ; V7A-T-NEXT: mov.w r2, #-1
3051
- ; V7A-T-NEXT: lsr.w r1, r2, r1
3052
- ; V7A-T-NEXT: ands r0, r1
3035
+ ; V7A-T-NEXT: lsls r0, r1
3036
+ ; V7A-T-NEXT: lsrs r0, r1
3053
3037
; V7A-T-NEXT: bx lr
3054
3038
;
3055
3039
; V6M-LABEL: bextr64_32_c1:
@@ -3060,10 +3044,8 @@ define i32 @bextr64_32_c1(i64 %val, i64 %numskipbits, i32 %numlowbits) nounwind
3060
3044
; V6M-NEXT: ldr r1, [sp, #8]
3061
3045
; V6M-NEXT: movs r2, #32
3062
3046
; V6M-NEXT: subs r1, r2, r1
3063
- ; V6M-NEXT: movs r2, #0
3064
- ; V6M-NEXT: mvns r2, r2
3065
- ; V6M-NEXT: lsrs r2, r1
3066
- ; V6M-NEXT: ands r0, r2
3047
+ ; V6M-NEXT: lsls r0, r1
3048
+ ; V6M-NEXT: lsrs r0, r1
3067
3049
; V6M-NEXT: pop {r7, pc}
3068
3050
%shifted = lshr i64 %val , %numskipbits
3069
3051
%truncshifted = trunc i64 %shifted to i32
@@ -3100,8 +3082,8 @@ define i32 @bextr64_32_c2(i64 %val, i64 %numskipbits, i32 %numlowbits) nounwind
3100
3082
; V7A-NEXT: orr r0, r0, r1, lsl r3
3101
3083
; V7A-NEXT: lsrpl r0, r1, r2
3102
3084
; V7A-NEXT: rsb r1, r12, #32
3103
- ; V7A-NEXT: mvn r2, #0
3104
- ; V7A-NEXT: and r0, r0, r2, lsr r1
3085
+ ; V7A-NEXT: lsl r0, r0, r1
3086
+ ; V7A-NEXT: lsr r0, r0, r1
3105
3087
; V7A-NEXT: bx lr
3106
3088
;
3107
3089
; V7A-T-LABEL: bextr64_32_c2:
@@ -3115,9 +3097,8 @@ define i32 @bextr64_32_c2(i64 %val, i64 %numskipbits, i32 %numlowbits) nounwind
3115
3097
; V7A-T-NEXT: it pl
3116
3098
; V7A-T-NEXT: lsrpl.w r0, r1, r2
3117
3099
; V7A-T-NEXT: rsb.w r1, r12, #32
3118
- ; V7A-T-NEXT: mov.w r2, #-1
3119
- ; V7A-T-NEXT: lsr.w r1, r2, r1
3120
- ; V7A-T-NEXT: ands r0, r1
3100
+ ; V7A-T-NEXT: lsls r0, r1
3101
+ ; V7A-T-NEXT: lsrs r0, r1
3121
3102
; V7A-T-NEXT: bx lr
3122
3103
;
3123
3104
; V6M-LABEL: bextr64_32_c2:
@@ -3128,10 +3109,8 @@ define i32 @bextr64_32_c2(i64 %val, i64 %numskipbits, i32 %numlowbits) nounwind
3128
3109
; V6M-NEXT: ldr r1, [sp, #8]
3129
3110
; V6M-NEXT: movs r2, #32
3130
3111
; V6M-NEXT: subs r1, r2, r1
3131
- ; V6M-NEXT: movs r2, #0
3132
- ; V6M-NEXT: mvns r2, r2
3133
- ; V6M-NEXT: lsrs r2, r1
3134
- ; V6M-NEXT: ands r0, r2
3112
+ ; V6M-NEXT: lsls r0, r1
3113
+ ; V6M-NEXT: lsrs r0, r1
3135
3114
; V6M-NEXT: pop {r7, pc}
3136
3115
%shifted = lshr i64 %val , %numskipbits
3137
3116
%numhighbits = sub i32 32 , %numlowbits
@@ -4610,5 +4589,3 @@ define void @c7_i64(i64 %arg, ptr %ptr) nounwind {
4610
4589
store i64 %tmp2 , ptr %ptr
4611
4590
ret void
4612
4591
}
4613
- ;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
4614
- ; V7M: {{.*}}
0 commit comments