/* Copyright (c) 2014 The Chromium OS Authors. All rights reserved. * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. * * Thumb mode toolchain helpers for compact switch/case statement. */ #include "config.h" .text .syntax unified .code 16 /* * Helpers for compact switch * * r0: the table index * lr: the table base address (need to clear bit 0) * * r0 and lr must be PRESERVED. * r12 can be clobbered. */ .global __gnu_thumb1_case_uqi .thumb_func __gnu_thumb1_case_uqi: mov r12, r1 mov r1, lr lsrs r1, r1, #1 lsls r1, r1, #1 ldrb r1, [r1, r0] lsls r1, r1, #1 add lr, lr, r1 mov r1, r12 bx lr .global __gnu_thumb1_case_sqi .thumb_func __gnu_thumb1_case_sqi: mov r12, r1 mov r1, lr lsrs r1, r1, #1 lsls r1, r1, #1 ldrsb r1, [r1, r0] lsls r1, r1, #1 add lr, lr, r1 mov r1, r12 bx lr .global __gnu_thumb1_case_uhi .thumb_func __gnu_thumb1_case_uhi: push {r0, r1} mov r1, lr lsrs r1, r1, #1 lsls r0, r0, #1 lsls r1, r1, #1 ldrh r1, [r1, r0] lsls r1, r1, #1 add lr, lr, r1 pop {r0, r1} bx lr .global __gnu_thumb1_case_shi .thumb_func __gnu_thumb1_case_shi: push {r0, r1} mov r1, lr lsrs r1, r1, #1 lsls r0, r0, #1 lsls r1, r1, #1 ldrsh r1, [r1, r0] lsls r1, r1, #1 add lr, lr, r1 pop {r0, r1} bx lr