Mercurial > hg > CbC > CbC_gcc
comparison gcc/config/arm/vfp.md @ 131:84e7813d76e9
gcc-8.2
author | mir3636 |
---|---|
date | Thu, 25 Oct 2018 07:37:49 +0900 |
parents | 04ced10e8804 |
children | 1830386684a0 |
comparison
equal
deleted
inserted
replaced
111:04ced10e8804 | 131:84e7813d76e9 |
---|---|
1 ;; ARM VFP instruction patterns | 1 ;; ARM VFP instruction patterns |
2 ;; Copyright (C) 2003-2017 Free Software Foundation, Inc. | 2 ;; Copyright (C) 2003-2018 Free Software Foundation, Inc. |
3 ;; Written by CodeSourcery. | 3 ;; Written by CodeSourcery. |
4 ;; | 4 ;; |
5 ;; This file is part of GCC. | 5 ;; This file is part of GCC. |
6 ;; | 6 ;; |
7 ;; GCC is free software; you can redistribute it and/or modify it | 7 ;; GCC is free software; you can redistribute it and/or modify it |
302 | 302 |
303 | 303 |
304 ;; DImode moves | 304 ;; DImode moves |
305 | 305 |
306 (define_insn "*movdi_vfp" | 306 (define_insn "*movdi_vfp" |
307 [(set (match_operand:DI 0 "nonimmediate_di_operand" "=r,r,r,r,q,q,m,w,r,w,w, Uv") | 307 [(set (match_operand:DI 0 "nonimmediate_di_operand" "=r,r,r,r,q,q,m,w,!r,w,w, Uv") |
308 (match_operand:DI 1 "di_operand" "r,rDa,Db,Dc,mi,mi,q,r,w,w,Uvi,w"))] | 308 (match_operand:DI 1 "di_operand" "r,rDa,Db,Dc,mi,mi,q,r,w,w,Uvi,w"))] |
309 "TARGET_32BIT && TARGET_HARD_FLOAT && arm_tune != TARGET_CPU_cortexa8 | 309 "TARGET_32BIT && TARGET_HARD_FLOAT |
310 && ( register_operand (operands[0], DImode) | 310 && ( register_operand (operands[0], DImode) |
311 || register_operand (operands[1], DImode)) | 311 || register_operand (operands[1], DImode)) |
312 && !(TARGET_NEON && CONST_INT_P (operands[1]) | 312 && !(TARGET_NEON && CONST_INT_P (operands[1]) |
313 && neon_immediate_valid_for_move (operands[1], DImode, NULL, NULL))" | 313 && neon_immediate_valid_for_move (operands[1], DImode, NULL, NULL))" |
314 "* | 314 "* |
337 default: | 337 default: |
338 gcc_unreachable (); | 338 gcc_unreachable (); |
339 } | 339 } |
340 " | 340 " |
341 [(set_attr "type" "multiple,multiple,multiple,multiple,load_8,load_8,store_8,f_mcrr,f_mrrc,ffarithd,f_loadd,f_stored") | 341 [(set_attr "type" "multiple,multiple,multiple,multiple,load_8,load_8,store_8,f_mcrr,f_mrrc,ffarithd,f_loadd,f_stored") |
342 (set (attr "length") (cond [(eq_attr "alternative" "1,4,5,6") (const_int 8) | 342 (set (attr "length") (cond [(eq_attr "alternative" "1") (const_int 8) |
343 (eq_attr "alternative" "2") (const_int 12) | 343 (eq_attr "alternative" "2") (const_int 12) |
344 (eq_attr "alternative" "3") (const_int 16) | 344 (eq_attr "alternative" "3") (const_int 16) |
345 (eq_attr "alternative" "4,5,6") | |
346 (symbol_ref "arm_count_output_move_double_insns (operands) * 4") | |
345 (eq_attr "alternative" "9") | 347 (eq_attr "alternative" "9") |
346 (if_then_else | 348 (if_then_else |
347 (match_test "TARGET_VFP_SINGLE") | 349 (match_test "TARGET_VFP_SINGLE") |
348 (const_int 8) | 350 (const_int 8) |
349 (const_int 4))] | 351 (const_int 4))] |
350 (const_int 4))) | 352 (const_int 4))) |
353 (set_attr "predicable" "yes") | |
351 (set_attr "arm_pool_range" "*,*,*,*,1020,4096,*,*,*,*,1020,*") | 354 (set_attr "arm_pool_range" "*,*,*,*,1020,4096,*,*,*,*,1020,*") |
352 (set_attr "thumb2_pool_range" "*,*,*,*,1018,4094,*,*,*,*,1018,*") | 355 (set_attr "thumb2_pool_range" "*,*,*,*,1018,4094,*,*,*,*,1018,*") |
353 (set_attr "neg_pool_range" "*,*,*,*,1004,0,*,*,*,*,1004,*") | 356 (set_attr "neg_pool_range" "*,*,*,*,1004,0,*,*,*,*,1004,*") |
357 (set (attr "ce_count") (symbol_ref "get_attr_length (insn) / 4")) | |
354 (set_attr "arch" "t2,any,any,any,a,t2,any,any,any,any,any,any")] | 358 (set_attr "arch" "t2,any,any,any,a,t2,any,any,any,any,any,any")] |
355 ) | 359 ) |
356 | |
357 (define_insn "*movdi_vfp_cortexa8" | |
358 [(set (match_operand:DI 0 "nonimmediate_di_operand" "=r,r,r,r,q,q,m,w,!r,w,w, Uv") | |
359 (match_operand:DI 1 "di_operand" "r,rDa,Db,Dc,mi,mi,q,r,w,w,Uvi,w"))] | |
360 "TARGET_32BIT && TARGET_HARD_FLOAT && arm_tune == TARGET_CPU_cortexa8 | |
361 && ( register_operand (operands[0], DImode) | |
362 || register_operand (operands[1], DImode)) | |
363 && !(TARGET_NEON && CONST_INT_P (operands[1]) | |
364 && neon_immediate_valid_for_move (operands[1], DImode, NULL, NULL))" | |
365 "* | |
366 switch (which_alternative) | |
367 { | |
368 case 0: | |
369 case 1: | |
370 case 2: | |
371 case 3: | |
372 return \"#\"; | |
373 case 4: | |
374 case 5: | |
375 case 6: | |
376 return output_move_double (operands, true, NULL); | |
377 case 7: | |
378 return \"vmov%?\\t%P0, %Q1, %R1\\t%@ int\"; | |
379 case 8: | |
380 return \"vmov%?\\t%Q0, %R0, %P1\\t%@ int\"; | |
381 case 9: | |
382 return \"vmov%?.f64\\t%P0, %P1\\t%@ int\"; | |
383 case 10: case 11: | |
384 return output_move_vfp (operands); | |
385 default: | |
386 gcc_unreachable (); | |
387 } | |
388 " | |
389 [(set_attr "type" "multiple,multiple,multiple,multiple,load_8,load_8,store_8,f_mcrr,f_mrrc,ffarithd,f_loadd,f_stored") | |
390 (set (attr "length") (cond [(eq_attr "alternative" "1") (const_int 8) | |
391 (eq_attr "alternative" "2") (const_int 12) | |
392 (eq_attr "alternative" "3") (const_int 16) | |
393 (eq_attr "alternative" "4,5,6") | |
394 (symbol_ref | |
395 "arm_count_output_move_double_insns (operands) \ | |
396 * 4")] | |
397 (const_int 4))) | |
398 (set_attr "predicable" "yes") | |
399 (set_attr "arm_pool_range" "*,*,*,*,1018,4094,*,*,*,*,1018,*") | |
400 (set_attr "thumb2_pool_range" "*,*,*,*,1018,4094,*,*,*,*,1018,*") | |
401 (set_attr "neg_pool_range" "*,*,*,*,1004,0,*,*,*,*,1004,*") | |
402 (set (attr "ce_count") | |
403 (symbol_ref "get_attr_length (insn) / 4")) | |
404 (set_attr "arch" "t2,any,any,any,a,t2,any,any,any,any,any,any")] | |
405 ) | |
406 | 360 |
407 ;; HFmode moves | 361 ;; HFmode moves |
408 | 362 |
409 (define_insn "*movhf_vfp_fp16" | 363 (define_insn "*movhf_vfp_fp16" |
410 [(set (match_operand:HF 0 "nonimmediate_operand" | 364 [(set (match_operand:HF 0 "nonimmediate_operand" |
454 } | 408 } |
455 default: | 409 default: |
456 gcc_unreachable (); | 410 gcc_unreachable (); |
457 } | 411 } |
458 } | 412 } |
459 [(set_attr "predicable" "yes, yes, no, yes, no, no, no, no, no, no") | 413 [(set_attr "conds" "*, *, unconditional, *, unconditional, unconditional,\ |
414 unconditional, unconditional, unconditional,\ | |
415 unconditional") | |
416 (set_attr "predicable" "yes, yes, no, yes, no, no, no, no, no, no") | |
460 (set_attr "predicable_short_it" "no, no, no, yes,\ | 417 (set_attr "predicable_short_it" "no, no, no, yes,\ |
461 no, no, no, no,\ | 418 no, no, no, no,\ |
462 no, no") | 419 no, no") |
463 (set_attr_alternative "type" | 420 (set_attr_alternative "type" |
464 [(const_string "load_4") (const_string "store_4") | 421 [(const_string "load_4") (const_string "store_4") |
656 default: | 613 default: |
657 gcc_unreachable (); | 614 gcc_unreachable (); |
658 } | 615 } |
659 " | 616 " |
660 [(set_attr "predicable" "yes") | 617 [(set_attr "predicable" "yes") |
661 (set_attr "predicable_short_it" "no") | |
662 (set_attr "type" | 618 (set_attr "type" |
663 "f_mcr,f_mrc,fconsts,f_loads,f_stores,load_4,store_4,fmov,mov_reg") | 619 "f_mcr,f_mrc,fconsts,f_loads,f_stores,load_4,store_4,fmov,mov_reg") |
664 (set_attr "pool_range" "*,*,*,1018,*,4090,*,*,*") | 620 (set_attr "pool_range" "*,*,*,1018,*,4090,*,*,*") |
665 (set_attr "neg_pool_range" "*,*,*,1008,*,0,*,*,*")] | 621 (set_attr "neg_pool_range" "*,*,*,1008,*,0,*,*,*")] |
666 ) | 622 ) |
868 [(set (match_operand:SF 0 "s_register_operand" "=t") | 824 [(set (match_operand:SF 0 "s_register_operand" "=t") |
869 (abs:SF (match_operand:SF 1 "s_register_operand" "t")))] | 825 (abs:SF (match_operand:SF 1 "s_register_operand" "t")))] |
870 "TARGET_32BIT && TARGET_HARD_FLOAT" | 826 "TARGET_32BIT && TARGET_HARD_FLOAT" |
871 "vabs%?.f32\\t%0, %1" | 827 "vabs%?.f32\\t%0, %1" |
872 [(set_attr "predicable" "yes") | 828 [(set_attr "predicable" "yes") |
873 (set_attr "predicable_short_it" "no") | |
874 (set_attr "type" "ffariths")] | 829 (set_attr "type" "ffariths")] |
875 ) | 830 ) |
876 | 831 |
877 (define_insn "*absdf2_vfp" | 832 (define_insn "*absdf2_vfp" |
878 [(set (match_operand:DF 0 "s_register_operand" "=w") | 833 [(set (match_operand:DF 0 "s_register_operand" "=w") |
879 (abs:DF (match_operand:DF 1 "s_register_operand" "w")))] | 834 (abs:DF (match_operand:DF 1 "s_register_operand" "w")))] |
880 "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP_DOUBLE" | 835 "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP_DOUBLE" |
881 "vabs%?.f64\\t%P0, %P1" | 836 "vabs%?.f64\\t%P0, %P1" |
882 [(set_attr "predicable" "yes") | 837 [(set_attr "predicable" "yes") |
883 (set_attr "predicable_short_it" "no") | |
884 (set_attr "type" "ffarithd")] | 838 (set_attr "type" "ffarithd")] |
885 ) | 839 ) |
886 | 840 |
887 (define_insn "*negsf2_vfp" | 841 (define_insn "*negsf2_vfp" |
888 [(set (match_operand:SF 0 "s_register_operand" "=t,?r") | 842 [(set (match_operand:SF 0 "s_register_operand" "=t,?r") |
890 "TARGET_32BIT && TARGET_HARD_FLOAT" | 844 "TARGET_32BIT && TARGET_HARD_FLOAT" |
891 "@ | 845 "@ |
892 vneg%?.f32\\t%0, %1 | 846 vneg%?.f32\\t%0, %1 |
893 eor%?\\t%0, %1, #-2147483648" | 847 eor%?\\t%0, %1, #-2147483648" |
894 [(set_attr "predicable" "yes") | 848 [(set_attr "predicable" "yes") |
895 (set_attr "predicable_short_it" "no") | |
896 (set_attr "type" "ffariths")] | 849 (set_attr "type" "ffariths")] |
897 ) | 850 ) |
898 | 851 |
899 (define_insn_and_split "*negdf2_vfp" | 852 (define_insn_and_split "*negdf2_vfp" |
900 [(set (match_operand:DF 0 "s_register_operand" "=w,?r,?r") | 853 [(set (match_operand:DF 0 "s_register_operand" "=w,?r,?r") |
936 operands[1] = in_lo; | 889 operands[1] = in_lo; |
937 } | 890 } |
938 } | 891 } |
939 " | 892 " |
940 [(set_attr "predicable" "yes") | 893 [(set_attr "predicable" "yes") |
941 (set_attr "predicable_short_it" "no") | |
942 (set_attr "length" "4,4,8") | 894 (set_attr "length" "4,4,8") |
943 (set_attr "type" "ffarithd")] | 895 (set_attr "type" "ffarithd")] |
944 ) | 896 ) |
945 | 897 |
946 ;; ABS and NEG for FP16. | 898 ;; ABS and NEG for FP16. |
1005 (plus:SF (match_operand:SF 1 "s_register_operand" "t") | 957 (plus:SF (match_operand:SF 1 "s_register_operand" "t") |
1006 (match_operand:SF 2 "s_register_operand" "t")))] | 958 (match_operand:SF 2 "s_register_operand" "t")))] |
1007 "TARGET_32BIT && TARGET_HARD_FLOAT" | 959 "TARGET_32BIT && TARGET_HARD_FLOAT" |
1008 "vadd%?.f32\\t%0, %1, %2" | 960 "vadd%?.f32\\t%0, %1, %2" |
1009 [(set_attr "predicable" "yes") | 961 [(set_attr "predicable" "yes") |
1010 (set_attr "predicable_short_it" "no") | |
1011 (set_attr "type" "fadds")] | 962 (set_attr "type" "fadds")] |
1012 ) | 963 ) |
1013 | 964 |
1014 (define_insn "*adddf3_vfp" | 965 (define_insn "*adddf3_vfp" |
1015 [(set (match_operand:DF 0 "s_register_operand" "=w") | 966 [(set (match_operand:DF 0 "s_register_operand" "=w") |
1016 (plus:DF (match_operand:DF 1 "s_register_operand" "w") | 967 (plus:DF (match_operand:DF 1 "s_register_operand" "w") |
1017 (match_operand:DF 2 "s_register_operand" "w")))] | 968 (match_operand:DF 2 "s_register_operand" "w")))] |
1018 "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP_DOUBLE" | 969 "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP_DOUBLE" |
1019 "vadd%?.f64\\t%P0, %P1, %P2" | 970 "vadd%?.f64\\t%P0, %P1, %P2" |
1020 [(set_attr "predicable" "yes") | 971 [(set_attr "predicable" "yes") |
1021 (set_attr "predicable_short_it" "no") | |
1022 (set_attr "type" "faddd")] | 972 (set_attr "type" "faddd")] |
1023 ) | 973 ) |
1024 | 974 |
1025 (define_insn "subhf3" | 975 (define_insn "subhf3" |
1026 [(set | 976 [(set |
1039 (minus:SF (match_operand:SF 1 "s_register_operand" "t") | 989 (minus:SF (match_operand:SF 1 "s_register_operand" "t") |
1040 (match_operand:SF 2 "s_register_operand" "t")))] | 990 (match_operand:SF 2 "s_register_operand" "t")))] |
1041 "TARGET_32BIT && TARGET_HARD_FLOAT" | 991 "TARGET_32BIT && TARGET_HARD_FLOAT" |
1042 "vsub%?.f32\\t%0, %1, %2" | 992 "vsub%?.f32\\t%0, %1, %2" |
1043 [(set_attr "predicable" "yes") | 993 [(set_attr "predicable" "yes") |
1044 (set_attr "predicable_short_it" "no") | |
1045 (set_attr "type" "fadds")] | 994 (set_attr "type" "fadds")] |
1046 ) | 995 ) |
1047 | 996 |
1048 (define_insn "*subdf3_vfp" | 997 (define_insn "*subdf3_vfp" |
1049 [(set (match_operand:DF 0 "s_register_operand" "=w") | 998 [(set (match_operand:DF 0 "s_register_operand" "=w") |
1050 (minus:DF (match_operand:DF 1 "s_register_operand" "w") | 999 (minus:DF (match_operand:DF 1 "s_register_operand" "w") |
1051 (match_operand:DF 2 "s_register_operand" "w")))] | 1000 (match_operand:DF 2 "s_register_operand" "w")))] |
1052 "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP_DOUBLE" | 1001 "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP_DOUBLE" |
1053 "vsub%?.f64\\t%P0, %P1, %P2" | 1002 "vsub%?.f64\\t%P0, %P1, %P2" |
1054 [(set_attr "predicable" "yes") | 1003 [(set_attr "predicable" "yes") |
1055 (set_attr "predicable_short_it" "no") | |
1056 (set_attr "type" "faddd")] | 1004 (set_attr "type" "faddd")] |
1057 ) | 1005 ) |
1058 | 1006 |
1059 | 1007 |
1060 ;; Division insns | 1008 ;; Division insns |
1080 (div:SF (match_operand:SF 1 "s_register_operand" "t,t") | 1028 (div:SF (match_operand:SF 1 "s_register_operand" "t,t") |
1081 (match_operand:SF 2 "s_register_operand" "t,t")))] | 1029 (match_operand:SF 2 "s_register_operand" "t,t")))] |
1082 "TARGET_32BIT && TARGET_HARD_FLOAT" | 1030 "TARGET_32BIT && TARGET_HARD_FLOAT" |
1083 "vdiv%?.f32\\t%0, %1, %2" | 1031 "vdiv%?.f32\\t%0, %1, %2" |
1084 [(set_attr "predicable" "yes") | 1032 [(set_attr "predicable" "yes") |
1085 (set_attr "predicable_short_it" "no") | |
1086 (set_attr "arch" "*,armv6_or_vfpv3") | 1033 (set_attr "arch" "*,armv6_or_vfpv3") |
1087 (set_attr "type" "fdivs")] | 1034 (set_attr "type" "fdivs")] |
1088 ) | 1035 ) |
1089 | 1036 |
1090 (define_insn "*divdf3_vfp" | 1037 (define_insn "*divdf3_vfp" |
1092 (div:DF (match_operand:DF 1 "s_register_operand" "w,w") | 1039 (div:DF (match_operand:DF 1 "s_register_operand" "w,w") |
1093 (match_operand:DF 2 "s_register_operand" "w,w")))] | 1040 (match_operand:DF 2 "s_register_operand" "w,w")))] |
1094 "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP_DOUBLE" | 1041 "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP_DOUBLE" |
1095 "vdiv%?.f64\\t%P0, %P1, %P2" | 1042 "vdiv%?.f64\\t%P0, %P1, %P2" |
1096 [(set_attr "predicable" "yes") | 1043 [(set_attr "predicable" "yes") |
1097 (set_attr "predicable_short_it" "no") | |
1098 (set_attr "arch" "*,armv6_or_vfpv3") | 1044 (set_attr "arch" "*,armv6_or_vfpv3") |
1099 (set_attr "type" "fdivd")] | 1045 (set_attr "type" "fdivd")] |
1100 ) | 1046 ) |
1101 | 1047 |
1102 | 1048 |
1118 (mult:SF (match_operand:SF 1 "s_register_operand" "t") | 1064 (mult:SF (match_operand:SF 1 "s_register_operand" "t") |
1119 (match_operand:SF 2 "s_register_operand" "t")))] | 1065 (match_operand:SF 2 "s_register_operand" "t")))] |
1120 "TARGET_32BIT && TARGET_HARD_FLOAT" | 1066 "TARGET_32BIT && TARGET_HARD_FLOAT" |
1121 "vmul%?.f32\\t%0, %1, %2" | 1067 "vmul%?.f32\\t%0, %1, %2" |
1122 [(set_attr "predicable" "yes") | 1068 [(set_attr "predicable" "yes") |
1123 (set_attr "predicable_short_it" "no") | |
1124 (set_attr "type" "fmuls")] | 1069 (set_attr "type" "fmuls")] |
1125 ) | 1070 ) |
1126 | 1071 |
1127 (define_insn "*muldf3_vfp" | 1072 (define_insn "*muldf3_vfp" |
1128 [(set (match_operand:DF 0 "s_register_operand" "=w") | 1073 [(set (match_operand:DF 0 "s_register_operand" "=w") |
1129 (mult:DF (match_operand:DF 1 "s_register_operand" "w") | 1074 (mult:DF (match_operand:DF 1 "s_register_operand" "w") |
1130 (match_operand:DF 2 "s_register_operand" "w")))] | 1075 (match_operand:DF 2 "s_register_operand" "w")))] |
1131 "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP_DOUBLE" | 1076 "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP_DOUBLE" |
1132 "vmul%?.f64\\t%P0, %P1, %P2" | 1077 "vmul%?.f64\\t%P0, %P1, %P2" |
1133 [(set_attr "predicable" "yes") | 1078 [(set_attr "predicable" "yes") |
1134 (set_attr "predicable_short_it" "no") | |
1135 (set_attr "type" "fmuld")] | 1079 (set_attr "type" "fmuld")] |
1136 ) | 1080 ) |
1137 | 1081 |
1138 (define_insn "*mulsf3neghf_vfp" | 1082 (define_insn "*mulsf3neghf_vfp" |
1139 [(set (match_operand:HF 0 "s_register_operand" "=t") | 1083 [(set (match_operand:HF 0 "s_register_operand" "=t") |
1160 (mult:SF (neg:SF (match_operand:SF 1 "s_register_operand" "t")) | 1104 (mult:SF (neg:SF (match_operand:SF 1 "s_register_operand" "t")) |
1161 (match_operand:SF 2 "s_register_operand" "t")))] | 1105 (match_operand:SF 2 "s_register_operand" "t")))] |
1162 "TARGET_32BIT && TARGET_HARD_FLOAT && !flag_rounding_math" | 1106 "TARGET_32BIT && TARGET_HARD_FLOAT && !flag_rounding_math" |
1163 "vnmul%?.f32\\t%0, %1, %2" | 1107 "vnmul%?.f32\\t%0, %1, %2" |
1164 [(set_attr "predicable" "yes") | 1108 [(set_attr "predicable" "yes") |
1165 (set_attr "predicable_short_it" "no") | |
1166 (set_attr "type" "fmuls")] | 1109 (set_attr "type" "fmuls")] |
1167 ) | 1110 ) |
1168 | 1111 |
1169 (define_insn "*negmulsf3_vfp" | 1112 (define_insn "*negmulsf3_vfp" |
1170 [(set (match_operand:SF 0 "s_register_operand" "=t") | 1113 [(set (match_operand:SF 0 "s_register_operand" "=t") |
1171 (neg:SF (mult:SF (match_operand:SF 1 "s_register_operand" "t") | 1114 (neg:SF (mult:SF (match_operand:SF 1 "s_register_operand" "t") |
1172 (match_operand:SF 2 "s_register_operand" "t"))))] | 1115 (match_operand:SF 2 "s_register_operand" "t"))))] |
1173 "TARGET_32BIT && TARGET_HARD_FLOAT" | 1116 "TARGET_32BIT && TARGET_HARD_FLOAT" |
1174 "vnmul%?.f32\\t%0, %1, %2" | 1117 "vnmul%?.f32\\t%0, %1, %2" |
1175 [(set_attr "predicable" "yes") | 1118 [(set_attr "predicable" "yes") |
1176 (set_attr "predicable_short_it" "no") | |
1177 (set_attr "type" "fmuls")] | 1119 (set_attr "type" "fmuls")] |
1178 ) | 1120 ) |
1179 | 1121 |
1180 (define_insn "*muldf3negdf_vfp" | 1122 (define_insn "*muldf3negdf_vfp" |
1181 [(set (match_operand:DF 0 "s_register_operand" "=w") | 1123 [(set (match_operand:DF 0 "s_register_operand" "=w") |
1183 (match_operand:DF 2 "s_register_operand" "w")))] | 1125 (match_operand:DF 2 "s_register_operand" "w")))] |
1184 "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP_DOUBLE | 1126 "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP_DOUBLE |
1185 && !flag_rounding_math" | 1127 && !flag_rounding_math" |
1186 "vnmul%?.f64\\t%P0, %P1, %P2" | 1128 "vnmul%?.f64\\t%P0, %P1, %P2" |
1187 [(set_attr "predicable" "yes") | 1129 [(set_attr "predicable" "yes") |
1188 (set_attr "predicable_short_it" "no") | |
1189 (set_attr "type" "fmuld")] | 1130 (set_attr "type" "fmuld")] |
1190 ) | 1131 ) |
1191 | 1132 |
1192 (define_insn "*negmuldf3_vfp" | 1133 (define_insn "*negmuldf3_vfp" |
1193 [(set (match_operand:DF 0 "s_register_operand" "=w") | 1134 [(set (match_operand:DF 0 "s_register_operand" "=w") |
1194 (neg:DF (mult:DF (match_operand:DF 1 "s_register_operand" "w") | 1135 (neg:DF (mult:DF (match_operand:DF 1 "s_register_operand" "w") |
1195 (match_operand:DF 2 "s_register_operand" "w"))))] | 1136 (match_operand:DF 2 "s_register_operand" "w"))))] |
1196 "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP_DOUBLE" | 1137 "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP_DOUBLE" |
1197 "vnmul%?.f64\\t%P0, %P1, %P2" | 1138 "vnmul%?.f64\\t%P0, %P1, %P2" |
1198 [(set_attr "predicable" "yes") | 1139 [(set_attr "predicable" "yes") |
1199 (set_attr "predicable_short_it" "no") | |
1200 (set_attr "type" "fmuld")] | 1140 (set_attr "type" "fmuld")] |
1201 ) | 1141 ) |
1202 | 1142 |
1203 | 1143 |
1204 ;; Multiply-accumulate insns | 1144 ;; Multiply-accumulate insns |
1222 (match_operand:SF 3 "s_register_operand" "t")) | 1162 (match_operand:SF 3 "s_register_operand" "t")) |
1223 (match_operand:SF 1 "s_register_operand" "0")))] | 1163 (match_operand:SF 1 "s_register_operand" "0")))] |
1224 "TARGET_32BIT && TARGET_HARD_FLOAT" | 1164 "TARGET_32BIT && TARGET_HARD_FLOAT" |
1225 "vmla%?.f32\\t%0, %2, %3" | 1165 "vmla%?.f32\\t%0, %2, %3" |
1226 [(set_attr "predicable" "yes") | 1166 [(set_attr "predicable" "yes") |
1227 (set_attr "predicable_short_it" "no") | |
1228 (set_attr "type" "fmacs")] | 1167 (set_attr "type" "fmacs")] |
1229 ) | 1168 ) |
1230 | 1169 |
1231 (define_insn "*muldf3adddf_vfp" | 1170 (define_insn "*muldf3adddf_vfp" |
1232 [(set (match_operand:DF 0 "s_register_operand" "=w") | 1171 [(set (match_operand:DF 0 "s_register_operand" "=w") |
1234 (match_operand:DF 3 "s_register_operand" "w")) | 1173 (match_operand:DF 3 "s_register_operand" "w")) |
1235 (match_operand:DF 1 "s_register_operand" "0")))] | 1174 (match_operand:DF 1 "s_register_operand" "0")))] |
1236 "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP_DOUBLE" | 1175 "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP_DOUBLE" |
1237 "vmla%?.f64\\t%P0, %P2, %P3" | 1176 "vmla%?.f64\\t%P0, %P2, %P3" |
1238 [(set_attr "predicable" "yes") | 1177 [(set_attr "predicable" "yes") |
1239 (set_attr "predicable_short_it" "no") | |
1240 (set_attr "type" "fmacd")] | 1178 (set_attr "type" "fmacd")] |
1241 ) | 1179 ) |
1242 | 1180 |
1243 ;; 0 = 1 * 2 - 0 | 1181 ;; 0 = 1 * 2 - 0 |
1244 (define_insn "*mulhf3subhf_vfp" | 1182 (define_insn "*mulhf3subhf_vfp" |
1258 (match_operand:SF 3 "s_register_operand" "t")) | 1196 (match_operand:SF 3 "s_register_operand" "t")) |
1259 (match_operand:SF 1 "s_register_operand" "0")))] | 1197 (match_operand:SF 1 "s_register_operand" "0")))] |
1260 "TARGET_32BIT && TARGET_HARD_FLOAT" | 1198 "TARGET_32BIT && TARGET_HARD_FLOAT" |
1261 "vnmls%?.f32\\t%0, %2, %3" | 1199 "vnmls%?.f32\\t%0, %2, %3" |
1262 [(set_attr "predicable" "yes") | 1200 [(set_attr "predicable" "yes") |
1263 (set_attr "predicable_short_it" "no") | |
1264 (set_attr "type" "fmacs")] | 1201 (set_attr "type" "fmacs")] |
1265 ) | 1202 ) |
1266 | 1203 |
1267 (define_insn "*muldf3subdf_vfp" | 1204 (define_insn "*muldf3subdf_vfp" |
1268 [(set (match_operand:DF 0 "s_register_operand" "=w") | 1205 [(set (match_operand:DF 0 "s_register_operand" "=w") |
1270 (match_operand:DF 3 "s_register_operand" "w")) | 1207 (match_operand:DF 3 "s_register_operand" "w")) |
1271 (match_operand:DF 1 "s_register_operand" "0")))] | 1208 (match_operand:DF 1 "s_register_operand" "0")))] |
1272 "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP_DOUBLE" | 1209 "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP_DOUBLE" |
1273 "vnmls%?.f64\\t%P0, %P2, %P3" | 1210 "vnmls%?.f64\\t%P0, %P2, %P3" |
1274 [(set_attr "predicable" "yes") | 1211 [(set_attr "predicable" "yes") |
1275 (set_attr "predicable_short_it" "no") | |
1276 (set_attr "type" "fmacd")] | 1212 (set_attr "type" "fmacd")] |
1277 ) | 1213 ) |
1278 | 1214 |
1279 ;; 0 = -(1 * 2) + 0 | 1215 ;; 0 = -(1 * 2) + 0 |
1280 (define_insn "*mulhf3neghfaddhf_vfp" | 1216 (define_insn "*mulhf3neghfaddhf_vfp" |
1294 (mult:SF (match_operand:SF 2 "s_register_operand" "t") | 1230 (mult:SF (match_operand:SF 2 "s_register_operand" "t") |
1295 (match_operand:SF 3 "s_register_operand" "t"))))] | 1231 (match_operand:SF 3 "s_register_operand" "t"))))] |
1296 "TARGET_32BIT && TARGET_HARD_FLOAT" | 1232 "TARGET_32BIT && TARGET_HARD_FLOAT" |
1297 "vmls%?.f32\\t%0, %2, %3" | 1233 "vmls%?.f32\\t%0, %2, %3" |
1298 [(set_attr "predicable" "yes") | 1234 [(set_attr "predicable" "yes") |
1299 (set_attr "predicable_short_it" "no") | |
1300 (set_attr "type" "fmacs")] | 1235 (set_attr "type" "fmacs")] |
1301 ) | 1236 ) |
1302 | 1237 |
1303 (define_insn "*fmuldf3negdfadddf_vfp" | 1238 (define_insn "*fmuldf3negdfadddf_vfp" |
1304 [(set (match_operand:DF 0 "s_register_operand" "=w") | 1239 [(set (match_operand:DF 0 "s_register_operand" "=w") |
1306 (mult:DF (match_operand:DF 2 "s_register_operand" "w") | 1241 (mult:DF (match_operand:DF 2 "s_register_operand" "w") |
1307 (match_operand:DF 3 "s_register_operand" "w"))))] | 1242 (match_operand:DF 3 "s_register_operand" "w"))))] |
1308 "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP_DOUBLE" | 1243 "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP_DOUBLE" |
1309 "vmls%?.f64\\t%P0, %P2, %P3" | 1244 "vmls%?.f64\\t%P0, %P2, %P3" |
1310 [(set_attr "predicable" "yes") | 1245 [(set_attr "predicable" "yes") |
1311 (set_attr "predicable_short_it" "no") | |
1312 (set_attr "type" "fmacd")] | 1246 (set_attr "type" "fmacd")] |
1313 ) | 1247 ) |
1314 | 1248 |
1315 | 1249 |
1316 ;; 0 = -(1 * 2) - 0 | 1250 ;; 0 = -(1 * 2) - 0 |
1333 (match_operand:SF 3 "s_register_operand" "t")) | 1267 (match_operand:SF 3 "s_register_operand" "t")) |
1334 (match_operand:SF 1 "s_register_operand" "0")))] | 1268 (match_operand:SF 1 "s_register_operand" "0")))] |
1335 "TARGET_32BIT && TARGET_HARD_FLOAT" | 1269 "TARGET_32BIT && TARGET_HARD_FLOAT" |
1336 "vnmla%?.f32\\t%0, %2, %3" | 1270 "vnmla%?.f32\\t%0, %2, %3" |
1337 [(set_attr "predicable" "yes") | 1271 [(set_attr "predicable" "yes") |
1338 (set_attr "predicable_short_it" "no") | |
1339 (set_attr "type" "fmacs")] | 1272 (set_attr "type" "fmacs")] |
1340 ) | 1273 ) |
1341 | 1274 |
1342 (define_insn "*muldf3negdfsubdf_vfp" | 1275 (define_insn "*muldf3negdfsubdf_vfp" |
1343 [(set (match_operand:DF 0 "s_register_operand" "=w") | 1276 [(set (match_operand:DF 0 "s_register_operand" "=w") |
1346 (match_operand:DF 3 "s_register_operand" "w")) | 1279 (match_operand:DF 3 "s_register_operand" "w")) |
1347 (match_operand:DF 1 "s_register_operand" "0")))] | 1280 (match_operand:DF 1 "s_register_operand" "0")))] |
1348 "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP_DOUBLE" | 1281 "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP_DOUBLE" |
1349 "vnmla%?.f64\\t%P0, %P2, %P3" | 1282 "vnmla%?.f64\\t%P0, %P2, %P3" |
1350 [(set_attr "predicable" "yes") | 1283 [(set_attr "predicable" "yes") |
1351 (set_attr "predicable_short_it" "no") | |
1352 (set_attr "type" "fmacd")] | 1284 (set_attr "type" "fmacd")] |
1353 ) | 1285 ) |
1354 | 1286 |
1355 ;; Fused-multiply-accumulate | 1287 ;; Fused-multiply-accumulate |
1356 | 1288 |
1384 (match_operand:SDF 2 "register_operand" "<F_constraint>") | 1316 (match_operand:SDF 2 "register_operand" "<F_constraint>") |
1385 (match_operand:SDF 3 "register_operand" "0")))] | 1317 (match_operand:SDF 3 "register_operand" "0")))] |
1386 "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_FMA" | 1318 "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_FMA" |
1387 "vfma%?.<V_if_elem>\\t%<V_reg>0, %<V_reg>1, %<V_reg>2" | 1319 "vfma%?.<V_if_elem>\\t%<V_reg>0, %<V_reg>1, %<V_reg>2" |
1388 [(set_attr "predicable" "yes") | 1320 [(set_attr "predicable" "yes") |
1389 (set_attr "predicable_short_it" "no") | |
1390 (set_attr "type" "ffma<vfp_type>")] | 1321 (set_attr "type" "ffma<vfp_type>")] |
1391 ) | 1322 ) |
1392 | 1323 |
1393 (define_insn "fmsubhf4_fp16" | 1324 (define_insn "fmsubhf4_fp16" |
1394 [(set (match_operand:HF 0 "register_operand" "=w") | 1325 [(set (match_operand:HF 0 "register_operand" "=w") |
1421 (match_operand:SDF 2 "register_operand" "<F_constraint>") | 1352 (match_operand:SDF 2 "register_operand" "<F_constraint>") |
1422 (match_operand:SDF 3 "register_operand" "0")))] | 1353 (match_operand:SDF 3 "register_operand" "0")))] |
1423 "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_FMA" | 1354 "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_FMA" |
1424 "vfms%?.<V_if_elem>\\t%<V_reg>0, %<V_reg>1, %<V_reg>2" | 1355 "vfms%?.<V_if_elem>\\t%<V_reg>0, %<V_reg>1, %<V_reg>2" |
1425 [(set_attr "predicable" "yes") | 1356 [(set_attr "predicable" "yes") |
1426 (set_attr "predicable_short_it" "no") | |
1427 (set_attr "type" "ffma<vfp_type>")] | 1357 (set_attr "type" "ffma<vfp_type>")] |
1428 ) | 1358 ) |
1429 | 1359 |
1430 (define_insn "*fnmsubhf4" | 1360 (define_insn "*fnmsubhf4" |
1431 [(set (match_operand:HF 0 "register_operand" "=w") | 1361 [(set (match_operand:HF 0 "register_operand" "=w") |
1444 (match_operand:SDF 2 "register_operand" "<F_constraint>") | 1374 (match_operand:SDF 2 "register_operand" "<F_constraint>") |
1445 (neg:SDF (match_operand:SDF 3 "register_operand" "0"))))] | 1375 (neg:SDF (match_operand:SDF 3 "register_operand" "0"))))] |
1446 "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_FMA" | 1376 "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_FMA" |
1447 "vfnms%?.<V_if_elem>\\t%<V_reg>0, %<V_reg>1, %<V_reg>2" | 1377 "vfnms%?.<V_if_elem>\\t%<V_reg>0, %<V_reg>1, %<V_reg>2" |
1448 [(set_attr "predicable" "yes") | 1378 [(set_attr "predicable" "yes") |
1449 (set_attr "predicable_short_it" "no") | |
1450 (set_attr "type" "ffma<vfp_type>")] | 1379 (set_attr "type" "ffma<vfp_type>")] |
1451 ) | 1380 ) |
1452 | 1381 |
1453 (define_insn "*fnmaddhf4" | 1382 (define_insn "*fnmaddhf4" |
1454 [(set (match_operand:HF 0 "register_operand" "=w") | 1383 [(set (match_operand:HF 0 "register_operand" "=w") |
1468 (match_operand:SDF 2 "register_operand" "<F_constraint>") | 1397 (match_operand:SDF 2 "register_operand" "<F_constraint>") |
1469 (neg:SDF (match_operand:SDF 3 "register_operand" "0"))))] | 1398 (neg:SDF (match_operand:SDF 3 "register_operand" "0"))))] |
1470 "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_FMA" | 1399 "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_FMA" |
1471 "vfnma%?.<V_if_elem>\\t%<V_reg>0, %<V_reg>1, %<V_reg>2" | 1400 "vfnma%?.<V_if_elem>\\t%<V_reg>0, %<V_reg>1, %<V_reg>2" |
1472 [(set_attr "predicable" "yes") | 1401 [(set_attr "predicable" "yes") |
1473 (set_attr "predicable_short_it" "no") | |
1474 (set_attr "type" "ffma<vfp_type>")] | 1402 (set_attr "type" "ffma<vfp_type>")] |
1475 ) | 1403 ) |
1476 | 1404 |
1477 | 1405 |
1478 ;; Conversion routines | 1406 ;; Conversion routines |
1481 [(set (match_operand:DF 0 "s_register_operand" "=w") | 1409 [(set (match_operand:DF 0 "s_register_operand" "=w") |
1482 (float_extend:DF (match_operand:SF 1 "s_register_operand" "t")))] | 1410 (float_extend:DF (match_operand:SF 1 "s_register_operand" "t")))] |
1483 "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP_DOUBLE" | 1411 "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP_DOUBLE" |
1484 "vcvt%?.f64.f32\\t%P0, %1" | 1412 "vcvt%?.f64.f32\\t%P0, %1" |
1485 [(set_attr "predicable" "yes") | 1413 [(set_attr "predicable" "yes") |
1486 (set_attr "predicable_short_it" "no") | |
1487 (set_attr "type" "f_cvt")] | 1414 (set_attr "type" "f_cvt")] |
1488 ) | 1415 ) |
1489 | 1416 |
1490 (define_insn "*truncdfsf2_vfp" | 1417 (define_insn "*truncdfsf2_vfp" |
1491 [(set (match_operand:SF 0 "s_register_operand" "=t") | 1418 [(set (match_operand:SF 0 "s_register_operand" "=t") |
1492 (float_truncate:SF (match_operand:DF 1 "s_register_operand" "w")))] | 1419 (float_truncate:SF (match_operand:DF 1 "s_register_operand" "w")))] |
1493 "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP_DOUBLE" | 1420 "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP_DOUBLE" |
1494 "vcvt%?.f32.f64\\t%0, %P1" | 1421 "vcvt%?.f32.f64\\t%0, %P1" |
1495 [(set_attr "predicable" "yes") | 1422 [(set_attr "predicable" "yes") |
1496 (set_attr "predicable_short_it" "no") | |
1497 (set_attr "type" "f_cvt")] | 1423 (set_attr "type" "f_cvt")] |
1498 ) | 1424 ) |
1499 | 1425 |
1500 (define_insn "extendhfsf2" | 1426 (define_insn "extendhfsf2" |
1501 [(set (match_operand:SF 0 "s_register_operand" "=t") | 1427 [(set (match_operand:SF 0 "s_register_operand" "=t") |
1502 (float_extend:SF (match_operand:HF 1 "s_register_operand" "t")))] | 1428 (float_extend:SF (match_operand:HF 1 "s_register_operand" "t")))] |
1503 "TARGET_32BIT && TARGET_HARD_FLOAT && (TARGET_FP16 || TARGET_VFP_FP16INST)" | 1429 "TARGET_32BIT && TARGET_HARD_FLOAT && (TARGET_FP16 || TARGET_VFP_FP16INST)" |
1504 "vcvtb%?.f32.f16\\t%0, %1" | 1430 "vcvtb%?.f32.f16\\t%0, %1" |
1505 [(set_attr "predicable" "yes") | 1431 [(set_attr "predicable" "yes") |
1506 (set_attr "predicable_short_it" "no") | |
1507 (set_attr "type" "f_cvt")] | 1432 (set_attr "type" "f_cvt")] |
1508 ) | 1433 ) |
1509 | 1434 |
1510 (define_insn "*truncdfhf2" | 1435 (define_insn "*truncdfhf2" |
1511 [(set (match_operand:HF 0 "s_register_operand" "=t") | 1436 [(set (match_operand:HF 0 "s_register_operand" "=t") |
1512 (float_truncate:HF (match_operand:DF 1 "s_register_operand" "w")))] | 1437 (float_truncate:HF (match_operand:DF 1 "s_register_operand" "w")))] |
1513 "TARGET_32BIT && TARGET_FP16_TO_DOUBLE" | 1438 "TARGET_32BIT && TARGET_FP16_TO_DOUBLE" |
1514 "vcvtb%?.f16.f64\\t%0, %P1" | 1439 "vcvtb%?.f16.f64\\t%0, %P1" |
1515 [(set_attr "predicable" "yes") | 1440 [(set_attr "predicable" "yes") |
1516 (set_attr "predicable_short_it" "no") | |
1517 (set_attr "type" "f_cvt")] | 1441 (set_attr "type" "f_cvt")] |
1518 ) | 1442 ) |
1519 | 1443 |
1520 (define_insn "*extendhfdf2" | 1444 (define_insn "*extendhfdf2" |
1521 [(set (match_operand:DF 0 "s_register_operand" "=w") | 1445 [(set (match_operand:DF 0 "s_register_operand" "=w") |
1522 (float_extend:DF (match_operand:HF 1 "s_register_operand" "t")))] | 1446 (float_extend:DF (match_operand:HF 1 "s_register_operand" "t")))] |
1523 "TARGET_32BIT && TARGET_FP16_TO_DOUBLE" | 1447 "TARGET_32BIT && TARGET_FP16_TO_DOUBLE" |
1524 "vcvtb%?.f64.f16\\t%P0, %1" | 1448 "vcvtb%?.f64.f16\\t%P0, %1" |
1525 [(set_attr "predicable" "yes") | 1449 [(set_attr "predicable" "yes") |
1526 (set_attr "predicable_short_it" "no") | |
1527 (set_attr "type" "f_cvt")] | 1450 (set_attr "type" "f_cvt")] |
1528 ) | 1451 ) |
1529 | 1452 |
1530 (define_insn "truncsfhf2" | 1453 (define_insn "truncsfhf2" |
1531 [(set (match_operand:HF 0 "s_register_operand" "=t") | 1454 [(set (match_operand:HF 0 "s_register_operand" "=t") |
1532 (float_truncate:HF (match_operand:SF 1 "s_register_operand" "t")))] | 1455 (float_truncate:HF (match_operand:SF 1 "s_register_operand" "t")))] |
1533 "TARGET_32BIT && TARGET_HARD_FLOAT && (TARGET_FP16 || TARGET_VFP_FP16INST)" | 1456 "TARGET_32BIT && TARGET_HARD_FLOAT && (TARGET_FP16 || TARGET_VFP_FP16INST)" |
1534 "vcvtb%?.f16.f32\\t%0, %1" | 1457 "vcvtb%?.f16.f32\\t%0, %1" |
1535 [(set_attr "predicable" "yes") | 1458 [(set_attr "predicable" "yes") |
1536 (set_attr "predicable_short_it" "no") | |
1537 (set_attr "type" "f_cvt")] | 1459 (set_attr "type" "f_cvt")] |
1538 ) | 1460 ) |
1539 | 1461 |
1540 (define_insn "*truncsisf2_vfp" | 1462 (define_insn "*truncsisf2_vfp" |
1541 [(set (match_operand:SI 0 "s_register_operand" "=t") | 1463 [(set (match_operand:SI 0 "s_register_operand" "=t") |
1542 (fix:SI (fix:SF (match_operand:SF 1 "s_register_operand" "t"))))] | 1464 (fix:SI (fix:SF (match_operand:SF 1 "s_register_operand" "t"))))] |
1543 "TARGET_32BIT && TARGET_HARD_FLOAT" | 1465 "TARGET_32BIT && TARGET_HARD_FLOAT" |
1544 "vcvt%?.s32.f32\\t%0, %1" | 1466 "vcvt%?.s32.f32\\t%0, %1" |
1545 [(set_attr "predicable" "yes") | 1467 [(set_attr "predicable" "yes") |
1546 (set_attr "predicable_short_it" "no") | |
1547 (set_attr "type" "f_cvtf2i")] | 1468 (set_attr "type" "f_cvtf2i")] |
1548 ) | 1469 ) |
1549 | 1470 |
1550 (define_insn "*truncsidf2_vfp" | 1471 (define_insn "*truncsidf2_vfp" |
1551 [(set (match_operand:SI 0 "s_register_operand" "=t") | 1472 [(set (match_operand:SI 0 "s_register_operand" "=t") |
1552 (fix:SI (fix:DF (match_operand:DF 1 "s_register_operand" "w"))))] | 1473 (fix:SI (fix:DF (match_operand:DF 1 "s_register_operand" "w"))))] |
1553 "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP_DOUBLE" | 1474 "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP_DOUBLE" |
1554 "vcvt%?.s32.f64\\t%0, %P1" | 1475 "vcvt%?.s32.f64\\t%0, %P1" |
1555 [(set_attr "predicable" "yes") | 1476 [(set_attr "predicable" "yes") |
1556 (set_attr "predicable_short_it" "no") | |
1557 (set_attr "type" "f_cvtf2i")] | 1477 (set_attr "type" "f_cvtf2i")] |
1558 ) | 1478 ) |
1559 | 1479 |
1560 | 1480 |
1561 (define_insn "fixuns_truncsfsi2" | 1481 (define_insn "fixuns_truncsfsi2" |
1562 [(set (match_operand:SI 0 "s_register_operand" "=t") | 1482 [(set (match_operand:SI 0 "s_register_operand" "=t") |
1563 (unsigned_fix:SI (fix:SF (match_operand:SF 1 "s_register_operand" "t"))))] | 1483 (unsigned_fix:SI (fix:SF (match_operand:SF 1 "s_register_operand" "t"))))] |
1564 "TARGET_32BIT && TARGET_HARD_FLOAT" | 1484 "TARGET_32BIT && TARGET_HARD_FLOAT" |
1565 "vcvt%?.u32.f32\\t%0, %1" | 1485 "vcvt%?.u32.f32\\t%0, %1" |
1566 [(set_attr "predicable" "yes") | 1486 [(set_attr "predicable" "yes") |
1567 (set_attr "predicable_short_it" "no") | |
1568 (set_attr "type" "f_cvtf2i")] | 1487 (set_attr "type" "f_cvtf2i")] |
1569 ) | 1488 ) |
1570 | 1489 |
1571 (define_insn "fixuns_truncdfsi2" | 1490 (define_insn "fixuns_truncdfsi2" |
1572 [(set (match_operand:SI 0 "s_register_operand" "=t") | 1491 [(set (match_operand:SI 0 "s_register_operand" "=t") |
1573 (unsigned_fix:SI (fix:DF (match_operand:DF 1 "s_register_operand" "t"))))] | 1492 (unsigned_fix:SI (fix:DF (match_operand:DF 1 "s_register_operand" "t"))))] |
1574 "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP_DOUBLE" | 1493 "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP_DOUBLE" |
1575 "vcvt%?.u32.f64\\t%0, %P1" | 1494 "vcvt%?.u32.f64\\t%0, %P1" |
1576 [(set_attr "predicable" "yes") | 1495 [(set_attr "predicable" "yes") |
1577 (set_attr "predicable_short_it" "no") | |
1578 (set_attr "type" "f_cvtf2i")] | 1496 (set_attr "type" "f_cvtf2i")] |
1579 ) | 1497 ) |
1580 | 1498 |
1581 | 1499 |
1582 (define_insn "*floatsisf2_vfp" | 1500 (define_insn "*floatsisf2_vfp" |
1583 [(set (match_operand:SF 0 "s_register_operand" "=t") | 1501 [(set (match_operand:SF 0 "s_register_operand" "=t") |
1584 (float:SF (match_operand:SI 1 "s_register_operand" "t")))] | 1502 (float:SF (match_operand:SI 1 "s_register_operand" "t")))] |
1585 "TARGET_32BIT && TARGET_HARD_FLOAT" | 1503 "TARGET_32BIT && TARGET_HARD_FLOAT" |
1586 "vcvt%?.f32.s32\\t%0, %1" | 1504 "vcvt%?.f32.s32\\t%0, %1" |
1587 [(set_attr "predicable" "yes") | 1505 [(set_attr "predicable" "yes") |
1588 (set_attr "predicable_short_it" "no") | |
1589 (set_attr "type" "f_cvti2f")] | 1506 (set_attr "type" "f_cvti2f")] |
1590 ) | 1507 ) |
1591 | 1508 |
1592 (define_insn "*floatsidf2_vfp" | 1509 (define_insn "*floatsidf2_vfp" |
1593 [(set (match_operand:DF 0 "s_register_operand" "=w") | 1510 [(set (match_operand:DF 0 "s_register_operand" "=w") |
1594 (float:DF (match_operand:SI 1 "s_register_operand" "t")))] | 1511 (float:DF (match_operand:SI 1 "s_register_operand" "t")))] |
1595 "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP_DOUBLE" | 1512 "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP_DOUBLE" |
1596 "vcvt%?.f64.s32\\t%P0, %1" | 1513 "vcvt%?.f64.s32\\t%P0, %1" |
1597 [(set_attr "predicable" "yes") | 1514 [(set_attr "predicable" "yes") |
1598 (set_attr "predicable_short_it" "no") | |
1599 (set_attr "type" "f_cvti2f")] | 1515 (set_attr "type" "f_cvti2f")] |
1600 ) | 1516 ) |
1601 | 1517 |
1602 | 1518 |
1603 (define_insn "floatunssisf2" | 1519 (define_insn "floatunssisf2" |
1604 [(set (match_operand:SF 0 "s_register_operand" "=t") | 1520 [(set (match_operand:SF 0 "s_register_operand" "=t") |
1605 (unsigned_float:SF (match_operand:SI 1 "s_register_operand" "t")))] | 1521 (unsigned_float:SF (match_operand:SI 1 "s_register_operand" "t")))] |
1606 "TARGET_32BIT && TARGET_HARD_FLOAT" | 1522 "TARGET_32BIT && TARGET_HARD_FLOAT" |
1607 "vcvt%?.f32.u32\\t%0, %1" | 1523 "vcvt%?.f32.u32\\t%0, %1" |
1608 [(set_attr "predicable" "yes") | 1524 [(set_attr "predicable" "yes") |
1609 (set_attr "predicable_short_it" "no") | |
1610 (set_attr "type" "f_cvti2f")] | 1525 (set_attr "type" "f_cvti2f")] |
1611 ) | 1526 ) |
1612 | 1527 |
1613 (define_insn "floatunssidf2" | 1528 (define_insn "floatunssidf2" |
1614 [(set (match_operand:DF 0 "s_register_operand" "=w") | 1529 [(set (match_operand:DF 0 "s_register_operand" "=w") |
1615 (unsigned_float:DF (match_operand:SI 1 "s_register_operand" "t")))] | 1530 (unsigned_float:DF (match_operand:SI 1 "s_register_operand" "t")))] |
1616 "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP_DOUBLE" | 1531 "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP_DOUBLE" |
1617 "vcvt%?.f64.u32\\t%P0, %1" | 1532 "vcvt%?.f64.u32\\t%P0, %1" |
1618 [(set_attr "predicable" "yes") | 1533 [(set_attr "predicable" "yes") |
1619 (set_attr "predicable_short_it" "no") | |
1620 (set_attr "type" "f_cvti2f")] | 1534 (set_attr "type" "f_cvti2f")] |
1621 ) | 1535 ) |
1622 | 1536 |
1623 | 1537 |
1624 ;; Sqrt insns. | 1538 ;; Sqrt insns. |
1651 [(set (match_operand:SF 0 "s_register_operand" "=&t,t") | 1565 [(set (match_operand:SF 0 "s_register_operand" "=&t,t") |
1652 (sqrt:SF (match_operand:SF 1 "s_register_operand" "t,t")))] | 1566 (sqrt:SF (match_operand:SF 1 "s_register_operand" "t,t")))] |
1653 "TARGET_32BIT && TARGET_HARD_FLOAT" | 1567 "TARGET_32BIT && TARGET_HARD_FLOAT" |
1654 "vsqrt%?.f32\\t%0, %1" | 1568 "vsqrt%?.f32\\t%0, %1" |
1655 [(set_attr "predicable" "yes") | 1569 [(set_attr "predicable" "yes") |
1656 (set_attr "predicable_short_it" "no") | |
1657 (set_attr "arch" "*,armv6_or_vfpv3") | 1570 (set_attr "arch" "*,armv6_or_vfpv3") |
1658 (set_attr "type" "fsqrts")] | 1571 (set_attr "type" "fsqrts")] |
1659 ) | 1572 ) |
1660 | 1573 |
1661 (define_insn "*sqrtdf2_vfp" | 1574 (define_insn "*sqrtdf2_vfp" |
1662 [(set (match_operand:DF 0 "s_register_operand" "=&w,w") | 1575 [(set (match_operand:DF 0 "s_register_operand" "=&w,w") |
1663 (sqrt:DF (match_operand:DF 1 "s_register_operand" "w,w")))] | 1576 (sqrt:DF (match_operand:DF 1 "s_register_operand" "w,w")))] |
1664 "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP_DOUBLE" | 1577 "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP_DOUBLE" |
1665 "vsqrt%?.f64\\t%P0, %P1" | 1578 "vsqrt%?.f64\\t%P0, %P1" |
1666 [(set_attr "predicable" "yes") | 1579 [(set_attr "predicable" "yes") |
1667 (set_attr "predicable_short_it" "no") | |
1668 (set_attr "arch" "*,armv6_or_vfpv3") | 1580 (set_attr "arch" "*,armv6_or_vfpv3") |
1669 (set_attr "type" "fsqrtd")] | 1581 (set_attr "type" "fsqrtd")] |
1670 ) | 1582 ) |
1671 | 1583 |
1672 | 1584 |
1754 "TARGET_32BIT && TARGET_HARD_FLOAT" | 1666 "TARGET_32BIT && TARGET_HARD_FLOAT" |
1755 "@ | 1667 "@ |
1756 vcmp%?.f32\\t%0, %1 | 1668 vcmp%?.f32\\t%0, %1 |
1757 vcmp%?.f32\\t%0, #0" | 1669 vcmp%?.f32\\t%0, #0" |
1758 [(set_attr "predicable" "yes") | 1670 [(set_attr "predicable" "yes") |
1759 (set_attr "predicable_short_it" "no") | |
1760 (set_attr "type" "fcmps")] | 1671 (set_attr "type" "fcmps")] |
1761 ) | 1672 ) |
1762 | 1673 |
1763 (define_insn "*cmpsf_trap_vfp" | 1674 (define_insn "*cmpsf_trap_vfp" |
1764 [(set (reg:CCFPE VFPCC_REGNUM) | 1675 [(set (reg:CCFPE VFPCC_REGNUM) |
1767 "TARGET_32BIT && TARGET_HARD_FLOAT" | 1678 "TARGET_32BIT && TARGET_HARD_FLOAT" |
1768 "@ | 1679 "@ |
1769 vcmpe%?.f32\\t%0, %1 | 1680 vcmpe%?.f32\\t%0, %1 |
1770 vcmpe%?.f32\\t%0, #0" | 1681 vcmpe%?.f32\\t%0, #0" |
1771 [(set_attr "predicable" "yes") | 1682 [(set_attr "predicable" "yes") |
1772 (set_attr "predicable_short_it" "no") | |
1773 (set_attr "type" "fcmps")] | 1683 (set_attr "type" "fcmps")] |
1774 ) | 1684 ) |
1775 | 1685 |
1776 (define_insn "*cmpdf_vfp" | 1686 (define_insn "*cmpdf_vfp" |
1777 [(set (reg:CCFP VFPCC_REGNUM) | 1687 [(set (reg:CCFP VFPCC_REGNUM) |
1780 "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP_DOUBLE" | 1690 "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP_DOUBLE" |
1781 "@ | 1691 "@ |
1782 vcmp%?.f64\\t%P0, %P1 | 1692 vcmp%?.f64\\t%P0, %P1 |
1783 vcmp%?.f64\\t%P0, #0" | 1693 vcmp%?.f64\\t%P0, #0" |
1784 [(set_attr "predicable" "yes") | 1694 [(set_attr "predicable" "yes") |
1785 (set_attr "predicable_short_it" "no") | |
1786 (set_attr "type" "fcmpd")] | 1695 (set_attr "type" "fcmpd")] |
1787 ) | 1696 ) |
1788 | 1697 |
1789 (define_insn "*cmpdf_trap_vfp" | 1698 (define_insn "*cmpdf_trap_vfp" |
1790 [(set (reg:CCFPE VFPCC_REGNUM) | 1699 [(set (reg:CCFPE VFPCC_REGNUM) |
1793 "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP_DOUBLE" | 1702 "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP_DOUBLE" |
1794 "@ | 1703 "@ |
1795 vcmpe%?.f64\\t%P0, %P1 | 1704 vcmpe%?.f64\\t%P0, %P1 |
1796 vcmpe%?.f64\\t%P0, #0" | 1705 vcmpe%?.f64\\t%P0, #0" |
1797 [(set_attr "predicable" "yes") | 1706 [(set_attr "predicable" "yes") |
1798 (set_attr "predicable_short_it" "no") | |
1799 (set_attr "type" "fcmpd")] | 1707 (set_attr "type" "fcmpd")] |
1800 ) | 1708 ) |
1801 | 1709 |
1802 ;; Fixed point to floating point conversions. | 1710 ;; Fixed point to floating point conversions. |
1803 (define_insn "*combine_vcvt_f32_<FCVTI32typename>" | 1711 (define_insn "*combine_vcvt_f32_<FCVTI32typename>" |
1806 (match_operand 2 | 1714 (match_operand 2 |
1807 "const_double_vcvt_power_of_two_reciprocal" "Dt")))] | 1715 "const_double_vcvt_power_of_two_reciprocal" "Dt")))] |
1808 "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP3 && !flag_rounding_math" | 1716 "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP3 && !flag_rounding_math" |
1809 "vcvt%?.f32.<FCVTI32typename>\\t%0, %1, %v2" | 1717 "vcvt%?.f32.<FCVTI32typename>\\t%0, %1, %v2" |
1810 [(set_attr "predicable" "yes") | 1718 [(set_attr "predicable" "yes") |
1811 (set_attr "predicable_short_it" "no") | |
1812 (set_attr "type" "f_cvti2f")] | 1719 (set_attr "type" "f_cvti2f")] |
1813 ) | 1720 ) |
1814 | 1721 |
1815 ;; Not the ideal way of implementing this. Ideally we would be able to split | 1722 ;; Not the ideal way of implementing this. Ideally we would be able to split |
1816 ;; this into a move to a DP register and then a vcvt.f64.i32 | 1723 ;; this into a move to a DP register and then a vcvt.f64.i32 |
1825 vmov%?.f32\\t%0, %1\;vcvt%?.f64.<FCVTI32typename>\\t%P0, %P0, %v2 | 1732 vmov%?.f32\\t%0, %1\;vcvt%?.f64.<FCVTI32typename>\\t%P0, %P0, %v2 |
1826 vmov%?.f32\\t%0, %1\;vcvt%?.f64.<FCVTI32typename>\\t%P0, %P0, %v2 | 1733 vmov%?.f32\\t%0, %1\;vcvt%?.f64.<FCVTI32typename>\\t%P0, %P0, %v2 |
1827 vmov%?.f64\\t%P0, %1, %1\;vcvt%?.f64.<FCVTI32typename>\\t%P0, %P0, %v2" | 1734 vmov%?.f64\\t%P0, %1, %1\;vcvt%?.f64.<FCVTI32typename>\\t%P0, %P0, %v2" |
1828 [(set_attr "predicable" "yes") | 1735 [(set_attr "predicable" "yes") |
1829 (set_attr "ce_count" "2") | 1736 (set_attr "ce_count" "2") |
1830 (set_attr "predicable_short_it" "no") | |
1831 (set_attr "type" "f_cvti2f") | 1737 (set_attr "type" "f_cvti2f") |
1832 (set_attr "length" "8")] | 1738 (set_attr "length" "8")] |
1833 ) | 1739 ) |
1834 | 1740 |
1835 (define_insn "*combine_vcvtf2i" | 1741 (define_insn "*combine_vcvtf2i" |
1838 (match_operand 2 | 1744 (match_operand 2 |
1839 "const_double_vcvt_power_of_two" "Dp")))))] | 1745 "const_double_vcvt_power_of_two" "Dp")))))] |
1840 "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP3 && !flag_rounding_math" | 1746 "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP3 && !flag_rounding_math" |
1841 "vcvt%?.s32.f32\\t%0, %1, %v2" | 1747 "vcvt%?.s32.f32\\t%0, %1, %v2" |
1842 [(set_attr "predicable" "yes") | 1748 [(set_attr "predicable" "yes") |
1843 (set_attr "predicable_short_it" "no") | |
1844 (set_attr "type" "f_cvtf2i")] | 1749 (set_attr "type" "f_cvtf2i")] |
1845 ) | 1750 ) |
1846 | 1751 |
1847 ;; FP16 conversions. | 1752 ;; FP16 conversions. |
1848 (define_insn "neon_vcvth<sup>hf" | 1753 (define_insn "neon_vcvth<sup>hf" |
1984 "register_operand" "<F_constraint>")] | 1889 "register_operand" "<F_constraint>")] |
1985 VRINT))] | 1890 VRINT))] |
1986 "TARGET_HARD_FLOAT && TARGET_VFP5 <vfp_double_cond>" | 1891 "TARGET_HARD_FLOAT && TARGET_VFP5 <vfp_double_cond>" |
1987 "vrint<vrint_variant>%?.<V_if_elem>\\t%<V_reg>0, %<V_reg>1" | 1892 "vrint<vrint_variant>%?.<V_if_elem>\\t%<V_reg>0, %<V_reg>1" |
1988 [(set_attr "predicable" "<vrint_predicable>") | 1893 [(set_attr "predicable" "<vrint_predicable>") |
1989 (set_attr "predicable_short_it" "no") | |
1990 (set_attr "type" "f_rint<vfp_type>") | 1894 (set_attr "type" "f_rint<vfp_type>") |
1991 (set_attr "conds" "<vrint_conds>")] | 1895 (set_attr "conds" "<vrint_conds>")] |
1992 ) | 1896 ) |
1993 | 1897 |
1994 ;; Implements the lround, lfloor and lceil optabs. | 1898 ;; Implements the lround, lfloor and lceil optabs. |
1997 (FIXUORS:SI (unspec:SDF | 1901 (FIXUORS:SI (unspec:SDF |
1998 [(match_operand:SDF 1 | 1902 [(match_operand:SDF 1 |
1999 "register_operand" "<F_constraint>")] VCVT)))] | 1903 "register_operand" "<F_constraint>")] VCVT)))] |
2000 "TARGET_HARD_FLOAT && TARGET_VFP5 <vfp_double_cond>" | 1904 "TARGET_HARD_FLOAT && TARGET_VFP5 <vfp_double_cond>" |
2001 "vcvt<vrint_variant>.<su>32.<V_if_elem>\\t%0, %<V_reg>1" | 1905 "vcvt<vrint_variant>.<su>32.<V_if_elem>\\t%0, %<V_reg>1" |
2002 [(set_attr "predicable" "no") | 1906 [(set_attr "conds" "unconditional") |
2003 (set_attr "conds" "unconditional") | |
2004 (set_attr "type" "f_cvtf2i")] | 1907 (set_attr "type" "f_cvtf2i")] |
2005 ) | 1908 ) |
2006 | 1909 |
2007 ;; MIN_EXPR and MAX_EXPR eventually map to 'smin' and 'smax' in RTL. | 1910 ;; MIN_EXPR and MAX_EXPR eventually map to 'smin' and 'smax' in RTL. |
2008 ;; The 'smax' and 'smin' RTL standard pattern names do not specify which | 1911 ;; The 'smax' and 'smin' RTL standard pattern names do not specify which |