2
2
3
3
use crate :: sync:: with_irqs_disabled;
4
4
use core:: {
5
+ arch:: asm,
5
6
cell:: UnsafeCell ,
6
7
mem:: { align_of, size_of, MaybeUninit } ,
7
8
ptr,
@@ -20,8 +21,10 @@ unsafe fn transfer<T: Copy>(dst: *mut T, src: *const T) {
20
21
// We can do an 4-byte aligned transfer up to 16 bytes.
21
22
transfer_align4_thumb ( dst, src) ;
22
23
} else if size <= 36 && align % 4 == 0 {
23
- // We can do the same up to 36 bytes, but we need to switch to ARM.
24
- transfer_align4_arm ( dst, src) ;
24
+ // // We can do the same up to 36 bytes, but we need to switch to ARM.
25
+ // transfer_align4_arm(dst, src);
26
+ // TODO(rust-console/gba#158) Cannot optimize larger transfers for now.
27
+ with_irqs_disabled ( || ptr:: write_volatile ( dst, ptr:: read_volatile ( src) ) ) ;
25
28
} else if size <= 2 && align % 2 == 0 {
26
29
// We can do a 2-byte aligned transfer up to 2 bytes.
27
30
asm ! (
@@ -82,65 +85,66 @@ unsafe fn transfer_align4_thumb<T: Copy>(mut dst: *mut T, mut src: *const T) {
82
85
}
83
86
}
84
87
85
- #[ cfg( target_arch = "arm" ) ]
86
- #[ instruction_set( arm:: a32) ]
87
- #[ allow( unused_assignments) ]
88
- unsafe fn transfer_align4_arm < T : Copy > ( mut dst : * mut T , mut src : * const T ) {
89
- let size = size_of :: < T > ( ) ;
90
- if size <= 16 {
91
- unimplemented ! ( "This should be done via transfer_thumb." ) ;
92
- } else if size <= 20 {
93
- // Starting at size == 20, we have to switch to ARM due to lack of
94
- // accessible registers in THUMB mode.
95
- asm ! (
96
- "ldmia {0}!, {{r2-r5,r8}}" ,
97
- "stmia {1}!, {{r2-r5,r8}}" ,
98
- inout( reg) src, inout( reg) dst,
99
- out( "r2" ) _, out( "r3" ) _, out( "r4" ) _, out( "r5" ) _, out( "r8" ) _,
100
- )
101
- } else if size <= 24 {
102
- asm ! (
103
- "push {{r9}}" ,
104
- "ldmia {0}!, {{r2-r5,r8-r9}}" ,
105
- "stmia {1}!, {{r2-r5,r8-r9}}" ,
106
- "pop {{r9}}" ,
107
- inout( reg) src, inout( reg) dst,
108
- out( "r2" ) _, out( "r3" ) _, out( "r4" ) _, out( "r5" ) _, out( "r8" ) _,
109
- )
110
- } else if size <= 28 {
111
- asm ! (
112
- "push {{r9}}" ,
113
- "ldmia {0}!, {{r2-r5,r8-r10}}" ,
114
- "stmia {1}!, {{r2-r5,r8-r10}}" ,
115
- "pop {{r9}}" ,
116
- inout( reg) src, inout( reg) dst,
117
- out( "r2" ) _, out( "r3" ) _, out( "r4" ) _, out( "r5" ) _, out( "r8" ) _,
118
- out( "r10" ) _,
119
- )
120
- } else if size <= 32 {
121
- asm ! (
122
- "push {{r9}}" ,
123
- "ldmia {0}!, {{r2-r5,r8-r10,r12}}" ,
124
- "stmia {1}!, {{r2-r5,r8-r10,r12}}" ,
125
- "pop {{r9}}" ,
126
- inout( reg) src, inout( reg) dst,
127
- out( "r2" ) _, out( "r3" ) _, out( "r4" ) _, out( "r5" ) _, out( "r8" ) _,
128
- out( "r10" ) _, out( "r12" ) _,
129
- )
130
- } else if size <= 36 {
131
- asm ! (
132
- "push {{r9}}" ,
133
- "ldmia {0}!, {{r2-r5,r8-r10,r12,r14}}" ,
134
- "stmia {1}!, {{r2-r5,r8-r10,r12,r14}}" ,
135
- "pop {{r9}}" ,
136
- inout( reg) src, inout( reg) dst,
137
- out( "r2" ) _, out( "r3" ) _, out( "r4" ) _, out( "r5" ) _, out( "r8" ) _,
138
- out( "r10" ) _, out( "r12" ) _, out( "r14" ) _,
139
- )
140
- } else {
141
- unimplemented ! ( "Copy too large for use of ldmia/stmia." ) ;
142
- }
143
- }
88
+ // TODO(rust-console/gba#158) Un-comment out this fn when we can use higher registers.
89
+ // #[cfg(target_arch = "arm")]
90
+ // #[instruction_set(arm::a32)]
91
+ // #[allow(unused_assignments)]
92
+ // unsafe fn transfer_align4_arm<T: Copy>(mut dst: *mut T, mut src: *const T) {
93
+ // let size = size_of::<T>();
94
+ // if size <= 16 {
95
+ // unimplemented!("This should be done via transfer_thumb.");
96
+ // } else if size <= 20 {
97
+ // // Starting at size == 20, we have to switch to ARM due to lack of
98
+ // // accessible registers in THUMB mode.
99
+ // asm!(
100
+ // "ldmia {0}!, {{r2-r5,r8}}",
101
+ // "stmia {1}!, {{r2-r5,r8}}",
102
+ // inout(reg) src, inout(reg) dst,
103
+ // out("r2") _, out("r3") _, out("r4") _, out("r5") _, out("r8") _,
104
+ // )
105
+ // } else if size <= 24 {
106
+ // asm!(
107
+ // "push {{r9}}",
108
+ // "ldmia {0}!, {{r2-r5,r8-r9}}",
109
+ // "stmia {1}!, {{r2-r5,r8-r9}}",
110
+ // "pop {{r9}}",
111
+ // inout(reg) src, inout(reg) dst,
112
+ // out("r2") _, out("r3") _, out("r4") _, out("r5") _, out("r8") _,
113
+ // )
114
+ // } else if size <= 28 {
115
+ // asm!(
116
+ // "push {{r9}}",
117
+ // "ldmia {0}!, {{r2-r5,r8-r10}}",
118
+ // "stmia {1}!, {{r2-r5,r8-r10}}",
119
+ // "pop {{r9}}",
120
+ // inout(reg) src, inout(reg) dst,
121
+ // out("r2") _, out("r3") _, out("r4") _, out("r5") _, out("r8") _,
122
+ // out("r10") _,
123
+ // )
124
+ // } else if size <= 32 {
125
+ // asm!(
126
+ // "push {{r9}}",
127
+ // "ldmia {0}!, {{r2-r5,r8-r10,r12}}",
128
+ // "stmia {1}!, {{r2-r5,r8-r10,r12}}",
129
+ // "pop {{r9}}",
130
+ // inout(reg) src, inout(reg) dst,
131
+ // out("r2") _, out("r3") _, out("r4") _, out("r5") _, out("r8") _,
132
+ // out("r10") _, out("r12") _,
133
+ // )
134
+ // } else if size <= 36 {
135
+ // asm!(
136
+ // "push {{r9}}",
137
+ // "ldmia {0}!, {{r2-r5,r8-r10,r12,r14}}",
138
+ // "stmia {1}!, {{r2-r5,r8-r10,r12,r14}}",
139
+ // "pop {{r9}}",
140
+ // inout(reg) src, inout(reg) dst,
141
+ // out("r2") _, out("r3") _, out("r4") _, out("r5") _, out("r8") _,
142
+ // out("r10") _, out("r12") _, out("r14") _,
143
+ // )
144
+ // } else {
145
+ // unimplemented!("Copy too large for use of ldmia/stmia.");
146
+ // }
147
+ // }
144
148
145
149
/// The internal function for swapping the current value of a [`Static`] with
146
150
/// another value.
0 commit comments