mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 03:02:36 +01:00
b1775ae908
If we are and the constant like 0xFFFFFFC00000, for now, we are using several instructions to generate this 48bit constant and final an "and". However, we could exploit it with two rotate instructions. MB ME MB+63-ME +----------------------+ +----------------------+ |0000001111111111111000| -> |0000000001111111111111| +----------------------+ +----------------------+ 0 63 0 63 Rotate left ME + 1 bit first, and then, mask it with (MB + 63 - ME, 63), finally, rotate back. Notice that, we need to round it with 64 bit for the wrapping case. Reviewed by: ChenZheng, Nemanjai Differential Revision: https://reviews.llvm.org/D71831
80 lines
1.8 KiB
LLVM
80 lines
1.8 KiB
LLVM
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
|
|
; RUN: llc -mtriple=powerpc64le-unknown-linux-gnu < %s | FileCheck %s
|
|
|
|
; mask 0xFFFFFFFE
|
|
define i32 @test1(i32 %a) {
|
|
; CHECK-LABEL: test1:
|
|
; CHECK: # %bb.0:
|
|
; CHECK-NEXT: rlwinm 3, 3, 0, 0, 30
|
|
; CHECK-NEXT: blr
|
|
%and = and i32 %a, -2
|
|
ret i32 %and
|
|
}
|
|
|
|
; mask 0xFFFFFFFFFFFFFFF9
|
|
define i64 @test2(i64 %a) {
|
|
; CHECK-LABEL: test2:
|
|
; CHECK: # %bb.0:
|
|
; CHECK-NEXT: rldicl 3, 3, 61, 2
|
|
; CHECK-NEXT: rotldi 3, 3, 3
|
|
; CHECK-NEXT: blr
|
|
%and = and i64 %a, -7
|
|
ret i64 %and
|
|
}
|
|
|
|
; mask: 0xFFFFFFC00000
|
|
define i64 @test3(i64 %a) {
|
|
; CHECK-LABEL: test3:
|
|
; CHECK: # %bb.0:
|
|
; CHECK-NEXT: rldicl 3, 3, 42, 22
|
|
; CHECK-NEXT: rldicl 3, 3, 22, 16
|
|
; CHECK-NEXT: blr
|
|
%and = and i64 %a, 281474972516352
|
|
ret i64 %and
|
|
}
|
|
|
|
; mask: 0xC000000FF
|
|
define i64 @test4(i64 %a) {
|
|
; CHECK-LABEL: test4:
|
|
; CHECK: # %bb.0:
|
|
; CHECK-NEXT: rldicl 3, 3, 30, 26
|
|
; CHECK-NEXT: rldicl 3, 3, 34, 28
|
|
; CHECK-NEXT: blr
|
|
%and = and i64 %a, 51539607807
|
|
ret i64 %and
|
|
}
|
|
|
|
; mask: 0xFFC0FFFF
|
|
define i64 @test5(i64 %a) {
|
|
; CHECK-LABEL: test5:
|
|
; CHECK: # %bb.0:
|
|
; CHECK-NEXT: rldicl 3, 3, 42, 6
|
|
; CHECK-NEXT: rldicl 3, 3, 22, 32
|
|
; CHECK-NEXT: blr
|
|
%and = and i64 %a, 4290838527
|
|
ret i64 %and
|
|
}
|
|
|
|
; mask: 0x3FC0FFE0
|
|
define i64 @test6(i64 %a) {
|
|
; CHECK-LABEL: test6:
|
|
; CHECK: # %bb.0:
|
|
; CHECK-NEXT: lis 4, 16320
|
|
; CHECK-NEXT: ori 4, 4, 65504
|
|
; CHECK-NEXT: and 3, 3, 4
|
|
; CHECK-NEXT: blr
|
|
%and = and i64 %a, 1069613024
|
|
ret i64 %and
|
|
}
|
|
|
|
; mask: 0x3FC000001FFFF
|
|
define i64 @test7(i64 %a) {
|
|
; CHECK-LABEL: test7:
|
|
; CHECK: # %bb.0:
|
|
; CHECK-NEXT: rldicl 3, 3, 22, 25
|
|
; CHECK-NEXT: rldicl 3, 3, 42, 14
|
|
; CHECK-NEXT: blr
|
|
%and = and i64 %a, 1121501860462591
|
|
ret i64 %and
|
|
}
|