Index: lib/Target/Mips/MipsFastISel.cpp =================================================================== --- lib/Target/Mips/MipsFastISel.cpp +++ lib/Target/Mips/MipsFastISel.cpp @@ -130,6 +130,8 @@ // We will extend this in a later patch: // If this is a type than can be sign or zero-extended to a basic operation // go ahead and accept it now. + if (VT == MVT::i8 || VT == MVT::i16) + return true; return false; } @@ -226,7 +228,7 @@ Opc=Mips::SWC1; break; case MVT::f64: - Opc=MVT::f64; + Opc=Mips::SDC1; break; default: return false; Index: test/CodeGen/Mips/Fast-ISel/loadstore2.ll =================================================================== --- /dev/null +++ test/CodeGen/Mips/Fast-ISel/loadstore2.ll @@ -0,0 +1,84 @@ +; ModuleID = 'loadstore2.c' +target datalayout = "E-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64" +target triple = "mips--linux-gnu" + +@c2 = common global i8 0, align 1 +@c1 = common global i8 0, align 1 +; RUN: llc -march=mipsel -relocation-model=pic -O0 -mips-fast-isel -fast-isel-abort -mcpu=mips32r2 \ +; RUN: < %s | FileCheck %s + +@s2 = common global i16 0, align 2 +@s1 = common global i16 0, align 2 +@i2 = common global i32 0, align 4 +@i1 = common global i32 0, align 4 +@f2 = common global float 0.000000e+00, align 4 +@f1 = common global float 0.000000e+00, align 4 +@d2 = common global double 0.000000e+00, align 8 +@d1 = common global double 0.000000e+00, align 8 + +; Function Attrs: nounwind +define void @cfoo() #0 { +entry: + %0 = load i8* @c2, align 1 + store i8 %0, i8* @c1, align 1 +; CHECK: .ent cfoo +; CHECK: lb ${{[0-9]+}}, 0(${{[0-9]+}}) +; CHECK: sb ${{[0-9]+}}, 0(${{[0-9]+}}) +; CHECK: .end cfoo + + ret void +} + +; Function Attrs: nounwind +define void @sfoo() #0 { +entry: + %0 = load i16* @s2, align 2 + store i16 %0, i16* @s1, align 2 +; CHECK: .ent sfoo +; CHECK: lh ${{[0-9]+}}, 0(${{[0-9]+}}) +; CHECK: sh ${{[0-9]+}}, 0(${{[0-9]+}}) +; CHECK: .end sfoo + ret void +} + +; Function Attrs: nounwind +define void @ifoo() #0 { +entry: + %0 = load i32* @i2, align 4 + store i32 %0, i32* @i1, align 4 +; CHECK: .ent ifoo +; CHECK: lw ${{[0-9]+}}, 0(${{[0-9]+}}) +; CHECK: sw ${{[0-9]+}}, 0(${{[0-9]+}}) +; CHECK: .end ifoo + + ret void +} + +; Function Attrs: nounwind +define void @ffoo() #0 { +entry: + %0 = load float* @f2, align 4 + store float %0, float* @f1, align 4 +; CHECK: .ent ffoo +; CHECK: lwc1 $f{{[0-9]+}}, 0(${{[0-9]+}}) +; CHECK: swc1 $f{{[0-9]+}}, 0(${{[0-9]+}}) +; CHECK: .end ffoo + + ret void +} + +; Function Attrs: nounwind +define void @dfoo() #0 { +entry: + %0 = load double* @d2, align 8 + store double %0, double* @d1, align 8 +; CHECK: .ent dfoo +; CHECK: ldc1 $f{{[0-9]+}}, 0(${{[0-9]+}}) +; CHECK: sdc1 $f{{[0-9]+}}, 0(${{[0-9]+}}) +; CHECK: .end dfoo + ret void +} + +attributes #0 = { nounwind "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" } + +