diff options
Diffstat (limited to 'gdb/testsuite/gdb.arch/thumb2-it.S')
-rw-r--r-- | gdb/testsuite/gdb.arch/thumb2-it.S | 139 |
1 files changed, 139 insertions, 0 deletions
diff --git a/gdb/testsuite/gdb.arch/thumb2-it.S b/gdb/testsuite/gdb.arch/thumb2-it.S new file mode 100644 index 0000000..a5aab8c --- /dev/null +++ b/gdb/testsuite/gdb.arch/thumb2-it.S @@ -0,0 +1,139 @@ +/* Thumb-2 IT blocks test program. + + Copyright 2010 Free Software Foundation, Inc. + + This file is part of GDB. + + This program 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. + + This program 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. If not, see <http://www.gnu.org/licenses/>. */ + + .syntax unified + .text + .p2align 2 + .code 16 + +#ifndef __thumb2__ + + .type main,%function + .thumb_func + .globl main +main: + mov r0, #0 + bx lr @ No Thumb-2 + +#else + + .type main,%function + .thumb_func + .globl main +main: + mov r0, #0 + bx lr @ Thumb-2 OK + + @ One conditional instruction, executed. + .type it_1,%function + .thumb_func +it_1: + mov r0, #0 @ Setup + cmp r0, #0 @ Setup + it eq @ IT instruction, Expected == 1 + addeq r0, #1 @ Reached + bx lr @ Done + + @ One conditional instruction, skipped. + .type it_2,%function + .thumb_func +it_2: + mov r0, #0 @ Setup + cmp r0, #0 @ Setup + it ne @ IT instruction, Expected == 0 + addne r0, #1 @ Not reached + bx lr @ Done, Check $r0 == 0 + + @ Block of four, alternating, starting with executed. + .type it_3,%function + .thumb_func +it_3: + mov r0, #0 @ Setup + cmp r0, #0 @ Setup + itete ge @ IT instruction, Expected == 2 + addge r0, #1 @ Reached + addlt r0, #2 @ Not reached + addge r0, #4 @ Reached + addlt r0, #8 @ Not reached + bx lr @ Done, Check $r0 == 5 + + @ Block of four, changing flags. + .type it_4,%function + .thumb_func +it_4: + mov r0, #0 @ Setup + cmp r0, #0 @ Setup + itttt ge @ IT instruction, Expected == 2 + addge r0, #1 @ Reached + cmpge r0, #10 @ Reached + addge r0, #4 @ Not reached + addge r0, #8 @ Not reached + bx lr @ Done, Check $r0 == 1 + + @ Block of two, ending with taken branch. + .type it_5,%function + .thumb_func +it_5: + mov r0, #0 @ Setup + cmp r0, #0 @ Setup + itt ge @ IT instruction, Expected == 2 + addge r0, #1 @ Reached + bge .L5 @ Reached + add r0, #2 @ Never reached +.L5: bx lr @ Done, Check $r0 == 1 + + @ Block of two, ending with untaken branch. + .type it_6,%function + .thumb_func +it_6: + mov r0, #0 @ Setup + cmp r0, #0 @ Setup + ite ge @ IT instruction, Expected == 2 + addge r0, #1 @ Reached + blt .L6 @ Not reached + add r0, #2 @ Reached +.L6: bx lr @ Done, Check $r0 == 3 + + @ Block of four, taken, of different sizes + .type it_7,%function + .thumb_func +it_7: + mov r0, #0 @ Setup + cmp r0, #0 @ Setup + itttt ge @ IT instruction, Expected == 4 + addge.n r0, #1 @ Reached + addge.w r0, #2 @ Reached + addge.n r0, #4 @ Reached + addge.w r0, #8 @ Reached + bx lr @ Done, Check $r0 == 15 + + @ Block of four, only first executed. + .type it_3,%function + .thumb_func +it_8: + mov r0, #0 @ Setup + cmp r0, #0 @ Setup + iteee ge @ IT instruction, Expected == 1 + addge r0, #1 @ Reached + addlt r0, #2 @ Not reached + addlt r0, #4 @ Not reached + addlt r0, #8 @ Not reached + bx lr @ Done, Check $r0 == 1 + +#endif /* __thumb2__ */ |