diff options
author | Daniel Dunbar <daniel@zuster.org> | 2010-01-19 00:01:10 +0000 |
---|---|---|
committer | Daniel Dunbar <daniel@zuster.org> | 2010-01-19 00:01:10 +0000 |
commit | 4c43c2bc73be7c15c65f17c4ee54c920d7ce011b (patch) | |
tree | 2c23e466f7279b9ef43b8da9083560013d0b2e32 | |
parent | 889ce76f41c5aa05997c3e820c1bf9e7bea2f63a (diff) | |
download | bcm5719-llvm-4c43c2bc73be7c15c65f17c4ee54c920d7ce011b.tar.gz bcm5719-llvm-4c43c2bc73be7c15c65f17c4ee54c920d7ce011b.zip |
Split up switch.S and save_restore_d8_d15.S to follow one function per file convention.
llvm-svn: 93815
-rw-r--r-- | compiler-rt/lib/arm/restore_vfp_d8_d15_regs.S (renamed from compiler-rt/lib/arm/save_restore_d8_d15.S) | 19 | ||||
-rw-r--r-- | compiler-rt/lib/arm/save_vfp_d8_d15_regs.S | 34 | ||||
-rw-r--r-- | compiler-rt/lib/arm/switch.S | 87 | ||||
-rw-r--r-- | compiler-rt/lib/arm/switch16.S | 43 | ||||
-rw-r--r-- | compiler-rt/lib/arm/switch32.S | 45 | ||||
-rw-r--r-- | compiler-rt/lib/arm/switch8.S | 42 | ||||
-rw-r--r-- | compiler-rt/lib/arm/switchu8.S | 42 |
7 files changed, 211 insertions, 101 deletions
diff --git a/compiler-rt/lib/arm/save_restore_d8_d15.S b/compiler-rt/lib/arm/restore_vfp_d8_d15_regs.S index 3ff0b413335..3c742f69108 100644 --- a/compiler-rt/lib/arm/save_restore_d8_d15.S +++ b/compiler-rt/lib/arm/restore_vfp_d8_d15_regs.S @@ -11,25 +11,16 @@ // // When compiling C++ functions that need to handle thrown exceptions the -// compiler is required to save all registers and call __Unwind_SjLj_Register -// in the function prolog. But when compiling for thumb1, there are +// compiler is required to save all registers and call __Unwind_SjLj_Register +// in the function prolog. But when compiling for thumb1, there are // no instructions to access the floating point registers, so the // compiler needs to add a call to the helper function _save_vfp_d8_d15_regs -// written in ARM to save the float registers. In the epilog, the compiler +// written in ARM to save the float registers. In the epilog, the compiler // must also add a call to __restore_vfp_d8_d15_regs to restore those registers. // .text - .syntax unified - -// -// Save registers d8-d15 onto stack -// -DEFINE_COMPILERRT_PRIVATE_FUNCTION(__save_vfp_d8_d15_regs) - vstmdb sp!, {d8-d15} // push registers d8-d15 onto stack - bx lr // return to prolog - - + .syntax unified // // Restore registers d8-d15 from stack @@ -42,4 +33,4 @@ DEFINE_COMPILERRT_PRIVATE_FUNCTION(__restore_vfp_d8_d15_regs) // tell linker it can break up file at label boundaries .subsections_via_symbols - + diff --git a/compiler-rt/lib/arm/save_vfp_d8_d15_regs.S b/compiler-rt/lib/arm/save_vfp_d8_d15_regs.S new file mode 100644 index 00000000000..97ceac1a5b3 --- /dev/null +++ b/compiler-rt/lib/arm/save_vfp_d8_d15_regs.S @@ -0,0 +1,34 @@ +//===-- save_restore_regs.S - Implement save/restore* ---------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include "../assembly.h" + +// +// When compiling C++ functions that need to handle thrown exceptions the +// compiler is required to save all registers and call __Unwind_SjLj_Register +// in the function prolog. But when compiling for thumb1, there are +// no instructions to access the floating point registers, so the +// compiler needs to add a call to the helper function _save_vfp_d8_d15_regs +// written in ARM to save the float registers. In the epilog, the compiler +// must also add a call to __restore_vfp_d8_d15_regs to restore those registers. +// + + .text + .syntax unified + +// +// Save registers d8-d15 onto stack +// +DEFINE_COMPILERRT_PRIVATE_FUNCTION(__save_vfp_d8_d15_regs) + vstmdb sp!, {d8-d15} // push registers d8-d15 onto stack + bx lr // return to prolog + + // tell linker it can break up file at label boundaries + .subsections_via_symbols + diff --git a/compiler-rt/lib/arm/switch.S b/compiler-rt/lib/arm/switch.S deleted file mode 100644 index 2d949129ee6..00000000000 --- a/compiler-rt/lib/arm/switch.S +++ /dev/null @@ -1,87 +0,0 @@ -//===-- switch.S - Implement switch* --------------------------------------===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// - -#include "../assembly.h" - -// -// When compiling switch statements in thumb mode, the compiler -// can use these __switch* helper functions The compiler emits a blx to -// the __switch* function followed by a table of displacements for each -// case statement. On entry, R0 is the index into the table. The __switch* -// function uses the return address in lr to find the start of the table. -// The first entry in the table is the count of the entries in the table. -// It then uses R0 to index into the table and get the displacement of the -// address to jump to. If R0 is greater than the size of the table, it jumps -// to the last entry in the table. Each displacement in the table is actually -// the distance from lr to the label, thus making the tables PIC. - - - .text - .syntax unified - -// -// The table contains unsigned byte sized elements which are 1/2 the distance -// from lr to the target label. -// -DEFINE_COMPILERRT_PRIVATE_FUNCTION(__switchu8) - ldrb ip, [lr, #-1] // get first byte in table - cmp r0, ip // compare with index - ldrbcc r0, [lr, r0] // get indexed byte out of table - ldrbhs r0, [lr, ip] // if out of range, use last entry in table - add ip, lr, r0, lsl #1 // compute label = lr + element*2 - bx ip // jump to computed label - - - -// -// The table contains signed byte sized elements which are 1/2 the distance -// from lr to the target label. -// -DEFINE_COMPILERRT_PRIVATE_FUNCTION(__switch8) - ldrb ip, [lr, #-1] // get first byte in table - cmp r0, ip // signed compare with index - ldrsbcc r0, [lr, r0] // get indexed byte out of table - ldrsbhs r0, [lr, ip] // if out of range, use last entry in table - add ip, lr, r0, lsl #1 // compute label = lr + element*2 - bx ip // jump to computed label - - -// -// The table contains signed 2-byte sized elements which are 1/2 the distance -// from lr to the target label. -// -DEFINE_COMPILERRT_PRIVATE_FUNCTION(__switch16) - ldrh ip, [lr, #-1] // get first 16-bit word in table - cmp r0, ip // compare with index - add r0, lr, r0, lsl #1 // compute address of element in table - ldrshcc r0, [r0, #1] // load 16-bit element if r0 is in range - add ip, lr, ip, lsl #1 // compute address of last element in table - ldrshhs r0, [ip, #1] // load 16-bit element if r0 out of range - add ip, lr, r0, lsl #1 // compute label = lr + element*2 - bx ip // jump to computed label - - -// -// The table contains signed 4-byte sized elements which are the distance -// from lr to the target label. -// -DEFINE_COMPILERRT_PRIVATE_FUNCTION(__switch32) - ldr ip, [lr, #-1] // get first 32-bit word in table - cmp r0, ip // compare with index - add r0, lr, r0, lsl #2 // compute address of element in table - ldrcc r0, [r0, #3] // load 32-bit element if r0 is in range - add ip, lr, ip, lsl #2 // compute address of last element in table - ldrcs r0, [ip, #3] // load 32-bit element if r0 out of range - add ip, lr, r0 // compute label = lr + element - bx ip // jump to computed label - - - // tell linker it can break up file at label boundaries - .subsections_via_symbols - diff --git a/compiler-rt/lib/arm/switch16.S b/compiler-rt/lib/arm/switch16.S new file mode 100644 index 00000000000..72554010afc --- /dev/null +++ b/compiler-rt/lib/arm/switch16.S @@ -0,0 +1,43 @@ +//===-- switch.S - Implement switch* --------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include "../assembly.h" + +// +// When compiling switch statements in thumb mode, the compiler +// can use these __switch* helper functions The compiler emits a blx to +// the __switch* function followed by a table of displacements for each +// case statement. On entry, R0 is the index into the table. The __switch* +// function uses the return address in lr to find the start of the table. +// The first entry in the table is the count of the entries in the table. +// It then uses R0 to index into the table and get the displacement of the +// address to jump to. If R0 is greater than the size of the table, it jumps +// to the last entry in the table. Each displacement in the table is actually +// the distance from lr to the label, thus making the tables PIC. + + + .text + .syntax unified + +// +// The table contains signed 2-byte sized elements which are 1/2 the distance +// from lr to the target label. +// +DEFINE_COMPILERRT_PRIVATE_FUNCTION(__switch16) + ldrh ip, [lr, #-1] // get first 16-bit word in table + cmp r0, ip // compare with index + add r0, lr, r0, lsl #1 // compute address of element in table + ldrshcc r0, [r0, #1] // load 16-bit element if r0 is in range + add ip, lr, ip, lsl #1 // compute address of last element in table + ldrshhs r0, [ip, #1] // load 16-bit element if r0 out of range + add ip, lr, r0, lsl #1 // compute label = lr + element*2 + bx ip // jump to computed label + + // tell linker it can break up file at label boundaries + .subsections_via_symbols diff --git a/compiler-rt/lib/arm/switch32.S b/compiler-rt/lib/arm/switch32.S new file mode 100644 index 00000000000..2a36fef7133 --- /dev/null +++ b/compiler-rt/lib/arm/switch32.S @@ -0,0 +1,45 @@ +//===-- switch.S - Implement switch* --------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include "../assembly.h" + +// +// When compiling switch statements in thumb mode, the compiler +// can use these __switch* helper functions The compiler emits a blx to +// the __switch* function followed by a table of displacements for each +// case statement. On entry, R0 is the index into the table. The __switch* +// function uses the return address in lr to find the start of the table. +// The first entry in the table is the count of the entries in the table. +// It then uses R0 to index into the table and get the displacement of the +// address to jump to. If R0 is greater than the size of the table, it jumps +// to the last entry in the table. Each displacement in the table is actually +// the distance from lr to the label, thus making the tables PIC. + + + .text + .syntax unified + +// +// The table contains signed 4-byte sized elements which are the distance +// from lr to the target label. +// +DEFINE_COMPILERRT_PRIVATE_FUNCTION(__switch32) + ldr ip, [lr, #-1] // get first 32-bit word in table + cmp r0, ip // compare with index + add r0, lr, r0, lsl #2 // compute address of element in table + ldrcc r0, [r0, #3] // load 32-bit element if r0 is in range + add ip, lr, ip, lsl #2 // compute address of last element in table + ldrcs r0, [ip, #3] // load 32-bit element if r0 out of range + add ip, lr, r0 // compute label = lr + element + bx ip // jump to computed label + + + // tell linker it can break up file at label boundaries + .subsections_via_symbols + diff --git a/compiler-rt/lib/arm/switch8.S b/compiler-rt/lib/arm/switch8.S new file mode 100644 index 00000000000..530acfd1d1d --- /dev/null +++ b/compiler-rt/lib/arm/switch8.S @@ -0,0 +1,42 @@ +//===-- switch.S - Implement switch* --------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include "../assembly.h" + +// +// When compiling switch statements in thumb mode, the compiler +// can use these __switch* helper functions The compiler emits a blx to +// the __switch* function followed by a table of displacements for each +// case statement. On entry, R0 is the index into the table. The __switch* +// function uses the return address in lr to find the start of the table. +// The first entry in the table is the count of the entries in the table. +// It then uses R0 to index into the table and get the displacement of the +// address to jump to. If R0 is greater than the size of the table, it jumps +// to the last entry in the table. Each displacement in the table is actually +// the distance from lr to the label, thus making the tables PIC. + + + .text + .syntax unified + +// +// The table contains signed byte sized elements which are 1/2 the distance +// from lr to the target label. +// +DEFINE_COMPILERRT_PRIVATE_FUNCTION(__switch8) + ldrb ip, [lr, #-1] // get first byte in table + cmp r0, ip // signed compare with index + ldrsbcc r0, [lr, r0] // get indexed byte out of table + ldrsbhs r0, [lr, ip] // if out of range, use last entry in table + add ip, lr, r0, lsl #1 // compute label = lr + element*2 + bx ip // jump to computed label + + // tell linker it can break up file at label boundaries + .subsections_via_symbols + diff --git a/compiler-rt/lib/arm/switchu8.S b/compiler-rt/lib/arm/switchu8.S new file mode 100644 index 00000000000..e161c41a490 --- /dev/null +++ b/compiler-rt/lib/arm/switchu8.S @@ -0,0 +1,42 @@ +//===-- switch.S - Implement switch* --------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include "../assembly.h" + +// +// When compiling switch statements in thumb mode, the compiler +// can use these __switch* helper functions The compiler emits a blx to +// the __switch* function followed by a table of displacements for each +// case statement. On entry, R0 is the index into the table. The __switch* +// function uses the return address in lr to find the start of the table. +// The first entry in the table is the count of the entries in the table. +// It then uses R0 to index into the table and get the displacement of the +// address to jump to. If R0 is greater than the size of the table, it jumps +// to the last entry in the table. Each displacement in the table is actually +// the distance from lr to the label, thus making the tables PIC. + + + .text + .syntax unified + +// +// The table contains unsigned byte sized elements which are 1/2 the distance +// from lr to the target label. +// +DEFINE_COMPILERRT_PRIVATE_FUNCTION(__switchu8) + ldrb ip, [lr, #-1] // get first byte in table + cmp r0, ip // compare with index + ldrbcc r0, [lr, r0] // get indexed byte out of table + ldrbhs r0, [lr, ip] // if out of range, use last entry in table + add ip, lr, r0, lsl #1 // compute label = lr + element*2 + bx ip // jump to computed label + + // tell linker it can break up file at label boundaries + .subsections_via_symbols + |