View | Details | Return to bug 19653 | Differences between
and this patch

Collapse All | Expand All

(-)reload.c (-18 / +41 lines)
Lines 1231-1245 push_reload (rtx in, rtx out, rtx *inloc Link Here
1231
1231
1232
  /* Narrow down the class of register wanted if that is
1232
  /* Narrow down the class of register wanted if that is
1233
     desirable on this machine for efficiency.  */
1233
     desirable on this machine for efficiency.  */
1234
  if (in != 0)
1234
  {
1235
    class = PREFERRED_RELOAD_CLASS (in, class);
1235
    enum reg_class preferred_class = class;
1236
1237
    if (in != 0)
1238
      preferred_class = PREFERRED_RELOAD_CLASS (in, class);
1236
1239
1237
  /* Output reloads may need analogous treatment, different in detail.  */
1240
  /* Output reloads may need analogous treatment, different in detail.  */
1238
#ifdef PREFERRED_OUTPUT_RELOAD_CLASS
1241
#ifdef PREFERRED_OUTPUT_RELOAD_CLASS
1239
  if (out != 0)
1242
    if (out != 0)
1240
    class = PREFERRED_OUTPUT_RELOAD_CLASS (out, class);
1243
      preferred_class = PREFERRED_OUTPUT_RELOAD_CLASS (out, preferred_class);
1241
#endif
1244
#endif
1242
1245
1246
    /* Discard what the target said if we cannot do it.  */
1247
    if (preferred_class != NO_REGS
1248
	|| (optional && type == RELOAD_FOR_OUTPUT))
1249
      class = preferred_class;
1250
  }
1251
1243
  /* Make sure we use a class that can handle the actual pseudo
1252
  /* Make sure we use a class that can handle the actual pseudo
1244
     inside any subreg.  For example, on the 386, QImode regs
1253
     inside any subreg.  For example, on the 386, QImode regs
1245
     can appear within SImode subregs.  Although GENERAL_REGS
1254
     can appear within SImode subregs.  Although GENERAL_REGS
Lines 1937-1943 find_dummy_reload (rtx real_in, rtx real Link Here
1937
1946
1938
  /* Narrow down the reg class, the same way push_reload will;
1947
  /* Narrow down the reg class, the same way push_reload will;
1939
     otherwise we might find a dummy now, but push_reload won't.  */
1948
     otherwise we might find a dummy now, but push_reload won't.  */
1940
  class = PREFERRED_RELOAD_CLASS (in, class);
1949
  {
1950
    enum reg_class preferred_class = PREFERRED_RELOAD_CLASS (in, class);
1951
    if (class != NO_REGS)
1952
      class = preferred_class;
1953
  }
1941
1954
1942
  /* See if OUT will do.  */
1955
  /* See if OUT will do.  */
1943
  if (REG_P (out)
1956
  if (REG_P (out)
Lines 3451-3472 find_reloads (rtx insn, int replace, int Link Here
3451
		    losers++;
3464
		    losers++;
3452
		}
3465
		}
3453
3466
3454
	      /* If we can't reload this value at all, reject this
3455
		 alternative.  Note that we could also lose due to
3456
		 LIMIT_RELOAD_RELOAD_CLASS, but we don't check that
3457
		 here.  */
3458
3459
	      if (! CONSTANT_P (operand)
3460
		  && (enum reg_class) this_alternative[i] != NO_REGS
3461
		  && (PREFERRED_RELOAD_CLASS (operand,
3462
					      (enum reg_class) this_alternative[i])
3463
		      == NO_REGS))
3464
		bad = 1;
3465
3466
	      /* Alternative loses if it requires a type of reload not
3467
	      /* Alternative loses if it requires a type of reload not
3467
		 permitted for this insn.  We can always reload SCRATCH
3468
		 permitted for this insn.  We can always reload SCRATCH
3468
		 and objects with a REG_UNUSED note.  */
3469
		 and objects with a REG_UNUSED note.  */
3469
	      else if (GET_CODE (operand) != SCRATCH
3470
	      if (GET_CODE (operand) != SCRATCH
3470
		       && modified[i] != RELOAD_READ && no_output_reloads
3471
		       && modified[i] != RELOAD_READ && no_output_reloads
3471
		       && ! find_reg_note (insn, REG_UNUSED, operand))
3472
		       && ! find_reg_note (insn, REG_UNUSED, operand))
3472
		bad = 1;
3473
		bad = 1;
Lines 3474-3479 find_reloads (rtx insn, int replace, int Link Here
3474
		       && ! const_to_mem)
3475
		       && ! const_to_mem)
3475
		bad = 1;
3476
		bad = 1;
3476
3477
3478
	      /* If we can't reload this value at all, reject this
3479
		 alternative.  Note that we could also lose due to
3480
		 LIMIT_RELOAD_CLASS, but we don't check that
3481
		 here.  */
3482
3483
	      if (! CONSTANT_P (operand)
3484
		  && (enum reg_class) this_alternative[i] != NO_REGS)
3485
		{
3486
		  if (PREFERRED_RELOAD_CLASS
3487
			(operand, (enum reg_class) this_alternative[i])
3488
		      == NO_REGS)
3489
		    reject = 600;
3490
3491
#ifdef PREFERRED_OUTPUT_RELOAD_CLASS
3492
		  if (operand_type[i] == RELOAD_FOR_OUTPUT
3493
		      && PREFERRED_OUTPUT_RELOAD_CLASS
3494
			   (operand, (enum reg_class) this_alternative[i])
3495
		         == NO_REGS)
3496
		    reject = 600;
3497
#endif
3498
		}
3499
3477
	      /* We prefer to reload pseudos over reloading other things,
3500
	      /* We prefer to reload pseudos over reloading other things,
3478
		 since such reloads may be able to be eliminated later.
3501
		 since such reloads may be able to be eliminated later.
3479
		 If we are reloading a SCRATCH, we won't be generating any
3502
		 If we are reloading a SCRATCH, we won't be generating any
(-)doc/tm.texi (+10 lines)
Lines 2385-2396 Link Here
2385
into any kind of register, code generation will be better if
2385
into any kind of register, code generation will be better if
2386
@code{LEGITIMATE_CONSTANT_P} makes the constant illegitimate instead
2386
@code{LEGITIMATE_CONSTANT_P} makes the constant illegitimate instead
2387
of using @code{PREFERRED_RELOAD_CLASS}.
2387
of using @code{PREFERRED_RELOAD_CLASS}.
2388
2389
If an insn has pseudos in it after register allocation, reload will go
2390
through the alternatives and call repeatedly @code{PREFERRED_RELOAD_CLASS}
2391
to find the best one.  Returning @code{NO_REGS}, in this case, makes
2392
reload add a @code{!} in front of the constraint: the x86 back-end uses
2393
this feature to discourage usage of 387 registers when math is done in
2394
the SSE registers (and vice versa).
2388
@end defmac
2395
@end defmac
2389
2396
2390
@defmac PREFERRED_OUTPUT_RELOAD_CLASS (@var{x}, @var{class})
2397
@defmac PREFERRED_OUTPUT_RELOAD_CLASS (@var{x}, @var{class})
2391
Like @code{PREFERRED_RELOAD_CLASS}, but for output reloads instead of
2398
Like @code{PREFERRED_RELOAD_CLASS}, but for output reloads instead of
2392
input reloads.  If you don't define this macro, the default is to use
2399
input reloads.  If you don't define this macro, the default is to use
2393
@var{class}, unchanged.
2400
@var{class}, unchanged.
2401
2402
You can also use @code{PREFERRED_OUTPUT_RELOAD_CLASS} to discourage
2403
reload from using some alternatives, like @code{PREFERRED_RELOAD_CLASS}.
2394
@end defmac
2404
@end defmac
2395
2405
2396
@defmac LIMIT_RELOAD_CLASS (@var{mode}, @var{class})
2406
@defmac LIMIT_RELOAD_CLASS (@var{mode}, @var{class})
(-)config/i386/i386.c (-7 / +40 lines)
Lines 15411-15425 Link Here
15411
enum reg_class
15411
enum reg_class
15412
ix86_preferred_reload_class (rtx x, enum reg_class class)
15412
ix86_preferred_reload_class (rtx x, enum reg_class class)
15413
{
15413
{
15414
  enum machine_mode mode = GET_MODE (x);
15415
15414
  /* We're only allowed to return a subclass of CLASS.  Many of the 
15416
  /* We're only allowed to return a subclass of CLASS.  Many of the 
15415
     following checks fail for NO_REGS, so eliminate that early.  */
15417
     following checks fail for NO_REGS, so eliminate that early.  */
15416
  if (class == NO_REGS)
15418
  if (class == NO_REGS)
15417
    return NO_REGS;
15419
    return NO_REGS;
15418
15420
15419
  /* All classes can load zeros.  */
15421
  /* All classes can load zeros.  */
15420
  if (x == CONST0_RTX (GET_MODE (x)))
15422
  if (x == CONST0_RTX (mode))
15421
    return class;
15423
    return class;
15422
15424
15425
  /* Force constants into memory if we are loading into MMX or SSE registers,
15426
     because there are no MMX/SSE instructions to load from a constant.  */
15427
  if (CONSTANT_P (x)
15428
      && (MAYBE_MMX_CLASS_P (class) || MAYBE_SSE_CLASS_P (class)))
15429
    return NO_REGS;
15430
15431
  /* Prefer SSE regs only, if we can use them for math.  */
15432
  if (TARGET_SSE_MATH && !TARGET_MIX_SSE_I387 && SSE_FLOAT_MODE_P (mode))
15433
    return SSE_CLASS_P (class) ? class : NO_REGS;
15434
15423
  /* Floating-point constants need more complex checks.  */
15435
  /* Floating-point constants need more complex checks.  */
15424
  if (GET_CODE (x) == CONST_DOUBLE && GET_MODE (x) != VOIDmode)
15436
  if (GET_CODE (x) == CONST_DOUBLE && GET_MODE (x) != VOIDmode)
15425
    {
15437
    {
Lines 15431-15438 Link Here
15431
	 zero above.  We only want to wind up preferring 80387 registers if
15459
	 zero above.  We only want to wind up preferring 80387 registers if
15432
	 we plan on doing computation with them.  */
15460
	 we plan on doing computation with them.  */
15433
      if (TARGET_80387
15461
      if (TARGET_80387
15434
	  && (TARGET_MIX_SSE_I387 
15435
	      || !(TARGET_SSE_MATH && SSE_FLOAT_MODE_P (GET_MODE (x))))
15436
	  && standard_80387_constant_p (x))
15462
	  && standard_80387_constant_p (x))
15437
	{
15463
	{
15438
	  /* Limit class to non-sse.  */
15464
	  /* Limit class to non-sse.  */
Lines 15448-15457 Link Here
15448
15474
15449
      return NO_REGS;
15475
      return NO_REGS;
15450
    }
15476
    }
15451
  if (MAYBE_MMX_CLASS_P (class) && CONSTANT_P (x))
15452
    return NO_REGS;
15453
  if (MAYBE_SSE_CLASS_P (class) && CONSTANT_P (x))
15454
    return NO_REGS;
15455
15477
15456
  /* Generally when we see PLUS here, it's the function invariant
15478
  /* Generally when we see PLUS here, it's the function invariant
15457
     (plus soft-fp const_int).  Which can only be computed into general
15479
     (plus soft-fp const_int).  Which can only be computed into general
Lines 15473-15478 Link Here
15473
  return class;
15495
  return class;
15474
}
15496
}
15475
15497
15498
/* Discourage putting floating-point values in SSE registers unless
15499
   SSE math is being used, and likewise for the 387 registers.  */
15500
enum reg_class
15501
ix86_preferred_output_reload_class (rtx x, enum reg_class class)
15502
{
15503
  enum machine_mode mode = GET_MODE (x);
15504
15505
  /* Restrict the output reload class to the register bank that we are doing
15506
     math on.  If we would like not to return a subset of CLASS, reject this
15507
     alternative: if reload cannot do this, it will still use its choice.  */
15508
  mode = GET_MODE (x);
15509
  if (TARGET_SSE_MATH && SSE_FLOAT_MODE_P (mode))
15510
    return MAYBE_SSE_CLASS_P (class) ? SSE_REGS : NO_REGS;
15511
15512
  if (TARGET_80387 && SCALAR_FLOAT_MODE_P (mode))
15513
    {
15514
      if (class == FP_TOP_SSE_REGS)
15515
	return FP_TOP_REG;
15516
      else if (class == FP_SECOND_SSE_REGS)
15517
	return FP_SECOND_REG;
15518
      else
15519
	return FLOAT_CLASS_P (class) ? class : NO_REGS;
15520
    }
15521
15522
  return class;
15523
}
15524
15476
/* If we are copying between general and FP registers, we need a memory
15525
/* If we are copying between general and FP registers, we need a memory
15477
   location. The same is true for SSE and MMX registers.
15526
   location. The same is true for SSE and MMX registers.
15478
15527
(-)config/i386/i386.h (+6 lines)
Lines 1294-1299 Link Here
1294
#define PREFERRED_RELOAD_CLASS(X, CLASS) \
1294
#define PREFERRED_RELOAD_CLASS(X, CLASS) \
1295
   ix86_preferred_reload_class ((X), (CLASS))
1295
   ix86_preferred_reload_class ((X), (CLASS))
1296
1296
1297
/* Discourage putting floating-point values in SSE registers unless
1298
   SSE math is being used, and likewise for the 387 registers.  */
1299
1300
#define PREFERRED_OUTPUT_RELOAD_CLASS(X, CLASS) \
1301
   ix86_preferred_output_reload_class ((X), (CLASS))
1302
1297
/* If we are copying between general and FP registers, we need a memory
1303
/* If we are copying between general and FP registers, we need a memory
1298
   location. The same is true for SSE and MMX registers.  */
1304
   location. The same is true for SSE and MMX registers.  */
1299
#define SECONDARY_MEMORY_NEEDED(CLASS1, CLASS2, MODE) \
1305
#define SECONDARY_MEMORY_NEEDED(CLASS1, CLASS2, MODE) \
(-)config/i386/i386-protos.h (+1 lines)
Lines 188-193 Link Here
188
extern bool ix86_cannot_change_mode_class (enum machine_mode,
188
extern bool ix86_cannot_change_mode_class (enum machine_mode,
189
					   enum machine_mode, enum reg_class);
189
					   enum machine_mode, enum reg_class);
190
extern enum reg_class ix86_preferred_reload_class (rtx, enum reg_class);
190
extern enum reg_class ix86_preferred_reload_class (rtx, enum reg_class);
191
extern enum reg_class ix86_preferred_output_reload_class (rtx, enum reg_class);
191
extern int ix86_memory_move_cost (enum machine_mode, enum reg_class, int);
192
extern int ix86_memory_move_cost (enum machine_mode, enum reg_class, int);
192
extern int ix86_mode_needed (int, rtx);
193
extern int ix86_mode_needed (int, rtx);
193
extern void emit_i387_cw_initialization (int);
194
extern void emit_i387_cw_initialization (int);
(-)config/i386/i386.md (-55 / +55 lines)
Lines 946-953 Link Here
946
946
947
(define_insn "*cmpfp_i_mixed"
947
(define_insn "*cmpfp_i_mixed"
948
  [(set (reg:CCFP FLAGS_REG)
948
  [(set (reg:CCFP FLAGS_REG)
949
	(compare:CCFP (match_operand 0 "register_operand" "f#x,x#f")
949
	(compare:CCFP (match_operand 0 "register_operand" "f,x")
950
		      (match_operand 1 "nonimmediate_operand" "f#x,xm#f")))]
950
		      (match_operand 1 "nonimmediate_operand" "f,xm")))]
951
  "TARGET_MIX_SSE_I387
951
  "TARGET_MIX_SSE_I387
952
   && SSE_FLOAT_MODE_P (GET_MODE (operands[0]))
952
   && SSE_FLOAT_MODE_P (GET_MODE (operands[0]))
953
   && GET_MODE (operands[0]) == GET_MODE (operands[1])"
953
   && GET_MODE (operands[0]) == GET_MODE (operands[1])"
Lines 995-1002 Link Here
995
995
996
(define_insn "*cmpfp_iu_mixed"
996
(define_insn "*cmpfp_iu_mixed"
997
  [(set (reg:CCFPU FLAGS_REG)
997
  [(set (reg:CCFPU FLAGS_REG)
998
	(compare:CCFPU (match_operand 0 "register_operand" "f#x,x#f")
998
	(compare:CCFPU (match_operand 0 "register_operand" "f,x")
999
		       (match_operand 1 "nonimmediate_operand" "f#x,xm#f")))]
999
		       (match_operand 1 "nonimmediate_operand" "f,xm")))]
1000
  "TARGET_MIX_SSE_I387
1000
  "TARGET_MIX_SSE_I387
1001
   && SSE_FLOAT_MODE_P (GET_MODE (operands[0]))
1001
   && SSE_FLOAT_MODE_P (GET_MODE (operands[0]))
1002
   && GET_MODE (operands[0]) == GET_MODE (operands[1])"
1002
   && GET_MODE (operands[0]) == GET_MODE (operands[1])"
Lines 2197-2203 Link Here
2197
2197
2198
(define_insn "*pushsf"
2198
(define_insn "*pushsf"
2199
  [(set (match_operand:SF 0 "push_operand" "=<,<,<")
2199
  [(set (match_operand:SF 0 "push_operand" "=<,<,<")
2200
	(match_operand:SF 1 "general_no_elim_operand" "f#rx,rFm#fx,x#rf"))]
2200
	(match_operand:SF 1 "general_no_elim_operand" "f,rFm,x"))]
2201
  "!TARGET_64BIT"
2201
  "!TARGET_64BIT"
2202
{
2202
{
2203
  /* Anything else should be already split before reg-stack.  */
2203
  /* Anything else should be already split before reg-stack.  */
Lines 2210-2216 Link Here
2210
2210
2211
(define_insn "*pushsf_rex64"
2211
(define_insn "*pushsf_rex64"
2212
  [(set (match_operand:SF 0 "push_operand" "=X,X,X")
2212
  [(set (match_operand:SF 0 "push_operand" "=X,X,X")
2213
	(match_operand:SF 1 "nonmemory_no_elim_operand" "f#rx,rF#fx,x#rf"))]
2213
	(match_operand:SF 1 "nonmemory_no_elim_operand" "f,rF,x"))]
2214
  "TARGET_64BIT"
2214
  "TARGET_64BIT"
2215
{
2215
{
2216
  /* Anything else should be already split before reg-stack.  */
2216
  /* Anything else should be already split before reg-stack.  */
Lines 2250-2258 Link Here
2250
2250
2251
(define_insn "*movsf_1"
2251
(define_insn "*movsf_1"
2252
  [(set (match_operand:SF 0 "nonimmediate_operand"
2252
  [(set (match_operand:SF 0 "nonimmediate_operand"
2253
	  "=f#xr,m   ,f#xr,r#xf  ,m    ,x#rf,x#rf,x#rf ,m   ,!*y,!rm,!*y")
2253
	  "=f,m   ,f,r,m    ,x,x,x,m   ,!*y,!rm,!*y")
2254
	(match_operand:SF 1 "general_operand"
2254
	(match_operand:SF 1 "general_operand"
2255
	  "fm#rx,f#rx,G   ,rmF#fx,Fr#fx,C   ,x   ,xm#rf,x#rf,rm ,*y ,*y"))]
2255
	  "fm,f,G   ,rmF,Fr,C   ,x   ,xm,x,rm ,*y ,*y"))]
2256
  "!(MEM_P (operands[0]) && MEM_P (operands[1]))
2256
  "!(MEM_P (operands[0]) && MEM_P (operands[1]))
2257
   && (reload_in_progress || reload_completed
2257
   && (reload_in_progress || reload_completed
2258
       || (ix86_cmodel == CM_MEDIUM || ix86_cmodel == CM_LARGE)
2258
       || (ix86_cmodel == CM_MEDIUM || ix86_cmodel == CM_LARGE)
Lines 2365-2371 Link Here
2365
2365
2366
(define_insn "*pushdf_nointeger"
2366
(define_insn "*pushdf_nointeger"
2367
  [(set (match_operand:DF 0 "push_operand" "=<,<,<,<")
2367
  [(set (match_operand:DF 0 "push_operand" "=<,<,<,<")
2368
	(match_operand:DF 1 "general_no_elim_operand" "f#Y,Fo#fY,*r#fY,Y#f"))]
2368
	(match_operand:DF 1 "general_no_elim_operand" "f,Fo,*r,Y"))]
2369
  "!TARGET_64BIT && !TARGET_INTEGER_DFMODE_MOVES"
2369
  "!TARGET_64BIT && !TARGET_INTEGER_DFMODE_MOVES"
2370
{
2370
{
2371
  /* This insn should be already split before reg-stack.  */
2371
  /* This insn should be already split before reg-stack.  */
Lines 2377-2383 Link Here
2377
2377
2378
(define_insn "*pushdf_integer"
2378
(define_insn "*pushdf_integer"
2379
  [(set (match_operand:DF 0 "push_operand" "=<,<,<")
2379
  [(set (match_operand:DF 0 "push_operand" "=<,<,<")
2380
	(match_operand:DF 1 "general_no_elim_operand" "f#rY,rFo#fY,Y#rf"))]
2380
	(match_operand:DF 1 "general_no_elim_operand" "f,rFo,Y"))]
2381
  "TARGET_64BIT || TARGET_INTEGER_DFMODE_MOVES"
2381
  "TARGET_64BIT || TARGET_INTEGER_DFMODE_MOVES"
2382
{
2382
{
2383
  /* This insn should be already split before reg-stack.  */
2383
  /* This insn should be already split before reg-stack.  */
Lines 2417-2425 Link Here
2417
2417
2418
(define_insn "*movdf_nointeger"
2418
(define_insn "*movdf_nointeger"
2419
  [(set (match_operand:DF 0 "nonimmediate_operand"
2419
  [(set (match_operand:DF 0 "nonimmediate_operand"
2420
			"=f#Y,m  ,f#Y,*r  ,o  ,Y*x#f,Y*x#f,Y*x#f  ,m    ")
2420
			"=f,m  ,f,*r  ,o  ,Y*x,Y*x,Y*x,m    ")
2421
	(match_operand:DF 1 "general_operand"
2421
	(match_operand:DF 1 "general_operand"
2422
			"fm#Y,f#Y,G  ,*roF,F*r,C    ,Y*x#f,HmY*x#f,Y*x#f"))]
2422
			"fm,f,G  ,*roF,F*r,C    ,Y*x,HmY*x,Y*x"))]
2423
  "(GET_CODE (operands[0]) != MEM || GET_CODE (operands[1]) != MEM)
2423
  "(GET_CODE (operands[0]) != MEM || GET_CODE (operands[1]) != MEM)
2424
   && ((optimize_size || !TARGET_INTEGER_DFMODE_MOVES) && !TARGET_64BIT)
2424
   && ((optimize_size || !TARGET_INTEGER_DFMODE_MOVES) && !TARGET_64BIT)
2425
   && (reload_in_progress || reload_completed
2425
   && (reload_in_progress || reload_completed
Lines 2537-2545 Link Here
2537
2537
2538
(define_insn "*movdf_integer"
2538
(define_insn "*movdf_integer"
2539
  [(set (match_operand:DF 0 "nonimmediate_operand"
2539
  [(set (match_operand:DF 0 "nonimmediate_operand"
2540
		"=f#Yr,m   ,f#Yr,r#Yf  ,o    ,Y*x#rf,Y*x#rf,Y*x#rf,m")
2540
		"=f,m   ,f,r,o    ,Y*x,Y*x,Y*x,m")
2541
	(match_operand:DF 1 "general_operand"
2541
	(match_operand:DF 1 "general_operand"
2542
		"fm#Yr,f#Yr,G   ,roF#Yf,Fr#Yf,C     ,Y*x#rf,m     ,Y*x#rf"))]
2542
		"fm,f,G   ,roF,Fr,C     ,Y*x,m     ,Y*x"))]
2543
  "(GET_CODE (operands[0]) != MEM || GET_CODE (operands[1]) != MEM)
2543
  "(GET_CODE (operands[0]) != MEM || GET_CODE (operands[1]) != MEM)
2544
   && ((!optimize_size && TARGET_INTEGER_DFMODE_MOVES) || TARGET_64BIT)
2544
   && ((!optimize_size && TARGET_INTEGER_DFMODE_MOVES) || TARGET_64BIT)
2545
   && (reload_in_progress || reload_completed
2545
   && (reload_in_progress || reload_completed
Lines 2712-2718 Link Here
2712
2712
2713
(define_insn "*pushxf_integer"
2713
(define_insn "*pushxf_integer"
2714
  [(set (match_operand:XF 0 "push_operand" "=<,<")
2714
  [(set (match_operand:XF 0 "push_operand" "=<,<")
2715
	(match_operand:XF 1 "general_no_elim_operand" "f#r,ro#f"))]
2715
	(match_operand:XF 1 "general_no_elim_operand" "f,ro"))]
2716
  "!optimize_size"
2716
  "!optimize_size"
2717
{
2717
{
2718
  /* This insn should be already split before reg-stack.  */
2718
  /* This insn should be already split before reg-stack.  */
Lines 2784-2791 Link Here
2784
   (set_attr "mode" "XF,XF,XF,SI,SI")])
2784
   (set_attr "mode" "XF,XF,XF,SI,SI")])
2785
2785
2786
(define_insn "*movxf_integer"
2786
(define_insn "*movxf_integer"
2787
  [(set (match_operand:XF 0 "nonimmediate_operand" "=f#r,m,f#r,r#f,o")
2787
  [(set (match_operand:XF 0 "nonimmediate_operand" "=f,m,f,r,o")
2788
	(match_operand:XF 1 "general_operand" "fm#r,f#r,G,roF#f,Fr#f"))]
2788
	(match_operand:XF 1 "general_operand" "fm,f,G,roF,Fr"))]
2789
  "!optimize_size
2789
  "!optimize_size
2790
   && (GET_CODE (operands[0]) != MEM || GET_CODE (operands[1]) != MEM)
2790
   && (GET_CODE (operands[0]) != MEM || GET_CODE (operands[1]) != MEM)
2791
   && (reload_in_progress || reload_completed
2791
   && (reload_in_progress || reload_completed
Lines 3508-3515 Link Here
3508
})
3508
})
3509
3509
3510
(define_insn "*extendsfdf2_mixed"
3510
(define_insn "*extendsfdf2_mixed"
3511
  [(set (match_operand:DF 0 "nonimmediate_operand" "=f#Y,m#fY,Y#f")
3511
  [(set (match_operand:DF 0 "nonimmediate_operand" "=f,m,Y")
3512
        (float_extend:DF (match_operand:SF 1 "nonimmediate_operand" "fm#Y,f#Y,mY#f")))]
3512
        (float_extend:DF (match_operand:SF 1 "nonimmediate_operand" "fm,f,mY")))]
3513
  "TARGET_SSE2 && TARGET_MIX_SSE_I387
3513
  "TARGET_SSE2 && TARGET_MIX_SSE_I387
3514
   && (GET_CODE (operands[0]) != MEM || GET_CODE (operands[1]) != MEM)"
3514
   && (GET_CODE (operands[0]) != MEM || GET_CODE (operands[1]) != MEM)"
3515
{
3515
{
Lines 3824-3830 Link Here
3824
})
3824
})
3825
3825
3826
(define_insn "*truncxfsf2_mixed"
3826
(define_insn "*truncxfsf2_mixed"
3827
  [(set (match_operand:SF 0 "nonimmediate_operand" "=m,?f#rx,?r#fx,?x#rf")
3827
  [(set (match_operand:SF 0 "nonimmediate_operand" "=m,?f,?r,?x")
3828
	(float_truncate:SF
3828
	(float_truncate:SF
3829
	 (match_operand:XF 1 "register_operand" "f,f,f,f")))
3829
	 (match_operand:XF 1 "register_operand" "f,f,f,f")))
3830
   (clobber (match_operand:SF 2 "memory_operand" "=X,m,m,m"))]
3830
   (clobber (match_operand:SF 2 "memory_operand" "=X,m,m,m"))]
Lines 3851-3857 Link Here
3851
   (set_attr "mode" "SF")])
3851
   (set_attr "mode" "SF")])
3852
3852
3853
(define_insn "*truncxfsf2_i387"
3853
(define_insn "*truncxfsf2_i387"
3854
  [(set (match_operand:SF 0 "nonimmediate_operand" "=m,?f#r,?r#f")
3854
  [(set (match_operand:SF 0 "nonimmediate_operand" "=m,?f,?r")
3855
	(float_truncate:SF
3855
	(float_truncate:SF
3856
	 (match_operand:XF 1 "register_operand" "f,f,f")))
3856
	 (match_operand:XF 1 "register_operand" "f,f,f")))
3857
   (clobber (match_operand:SF 2 "memory_operand" "=X,m,m"))]
3857
   (clobber (match_operand:SF 2 "memory_operand" "=X,m,m"))]
Lines 3922-3928 Link Here
3922
})
3922
})
3923
3923
3924
(define_insn "*truncxfdf2_mixed"
3924
(define_insn "*truncxfdf2_mixed"
3925
  [(set (match_operand:DF 0 "nonimmediate_operand" "=m,?f#rY,?r#fY,?Y#rf")
3925
  [(set (match_operand:DF 0 "nonimmediate_operand" "=m,?f,?r,?Y")
3926
	(float_truncate:DF
3926
	(float_truncate:DF
3927
	 (match_operand:XF 1 "register_operand" "f,f,f,f")))
3927
	 (match_operand:XF 1 "register_operand" "f,f,f,f")))
3928
   (clobber (match_operand:DF 2 "memory_operand" "=X,m,m,m"))]
3928
   (clobber (match_operand:DF 2 "memory_operand" "=X,m,m,m"))]
Lines 3949-3955 Link Here
3949
   (set_attr "mode" "DF")])
3949
   (set_attr "mode" "DF")])
3950
3950
3951
(define_insn "*truncxfdf2_i387"
3951
(define_insn "*truncxfdf2_i387"
3952
  [(set (match_operand:DF 0 "nonimmediate_operand" "=m,?f#r,?r#f")
3952
  [(set (match_operand:DF 0 "nonimmediate_operand" "=m,?f,?r")
3953
	(float_truncate:DF
3953
	(float_truncate:DF
3954
	 (match_operand:XF 1 "register_operand" "f,f,f")))
3954
	 (match_operand:XF 1 "register_operand" "f,f,f")))
3955
   (clobber (match_operand:DF 2 "memory_operand" "=X,m,m"))]
3955
   (clobber (match_operand:DF 2 "memory_operand" "=X,m,m"))]
Lines 4423-4429 Link Here
4423
  "")
4423
  "")
4424
4424
4425
(define_insn "*floatsisf2_mixed"
4425
(define_insn "*floatsisf2_mixed"
4426
  [(set (match_operand:SF 0 "register_operand" "=f#x,?f#x,x#f,x#f")
4426
  [(set (match_operand:SF 0 "register_operand" "=f,?f,x,x")
4427
	(float:SF (match_operand:SI 1 "nonimmediate_operand" "m,r,r,mr")))]
4427
	(float:SF (match_operand:SI 1 "nonimmediate_operand" "m,r,r,mr")))]
4428
  "TARGET_MIX_SSE_I387"
4428
  "TARGET_MIX_SSE_I387"
4429
  "@
4429
  "@
Lines 4466-4472 Link Here
4466
  "")
4466
  "")
4467
4467
4468
(define_insn "*floatdisf2_mixed"
4468
(define_insn "*floatdisf2_mixed"
4469
  [(set (match_operand:SF 0 "register_operand" "=f#x,?f#x,x#f,x#f")
4469
  [(set (match_operand:SF 0 "register_operand" "=f,?f,x,x")
4470
	(float:SF (match_operand:DI 1 "nonimmediate_operand" "m,r,r,mr")))]
4470
	(float:SF (match_operand:DI 1 "nonimmediate_operand" "m,r,r,mr")))]
4471
  "TARGET_64BIT && TARGET_MIX_SSE_I387"
4471
  "TARGET_64BIT && TARGET_MIX_SSE_I387"
4472
  "@
4472
  "@
Lines 4534-4540 Link Here
4534
  "")
4534
  "")
4535
4535
4536
(define_insn "*floatsidf2_mixed"
4536
(define_insn "*floatsidf2_mixed"
4537
  [(set (match_operand:DF 0 "register_operand" "=f#Y,?f#Y,Y#f,Y#f")
4537
  [(set (match_operand:DF 0 "register_operand" "=f,?f,Y,Y")
4538
	(float:DF (match_operand:SI 1 "nonimmediate_operand" "m,r,r,mr")))]
4538
	(float:DF (match_operand:SI 1 "nonimmediate_operand" "m,r,r,mr")))]
4539
  "TARGET_SSE2 && TARGET_MIX_SSE_I387"
4539
  "TARGET_SSE2 && TARGET_MIX_SSE_I387"
4540
  "@
4540
  "@
Lines 4577-4583 Link Here
4577
  "")
4577
  "")
4578
4578
4579
(define_insn "*floatdidf2_mixed"
4579
(define_insn "*floatdidf2_mixed"
4580
  [(set (match_operand:DF 0 "register_operand" "=f#Y,?f#Y,Y#f,Y#f")
4580
  [(set (match_operand:DF 0 "register_operand" "=f,?f,Y,Y")
4581
	(float:DF (match_operand:DI 1 "nonimmediate_operand" "m,r,r,mr")))]
4581
	(float:DF (match_operand:DI 1 "nonimmediate_operand" "m,r,r,mr")))]
4582
  "TARGET_64BIT && TARGET_SSE2 && TARGET_MIX_SSE_I387"
4582
  "TARGET_64BIT && TARGET_SSE2 && TARGET_MIX_SSE_I387"
4583
  "@
4583
  "@
Lines 9383-9391 Link Here
9383
  "ix86_expand_fp_absneg_operator (ABS, SFmode, operands); DONE;")
9383
  "ix86_expand_fp_absneg_operator (ABS, SFmode, operands); DONE;")
9384
9384
9385
(define_insn "*absnegsf2_mixed"
9385
(define_insn "*absnegsf2_mixed"
9386
  [(set (match_operand:SF 0 "nonimmediate_operand"    "=x#f,x#f,f#x,rm")
9386
  [(set (match_operand:SF 0 "nonimmediate_operand"    "=x,x,f,rm")
9387
	(match_operator:SF 3 "absneg_operator"
9387
	(match_operator:SF 3 "absneg_operator"
9388
	  [(match_operand:SF 1 "nonimmediate_operand" "0   ,x#f,0  ,0")]))
9388
	  [(match_operand:SF 1 "nonimmediate_operand" "0   ,x,0  ,0")]))
9389
   (use (match_operand:V4SF 2 "nonimmediate_operand"  "xm  ,0  ,X  ,X"))
9389
   (use (match_operand:V4SF 2 "nonimmediate_operand"  "xm  ,0  ,X  ,X"))
9390
   (clobber (reg:CC FLAGS_REG))]
9390
   (clobber (reg:CC FLAGS_REG))]
9391
  "TARGET_SSE_MATH && TARGET_MIX_SSE_I387
9391
  "TARGET_SSE_MATH && TARGET_MIX_SSE_I387
Lines 9479-9487 Link Here
9479
  "ix86_expand_fp_absneg_operator (ABS, DFmode, operands); DONE;")
9479
  "ix86_expand_fp_absneg_operator (ABS, DFmode, operands); DONE;")
9480
9480
9481
(define_insn "*absnegdf2_mixed"
9481
(define_insn "*absnegdf2_mixed"
9482
  [(set (match_operand:DF 0 "nonimmediate_operand"    "=Y#f,Y#f,f#Y,rm")
9482
  [(set (match_operand:DF 0 "nonimmediate_operand"    "=Y,Y,f,rm")
9483
	(match_operator:DF 3 "absneg_operator"
9483
	(match_operator:DF 3 "absneg_operator"
9484
	  [(match_operand:DF 1 "nonimmediate_operand" "0   ,Y#f,0  ,0")]))
9484
	  [(match_operand:DF 1 "nonimmediate_operand" "0   ,Y,0  ,0")]))
9485
   (use (match_operand:V2DF 2 "nonimmediate_operand"  "Ym  ,0  ,X  ,X"))
9485
   (use (match_operand:V2DF 2 "nonimmediate_operand"  "Ym  ,0  ,X  ,X"))
9486
   (clobber (reg:CC FLAGS_REG))]
9486
   (clobber (reg:CC FLAGS_REG))]
9487
  "TARGET_SSE2 && TARGET_SSE_MATH && TARGET_MIX_SSE_I387
9487
  "TARGET_SSE2 && TARGET_SSE_MATH && TARGET_MIX_SSE_I387
Lines 12723-12730 Link Here
12723
(define_insn "*fp_jcc_1_mixed"
12723
(define_insn "*fp_jcc_1_mixed"
12724
  [(set (pc)
12724
  [(set (pc)
12725
	(if_then_else (match_operator 0 "comparison_operator"
12725
	(if_then_else (match_operator 0 "comparison_operator"
12726
			[(match_operand 1 "register_operand" "f#x,x#f")
12726
			[(match_operand 1 "register_operand" "f,x")
12727
			 (match_operand 2 "nonimmediate_operand" "f#x,xm#f")])
12727
			 (match_operand 2 "nonimmediate_operand" "f,xm")])
12728
	  (label_ref (match_operand 3 "" ""))
12728
	  (label_ref (match_operand 3 "" ""))
12729
	  (pc)))
12729
	  (pc)))
12730
   (clobber (reg:CCFP FPSR_REG))
12730
   (clobber (reg:CCFP FPSR_REG))
Lines 12768-12775 Link Here
12768
(define_insn "*fp_jcc_2_mixed"
12768
(define_insn "*fp_jcc_2_mixed"
12769
  [(set (pc)
12769
  [(set (pc)
12770
	(if_then_else (match_operator 0 "comparison_operator"
12770
	(if_then_else (match_operator 0 "comparison_operator"
12771
			[(match_operand 1 "register_operand" "f#x,x#f")
12771
			[(match_operand 1 "register_operand" "f,x")
12772
			 (match_operand 2 "nonimmediate_operand" "f#x,xm#f")])
12772
			 (match_operand 2 "nonimmediate_operand" "f,xm")])
12773
	  (pc)
12773
	  (pc)
12774
	  (label_ref (match_operand 3 "" ""))))
12774
	  (label_ref (match_operand 3 "" ""))))
12775
   (clobber (reg:CCFP FPSR_REG))
12775
   (clobber (reg:CCFP FPSR_REG))
Lines 13906-13915 Link Here
13906
;; so use special patterns for add and mull.
13906
;; so use special patterns for add and mull.
13907
13907
13908
(define_insn "*fop_sf_comm_mixed"
13908
(define_insn "*fop_sf_comm_mixed"
13909
  [(set (match_operand:SF 0 "register_operand" "=f#x,x#f")
13909
  [(set (match_operand:SF 0 "register_operand" "=f,x")
13910
	(match_operator:SF 3 "binary_fp_operator"
13910
	(match_operator:SF 3 "binary_fp_operator"
13911
			[(match_operand:SF 1 "nonimmediate_operand" "%0,0")
13911
			[(match_operand:SF 1 "nonimmediate_operand" "%0,0")
13912
			 (match_operand:SF 2 "nonimmediate_operand" "fm#x,xm#f")]))]
13912
			 (match_operand:SF 2 "nonimmediate_operand" "fm,xm")]))]
13913
  "TARGET_MIX_SSE_I387
13913
  "TARGET_MIX_SSE_I387
13914
   && COMMUTATIVE_ARITH_P (operands[3])
13914
   && COMMUTATIVE_ARITH_P (operands[3])
13915
   && (GET_CODE (operands[1]) != MEM || GET_CODE (operands[2]) != MEM)"
13915
   && (GET_CODE (operands[1]) != MEM || GET_CODE (operands[2]) != MEM)"
Lines 13958-13964 Link Here
13958
  [(set (match_operand:SF 0 "register_operand" "=f,f,x")
13958
  [(set (match_operand:SF 0 "register_operand" "=f,f,x")
13959
	(match_operator:SF 3 "binary_fp_operator"
13959
	(match_operator:SF 3 "binary_fp_operator"
13960
			[(match_operand:SF 1 "nonimmediate_operand" "0,fm,0")
13960
			[(match_operand:SF 1 "nonimmediate_operand" "0,fm,0")
13961
			 (match_operand:SF 2 "nonimmediate_operand" "fm,0,xm#f")]))]
13961
			 (match_operand:SF 2 "nonimmediate_operand" "fm,0,xm")]))]
13962
  "TARGET_MIX_SSE_I387
13962
  "TARGET_MIX_SSE_I387
13963
   && !COMMUTATIVE_ARITH_P (operands[3])
13963
   && !COMMUTATIVE_ARITH_P (operands[3])
13964
   && (GET_CODE (operands[1]) != MEM || GET_CODE (operands[2]) != MEM)"
13964
   && (GET_CODE (operands[1]) != MEM || GET_CODE (operands[2]) != MEM)"
Lines 14052-14061 Link Here
14052
   (set_attr "mode" "<MODE>")])
14052
   (set_attr "mode" "<MODE>")])
14053
14053
14054
(define_insn "*fop_df_comm_mixed"
14054
(define_insn "*fop_df_comm_mixed"
14055
  [(set (match_operand:DF 0 "register_operand" "=f#Y,Y#f")
14055
  [(set (match_operand:DF 0 "register_operand" "=f,Y")
14056
	(match_operator:DF 3 "binary_fp_operator"
14056
	(match_operator:DF 3 "binary_fp_operator"
14057
			[(match_operand:DF 1 "nonimmediate_operand" "%0,0")
14057
			[(match_operand:DF 1 "nonimmediate_operand" "%0,0")
14058
			 (match_operand:DF 2 "nonimmediate_operand" "fm#Y,Ym#f")]))]
14058
			 (match_operand:DF 2 "nonimmediate_operand" "fm,Ym")]))]
14059
  "TARGET_SSE2 && TARGET_MIX_SSE_I387
14059
  "TARGET_SSE2 && TARGET_MIX_SSE_I387
14060
   && COMMUTATIVE_ARITH_P (operands[3])
14060
   && COMMUTATIVE_ARITH_P (operands[3])
14061
   && (GET_CODE (operands[1]) != MEM || GET_CODE (operands[2]) != MEM)"
14061
   && (GET_CODE (operands[1]) != MEM || GET_CODE (operands[2]) != MEM)"
Lines 14101-14110 Link Here
14101
   (set_attr "mode" "DF")])
14101
   (set_attr "mode" "DF")])
14102
14102
14103
(define_insn "*fop_df_1_mixed"
14103
(define_insn "*fop_df_1_mixed"
14104
  [(set (match_operand:DF 0 "register_operand" "=f#Y,f#Y,Y#f")
14104
  [(set (match_operand:DF 0 "register_operand" "=f,f,Y")
14105
	(match_operator:DF 3 "binary_fp_operator"
14105
	(match_operator:DF 3 "binary_fp_operator"
14106
			[(match_operand:DF 1 "nonimmediate_operand" "0,fm,0")
14106
			[(match_operand:DF 1 "nonimmediate_operand" "0,fm,0")
14107
			 (match_operand:DF 2 "nonimmediate_operand" "fm,0,Ym#f")]))]
14107
			 (match_operand:DF 2 "nonimmediate_operand" "fm,0,Ym")]))]
14108
  "TARGET_SSE2 && TARGET_SSE_MATH && TARGET_MIX_SSE_I387
14108
  "TARGET_SSE2 && TARGET_SSE_MATH && TARGET_MIX_SSE_I387
14109
   && !COMMUTATIVE_ARITH_P (operands[3])
14109
   && !COMMUTATIVE_ARITH_P (operands[3])
14110
   && (GET_CODE (operands[1]) != MEM || GET_CODE (operands[2]) != MEM)"
14110
   && (GET_CODE (operands[1]) != MEM || GET_CODE (operands[2]) != MEM)"
Lines 14419-14426 Link Here
14419
})
14419
})
14420
14420
14421
(define_insn "*sqrtsf2_mixed"
14421
(define_insn "*sqrtsf2_mixed"
14422
  [(set (match_operand:SF 0 "register_operand" "=f#x,x#f")
14422
  [(set (match_operand:SF 0 "register_operand" "=f,x")
14423
	(sqrt:SF (match_operand:SF 1 "nonimmediate_operand" "0#x,xm#f")))]
14423
	(sqrt:SF (match_operand:SF 1 "nonimmediate_operand" "0,xm")))]
14424
  "TARGET_USE_FANCY_MATH_387 && TARGET_MIX_SSE_I387"
14424
  "TARGET_USE_FANCY_MATH_387 && TARGET_MIX_SSE_I387"
14425
  "@
14425
  "@
14426
   fsqrt
14426
   fsqrt
Lines 14457-14464 Link Here
14457
})
14457
})
14458
14458
14459
(define_insn "*sqrtdf2_mixed"
14459
(define_insn "*sqrtdf2_mixed"
14460
  [(set (match_operand:DF 0 "register_operand" "=f#Y,Y#f")
14460
  [(set (match_operand:DF 0 "register_operand" "=f,Y")
14461
	(sqrt:DF (match_operand:DF 1 "nonimmediate_operand" "0#Y,Ym#f")))]
14461
	(sqrt:DF (match_operand:DF 1 "nonimmediate_operand" "0,Ym")))]
14462
  "TARGET_USE_FANCY_MATH_387 && TARGET_SSE2 && TARGET_MIX_SSE_I387"
14462
  "TARGET_USE_FANCY_MATH_387 && TARGET_SSE2 && TARGET_MIX_SSE_I387"
14463
  "@
14463
  "@
14464
   fsqrt
14464
   fsqrt
Lines 17921-17931 Link Here
17921
  "if (! ix86_expand_fp_movcc (operands)) FAIL; DONE;")
17921
  "if (! ix86_expand_fp_movcc (operands)) FAIL; DONE;")
17922
17922
17923
(define_insn "*movsfcc_1_387"
17923
(define_insn "*movsfcc_1_387"
17924
  [(set (match_operand:SF 0 "register_operand" "=f#r,f#r,r#f,r#f")
17924
  [(set (match_operand:SF 0 "register_operand" "=f,f,r,r")
17925
	(if_then_else:SF (match_operator 1 "fcmov_comparison_operator" 
17925
	(if_then_else:SF (match_operator 1 "fcmov_comparison_operator" 
17926
				[(reg FLAGS_REG) (const_int 0)])
17926
				[(reg FLAGS_REG) (const_int 0)])
17927
		      (match_operand:SF 2 "nonimmediate_operand" "f#r,0,rm#f,0")
17927
		      (match_operand:SF 2 "nonimmediate_operand" "f,0,rm,0")
17928
		      (match_operand:SF 3 "nonimmediate_operand" "0,f#r,0,rm#f")))]
17928
		      (match_operand:SF 3 "nonimmediate_operand" "0,f,0,rm")))]
17929
  "TARGET_80387 && TARGET_CMOVE
17929
  "TARGET_80387 && TARGET_CMOVE
17930
   && (GET_CODE (operands[2]) != MEM || GET_CODE (operands[3]) != MEM)"
17930
   && (GET_CODE (operands[2]) != MEM || GET_CODE (operands[3]) != MEM)"
17931
  "@
17931
  "@
Lines 17945-17955 Link Here
17945
  "if (! ix86_expand_fp_movcc (operands)) FAIL; DONE;")
17945
  "if (! ix86_expand_fp_movcc (operands)) FAIL; DONE;")
17946
17946
17947
(define_insn "*movdfcc_1"
17947
(define_insn "*movdfcc_1"
17948
  [(set (match_operand:DF 0 "register_operand" "=f#r,f#r,&r#f,&r#f")
17948
  [(set (match_operand:DF 0 "register_operand" "=f,f,&r,&r")
17949
	(if_then_else:DF (match_operator 1 "fcmov_comparison_operator" 
17949
	(if_then_else:DF (match_operator 1 "fcmov_comparison_operator" 
17950
				[(reg FLAGS_REG) (const_int 0)])
17950
				[(reg FLAGS_REG) (const_int 0)])
17951
		      (match_operand:DF 2 "nonimmediate_operand" "f#r,0,rm#f,0")
17951
		      (match_operand:DF 2 "nonimmediate_operand" "f,0,rm,0")
17952
		      (match_operand:DF 3 "nonimmediate_operand" "0,f#r,0,rm#f")))]
17952
		      (match_operand:DF 3 "nonimmediate_operand" "0,f,0,rm")))]
17953
  "!TARGET_64BIT && TARGET_80387 && TARGET_CMOVE
17953
  "!TARGET_64BIT && TARGET_80387 && TARGET_CMOVE
17954
   && (GET_CODE (operands[2]) != MEM || GET_CODE (operands[3]) != MEM)"
17954
   && (GET_CODE (operands[2]) != MEM || GET_CODE (operands[3]) != MEM)"
17955
  "@
17955
  "@
Lines 17961-17971 Link Here
17961
   (set_attr "mode" "DF")])
17961
   (set_attr "mode" "DF")])
17962
17962
17963
(define_insn "*movdfcc_1_rex64"
17963
(define_insn "*movdfcc_1_rex64"
17964
  [(set (match_operand:DF 0 "register_operand" "=f#r,f#r,r#f,r#f")
17964
  [(set (match_operand:DF 0 "register_operand" "=f,f,r,r")
17965
	(if_then_else:DF (match_operator 1 "fcmov_comparison_operator" 
17965
	(if_then_else:DF (match_operator 1 "fcmov_comparison_operator" 
17966
				[(reg FLAGS_REG) (const_int 0)])
17966
				[(reg FLAGS_REG) (const_int 0)])
17967
		      (match_operand:DF 2 "nonimmediate_operand" "f#r,0#r,rm#f,0#f")
17967
		      (match_operand:DF 2 "nonimmediate_operand" "f,0,rm,0")
17968
		      (match_operand:DF 3 "nonimmediate_operand" "0#r,f#r,0#f,rm#f")))]
17968
		      (match_operand:DF 3 "nonimmediate_operand" "0,f,0,rm")))]
17969
  "TARGET_64BIT && TARGET_80387 && TARGET_CMOVE
17969
  "TARGET_64BIT && TARGET_80387 && TARGET_CMOVE
17970
   && (GET_CODE (operands[2]) != MEM || GET_CODE (operands[3]) != MEM)"
17970
   && (GET_CODE (operands[2]) != MEM || GET_CODE (operands[3]) != MEM)"
17971
  "@
17971
  "@

Return to bug 19653