| /* ldst-reg-pair.s Test file for AArch64 load-store reg.pair instructions. |
| |
| Copyright 2011, 2012 Free Software Foundation, Inc. |
| Contributed by ARM Ltd. |
| |
| This file is part of GAS. |
| |
| GAS is free software; you can redistribute it and/or modify |
| it under the terms of the GNU General Public License as published by |
| the Free Software Foundation; either version 3 of the license, or |
| (at your option) any later version. |
| |
| GAS is distributed in the hope that it will be useful, |
| but WITHOUT ANY WARRANTY; without even the implied warranty of |
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| GNU General Public License for more details. |
| |
| You should have received a copy of the GNU General Public License |
| along with this program; see the file COPYING3. If not, |
| see <http://www.gnu.org/licenses/>. */ |
| |
| /* Includes: |
| * Load-store reg.pair (offset) |
| * Load-store reg.pair (post-ind.) |
| * Load-store reg.pair (pre-ind.) |
| * Load-store na.pair (pre-ind.) |
| */ |
| |
| // offset format |
| .macro op3_offset op, reg, imm |
| \op \reg\()7, \reg\()15, [sp, #\imm] |
| .endm |
| |
| // post-ind. format |
| .macro op3_post_ind op, reg, imm |
| \op \reg\()7, \reg\()15, [sp], #\imm |
| .endm |
| |
| // pre-ind. format |
| .macro op3_pre_ind op, reg, imm |
| \op \reg\()7, \reg\()15, [sp, #\imm]! |
| .endm |
| |
| .macro op3 op, reg, size, type |
| // a variety of values for the imm7 field |
| .irp imm7, -64, -31, -1, 0, 15, 63 |
| // offset format |
| .ifc \type, 1 |
| op3_offset \op, \reg, "(\imm7*\size)" |
| .endif |
| // post-ind. format |
| .ifc \type, 2 |
| op3_post_ind \op, \reg, "(\imm7*\size)" |
| .endif |
| // pre-ind. format |
| .ifc \type, 3 |
| op3_pre_ind \op, \reg, "(\imm7*\size)" |
| .endif |
| .endr |
| .endm |
| |
| .macro ldst_reg_pair type |
| // op, reg, size(in byte) of one of the pair, type |
| op3 stp, w, 4, \type |
| op3 ldp, w, 4, \type |
| |
| op3 ldpsw, x, 4, \type |
| |
| op3 stp, x, 8, \type |
| op3 ldp, x, 8, \type |
| |
| op3 stp, s, 4, \type |
| op3 ldp, s, 4, \type |
| |
| op3 stp, d, 8, \type |
| op3 ldp, d, 8, \type |
| |
| op3 stp, q, 16, \type |
| op3 ldp, q, 16, \type |
| .endm |
| |
| .macro ldst_reg_na_pair type |
| // op, reg, size(in byte) of one of the pair, type |
| op3 stnp, w, 4, \type |
| op3 ldnp, w, 4, \type |
| |
| op3 stnp, x, 8, \type |
| op3 ldnp, x, 8, \type |
| |
| op3 stnp, s, 4, \type |
| op3 ldnp, s, 4, \type |
| |
| op3 stnp, d, 8, \type |
| op3 ldnp, d, 8, \type |
| |
| op3 stnp, q, 16, \type |
| op3 ldnp, q, 16, \type |
| .endm |
| |
| func: |
| // Load-store reg.pair (offset) |
| ldst_reg_pair 1 |
| |
| // Load-store reg.pair (post-ind.) |
| ldst_reg_pair 2 |
| |
| // Load-store reg.pair (pre-ind.) |
| ldst_reg_pair 3 |
| |
| // Load-store na.pair (offset) |
| ldst_reg_na_pair 1 |