Skip to content

Commit

Permalink
In LLVM FMA3 operands are dst, src1, src2, src3, however dst is not e…
Browse files Browse the repository at this point in the history
…ncoded as it is always src1. This was causing the encoding of the operands to be off by one.

Patch by Chris Bieneman.



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@188866 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
nadavrot committed Aug 21, 2013
1 parent 9397683 commit ec7b5e9
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 2 deletions.
10 changes: 8 additions & 2 deletions lib/Target/X86/X86CodeEmitter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -985,8 +985,14 @@ void Emitter<CodeEmitter>::emitVEXOpcodePrefix(uint64_t TSFlags,
if (X86II::isX86_64ExtendedReg(MI.getOperand(0).getReg()))
VEX_R = 0x0;

if (HasVEX_4V)
VEX_4V = getVEXRegisterEncoding(MI, 1);
if (HasVEX_4V) {
if (HasMemOp4)
VEX_4V = getVEXRegisterEncoding(MI, 1);
else
// FMA3 instructions operands are dst, src1, src2, src3
// dst and src1 are the same and not encoded separately
VEX_4V = getVEXRegisterEncoding(MI, 2);
}

if (X86II::isX86_64ExtendedReg(
MI.getOperand(MemOperand+X86::AddrBaseReg).getReg()))
Expand Down
18 changes: 18 additions & 0 deletions test/ExecutionEngine/fma3-jit.ll
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
; RUN: %lli %s | FileCheck %s
; REQUIRES: fma3
; CHECK: 12.000000

@msg_double = internal global [4 x i8] c"%f\0A\00"

declare i32 @printf(i8*, ...)

define i32 @main() {
%fma = tail call double @llvm.fma.f64(double 3.0, double 3.0, double 3.0) nounwind readnone

%ptr1 = getelementptr [4 x i8]* @msg_double, i32 0, i32 0
call i32 (i8*,...)* @printf(i8* %ptr1, double %fma)

ret i32 0
}

declare double @llvm.fma.f64(double, double, double) nounwind readnone

0 comments on commit ec7b5e9

Please sign in to comment.