comparison lib/Target/Mips/MipsInstrFPU.td @ 147:c2174574ed3a

LLVM 10
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Wed, 14 Aug 2019 16:55:33 +0900
parents 3a76565eade5
children
comparison
equal deleted inserted replaced
134:3a76565eade5 147:c2174574ed3a
1 //===-- MipsInstrFPU.td - Mips FPU Instruction Information -*- tablegen -*-===// 1 //===-- MipsInstrFPU.td - Mips FPU Instruction Information -*- tablegen -*-===//
2 // 2 //
3 // The LLVM Compiler Infrastructure 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // 4 // See https://llvm.org/LICENSE.txt for license information.
5 // This file is distributed under the University of Illinois Open Source 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 // License. See LICENSE.TXT for details.
7 // 6 //
8 //===----------------------------------------------------------------------===// 7 //===----------------------------------------------------------------------===//
9 // 8 //
10 // This file describes the Mips FPU instruction set. 9 // This file describes the Mips FPU instruction set.
11 // 10 //
128 InstSE<(outs DstRC:$fd), (ins SrcRC:$fs), !strconcat(opstr, "\t$fd, $fs"), 127 InstSE<(outs DstRC:$fd), (ins SrcRC:$fs), !strconcat(opstr, "\t$fd, $fs"),
129 [(set DstRC:$fd, (OpNode SrcRC:$fs))], Itin, FrmFR, opstr>, 128 [(set DstRC:$fd, (OpNode SrcRC:$fs))], Itin, FrmFR, opstr>,
130 HARDFLOAT, 129 HARDFLOAT,
131 NeverHasSideEffects; 130 NeverHasSideEffects;
132 131
132 class CVT_PS_S_FT<string opstr, RegisterOperand DstRC, RegisterOperand SrcRC, InstrItinClass Itin, bit IsComm,
133 SDPatternOperator OpNode= null_frag> :
134 InstSE<(outs DstRC:$fd), (ins SrcRC:$fs, SrcRC:$ft),
135 !strconcat(opstr, "\t$fd, $fs, $ft"),
136 [(set DstRC:$fd, (OpNode SrcRC:$fs, SrcRC:$ft))], Itin, FrmFR, opstr>,
137 HARDFLOAT {
138 let isCommutable = IsComm;
139 }
140
133 multiclass ABSS_M<string opstr, InstrItinClass Itin, 141 multiclass ABSS_M<string opstr, InstrItinClass Itin,
134 SDPatternOperator OpNode= null_frag> { 142 SDPatternOperator OpNode= null_frag> {
135 def _D32 : MMRel, ABSS_FT<opstr, AFGR64Opnd, AFGR64Opnd, Itin, OpNode>, 143 def _D32 : MMRel, ABSS_FT<opstr, AFGR64Opnd, AFGR64Opnd, Itin, OpNode>,
136 FGR_32; 144 FGR_32;
137 def _D64 : ABSS_FT<opstr, FGR64Opnd, FGR64Opnd, Itin, OpNode>, FGR_64 { 145 def _D64 : StdMMR6Rel, ABSS_FT<opstr, FGR64Opnd, FGR64Opnd, Itin, OpNode>, FGR_64 {
138 string DecoderNamespace = "MipsFP64"; 146 string DecoderNamespace = "MipsFP64";
139 } 147 }
140 } 148 }
141 149
142 multiclass ROUND_M<string opstr, InstrItinClass Itin> { 150 multiclass ROUND_M<string opstr, InstrItinClass Itin> {
147 } 155 }
148 156
149 class MFC1_FT<string opstr, RegisterOperand DstRC, RegisterOperand SrcRC, 157 class MFC1_FT<string opstr, RegisterOperand DstRC, RegisterOperand SrcRC,
150 InstrItinClass Itin, SDPatternOperator OpNode= null_frag> : 158 InstrItinClass Itin, SDPatternOperator OpNode= null_frag> :
151 InstSE<(outs DstRC:$rt), (ins SrcRC:$fs), !strconcat(opstr, "\t$rt, $fs"), 159 InstSE<(outs DstRC:$rt), (ins SrcRC:$fs), !strconcat(opstr, "\t$rt, $fs"),
152 [(set DstRC:$rt, (OpNode SrcRC:$fs))], Itin, FrmFR, opstr>, HARDFLOAT; 160 [(set DstRC:$rt, (OpNode SrcRC:$fs))], Itin, FrmFR, opstr>, HARDFLOAT {
161 let isMoveReg = 1;
162 }
153 163
154 class MTC1_FT<string opstr, RegisterOperand DstRC, RegisterOperand SrcRC, 164 class MTC1_FT<string opstr, RegisterOperand DstRC, RegisterOperand SrcRC,
155 InstrItinClass Itin, SDPatternOperator OpNode= null_frag> : 165 InstrItinClass Itin, SDPatternOperator OpNode= null_frag> :
156 InstSE<(outs DstRC:$fs), (ins SrcRC:$rt), !strconcat(opstr, "\t$rt, $fs"), 166 InstSE<(outs DstRC:$fs), (ins SrcRC:$rt), !strconcat(opstr, "\t$rt, $fs"),
157 [(set DstRC:$fs, (OpNode SrcRC:$rt))], Itin, FrmFR, opstr>, HARDFLOAT; 167 [(set DstRC:$fs, (OpNode SrcRC:$rt))], Itin, FrmFR, opstr>, HARDFLOAT {
168 let isMoveReg = 1;
169 }
158 170
159 class MTC1_64_FT<string opstr, RegisterOperand DstRC, RegisterOperand SrcRC, 171 class MTC1_64_FT<string opstr, RegisterOperand DstRC, RegisterOperand SrcRC,
160 InstrItinClass Itin> : 172 InstrItinClass Itin> :
161 InstSE<(outs DstRC:$fs), (ins DstRC:$fs_in, SrcRC:$rt), 173 InstSE<(outs DstRC:$fs), (ins DstRC:$fs_in, SrcRC:$rt),
162 !strconcat(opstr, "\t$rt, $fs"), [], Itin, FrmFR, opstr>, HARDFLOAT { 174 !strconcat(opstr, "\t$rt, $fs"), [], Itin, FrmFR, opstr>, HARDFLOAT {
347 FGR_64; 359 FGR_64;
348 } 360 }
349 //===----------------------------------------------------------------------===// 361 //===----------------------------------------------------------------------===//
350 // Floating Point Instructions 362 // Floating Point Instructions
351 //===----------------------------------------------------------------------===// 363 //===----------------------------------------------------------------------===//
352 def ROUND_W_S : MMRel, StdMMR6Rel, ABSS_FT<"round.w.s", FGR32Opnd, FGR32Opnd, II_ROUND>, 364 let AdditionalPredicates = [NotInMicroMips] in {
353 ABSS_FM<0xc, 16>, ISA_MIPS2; 365 def ROUND_W_S : MMRel, StdMMR6Rel, ABSS_FT<"round.w.s", FGR32Opnd, FGR32Opnd, II_ROUND>,
354 defm ROUND_W : ROUND_M<"round.w.d", II_ROUND>, ABSS_FM<0xc, 17>, ISA_MIPS2; 366 ABSS_FM<0xc, 16>, ISA_MIPS2;
355 def TRUNC_W_S : MMRel, StdMMR6Rel, ABSS_FT<"trunc.w.s", FGR32Opnd, FGR32Opnd, II_TRUNC>, 367 defm ROUND_W : ROUND_M<"round.w.d", II_ROUND>, ABSS_FM<0xc, 17>, ISA_MIPS2;
356 ABSS_FM<0xd, 16>, ISA_MIPS2; 368 def TRUNC_W_S : MMRel, StdMMR6Rel, ABSS_FT<"trunc.w.s", FGR32Opnd, FGR32Opnd, II_TRUNC>,
357 def CEIL_W_S : MMRel, StdMMR6Rel, ABSS_FT<"ceil.w.s", FGR32Opnd, FGR32Opnd, II_CEIL>, 369 ABSS_FM<0xd, 16>, ISA_MIPS2;
358 ABSS_FM<0xe, 16>, ISA_MIPS2; 370 def CEIL_W_S : MMRel, StdMMR6Rel, ABSS_FT<"ceil.w.s", FGR32Opnd, FGR32Opnd, II_CEIL>,
359 def FLOOR_W_S : MMRel, StdMMR6Rel, ABSS_FT<"floor.w.s", FGR32Opnd, FGR32Opnd, II_FLOOR>, 371 ABSS_FM<0xe, 16>, ISA_MIPS2;
360 ABSS_FM<0xf, 16>, ISA_MIPS2; 372 def FLOOR_W_S : MMRel, StdMMR6Rel, ABSS_FT<"floor.w.s", FGR32Opnd, FGR32Opnd, II_FLOOR>,
361 def CVT_W_S : MMRel, ABSS_FT<"cvt.w.s", FGR32Opnd, FGR32Opnd, II_CVT>, 373 ABSS_FM<0xf, 16>, ISA_MIPS2;
362 ABSS_FM<0x24, 16>; 374 def CVT_W_S : MMRel, ABSS_FT<"cvt.w.s", FGR32Opnd, FGR32Opnd, II_CVT>,
363 375 ABSS_FM<0x24, 16>, ISA_MIPS1;
364 defm TRUNC_W : ROUND_M<"trunc.w.d", II_TRUNC>, ABSS_FM<0xd, 17>, ISA_MIPS2; 376
365 defm CEIL_W : ROUND_M<"ceil.w.d", II_CEIL>, ABSS_FM<0xe, 17>, ISA_MIPS2; 377 defm TRUNC_W : ROUND_M<"trunc.w.d", II_TRUNC>, ABSS_FM<0xd, 17>, ISA_MIPS2;
366 defm FLOOR_W : ROUND_M<"floor.w.d", II_FLOOR>, ABSS_FM<0xf, 17>, ISA_MIPS2; 378 defm CEIL_W : ROUND_M<"ceil.w.d", II_CEIL>, ABSS_FM<0xe, 17>, ISA_MIPS2;
367 let AdditionalPredicates = [NotInMicroMips] in { 379 defm FLOOR_W : ROUND_M<"floor.w.d", II_FLOOR>, ABSS_FM<0xf, 17>, ISA_MIPS2;
368 defm CVT_W : ROUND_M<"cvt.w.d", II_CVT>, ABSS_FM<0x24, 17>; 380 defm CVT_W : ROUND_M<"cvt.w.d", II_CVT>, ABSS_FM<0x24, 17>, ISA_MIPS1;
369 } 381 }
370 382
371 let AdditionalPredicates = [NotInMicroMips] in { 383 let AdditionalPredicates = [NotInMicroMips] in {
372 def RECIP_S : MMRel, ABSS_FT<"recip.s", FGR32Opnd, FGR32Opnd, II_RECIP_S>, 384 def RECIP_S : MMRel, ABSS_FT<"recip.s", FGR32Opnd, FGR32Opnd, II_RECIP_S>,
373 ABSS_FM<0b010101, 0x10>, INSN_MIPS4_32R2; 385 ABSS_FM<0b010101, 0x10>, INSN_MIPS4_32R2;
391 INSN_MIPS4_32R2, FGR_64; 403 INSN_MIPS4_32R2, FGR_64;
392 } 404 }
393 let DecoderNamespace = "MipsFP64" in { 405 let DecoderNamespace = "MipsFP64" in {
394 let AdditionalPredicates = [NotInMicroMips] in { 406 let AdditionalPredicates = [NotInMicroMips] in {
395 def ROUND_L_S : ABSS_FT<"round.l.s", FGR64Opnd, FGR32Opnd, II_ROUND>, 407 def ROUND_L_S : ABSS_FT<"round.l.s", FGR64Opnd, FGR32Opnd, II_ROUND>,
396 ABSS_FM<0x8, 16>, FGR_64; 408 ABSS_FM<0x8, 16>, ISA_MIPS2, FGR_64;
397 def ROUND_L_D64 : ABSS_FT<"round.l.d", FGR64Opnd, FGR64Opnd, II_ROUND>, 409 def ROUND_L_D64 : ABSS_FT<"round.l.d", FGR64Opnd, FGR64Opnd, II_ROUND>,
398 ABSS_FM<0x8, 17>, FGR_64; 410 ABSS_FM<0x8, 17>, INSN_MIPS3_32, FGR_64;
399 def TRUNC_L_S : ABSS_FT<"trunc.l.s", FGR64Opnd, FGR32Opnd, II_TRUNC>, 411 def TRUNC_L_S : ABSS_FT<"trunc.l.s", FGR64Opnd, FGR32Opnd, II_TRUNC>,
400 ABSS_FM<0x9, 16>, FGR_64; 412 ABSS_FM<0x9, 16>, ISA_MIPS2, FGR_64;
401 def TRUNC_L_D64 : ABSS_FT<"trunc.l.d", FGR64Opnd, FGR64Opnd, II_TRUNC>, 413 def TRUNC_L_D64 : ABSS_FT<"trunc.l.d", FGR64Opnd, FGR64Opnd, II_TRUNC>,
402 ABSS_FM<0x9, 17>, FGR_64; 414 ABSS_FM<0x9, 17>, INSN_MIPS3_32, FGR_64;
403 def CEIL_L_S : ABSS_FT<"ceil.l.s", FGR64Opnd, FGR32Opnd, II_CEIL>, 415 def CEIL_L_S : ABSS_FT<"ceil.l.s", FGR64Opnd, FGR32Opnd, II_CEIL>,
404 ABSS_FM<0xa, 16>, FGR_64; 416 ABSS_FM<0xa, 16>, ISA_MIPS2, FGR_64;
405 def CEIL_L_D64 : ABSS_FT<"ceil.l.d", FGR64Opnd, FGR64Opnd, II_CEIL>, 417 def CEIL_L_D64 : ABSS_FT<"ceil.l.d", FGR64Opnd, FGR64Opnd, II_CEIL>,
406 ABSS_FM<0xa, 17>, FGR_64; 418 ABSS_FM<0xa, 17>, INSN_MIPS3_32, FGR_64;
407 def FLOOR_L_S : ABSS_FT<"floor.l.s", FGR64Opnd, FGR32Opnd, II_FLOOR>, 419 def FLOOR_L_S : ABSS_FT<"floor.l.s", FGR64Opnd, FGR32Opnd, II_FLOOR>,
408 ABSS_FM<0xb, 16>, FGR_64; 420 ABSS_FM<0xb, 16>, ISA_MIPS2, FGR_64;
409 def FLOOR_L_D64 : ABSS_FT<"floor.l.d", FGR64Opnd, FGR64Opnd, II_FLOOR>, 421 def FLOOR_L_D64 : ABSS_FT<"floor.l.d", FGR64Opnd, FGR64Opnd, II_FLOOR>,
410 ABSS_FM<0xb, 17>, FGR_64; 422 ABSS_FM<0xb, 17>, INSN_MIPS3_32, FGR_64;
411 } 423 }
412 } 424 }
413 425
414 def CVT_S_W : MMRel, ABSS_FT<"cvt.s.w", FGR32Opnd, FGR32Opnd, II_CVT>,
415 ABSS_FM<0x20, 20>;
416 let AdditionalPredicates = [NotInMicroMips] in{ 426 let AdditionalPredicates = [NotInMicroMips] in{
427 def CVT_S_W : MMRel, ABSS_FT<"cvt.s.w", FGR32Opnd, FGR32Opnd, II_CVT>,
428 ABSS_FM<0x20, 20>, ISA_MIPS1;
417 def CVT_L_S : MMRel, ABSS_FT<"cvt.l.s", FGR64Opnd, FGR32Opnd, II_CVT>, 429 def CVT_L_S : MMRel, ABSS_FT<"cvt.l.s", FGR64Opnd, FGR32Opnd, II_CVT>,
418 ABSS_FM<0x25, 16>, INSN_MIPS3_32R2; 430 ABSS_FM<0x25, 16>, INSN_MIPS3_32R2;
419 def CVT_L_D64: MMRel, ABSS_FT<"cvt.l.d", FGR64Opnd, FGR64Opnd, II_CVT>, 431 def CVT_L_D64: MMRel, ABSS_FT<"cvt.l.d", FGR64Opnd, FGR64Opnd, II_CVT>,
420 ABSS_FM<0x25, 17>, INSN_MIPS3_32R2; 432 ABSS_FM<0x25, 17>, INSN_MIPS3_32R2;
421 } 433 }
422 434
423 let AdditionalPredicates = [NotInMicroMips] in { 435 let AdditionalPredicates = [NotInMicroMips] in {
424 def CVT_S_D32 : MMRel, ABSS_FT<"cvt.s.d", FGR32Opnd, AFGR64Opnd, II_CVT>, 436 def CVT_S_D32 : MMRel, ABSS_FT<"cvt.s.d", FGR32Opnd, AFGR64Opnd, II_CVT>,
425 ABSS_FM<0x20, 17>, FGR_32; 437 ABSS_FM<0x20, 17>, ISA_MIPS1, FGR_32;
426 def CVT_D32_S : MMRel, ABSS_FT<"cvt.d.s", AFGR64Opnd, FGR32Opnd, II_CVT>, 438 def CVT_D32_S : MMRel, ABSS_FT<"cvt.d.s", AFGR64Opnd, FGR32Opnd, II_CVT>,
427 ABSS_FM<0x21, 16>, FGR_32; 439 ABSS_FM<0x21, 16>, ISA_MIPS1, FGR_32;
428 } 440 def CVT_D32_W : MMRel, ABSS_FT<"cvt.d.w", AFGR64Opnd, FGR32Opnd, II_CVT>,
429 def CVT_D32_W : MMRel, ABSS_FT<"cvt.d.w", AFGR64Opnd, FGR32Opnd, II_CVT>, 441 ABSS_FM<0x21, 20>, ISA_MIPS1, FGR_32;
430 ABSS_FM<0x21, 20>, FGR_32; 442 }
443
444 let DecoderNamespace = "MipsFP64" in {
445 let AdditionalPredicates = [NotInMicroMips] in {
446 def PLL_PS64 : ADDS_FT<"pll.ps", FGR64Opnd, II_CVT, 0>,
447 ADDS_FM<0x2C, 22>,
448 ISA_MIPS32R2_NOT_32R6_64R6, FGR_64;
449 def PLU_PS64 : ADDS_FT<"plu.ps", FGR64Opnd, II_CVT, 0>,
450 ADDS_FM<0x2D, 22>,
451 ISA_MIPS32R2_NOT_32R6_64R6, FGR_64;
452
453 def CVT_S_PU64 : ABSS_FT<"cvt.s.pu", FGR32Opnd, FGR64Opnd, II_CVT>,
454 ABSS_FM<0x20, 22>,
455 ISA_MIPS32R2_NOT_32R6_64R6, FGR_64;
456 def CVT_S_PL64 : ABSS_FT<"cvt.s.pl", FGR32Opnd, FGR64Opnd, II_CVT>,
457 ABSS_FM<0x28, 22>,
458 ISA_MIPS32R2_NOT_32R6_64R6, FGR_64;
459
460 def CVT_PS_S64 : CVT_PS_S_FT<"cvt.ps.s", FGR64Opnd, FGR32Opnd, II_CVT, 0>,
461 ADDS_FM<0x26, 16>,
462 ISA_MIPS32R2_NOT_32R6_64R6, FGR_64;
463 }
464 }
431 465
432 let DecoderNamespace = "MipsFP64" in { 466 let DecoderNamespace = "MipsFP64" in {
433 let AdditionalPredicates = [NotInMicroMips] in { 467 let AdditionalPredicates = [NotInMicroMips] in {
434 def CVT_S_L : ABSS_FT<"cvt.s.l", FGR32Opnd, FGR64Opnd, II_CVT>, 468 def CVT_S_L : ABSS_FT<"cvt.s.l", FGR32Opnd, FGR64Opnd, II_CVT>,
435 ABSS_FM<0x20, 21>, FGR_64; 469 ABSS_FM<0x20, 21>, INSN_MIPS3_32R2, FGR_64;
436 def CVT_S_D64 : ABSS_FT<"cvt.s.d", FGR32Opnd, FGR64Opnd, II_CVT>, 470 def CVT_S_D64 : ABSS_FT<"cvt.s.d", FGR32Opnd, FGR64Opnd, II_CVT>,
437 ABSS_FM<0x20, 17>, FGR_64; 471 ABSS_FM<0x20, 17>, ISA_MIPS1, FGR_64;
438 def CVT_D64_W : ABSS_FT<"cvt.d.w", FGR64Opnd, FGR32Opnd, II_CVT>, 472 def CVT_D64_W : ABSS_FT<"cvt.d.w", FGR64Opnd, FGR32Opnd, II_CVT>,
439 ABSS_FM<0x21, 20>, FGR_64; 473 ABSS_FM<0x21, 20>, ISA_MIPS1, FGR_64;
440 def CVT_D64_S : ABSS_FT<"cvt.d.s", FGR64Opnd, FGR32Opnd, II_CVT>, 474 def CVT_D64_S : ABSS_FT<"cvt.d.s", FGR64Opnd, FGR32Opnd, II_CVT>,
441 ABSS_FM<0x21, 16>, FGR_64; 475 ABSS_FM<0x21, 16>, ISA_MIPS1, FGR_64;
442 } 476 def CVT_D64_L : ABSS_FT<"cvt.d.l", FGR64Opnd, FGR64Opnd, II_CVT>,
443 def CVT_D64_L : ABSS_FT<"cvt.d.l", FGR64Opnd, FGR64Opnd, II_CVT>, 477 ABSS_FM<0x21, 21>, INSN_MIPS3_32R2, FGR_64;
444 ABSS_FM<0x21, 21>, FGR_64; 478 }
445 } 479 }
446 480
447 let isPseudo = 1, isCodeGenOnly = 1 in { 481 let isPseudo = 1, isCodeGenOnly = 1 in {
448 def PseudoCVT_S_W : ABSS_FT<"", FGR32Opnd, GPR32Opnd, II_CVT>; 482 def PseudoCVT_S_W : ABSS_FT<"", FGR32Opnd, GPR32Opnd, II_CVT>;
449 def PseudoCVT_D32_W : ABSS_FT<"", AFGR64Opnd, GPR32Opnd, II_CVT>; 483 def PseudoCVT_D32_W : ABSS_FT<"", AFGR64Opnd, GPR32Opnd, II_CVT>;
450 def PseudoCVT_S_L : ABSS_FT<"", FGR64Opnd, GPR64Opnd, II_CVT>; 484 def PseudoCVT_S_L : ABSS_FT<"", FGR64Opnd, GPR64Opnd, II_CVT>;
451 def PseudoCVT_D64_W : ABSS_FT<"", FGR64Opnd, GPR32Opnd, II_CVT>; 485 def PseudoCVT_D64_W : ABSS_FT<"", FGR64Opnd, GPR32Opnd, II_CVT>;
452 def PseudoCVT_D64_L : ABSS_FT<"", FGR64Opnd, GPR64Opnd, II_CVT>; 486 def PseudoCVT_D64_L : ABSS_FT<"", FGR64Opnd, GPR64Opnd, II_CVT>;
453 } 487 }
454 488
455 let AdditionalPredicates = [NotInMicroMips] in { 489 let AdditionalPredicates = [NotInMicroMips, UseAbs] in {
456 def FABS_S : MMRel, ABSS_FT<"abs.s", FGR32Opnd, FGR32Opnd, II_ABS, fabs>, 490 def FABS_S : MMRel, ABSS_FT<"abs.s", FGR32Opnd, FGR32Opnd, II_ABS, fabs>,
457 ABSS_FM<0x5, 16>; 491 ABSS_FM<0x5, 16>, ISA_MIPS1;
458 defm FABS : ABSS_M<"abs.d", II_ABS, fabs>, ABSS_FM<0x5, 17>; 492 defm FABS : ABSS_M<"abs.d", II_ABS, fabs>, ABSS_FM<0x5, 17>, ISA_MIPS1;
459 } 493 }
460 494
461 def FNEG_S : MMRel, ABSS_FT<"neg.s", FGR32Opnd, FGR32Opnd, II_NEG, fneg>, 495 def FNEG_S : MMRel, ABSS_FT<"neg.s", FGR32Opnd, FGR32Opnd, II_NEG, fneg>,
462 ABSS_FM<0x7, 16>; 496 ABSS_FM<0x7, 16>, ISA_MIPS1;
463 let AdditionalPredicates = [NotInMicroMips] in { 497 let AdditionalPredicates = [NotInMicroMips] in {
464 defm FNEG : ABSS_M<"neg.d", II_NEG, fneg>, ABSS_FM<0x7, 17>; 498 defm FNEG : ABSS_M<"neg.d", II_NEG, fneg>, ABSS_FM<0x7, 17>, ISA_MIPS1;
465 } 499 }
466 500
467 let AdditionalPredicates = [NotInMicroMips] in { 501 let AdditionalPredicates = [NotInMicroMips] in {
468 def FSQRT_S : MMRel, StdMMR6Rel, ABSS_FT<"sqrt.s", FGR32Opnd, FGR32Opnd, 502 def FSQRT_S : MMRel, StdMMR6Rel, ABSS_FT<"sqrt.s", FGR32Opnd, FGR32Opnd,
469 II_SQRT_S, fsqrt>, ABSS_FM<0x4, 16>, ISA_MIPS2; 503 II_SQRT_S, fsqrt>, ABSS_FM<0x4, 16>, ISA_MIPS2;
475 // When defining instructions, we reference all 32-bit registers, 509 // When defining instructions, we reference all 32-bit registers,
476 // regardless of register aliasing. 510 // regardless of register aliasing.
477 511
478 /// Move Control Registers From/To CPU Registers 512 /// Move Control Registers From/To CPU Registers
479 let AdditionalPredicates = [NotInMicroMips] in { 513 let AdditionalPredicates = [NotInMicroMips] in {
480 def CFC1 : MMRel, MFC1_FT<"cfc1", GPR32Opnd, CCROpnd, II_CFC1>, MFC1_FM<2>; 514 def CFC1 : MMRel, MFC1_FT<"cfc1", GPR32Opnd, CCROpnd, II_CFC1>, MFC1_FM<2>,
481 def CTC1 : MMRel, MTC1_FT<"ctc1", CCROpnd, GPR32Opnd, II_CTC1>, MFC1_FM<6>; 515 ISA_MIPS1;
482 } 516 def CTC1 : MMRel, MTC1_FT<"ctc1", CCROpnd, GPR32Opnd, II_CTC1>, MFC1_FM<6>,
483 def MFC1 : MMRel, MFC1_FT<"mfc1", GPR32Opnd, FGR32Opnd, II_MFC1, 517 ISA_MIPS1;
484 bitconvert>, MFC1_FM<0>; 518
485 def MFC1_D64 : MFC1_FT<"mfc1", GPR32Opnd, FGR64Opnd, II_MFC1>, MFC1_FM<0>, 519 def MFC1 : MMRel, StdMMR6Rel, MFC1_FT<"mfc1", GPR32Opnd, FGR32Opnd, II_MFC1,
486 FGR_64 { 520 bitconvert>, MFC1_FM<0>, ISA_MIPS1;
487 let DecoderNamespace = "MipsFP64"; 521 def MFC1_D64 : MFC1_FT<"mfc1", GPR32Opnd, FGR64Opnd, II_MFC1>, MFC1_FM<0>,
488 } 522 ISA_MIPS1, FGR_64 {
489 def MTC1 : MMRel, MTC1_FT<"mtc1", FGR32Opnd, GPR32Opnd, II_MTC1, 523 let DecoderNamespace = "MipsFP64";
490 bitconvert>, MFC1_FM<4>; 524 }
491 def MTC1_D64 : MTC1_FT<"mtc1", FGR64Opnd, GPR32Opnd, II_MTC1>, MFC1_FM<4>, 525 def MTC1 : MMRel, StdMMR6Rel, MTC1_FT<"mtc1", FGR32Opnd, GPR32Opnd, II_MTC1,
492 FGR_64 { 526 bitconvert>, MFC1_FM<4>, ISA_MIPS1;
493 let DecoderNamespace = "MipsFP64"; 527 def MTC1_D64 : MTC1_FT<"mtc1", FGR64Opnd, GPR32Opnd, II_MTC1>, MFC1_FM<4>,
494 } 528 ISA_MIPS1, FGR_64 {
495 529 let DecoderNamespace = "MipsFP64";
496 let AdditionalPredicates = [NotInMicroMips] in { 530 }
531
497 def MFHC1_D32 : MMRel, MFC1_FT<"mfhc1", GPR32Opnd, AFGR64Opnd, II_MFHC1>, 532 def MFHC1_D32 : MMRel, MFC1_FT<"mfhc1", GPR32Opnd, AFGR64Opnd, II_MFHC1>,
498 MFC1_FM<3>, ISA_MIPS32R2, FGR_32; 533 MFC1_FM<3>, ISA_MIPS32R2, FGR_32;
499 def MFHC1_D64 : MFC1_FT<"mfhc1", GPR32Opnd, FGR64Opnd, II_MFHC1>, 534 def MFHC1_D64 : MFC1_FT<"mfhc1", GPR32Opnd, FGR64Opnd, II_MFHC1>,
500 MFC1_FM<3>, ISA_MIPS32R2, FGR_64 { 535 MFC1_FM<3>, ISA_MIPS32R2, FGR_64 {
501 let DecoderNamespace = "MipsFP64"; 536 let DecoderNamespace = "MipsFP64";
502 } 537 }
503 } 538
504 let AdditionalPredicates = [NotInMicroMips] in {
505 def MTHC1_D32 : MMRel, StdMMR6Rel, MTC1_64_FT<"mthc1", AFGR64Opnd, GPR32Opnd, II_MTHC1>, 539 def MTHC1_D32 : MMRel, StdMMR6Rel, MTC1_64_FT<"mthc1", AFGR64Opnd, GPR32Opnd, II_MTHC1>,
506 MFC1_FM<7>, ISA_MIPS32R2, FGR_32; 540 MFC1_FM<7>, ISA_MIPS32R2, FGR_32;
507 def MTHC1_D64 : MTC1_64_FT<"mthc1", FGR64Opnd, GPR32Opnd, II_MTHC1>, 541 def MTHC1_D64 : MTC1_64_FT<"mthc1", FGR64Opnd, GPR32Opnd, II_MTHC1>,
508 MFC1_FM<7>, ISA_MIPS32R2, FGR_64 { 542 MFC1_FM<7>, ISA_MIPS32R2, FGR_64 {
509 let DecoderNamespace = "MipsFP64"; 543 let DecoderNamespace = "MipsFP64";
510 } 544 }
511 } 545
512 let AdditionalPredicates = [NotInMicroMips] in {
513 def DMTC1 : MTC1_FT<"dmtc1", FGR64Opnd, GPR64Opnd, II_DMTC1, 546 def DMTC1 : MTC1_FT<"dmtc1", FGR64Opnd, GPR64Opnd, II_DMTC1,
514 bitconvert>, MFC1_FM<5>, ISA_MIPS3; 547 bitconvert>, MFC1_FM<5>, ISA_MIPS3;
515 def DMFC1 : MFC1_FT<"dmfc1", GPR64Opnd, FGR64Opnd, II_DMFC1, 548 def DMFC1 : MFC1_FT<"dmfc1", GPR64Opnd, FGR64Opnd, II_DMFC1,
516 bitconvert>, MFC1_FM<1>, ISA_MIPS3; 549 bitconvert>, MFC1_FM<1>, ISA_MIPS3;
517 def FMOV_S : MMRel, ABSS_FT<"mov.s", FGR32Opnd, FGR32Opnd, II_MOV_S>, 550 let isMoveReg = 1 in {
518 ABSS_FM<0x6, 16>; 551 def FMOV_S : MMRel, ABSS_FT<"mov.s", FGR32Opnd, FGR32Opnd, II_MOV_S>,
519 def FMOV_D32 : MMRel, ABSS_FT<"mov.d", AFGR64Opnd, AFGR64Opnd, II_MOV_D>, 552 ABSS_FM<0x6, 16>, ISA_MIPS1;
520 ABSS_FM<0x6, 17>, FGR_32; 553 defm FMOV : ABSS_M<"mov.d", II_MOV_D>, ABSS_FM<0x6, 17>, ISA_MIPS1;
521 def FMOV_D64 : ABSS_FT<"mov.d", FGR64Opnd, FGR64Opnd, II_MOV_D>, 554 } // isMoveReg
522 ABSS_FM<0x6, 17>, FGR_64 {
523 let DecoderNamespace = "MipsFP64";
524 }
525 } 555 }
526 556
527 /// Floating Point Memory Instructions 557 /// Floating Point Memory Instructions
528 let AdditionalPredicates = [NotInMicroMips] in { 558 let AdditionalPredicates = [NotInMicroMips] in {
529 def LWC1 : MMRel, LW_FT<"lwc1", FGR32Opnd, mem_simm16, II_LWC1, load>, 559 def LWC1 : MMRel, LW_FT<"lwc1", FGR32Opnd, mem_simm16, II_LWC1, load>,
530 LW_FM<0x31>; 560 LW_FM<0x31>, ISA_MIPS1;
531 def SWC1 : MMRel, SW_FT<"swc1", FGR32Opnd, mem_simm16, II_SWC1, store>, 561 def SWC1 : MMRel, SW_FT<"swc1", FGR32Opnd, mem_simm16, II_SWC1, store>,
532 LW_FM<0x39>; 562 LW_FM<0x39>, ISA_MIPS1;
533 } 563 }
534 564
535 let DecoderNamespace = "MipsFP64", AdditionalPredicates = [NotInMicroMips] in { 565 let DecoderNamespace = "MipsFP64", AdditionalPredicates = [NotInMicroMips] in {
536 def LDC164 : StdMMR6Rel, LW_FT<"ldc1", FGR64Opnd, mem_simm16, II_LDC1, load>, 566 def LDC164 : StdMMR6Rel, LW_FT<"ldc1", FGR64Opnd, mem_simm16, II_LDC1, load>,
537 LW_FM<0x35>, ISA_MIPS2, FGR_64 { 567 LW_FM<0x35>, ISA_MIPS2, FGR_64 {
574 INSN_MIPS4_32R2_NOT_32R6_64R6, FGR_64; 604 INSN_MIPS4_32R2_NOT_32R6_64R6, FGR_64;
575 } 605 }
576 606
577 // Load/store doubleword indexed unaligned. 607 // Load/store doubleword indexed unaligned.
578 // FIXME: This instruction should not be defined for FGR_32. 608 // FIXME: This instruction should not be defined for FGR_32.
579 let AdditionalPredicates = [IsNotNaCl] in { 609 let AdditionalPredicates = [IsNotNaCl, NotInMicroMips] in {
580 def LUXC1 : MMRel, LWXC1_FT<"luxc1", AFGR64Opnd, II_LUXC1>, LWXC1_FM<0x5>, 610 def LUXC1 : MMRel, LWXC1_FT<"luxc1", AFGR64Opnd, II_LUXC1>, LWXC1_FM<0x5>,
581 INSN_MIPS5_32R2_NOT_32R6_64R6, FGR_32; 611 INSN_MIPS5_32R2_NOT_32R6_64R6, FGR_32;
582 def SUXC1 : MMRel, SWXC1_FT<"suxc1", AFGR64Opnd, II_SUXC1>, SWXC1_FM<0xd>, 612 def SUXC1 : MMRel, SWXC1_FT<"suxc1", AFGR64Opnd, II_SUXC1>, SWXC1_FM<0xd>,
583 INSN_MIPS5_32R2_NOT_32R6_64R6, FGR_32; 613 INSN_MIPS5_32R2_NOT_32R6_64R6, FGR_32;
584 } 614 }
585 615
586 let DecoderNamespace="MipsFP64" in { 616 let AdditionalPredicates = [IsNotNaCl, NotInMicroMips],
617 DecoderNamespace="MipsFP64" in {
587 def LUXC164 : LWXC1_FT<"luxc1", FGR64Opnd, II_LUXC1>, LWXC1_FM<0x5>, 618 def LUXC164 : LWXC1_FT<"luxc1", FGR64Opnd, II_LUXC1>, LWXC1_FM<0x5>,
588 INSN_MIPS5_32R2_NOT_32R6_64R6, FGR_64; 619 INSN_MIPS5_32R2_NOT_32R6_64R6, FGR_64;
589 def SUXC164 : SWXC1_FT<"suxc1", FGR64Opnd, II_SUXC1>, SWXC1_FM<0xd>, 620 def SUXC164 : SWXC1_FT<"suxc1", FGR64Opnd, II_SUXC1>, SWXC1_FM<0xd>,
590 INSN_MIPS5_32R2_NOT_32R6_64R6, FGR_64; 621 INSN_MIPS5_32R2_NOT_32R6_64R6, FGR_64;
591 } 622 }
592 623
593 /// Floating-point Aritmetic 624 /// Floating-point Aritmetic
594 let AdditionalPredicates = [NotInMicroMips] in { 625 let AdditionalPredicates = [NotInMicroMips] in {
595 def FADD_S : MMRel, ADDS_FT<"add.s", FGR32Opnd, II_ADD_S, 1, fadd>, 626 def FADD_S : MMRel, ADDS_FT<"add.s", FGR32Opnd, II_ADD_S, 1, fadd>,
596 ADDS_FM<0x00, 16>; 627 ADDS_FM<0x00, 16>, ISA_MIPS1;
597 defm FADD : ADDS_M<"add.d", II_ADD_D, 1, fadd>, ADDS_FM<0x00, 17>; 628 defm FADD : ADDS_M<"add.d", II_ADD_D, 1, fadd>, ADDS_FM<0x00, 17>,
629 ISA_MIPS1;
598 def FDIV_S : MMRel, ADDS_FT<"div.s", FGR32Opnd, II_DIV_S, 0, fdiv>, 630 def FDIV_S : MMRel, ADDS_FT<"div.s", FGR32Opnd, II_DIV_S, 0, fdiv>,
599 ADDS_FM<0x03, 16>; 631 ADDS_FM<0x03, 16>, ISA_MIPS1;
600 defm FDIV : ADDS_M<"div.d", II_DIV_D, 0, fdiv>, ADDS_FM<0x03, 17>; 632 defm FDIV : ADDS_M<"div.d", II_DIV_D, 0, fdiv>, ADDS_FM<0x03, 17>,
633 ISA_MIPS1;
601 def FMUL_S : MMRel, ADDS_FT<"mul.s", FGR32Opnd, II_MUL_S, 1, fmul>, 634 def FMUL_S : MMRel, ADDS_FT<"mul.s", FGR32Opnd, II_MUL_S, 1, fmul>,
602 ADDS_FM<0x02, 16>; 635 ADDS_FM<0x02, 16>, ISA_MIPS1;
603 defm FMUL : ADDS_M<"mul.d", II_MUL_D, 1, fmul>, ADDS_FM<0x02, 17>; 636 defm FMUL : ADDS_M<"mul.d", II_MUL_D, 1, fmul>, ADDS_FM<0x02, 17>,
637 ISA_MIPS1;
604 def FSUB_S : MMRel, ADDS_FT<"sub.s", FGR32Opnd, II_SUB_S, 0, fsub>, 638 def FSUB_S : MMRel, ADDS_FT<"sub.s", FGR32Opnd, II_SUB_S, 0, fsub>,
605 ADDS_FM<0x01, 16>; 639 ADDS_FM<0x01, 16>, ISA_MIPS1;
606 defm FSUB : ADDS_M<"sub.d", II_SUB_D, 0, fsub>, ADDS_FM<0x01, 17>; 640 defm FSUB : ADDS_M<"sub.d", II_SUB_D, 0, fsub>, ADDS_FM<0x01, 17>,
607 } 641 ISA_MIPS1;
608 642 }
609 def MADD_S : MMRel, MADDS_FT<"madd.s", FGR32Opnd, II_MADD_S, fadd>, 643
610 MADDS_FM<4, 0>, INSN_MIPS4_32R2_NOT_32R6_64R6, MADD4; 644 let AdditionalPredicates = [NotInMicroMips, HasMadd4] in {
611 def MSUB_S : MMRel, MADDS_FT<"msub.s", FGR32Opnd, II_MSUB_S, fsub>, 645 def MADD_S : MMRel, MADDS_FT<"madd.s", FGR32Opnd, II_MADD_S, fadd>,
612 MADDS_FM<5, 0>, INSN_MIPS4_32R2_NOT_32R6_64R6, MADD4; 646 MADDS_FM<4, 0>, INSN_MIPS4_32R2_NOT_32R6_64R6;
613 647 def MSUB_S : MMRel, MADDS_FT<"msub.s", FGR32Opnd, II_MSUB_S, fsub>,
614 let AdditionalPredicates = [NoNaNsFPMath, HasMadd4] in { 648 MADDS_FM<5, 0>, INSN_MIPS4_32R2_NOT_32R6_64R6;
649
650 def MADD_D32 : MMRel, MADDS_FT<"madd.d", AFGR64Opnd, II_MADD_D, fadd>,
651 MADDS_FM<4, 1>, INSN_MIPS4_32R2_NOT_32R6_64R6, FGR_32;
652 def MSUB_D32 : MMRel, MADDS_FT<"msub.d", AFGR64Opnd, II_MSUB_D, fsub>,
653 MADDS_FM<5, 1>, INSN_MIPS4_32R2_NOT_32R6_64R6, FGR_32;
654
655 let DecoderNamespace = "MipsFP64" in {
656 def MADD_D64 : MADDS_FT<"madd.d", FGR64Opnd, II_MADD_D, fadd>,
657 MADDS_FM<4, 1>, INSN_MIPS4_32R2_NOT_32R6_64R6, FGR_64;
658 def MSUB_D64 : MADDS_FT<"msub.d", FGR64Opnd, II_MSUB_D, fsub>,
659 MADDS_FM<5, 1>, INSN_MIPS4_32R2_NOT_32R6_64R6, FGR_64;
660 }
661 }
662
663 let AdditionalPredicates = [NoNaNsFPMath, HasMadd4, NotInMicroMips] in {
615 def NMADD_S : MMRel, NMADDS_FT<"nmadd.s", FGR32Opnd, II_NMADD_S, fadd>, 664 def NMADD_S : MMRel, NMADDS_FT<"nmadd.s", FGR32Opnd, II_NMADD_S, fadd>,
616 MADDS_FM<6, 0>, INSN_MIPS4_32R2_NOT_32R6_64R6; 665 MADDS_FM<6, 0>, INSN_MIPS4_32R2_NOT_32R6_64R6;
617 def NMSUB_S : MMRel, NMADDS_FT<"nmsub.s", FGR32Opnd, II_NMSUB_S, fsub>, 666 def NMSUB_S : MMRel, NMADDS_FT<"nmsub.s", FGR32Opnd, II_NMSUB_S, fsub>,
618 MADDS_FM<7, 0>, INSN_MIPS4_32R2_NOT_32R6_64R6; 667 MADDS_FM<7, 0>, INSN_MIPS4_32R2_NOT_32R6_64R6;
619 } 668
620
621 def MADD_D32 : MMRel, MADDS_FT<"madd.d", AFGR64Opnd, II_MADD_D, fadd>,
622 MADDS_FM<4, 1>, INSN_MIPS4_32R2_NOT_32R6_64R6, FGR_32, MADD4;
623 def MSUB_D32 : MMRel, MADDS_FT<"msub.d", AFGR64Opnd, II_MSUB_D, fsub>,
624 MADDS_FM<5, 1>, INSN_MIPS4_32R2_NOT_32R6_64R6, FGR_32, MADD4;
625
626 let AdditionalPredicates = [NoNaNsFPMath, HasMadd4] in {
627 def NMADD_D32 : MMRel, NMADDS_FT<"nmadd.d", AFGR64Opnd, II_NMADD_D, fadd>, 669 def NMADD_D32 : MMRel, NMADDS_FT<"nmadd.d", AFGR64Opnd, II_NMADD_D, fadd>,
628 MADDS_FM<6, 1>, INSN_MIPS4_32R2_NOT_32R6_64R6, FGR_32; 670 MADDS_FM<6, 1>, INSN_MIPS4_32R2_NOT_32R6_64R6, FGR_32;
629 def NMSUB_D32 : MMRel, NMADDS_FT<"nmsub.d", AFGR64Opnd, II_NMSUB_D, fsub>, 671 def NMSUB_D32 : MMRel, NMADDS_FT<"nmsub.d", AFGR64Opnd, II_NMSUB_D, fsub>,
630 MADDS_FM<7, 1>, INSN_MIPS4_32R2_NOT_32R6_64R6, FGR_32; 672 MADDS_FM<7, 1>, INSN_MIPS4_32R2_NOT_32R6_64R6, FGR_32;
631 } 673
632 674 let DecoderNamespace = "MipsFP64" in {
633 let DecoderNamespace = "MipsFP64" in { 675 def NMADD_D64 : NMADDS_FT<"nmadd.d", FGR64Opnd, II_NMADD_D, fadd>,
634 def MADD_D64 : MADDS_FT<"madd.d", FGR64Opnd, II_MADD_D, fadd>, 676 MADDS_FM<6, 1>, INSN_MIPS4_32R2_NOT_32R6_64R6, FGR_64;
635 MADDS_FM<4, 1>, INSN_MIPS4_32R2_NOT_32R6_64R6, FGR_64, MADD4; 677 def NMSUB_D64 : NMADDS_FT<"nmsub.d", FGR64Opnd, II_NMSUB_D, fsub>,
636 def MSUB_D64 : MADDS_FT<"msub.d", FGR64Opnd, II_MSUB_D, fsub>, 678 MADDS_FM<7, 1>, INSN_MIPS4_32R2_NOT_32R6_64R6, FGR_64;
637 MADDS_FM<5, 1>, INSN_MIPS4_32R2_NOT_32R6_64R6, FGR_64, MADD4; 679 }
638 } 680 }
639
640 let AdditionalPredicates = [NoNaNsFPMath, HasMadd4],
641 DecoderNamespace = "MipsFP64" in {
642 def NMADD_D64 : NMADDS_FT<"nmadd.d", FGR64Opnd, II_NMADD_D, fadd>,
643 MADDS_FM<6, 1>, INSN_MIPS4_32R2_NOT_32R6_64R6, FGR_64;
644 def NMSUB_D64 : NMADDS_FT<"nmsub.d", FGR64Opnd, II_NMSUB_D, fsub>,
645 MADDS_FM<7, 1>, INSN_MIPS4_32R2_NOT_32R6_64R6, FGR_64;
646 }
647
648 //===----------------------------------------------------------------------===// 681 //===----------------------------------------------------------------------===//
649 // Floating Point Branch Codes 682 // Floating Point Branch Codes
650 //===----------------------------------------------------------------------===// 683 //===----------------------------------------------------------------------===//
651 // Mips branch codes. These correspond to condcode in MipsInstrInfo.h. 684 // Mips branch codes. These correspond to condcode in MipsInstrInfo.h.
652 // They must be kept in synch. 685 // They must be kept in synch.
752 def LoadImmDoubleFGR : MipsAsmPseudoInst<(outs StrictlyFGR64Opnd:$rd), 785 def LoadImmDoubleFGR : MipsAsmPseudoInst<(outs StrictlyFGR64Opnd:$rd),
753 (ins imm64:$fpimm), 786 (ins imm64:$fpimm),
754 "li.d\t$rd, $fpimm">, 787 "li.d\t$rd, $fpimm">,
755 FGR_64, HARDFLOAT; 788 FGR_64, HARDFLOAT;
756 789
790 def SDC1_M1 : MipsAsmPseudoInst<(outs AFGR64Opnd:$fd),
791 (ins mem_simm16:$addr),
792 "s.d\t$fd, $addr">,
793 FGR_32, ISA_MIPS1, HARDFLOAT;
794
757 //===----------------------------------------------------------------------===// 795 //===----------------------------------------------------------------------===//
758 // InstAliases. 796 // InstAliases.
759 //===----------------------------------------------------------------------===// 797 //===----------------------------------------------------------------------===//
760 def : MipsInstAlias 798 def : MipsInstAlias
761 <"s.s $fd, $addr", (SWC1 FGR32Opnd:$fd, mem_simm16:$addr), 0>, 799 <"s.s $fd, $addr", (SWC1 FGR32Opnd:$fd, mem_simm16:$addr), 0>,
764 <"s.d $fd, $addr", (SDC1 AFGR64Opnd:$fd, mem_simm16:$addr), 0>, 802 <"s.d $fd, $addr", (SDC1 AFGR64Opnd:$fd, mem_simm16:$addr), 0>,
765 FGR_32, ISA_MIPS2, HARDFLOAT; 803 FGR_32, ISA_MIPS2, HARDFLOAT;
766 def : MipsInstAlias 804 def : MipsInstAlias
767 <"s.d $fd, $addr", (SDC164 FGR64Opnd:$fd, mem_simm16:$addr), 0>, 805 <"s.d $fd, $addr", (SDC164 FGR64Opnd:$fd, mem_simm16:$addr), 0>,
768 FGR_64, ISA_MIPS2, HARDFLOAT; 806 FGR_64, ISA_MIPS2, HARDFLOAT;
807 def : MipsInstAlias
808 <"s.d $fd, $addr", (SDC1_M1 AFGR64Opnd:$fd, mem_simm16:$addr), 0>,
809 FGR_32, ISA_MIPS1, HARDFLOAT;
769 810
770 def : MipsInstAlias 811 def : MipsInstAlias
771 <"l.s $fd, $addr", (LWC1 FGR32Opnd:$fd, mem_simm16:$addr), 0>, 812 <"l.s $fd, $addr", (LWC1 FGR32Opnd:$fd, mem_simm16:$addr), 0>,
772 ISA_MIPS2, HARDFLOAT; 813 ISA_MIPS2, HARDFLOAT;
773 def : MipsInstAlias 814 def : MipsInstAlias
851 HARDFLOAT; 892 HARDFLOAT;
852 } 893 }
853 //===----------------------------------------------------------------------===// 894 //===----------------------------------------------------------------------===//
854 // Floating Point Patterns 895 // Floating Point Patterns
855 //===----------------------------------------------------------------------===// 896 //===----------------------------------------------------------------------===//
856 def : MipsPat<(f32 fpimm0), (MTC1 ZERO)>; 897 def : MipsPat<(f32 fpimm0), (MTC1 ZERO)>, ISA_MIPS1;
857 def : MipsPat<(f32 fpimm0neg), (FNEG_S (MTC1 ZERO))>; 898 def : MipsPat<(f32 fpimm0neg), (FNEG_S (MTC1 ZERO))>, ISA_MIPS1;
858 899
859 def : MipsPat<(f32 (sint_to_fp GPR32Opnd:$src)), 900 def : MipsPat<(f32 (sint_to_fp GPR32Opnd:$src)),
860 (PseudoCVT_S_W GPR32Opnd:$src)>; 901 (PseudoCVT_S_W GPR32Opnd:$src)>;
861 def : MipsPat<(MipsTruncIntFP FGR32Opnd:$src), 902 def : MipsPat<(MipsTruncIntFP FGR32Opnd:$src),
862 (TRUNC_W_S FGR32Opnd:$src)>; 903 (TRUNC_W_S FGR32Opnd:$src)>, ISA_MIPS1;
863 904
864 def : MipsPat<(MipsMTC1_D64 GPR32Opnd:$src), 905 def : MipsPat<(MipsMTC1_D64 GPR32Opnd:$src),
865 (MTC1_D64 GPR32Opnd:$src)>, FGR_64; 906 (MTC1_D64 GPR32Opnd:$src)>, ISA_MIPS1, FGR_64;
866 907
867 def : MipsPat<(f64 (sint_to_fp GPR32Opnd:$src)), 908 def : MipsPat<(f64 (sint_to_fp GPR32Opnd:$src)),
868 (PseudoCVT_D32_W GPR32Opnd:$src)>, FGR_32; 909 (PseudoCVT_D32_W GPR32Opnd:$src)>, FGR_32;
869 def : MipsPat<(MipsTruncIntFP AFGR64Opnd:$src), 910 let AdditionalPredicates = [NotInMicroMips] in {
870 (TRUNC_W_D32 AFGR64Opnd:$src)>, FGR_32; 911 def : MipsPat<(MipsTruncIntFP AFGR64Opnd:$src),
871 let AdditionalPredicates = [NotInMicroMips] in { 912 (TRUNC_W_D32 AFGR64Opnd:$src)>, ISA_MIPS2, FGR_32;
872 def : MipsPat<(f32 (fpround AFGR64Opnd:$src)), 913 def : MipsPat<(f32 (fpround AFGR64Opnd:$src)),
873 (CVT_S_D32 AFGR64Opnd:$src)>, FGR_32; 914 (CVT_S_D32 AFGR64Opnd:$src)>, ISA_MIPS1, FGR_32;
874 def : MipsPat<(f64 (fpextend FGR32Opnd:$src)), 915 def : MipsPat<(f64 (fpextend FGR32Opnd:$src)),
875 (CVT_D32_S FGR32Opnd:$src)>, FGR_32; 916 (CVT_D32_S FGR32Opnd:$src)>, ISA_MIPS1, FGR_32;
876 } 917 }
877 918
878 def : MipsPat<(f64 fpimm0), (DMTC1 ZERO_64)>, FGR_64; 919 def : MipsPat<(f64 fpimm0), (DMTC1 ZERO_64)>, ISA_MIPS3, GPR_64, FGR_64;
879 def : MipsPat<(f64 fpimm0neg), (FNEG_D64 (DMTC1 ZERO_64))>, FGR_64; 920 def : MipsPat<(f64 fpimm0neg), (FNEG_D64 (DMTC1 ZERO_64))>, ISA_MIPS3, GPR_64,
921 FGR_64;
880 922
881 def : MipsPat<(f64 (sint_to_fp GPR32Opnd:$src)), 923 def : MipsPat<(f64 (sint_to_fp GPR32Opnd:$src)),
882 (PseudoCVT_D64_W GPR32Opnd:$src)>, FGR_64; 924 (PseudoCVT_D64_W GPR32Opnd:$src)>, FGR_64;
883 def : MipsPat<(f32 (sint_to_fp GPR64Opnd:$src)), 925 def : MipsPat<(f32 (sint_to_fp GPR64Opnd:$src)),
884 (EXTRACT_SUBREG (PseudoCVT_S_L GPR64Opnd:$src), sub_lo)>, FGR_64; 926 (EXTRACT_SUBREG (PseudoCVT_S_L GPR64Opnd:$src), sub_lo)>, FGR_64;
885 def : MipsPat<(f64 (sint_to_fp GPR64Opnd:$src)), 927 def : MipsPat<(f64 (sint_to_fp GPR64Opnd:$src)),
886 (PseudoCVT_D64_L GPR64Opnd:$src)>, FGR_64; 928 (PseudoCVT_D64_L GPR64Opnd:$src)>, FGR_64;
887 929
888 def : MipsPat<(MipsTruncIntFP FGR64Opnd:$src), 930 def : MipsPat<(MipsTruncIntFP FGR64Opnd:$src),
889 (TRUNC_W_D64 FGR64Opnd:$src)>, FGR_64; 931 (TRUNC_W_D64 FGR64Opnd:$src)>, ISA_MIPS2, FGR_64;
890 def : MipsPat<(MipsTruncIntFP FGR32Opnd:$src), 932 def : MipsPat<(MipsTruncIntFP FGR32Opnd:$src),
891 (TRUNC_L_S FGR32Opnd:$src)>, FGR_64; 933 (TRUNC_L_S FGR32Opnd:$src)>, ISA_MIPS2, FGR_64;
892 def : MipsPat<(MipsTruncIntFP FGR64Opnd:$src), 934 def : MipsPat<(MipsTruncIntFP FGR64Opnd:$src),
893 (TRUNC_L_D64 FGR64Opnd:$src)>, FGR_64; 935 (TRUNC_L_D64 FGR64Opnd:$src)>, ISA_MIPS2, FGR_64;
894 936
895 let AdditionalPredicates = [NotInMicroMips] in { 937 let AdditionalPredicates = [NotInMicroMips] in {
896 def : MipsPat<(f32 (fpround FGR64Opnd:$src)), 938 def : MipsPat<(f32 (fpround FGR64Opnd:$src)),
897 (CVT_S_D64 FGR64Opnd:$src)>, FGR_64; 939 (CVT_S_D64 FGR64Opnd:$src)>, ISA_MIPS1, FGR_64;
898 def : MipsPat<(f64 (fpextend FGR32Opnd:$src)), 940 def : MipsPat<(f64 (fpextend FGR32Opnd:$src)),
899 (CVT_D64_S FGR32Opnd:$src)>, FGR_64; 941 (CVT_D64_S FGR32Opnd:$src)>, ISA_MIPS1, FGR_64;
900 } 942 }
901 943
902 // To generate NMADD and NMSUB instructions when fneg node is present 944 // To generate NMADD and NMSUB instructions when fneg node is present
903 multiclass NMADD_NMSUB<Instruction Nmadd, Instruction Nmsub, RegisterOperand RC> { 945 multiclass NMADD_NMSUB<Instruction Nmadd, Instruction Nmsub, RegisterOperand RC> {
904 def : MipsPat<(fneg (fadd (fmul RC:$fs, RC:$ft), RC:$fr)), 946 def : MipsPat<(fneg (fadd (fmul RC:$fs, RC:$ft), RC:$fr)),
914 } 956 }
915 957
916 // Patterns for loads/stores with a reg+imm operand. 958 // Patterns for loads/stores with a reg+imm operand.
917 let AdditionalPredicates = [NotInMicroMips] in { 959 let AdditionalPredicates = [NotInMicroMips] in {
918 let AddedComplexity = 40 in { 960 let AddedComplexity = 40 in {
919 def : LoadRegImmPat<LWC1, f32, load>; 961 def : LoadRegImmPat<LWC1, f32, load>, ISA_MIPS1;
920 def : StoreRegImmPat<SWC1, f32>; 962 def : StoreRegImmPat<SWC1, f32>, ISA_MIPS1;
921 963
922 def : LoadRegImmPat<LDC164, f64, load>, FGR_64; 964 def : LoadRegImmPat<LDC164, f64, load>, ISA_MIPS1, FGR_64;
923 def : StoreRegImmPat<SDC164, f64>, FGR_64; 965 def : StoreRegImmPat<SDC164, f64>, ISA_MIPS1, FGR_64;
924 966
925 def : LoadRegImmPat<LDC1, f64, load>, FGR_32; 967 def : LoadRegImmPat<LDC1, f64, load>, ISA_MIPS1, FGR_32;
926 def : StoreRegImmPat<SDC1, f64>, FGR_32; 968 def : StoreRegImmPat<SDC1, f64>, ISA_MIPS1, FGR_32;
927 } 969 }
928 } 970 }