2017-12-18 23:56:40 +08:00
|
|
|
; RUN: llc < %s -verify-machineinstrs -march=mipsel -mcpu=mips32 \
|
|
|
|
; RUN: | FileCheck %s -check-prefix=32
|
|
|
|
; RUN: llc < %s -verify-machineinstrs -march=mipsel -mcpu=mips32r2 \
|
|
|
|
; RUN: | FileCheck %s -check-prefix=32R2
|
|
|
|
; RUN: llc < %s -verify-machineinstrs -march=mips64el -mcpu=mips4 -target-abi=n64 \
|
|
|
|
; RUN: | FileCheck %s -check-prefix=64
|
|
|
|
; RUN: llc < %s -verify-machineinstrs -march=mips64el -mcpu=mips64 -target-abi=n64 \
|
|
|
|
; RUN: | FileCheck %s -check-prefix=64
|
|
|
|
; RUN: llc < %s -verify-machineinstrs -march=mips64el -mcpu=mips64r2 -target-abi=n64 \
|
|
|
|
; RUN: | FileCheck %s -check-prefix=64R2
|
2011-05-26 03:32:07 +08:00
|
|
|
|
|
|
|
define double @func0(double %d0, double %d1) nounwind readnone {
|
|
|
|
entry:
|
|
|
|
;
|
2012-04-12 06:13:04 +08:00
|
|
|
; 32: lui $[[MSK1:[0-9]+]], 32768
|
|
|
|
; 32: and $[[AND1:[0-9]+]], ${{[0-9]+}}, $[[MSK1]]
|
|
|
|
; 32: lui $[[T0:[0-9]+]], 32767
|
|
|
|
; 32: ori $[[MSK0:[0-9]+]], $[[T0]], 65535
|
|
|
|
; 32: and $[[AND0:[0-9]+]], ${{[0-9]+}}, $[[MSK0]]
|
|
|
|
; 32: or $[[OR:[0-9]+]], $[[AND0]], $[[AND1]]
|
|
|
|
; 32: mtc1 $[[OR]], $f1
|
|
|
|
|
|
|
|
; 32R2: ext $[[EXT:[0-9]+]], ${{[0-9]+}}, 31, 1
|
|
|
|
; 32R2: ins $[[INS:[0-9]+]], $[[EXT]], 31, 1
|
2014-06-12 19:55:58 +08:00
|
|
|
; 32R2: mthc1 $[[INS]], $f0
|
2012-04-12 06:13:04 +08:00
|
|
|
|
|
|
|
; 64: daddiu $[[T0:[0-9]+]], $zero, 1
|
|
|
|
; 64: dsll $[[MSK1:[0-9]+]], $[[T0]], 63
|
|
|
|
; 64: and $[[AND1:[0-9]+]], ${{[0-9]+}}, $[[MSK1]]
|
|
|
|
; 64: daddiu $[[MSK0:[0-9]+]], $[[MSK1]], -1
|
|
|
|
; 64: and $[[AND0:[0-9]+]], ${{[0-9]+}}, $[[MSK0]]
|
|
|
|
; 64: or $[[OR:[0-9]+]], $[[AND0]], $[[AND1]]
|
|
|
|
; 64: dmtc1 $[[OR]], $f0
|
|
|
|
|
2016-02-29 23:26:54 +08:00
|
|
|
; 64R2: dextu $[[EXT:[0-9]+]], ${{[0-9]+}}, 63, 1
|
[mips] Pick the right variant of DINS upfront and enable target instruction verification
This patch complements D16810 "[mips] Make isel select the correct DEXT variant
up front.". Now ISel picks the right variant of DINS, so now there is no need
to replace DINS with the appropriate variant during
MipsMCCodeEmitter::encodeInstruction().
This patch also enables target specific instruction verification for ins, dins,
dinsm, dinsu, ext, dext, dextm, dextu. These instructions have constraints that
are checked when generating MipsISD::Ins and MipsISD::Ext nodes, but these
constraints are not checked during instruction selection. Adding machine
verification should catch outstanding cases.
Finally, correct a bug that instruction verification uncovered, where the
position operand of a DINSU generated during lowering was being silently
and accidently corrected to the correct value.
Reviewers: slthakur
Differential Revision: https://reviews.llvm.org/D34809
llvm-svn: 313254
2017-09-14 18:58:00 +08:00
|
|
|
; 64R2: dinsu $[[INS:[0-9]+]], $[[EXT]], 63, 1
|
|
|
|
; 64R2: dmtc1 $[[INS]], $f0
|
2012-04-12 06:13:04 +08:00
|
|
|
|
2011-05-26 03:32:07 +08:00
|
|
|
%call = tail call double @copysign(double %d0, double %d1) nounwind readnone
|
|
|
|
ret double %call
|
|
|
|
}
|
|
|
|
|
|
|
|
declare double @copysign(double, double) nounwind readnone
|
|
|
|
|
|
|
|
define float @func1(float %f0, float %f1) nounwind readnone {
|
|
|
|
entry:
|
2012-04-12 06:13:04 +08:00
|
|
|
|
|
|
|
; 32: lui $[[MSK1:[0-9]+]], 32768
|
|
|
|
; 32: and $[[AND1:[0-9]+]], ${{[0-9]+}}, $[[MSK1]]
|
|
|
|
; 32: lui $[[T0:[0-9]+]], 32767
|
|
|
|
; 32: ori $[[MSK0:[0-9]+]], $[[T0]], 65535
|
|
|
|
; 32: and $[[AND0:[0-9]+]], ${{[0-9]+}}, $[[MSK0]]
|
|
|
|
; 32: or $[[OR:[0-9]+]], $[[AND0]], $[[AND1]]
|
|
|
|
; 32: mtc1 $[[OR]], $f0
|
|
|
|
|
|
|
|
; 32R2: ext $[[EXT:[0-9]+]], ${{[0-9]+}}, 31, 1
|
|
|
|
; 32R2: ins $[[INS:[0-9]+]], $[[EXT]], 31, 1
|
|
|
|
; 32R2: mtc1 $[[INS]], $f0
|
|
|
|
|
2011-05-26 03:32:07 +08:00
|
|
|
%call = tail call float @copysignf(float %f0, float %f1) nounwind readnone
|
|
|
|
ret float %call
|
|
|
|
}
|
|
|
|
|
|
|
|
declare float @copysignf(float, float) nounwind readnone
|
2012-04-12 06:13:04 +08:00
|
|
|
|