| OLD | NEW |
| 1 ; This tries to be a comprehensive test of f32 and f64 compare operations. | 1 ; This tries to be a comprehensive test of f32 and f64 compare operations. |
| 2 ; The CHECK lines are only checking for basic instruction patterns | 2 ; The CHECK lines are only checking for basic instruction patterns |
| 3 ; that should be present regardless of the optimization level, so | 3 ; that should be present regardless of the optimization level, so |
| 4 ; there are no special OPTM1 match lines. | 4 ; there are no special OPTM1 match lines. |
| 5 | 5 |
| 6 ; RUN: %p2i --filetype=obj --disassemble -i %s --args -O2 | FileCheck %s | 6 ; RUN: %p2i --filetype=obj --disassemble -i %s --args -O2 | FileCheck %s |
| 7 ; RUN: %p2i --filetype=obj --disassemble -i %s --args -Om1 | FileCheck %s | 7 ; RUN: %p2i --filetype=obj --disassemble -i %s --args -Om1 | FileCheck %s |
| 8 | 8 |
| 9 ; RUN: %if --need=target_MIPS32 --need=allow_dump \ | 9 ; RUN: %if --need=target_MIPS32 --need=allow_dump \ |
| 10 ; RUN: --command %p2i --filetype=asm --assemble \ | 10 ; RUN: --command %p2i --filetype=asm --assemble \ |
| 11 ; RUN: --disassemble --target mips32 -i %s --args -Om1 --skip-unimplemented \ | 11 ; RUN: --disassemble --target mips32 -i %s --args -Om1 --skip-unimplemented \ |
| 12 ; RUN: -allow-externally-defined-symbols \ | 12 ; RUN: -allow-externally-defined-symbols \ |
| 13 ; RUN: | %if --need=target_MIPS32 --need=allow_dump \ | 13 ; RUN: | %if --need=target_MIPS32 --need=allow_dump \ |
| 14 ; RUN: --command FileCheck --check-prefix MIPS32 %s | 14 ; RUN: --command FileCheck --check-prefix MIPS32 %s |
| 15 | 15 |
| 16 ; RUN: %if --need=target_MIPS32 --need=allow_dump \ |
| 17 ; RUN: --command %p2i --filetype=asm --assemble \ |
| 18 ; RUN: --disassemble --target mips32 -i %s --args -O2 --skip-unimplemented \ |
| 19 ; RUN: -allow-externally-defined-symbols \ |
| 20 ; RUN: | %if --need=target_MIPS32 --need=allow_dump \ |
| 21 ; RUN: --command FileCheck --check-prefix MIPS32O2 %s |
| 22 |
| 16 define internal float @loadFloat(i32 %a) { | 23 define internal float @loadFloat(i32 %a) { |
| 17 entry: | 24 entry: |
| 18 %__1 = inttoptr i32 %a to float* | 25 %__1 = inttoptr i32 %a to float* |
| 19 %v0 = load float, float* %__1, align 4 | 26 %v0 = load float, float* %__1, align 4 |
| 20 ret float %v0 | 27 ret float %v0 |
| 21 } | 28 } |
| 22 ; CHECK-LABEL: loadFloat | 29 ; CHECK-LABEL: loadFloat |
| 23 ; CHECK: movss | 30 ; CHECK: movss |
| 24 ; CHECK: fld | 31 ; CHECK: fld |
| 25 | 32 |
| 26 ; MIPS32-LABEL: loadFloat | 33 ; MIPS32-LABEL: loadFloat |
| 27 ; MIPS32: lwc1 $f{{.*}},0{{.*}} | 34 ; MIPS32: lwc1 $f{{.*}},0{{.*}} |
| 35 ; MIPS32O2-LABEL: loadFloat |
| 36 ; MIPS32O2: lwc1 $f{{.*}},0{{.*}} |
| 28 | 37 |
| 29 define internal double @loadDouble(i32 %a) { | 38 define internal double @loadDouble(i32 %a) { |
| 30 entry: | 39 entry: |
| 31 %__1 = inttoptr i32 %a to double* | 40 %__1 = inttoptr i32 %a to double* |
| 32 %v0 = load double, double* %__1, align 8 | 41 %v0 = load double, double* %__1, align 8 |
| 33 ret double %v0 | 42 ret double %v0 |
| 34 } | 43 } |
| 35 ; CHECK-LABEL: loadDouble | 44 ; CHECK-LABEL: loadDouble |
| 36 ; CHECK: movsd | 45 ; CHECK: movsd |
| 37 ; CHECK: fld | 46 ; CHECK: fld |
| 38 | 47 |
| 39 ; MIPS32-LABEL: loadDouble | 48 ; MIPS32-LABEL: loadDouble |
| 40 ; MIPS32: ldc1 $f{{.*}},0{{.*}} | 49 ; MIPS32: ldc1 $f{{.*}},0{{.*}} |
| 50 ; MIPS32O2-LABEL: loadDouble |
| 51 ; MIPS32O2: ldc1 $f{{.*}},0{{.*}} |
| 41 | 52 |
| 42 define internal void @storeFloat(i32 %a, float %value) { | 53 define internal void @storeFloat(i32 %a, float %value) { |
| 43 entry: | 54 entry: |
| 44 %__2 = inttoptr i32 %a to float* | 55 %__2 = inttoptr i32 %a to float* |
| 45 store float %value, float* %__2, align 4 | 56 store float %value, float* %__2, align 4 |
| 46 ret void | 57 ret void |
| 47 } | 58 } |
| 48 ; CHECK-LABEL: storeFloat | 59 ; CHECK-LABEL: storeFloat |
| 49 ; CHECK: movss | 60 ; CHECK: movss |
| 50 ; CHECK: movss | 61 ; CHECK: movss |
| 51 | 62 |
| 52 ; MIPS32-LABEL: storeFloat | 63 ; MIPS32-LABEL: storeFloat |
| 53 ; MIPS32: swc1 $f{{.*}},0{{.*}} | 64 ; MIPS32: swc1 $f{{.*}},0{{.*}} |
| 65 ; MIPS32O2-LABEL: storeFloat |
| 66 ; MIPS32O2: mtc1 a1,$f{{.*}} |
| 67 ; MIPS32O2: swc1 $f{{.*}},0(a0) |
| 54 | 68 |
| 55 define internal void @storeDouble(i32 %a, double %value) { | 69 define internal void @storeDouble(i32 %a, double %value) { |
| 56 entry: | 70 entry: |
| 57 %__2 = inttoptr i32 %a to double* | 71 %__2 = inttoptr i32 %a to double* |
| 58 store double %value, double* %__2, align 8 | 72 store double %value, double* %__2, align 8 |
| 59 ret void | 73 ret void |
| 60 } | 74 } |
| 61 ; CHECK-LABEL: storeDouble | 75 ; CHECK-LABEL: storeDouble |
| 62 ; CHECK: movsd | 76 ; CHECK: movsd |
| 63 ; CHECK: movsd | 77 ; CHECK: movsd |
| 64 | 78 |
| 65 ; MIPS32-LABEL: storeDouble | 79 ; MIPS32-LABEL: storeDouble |
| 66 ; MIPS32: ldc1 $f{{.*}},4{{.*}} | 80 ; MIPS32: ldc1 $f{{.*}},4{{.*}} |
| 67 ; MIPS32: sdc1 $f{{.*}},0{{.*}} | 81 ; MIPS32: sdc1 $f{{.*}},0{{.*}} |
| 82 ; MIPS32O2-LABEL: storeDouble |
| 83 ; MIPS32O2: mtc1 a3,$f{{.*}} |
| 84 ; MIPS32O2: mtc1 a2,$f{{.*}} |
| 85 ; MIPS32O2: sdc1 $f{{.*}},0(a0) |
| 68 | 86 |
| 69 define internal void @storeFloatConst(i32 %a) { | 87 define internal void @storeFloatConst(i32 %a) { |
| 70 entry: | 88 entry: |
| 71 %a.asptr = inttoptr i32 %a to float* | 89 %a.asptr = inttoptr i32 %a to float* |
| 72 store float 0x3FF3AE1480000000, float* %a.asptr, align 4 | 90 store float 0x3FF3AE1480000000, float* %a.asptr, align 4 |
| 73 ret void | 91 ret void |
| 74 } | 92 } |
| 75 ; CHECK-LABEL: storeFloatConst | 93 ; CHECK-LABEL: storeFloatConst |
| 76 ; CHECK: movss | 94 ; CHECK: movss |
| 77 ; CHECK: movss | 95 ; CHECK: movss |
| 78 | 96 |
| 79 ; MIPS32-LABEL: storeFloatConst | 97 ; MIPS32-LABEL: storeFloatConst |
| 80 ; MIPS32: lui {{.*}},{{.*}} | 98 ; MIPS32: lui {{.*}},{{.*}} |
| 81 ; MIPS32: lwc1 $f{{.*}},{{.*}} | 99 ; MIPS32: lwc1 $f{{.*}},{{.*}} |
| 82 ; MIPS32: swc1 $f{{.*}},0{{.*}} | 100 ; MIPS32: swc1 $f{{.*}},0{{.*}} |
| 101 ; MIPS32O2-LABEL: storeFloatConst |
| 102 ; MIPS32O2: lui {{.*}},{{.*}} |
| 103 ; MIPS32O2: lwc1 $f{{.*}},{{.*}} |
| 104 ; MIPS32O2: swc1 $f{{.*}},0{{.*}} |
| 83 | 105 |
| 84 define internal void @storeDoubleConst(i32 %a) { | 106 define internal void @storeDoubleConst(i32 %a) { |
| 85 entry: | 107 entry: |
| 86 %a.asptr = inttoptr i32 %a to double* | 108 %a.asptr = inttoptr i32 %a to double* |
| 87 store double 1.230000e+00, double* %a.asptr, align 8 | 109 store double 1.230000e+00, double* %a.asptr, align 8 |
| 88 ret void | 110 ret void |
| 89 } | 111 } |
| 90 ; CHECK-LABEL: storeDoubleConst | 112 ; CHECK-LABEL: storeDoubleConst |
| 91 ; CHECK: movsd | 113 ; CHECK: movsd |
| 92 ; CHECK: movsd | 114 ; CHECK: movsd |
| 93 | 115 |
| 94 ; MIPS32-LABEL: storeDoubleConst | 116 ; MIPS32-LABEL: storeDoubleConst |
| 95 ; MIPS32: lui {{.*}},{{.*}} | 117 ; MIPS32: lui {{.*}},{{.*}} |
| 96 ; MIPS32: ldc1 $f{{.*}},{{.*}} | 118 ; MIPS32: ldc1 $f{{.*}},{{.*}} |
| 97 ; MIPS32: sdc1 $f{{.*}},0{{.*}} | 119 ; MIPS32: sdc1 $f{{.*}},0{{.*}} |
| 120 ; MIPS32O2-LABEL: storeDoubleConst |
| 121 ; MIPS32O2: lui {{.*}},{{.*}} |
| 122 ; MIPS32O2: ldc1 $f{{.*}},{{.*}} |
| 123 ; MIPS32O2: sdc1 $f{{.*}},0{{.*}} |
| OLD | NEW |