Index: gcc/gcc/config/arm/neon.ml |
diff --git a/gcc/gcc/config/arm/neon.ml b/gcc/gcc/config/arm/neon.ml |
index 10393b33ebcb7116d7f446411e358abbf8e2af7e..f77f05cc825537186024ebf552d214a74ab5a9ba 100644 |
--- a/gcc/gcc/config/arm/neon.ml |
+++ b/gcc/gcc/config/arm/neon.ml |
@@ -1,7 +1,7 @@ |
(* Common code for ARM NEON header file, documentation and test case |
generators. |
- Copyright (C) 2006, 2007 Free Software Foundation, Inc. |
+ Copyright (C) 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. |
Contributed by CodeSourcery. |
This file is part of GCC. |
@@ -50,7 +50,7 @@ type vectype = T_int8x8 | T_int8x16 |
| T_ptrto of vectype | T_const of vectype |
| T_void | T_intQI |
| T_intHI | T_intSI |
- | T_intDI |
+ | T_intDI | T_floatSF |
(* The meanings of the following are: |
TImode : "Tetra", two registers (four words). |
@@ -68,6 +68,7 @@ type shape_elt = Dreg | Qreg | Corereg | Immed | VecArray of int * shape_elt |
| Element_of_dreg (* Used for "lane" variants. *) |
| Element_of_qreg (* Likewise. *) |
| All_elements_of_dreg (* Used for "dup" variants. *) |
+ | Alternatives of shape_elt list (* Used for multiple valid operands *) |
type shape_form = All of int * shape_elt |
| Long |
@@ -233,6 +234,7 @@ type features = |
cases. The function supplied must return the integer to be written |
into the testcase for the argument number (0-based) supplied to it. *) |
| Const_valuator of (int -> int) |
+ | Fixed_return_reg |
exception MixedMode of elts * elts |
@@ -1008,7 +1010,10 @@ let ops = |
pf_su_8_64; |
(* Set all lanes to the same value. *) |
- Vdup_n, [], |
+ Vdup_n, |
+ [Disassembles_as [Use_operands [| Dreg; |
+ Alternatives [ Corereg; |
+ Element_of_dreg ] |]]], |
Use_operands [| Dreg; Corereg |], "vdup_n", bits_1, |
pf_su_8_32; |
Vdup_n, |
@@ -1016,7 +1021,10 @@ let ops = |
Disassembles_as [Use_operands [| Dreg; Corereg; Corereg |]]], |
Use_operands [| Dreg; Corereg |], "vdup_n", notype_1, |
[S64; U64]; |
- Vdup_n, [], |
+ Vdup_n, |
+ [Disassembles_as [Use_operands [| Qreg; |
+ Alternatives [ Corereg; |
+ Element_of_dreg ] |]]], |
Use_operands [| Qreg; Corereg |], "vdupQ_n", bits_1, |
pf_su_8_32; |
Vdup_n, |
@@ -1028,7 +1036,10 @@ let ops = |
(* These are just aliases for the above. *) |
Vmov_n, |
- [Builtin_name "vdup_n"], |
+ [Builtin_name "vdup_n"; |
+ Disassembles_as [Use_operands [| Dreg; |
+ Alternatives [ Corereg; |
+ Element_of_dreg ] |]]], |
Use_operands [| Dreg; Corereg |], |
"vmov_n", bits_1, pf_su_8_32; |
Vmov_n, |
@@ -1038,7 +1049,10 @@ let ops = |
Use_operands [| Dreg; Corereg |], |
"vmov_n", notype_1, [S64; U64]; |
Vmov_n, |
- [Builtin_name "vdupQ_n"], |
+ [Builtin_name "vdupQ_n"; |
+ Disassembles_as [Use_operands [| Qreg; |
+ Alternatives [ Corereg; |
+ Element_of_dreg ] |]]], |
Use_operands [| Qreg; Corereg |], |
"vmovQ_n", bits_1, pf_su_8_32; |
Vmov_n, |
@@ -1076,9 +1090,13 @@ let ops = |
Use_operands [| Dreg; Qreg |], "vget_high", |
notype_1, pf_su_8_64; |
Vget_low, [Instruction_name ["vmov"]; |
- Disassembles_as [Use_operands [| Dreg; Dreg |]]], |
+ Disassembles_as [Use_operands [| Dreg; Dreg |]]; |
+ Fixed_return_reg], |
Use_operands [| Dreg; Qreg |], "vget_low", |
- notype_1, pf_su_8_64; |
+ notype_1, pf_su_8_32; |
+ Vget_low, [No_op], |
+ Use_operands [| Dreg; Qreg |], "vget_low", |
+ notype_1, [S64; U64]; |
(* Conversions. *) |
Vcvt, [InfoWord], All (2, Dreg), "vcvt", conv_1, |
@@ -1693,6 +1711,7 @@ let string_of_vectype vt = |
| T_intHI -> "__builtin_neon_hi" |
| T_intSI -> "__builtin_neon_si" |
| T_intDI -> "__builtin_neon_di" |
+ | T_floatSF -> "__builtin_neon_sf" |
| T_arrayof (num, base) -> |
let basename = name (fun x -> x) base in |
affix (Printf.sprintf "%sx%d" basename num) |