< prev index next >

src/cpu/x86/vm/x86_32.ad

Print this page




9929   ins_pipe( pipe_slow );
9930 %}
9931 
9932 instruct log10D_reg(regD dst, regD src, eFlagsReg cr) %{
9933   predicate (UseSSE>=2);
9934   effect(KILL cr);
9935   match(Set dst (Log10D src));
9936   // fldlg2       ; push log_10(2) on the FPU stack; full 80-bit number
9937   // fyl2x        ; compute log_10(2) * log_2(x)
9938   format %{ "FLDLG2 \t\t\t#Log10\n\t"
9939             "FYL2X  \t\t\t# Q=Log10*Log_2(x)"
9940          %}
9941   ins_encode( Opcode(0xD9), Opcode(0xEC),   // fldlg2
9942               Push_SrcD(src),
9943               Opcode(0xD9), Opcode(0xF1),   // fyl2x
9944               Push_ResultD(dst));
9945 
9946   ins_pipe( pipe_slow );
9947 %}
9948 
9949 instruct logDPR_reg(regDPR1 dst, regDPR1 src) %{
9950   predicate (UseSSE<=1);
9951   // The source Double operand on FPU stack
9952   match(Set dst (LogD src));
9953   // fldln2       ; push log_e(2) on the FPU stack; full 80-bit number
9954   // fxch         ; swap ST(0) with ST(1)
9955   // fyl2x        ; compute log_e(2) * log_2(x)
9956   format %{ "FLDLN2 \t\t\t#Log_e\n\t"
9957             "FXCH   \n\t"
9958             "FYL2X  \t\t\t# Q=Log_e*Log_2(x)"
9959          %}
9960   ins_encode( Opcode(0xD9), Opcode(0xED),   // fldln2
9961               Opcode(0xD9), Opcode(0xC9),   // fxch
9962               Opcode(0xD9), Opcode(0xF1));  // fyl2x
9963 
9964   ins_pipe( pipe_slow );
9965 %}
9966 
9967 instruct logD_reg(regD dst, regD src, eFlagsReg cr) %{
9968   predicate (UseSSE>=2);
9969   effect(KILL cr);
9970   // The source and result Double operands in XMM registers
9971   match(Set dst (LogD src));
9972   // fldln2       ; push log_e(2) on the FPU stack; full 80-bit number
9973   // fyl2x        ; compute log_e(2) * log_2(x)
9974   format %{ "FLDLN2 \t\t\t#Log_e\n\t"
9975             "FYL2X  \t\t\t# Q=Log_e*Log_2(x)"
9976          %}
9977   ins_encode( Opcode(0xD9), Opcode(0xED),   // fldln2
9978               Push_SrcD(src),
9979               Opcode(0xD9), Opcode(0xF1),   // fyl2x
9980               Push_ResultD(dst));
9981   ins_pipe( pipe_slow );
9982 %}
9983 
9984 //-------------Float Instructions-------------------------------
9985 // Float Math
9986 
9987 // Code for float compare:
9988 //     fcompp();
9989 //     fwait(); fnstsw_ax();
9990 //     sahf();
9991 //     movl(dst, unordered_result);
9992 //     jcc(Assembler::parity, exit);
9993 //     movl(dst, less_result);
9994 //     jcc(Assembler::below, exit);
9995 //     movl(dst, equal_result);
9996 //     jcc(Assembler::equal, exit);
9997 //     movl(dst, greater_result);
9998 //   exit:
9999 
10000 // P6 version of float compare, sets condition codes in EFLAGS
10001 instruct cmpFPR_cc_P6(eFlagsRegU cr, regFPR src1, regFPR src2, eAXRegI rax) %{
10002   predicate(VM_Version::supports_cmov() && UseSSE == 0);
10003   match(Set cr (CmpF src1 src2));




9929   ins_pipe( pipe_slow );
9930 %}
9931 
9932 instruct log10D_reg(regD dst, regD src, eFlagsReg cr) %{
9933   predicate (UseSSE>=2);
9934   effect(KILL cr);
9935   match(Set dst (Log10D src));
9936   // fldlg2       ; push log_10(2) on the FPU stack; full 80-bit number
9937   // fyl2x        ; compute log_10(2) * log_2(x)
9938   format %{ "FLDLG2 \t\t\t#Log10\n\t"
9939             "FYL2X  \t\t\t# Q=Log10*Log_2(x)"
9940          %}
9941   ins_encode( Opcode(0xD9), Opcode(0xEC),   // fldlg2
9942               Push_SrcD(src),
9943               Opcode(0xD9), Opcode(0xF1),   // fyl2x
9944               Push_ResultD(dst));
9945 
9946   ins_pipe( pipe_slow );
9947 %}
9948 



































9949 //-------------Float Instructions-------------------------------
9950 // Float Math
9951 
9952 // Code for float compare:
9953 //     fcompp();
9954 //     fwait(); fnstsw_ax();
9955 //     sahf();
9956 //     movl(dst, unordered_result);
9957 //     jcc(Assembler::parity, exit);
9958 //     movl(dst, less_result);
9959 //     jcc(Assembler::below, exit);
9960 //     movl(dst, equal_result);
9961 //     jcc(Assembler::equal, exit);
9962 //     movl(dst, greater_result);
9963 //   exit:
9964 
9965 // P6 version of float compare, sets condition codes in EFLAGS
9966 instruct cmpFPR_cc_P6(eFlagsRegU cr, regFPR src1, regFPR src2, eAXRegI rax) %{
9967   predicate(VM_Version::supports_cmov() && UseSSE == 0);
9968   match(Set cr (CmpF src1 src2));


< prev index next >