.macro fpu_save_16even thread tmp=t0
cfc1 \tmp, fcr31
+ sdc1 $f0, THREAD_FPR0(\thread)
sdc1 $f2, THREAD_FPR2(\thread)
sdc1 $f4, THREAD_FPR4(\thread)
sdc1 $f6, THREAD_FPR6(\thread)
sdc1 $f31, THREAD_FPR31(\thread)
.endm
+ .macro fpu_save_double thread status tmp1 tmp2
+ sll \tmp2, \tmp1, 5
+ bgez \tmp2, 2f
+ fpu_save_16odd \thread
+2:
+ fpu_save_16even \thread \tmp1 # clobbers t1
+ .endm
+
.macro fpu_restore_16even thread tmp=t0
lw \tmp, THREAD_FCR31(\thread)
ldc1 $f0, THREAD_FPR0(\thread)
ldc1 $f31, THREAD_FPR31(\thread)
.endm
+ .macro fpu_restore_double thread tmp
+ mfc0 t0, CP0_STATUS
+ sll t1, t0, 5
+ bgez t1, 1f # 16 register mode?
+
+ fpu_restore_16odd a0
+1: fpu_restore_16even a0, t0 # clobbers t0
+ .endm
+
.macro cpu_save_nonscratch thread
LONG_S s0, THREAD_REG16(\thread)
LONG_S s1, THREAD_REG17(\thread)