Skip to content

Commit 7e9a3d8

Browse files
author
mattarde
committed
add bitcast
1 parent 2b3e07f commit 7e9a3d8

File tree

3 files changed

+40
-0
lines changed

3 files changed

+40
-0
lines changed

llvm/lib/Target/X86/GISel/X86LegalizerInfo.cpp

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -669,6 +669,8 @@ bool X86LegalizerInfo::legalizeCustom(LegalizerHelper &Helper, MachineInstr &MI,
669669
return legalizeSITOFP(MI, MRI, Helper);
670670
case TargetOpcode::G_FPTOSI:
671671
return legalizeFPTOSI(MI, MRI, Helper);
672+
case TargetOpcode::G_BITCAST:
673+
return legalizeBitcast(MI, MRI, Helper);
672674
}
673675
llvm_unreachable("expected switch to return");
674676
}
@@ -835,6 +837,23 @@ bool X86LegalizerInfo::legalizeNarrowingStore(MachineInstr &MI,
835837
return true;
836838
}
837839

840+
bool X86LegalizerInfo::legalizeBitcast(MachineInstr &MI,
841+
MachineRegisterInfo &MRI,
842+
LegalizerHelper &Helper) const {
843+
MachineIRBuilder &MIRBuilder = Helper.MIRBuilder;
844+
auto [DstReg, DstTy, SrcReg, SrcTy] = MI.getFirst2RegLLTs();
845+
assert(!SrcTy.isVector() && "G_BITCAST does not support vectors yet");
846+
bool isCopy =
847+
(SrcTy == DstTy) || (SrcTy.getSizeInBits() == DstTy.getSizeInBits());
848+
if (isCopy) {
849+
MIRBuilder.buildCopy(DstReg, SrcReg);
850+
MI.eraseFromParent();
851+
return true;
852+
}
853+
// For Vectors specific bitcasts
854+
return Helper.lowerBitcast(MI) == LegalizerHelper::LegalizeResult::Legalized;
855+
}
856+
838857
bool X86LegalizerInfo::legalizeIntrinsic(LegalizerHelper &Helper,
839858
MachineInstr &MI) const {
840859
return true;

llvm/lib/Target/X86/GISel/X86LegalizerInfo.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,8 @@ class X86LegalizerInfo : public LegalizerInfo {
5454

5555
bool legalizeFPTOSI(MachineInstr &MI, MachineRegisterInfo &MRI,
5656
LegalizerHelper &Helper) const;
57+
bool legalizeBitcast(MachineInstr &MI, MachineRegisterInfo &MRI,
58+
LegalizerHelper &Helper) const;
5759
};
5860
} // namespace llvm
5961
#endif

llvm/test/CodeGen/X86/bitcast.ll

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,42 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
12
; RUN: llc < %s -mtriple=i686--
23
; RUN: llc < %s -mtriple=x86_64--
4+
; RUN: llc < %s -mtriple=x86_64-- -global-isel -global-isel-abort=1 | FileCheck %s -check-prefixes=GISEL
5+
; XRUN: llc < %s -mtriple=i686-- -global-isel -global-isel-abort=1 | FileCheck %s -check-prefixes=GISEL
36
; PR1033
47

58
define i64 @test1(double %t) {
9+
; GISEL-LABEL: test1:
10+
; GISEL: # %bb.0:
11+
; GISEL-NEXT: movq %xmm0, %rax
12+
; GISEL-NEXT: retq
613
%u = bitcast double %t to i64 ; <i64> [#uses=1]
714
ret i64 %u
815
}
916

1017
define double @test2(i64 %t) {
18+
; GISEL-LABEL: test2:
19+
; GISEL: # %bb.0:
20+
; GISEL-NEXT: movq %rdi, %xmm0
21+
; GISEL-NEXT: retq
1122
%u = bitcast i64 %t to double ; <double> [#uses=1]
1223
ret double %u
1324
}
1425

1526
define i32 @test3(float %t) {
27+
; GISEL-LABEL: test3:
28+
; GISEL: # %bb.0:
29+
; GISEL-NEXT: movd %xmm0, %eax
30+
; GISEL-NEXT: retq
1631
%u = bitcast float %t to i32 ; <i32> [#uses=1]
1732
ret i32 %u
1833
}
1934

2035
define float @test4(i32 %t) {
36+
; GISEL-LABEL: test4:
37+
; GISEL: # %bb.0:
38+
; GISEL-NEXT: movd %edi, %xmm0
39+
; GISEL-NEXT: retq
2140
%u = bitcast i32 %t to float ; <float> [#uses=1]
2241
ret float %u
2342
}

0 commit comments

Comments
 (0)